UNPKG

ng-prime-tools

Version:

An advanced PrimeNG table for Angular

88 lines 20.8 kB
import { Component, Input } from '@angular/core'; import { Validators, } from '@angular/forms'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/forms"; import * as i3 from "primeng/inputgroup"; import * as i4 from "primeng/inputgroupaddon"; import * as i5 from "primeng/inputnumber"; export class PTNumberInputComponent { ngOnInit() { this.setupControl(); } setupControl() { const control = this.formGroup.get(this.formField.name); if (control) { const validators = this.getValidators(); control.setValidators(validators); // Manage the disabled state directly setTimeout(() => { if (this.formField.disabled) { control.disable({ emitEvent: false }); } else { control.enable({ emitEvent: false }); } control.updateValueAndValidity({ emitEvent: false }); }); } } getValidators() { const validators = []; if (this.formField.required) { validators.push(Validators.required); } if (this.formField.minValue !== undefined) { const minValue = Number(this.formField.minValue); if (!isNaN(minValue)) { validators.push(Validators.min(minValue)); } else { console.error(`Invalid minValue: ${this.formField.minValue} is not a number.`); } } if (this.formField.maxValue !== undefined) { const maxValue = Number(this.formField.maxValue); if (!isNaN(maxValue)) { validators.push(Validators.max(maxValue)); } else { console.error(`Invalid maxValue: ${this.formField.maxValue} is not a number.`); } } if (this.formField.inputValidation) { validators.push(this.validateWithInputValidation(this.formField.inputValidation)); } return validators; } validateWithInputValidation(inputValidation) { return Validators.pattern(new RegExp(inputValidation)); } getErrorMessage() { const control = this.formGroup.get(this.formField.name); if (control?.hasError('required')) { return this.formField.errorText || `${this.formField.label} is required`; } else if (control?.hasError('min')) { return `${this.formField.label} must be at least ${this.formField.minValue}`; } else if (control?.hasError('max')) { return `${this.formField.label} must be at most ${this.formField.maxValue}`; } else if (control?.hasError('pattern')) { return `${this.formField.label} is invalid`; } return ''; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTNumberInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: PTNumberInputComponent, selector: "pt-number-input", inputs: { formGroup: "formGroup", formField: "formField" }, ngImport: i0, template: "<div\n [formGroup]=\"formGroup\"\n class=\"form-field\"\n [ngStyle]=\"{ width: formField.width || '100%' }\"\n *ngIf=\"!formField.hidden\"\n>\n <label *ngIf=\"formField.label\">{{ formField.label }}</label>\n <p-inputGroup>\n <ng-container\n *ngIf=\"!formField.iconPosition || formField.iconPosition === 'left'\"\n >\n <p-inputGroupAddon *ngIf=\"formField.iconClass || formField.currency\">\n <i *ngIf=\"formField.iconClass\" [ngClass]=\"formField.iconClass\"></i>\n <span *ngIf=\"!formField.iconClass && formField.currency\">\n {{ formField.currency }}\n </span>\n </p-inputGroupAddon>\n <p-inputNumber\n [formControlName]=\"formField.name\"\n mode=\"decimal\"\n [locale]=\"formField.numberFormat || undefined\"\n [useGrouping]=\"formField.numberFormat ? true : false\"\n [minFractionDigits]=\"formField.decimalDigits || 0\"\n [maxFractionDigits]=\"formField.decimalDigits || 0\"\n [placeholder]=\"formField.placeholder || ''\"\n ></p-inputNumber>\n </ng-container>\n <ng-container *ngIf=\"formField.iconPosition === 'right'\">\n <p-inputNumber\n [formControlName]=\"formField.name\"\n mode=\"decimal\"\n [locale]=\"formField.numberFormat || undefined\"\n [useGrouping]=\"formField.numberFormat ? true : false\"\n [minFractionDigits]=\"formField.decimalDigits || 0\"\n [maxFractionDigits]=\"formField.decimalDigits || 0\"\n [placeholder]=\"formField.placeholder || ''\"\n ></p-inputNumber>\n <p-inputGroupAddon *ngIf=\"formField.iconClass || formField.currency\">\n <i *ngIf=\"formField.iconClass\" [ngClass]=\"formField.iconClass\"></i>\n <span *ngIf=\"!formField.iconClass && formField.currency\">\n {{ formField.currency }}\n </span>\n </p-inputGroupAddon>\n </ng-container>\n </p-inputGroup>\n <div\n *ngIf=\"\n formGroup.get(formField.name)?.invalid &&\n formGroup.get(formField.name)?.touched\n \"\n >\n <small class=\"p-error\">{{ getErrorMessage() }}</small>\n </div>\n</div>\n", styles: [".form-field{margin-bottom:1rem}.form-field label{display:block;margin-bottom:.5rem;font-weight:700}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.InputGroup, selector: "p-inputGroup", inputs: ["style", "styleClass"] }, { kind: "component", type: i4.InputGroupAddon, selector: "p-inputGroupAddon", inputs: ["style", "styleClass"] }, { kind: "component", type: i5.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: PTNumberInputComponent, decorators: [{ type: Component, args: [{ selector: 'pt-number-input', template: "<div\n [formGroup]=\"formGroup\"\n class=\"form-field\"\n [ngStyle]=\"{ width: formField.width || '100%' }\"\n *ngIf=\"!formField.hidden\"\n>\n <label *ngIf=\"formField.label\">{{ formField.label }}</label>\n <p-inputGroup>\n <ng-container\n *ngIf=\"!formField.iconPosition || formField.iconPosition === 'left'\"\n >\n <p-inputGroupAddon *ngIf=\"formField.iconClass || formField.currency\">\n <i *ngIf=\"formField.iconClass\" [ngClass]=\"formField.iconClass\"></i>\n <span *ngIf=\"!formField.iconClass && formField.currency\">\n {{ formField.currency }}\n </span>\n </p-inputGroupAddon>\n <p-inputNumber\n [formControlName]=\"formField.name\"\n mode=\"decimal\"\n [locale]=\"formField.numberFormat || undefined\"\n [useGrouping]=\"formField.numberFormat ? true : false\"\n [minFractionDigits]=\"formField.decimalDigits || 0\"\n [maxFractionDigits]=\"formField.decimalDigits || 0\"\n [placeholder]=\"formField.placeholder || ''\"\n ></p-inputNumber>\n </ng-container>\n <ng-container *ngIf=\"formField.iconPosition === 'right'\">\n <p-inputNumber\n [formControlName]=\"formField.name\"\n mode=\"decimal\"\n [locale]=\"formField.numberFormat || undefined\"\n [useGrouping]=\"formField.numberFormat ? true : false\"\n [minFractionDigits]=\"formField.decimalDigits || 0\"\n [maxFractionDigits]=\"formField.decimalDigits || 0\"\n [placeholder]=\"formField.placeholder || ''\"\n ></p-inputNumber>\n <p-inputGroupAddon *ngIf=\"formField.iconClass || formField.currency\">\n <i *ngIf=\"formField.iconClass\" [ngClass]=\"formField.iconClass\"></i>\n <span *ngIf=\"!formField.iconClass && formField.currency\">\n {{ formField.currency }}\n </span>\n </p-inputGroupAddon>\n </ng-container>\n </p-inputGroup>\n <div\n *ngIf=\"\n formGroup.get(formField.name)?.invalid &&\n formGroup.get(formField.name)?.touched\n \"\n >\n <small class=\"p-error\">{{ getErrorMessage() }}</small>\n </div>\n</div>\n", styles: [".form-field{margin-bottom:1rem}.form-field label{display:block;margin-bottom:.5rem;font-weight:700}\n"] }] }], propDecorators: { formGroup: [{ type: Input }], formField: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHQtbnVtYmVyLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXByaW1lLXRvb2xzL3NyYy9saWIvcHQtbnVtYmVyLWlucHV0L3B0LW51bWJlci1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL3B0LW51bWJlci1pbnB1dC9wdC1udW1iZXItaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUVMLFVBQVUsR0FHWCxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBU3hCLE1BQU0sT0FBTyxzQkFBc0I7SUFJakMsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsWUFBWTtRQUNWLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFnQixDQUFDO1FBQ3ZFLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUVsQyxxQ0FBcUM7WUFDckMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzVCLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDeEMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMs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USxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDeEMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxhQUFhLENBQUM7UUFDOUMsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQzsrR0E5RVUsc0JBQXNCO21HQUF0QixzQkFBc0IsbUhDZm5DLHVsRUFzREE7OzRGRHZDYSxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0UsaUJBQWlCOzhCQUtsQixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEZvcm1Hcm91cCxcbiAgVmFsaWRhdG9ycyxcbiAgVmFsaWRhdG9yRm4sXG4gIEZvcm1Db250cm9sLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJbnB1dFZhbGlkYXRpb25FbnVtIH0gZnJvbSAnLi4vZW51bXMvaW5wdXQtdmFsaWRhdGlvbi5lbnVtJztcbmltcG9ydCB7IEZvcm1OdW1iZXJGaWVsZCB9IGZyb20gJy4uL21vZGVscy9mb3JtLW51bWJlci1maWVsZC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3B0LW51bWJlci1pbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9wdC1udW1iZXItaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wdC1udW1iZXItaW5wdXQuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBQVE51bWJlcklucHV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgZm9ybUdyb3VwITogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBmb3JtRmllbGQhOiBGb3JtTnVtYmVyRmllbGQ7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZXR1cENvbnRyb2woKTtcbiAgfVxuXG4gIHNldHVwQ29udHJvbCgpIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtR3JvdXAuZ2V0KHRoaXMuZm9ybUZpZWxkLm5hbWUpIGFzIEZvcm1Db250cm9sO1xuICAgIGlmIChjb250cm9sKSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3JzID0gdGhpcy5nZXRWYWxpZGF0b3JzKCk7XG4gICAgICBjb250cm9sLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XG5cbiAgICAgIC8vIE1hbmFnZSB0aGUgZGlzYWJsZWQgc3RhdGUgZGlyZWN0bHlcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5mb3JtRmllbGQuZGlzYWJsZWQpIHtcbiAgICAgICAgICBjb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFZhbGlkYXRvcnMoKTogVmFsaWRhdG9yRm5bXSB7XG4gICAgY29uc3QgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xuICAgIGlmICh0aGlzLmZvcm1GaWVsZC5yZXF1aXJlZCkge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5mb3JtRmllbGQubWluVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbWluVmFsdWUgPSBOdW1iZXIodGhpcy5mb3JtRmllbGQubWluVmFsdWUpO1xuICAgICAgaWYgKCFpc05hTihtaW5WYWx1ZSkpIHtcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluKG1pblZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIG1pblZhbHVlOiAke3RoaXMuZm9ybUZpZWxkLm1pblZhbHVlfSBpcyBub3QgYSBudW1iZXIuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5mb3JtRmllbGQubWF4VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbWF4VmFsdWUgPSBOdW1iZXIodGhpcy5mb3JtRmllbGQubWF4VmFsdWUpO1xuICAgICAgaWYgKCFpc05hTihtYXhWYWx1ZSkpIHtcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4KG1heFZhbHVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIG1heFZhbHVlOiAke3RoaXMuZm9ybUZpZWxkLm1heFZhbHVlfSBpcyBub3QgYSBudW1iZXIuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5mb3JtRmllbGQuaW5wdXRWYWxpZGF0aW9uKSB7XG4gICAgICB2YWxpZGF0b3JzLnB1c2goXG4gICAgICAgIHRoaXMudmFsaWRhdGVXaXRoSW5wdXRWYWxpZGF0aW9uKHRoaXMuZm9ybUZpZWxkLmlucHV0VmFsaWRhdGlvbilcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0b3JzO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVdpdGhJbnB1dFZhbGlkYXRpb24oXG4gICAgaW5wdXRWYWxpZGF0aW9uOiBJbnB1dFZhbGlkYXRpb25FbnVtXG4gICk6IFZhbGlkYXRvckZuIHtcbiAgICByZXR1cm4gVmFsaWRhdG9ycy5wYXR0ZXJuKG5ldyBSZWdFeHAoaW5wdXRWYWxpZGF0aW9uKSk7XG4gIH1cblxuICBnZXRFcnJvck1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtR3JvdXAuZ2V0KHRoaXMuZm9ybUZpZWxkLm5hbWUpO1xuICAgIGlmIChjb250cm9sPy5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybUZpZWxkLmVycm9yVGV4dCB8fCBgJHt0aGlzLmZvcm1GaWVsZC5sYWJlbH0gaXMgcmVxdWlyZWRgO1xuICAgIH0gZWxzZSBpZiAoY29udHJvbD8uaGFzRXJyb3IoJ21pbicpKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5mb3JtRmllbGQubGFiZWx9IG11c3QgYmUgYXQgbGVhc3QgJHt0aGlzLmZvcm1GaWVsZC5taW5WYWx1ZX1gO1xuICAgIH0gZWxzZSBpZiAoY29udHJvbD8uaGFzRXJyb3IoJ21heCcpKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5mb3JtRmllbGQubGFiZWx9IG11c3QgYmUgYXQgbW9zdCAke3RoaXMuZm9ybUZpZWxkLm1heFZhbHVlfWA7XG4gICAgfSBlbHNlIGlmIChjb250cm9sPy5oYXNFcnJvcigncGF0dGVybicpKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5mb3JtRmllbGQubGFiZWx9IGlzIGludmFsaWRgO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cbiIsIjxkaXZcbiAgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIlxuICBjbGFzcz1cImZvcm0tZmllbGRcIlxuICBbbmdTdHlsZV09XCJ7IHdpZHRoOiBmb3JtRmllbGQud2lkdGggfHwgJzEwMCUnIH1cIlxuICAqbmdJZj1cIiFmb3JtRmllbGQuaGlkZGVuXCJcbj5cbiAgPGxhYmVsICpuZ0lmPVwiZm9ybUZpZWxkLmxhYmVsXCI+e3sgZm9ybUZpZWxkLmxhYmVsIH19PC9sYWJlbD5cbiAgPHAtaW5wdXRHcm91cD5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdJZj1cIiFmb3JtRmllbGQuaWNvblBvc2l0aW9uIHx8IGZvcm1GaWVsZC5pY29uUG9zaXRpb24gPT09ICdsZWZ0J1wiXG4gICAgPlxuICAgICAgPHAtaW5wdXRHcm91cEFkZG9uICpuZ0lmPVwiZm9ybUZpZWxkLmljb25DbGFzcyB8fCBmb3JtRmllbGQuY3VycmVuY3lcIj5cbiAgICAgICAgPGkgKm5nSWY9XCJmb3JtRmllbGQuaWNvbkNsYXNzXCIgW25nQ2xhc3NdPVwiZm9ybUZpZWxkLmljb25DbGFzc1wiPjwvaT5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhZm9ybUZpZWxkLmljb25DbGFzcyAmJiBmb3JtRmllbGQuY3VycmVuY3lcIj5cbiAgICAgICAgICB7eyBmb3JtRmllbGQuY3VycmVuY3kgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9wLWlucHV0R3JvdXBBZGRvbj5cbiAgICAgIDxwLWlucHV0TnVtYmVyXG4gICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZm9ybUZpZWxkLm5hbWVcIlxuICAgICAgICBtb2RlPVwiZGVjaW1hbFwiXG4gICAgICAgIFtsb2NhbGVdPVwiZm9ybUZpZWxkLm51bWJlckZvcm1hdCB8fCB1bmRlZmluZWRcIlxuICAgICAgICBbdXNlR3JvdXBpbmddPVwiZm9ybUZpZWxkLm51bWJlckZvcm1hdCA/IHRydWUgOiBmYWxzZVwiXG4gICAgICAgIFttaW5GcmFjdGlvbkRpZ2l0c109XCJmb3JtRmllbGQuZGVjaW1hbERpZ2l0cyB8fCAwXCJcbiAgICAgICAgW21heEZyYWN0aW9uRGlnaXRzXT1cImZvcm1GaWVsZC5kZWNpbWFsRGlnaXRzIHx8IDBcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZm9ybUZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnXCJcbiAgICAgID48L3AtaW5wdXROdW1iZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm1GaWVsZC5pY29uUG9zaXRpb24gPT09ICdyaWdodCdcIj5cbiAgICAgIDxwLWlucHV0TnVtYmVyXG4gICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZm9ybUZpZWxkLm5hbWVcIlxuICAgICAgICBtb2RlPVwiZGVjaW1hbFwiXG4gICAgICAgIFtsb2NhbGVdPVwiZm9ybUZpZWxkLm51bWJlckZvcm1hdCB8fCB1bmRlZmluZWRcIlxuICAgICAgICBbdXNlR3JvdXBpbmddPVwiZm9ybUZpZWxkLm51bWJlckZvcm1hdCA/IHRydWUgOiBmYWxzZVwiXG4gICAgICAgIFttaW5GcmFjdGlvbkRpZ2l0c109XCJmb3JtRmllbGQuZGVjaW1hbERpZ2l0cyB8fCAwXCJcbiAgICAgICAgW21heEZyYWN0aW9uRGlnaXRzXT1cImZvcm1GaWVsZC5kZWNpbWFsRGlnaXRzIHx8IDBcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZm9ybUZpZWxkLnBsYWNlaG9sZGVyIHx8ICcnXCJcbiAgICAgID48L3AtaW5wdXROdW1iZXI+XG4gICAgICA8cC1pbnB1dEdyb3VwQWRkb24gKm5nSWY9XCJmb3JtRmllbGQuaWNvbkNsYXNzIHx8IGZvcm1GaWVsZC5jdXJyZW5jeVwiPlxuICAgICAgICA8aSAqbmdJZj1cImZvcm1GaWVsZC5pY29uQ2xhc3NcIiBbbmdDbGFzc109XCJmb3JtRmllbGQuaWNvbkNsYXNzXCI+PC9pPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFmb3JtRmllbGQuaWNvbkNsYXNzICYmIGZvcm1GaWVsZC5jdXJyZW5jeVwiPlxuICAgICAgICAgIHt7IGZvcm1GaWVsZC5jdXJyZW5jeSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3AtaW5wdXRHcm91cEFkZG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3AtaW5wdXRHcm91cD5cbiAgPGRpdlxuICAgICpuZ0lmPVwiXG4gICAgICBmb3JtR3JvdXAuZ2V0KGZvcm1GaWVsZC5uYW1lKT8uaW52YWxpZCAmJlxuICAgICAgZm9ybUdyb3VwLmdldChmb3JtRmllbGQubmFtZSk/LnRvdWNoZWRcbiAgICBcIlxuICA+XG4gICAgPHNtYWxsIGNsYXNzPVwicC1lcnJvclwiPnt7IGdldEVycm9yTWVzc2FnZSgpIH19PC9zbWFsbD5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==