UNPKG

@xmagic/nz-formly

Version:

基于ng-zorro-antd UI 扩展的ngx-formly组件库

205 lines (199 loc) 20.8 kB
import { ChangeDetectionStrategy, Component, ViewChildren } from '@angular/core'; import { FieldType } from '@ngx-formly/core'; import { NzDropDownDirective } from 'ng-zorro-antd/dropdown'; import { Subject } from 'rxjs'; import { getRootFiled } from '@xmagic/nz-formly/common'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "ng-zorro-antd/button"; import * as i3 from "ng-zorro-antd/core/transition-patch"; import * as i4 from "ng-zorro-antd/core/wave"; import * as i5 from "ng-zorro-antd/icon"; import * as i6 from "@ngx-formly/core"; import * as i7 from "ng-zorro-antd/dropdown"; export class FormlyFieldButtonGroupComponent extends FieldType { dropdownDirectives; destroy$ = new Subject(); defaultOptions = { props: { nzSize: 'default', buttons: [] } }; constructor() { super(); } ngAfterViewInit() { this.dropdownChange(); this.dropdownDirectives.changes.subscribe(() => this.dropdownChange()); } dropdownChange() { const dropdownBtn = this.props.buttons.filter((btn) => btn.dropdown?.ref); if (!dropdownBtn.length) { return; } const rootField = getRootFiled(this.field); this.subjectDestroy(); dropdownBtn.forEach((btn, i) => { if (btn.dropdown?.nzDropdownMenu) { return; } const dropdownField = rootField.get(btn.dropdown.ref); const dropdownDir = this.dropdownDirectives.get(i); if (dropdownField && dropdownDir) { const instance = dropdownField.props.instance; btn.dropdown.nzDropdownMenu = instance; dropdownDir.nzDropdownMenu = instance; dropdownDir.ngAfterViewInit(); } }); } subjectDestroy() { this.destroy$.next(); this.destroy$.complete(); } ngOnDestroy() { this.subjectDestroy(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormlyFieldButtonGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FormlyFieldButtonGroupComponent, selector: "nz-formly-button-group", viewQueries: [{ propertyName: "dropdownDirectives", predicate: ["dropdownDirective"], descendants: true, read: NzDropDownDirective }], usesInheritance: true, ngImport: i0, template: ` <nz-button-group [nzSize]="props.nzSize" [formlyAttributes]="field"> <ng-container *ngFor="let item of props.buttons"> <ng-container *ngIf="item.dropdown?.ref; else innerTemplateRef"> <ng-container *ngTemplateOutlet="btnDropdownTemplate; context: { $implicit: item }"></ng-container> </ng-container> <ng-template #innerTemplateRef> <ng-container *ngTemplateOutlet="btnTemplate; context: { $implicit: item }"></ng-container> </ng-template> </ng-container> </nz-button-group> <ng-template #btnTemplate let-item> <button nz-button [type]="item.type || 'button'" [formlyAttributes]="{ props: item }" [nzBlock]="item.nzBlock" [nzDanger]="item.nzDanger" [nzGhost]="item.nzGhost" [nzSize]="item.nzSize || 'default'" [nzLoading]="item.nzLoading" [nzSearch]="item.nzSearch" [nzShape]="item.nzShape" [nzType]="item.nzType" [nzWaveExtraNode]="item.nzWaveExtraNode" > <i *ngIf="item.beforeIcon" nz-icon [nzType]="item.beforeIcon"></i> <span *ngIf="item.text">{{ item.text }}</span> <formly-field [field]="child" *ngFor="let child of item.fieldGroup"></formly-field> <i *ngIf="item.afterIcon" nz-icon [nzType]="item.afterIcon"></i> </button> </ng-template> <ng-template #btnDropdownTemplate let-item> <button nz-button nz-dropdown #dropdownDirective="nzDropdown" [nzDropdownMenu]="item.dropdown.nzDropdownMenu" [nzDisabled]="item.dropdown.nzDisabled" [nzPlacement]="item.dropdown.nzPlacement || 'bottomLeft'" [nzBackdrop]="item.dropdown.nzBackdrop" [nzClickHide]="item.dropdown.nzClickHide !== false" [nzTrigger]="item.dropdown.nzTrigger || 'hover'" [nzMatchWidthElement]="item.dropdown.nzMatchWidthElement" [nzOverlayClassName]="item.dropdown.nzOverlayClassName" [nzOverlayStyle]="item.dropdown.nzOverlayStyle" (nzVisibleChange)="item.dropdown.nzVisibleChange?.($event, field, this)" [type]="item.type || 'button'" [formlyAttributes]="{ props: item }" [nzBlock]="item.nzBlock" [nzDanger]="item.nzDanger" [nzGhost]="item.nzGhost" [nzSize]="item.nzSize || 'default'" [nzLoading]="item.nzLoading" [nzSearch]="item.nzSearch" [nzShape]="item.nzShape" [nzType]="item.nzType" [nzWaveExtraNode]="item.nzWaveExtraNode" > <i *ngIf="item.beforeIcon" nz-icon [nzType]="item.beforeIcon"></i> <span *ngIf="item.text">{{ item.text }}</span> <formly-field [field]="child" *ngFor="let child of item.fieldGroup"></formly-field> <i *ngIf="item.afterIcon" nz-icon [nzType]="item.afterIcon"></i> </button> </ng-template> `, isInline: true, 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: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "component", type: i2.NzButtonGroupComponent, selector: "nz-button-group", inputs: ["nzSize"], exportAs: ["nzButtonGroup"] }, { kind: "directive", type: i3.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "directive", type: i5.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: i6.FormlyField, selector: "formly-field", inputs: ["field"] }, { kind: "directive", type: i6.ɵFormlyAttributes, selector: "[formlyAttributes]", inputs: ["formlyAttributes", "id"] }, { kind: "directive", type: i7.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "directive", type: i7.NzDropdownButtonDirective, selector: "[nz-button][nz-dropdown]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormlyFieldButtonGroupComponent, decorators: [{ type: Component, args: [{ selector: 'nz-formly-button-group', template: ` <nz-button-group [nzSize]="props.nzSize" [formlyAttributes]="field"> <ng-container *ngFor="let item of props.buttons"> <ng-container *ngIf="item.dropdown?.ref; else innerTemplateRef"> <ng-container *ngTemplateOutlet="btnDropdownTemplate; context: { $implicit: item }"></ng-container> </ng-container> <ng-template #innerTemplateRef> <ng-container *ngTemplateOutlet="btnTemplate; context: { $implicit: item }"></ng-container> </ng-template> </ng-container> </nz-button-group> <ng-template #btnTemplate let-item> <button nz-button [type]="item.type || 'button'" [formlyAttributes]="{ props: item }" [nzBlock]="item.nzBlock" [nzDanger]="item.nzDanger" [nzGhost]="item.nzGhost" [nzSize]="item.nzSize || 'default'" [nzLoading]="item.nzLoading" [nzSearch]="item.nzSearch" [nzShape]="item.nzShape" [nzType]="item.nzType" [nzWaveExtraNode]="item.nzWaveExtraNode" > <i *ngIf="item.beforeIcon" nz-icon [nzType]="item.beforeIcon"></i> <span *ngIf="item.text">{{ item.text }}</span> <formly-field [field]="child" *ngFor="let child of item.fieldGroup"></formly-field> <i *ngIf="item.afterIcon" nz-icon [nzType]="item.afterIcon"></i> </button> </ng-template> <ng-template #btnDropdownTemplate let-item> <button nz-button nz-dropdown #dropdownDirective="nzDropdown" [nzDropdownMenu]="item.dropdown.nzDropdownMenu" [nzDisabled]="item.dropdown.nzDisabled" [nzPlacement]="item.dropdown.nzPlacement || 'bottomLeft'" [nzBackdrop]="item.dropdown.nzBackdrop" [nzClickHide]="item.dropdown.nzClickHide !== false" [nzTrigger]="item.dropdown.nzTrigger || 'hover'" [nzMatchWidthElement]="item.dropdown.nzMatchWidthElement" [nzOverlayClassName]="item.dropdown.nzOverlayClassName" [nzOverlayStyle]="item.dropdown.nzOverlayStyle" (nzVisibleChange)="item.dropdown.nzVisibleChange?.($event, field, this)" [type]="item.type || 'button'" [formlyAttributes]="{ props: item }" [nzBlock]="item.nzBlock" [nzDanger]="item.nzDanger" [nzGhost]="item.nzGhost" [nzSize]="item.nzSize || 'default'" [nzLoading]="item.nzLoading" [nzSearch]="item.nzSearch" [nzShape]="item.nzShape" [nzType]="item.nzType" [nzWaveExtraNode]="item.nzWaveExtraNode" > <i *ngIf="item.beforeIcon" nz-icon [nzType]="item.beforeIcon"></i> <span *ngIf="item.text">{{ item.text }}</span> <formly-field [field]="child" *ngFor="let child of item.fieldGroup"></formly-field> <i *ngIf="item.afterIcon" nz-icon [nzType]="item.afterIcon"></i> </button> </ng-template> `, changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: () => [], propDecorators: { dropdownDirectives: [{ type: ViewChildren, args: ['dropdownDirective', { read: NzDropDownDirective }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9idXR0b24tZ3JvdXAvYnV0dG9uLWdyb3VwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLFNBQVMsRUFBd0IsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7O0FBMkV4RCxNQUFNLE9BQU8sK0JBQWdDLFNBQVEsU0FBUztJQUNNLGtCQUFrQixDQUFrQztJQUN0SCxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUN0QixjQUFjLEdBQUc7UUFDeEIsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO0tBQzFDLENBQUM7SUFFRjtRQUNFLEtBQUssRUFBRSxDQUFDO0lBQ1YsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELGNBQWM7UUFDWixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7WUFDdkIsT0FBTztTQUNSO1FBRUQsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdEIsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQVEsRUFBRSxDQUFTLEVBQUUsRUFBRTtZQUMxQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFO2dCQUNoQyxPQUFPO2FBQ1I7WUFDRCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsR0FBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRCxJQUFJLGFBQWEsSUFBSSxXQUFXLEVBQUU7Z0JBQ2hDLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxLQUFNLENBQUMsUUFBUSxDQUFDO2dCQUMvQyxHQUFHLENBQUMsUUFBUSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUM7Z0JBQ3ZDLFdBQVcsQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDO2dCQUN0QyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDL0I7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7d0dBL0NVLCtCQUErQjs0RkFBL0IsK0JBQStCLHFKQUNDLG1CQUFtQixvREF4RXBEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9FVDs7NEZBR1UsK0JBQStCO2tCQXpFM0MsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsd0JBQXdCO29CQUNsQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0VUO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDt3REFFbUUsa0JBQWtCO3NCQUFuRixZQUFZO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgT25EZXN0cm95LCBRdWVyeUxpc3QsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGaWVsZFR5cGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcclxuaW1wb3J0IHsgTnpEcm9wRG93bkRpcmVjdGl2ZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvZHJvcGRvd24nO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGdldFJvb3RGaWxlZCB9IGZyb20gJ0B4bWFnaWMvbnotZm9ybWx5L2NvbW1vbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ256LWZvcm1seS1idXR0b24tZ3JvdXAnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bnotYnV0dG9uLWdyb3VwIFtuelNpemVdPVwicHJvcHMubnpTaXplXCIgW2Zvcm1seUF0dHJpYnV0ZXNdPVwiZmllbGRcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwcm9wcy5idXR0b25zXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0uZHJvcGRvd24/LnJlZjsgZWxzZSBpbm5lclRlbXBsYXRlUmVmXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnRuRHJvcGRvd25UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGl0ZW0gfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2lubmVyVGVtcGxhdGVSZWY+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYnRuVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBpdGVtIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbnotYnV0dG9uLWdyb3VwPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjYnRuVGVtcGxhdGUgbGV0LWl0ZW0+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICBuei1idXR0b25cclxuICAgICAgICBbdHlwZV09XCJpdGVtLnR5cGUgfHwgJ2J1dHRvbidcIlxyXG4gICAgICAgIFtmb3JtbHlBdHRyaWJ1dGVzXT1cInsgcHJvcHM6IGl0ZW0gfVwiXHJcbiAgICAgICAgW256QmxvY2tdPVwiaXRlbS5uekJsb2NrXCJcclxuICAgICAgICBbbnpEYW5nZXJdPVwiaXRlbS5uekRhbmdlclwiXHJcbiAgICAgICAgW256R2hvc3RdPVwiaXRlbS5uekdob3N0XCJcclxuICAgICAgICBbbnpTaXplXT1cIml0ZW0ubnpTaXplIHx8ICdkZWZhdWx0J1wiXHJcbiAgICAgICAgW256TG9hZGluZ109XCJpdGVtLm56TG9hZGluZ1wiXHJcbiAgICAgICAgW256U2VhcmNoXT1cIml0ZW0ubnpTZWFyY2hcIlxyXG4gICAgICAgIFtuelNoYXBlXT1cIml0ZW0ubnpTaGFwZVwiXHJcbiAgICAgICAgW256VHlwZV09XCJpdGVtLm56VHlwZVwiXHJcbiAgICAgICAgW256V2F2ZUV4dHJhTm9kZV09XCJpdGVtLm56V2F2ZUV4dHJhTm9kZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8aSAqbmdJZj1cIml0ZW0uYmVmb3JlSWNvblwiIG56LWljb24gW256VHlwZV09XCJpdGVtLmJlZm9yZUljb25cIj48L2k+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJpdGVtLnRleHRcIj57eyBpdGVtLnRleHQgfX08L3NwYW4+XHJcbiAgICAgICAgPGZvcm1seS1maWVsZCBbZmllbGRdPVwiY2hpbGRcIiAqbmdGb3I9XCJsZXQgY2hpbGQgb2YgaXRlbS5maWVsZEdyb3VwXCI+PC9mb3JtbHktZmllbGQ+XHJcbiAgICAgICAgPGkgKm5nSWY9XCJpdGVtLmFmdGVySWNvblwiIG56LWljb24gW256VHlwZV09XCJpdGVtLmFmdGVySWNvblwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjYnRuRHJvcGRvd25UZW1wbGF0ZSBsZXQtaXRlbT5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIG56LWJ1dHRvblxyXG4gICAgICAgIG56LWRyb3Bkb3duXHJcbiAgICAgICAgI2Ryb3Bkb3duRGlyZWN0aXZlPVwibnpEcm9wZG93blwiXHJcbiAgICAgICAgW256RHJvcGRvd25NZW51XT1cIml0ZW0uZHJvcGRvd24ubnpEcm9wZG93bk1lbnVcIlxyXG4gICAgICAgIFtuekRpc2FibGVkXT1cIml0ZW0uZHJvcGRvd24ubnpEaXNhYmxlZFwiXHJcbiAgICAgICAgW256UGxhY2VtZW50XT1cIml0ZW0uZHJvcGRvd24ubnpQbGFjZW1lbnQgfHwgJ2JvdHRvbUxlZnQnXCJcclxuICAgICAgICBbbnpCYWNrZHJvcF09XCJpdGVtLmRyb3Bkb3duLm56QmFja2Ryb3BcIlxyXG4gICAgICAgIFtuekNsaWNrSGlkZV09XCJpdGVtLmRyb3Bkb3duLm56Q2xpY2tIaWRlICE9PSBmYWxzZVwiXHJcbiAgICAgICAgW256VHJpZ2dlcl09XCJpdGVtLmRyb3Bkb3duLm56VHJpZ2dlciB8fCAnaG92ZXInXCJcclxuICAgICAgICBbbnpNYXRjaFdpZHRoRWxlbWVudF09XCJpdGVtLmRyb3Bkb3duLm56TWF0Y2hXaWR0aEVsZW1lbnRcIlxyXG4gICAgICAgIFtuek92ZXJsYXlDbGFzc05hbWVdPVwiaXRlbS5kcm9wZG93bi5uek92ZXJsYXlDbGFzc05hbWVcIlxyXG4gICAgICAgIFtuek92ZXJsYXlTdHlsZV09XCJpdGVtLmRyb3Bkb3duLm56T3ZlcmxheVN0eWxlXCJcclxuICAgICAgICAobnpWaXNpYmxlQ2hhbmdlKT1cIml0ZW0uZHJvcGRvd24ubnpWaXNpYmxlQ2hhbmdlPy4oJGV2ZW50LCBmaWVsZCwgdGhpcylcIlxyXG4gICAgICAgIFt0eXBlXT1cIml0ZW0udHlwZSB8fCAnYnV0dG9uJ1wiXHJcbiAgICAgICAgW2Zvcm1seUF0dHJpYnV0ZXNdPVwieyBwcm9wczogaXRlbSB9XCJcclxuICAgICAgICBbbnpCbG9ja109XCJpdGVtLm56QmxvY2tcIlxyXG4gICAgICAgIFtuekRhbmdlcl09XCJpdGVtLm56RGFuZ2VyXCJcclxuICAgICAgICBbbnpHaG9zdF09XCJpdGVtLm56R2hvc3RcIlxyXG4gICAgICAgIFtuelNpemVdPVwiaXRlbS5uelNpemUgfHwgJ2RlZmF1bHQnXCJcclxuICAgICAgICBbbnpMb2FkaW5nXT1cIml0ZW0ubnpMb2FkaW5nXCJcclxuICAgICAgICBbbnpTZWFyY2hdPVwiaXRlbS5uelNlYXJjaFwiXHJcbiAgICAgICAgW256U2hhcGVdPVwiaXRlbS5uelNoYXBlXCJcclxuICAgICAgICBbbnpUeXBlXT1cIml0ZW0ubnpUeXBlXCJcclxuICAgICAgICBbbnpXYXZlRXh0cmFOb2RlXT1cIml0ZW0ubnpXYXZlRXh0cmFOb2RlXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxpICpuZ0lmPVwiaXRlbS5iZWZvcmVJY29uXCIgbnotaWNvbiBbbnpUeXBlXT1cIml0ZW0uYmVmb3JlSWNvblwiPjwvaT5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0udGV4dFwiPnt7IGl0ZW0udGV4dCB9fTwvc3Bhbj5cclxuICAgICAgICA8Zm9ybWx5LWZpZWxkIFtmaWVsZF09XCJjaGlsZFwiICpuZ0Zvcj1cImxldCBjaGlsZCBvZiBpdGVtLmZpZWxkR3JvdXBcIj48L2Zvcm1seS1maWVsZD5cclxuICAgICAgICA8aSAqbmdJZj1cIml0ZW0uYWZ0ZXJJY29uXCIgbnotaWNvbiBbbnpUeXBlXT1cIml0ZW0uYWZ0ZXJJY29uXCI+PC9pPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgYCxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybWx5RmllbGRCdXR0b25Hcm91cENvbXBvbmVudCBleHRlbmRzIEZpZWxkVHlwZSBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgQFZpZXdDaGlsZHJlbignZHJvcGRvd25EaXJlY3RpdmUnLCB7IHJlYWQ6IE56RHJvcERvd25EaXJlY3RpdmUgfSkgZHJvcGRvd25EaXJlY3RpdmVzITogUXVlcnlMaXN0PE56RHJvcERvd25EaXJlY3RpdmU+O1xyXG4gIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBvdmVycmlkZSBkZWZhdWx0T3B0aW9ucyA9IHtcclxuICAgIHByb3BzOiB7IG56U2l6ZTogJ2RlZmF1bHQnLCBidXR0b25zOiBbXSB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kcm9wZG93bkNoYW5nZSgpO1xyXG4gICAgdGhpcy5kcm9wZG93bkRpcmVjdGl2ZXMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5kcm9wZG93bkNoYW5nZSgpKTtcclxuICB9XHJcblxyXG4gIGRyb3Bkb3duQ2hhbmdlKCkge1xyXG4gICAgY29uc3QgZHJvcGRvd25CdG4gPSB0aGlzLnByb3BzLmJ1dHRvbnMuZmlsdGVyKChidG46IGFueSkgPT4gYnRuLmRyb3Bkb3duPy5yZWYpO1xyXG4gICAgaWYgKCFkcm9wZG93bkJ0bi5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJvb3RGaWVsZCA9IGdldFJvb3RGaWxlZCh0aGlzLmZpZWxkKTtcclxuICAgIHRoaXMuc3ViamVjdERlc3Ryb3koKTtcclxuXHJcbiAgICBkcm9wZG93bkJ0bi5mb3JFYWNoKChidG46IGFueSwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgIGlmIChidG4uZHJvcGRvd24/Lm56RHJvcGRvd25NZW51KSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGRyb3Bkb3duRmllbGQgPSByb290RmllbGQuZ2V0IShidG4uZHJvcGRvd24ucmVmKTtcclxuICAgICAgY29uc3QgZHJvcGRvd25EaXIgPSB0aGlzLmRyb3Bkb3duRGlyZWN0aXZlcy5nZXQoaSk7XHJcbiAgICAgIGlmIChkcm9wZG93bkZpZWxkICYmIGRyb3Bkb3duRGlyKSB7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBkcm9wZG93bkZpZWxkLnByb3BzIS5pbnN0YW5jZTtcclxuICAgICAgICBidG4uZHJvcGRvd24ubnpEcm9wZG93bk1lbnUgPSBpbnN0YW5jZTtcclxuICAgICAgICBkcm9wZG93bkRpci5uekRyb3Bkb3duTWVudSA9IGluc3RhbmNlO1xyXG4gICAgICAgIGRyb3Bkb3duRGlyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHN1YmplY3REZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3ViamVjdERlc3Ryb3koKTtcclxuICB9XHJcbn1cclxuIl19