UNPKG

ontimize-web-ngx

Version:
139 lines 44.4 kB
import { moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop'; import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core'; import { Util } from '../../util/util'; import { Codes } from '../../util/codes'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/flex-layout/flex"; import * as i3 from "@angular/material/button"; import * as i4 from "@angular/material/checkbox"; import * as i5 from "@angular/material/icon"; import * as i6 from "@angular/material/list"; import * as i7 from "@angular/cdk/drag-drop"; import * as i8 from "./dual-list-selector-item/date/o-dual-list-selector-date-item.component"; import * as i9 from "../../pipes/o-translate.pipe"; export const DEFAULT_DUAL_LIST_SELECTOR = [ 'key', 'display', 'dataSource:data-source', 'dataDestination: data-destination', 'titleListDataSource: title-list-data-source', 'titleListDataDestination: title-list-data-destination', 'groupedColumnTypes:grouped-column-types', 'description' ]; export class ODualListSelectorComponent { constructor() { this.dataSource = []; this.dataDestination = []; this.titleListDataSource = ''; this.titleListDataDestination = ''; this.description = ''; this.key = ''; this.display = ''; this.groupedColumnTypes = []; } drop(event) { if (event.previousContainer === event.container) { moveItemInArray(event.container.data, event.previousIndex, event.currentIndex); } else { transferArrayItem(event.previousContainer.data, event.container.data, event.previousIndex, event.currentIndex); } } addToGroupedColumns(columnsToGrouped) { const self = this; columnsToGrouped.selectedOptions.selected.forEach(x => { self.dataDestination.push(x.value); self.dataSource = this.dataSource.filter(groupedColumn => groupedColumn[this.key] != x.value[this.key]); }); } removeGroupedColumns(groupedColumns) { const self = this; groupedColumns.selectedOptions.selected.forEach(x => { self.dataSource.push(x.value); self.dataDestination = this.dataDestination.filter(groupedColumn => groupedColumn[this.key] != x.value[this.key]); }); } onRemoveGroupColumn(column) { this.dataDestination = this.dataDestination.filter((oCol) => oCol[this.key] !== column[this.key]); this.dataSource.push(column); } isAllSelected(list) { const numSelected = list.selectedOptions.selected.length; const numRows = list.options ? list.options.length : 0; return numRows !== 0 && numSelected === numRows; } masterToggle(list) { list.selectedOptions.selected.length === list.options.length ? list.selectedOptions.clear() : list.selectAll(); } hasValue(list) { return list.selectedOptions.selected.length > 0; } isDisabledSortAsc(list) { let sortAsc = true; if (list.selectedOptions.selected.length !== 0) { const index = list.options.toArray().findIndex(x => x.value[this.key] === list.selectedOptions.selected[0].value[this.key]); if (index > 0) { sortAsc = false; } } return sortAsc; } isDisabledSortDesc(list) { let sortDesc = true; if (list.selectedOptions.selected.length !== 0) { const index = list.options.toArray().findIndex(x => x.value[this.key] === list.selectedOptions.selected[0].value[this.key]); if (index >= 0 && (index + 1) !== list.options.toArray().length) { sortDesc = false; } } return sortDesc; } sortAscSelectedItems(list) { const self = this; const itemsSelected = list.selectedOptions.selected; itemsSelected.forEach(item => { const index = list.options.toArray().findIndex(x => x.value[this.key] === item.value[this.key]); moveItemInArray(this.dataDestination, index, index - 1); }); } sortDescSelectedItems(list) { const self = this; const itemsSelected = list.selectedOptions.selected; itemsSelected.forEach(item => { const index = list.options.toArray().findIndex(x => x.value[this.key] === item.value[this.key]); moveItemInArray(self.dataDestination, index, index + 1); }); } getCheckboxLabel(list) { let label = ''; if (Util.isDefined(list.options)) { label = '(' + list.selectedOptions.selected.length + '/' + list.options.length + ')'; } return label; } getSelectedItems() { return this.dataDestination; } setSelectedItems(items) { this.dataDestination = items; } getGroupedColumnTypes() { return this.groupedColumnTypes; } get groupedDateColumns() { return this.groupedColumnTypes.filter(groupedColumn => Codes.TYPES_DATE_GROUPS.findIndex(type => type === groupedColumn.type) > -1); } } ODualListSelectorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ODualListSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); ODualListSelectorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ODualListSelectorComponent, selector: "o-dual-list-selector", inputs: { key: "key", display: "display", dataSource: ["data-source", "dataSource"], dataDestination: ["data-destination", "dataDestination"], titleListDataSource: ["title-list-data-source", "titleListDataSource"], titleListDataDestination: ["title-list-data-destination", "titleListDataDestination"], groupedColumnTypes: ["grouped-column-types", "groupedColumnTypes"], description: "description" }, host: { properties: { "class.o-dual-list-selector": "true" } }, ngImport: i0, template: "<div mat-subheader>{{description | oTranslate }} </div>\n\n<div class=\"o-dual-list-selector-wrapper-selector-list\">\n\n <div class=\"o-dual-list-selector-list\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"50%\">\n <div fxLayout=\"row\" fxFlex class=\"o-dual-list-selector-source-wrapper\">\n <mat-selection-list fxFlex cdkDropList id=\"item-source-list\" #itemsList [cdkDropListData]=\"dataSource\"\n [cdkDropListConnectedTo]=\"['item-destination-list']\" (cdkDropListDropped)=\"drop($event)\" cdkDropListSortingDisabled>\n\n <mat-list-item>\n <mat-checkbox (change)=\"$event ? masterToggle(itemsList) : null\" [checked]=\"isAllSelected(itemsList)\"\n [indeterminate]=\"hasValue(itemsList) && !isAllSelected(itemsList)\" fxFlex>\n <span fxLayout=\"row\" fxLayoutAlign=\"space-between center\">\n <span>{{ titleListDataSource | oTranslate }}</span>\n <span>{{ getCheckboxLabel(itemsList) }} </span>\n </span>\n </mat-checkbox>\n </mat-list-item>\n\n <mat-list-option checkboxPosition=\"before\" *ngFor=\"let item of dataSource\" [value]=\"item\" cdkDrag class=\"o-drag-list-item-box\">\n <span matListItemLine>{{ (item[display]) | oTranslate }} </span>\n </mat-list-option>\n </mat-selection-list>\n\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex=\"50px\" fxLayoutGap=\"24px\">\n <button mat-mini-fab (click)=\"addToGroupedColumns(itemsList)\" [disabled]=\"itemsList.selectedOptions.selected.length===0\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n <button mat-mini-fab (click)=\"removeGroupedColumns(selectedItemsList)\" [disabled]=\"selectedItemsList.selectedOptions.selected.length===0\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"o-dual-list-selector-list\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"50%\">\n <div fxLayout=\"row\" fxFlex class=\"o-dual-list-selector-destination-wrapper\">\n <mat-selection-list fxFlex cdkDropList id=\"item-destination-list\" #selectedItemsList [cdkDropListData]=\"dataDestination\"\n [cdkDropListConnectedTo]=\"['item-source-list']\" (cdkDropListDropped)=\"drop($event)\">\n <mat-list-item>\n <mat-checkbox (change)=\"$event ? masterToggle(selectedItemsList) : null\" [checked]=\"isAllSelected(selectedItemsList)\"\n [indeterminate]=\"hasValue(selectedItemsList) && !isAllSelected(selectedItemsList)\" fxFlex>\n <span fxLayoutAlign=\"space-between center\">\n <span>{{ titleListDataDestination | oTranslate}}</span>\n <span>{{ getCheckboxLabel(selectedItemsList) }}</span>\n </span>\n </mat-checkbox>\n </mat-list-item>\n\n <mat-list-option checkboxPosition=\"before\" *ngFor=\"let itemSelected of dataDestination\" [value]=\"itemSelected\" cdkDrag\n class=\"o-drag-list-item-box\">\n\n <ng-container *ngIf=\"itemSelected.type === 'date'; else defaultRenderer\">\n <o-dual-list-selector-date-item [item]=itemSelected.attr [grouped-date-columns]=\"groupedColumnTypes\" ></o-dual-list-selector-date-item>\n </ng-container>\n\n <ng-template #defaultRenderer>\n <span matListItemLine>{{ itemSelected[display] | oTranslate }} </span>\n </ng-template>\n\n </mat-list-option>\n\n <div class=\"mat-caption drop-empty-message\" *ngIf=\"dataDestination.length===0\">\n {{ 'DUAL_LIST_SELECTOR.DROP_EMPTY_MESSAGE' | oTranslate }}\n </div>\n </mat-selection-list>\n\n\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex=\"50px\" fxLayoutGap=\"24px\">\n <button mat-mini-fab [disabled]=\"isDisabledSortAsc(selectedItemsList)\" (click)=\"sortAscSelectedItems(selectedItemsList)\">\n <mat-icon>expand_less</mat-icon>\n </button>\n <button mat-mini-fab [disabled]=\"isDisabledSortDesc(selectedItemsList)\" (click)=\"sortDescSelectedItems(selectedItemsList)\">\n <mat-icon>expand_more</mat-icon>\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [".o-dual-list-selector{width:100%;height:100%;display:flex;flex-direction:column;flex-wrap:nowrap}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list{flex:1}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-destination-wrapper,.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-source-wrapper{overflow:auto}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-mini-fab{line-height:14px;height:18px;width:18px}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-mini-fab .mat-icon{font-size:18px;height:18px;width:18px}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-selection-list.mat-mdc-list-base{overflow-y:auto;width:100%;position:relative;border-radius:4px;padding:0 16px 16px}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-selection-list.mat-mdc-list-base .mat-mdc-list-item.mat-mdc-list-item:not(.mat-mdc-list-option){margin:0}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-selection-list.mat-mdc-list-base .mat-mdc-list-item.mat-mdc-list-item:not(.mat-mdc-list-option) .mat-mdc-list-item-line{font-weight:500}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .mat-list-option.cdk-drag.o-drag-list-item-box .mdc-list-item__content{cursor:move}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .drop-empty-message{position:absolute;width:calc(100% - 16px);text-align:center;opacity:.5;top:50%}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "component", type: i3.MatMiniFabButton, selector: "button[mat-mini-fab]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i6.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "component", type: i6.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "directive", type: i6.MatListSubheaderCssMatStyler, selector: "[mat-subheader], [matSubheader]" }, { kind: "directive", type: i6.MatListItemLine, selector: "[matListItemLine]" }, { kind: "directive", type: i7.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i7.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: i8.ODualListSelectorDateItemComponent, selector: "o-dual-list-selector-date-item", inputs: ["item", "grouped-date-columns"] }, { kind: "pipe", type: i9.OTranslatePipe, name: "oTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ODualListSelectorComponent, decorators: [{ type: Component, args: [{ selector: 'o-dual-list-selector', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, inputs: DEFAULT_DUAL_LIST_SELECTOR, host: { '[class.o-dual-list-selector]': 'true' }, template: "<div mat-subheader>{{description | oTranslate }} </div>\n\n<div class=\"o-dual-list-selector-wrapper-selector-list\">\n\n <div class=\"o-dual-list-selector-list\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"50%\">\n <div fxLayout=\"row\" fxFlex class=\"o-dual-list-selector-source-wrapper\">\n <mat-selection-list fxFlex cdkDropList id=\"item-source-list\" #itemsList [cdkDropListData]=\"dataSource\"\n [cdkDropListConnectedTo]=\"['item-destination-list']\" (cdkDropListDropped)=\"drop($event)\" cdkDropListSortingDisabled>\n\n <mat-list-item>\n <mat-checkbox (change)=\"$event ? masterToggle(itemsList) : null\" [checked]=\"isAllSelected(itemsList)\"\n [indeterminate]=\"hasValue(itemsList) && !isAllSelected(itemsList)\" fxFlex>\n <span fxLayout=\"row\" fxLayoutAlign=\"space-between center\">\n <span>{{ titleListDataSource | oTranslate }}</span>\n <span>{{ getCheckboxLabel(itemsList) }} </span>\n </span>\n </mat-checkbox>\n </mat-list-item>\n\n <mat-list-option checkboxPosition=\"before\" *ngFor=\"let item of dataSource\" [value]=\"item\" cdkDrag class=\"o-drag-list-item-box\">\n <span matListItemLine>{{ (item[display]) | oTranslate }} </span>\n </mat-list-option>\n </mat-selection-list>\n\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex=\"50px\" fxLayoutGap=\"24px\">\n <button mat-mini-fab (click)=\"addToGroupedColumns(itemsList)\" [disabled]=\"itemsList.selectedOptions.selected.length===0\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n <button mat-mini-fab (click)=\"removeGroupedColumns(selectedItemsList)\" [disabled]=\"selectedItemsList.selectedOptions.selected.length===0\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"o-dual-list-selector-list\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\" fxFlex=\"50%\">\n <div fxLayout=\"row\" fxFlex class=\"o-dual-list-selector-destination-wrapper\">\n <mat-selection-list fxFlex cdkDropList id=\"item-destination-list\" #selectedItemsList [cdkDropListData]=\"dataDestination\"\n [cdkDropListConnectedTo]=\"['item-source-list']\" (cdkDropListDropped)=\"drop($event)\">\n <mat-list-item>\n <mat-checkbox (change)=\"$event ? masterToggle(selectedItemsList) : null\" [checked]=\"isAllSelected(selectedItemsList)\"\n [indeterminate]=\"hasValue(selectedItemsList) && !isAllSelected(selectedItemsList)\" fxFlex>\n <span fxLayoutAlign=\"space-between center\">\n <span>{{ titleListDataDestination | oTranslate}}</span>\n <span>{{ getCheckboxLabel(selectedItemsList) }}</span>\n </span>\n </mat-checkbox>\n </mat-list-item>\n\n <mat-list-option checkboxPosition=\"before\" *ngFor=\"let itemSelected of dataDestination\" [value]=\"itemSelected\" cdkDrag\n class=\"o-drag-list-item-box\">\n\n <ng-container *ngIf=\"itemSelected.type === 'date'; else defaultRenderer\">\n <o-dual-list-selector-date-item [item]=itemSelected.attr [grouped-date-columns]=\"groupedColumnTypes\" ></o-dual-list-selector-date-item>\n </ng-container>\n\n <ng-template #defaultRenderer>\n <span matListItemLine>{{ itemSelected[display] | oTranslate }} </span>\n </ng-template>\n\n </mat-list-option>\n\n <div class=\"mat-caption drop-empty-message\" *ngIf=\"dataDestination.length===0\">\n {{ 'DUAL_LIST_SELECTOR.DROP_EMPTY_MESSAGE' | oTranslate }}\n </div>\n </mat-selection-list>\n\n\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFlex=\"50px\" fxLayoutGap=\"24px\">\n <button mat-mini-fab [disabled]=\"isDisabledSortAsc(selectedItemsList)\" (click)=\"sortAscSelectedItems(selectedItemsList)\">\n <mat-icon>expand_less</mat-icon>\n </button>\n <button mat-mini-fab [disabled]=\"isDisabledSortDesc(selectedItemsList)\" (click)=\"sortDescSelectedItems(selectedItemsList)\">\n <mat-icon>expand_more</mat-icon>\n </button>\n </div>\n </div>\n\n </div>\n</div>\n", styles: [".o-dual-list-selector{width:100%;height:100%;display:flex;flex-direction:column;flex-wrap:nowrap}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list{flex:1}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-destination-wrapper,.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-source-wrapper{overflow:auto}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-mini-fab{line-height:14px;height:18px;width:18px}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-mini-fab .mat-icon{font-size:18px;height:18px;width:18px}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-selection-list.mat-mdc-list-base{overflow-y:auto;width:100%;position:relative;border-radius:4px;padding:0 16px 16px}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-selection-list.mat-mdc-list-base .mat-mdc-list-item.mat-mdc-list-item:not(.mat-mdc-list-option){margin:0}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .o-dual-list-selector-list .mat-mdc-selection-list.mat-mdc-list-base .mat-mdc-list-item.mat-mdc-list-item:not(.mat-mdc-list-option) .mat-mdc-list-item-line{font-weight:500}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .mat-list-option.cdk-drag.o-drag-list-item-box .mdc-list-item__content{cursor:move}.o-dual-list-selector .o-dual-list-selector-wrapper-selector-list .drop-empty-message{position:absolute;width:calc(100% - 16px);text-align:center;opacity:.5;top:50%}\n"] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1kdWFsLWxpc3Qtc2VsZWN0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvZHVhbC1saXN0LXNlbGVjdG9yL28tZHVhbC1saXN0LXNlbGVjdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2R1YWwtbGlzdC1zZWxlY3Rvci9vLWR1YWwtbGlzdC1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd0RixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7OztBQUV6QyxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRztJQUV4QyxLQUFLO0lBRUwsU0FBUztJQUVULHdCQUF3QjtJQUV4QixtQ0FBbUM7SUFDbkMsNkNBQTZDO0lBQzdDLHVEQUF1RDtJQUN2RCx5Q0FBeUM7SUFDekMsYUFBYTtDQUNkLENBQUM7QUFhRixNQUFNLE9BQU8sMEJBQTBCO0lBWHZDO1FBYVMsZUFBVSxHQUFlLEVBQUUsQ0FBQztRQUM1QixvQkFBZSxHQUFlLEVBQUUsQ0FBQztRQUNqQyx3QkFBbUIsR0FBVyxFQUFFLENBQUM7UUFDakMsNkJBQXdCLEdBQVcsRUFBRSxDQUFDO1FBQ3RDLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLFFBQUcsR0FBRyxFQUFFLENBQUM7UUFDVCxZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsdUJBQWtCLEdBQTBCLEVBQUUsQ0FBQztLQXNJdkQ7SUFwSUMsSUFBSSxDQUFDLEtBQTRCO1FBRS9CLElBQUksS0FBSyxDQUFDLGlCQUFpQixLQUFLLEtBQUssQ0FBQyxTQUFTLEVBQUU7WUFDL0MsZUFBZSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ2hGO2FBQU07WUFDTCxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUM1QyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFDcEIsS0FBSyxDQUFDLGFBQWEsRUFDbkIsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQztJQUVELG1CQUFtQixDQUFDLGdCQUFrQztRQUNwRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFFcEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRW5DLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUcsQ0FBQyxDQUFDLENBQUM7SUFFTCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsY0FBZ0M7UUFDbkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLGNBQWMsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUVsRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNwSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUFXO1FBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3ZHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxhQUFhLENBQUMsSUFBc0I7UUFDbEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ3pELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsT0FBTyxPQUFPLEtBQUssQ0FBQyxJQUFJLFdBQVcsS0FBSyxPQUFPLENBQUM7SUFFbEQsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFzQjtRQUNqQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBRXJCLENBQUM7SUFFRCxRQUFRLENBQUMsSUFBc0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO0lBQ2pELENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxJQUFzQjtRQUN0QyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzlDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRTVILElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtnQkFDYixPQUFPLEdBQUcsS0FBSyxDQUFDO2FBQ2pCO1NBRUY7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsa0JBQWtCLENBQUMsSUFBc0I7UUFDdkMsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUU1SCxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUU7Z0JBQy9ELFFBQVEsR0FBRyxLQUFLLENBQUM7YUFDbEI7U0FFRjtRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxJQUFzQjtRQUN6QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUM7UUFDcEQsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMzQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEcsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFNRCxxQkFBcUIsQ0FBQyxJQUFzQjtRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUM7UUFDcEQsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMzQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEcsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxJQUFzQjtRQUNyQyxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2hDLEtBQUssR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7U0FDdEY7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFNRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQU1ELGdCQUFnQixDQUFDLEtBQWlCO1FBQ2hDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQUNELElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDckksQ0FBQzs7d0hBOUlVLDBCQUEwQjs0R0FBMUIsMEJBQTBCLDRnQkNqQ3ZDLDZxSUFnRkE7NEZEL0NhLDBCQUEwQjtrQkFYdEMsU0FBUzsrQkFDRSxzQkFBc0IsaUJBR2pCLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU0sVUFDdkMsMEJBQTBCLFFBQzVCO3dCQUNKLDhCQUE4QixFQUFFLE1BQU07cUJBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSwgdHJhbnNmZXJBcnJheUl0ZW0gfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRTZWxlY3Rpb25MaXN0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGlzdCc7XG5pbXBvcnQgeyBPR3JvdXBlZENvbHVtblR5cGVzIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBDb2RlcyB9IGZyb20gJy4uLy4uL3V0aWwvY29kZXMnO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9EVUFMX0xJU1RfU0VMRUNUT1IgPSBbXG4gIC8va2V5OiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZmllbGQgb2YgZWFjaCBvYmplY3QgaW4gdGhlIGRhdGEgc291cmNlIGFuZCBkYXRhIGRlc3RpbmF0aW9uIGFycmF5c1xuICAna2V5JyxcbiAgLy9kaXNwbGF5IC0gVGhlIGZpZWxkIG9mIGVhY2ggb2JqZWN0IGZvciBkaXNwbGF5aW5nIHRoZSBvYmplY3QgZWFjaCB0aGUgbGlzdHMsXG4gICdkaXNwbGF5JyxcbiAgLy9kYXRhLXNvdXJjZTogVGhlIHNvdXJjZSBhcnJheSBvZiBvYmplY3RzIG9yIHN0cmluZ3MgZm9yIHRoZSBsaXN0LlxuICAnZGF0YVNvdXJjZTpkYXRhLXNvdXJjZScsXG4gIC8vZGF0YS1kZXN0aW5hdGlvbiA6IFRoZSBkZXN0aW5hdGlvbiBhcnJheSBvZiBvYmplY3RzIG9yIHN0cmluZ3Mgc2VsZWN0ZWQgZnJvbSB0aGUgc291cmNlXG4gICdkYXRhRGVzdGluYXRpb246IGRhdGEtZGVzdGluYXRpb24nLFxuICAndGl0bGVMaXN0RGF0YVNvdXJjZTogdGl0bGUtbGlzdC1kYXRhLXNvdXJjZScsXG4gICd0aXRsZUxpc3REYXRhRGVzdGluYXRpb246IHRpdGxlLWxpc3QtZGF0YS1kZXN0aW5hdGlvbicsXG4gICdncm91cGVkQ29sdW1uVHlwZXM6Z3JvdXBlZC1jb2x1bW4tdHlwZXMnLFxuICAnZGVzY3JpcHRpb24nXG5dO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvLWR1YWwtbGlzdC1zZWxlY3RvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9vLWR1YWwtbGlzdC1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL28tZHVhbC1saXN0LXNlbGVjdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbnB1dHM6IERFRkFVTFRfRFVBTF9MSVNUX1NFTEVDVE9SLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5vLWR1YWwtbGlzdC1zZWxlY3Rvcl0nOiAndHJ1ZSdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBPRHVhbExpc3RTZWxlY3RvckNvbXBvbmVudCB7XG5cbiAgcHVibGljIGRhdGFTb3VyY2U6IEFycmF5PGFueT4gPSBbXTtcbiAgcHVibGljIGRhdGFEZXN0aW5hdGlvbjogQXJyYXk8YW55PiA9IFtdO1xuICBwdWJsaWMgdGl0bGVMaXN0RGF0YVNvdXJjZTogc3RyaW5nID0gJyc7XG4gIHB1YmxpYyB0aXRsZUxpc3REYXRhRGVzdGluYXRpb246IHN0cmluZyA9ICcnO1xuICBwdWJsaWMgZGVzY3JpcHRpb24gPSAnJztcbiAgcHVibGljIGtleSA9ICcnO1xuICBwdWJsaWMgZGlzcGxheSA9ICcnO1xuICBwdWJsaWMgZ3JvdXBlZENvbHVtblR5cGVzOiBPR3JvdXBlZENvbHVtblR5cGVzW10gPSBbXTtcblxuICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4pIHtcblxuICAgIGlmIChldmVudC5wcmV2aW91c0NvbnRhaW5lciA9PT0gZXZlbnQuY29udGFpbmVyKSB7XG4gICAgICBtb3ZlSXRlbUluQXJyYXkoZXZlbnQuY29udGFpbmVyLmRhdGEsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyYW5zZmVyQXJyYXlJdGVtKGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmRhdGEsXG4gICAgICAgIGV2ZW50LmNvbnRhaW5lci5kYXRhLFxuICAgICAgICBldmVudC5wcmV2aW91c0luZGV4LFxuICAgICAgICBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIGFkZFRvR3JvdXBlZENvbHVtbnMoY29sdW1uc1RvR3JvdXBlZDogTWF0U2VsZWN0aW9uTGlzdCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbHVtbnNUb0dyb3VwZWQuc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkLmZvckVhY2goeCA9PiB7XG4gICAgICAvL2FkZGVkIGluIGRhdGFEZXN0aW5hdGlvblxuICAgICAgc2VsZi5kYXRhRGVzdGluYXRpb24ucHVzaCh4LnZhbHVlKTtcbiAgICAgIC8vcmVtb3ZlIGl0ZW0gaW4gZGF0YVNvdXJjZVxuICAgICAgc2VsZi5kYXRhU291cmNlID0gdGhpcy5kYXRhU291cmNlLmZpbHRlcihncm91cGVkQ29sdW1uID0+IGdyb3VwZWRDb2x1bW5bdGhpcy5rZXldICE9IHgudmFsdWVbdGhpcy5rZXldKTtcbiAgICB9KTtcblxuICB9XG5cbiAgcmVtb3ZlR3JvdXBlZENvbHVtbnMoZ3JvdXBlZENvbHVtbnM6IE1hdFNlbGVjdGlvbkxpc3QpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBncm91cGVkQ29sdW1ucy5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQuZm9yRWFjaCh4ID0+IHtcblxuICAgICAgc2VsZi5kYXRhU291cmNlLnB1c2goeC52YWx1ZSk7XG4gICAgICBzZWxmLmRhdGFEZXN0aW5hdGlvbiA9IHRoaXMuZGF0YURlc3RpbmF0aW9uLmZpbHRlcihncm91cGVkQ29sdW1uID0+IGdyb3VwZWRDb2x1bW5bdGhpcy5rZXldICE9IHgudmFsdWVbdGhpcy5rZXldKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uUmVtb3ZlR3JvdXBDb2x1bW4oY29sdW1uOiBhbnkpIHtcbiAgICB0aGlzLmRhdGFEZXN0aW5hdGlvbiA9IHRoaXMuZGF0YURlc3RpbmF0aW9uLmZpbHRlcigob0NvbDogYW55KSA9PiBvQ29sW3RoaXMua2V5XSAhPT0gY29sdW1uW3RoaXMua2V5XSk7XG4gICAgdGhpcy5kYXRhU291cmNlLnB1c2goY29sdW1uKTtcbiAgfVxuXG4gIGlzQWxsU2VsZWN0ZWQobGlzdDogTWF0U2VsZWN0aW9uTGlzdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gbGlzdC5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWQubGVuZ3RoO1xuICAgIGNvbnN0IG51bVJvd3MgPSBsaXN0Lm9wdGlvbnMgPyBsaXN0Lm9wdGlvbnMubGVuZ3RoIDogMDtcbiAgICByZXR1cm4gbnVtUm93cyAhPT0gMCAmJiBudW1TZWxlY3RlZCA9PT0gbnVtUm93cztcblxuICB9XG5cbiAgbWFzdGVyVG9nZ2xlKGxpc3Q6IE1hdFNlbGVjdGlvbkxpc3QpIHtcbiAgICBsaXN0LnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5sZW5ndGggPT09IGxpc3Qub3B0aW9ucy5sZW5ndGggP1xuICAgICAgbGlzdC5zZWxlY3RlZE9wdGlvbnMuY2xlYXIoKSA6XG4gICAgICBsaXN0LnNlbGVjdEFsbCgpO1xuXG4gIH1cblxuICBoYXNWYWx1ZShsaXN0OiBNYXRTZWxlY3Rpb25MaXN0KSB7XG4gICAgcmV0dXJuIGxpc3Quc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkLmxlbmd0aCA+IDBcbiAgfVxuICBpc0Rpc2FibGVkU29ydEFzYyhsaXN0OiBNYXRTZWxlY3Rpb25MaXN0KSB7XG4gICAgbGV0IHNvcnRBc2MgPSB0cnVlO1xuICAgIGlmIChsaXN0LnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5sZW5ndGggIT09IDApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gbGlzdC5vcHRpb25zLnRvQXJyYXkoKS5maW5kSW5kZXgoeCA9PiB4LnZhbHVlW3RoaXMua2V5XSA9PT0gbGlzdC5zZWxlY3RlZE9wdGlvbnMuc2VsZWN0ZWRbMF0udmFsdWVbdGhpcy5rZXldKTtcblxuICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICBzb3J0QXNjID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICB9XG4gICAgcmV0dXJuIHNvcnRBc2M7XG4gIH1cblxuICBpc0Rpc2FibGVkU29ydERlc2MobGlzdDogTWF0U2VsZWN0aW9uTGlzdCkge1xuICAgIGxldCBzb3J0RGVzYyA9IHRydWU7XG4gICAgaWYgKGxpc3Quc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29uc3QgaW5kZXggPSBsaXN0Lm9wdGlvbnMudG9BcnJheSgpLmZpbmRJbmRleCh4ID0+IHgudmFsdWVbdGhpcy5rZXldID09PSBsaXN0LnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZFswXS52YWx1ZVt0aGlzLmtleV0pO1xuXG4gICAgICBpZiAoaW5kZXggPj0gMCAmJiAoaW5kZXggKyAxKSAhPT0gbGlzdC5vcHRpb25zLnRvQXJyYXkoKS5sZW5ndGgpIHtcbiAgICAgICAgc29ydERlc2MgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgIH1cbiAgICByZXR1cm4gc29ydERlc2M7XG4gIH1cblxuICBzb3J0QXNjU2VsZWN0ZWRJdGVtcyhsaXN0OiBNYXRTZWxlY3Rpb25MaXN0KSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgaXRlbXNTZWxlY3RlZCA9IGxpc3Quc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkO1xuICAgIGl0ZW1zU2VsZWN0ZWQuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gbGlzdC5vcHRpb25zLnRvQXJyYXkoKS5maW5kSW5kZXgoeCA9PiB4LnZhbHVlW3RoaXMua2V5XSA9PT0gaXRlbS52YWx1ZVt0aGlzLmtleV0pO1xuICAgICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuZGF0YURlc3RpbmF0aW9uLCBpbmRleCwgaW5kZXggLSAxKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0cyBkZXNjIHNlbGVjdGVkIGl0ZW1zXG4gICAqIEBwYXJhbSBsaXN0XG4gICAqL1xuICBzb3J0RGVzY1NlbGVjdGVkSXRlbXMobGlzdDogTWF0U2VsZWN0aW9uTGlzdCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGl0ZW1zU2VsZWN0ZWQgPSBsaXN0LnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZDtcbiAgICBpdGVtc1NlbGVjdGVkLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IGxpc3Qub3B0aW9ucy50b0FycmF5KCkuZmluZEluZGV4KHggPT4geC52YWx1ZVt0aGlzLmtleV0gPT09IGl0ZW0udmFsdWVbdGhpcy5rZXldKTtcbiAgICAgIG1vdmVJdGVtSW5BcnJheShzZWxmLmRhdGFEZXN0aW5hdGlvbiwgaW5kZXgsIGluZGV4ICsgMSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDaGVja2JveExhYmVsKGxpc3Q6IE1hdFNlbGVjdGlvbkxpc3QpIHtcbiAgICBsZXQgbGFiZWwgPSAnJztcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQobGlzdC5vcHRpb25zKSkge1xuICAgICAgbGFiZWwgPSAnKCcgKyBsaXN0LnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5sZW5ndGggKyAnLycgKyBsaXN0Lm9wdGlvbnMubGVuZ3RoICsgJyknO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWw7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBzZWxlY3RlZCBpdGVtc1xuICAgKiBAcmV0dXJucyBzZWxlY3RlZCBpdGVtc1xuICAgKi9cbiAgZ2V0U2VsZWN0ZWRJdGVtcygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhRGVzdGluYXRpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBzZWxlY3RlZCBpdGVtc1xuICAgKiBAcGFyYW0gaXRlbXNcbiAgICovXG4gIHNldFNlbGVjdGVkSXRlbXMoaXRlbXM6IEFycmF5PGFueT4pIHtcbiAgICB0aGlzLmRhdGFEZXN0aW5hdGlvbiA9IGl0ZW1zO1xuICB9XG5cbiAgZ2V0R3JvdXBlZENvbHVtblR5cGVzKCk6IE9Hcm91cGVkQ29sdW1uVHlwZXNbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBlZENvbHVtblR5cGVzO1xuICB9XG4gIGdldCBncm91cGVkRGF0ZUNvbHVtbnMoKTogT0dyb3VwZWRDb2x1bW5UeXBlc1tdIHtcbiAgICByZXR1cm4gdGhpcy5ncm91cGVkQ29sdW1uVHlwZXMuZmlsdGVyKGdyb3VwZWRDb2x1bW4gPT4gQ29kZXMuVFlQRVNfREFURV9HUk9VUFMuZmluZEluZGV4KHR5cGUgPT4gdHlwZSA9PT0gZ3JvdXBlZENvbHVtbi50eXBlKSA+IC0xKVxuICB9XG59XG4iLCI8ZGl2IG1hdC1zdWJoZWFkZXI+e3tkZXNjcmlwdGlvbiB8IG9UcmFuc2xhdGUgfX0gPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJvLWR1YWwtbGlzdC1zZWxlY3Rvci13cmFwcGVyLXNlbGVjdG9yLWxpc3RcIj5cblxuICA8ZGl2IGNsYXNzPVwiby1kdWFsLWxpc3Qtc2VsZWN0b3ItbGlzdFwiIGZ4TGF5b3V0PVwiY29sdW1uXCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IHN0cmV0Y2hcIiBmeEZsZXg9XCI1MCVcIj5cbiAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhGbGV4IGNsYXNzPVwiby1kdWFsLWxpc3Qtc2VsZWN0b3Itc291cmNlLXdyYXBwZXJcIj5cbiAgICAgIDxtYXQtc2VsZWN0aW9uLWxpc3QgZnhGbGV4IGNka0Ryb3BMaXN0IGlkPVwiaXRlbS1zb3VyY2UtbGlzdFwiICNpdGVtc0xpc3QgW2Nka0Ryb3BMaXN0RGF0YV09XCJkYXRhU291cmNlXCJcbiAgICAgICAgW2Nka0Ryb3BMaXN0Q29ubmVjdGVkVG9dPVwiWydpdGVtLWRlc3RpbmF0aW9uLWxpc3QnXVwiIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCIgY2RrRHJvcExpc3RTb3J0aW5nRGlzYWJsZWQ+XG5cbiAgICAgICAgPG1hdC1saXN0LWl0ZW0+XG4gICAgICAgICAgPG1hdC1jaGVja2JveCAoY2hhbmdlKT1cIiRldmVudCA/IG1hc3RlclRvZ2dsZShpdGVtc0xpc3QpIDogbnVsbFwiIFtjaGVja2VkXT1cImlzQWxsU2VsZWN0ZWQoaXRlbXNMaXN0KVwiXG4gICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJoYXNWYWx1ZShpdGVtc0xpc3QpICAmJiAhaXNBbGxTZWxlY3RlZChpdGVtc0xpc3QpXCIgZnhGbGV4PlxuICAgICAgICAgICAgPHNwYW4gZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3BhY2UtYmV0d2VlbiBjZW50ZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgdGl0bGVMaXN0RGF0YVNvdXJjZSB8IG9UcmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IGdldENoZWNrYm94TGFiZWwoaXRlbXNMaXN0KSB9fSA8L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cblxuICAgICAgICA8bWF0LWxpc3Qtb3B0aW9uIGNoZWNrYm94UG9zaXRpb249XCJiZWZvcmVcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXRhU291cmNlXCIgW3ZhbHVlXT1cIml0ZW1cIiBjZGtEcmFnIGNsYXNzPVwiby1kcmFnLWxpc3QtaXRlbS1ib3hcIj5cbiAgICAgICAgICA8c3BhbiBtYXRMaXN0SXRlbUxpbmU+e3sgKGl0ZW1bZGlzcGxheV0pIHwgb1RyYW5zbGF0ZSB9fSA8L3NwYW4+XG4gICAgICAgIDwvbWF0LWxpc3Qtb3B0aW9uPlxuICAgICAgPC9tYXQtc2VsZWN0aW9uLWxpc3Q+XG5cbiAgICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiIGZ4RmxleD1cIjUwcHhcIiBmeExheW91dEdhcD1cIjI0cHhcIj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtbWluaS1mYWIgKGNsaWNrKT1cImFkZFRvR3JvdXBlZENvbHVtbnMoaXRlbXNMaXN0KVwiIFtkaXNhYmxlZF09XCJpdGVtc0xpc3Quc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkLmxlbmd0aD09PTBcIj5cbiAgICAgICAgICA8bWF0LWljb24+Y2hldnJvbl9yaWdodDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiAoY2xpY2spPVwicmVtb3ZlR3JvdXBlZENvbHVtbnMoc2VsZWN0ZWRJdGVtc0xpc3QpXCIgW2Rpc2FibGVkXT1cInNlbGVjdGVkSXRlbXNMaXN0LnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5sZW5ndGg9PT0wXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmNoZXZyb25fbGVmdDwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJvLWR1YWwtbGlzdC1zZWxlY3Rvci1saXN0XCIgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEFsaWduPVwic3RhcnQgc3RyZXRjaFwiIGZ4RmxleD1cIjUwJVwiPlxuICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeEZsZXggY2xhc3M9XCJvLWR1YWwtbGlzdC1zZWxlY3Rvci1kZXN0aW5hdGlvbi13cmFwcGVyXCI+XG4gICAgICA8bWF0LXNlbGVjdGlvbi1saXN0IGZ4RmxleCBjZGtEcm9wTGlzdCBpZD1cIml0ZW0tZGVzdGluYXRpb24tbGlzdFwiICNzZWxlY3RlZEl0ZW1zTGlzdCBbY2RrRHJvcExpc3REYXRhXT1cImRhdGFEZXN0aW5hdGlvblwiXG4gICAgICAgIFtjZGtEcm9wTGlzdENvbm5lY3RlZFRvXT1cIlsnaXRlbS1zb3VyY2UtbGlzdCddXCIgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudClcIj5cbiAgICAgICAgPG1hdC1saXN0LWl0ZW0+XG4gICAgICAgICAgPG1hdC1jaGVja2JveCAoY2hhbmdlKT1cIiRldmVudCA/IG1hc3RlclRvZ2dsZShzZWxlY3RlZEl0ZW1zTGlzdCkgOiBudWxsXCIgW2NoZWNrZWRdPVwiaXNBbGxTZWxlY3RlZChzZWxlY3RlZEl0ZW1zTGlzdClcIlxuICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiaGFzVmFsdWUoc2VsZWN0ZWRJdGVtc0xpc3QpICYmICFpc0FsbFNlbGVjdGVkKHNlbGVjdGVkSXRlbXNMaXN0KVwiIGZ4RmxleD5cbiAgICAgICAgICAgIDxzcGFuIGZ4TGF5b3V0QWxpZ249XCJzcGFjZS1iZXR3ZWVuIGNlbnRlclwiPlxuICAgICAgICAgICAgICA8c3Bhbj57eyB0aXRsZUxpc3REYXRhRGVzdGluYXRpb24gfCBvVHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IGdldENoZWNrYm94TGFiZWwoc2VsZWN0ZWRJdGVtc0xpc3QpIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICA8L21hdC1saXN0LWl0ZW0+XG5cbiAgICAgICAgPG1hdC1saXN0LW9wdGlvbiBjaGVja2JveFBvc2l0aW9uPVwiYmVmb3JlXCIgKm5nRm9yPVwibGV0IGl0ZW1TZWxlY3RlZCBvZiBkYXRhRGVzdGluYXRpb25cIiBbdmFsdWVdPVwiaXRlbVNlbGVjdGVkXCIgY2RrRHJhZ1xuICAgICAgICAgIGNsYXNzPVwiby1kcmFnLWxpc3QtaXRlbS1ib3hcIj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtU2VsZWN0ZWQudHlwZSA9PT0gJ2RhdGUnOyBlbHNlIGRlZmF1bHRSZW5kZXJlclwiPlxuICAgICAgICAgICAgPG8tZHVhbC1saXN0LXNlbGVjdG9yLWRhdGUtaXRlbSBbaXRlbV09aXRlbVNlbGVjdGVkLmF0dHIgW2dyb3VwZWQtZGF0ZS1jb2x1bW5zXT1cImdyb3VwZWRDb2x1bW5UeXBlc1wiID48L28tZHVhbC1saXN0LXNlbGVjdG9yLWRhdGUtaXRlbT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFJlbmRlcmVyPlxuICAgICAgICAgICAgPHNwYW4gbWF0TGlzdEl0ZW1MaW5lPnt7IGl0ZW1TZWxlY3RlZFtkaXNwbGF5XSB8IG9UcmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgPC9tYXQtbGlzdC1vcHRpb24+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1jYXB0aW9uIGRyb3AtZW1wdHktbWVzc2FnZVwiICpuZ0lmPVwiZGF0YURlc3RpbmF0aW9uLmxlbmd0aD09PTBcIj5cbiAgICAgICAgICB7eyAnRFVBTF9MSVNUX1NFTEVDVE9SLkRST1BfRU1QVFlfTUVTU0FHRScgfCBvVHJhbnNsYXRlIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9tYXQtc2VsZWN0aW9uLWxpc3Q+XG5cblxuICAgICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgY2VudGVyXCIgZnhGbGV4PVwiNTBweFwiIGZ4TGF5b3V0R2FwPVwiMjRweFwiPlxuICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFNvcnRBc2Moc2VsZWN0ZWRJdGVtc0xpc3QpXCIgKGNsaWNrKT1cInNvcnRBc2NTZWxlY3RlZEl0ZW1zKHNlbGVjdGVkSXRlbXNMaXN0KVwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5leHBhbmRfbGVzczwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIG1hdC1taW5pLWZhYiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFNvcnREZXNjKHNlbGVjdGVkSXRlbXNMaXN0KVwiIChjbGljayk9XCJzb3J0RGVzY1NlbGVjdGVkSXRlbXMoc2VsZWN0ZWRJdGVtc0xpc3QpXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmV4cGFuZF9tb3JlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cbjwvZGl2PlxuIl19