UNPKG

@alfresco/adf-content-services

Version:
146 lines 25.6 kB
/*! * @license * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { Component, Input, ViewEncapsulation } from '@angular/core'; import { MatRadioModule } from '@angular/material/radio'; import { SearchFilterList } from '../../models/search-filter-list.model'; import { ReplaySubject } from 'rxjs'; import { first } from 'rxjs/operators'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { TranslateModule } from '@ngx-translate/core'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/material/radio"; import * as i3 from "@angular/forms"; import * as i4 from "@ngx-translate/core"; import * as i5 from "@angular/material/button"; import * as i6 from "@angular/material/icon"; export class SearchRadioComponent { constructor() { this.pageSize = 5; this.isActive = false; this.displayValue$ = new ReplaySubject(1); this.options = new SearchFilterList(); } ngOnInit() { if (this.settings) { this.pageSize = this.settings.pageSize || 5; if (this.settings.options && this.settings.options.length > 0) { this.options = new SearchFilterList(this.settings.options, this.pageSize); } } const initialValue = this.getSelectedValue(); if (initialValue !== null) { this.value = initialValue; this.context.queryFragments[this.id] = initialValue; } else if (this.startValue !== null) { this.value = initialValue; this.context.queryFragments[this.id] = initialValue; } this.enableChangeUpdate = this.settings.allowUpdateOnChange ?? true; this.updateDisplayValue(); this.context.populateFilters .asObservable() .pipe(first()) .subscribe((filtersQueries) => { if (filtersQueries[this.id]) { this.value = filtersQueries[this.id]; this.submitValues(false); } else { this.reset(false); } this.context.filterLoaded.next(); }); } getSelectedValue() { const options = this.settings['options'] || []; if (options && options.length > 0) { this.isActive = true; let selected = options.find((opt) => opt.default); if (!selected) { selected = options[0]; } return selected.value; } return null; } submitValues(updateContext = true) { this.setValue(this.value); this.updateDisplayValue(); if (updateContext) { this.context.update(); } } hasValidValue() { const currentValue = this.getSelectedValue(); return !!currentValue; } setValue(newValue) { this.value = newValue; this.context.queryFragments[this.id] = newValue; this.context.filterRawParams[this.id] = newValue; if (this.enableChangeUpdate) { this.updateDisplayValue(); this.context.update(); } } getCurrentValue() { return this.getSelectedValue(); } updateDisplayValue() { const selectOptions = this.options.items.find(({ value }) => value === this.value); if (selectOptions) { this.displayValue$.next(selectOptions.name); } else { this.displayValue$.next(''); } } changeHandler(event) { this.setValue(event.value); } clear() { this.isActive = false; const initialValue = this.getSelectedValue(); if (initialValue !== null) { this.setValue(initialValue); } } reset(updateContext = true) { const initialValue = this.getSelectedValue(); if (initialValue !== null) { this.setValue(initialValue); this.updateDisplayValue(); if (updateContext) { this.context.update(); } } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: SearchRadioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: SearchRadioComponent, isStandalone: true, selector: "adf-search-radio", inputs: { value: "value" }, host: { classAttribute: "adf-search-radio" }, ngImport: i0, template: "<mat-radio-group\n class=\"adf-search-radio-group\"\n [(ngModel)]=\"value\"\n (change)=\"changeHandler($event)\">\n <mat-radio-button [attr.data-automation-id]=\"'search-radio-'+(option.name | translate)\"\n *ngFor=\"let option of options\"\n [value]=\"option.value\"\n class=\"adf-facet-filter\">\n <div title=\"{{ option.name | translate }}\" class=\"adf-filter-label\">\n {{ option.name | translate }}\n </div>\n </mat-radio-button>\n</mat-radio-group>\n\n<div class=\"adf-facet-buttons\" *ngIf=\"!options.fitsPage\">\n <button mat-icon-button\n *ngIf=\"options.canShowLessItems\"\n title=\"{{ 'SEARCH.FILTER.ACTIONS.SHOW-LESS' | translate }}\"\n (click)=\"options.showLessItems()\">\n <mat-icon>keyboard_arrow_up</mat-icon>\n </button>\n <button mat-icon-button\n *ngIf=\"options.canShowMoreItems\"\n title=\"{{ 'SEARCH.FILTER.ACTIONS.SHOW-MORE' | translate }}\"\n (click)=\"options.showMoreItems()\">\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n</div>\n", styles: [".adf-search-radio .adf-search-radio-group{display:flex;flex-direction:column}.adf-search-radio .adf-facet-filter{margin:5px}.adf-search-radio .adf-facet-filter .adf-filter-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i2.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i2.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: SearchRadioComponent, decorators: [{ type: Component, args: [{ selector: 'adf-search-radio', standalone: true, imports: [CommonModule, MatRadioModule, FormsModule, TranslateModule, MatButtonModule, MatIconModule], encapsulation: ViewEncapsulation.None, host: { class: 'adf-search-radio' }, template: "<mat-radio-group\n class=\"adf-search-radio-group\"\n [(ngModel)]=\"value\"\n (change)=\"changeHandler($event)\">\n <mat-radio-button [attr.data-automation-id]=\"'search-radio-'+(option.name | translate)\"\n *ngFor=\"let option of options\"\n [value]=\"option.value\"\n class=\"adf-facet-filter\">\n <div title=\"{{ option.name | translate }}\" class=\"adf-filter-label\">\n {{ option.name | translate }}\n </div>\n </mat-radio-button>\n</mat-radio-group>\n\n<div class=\"adf-facet-buttons\" *ngIf=\"!options.fitsPage\">\n <button mat-icon-button\n *ngIf=\"options.canShowLessItems\"\n title=\"{{ 'SEARCH.FILTER.ACTIONS.SHOW-LESS' | translate }}\"\n (click)=\"options.showLessItems()\">\n <mat-icon>keyboard_arrow_up</mat-icon>\n </button>\n <button mat-icon-button\n *ngIf=\"options.canShowMoreItems\"\n title=\"{{ 'SEARCH.FILTER.ACTIONS.SHOW-MORE' | translate }}\"\n (click)=\"options.showMoreItems()\">\n <mat-icon>keyboard_arrow_down</mat-icon>\n </button>\n</div>\n", styles: [".adf-search-radio .adf-search-radio-group{display:flex;flex-direction:column}.adf-search-radio .adf-facet-filter{margin:5px}.adf-search-radio .adf-facet-filter .adf-filter-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}\n"] }] }], ctorParameters: () => [], propDecorators: { value: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLXJhZGlvLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvc2VhcmNoL2NvbXBvbmVudHMvc2VhcmNoLXJhZGlvL3NlYXJjaC1yYWRpby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL3NlYXJjaC9jb21wb25lbnRzL3NlYXJjaC1yYWRpby9zZWFyY2gtcmFkaW8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFrQixjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUt6RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7OztBQWdCdkQsTUFBTSxPQUFPLG9CQUFvQjtJQWU3QjtRQU5BLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2pCLGtCQUFhLEdB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QkFESixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IMKpIDIwMDUtMjAyNSBIeWxhbmQgU29mdHdhcmUsIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRSYWRpb0NoYW5nZSwgTWF0UmFkaW9Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9yYWRpbyc7XG5cbmltcG9ydCB7IFNlYXJjaFdpZGdldCB9IGZyb20gJy4uLy4uL21vZGVscy9zZWFyY2gtd2lkZ2V0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBTZWFyY2hXaWRnZXRTZXR0aW5ncyB9IGZyb20gJy4uLy4uL21vZGVscy9zZWFyY2gtd2lkZ2V0LXNldHRpbmdzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTZWFyY2hRdWVyeUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2VhcmNoLXF1ZXJ5LWJ1aWxkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTZWFyY2hGaWx0ZXJMaXN0IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NlYXJjaC1maWx0ZXItbGlzdC5tb2RlbCc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSYWRpb09wdGlvbiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYWRmLXNlYXJjaC1yYWRpbycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRSYWRpb01vZHVsZSwgRm9ybXNNb2R1bGUsIFRyYW5zbGF0ZU1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uTW9kdWxlXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLXJhZGlvLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zZWFyY2gtcmFkaW8uY29tcG9uZW50LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGhvc3Q6IHsgY2xhc3M6ICdhZGYtc2VhcmNoLXJhZGlvJyB9XG59KVxuZXhwb3J0IGNsYXNzIFNlYXJjaFJhZGlvQ29tcG9uZW50IGltcGxlbWVudHMgU2VhcmNoV2lkZ2V0LCBPbkluaXQge1xuICAgIC8qKiBUaGUgdmFsdWUgb2YgdGhlIHNlbGVjdGVkIHJhZGlvIGJ1dHRvbi4gKi9cbiAgICBASW5wdXQoKVxuICAgIHZhbHVlOiBzdHJpbmc7XG5cbiAgICBpZDogc3RyaW5nO1xuICAgIHNldHRpbmdzOiBTZWFyY2hXaWRnZXRTZXR0aW5ncztcbiAgICBjb250ZXh0OiBTZWFyY2hRdWVyeUJ1aWxkZXJTZXJ2aWNlO1xuICAgIG9wdGlvbnM6IFNlYXJjaEZpbHRlckxpc3Q8U2VhcmNoUmFkaW9PcHRpb24+O1xuICAgIHBhZ2VTaXplID0gNTtcbiAgICBpc0FjdGl2ZSA9IGZhbHNlO1xuICAgIHN0YXJ0VmFsdWU6IGFueTtcbiAgICBlbmFibGVDaGFuZ2VVcGRhdGU6IGJvb2xlYW47XG4gICAgZGlzcGxheVZhbHVlJCA9IG5ldyBSZXBsYXlTdWJqZWN0PHN0cmluZz4oMSk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gbmV3IFNlYXJjaEZpbHRlckxpc3Q8U2VhcmNoUmFkaW9PcHRpb24+KCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gdGhpcy5zZXR0aW5ncy5wYWdlU2l6ZSB8fCA1O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5vcHRpb25zICYmIHRoaXMuc2V0dGluZ3Mub3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gbmV3IFNlYXJjaEZpbHRlckxpc3Q8U2VhcmNoUmFkaW9PcHRpb24+KHRoaXMuc2V0dGluZ3Mub3B0aW9ucywgdGhpcy5wYWdlU2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSB0aGlzLmdldFNlbGVjdGVkVmFsdWUoKTtcblxuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnF1ZXJ5RnJhZ21lbnRzW3RoaXMuaWRdID0gaW5pdGlhbFZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhcnRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5xdWVyeUZyYWdtZW50c1t0aGlzLmlkXSA9IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuYWJsZUNoYW5nZVVwZGF0ZSA9IHRoaXMuc2V0dGluZ3MuYWxsb3dVcGRhdGVPbkNoYW5nZSA/PyB0cnVlO1xuICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICAgICAgICB0aGlzLmNvbnRleHQucG9wdWxhdGVGaWx0ZXJzXG4gICAgICAgICAgICAuYXNPYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChmaWx0ZXJzUXVlcmllcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJzUXVlcmllc1t0aGlzLmlkXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gZmlsdGVyc1F1ZXJpZXNbdGhpcy5pZF07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0VmFsdWVzKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmZpbHRlckxvYWRlZC5uZXh0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlbGVjdGVkVmFsdWUoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uczogYW55W10gPSB0aGlzLnNldHRpbmdzWydvcHRpb25zJ10gfHwgW107XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IG9wdGlvbnMuZmluZCgob3B0KSA9PiBvcHQuZGVmYXVsdCk7XG4gICAgICAgICAgICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBvcHRpb25zWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN1Ym1pdFZhbHVlcyh1cGRhdGVDb250ZXh0ID0gdHJ1ZSkge1xuICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICAgICAgICBpZiAodXBkYXRlQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFzVmFsaWRWYWx1ZSgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5nZXRTZWxlY3RlZFZhbHVlKCk7XG4gICAgICAgIHJldHVybiAhIWN1cnJlbnRWYWx1ZTtcbiAgICB9XG5cbiAgICBzZXRWYWx1ZShuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnF1ZXJ5RnJhZ21lbnRzW3RoaXMuaWRdID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMuY29udGV4dC5maWx0ZXJSYXdQYXJhbXNbdGhpcy5pZF0gPSBuZXdWYWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlQ2hhbmdlVXBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTZWxlY3RlZFZhbHVlKCk7XG4gICAgfVxuXG4gICAgdXBkYXRlRGlzcGxheVZhbHVlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWxlY3RPcHRpb25zID0gdGhpcy5vcHRpb25zLml0ZW1zLmZpbmQoKHsgdmFsdWUgfSkgPT4gdmFsdWUgPT09IHRoaXMudmFsdWUpO1xuICAgICAgICBpZiAoc2VsZWN0T3B0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5VmFsdWUkLm5leHQoc2VsZWN0T3B0aW9ucy5uYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheVZhbHVlJC5uZXh0KCcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNoYW5nZUhhbmRsZXIoZXZlbnQ6IE1hdFJhZGlvQ2hhbmdlKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUoZXZlbnQudmFsdWUpO1xuICAgIH1cblxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IHRoaXMuZ2V0U2VsZWN0ZWRWYWx1ZSgpO1xuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKGluaXRpYWxWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldCh1cGRhdGVDb250ZXh0ID0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSB0aGlzLmdldFNlbGVjdGVkVmFsdWUoKTtcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShpbml0aWFsVmFsdWUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEaXNwbGF5VmFsdWUoKTtcbiAgICAgICAgICAgIGlmICh1cGRhdGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LnVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiPG1hdC1yYWRpby1ncm91cFxuICAgIGNsYXNzPVwiYWRmLXNlYXJjaC1yYWRpby1ncm91cFwiXG4gICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXG4gICAgKGNoYW5nZSk9XCJjaGFuZ2VIYW5kbGVyKCRldmVudClcIj5cbiAgICA8bWF0LXJhZGlvLWJ1dHRvbiBbYXR0ci5kYXRhLWF1dG9tYXRpb24taWRdPVwiJ3NlYXJjaC1yYWRpby0nKyhvcHRpb24ubmFtZSB8IHRyYW5zbGF0ZSlcIlxuICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNcIlxuICAgICAgICBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCJcbiAgICAgICAgY2xhc3M9XCJhZGYtZmFjZXQtZmlsdGVyXCI+XG4gICAgICAgIDxkaXYgdGl0bGU9XCJ7eyBvcHRpb24ubmFtZSB8IHRyYW5zbGF0ZSB9fVwiIGNsYXNzPVwiYWRmLWZpbHRlci1sYWJlbFwiPlxuICAgICAgICAgICAge3sgb3B0aW9uLm5hbWUgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuPC9tYXQtcmFkaW8tZ3JvdXA+XG5cbjxkaXYgY2xhc3M9XCJhZGYtZmFjZXQtYnV0dG9uc1wiICpuZ0lmPVwiIW9wdGlvbnMuZml0c1BhZ2VcIj5cbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAqbmdJZj1cIm9wdGlvbnMuY2FuU2hvd0xlc3NJdGVtc1wiXG4gICAgICAgIHRpdGxlPVwie3sgJ1NFQVJDSC5GSUxURVIuQUNUSU9OUy5TSE9XLUxFU1MnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgKGNsaWNrKT1cIm9wdGlvbnMuc2hvd0xlc3NJdGVtcygpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9hcnJvd191cDwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgKm5nSWY9XCJvcHRpb25zLmNhblNob3dNb3JlSXRlbXNcIlxuICAgICAgICB0aXRsZT1cInt7ICdTRUFSQ0guRklMVEVSLkFDVElPTlMuU0hPVy1NT1JFJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIChjbGljayk9XCJvcHRpb25zLnNob3dNb3JlSXRlbXMoKVwiPlxuICAgICAgICA8bWF0LWljb24+a2V5Ym9hcmRfYXJyb3dfZG93bjwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG48L2Rpdj5cbiJdfQ==