general-library-union 2.4.55 → 2.4.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +27 -27
  2. package/esm2022/public-api.mjs +4 -1
  3. package/esm2022/src/app/core/servicios/utils.service.mjs +6 -2
  4. package/esm2022/src/app/seguridad/constantes/ConstantesGenerales.mjs +30 -0
  5. package/esm2022/src/app/seguridad/modelos/ColumnaFuenteModel.mjs +9 -0
  6. package/esm2022/src/app/seguridad/modelos/ColumnaWraperModel.mjs +6 -0
  7. package/esm2022/src/app/seguridad/modelos/ForeingWraperModel.mjs +6 -0
  8. package/esm2022/src/app/seguridad/modelos/JoinFromModel.mjs +5 -0
  9. package/esm2022/src/app/seguridad/modelos/LlaveForaneaModel.mjs +7 -0
  10. package/esm2022/src/app/seguridad/modelos/ObjetoReporteModel.mjs +6 -0
  11. package/esm2022/src/app/seguridad/modelos/TablaFromModel.mjs +5 -0
  12. package/esm2022/src/app/webcommon/pages/fuente-reporte/fuente-reporte.component.mjs +696 -0
  13. package/esm2022/src/app/webcommon/popups/popup-sentencia/popup-sentencia.component.mjs +3 -3
  14. package/esm2022/src/app/webcommon/popups/popup-tablas-fuente/popup-tablas-fuente.component.mjs +107 -0
  15. package/esm2022/src/app/webcommon/services/reportes.service.mjs +43 -1
  16. package/esm2022/src/environments/environment.mjs +2 -2
  17. package/fesm2022/general-library-union.mjs +909 -56
  18. package/fesm2022/general-library-union.mjs.map +1 -1
  19. package/package.json +1 -1
  20. package/public-api.d.ts +2 -0
  21. package/src/app/core/servicios/utils.service.d.ts +1 -0
  22. package/src/app/seguridad/constantes/ConstantesGenerales.d.ts +25 -0
  23. package/src/app/seguridad/modelos/ColumnaFuenteModel.d.ts +8 -0
  24. package/src/app/seguridad/modelos/ColumnaWraperModel.d.ts +6 -0
  25. package/src/app/seguridad/modelos/ForeingWraperModel.d.ts +6 -0
  26. package/src/app/seguridad/modelos/JoinFromModel.d.ts +4 -0
  27. package/src/app/seguridad/modelos/LlaveForaneaModel.d.ts +6 -0
  28. package/src/app/seguridad/modelos/ObjetoReporteModel.d.ts +5 -0
  29. package/src/app/seguridad/modelos/TablaFromModel.d.ts +4 -0
  30. package/src/app/webcommon/pages/fuente/importar-fuente-con/importar-fuente-con.component.d.ts +1 -1
  31. package/src/app/webcommon/pages/fuente-reporte/fuente-reporte.component.d.ts +118 -0
  32. package/src/app/webcommon/popups/popup-tablas-fuente/popup-tablas-fuente.component.d.ts +32 -0
  33. package/src/app/webcommon/services/reportes.service.d.ts +16 -0
  34. package/src/styles/primeng/sass/overrides/_theme_styles.scss +3 -0
