visorus-erp-core 17.4.0 → 17.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/selecciona-articulo/selecciona-articulo.component.mjs +71 -28
- package/esm2022/lib/httpInterceptor/httpInterceptor.mjs +16 -7
- package/fesm2022/visorus-erp-core.mjs +87 -35
- package/fesm2022/visorus-erp-core.mjs.map +1 -1
- package/lib/components/selecciona-articulo/selecciona-articulo.component.d.ts +16 -10
- package/lib/globalPrimeNg.d.ts +2 -2
- package/lib/httpInterceptor/httpInterceptor.d.ts +3 -1
- package/lib/importComponents.d.ts +2 -2
- package/package.json +1 -1
|
@@ -1,39 +1,38 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
1
|
+
import { Component, ElementRef, EventEmitter, inject, Input, Output, ViewChild } from '@angular/core';
|
|
2
2
|
import { PaginateService } from '../../services/paginate.service';
|
|
3
3
|
import { AlmacenService } from '../almacen/services/almacen.service';
|
|
4
4
|
import { StockService } from './stock.service';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "
|
|
7
|
-
import * as i2 from "
|
|
8
|
-
import * as i3 from "
|
|
9
|
-
import * as i4 from "
|
|
10
|
-
import * as i5 from "primeng/
|
|
11
|
-
import * as i6 from "primeng/
|
|
12
|
-
import * as i7 from "
|
|
13
|
-
import * as i8 from "primeng/
|
|
14
|
-
import * as i9 from "
|
|
15
|
-
import * as i10 from "
|
|
16
|
-
import * as i11 from "
|
|
17
|
-
import * as i12 from "@ngx-translate/core";
|
|
18
|
-
import * as i13 from "../seleccion-articulo-informacion/seleccion-articulo-informacion.component";
|
|
6
|
+
import * as i1 from "primeng/api";
|
|
7
|
+
import * as i2 from "primeng/tooltip";
|
|
8
|
+
import * as i3 from "primeng/table";
|
|
9
|
+
import * as i4 from "primeng/button";
|
|
10
|
+
import * as i5 from "primeng/inputtext";
|
|
11
|
+
import * as i6 from "primeng/paginator";
|
|
12
|
+
import * as i7 from "@angular/forms";
|
|
13
|
+
import * as i8 from "primeng/dialog";
|
|
14
|
+
import * as i9 from "@ngx-translate/core";
|
|
15
|
+
import * as i10 from "../seleccion-articulo-informacion/seleccion-articulo-informacion.component";
|
|
16
|
+
import * as i11 from "@angular/common";
|
|
19
17
|
export class SeleccionaArticuloComponent {
|
|
20
|
-
constructor(
|
|
21
|
-
this._stockService = _stockService;
|
|
22
|
-
this._paginateService = _paginateService;
|
|
23
|
-
this._almacenService = _almacenService;
|
|
18
|
+
constructor() {
|
|
24
19
|
this.manejaUnidadSecundaria = false;
|
|
25
20
|
this.emitFilaSeleccionada = new EventEmitter();
|
|
26
21
|
this.emitShowArticulos = new EventEmitter();
|
|
22
|
+
this._stockService = inject(StockService);
|
|
23
|
+
this._paginateService = inject(PaginateService);
|
|
24
|
+
this._almacenService = inject(AlmacenService);
|
|
27
25
|
this.articulosList = [];
|
|
28
26
|
this.ordenar = [];
|
|
29
27
|
this.busquedaArticulos = {
|
|
30
28
|
tipoBusqueda: ''
|
|
31
29
|
};
|
|
30
|
+
this.cargando = false;
|
|
32
31
|
this.showModal = false;
|
|
33
32
|
this.showModalInformacion = false;
|
|
34
33
|
this.showFirstTime = true;
|
|
35
34
|
this.clasificadorList = [];
|
|
36
|
-
this.
|
|
35
|
+
this.maximizado = false;
|
|
37
36
|
}
|
|
38
37
|
ngOnInit() {
|
|
39
38
|
this.page = this._paginateService.getPage();
|
|
@@ -43,9 +42,39 @@ export class SeleccionaArticuloComponent {
|
|
|
43
42
|
this.showFirstTime = true;
|
|
44
43
|
this._almacenService.getAll(this.configuracion.params).subscribe((data) => {
|
|
45
44
|
this.almacenList = data.data;
|
|
45
|
+
// El valor se reaplica cuando las opciones ya existen en el select
|
|
46
|
+
setTimeout(() => { this.almacenSeleccionado = this.almacenId; });
|
|
46
47
|
});
|
|
47
48
|
this.busquedaArticulos.tipoBusqueda = 'CD';
|
|
48
|
-
|
|
49
|
+
}
|
|
50
|
+
/** Id del almacén del movimiento; acepta tanto id numérico como objeto Almacen. */
|
|
51
|
+
get almacenId() {
|
|
52
|
+
const almacen = this.movimiento ? this.movimiento.almacen : null;
|
|
53
|
+
return (almacen && typeof almacen === 'object') ? almacen.id : almacen;
|
|
54
|
+
}
|
|
55
|
+
/** Número de columnas visibles de la tabla, para el colspan del estado vacío. */
|
|
56
|
+
get totalColumnas() {
|
|
57
|
+
let total = 6; // ubicación, existencia, unidad, código, descripción, detalle
|
|
58
|
+
if (this.manejaUnidadSecundaria) {
|
|
59
|
+
total += 2;
|
|
60
|
+
}
|
|
61
|
+
total += (this.configuracion && this.configuracion.tipoPrecio === 'costo') ? 1 : 5;
|
|
62
|
+
if (this.mostrarExistenciaPorUnidad) {
|
|
63
|
+
total += 1;
|
|
64
|
+
}
|
|
65
|
+
return total + (this.clasificadorList ? this.clasificadorList.length : 0);
|
|
66
|
+
}
|
|
67
|
+
/** La columna "Existencia por Unidad" solo se muestra si algún artículo trae datos. */
|
|
68
|
+
get mostrarExistenciaPorUnidad() {
|
|
69
|
+
return Array.isArray(this.articulosList) &&
|
|
70
|
+
this.articulosList.some((row) => row.existenciaUnidades && row.existenciaUnidades.length > 0);
|
|
71
|
+
}
|
|
72
|
+
/** Altura del cuerpo del diálogo: ocupa el viewport y crece al maximizar. */
|
|
73
|
+
get estiloContenido() {
|
|
74
|
+
const base = { display: 'flex', 'flex-direction': 'column', 'min-height': '0' };
|
|
75
|
+
return this.maximizado
|
|
76
|
+
? { ...base, flex: '1 1 auto' }
|
|
77
|
+
: { ...base, height: 'calc(90vh - 9.5rem)' };
|
|
49
78
|
}
|
|
50
79
|
pagina(e) {
|
|
51
80
|
this.page.rows = e.rows;
|
|
@@ -58,8 +87,19 @@ export class SeleccionaArticuloComponent {
|
|
|
58
87
|
this.obtenerExistenciaArticulos();
|
|
59
88
|
this.showFirstTime = false;
|
|
60
89
|
}
|
|
90
|
+
// El diálogo termina de montar su contenido después del evento onShow
|
|
91
|
+
setTimeout(() => {
|
|
92
|
+
if (this.campoBusqueda) {
|
|
93
|
+
this.campoBusqueda.nativeElement.focus();
|
|
94
|
+
}
|
|
95
|
+
});
|
|
61
96
|
}
|
|
62
97
|
obtenerExistenciaArticulos() {
|
|
98
|
+
if (this.busquedaArticulos.tipoBusqueda && !this.busquedaArticulos.key) {
|
|
99
|
+
// Sin término de búsqueda el backend no regresa resultados
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
this.cargando = true;
|
|
63
103
|
this.busquedaArticulos.params = this._paginateService.getParams(this.page);
|
|
64
104
|
const parametros = {
|
|
65
105
|
almacen: (this.configuracion.noOcupaAlamacen ? null : this.movimiento.almacen),
|
|
@@ -77,8 +117,11 @@ export class SeleccionaArticuloComponent {
|
|
|
77
117
|
if (!this.showModal) {
|
|
78
118
|
this.showModal = true;
|
|
79
119
|
}
|
|
120
|
+
this.cargando = false;
|
|
80
121
|
}).catch(e => {
|
|
81
122
|
this.articulosList = [];
|
|
123
|
+
this.page.total = 0;
|
|
124
|
+
this.cargando = false;
|
|
82
125
|
});
|
|
83
126
|
}
|
|
84
127
|
obtenerExistenciaArticulosVal() {
|
|
@@ -96,9 +139,6 @@ export class SeleccionaArticuloComponent {
|
|
|
96
139
|
emitirShowArticulos() {
|
|
97
140
|
this.emitShowArticulos.emit(0);
|
|
98
141
|
}
|
|
99
|
-
seriesArticulo(series) {
|
|
100
|
-
console.log(series);
|
|
101
|
-
}
|
|
102
142
|
onShowInformacion(eventArticulo) {
|
|
103
143
|
this.articuloSelected = eventArticulo;
|
|
104
144
|
this.showModalInformacion = true;
|
|
@@ -106,13 +146,13 @@ export class SeleccionaArticuloComponent {
|
|
|
106
146
|
onEventInformacion(event) {
|
|
107
147
|
this.showModalInformacion = event.status;
|
|
108
148
|
}
|
|
109
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SeleccionaArticuloComponent, deps: [
|
|
110
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SeleccionaArticuloComponent, selector: "app-selecciona-articulo", inputs: { configuracion: "configuracion", showArticulos: "showArticulos", movimiento: "movimiento", manejaUnidadSecundaria: "manejaUnidadSecundaria" }, outputs: { emitFilaSeleccionada: "emitFilaSeleccionada", emitShowArticulos: "emitShowArticulos" }, ngImport: i0, template: "<!--inicia seleccion de articulos-->\n<!-- (onShow)=\"obtenerExistenciaArticulosShow()\" -->\n<!--\n <div class=\"col-12 col-center\" >-->\n<p-dialog header=\"{{ 'Articulos' | translate }}\" [(visible)]=\"showArticulos\" [maximizable]=\"true\"\n (onShow)=\"obtenerExistenciaArticulosShow()\" (onHide)=\"busquedaArticulos = { tipoBusqueda : ''}; emitirShowArticulos()\"\n [baseZIndex]=\"10000\" [blockScroll]=\"true\" [style]=\"{'width': size+'px', 'min-width': '200px'}\" [minY]=\"70\">\n <div class=\"grid grid-fluid\">\n <div class=\"col-12 md:col-6 lg:col-6\">\n <div style=\"display: flex;\">\n <div style=\"width: 115px;\">\n <select pInputText [(ngModel)]=\"busquedaArticulos.tipoBusqueda\" (change)=\"obtenerExistenciaArticulosVal()\">\n <option value=\"C\">Codigo</option>\n <option value=\"D\">Descripcion</option>\n <option value=\"CD\">Coincidencia</option>\n <option value=\"CI\">Igual a</option>\n </select>\n </div>\n <input type=\"text\" style=\"width: 200px;\" pInputText [(ngModel)]=\"busquedaArticulos.key\"\n (keypress)=\"obtenerExistenciaArticulosKey( $event )\" id=\"key\">\n <button pButton type=\"button\" icon=\"pi pi-search\" styleClass=\"p-button-secondary\"\n (click)=\"obtenerExistenciaArticulos( )\"></button>\n </div>\n </div>\n <div class=\"col-12 md:col-6 lg:col-6\">\n <div style=\"display: flex;\">\n <div style=\"width: 100px;\">\n <label for=\"almacen\">Almacen:</label>\n </div>\n <select pInputText style=\"width: 200px;\" [(ngModel)]=\"movimiento.almacen\" disabled id=\"almacen\"\n (change)=\"obtenerExistenciaArticulosVal()\">\n <option *ngFor=\"let almacen of almacenList\" value=\"{{ almacen.id }}\">{{almacen.descripcion}}</option>\n </select>\n </div>\n\n </div>\n </div>\n\n <!--\n <div id=\"table-wrapper\">\n <div id=\"table-scroll\">-->\n <!-- new table\n <p-table #dt [columns]=\"colsDD\" [value]=\"listDD\" [scrollable]=\"true\" \n [style]=\"{width: '100%'} \" [scrollHeight]=\"maxH + 'px'\" \n [resizableColumns]=\"true\" [(selection)]=\"selectedXML\" (onRowSelect)=\"onRowSelect($event)\" dataKey=\"uuid\">\n\n \n -->\n\n <p-table [value]=\"articulosList\" [scrollable]=\"true\" #dt scrollHeight=\"400px\" responsiveLayout=\"scroll\" \n selectionMode=\"single\" (onRowSelect)=\"filaSeleccionada($event)\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th style=\"width: 80px\" translate>C\u00F3digo Ubicacion</th>\n <th style=\"width: 70px\" translate>Existencia</th>\n <th style=\"width: 40px\" translate>Unidad</th>\n <th style=\"width: 50px\" *ngIf=\"manejaUnidadSecundaria\" translate>existenciaSecundaria</th>\n <th style=\"width: 40px\" *ngIf=\"manejaUnidadSecundaria\" translate>Unidad</th>\n <th style=\"width: 80px\" translate>C\u00F3digo</th>\n <th style=\"width: 120px\" translate>Descripcion</th>\n <th style=\"width: 40px\" translate></th>\n <th style=\"width: 80px\" *ngIf=\"configuracion.tipoPrecio !== 'costo' \" translate>Precio</th>\n <th style=\"width: 80px\" *ngIf=\"configuracion.tipoPrecio !== 'costo' \" translate>Precio 2</th>\n <th style=\"width: 80px\" *ngIf=\"configuracion.tipoPrecio !== 'costo' \" translate>Precio 3</th>\n <th style=\"width: 80px\" *ngIf=\"configuracion.tipoPrecio !== 'costo' \" translate>Precio 4</th>\n <th style=\"width: 80px\" *ngIf=\"configuracion.tipoPrecio !== 'costo' \" translate>Precio 5</th>\n <th style=\"width: 40px\" *ngIf=\"configuracion.tipoPrecio === 'costo' \" translate>Movimiento.costo</th>\n <th style=\"width: 40px\" translate>Existencia por Unidad</th>\n <th *ngFor=\"let item of clasificadorList\" style=\"width: 80px\" translate>{{item.descripcion}}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\">\n <tr [pSelectableRow]=\"rowData\">\n <td style=\"width: 80px;\" *ngIf=\"!rowData.ubicacionCodigo\" translate>Movimiento.NoAsignado</td>\n <td style=\"width: 80px;\" *ngIf=\"rowData.ubicacionCodigo\">{{rowData.ubicacionCodigo}}</td>\n <td style=\"width: 70px;\">{{rowData.existencia}}</td>\n <td style=\"width: 40px;\">{{rowData.unidadCodigo}}</td>\n\n <td style=\"width: 50px;\" *ngIf=\"manejaUnidadSecundaria\">{{rowData.existenciaSecundaria}}</td>\n <td style=\"width: 40px;\" *ngIf=\"manejaUnidadSecundaria\">{{rowData.unidadSecundariaCodigo}}</td>\n\n <td style=\"width: 80px;\">{{rowData.articulo.codigo}}</td>\n <td style=\"width: 120px;\">{{rowData.articulo.descripcion}}</td>\n <td style=\"width: 40px;\">\n <button pButton type=\"button\" icon=\"pi pi-eye\" class=\"ui-button-raised ui-button-primary\"\n (click)=\"onShowInformacion(rowData)\">\n </button>\n </td>\n <td style=\"width: 80px;\" *ngIf=\"configuracion.tipoPrecio !== 'costo'\">{{rowData.precioConImpuestos | currency }}\n </td>\n <td style=\"width: 80px;\" *ngIf=\"configuracion.tipoPrecio !== 'costo'\">{{rowData.precio2ConImpuestos | currency\n }}</td>\n <td style=\"width: 80px;\" *ngIf=\"configuracion.tipoPrecio !== 'costo'\">{{rowData.precio3ConImpuestos | currency\n }}</td>\n <td style=\"width: 80px;\" *ngIf=\"configuracion.tipoPrecio !== 'costo'\">{{rowData.precio4ConImpuestos | currency\n }}</td>\n <td style=\"width: 80px;\" *ngIf=\"configuracion.tipoPrecio !== 'costo'\">{{rowData.precio5ConImpuestos | currency\n }}</td>\n <td style=\"width: 40px;\" *ngIf=\"configuracion.tipoPrecio === 'costo' \">{{rowData.precio | currency }}</td>\n <td style=\"width: 40px;\">\n <div class=\"row justify-content-between\" *ngFor=\"let item of rowData.existenciaUnidades\">\n <div class=\"col-lg-4\"><label for=\"\">{{item.unidad_codigo}}</label></div>\n <div class=\"col-lg-4\"><label for=\"\">{{item.unidad_existencia | number : '1.2-2'}}</label>\n </div>\n </div>\n </td>\n <!-- <td style=\"width: 40px;\"></td> -->\n <td *ngFor=\"let itemData of rowData.articuloClasificadorList\" style=\"width: 80px;\">{{itemData.valor}}</td>\n </tr>\n </ng-template>\n </p-table>\n\n <!-- /new table-->\n <!-- \n <p-table [(value)]=\"articulosList\" responsive=\"true\" \n selectionMode=\"multiple\" (onRowSelect)=\"filaSeleccionada($event)\" [scrollable]=\"true\" scrollHeight=\"350px\" >\n\n <p-column header=\"{{ 'Codigo ubicacion'.toString() | translate}}\">\n <ng-template let-dato=\"rowData\" pTemplate=\"body\">\n <label for=\"\" *ngIf=\"!dato.ubicacionCodigo\" translate> Movimiento.NoAsignado </label>\n <label for=\"\" *ngIf=\"dato.ubicacionCodigo\" > {{ dato.ubicacionCodigo }}</label>\n </ng-template>\n </p-column>\n <p-column field=\"ubicacionCodigo\" header=\"{{ 'Descripcion ubicacion'.toString() | translate}}\">\n <ng-template let-dato=\"rowData\" pTemplate=\"body\">\n <label for=\"\" *ngIf=\"!dato.ubicacionCodigo\" translate> Movimiento.NoAsignado </label>\n <label for=\"\" *ngIf=\"dato.ubicacionCodigo\" > {{ dato.ubicacionCodigo }}</label>\n </ng-template>\n </p-column>\n\n <p-column field=\"existencia\" header=\"{{'Existencia' | translate}}\"></p-column>\n <p-column field=\"unidadCodigo\" header=\"{{'Unidad' | translate}}\"></p-column>\n <p-column field=\"unidadDescripcion\" header=\"{{'Descripcion unidad' | translate}}\"></p-column>\n\n <p-column field=\"existenciaSecundaria\" header=\"{{'existenciaSecundaria' | translate}}\" *ngIf=\"manejaUnidadSecundaria\"></p-column>\n <p-column field=\"unidadSecundariaCodigo\" header=\"{{'Unidad' | translate}}\" *ngIf=\"manejaUnidadSecundaria\"></p-column>\n \n\n <p-column *ngIf=\"configuracion.tipoPrecio !== 'costo' \" header=\"{{'Movimiento.movimientoDetalle.precio' | translate}}\">\n <ng-template let-dato=\"rowData\" pTemplate=\"body\">\n <label for=\"\">{{ dato.precioConImpuestos | currency }}</label>\n </ng-template>\n </p-column>\n <p-column *ngIf=\"configuracion.tipoPrecio === 'costo' \" header=\"{{'Movimiento.costo' | translate }}\">\n <ng-template let-dato=\"rowData\" pTemplate=\"body\">\n <label for=\"\">{{ dato.precio | currency }}</label>\n </ng-template>\n </p-column>\n\n\n <p-column field=\"articulo.codigo\" header=\"{{'Codigo articulo' | translate}}\"></p-column>\n <p-column field=\"articulo.descripcion\" header=\"{{'Descripcion' | translate}}\"></p-column>\n\n\n\n <p-column header=\"{{'ExistenciaPorUnidad' | translate }}\">\n <ng-template let-dato=\"rowData\" pTemplate=\"body\">\n <div class=\"row justify-content-between\" *ngFor=\"let item of dato.existenciaUnidades\" >\n <div class=\"col-lg-4\"><label for=\"\">{{item.unidad_codigo}}</label></div>\n <div class=\"col-lg-4\"><label for=\"\">{{item.unidad_existencia | number : '1.2-2'}}</label>\n </div> \n </div> \n </ng-template>\n </p-column>\n \n </p-table>\n -->\n <p-paginator [rows]=\"page.rows\" [totalRecords]=\"page.total\" [pageLinkSize]=\"5\" (onPageChange)=\"pagina($event)\"\n [rowsPerPageOptions]=\"[10,25,50,100,500]\"></p-paginator>\n <!-- \n </div>\n </div>\n -->\n</p-dialog>\n<!--\n </div> \n -->\n<!--termina seleccion de articulos-->\n<!--selecciona ubicacion -->\n<lib-seleccion-articulo-informacion [showModal]=\"showModalInformacion\" [articulo]=\"articuloSelected\"\n (eventSelection)=\"onEventInformacion($event)\" *ngIf=\"showModalInformacion\">\n</lib-seleccion-articulo-informacion>", styles: ["tr:hover{background-color:#34a835!important;color:#fff!important}table{position:absolute}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i6.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: i6.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i7.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "directive", type: i8.InputText, selector: "[pInputText]" }, { kind: "component", type: i9.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "style", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "appendTo", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "showPageLinks", "locale", "dropdownItemTemplate", "first"], outputs: ["onPageChange"] }, { kind: "directive", type: i10.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i10.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i10.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: i10.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i11.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i12.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i13.SeleccionArticuloInformacionComponent, selector: "lib-seleccion-articulo-informacion", inputs: ["showModal", "articulo"], outputs: ["eventSelection"] }, { kind: "pipe", type: i4.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }] }); }
|
|
149
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SeleccionaArticuloComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
150
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: SeleccionaArticuloComponent, selector: "app-selecciona-articulo", inputs: { configuracion: "configuracion", showArticulos: "showArticulos", movimiento: "movimiento", manejaUnidadSecundaria: "manejaUnidadSecundaria" }, outputs: { emitFilaSeleccionada: "emitFilaSeleccionada", emitShowArticulos: "emitShowArticulos" }, viewQueries: [{ propertyName: "campoBusqueda", first: true, predicate: ["campoBusqueda"], descendants: true }], ngImport: i0, template: "<!--inicia seleccion de articulos-->\n<p-dialog header=\"{{ 'Articulos' | translate }}\" [(visible)]=\"showArticulos\" [maximizable]=\"true\"\n (onShow)=\"obtenerExistenciaArticulosShow()\" (onHide)=\"busquedaArticulos = { tipoBusqueda : ''}; emitirShowArticulos()\"\n (onMaximize)=\"maximizado = $event.maximized\"\n [baseZIndex]=\"10000\" [blockScroll]=\"true\" [style]=\"{ width: '95vw' }\" [minY]=\"70\"\n [contentStyle]=\"estiloContenido\">\n\n <div class=\"sa-cuerpo\">\n\n <div class=\"grid sa-filtros\">\n <div class=\"col-12 md:col-6 xl:col-5\">\n <label class=\"sa-etiqueta\" for=\"sa-tipo-busqueda\">Buscar por</label>\n <div class=\"p-inputgroup\">\n <select pInputText class=\"sa-tipo-busqueda\" id=\"sa-tipo-busqueda\"\n [(ngModel)]=\"busquedaArticulos.tipoBusqueda\" (change)=\"obtenerExistenciaArticulosVal()\">\n <option value=\"C\">C\u00F3digo</option>\n <option value=\"D\">Descripci\u00F3n</option>\n <option value=\"CD\">Coincidencia</option>\n <option value=\"CI\">Igual a</option>\n </select>\n <input pInputText type=\"text\" class=\"sa-campo-busqueda\" id=\"sa-campo-busqueda\" #campoBusqueda\n placeholder=\"T\u00E9rmino de b\u00FAsqueda\" [(ngModel)]=\"busquedaArticulos.key\"\n (keydown.enter)=\"obtenerExistenciaArticulos()\">\n <button pButton type=\"button\" icon=\"pi pi-search\" aria-label=\"Buscar\"\n (click)=\"obtenerExistenciaArticulos()\"></button>\n </div>\n </div>\n <div class=\"col-12 md:col-6 xl:col-5\">\n <label class=\"sa-etiqueta\" for=\"sa-almacen\">Almac\u00E9n</label>\n <select pInputText class=\"sa-almacen\" id=\"sa-almacen\" disabled [ngModel]=\"almacenSeleccionado\"\n [ngModelOptions]=\"{ standalone: true }\">\n @for (almacen of almacenList; track almacen.id) {\n <option [ngValue]=\"almacen.id\">{{ almacen.descripcion }}</option>\n }\n </select>\n </div>\n </div>\n\n <p-table #dt [value]=\"articulosList\" [scrollable]=\"true\" scrollHeight=\"flex\" responsiveLayout=\"scroll\"\n selectionMode=\"single\" styleClass=\"p-datatable-sm\" [loading]=\"cargando\" class=\"sa-tabla\"\n (onRowSelect)=\"filaSeleccionada($event)\">\n\n <ng-template pTemplate=\"header\">\n <tr>\n <th class=\"sa-col-ubicacion\" translate>C\u00F3digo Ubicacion</th>\n <th class=\"sa-num\" translate>Existencia</th>\n <th class=\"sa-col-unidad\" translate>Unidad</th>\n @if (manejaUnidadSecundaria) {\n <th class=\"sa-num\" translate>existenciaSecundaria</th>\n <th class=\"sa-col-unidad\" translate>Unidad</th>\n }\n <th class=\"sa-col-codigo\" translate>C\u00F3digo</th>\n <th class=\"sa-col-descripcion\" translate>Descripcion</th>\n <th class=\"sa-col-accion\"><span class=\"sa-sr-only\">Detalle</span></th>\n @if (configuracion.tipoPrecio !== 'costo') {\n <th class=\"sa-num\" translate>Precio</th>\n <th class=\"sa-num\" translate>Precio 2</th>\n <th class=\"sa-num\" translate>Precio 3</th>\n <th class=\"sa-num\" translate>Precio 4</th>\n <th class=\"sa-num\" translate>Precio 5</th>\n } @else {\n <th class=\"sa-num\" translate>Movimiento.costo</th>\n }\n @if (mostrarExistenciaPorUnidad) {\n <th class=\"sa-col-unidades\" translate>Existencia por Unidad</th>\n }\n @for (item of clasificadorList; track $index) {\n <th class=\"sa-col-clasificador\" translate>{{ item.descripcion }}</th>\n }\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-rowData>\n <tr [pSelectableRow]=\"rowData\">\n <td class=\"sa-col-ubicacion\">\n @if (rowData.ubicacionCodigo) {\n {{ rowData.ubicacionCodigo }}\n } @else {\n <span class=\"sa-sr-only\" translate>Movimiento.NoAsignado</span>\n }\n </td>\n <td class=\"sa-num\">{{ rowData.existencia }}</td>\n <td class=\"sa-col-unidad\">{{ rowData.unidadCodigo }}</td>\n @if (manejaUnidadSecundaria) {\n <td class=\"sa-num\">{{ rowData.existenciaSecundaria }}</td>\n <td class=\"sa-col-unidad\">{{ rowData.unidadSecundariaCodigo }}</td>\n }\n <td class=\"sa-col-codigo\">{{ rowData.articulo.codigo }}</td>\n <td class=\"sa-col-descripcion\" [pTooltip]=\"rowData.articulo.descripcion\" tooltipPosition=\"top\"\n [showDelay]=\"400\">{{ rowData.articulo.descripcion }}</td>\n <td class=\"sa-col-accion\">\n <button pButton type=\"button\" icon=\"pi pi-eye\" class=\"p-button-text p-button-sm p-button-rounded\"\n [attr.aria-label]=\"'Ver informaci\u00F3n del art\u00EDculo ' + rowData.articulo.descripcion\"\n (click)=\"onShowInformacion(rowData)\"></button>\n </td>\n @if (configuracion.tipoPrecio !== 'costo') {\n <td class=\"sa-num\">{{ rowData.precioConImpuestos | currency }}</td>\n <td class=\"sa-num\">{{ rowData.precio2ConImpuestos | currency }}</td>\n <td class=\"sa-num\">{{ rowData.precio3ConImpuestos | currency }}</td>\n <td class=\"sa-num\">{{ rowData.precio4ConImpuestos | currency }}</td>\n <td class=\"sa-num\">{{ rowData.precio5ConImpuestos | currency }}</td>\n } @else {\n <td class=\"sa-num\">{{ rowData.precio | currency }}</td>\n }\n @if (mostrarExistenciaPorUnidad) {\n <td class=\"sa-col-unidades\">\n @for (item of rowData.existenciaUnidades; track $index) {\n <div class=\"sa-unidad-existencia\">\n <span>{{ item.unidad_codigo }}</span>\n <span class=\"sa-num\">{{ item.unidad_existencia | number : '1.2-2' }}</span>\n </div>\n }\n </td>\n }\n @for (itemData of rowData.articuloClasificadorList; track $index) {\n <td class=\"sa-col-clasificador\">{{ itemData.valor }}</td>\n }\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"totalColumnas\">\n <div class=\"sa-vacio\">\n <i class=\"pi pi-search\" aria-hidden=\"true\"></i>\n @if (busquedaArticulos.key) {\n <p>Sin resultados para \u00AB{{ busquedaArticulos.key }}\u00BB. Prueba con otro t\u00E9rmino o tipo de b\u00FAsqueda.</p>\n } @else {\n <p>Escribe un t\u00E9rmino de b\u00FAsqueda y presiona <strong>Buscar</strong> para consultar la existencia de\n art\u00EDculos.</p>\n }\n </div>\n </td>\n </tr>\n </ng-template>\n\n </p-table>\n\n <p-paginator [rows]=\"page.rows\" [totalRecords]=\"page.total\" [pageLinkSize]=\"5\" (onPageChange)=\"pagina($event)\"\n [rowsPerPageOptions]=\"[10,25,50,100,500]\"></p-paginator>\n\n </div>\n</p-dialog>\n<!--termina seleccion de articulos-->\n<!--selecciona ubicacion -->\n@if (showModalInformacion) {\n <lib-seleccion-articulo-informacion [showModal]=\"showModalInformacion\" [articulo]=\"articuloSelected\"\n (eventSelection)=\"onEventInformacion($event)\">\n </lib-seleccion-articulo-informacion>\n}\n", styles: [".sa-cuerpo{display:flex;flex-direction:column;gap:.875rem;flex:1 1 auto;min-height:0}.sa-etiqueta{display:block;margin-bottom:.25rem;font-weight:600;color:#475569}.sa-tipo-busqueda{width:10.5rem;flex:0 0 auto}.sa-campo-busqueda{flex:1 1 auto;min-width:7rem}.sa-almacen{width:100%;max-width:22rem}p-table.sa-tabla{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.sa-col-ubicacion{width:7.5rem}.sa-col-codigo{width:6.5rem}.sa-col-unidad{width:4.5rem}.sa-col-accion{width:3.25rem;text-align:center}.sa-col-accion .p-button{width:1.85rem;height:1.85rem;padding:0}.sa-col-unidades{width:12rem}.sa-col-clasificador{width:6.5rem}.sa-col-descripcion{min-width:13rem;max-width:26rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sa-num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}.sa-unidad-existencia{display:flex;justify-content:space-between;gap:.5rem}p-table.sa-tabla tr.p-highlight{background:#e3f2fd;color:#1565c0;font-weight:600}.sa-vacio{display:flex;align-items:center;gap:.75rem;padding:1.25rem .5rem;color:#64748b}.sa-vacio i{font-size:1.5rem;color:#94a3b8}.sa-vacio p{margin:0}.sa-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "directive", type: i1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i2.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i3.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: i3.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "directive", type: i5.InputText, selector: "[pInputText]" }, { kind: "component", type: i6.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "style", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "appendTo", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "showPageLinks", "locale", "dropdownItemTemplate", "first"], outputs: ["onPageChange"] }, { kind: "directive", type: i7.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i7.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: i7.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i9.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i10.SeleccionArticuloInformacionComponent, selector: "lib-seleccion-articulo-informacion", inputs: ["showModal", "articulo"], outputs: ["eventSelection"] }, { kind: "pipe", type: i11.DecimalPipe, name: "number" }, { kind: "pipe", type: i11.CurrencyPipe, name: "currency" }, { kind: "pipe", type: i9.TranslatePipe, name: "translate" }] }); }
|
|
111
151
|
}
|
|
112
152
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SeleccionaArticuloComponent, decorators: [{
|
|
113
153
|
type: Component,
|
|
114
|
-
args: [{ selector: 'app-selecciona-articulo', template: "<!--inicia seleccion de articulos-->\n<!-- (onShow)=\"obtenerExistenciaArticulosShow()\" -->\n<!--\n <div class=\"col-12 col-center\" >-->\n<p-dialog header=\"{{ 'Articulos' | translate }}\" [(visible)]=\"showArticulos\" [maximizable]=\"true\"\n (onShow)=\"obtenerExistenciaArticulosShow()\" (onHide)=\"busquedaArticulos = { tipoBusqueda : ''}; emitirShowArticulos()\"\n [baseZIndex]=\"10000\" [blockScroll]=\"true\" [style]=\"{'width': size+'px', 'min-width': '200px'}\" [minY]=\"70\">\n <div class=\"grid grid-fluid\">\n <div class=\"col-12 md:col-6 lg:col-6\">\n <div style=\"display: flex;\">\n <div style=\"width: 115px;\">\n <select pInputText [(ngModel)]=\"busquedaArticulos.tipoBusqueda\" (change)=\"obtenerExistenciaArticulosVal()\">\n <option value=\"C\">Codigo</option>\n <option value=\"D\">Descripcion</option>\n <option value=\"CD\">Coincidencia</option>\n <option value=\"CI\">Igual a</option>\n </select>\n </div>\n <input type=\"text\" style=\"width: 200px;\" pInputText [(ngModel)]=\"busquedaArticulos.key\"\n (keypress)=\"obtenerExistenciaArticulosKey( $event )\" id=\"key\">\n <button pButton type=\"button\" icon=\"pi pi-search\" styleClass=\"p-button-secondary\"\n (click)=\"obtenerExistenciaArticulos( )\"></button>\n </div>\n </div>\n <div class=\"col-12 md:col-6 lg:col-6\">\n <div style=\"display: flex;\">\n <div style=\"width: 100px;\">\n <label for=\"almacen\">Almacen:</label>\n </div>\n <select pInputText style=\"width: 200px;\" [(ngModel)]=\"movimiento.almacen\" disabled id=\"almacen\"\n (change)=\"obtenerExistenciaArticulosVal()\">\n <option *ngFor=\"let almacen of almacenList\" value=\"{{ almacen.id }}\">{{almacen.descripcion}}</option>\n </select>\n </div>\n\n </div>\n </div>\n\n <!--\n <div id=\"table-wrapper\">\n <div id=\"table-scroll\">-->\n <!-- new table\n <p-table #dt [columns]=\"colsDD\" [value]=\"listDD\" [scrollable]=\"true\" \n [style]=\"{width: '100%'} \" [scrollHeight]=\"maxH + 'px'\" \n [resizableColumns]=\"true\" [(selection)]=\"selectedXML\" (onRowSelect)=\"onRowSelect($event)\" dataKey=\"uuid\">\n\n \n -->\n\n <p-table [value]=\"articulosList\" [scrollable]=\"true\" #dt scrollHeight=\"400px\" responsiveLayout=\"scroll\" \n selectionMode=\"single\" (onRowSelect)=\"filaSeleccionada($event)\">\n <ng-template pTemplate=\"header\">\n <tr>\n <th style=\"width: 80px\" translate>C\u00F3digo Ubicacion</th>\n <th style=\"width: 70px\" translate>Existencia</th>\n <th style=\"width: 40px\" translate>Unidad</th>\n <th style=\"width: 50px\" *ngIf=\"manejaUnidadSecundaria\" translate>existenciaSecundaria</th>\n <th style=\"width: 40px\" *ngIf=\"manejaUnidadSecundaria\" translate>Unidad</th>\n <th style=\"width: 80px\" translate>C\u00F3digo</th>\n <th style=\"width: 120px\" translate>Descripcion</th>\n <th style=\"width: 40px\" translate></th>\n <th style=\"width: 80px\" *ngIf=\"configuracion.tipoPrecio !== 'costo' \" translate>Precio</th>\n <th style=\"width: 80px\" *ngIf=\"configuracion.tipoPrecio !== 'costo' \" translate>Precio 2</th>\n <th style=\"width: 80px\" *ngIf=\"configuracion.tipoPrecio !== 'costo' \" translate>Precio 3</th>\n <th style=\"width: 80px\" *ngIf=\"configuracion.tipoPrecio !== 'costo' \" translate>Precio 4</th>\n <th style=\"width: 80px\" *ngIf=\"configuracion.tipoPrecio !== 'costo' \" translate>Precio 5</th>\n <th style=\"width: 40px\" *ngIf=\"configuracion.tipoPrecio === 'costo' \" translate>Movimiento.costo</th>\n <th style=\"width: 40px\" translate>Existencia por Unidad</th>\n <th *ngFor=\"let item of clasificadorList\" style=\"width: 80px\" translate>{{item.descripcion}}</th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData let-rowIndex=\"rowIndex\">\n <tr [pSelectableRow]=\"rowData\">\n <td style=\"width: 80px;\" *ngIf=\"!rowData.ubicacionCodigo\" translate>Movimiento.NoAsignado</td>\n <td style=\"width: 80px;\" *ngIf=\"rowData.ubicacionCodigo\">{{rowData.ubicacionCodigo}}</td>\n <td style=\"width: 70px;\">{{rowData.existencia}}</td>\n <td style=\"width: 40px;\">{{rowData.unidadCodigo}}</td>\n\n <td style=\"width: 50px;\" *ngIf=\"manejaUnidadSecundaria\">{{rowData.existenciaSecundaria}}</td>\n <td style=\"width: 40px;\" *ngIf=\"manejaUnidadSecundaria\">{{rowData.unidadSecundariaCodigo}}</td>\n\n <td style=\"width: 80px;\">{{rowData.articulo.codigo}}</td>\n <td style=\"width: 120px;\">{{rowData.articulo.descripcion}}</td>\n <td style=\"width: 40px;\">\n <button pButton type=\"button\" icon=\"pi pi-eye\" class=\"ui-button-raised ui-button-primary\"\n (click)=\"onShowInformacion(rowData)\">\n </button>\n </td>\n <td style=\"width: 80px;\" *ngIf=\"configuracion.tipoPrecio !== 'costo'\">{{rowData.precioConImpuestos | currency }}\n </td>\n <td style=\"width: 80px;\" *ngIf=\"configuracion.tipoPrecio !== 'costo'\">{{rowData.precio2ConImpuestos | currency\n }}</td>\n <td style=\"width: 80px;\" *ngIf=\"configuracion.tipoPrecio !== 'costo'\">{{rowData.precio3ConImpuestos | currency\n }}</td>\n <td style=\"width: 80px;\" *ngIf=\"configuracion.tipoPrecio !== 'costo'\">{{rowData.precio4ConImpuestos | currency\n }}</td>\n <td style=\"width: 80px;\" *ngIf=\"configuracion.tipoPrecio !== 'costo'\">{{rowData.precio5ConImpuestos | currency\n }}</td>\n <td style=\"width: 40px;\" *ngIf=\"configuracion.tipoPrecio === 'costo' \">{{rowData.precio | currency }}</td>\n <td style=\"width: 40px;\">\n <div class=\"row justify-content-between\" *ngFor=\"let item of rowData.existenciaUnidades\">\n <div class=\"col-lg-4\"><label for=\"\">{{item.unidad_codigo}}</label></div>\n <div class=\"col-lg-4\"><label for=\"\">{{item.unidad_existencia | number : '1.2-2'}}</label>\n </div>\n </div>\n </td>\n <!-- <td style=\"width: 40px;\"></td> -->\n <td *ngFor=\"let itemData of rowData.articuloClasificadorList\" style=\"width: 80px;\">{{itemData.valor}}</td>\n </tr>\n </ng-template>\n </p-table>\n\n <!-- /new table-->\n <!-- \n <p-table [(value)]=\"articulosList\" responsive=\"true\" \n selectionMode=\"multiple\" (onRowSelect)=\"filaSeleccionada($event)\" [scrollable]=\"true\" scrollHeight=\"350px\" >\n\n <p-column header=\"{{ 'Codigo ubicacion'.toString() | translate}}\">\n <ng-template let-dato=\"rowData\" pTemplate=\"body\">\n <label for=\"\" *ngIf=\"!dato.ubicacionCodigo\" translate> Movimiento.NoAsignado </label>\n <label for=\"\" *ngIf=\"dato.ubicacionCodigo\" > {{ dato.ubicacionCodigo }}</label>\n </ng-template>\n </p-column>\n <p-column field=\"ubicacionCodigo\" header=\"{{ 'Descripcion ubicacion'.toString() | translate}}\">\n <ng-template let-dato=\"rowData\" pTemplate=\"body\">\n <label for=\"\" *ngIf=\"!dato.ubicacionCodigo\" translate> Movimiento.NoAsignado </label>\n <label for=\"\" *ngIf=\"dato.ubicacionCodigo\" > {{ dato.ubicacionCodigo }}</label>\n </ng-template>\n </p-column>\n\n <p-column field=\"existencia\" header=\"{{'Existencia' | translate}}\"></p-column>\n <p-column field=\"unidadCodigo\" header=\"{{'Unidad' | translate}}\"></p-column>\n <p-column field=\"unidadDescripcion\" header=\"{{'Descripcion unidad' | translate}}\"></p-column>\n\n <p-column field=\"existenciaSecundaria\" header=\"{{'existenciaSecundaria' | translate}}\" *ngIf=\"manejaUnidadSecundaria\"></p-column>\n <p-column field=\"unidadSecundariaCodigo\" header=\"{{'Unidad' | translate}}\" *ngIf=\"manejaUnidadSecundaria\"></p-column>\n \n\n <p-column *ngIf=\"configuracion.tipoPrecio !== 'costo' \" header=\"{{'Movimiento.movimientoDetalle.precio' | translate}}\">\n <ng-template let-dato=\"rowData\" pTemplate=\"body\">\n <label for=\"\">{{ dato.precioConImpuestos | currency }}</label>\n </ng-template>\n </p-column>\n <p-column *ngIf=\"configuracion.tipoPrecio === 'costo' \" header=\"{{'Movimiento.costo' | translate }}\">\n <ng-template let-dato=\"rowData\" pTemplate=\"body\">\n <label for=\"\">{{ dato.precio | currency }}</label>\n </ng-template>\n </p-column>\n\n\n <p-column field=\"articulo.codigo\" header=\"{{'Codigo articulo' | translate}}\"></p-column>\n <p-column field=\"articulo.descripcion\" header=\"{{'Descripcion' | translate}}\"></p-column>\n\n\n\n <p-column header=\"{{'ExistenciaPorUnidad' | translate }}\">\n <ng-template let-dato=\"rowData\" pTemplate=\"body\">\n <div class=\"row justify-content-between\" *ngFor=\"let item of dato.existenciaUnidades\" >\n <div class=\"col-lg-4\"><label for=\"\">{{item.unidad_codigo}}</label></div>\n <div class=\"col-lg-4\"><label for=\"\">{{item.unidad_existencia | number : '1.2-2'}}</label>\n </div> \n </div> \n </ng-template>\n </p-column>\n \n </p-table>\n -->\n <p-paginator [rows]=\"page.rows\" [totalRecords]=\"page.total\" [pageLinkSize]=\"5\" (onPageChange)=\"pagina($event)\"\n [rowsPerPageOptions]=\"[10,25,50,100,500]\"></p-paginator>\n <!-- \n </div>\n </div>\n -->\n</p-dialog>\n<!--\n </div> \n -->\n<!--termina seleccion de articulos-->\n<!--selecciona ubicacion -->\n<lib-seleccion-articulo-informacion [showModal]=\"showModalInformacion\" [articulo]=\"articuloSelected\"\n (eventSelection)=\"onEventInformacion($event)\" *ngIf=\"showModalInformacion\">\n</lib-seleccion-articulo-informacion>", styles: ["tr:hover{background-color:#34a835!important;color:#fff!important}table{position:absolute}\n"] }]
|
|
115
|
-
}],
|
|
154
|
+
args: [{ selector: 'app-selecciona-articulo', template: "<!--inicia seleccion de articulos-->\n<p-dialog header=\"{{ 'Articulos' | translate }}\" [(visible)]=\"showArticulos\" [maximizable]=\"true\"\n (onShow)=\"obtenerExistenciaArticulosShow()\" (onHide)=\"busquedaArticulos = { tipoBusqueda : ''}; emitirShowArticulos()\"\n (onMaximize)=\"maximizado = $event.maximized\"\n [baseZIndex]=\"10000\" [blockScroll]=\"true\" [style]=\"{ width: '95vw' }\" [minY]=\"70\"\n [contentStyle]=\"estiloContenido\">\n\n <div class=\"sa-cuerpo\">\n\n <div class=\"grid sa-filtros\">\n <div class=\"col-12 md:col-6 xl:col-5\">\n <label class=\"sa-etiqueta\" for=\"sa-tipo-busqueda\">Buscar por</label>\n <div class=\"p-inputgroup\">\n <select pInputText class=\"sa-tipo-busqueda\" id=\"sa-tipo-busqueda\"\n [(ngModel)]=\"busquedaArticulos.tipoBusqueda\" (change)=\"obtenerExistenciaArticulosVal()\">\n <option value=\"C\">C\u00F3digo</option>\n <option value=\"D\">Descripci\u00F3n</option>\n <option value=\"CD\">Coincidencia</option>\n <option value=\"CI\">Igual a</option>\n </select>\n <input pInputText type=\"text\" class=\"sa-campo-busqueda\" id=\"sa-campo-busqueda\" #campoBusqueda\n placeholder=\"T\u00E9rmino de b\u00FAsqueda\" [(ngModel)]=\"busquedaArticulos.key\"\n (keydown.enter)=\"obtenerExistenciaArticulos()\">\n <button pButton type=\"button\" icon=\"pi pi-search\" aria-label=\"Buscar\"\n (click)=\"obtenerExistenciaArticulos()\"></button>\n </div>\n </div>\n <div class=\"col-12 md:col-6 xl:col-5\">\n <label class=\"sa-etiqueta\" for=\"sa-almacen\">Almac\u00E9n</label>\n <select pInputText class=\"sa-almacen\" id=\"sa-almacen\" disabled [ngModel]=\"almacenSeleccionado\"\n [ngModelOptions]=\"{ standalone: true }\">\n @for (almacen of almacenList; track almacen.id) {\n <option [ngValue]=\"almacen.id\">{{ almacen.descripcion }}</option>\n }\n </select>\n </div>\n </div>\n\n <p-table #dt [value]=\"articulosList\" [scrollable]=\"true\" scrollHeight=\"flex\" responsiveLayout=\"scroll\"\n selectionMode=\"single\" styleClass=\"p-datatable-sm\" [loading]=\"cargando\" class=\"sa-tabla\"\n (onRowSelect)=\"filaSeleccionada($event)\">\n\n <ng-template pTemplate=\"header\">\n <tr>\n <th class=\"sa-col-ubicacion\" translate>C\u00F3digo Ubicacion</th>\n <th class=\"sa-num\" translate>Existencia</th>\n <th class=\"sa-col-unidad\" translate>Unidad</th>\n @if (manejaUnidadSecundaria) {\n <th class=\"sa-num\" translate>existenciaSecundaria</th>\n <th class=\"sa-col-unidad\" translate>Unidad</th>\n }\n <th class=\"sa-col-codigo\" translate>C\u00F3digo</th>\n <th class=\"sa-col-descripcion\" translate>Descripcion</th>\n <th class=\"sa-col-accion\"><span class=\"sa-sr-only\">Detalle</span></th>\n @if (configuracion.tipoPrecio !== 'costo') {\n <th class=\"sa-num\" translate>Precio</th>\n <th class=\"sa-num\" translate>Precio 2</th>\n <th class=\"sa-num\" translate>Precio 3</th>\n <th class=\"sa-num\" translate>Precio 4</th>\n <th class=\"sa-num\" translate>Precio 5</th>\n } @else {\n <th class=\"sa-num\" translate>Movimiento.costo</th>\n }\n @if (mostrarExistenciaPorUnidad) {\n <th class=\"sa-col-unidades\" translate>Existencia por Unidad</th>\n }\n @for (item of clasificadorList; track $index) {\n <th class=\"sa-col-clasificador\" translate>{{ item.descripcion }}</th>\n }\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-rowData>\n <tr [pSelectableRow]=\"rowData\">\n <td class=\"sa-col-ubicacion\">\n @if (rowData.ubicacionCodigo) {\n {{ rowData.ubicacionCodigo }}\n } @else {\n <span class=\"sa-sr-only\" translate>Movimiento.NoAsignado</span>\n }\n </td>\n <td class=\"sa-num\">{{ rowData.existencia }}</td>\n <td class=\"sa-col-unidad\">{{ rowData.unidadCodigo }}</td>\n @if (manejaUnidadSecundaria) {\n <td class=\"sa-num\">{{ rowData.existenciaSecundaria }}</td>\n <td class=\"sa-col-unidad\">{{ rowData.unidadSecundariaCodigo }}</td>\n }\n <td class=\"sa-col-codigo\">{{ rowData.articulo.codigo }}</td>\n <td class=\"sa-col-descripcion\" [pTooltip]=\"rowData.articulo.descripcion\" tooltipPosition=\"top\"\n [showDelay]=\"400\">{{ rowData.articulo.descripcion }}</td>\n <td class=\"sa-col-accion\">\n <button pButton type=\"button\" icon=\"pi pi-eye\" class=\"p-button-text p-button-sm p-button-rounded\"\n [attr.aria-label]=\"'Ver informaci\u00F3n del art\u00EDculo ' + rowData.articulo.descripcion\"\n (click)=\"onShowInformacion(rowData)\"></button>\n </td>\n @if (configuracion.tipoPrecio !== 'costo') {\n <td class=\"sa-num\">{{ rowData.precioConImpuestos | currency }}</td>\n <td class=\"sa-num\">{{ rowData.precio2ConImpuestos | currency }}</td>\n <td class=\"sa-num\">{{ rowData.precio3ConImpuestos | currency }}</td>\n <td class=\"sa-num\">{{ rowData.precio4ConImpuestos | currency }}</td>\n <td class=\"sa-num\">{{ rowData.precio5ConImpuestos | currency }}</td>\n } @else {\n <td class=\"sa-num\">{{ rowData.precio | currency }}</td>\n }\n @if (mostrarExistenciaPorUnidad) {\n <td class=\"sa-col-unidades\">\n @for (item of rowData.existenciaUnidades; track $index) {\n <div class=\"sa-unidad-existencia\">\n <span>{{ item.unidad_codigo }}</span>\n <span class=\"sa-num\">{{ item.unidad_existencia | number : '1.2-2' }}</span>\n </div>\n }\n </td>\n }\n @for (itemData of rowData.articuloClasificadorList; track $index) {\n <td class=\"sa-col-clasificador\">{{ itemData.valor }}</td>\n }\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"emptymessage\">\n <tr>\n <td [attr.colspan]=\"totalColumnas\">\n <div class=\"sa-vacio\">\n <i class=\"pi pi-search\" aria-hidden=\"true\"></i>\n @if (busquedaArticulos.key) {\n <p>Sin resultados para \u00AB{{ busquedaArticulos.key }}\u00BB. Prueba con otro t\u00E9rmino o tipo de b\u00FAsqueda.</p>\n } @else {\n <p>Escribe un t\u00E9rmino de b\u00FAsqueda y presiona <strong>Buscar</strong> para consultar la existencia de\n art\u00EDculos.</p>\n }\n </div>\n </td>\n </tr>\n </ng-template>\n\n </p-table>\n\n <p-paginator [rows]=\"page.rows\" [totalRecords]=\"page.total\" [pageLinkSize]=\"5\" (onPageChange)=\"pagina($event)\"\n [rowsPerPageOptions]=\"[10,25,50,100,500]\"></p-paginator>\n\n </div>\n</p-dialog>\n<!--termina seleccion de articulos-->\n<!--selecciona ubicacion -->\n@if (showModalInformacion) {\n <lib-seleccion-articulo-informacion [showModal]=\"showModalInformacion\" [articulo]=\"articuloSelected\"\n (eventSelection)=\"onEventInformacion($event)\">\n </lib-seleccion-articulo-informacion>\n}\n", styles: [".sa-cuerpo{display:flex;flex-direction:column;gap:.875rem;flex:1 1 auto;min-height:0}.sa-etiqueta{display:block;margin-bottom:.25rem;font-weight:600;color:#475569}.sa-tipo-busqueda{width:10.5rem;flex:0 0 auto}.sa-campo-busqueda{flex:1 1 auto;min-width:7rem}.sa-almacen{width:100%;max-width:22rem}p-table.sa-tabla{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.sa-col-ubicacion{width:7.5rem}.sa-col-codigo{width:6.5rem}.sa-col-unidad{width:4.5rem}.sa-col-accion{width:3.25rem;text-align:center}.sa-col-accion .p-button{width:1.85rem;height:1.85rem;padding:0}.sa-col-unidades{width:12rem}.sa-col-clasificador{width:6.5rem}.sa-col-descripcion{min-width:13rem;max-width:26rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sa-num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}.sa-unidad-existencia{display:flex;justify-content:space-between;gap:.5rem}p-table.sa-tabla tr.p-highlight{background:#e3f2fd;color:#1565c0;font-weight:600}.sa-vacio{display:flex;align-items:center;gap:.75rem;padding:1.25rem .5rem;color:#64748b}.sa-vacio i{font-size:1.5rem;color:#94a3b8}.sa-vacio p{margin:0}.sa-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n"] }]
|
|
155
|
+
}], propDecorators: { configuracion: [{
|
|
116
156
|
type: Input
|
|
117
157
|
}], showArticulos: [{
|
|
118
158
|
type: Input
|
|
@@ -124,5 +164,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
124
164
|
type: Output
|
|
125
165
|
}], emitShowArticulos: [{
|
|
126
166
|
type: Output
|
|
167
|
+
}], campoBusqueda: [{
|
|
168
|
+
type: ViewChild,
|
|
169
|
+
args: ['campoBusqueda']
|
|
127
170
|
}] } });
|
|
128
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWNjaW9uYS1hcnRpY3Vsby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcnAtY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc2VsZWNjaW9uYS1hcnRpY3Vsby9zZWxlY2Npb25hLWFydGljdWxvLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VycC1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9zZWxlY2Npb25hLWFydGljdWxvL3NlbGVjY2lvbmEtYXJ0aWN1bG8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUU3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBTy9DLE1BQU0sT0FBTywyQkFBMkI7SUE0QnRDLFlBQ29CLGFBQStCLEVBQy9CLGdCQUFrQyxFQUNsQyxlQUFpQztRQUZqQyxrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFDL0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxvQkFBZSxHQUFmLGVBQWUsQ0FBa0I7UUF6QjVDLDJCQUFzQixHQUFhLEtBQUssQ0FBQztRQUV4Qyx5QkFBb0IsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM5RCxzQkFBaUIsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUtyRSxrQkFBYSxHQUFRLEVBQUUsQ0FBQztRQUV4QixZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2Isc0JBQWlCLEdBQVM7WUFDeEIsWUFBWSxFQUFHLEVBQUU7U0FDbEIs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azRUQXFMcUM7OzRGRDFLeEIsMkJBQTJCO2tCQUx2QyxTQUFTOytCQUNFLHlCQUF5Qjs0SUFNMUIsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsc0JBQXNCO3NCQUE5QixLQUFLO2dCQUVJLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWxtYWNlbiB9IGZyb20gJy4uL2FsbWFjZW4vbW9kZWxzL0FsbWFjZW4nO1xuaW1wb3J0IHsgUGFnaW5hdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGFnaW5hdGUuc2VydmljZSc7XG5pbXBvcnQgeyBBbG1hY2VuU2VydmljZSB9IGZyb20gJy4uL2FsbWFjZW4vc2VydmljZXMvYWxtYWNlbi5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b2NrU2VydmljZSB9IGZyb20gJy4vc3RvY2suc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1zZWxlY2Npb25hLWFydGljdWxvJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjY2lvbmEtYXJ0aWN1bG8uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zZWxlY2Npb25hLWFydGljdWxvLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY2Npb25hQXJ0aWN1bG9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIGNvbmZpZ3VyYWNpb24gOiBhbnk7XG4gIEBJbnB1dCgpIHNob3dBcnRpY3Vsb3MgOiBib29sZWFuO1xuICBASW5wdXQoKSBtb3ZpbWllbnRvOiBhbnk7XG5cbiAgQElucHV0KCkgbWFuZWphVW5pZGFkU2VjdW5kYXJpYSA6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgZW1pdEZpbGFTZWxlY2Npb25hZGEgOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGVtaXRTaG93QXJ0aWN1bG9zIDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblxuXG4gIGFsbWFjZW5MaXN0OiBBbG1hY2VuW107XG4gIGFydGljdWxvc0xpc3Q6IGFueSA9IFtdO1xuICBwYWdlOiBhbnk7XG4gIG9yZGVuYXIgPSBbXTtcbiAgYnVzcXVlZGFBcnRpY3Vsb3MgOiBhbnkgPSB7XG4gICAgdGlwb0J1c3F1ZWRhIDogJydcbiAgfTtcblxuICBzaG93TW9kYWw6Ym9vbGVhbj1mYWxzZTtcbiAgYXJ0aWN1bG9TZWxlY3RlZDphbnk7XG4gIHNob3dNb2RhbEluZm9ybWFjaW9uOmJvb2xlYW49ZmFsc2U7XG4gIHNob3dGaXJzdFRpbWU6Ym9vbGVhbj10cnVlO1xuICBjbGFzaWZpY2Fkb3JMaXN0OmFueT1bXTtcbiAgc2l6ZSA9IDY0MDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfc3RvY2tTZXJ2aWNlICAgIDogU3RvY2tTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9wYWdpbmF0ZVNlcnZpY2UgOiBQYWdpbmF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2FsbWFjZW5TZXJ2aWNlICA6IEFsbWFjZW5TZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnBhZ2UgPSB0aGlzLl9wYWdpbmF0ZVNlcnZpY2UuZ2V0UGFnZSgpO1xuICAgIHRoaXMub3JkZW5hciA9IHRoaXMuX3BhZ2luYXRlU2VydmljZS5nZXRPcmRlbihcbiAgICAgIFtcbiAgICAgICAge3BhcmFtOiAnbm9tYnJlJywgbGFiZWw6ICdlc3RhdHVzJ31cbiAgICAgIF0sICdlcycpO1xuXG5cbiAgICB0aGlzLnNob3dGaXJzdFRpbWU9dHJ1ZTtcbiAgICB0aGlzLl9hbG1hY2VuU2VydmljZS5nZXRBbGwoIHRoaXMuY29uZmlndXJhY2lvbi5wYXJhbXMgKS5zdWJzY3JpYmUoXG4gICAgICAoZGF0YTogYW55ICkgPT4ge1xuICAgICAgICB0aGlzLmFsbWFjZW5MaXN0ID0gPEFsbWFjZW5bXT4gZGF0YS5kYXRhO1xuICAgICAgfVxuICAgICk7XG4gICAgXG4gICAgdGhpcy5idXNxdWVkYUFydGljdWxvcy50aXBvQnVzcXVlZGEgPSAnQ0QnO1xuICAgIC8vdGVtcHRoaXMub2J0ZW5lckV4aXN0ZW5jaWFBcnRpY3Vsb3NTaG93KCk7XG4gIH1cblxuICBwYWdpbmEoIGUgKXtcbiAgICB0aGlzLnBhZ2Uucm93cyA9IGUucm93cztcbiAgICB0aGlzLnBhZ2Uub2Zmc2V0ID0gZS5maXJzdDtcbiAgICB0aGlzLm9idGVuZXJFeGlzdGVuY2lhQXJ0aWN1bG9zKCk7XG4gIH1cbiAgb2J0ZW5lckV4aXN0ZW5jaWFBcnRpY3Vsb3NTaG93KCl7XG4gICAgdGhpcy5idXNxdWVkYUFydGljdWxvcy50aXBvQnVzcXVlZGEgPSAnQ0QnO1xuICAgIGlmICh0aGlzLnNob3dGaXJzdFRpbWUpe1xuICAgICAgdGhpcy5vYnRlbmVyRXhpc3RlbmNpYUFydGljdWxvcygpO1xuICAgICAgdGhpcy5zaG93Rmlyc3RUaW1lPWZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9idGVuZXJFeGlzdGVuY2lhQXJ0aWN1bG9zKCApIHtcbiAgICB0aGlzLmJ1c3F1ZWRhQXJ0aWN1bG9zLnBhcmFtcyA9IHRoaXMuX3BhZ2luYXRlU2VydmljZS5nZXRQYXJhbXMoIHRoaXMucGFnZSApO1xuICAgIGNvbnN0IHBhcmFtZXRyb3MgPSB7XG4gICAgICBhbG1hY2VuICAgICAgICAgICAgIDogKCB0aGlzLmNvbmZpZ3VyYWNpb24ubm9PY3VwYUFsYW1hY2VuID8gbnVsbCA6IHRoaXMubW92aW1pZW50by5hbG1hY2VuICksXG4gICAgICB0aXBvUHJlY2lvICAgICAgICAgIDogdGhpcy5jb25maWd1cmFjaW9uLnRpcG9QcmVjaW8sXG4gICAgICBidXNxdWVkYUFydGljdWxvcyAgIDogdGhpcy5idXNxdWVkYUFydGljdWxvcyxcbiAgICAgIHRpcG9BcnRpY3VsbyAgICAgICAgOiB0aGlzLmNvbmZpZ3VyYWNpb24udGlwb0FydGljdWxvID8gdGhpcy5jb25maWd1cmFjaW9uLnRpcG9BcnRpY3VsbyA6IG51bGwsXG4gICAgICBudW1lcm9QcmVjaW9EZWZhdWx0IDogdGhpcy5jb25maWd1cmFjaW9uLm51bWVyb1ByZWNpb0RlZmF1bHRcbiAgICB9OyAgICAgICBcbiAgICB0aGlzLl9zdG9ja1NlcnZpY2Uub2J0ZW5lckV4aXN0ZW5jaWFzQXJ0aWN1bG9zRGVzY3JpcGNpb24oIHBhcmFtZXRyb3MgLCB0aGlzLmJ1c3F1ZWRhQXJ0aWN1bG9zLnBhcmFtcyApLnRoZW4oXG4gICAgICAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuYXJ0aWN1bG9zTGlzdCA9IGRhdGEuYXJ0aWN1bG9zRGVzY3JpcGNpb247XG4gICAgICAgIHRoaXMucGFnZS50b3RhbCA9IGRhdGEudG90YWw7ICBcbiAgICAgICAgaWYgKGRhdGEuY2xhc2lmaWNhZG9yZXMpe1xuICAgICAgICAgIHRoaXMuY2xhc2lmaWNhZG9yTGlzdCA9IGRhdGEuY2xhc2lmaWNhZG9yZXM7XG4gICAgICAgIH0gICAgICBcbiAgICAgICAgaWYoIXRoaXMuc2hvd01vZGFsKXtcbiAgICAgICAgICB0aGlzLnNob3dNb2RhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApLmNhdGNoKGUgPT57XG4gICAgICB0aGlzLmFydGljdWxvc0xpc3QgPSAgW107XG4gICAgfSk7XG4gIH1cblxuICBvYnRlbmVyRXhpc3RlbmNpYUFydGljdWxvc1ZhbCgpe1xuICAgIGlmICggdGhpcy5idXNxdWVkYUFydGljdWxvcy50aXBvQnVzcXVlZGEgIT0gJycgJiYgIXRoaXMuYnVzcXVlZGFBcnRpY3Vsb3Mua2V5IClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHRoaXMub2J0ZW5lckV4aXN0ZW5jaWFBcnRpY3Vsb3MoKTsgXG4gIH1cbiAgb2J0ZW5lckV4aXN0ZW5jaWFBcnRpY3Vsb3NLZXkoICRldmVudCApIHtcbiAgICBpZiggJGV2ZW50LmtleSA9PT0gJ0VudGVyJylcbiAgICAgIHRoaXMub2J0ZW5lckV4aXN0ZW5jaWFBcnRpY3Vsb3MoKTtcbiAgfVxuXG4gIGZpbGFTZWxlY2Npb25hZGEoICRldmVudCApIHtcbiAgICB0aGlzLmVtaXRGaWxhU2VsZWNjaW9uYWRhLmVtaXQoJGV2ZW50KTtcbiAgfVxuXG4gIGVtaXRpclNob3dBcnRpY3Vsb3MoKSB7XG4gICAgdGhpcy5lbWl0U2hvd0FydGljdWxvcy5lbWl0KCAwICk7XG4gIH1cblxuICBzZXJpZXNBcnRpY3VsbyhzZXJpZXMpe1xuICAgICAgY29uc29sZS5sb2coc2VyaWVzKTtcbiAgfVxuXG4gIG9uU2hvd0luZm9ybWFjaW9uKGV2ZW50QXJ0aWN1bG8pe1xuICAgIHRoaXMuYXJ0aWN1bG9TZWxlY3RlZCA9IGV2ZW50QXJ0aWN1bG87XG4gICAgdGhpcy5zaG93TW9kYWxJbmZvcm1hY2lvbiA9IHRydWU7XG4gIH1cblxuICBvbkV2ZW50SW5mb3JtYWNpb24oZXZlbnQpIHtcbiAgICB0aGlzLnNob3dNb2RhbEluZm9ybWFjaW9uID0gZXZlbnQuc3RhdHVzO1x0ICAgICAgXG4gIH1cbn1cbiIsIjwhLS1pbmljaWEgc2VsZWNjaW9uIGRlIGFydGljdWxvcy0tPlxuPCEtLSAgIChvblNob3cpPVwib2J0ZW5lckV4aXN0ZW5jaWFBcnRpY3Vsb3NTaG93KClcIiAtLT5cbjwhLS1cbiAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtY2VudGVyXCIgPi0tPlxuPHAtZGlhbG9nIGhlYWRlcj1cInt7ICdBcnRpY3Vsb3MnIHwgdHJhbnNsYXRlIH19XCIgWyh2aXNpYmxlKV09XCJzaG93QXJ0aWN1bG9zXCIgW21heGltaXphYmxlXT1cInRydWVcIlxuICAob25TaG93KT1cIm9idGVuZXJFeGlzdGVuY2lhQXJ0aWN1bG9zU2hvdygpXCIgKG9uSGlkZSk9XCJidXNxdWVkYUFydGljdWxvcyA9IHsgdGlwb0J1c3F1ZWRhIDogJyd9OyBlbWl0aXJTaG93QXJ0aWN1bG9zKClcIlxuICBbYmFzZVpJbmRleF09XCIxMDAwMFwiIFtibG9ja1Njcm9sbF09XCJ0cnVlXCIgW3N0eWxlXT1cInsnd2lkdGgnOiBzaXplKydweCcsICdtaW4td2lkdGgnOiAnMjAwcHgnfVwiIFttaW5ZXT1cIjcwXCI+XG4gIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtZmx1aWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1kOmNvbC02IGxnOmNvbC02XCI+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIndpZHRoOiAxMTVweDtcIj5cbiAgICAgICAgICA8c2VsZWN0IHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJidXNxdWVkYUFydGljdWxvcy50aXBvQnVzcXVlZGFcIiAoY2hhbmdlKT1cIm9idGVuZXJFeGlzdGVuY2lhQXJ0aWN1bG9zVmFsKClcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJDXCI+Q29kaWdvPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiRFwiPkRlc2NyaXBjaW9uPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQ0RcIj5Db2luY2lkZW5jaWE8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJDSVwiPklndWFsIGE8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHN0eWxlPVwid2lkdGg6IDIwMHB4O1wiIHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJidXNxdWVkYUFydGljdWxvcy5rZXlcIlxuICAgICAgICAgIChrZXlwcmVzcyk9XCJvYnRlbmVyRXhpc3RlbmNpYUFydGljdWxvc0tleSggJGV2ZW50IClcIiBpZD1cImtleVwiPlxuICAgICAgICA8YnV0dG9uIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1zZWFyY2hcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5XCJcbiAgICAgICAgICAoY2xpY2spPVwib2J0ZW5lckV4aXN0ZW5jaWFBcnRpY3Vsb3MoIClcIj48L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWQ6Y29sLTYgbGc6Y29sLTZcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDEwMHB4O1wiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJhbG1hY2VuXCI+QWxtYWNlbjo8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNlbGVjdCBwSW5wdXRUZXh0IHN0eWxlPVwid2lkdGg6IDIwMHB4O1wiIFsobmdNb2RlbCldPVwibW92aW1pZW50by5hbG1hY2VuXCIgZGlzYWJsZWQgaWQ9XCJhbG1hY2VuXCJcbiAgICAgICAgICAoY2hhbmdlKT1cIm9idGVuZXJFeGlzdGVuY2lhQXJ0aWN1bG9zVmFsKClcIj5cbiAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBhbG1hY2VuIG9mIGFsbWFjZW5MaXN0XCIgdmFsdWU9XCJ7eyBhbG1hY2VuLmlkIH19XCI+e3thbG1hY2VuLmRlc2NyaXBjaW9ufX08L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tXG4gICAgICA8ZGl2IGlkPVwidGFibGUtd3JhcHBlclwiPlxuICAgICAgPGRpdiBpZD1cInRhYmxlLXNjcm9sbFwiPi0tPlxuICA8IS0tIG5ldyB0YWJsZVxuICAgICAgIDxwLXRhYmxlICNkdCBbY29sdW1uc109XCJjb2xzRERcIiBbdmFsdWVdPVwibGlzdEREXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiIFxuICAgICAgIFtzdHlsZV09XCJ7d2lkdGg6ICcxMDAlJ30gXCIgW3Njcm9sbEhlaWdodF09XCJtYXhIICsgJ3B4J1wiIFxuICAgICAgIFtyZXNpemFibGVDb2x1bW5zXT1cInRydWVcIiBbKHNlbGVjdGlvbildPVwic2VsZWN0ZWRYTUxcIiAob25Sb3dTZWxlY3QpPVwib25Sb3dTZWxlY3QoJGV2ZW50KVwiIGRhdGFLZXk9XCJ1dWlkXCI+XG5cbiAgICAgICBcbiAgICAgIC0tPlxuXG4gIDxwLXRhYmxlIFt2YWx1ZV09XCJhcnRpY3Vsb3NMaXN0XCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiICNkdCBzY3JvbGxIZWlnaHQ9XCI0MDBweFwiIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIiBcbiAgICBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgKG9uUm93U2VsZWN0KT1cImZpbGFTZWxlY2Npb25hZGEoJGV2ZW50KVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgIDx0cj5cbiAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDgwcHhcIiB0cmFuc2xhdGU+Q8OzZGlnbyBVYmljYWNpb248L3RoPlxuICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNzBweFwiIHRyYW5zbGF0ZT5FeGlzdGVuY2lhPC90aD5cbiAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDQwcHhcIiB0cmFuc2xhdGU+VW5pZGFkPC90aD5cbiAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDUwcHhcIiAqbmdJZj1cIm1hbmVqYVVuaWRhZFNlY3VuZGFyaWFcIiB0cmFuc2xhdGU+ZXhpc3RlbmNpYVNlY3VuZGFyaWE8L3RoPlxuICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNDBweFwiICpuZ0lmPVwibWFuZWphVW5pZGFkU2VjdW5kYXJpYVwiIHRyYW5zbGF0ZT5VbmlkYWQ8L3RoPlxuICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogODBweFwiIHRyYW5zbGF0ZT5Dw7NkaWdvPC90aD5cbiAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDEyMHB4XCIgdHJhbnNsYXRlPkRlc2NyaXBjaW9uPC90aD5cbiAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDQwcHhcIiB0cmFuc2xhdGU+PC90aD5cbiAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDgwcHhcIiAqbmdJZj1cImNvbmZpZ3VyYWNpb24udGlwb1ByZWNpbyAhPT0gJ2Nvc3RvJyBcIiB0cmFuc2xhdGU+UHJlY2lvPC90aD5cbiAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDgwcHhcIiAqbmdJZj1cImNvbmZpZ3VyYWNpb24udGlwb1ByZWNpbyAhPT0gJ2Nvc3RvJyBcIiB0cmFuc2xhdGU+UHJlY2lvIDI8L3RoPlxuICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogODBweFwiICpuZ0lmPVwiY29uZmlndXJhY2lvbi50aXBvUHJlY2lvICE9PSAnY29zdG8nIFwiIHRyYW5zbGF0ZT5QcmVjaW8gMzwvdGg+XG4gICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiA4MHB4XCIgKm5nSWY9XCJjb25maWd1cmFjaW9uLnRpcG9QcmVjaW8gIT09ICdjb3N0bycgXCIgdHJhbnNsYXRlPlByZWNpbyA0PC90aD5cbiAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDgwcHhcIiAqbmdJZj1cImNvbmZpZ3VyYWNpb24udGlwb1ByZWNpbyAhPT0gJ2Nvc3RvJyBcIiB0cmFuc2xhdGU+UHJlY2lvIDU8L3RoPlxuICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNDBweFwiICpuZ0lmPVwiY29uZmlndXJhY2lvbi50aXBvUHJlY2lvID09PSAnY29zdG8nIFwiIHRyYW5zbGF0ZT5Nb3ZpbWllbnRvLmNvc3RvPC90aD5cbiAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDQwcHhcIiB0cmFuc2xhdGU+RXhpc3RlbmNpYSBwb3IgVW5pZGFkPC90aD5cbiAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNsYXNpZmljYWRvckxpc3RcIiBzdHlsZT1cIndpZHRoOiA4MHB4XCIgdHJhbnNsYXRlPnt7aXRlbS5kZXNjcmlwY2lvbn19PC90aD5cbiAgICAgIDwvdHI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1yb3dEYXRhIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCI+XG4gICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cInJvd0RhdGFcIj5cbiAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDgwcHg7XCIgKm5nSWY9XCIhcm93RGF0YS51YmljYWNpb25Db2RpZ29cIiB0cmFuc2xhdGU+TW92aW1pZW50by5Ob0FzaWduYWRvPC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDgwcHg7XCIgKm5nSWY9XCJyb3dEYXRhLnViaWNhY2lvbkNvZGlnb1wiPnt7cm93RGF0YS51YmljYWNpb25Db2RpZ299fTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiA3MHB4O1wiPnt7cm93RGF0YS5leGlzdGVuY2lhfX08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogNDBweDtcIj57e3Jvd0RhdGEudW5pZGFkQ29kaWdvfX08L3RkPlxuXG4gICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiA1MHB4O1wiICpuZ0lmPVwibWFuZWphVW5pZGFkU2VjdW5kYXJpYVwiPnt7cm93RGF0YS5leGlzdGVuY2lhU2VjdW5kYXJpYX19PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQwcHg7XCIgKm5nSWY9XCJtYW5lamFVbmlkYWRTZWN1bmRhcmlhXCI+e3tyb3dEYXRhLnVuaWRhZFNlY3VuZGFyaWFDb2RpZ299fTwvdGQ+XG5cbiAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDgwcHg7XCI+e3tyb3dEYXRhLmFydGljdWxvLmNvZGlnb319PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDEyMHB4O1wiPnt7cm93RGF0YS5hcnRpY3Vsby5kZXNjcmlwY2lvbn19PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDQwcHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktZXllXCIgY2xhc3M9XCJ1aS1idXR0b24tcmFpc2VkIHVpLWJ1dHRvbi1wcmltYXJ5XCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblNob3dJbmZvcm1hY2lvbihyb3dEYXRhKVwiPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogODBweDtcIiAqbmdJZj1cImNvbmZpZ3VyYWNpb24udGlwb1ByZWNpbyAhPT0gJ2Nvc3RvJ1wiPnt7cm93RGF0YS5wcmVjaW9Db25JbXB1ZXN0b3MgfCBjdXJyZW5jeSB9fVxuICAgICAgICA8L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogODBweDtcIiAqbmdJZj1cImNvbmZpZ3VyYWNpb24udGlwb1ByZWNpbyAhPT0gJ2Nvc3RvJ1wiPnt7cm93RGF0YS5wcmVjaW8yQ29uSW1wdWVzdG9zIHwgY3VycmVuY3lcbiAgICAgICAgICB9fTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiA4MHB4O1wiICpuZ0lmPVwiY29uZmlndXJhY2lvbi50aXBvUHJlY2lvICE9PSAnY29zdG8nXCI+e3tyb3dEYXRhLnByZWNpbzNDb25JbXB1ZXN0b3MgfCBjdXJyZW5jeVxuICAgICAgICAgIH19PC90ZD5cbiAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6IDgwcHg7XCIgKm5nSWY9XCJjb25maWd1cmFjaW9uLnRpcG9QcmVjaW8gIT09ICdjb3N0bydcIj57e3Jvd0RhdGEucHJlY2lvNENvbkltcHVlc3RvcyB8IGN1cnJlbmN5XG4gICAgICAgICAgfX08L3RkPlxuICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogODBweDtcIiAqbmdJZj1cImNvbmZpZ3VyYWNpb24udGlwb1ByZWNpbyAhPT0gJ2Nvc3RvJ1wiPnt7cm93RGF0YS5wcmVjaW81Q29uSW1wdWVzdG9zIHwgY3VycmVuY3lcbiAgICAgICAgICB9fTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiA0MHB4O1wiICpuZ0lmPVwiY29uZmlndXJhY2lvbi50aXBvUHJlY2lvID09PSAnY29zdG8nIFwiPnt7cm93RGF0YS5wcmVjaW8gfCBjdXJyZW5jeSB9fTwvdGQ+XG4gICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiA0MHB4O1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cganVzdGlmeS1jb250ZW50LWJldHdlZW5cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiByb3dEYXRhLmV4aXN0ZW5jaWFVbmlkYWRlc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy00XCI+PGxhYmVsIGZvcj1cIlwiPnt7aXRlbS51bmlkYWRfY29kaWdvfX08L2xhYmVsPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy00XCI+PGxhYmVsIGZvcj1cIlwiPnt7aXRlbS51bmlkYWRfZXhpc3RlbmNpYSB8IG51bWJlciA6ICcxLjItMid9fTwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90ZD5cbiAgICAgICAgPCEtLSA8dGQgc3R5bGU9XCJ3aWR0aDogNDBweDtcIj48L3RkPiAgIC0tPlxuICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGl0ZW1EYXRhIG9mIHJvd0RhdGEuYXJ0aWN1bG9DbGFzaWZpY2Fkb3JMaXN0XCIgc3R5bGU9XCJ3aWR0aDogODBweDtcIj57e2l0ZW1EYXRhLnZhbG9yfX08L3RkPlxuICAgICAgPC90cj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L3AtdGFibGU+XG5cbiAgPCEtLSAvbmV3IHRhYmxlLS0+XG4gIDwhLS0gXG4gICAgICA8cC10YWJsZSBbKHZhbHVlKV09XCJhcnRpY3Vsb3NMaXN0XCIgcmVzcG9uc2l2ZT1cInRydWVcIiBcbiAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Nb2RlPVwibXVsdGlwbGVcIiAob25Sb3dTZWxlY3QpPVwiZmlsYVNlbGVjY2lvbmFkYSgkZXZlbnQpXCIgIFtzY3JvbGxhYmxlXT1cInRydWVcIiBzY3JvbGxIZWlnaHQ9XCIzNTBweFwiID5cblxuICAgICAgICA8cC1jb2x1bW4gIGhlYWRlcj1cInt7ICdDb2RpZ28gdWJpY2FjaW9uJy50b1N0cmluZygpIHwgdHJhbnNsYXRlfX1cIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWRhdG89XCJyb3dEYXRhXCIgcFRlbXBsYXRlPVwiYm9keVwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cIlwiICpuZ0lmPVwiIWRhdG8udWJpY2FjaW9uQ29kaWdvXCIgIHRyYW5zbGF0ZT4gTW92aW1pZW50by5Ob0FzaWduYWRvIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiXCIgKm5nSWY9XCJkYXRvLnViaWNhY2lvbkNvZGlnb1wiID4ge3sgZGF0by51YmljYWNpb25Db2RpZ28gfX08L2xhYmVsPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC1jb2x1bW4+XG4gICAgICAgIDxwLWNvbHVtbiBmaWVsZD1cInViaWNhY2lvbkNvZGlnb1wiIGhlYWRlcj1cInt7ICdEZXNjcmlwY2lvbiB1YmljYWNpb24nLnRvU3RyaW5nKCkgfCB0cmFuc2xhdGV9fVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZGF0bz1cInJvd0RhdGFcIiBwVGVtcGxhdGU9XCJib2R5XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiXCIgKm5nSWY9XCIhZGF0by51YmljYWNpb25Db2RpZ29cIiAgdHJhbnNsYXRlPiBNb3ZpbWllbnRvLk5vQXNpZ25hZG8gPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJcIiAqbmdJZj1cImRhdG8udWJpY2FjaW9uQ29kaWdvXCIgPiB7eyBkYXRvLnViaWNhY2lvbkNvZGlnbyB9fTwvbGFiZWw+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLWNvbHVtbj5cblxuICAgICAgICA8cC1jb2x1bW4gZmllbGQ9XCJleGlzdGVuY2lhXCIgaGVhZGVyPVwie3snRXhpc3RlbmNpYScgfCB0cmFuc2xhdGV9fVwiPjwvcC1jb2x1bW4+XG4gICAgICAgIDxwLWNvbHVtbiBmaWVsZD1cInVuaWRhZENvZGlnb1wiIGhlYWRlcj1cInt7J1VuaWRhZCcgfCB0cmFuc2xhdGV9fVwiPjwvcC1jb2x1bW4+XG4gICAgICAgIDxwLWNvbHVtbiBmaWVsZD1cInVuaWRhZERlc2NyaXBjaW9uXCIgaGVhZGVyPVwie3snRGVzY3JpcGNpb24gdW5pZGFkJyB8IHRyYW5zbGF0ZX19XCI+PC9wLWNvbHVtbj5cblxuICAgICAgICA8cC1jb2x1bW4gZmllbGQ9XCJleGlzdGVuY2lhU2VjdW5kYXJpYVwiIGhlYWRlcj1cInt7J2V4aXN0ZW5jaWFTZWN1bmRhcmlhJyB8IHRyYW5zbGF0ZX19XCIgKm5nSWY9XCJtYW5lamFVbmlkYWRTZWN1bmRhcmlhXCI+PC9wLWNvbHVtbj5cbiAgICAgICAgPHAtY29sdW1uIGZpZWxkPVwidW5pZGFkU2VjdW5kYXJpYUNvZGlnb1wiIGhlYWRlcj1cInt7J1VuaWRhZCcgfCB0cmFuc2xhdGV9fVwiICpuZ0lmPVwibWFuZWphVW5pZGFkU2VjdW5kYXJpYVwiPjwvcC1jb2x1bW4+XG4gICAgICAgIFxuXG4gICAgICAgIDxwLWNvbHVtbiAqbmdJZj1cImNvbmZpZ3VyYWNpb24udGlwb1ByZWNpbyAhPT0gJ2Nvc3RvJyBcIiAgaGVhZGVyPVwie3snTW92aW1pZW50by5tb3ZpbWllbnRvRGV0YWxsZS5wcmVjaW8nIHwgdHJhbnNsYXRlfX1cIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWRhdG89XCJyb3dEYXRhXCIgcFRlbXBsYXRlPVwiYm9keVwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cIlwiPnt7IGRhdG8ucHJlY2lvQ29uSW1wdWVzdG9zIHwgY3VycmVuY3kgfX08L2xhYmVsPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC1jb2x1bW4+XG4gICAgICAgIDxwLWNvbHVtbiAqbmdJZj1cImNvbmZpZ3VyYWNpb24udGlwb1ByZWNpbyA9PT0gJ2Nvc3RvJyBcIiBoZWFkZXI9XCJ7eydNb3ZpbWllbnRvLmNvc3RvJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtZGF0bz1cInJvd0RhdGFcIiBwVGVtcGxhdGU9XCJib2R5XCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiXCI+e3sgZGF0by5wcmVjaW8gfCBjdXJyZW5jeSB9fTwvbGFiZWw+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLWNvbHVtbj5cblxuXG4gICAgICAgIDxwLWNvbHVtbiBmaWVsZD1cImFydGljdWxvLmNvZGlnb1wiIGhlYWRlcj1cInt7J0NvZGlnbyBhcnRpY3VsbycgfCB0cmFuc2xhdGV9fVwiPjwvcC1jb2x1bW4+XG4gICAgICAgIDxwLWNvbHVtbiBmaWVsZD1cImFydGljdWxvLmRlc2NyaXBjaW9uXCIgaGVhZGVyPVwie3snRGVzY3JpcGNpb24nIHwgdHJhbnNsYXRlfX1cIj48L3AtY29sdW1uPlxuXG5cblxuICAgICAgICA8cC1jb2x1bW4gIGhlYWRlcj1cInt7J0V4aXN0ZW5jaWFQb3JVbmlkYWQnIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1kYXRvPVwicm93RGF0YVwiIHBUZW1wbGF0ZT1cImJvZHlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cganVzdGlmeS1jb250ZW50LWJldHdlZW5cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXRvLmV4aXN0ZW5jaWFVbmlkYWRlc1wiID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy00XCI+PGxhYmVsIGZvcj1cIlwiPnt7aXRlbS51bmlkYWRfY29kaWdvfX08L2xhYmVsPjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTRcIj48bGFiZWwgZm9yPVwiXCI+e3tpdGVtLnVuaWRhZF9leGlzdGVuY2lhIHwgbnVtYmVyIDogJzEuMi0yJ319PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+ICAgICAgICAgICAgIFxuICAgICAgICAgICAgPC9kaXY+ICBcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3AtY29sdW1uPlxuICAgICAgICBcbiAgICAgIDwvcC10YWJsZT5cbiAgICAgIC0tPlxuICA8cC1wYWdpbmF0b3IgW3Jvd3NdPVwicGFnZS5yb3dzXCIgW3RvdGFsUmVjb3Jkc109XCJwYWdlLnRvdGFsXCIgW3BhZ2VMaW5rU2l6ZV09XCI1XCIgKG9uUGFnZUNoYW5nZSk9XCJwYWdpbmEoJGV2ZW50KVwiXG4gICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJbMTAsMjUsNTAsMTAwLDUwMF1cIj48L3AtcGFnaW5hdG9yPlxuICA8IS0tICBcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICAtLT5cbjwvcC1kaWFsb2c+XG48IS0tXG4gIDwvZGl2PiBcbiAgICAgIC0tPlxuPCEtLXRlcm1pbmEgc2VsZWNjaW9uIGRlIGFydGljdWxvcy0tPlxuPCEtLXNlbGVjY2lvbmEgdWJpY2FjaW9uIC0tPlxuPGxpYi1zZWxlY2Npb24tYXJ0aWN1bG8taW5mb3JtYWNpb24gW3Nob3dNb2RhbF09XCJzaG93TW9kYWxJbmZvcm1hY2lvblwiIFthcnRpY3Vsb109XCJhcnRpY3Vsb1NlbGVjdGVkXCJcbiAgKGV2ZW50U2VsZWN0aW9uKT1cIm9uRXZlbnRJbmZvcm1hY2lvbigkZXZlbnQpXCIgKm5nSWY9XCJzaG93TW9kYWxJbmZvcm1hY2lvblwiPlxuPC9saWItc2VsZWNjaW9uLWFydGljdWxvLWluZm9ybWFjaW9uPiJdfQ==
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWNjaW9uYS1hcnRpY3Vsby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcnAtY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc2VsZWNjaW9uYS1hcnRpY3Vsby9zZWxlY2Npb25hLWFydGljdWxvLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VycC1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9zZWxlY2Npb25hLWFydGljdWxvL3NlbGVjY2lvbmEtYXJ0aWN1bG8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUU1RyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7OztBQU8vQyxNQUFNLE9BQU8sMkJBQTJCO0lBTHhDO1FBV1csMkJBQXNCLEdBQWEsS0FBSyxDQUFDO1FBRXhDLHlCQUFvQixHQUF1QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzlELHNCQUFpQixHQUF1QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBSTdELGtCQUFhLEdBQU0sTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hDLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzQyxvQkFBZSxHQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUdsRCxrQkFBYSxHQUFRLEVBQUUsQ0FBQztRQUV4QixZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2Isc0JBQWlCLEdBQVM7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S0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFFSSxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csaUJBQWlCO3NCQUExQixNQUFNO2dCQUVxQixhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFsbWFjZW4gfSBmcm9tICcuLi9hbG1hY2VuL21vZGVscy9BbG1hY2VuJztcbmltcG9ydCB7IFBhZ2luYXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3BhZ2luYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWxtYWNlblNlcnZpY2UgfSBmcm9tICcuLi9hbG1hY2VuL3NlcnZpY2VzL2FsbWFjZW4uc2VydmljZSc7XG5pbXBvcnQgeyBTdG9ja1NlcnZpY2UgfSBmcm9tICcuL3N0b2NrLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc2VsZWNjaW9uYS1hcnRpY3VsbycsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWxlY2Npb25hLWFydGljdWxvLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2VsZWNjaW9uYS1hcnRpY3Vsby5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU2VsZWNjaW9uYUFydGljdWxvQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBjb25maWd1cmFjaW9uIDogYW55O1xuICBASW5wdXQoKSBzaG93QXJ0aWN1bG9zIDogYm9vbGVhbjtcbiAgQElucHV0KCkgbW92aW1pZW50bzogYW55O1xuXG4gIEBJbnB1dCgpIG1hbmVqYVVuaWRhZFNlY3VuZGFyaWEgOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGVtaXRGaWxhU2VsZWNjaW9uYWRhIDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBlbWl0U2hvd0FydGljdWxvcyA6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NhbXBvQnVzcXVlZGEnKSBjYW1wb0J1c3F1ZWRhIDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBwcml2YXRlIF9zdG9ja1NlcnZpY2UgICAgPSBpbmplY3QoU3RvY2tTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfcGFnaW5hdGVTZXJ2aWNlID0gaW5qZWN0KFBhZ2luYXRlU2VydmljZSk7XG4gIHByaXZhdGUgX2FsbWFjZW5TZXJ2aWNlICA9IGluamVjdChBbG1hY2VuU2VydmljZSk7XG5cbiAgYWxtYWNlbkxpc3Q6IEFsbWFjZW5bXTtcbiAgYXJ0aWN1bG9zTGlzdDogYW55ID0gW107XG4gIHBhZ2U6IGFueTtcbiAgb3JkZW5hciA9IFtdO1xuICBidXNxdWVkYUFydGljdWxvcyA6IGFueSA9IHtcbiAgICB0aXBvQnVzcXVlZGEgOiAnJ1xuICB9O1xuICBhbG1hY2VuU2VsZWNjaW9uYWRvOiBhbnk7XG4gIGNhcmdhbmRvID0gZmFsc2U7XG5cbiAgc2hvd01vZGFsOmJvb2xlYW49ZmFsc2U7XG4gIGFydGljdWxvU2VsZWN0ZWQ6YW55O1xuICBzaG93TW9kYWxJbmZvcm1hY2lvbjpib29sZWFuPWZhbHNlO1xuICBzaG93Rmlyc3RUaW1lOmJvb2xlYW49dHJ1ZTtcbiAgY2xhc2lmaWNhZG9yTGlzdDphbnk9W107XG4gIG1heGltaXphZG86Ym9vbGVhbj1mYWxzZTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnBhZ2UgPSB0aGlzLl9wYWdpbmF0ZVNlcnZpY2UuZ2V0UGFnZSgpO1xuICAgIHRoaXMub3JkZW5hciA9IHRoaXMuX3BhZ2luYXRlU2VydmljZS5nZXRPcmRlbihcbiAgICAgIFtcbiAgICAgICAge3BhcmFtOiAnbm9tYnJlJywgbGFiZWw6ICdlc3RhdHVzJ31cbiAgICAgIF0sICdlcycpO1xuXG5cbiAgICB0aGlzLnNob3dGaXJzdFRpbWU9dHJ1ZTtcbiAgICB0aGlzLl9hbG1hY2VuU2VydmljZS5nZXRBbGwoIHRoaXMuY29uZmlndXJhY2lvbi5wYXJhbXMgKS5zdWJzY3JpYmUoXG4gICAgICAoZGF0YTogYW55ICkgPT4ge1xuICAgICAgICB0aGlzLmFsbWFjZW5MaXN0ID0gPEFsbWFjZW5bXT4gZGF0YS5kYXRhO1xuICAgICAgICAvLyBFbCB2YWxvciBzZSByZWFwbGljYSBjdWFuZG8gbGFzIG9wY2lvbmVzIHlhIGV4aXN0ZW4gZW4gZWwgc2VsZWN0XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmFsbWFjZW5TZWxlY2Npb25hZG8gPSB0aGlzLmFsbWFjZW5JZDsgfSk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuYnVzcXVlZGFBcnRpY3Vsb3MudGlwb0J1c3F1ZWRhID0gJ0NEJztcbiAgfVxuXG4gIC8qKiBJZCBkZWwgYWxtYWPDqW4gZGVsIG1vdmltaWVudG87IGFjZXB0YSB0YW50byBpZCBudW3DqXJpY28gY29tbyBvYmpldG8gQWxtYWNlbi4gKi9cbiAgZ2V0IGFsbWFjZW5JZCgpOiBhbnkge1xuICAgIGNvbnN0IGFsbWFjZW4gPSB0aGlzLm1vdmltaWVudG8gPyB0aGlzLm1vdmltaWVudG8uYWxtYWNlbiA6IG51bGw7XG4gICAgcmV0dXJuIChhbG1hY2VuICYmIHR5cGVvZiBhbG1hY2VuID09PSAnb2JqZWN0JykgPyBhbG1hY2VuLmlkIDogYWxtYWNlbjtcbiAgfVxuXG4gIC8qKiBOw7ptZXJvIGRlIGNvbHVtbmFzIHZpc2libGVzIGRlIGxhIHRhYmxhLCBwYXJhIGVsIGNvbHNwYW4gZGVsIGVzdGFkbyB2YWPDrW8uICovXG4gIGdldCB0b3RhbENvbHVtbmFzKCk6IG51bWJlciB7XG4gICAgbGV0IHRvdGFsID0gNjsgLy8gdWJpY2FjacOzbiwgZXhpc3RlbmNpYSwgdW5pZGFkLCBjw7NkaWdvLCBkZXNjcmlwY2nDs24sIGRldGFsbGVcbiAgICBpZiAodGhpcy5tYW5lamFVbmlkYWRTZWN1bmRhcmlhKSB7XG4gICAgICB0b3RhbCArPSAyO1xuICAgIH1cbiAgICB0b3RhbCArPSAodGhpcy5jb25maWd1cmFjaW9uICYmIHRoaXMuY29uZmlndXJhY2lvbi50aXBvUHJlY2lvID09PSAnY29zdG8nKSA/IDEgOiA1O1xuICAgIGlmICh0aGlzLm1vc3RyYXJFeGlzdGVuY2lhUG9yVW5pZGFkKSB7XG4gICAgICB0b3RhbCArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gdG90YWwgKyAodGhpcy5jbGFzaWZpY2Fkb3JMaXN0ID8gdGhpcy5jbGFzaWZpY2Fkb3JMaXN0Lmxlbmd0aCA6IDApO1xuICB9XG5cbiAgLyoqIExhIGNvbHVtbmEgXCJFeGlzdGVuY2lhIHBvciBVbmlkYWRcIiBzb2xvIHNlIG11ZXN0cmEgc2kgYWxnw7puIGFydMOtY3VsbyB0cmFlIGRhdG9zLiAqL1xuICBnZXQgbW9zdHJhckV4aXN0ZW5jaWFQb3JVbmlkYWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy5hcnRpY3Vsb3NMaXN0KSAmJlxuICAgICAgdGhpcy5hcnRpY3Vsb3NMaXN0LnNvbWUoKHJvdzogYW55KSA9PiByb3cuZXhpc3RlbmNpYVVuaWRhZGVzICYmIHJvdy5leGlzdGVuY2lhVW5pZGFkZXMubGVuZ3RoID4gMCk7XG4gIH1cblxuICAvKiogQWx0dXJhIGRlbCBjdWVycG8gZGVsIGRpw6Fsb2dvOiBvY3VwYSBlbCB2aWV3cG9ydCB5IGNyZWNlIGFsIG1heGltaXphci4gKi9cbiAgZ2V0IGVzdGlsb0NvbnRlbmlkbygpOiBhbnkge1xuICAgIGNvbnN0IGJhc2UgPSB7IGRpc3BsYXk6ICdmbGV4JywgJ2ZsZXgtZGlyZWN0aW9uJzogJ2NvbHVtbicsICdtaW4taGVpZ2h0JzogJzAnIH07XG4gICAgcmV0dXJuIHRoaXMubWF4aW1pemFkb1xuICAgICAgPyB7IC4uLmJhc2UsIGZsZXg6ICcxIDEgYXV0bycgfVxuICAgICAgOiB7IC4uLmJhc2UsIGhlaWdodDogJ2NhbGMoOTB2aCAtIDkuNXJlbSknIH07XG4gIH1cblxuICBwYWdpbmEoIGUgKXtcbiAgICB0aGlzLnBhZ2Uucm93cyA9IGUucm93cztcbiAgICB0aGlzLnBhZ2Uub2Zmc2V0ID0gZS5maXJzdDtcbiAgICB0aGlzLm9idGVuZXJFeGlzdGVuY2lhQXJ0aWN1bG9zKCk7XG4gIH1cbiAgb2J0ZW5lckV4aXN0ZW5jaWFBcnRpY3Vsb3NTaG93KCl7XG4gICAgdGhpcy5idXNxdWVkYUFydGljdWxvcy50aXBvQnVzcXVlZGEgPSAnQ0QnO1xuICAgIGlmICh0aGlzLnNob3dGaXJzdFRpbWUpe1xuICAgICAgdGhpcy5vYnRlbmVyRXhpc3RlbmNpYUFydGljdWxvcygpO1xuICAgICAgdGhpcy5zaG93Rmlyc3RUaW1lPWZhbHNlO1xuICAgIH1cbiAgICAvLyBFbCBkacOhbG9nbyB0ZXJtaW5hIGRlIG1vbnRhciBzdSBjb250ZW5pZG8gZGVzcHXDqXMgZGVsIGV2ZW50byBvblNob3dcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNhbXBvQnVzcXVlZGEpIHtcbiAgICAgICAgdGhpcy5jYW1wb0J1c3F1ZWRhLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9idGVuZXJFeGlzdGVuY2lhQXJ0aWN1bG9zKCApIHtcbiAgICBpZiAodGhpcy5idXNxdWVkYUFydGljdWxvcy50aXBvQnVzcXVlZGEgJiYgIXRoaXMuYnVzcXVlZGFBcnRpY3Vsb3Mua2V5KSB7XG4gICAgICAvLyBTaW4gdMOpcm1pbm8gZGUgYsO6c3F1ZWRhIGVsIGJhY2tlbmQgbm8gcmVncmVzYSByZXN1bHRhZG9zXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2FyZ2FuZG8gPSB0cnVlO1xuICAgIHRoaXMuYnVzcXVlZGFBcnRpY3Vsb3MucGFyYW1zID0gdGhpcy5fcGFnaW5hdGVTZXJ2aWNlLmdldFBhcmFtcyggdGhpcy5wYWdlICk7XG4gICAgY29uc3QgcGFyYW1ldHJvcyA9IHtcbiAgICAgIGFsbWFjZW4gICAgICAgICAgICAgOiAoIHRoaXMuY29uZmlndXJhY2lvbi5ub09jdXBhQWxhbWFjZW4gPyBudWxsIDogdGhpcy5tb3ZpbWllbnRvLmFsbWFjZW4gKSxcbiAgICAgIHRpcG9QcmVjaW8gICAgICAgICAgOiB0aGlzLmNvbmZpZ3VyYWNpb24udGlwb1ByZWNpbyxcbiAgICAgIGJ1c3F1ZWRhQXJ0aWN1bG9zICAgOiB0aGlzLmJ1c3F1ZWRhQXJ0aWN1bG9zLFxuICAgICAgdGlwb0FydGljdWxvICAgICAgICA6IHRoaXMuY29uZmlndXJhY2lvbi50aXBvQXJ0aWN1bG8gPyB0aGlzLmNvbmZpZ3VyYWNpb24udGlwb0FydGljdWxvIDogbnVsbCxcbiAgICAgIG51bWVyb1ByZWNpb0RlZmF1bHQgOiB0aGlzLmNvbmZpZ3VyYWNpb24ubnVtZXJvUHJlY2lvRGVmYXVsdFxuICAgIH07XG4gICAgdGhpcy5fc3RvY2tTZXJ2aWNlLm9idGVuZXJFeGlzdGVuY2lhc0FydGljdWxvc0Rlc2NyaXBjaW9uKCBwYXJhbWV0cm9zICwgdGhpcy5idXNxdWVkYUFydGljdWxvcy5wYXJhbXMgKS50aGVuKFxuICAgICAgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFydGljdWxvc0xpc3QgPSBkYXRhLmFydGljdWxvc0Rlc2NyaXBjaW9uO1xuICAgICAgICB0aGlzLnBhZ2UudG90YWwgPSBkYXRhLnRvdGFsO1xuICAgICAgICBpZiAoZGF0YS5jbGFzaWZpY2Fkb3Jlcyl7XG4gICAgICAgICAgdGhpcy5jbGFzaWZpY2Fkb3JMaXN0ID0gZGF0YS5jbGFzaWZpY2Fkb3JlcztcbiAgICAgICAgfVxuICAgICAgICBpZighdGhpcy5zaG93TW9kYWwpe1xuICAgICAgICAgIHRoaXMuc2hvd01vZGFsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhcmdhbmRvID0gZmFsc2U7XG4gICAgICB9XG4gICAgKS5jYXRjaChlID0+e1xuICAgICAgdGhpcy5hcnRpY3Vsb3NMaXN0ID0gIFtdO1xuICAgICAgdGhpcy5wYWdlLnRvdGFsID0gMDtcbiAgICAgIHRoaXMuY2FyZ2FuZG8gPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuICBvYnRlbmVyRXhpc3RlbmNpYUFydGljdWxvc1ZhbCgpe1xuICAgIGlmICggdGhpcy5idXNxdWVkYUFydGljdWxvcy50aXBvQnVzcXVlZGEgIT0gJycgJiYgIXRoaXMuYnVzcXVlZGFBcnRpY3Vsb3Mua2V5IClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHRoaXMub2J0ZW5lckV4aXN0ZW5jaWFBcnRpY3Vsb3MoKTtcbiAgfVxuICBvYnRlbmVyRXhpc3RlbmNpYUFydGljdWxvc0tleSggJGV2ZW50ICkge1xuICAgIGlmKCAkZXZlbnQua2V5ID09PSAnRW50ZXInKVxuICAgICAgdGhpcy5vYnRlbmVyRXhpc3RlbmNpYUFydGljdWxvcygpO1xuICB9XG5cbiAgZmlsYVNlbGVjY2lvbmFkYSggJGV2ZW50ICkge1xuICAgIHRoaXMuZW1pdEZpbGFTZWxlY2Npb25hZGEuZW1pdCgkZXZlbnQpO1xuICB9XG5cbiAgZW1pdGlyU2hvd0FydGljdWxvcygpIHtcbiAgICB0aGlzLmVtaXRTaG93QXJ0aWN1bG9zLmVtaXQoIDAgKTtcbiAgfVxuXG4gIG9uU2hvd0luZm9ybWFjaW9uKGV2ZW50QXJ0aWN1bG8pe1xuICAgIHRoaXMuYXJ0aWN1bG9TZWxlY3RlZCA9IGV2ZW50QXJ0aWN1bG87XG4gICAgdGhpcy5zaG93TW9kYWxJbmZvcm1hY2lvbiA9IHRydWU7XG4gIH1cblxuICBvbkV2ZW50SW5mb3JtYWNpb24oZXZlbnQpIHtcbiAgICB0aGlzLnNob3dNb2RhbEluZm9ybWFjaW9uID0gZXZlbnQuc3RhdHVzO1xuICB9XG59XG4iLCI8IS0taW5pY2lhIHNlbGVjY2lvbiBkZSBhcnRpY3Vsb3MtLT5cbjxwLWRpYWxvZyBoZWFkZXI9XCJ7eyAnQXJ0aWN1bG9zJyB8IHRyYW5zbGF0ZSB9fVwiIFsodmlzaWJsZSldPVwic2hvd0FydGljdWxvc1wiIFttYXhpbWl6YWJsZV09XCJ0cnVlXCJcbiAgKG9uU2hvdyk9XCJvYnRlbmVyRXhpc3RlbmNpYUFydGljdWxvc1Nob3coKVwiIChvbkhpZGUpPVwiYnVzcXVlZGFBcnRpY3Vsb3MgPSB7IHRpcG9CdXNxdWVkYSA6ICcnfTsgZW1pdGlyU2hvd0FydGljdWxvcygpXCJcbiAgKG9uTWF4aW1pemUpPVwibWF4aW1pemFkbyA9ICRldmVudC5tYXhpbWl6ZWRcIlxuICBbYmFzZVpJbmRleF09XCIxMDAwMFwiIFtibG9ja1Njcm9sbF09XCJ0cnVlXCIgW3N0eWxlXT1cInsgd2lkdGg6ICc5NXZ3JyB9XCIgW21pblldPVwiNzBcIlxuICBbY29udGVudFN0eWxlXT1cImVzdGlsb0NvbnRlbmlkb1wiPlxuXG4gIDxkaXYgY2xhc3M9XCJzYS1jdWVycG9cIj5cblxuICAgIDxkaXYgY2xhc3M9XCJncmlkIHNhLWZpbHRyb3NcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWQ6Y29sLTYgeGw6Y29sLTVcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwic2EtZXRpcXVldGFcIiBmb3I9XCJzYS10aXBvLWJ1c3F1ZWRhXCI+QnVzY2FyIHBvcjwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwLWlucHV0Z3JvdXBcIj5cbiAgICAgICAgICA8c2VsZWN0IHBJbnB1dFRleHQgY2xhc3M9XCJzYS10aXBvLWJ1c3F1ZWRhXCIgaWQ9XCJzYS10aXBvLWJ1c3F1ZWRhXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYnVzcXVlZGFBcnRpY3Vsb3MudGlwb0J1c3F1ZWRhXCIgKGNoYW5nZSk9XCJvYnRlbmVyRXhpc3RlbmNpYUFydGljdWxvc1ZhbCgpXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQ1wiPkPDs2RpZ288L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJEXCI+RGVzY3JpcGNpw7NuPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQ0RcIj5Db2luY2lkZW5jaWE8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJDSVwiPklndWFsIGE8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2EtY2FtcG8tYnVzcXVlZGFcIiBpZD1cInNhLWNhbXBvLWJ1c3F1ZWRhXCIgI2NhbXBvQnVzcXVlZGFcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiVMOpcm1pbm8gZGUgYsO6c3F1ZWRhXCIgWyhuZ01vZGVsKV09XCJidXNxdWVkYUFydGljdWxvcy5rZXlcIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib2J0ZW5lckV4aXN0ZW5jaWFBcnRpY3Vsb3MoKVwiPlxuICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLXNlYXJjaFwiIGFyaWEtbGFiZWw9XCJCdXNjYXJcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9idGVuZXJFeGlzdGVuY2lhQXJ0aWN1bG9zKClcIj48L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWQ6Y29sLTYgeGw6Y29sLTVcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwic2EtZXRpcXVldGFcIiBmb3I9XCJzYS1hbG1hY2VuXCI+QWxtYWPDqW48L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IHBJbnB1dFRleHQgY2xhc3M9XCJzYS1hbG1hY2VuXCIgaWQ9XCJzYS1hbG1hY2VuXCIgZGlzYWJsZWQgW25nTW9kZWxdPVwiYWxtYWNlblNlbGVjY2lvbmFkb1wiXG4gICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCI+XG4gICAgICAgICAgQGZvciAoYWxtYWNlbiBvZiBhbG1hY2VuTGlzdDsgdHJhY2sgYWxtYWNlbi5pZCkge1xuICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJhbG1hY2VuLmlkXCI+e3sgYWxtYWNlbi5kZXNjcmlwY2lvbiB9fTwvb3B0aW9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxwLXRhYmxlICNkdCBbdmFsdWVdPVwiYXJ0aWN1bG9zTGlzdFwiIFtzY3JvbGxhYmxlXT1cInRydWVcIiBzY3JvbGxIZWlnaHQ9XCJmbGV4XCIgcmVzcG9uc2l2ZUxheW91dD1cInNjcm9sbFwiXG4gICAgICBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCIgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLXNtXCIgW2xvYWRpbmddPVwiY2FyZ2FuZG9cIiBjbGFzcz1cInNhLXRhYmxhXCJcbiAgICAgIChvblJvd1NlbGVjdCk9XCJmaWxhU2VsZWNjaW9uYWRhKCRldmVudClcIj5cblxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRoIGNsYXNzPVwic2EtY29sLXViaWNhY2lvblwiIHRyYW5zbGF0ZT5Dw7NkaWdvIFViaWNhY2lvbjwvdGg+XG4gICAgICAgICAgPHRoIGNsYXNzPVwic2EtbnVtXCIgdHJhbnNsYXRlPkV4aXN0ZW5jaWE8L3RoPlxuICAgICAgICAgIDx0aCBjbGFzcz1cInNhLWNvbC11bmlkYWRcIiB0cmFuc2xhdGU+VW5pZGFkPC90aD5cbiAgICAgICAgICBAaWYgKG1hbmVqYVVuaWRhZFNlY3VuZGFyaWEpIHtcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInNhLW51bVwiIHRyYW5zbGF0ZT5leGlzdGVuY2lhU2VjdW5kYXJpYTwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJzYS1jb2wtdW5pZGFkXCIgdHJhbnNsYXRlPlVuaWRhZDwvdGg+XG4gICAgICAgICAgfVxuICAgICAgICAgIDx0aCBjbGFzcz1cInNhLWNvbC1jb2RpZ29cIiB0cmFuc2xhdGU+Q8OzZGlnbzwvdGg+XG4gICAgICAgICAgPHRoIGNsYXNzPVwic2EtY29sLWRlc2NyaXBjaW9uXCIgdHJhbnNsYXRlPkRlc2NyaXBjaW9uPC90aD5cbiAgICAgICAgICA8dGggY2xhc3M9XCJzYS1jb2wtYWNjaW9uXCI+PHNwYW4gY2xhc3M9XCJzYS1zci1vbmx5XCI+RGV0YWxsZTwvc3Bhbj48L3RoPlxuICAgICAgICAgIEBpZiAoY29uZmlndXJhY2lvbi50aXBvUHJlY2lvICE9PSAnY29zdG8nKSB7XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJzYS1udW1cIiB0cmFuc2xhdGU+UHJlY2lvPC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInNhLW51bVwiIHRyYW5zbGF0ZT5QcmVjaW8gMjwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJzYS1udW1cIiB0cmFuc2xhdGU+UHJlY2lvIDM8L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwic2EtbnVtXCIgdHJhbnNsYXRlPlByZWNpbyA0PC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInNhLW51bVwiIHRyYW5zbGF0ZT5QcmVjaW8gNTwvdGg+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJzYS1udW1cIiB0cmFuc2xhdGU+TW92aW1pZW50by5jb3N0bzwvdGg+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAobW9zdHJhckV4aXN0ZW5jaWFQb3JVbmlkYWQpIHtcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInNhLWNvbC11bmlkYWRlc1wiIHRyYW5zbGF0ZT5FeGlzdGVuY2lhIHBvciBVbmlkYWQ8L3RoPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAZm9yIChpdGVtIG9mIGNsYXNpZmljYWRvckxpc3Q7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPHRoIGNsYXNzPVwic2EtY29sLWNsYXNpZmljYWRvclwiIHRyYW5zbGF0ZT57eyBpdGVtLmRlc2NyaXBjaW9uIH19PC90aD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdHI+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1yb3dEYXRhPlxuICAgICAgICA8dHIgW3BTZWxlY3RhYmxlUm93XT1cInJvd0RhdGFcIj5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJzYS1jb2wtdWJpY2FjaW9uXCI+XG4gICAgICAgICAgICBAaWYgKHJvd0RhdGEudWJpY2FjaW9uQ29kaWdvKSB7XG4gICAgICAgICAgICAgIHt7IHJvd0RhdGEudWJpY2FjaW9uQ29kaWdvIH19XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYS1zci1vbmx5XCIgdHJhbnNsYXRlPk1vdmltaWVudG8uTm9Bc2lnbmFkbzwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cInNhLW51bVwiPnt7IHJvd0RhdGEuZXhpc3RlbmNpYSB9fTwvdGQ+XG4gICAgICAgICAgPHRkIGNsYXNzPVwic2EtY29sLXVuaWRhZFwiPnt7IHJvd0RhdGEudW5pZGFkQ29kaWdvIH19PC90ZD5cbiAgICAgICAgICBAaWYgKG1hbmVqYVVuaWRhZFNlY3VuZGFyaWEpIHtcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNhLW51bVwiPnt7IHJvd0RhdGEuZXhpc3RlbmNpYVNlY3VuZGFyaWEgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwic2EtY29sLXVuaWRhZFwiPnt7IHJvd0RhdGEudW5pZGFkU2VjdW5kYXJpYUNvZGlnbyB9fTwvdGQ+XG4gICAgICAgICAgfVxuICAgICAgICAgIDx0ZCBjbGFzcz1cInNhLWNvbC1jb2RpZ29cIj57eyByb3dEYXRhLmFydGljdWxvLmNvZGlnbyB9fTwvdGQ+XG4gICAgICAgICAgPHRkIGNsYXNzPVwic2EtY29sLWRlc2NyaXBjaW9uXCIgW3BUb29sdGlwXT1cInJvd0RhdGEuYXJ0aWN1bG8uZGVzY3JpcGNpb25cIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgICAgW3Nob3dEZWxheV09XCI0MDBcIj57eyByb3dEYXRhLmFydGljdWxvLmRlc2NyaXBjaW9uIH19PC90ZD5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJzYS1jb2wtYWNjaW9uXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1leWVcIiBjbGFzcz1cInAtYnV0dG9uLXRleHQgcC1idXR0b24tc20gcC1idXR0b24tcm91bmRlZFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1ZlciBpbmZvcm1hY2nDs24gZGVsIGFydMOtY3VsbyAnICsgcm93RGF0YS5hcnRpY3Vsby5kZXNjcmlwY2lvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblNob3dJbmZvcm1hY2lvbihyb3dEYXRhKVwiPjwvYnV0dG9uPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgQGlmIChjb25maWd1cmFjaW9uLnRpcG9QcmVjaW8gIT09ICdjb3N0bycpIHtcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNhLW51bVwiPnt7IHJvd0RhdGEucHJlY2lvQ29uSW1wdWVzdG9zIHwgY3VycmVuY3kgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwic2EtbnVtXCI+e3sgcm93RGF0YS5wcmVjaW8yQ29uSW1wdWVzdG9zIHwgY3VycmVuY3kgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwic2EtbnVtXCI+e3sgcm93RGF0YS5wcmVjaW8zQ29uSW1wdWVzdG9zIHwgY3VycmVuY3kgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwic2EtbnVtXCI+e3sgcm93RGF0YS5wcmVjaW80Q29uSW1wdWVzdG9zIHwgY3VycmVuY3kgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwic2EtbnVtXCI+e3sgcm93RGF0YS5wcmVjaW81Q29uSW1wdWVzdG9zIHwgY3VycmVuY3kgfX08L3RkPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHRkIGNsYXNzPVwic2EtbnVtXCI+e3sgcm93RGF0YS5wcmVjaW8gfCBjdXJyZW5jeSB9fTwvdGQ+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAobW9zdHJhckV4aXN0ZW5jaWFQb3JVbmlkYWQpIHtcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNhLWNvbC11bmlkYWRlc1wiPlxuICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIHJvd0RhdGEuZXhpc3RlbmNpYVVuaWRhZGVzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2EtdW5pZGFkLWV4aXN0ZW5jaWFcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0udW5pZGFkX2NvZGlnbyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2EtbnVtXCI+e3sgaXRlbS51bmlkYWRfZXhpc3RlbmNpYSB8IG51bWJlciA6ICcxLjItMicgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBmb3IgKGl0ZW1EYXRhIG9mIHJvd0RhdGEuYXJ0aWN1bG9DbGFzaWZpY2Fkb3JMaXN0OyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInNhLWNvbC1jbGFzaWZpY2Fkb3JcIj57eyBpdGVtRGF0YS52YWxvciB9fTwvdGQ+XG4gICAgICAgICAgfVxuICAgICAgICA8L3RyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwidG90YWxDb2x1bW5hc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNhLXZhY2lvXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktc2VhcmNoXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICBAaWYgKGJ1c3F1ZWRhQXJ0aWN1bG9zLmtleSkge1xuICAgICAgICAgICAgICAgIDxwPlNpbiByZXN1bHRhZG9zIHBhcmEgwqt7eyBidXNxdWVkYUFydGljdWxvcy5rZXkgfX3Cuy4gUHJ1ZWJhIGNvbiBvdHJvIHTDqXJtaW5vIG8gdGlwbyBkZSBiw7pzcXVlZGEuPC9wPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8cD5Fc2NyaWJlIHVuIHTDqXJtaW5vIGRlIGLDunNxdWVkYSB5IHByZXNpb25hIDxzdHJvbmc+QnVzY2FyPC9zdHJvbmc+IHBhcmEgY29uc3VsdGFyIGxhIGV4aXN0ZW5jaWEgZGVcbiAgICAgICAgICAgICAgICAgIGFydMOtY3Vsb3MuPC9wPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDwvcC10YWJsZT5cblxuICAgIDxwLXBhZ2luYXRvciBbcm93c109XCJwYWdlLnJvd3NcIiBbdG90YWxSZWNvcmRzXT1cInBhZ2UudG90YWxcIiBbcGFnZUxpbmtTaXplXT1cIjVcIiAob25QYWdlQ2hhbmdlKT1cInBhZ2luYSgkZXZlbnQpXCJcbiAgICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiWzEwLDI1LDUwLDEwMCw1MDBdXCI+PC9wLXBhZ2luYXRvcj5cblxuICA8L2Rpdj5cbjwvcC1kaWFsb2c+XG48IS0tdGVybWluYSBzZWxlY2Npb24gZGUgYXJ0aWN1bG9zLS0+XG48IS0tc2VsZWNjaW9uYSB1YmljYWNpb24gLS0+XG5AaWYgKHNob3dNb2RhbEluZm9ybWFjaW9uKSB7XG4gIDxsaWItc2VsZWNjaW9uLWFydGljdWxvLWluZm9ybWFjaW9uIFtzaG93TW9kYWxdPVwic2hvd01vZGFsSW5mb3JtYWNpb25cIiBbYXJ0aWN1bG9dPVwiYXJ0aWN1bG9TZWxlY3RlZFwiXG4gICAgKGV2ZW50U2VsZWN0aW9uKT1cIm9uRXZlbnRJbmZvcm1hY2lvbigkZXZlbnQpXCI+XG4gIDwvbGliLXNlbGVjY2lvbi1hcnRpY3Vsby1pbmZvcm1hY2lvbj5cbn1cbiJdfQ==
|
|
@@ -4,13 +4,16 @@ import { catchError, tap } from 'rxjs/operators';
|
|
|
4
4
|
import { ToastrService } from 'ngx-toastr';
|
|
5
5
|
import { LoginModalService } from '../components/login-modal/login-modal.service';
|
|
6
6
|
import { LoadingScreenService } from '../components/loading-screen/loading-screen.service';
|
|
7
|
+
import { AuthService } from '../../public_api';
|
|
7
8
|
import * as i0 from "@angular/core";
|
|
8
9
|
import * as i1 from "../components/login-modal/login-modal.service";
|
|
9
|
-
import * as i2 from "
|
|
10
|
-
import * as i3 from "
|
|
10
|
+
import * as i2 from "../../public_api";
|
|
11
|
+
import * as i3 from "ngx-toastr";
|
|
12
|
+
import * as i4 from "../components/loading-screen/loading-screen.service";
|
|
11
13
|
export class httpInterceptor {
|
|
12
|
-
constructor(loginModalService, toastrService, loadingScreenService) {
|
|
14
|
+
constructor(loginModalService, authService, toastrService, loadingScreenService) {
|
|
13
15
|
this.loginModalService = loginModalService;
|
|
16
|
+
this.authService = authService;
|
|
14
17
|
this.toastrService = toastrService;
|
|
15
18
|
this.loadingScreenService = loadingScreenService;
|
|
16
19
|
}
|
|
@@ -41,7 +44,13 @@ export class httpInterceptor {
|
|
|
41
44
|
if (err.status === 401) {
|
|
42
45
|
//this.router.navigateByUrl('/login');
|
|
43
46
|
// this.router.navigateByUrl('/sing_out');
|
|
44
|
-
this.loginModalService.showModal();
|
|
47
|
+
// this.loginModalService.showModal();
|
|
48
|
+
// Solo cierra la sesión local: loginOut() dispararía un POST con el
|
|
49
|
+
// token ya vencido, ese POST también daría 401 y se entraría en bucle.
|
|
50
|
+
// El isLogin() evita repetir el cierre con 401 paralelos.
|
|
51
|
+
if (this.authService.isLogin()) {
|
|
52
|
+
this.authService.quitarUsuario();
|
|
53
|
+
}
|
|
45
54
|
}
|
|
46
55
|
if (err.status === 403)
|
|
47
56
|
this.toastrService.error('No tiene permiso sobre esta accion', 'Error', {
|
|
@@ -81,10 +90,10 @@ export class httpInterceptor {
|
|
|
81
90
|
}
|
|
82
91
|
}
|
|
83
92
|
}
|
|
84
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: httpInterceptor, deps: [{ token: i1.LoginModalService }, { token: i2.
|
|
93
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: httpInterceptor, deps: [{ token: i1.LoginModalService }, { token: i2.AuthService }, { token: i3.ToastrService }, { token: i4.LoadingScreenService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
85
94
|
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: httpInterceptor }); }
|
|
86
95
|
}
|
|
87
96
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: httpInterceptor, decorators: [{
|
|
88
97
|
type: Injectable
|
|
89
|
-
}], ctorParameters: () => [{ type: i1.LoginModalService }, { type: i2.
|
|
90
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
98
|
+
}], ctorParameters: () => [{ type: i1.LoginModalService }, { type: i2.AuthService }, { type: i3.ToastrService }, { type: i4.LoadingScreenService }] });
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cEludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXJwLWNvcmUvc3JjL2xpYi9odHRwSW50ZXJjZXB0b3IvaHR0cEludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFPM0MsT0FBTyxFQUFjLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7O0FBRy9DLE1BQU0sT0FBTyxlQUFlO0lBQ3hCLFlBQ1ksaUJBQW9DLEVBQ3BDLFdBQXdCLEVBQ3ZCLGFBQTRCLEVBQy9CLG9CQUEyQztRQUh6QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3ZCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQy9CLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBdUI7SUFFckQsQ0FBQztJQUVELFNBQVMsQ0FBQyxPQUF5QixFQUFFLElBQWlCO1FBRW5ELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFBLCtCQUErQjtRQUN2RSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMxRCxJQUFJLENBQUMsb0JB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QUFJO3FCQUNoQixDQUFDLENBQUM7Z0JBQ1AsQ0FBQztZQUNELElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUMsQ0FBQztnQkFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFO29CQUN2RCxPQUFPLEVBQUUsSUFBSTtpQkFDaEIsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztZQUVELElBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUMsQ0FBQztnQkFDeEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO29CQUMxQyxLQUFLLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRSxVQUFVLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUM7d0JBQ2pGLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUU7NEJBQzNFLE9BQU8sRUFBRSxJQUFJOzRCQUNiLFdBQVcsRUFBRSxJQUFJO3lCQUNwQixDQUFDLENBQUM7b0JBQ1AsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO0lBRUwsQ0FBQztrSUF2RlEsZUFBZTtzSUFBZixlQUFlOzs0RkFBZixlQUFlO2tCQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBIdHRwUmVxdWVzdCxcbiAgICBIdHRwSGFuZGxlcixcbiAgICBIdHRwRXZlbnQsXG4gICAgSHR0cEludGVyY2VwdG9yLCBIdHRwRXJyb3JSZXNwb25zZVxufSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgeyBMb2dpbk1vZGFsU2VydmljZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvbG9naW4tbW9kYWwvbG9naW4tbW9kYWwuc2VydmljZSc7XG5pbXBvcnQgeyBMb2FkaW5nU2NyZWVuU2VydmljZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvbG9hZGluZy1zY3JlZW4vbG9hZGluZy1zY3JlZW4uc2VydmljZSc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL3B1YmxpY19hcGknO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgaHR0cEludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBsb2dpbk1vZGFsU2VydmljZTogTG9naW5Nb2RhbFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxuICAgICAgICAgcHJpdmF0ZSB0b2FzdHJTZXJ2aWNlOiBUb2FzdHJTZXJ2aWNlLFxuICAgICAgcHJpdmF0ZSBsb2FkaW5nU2NyZWVuU2VydmljZSA6IExvYWRpbmdTY3JlZW5TZXJ2aWNlXG4gICAgICAgICApIHtcbiAgICB9XG5cbiAgICBpbnRlcmNlcHQocmVxdWVzdDogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG5cbiAgICAgICB0aGlzLmxvYWRpbmdTY3JlZW5TZXJ2aWNlLnN0YXJ0TG9hZGluZygpOy8vIHRoaXMubG9hZGluZ1NlcnZpY2Uuc3RhcnQoKTtcbiAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3QpLnBpcGUoY2F0Y2hFcnJvcigoZXJyb3IsIGNhdWdodCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU2NyZWVuU2VydmljZS5zdG9wTG9hZGluZygpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XG4gICAgICAgIH0pIGFzIGFueSwgdGFwKChyZXMgOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSAocmVzLmJvZHkpID8gcmVzLmJvZHkgOiBudWxsO1xuICAgICAgICAgICAgaWYocmVzLnR5cGUgIT09IDAgICYmICByZXMudHlwZSA9PT0gNCl7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdTY3JlZW5TZXJ2aWNlLnN0b3BMb2FkaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYm9keSkge1xuICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gKGJvZHkuc3VjY2VzcykgPyBib2R5LnN1Y2Nlc3MgOiBudWxsO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnN1Y2Nlc3MobWVzc2FnZSwgJ0V4aXRvJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZU91dDogMzAwMCwgY2xvc2VCdXR0b246IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSBhcyBhbnkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGlmIChlcnIuc3RhdHVzID09PSA0MDEgfHwgZXJyLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICBpZiAoZXJyLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICAgICAgLy90aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCcvbG9naW4nKTtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCcvc2luZ19vdXQnKTtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmxvZ2luTW9kYWxTZXJ2aWNlLnNob3dNb2RhbCgpO1xuICAgICAgICAgICAgICAgIC8vIFNvbG8gY2llcnJhIGxhIHNlc2nDs24gbG9jYWw6IGxvZ2luT3V0KCkgZGlzcGFyYXLDrWEgdW4gUE9TVCBjb24gZWxcbiAgICAgICAgICAgICAgICAvLyB0b2tlbiB5YSB2ZW5jaWRvLCBlc2UgUE9TVCB0YW1iacOpbiBkYXLDrWEgNDAxIHkgc2UgZW50cmFyw61hIGVuIGJ1Y2xlLlxuICAgICAgICAgICAgICAgIC8vIEVsIGlzTG9naW4oKSBldml0YSByZXBldGlyIGVsIGNpZXJyZSBjb24gNDAxIHBhcmFsZWxvcy5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRoU2VydmljZS5pc0xvZ2luKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5xdWl0YXJVc3VhcmlvKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDQwMylcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5lcnJvcignTm8gdGllbmUgcGVybWlzbyBzb2JyZSBlc3RhIGFjY2lvbicsICdFcnJvcicsIHtcbiAgICAgICAgICAgICAgICB0aW1lT3V0OiA1MDAwXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBvZihlcnIubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIGlmKGVyci5zdGF0dXMgIT09IDQwMSAmJiBlcnIuc3RhdHVzICE9PSA0MDMgJiYgZXJyLnN0YXR1cyAhPT0gNDA5KXtcbiAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLmVycm9yKCdPY3VycmlvIHVuIGVycm9yIGFsIHByb2Nlc2FyIHN1IHNvbGljaXR1ZCcsICdFcnJvcicsIHtcbiAgICAgICAgICB0aW1lT3V0OiA1MDAwXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgICB0aGlzLnJlYWRFcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gb2YoZXJyKTtcbiAgICB9XG5cbiAgICByZWFkRXJyb3IocmVzcHVlc3RhOiBhbnkpIHtcbiAgICAgICAgaWYocmVzcHVlc3RhLmVycm9yKXtcbiAgICAgICAgICAgIGlmIChyZXNwdWVzdGEuZXJyb3IuZXJyb3IpXG4gICAgICAgICAgICBpZiAocmVzcHVlc3RhLmVycm9yLmVycm9yLm1lc3NhZ2Upe1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5lcnJvcihyZXNwdWVzdGEuZXJyb3IuZXJyb3IubWVzc2FnZSwgJ0Vycm9yJywge1xuICAgICAgICAgICAgICAgICAgICB0aW1lT3V0OiAzMDAwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzcHVlc3RhLmVycm9yLm1lc3NhZ2Upe1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5lcnJvcihyZXNwdWVzdGEuZXJyb3IubWVzc2FnZSwgJ0Vycm9yJywge1xuICAgICAgICAgICAgICAgICAgICB0aW1lT3V0OiAzMDAwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKHJlc3B1ZXN0YS5lcnJvci5fZXJyb3JzKXtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNwdWVzdGEuZXJyb3IuX2Vycm9ycykpXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXhFcnJvciA9IDA7IGluZGV4RXJyb3IgPCByZXNwdWVzdGEuZXJyb3IuX2Vycm9ycy5sZW5ndGg7IGluZGV4RXJyb3IrKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2UuZXJyb3IocmVzcHVlc3RhLmVycm9yLl9lcnJvcnNbaW5kZXhFcnJvcl0ubWVzc2FnZSwgJ0Vycm9yJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZU91dDogMzAwMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlQnV0dG9uOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG59XG4iXX0=
|