UNPKG

cytoscape-angular-ng17

Version:
91 lines 26.3 kB
import { Component, EventEmitter, Input, Output, } from '@angular/core'; import { FormControl, FormGroup, } from '@angular/forms'; import { FormInfo } from './form-info'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/forms"; import * as i3 from "primeng/button"; import * as i4 from "primeng/dropdown"; import * as i5 from "primeng/fieldset"; import * as i6 from "primeng/inputswitch"; import * as i7 from "primeng/inputtext"; import * as i8 from "primeng/tooltip"; export class FluidFormComponent { model; modelChange = new EventEmitter(); modelProperty; formInfo; formGroup; constructor() { } ngOnInit() { console.debug('FluidFormComponent this.formInfo:', JSON.stringify(this.formInfo)); let controls = {}; this.formInfo?.fieldsets.forEach((fieldsetInfo) => { fieldsetInfo.fieldInfos.forEach((fieldInfo) => { if (!this.model || !fieldInfo || !fieldInfo.modelProperty) { return; } let modelValue = this.model[fieldInfo.modelProperty]; // console.log('fieldInfo.modelProperty:', fieldInfo.modelProperty, ', modelValue:', modelValue) const validators = typeof fieldInfo.validators === 'function' ? fieldInfo.validators() : fieldInfo.validators; const asyncValidators = typeof fieldInfo.asyncValidators === 'function' ? fieldInfo.asyncValidators() : fieldInfo.asyncValidators; const { updateOn } = fieldInfo; let formControl = new FormControl(modelValue, { validators, asyncValidators, updateOn, }); formControl.valueChanges.subscribe((change) => { if (!this.model || !fieldInfo || !fieldInfo.modelProperty) { return; } console.debug('form control change ', JSON.stringify(change), ' for prop ', fieldInfo.modelProperty, ', changing current model value ', this.model[fieldInfo.modelProperty], ' to ', change); fieldInfo.setValue(change, this.model, this.modelChange); }); controls[fieldInfo.modelProperty] = formControl; }); }); this.formGroup = new FormGroup(controls); } ngOnChanges(changes) { console.debug('ngOnChanges fluid-form changes:', JSON.stringify(changes)); if (changes['model']) { const model = changes['model'].currentValue; for (let key of Object.keys(model)) { console.debug('ngOnChanges model key copying to form:', key); const control = this.formGroup?.controls[key]; control ? control.setValue(model[key], { emitEvent: false }) : console.warn('no control for model key ', key); } } } ngAfterViewInit() { // console.debug("ngAfterViewInit") } ngAfterViewChecked() { // console.debug("ngAfterViewChecked") } onSubmit() { console.log(`Form submitted`); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: FluidFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.3", type: FluidFormComponent, selector: "cyng-fluid-form", inputs: { model: "model", modelProperty: "modelProperty", formInfo: "formInfo" }, outputs: { modelChange: "modelChange" }, usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"formGroup\" [title]=\"formInfo?.title\" (ngSubmit)=\"onSubmit()\">\n <ng-container *ngFor=\"let fieldSetInfo of formInfo.fieldsets\">\n <p-fieldset\n *ngIf=\"model && fieldSetInfo.showFieldsetForModel(model)\"\n class=\"fieldset\"\n legend=\"{{ fieldSetInfo.legend }}\"\n >\n <div class=\"ui-g ui-fluid\">\n <div\n class=\"ui-g-12 ui-md-4 field\"\n *ngFor=\"let fieldInfo of fieldSetInfo.fieldInfos\"\n >\n <div class=\"ui-inputgroup\">\n <ng-container *ngIf=\"fieldInfo.fieldType(model) === 'boolean'\">\n <span class=\"ui-chkbox-label\">\n {{ fieldInfo.label }}\n </span>\n <p-inputSwitch\n name=\"{{ fieldInfo.modelProperty }}\"\n pTooltip=\"{{ fieldInfo.tooltip }}\"\n formControlName=\"{{ fieldInfo.modelProperty }}\"\n >\n </p-inputSwitch>\n </ng-container>\n <ng-container\n *ngIf=\"\n fieldInfo.fieldType(model) === 'string' ||\n fieldInfo.fieldType(model) === 'number'\n \"\n >\n <span class=\"ui-float-label\">\n <input\n pInputText\n id=\"{{ fieldInfo.modelProperty }}\"\n name=\"{{ fieldInfo.modelProperty }}\"\n formControlName=\"{{ fieldInfo.modelProperty }}\"\n [pTooltip]=\"fieldInfo.tooltip\"\n [type]=\"fieldInfo.inputType\"\n [size]=\"fieldInfo.inputSize\"\n />\n <label for=\"{{ fieldInfo.modelProperty }}\">{{\n fieldInfo.label\n }}</label>\n </span>\n </ng-container>\n <ng-container\n *ngIf=\"\n fieldInfo.fieldType(model) === 'options' &&\n fieldInfo.options &&\n fieldInfo.optionArrayLabelField\n \"\n >\n <span class=\"ui-float-label\">\n <p-dropdown\n formControlName=\"{{ fieldInfo.modelProperty }}\"\n [name]=\"fieldInfo.modelProperty\"\n [options]=\"fieldInfo.options\"\n [optionLabel]=\"fieldInfo.optionArrayLabelField\"\n [pTooltip]=\"fieldInfo.tooltip\"\n ></p-dropdown>\n <label for=\"{{ fieldInfo.modelProperty }}\">{{\n fieldInfo.label\n }}</label>\n </span>\n </ng-container>\n </div>\n </div>\n </div>\n </p-fieldset>\n </ng-container>\n</form>\n<button\n *ngIf=\"formInfo.showSubmitButton\"\n pButton\n [disabled]=\"formInfo.disableSubmitOnFormInvalid && !formGroup.valid\"\n (submit)=\"onSubmit()\"\n>\n {{ formInfo.submitText || \"Submit\" }}\n</button>\n", styles: [".ui-chkbox-label{padding-right:.5em}.ui-dropdown-label{align-self:center;padding-right:.5em}.field:nth-child(n+4){margin-top:1em}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { 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.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i4.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i5.Fieldset, selector: "p-fieldset", inputs: ["legend", "toggleable", "collapsed", "style", "styleClass", "transitionOptions"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "component", type: i6.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy"], outputs: ["onChange"] }, { kind: "directive", type: i7.InputText, selector: "[pInputText]" }, { kind: "directive", type: i8.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: FluidFormComponent, decorators: [{ type: Component, args: [{ selector: 'cyng-fluid-form', template: "<form [formGroup]=\"formGroup\" [title]=\"formInfo?.title\" (ngSubmit)=\"onSubmit()\">\n <ng-container *ngFor=\"let fieldSetInfo of formInfo.fieldsets\">\n <p-fieldset\n *ngIf=\"model && fieldSetInfo.showFieldsetForModel(model)\"\n class=\"fieldset\"\n legend=\"{{ fieldSetInfo.legend }}\"\n >\n <div class=\"ui-g ui-fluid\">\n <div\n class=\"ui-g-12 ui-md-4 field\"\n *ngFor=\"let fieldInfo of fieldSetInfo.fieldInfos\"\n >\n <div class=\"ui-inputgroup\">\n <ng-container *ngIf=\"fieldInfo.fieldType(model) === 'boolean'\">\n <span class=\"ui-chkbox-label\">\n {{ fieldInfo.label }}\n </span>\n <p-inputSwitch\n name=\"{{ fieldInfo.modelProperty }}\"\n pTooltip=\"{{ fieldInfo.tooltip }}\"\n formControlName=\"{{ fieldInfo.modelProperty }}\"\n >\n </p-inputSwitch>\n </ng-container>\n <ng-container\n *ngIf=\"\n fieldInfo.fieldType(model) === 'string' ||\n fieldInfo.fieldType(model) === 'number'\n \"\n >\n <span class=\"ui-float-label\">\n <input\n pInputText\n id=\"{{ fieldInfo.modelProperty }}\"\n name=\"{{ fieldInfo.modelProperty }}\"\n formControlName=\"{{ fieldInfo.modelProperty }}\"\n [pTooltip]=\"fieldInfo.tooltip\"\n [type]=\"fieldInfo.inputType\"\n [size]=\"fieldInfo.inputSize\"\n />\n <label for=\"{{ fieldInfo.modelProperty }}\">{{\n fieldInfo.label\n }}</label>\n </span>\n </ng-container>\n <ng-container\n *ngIf=\"\n fieldInfo.fieldType(model) === 'options' &&\n fieldInfo.options &&\n fieldInfo.optionArrayLabelField\n \"\n >\n <span class=\"ui-float-label\">\n <p-dropdown\n formControlName=\"{{ fieldInfo.modelProperty }}\"\n [name]=\"fieldInfo.modelProperty\"\n [options]=\"fieldInfo.options\"\n [optionLabel]=\"fieldInfo.optionArrayLabelField\"\n [pTooltip]=\"fieldInfo.tooltip\"\n ></p-dropdown>\n <label for=\"{{ fieldInfo.modelProperty }}\">{{\n fieldInfo.label\n }}</label>\n </span>\n </ng-container>\n </div>\n </div>\n </div>\n </p-fieldset>\n </ng-container>\n</form>\n<button\n *ngIf=\"formInfo.showSubmitButton\"\n pButton\n [disabled]=\"formInfo.disableSubmitOnFormInvalid && !formGroup.valid\"\n (submit)=\"onSubmit()\"\n>\n {{ formInfo.submitText || \"Submit\" }}\n</button>\n", styles: [".ui-chkbox-label{padding-right:.5em}.ui-dropdown-label{align-self:center;padding-right:.5em}.field:nth-child(n+4){margin-top:1em}\n"] }] }], ctorParameters: () => [], propDecorators: { model: [{ type: Input }], modelChange: [{ type: Output }], modelProperty: [{ type: Input }], formInfo: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1aWQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jeXRvc2NhcGUtYW5ndWxhci9zcmMvbGliL2ZsdWlkLWZvcm0vZmx1aWQtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jeXRvc2NhcGUtYW5ndWxhci9zcmMvbGliL2ZsdWlkLWZvcm0vZmx1aWQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxXQUFXLEVBQ1gsU0FBUyxHQUVWLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7Ozs7OztBQU92QyxNQUFNLE9BQU8sa0JBQWtCO0lBSTdCLEtBQUssQ0FBcUI7SUFFMUIsV0FBVyxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO0lBRy9ELGFBQWEsQ0FBcUI7SUFFbEMsUUFBUSxDQUFZO0lBRXBCLFNBQVMsQ0FBYTtJQUV0QixnQkFBZSxDQUFDO0lBRWhCLFFBQVE7UUFDTixPQUFPLENBQUMsS0FBSyxDQUNYLG1DQUFtQyxFQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDOUIsQ0FBQztRQUNGLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUNoRCxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFNB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Q0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNoQyxDQUFDO3VHQTFGVSxrQkFBa0I7MkZBQWxCLGtCQUFrQix1TUN4Qi9CLHM1RkErRUE7OzJGRHZEYSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsaUJBQWlCO3dEQVEzQixLQUFLO3NCQURKLEtBQUs7Z0JBR04sV0FBVztzQkFEVixNQUFNO2dCQUlQLGFBQWE7c0JBRFosS0FBSztnQkFHTixRQUFRO3NCQURQLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdDaGVja2VkLFxuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQXN5bmNWYWxpZGF0b3JGbixcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Hcm91cCxcbiAgVmFsaWRhdG9yRm4sXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvcm1JbmZvIH0gZnJvbSAnLi9mb3JtLWluZm8nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjeW5nLWZsdWlkLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogYC4vZmx1aWQtZm9ybS5jb21wb25lbnQuaHRtbGAsXG4gIHN0eWxlVXJsczogW2AuL2ZsdWlkLWZvcm0uY29tcG9uZW50LnNjc3NgXSxcbn0pXG5leHBvcnQgY2xhc3MgRmx1aWRGb3JtQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWRcbntcbiAgQElucHV0KClcbiAgbW9kZWw6IG9iamVjdCB8IHVuZGVmaW5lZDtcbiAgQE91dHB1dCgpXG4gIG1vZGVsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8b2JqZWN0PiA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuXG4gIEBJbnB1dCgpXG4gIG1vZGVsUHJvcGVydHk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KClcbiAgZm9ybUluZm8hOiBGb3JtSW5mbztcblxuICBmb3JtR3JvdXAhOiBGb3JtR3JvdXA7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAnRmx1aWRGb3JtQ29tcG9uZW50IHRoaXMuZm9ybUluZm86JyxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuZm9ybUluZm8pXG4gICAgKTtcbiAgICBsZXQgY29udHJvbHMgPSB7fTtcbiAgICB0aGlzLmZvcm1JbmZvPy5maWVsZHNldHMuZm9yRWFjaCgoZmllbGRzZXRJbmZvKSA9PiB7XG4gICAgICBmaWVsZHNldEluZm8uZmllbGRJbmZvcy5mb3JFYWNoKChmaWVsZEluZm8pID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsIHx8ICFmaWVsZEluZm8gfHwgIWZpZWxkSW5mby5tb2RlbFByb3BlcnR5KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtb2RlbFZhbHVlID0gdGhpcy5tb2RlbFtmaWVsZEluZm8ubW9kZWxQcm9wZXJ0eV07XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdmaWVsZEluZm8ubW9kZWxQcm9wZXJ0eTonLCBmaWVsZEluZm8ubW9kZWxQcm9wZXJ0eSwgJywgbW9kZWxWYWx1ZTonLCBtb2RlbFZhbHVlKVxuICAgICAgICBjb25zdCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID1cbiAgICAgICAgICB0eXBlb2YgZmllbGRJbmZvLnZhbGlkYXRvcnMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gZmllbGRJbmZvLnZhbGlkYXRvcnMoKVxuICAgICAgICAgICAgOiBmaWVsZEluZm8udmFsaWRhdG9ycztcbiAgICAgICAgY29uc3QgYXN5bmNWYWxpZGF0b3JzOiBBc3luY1ZhbGlkYXRvckZuW10gPVxuICAgICAgICAgIHR5cGVvZiBmaWVsZEluZm8uYXN5bmNWYWxpZGF0b3JzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGZpZWxkSW5mby5hc3luY1ZhbGlkYXRvcnMoKVxuICAgICAgICAgICAgOiBmaWVsZEluZm8uYXN5bmNWYWxpZGF0b3JzO1xuICAgICAgICBjb25zdCB7IHVwZGF0ZU9uIH0gPSBmaWVsZEluZm87XG4gICAgICAgIGxldCBmb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChtb2RlbFZhbHVlLCB7XG4gICAgICAgICAgdmFsaWRhdG9ycyxcbiAgICAgICAgICBhc3luY1ZhbGlkYXRvcnMsXG4gICAgICAgICAgdXBkYXRlT24sXG4gICAgICAgIH0pO1xuICAgICAgICBmb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChjaGFuZ2UpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMubW9kZWwgfHwgIWZpZWxkSW5mbyB8fCAhZmllbGRJbmZvLm1vZGVsUHJvcGVydHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc29sZS5kZWJ1ZyhcbiAgICAgICAgICAgICdmb3JtIGNvbnRyb2wgY2hhbmdlICcsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShjaGFuZ2UpLFxuICAgICAgICAgICAgJyBmb3IgcHJvcCAnLFxuICAgICAgICAgICAgZmllbGRJbmZvLm1vZGVsUHJvcGVydHksXG4gICAgICAgICAgICAnLCBjaGFuZ2luZyBjdXJyZW50IG1vZGVsIHZhbHVlICcsXG4gICAgICAgICAgICB0aGlzLm1vZGVsW2ZpZWxkSW5mby5tb2RlbFByb3BlcnR5XSxcbiAgICAgICAgICAgICcgdG8gJyxcbiAgICAgICAgICAgIGNoYW5nZVxuICAgICAgICAgICk7XG4gICAgICAgICAgZmllbGRJbmZvLnNldFZhbHVlKGNoYW5nZSwgdGhpcy5tb2RlbCwgdGhpcy5tb2RlbENoYW5nZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb250cm9sc1tmaWVsZEluZm8ubW9kZWxQcm9wZXJ0eV0gPSBmb3JtQ29udHJvbDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cChjb250cm9scyk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc29sZS5kZWJ1ZygnbmdPbkNoYW5nZXMgZmx1aWQtZm9ybSBjaGFuZ2VzOicsIEpTT04uc3RyaW5naWZ5KGNoYW5nZXMpKTtcbiAgICBpZiAoY2hhbmdlc1snbW9kZWwnXSkge1xuICAgICAgY29uc3QgbW9kZWwgPSBjaGFuZ2VzWydtb2RlbCddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhtb2RlbCkpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnbmdPbkNoYW5nZXMgbW9kZWwga2V5IGNvcHlpbmcgdG8gZm9ybTonLCBrZXkpO1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtR3JvdXA/LmNvbnRyb2xzW2tleV07XG4gICAgICAgIGNvbnRyb2xcbiAgICAgICAgICA/IGNvbnRyb2wuc2V0VmFsdWUobW9kZWxba2V5XSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pXG4gICAgICAgICAgOiBjb25zb2xlLndhcm4oJ25vIGNvbnRyb2wgZm9yIG1vZGVsIGtleSAnLCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBjb25zb2xlLmRlYnVnKFwibmdBZnRlclZpZXdJbml0XCIpXG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgLy8gY29uc29sZS5kZWJ1ZyhcIm5nQWZ0ZXJWaWV3Q2hlY2tlZFwiKVxuICB9XG5cbiAgb25TdWJtaXQoKSB7XG4gICAgY29uc29sZS5sb2coYEZvcm0gc3VibWl0dGVkYCk7XG4gIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCIgW3RpdGxlXT1cImZvcm1JbmZvPy50aXRsZVwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCI+XG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpZWxkU2V0SW5mbyBvZiBmb3JtSW5mby5maWVsZHNldHNcIj5cbiAgICA8cC1maWVsZHNldFxuICAgICAgKm5nSWY9XCJtb2RlbCAmJiBmaWVsZFNldEluZm8uc2hvd0ZpZWxkc2V0Rm9yTW9kZWwobW9kZWwpXCJcbiAgICAgIGNsYXNzPVwiZmllbGRzZXRcIlxuICAgICAgbGVnZW5kPVwie3sgZmllbGRTZXRJbmZvLmxlZ2VuZCB9fVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInVpLWcgdWktZmx1aWRcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwidWktZy0xMiB1aS1tZC00IGZpZWxkXCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgZmllbGRJbmZvIG9mIGZpZWxkU2V0SW5mby5maWVsZEluZm9zXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1pbnB1dGdyb3VwXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGRJbmZvLmZpZWxkVHlwZShtb2RlbCkgPT09ICdib29sZWFuJ1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVpLWNoa2JveC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgIHt7IGZpZWxkSW5mby5sYWJlbCB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxwLWlucHV0U3dpdGNoXG4gICAgICAgICAgICAgICAgbmFtZT1cInt7IGZpZWxkSW5mby5tb2RlbFByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICBwVG9vbHRpcD1cInt7IGZpZWxkSW5mby50b29sdGlwIH19XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBmaWVsZEluZm8ubW9kZWxQcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9wLWlucHV0U3dpdGNoPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgZmllbGRJbmZvLmZpZWxkVHlwZShtb2RlbCkgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgICAgZmllbGRJbmZvLmZpZWxkVHlwZShtb2RlbCkgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidWktZmxvYXQtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgICAgIGlkPVwie3sgZmllbGRJbmZvLm1vZGVsUHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgbmFtZT1cInt7IGZpZWxkSW5mby5tb2RlbFByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGZpZWxkSW5mby5tb2RlbFByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJmaWVsZEluZm8udG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICBbdHlwZV09XCJmaWVsZEluZm8uaW5wdXRUeXBlXCJcbiAgICAgICAgICAgICAgICAgIFtzaXplXT1cImZpZWxkSW5mby5pbnB1dFNpemVcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInt7IGZpZWxkSW5mby5tb2RlbFByb3BlcnR5IH19XCI+e3tcbiAgICAgICAgICAgICAgICAgIGZpZWxkSW5mby5sYWJlbFxuICAgICAgICAgICAgICAgIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgZmllbGRJbmZvLmZpZWxkVHlwZShtb2RlbCkgPT09ICdvcHRpb25zJyAmJlxuICAgICAgICAgICAgICAgIGZpZWxkSW5mby5vcHRpb25zICYmXG4gICAgICAgICAgICAgICAgZmllbGRJbmZvLm9wdGlvbkFycmF5TGFiZWxGaWVsZFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVpLWZsb2F0LWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGZpZWxkSW5mby5tb2RlbFByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImZpZWxkSW5mby5tb2RlbFByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImZpZWxkSW5mby5vcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJmaWVsZEluZm8ub3B0aW9uQXJyYXlMYWJlbEZpZWxkXCJcbiAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJmaWVsZEluZm8udG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgPjwvcC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwie3sgZmllbGRJbmZvLm1vZGVsUHJvcGVydHkgfX1cIj57e1xuICAgICAgICAgICAgICAgICAgZmllbGRJbmZvLmxhYmVsXG4gICAgICAgICAgICAgICAgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3AtZmllbGRzZXQ+XG4gIDwvbmctY29udGFpbmVyPlxuPC9mb3JtPlxuPGJ1dHRvblxuICAqbmdJZj1cImZvcm1JbmZvLnNob3dTdWJtaXRCdXR0b25cIlxuICBwQnV0dG9uXG4gIFtkaXNhYmxlZF09XCJmb3JtSW5mby5kaXNhYmxlU3VibWl0T25Gb3JtSW52YWxpZCAmJiAhZm9ybUdyb3VwLnZhbGlkXCJcbiAgKHN1Ym1pdCk9XCJvblN1Ym1pdCgpXCJcbj5cbiAge3sgZm9ybUluZm8uc3VibWl0VGV4dCB8fCBcIlN1Ym1pdFwiIH19XG48L2J1dHRvbj5cbiJdfQ==