@@ -0,0 +1,696 @@
1
+ import { Component, ViewChild } from '@angular/core';
2
+ import { ColumnaFuenteModel } from '../../../seguridad/modelos/ColumnaFuenteModel';
3
+ import { FuenteDatoModel } from '../../../seguridad/modelos/FuenteDato';
4
+ import { ReporteColumnaModel } from '../../../seguridad/modelos/ReporteColumna';
5
+ import { TablaFromModel } from '../../../seguridad/modelos/TablaFromModel';
6
+ import { JoinFromModel } from '../../../seguridad/modelos/JoinFromModel';
7
+ import { ForeingWraperModel } from '../../../seguridad/modelos/ForeingWraperModel';
8
+ import { GeneralModel } from '../../../seguridad/modelos/GeneralModel';
9
+ import { ColumnaWraperModel } from '../../../seguridad/modelos/ColumnaWraperModel';
10
+ import { ConfirmationService, MessageService } from 'primeng/api';
11
+ import { TranslateModule } from '@ngx-translate/core';
12
+ import { ConstantesGenerales } from '../../../seguridad/constantes/ConstantesGenerales';
13
+ import { ButtonModule } from 'primeng/button';
14
+ import { ConfirmPopupModule } from 'primeng/confirmpopup';
15
+ import { InputTextareaModule } from 'primeng/inputtextarea';
16
+ import { InputTextModule } from 'primeng/inputtext';
17
+ import { CommonModule, NgIf } from '@angular/common';
18
+ import { AccordionModule } from 'primeng/accordion';
19
+ import { DropdownModule } from 'primeng/dropdown';
20
+ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
21
+ import { TableModule } from 'primeng/table';
22
+ import { GeneralPipe } from '../../pipes/general.pipe';
23
+ import { TablaGeneralComponent } from '../../../core/componentes/tabla-general/tabla-general.component';
24
+ import { FiltroGeneralComponent } from '../../../core/componentes/filtro-general/filtro-general.component';
25
+ import { SplitButtonModule } from 'primeng/splitbutton';
26
+ import { TabViewModule } from 'primeng/tabview';
27
+ import { StepsModule } from 'primeng/steps';
28
+ import { PopupTablasFuenteComponent } from '../../popups/popup-tablas-fuente/popup-tablas-fuente.component';
29
+ import { CheckboxModule } from 'primeng/checkbox';
30
+ import { TooltipModule } from 'primeng/tooltip';
31
+ import * as i0 from "@angular/core";
32
+ import * as i1 from "../../../core/servicios/menu.service";
33
+ import * as i2 from "./../../../core/servicios/toast.service";
34
+ import * as i3 from "../../services/reportes.service";
35
+ import * as i4 from "../../../shared/servicios/general.service";
36
+ import * as i5 from "../../../core/servicios/utils.service";
37
+ import * as i6 from "primeng/api";
38
+ import * as i7 from "@ngx-translate/core";
39
+ import * as i8 from "primeng/tooltip";
40
+ import * as i9 from "primeng/checkbox";
41
+ import * as i10 from "primeng/steps";
42
+ import * as i11 from "primeng/tabview";
43
+ import * as i12 from "primeng/splitbutton";
44
+ import * as i13 from "primeng/button";
45
+ import * as i14 from "primeng/inputtext";
46
+ import * as i15 from "@angular/forms";
47
+ import * as i16 from "primeng/table";
48
+ import * as i17 from "primeng/inputtextarea";
49
+ export class FuenteReporteComponent {
50
+ menuService;
51
+ notificationBusService;
52
+ reportesSvc;
53
+ generalSvc;
54
+ utilsService;
55
+ confirmationService;
56
+ translateService;
57
+ messageService;
58
+ fuente = new FuenteDatoModel();
59
+ vistaVisualizar;
60
+ tablasFrom = []; // from TablaFrom
61
+ joinsFrom = []; //from JoinFrom
62
+ columnas = [];
63
+ listaColumnas = [];
64
+ listaJoin = [];
65
+ col1;
66
+ col2;
67
+ campos = [];
68
+ camposSeleccionar = [];
69
+ mostrarSeleccionar;
70
+ campoFormula = new ColumnaFuenteModel();
71
+ actual;
72
+ tabPrincipal;
73
+ basico;
74
+ seleccionGeneral;
75
+ foraneas = [];
76
+ descripcion;
77
+ query;
78
+ paginador = [];
79
+ filtro = new FuenteDatoModel();
80
+ paginator = {
81
+ rows: 10,
82
+ totalRecords: 0,
83
+ };
84
+ columns = [];
85
+ filters = [];
86
+ loading;
87
+ menu = [];
88
+ items = [];
89
+ mapaMensajes = new Map();
90
+ popupTablasFuenteUI;
91
+ constructor(menuService, notificationBusService, reportesSvc, generalSvc, utilsService, confirmationService, translateService, messageService) {
92
+ this.menuService = menuService;
93
+ this.notificationBusService = notificationBusService;
94
+ this.reportesSvc = reportesSvc;
95
+ this.generalSvc = generalSvc;
96
+ this.utilsService = utilsService;
97
+ this.confirmationService = confirmationService;
98
+ this.translateService = translateService;
99
+ this.messageService = messageService;
100
+ }
101
+ ngOnInit() {
102
+ this.listaColumnas = [];
103
+ this.campos = [];
104
+ this.listaJoin = [];
105
+ this.columnas = [];
106
+ this.tablasFrom = [];
107
+ this.camposSeleccionar = [];
108
+ this.joinsFrom = [];
109
+ this.actual = 0;
110
+ this.menuService.setBreadcrumb([{ label: 'Fuente Reporte' }]);
111
+ this.columns = [
112
+ {
113
+ field: 'descripcion',
114
+ header: this.translateService.instant('descripcion'),
115
+ width: 100,
116
+ },
117
+ ];
118
+ this.filters = [
119
+ {
120
+ field: 'descripcion',
121
+ header: this.translateService.instant('descripcion'),
122
+ matchMode: 'contains',
123
+ }
124
+ ];
125
+ this.initStep();
126
+ }
127
+ async load(event) {
128
+ try {
129
+ this.loading = true;
130
+ this.colocarFiltro();
131
+ this.filtro.paginacionRegistroInicial = event?.first != null ? event?.first : 0,
132
+ this.filtro.paginacionRegistroFinal = event?.rows != null ? event?.rows : 10,
133
+ this.paginador = await this.reportesSvc.consultarFuenteDato(this.filtro).toPromise();
134
+ this.paginator.totalRecords = await this.reportesSvc.cantidadFuenteDato(this.filtro).toPromise();
135
+ }
136
+ catch (e) {
137
+ console.error(e);
138
+ }
139
+ this.loading = false;
140
+ }
141
+ colocarFiltro() {
142
+ this.filtro.origen = ("F");
143
+ this.filtro.descripcion = (null);
144
+ if (this.utilsService.isNotBlank(this.descripcion)) {
145
+ this.filtro.descripcion = (ConstantesGenerales.PORCENTAJE + this.descripcion + ConstantesGenerales.PORCENTAJE);
146
+ }
147
+ }
148
+ limpiarCampos() {
149
+ this.descripcion = null;
150
+ }
151
+ async siguiente() {
152
+ try {
153
+ if (this.validarWizard()) {
154
+ if (this.actual < 3) {
155
+ if (this.actual == 0) {
156
+ this.foraneas = [];
157
+ if (this.tablasFrom.length == 0) { // No selecciono ninguna tabla
158
+ this.notificationBusService.showInfo("Debe seleccionar al menos un objeto.");
159
+ return;
160
+ }
161
+ else if (this.tablasFrom.length == 1) { // Solo selecciono una, por eso no hay que generar joins.
162
+ this.actual++;
163
+ }
164
+ else {
165
+ let nombresTablas = [];
166
+ for (let tabla of this.tablasFrom) {
167
+ if (!nombresTablas.includes(tabla.tabla)) {
168
+ nombresTablas.push(tabla.tabla);
169
+ }
170
+ }
171
+ this.foraneas = [];
172
+ //List<LlaveForanea>
173
+ let llaves = await this.reportesSvc.getLlaves(nombresTablas).toPromise();
174
+ for (let i = 0; i < this.tablasFrom.length; i++) {
175
+ for (let j = 0; j < this.tablasFrom.length; j++) {
176
+ for (let foranea of llaves) {
177
+ if (foranea.tabla1 == (this.tablasFrom[i].tabla) && foranea.tabla2 == (this.tablasFrom[j].tabla)) {
178
+ let nuevo = new ForeingWraperModel();
179
+ nuevo.alias1 = (this.tablasFrom[i].alias);
180
+ nuevo.alias2 = (this.tablasFrom[j].alias);
181
+ nuevo.llave = (foranea);
182
+ this.foraneas.push(nuevo);
183
+ }
184
+ }
185
+ }
186
+ }
187
+ }
188
+ // Cargo las columnas para los siguientes procesos.
189
+ this.columnas = [];
190
+ this.listaColumnas = [];
191
+ this.camposSeleccionar = [];
192
+ for (let from of this.tablasFrom) {
193
+ //ReporteColumnaDTO
194
+ let ta = new ReporteColumnaModel();
195
+ ta.reporteFuente = (from.tabla);
196
+ //List<ReporteColumnaDTO>
197
+ let nuevas = await this.generalSvc.queryForList(new GeneralModel('ReporteColumnaDTO', 'Reportes.consultarColumnas', false, ta)).toPromise();
198
+ this.cargarListasColumnas(nuevas, from.alias);
199
+ }
200
+ }
201
+ this.actual++;
202
+ }
203
+ else {
204
+ this.terminarPasos();
205
+ }
206
+ }
207
+ }
208
+ catch (e) {
209
+ console.error(e);
210
+ }
211
+ }
212
+ async cargarListasColumnas(nuevas, alias) {
213
+ for (let col of nuevas) {
214
+ col.reporteFuente = (alias);
215
+ this.columnas.push(col);
216
+ this.listaColumnas.push({ value: col.reporteFuente + '.' + col.nombre, label: col.reporteFuente + '.' + col.nombre });
217
+ let campo = new ColumnaWraperModel();
218
+ campo.columna = col;
219
+ campo.alias = col.nombre;
220
+ this.camposSeleccionar.push(campo);
221
+ }
222
+ console.log('camposSeleccionar', this.camposSeleccionar);
223
+ }
224
+ async terminarPasos() {
225
+ let camposSql = "";
226
+ let i = 0;
227
+ for (let col of this.camposSeleccionar) {
228
+ if (col.seleccionado) {
229
+ camposSql += (i == 0 ? "" : ",") + col.columna.nombre + " as " + col.alias;
230
+ i++;
231
+ }
232
+ }
233
+ this.fuente.whereJoin = (this.generarSqlJoin());
234
+ this.fuente.fromSql = (this.generarSqlFrom());
235
+ let where = "";
236
+ let estaBlancoWhereJoin = this.fuente.whereJoin == null || "" == (this.fuente.whereJoin);
237
+ let estaBlancoWhereAdicional = this.fuente.whereAdicional == null || "" == (this.fuente.whereAdicional);
238
+ if (!estaBlancoWhereJoin || !estaBlancoWhereAdicional) {
239
+ where = " \nWHERE ";
240
+ if (!estaBlancoWhereJoin && !estaBlancoWhereAdicional) {
241
+ where += this.fuente.whereJoin + " AND \n(" + this.fuente.whereAdicional + ")";
242
+ }
243
+ else if (!estaBlancoWhereJoin) {
244
+ where += this.fuente.whereJoin;
245
+ }
246
+ else {
247
+ where += this.fuente.whereAdicional;
248
+ }
249
+ }
250
+ console.log('where', where);
251
+ try {
252
+ let sql = "SELECT \n" + camposSql + " \nFROM \n" + this.fuente.fromSql + where;
253
+ await this.reportesSvc.validarQuery(sql).toPromise();
254
+ this.fuente.query = (sql);
255
+ this.query = sql;
256
+ this.tabPrincipal = 0;
257
+ this.construirColumnas();
258
+ }
259
+ catch (e) {
260
+ console.error(e);
261
+ }
262
+ }
263
+ async adicionarForanea(evento) {
264
+ try {
265
+ //ForeingWraper
266
+ let foranea = evento.data;
267
+ for (let rel of foranea.llave.relaciones) {
268
+ let par = rel.split(":");
269
+ let join = new JoinFromModel();
270
+ join.columna1 = (foranea.alias1 + "." + par[0]);
271
+ join.columna2 = (foranea.alias2 + "." + par[1]);
272
+ this.joinsFrom.push(join);
273
+ }
274
+ }
275
+ catch (e) {
276
+ console.error(e);
277
+ }
278
+ }
279
+ async eliminar() {
280
+ this.confirmationService.confirm({
281
+ target: event.target,
282
+ message: this.translateService.instant('mensaje_alerta'),
283
+ icon: 'confirmar',
284
+ accept: () => {
285
+ this.setRespuesta(true);
286
+ },
287
+ reject: () => {
288
+ }
289
+ });
290
+ }
291
+ async setRespuesta(respuesta) {
292
+ try {
293
+ if (respuesta) {
294
+ this.reportesSvc.eliminarFuenteDatosConHijos(this.fuente).toPromise();
295
+ this.fuente = null;
296
+ this.notificationBusService.showInfo("La fuente ha sido eliminada.");
297
+ }
298
+ }
299
+ catch (e) {
300
+ console.error(e);
301
+ }
302
+ }
303
+ anterior() {
304
+ if (this.actual > 0)
305
+ this.actual--;
306
+ }
307
+ async validarQuery() {
308
+ try {
309
+ if (this.utilsService.validarTextoSQL(this.query, true, true, 8000, true)) {
310
+ this.reportesSvc.validarQuery(this.query);
311
+ this.notificationBusService.showInfo("El query esta correcto.");
312
+ }
313
+ }
314
+ catch (e) {
315
+ //Validador.adicionarMensaje("fuenteForm:tab:query", e.getMessage());
316
+ }
317
+ }
318
+ adicionarJoin() {
319
+ try {
320
+ if (this.col1 != null && this.col2 != null) {
321
+ // TODO: Falta validar el tipo
322
+ let nuevo = new JoinFromModel();
323
+ nuevo.columna1 = (this.col1);
324
+ nuevo.columna2 = (this.col2);
325
+ this.joinsFrom.push(nuevo);
326
+ }
327
+ else {
328
+ this.notificationBusService.showWarning("Debe seleccionar dos campos");
329
+ }
330
+ }
331
+ catch (e) {
332
+ console.error(e);
333
+ }
334
+ }
335
+ eliminarJoin(ae) {
336
+ try {
337
+ //let join = (JoinFrom) ((UIParameter) ae.getComponent().findComponent("join")).getValue();
338
+ this.joinsFrom.filter((data) => data === ae.data);
339
+ }
340
+ catch (e) {
341
+ console.error(e);
342
+ }
343
+ }
344
+ eliminarTabla(ae) {
345
+ try {
346
+ //TablaFrom tabla = (TablaFrom) ((UIParameter) ae.getComponent().findComponent("tabla")).getValue();
347
+ this.tablasFrom.filter((data) => data === ae);
348
+ this.notificationBusService.showWarning("Falta eliminar las columnas de la tabla ???");
349
+ }
350
+ catch (e) {
351
+ console.error(e);
352
+ }
353
+ }
354
+ buscarTabla() {
355
+ this.popupTablasFuenteUI.buscarTabla("fuenteUI.tablaSeleccionada");
356
+ }
357
+ setTablaSeleccionada(tablaSeleccionada) {
358
+ try {
359
+ let tablas = [];
360
+ for (let tabla of this.tablasFrom) {
361
+ if (!tablas.includes(tabla.tabla)) {
362
+ tablas.push(tabla.tabla);
363
+ }
364
+ }
365
+ this.cargarTablaEnLista(tablaSeleccionada);
366
+ }
367
+ catch (e) {
368
+ console.error(e);
369
+ }
370
+ }
371
+ cargarTablaEnLista(tabla) {
372
+ let par = tabla.split("_");
373
+ let alias = par[0];
374
+ let i = 1;
375
+ let tablaTemp = new TablaFromModel();
376
+ tablaTemp.alias = alias;
377
+ while (this.tablasFrom.includes(tablaTemp)) {
378
+ alias = tabla + (i++);
379
+ }
380
+ let tem = new TablaFromModel();
381
+ tem.tabla = tabla;
382
+ tem.alias = alias;
383
+ this.tablasFrom.push(tem);
384
+ return alias;
385
+ }
386
+ cambioJoin(ce) {
387
+ try {
388
+ this.listaJoin = [];
389
+ let nuevo = ce.value;
390
+ if (nuevo != null) {
391
+ //ReporteColumnaDTO
392
+ let act = null;
393
+ for (let col of this.columnas) {
394
+ if (nuevo.equals(col.reporteFuente + "." + col.nombre)) {
395
+ act = col;
396
+ break;
397
+ }
398
+ }
399
+ for (let col of this.columnas) {
400
+ if (!col.reporteFuente.startsWith(act.reporteFuente) && col.tipoDato == (act.tipoDato) && col.orden == (act.orden)) {
401
+ let val = col.reporteFuente + "." + col.nombre;
402
+ this.listaJoin.push({ value: val, key: val });
403
+ }
404
+ }
405
+ }
406
+ }
407
+ catch (e) {
408
+ console.error(e);
409
+ }
410
+ }
411
+ editarCampo(evento) {
412
+ try {
413
+ let col = evento.data;
414
+ this.campoFormula = col;
415
+ let vars = [];
416
+ for (let campo of this.campos) {
417
+ let var1;
418
+ var1.nombre = (campo.nombre);
419
+ var1.tipo = (campo.tipoDato);
420
+ vars.push(var1);
421
+ }
422
+ //getBean(EditorFormulaUI.class).editar(col.getSintaxis(), "fuenteUI.formula", vars);
423
+ }
424
+ catch (e) {
425
+ console.error(e);
426
+ }
427
+ }
428
+ editarWhere() {
429
+ try {
430
+ let vars = [];
431
+ for (let col of this.columnas) {
432
+ //VariableFormula
433
+ let var1;
434
+ var1.nombre = (col.reporteFuente + "." + col.nombre);
435
+ var1.tipo(col.tipoDato);
436
+ vars.push(var1);
437
+ }
438
+ //getBean(EditorFormulaUI.class).editar(fuente.getWhereAdicional(), "fuenteUI.fuente.whereAdicional", vars);
439
+ }
440
+ catch (e) {
441
+ console.error(e);
442
+ }
443
+ }
444
+ setFormula(formula) {
445
+ if (this.campoFormula != null) {
446
+ this.campoFormula.sintaxis = (formula);
447
+ }
448
+ this.campoFormula = null;
449
+ }
450
+ adicionarColumnas() {
451
+ for (let col of this.camposSeleccionar) {
452
+ col.seleccionado = (false);
453
+ }
454
+ this.mostrarSeleccionar = true;
455
+ }
456
+ agregarSeleccionados() {
457
+ try {
458
+ for (let col of this.camposSeleccionar) {
459
+ if (col.seleccionado) {
460
+ //ColumnaFuenteDTO
461
+ let campo = new ColumnaFuenteModel();
462
+ campo.fuenteDato = (this.fuente.llave);
463
+ campo.nombre = (col.columna.nombre);
464
+ campo.sintaxis = (col.columna.nombre);
465
+ this.campos.push(campo);
466
+ }
467
+ }
468
+ this.ocultarSeleccionar();
469
+ }
470
+ catch (e) {
471
+ console.error(e);
472
+ }
473
+ }
474
+ ocultarSeleccionar() {
475
+ this.mostrarSeleccionar = false;
476
+ }
477
+ async verDetalle(evento) {
478
+ try {
479
+ this.vistaVisualizar = 'mantenimiento';
480
+ let fuenteDatoDTO = evento;
481
+ this.fuente = new FuenteDatoModel();
482
+ this.fuente.llave = (fuenteDatoDTO.llave);
483
+ this.fuente = await this.reportesSvc.consultarUnicaFuenteDato(this.fuente).toPromise();
484
+ if (this.fuente.query2 != null) {
485
+ this.query = this.fuente.query + this.fuente.query2;
486
+ }
487
+ else {
488
+ this.query = this.fuente.query;
489
+ }
490
+ //ColumnaFuenteDTO
491
+ let col = new ColumnaFuenteModel();
492
+ col.fuenteDato = (this.fuente.llave);
493
+ this.campos = await this.reportesSvc.consultarColumnasFuente(col).toPromise();
494
+ this.actual = 0;
495
+ this.menuService.setBreadcrumb([{ label: 'Fuente Reporte', }, { label: 'Mantenimiento Fuente' }]);
496
+ this.cargasOpciones();
497
+ }
498
+ catch (e) {
499
+ console.error(e);
500
+ }
501
+ }
502
+ nuevo() {
503
+ try {
504
+ this.vistaVisualizar = 'mantenimiento';
505
+ this.fuente = new FuenteDatoModel();
506
+ this.fuente.origen = ("F");
507
+ this.campos = null;
508
+ this.query = null;
509
+ this.tabPrincipal = 0;
510
+ this.actual = 0;
511
+ this.menuService.setBreadcrumb([{ label: 'Fuente Reporte', }, { label: 'Mantenimiento Fuente' }]);
512
+ this.cargasOpciones();
513
+ }
514
+ catch (e) {
515
+ console.error(e);
516
+ }
517
+ }
518
+ cargasOpciones() {
519
+ this.menu = [{ label: this.translateService.instant('link_eliminar'), icon: 'glyphicons glyphicons-bin', visible: this.fuente.llave != null, command: (event) => { this.eliminar(); } },
520
+ { label: this.translateService.instant('link_validar'), icon: 'glyphicons glyphicons-print', command: (event) => { this.validarQuery(); } },
521
+ { label: this.translateService.instant('link_generar'), icon: 'glyphicons glyphicons-bell', visible: this.fuente.llave != null, command: (event) => { this.construirColumnas(); } },
522
+ ];
523
+ }
524
+ regresar() {
525
+ this.vistaVisualizar = null;
526
+ this.ngOnInit();
527
+ }
528
+ validar() {
529
+ let res = true;
530
+ res = res && this.utilsService.validarCampoObligatorio(this.fuente.descripcion);
531
+ res = res && (this.utilsService.validarTextoSQL(this.query, true, true, 8000, true) == null);
532
+ return res;
533
+ }
534
+ /**
535
+ * Registra/actualiza la informacion general de la fuente de datos
536
+ */
537
+ async guardar() {
538
+ try {
539
+ if (this.validar()) {
540
+ if (this.query.length > 4000) {
541
+ this.fuente.query = (this.query.substring(0, 3999));
542
+ this.fuente.query2 = (this.query.substring(3999, this.query.length));
543
+ }
544
+ else {
545
+ this.fuente.query = (this.query);
546
+ this.fuente.query2 = (null);
547
+ }
548
+ if (this.fuente.llave == null) {
549
+ this.fuente.llave = (this.utilsService.generarLlave());
550
+ await this.reportesSvc.insertarFuenteDato(this.fuente).toPromise();
551
+ }
552
+ else {
553
+ await this.reportesSvc.actualizarFuenteDato(this.fuente).toPromise();
554
+ }
555
+ this.notificationBusService.showInfo("Los cambios han sido guardados");
556
+ }
557
+ }
558
+ catch (e) {
559
+ console.error(e);
560
+ }
561
+ } //guardar
562
+ /**
563
+ * Registra/actualiza las columnas generados para la fuente de datos como registros de tipo 'ColumnaFuente'
564
+ */
565
+ async guardarCampos() {
566
+ try {
567
+ if (this.fuente.llave == null) {
568
+ this.notificationBusService.showInfo("Por favor diligencie primero los datos de la fuente");
569
+ return;
570
+ }
571
+ if (this.validarCampos()) {
572
+ await this.reportesSvc.actualizarColumnasFuente(this.fuente, this.campos).toPromise();
573
+ this.notificationBusService.showInfo("Se han guardado los campos");
574
+ }
575
+ }
576
+ catch (e) {
577
+ console.error(e);
578
+ }
579
+ } //guardarCampos
580
+ /**
581
+ * Verifica que los valores asociados a los campos para la creacion de las columnas de la fuente sean válidos
582
+ * @return false en caso de que los valores asignados a los campos sean nulos o no sean palabras válidas de acuerdo
583
+ * con las condiciones dadas por ValidadorUtil.validarPalabra()),
584
+ * en caso contrario retorna true
585
+ */
586
+ validarCampos() {
587
+ for (let col of this.campos) {
588
+ if (col.nombre == null || !this.utilsService.validarPalabra(col.nombre)) {
589
+ this.notificationBusService.showInfo("Nombre no valido (" + col.nombre + ")");
590
+ return false;
591
+ }
592
+ }
593
+ return true;
594
+ }
595
+ /**
596
+ * Construye las columnas de la fuente de datos, con base en los campos obtenidos
597
+ * de la consulta SQL asociada
598
+ */
599
+ async construirColumnas() {
600
+ try {
601
+ this.campos = await this.reportesSvc.getColumnasSql(this.query).toPromise();
602
+ }
603
+ catch (e) {
604
+ console.error(e);
605
+ }
606
+ } //construirColumnas
607
+ validarWizard() {
608
+ let alias = [];
609
+ for (let tabla of this.tablasFrom) {
610
+ if (alias.includes(tabla.alias)) {
611
+ this.notificationBusService.showInfo("No se puede repetir el alias de las tablas.");
612
+ return false;
613
+ }
614
+ else {
615
+ alias.push(tabla.alias);
616
+ }
617
+ }
618
+ alias = [];
619
+ for (let col of this.camposSeleccionar) {
620
+ if (col.seleccionado) {
621
+ if (alias.includes(col.alias)) {
622
+ this.notificationBusService.showInfo("No se puede repetir el alias de las columnas.");
623
+ return false;
624
+ }
625
+ else {
626
+ alias.push(col.alias);
627
+ }
628
+ }
629
+ }
630
+ return true;
631
+ }
632
+ generarSqlFrom() {
633
+ let res = "";
634
+ let i = 0;
635
+ for (let tabla of this.tablasFrom) {
636
+ res += (i == 0 ? "" : ",") + tabla.tabla + " " + tabla.alias;
637
+ i++;
638
+ }
639
+ return res;
640
+ }
641
+ generarSqlJoin() {
642
+ let res = "";
643
+ let i = 0;
644
+ for (let join of this.joinsFrom) {
645
+ res += (i == 0 ? "" : " AND ") + join.columna1 + " = " + join.columna2;
646
+ i++;
647
+ }
648
+ return res;
649
+ }
650
+ //IMPLEMENTACION STEPER
651
+ initStep() {
652
+ this.mapaMensajes.set(0, 'Seleccione las tablas o vistas de donde desea obtener la informacion.');
653
+ this.mapaMensajes.set(1, 'Indique de que manera se relaccionan los objetos entre si.');
654
+ this.mapaMensajes.set(2, 'Indique los filtros adicionales que desee realizar sobre la informacion.');
655
+ this.mapaMensajes.set(3, 'Campos');
656
+ this.items = [
657
+ {
658
+ label: this.translateService.instant('from'),
659
+ routerLink: 'personal',
660
+ title: 'Seleccione las tablas o vistas de donde desea obtener la informacion.'
661
+ },
662
+ {
663
+ label: this.translateService.instant('join'),
664
+ routerLink: 'personal',
665
+ title: 'Indique de que manera se relaccionan los objetos entre si.'
666
+ },
667
+ {
668
+ label: this.translateService.instant('where'),
669
+ routerLink: 'personal',
670
+ title: 'Indique los filtros adicionales que desee realizar sobre la informacion.'
671
+ },
672
+ {
673
+ label: this.translateService.instant('campos'),
674
+ routerLink: 'confirmation',
675
+ }
676
+ ];
677
+ }
678
+ actualizarSeleccion(booleanogeneral) {
679
+ this.camposSeleccionar.forEach((elemento) => {
680
+ elemento.seleccionado = booleanogeneral;
681
+ });
682
+ }
683
+ todosSeleccionados() {
684
+ return this.camposSeleccionar.every(elemento => elemento.seleccionado);
685
+ }
686
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: FuenteReporteComponent, deps: [{ token: i1.MenuService }, { token: i2.ToastService }, { token: i3.ReportesService }, { token: i4.GeneralService }, { token: i5.UtilsService }, { token: i6.ConfirmationService }, { token: i7.TranslateService }, { token: i6.MessageService }], target: i0.ɵɵFactoryTarget.Component });
687
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.4", type: FuenteReporteComponent, isStandalone: true, selector: "app-fuente-reporte", providers: [MessageService, ConfirmationService], viewQueries: [{ propertyName: "popupTablasFuenteUI", first: true, predicate: ["popupTablasFuenteUI"], descendants: true }], ngImport: i0, template: "@if(vistaVisualizar == null){\r\n <h1>{{'fuente' | translate}} {{'reporte'| translate}}</h1>\r\n <div class=\"flex justify-content-between align-items-center mb-3\">\r\n <app-filtro-general [filtros]=\"filters\" [datatable]=\"tablaGeneral\">\r\n <ng-template let-form>\r\n <ng-container [formGroup]=\"form\">\r\n <span class=\"p-float-label\">\r\n <input pInputText autofocus type=\"text\" id=\"descripcion\" formControlName=\"descripcion\"\r\n autocomplete=\"off\" />\r\n <label for=\"descripcion\">{{'filtro' | translate}}</label>\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </app-filtro-general>\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevo()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <app-tabla-general #tablaGeneral [columns]=\"columns\" [value]=\"paginador\" [rows]=\"paginator.rows\"\r\n [totalRecords]=\"paginator.totalRecords\" (onLoad)=\"load($event)\" (onRowSelect)=\"verDetalle($event)\"\r\n [loading]=\"loading\"></app-tabla-general>\r\n}\r\n@if(vistaVisualizar != null){\r\n <div class=\"flex justify-content-between align-items-center mb-3\">\r\n <h1>{{'fuente' | translate}} {{'reporte'| translate}}</h1>\r\n <button pButton pRipple (click)=\"regresar()\" label=\"Regresar\"\r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold\"></button>\r\n </div>\r\n <p-tabView>\r\n <p-tabPanel header=\"{{ 'fuente'| translate}}\">\r\n <div class=\"card\">\r\n <div class=\"mt-4\">\r\n <h5><i class=\"glyphicons glyphicons-book\"></i>{{'datos'| translate}} {{'basicos'| translate}}</h5>\r\n </div>\r\n \r\n <div class=\"p-fluid p-formgrid grid\">\r\n \r\n <div class=\"field col-12 md:col-12 lg:col-12\">\r\n <span class=\"p-float-label\">\r\n <input pInputText autofocus type=\"text\" id=\"peso\" [(ngModel)]=\"fuente.descripcion\"\r\n autocomplete=\"off\" />\r\n <label for=\"peso\">{{'nombre' | translate}}</label>\r\n </span>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-12 lg:col-12\">\r\n <span class=\"p-float-label\">\r\n <textarea class=\"w-full\" id=\"float-input\" rows=\"5\" cols=\"30\" pInputTextarea\r\n [(ngModel)]=\"query\" autofocus\r\n [autoResize]=\"true\"> </textarea>\r\n <label for=\"descripcion\">{{'consulta' | translate}}\r\n </label>\r\n </span>\r\n </div>\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons glyphicons-floppy-save\" label=\"{{'link_guardar' | translate}}\" (click)=\"guardar()\">\r\n </button>\r\n <p-splitButton class=\"ml-2\" label=\"Acciones Evaluadores\" icon=\"glyphicons glyphicons-list\" [model]=\"menu\"></p-splitButton>\r\n </div>\r\n \r\n \r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" \r\n icon=\"glyphicons glyphicons-floppy-save\" label=\"{{'link_guardar' | translate}}\" (click)=\"guardarCampos()\">\r\n </button>\r\n </div>\r\n <p-table #tablaGeneralEntrada id=\"tabla_lista_tipo_entidad\" [value]=\"campos\" [scrollable]=\"true\"\r\n scrollDirection=\"both\" scrollDirection=\"horizontal\" responsiveLayout=\"scroll\" scrollDirection=\"horizontal\"\r\n styleClass=\"p-datatable-striped\" [showCurrentPageReport]=\"false\" editMode=\"row\"\r\n currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\"\r\n [lazy]=\"false\" dataKey=\"llaveTabla\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width:25%\">{{'nombre' | translate}}</th>\r\n <th style=\"width:25%\">{{'sintaxis' | translate}}</th>\r\n <th style=\"width:25%\">{{'tipo' | translate}} de {{'dato' | translate}}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"campo\">\r\n <td style=\"width:25%\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.nombre \" class=\"w-full\">\r\n </td>\r\n <td style=\"width:25%\">\r\n {{campo.tipoDato}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{campo.tipoDato}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"p-3 font-medium emptymessage\">\r\n <td colspan=\"5\">\r\n {{'mensajetablavacia' | translate}} \r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </p-tabPanel>\r\n \r\n \r\n <p-tabPanel header=\"{{ 'wizard'| translate}}\">\r\n <p-steps [model]=\"items\" [readonly]=\"false\" [activeIndex]=\"actual\"></p-steps>\r\n <div class=\"flex align-items-center justify-content-end mb-2\">\r\n <p-button (onClick)=\"anterior()\" [rounded]=\"true\" icon=\"pi pi-angle-left\" class=\"p-button-secondary\" pTooltip=\"Anterior\" tooltipPosition=\"top\" placeholder=\"Top\" [disabled]=\"actual <= 0\"/>\r\n <p-button (onClick)=\"siguiente()\" [rounded]=\"true\" icon=\"pi pi-angle-right\" class=\"p-button-secondary\" pTooltip=\"Siguiente\" tooltipPosition=\"top\" placeholder=\"Top\"/>\r\n </div>\r\n <div class=\"cardInstrucciones mt-4 mb-3\">\r\n <div class=\"flex\">\r\n <div class=\"icono\">\r\n <i class=\"pi pi-bell\"></i>\r\n </div>\r\n <div class=\"contenedor\">\r\n <label>{{mapaMensajes?.get(actual)}}</label>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div class=\"flex align-items-center justify-content-end mb-2\">\r\n <button pButton label=\"{{'link_anterior' | translate}}\" icon=\"pi pi-plus\" (click)=\"anterior()\" *ngIf=\"actual > 0\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n <button pButton label=\"{{'link_siguiente' | translate}}\" icon=\"pi pi-plus\" (click)=\"siguiente()\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div> -->\r\n @if(actual === 0){\r\n <div class=\"field col-12 md:col-12 lg:col-12\">\r\n <button pButton label=\"{{'fuente' | translate}}\" icon=\"pi pi-plus\" (click)=\"buscarTabla()\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n <p-table #tablaGeneralEntrada id=\"tabla_lista_tipo_entidad\" [value]=\"tablasFrom\" [scrollable]=\"true\"\r\n scrollDirection=\"both\" scrollDirection=\"horizontal\" responsiveLayout=\"scroll\" scrollDirection=\"horizontal\"\r\n styleClass=\"p-datatable-striped\" [showCurrentPageReport]=\"true\" editMode=\"row\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" [lazy]=\"true\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width:25%\">{{'tabla' | translate}}</th>\r\n <th style=\"width:25%\">{{'alias' | translate}}</th>\r\n <th style=\"width:25%\"> </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-tabla let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"tabla\">\r\n <td style=\"width:25%\">\r\n {{tabla.tabla}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{tabla.alias}}\r\n </td>\r\n <td class=\"flex justify-content-end\">\r\n <div>\r\n <!-- ELIMINAR -->\r\n <button pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarTabla(tabla)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"p-3 font-medium emptymessage\">\r\n <td colspan=\"5\">\r\n {{'mensajetablavacia' | translate}} \r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n }\r\n @if(actual == 1){\r\n\r\n <p-table #tablaGeneralEntrada id=\"tabla_lista_tipo_entidad\" [value]=\"foraneas\" [scrollable]=\"true\"\r\n scrollDirection=\"both\" scrollDirection=\"horizontal\" responsiveLayout=\"scroll\" scrollDirection=\"horizontal\"\r\n styleClass=\"p-datatable-striped\" [showCurrentPageReport]=\"true\" editMode=\"row\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" [lazy]=\"true\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width:25%\">{{'' | translate}}</th>\r\n <th style=\"width:25%\">{{'' | translate}}</th>\r\n <th style=\"width:25%\">{{'' | translate}}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-tabla let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"tabla\">\r\n <td style=\"width:25%\">\r\n {{tabla.alias1}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{tabla.alias2}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{tabla.llave.nombre}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"p-3 font-medium emptymessage\">\r\n <td colspan=\"5\">\r\n {{'mensajetablavacia' | translate}} \r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n }\r\n @if(actual == 2){\r\n\r\n <div class=\"card\">\r\n <!-- <div class=\"mt-4\">\r\n <h5><i class=\"glyphicons glyphicons-book\"></i>{{'datos'| translate}} {{'basicos'| translate}}</h5>\r\n </div> -->\r\n \r\n <div class=\"p-fluid p-formgrid grid\">\r\n \r\n <div class=\"field col-12 md:col-12 lg:col-12\">\r\n <span class=\"p-float-label\">\r\n <textarea class=\"w-full\" id=\"float-input\" rows=\"5\" cols=\"30\" pInputTextarea\r\n [(ngModel)]=\"fuente.whereAdicional\" autofocus\r\n [autoResize]=\"true\"> </textarea>\r\n <label for=\"descripcion\">{{'consulta' | translate}}\r\n </label>\r\n </span>\r\n </div>\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons glyphicons-floppy-save\" label=\"{{'link_guardar' | translate}}\" (click)=\"editarWhere()\">\r\n </button>\r\n </div>\r\n \r\n \r\n </div>\r\n </div>\r\n\r\n }\r\n @if(actual == 3){\r\n\r\n <p-table id=\"tabla_lista_tipo_entidad\" [value]=\"camposSeleccionar\" [scrollable]=\"true\" [totalRecords]=\"camposSeleccionar.length\"\r\n scrollDirection=\"both\" scrollDirection=\"horizontal\" responsiveLayout=\"scroll\" scrollDirection=\"horizontal\" [paginator]=\"camposSeleccionar.length > 10\" [rows]=\"10\" [rowsPerPageOptions]=\"[10, 20, 30]\"\r\n styleClass=\"p-datatable-striped\" [showCurrentPageReport]=\"true\" editMode=\"row\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" [lazy]=\"false\" dataKey=\"alias\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width:25%\" alignFrozen=\"left\" pFrozenColumn>\r\n <p-checkbox [style]=\"{'margin-left': '1%','margin-right':'1%'}\" [(ngModel)]=\"seleccionGeneral\" [binary]=\"true\" [ngModel]=\"todosSeleccionados()\" (ngModelChange)=\"actualizarSeleccion($event)\"></p-checkbox>\r\n <span style=\"margin-left:1%\">{{'tabla' | translate}}</span>\r\n </th>\r\n <th style=\"width:25%\">{{'columna' | translate}}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-tabla>\r\n <tr>\r\n <td style=\"width:25%\">\r\n <p-checkbox class=\"mr-2 \" [(ngModel)]=\"tabla.seleccionado\" [binary]=\"true\" inputId=\"binary\">\r\n </p-checkbox>\r\n {{tabla.columna.reporteFuente}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{tabla.columna.nombre}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"p-3 font-medium emptymessage\">\r\n <td colspan=\"5\">\r\n {{'mensajetablavacia' | translate}} \r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n }\r\n\r\n </p-tabPanel>\r\n </p-tabView>\r\n \r\n}\r\n\r\n<app-popup-tablas-fuente #popupTablasFuenteUI (aplicarDestinoOcultar)=\"setTablaSeleccionada($event)\"></app-popup-tablas-fuente>", styles: [":host ::ng-deep .botonCircular{background:var(--color-85);border:solid 1px var(--color-85);color:var(--color-400)}\n"], dependencies: [{ kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i8.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i9.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: i6.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: PopupTablasFuenteComponent, selector: "app-popup-tablas-fuente", outputs: ["aplicarDestinoOcultar"] }, { kind: "ngmodule", type: StepsModule }, { kind: "component", type: i10.Steps, selector: "p-steps", inputs: ["activeIndex", "model", "readonly", "style", "styleClass", "exact"], outputs: ["activeIndexChange"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TabViewModule }, { kind: "component", type: i11.TabView, selector: "p-tabView", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i11.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "ngmodule", type: SplitButtonModule }, { kind: "component", type: i12.SplitButton, selector: "p-splitButton", inputs: ["model", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "icon", "iconPos", "label", "tooltip", "tooltipOptions", "style", "styleClass", "menuStyle", "menuStyleClass", "appendTo", "dir", "expandAriaLabel", "showTransitionOptions", "hideTransitionOptions", "buttonProps", "menuButtonProps", "autofocus", "disabled", "tabindex", "menuButtonDisabled", "buttonDisabled"], outputs: ["onClick", "onMenuHide", "onMenuShow", "onDropdownClick"] }, { kind: "directive", type: i13.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i13.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i14.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: AccordionModule }, { kind: "ngmodule", type: DropdownModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i15.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i15.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i15.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i15.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i16.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i16.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i16.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "component", type: TablaGeneralComponent, selector: "app-tabla-general", inputs: ["dataKey", "value", "columns", "rows", "totalRecords", "loading", "ocultarFraccionador"], outputs: ["onLoad", "onRowSelect"] }, { kind: "component", type: FiltroGeneralComponent, selector: "app-filtro-general", inputs: ["filtros", "datatable"], outputs: ["metodoRegresar", "metodoRegresarAdicional"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i15.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i15.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: InputTextareaModule }, { kind: "directive", type: i17.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "ngmodule", type: ConfirmPopupModule }] });
688
+ }
689
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: FuenteReporteComponent, decorators: [{
690
+ type: Component,
691
+ args: [{ selector: 'app-fuente-reporte', standalone: true, imports: [TooltipModule, CheckboxModule, PopupTablasFuenteComponent, StepsModule, CommonModule, TabViewModule, SplitButtonModule, NgIf, TranslateModule, InputTextModule, CommonModule, AccordionModule, DropdownModule, FormsModule, TableModule, TablaGeneralComponent, FiltroGeneralComponent, ButtonModule, ReactiveFormsModule, GeneralPipe, InputTextareaModule, ConfirmPopupModule, ButtonModule], providers: [MessageService, ConfirmationService], template: "@if(vistaVisualizar == null){\r\n <h1>{{'fuente' | translate}} {{'reporte'| translate}}</h1>\r\n <div class=\"flex justify-content-between align-items-center mb-3\">\r\n <app-filtro-general [filtros]=\"filters\" [datatable]=\"tablaGeneral\">\r\n <ng-template let-form>\r\n <ng-container [formGroup]=\"form\">\r\n <span class=\"p-float-label\">\r\n <input pInputText autofocus type=\"text\" id=\"descripcion\" formControlName=\"descripcion\"\r\n autocomplete=\"off\" />\r\n <label for=\"descripcion\">{{'filtro' | translate}}</label>\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </app-filtro-general>\r\n <button pButton label=\"{{'link_nuevo' | translate}}\" (click)=\"nuevo()\" icon=\"pi pi-plus\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div>\r\n <app-tabla-general #tablaGeneral [columns]=\"columns\" [value]=\"paginador\" [rows]=\"paginator.rows\"\r\n [totalRecords]=\"paginator.totalRecords\" (onLoad)=\"load($event)\" (onRowSelect)=\"verDetalle($event)\"\r\n [loading]=\"loading\"></app-tabla-general>\r\n}\r\n@if(vistaVisualizar != null){\r\n <div class=\"flex justify-content-between align-items-center mb-3\">\r\n <h1>{{'fuente' | translate}} {{'reporte'| translate}}</h1>\r\n <button pButton pRipple (click)=\"regresar()\" label=\"Regresar\"\r\n icon=\"pi pi-chevron-left\" class=\"p-button-text font-semibold\"></button>\r\n </div>\r\n <p-tabView>\r\n <p-tabPanel header=\"{{ 'fuente'| translate}}\">\r\n <div class=\"card\">\r\n <div class=\"mt-4\">\r\n <h5><i class=\"glyphicons glyphicons-book\"></i>{{'datos'| translate}} {{'basicos'| translate}}</h5>\r\n </div>\r\n \r\n <div class=\"p-fluid p-formgrid grid\">\r\n \r\n <div class=\"field col-12 md:col-12 lg:col-12\">\r\n <span class=\"p-float-label\">\r\n <input pInputText autofocus type=\"text\" id=\"peso\" [(ngModel)]=\"fuente.descripcion\"\r\n autocomplete=\"off\" />\r\n <label for=\"peso\">{{'nombre' | translate}}</label>\r\n </span>\r\n </div>\r\n \r\n <div class=\"field col-12 md:col-12 lg:col-12\">\r\n <span class=\"p-float-label\">\r\n <textarea class=\"w-full\" id=\"float-input\" rows=\"5\" cols=\"30\" pInputTextarea\r\n [(ngModel)]=\"query\" autofocus\r\n [autoResize]=\"true\"> </textarea>\r\n <label for=\"descripcion\">{{'consulta' | translate}}\r\n </label>\r\n </span>\r\n </div>\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons glyphicons-floppy-save\" label=\"{{'link_guardar' | translate}}\" (click)=\"guardar()\">\r\n </button>\r\n <p-splitButton class=\"ml-2\" label=\"Acciones Evaluadores\" icon=\"glyphicons glyphicons-list\" [model]=\"menu\"></p-splitButton>\r\n </div>\r\n \r\n \r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\" \r\n icon=\"glyphicons glyphicons-floppy-save\" label=\"{{'link_guardar' | translate}}\" (click)=\"guardarCampos()\">\r\n </button>\r\n </div>\r\n <p-table #tablaGeneralEntrada id=\"tabla_lista_tipo_entidad\" [value]=\"campos\" [scrollable]=\"true\"\r\n scrollDirection=\"both\" scrollDirection=\"horizontal\" responsiveLayout=\"scroll\" scrollDirection=\"horizontal\"\r\n styleClass=\"p-datatable-striped\" [showCurrentPageReport]=\"false\" editMode=\"row\"\r\n currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\"\r\n [lazy]=\"false\" dataKey=\"llaveTabla\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width:25%\">{{'nombre' | translate}}</th>\r\n <th style=\"width:25%\">{{'sintaxis' | translate}}</th>\r\n <th style=\"width:25%\">{{'tipo' | translate}} de {{'dato' | translate}}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-campo let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"campo\">\r\n <td style=\"width:25%\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"campo.nombre \" class=\"w-full\">\r\n </td>\r\n <td style=\"width:25%\">\r\n {{campo.tipoDato}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{campo.tipoDato}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"p-3 font-medium emptymessage\">\r\n <td colspan=\"5\">\r\n {{'mensajetablavacia' | translate}} \r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </p-tabPanel>\r\n \r\n \r\n <p-tabPanel header=\"{{ 'wizard'| translate}}\">\r\n <p-steps [model]=\"items\" [readonly]=\"false\" [activeIndex]=\"actual\"></p-steps>\r\n <div class=\"flex align-items-center justify-content-end mb-2\">\r\n <p-button (onClick)=\"anterior()\" [rounded]=\"true\" icon=\"pi pi-angle-left\" class=\"p-button-secondary\" pTooltip=\"Anterior\" tooltipPosition=\"top\" placeholder=\"Top\" [disabled]=\"actual <= 0\"/>\r\n <p-button (onClick)=\"siguiente()\" [rounded]=\"true\" icon=\"pi pi-angle-right\" class=\"p-button-secondary\" pTooltip=\"Siguiente\" tooltipPosition=\"top\" placeholder=\"Top\"/>\r\n </div>\r\n <div class=\"cardInstrucciones mt-4 mb-3\">\r\n <div class=\"flex\">\r\n <div class=\"icono\">\r\n <i class=\"pi pi-bell\"></i>\r\n </div>\r\n <div class=\"contenedor\">\r\n <label>{{mapaMensajes?.get(actual)}}</label>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- <div class=\"flex align-items-center justify-content-end mb-2\">\r\n <button pButton label=\"{{'link_anterior' | translate}}\" icon=\"pi pi-plus\" (click)=\"anterior()\" *ngIf=\"actual > 0\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n <button pButton label=\"{{'link_siguiente' | translate}}\" icon=\"pi pi-plus\" (click)=\"siguiente()\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n </div> -->\r\n @if(actual === 0){\r\n <div class=\"field col-12 md:col-12 lg:col-12\">\r\n <button pButton label=\"{{'fuente' | translate}}\" icon=\"pi pi-plus\" (click)=\"buscarTabla()\"\r\n class=\"p-ripple p-element p-button p-component p-button-secondary mb-2\"></button>\r\n <p-table #tablaGeneralEntrada id=\"tabla_lista_tipo_entidad\" [value]=\"tablasFrom\" [scrollable]=\"true\"\r\n scrollDirection=\"both\" scrollDirection=\"horizontal\" responsiveLayout=\"scroll\" scrollDirection=\"horizontal\"\r\n styleClass=\"p-datatable-striped\" [showCurrentPageReport]=\"true\" editMode=\"row\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" [lazy]=\"true\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width:25%\">{{'tabla' | translate}}</th>\r\n <th style=\"width:25%\">{{'alias' | translate}}</th>\r\n <th style=\"width:25%\"> </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-tabla let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"tabla\">\r\n <td style=\"width:25%\">\r\n {{tabla.tabla}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{tabla.alias}}\r\n </td>\r\n <td class=\"flex justify-content-end\">\r\n <div>\r\n <!-- ELIMINAR -->\r\n <button pButton pRipple type=\"button\" pDeleteEditableRow\r\n icon=\"pi pi-trash\" (click)=\"eliminarTabla(tabla)\"\r\n class=\"p-element p-ripple p-button-rounded p-button-outlined mr-2 mb-2 p-button p-component p-button-icon-only\"></button>\r\n </div>\r\n\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"p-3 font-medium emptymessage\">\r\n <td colspan=\"5\">\r\n {{'mensajetablavacia' | translate}} \r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n }\r\n @if(actual == 1){\r\n\r\n <p-table #tablaGeneralEntrada id=\"tabla_lista_tipo_entidad\" [value]=\"foraneas\" [scrollable]=\"true\"\r\n scrollDirection=\"both\" scrollDirection=\"horizontal\" responsiveLayout=\"scroll\" scrollDirection=\"horizontal\"\r\n styleClass=\"p-datatable-striped\" [showCurrentPageReport]=\"true\" editMode=\"row\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" [lazy]=\"true\" dataKey=\"llave\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width:25%\">{{'' | translate}}</th>\r\n <th style=\"width:25%\">{{'' | translate}}</th>\r\n <th style=\"width:25%\">{{'' | translate}}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-tabla let-editing=\"editing\" let-ri=\"rowIndex\">\r\n <tr [pEditableRow]=\"tabla\">\r\n <td style=\"width:25%\">\r\n {{tabla.alias1}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{tabla.alias2}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{tabla.llave.nombre}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"p-3 font-medium emptymessage\">\r\n <td colspan=\"5\">\r\n {{'mensajetablavacia' | translate}} \r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n }\r\n @if(actual == 2){\r\n\r\n <div class=\"card\">\r\n <!-- <div class=\"mt-4\">\r\n <h5><i class=\"glyphicons glyphicons-book\"></i>{{'datos'| translate}} {{'basicos'| translate}}</h5>\r\n </div> -->\r\n \r\n <div class=\"p-fluid p-formgrid grid\">\r\n \r\n <div class=\"field col-12 md:col-12 lg:col-12\">\r\n <span class=\"p-float-label\">\r\n <textarea class=\"w-full\" id=\"float-input\" rows=\"5\" cols=\"30\" pInputTextarea\r\n [(ngModel)]=\"fuente.whereAdicional\" autofocus\r\n [autoResize]=\"true\"> </textarea>\r\n <label for=\"descripcion\">{{'consulta' | translate}}\r\n </label>\r\n </span>\r\n </div>\r\n <div class=\"flex justify-content-end\">\r\n <button pButton pRipple class=\"ml-2 p-button p-button-raised\"\r\n icon=\"glyphicons glyphicons-floppy-save\" label=\"{{'link_guardar' | translate}}\" (click)=\"editarWhere()\">\r\n </button>\r\n </div>\r\n \r\n \r\n </div>\r\n </div>\r\n\r\n }\r\n @if(actual == 3){\r\n\r\n <p-table id=\"tabla_lista_tipo_entidad\" [value]=\"camposSeleccionar\" [scrollable]=\"true\" [totalRecords]=\"camposSeleccionar.length\"\r\n scrollDirection=\"both\" scrollDirection=\"horizontal\" responsiveLayout=\"scroll\" scrollDirection=\"horizontal\" [paginator]=\"camposSeleccionar.length > 10\" [rows]=\"10\" [rowsPerPageOptions]=\"[10, 20, 30]\"\r\n styleClass=\"p-datatable-striped\" [showCurrentPageReport]=\"true\" editMode=\"row\" currentPageReportTemplate=\"{first} al {last} de {totalRecords} registros\" [lazy]=\"false\" dataKey=\"alias\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width:25%\" alignFrozen=\"left\" pFrozenColumn>\r\n <p-checkbox [style]=\"{'margin-left': '1%','margin-right':'1%'}\" [(ngModel)]=\"seleccionGeneral\" [binary]=\"true\" [ngModel]=\"todosSeleccionados()\" (ngModelChange)=\"actualizarSeleccion($event)\"></p-checkbox>\r\n <span style=\"margin-left:1%\">{{'tabla' | translate}}</span>\r\n </th>\r\n <th style=\"width:25%\">{{'columna' | translate}}</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-tabla>\r\n <tr>\r\n <td style=\"width:25%\">\r\n <p-checkbox class=\"mr-2 \" [(ngModel)]=\"tabla.seleccionado\" [binary]=\"true\" inputId=\"binary\">\r\n </p-checkbox>\r\n {{tabla.columna.reporteFuente}}\r\n </td>\r\n <td style=\"width:25%\">\r\n {{tabla.columna.nombre}}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"emptymessage\">\r\n <tr class=\"p-3 font-medium emptymessage\">\r\n <td colspan=\"5\">\r\n {{'mensajetablavacia' | translate}} \r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n }\r\n\r\n </p-tabPanel>\r\n </p-tabView>\r\n \r\n}\r\n\r\n<app-popup-tablas-fuente #popupTablasFuenteUI (aplicarDestinoOcultar)=\"setTablaSeleccionada($event)\"></app-popup-tablas-fuente>", styles: [":host ::ng-deep .botonCircular{background:var(--color-85);border:solid 1px var(--color-85);color:var(--color-400)}\n"] }]
692
+ }], ctorParameters: () => [{ type: i1.MenuService }, { type: i2.ToastService }, { type: i3.ReportesService }, { type: i4.GeneralService }, { type: i5.UtilsService }, { type: i6.ConfirmationService }, { type: i7.TranslateService }, { type: i6.MessageService }], propDecorators: { popupTablasFuenteUI: [{
693
+ type: ViewChild,
694
+ args: ['popupTablasFuenteUI']
695
+ }] } });
696
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVlbnRlLXJlcG9ydGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC93ZWJjb21tb24vcGFnZXMvZnVlbnRlLXJlcG9ydGUvZnVlbnRlLXJlcG9ydGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC93ZWJjb21tb24vcGFnZXMvZnVlbnRlLXJlcG9ydGUvZnVlbnRlLXJlcG9ydGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFHekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFFbkYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBRW5GLE9BQU8sRUFBRSxtQkFBbUIsRUFBWSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUUsT0FBTyxFQUFFLGVBQWUsRUFBb0IsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUN4RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1B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QUFpQixFQUFDLElBQUksRUFBQyxlQUFlLEVBQUUsZUFBZSxFQUFDLFlBQVksRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLENBQUMsYUFDcFgsQ0FBQyxjQUFjLEVBQUMsbUJBQW1CLENBQUM7K1JBc0NiLG1CQUFtQjtzQkFBcEQsU0FBUzt1QkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLy4uLy4uLy4uL2NvcmUvc2VydmljaW9zL3RvYXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbHVtbmFGdWVudGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL0NvbHVtbmFGdWVudGVNb2RlbCc7XHJcbmltcG9ydCB7IEZ1ZW50ZURhdG9Nb2RlbCB9IGZyb20gJy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL0Z1ZW50ZURhdG8nO1xyXG5pbXBvcnQgeyBSZXBvcnRlQ29sdW1uYU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vc2VndXJpZGFkL21vZGVsb3MvUmVwb3J0ZUNvbHVtbmEnO1xyXG5pbXBvcnQgeyBUYWJsYUZyb21Nb2RlbCB9IGZyb20gJy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL1RhYmxhRnJvbU1vZGVsJztcclxuaW1wb3J0IHsgSm9pbkZyb21Nb2RlbCB9IGZyb20gJy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL0pvaW5Gcm9tTW9kZWwnO1xyXG5pbXBvcnQgeyBSZXBvcnRlc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnRlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGxhdmVGb3JhbmVhTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9zZWd1cmlkYWQvbW9kZWxvcy9MbGF2ZUZvcmFuZWFNb2RlbCc7XHJcbmltcG9ydCB7IEZvcmVpbmdXcmFwZXJNb2RlbCB9IGZyb20gJy4uLy4uLy4uL3NlZ3VyaWRhZC9tb2RlbG9zL0ZvcmVpbmdXcmFwZXJNb2RlbCc7XHJcbmltcG9ydCB7IEdlbmVyYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2lvcy9nZW5lcmFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHZW5lcmFsTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9zZWd1cmlkYWQvbW9kZWxvcy9HZW5lcmFsTW9kZWwnO1xyXG5pbXBvcnQgeyBDb2x1bW5hV3JhcGVyTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9zZWd1cmlkYWQvbW9kZWxvcy9Db2x1bW5hV3JhcGVyTW9kZWwnO1xyXG5pbXBvcnQgeyBVdGlsc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2lvcy91dGlscy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uU2VydmljZSwgTWVudUl0ZW0sIE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgQ29uc3RhbnRlc0dlbmVyYWxlcyB9IGZyb20gJy4uLy4uLy4uL3NlZ3VyaWRhZC9jb25zdGFudGVzL0NvbnN0YW50ZXNHZW5lcmFsZXMnO1xyXG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XHJcbmltcG9ydCB7IENvbmZpcm1Qb3B1cE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY29uZmlybXBvcHVwJztcclxuaW1wb3J0IHsgSW5wdXRUZXh0YXJlYU1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0YXJlYSc7XHJcbmltcG9ydCB7IElucHV0VGV4dE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQWNjb3JkaW9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9hY2NvcmRpb24nO1xyXG5pbXBvcnQgeyBEcm9wZG93bk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZHJvcGRvd24nO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVGFibGVNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RhYmxlJztcclxuaW1wb3J0IHsgR2VuZXJhbFBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9nZW5lcmFsLnBpcGUnO1xyXG5pbXBvcnQgeyBUYWJsYUdlbmVyYWxDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2NvbXBvbmVudGVzL3RhYmxhLWdlbmVyYWwvdGFibGEtZ2VuZXJhbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGaWx0cm9HZW5lcmFsQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9jb21wb25lbnRlcy9maWx0cm8tZ2VuZXJhbC9maWx0cm8tZ2VuZXJhbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNZW51U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljaW9zL21lbnUuc2VydmljZSc7XHJcbmltcG9ydCB7IFNwbGl0QnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9zcGxpdGJ1dHRvbic7XHJcbmltcG9ydCB7IFRhYlZpZXdNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RhYnZpZXcnO1xyXG5pbXBvcnQgeyBTdGVwc01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc3RlcHMnO1xyXG5pbXBvcnQgeyBQb3B1cFRhYmxhc0Z1ZW50ZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3BvcHVwcy9wb3B1cC10YWJsYXMtZnVlbnRlL3BvcHVwLXRhYmxhcy1mdWVudGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2hlY2tib3hNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NoZWNrYm94JztcclxuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XHJcblxyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnYXBwLWZ1ZW50ZS1yZXBvcnRlJyxcclxuXHRzdGFuZGFsb25lOiB0cnVlLFxyXG5cdGltcG9ydHM6IFtUb29sdGlwTW9kdWxlLENoZWNrYm94TW9kdWxlLFBvcHVwVGFibGFzRnVlbnRlQ29tcG9uZW50LFN0ZXBzTW9kdWxlLENvbW1vbk1vZHVsZSxUYWJWaWV3TW9kdWxlLFNwbGl0QnV0dG9uTW9kdWxlLE5nSWYsVHJhbnNsYXRlTW9kdWxlLCBJbnB1dFRleHRNb2R1bGUsQ29tbW9uTW9kdWxlLCBBY2NvcmRpb25Nb2R1bGUsIERyb3Bkb3duTW9kdWxlLCBGb3Jtc01vZHVsZSwgVGFibGVNb2R1bGUsIFRhYmxhR2VuZXJhbENvbXBvbmVudCwgRmlsdHJvR2VuZXJhbENvbXBvbmVudCwgQnV0dG9uTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBHZW5lcmFsUGlwZSwgSW5wdXRUZXh0YXJlYU1vZHVsZSwgQ29uZmlybVBvcHVwTW9kdWxlLCBCdXR0b25Nb2R1bGVdLFxyXG5cdHByb3ZpZGVyczogW01lc3NhZ2VTZXJ2aWNlLENvbmZpcm1hdGlvblNlcnZpY2VdLFxyXG5cdHRlbXBsYXRlVXJsOiAnLi9mdWVudGUtcmVwb3J0ZS5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmw6ICcuL2Z1ZW50ZS1yZXBvcnRlLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRnVlbnRlUmVwb3J0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG5cdHB1YmxpYyBmdWVudGU6IEZ1ZW50ZURhdG9Nb2RlbCA9IG5ldyBGdWVudGVEYXRvTW9kZWwoKTtcclxuXHRwdWJsaWMgdmlzdGFWaXN1YWxpemFyOiBzdHJpbmdcclxuXHRwdWJsaWMgdGFibGFzRnJvbTogVGFibGFGcm9tTW9kZWxbXSA9IFtdOyAvLyBmcm9tIFRhYmxhRnJvbVxyXG5cdHB1YmxpYyBqb2luc0Zyb206IEpvaW5Gcm9tTW9kZWxbXSA9IFtdOyAgIC8vZnJvbSBKb2luRnJvbSBcclxuXHRwdWJsaWMgY29sdW1uYXM6IFJlcG9ydGVDb2x1bW5hTW9kZWxbXSA9IFtdO1xyXG5cdHB1YmxpYyBsaXN0YUNvbHVtbmFzOiBhbnlbXSA9IFtdO1xyXG5cdHB1YmxpYyBsaXN0YUpvaW46IGFueVtdID0gW107XHJcblx0cHVibGljIGNvbDE6IHN0cmluZztcclxuXHRwdWJsaWMgY29sMjogc3RyaW5nO1xyXG5cdHB1YmxpYyBjYW1wb3M6IENvbHVtbmFGdWVudGVNb2RlbFtdID0gW107XHJcblx0cHVibGljIGNhbXBvc1NlbGVjY2lvbmFyOiBDb2x1bW5hV3JhcGVyTW9kZWxbXSA9IFtdO1xyXG5cdHB1YmxpYyBtb3N0cmFyU2VsZWNjaW9uYXI6IGJvb2xlYW47XHJcblx0cHVibGljIGNhbXBvRm9ybXVsYTogQ29sdW1uYUZ1ZW50ZU1vZGVsID0gbmV3IENvbHVtbmFGdWVudGVNb2RlbCgpO1xyXG5cdHB1YmxpYyBhY3R1YWw6IG51bWJlcjtcclxuXHRwdWJsaWMgdGFiUHJpbmNpcGFsOiBudW1iZXI7XHJcblx0cHVibGljIGJhc2ljbzogYm9vbGVhbjtcclxuXHRwdWJsaWMgc2VsZWNjaW9uR2VuZXJhbDogYm9vbGVhbjtcclxuXHRwdWJsaWMgZm9yYW5lYXM6IGFueVtdID0gW107XHJcblx0cHVibGljIGRlc2NyaXBjaW9uOiBzdHJpbmc7XHJcblx0cHVibGljIHF1ZXJ5OiBzdHJpbmc7XHJcblx0cHVibGljIHBhZ2luYWRvcjogRnVlbnRlRGF0b01vZGVsW10gPSBbXTtcclxuXHRwdWJsaWMgZmlsdHJvOiBGdWVudGVEYXRvTW9kZWwgPSBuZXcgRnVlbnRlRGF0b01vZGVsKCk7XHJcblx0cHVibGljIHBhZ2luYXRvciA9IHtcclxuXHRcdHJvd3M6IDEwLFxyXG5cdFx0dG90YWxSZWNvcmRzOiAwLFxyXG5cdH07XHJcblx0cHVibGljIGNvbHVtbnMgOiBhbnlbXSA9IFtdO1xyXG4gIFx0cHVibGljIGZpbHRlcnMgOiBhbnlbXSA9IFtdO1xyXG5cdHB1YmxpYyBsb2FkaW5nIDogYm9vbGVhbjtcclxuXHRwdWJsaWMgbWVudTogTWVudUl0ZW1bXSA9IFtdO1xyXG5cdHB1YmxpYyBpdGVtczogTWVudUl0ZW1bXSA9IFtdO1xyXG5cdHB1YmxpYyBtYXBhTWVuc2FqZXM6IE1hcDxudW1iZXIsc3RyaW5nPiA9IG5ldyBNYXA8bnVtYmVyLHN0cmluZz4oKTtcclxuXHRAVmlld0NoaWxkKCdwb3B1cFRhYmxhc0Z1ZW50ZVVJJykgcG9wdXBUYWJsYXNGdWVudGVVSTogUG9wdXBUYWJsYXNGdWVudGVDb21wb25lbnQ7XHJcblxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgbWVudVNlcnZpY2U6IE1lbnVTZXJ2aWNlLHByaXZhdGUgbm90aWZpY2F0aW9uQnVzU2VydmljZTogVG9hc3RTZXJ2aWNlLCBwcml2YXRlIHJlcG9ydGVzU3ZjOiBSZXBvcnRlc1NlcnZpY2UsIHByaXZhdGUgZ2VuZXJhbFN2YzogR2VuZXJhbFNlcnZpY2UsIHByaXZhdGUgdXRpbHNTZXJ2aWNlOiBVdGlsc1NlcnZpY2UsIHByaXZhdGUgY29uZmlybWF0aW9uU2VydmljZTogQ29uZmlybWF0aW9uU2VydmljZSwgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG5cdFx0cHVibGljIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSkgeyB9XHJcblxyXG5cdG5nT25Jbml0KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5saXN0YUNvbHVtbmFzID0gW107XHJcblx0XHR0aGlzLmNhbXBvcyA9IFtdO1xyXG5cdFx0dGhpcy5saXN0YUpvaW4gPSBbXTtcclxuXHRcdHRoaXMuY29sdW1uYXMgPSBbXTtcclxuXHRcdHRoaXMudGFibGFzRnJvbSA9IFtdO1xyXG5cdFx0dGhpcy5jYW1wb3NTZWxlY2Npb25hciA9IFtdO1xyXG5cdFx0dGhpcy5qb2luc0Zyb20gPSBbXTtcclxuXHRcdHRoaXMuYWN0dWFsID0gMDtcclxuXHRcdHRoaXMubWVudVNlcnZpY2Uuc2V0QnJlYWRjcnVtYihbeyBsYWJlbDogJ0Z1ZW50ZSBSZXBvcnRlJyB9XSk7XHJcblx0XHR0aGlzLmNvbHVtbnMgPSBbXHJcblx0XHQgIHtcclxuXHRcdFx0ZmllbGQ6ICAnZGVzY3JpcGNpb24nLFxyXG5cdFx0XHRoZWFkZXI6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdkZXNjcmlwY2lvbicpLFxyXG5cdFx0XHR3aWR0aDogMTAwLFxyXG5cdFx0ICB9LFxyXG5cdFx0XTtcclxuXHRcdHRoaXMuZmlsdGVycyA9IFtcclxuXHRcdCAge1xyXG5cdFx0XHRmaWVsZDogJ2Rlc2NyaXBjaW9uJyxcclxuXHRcdFx0aGVhZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnZGVzY3JpcGNpb24nKSxcclxuXHRcdFx0bWF0Y2hNb2RlOiAnY29udGFpbnMnLFxyXG5cdFx0ICB9XHJcblx0XHRdO1xyXG5cdFx0dGhpcy5pbml0U3RlcCgpO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGFzeW5jIGxvYWQoZXZlbnQpIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdHRoaXMubG9hZGluZyA9dHJ1ZTtcclxuXHRcdFx0dGhpcy5jb2xvY2FyRmlsdHJvKCk7XHJcblx0XHRcdHRoaXMuZmlsdHJvLnBhZ2luYWNpb25SZWdpc3Ryb0luaWNpYWwgPSBldmVudD8uZmlyc3QgIT0gbnVsbCA/IGV2ZW50Py5maXJzdCA6IDAsXHJcblx0XHRcdFx0dGhpcy5maWx0cm8ucGFnaW5hY2lvblJlZ2lzdHJvRmluYWwgPSBldmVudD8ucm93cyAhPSBudWxsID8gZXZlbnQ/LnJvd3MgOiAxMCxcclxuXHRcdFx0XHR0aGlzLnBhZ2luYWRvciA9IGF3YWl0IHRoaXMucmVwb3J0ZXNTdmMuY29uc3VsdGFyRnVlbnRlRGF0byh0aGlzLmZpbHRybykudG9Qcm9taXNlKCk7XHJcblx0XHRcdHRoaXMucGFnaW5hdG9yLnRvdGFsUmVjb3JkcyA9IGF3YWl0IHRoaXMucmVwb3J0ZXNTdmMuY2FudGlkYWRGdWVudGVEYXRvKHRoaXMuZmlsdHJvKS50b1Byb21pc2UoKTtcclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlKTtcclxuXHRcdH1cclxuXHRcdHRoaXMubG9hZGluZyA9ZmFsc2U7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgY29sb2NhckZpbHRybygpIHtcclxuXHRcdHRoaXMuZmlsdHJvLm9yaWdlbiA9IChcIkZcIik7XHJcblx0XHR0aGlzLmZpbHRyby5kZXNjcmlwY2lvbiA9IChudWxsKTtcclxuXHRcdGlmICh0aGlzLnV0aWxzU2VydmljZS5pc05vdEJsYW5rKHRoaXMuZGVzY3JpcGNpb24pKSB7XHJcblx0XHRcdHRoaXMuZmlsdHJvLmRlc2NyaXBjaW9uID0gKENvbnN0YW50ZXNHZW5lcmFsZXMuUE9SQ0VOVEFKRSArIHRoaXMuZGVzY3JpcGNpb24gKyBDb25zdGFudGVzR2VuZXJhbGVzLlBPUkNFTlRBSkUpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cdHB1YmxpYyBsaW1waWFyQ2FtcG9zKCkge1xyXG5cdFx0dGhpcy5kZXNjcmlwY2lvbiA9IG51bGw7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYXN5bmMgc2lndWllbnRlKCkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0aWYgKHRoaXMudmFsaWRhcldpemFyZCgpKSB7XHJcblx0XHRcdFx0aWYgKHRoaXMuYWN0dWFsIDwgMykge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuYWN0dWFsID09IDApIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5mb3JhbmVhcyA9IFtdO1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy50YWJsYXNGcm9tLmxlbmd0aCA9PSAwKSB7IC8vIE5vIHNlbGVjY2lvbm8gbmluZ3VuYSB0YWJsYVxyXG5cdFx0XHRcdFx0XHRcdHRoaXMubm90aWZpY2F0aW9uQnVzU2VydmljZS5zaG93SW5mbyhcIkRlYmUgc2VsZWNjaW9uYXIgYWwgbWVub3MgdW4gb2JqZXRvLlwiKTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodGhpcy50YWJsYXNGcm9tLmxlbmd0aCA9PSAxKSB7IC8vIFNvbG8gc2VsZWNjaW9ubyB1bmEsIHBvciBlc28gbm8gaGF5IHF1ZSBnZW5lcmFyIGpvaW5zLlxyXG5cdFx0XHRcdFx0XHRcdHRoaXMuYWN0dWFsKys7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IG5vbWJyZXNUYWJsYXMgPSBbXTtcclxuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCB0YWJsYSBvZiB0aGlzLnRhYmxhc0Zyb20pIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmICghbm9tYnJlc1RhYmxhcy5pbmNsdWRlcyh0YWJsYS50YWJsYSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bm9tYnJlc1RhYmxhcy5wdXNoKHRhYmxhLnRhYmxhKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5mb3JhbmVhcyA9IFtdO1xyXG5cdFx0XHRcdFx0XHRcdC8vTGlzdDxMbGF2ZUZvcmFuZWE+IFxyXG5cdFx0XHRcdFx0XHRcdGxldCBsbGF2ZXM6IExsYXZlRm9yYW5lYU1vZGVsW10gPSBhd2FpdCB0aGlzLnJlcG9ydGVzU3ZjLmdldExsYXZlcyhub21icmVzVGFibGFzKS50b1Byb21pc2UoKTtcclxuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGFibGFzRnJvbS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLnRhYmxhc0Zyb20ubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgZm9yYW5lYSBvZiBsbGF2ZXMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoZm9yYW5lYS50YWJsYTEgPT0gKHRoaXMudGFibGFzRnJvbVtpXS50YWJsYSkgJiYgZm9yYW5lYS50YWJsYTIgPT0gKHRoaXMudGFibGFzRnJvbVtqXS50YWJsYSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGxldCBudWV2bzogRm9yZWluZ1dyYXBlck1vZGVsID0gbmV3IEZvcmVpbmdXcmFwZXJNb2RlbCgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bnVldm8uYWxpYXMxID0gKHRoaXMudGFibGFzRnJvbVtpXS5hbGlhcyk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWV2by5hbGlhczIgPSAodGhpcy50YWJsYXNGcm9tW2pdLmFsaWFzKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG51ZXZvLmxsYXZlID0gKGZvcmFuZWEpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5mb3JhbmVhcy5wdXNoKG51ZXZvKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBDYXJnbyBsYXMgY29sdW1uYXMgcGFyYSBsb3Mgc2lndWllbnRlcyBwcm9jZXNvcy5cclxuXHJcblx0XHRcdFx0XHRcdHRoaXMuY29sdW1uYXMgPSBbXTtcclxuXHRcdFx0XHRcdFx0dGhpcy5saXN0YUNvbHVtbmFzID0gW107XHJcblx0XHRcdFx0XHRcdHRoaXMuY2FtcG9zU2VsZWNjaW9uYXIgPSBbXTtcclxuXHJcblx0XHRcdFx0XHRcdGZvciAobGV0IGZyb20gb2YgdGhpcy50YWJsYXNGcm9tKSB7XHJcblx0XHRcdFx0XHRcdFx0Ly9SZXBvcnRlQ29sdW1uYURUTyBcclxuXHRcdFx0XHRcdFx0XHRsZXQgdGEgPSBuZXcgUmVwb3J0ZUNvbHVtbmFNb2RlbCgpO1xyXG5cdFx0XHRcdFx0XHRcdHRhLnJlcG9ydGVGdWVudGUgPSAoZnJvbS50YWJsYSk7XHJcblx0XHRcdFx0XHRcdFx0Ly9MaXN0PFJlcG9ydGVDb2x1bW5hRFRPPiBcclxuXHRcdFx0XHRcdFx0XHRsZXQgbnVldmFzOiBSZXBvcnRlQ29sdW1uYU1vZGVsW10gPSBhd2FpdCB0aGlzLmdlbmVyYWxTdmMucXVlcnlGb3JMaXN0KG5ldyBHZW5lcmFsTW9kZWwoJ1JlcG9ydGVDb2x1bW5hRFRPJywgJ1JlcG9ydGVzLmNvbnN1bHRhckNvbHVtbmFzJywgZmFsc2UsIHRhKSkudG9Qcm9taXNlKCk7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5jYXJnYXJMaXN0YXNDb2x1bW5hcyhudWV2YXMsIGZyb20uYWxpYXMpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0dGhpcy5hY3R1YWwrKztcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dGhpcy50ZXJtaW5hclBhc29zKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGFzeW5jIGNhcmdhckxpc3Rhc0NvbHVtbmFzKG51ZXZhczogUmVwb3J0ZUNvbHVtbmFNb2RlbFtdLCBhbGlhczogc3RyaW5nKSB7XHJcblx0XHRmb3IgKGxldCBjb2wgb2YgbnVldmFzKSB7XHJcblx0XHRcdGNvbC5yZXBvcnRlRnVlbnRlID0gKGFsaWFzKTtcclxuXHRcdFx0dGhpcy5jb2x1bW5hcy5wdXNoKGNvbCk7XHJcblx0XHRcdHRoaXMubGlzdGFDb2x1bW5hcy5wdXNoKHsgdmFsdWU6IGNvbC5yZXBvcnRlRnVlbnRlICsgJy4nICsgY29sLm5vbWJyZSwgbGFiZWw6IGNvbC5yZXBvcnRlRnVlbnRlICsgJy4nICsgY29sLm5vbWJyZSB9KTtcclxuXHRcdFx0bGV0IGNhbXBvID0gbmV3IENvbHVtbmFXcmFwZXJNb2RlbCgpO1xyXG5cdFx0XHRjYW1wby5jb2x1bW5hID0gY29sO1xyXG5cdFx0XHRjYW1wby5hbGlhcyA9IGNvbC5ub21icmU7XHJcblx0XHRcdHRoaXMuY2FtcG9zU2VsZWNjaW9uYXIucHVzaChjYW1wbyk7XHJcblx0XHR9XHJcblx0XHRjb25zb2xlLmxvZygnY2FtcG9zU2VsZWNjaW9uYXInLHRoaXMuY2FtcG9zU2VsZWNjaW9uYXIpO1xyXG5cdFx0XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYXN5bmMgdGVybWluYXJQYXNvcygpIHtcclxuXHRcdGxldCBjYW1wb3NTcWwgPSBcIlwiO1xyXG5cdFx0bGV0IGkgPSAwO1xyXG5cdFx0Zm9yIChsZXQgY29sIG9mIHRoaXMuY2FtcG9zU2VsZWNjaW9uYXIpIHtcclxuXHRcdFx0aWYgKGNvbC5zZWxlY2Npb25hZG8pIHtcclxuXHRcdFx0XHRjYW1wb3NTcWwgKz0gKGkgPT0gMCA/IFwiXCIgOiBcIixcIikgKyBjb2wuY29sdW1uYS5ub21icmUgKyBcIiBhcyBcIiArIGNvbC5hbGlhcztcclxuXHRcdFx0XHRpKys7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLmZ1ZW50ZS53aGVyZUpvaW4gPSAodGhpcy5nZW5lcmFyU3FsSm9pbigpKTtcclxuXHRcdHRoaXMuZnVlbnRlLmZyb21TcWwgPSAodGhpcy5nZW5lcmFyU3FsRnJvbSgpKTtcclxuXHRcdGxldCB3aGVyZSA9IFwiXCI7XHJcblx0XHRsZXQgZXN0YUJsYW5jb1doZXJlSm9pbjogYm9vbGVhbiA9IHRoaXMuZnVlbnRlLndoZXJlSm9pbiA9PSBudWxsIHx8IFwiXCIgPT0gKHRoaXMuZnVlbnRlLndoZXJlSm9pbik7XHJcblx0XHRsZXQgZXN0YUJsYW5jb1doZXJlQWRpY2lvbmFsOiBib29sZWFuID0gdGhpcy5mdWVudGUud2hlcmVBZGljaW9uYWwgPT0gbnVsbCB8fCBcIlwiID09ICh0aGlzLmZ1ZW50ZS53aGVyZUFkaWNpb25hbCk7XHJcblx0XHRpZiAoIWVzdGFCbGFuY29XaGVyZUpvaW4gfHwgIWVzdGFCbGFuY29XaGVyZUFkaWNpb25hbCkge1xyXG5cdFx0XHR3aGVyZSA9IFwiIFxcbldIRVJFIFwiO1xyXG5cdFx0XHRpZiAoIWVzdGFCbGFuY29XaGVyZUpvaW4gJiYgIWVzdGFCbGFuY29XaGVyZUFkaWNpb25hbCkge1xyXG5cdFx0XHRcdHdoZXJlICs9IHRoaXMuZnVlbnRlLndoZXJlSm9pbiArIFwiIEFORCBcXG4oXCIgKyB0aGlzLmZ1ZW50ZS53aGVyZUFkaWNpb25hbCArIFwiKVwiO1xyXG5cdFx0XHR9IGVsc2UgaWYgKCFlc3RhQmxhbmNvV2hlcmVKb2luKSB7XHJcblx0XHRcdFx0d2hlcmUgKz0gdGhpcy5mdWVudGUud2hlcmVKb2luO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHdoZXJlICs9IHRoaXMuZnVlbnRlLndoZXJlQWRpY2lvbmFsO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRjb25zb2xlLmxvZygnd2hlcmUnLHdoZXJlKTtcclxuXHRcdFxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0bGV0IHNxbCA9IFwiU0VMRUNUIFxcblwiICsgY2FtcG9zU3FsICsgXCIgXFxuRlJPTSBcXG5cIiArIHRoaXMuZnVlbnRlLmZyb21TcWwgKyB3aGVyZTtcclxuXHRcdFx0YXdhaXQgdGhpcy5yZXBvcnRlc1N2Yy52YWxpZGFyUXVlcnkoc3FsKS50b1Byb21pc2UoKTtcclxuXHRcdFx0dGhpcy5mdWVudGUucXVlcnkgPSAoc3FsKTtcclxuXHRcdFx0dGhpcy5xdWVyeSA9IHNxbDtcclxuXHRcdFx0dGhpcy50YWJQcmluY2lwYWwgPSAwO1xyXG5cdFx0XHR0aGlzLmNvbnN0cnVpckNvbHVtbmFzKCk7XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYXN5bmMgYWRpY2lvbmFyRm9yYW5lYShldmVudG8pIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdC8vRm9yZWluZ1dyYXBlciBcclxuXHRcdFx0bGV0IGZvcmFuZWE6IEZvcmVpbmdXcmFwZXJNb2RlbCA9IGV2ZW50by5kYXRhO1xyXG5cdFx0XHRmb3IgKGxldCByZWwgb2YgZm9yYW5lYS5sbGF2ZS5yZWxhY2lvbmVzKSB7XHJcblx0XHRcdFx0bGV0IHBhciA9IHJlbC5zcGxpdChcIjpcIik7XHJcblx0XHRcdFx0bGV0IGpvaW4gPSBuZXcgSm9pbkZyb21Nb2RlbCgpO1xyXG5cdFx0XHRcdGpvaW4uY29sdW1uYTEgPSAoZm9yYW5lYS5hbGlhczEgKyBcIi5cIiArIHBhclswXSk7XHJcblx0XHRcdFx0am9pbi5jb2x1bW5hMiA9IChmb3JhbmVhLmFsaWFzMiArIFwiLlwiICsgcGFyWzFdKTtcclxuXHRcdFx0XHR0aGlzLmpvaW5zRnJvbS5wdXNoKGpvaW4pO1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYXN5bmMgZWxpbWluYXIoKSB7XHJcblx0XHR0aGlzLmNvbmZpcm1hdGlvblNlcnZpY2UuY29uZmlybSh7XHJcblx0XHRcdHRhcmdldDogZXZlbnQudGFyZ2V0LFxyXG5cdFx0XHRtZXNzYWdlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbWVuc2FqZV9hbGVydGEnKSxcclxuXHRcdFx0aWNvbjogJ2NvbmZpcm1hcicsXHJcblx0XHRcdGFjY2VwdDogKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuc2V0UmVzcHVlc3RhKHRydWUpXHJcblx0XHRcdH0sXHJcblx0XHRcdHJlamVjdDogKCkgPT4ge1xyXG5cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYXN5bmMgc2V0UmVzcHVlc3RhKHJlc3B1ZXN0YTogYm9vbGVhbikge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0aWYgKHJlc3B1ZXN0YSkge1xyXG5cdFx0XHRcdHRoaXMucmVwb3J0ZXNTdmMuZWxpbWluYXJGdWVudGVEYXRvc0Nvbkhpam9zKHRoaXMuZnVlbnRlKS50b1Byb21pc2UoKTtcclxuXHRcdFx0XHR0aGlzLmZ1ZW50ZSA9IG51bGw7XHJcblx0XHRcdFx0dGhpcy5ub3RpZmljYXRpb25CdXNTZXJ2aWNlLnNob3dJbmZvKFwiTGEgZnVlbnRlIGhhIHNpZG8gZWxpbWluYWRhLlwiKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGUpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIGFudGVyaW9yKCkge1xyXG5cdFx0aWYgKHRoaXMuYWN0dWFsID4gMClcclxuXHRcdFx0dGhpcy5hY3R1YWwtLTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBhc3luYyB2YWxpZGFyUXVlcnkoKSB7XHJcblx0XHR0cnkge1xyXG5cclxuXHRcdFx0aWYgKHRoaXMudXRpbHNTZXJ2aWNlLnZhbGlkYXJUZXh0b1NRTCh0aGlzLnF1ZXJ5LCB0cnVlLCB0cnVlLCA4MDAwLCB0cnVlKSkge1xyXG5cdFx0XHRcdHRoaXMucmVwb3J0ZXNTdmMudmFsaWRhclF1ZXJ5KHRoaXMucXVlcnkpO1xyXG5cdFx0XHRcdHRoaXMubm90aWZpY2F0aW9uQnVzU2VydmljZS5zaG93SW5mbyhcIkVsIHF1ZXJ5IGVzdGEgY29ycmVjdG8uXCIpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdC8vVmFsaWRhZG9yLmFkaWNpb25hck1lbnNhamUoXCJmdWVudGVGb3JtOnRhYjpxdWVyeVwiLCBlLmdldE1lc3NhZ2UoKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYWRpY2lvbmFySm9pbigpIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdGlmICh0aGlzLmNvbDEgIT0gbnVsbCAmJiB0aGlzLmNvbDIgIT0gbnVsbCkge1xyXG5cdFx0XHRcdC8vIFRPRE86IEZhbHRhIHZhbGlkYXIgZWwgdGlwb1xyXG5cdFx0XHRcdGxldCBudWV2byA9IG5ldyBKb2luRnJvbU1vZGVsKCk7XHJcblx0XHRcdFx0bnVldm8uY29sdW1uYTEgPSAodGhpcy5jb2wxKTtcclxuXHRcdFx0XHRudWV2by5jb2x1bW5hMiA9ICh0aGlzLmNvbDIpO1xyXG5cdFx0XHRcdHRoaXMuam9pbnNGcm9tLnB1c2gobnVldm8pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMubm90aWZpY2F0aW9uQnVzU2VydmljZS5zaG93V2FybmluZyhcIkRlYmUgc2VsZWNjaW9uYXIgZG9zIGNhbXBvc1wiKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGUpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIGVsaW1pbmFySm9pbihhZSkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Ly9sZXQgIGpvaW4gPSAoSm9pbkZyb20pICgoVUlQYXJhbWV0ZXIpIGFlLmdldENvbXBvbmVudCgpLmZpbmRDb21wb25lbnQoXCJqb2luXCIpKS5nZXRWYWx1ZSgpO1xyXG5cdFx0XHR0aGlzLmpvaW5zRnJvbS5maWx0ZXIoKGRhdGEpID0+IGRhdGEgPT09IGFlLmRhdGEpO1xyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGUpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIGVsaW1pbmFyVGFibGEoYWUpIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdC8vVGFibGFGcm9tIHRhYmxhID0gKFRhYmxhRnJvbSkgKChVSVBhcmFtZXRlcikgYWUuZ2V0Q29tcG9uZW50KCkuZmluZENvbXBvbmVudChcInRhYmxhXCIpKS5nZXRWYWx1ZSgpO1xyXG5cdFx0XHR0aGlzLnRhYmxhc0Zyb20uZmlsdGVyKChkYXRhKSA9PiBkYXRhID09PSBhZSk7XHJcblx0XHRcdHRoaXMubm90aWZpY2F0aW9uQnVzU2VydmljZS5zaG93V2FybmluZyhcIkZhbHRhIGVsaW1pbmFyIGxhcyBjb2x1bW5hcyBkZSBsYSB0YWJsYSA/Pz9cIik7XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgYnVzY2FyVGFibGEoKSB7XHJcblx0XHR0aGlzLnBvcHVwVGFibGFzRnVlbnRlVUkuYnVzY2FyVGFibGEoXCJmdWVudGVVSS50YWJsYVNlbGVjY2lvbmFkYVwiKTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBzZXRUYWJsYVNlbGVjY2lvbmFkYSh0YWJsYVNlbGVjY2lvbmFkYTogc3RyaW5nKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRsZXQgdGFibGFzID0gW107XHJcblx0XHRcdGZvciAobGV0IHRhYmxhIG9mIHRoaXMudGFibGFzRnJvbSkge1xyXG5cdFx0XHRcdGlmICghdGFibGFzLmluY2x1ZGVzKHRhYmxhLnRhYmxhKSkge1xyXG5cdFx0XHRcdFx0dGFibGFzLnB1c2godGFibGEudGFibGEpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmNhcmdhclRhYmxhRW5MaXN0YSh0YWJsYVNlbGVjY2lvbmFkYSk7XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGNhcmdhclRhYmxhRW5MaXN0YSh0YWJsYTogc3RyaW5nKSB7XHJcblx0XHRsZXQgcGFyID0gdGFibGEuc3BsaXQoXCJfXCIpO1xyXG5cdFx0bGV0IGFsaWFzID0gcGFyWzBdO1xyXG5cdFx0bGV0IGkgPSAxO1xyXG5cdFx0bGV0IHRhYmxhVGVtcCA9IG5ldyBUYWJsYUZyb21Nb2RlbCgpXHJcblx0XHR0YWJsYVRlbXAuYWxpYXMgPSBhbGlhcztcclxuXHRcdHdoaWxlICh0aGlzLnRhYmxhc0Zyb20uaW5jbHVkZXModGFibGFUZW1wKSkge1xyXG5cdFx0XHRhbGlhcyA9IHRhYmxhICsgKGkrKyk7XHJcblx0XHR9XHJcblx0XHRsZXQgdGVtID0gbmV3IFRhYmxhRnJvbU1vZGVsKCk7XHJcblx0XHR0ZW0udGFibGEgPSB0YWJsYTtcclxuXHRcdHRlbS5hbGlhcyA9IGFsaWFzO1xyXG5cdFx0dGhpcy50YWJsYXNGcm9tLnB1c2godGVtKTtcclxuXHRcdHJldHVybiBhbGlhcztcclxuXHR9XHJcblxyXG5cclxuXHJcblx0cHVibGljIGNhbWJpb0pvaW4oY2UpIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdHRoaXMubGlzdGFKb2luID0gW107XHJcblx0XHRcdGxldCBudWV2byA9IGNlLnZhbHVlO1xyXG5cdFx0XHRpZiAobnVldm8gIT0gbnVsbCkge1xyXG5cdFx0XHRcdC8vUmVwb3J0ZUNvbHVtbmFEVE8gXHJcblx0XHRcdFx0bGV0IGFjdDogUmVwb3J0ZUNvbHVtbmFNb2RlbCA9IG51bGw7XHJcblx0XHRcdFx0Zm9yIChsZXQgY29sIG9mIHRoaXMuY29sdW1uYXMpIHtcclxuXHRcdFx0XHRcdGlmIChudWV2by5lcXVhbHMoY29sLnJlcG9ydGVGdWVudGUgKyBcIi5cIiArIGNvbC5ub21icmUpKSB7XHJcblx0XHRcdFx0XHRcdGFjdCA9IGNvbDtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGZvciAobGV0IGNvbCBvZiB0aGlzLmNvbHVtbmFzKSB7XHJcblx0XHRcdFx0XHRpZiAoIWNvbC5yZXBvcnRlRnVlbnRlLnN0YXJ0c1dpdGgoYWN0LnJlcG9ydGVGdWVudGUpICYmIGNvbC50aXBvRGF0byA9PSAoYWN0LnRpcG9EYXRvKSAmJiBjb2wub3JkZW4gPT0gKGFjdC5vcmRlbikpIHtcclxuXHRcdFx0XHRcdFx0bGV0IHZhbCA9IGNvbC5yZXBvcnRlRnVlbnRlICsgXCIuXCIgKyBjb2wubm9tYnJlO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmxpc3RhSm9pbi5wdXNoKHsgdmFsdWU6IHZhbCwga2V5OiB2YWwgfSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZWRpdGFyQ2FtcG8oZXZlbnRvKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRsZXQgY29sOiBDb2x1bW5hRnVlbnRlTW9kZWwgPSBldmVudG8uZGF0YTtcclxuXHRcdFx0dGhpcy5jYW1wb0Zvcm11bGEgPSBjb2w7XHJcblx0XHRcdGxldCB2YXJzID0gW107XHJcblx0XHRcdGZvciAobGV0IGNhbXBvIG9mIHRoaXMuY2FtcG9zKSB7XHJcblx0XHRcdFx0bGV0IHZhcjE6IGFueTtcclxuXHRcdFx0XHR2YXIxLm5vbWJyZSA9IChjYW1wby5ub21icmUpO1xyXG5cdFx0XHRcdHZhcjEudGlwbyA9IChjYW1wby50aXBvRGF0byk7XHJcblx0XHRcdFx0dmFycy5wdXNoKHZhcjEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vZ2V0QmVhbihFZGl0b3JGb3JtdWxhVUkuY2xhc3MpLmVkaXRhcihjb2wuZ2V0U2ludGF4aXMoKSwgXCJmdWVudGVVSS5mb3JtdWxhXCIsIHZhcnMpO1xyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGUpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIGVkaXRhcldoZXJlKCkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0bGV0IHZhcnMgPSBbXTtcclxuXHRcdFx0Zm9yIChsZXQgY29sIG9mIHRoaXMuY29sdW1uYXMpIHtcclxuXHRcdFx0XHQvL1ZhcmlhYmxlRm9ybXVsYSBcclxuXHRcdFx0XHRsZXQgdmFyMTtcclxuXHRcdFx0XHR2YXIxLm5vbWJyZSA9IChjb2wucmVwb3J0ZUZ1ZW50ZSArIFwiLlwiICsgY29sLm5vbWJyZSk7XHJcblx0XHRcdFx0dmFyMS50aXBvKGNvbC50aXBvRGF0byk7XHJcblx0XHRcdFx0dmFycy5wdXNoKHZhcjEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vZ2V0QmVhbihFZGl0b3JGb3JtdWxhVUkuY2xhc3MpLmVkaXRhcihmdWVudGUuZ2V0V2hlcmVBZGljaW9uYWwoKSwgXCJmdWVudGVVSS5mdWVudGUud2hlcmVBZGljaW9uYWxcIiwgdmFycyk7XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgc2V0Rm9ybXVsYShmb3JtdWxhKSB7XHJcblx0XHRpZiAodGhpcy5jYW1wb0Zvcm11bGEgIT0gbnVsbCkge1xyXG5cdFx0XHR0aGlzLmNhbXBvRm9ybXVsYS5zaW50YXhpcyA9IChmb3JtdWxhKTtcclxuXHRcdH1cclxuXHRcdHRoaXMuY2FtcG9Gb3JtdWxhID0gbnVsbDtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBhZGljaW9uYXJDb2x1bW5hcygpIHtcclxuXHRcdGZvciAobGV0IGNvbCBvZiB0aGlzLmNhbXBvc1NlbGVjY2lvbmFyKSB7XHJcblx0XHRcdGNvbC5zZWxlY2Npb25hZG8gPSAoZmFsc2UpO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5tb3N0cmFyU2VsZWNjaW9uYXIgPSB0cnVlO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGFncmVnYXJTZWxlY2Npb25hZG9zKCkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Zm9yIChsZXQgY29sIG9mIHRoaXMuY2FtcG9zU2VsZWNjaW9uYXIpIHtcclxuXHRcdFx0XHRpZiAoY29sLnNlbGVjY2lvbmFkbykge1xyXG5cdFx0XHRcdFx0Ly9Db2x1bW5hRnVlbnRlRFRPIFxyXG5cdFx0XHRcdFx0bGV0IGNhbXBvID0gbmV3IENvbHVtbmFGdWVudGVNb2RlbCgpO1xyXG5cdFx0XHRcdFx0Y2FtcG8uZnVlbnRlRGF0byA9ICh0aGlzLmZ1ZW50ZS5sbGF2ZSk7XHJcblx0XHRcdFx0XHRjYW1wby5ub21icmUgPSAoY29sLmNvbHVtbmEubm9tYnJlKTtcclxuXHRcdFx0XHRcdGNhbXBvLnNpbnRheGlzID0gKGNvbC5jb2x1bW5hLm5vbWJyZSk7XHJcblx0XHRcdFx0XHR0aGlzLmNhbXBvcy5wdXNoKGNhbXBvKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5vY3VsdGFyU2VsZWNjaW9uYXIoKTtcclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHB1YmxpYyBvY3VsdGFyU2VsZWNjaW9uYXIoKSB7XHJcblx0XHR0aGlzLm1vc3RyYXJTZWxlY2Npb25hciA9IGZhbHNlO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGFzeW5jIHZlckRldGFsbGUoZXZlbnRvKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHR0aGlzLnZpc3RhVmlzdWFsaXphciA9ICdtYW50ZW5pbWllbnRvJztcclxuXHRcdFx0bGV0IGZ1ZW50ZURhdG9EVE8gPSBldmVudG87XHJcblx0XHRcdHRoaXMuZnVlbnRlID0gbmV3IEZ1ZW50ZURhdG9Nb2RlbCgpO1xyXG5cdFx0XHR0aGlzLmZ1ZW50ZS5sbGF2ZSA9IChmdWVudGVEYXRvRFRPLmxsYXZlKTtcclxuXHRcdFx0dGhpcy5mdWVudGUgPSBhd2FpdCB0aGlzLnJlcG9ydGVzU3ZjLmNvbnN1bHRhclVuaWNhRnVlbnRlRGF0byh0aGlzLmZ1ZW50ZSkudG9Qcm9taXNlKCk7XHJcblx0XHRcdGlmICh0aGlzLmZ1ZW50ZS5xdWVyeTIgIT0gbnVsbCkge1xyXG5cdFx0XHRcdHRoaXMucXVlcnkgPSB0aGlzLmZ1ZW50ZS5xdWVyeSArIHRoaXMuZnVlbnRlLnF1ZXJ5MjtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnF1ZXJ5ID0gdGhpcy5mdWVudGUucXVlcnk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly9Db2x1bW5hRnVlbnRlRFRPIFxyXG5cdFx0XHRsZXQgY29sID0gbmV3IENvbHVtbmFGdWVudGVNb2RlbCgpO1xyXG5cdFx0XHRjb2wuZnVlbnRlRGF0byA9ICh0aGlzLmZ1ZW50ZS5sbGF2ZSk7XHJcblx0XHRcdHRoaXMuY2FtcG9zID0gYXdhaXQgdGhpcy5yZXBvcnRlc1N2Yy5jb25zdWx0YXJDb2x1bW5hc0Z1ZW50ZShjb2wpLnRvUHJvbWlzZSgpO1xyXG5cdFx0XHR0aGlzLmFjdHVhbCA9IDA7XHJcblx0XHRcdHRoaXMubWVudVNlcnZpY2Uuc2V0QnJlYWRjcnVtYihbeyBsYWJlbDogJ0Z1ZW50ZSBSZXBvcnRlJywgfSwge2xhYmVsOiAnTWFudGVuaW1pZW50byBGdWVudGUnfV0pO1xyXG5cdFx0XHR0aGlzLmNhcmdhc09wY2lvbmVzKCk7XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgbnVldm8oKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHR0aGlzLnZpc3RhVmlzdWFsaXphciA9ICdtYW50ZW5pbWllbnRvJztcclxuXHRcdFx0dGhpcy5mdWVudGUgPSBuZXcgRnVlbnRlRGF0b01vZGVsKCk7XHJcblx0XHRcdHRoaXMuZnVlbnRlLm9yaWdlbiA9IChcIkZcIik7XHJcblx0XHRcdHRoaXMuY2FtcG9zID0gbnVsbDtcclxuXHRcdFx0dGhpcy5xdWVyeSA9IG51bGw7XHJcblx0XHRcdHRoaXMudGFiUHJpbmNpcGFsID0gMDtcclxuXHRcdFx0dGhpcy5hY3R1YWwgPSAwO1xyXG5cdFx0XHR0aGlzLm1lbnVTZXJ2aWNlLnNldEJyZWFkY3J1bWIoW3sgbGFiZWw6ICdGdWVudGUgUmVwb3J0ZScsIH0sIHtsYWJlbDogJ01hbnRlbmltaWVudG8gRnVlbnRlJ31dKTtcclxuXHRcdFx0dGhpcy5jYXJnYXNPcGNpb25lcygpO1xyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGUpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Y2FyZ2FzT3BjaW9uZXMoKXtcclxuXHRcdHRoaXMubWVudT0gW3tsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2xpbmtfZWxpbWluYXInKSwgaWNvbjogJ2dseXBoaWNvbnMgZ2x5cGhpY29ucy1iaW4nLCB2aXNpYmxlOiB0aGlzLmZ1ZW50ZS5sbGF2ZSAhPSBudWxsLCBjb21tYW5kOiAoZXZlbnQpID0+IHt0aGlzLmVsaW1pbmFyKCl9fSxcclxuXHRcdHtsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2xpbmtfdmFsaWRhcicpLCBpY29uOiAnZ2x5cGhpY29ucyBnbHlwaGljb25zLXByaW50JywgY29tbWFuZDogKGV2ZW50KSA9PiB7dGhpcy52YWxpZGFyUXVlcnkoKX19LFxyXG5cdFx0e2xhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbGlua19nZW5lcmFyJyksIGljb246ICdnbHlwaGljb25zIGdseXBoaWNvbnMtYmVsbCcsdmlzaWJsZTogdGhpcy5mdWVudGUubGxhdmUgIT0gbnVsbCwgY29tbWFuZDogKGV2ZW50KSA9PiB7dGhpcy5jb25zdHJ1aXJDb2x1bW5hcygpfX0sXHJcblx0XHRdXHJcblx0fVxyXG5cclxuXHRyZWdyZXNhcigpe1xyXG5cdFx0dGhpcy52aXN0YVZpc3VhbGl6YXIgPSBudWxsO1xyXG5cdFx0dGhpcy5uZ09uSW5pdCgpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSB2YWxpZGFyKCk6IGJvb2xlYW4ge1xyXG5cdFx0bGV0IHJlcyA9IHRydWU7XHJcblx0XHRyZXMgPSByZXMgJiYgdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhckNhbXBvT2JsaWdhdG9yaW8odGhpcy5mdWVudGUuZGVzY3JpcGNpb24pO1xyXG5cdFx0cmVzID0gcmVzICYmICh0aGlzLnV0aWxzU2VydmljZS52YWxpZGFyVGV4dG9TUUwodGhpcy5xdWVyeSwgdHJ1ZSwgdHJ1ZSwgODAwMCwgdHJ1ZSkgPT0gbnVsbCk7XHJcblx0XHRyZXR1cm4gcmVzO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVnaXN0cmEvYWN0dWFsaXphIGxhIGluZm9ybWFjaW9uIGdlbmVyYWwgZGUgbGEgZnVlbnRlIGRlIGRhdG9zXHJcblx0ICovXHJcblx0cHVibGljIGFzeW5jIGd1YXJkYXIoKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHRpZiAodGhpcy52YWxpZGFyKCkpIHtcclxuXHRcdFx0XHRpZiAodGhpcy5xdWVyeS5sZW5ndGggPiA0MDAwKSB7XHJcblx0XHRcdFx0XHR0aGlzLmZ1ZW50ZS5xdWVyeSA9ICh0aGlzLnF1ZXJ5LnN1YnN0cmluZygwLCAzOTk5KSk7XHJcblx0XHRcdFx0XHR0aGlzLmZ1ZW50ZS5xdWVyeTIgPSAodGhpcy5xdWVyeS5zdWJzdHJpbmcoMzk5OSwgdGhpcy5xdWVyeS5sZW5ndGgpKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dGhpcy5mdWVudGUucXVlcnkgPSAodGhpcy5xdWVyeSk7XHJcblx0XHRcdFx0XHR0aGlzLmZ1ZW50ZS5xdWVyeTIgPSAobnVsbCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5mdWVudGUubGxhdmUgPT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0dGhpcy5mdWVudGUubGxhdmUgPSAodGhpcy51dGlsc1NlcnZpY2UuZ2VuZXJhckxsYXZlKCkpO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5yZXBvcnRlc1N2Yy5pbnNlcnRhckZ1ZW50ZURhdG8odGhpcy5mdWVudGUpLnRvUHJvbWlzZSgpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnJlcG9ydGVzU3ZjLmFjdHVhbGl6YXJGdWVudGVEYXRvKHRoaXMuZnVlbnRlKS50b1Byb21pc2UoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGhpcy5ub3RpZmljYXRpb25CdXNTZXJ2aWNlLnNob3dJbmZvKFwiTG9zIGNhbWJpb3MgaGFuIHNpZG8gZ3VhcmRhZG9zXCIpO1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XHJcblx0XHR9XHJcblx0fS8vZ3VhcmRhclxyXG5cclxuXHQvKipcclxuXHQgKiBSZWdpc3RyYS9hY3R1YWxpemEgbGFzIGNvbHVtbmFzIGdlbmVyYWRvcyBwYXJhIGxhIGZ1ZW50ZSBkZSBkYXRvcyBjb21vIHJlZ2lzdHJvcyBkZSB0aXBvICdDb2x1bW5hRnVlbnRlJ1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBhc3luYyBndWFyZGFyQ2FtcG9zKCkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0aWYgKHRoaXMuZnVlbnRlLmxsYXZlID09IG51bGwpIHtcclxuXHRcdFx0XHR0aGlzLm5vdGlmaWNhdGlvbkJ1c1NlcnZpY2Uuc2hvd0luZm8oXCJQb3IgZmF2b3IgZGlsaWdlbmNpZSBwcmltZXJvIGxvcyBkYXRvcyBkZSBsYSBmdWVudGVcIik7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLnZhbGlkYXJDYW1wb3MoKSkge1xyXG5cdFx0XHRcdGF3YWl0IHRoaXMucmVwb3J0ZXNTdmMuYWN0dWFsaXphckNvbHVtbmFzRnVlbnRlKHRoaXMuZnVlbnRlLCB0aGlzLmNhbXBvcykudG9Qcm9taXNlKCk7XHJcblx0XHRcdFx0dGhpcy5ub3RpZmljYXRpb25CdXNTZXJ2aWNlLnNob3dJbmZvKFwiU2UgaGFuIGd1YXJkYWRvIGxvcyBjYW1wb3NcIik7XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcihlKTtcclxuXHRcdH1cclxuXHR9Ly9ndWFyZGFyQ2FtcG9zXHJcblxyXG5cdC8qKlxyXG5cdCAqIFZlcmlmaWNhIHF1ZSBsb3MgdmFsb3JlcyBhc29jaWFkb3MgYSBsb3MgY2FtcG9zIHBhcmEgbGEgY3JlYWNpb24gZGUgbGFzIGNvbHVtbmFzIGRlIGxhIGZ1ZW50ZSBzZWFuIHbDoWxpZG9zXHJcblx0ICogQHJldHVybiBmYWxzZSBlbiBjYXNvIGRlIHF1ZSBsb3MgdmFsb3JlcyBhc2lnbmFkb3MgYSBsb3MgY2FtcG9zIHNlYW4gbnVsb3MgbyBubyBzZWFuIHBhbGFicmFzIHbDoWxpZGFzIGRlIGFjdWVyZG8gXHJcblx0ICogY29uIGxhcyBjb25kaWNpb25lcyBkYWRhcyBwb3IgVmFsaWRhZG9yVXRpbC52YWxpZGFyUGFsYWJyYSgpKSxcclxuXHQgKiBlbiBjYXNvIGNvbnRyYXJpbyByZXRvcm5hIHRydWVcclxuXHQgKi9cclxuXHRwcml2YXRlIHZhbGlkYXJDYW1wb3MoKSB7XHJcblx0XHRmb3IgKGxldCBjb2wgb2YgdGhpcy5jYW1wb3MpIHtcclxuXHRcdFx0aWYgKGNvbC5ub21icmUgPT0gbnVsbCB8fCAhdGhpcy51dGlsc1NlcnZpY2UudmFsaWRhclBhbGFicmEoY29sLm5vbWJyZSkpIHtcclxuXHRcdFx0XHR0aGlzLm5vdGlmaWNhdGlvbkJ1c1NlcnZpY2Uuc2hvd0luZm8oXCJOb21icmUgbm8gdmFsaWRvIChcIiArIGNvbC5ub21icmUgKyBcIilcIik7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1eWUgbGFzIGNvbHVtbmFzIGRlIGxhIGZ1ZW50ZSBkZSBkYXRvcywgY29uIGJhc2UgZW4gbG9zIGNhbXBvcyBvYnRlbmlkb3MgXHJcblx0ICogZGUgbGEgY29uc3VsdGEgU1FMIGFzb2NpYWRhXHJcblx0ICovXHJcblx0cHVibGljIGFzeW5jIGNvbnN0cnVpckNvbHVtbmFzKCkge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0dGhpcy5jYW1wb3MgPSBhd2FpdCB0aGlzLnJlcG9ydGVzU3ZjLmdldENvbHVtbmFzU3FsKHRoaXMucXVlcnkpLnRvUHJvbWlzZSgpO1xyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKGUpO1xyXG5cdFx0fVxyXG5cdH0vL2NvbnN0cnVpckNvbHVtbmFzXHJcblxyXG5cclxuXHJcblx0cHJpdmF0ZSB2YWxpZGFyV2l6YXJkKCkge1xyXG5cdFx0bGV0IGFsaWFzOiBzdHJpbmdbXSA9IFtdO1xyXG5cdFx0Zm9yIChsZXQgdGFibGEgb2YgdGhpcy50YWJsYXNGcm9tKSB7XHJcblx0XHRcdGlmIChhbGlhcy5pbmNsdWRlcyh0YWJsYS5hbGlhcykpIHtcclxuXHRcdFx0XHR0aGlzLm5vdGlmaWNhdGlvbkJ1c1NlcnZpY2Uuc2hvd0luZm8oXCJObyBzZSBwdWVkZSByZXBldGlyIGVsIGFsaWFzIGRlIGxhcyB0YWJsYXMuXCIpO1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRhbGlhcy5wdXNoKHRhYmxhLmFsaWFzKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0YWxpYXMgPSBbXTtcclxuXHRcdGZvciAobGV0IGNvbCBvZiB0aGlzLmNhbXBvc1NlbGVjY2lvbmFyKSB7XHJcblx0XHRcdGlmIChjb2wuc2VsZWNjaW9uYWRvKSB7XHJcblx0XHRcdFx0aWYgKGFsaWFzLmluY2x1ZGVzKGNvbC5hbGlhcykpIHtcclxuXHRcdFx0XHRcdHRoaXMubm90aWZpY2F0aW9uQnVzU2VydmljZS5zaG93SW5mbyhcIk5vIHNlIHB1ZWRlIHJlcGV0aXIgZWwgYWxpYXMgZGUgbGFzIGNvbHVtbmFzLlwiKTtcclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0YWxpYXMucHVzaChjb2wuYWxpYXMpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0cnVlO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBnZW5lcmFyU3FsRnJvbSgpIHtcclxuXHRcdGxldCByZXMgPSBcIlwiO1xyXG5cdFx0bGV0IGkgPSAwO1xyXG5cdFx0Zm9yIChsZXQgdGFibGEgb2YgdGhpcy50YWJsYXNGcm9tKSB7XHJcblx0XHRcdHJlcyArPSAoaSA9PSAwID8gXCJcIiA6IFwiLFwiKSArIHRhYmxhLnRhYmxhICsgXCIgXCIgKyB0YWJsYS5hbGlhcztcclxuXHRcdFx0aSsrO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlcztcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZ2VuZXJhclNxbEpvaW4oKSB7XHJcblx0XHRsZXQgcmVzID0gXCJcIjtcclxuXHRcdGxldCBpID0gMDtcclxuXHRcdGZvciAobGV0IGpvaW4gb2YgdGhpcy5qb2luc0Zyb20pIHtcclxuXHRcdFx0cmVzICs9IChpID09IDAgPyBcIlwiIDogXCIgQU5EIFwiKSArIGpvaW4uY29sdW1uYTEgKyBcIiA9IFwiICsgam9pbi5jb2x1bW5hMjtcclxuXHRcdFx0aSsrO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlcztcclxuXHR9XHJcblxyXG5cdC8vSU1QTEVNRU5UQUNJT04gU1RFUEVSXHJcblx0aW5pdFN0ZXAoKXtcclxuXHRcdHRoaXMubWFwYU1lbnNhamVzLnNldCgwLCdTZWxlY2Npb25lIGxhcyB0YWJsYXMgbyB2aXN0YXMgZGUgZG9uZGUgZGVzZWEgb2J0ZW5lciBsYSBpbmZvcm1hY2lvbi4nKVxyXG5cdFx0dGhpcy5tYXBhTWVuc2FqZXMuc2V0KDEsJ0luZGlxdWUgZGUgcXVlIG1hbmVyYSBzZSByZWxhY2Npb25hbiBsb3Mgb2JqZXRvcyBlbnRyZSBzaS4nKVxyXG5cdFx0dGhpcy5tYXBhTWVuc2FqZXMuc2V0KDIsJ0luZGlxdWUgbG9zIGZpbHRyb3MgYWRpY2lvbmFsZXMgcXVlIGRlc2VlIHJlYWxpemFyIHNvYnJlIGxhIGluZm9ybWFjaW9uLicpXHJcblx0XHR0aGlzLm1hcGFNZW5zYWplcy5zZXQoMywnQ2FtcG9zJylcclxuXHRcdHRoaXMuaXRlbXMgPSBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnZnJvbScpLFxyXG4gICAgICAgICAgICAgICAgcm91dGVyTGluazogJ3BlcnNvbmFsJyxcclxuXHRcdFx0XHR0aXRsZTonU2VsZWNjaW9uZSBsYXMgdGFibGFzIG8gdmlzdGFzIGRlIGRvbmRlIGRlc2VhIG9idGVuZXIgbGEgaW5mb3JtYWNpb24uJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2pvaW4nKSxcclxuXHRcdFx0XHRyb3V0ZXJMaW5rOiAncGVyc29uYWwnLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdJbmRpcXVlIGRlIHF1ZSBtYW5lcmEgc2UgcmVsYWNjaW9uYW4gbG9zIG9iamV0b3MgZW50cmUgc2kuJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3doZXJlJyksXHJcblx0XHRcdFx0cm91dGVyTGluazogJ3BlcnNvbmFsJyxcclxuICAgICAgICAgICAgICAgIHRpdGxlOiAnSW5kaXF1ZSBsb3MgZmlsdHJvcyBhZGljaW9uYWxlcyBxdWUgZGVzZWUgcmVhbGl6YXIgc29icmUgbGEgaW5mb3JtYWNpb24uJ1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2NhbXBvcycpLFxyXG4gICAgICAgICAgICAgICAgcm91dGVyTGluazogJ2NvbmZpcm1hdGlvbicsXHJcblx0XHRcdFx0XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdO1xyXG5cdH1cclxuXHJcblx0YWN0dWFsaXphclNlbGVjY2lvbihib29sZWFub2dlbmVyYWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuXHRcdHRoaXMuY2FtcG9zU2VsZWNjaW9uYXIuZm9yRWFjaCgoZWxlbWVudG8pID0+IHtcclxuXHRcdFx0ZWxlbWVudG8uc2VsZWNjaW9uYWRvID0gYm9vbGVhbm9nZW5lcmFsO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHR0b2Rvc1NlbGVjY2lvbmFkb3MoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5jYW1wb3NTZWxlY2Npb25hci5ldmVyeShlbGVtZW50byA9PiBlbGVtZW50by5zZWxlY2Npb25hZG8pO1xyXG5cdH1cclxuXHJcblxyXG59XHJcbiIsIkBpZih2aXN0YVZpc3VhbGl6YXIgPT0gbnVsbCl7XHJcbiAgICA8aDE+e3snZnVlbnRlJyB8IHRyYW5zbGF0ZX19IHt7J3JlcG9ydGUnfCB0cmFuc2xhdGV9fTwvaDE+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiPlxyXG4gICAgICAgIDxhcHAtZmlsdHJvLWdlbmVyYWwgW2ZpbHRyb3NdPVwiZmlsdGVyc1wiIFtkYXRhdGFibGVdPVwidGFibGFHZW5lcmFsXCI+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZm9ybT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWZsb2F0LWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IGF1dG9mb2N1cyB0eXBlPVwidGV4dFwiIGlkPVwiZGVzY3JpcGNpb25cIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwY2lvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZGVzY3JpcGNpb25cIj57eydmaWx0cm8nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvYXBwLWZpbHRyby1nZW5lcmFsPlxyXG4gICAgICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cInt7J2xpbmtfbnVldm8nIHwgdHJhbnNsYXRlfX1cIiAoY2xpY2spPVwibnVldm8oKVwiIGljb249XCJwaSBwaS1wbHVzXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJwLXJpcHBsZSBwLWVsZW1lbnQgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24tc2Vjb25kYXJ5IG1iLTJcIj48L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGFwcC10YWJsYS1nZW5lcmFsICN0YWJsYUdlbmVyYWwgW2NvbHVtbnNdPVwiY29sdW1uc1wiIFt2YWx1ZV09XCJwYWdpbmFkb3JcIiBbcm93c109XCJwYWdpbmF0b3Iucm93c1wiXHJcbiAgICAgICAgW3RvdGFsUmVjb3Jkc109XCJwYWdpbmF0b3IudG90YWxSZWNvcmRzXCIgKG9uTG9hZCk9XCJsb2FkKCRldmVudClcIiAob25Sb3dTZWxlY3QpPVwidmVyRGV0YWxsZSgkZXZlbnQpXCJcclxuICAgICAgICBbbG9hZGluZ109XCJsb2FkaW5nXCI+PC9hcHAtdGFibGEtZ2VuZXJhbD5cclxufVxyXG5AaWYodmlzdGFWaXN1YWxpemFyICE9IG51bGwpe1xyXG4gICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIj5cclxuICAgICAgICA8aDE+e3snZnVlbnRlJyB8IHRyYW5zbGF0ZX19IHt7J3JlcG9ydGUnfCB0cmFuc2xhdGV9fTwvaDE+XHJcbiAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgKGNsaWNrKT1cInJlZ3Jlc2FyKClcIiBsYWJlbD1cIlJlZ3Jlc2FyXCJcclxuICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tbGVmdFwiIGNsYXNzPVwicC1idXR0b24tdGV4dCBmb250LXNlbWlib2xkXCI+PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxwLXRhYlZpZXc+XHJcbiAgICAgICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3sgJ2Z1ZW50ZSd8IHRyYW5zbGF0ZX19XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICA8aDU+PGkgY2xhc3M9XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYm9va1wiPjwvaT57eydkYXRvcyd8IHRyYW5zbGF0ZX19IHt7J2Jhc2ljb3MnfCB0cmFuc2xhdGV9fTwvaDU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtZmx1aWQgcC1mb3JtZ3JpZCBncmlkXCI+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMiBsZzpjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtZmxvYXQtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgYXV0b2ZvY3VzIHR5cGU9XCJ0ZXh0XCIgaWQ9XCJwZXNvXCIgWyhuZ01vZGVsKV09XCJmdWVudGUuZGVzY3JpcGNpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInBlc29cIj57eydub21icmUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBjb2wtMTIgbWQ6Y29sLTEyIGxnOmNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1mbG9hdC1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGxcIiBpZD1cImZsb2F0LWlucHV0XCIgcm93cz1cIjVcIiBjb2xzPVwiMzBcIiBwSW5wdXRUZXh0YXJlYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJxdWVyeVwiIGF1dG9mb2N1c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9SZXNpemVdPVwidHJ1ZVwiPiA8L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgIGZvcj1cImRlc2NyaXBjaW9uXCI+e3snY29uc3VsdGEnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cImdseXBoaWNvbnMgZ2x5cGhpY29ucy1mbG9wcHktc2F2ZVwiIGxhYmVsPVwie3snbGlua19ndWFyZGFyJyB8IHRyYW5zbGF0ZX19XCIgKGNsaWNrKT1cImd1YXJkYXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPHAtc3BsaXRCdXR0b24gY2xhc3M9XCJtbC0yXCIgbGFiZWw9XCJBY2Npb25lcyBFdmFsdWFkb3Jlc1wiIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtbGlzdFwiIFttb2RlbF09XCJtZW51XCI+PC9wLXNwbGl0QnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSBjbGFzcz1cIm1sLTIgcC1idXR0b24gcC1idXR0b24tcmFpc2VkXCIgXHJcbiAgICAgICAgICAgICAgICAgIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtZmxvcHB5LXNhdmVcIiBsYWJlbD1cInt7J2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJndWFyZGFyQ2FtcG9zKClcIj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxwLXRhYmxlICN0YWJsYUdlbmVyYWxFbnRyYWRhIGlkPVwidGFibGFfbGlzdGFfdGlwb19lbnRpZGFkXCIgW3ZhbHVlXT1cImNhbXBvc1wiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIHNjcm9sbERpcmVjdGlvbj1cImJvdGhcIiBzY3JvbGxEaXJlY3Rpb249XCJob3Jpem9udGFsXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIHNjcm9sbERpcmVjdGlvbj1cImhvcml6b250YWxcIlxyXG4gICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zdHJpcGVkXCIgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJmYWxzZVwiIGVkaXRNb2RlPVwicm93XCJcclxuICAgICAgICAgICAgICBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie2ZpcnN0fSBhbCB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc30gcmVnaXN0cm9zXCJcclxuICAgICAgICAgICAgICBbbGF6eV09XCJmYWxzZVwiIGRhdGFLZXk9XCJsbGF2ZVRhYmxhXCI+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDoyNSVcIj57eydub21icmUnIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6MjUlXCI+e3snc2ludGF4aXMnIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6MjUlXCI+e3sndGlwbycgfCB0cmFuc2xhdGV9fSBkZSB7eydkYXRvJyB8IHRyYW5zbGF0ZX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWNhbXBvIGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiIGxldC1yaT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJjYW1wb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOjI1JVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwiY2FtcG8ubm9tYnJlIFwiIGNsYXNzPVwidy1mdWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDoyNSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tjYW1wby50aXBvRGF0b319XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDoyNSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tjYW1wby50aXBvRGF0b319XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eydtZW5zYWpldGFibGF2YWNpYScgfCB0cmFuc2xhdGV9fSBcclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvcC10YWJsZT5cclxuICAgICAgICAgICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwie3sgJ3dpemFyZCd8IHRyYW5zbGF0ZX19XCI+XHJcbiAgICAgICAgICAgICAgICA8cC1zdGVwcyBbbW9kZWxdPVwiaXRlbXNcIiBbcmVhZG9ubHldPVwiZmFsc2VcIiAgW2FjdGl2ZUluZGV4XT1cImFjdHVhbFwiPjwvcC1zdGVwcz5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cC1idXR0b24gKG9uQ2xpY2spPVwiYW50ZXJpb3IoKVwiIFtyb3VuZGVkXT1cInRydWVcIiBpY29uPVwicGkgcGktYW5nbGUtbGVmdFwiIGNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5XCIgcFRvb2x0aXA9XCJBbnRlcmlvclwiICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIiBwbGFjZWhvbGRlcj1cIlRvcFwiIFtkaXNhYmxlZF09XCJhY3R1YWwgPD0gMFwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8cC1idXR0b24gKG9uQ2xpY2spPVwic2lndWllbnRlKClcIiBbcm91bmRlZF09XCJ0cnVlXCIgaWNvbj1cInBpIHBpLWFuZ2xlLXJpZ2h0XCIgY2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnlcIiBwVG9vbHRpcD1cIlNpZ3VpZW50ZVwiICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIiBwbGFjZWhvbGRlcj1cIlRvcFwiLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRJbnN0cnVjY2lvbmVzIG10LTQgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29ub1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1iZWxsXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbmVkb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD57e21hcGFNZW5zYWplcz8uZ2V0KGFjdHVhbCl9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIGxhYmVsPVwie3snbGlua19hbnRlcmlvcicgfCB0cmFuc2xhdGV9fVwiICBpY29uPVwicGkgcGktcGx1c1wiIChjbGljayk9XCJhbnRlcmlvcigpXCIgKm5nSWY9XCJhY3R1YWwgPiAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLXJpcHBsZSBwLWVsZW1lbnQgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24tc2Vjb25kYXJ5IG1iLTJcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIGxhYmVsPVwie3snbGlua19zaWd1aWVudGUnIHwgdHJhbnNsYXRlfX1cIiAgaWNvbj1cInBpIHBpLXBsdXNcIiAoY2xpY2spPVwic2lndWllbnRlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtcmlwcGxlIHAtZWxlbWVudCBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1zZWNvbmRhcnkgbWItMlwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgQGlmKGFjdHVhbCA9PT0gMCl7XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMiBsZzpjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gbGFiZWw9XCJ7eydmdWVudGUnIHwgdHJhbnNsYXRlfX1cIiAgaWNvbj1cInBpIHBpLXBsdXNcIiAoY2xpY2spPVwiYnVzY2FyVGFibGEoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1yaXBwbGUgcC1lbGVtZW50IHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLXNlY29uZGFyeSBtYi0yXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtdGFibGUgI3RhYmxhR2VuZXJhbEVudHJhZGEgaWQ9XCJ0YWJsYV9saXN0YV90aXBvX2VudGlkYWRcIiBbdmFsdWVdPVwidGFibGFzRnJvbVwiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEaXJlY3Rpb249XCJib3RoXCIgc2Nyb2xsRGlyZWN0aW9uPVwiaG9yaXpvbnRhbFwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBzY3JvbGxEaXJlY3Rpb249XCJob3Jpem9udGFsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLXN0cmlwZWRcIiBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIiBlZGl0TW9kZT1cInJvd1wiIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IGFsIHtsYXN0fSBkZSB7dG90YWxSZWNvcmRzfSByZWdpc3Ryb3NcIiBbbGF6eV09XCJ0cnVlXCIgZGF0YUtleT1cImxsYXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDoyNSVcIj57eyd0YWJsYScgfCB0cmFuc2xhdGV9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6MjUlXCI+e3snYWxpYXMnIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjI1JVwiPiA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtdGFibGEgbGV0LWVkaXRpbmc9XCJlZGl0aW5nXCIgbGV0LXJpPVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBbcEVkaXRhYmxlUm93XT1cInRhYmxhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6MjUlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t0YWJsYS50YWJsYX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDoyNSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t0YWJsYS5hbGlhc319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRUxJTUlOQVIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcERlbGV0ZUVkaXRhYmxlUm93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRyYXNoXCIgKGNsaWNrKT1cImVsaW1pbmFyVGFibGEodGFibGEpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtZWxlbWVudCBwLXJpcHBsZSBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLW91dGxpbmVkIG1yLTIgbWItMiBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCI1XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcC10YWJsZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEBpZihhY3R1YWwgPT0gMSl7XHJcblxyXG4gICAgICAgICAgICAgICAgPHAtdGFibGUgI3RhYmxhR2VuZXJhbEVudHJhZGEgaWQ9XCJ0YWJsYV9saXN0YV90aXBvX2VudGlkYWRcIiBbdmFsdWVdPVwiZm9yYW5lYXNcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIHNjcm9sbERpcmVjdGlvbj1cImJvdGhcIiBzY3JvbGxEaXJlY3Rpb249XCJob3Jpem9udGFsXCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiIHNjcm9sbERpcmVjdGlvbj1cImhvcml6b250YWxcIlxyXG4gICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLXN0cmlwZWRcIiBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIiBlZGl0TW9kZT1cInJvd1wiIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7Zmlyc3R9IGFsIHtsYXN0fSBkZSB7dG90YWxSZWNvcmRzfSByZWdpc3Ryb3NcIiBbbGF6eV09XCJ0cnVlXCIgZGF0YUtleT1cImxsYXZlXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDoyNSVcIj57eycnIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDoyNSVcIj57eycnIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDoyNSVcIj57eycnIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtdGFibGEgbGV0LWVkaXRpbmc9XCJlZGl0aW5nXCIgbGV0LXJpPVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJ0YWJsYVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDoyNSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3t0YWJsYS5hbGlhczF9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDoyNSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dGFibGEuYWxpYXMyfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6MjUlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3RhYmxhLmxsYXZlLm5vbWJyZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwicC0zIGZvbnQtbWVkaXVtIGVtcHR5bWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J21lbnNhamV0YWJsYXZhY2lhJyB8IHRyYW5zbGF0ZX19IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3AtdGFibGU+XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEBpZihhY3R1YWwgPT0gMil7XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtdC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aDU+PGkgY2xhc3M9XCJnbHlwaGljb25zIGdseXBoaWNvbnMtYm9va1wiPjwvaT57eydkYXRvcyd8IHRyYW5zbGF0ZX19IHt7J2Jhc2ljb3MnfCB0cmFuc2xhdGV9fTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgY29sLTEyIG1kOmNvbC0xMiBsZzpjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWZsb2F0LWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ3LWZ1bGxcIiBpZD1cImZsb2F0LWlucHV0XCIgcm93cz1cIjVcIiBjb2xzPVwiMzBcIiBwSW5wdXRUZXh0YXJlYVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZnVlbnRlLndoZXJlQWRpY2lvbmFsXCIgYXV0b2ZvY3VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9SZXNpemVdPVwidHJ1ZVwiPiA8L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsICBmb3I9XCJkZXNjcmlwY2lvblwiPnt7J2NvbnN1bHRhJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgY2xhc3M9XCJtbC0yIHAtYnV0dG9uIHAtYnV0dG9uLXJhaXNlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJnbHlwaGljb25zIGdseXBoaWNvbnMtZmxvcHB5LXNhdmVcIiBsYWJlbD1cInt7J2xpbmtfZ3VhcmRhcicgfCB0cmFuc2xhdGV9fVwiIChjbGljayk9XCJlZGl0YXJXaGVyZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgQGlmKGFjdHVhbCA9PSAzKXtcclxuXHJcbiAgICAgICAgICAgICAgICA8cC10YWJsZSBpZD1cInRhYmxhX2xpc3RhX3RpcG9fZW50aWRhZFwiIFt2YWx1ZV09XCJjYW1wb3NTZWxlY2Npb25hclwiIFtzY3JvbGxhYmxlXT1cInRydWVcIiBbdG90YWxSZWNvcmRzXT1cImNhbXBvc1NlbGVjY2lvbmFyLmxlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICBzY3JvbGxEaXJlY3Rpb249XCJib3RoXCIgc2Nyb2xsRGlyZWN0aW9uPVwiaG9yaXpvbnRhbFwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBzY3JvbGxEaXJlY3Rpb249XCJob3Jpem9udGFsXCIgIFtwYWdpbmF0b3JdPVwiY2FtcG9zU2VsZWNjaW9uYXIubGVuZ3RoID4gMTBcIiBbcm93c109XCIxMFwiIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiWzEwLCAyMCwgMzBdXCJcclxuICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zdHJpcGVkXCIgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCIgZWRpdE1vZGU9XCJyb3dcIiBjdXJyZW50UGFnZVJlcG9ydFRlbXBsYXRlPVwie2ZpcnN0fSBhbCB7bGFzdH0gZGUge3RvdGFsUmVjb3Jkc30gcmVnaXN0cm9zXCIgW2xhenldPVwiZmFsc2VcIiBkYXRhS2V5PVwiYWxpYXNcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjI1JVwiIGFsaWduRnJvemVuPVwibGVmdFwiIHBGcm96ZW5Db2x1bW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jaGVja2JveCAgW3N0eWxlXT1cInsnbWFyZ2luLWxlZnQnOiAnMSUnLCdtYXJnaW4tcmlnaHQnOicxJSd9XCIgWyhuZ01vZGVsKV09XCJzZWxlY2Npb25HZW5lcmFsXCIgW2JpbmFyeV09XCJ0cnVlXCIgW25nTW9kZWxdPVwidG9kb3NTZWxlY2Npb25hZG9zKClcIiAobmdNb2RlbENoYW5nZSk9XCJhY3R1YWxpemFyU2VsZWNjaW9uKCRldmVudClcIj48L3AtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjElXCI+e3sndGFibGEnIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOjI1JVwiPnt7J2NvbHVtbmEnIHwgdHJhbnNsYXRlfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtdGFibGE+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDoyNSVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNoZWNrYm94IGNsYXNzPVwibXItMiBcIiBbKG5nTW9kZWwpXT1cInRhYmxhLnNlbGVjY2lvbmFkb1wiIFtiaW5hcnldPVwidHJ1ZVwiIGlucHV0SWQ9XCJiaW5hcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dGFibGEuY29sdW1uYS5yZXBvcnRlRnVlbnRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6MjUlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3RhYmxhLmNvbHVtbmEubm9tYnJlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJwLTMgZm9udC1tZWRpdW0gZW1wdHltZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3snbWVuc2FqZXRhYmxhdmFjaWEnIHwgdHJhbnNsYXRlfX0gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvcC10YWJsZT5cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIDwvcC10YWJQYW5lbD5cclxuICAgICAgICA8L3AtdGFiVmlldz5cclxuICAgICAgICBcclxufVxyXG5cclxuPGFwcC1wb3B1cC10YWJsYXMtZnVlbnRlICNwb3B1cFRhYmxhc0Z1ZW50ZVVJIChhcGxpY2FyRGVzdGlub09jdWx0YXIpPVwic2V0VGFibGFTZWxlY2Npb25hZGEoJGV2ZW50KVwiPjwvYXBwLXBvcHVwLXRhYmxhcy1mdWVudGU+Il19