UNPKG

@crediblefinance/credible-ui

Version:

Credible's standard UI library

162 lines 37.1 kB
import { Component, Output, EventEmitter, Input, ViewEncapsulation } from '@angular/core'; import { FormControl, FormGroup } from '@angular/forms'; import Dropdown from '../models/Dropdown'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/forms"; import * as i3 from "@angular/material/select"; import * as i4 from "@angular/material/core"; export class CfDropdownComponent { options = []; change = new EventEmitter(); label = ''; name; showLogo = true; showLabel = true; selected = ''; disabled = false; multiple = false; showDescription = false; currentSelected = new Dropdown(); currentMultiSelected = []; multiSelectText = ''; formGroup; control; theme = 'dark'; // HTML helpers objectFn = Object; constructor() { if (!this.control && !this.formGroup) { this.formGroup = new FormGroup({}); this.control = new FormControl(''); } } ngOnInit() { if (this.multiple) this.control.setValue([]); if (this.options && this.options.length > 0) { if (this.multiple) this.setDefaultMultipleSelection(); else this.setDefaultSingleSelection(); } } ngOnChanges(changes) { if (changes.selected?.currentValue) { this.selected = changes.selected.currentValue; if (this.options.length > 0) this.setDefaultSingleSelection(); } if (changes.options?.currentValue.length > 0) this.setDefaultSingleSelection(); } setDefaultSingleSelection() { if (typeof this.selected === 'string') { const index = this.validOption(this.selected); if (index === -1) { if (this.control.value && this.getCurrentSelectedOption(this.control.value)) this.currentSelected = this.getCurrentSelectedOption(this.control.value); else this.currentSelected = this.options[0]; } else this.currentSelected = this.options[index]; } else this.currentSelected = this.options[0]; this.control.setValue(this.currentSelected.value); } setDefaultMultipleSelection() { if (typeof this.selected === 'string') { const index = this.validOption(this.selected); if (index === -1) this.currentMultiSelected = [this.options[0]]; else this.currentMultiSelected = [this.options[index]]; this.multiSelectText = this.currentMultiSelected.map(x => x.label).join(', '); this.control.setValue(this.currentMultiSelected.map(x => x.value)); } else if (this.selected.constructor.name == 'Array') { const validOptions = []; const arr = Array.from(this.selected); arr.forEach(x => { const index = this.validOption(x); if (index !== -1) validOptions.push(this.options[index].value); }); this.currentMultiSelected = this.getCurrentMultiSelectedOption(validOptions); this.multiSelectText = this.currentMultiSelected.map(x => x.label).join(', '); this.control.setValue(this.currentMultiSelected.map(x => x.value)); } } validOption(value) { if (value === '') return -1; for (let i = 0; i < this.options.length; i++) { if (this.options[i].value === value) return i; } return -1; } changeDropdown(matSelectChange) { const currentSelected = this.getCurrentSelectedOption(matSelectChange.value); if (currentSelected) { this.currentSelected = currentSelected; this.change.emit(this.currentSelected); } } getCurrentSelectedOption(value) { return this.options.find((x) => x.value === value); } getCurrentMultiSelectedOption(optionsArray) { let data; return optionsArray.map((x) => { this.options.forEach((y) => { if (x === y.value) data = y; }); return data; }); } changeMultiDropdown(matSelectChange) { this.currentMultiSelected = this.getCurrentMultiSelectedOption(matSelectChange.value); this.multiSelectText = this.currentMultiSelected.map(x => x.label).join(', '); this.change.emit(this.currentMultiSelected); } get classes() { return ['cf-dropdown-overlay-pane', this.theme]; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: CfDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.9", type: CfDropdownComponent, selector: "cf-dropdown", inputs: { options: "options", label: "label", name: "name", showLogo: "showLogo", showLabel: "showLabel", selected: "selected", disabled: "disabled", multiple: "multiple", showDescription: "showDescription", formGroup: "formGroup", control: "control", theme: "theme" }, outputs: { change: "change" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cf-dropdown container\" [ngClass]=\"classes\">\n <div class=\"row\">\n <div class=\"col-md-12\">\n <div *ngIf=\"showLabel\">\n <label class=\"label\">{{ label }}</label>\n </div>\n <div [class.error]=\"control.invalid && control.touched\" class=\"dropdown-holder\" [ngClass]=\"classes\"\n [formGroup]=\"formGroup\">\n <!-- For multi select dropdown -->\n <mat-select matNativeControl [formControl]=\"control\" (selectionChange)=\"changeMultiDropdown($event)\"\n [ngClass]=\"classes\" [disabled]=\"disabled\" multiple *ngIf=\"multiple\">\n <mat-select-trigger>\n <span [ngStyle]=\"{ color: theme === 'dark' ? 'white' : 'black' }\">{{\n multiSelectText\n }}</span>\n </mat-select-trigger>\n <mat-option [value]=\"item.value\" *ngFor=\"let item of options\">\n <img [src]=\"item.logo\" [alt]=\"item.label\" width=\"25\" *ngIf=\"showLogo\" />\n {{ item.label }}\n </mat-option>\n </mat-select>\n\n <!-- For single select dropdown -->\n <mat-select matNativeControl [formControl]=\"control\" (selectionChange)=\"changeDropdown($event)\"\n [panelClass]=\"classes\" [disabled]=\"disabled\" *ngIf=\"!multiple\">\n <mat-select-trigger>\n <img [src]=\"currentSelected.logo\" [alt]=\"currentSelected.label\" width=\"25\"\n style=\"margin-right: 0.5rem\" *ngIf=\"showLogo\" />\n <span [ngStyle]=\"{ color: theme === 'dark' ? 'white' : 'black' }\">{{\n currentSelected.label\n }}</span>\n </mat-select-trigger>\n <mat-option [disabled]=\"!item.optionEnabled\" [value]=\"item.value\" *ngFor=\"let item of options\"\n [ngClass]=\"{ description: showDescription, dark: theme === 'dark', light: theme === 'light' }\">\n <img [src]=\"item.logo\" [alt]=\"item.label\" width=\"25\" *ngIf=\"showLogo\"\n style=\"margin-right: 0.5rem\" />\n <span class=\"primary-text\">{{ item.label }}</span>\n <span class=\"text-description\" *ngIf=\"showDescription\">\n {{ item.description }}\n </span>\n </mat-option>\n </mat-select>\n </div>\n </div>\n </div>\n <span class=\"text-danger\" *ngIf=\"control.errors && control.touched\">\n {{ control.errors[objectFn.keys(control.errors)[0]] }}\n </span>\n</div>", styles: [".cf-dropdown{padding:0!important;height:max-content;margin-left:auto;margin-right:auto}.cf-dropdown .label{font-weight:700;font-size:.8rem;margin-bottom:3px}.cf-dropdown .error{border:.5px solid #dc3545!important}.cf-dropdown .dropdown-holder{display:flex;justify-content:center;margin:0rem auto;border-radius:9px;padding:12px 1rem}.dark .mat-select-arrow{color:#cf0}mat-select-trigger,.mat-select-trigger{width:min-content}.cf-dropdown-overlay-pane .mat-pseudo-checkbox{display:none!important}.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane .primary-text{font-weight:400}.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane .mat-mdc-option-active{width:100%}.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane .mat-mdc-option-active .mdc-list-item__primary-text .primary-text{font-weight:700}.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane.light{background-color:#fff!important}.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane.light .mat-mdc-option .mdc-list-item__primary-text .primary-text,.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane.light .mat-mdc-option-active .mdc-list-item__primary-text .primary-text{color:#000}.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane.dark{background-color:#1d1e22!important}.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane.dark .mat-mdc-option .mdc-list-item__primary-text .primary-text{color:#d3d3d3}.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane.dark .mat-mdc-option-active .mdc-list-item__primary-text .primary-text{color:#fff}.cf-dropdown-overlay-pane.light .mat-mdc-select-arrow,.cf-dropdown-overlay-pane.dark .mat-mdc-select-arrow{color:gray}.cf-dropdown-overlay-pane .text-description{color:gray;font-weight:400;font-size:.9rem}.cf-dropdown.dark .label{color:#fff}.cf-dropdown.dark .dropdown-holder{background:#24252B;border:.5px solid grey}.cf-dropdown.light .label{color:gray}.cf-dropdown.light .dropdown-holder{background:white;border:.5px solid grey}@media only screen and (max-width: 500px){.cf-dropdown{margin-bottom:1rem;font-size:1rem}.label{font-size:1rem!important}}::ng-deep .cf-dropdown-overlay-pane .mdc-list-item{width:max-content}::ng-deep .cf-dropdown-overlay-pane .mat-mdc-option-pseudo-checkbox{display:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "aria-describedby", "panelClass", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i3.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i4.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }], encapsulation: i0.ViewEncapsulation.None }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: CfDropdownComponent, decorators: [{ type: Component, args: [{ selector: 'cf-dropdown', encapsulation: ViewEncapsulation.None, template: "<div class=\"cf-dropdown container\" [ngClass]=\"classes\">\n <div class=\"row\">\n <div class=\"col-md-12\">\n <div *ngIf=\"showLabel\">\n <label class=\"label\">{{ label }}</label>\n </div>\n <div [class.error]=\"control.invalid && control.touched\" class=\"dropdown-holder\" [ngClass]=\"classes\"\n [formGroup]=\"formGroup\">\n <!-- For multi select dropdown -->\n <mat-select matNativeControl [formControl]=\"control\" (selectionChange)=\"changeMultiDropdown($event)\"\n [ngClass]=\"classes\" [disabled]=\"disabled\" multiple *ngIf=\"multiple\">\n <mat-select-trigger>\n <span [ngStyle]=\"{ color: theme === 'dark' ? 'white' : 'black' }\">{{\n multiSelectText\n }}</span>\n </mat-select-trigger>\n <mat-option [value]=\"item.value\" *ngFor=\"let item of options\">\n <img [src]=\"item.logo\" [alt]=\"item.label\" width=\"25\" *ngIf=\"showLogo\" />\n {{ item.label }}\n </mat-option>\n </mat-select>\n\n <!-- For single select dropdown -->\n <mat-select matNativeControl [formControl]=\"control\" (selectionChange)=\"changeDropdown($event)\"\n [panelClass]=\"classes\" [disabled]=\"disabled\" *ngIf=\"!multiple\">\n <mat-select-trigger>\n <img [src]=\"currentSelected.logo\" [alt]=\"currentSelected.label\" width=\"25\"\n style=\"margin-right: 0.5rem\" *ngIf=\"showLogo\" />\n <span [ngStyle]=\"{ color: theme === 'dark' ? 'white' : 'black' }\">{{\n currentSelected.label\n }}</span>\n </mat-select-trigger>\n <mat-option [disabled]=\"!item.optionEnabled\" [value]=\"item.value\" *ngFor=\"let item of options\"\n [ngClass]=\"{ description: showDescription, dark: theme === 'dark', light: theme === 'light' }\">\n <img [src]=\"item.logo\" [alt]=\"item.label\" width=\"25\" *ngIf=\"showLogo\"\n style=\"margin-right: 0.5rem\" />\n <span class=\"primary-text\">{{ item.label }}</span>\n <span class=\"text-description\" *ngIf=\"showDescription\">\n {{ item.description }}\n </span>\n </mat-option>\n </mat-select>\n </div>\n </div>\n </div>\n <span class=\"text-danger\" *ngIf=\"control.errors && control.touched\">\n {{ control.errors[objectFn.keys(control.errors)[0]] }}\n </span>\n</div>", styles: [".cf-dropdown{padding:0!important;height:max-content;margin-left:auto;margin-right:auto}.cf-dropdown .label{font-weight:700;font-size:.8rem;margin-bottom:3px}.cf-dropdown .error{border:.5px solid #dc3545!important}.cf-dropdown .dropdown-holder{display:flex;justify-content:center;margin:0rem auto;border-radius:9px;padding:12px 1rem}.dark .mat-select-arrow{color:#cf0}mat-select-trigger,.mat-select-trigger{width:min-content}.cf-dropdown-overlay-pane .mat-pseudo-checkbox{display:none!important}.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane .primary-text{font-weight:400}.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane .mat-mdc-option-active{width:100%}.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane .mat-mdc-option-active .mdc-list-item__primary-text .primary-text{font-weight:700}.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane.light{background-color:#fff!important}.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane.light .mat-mdc-option .mdc-list-item__primary-text .primary-text,.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane.light .mat-mdc-option-active .mdc-list-item__primary-text .primary-text{color:#000}.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane.dark{background-color:#1d1e22!important}.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane.dark .mat-mdc-option .mdc-list-item__primary-text .primary-text{color:#d3d3d3}.cf-overlay-input-dropdown-parent-pane .cf-dropdown-overlay-pane.dark .mat-mdc-option-active .mdc-list-item__primary-text .primary-text{color:#fff}.cf-dropdown-overlay-pane.light .mat-mdc-select-arrow,.cf-dropdown-overlay-pane.dark .mat-mdc-select-arrow{color:gray}.cf-dropdown-overlay-pane .text-description{color:gray;font-weight:400;font-size:.9rem}.cf-dropdown.dark .label{color:#fff}.cf-dropdown.dark .dropdown-holder{background:#24252B;border:.5px solid grey}.cf-dropdown.light .label{color:gray}.cf-dropdown.light .dropdown-holder{background:white;border:.5px solid grey}@media only screen and (max-width: 500px){.cf-dropdown{margin-bottom:1rem;font-size:1rem}.label{font-size:1rem!important}}::ng-deep .cf-dropdown-overlay-pane .mdc-list-item{width:max-content}::ng-deep .cf-dropdown-overlay-pane .mat-mdc-option-pseudo-checkbox{display:none}\n"] }] }], ctorParameters: () => [], propDecorators: { options: [{ type: Input }], change: [{ type: Output }], label: [{ type: Input }], name: [{ type: Input }], showLogo: [{ type: Input }], showLabel: [{ type: Input }], selected: [{ type: Input }], disabled: [{ type: Input }], multiple: [{ type: Input }], showDescription: [{ type: Input }], formGroup: [{ type: Input }], control: [{ type: Input }], theme: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2YtZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3JlZGlibGUtdWkvc3JjL2xpYi9jZi1kcm9wZG93bi9jZi1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcmVkaWJsZS11aS9zcmMvbGliL2NmLWRyb3Bkb3duL2NmLWRyb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQVUsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQTRCLGlCQUFpQixFQUM5RixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsV0FBVyxFQUFFLFNBQVMsRUFDekIsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4QixPQUFPLFFBQVEsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7O0FBUTFDLE1BQU0sT0FBTyxtQkFBbUI7SUFDbkIsT0FBTyxHQUFxQixFQUFFLENBQUM7SUFDOUIsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDN0IsS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUNuQixJQUFJLENBQVU7SUFDZCxRQUFRLEdBQVksSUFBSSxDQUFDO0lBQ3pCLFNBQVMsR0FBWSxJQUFJLENBQUM7SUFDMUIsUUFBUSxHQUFzQixFQUFFLENBQUM7SUFDakMsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixRQUFRLEdBQVksS0FBSyxDQUFDO0lBQzFCLGVBQWUsR0FBWSxLQUFLLENBQUM7SUFFMUMsZUFBZSxHQUFjLElBQUksUUFBUSxFQUFFLENBQUM7SUFDNUMsb0JBQW9CLEdBQXFCLEVBQUUsQ0FBQztJQUU1QyxlQUFlLEdBQVcsRUFBRSxDQUFDO0lBRXBCLFNBQVMsQ0FBYTtJQUN0QixPQUFPLENBQWU7SUFFdEIsS0FBSyxHQUFXLE1BQU0sQ0FBQztJQUVoQyxlQUFlO0lBQ2YsUUFBUSxHQUFH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QUMsZUFBZ0M7UUFDaEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdEYsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2QsT0FBTyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO3VHQXhKUSxtQkFBbUI7MkZBQW5CLG1CQUFtQixxWENoQmhDLGsxRkFnRE07OzJGRGhDTyxtQkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0ksYUFBYSxpQkFHUixpQkFBaUIsQ0FBQyxJQUFJO3dEQUc1QixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0ksTUFBTTtzQkFBZixNQUFNO2dCQUNFLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBT0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBGb3JtQ29udHJvbCwgRm9ybUdyb3VwXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdFNlbGVjdENoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgSURyb3Bkb3duIGZyb20gJy4uL2ludGVyZmFjZXMvSURyb3Bkb3duJztcbmltcG9ydCBEcm9wZG93biBmcm9tICcuLi9tb2RlbHMvRHJvcGRvd24nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2NmLWRyb3Bkb3duJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2YtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NmLWRyb3Bkb3duLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBDZkRyb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIEBJbnB1dCgpIG9wdGlvbnM6IEFycmF5PElEcm9wZG93bj4gPSBbXTtcbiAgICBAT3V0cHV0KCkgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJztcbiAgICBASW5wdXQoKSBuYW1lPzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHNob3dMb2dvOiBib29sZWFuID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBzaG93TGFiZWw6IGJvb2xlYW4gPSB0cnVlO1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnO1xuICAgIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBzaG93RGVzY3JpcHRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGN1cnJlbnRTZWxlY3RlZDogSURyb3Bkb3duID0gbmV3IERyb3Bkb3duKCk7XG4gICAgY3VycmVudE11bHRpU2VsZWN0ZWQ6IEFycmF5PElEcm9wZG93bj4gPSBbXTtcblxuICAgIG11bHRpU2VsZWN0VGV4dDogc3RyaW5nID0gJyc7XG5cbiAgICBASW5wdXQoKSBmb3JtR3JvdXAhOiBGb3JtR3JvdXA7XG4gICAgQElucHV0KCkgY29udHJvbCE6IEZvcm1Db250cm9sO1xuXG4gICAgQElucHV0KCkgdGhlbWU6IHN0cmluZyA9ICdkYXJrJztcblxuICAgIC8vIEhUTUwgaGVscGVyc1xuICAgIG9iamVjdEZuID0gT2JqZWN0O1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udHJvbCAmJiAhdGhpcy5mb3JtR3JvdXApIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKVxuICAgICAgICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKFtdKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldERlZmF1bHRNdWx0aXBsZVNlbGVjdGlvbigpO1xuXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0U2luZ2xlU2VsZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzLnNlbGVjdGVkPy5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBjaGFuZ2VzLnNlbGVjdGVkLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGVmYXVsdFNpbmdsZVNlbGVjdGlvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMub3B0aW9ucz8uY3VycmVudFZhbHVlLmxlbmd0aCA+IDApXG4gICAgICAgICAgICB0aGlzLnNldERlZmF1bHRTaW5nbGVTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBzZXREZWZhdWx0U2luZ2xlU2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2VsZWN0ZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudmFsaWRPcHRpb24odGhpcy5zZWxlY3RlZCk7XG5cbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250cm9sLnZhbHVlICYmIHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkT3B0aW9uKHRoaXMuY29udHJvbC52YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGVkID0gdGhpcy5nZXRDdXJyZW50U2VsZWN0ZWRPcHRpb24odGhpcy5jb250cm9sLnZhbHVlKSBhcyBJRHJvcGRvd247XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3RlZCA9IHRoaXMub3B0aW9uc1swXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTZWxlY3RlZCA9IHRoaXMub3B0aW9uc1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0ZWQgPSB0aGlzLm9wdGlvbnNbMF07XG5cbiAgICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHRoaXMuY3VycmVudFNlbGVjdGVkLnZhbHVlKTtcbiAgICB9XG5cbiAgICBzZXREZWZhdWx0TXVsdGlwbGVTZWxlY3Rpb24oKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZWxlY3RlZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52YWxpZE9wdGlvbih0aGlzLnNlbGVjdGVkKTtcblxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSlcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRNdWx0aVNlbGVjdGVkID0gW3RoaXMub3B0aW9uc1swXV07XG5cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRNdWx0aVNlbGVjdGVkID0gW3RoaXMub3B0aW9uc1tpbmRleF1dO1xuXG4gICAgICAgICAgICB0aGlzLm11bHRpU2VsZWN0VGV4dCA9IHRoaXMuY3VycmVudE11bHRpU2VsZWN0ZWQubWFwKHggPT4geC5sYWJlbCkuam9pbignLCAnKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh0aGlzLmN1cnJlbnRNdWx0aVNlbGVjdGVkLm1hcCh4ID0+IHgudmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkLmNvbnN0cnVjdG9yLm5hbWUgPT0gJ0FycmF5Jykge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRPcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgICAgICAgICBjb25zdCBhcnIgPSBBcnJheS5mcm9tKHRoaXMuc2VsZWN0ZWQpO1xuXG4gICAgICAgICAgICBhcnIuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudmFsaWRPcHRpb24oeCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgICAgICB2YWxpZE9wdGlvbnMucHVzaCh0aGlzLm9wdGlvbnNbaW5kZXhdLnZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRNdWx0aVNlbGVjdGVkID0gdGhpcy5nZXRDdXJyZW50TXVsdGlTZWxlY3RlZE9wdGlvbih2YWxpZE9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdFRleHQgPSB0aGlzLmN1cnJlbnRNdWx0aVNlbGVjdGVkLm1hcCh4ID0+IHgubGFiZWwpLmpvaW4oJywgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodGhpcy5jdXJyZW50TXVsdGlTZWxlY3RlZC5tYXAoeCA9PiB4LnZhbHVlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YWxpZE9wdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJycpXG4gICAgICAgICAgICByZXR1cm4gLTE7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0udmFsdWUgPT09IHZhbHVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIGNoYW5nZURyb3Bkb3duKG1hdFNlbGVjdENoYW5nZTogTWF0U2VsZWN0Q2hhbmdlKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZCA9IHRoaXMuZ2V0Q3VycmVudFNlbGVjdGVkT3B0aW9uKG1hdFNlbGVjdENoYW5nZS52YWx1ZSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0ZWQgPSBjdXJyZW50U2VsZWN0ZWQgYXMgSURyb3Bkb3duO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdCh0aGlzLmN1cnJlbnRTZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRDdXJyZW50U2VsZWN0ZWRPcHRpb24odmFsdWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZpbmQoKHg6IElEcm9wZG93bikgPT4geC52YWx1ZSA9PT0gdmFsdWUpO1xuICAgIH1cblxuICAgIGdldEN1cnJlbnRNdWx0aVNlbGVjdGVkT3B0aW9uKG9wdGlvbnNBcnJheTogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBsZXQgZGF0YTogSURyb3Bkb3duO1xuXG4gICAgICAgIHJldHVybiBvcHRpb25zQXJyYXkubWFwKCh4OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JFYWNoKCh5OiBJRHJvcGRvd24pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoeCA9PT0geS52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHkgYXMgSURyb3Bkb3duO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBkYXRhIGFzIElEcm9wZG93bjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2hhbmdlTXVsdGlEcm9wZG93bihtYXRTZWxlY3RDaGFuZ2U6IE1hdFNlbGVjdENoYW5nZSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRNdWx0aVNlbGVjdGVkID0gdGhpcy5nZXRDdXJyZW50TXVsdGlTZWxlY3RlZE9wdGlvbihtYXRTZWxlY3RDaGFuZ2UudmFsdWUpO1xuXG4gICAgICAgIHRoaXMubXVsdGlTZWxlY3RUZXh0ID0gdGhpcy5jdXJyZW50TXVsdGlTZWxlY3RlZC5tYXAoeCA9PiB4LmxhYmVsKS5qb2luKCcsICcpO1xuICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KHRoaXMuY3VycmVudE11bHRpU2VsZWN0ZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2xhc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBbJ2NmLWRyb3Bkb3duLW92ZXJsYXktcGFuZScsIHRoaXMudGhlbWVdO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjZi1kcm9wZG93biBjb250YWluZXJcIiBbbmdDbGFzc109XCJjbGFzc2VzXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0xhYmVsXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIj57eyBsYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgW2NsYXNzLmVycm9yXT1cImNvbnRyb2wuaW52YWxpZCAmJiBjb250cm9sLnRvdWNoZWRcIiBjbGFzcz1cImRyb3Bkb3duLWhvbGRlclwiIFtuZ0NsYXNzXT1cImNsYXNzZXNcIlxuICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBGb3IgbXVsdGkgc2VsZWN0IGRyb3Bkb3duIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IG1hdE5hdGl2ZUNvbnRyb2wgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cImNoYW5nZU11bHRpRHJvcGRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNsYXNzZXNcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBtdWx0aXBsZSAqbmdJZj1cIm11bHRpcGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdTdHlsZV09XCJ7IGNvbG9yOiB0aGVtZSA9PT0gJ2RhcmsnID8gJ3doaXRlJyA6ICdibGFjaycgfVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlTZWxlY3RUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbS52YWx1ZVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIG9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJpdGVtLmxvZ29cIiBbYWx0XT1cIml0ZW0ubGFiZWxcIiB3aWR0aD1cIjI1XCIgKm5nSWY9XCJzaG93TG9nb1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG5cbiAgICAgICAgICAgICAgICA8IS0tIEZvciBzaW5nbGUgc2VsZWN0IGRyb3Bkb3duIC0tPlxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IG1hdE5hdGl2ZUNvbnRyb2wgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cImNoYW5nZURyb3Bkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbcGFuZWxDbGFzc109XCJjbGFzc2VzXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgKm5nSWY9XCIhbXVsdGlwbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjdXJyZW50U2VsZWN0ZWQubG9nb1wiIFthbHRdPVwiY3VycmVudFNlbGVjdGVkLmxhYmVsXCIgd2lkdGg9XCIyNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDAuNXJlbVwiICpuZ0lmPVwic2hvd0xvZ29cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nU3R5bGVdPVwieyBjb2xvcjogdGhlbWUgPT09ICdkYXJrJyA/ICd3aGl0ZScgOiAnYmxhY2snIH1cIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZC5sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW2Rpc2FibGVkXT1cIiFpdGVtLm9wdGlvbkVuYWJsZWRcIiBbdmFsdWVdPVwiaXRlbS52YWx1ZVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIG9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBkZXNjcmlwdGlvbjogc2hvd0Rlc2NyaXB0aW9uLCBkYXJrOiB0aGVtZSA9PT0gJ2RhcmsnLCBsaWdodDogdGhlbWUgPT09ICdsaWdodCcgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cIml0ZW0ubG9nb1wiIFthbHRdPVwiaXRlbS5sYWJlbFwiIHdpZHRoPVwiMjVcIiAqbmdJZj1cInNob3dMb2dvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1yaWdodDogMC41cmVtXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJpbWFyeS10ZXh0XCI+e3sgaXRlbS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kZXNjcmlwdGlvblwiICpuZ0lmPVwic2hvd0Rlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5kZXNjcmlwdGlvbiB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNvbnRyb2wuZXJyb3JzICYmIGNvbnRyb2wudG91Y2hlZFwiPlxuICAgICAgICB7eyBjb250cm9sLmVycm9yc1tvYmplY3RGbi5rZXlzKGNvbnRyb2wuZXJyb3JzKVswXV0gfX1cbiAgICA8L3NwYW4+XG48L2Rpdj4iXX0=