UNPKG

systelab-components

Version:

systelab-components is a set of components that use wide accepted and adopted standard technologies like Angular and Bootstrap, as well as other popular libraries. Please read the ATTRIBUTION.md file for a complete list of dependencies.

85 lines 23.7 kB
import { Component, ViewChild } from '@angular/core'; import { SearcherTableComponent } from './searcher.table.component'; import * as i0 from "@angular/core"; import * as i1 from "../modal/dialog/dialog-ref"; import * as i2 from "systelab-translate"; import * as i3 from "@angular/common"; import * as i4 from "@angular/forms"; import * as i5 from "../button/button.component"; import * as i6 from "./searcher.table.component"; import * as i7 from "../modal/header/dialog-header.component"; import * as i8 from "../modal/bottom/dialog-bottom.component"; import * as i9 from "../directives/keyup-debounce.directive"; export class SearcherDialog { constructor(dialog, i18nService) { this.dialog = dialog; this.i18nService = i18nService; this.multipleSelection = false; this.searchByContains = false; this.parameters = dialog.context; this.searchingValue = this.parameters.valueToSearch; this.searchByContains = !this.parameters.searchByStartWithAsDefault; this.showClose = this.parameters.showCloseButton; if (!this.parameters.showCloseButton) { this.parameters.isBlocking = true; this.parameters.keyboard = null; } if (this.parameters.searcher) { this.searchLabel = this.parameters.searcher.getTextForSearcherLabel(); this.titleForDialog = this.parameters.searcher.getTitleForDialog(); this.multipleSelection = this.parameters.searcher.multipleSelection; } } ngAfterViewInit() { this.setFocusToInput(); } setFocusToInput() { this.refreshSearch(); setTimeout(() => this.valueToSearchInput?.nativeElement.focus(), 100); } close() { this.dialog.close(); } submit() { if (this.parameters.searcher.multipleSelection) { this.dialog.close(this.parameters.searcher.multipleSelectedItemList); } else { this.dialog.close(this.tableComponent.getSelectedElements()); } } setFocusToGrid(event) { event.preventDefault(); this.valueToSearchInput?.nativeElement.blur(); this.tableComponent.focusFirstRow(); } refreshSearch() { this.tableComponent.refreshTable(); } selectOnClick(data) { if (!this.multipleSelection) { if (data) { const arr = new Array(); arr.push(data); this.dialog.close(arr); } } } getSelectedElements() { return this.parameters.showSelectedRowsInSubmitButton && this.parameters.searcher.multipleSelectedItemList?.length > 0 ? ` (${this.parameters.searcher.multipleSelectedItemList.length})` : ''; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: SearcherDialog, deps: [{ token: i1.DialogRef }, { token: i2.I18nService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.9", type: SearcherDialog, selector: "systelab-searcher-dialog", viewQueries: [{ propertyName: "tableComponent", first: true, predicate: SearcherTableComponent, descendants: true }, { propertyName: "valueToSearchInput", first: true, predicate: ["valueToSearchInput"], descendants: true }], ngImport: i0, template: "<systelab-dialog-header [withClose]=\"showClose || multipleSelection\" (close)=\"close()\">{{titleForDialog}}\n</systelab-dialog-header>\n\n<div (keydown)=\"(($event.keyCode===13)?$event.preventDefault():0)\"\n class=\"slab-flex-1 d-flex flex-column flex-nowrap slab-searcher-dialog-container\">\n\n <form class=\"d-flex p-3\">\n <div class=\"d-flex slab-flex-1 border rounded\">\n <div class=\"d-flex border-right pb-1\">\n <div class=\"slab-first-option ml-3 mr-2\">\n <input name=\"status-searchby1\" type=\"radio\" id=\"status-searchby-starts\"\n [(ngModel)]=\"searchByContains\" [value]=\"false\"\n (ngModelChange)=\"setFocusToInput()\">\n <label for=\"status-searchby-starts\">{{ 'COMMON_STARTS_WITH' | translate | async}}</label>\n </div>\n <div class=\"slab-second-option ml-2 mr-3\">\n <input name=\"status-searchby2\" type=\"radio\" id=\"status-searchby-contains\"\n [(ngModel)]=\"searchByContains\" [value]=\"true\"\n (ngModelChange)=\"setFocusToInput()\">\n <label for=\"status-searchby-contains\">{{ 'COMMON_CONTAINS' | translate | async}}</label>\n </div>\n </div>\n <div class=\"slab-input d-flex slab-flex-1\">\n <input type=\"text\" class=\"slab-flex-1 slab-searcher-dialog-search-text\" #valueToSearchInput id=\"valueToSearch\"\n keyup-debounce\n [keyupDebounceTime]=\"parameters.debounceTime\"\n (keyupDebounced)=\"refreshSearch()\" (keydown.tab)=\"setFocusToGrid($event)\"\n placeholder=\"{{'COMMON_SEARCH' | translate | async}}\"\n [(ngModel)]=\"searchingValue\" name=\"valueToSearch\" autocomplete=\"off\">\n </div>\n </div>\n </form>\n\n <div class=\"slab-flex-1 d-flex\">\n <systelab-internal-searcher-table class=\"slab-flex-1 position-relative\" name=\"searcherTable\"\n [contains]=\"searchByContains\"\n [showChecks]=\"multipleSelection\"\n [multipleSelection]=\"multipleSelection\"\n [valueForSearch]=\"searchingValue\"\n [searcher]=\"parameters.searcher\"\n (clickRow)=\"selectOnClick($event)\"></systelab-internal-searcher-table>\n </div>\n</div>\n<systelab-dialog-bottom *ngIf=\"multipleSelection\" class=\"slab-searcher-dialog-button\">\n <systelab-button type=\"primary\" class=\"ml-auto\" (action)=\"submit()\">{{ 'COMMON_OK' | translate | async }}{{getSelectedElements()}}</systelab-button>\n</systelab-dialog-bottom>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.ButtonComponent, selector: "systelab-button", inputs: ["disabled", "type", "size"], outputs: ["action"] }, { kind: "component", type: i6.SearcherTableComponent, selector: "systelab-internal-searcher-table", inputs: ["valueForSearch", "contains", "searcher"] }, { kind: "component", type: i7.DialogHeaderComponent, selector: "systelab-dialog-header", inputs: ["withClose", "withInfo", "withProgressBar", "withTextProgressBar", "withHome", "withMinimize", "withDrag"], outputs: ["close", "info", "home", "minimize"] }, { kind: "component", type: i8.DialogBottomComponent, selector: "systelab-dialog-bottom" }, { kind: "directive", type: i9.KeyupDebounceDirective, selector: "[keyup-debounce]", inputs: ["keyupDebounceTime"], outputs: ["keyupDebounced"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.GeneralTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: SearcherDialog, decorators: [{ type: Component, args: [{ selector: 'systelab-searcher-dialog', template: "<systelab-dialog-header [withClose]=\"showClose || multipleSelection\" (close)=\"close()\">{{titleForDialog}}\n</systelab-dialog-header>\n\n<div (keydown)=\"(($event.keyCode===13)?$event.preventDefault():0)\"\n class=\"slab-flex-1 d-flex flex-column flex-nowrap slab-searcher-dialog-container\">\n\n <form class=\"d-flex p-3\">\n <div class=\"d-flex slab-flex-1 border rounded\">\n <div class=\"d-flex border-right pb-1\">\n <div class=\"slab-first-option ml-3 mr-2\">\n <input name=\"status-searchby1\" type=\"radio\" id=\"status-searchby-starts\"\n [(ngModel)]=\"searchByContains\" [value]=\"false\"\n (ngModelChange)=\"setFocusToInput()\">\n <label for=\"status-searchby-starts\">{{ 'COMMON_STARTS_WITH' | translate | async}}</label>\n </div>\n <div class=\"slab-second-option ml-2 mr-3\">\n <input name=\"status-searchby2\" type=\"radio\" id=\"status-searchby-contains\"\n [(ngModel)]=\"searchByContains\" [value]=\"true\"\n (ngModelChange)=\"setFocusToInput()\">\n <label for=\"status-searchby-contains\">{{ 'COMMON_CONTAINS' | translate | async}}</label>\n </div>\n </div>\n <div class=\"slab-input d-flex slab-flex-1\">\n <input type=\"text\" class=\"slab-flex-1 slab-searcher-dialog-search-text\" #valueToSearchInput id=\"valueToSearch\"\n keyup-debounce\n [keyupDebounceTime]=\"parameters.debounceTime\"\n (keyupDebounced)=\"refreshSearch()\" (keydown.tab)=\"setFocusToGrid($event)\"\n placeholder=\"{{'COMMON_SEARCH' | translate | async}}\"\n [(ngModel)]=\"searchingValue\" name=\"valueToSearch\" autocomplete=\"off\">\n </div>\n </div>\n </form>\n\n <div class=\"slab-flex-1 d-flex\">\n <systelab-internal-searcher-table class=\"slab-flex-1 position-relative\" name=\"searcherTable\"\n [contains]=\"searchByContains\"\n [showChecks]=\"multipleSelection\"\n [multipleSelection]=\"multipleSelection\"\n [valueForSearch]=\"searchingValue\"\n [searcher]=\"parameters.searcher\"\n (clickRow)=\"selectOnClick($event)\"></systelab-internal-searcher-table>\n </div>\n</div>\n<systelab-dialog-bottom *ngIf=\"multipleSelection\" class=\"slab-searcher-dialog-button\">\n <systelab-button type=\"primary\" class=\"ml-auto\" (action)=\"submit()\">{{ 'COMMON_OK' | translate | async }}{{getSelectedElements()}}</systelab-button>\n</systelab-dialog-bottom>\n" }] }], ctorParameters: () => [{ type: i1.DialogRef }, { type: i2.I18nService }], propDecorators: { tableComponent: [{ type: ViewChild, args: [SearcherTableComponent, { static: false }] }], valueToSearchInput: [{ type: ViewChild, args: ['valueToSearchInput'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoZXIuZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N5c3RlbGFiLWNvbXBvbmVudHMvc3JjL2xpYi9zZWFyY2hlci9zZWFyY2hlci5kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3lzdGVsYWItY29tcG9uZW50cy9zcmMvbGliL3NlYXJjaGVyL3NlYXJjaGVyLmRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7O0FBVXBFLE1BQU0sT0FBTyxjQUFjO0lBZTFCLFlBQW1CLE1BQThDLEVBQVksV0FBd0I7UUFBbEYsV0FBTSxHQUFOLE1BQU0sQ0FBd0M7UUFBWSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUw5RixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFHMUIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQ3BELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsMEJBQTBCLENBQUM7UUFFcEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUU7WUFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztTQUNoQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ3RFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNuRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7U0FDcEU7SUFDRixDQUFDO0lBRU0sZUFBZTtRQUNyQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVNLGVBQWU7UUFDckIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFTSxLQUFLO1FBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU0sTUFBTTtRQUNaLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUU7WUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUNyRTthQUFNO1lBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7U0FDN0Q7SUFDRixDQUFDO0lBRU0sY0FBYyxDQUFDLEtBQW1CO1FBQ3hDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUE7SUFDcEMsQ0FBQztJQUVNLGFBQWE7UUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU0sYUFBYSxDQUFDLElBQU87UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUM1QixJQUFJLElBQUksRUFBRTtnQkFDVCxNQUFNLEdBQUcsR0FBYSxJQUFJLEtBQUssRUFBSyxDQUFDO2dCQUNyQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZCO1NBQ0Q7SUFDRixDQUFDO0lBRU0sbUJBQW1CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyw4QkFBOEIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkgsS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3hFLENBQUM7OEdBN0VXLGNBQWM7a0dBQWQsY0FBYyxnSEFFZixzQkFBc0IsMkpDYmxDLHU0RkE4Q0E7OzJGRG5DYSxjQUFjO2tCQUoxQixTQUFTOytCQUNDLDBCQUEwQjt3R0FLdUIsY0FBYztzQkFBeEUsU0FBUzt1QkFBQyxzQkFBc0IsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7Z0JBQ1Ysa0JBQWtCO3NCQUF6RCxTQUFTO3VCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTZWFyY2hlclRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi9zZWFyY2hlci50YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICdzeXN0ZWxhYi10cmFuc2xhdGUnO1xuaW1wb3J0IHsgTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9tb2RhbC9kaWFsb2cvbW9kYWwtY29udGV4dCc7XG5pbXBvcnQgeyBEaWFsb2dSZWYgfSBmcm9tICcuLi9tb2RhbC9kaWFsb2cvZGlhbG9nLXJlZic7XG5pbXBvcnQgeyBTZWFyY2hlckRpYWxvZ1BhcmFtZXRlcnMgfSBmcm9tICcuL3NlYXJjaGVyLmRpYWxvZy5wYXJhbWV0ZXJzJztcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnc3lzdGVsYWItc2VhcmNoZXItZGlhbG9nJyxcblx0dGVtcGxhdGVVcmw6ICdzZWFyY2hlci5kaWFsb2cuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFNlYXJjaGVyRGlhbG9nPFQ+IGltcGxlbWVudHMgTW9kYWxDb21wb25lbnQ8U2VhcmNoZXJEaWFsb2dQYXJhbWV0ZXJzPFQ+PiwgQWZ0ZXJWaWV3SW5pdCB7XG5cblx0QFZpZXdDaGlsZChTZWFyY2hlclRhYmxlQ29tcG9uZW50LCB7c3RhdGljOiBmYWxzZX0pIHB1YmxpYyB0YWJsZUNvbXBvbmVudDogU2VhcmNoZXJUYWJsZUNvbXBvbmVudDxUPjtcblx0QFZpZXdDaGlsZCgndmFsdWVUb1NlYXJjaElucHV0JykgcHVibGljIHZhbHVlVG9TZWFyY2hJbnB1dDogRWxlbWVudFJlZjtcblxuXHRwdWJsaWMgcGFyYW1ldGVyczogU2VhcmNoZXJEaWFsb2dQYXJhbWV0ZXJzPFQ+O1xuXHRwdWJsaWMgc2VhcmNoaW5nVmFsdWU6IHN0cmluZztcblxuXHRwdWJsaWMgc2VhcmNoTGFiZWw6IHN0cmluZztcblx0cHVibGljIHRpdGxlRm9yRGlhbG9nOiBzdHJpbmc7XG5cdHB1YmxpYyBtdWx0aXBsZVNlbGVjdGlvbiA9IGZhbHNlO1xuXHRwdWJsaWMgc2hvd0Nsb3NlOiBib29sZWFuO1xuXG5cdHB1YmxpYyBzZWFyY2hCeUNvbnRhaW5zID0gZmFsc2U7XG5cblx0Y29uc3RydWN0b3IocHVibGljIGRpYWxvZzogRGlhbG9nUmVmPFNlYXJjaGVyRGlhbG9nUGFyYW1ldGVyczxUPj4sIHByb3RlY3RlZCBpMThuU2VydmljZTogSTE4blNlcnZpY2UpIHtcblx0XHR0aGlzLnBhcmFtZXRlcnMgPSBkaWFsb2cuY29udGV4dDtcblx0XHR0aGlzLnNlYXJjaGluZ1ZhbHVlID0gdGhpcy5wYXJhbWV0ZXJzLnZhbHVlVG9TZWFyY2g7XG5cdFx0dGhpcy5zZWFyY2hCeUNvbnRhaW5zID0gIXRoaXMucGFyYW1ldGVycy5zZWFyY2hCeVN0YXJ0V2l0aEFzRGVmYXVsdDtcblxuXHRcdHRoaXMuc2hvd0Nsb3NlID0gdGhpcy5wYXJhbWV0ZXJzLnNob3dDbG9zZUJ1dHRvbjtcblx0XHRpZiAoIXRoaXMucGFyYW1ldGVycy5zaG93Q2xvc2VCdXR0b24pIHtcblx0XHRcdHRoaXMucGFyYW1ldGVycy5pc0Jsb2NraW5nID0gdHJ1ZTtcblx0XHRcdHRoaXMucGFyYW1ldGVycy5rZXlib2FyZCA9IG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMucGFyYW1ldGVycy5zZWFyY2hlcikge1xuXHRcdFx0dGhpcy5zZWFyY2hMYWJlbCA9IHRoaXMucGFyYW1ldGVycy5zZWFyY2hlci5nZXRUZXh0Rm9yU2VhcmNoZXJMYWJlbCgpO1xuXHRcdFx0dGhpcy50aXRsZUZvckRpYWxvZyA9IHRoaXMucGFyYW1ldGVycy5zZWFyY2hlci5nZXRUaXRsZUZvckRpYWxvZygpO1xuXHRcdFx0dGhpcy5tdWx0aXBsZVNlbGVjdGlvbiA9IHRoaXMucGFyYW1ldGVycy5zZWFyY2hlci5tdWx0aXBsZVNlbGVjdGlvbjtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuc2V0Rm9jdXNUb0lucHV0KCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0Rm9jdXNUb0lucHV0KCk6IHZvaWQge1xuXHRcdHRoaXMucmVmcmVzaFNlYXJjaCgpO1xuXHRcdHNldFRpbWVvdXQoKCkgPT4gdGhpcy52YWx1ZVRvU2VhcmNoSW5wdXQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKSwgMTAwKTtcblx0fVxuXG5cdHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcblx0XHR0aGlzLmRpYWxvZy5jbG9zZSgpO1xuXHR9XG5cblx0cHVibGljIHN1Ym1pdCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5wYXJhbWV0ZXJzLnNlYXJjaGVyLm11bHRpcGxlU2VsZWN0aW9uKSB7XG5cdFx0XHR0aGlzLmRpYWxvZy5jbG9zZSh0aGlzLnBhcmFtZXRlcnMuc2VhcmNoZXIubXVsdGlwbGVTZWxlY3RlZEl0ZW1MaXN0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5kaWFsb2cuY2xvc2UodGhpcy50YWJsZUNvbXBvbmVudC5nZXRTZWxlY3RlZEVsZW1lbnRzKCkpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRGb2N1c1RvR3JpZChldmVudDpLZXlib2FyZEV2ZW50KTogdm9pZCB7XG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHR0aGlzLnZhbHVlVG9TZWFyY2hJbnB1dD8ubmF0aXZlRWxlbWVudC5ibHVyKCk7XG5cdFx0dGhpcy50YWJsZUNvbXBvbmVudC5mb2N1c0ZpcnN0Um93KClcblx0fVxuXG5cdHB1YmxpYyByZWZyZXNoU2VhcmNoKCk6IHZvaWQge1xuXHRcdHRoaXMudGFibGVDb21wb25lbnQucmVmcmVzaFRhYmxlKCk7XG5cdH1cblxuXHRwdWJsaWMgc2VsZWN0T25DbGljayhkYXRhOiBUKSB7XG5cdFx0aWYgKCF0aGlzLm11bHRpcGxlU2VsZWN0aW9uKSB7XG5cdFx0XHRpZiAoZGF0YSkge1xuXHRcdFx0XHRjb25zdCBhcnI6IEFycmF5PFQ+ID0gbmV3IEFycmF5PFQ+KCk7XG5cdFx0XHRcdGFyci5wdXNoKGRhdGEpO1xuXHRcdFx0XHR0aGlzLmRpYWxvZy5jbG9zZShhcnIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBnZXRTZWxlY3RlZEVsZW1lbnRzKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMucGFyYW1ldGVycy5zaG93U2VsZWN0ZWRSb3dzSW5TdWJtaXRCdXR0b24gJiYgdGhpcy5wYXJhbWV0ZXJzLnNlYXJjaGVyLm11bHRpcGxlU2VsZWN0ZWRJdGVtTGlzdD8ubGVuZ3RoID4gMCA/XG5cdFx0XHRgICgke3RoaXMucGFyYW1ldGVycy5zZWFyY2hlci5tdWx0aXBsZVNlbGVjdGVkSXRlbUxpc3QubGVuZ3RofSlgIDogJyc7XG5cdH1cbn1cblxuXG4iLCI8c3lzdGVsYWItZGlhbG9nLWhlYWRlciBbd2l0aENsb3NlXT1cInNob3dDbG9zZSB8fCBtdWx0aXBsZVNlbGVjdGlvblwiIChjbG9zZSk9XCJjbG9zZSgpXCI+e3t0aXRsZUZvckRpYWxvZ319XG48L3N5c3RlbGFiLWRpYWxvZy1oZWFkZXI+XG5cbjxkaXYgKGtleWRvd24pPVwiKCgkZXZlbnQua2V5Q29kZT09PTEzKT8kZXZlbnQucHJldmVudERlZmF1bHQoKTowKVwiXG4gICAgIGNsYXNzPVwic2xhYi1mbGV4LTEgZC1mbGV4IGZsZXgtY29sdW1uIGZsZXgtbm93cmFwIHNsYWItc2VhcmNoZXItZGlhbG9nLWNvbnRhaW5lclwiPlxuXG4gICAgPGZvcm0gY2xhc3M9XCJkLWZsZXggcC0zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggc2xhYi1mbGV4LTEgYm9yZGVyIHJvdW5kZWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYm9yZGVyLXJpZ2h0IHBiLTFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2xhYi1maXJzdC1vcHRpb24gbWwtMyBtci0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPVwic3RhdHVzLXNlYXJjaGJ5MVwiIHR5cGU9XCJyYWRpb1wiIGlkPVwic3RhdHVzLXNlYXJjaGJ5LXN0YXJ0c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaEJ5Q29udGFpbnNcIiBbdmFsdWVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2V0Rm9jdXNUb0lucHV0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN0YXR1cy1zZWFyY2hieS1zdGFydHNcIj57eyAnQ09NTU9OX1NUQVJUU19XSVRIJyB8IHRyYW5zbGF0ZSB8IGFzeW5jfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGFiLXNlY29uZC1vcHRpb24gbWwtMiBtci0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPVwic3RhdHVzLXNlYXJjaGJ5MlwiIHR5cGU9XCJyYWRpb1wiIGlkPVwic3RhdHVzLXNlYXJjaGJ5LWNvbnRhaW5zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoQnlDb250YWluc1wiIFt2YWx1ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNldEZvY3VzVG9JbnB1dCgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdGF0dXMtc2VhcmNoYnktY29udGFpbnNcIj57eyAnQ09NTU9OX0NPTlRBSU5TJyB8IHRyYW5zbGF0ZSB8IGFzeW5jfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2xhYi1pbnB1dCBkLWZsZXggc2xhYi1mbGV4LTFcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInNsYWItZmxleC0xIHNsYWItc2VhcmNoZXItZGlhbG9nLXNlYXJjaC10ZXh0XCIgI3ZhbHVlVG9TZWFyY2hJbnB1dCBpZD1cInZhbHVlVG9TZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICBrZXl1cC1kZWJvdW5jZVxuICAgICAgICAgICAgICAgICAgICAgICBba2V5dXBEZWJvdW5jZVRpbWVdPVwicGFyYW1ldGVycy5kZWJvdW5jZVRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXBEZWJvdW5jZWQpPVwicmVmcmVzaFNlYXJjaCgpXCIgKGtleWRvd24udGFiKT1cInNldEZvY3VzVG9HcmlkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7J0NPTU1PTl9TRUFSQ0gnIHwgdHJhbnNsYXRlIHwgYXN5bmN9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoaW5nVmFsdWVcIiBuYW1lPVwidmFsdWVUb1NlYXJjaFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cblxuICAgIDxkaXYgY2xhc3M9XCJzbGFiLWZsZXgtMSBkLWZsZXhcIj5cbiAgICAgICAgPHN5c3RlbGFiLWludGVybmFsLXNlYXJjaGVyLXRhYmxlIGNsYXNzPVwic2xhYi1mbGV4LTEgcG9zaXRpb24tcmVsYXRpdmVcIiBuYW1lPVwic2VhcmNoZXJUYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29udGFpbnNdPVwic2VhcmNoQnlDb250YWluc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NoZWNrc109XCJtdWx0aXBsZVNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVTZWxlY3Rpb25dPVwibXVsdGlwbGVTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlRm9yU2VhcmNoXT1cInNlYXJjaGluZ1ZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hlcl09XCJwYXJhbWV0ZXJzLnNlYXJjaGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlja1Jvdyk9XCJzZWxlY3RPbkNsaWNrKCRldmVudClcIj48L3N5c3RlbGFiLWludGVybmFsLXNlYXJjaGVyLXRhYmxlPlxuICAgIDwvZGl2PlxuPC9kaXY+XG48c3lzdGVsYWItZGlhbG9nLWJvdHRvbSAqbmdJZj1cIm11bHRpcGxlU2VsZWN0aW9uXCIgY2xhc3M9XCJzbGFiLXNlYXJjaGVyLWRpYWxvZy1idXR0b25cIj5cbiAgICA8c3lzdGVsYWItYnV0dG9uIHR5cGU9XCJwcmltYXJ5XCIgY2xhc3M9XCJtbC1hdXRvXCIgKGFjdGlvbik9XCJzdWJtaXQoKVwiPnt7ICdDT01NT05fT0snIHwgdHJhbnNsYXRlIHwgYXN5bmMgfX17e2dldFNlbGVjdGVkRWxlbWVudHMoKX19PC9zeXN0ZWxhYi1idXR0b24+XG48L3N5c3RlbGFiLWRpYWxvZy1ib3R0b20+XG4iXX0=