UNPKG

@asoftwareworld/form-builder-pro

Version:

ASW Form Builder Pro helps you with rapid development and designed web forms which includes several controls. The key feature of Form Builder is to make your content attractive and effective. We can customize our control at run time and preview the same b

206 lines 34 kB
/** * @license * Copyright ASW (A Software World) All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file */ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { CSSFrameworkEnum } from '@asoftwareworld/form-builder-pro/api'; import { Constants, Icons } from '@asoftwareworld/form-builder-pro/common'; import { AswConfirmDialog } from '@asoftwareworld/form-builder-pro/form-control/confirm-dialog'; import { AswMultiSelectDialog } from '@asoftwareworld/form-builder-pro/form-control/shared'; import * as i0 from "@angular/core"; import * as i1 from "@angular/material/dialog"; import * as i2 from "@asoftwareworld/form-builder-pro/common"; import * as i3 from "@angular/common"; import * as i4 from "@angular/forms"; import * as i5 from "@angular/material/button"; import * as i6 from "@angular/material/checkbox"; import * as i7 from "@angular/material/form-field"; import * as i8 from "@angular/material/tooltip"; import * as i9 from "@asoftwareworld/form-builder-pro/core"; export class AswCheckbox { dialog; aswApiService; constants = Constants; icons = Icons; control; propertyPersonalization = []; isPreviewTemplate = false; CSSFramework = CSSFrameworkEnum.Material; formControls = []; checkboxUpdateEvent = new EventEmitter(); checkboxDeleteEvent = new EventEmitter(); selectionChange = new EventEmitter(); duplicateControl = new EventEmitter(); constructor(dialog, aswApiService) { this.dialog = dialog; this.aswApiService = aswApiService; } ngOnInit() { if (this.control?.apiUrl) { this.callApiToFetchData(this.control); } } callApiToFetchData(control) { switch (control.method) { case 'GET': { this.aswApiService.get(control.apiUrl, control.headers).subscribe({ next: (data) => { if (data?.value) { this.control.options = data.value; } else { this.control.options = data; } } }); break; } case 'POST': { this.aswApiService.post(control.apiUrl, control.body, control.headers).subscribe({ next: (data) => { if (data?.value) { this.control.options = data.value; } else { this.control.options = data; } } }); break; } case 'PUT': { this.aswApiService.put(control.apiUrl, control.body, control.headers).subscribe({ next: (data) => { if (data?.value) { this.control.options = data.value; } else { this.control.options = data; } } }); break; } case 'PATCH': { this.aswApiService.patch(control.apiUrl, control.body, control.headers).subscribe({ next: (data) => { if (data?.value) { this.control.options = data.value; } else { this.control.options = data; } } }); break; } case 'DELETE': { this.aswApiService.delete(control.apiUrl, control.headers).subscribe({ next: (data) => { if (data?.value) { this.control.options = data.value; } else { this.control.options = data; } } }); break; } } } deleteCheckboxDialog(control) { const dialogRef = this.dialog.open(AswConfirmDialog, { width: '350px', data: { name: control.controlType, message: this.constants.messages.waringMessage } }); dialogRef.afterClosed().subscribe((result) => { if (result !== undefined) { this.checkboxDeleteEvent.emit(control); } }); } editCheckboxDialog(control, formControls) { let allControls = []; this.getAllExceptCurrentControl(formControls, allControls); allControls = [...new Set(allControls.map((control) => control))]; control.options.forEach((element) => { if (!element.hideControl) { element.hideControl = []; } }); const dialogRef = this.dialog.open(AswMultiSelectDialog, { width: '80%', minWidth: '70vw', disableClose: true, data: { control, CSSFramework: this.CSSFramework, propertyPersonalization: this.propertyPersonalization, allControls } }); dialogRef.afterClosed().subscribe((result) => { if (result !== undefined) { this.checkboxUpdateEvent.emit(result); } }); } onSelectionChange(control) { control.value = []; control.options.forEach((element) => { if (element.isChecked) { control.value.push(element.key); } }); this.selectionChange.emit(control); } duplicateCheckboxControl(control) { this.duplicateControl.emit(control); } getAllExceptCurrentControl(formControls, allControls) { //allControls.push(...formControls.filter((x) => x.id !== this.control.id)); const columnsControls = formControls.filter((x) => x.controlType === 'columns'); if (columnsControls.length) { columnsControls.forEach((control) => { let isSelectedControl = false; control.columns.forEach((column) => { column.components.forEach((component) => { if (component.controlType === 'columns') { this.getAllExceptCurrentControl(column.components, allControls); } if (component.id === this.control.id) { isSelectedControl = true; } }); }); if (!isSelectedControl) { allControls.push(control); } }); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswCheckbox, deps: [{ token: i1.MatDialog }, { token: i2.AswApiService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: AswCheckbox, selector: "asw-checkbox", inputs: { control: "control", propertyPersonalization: "propertyPersonalization", isPreviewTemplate: "isPreviewTemplate", CSSFramework: "CSSFramework", formControls: "formControls" }, outputs: { checkboxUpdateEvent: "checkboxUpdateEvent", checkboxDeleteEvent: "checkboxDeleteEvent", selectionChange: "selectionChange", duplicateControl: "duplicateControl" }, ngImport: i0, template: "<ng-container *ngIf=\"control as control\">\r\n <mat-label [innerHTML]=\"(control.label | aswTranslate) | aswSafeHtml\"></mat-label>\r\n <div *ngFor=\"let option of control.options\">\r\n <mat-checkbox color=\"primary\"\r\n [class]=\"control.customClass\"\r\n [matTooltip]=\"option.value\"\r\n [(ngModel)]=\"option.isChecked\"\r\n (change)=\"onSelectionChange(control)\"\r\n [required]=\"control.isRequired\"\r\n [disabled]=\"control.isDisabled ? true : false\">\r\n {{option.value}}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"asw-row\" *ngIf=\"isPreviewTemplate\">\r\n <div class=\"asw-col-md-12\" align=\"right\">\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"{{'FormControl.Duplicate' | aswTranslate}}\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"duplicateCheckboxControl(control)\">\r\n <div [innerHTML]=\"icons.contentCopy | aswSafeHtml\"></div>\r\n </button>\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"{{'FormControl.Edit' | aswTranslate}}\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"editCheckboxDialog(control, formControls)\">\r\n <div [innerHTML]=\"icons.edit | aswSafeHtml\"></div>\r\n </button>\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"{{'FormControl.Delete' | aswTranslate}}\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"deleteCheckboxDialog(control)\">\r\n <div [innerHTML]=\"icons.delete2 | aswSafeHtml\"></div>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-container>\r\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i9.AswTranslatePipe, name: "aswTranslate" }, { kind: "pipe", type: i2.AswSafeHtmlPipe, name: "aswSafeHtml" }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswCheckbox, decorators: [{ type: Component, args: [{ selector: 'asw-checkbox', template: "<ng-container *ngIf=\"control as control\">\r\n <mat-label [innerHTML]=\"(control.label | aswTranslate) | aswSafeHtml\"></mat-label>\r\n <div *ngFor=\"let option of control.options\">\r\n <mat-checkbox color=\"primary\"\r\n [class]=\"control.customClass\"\r\n [matTooltip]=\"option.value\"\r\n [(ngModel)]=\"option.isChecked\"\r\n (change)=\"onSelectionChange(control)\"\r\n [required]=\"control.isRequired\"\r\n [disabled]=\"control.isDisabled ? true : false\">\r\n {{option.value}}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"asw-row\" *ngIf=\"isPreviewTemplate\">\r\n <div class=\"asw-col-md-12\" align=\"right\">\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"{{'FormControl.Duplicate' | aswTranslate}}\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"duplicateCheckboxControl(control)\">\r\n <div [innerHTML]=\"icons.contentCopy | aswSafeHtml\"></div>\r\n </button>\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"{{'FormControl.Edit' | aswTranslate}}\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"editCheckboxDialog(control, formControls)\">\r\n <div [innerHTML]=\"icons.edit | aswSafeHtml\"></div>\r\n </button>\r\n <button mat-icon-button \r\n type=\"button\" \r\n matTooltip=\"{{'FormControl.Delete' | aswTranslate}}\" \r\n [matTooltipPosition]=\"'below'\" \r\n (click)=\"deleteCheckboxDialog(control)\">\r\n <div [innerHTML]=\"icons.delete2 | aswSafeHtml\"></div>\r\n </button>\r\n </div>\r\n </div>\r\n</ng-container>\r\n" }] }], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.AswApiService }], propDecorators: { control: [{ type: Input }], propertyPersonalization: [{ type: Input }], isPreviewTemplate: [{ type: Input }], CSSFramework: [{ type: Input }], formControls: [{ type: Input }], checkboxUpdateEvent: [{ type: Output }], checkboxDeleteEvent: [{ type: Output }], selectionChange: [{ type: Output }], duplicateControl: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9mb3JtLWNvbnRyb2wvY2hlY2tib3gvY2hlY2tib3gudHMiLCIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9mb3JtLWNvbnRyb2wvY2hlY2tib3gvY2hlY2tib3guaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFpQixNQUFNLHlDQUF5QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNEQUFzRCxDQUFDOzs7Ozs7Ozs7OztBQU81RixNQUFNLE9BQU8sV0FBVztJQWVUO0lBQ0M7SUFmWixTQUFTLEdBQVEsU0FBUyxDQUFDO0lBQzNCLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDTCxPQUFPLENBQU07SUFDYix1QkFBdUIsR0FBYSxFQUFFLENBQUM7SUFDdkMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQzFCLFlBQVksR0FBcUIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0lBQzNELFlBQVksR0FBVSxFQUFFLENBQUM7SUFFeEIsbUJBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7SUFDMUQsbUJBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7SUFDMUQsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO0lBQ3RELGdCQUFnQixHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO0lBRWpFLFlBQ1csTUFBaUIsRUFDaEIsYUFBNEI7UUFE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Q0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUNyQixXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM5QixDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQzt1R0EvSlEsV0FBVzsyRkFBWCxXQUFXLDJaQ3BCeEIsKzVEQXVDQTs7MkZEbkJhLFdBQVc7a0JBSnZCLFNBQVM7K0JBQ0ksY0FBYzswR0FNZixPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUksbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBU1cgKEEgU29mdHdhcmUgV29ybGQpIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGVcbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IENTU0ZyYW1ld29ya0VudW0gfSBmcm9tICdAYXNvZnR3YXJld29ybGQvZm9ybS1idWlsZGVyLXByby9hcGknO1xuaW1wb3J0IHsgQ29uc3RhbnRzLCBJY29ucywgQXN3QXBpU2VydmljZSB9IGZyb20gJ0Bhc29mdHdhcmV3b3JsZC9mb3JtLWJ1aWxkZXItcHJvL2NvbW1vbic7XG5pbXBvcnQgeyBBc3dDb25maXJtRGlhbG9nIH0gZnJvbSAnQGFzb2Z0d2FyZXdvcmxkL2Zvcm0tYnVpbGRlci1wcm8vZm9ybS1jb250cm9sL2NvbmZpcm0tZGlhbG9nJztcbmltcG9ydCB7IEFzd011bHRpU2VsZWN0RGlhbG9nIH0gZnJvbSAnQGFzb2Z0d2FyZXdvcmxkL2Zvcm0tYnVpbGRlci1wcm8vZm9ybS1jb250cm9sL3NoYXJlZCc7XG5pbXBvcnQgeyBDaGVja2JveENvbnRyb2wgfSBmcm9tICcuL2NoZWNrYm94LWNvbnRyb2wnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2Fzdy1jaGVja2JveCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NoZWNrYm94Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEFzd0NoZWNrYm94IHtcbiAgICBjb25zdGFudHM6IGFueSA9IENvbnN0YW50cztcbiAgICBpY29ucyA9IEljb25zO1xuICAgIEBJbnB1dCgpIGNvbnRyb2w6IGFueTtcbiAgICBASW5wdXQoKSBwcm9wZXJ0eVBlcnNvbmFsaXphdGlvbjogc3RyaW5nW10gPSBbXTtcbiAgICBASW5wdXQoKSBpc1ByZXZpZXdUZW1wbGF0ZSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIENTU0ZyYW1ld29yazogQ1NTRnJhbWV3b3JrRW51bSA9IENTU0ZyYW1ld29ya0VudW0uTWF0ZXJpYWw7XG4gICAgQElucHV0KCkgZm9ybUNvbnRyb2xzOiBhbnlbXSA9IFtdO1xuXG4gICAgQE91dHB1dCgpIGNoZWNrYm94VXBkYXRlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPENoZWNrYm94Q29udHJvbD4oKTtcbiAgICBAT3V0cHV0KCkgY2hlY2tib3hEZWxldGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hlY2tib3hDb250cm9sPigpO1xuICAgIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENoZWNrYm94Q29udHJvbD4oKTtcbiAgICBAT3V0cHV0KCkgZHVwbGljYXRlQ29udHJvbCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hlY2tib3hDb250cm9sPigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICAgICAgcHJpdmF0ZSBhc3dBcGlTZXJ2aWNlOiBBc3dBcGlTZXJ2aWNlXG4gICAgKSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2w/LmFwaVVybCkge1xuICAgICAgICAgICAgdGhpcy5jYWxsQXBpVG9GZXRjaERhdGEodGhpcy5jb250cm9sKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2FsbEFwaVRvRmV0Y2hEYXRhKGNvbnRyb2w6IGFueSkge1xuICAgICAgICBzd2l0Y2ggKGNvbnRyb2wubWV0aG9kKSB7XG4gICAgICAgICAgICBjYXNlICdHRVQnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3dBcGlTZXJ2aWNlLmdldChjb250cm9sLmFwaVVybCwgY29udHJvbC5oZWFkZXJzKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBuZXh0OiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGE/LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLm9wdGlvbnMgPSBkYXRhLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wub3B0aW9ucyA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ1BPU1QnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hc3dBcGlTZXJ2aWNlLnBvc3QoY29udHJvbC5hcGlVcmwsIGNvbnRyb2wuYm9keSwgY29udHJvbC5oZWFkZXJzKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBuZXh0OiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGE/LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLm9wdGlvbnMgPSBkYXRhLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wub3B0aW9ucyA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ1BVVCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzd0FwaVNlcnZpY2UucHV0KGNvbnRyb2wuYXBpVXJsLCBjb250cm9sLmJvZHksIGNvbnRyb2wuaGVhZGVycykuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhPy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5vcHRpb25zID0gZGF0YS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLm9wdGlvbnMgPSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdQQVRDSCc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzd0FwaVNlcnZpY2UucGF0Y2goY29udHJvbC5hcGlVcmwsIGNvbnRyb2wuYm9keSwgY29udHJvbC5oZWFkZXJzKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBuZXh0OiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGE/LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLm9wdGlvbnMgPSBkYXRhLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wub3B0aW9ucyA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ0RFTEVURSc6IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFzd0FwaVNlcnZpY2UuZGVsZXRlKGNvbnRyb2wuYXBpVXJsLCBjb250cm9sLmhlYWRlcnMpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgICAgIG5leHQ6IChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YT8udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wub3B0aW9ucyA9IGRhdGEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5vcHRpb25zID0gZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVsZXRlQ2hlY2tib3hEaWFsb2coY29udHJvbDogQ2hlY2tib3hDb250cm9sKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQXN3Q29uZmlybURpYWxvZywge1xuICAgICAgICAgICAgd2lkdGg6ICczNTBweCcsXG4gICAgICAgICAgICBkYXRhOiB7IG5hbWU6IGNvbnRyb2wuY29udHJvbFR5cGUsIG1lc3NhZ2U6IHRoaXMuY29uc3RhbnRzLm1lc3NhZ2VzLndhcmluZ01lc3NhZ2UgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tib3hEZWxldGVFdmVudC5lbWl0KGNvbnRyb2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBlZGl0Q2hlY2tib3hEaWFsb2coY29udHJvbDogQ2hlY2tib3hDb250cm9sLCBmb3JtQ29udHJvbHM6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGxldCBhbGxDb250cm9sczogYW55W10gPSBbXTtcbiAgICAgICAgdGhpcy5nZXRBbGxFeGNlcHRDdXJyZW50Q29udHJvbChmb3JtQ29udHJvbHMsIGFsbENvbnRyb2xzKTtcbiAgICAgICAgYWxsQ29udHJvbHMgPSBbLi4ubmV3IFNldChhbGxDb250cm9scy5tYXAoKGNvbnRyb2wpID0+IGNvbnRyb2wpKV07XG4gICAgICAgIGNvbnRyb2wub3B0aW9ucy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQuaGlkZUNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmhpZGVDb250cm9sID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFzd011bHRpU2VsZWN0RGlhbG9nLCB7XG4gICAgICAgICAgICB3aWR0aDogJzgwJScsXG4gICAgICAgICAgICBtaW5XaWR0aDogJzcwdncnLFxuICAgICAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogeyBjb250cm9sLCBDU1NGcmFtZXdvcms6IHRoaXMuQ1NTRnJhbWV3b3JrLCBwcm9wZXJ0eVBlcnNvbmFsaXphdGlvbjogdGhpcy5wcm9wZXJ0eVBlcnNvbmFsaXphdGlvbiwgYWxsQ29udHJvbHMgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tib3hVcGRhdGVFdmVudC5lbWl0KHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uU2VsZWN0aW9uQ2hhbmdlKGNvbnRyb2w6IENoZWNrYm94Q29udHJvbCk6IHZvaWQge1xuICAgICAgICBjb250cm9sLnZhbHVlID0gW107XG4gICAgICAgIGNvbnRyb2wub3B0aW9ucy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5pc0NoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlLnB1c2goZWxlbWVudC5rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChjb250cm9sKTtcbiAgICB9XG5cbiAgICBkdXBsaWNhdGVDaGVja2JveENvbnRyb2woY29udHJvbDogQ2hlY2tib3hDb250cm9sKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZHVwbGljYXRlQ29udHJvbC5lbWl0KGNvbnRyb2wpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QWxsRXhjZXB0Q3VycmVudENvbnRyb2woZm9ybUNvbnRyb2xzOiBhbnlbXSwgYWxsQ29udHJvbHM6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIC8vYWxsQ29udHJvbHMucHVzaCguLi5mb3JtQ29udHJvbHMuZmlsdGVyKCh4KSA9PiB4LmlkICE9PSB0aGlzLmNvbnRyb2wuaWQpKTtcbiAgICAgICAgY29uc3QgY29sdW1uc0NvbnRyb2xzID0gZm9ybUNvbnRyb2xzLmZpbHRlcigoeCkgPT4geC5jb250cm9sVHlwZSA9PT0gJ2NvbHVtbnMnKTtcbiAgICAgICAgaWYgKGNvbHVtbnNDb250cm9scy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbHVtbnNDb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGlzU2VsZWN0ZWRDb250cm9sID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29udHJvbC5jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5jb21wb25lbnRzLmZvckVhY2goKGNvbXBvbmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmNvbnRyb2xUeXBlID09PSAnY29sdW1ucycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFsbEV4Y2VwdEN1cnJlbnRDb250cm9sKGNvbHVtbi5jb21wb25lbnRzLCBhbGxDb250cm9scyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmlkID09PSB0aGlzLmNvbnRyb2wuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkQ29udHJvbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghaXNTZWxlY3RlZENvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsQ29udHJvbHMucHVzaChjb250cm9sKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sIGFzIGNvbnRyb2xcIj5cclxuICAgIDxtYXQtbGFiZWwgW2lubmVySFRNTF09XCIoY29udHJvbC5sYWJlbCB8IGFzd1RyYW5zbGF0ZSkgfCBhc3dTYWZlSHRtbFwiPjwvbWF0LWxhYmVsPlxyXG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGNvbnRyb2wub3B0aW9uc1wiPlxyXG4gICAgICAgIDxtYXQtY2hlY2tib3ggY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgW2NsYXNzXT1cImNvbnRyb2wuY3VzdG9tQ2xhc3NcIlxyXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJvcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm9wdGlvbi5pc0NoZWNrZWRcIlxyXG4gICAgICAgICAgICAoY2hhbmdlKT1cIm9uU2VsZWN0aW9uQ2hhbmdlKGNvbnRyb2wpXCJcclxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cImNvbnRyb2wuaXNSZXF1aXJlZFwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb250cm9sLmlzRGlzYWJsZWQgPyB0cnVlIDogZmFsc2VcIj5cclxuICAgICAgICAgICAge3tvcHRpb24udmFsdWV9fVxyXG4gICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXN3LXJvd1wiICpuZ0lmPVwiaXNQcmV2aWV3VGVtcGxhdGVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXN3LWNvbC1tZC0xMlwiIGFsaWduPVwicmlnaHRcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxyXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eydGb3JtQ29udHJvbC5EdXBsaWNhdGUnIHwgYXN3VHJhbnNsYXRlfX1cIiBcclxuICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cIidiZWxvdydcIiBcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZHVwbGljYXRlQ2hlY2tib3hDb250cm9sKGNvbnRyb2wpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiaWNvbnMuY29udGVudENvcHkgfCBhc3dTYWZlSHRtbFwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxyXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eydGb3JtQ29udHJvbC5FZGl0JyB8IGFzd1RyYW5zbGF0ZX19XCIgXHJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYmVsb3cnXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRDaGVja2JveERpYWxvZyhjb250cm9sLCBmb3JtQ29udHJvbHMpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiaWNvbnMuZWRpdCB8IGFzd1NhZmVIdG1sXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7J0Zvcm1Db250cm9sLkRlbGV0ZScgfCBhc3dUcmFuc2xhdGV9fVwiIFxyXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwUG9zaXRpb25dPVwiJ2JlbG93J1wiIFxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVDaGVja2JveERpYWxvZyhjb250cm9sKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cImljb25zLmRlbGV0ZTIgfCBhc3dTYWZlSHRtbFwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuIl19