UNPKG

mss-engine-forms

Version:

A simple typehead library developed by MSS development team to be used for dynamic forms

122 lines 20.6 kB
import { Component, EventEmitter, Input, Output } from "@angular/core"; import { FormControl, FormGroup, Validators } from "@angular/forms"; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@angular/common"; import * as i3 from "./components/dynamic-field/dynamic-field.component"; import * as i4 from "./components/dynamic-error/dynamic-error.component"; import * as i5 from "./_helpers/breakpoints.pipe"; export class MssFormsComponent { constructor(_fb) { this._fb = _fb; this.isLoading = false; this.cancelBtnOptions = null; this.onSubmit = new EventEmitter(); this.fields = []; } ngOnInit() { // this.buildForm(); } ngOnChanges(changes) { if (changes['model']) { this.fields = []; this.buildForm(); } } buildForm() { const formGroupFields = this.getFormControlsFields(); // if (!this.dynamicFormGroup) { this.dynamicFormGroup = new FormGroup(formGroupFields); for (const field of Object.keys(this.model)) { const fieldProps = this.model[field]; if (fieldProps?.disabled) this.dynamicFormGroup.get(field).disable(); this.dynamicFormGroup.get(field)?.updateValueAndValidity(); } // } else { // this.getNewFormControlsFields() // } } getFormControlsFields() { const formGroupFields = {}; for (const field of Object.keys(this.model)) { const fieldProps = this.model[field]; const validators = this.addValidator(fieldProps.rules); formGroupFields[field] = new FormControl(fieldProps.value, validators); let index = this.fields.findIndex((f) => { if (f.fieldName == field) return true; return false; }); if (index === -1) this.fields.push({ ...fieldProps, fieldName: field }); } return formGroupFields; } getNewFormControlsFields() { Object.keys(this.model).map((model) => { const fieldProps = this.model[model]; const validators = this.addValidator(fieldProps.rules); if (!this.dynamicFormGroup['controls'][model]) { this.dynamicFormGroup.addControl(model, this._fb.control({ value: fieldProps.value, disabled: fieldProps?.disabled ? true : false }, validators)); // this.dynamicFormGroup.get() } }); } addValidator(rules) { if (!rules) { return []; } const validators = Object.keys(rules).map((rule, index) => { switch (rule) { case "required": return Validators.required; case "email": return Validators.email; case "minLength": return Validators.minLength(Object.values(rules)[index]); case "maxLength": return Validators.maxLength(Object.values(rules)[index]); case "pattern": return Validators.pattern(Object.values(rules)[index]); case "min": return Validators.min(Object.values(rules)[index]); case "max": return Validators.max(Object.values(rules)[index]); default: return; //add more case for future. } }); return validators; } submit() { this.onSubmit.emit(this.dynamicFormGroup); } resetForm() { this.dynamicFormGroup.reset(); } setRule(formControlName, validators) { if (this.dynamicFormGroup['controls'][formControlName]) this.dynamicFormGroup['controls'][formControlName].setValidators(validators); } } MssFormsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MssFormsComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); MssFormsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: MssFormsComponent, selector: "lib-mss-forms", inputs: { model: "model", isLoading: "isLoading", submitBtnOptions: "submitBtnOptions", cancelBtnOptions: "cancelBtnOptions", error: "error" }, outputs: { onSubmit: "onSubmit" }, usesOnChanges: true, ngImport: i0, template: "<form [formGroup]=\"dynamicFormGroup\" (ngSubmit)=\"submit()\" (keyup.enter)=\"submit()\">\n <div class=\"row\">\n <div *ngFor=\"let field of fields\" class=\"col-12 custom-engine-field-container\" [ngClass]=\"field | breakpoint\">\n <app-field-input [field]=\"field\"></app-field-input>\n <app-dynamic-error [field]=\"field\"></app-dynamic-error>\n </div>\n <div *ngIf=\"cancelBtnOptions\" class=\"col-12\" [ngClass]=\"cancelBtnOptions | breakpoint\">\n <button type=\"button\" (click)=\"cancelBtnOptions?.submit()\"\n class=\"w-100 d-flex align-items-center justify-content-center btn-default\">\n {{cancelBtnOptions?.content}}\n </button>\n </div>\n <div class=\"col-12\" [ngClass]=\"submitBtnOptions | breakpoint\">\n <button type=\"submit\" [disabled]=\"isLoading || dynamicFormGroup.invalid\"\n class=\"w-100 d-flex align-items-center justify-content-center btn-primary\">\n <div *ngIf=\"isLoading\" class=\"spinner-border text-primary\"></div>\n <ng-container *ngIf=\"!isLoading\">{{submitBtnOptions?.content}}</ng-container>\n </button>\n </div>\n </div>\n\n</form>", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.DynamicFieldComponent, selector: "app-field-input", inputs: ["field"] }, { kind: "component", type: i4.DynamicErrorComponent, selector: "app-dynamic-error", inputs: ["field"] }, { kind: "pipe", type: i5.BreakpointPipe, name: "breakpoint" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MssFormsComponent, decorators: [{ type: Component, args: [{ selector: 'lib-mss-forms', template: "<form [formGroup]=\"dynamicFormGroup\" (ngSubmit)=\"submit()\" (keyup.enter)=\"submit()\">\n <div class=\"row\">\n <div *ngFor=\"let field of fields\" class=\"col-12 custom-engine-field-container\" [ngClass]=\"field | breakpoint\">\n <app-field-input [field]=\"field\"></app-field-input>\n <app-dynamic-error [field]=\"field\"></app-dynamic-error>\n </div>\n <div *ngIf=\"cancelBtnOptions\" class=\"col-12\" [ngClass]=\"cancelBtnOptions | breakpoint\">\n <button type=\"button\" (click)=\"cancelBtnOptions?.submit()\"\n class=\"w-100 d-flex align-items-center justify-content-center btn-default\">\n {{cancelBtnOptions?.content}}\n </button>\n </div>\n <div class=\"col-12\" [ngClass]=\"submitBtnOptions | breakpoint\">\n <button type=\"submit\" [disabled]=\"isLoading || dynamicFormGroup.invalid\"\n class=\"w-100 d-flex align-items-center justify-content-center btn-primary\">\n <div *ngIf=\"isLoading\" class=\"spinner-border text-primary\"></div>\n <ng-container *ngIf=\"!isLoading\">{{submitBtnOptions?.content}}</ng-container>\n </button>\n </div>\n </div>\n\n</form>" }] }], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { model: [{ type: Input }], isLoading: [{ type: Input }], submitBtnOptions: [{ type: Input }], cancelBtnOptions: [{ type: Input }], error: [{ type: Input }], onSubmit: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNzLWZvcm1zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21zcy1mb3Jtcy9zcmMvbGliL21zcy1mb3Jtcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tc3MtZm9ybXMvc3JjL2xpYi9tc3MtZm9ybXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEyQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNsSSxPQUFPLEVBQWUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7OztBQVFqRixNQUFNLE9BQU8saUJBQWlCO0lBWTVCLFlBQW9CLEdBQWdCO1FBQWhCLFFBQUcsR0FBSCxHQUFHLENBQWE7UUFUM0IsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUczQixxQkFBZ0IsR0FBUSxJQUFJLENBQUE7UUFFM0IsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFakMsV0FBTSxHQUFRLEVBQUUsQ0FBQztJQUVnQixDQUFDO0lBRXpDLFFBQVE7UUFDTixvQkFBb0I7SUFDdEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQTtZQUNoQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7U0FDakI7SUFDSCxDQUFDO0lBSU8sU0FBUztRQUNmLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3JELGdDQUFnQztRQUNoQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDdEQsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUMs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OytHQTlHVSxpQkFBaUI7bUdBQWpCLGlCQUFpQiw2UENUOUIsZ3ZDQXFCTzs0RkRaTSxpQkFBaUI7a0JBTjdCLFNBQVM7K0JBQ0UsZUFBZTtrR0FPaEIsS0FBSztzQkFBYixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLW1zcy1mb3JtcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9tc3MtZm9ybXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBNc3NGb3Jtc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSBtb2RlbDogYW55O1xuICBASW5wdXQoKSBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gQElucHV0KCkgc3VibWl0QnRuVHh0OiBzdHJpbmcgPSBcIlwiO1xuICBASW5wdXQoKSBzdWJtaXRCdG5PcHRpb25zOiBhbnlcbiAgQElucHV0KCkgY2FuY2VsQnRuT3B0aW9uczogYW55ID0gbnVsbFxuICBASW5wdXQoKSBlcnJvcjogYW55O1xuICBAT3V0cHV0KCkgb25TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHB1YmxpYyBkeW5hbWljRm9ybUdyb3VwOiBhbnk7XG4gIHB1YmxpYyBmaWVsZHM6IGFueSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ZiOiBGb3JtQnVpbGRlcikgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gdGhpcy5idWlsZEZvcm0oKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snbW9kZWwnXSkge1xuICAgICAgdGhpcy5maWVsZHMgPSBbXVxuICAgICAgdGhpcy5idWlsZEZvcm0oKVxuICAgIH1cbiAgfVxuXG5cblxuICBwcml2YXRlIGJ1aWxkRm9ybSgpIHtcbiAgICBjb25zdCBmb3JtR3JvdXBGaWVsZHMgPSB0aGlzLmdldEZvcm1Db250cm9sc0ZpZWxkcygpO1xuICAgIC8vIGlmICghdGhpcy5keW5hbWljRm9ybUdyb3VwKSB7XG4gICAgdGhpcy5keW5hbWljRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cChmb3JtR3JvdXBGaWVsZHMpXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBPYmplY3Qua2V5cyh0aGlzLm1vZGVsKSkge1xuICAgICAgY29uc3QgZmllbGRQcm9wcyA9IHRoaXMubW9kZWxbZmllbGRdO1xuICAgICAgaWYgKGZpZWxkUHJvcHM/LmRpc2FibGVkKSB0aGlzLmR5bmFtaWNGb3JtR3JvdXAuZ2V0KGZpZWxkKS5kaXNhYmxlKClcbiAgICAgIHRoaXMuZHluYW1pY0Zvcm1Hcm91cC5nZXQoZmllbGQpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClcbiAgICB9XG4gICAgLy8gfSBlbHNlIHtcbiAgICAvLyAgIHRoaXMuZ2V0TmV3Rm9ybUNvbnRyb2xzRmllbGRzKClcbiAgICAvLyB9XG4gIH1cblxuICBwcml2YXRlIGdldEZvcm1Db250cm9sc0ZpZWxkcygpIHtcbiAgICBjb25zdCBmb3JtR3JvdXBGaWVsZHM6IGFueSA9IHt9O1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgT2JqZWN0LmtleXModGhpcy5tb2RlbCkpIHtcblxuICAgICAgY29uc3QgZmllbGRQcm9wcyA9IHRoaXMubW9kZWxbZmllbGRdO1xuICAgICAgY29uc3QgdmFsaWRhdG9yczogYW55ID0gdGhpcy5hZGRWYWxpZGF0b3IoZmllbGRQcm9wcy5ydWxlcyk7XG5cbiAgICAgIGZvcm1Hcm91cEZpZWxkc1tmaWVsZF0gPSBuZXcgRm9ybUNvbnRyb2woZmllbGRQcm9wcy52YWx1ZSwgdmFsaWRhdG9ycyk7XG5cbiAgICAgIGxldCBpbmRleCA9IHRoaXMuZmllbGRzLmZpbmRJbmRleCgoZjogYW55KSA9PiB7XG4gICAgICAgIGlmIChmLmZpZWxkTmFtZSA9PSBmaWVsZCkgcmV0dXJuIHRydWVcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9KVxuICAgICAgaWYgKGluZGV4ID09PSAtMSkgdGhpcy5maWVsZHMucHVzaCh7IC4uLmZpZWxkUHJvcHMsIGZpZWxkTmFtZTogZmllbGQgfSk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtR3JvdXBGaWVsZHM7XG4gIH1cblxuICBwcml2YXRlIGdldE5ld0Zvcm1Db250cm9sc0ZpZWxkcygpIHtcbiAgICBPYmplY3Qua2V5cyh0aGlzLm1vZGVsKS5tYXAoKG1vZGVsKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZFByb3BzID0gdGhpcy5tb2RlbFttb2RlbF07XG4gICAgICBjb25zdCB2YWxpZGF0b3JzOiBhbnkgPSB0aGlzLmFkZFZhbGlkYXRvcihmaWVsZFByb3BzLnJ1bGVzKTtcbiAgICAgIGlmICghdGhpcy5keW5hbWljRm9ybUdyb3VwWydjb250cm9scyddW21vZGVsXSkge1xuICAgICAgICB0aGlzLmR5bmFtaWNGb3JtR3JvdXAuYWRkQ29udHJvbChtb2RlbCwgdGhpcy5fZmIuY29udHJvbCh7IHZhbHVlOiBmaWVsZFByb3BzLnZhbHVlLCBkaXNhYmxlZDogZmllbGRQcm9wcz8uZGlzYWJsZWQgPyB0cnVlIDogZmFsc2UgfSwgdmFsaWRhdG9ycykpXG4gICAgICAgIC8vIHRoaXMuZHluYW1pY0Zvcm1Hcm91cC5nZXQoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGFkZFZhbGlkYXRvcihydWxlczogYW55KSB7XG4gICAgaWYgKCFydWxlcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBPYmplY3Qua2V5cyhydWxlcykubWFwKChydWxlLCBpbmRleCkgPT4ge1xuICAgICAgc3dpdGNoIChydWxlKSB7XG4gICAgICAgIGNhc2UgXCJyZXF1aXJlZFwiOlxuICAgICAgICAgIHJldHVybiBWYWxpZGF0b3JzLnJlcXVpcmVkO1xuICAgICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5lbWFpbDtcbiAgICAgICAgY2FzZSBcIm1pbkxlbmd0aFwiOlxuICAgICAgICAgIHJldHVybiBWYWxpZGF0b3JzLm1pbkxlbmd0aChPYmplY3QudmFsdWVzKHJ1bGVzKVtpbmRleF0gYXMgbnVtYmVyKTtcbiAgICAgICAgY2FzZSBcIm1heExlbmd0aFwiOlxuICAgICAgICAgIHJldHVybiBWYWxpZGF0b3JzLm1heExlbmd0aChPYmplY3QudmFsdWVzKHJ1bGVzKVtpbmRleF0gYXMgbnVtYmVyKTtcbiAgICAgICAgY2FzZSBcInBhdHRlcm5cIjpcbiAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5wYXR0ZXJuKE9iamVjdC52YWx1ZXMocnVsZXMpW2luZGV4XSBhcyBzdHJpbmcpO1xuICAgICAgICBjYXNlIFwibWluXCI6XG4gICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubWluKE9iamVjdC52YWx1ZXMocnVsZXMpW2luZGV4XSBhcyBudW1iZXIpXG4gICAgICAgIGNhc2UgXCJtYXhcIjpcbiAgICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5tYXgoT2JqZWN0LnZhbHVlcyhydWxlcylbaW5kZXhdIGFzIG51bWJlcilcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgLy9hZGQgbW9yZSBjYXNlIGZvciBmdXR1cmUuXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbGlkYXRvcnM7XG4gIH1cblxuXG4gIHN1Ym1pdCgpIHtcbiAgICB0aGlzLm9uU3VibWl0LmVtaXQodGhpcy5keW5hbWljRm9ybUdyb3VwKVxuICB9XG5cbiAgcmVzZXRGb3JtKCkge1xuICAgIHRoaXMuZHluYW1pY0Zvcm1Hcm91cC5yZXNldCgpXG4gIH1cblxuICBzZXRSdWxlKGZvcm1Db250cm9sTmFtZTogc3RyaW5nLCB2YWxpZGF0b3JzOiBhbnkpIHtcbiAgICBpZiAodGhpcy5keW5hbWljRm9ybUdyb3VwWydjb250cm9scyddW2Zvcm1Db250cm9sTmFtZV0pIHRoaXMuZHluYW1pY0Zvcm1Hcm91cFsnY29udHJvbHMnXVtmb3JtQ29udHJvbE5hbWVdLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycylcbiAgfVxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJkeW5hbWljRm9ybUdyb3VwXCIgKG5nU3VibWl0KT1cInN1Ym1pdCgpXCIgKGtleXVwLmVudGVyKT1cInN1Ym1pdCgpXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWVsZHNcIiBjbGFzcz1cImNvbC0xMiBjdXN0b20tZW5naW5lLWZpZWxkLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cImZpZWxkIHwgYnJlYWtwb2ludFwiPlxuICAgICAgICAgICAgPGFwcC1maWVsZC1pbnB1dCBbZmllbGRdPVwiZmllbGRcIj48L2FwcC1maWVsZC1pbnB1dD5cbiAgICAgICAgICAgIDxhcHAtZHluYW1pYy1lcnJvciBbZmllbGRdPVwiZmllbGRcIj48L2FwcC1keW5hbWljLWVycm9yPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImNhbmNlbEJ0bk9wdGlvbnNcIiBjbGFzcz1cImNvbC0xMlwiIFtuZ0NsYXNzXT1cImNhbmNlbEJ0bk9wdGlvbnMgfCBicmVha3BvaW50XCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2FuY2VsQnRuT3B0aW9ucz8uc3VibWl0KClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xMDAgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGJ0bi1kZWZhdWx0XCI+XG4gICAgICAgICAgICAgICAge3tjYW5jZWxCdG5PcHRpb25zPy5jb250ZW50fX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiIFtuZ0NsYXNzXT1cInN1Ym1pdEJ0bk9wdGlvbnMgfCBicmVha3BvaW50XCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nIHx8IGR5bmFtaWNGb3JtR3JvdXAuaW52YWxpZFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTEwMCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgYnRuLXByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nXCIgY2xhc3M9XCJzcGlubmVyLWJvcmRlciB0ZXh0LXByaW1hcnlcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPnt7c3VibWl0QnRuT3B0aW9ucz8uY29udGVudH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvZm9ybT4iXX0=