UNPKG

ngx-surveys

Version:
115 lines 19.2 kB
import { Component, Input, EventEmitter, forwardRef, Output, ViewChild } from '@angular/core'; import { FormItem, SurveyErrorStateMatcher } from '../index'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import moment from "moment"; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/forms"; import * as i3 from "@angular/material/input"; import * as i4 from "@angular/material/form-field"; import * as i5 from "@angular/material/datepicker"; import * as i6 from "ngx-mask"; export class FormItemDate extends FormItem { } export const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => FormItemDateComponent), multi: true }; const noop = () => { }; export class FormItemDateComponent { constructor() { this.editable = true; this.changes = new EventEmitter(); this.matcher = new SurveyErrorStateMatcher(); //Placeholders for the callbacks which are later provided //by the Control Value Accessor this.onTouchedCallback = noop; this.onChangeCallback = noop; } ngOnInit() { this.matcher.item = this.item; if (this.item.value) { this.value = moment(this.item.value.toString()); // } this.onTouchedCallback(); } ngAfterViewInit() { //console.log(this.inputField); this.inputField.value = '5/14/2021'; } ngOnChanges() { this.matcher.item = this.item; } checkRequired(placeholder) { if (placeholder === 'Required') { return true; } } onValueChanges(ev) { const val = ev.value ? ev.value.format('L') : ''; this.item.value = val; this.changes.emit(this.item); } //get accessor get value() { return this.innerValue; } ; get textValue() { return this.value ? this.value.format('L') : ''; } ; //set accessor including call the onchange callback set value(v) { if (v !== this.innerValue) { this.innerValue = v; } } //Occured value changed from module writeValue(value) { if (value !== this.innerValue) { this.innerValue = value; } } registerOnChange(fn) { this.onChangeCallback = fn; } registerOnTouched(fn) { this.onTouchedCallback = fn; } onChange(event) { this.value = event; this.onBlur(); } onBlur() { this.onChangeCallback(this.innerValue); } todate(value) { this.value = value ? moment(value) : ''; this.onValueChanges({ value: this.value }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FormItemDateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: FormItemDateComponent, selector: "ammo-form-item-date", inputs: { item: "item", editable: "editable" }, outputs: { changes: "changes" }, providers: [ CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR ], viewQueries: [{ propertyName: "inputField", first: true, predicate: ["inputField"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"form-group\">\n <mat-form-field class=\"example-full-width\">\n <input type=\"hidden\" [matDatepicker]=\"picker\" [(ngModel)]='value' (dateChange)=\"onValueChanges($event)\">\n <input matInput #inputField\n [name]=\"item.name\"\n [disabled]=\"!editable || (value && item.readOnly)\"\n [attr.id]=\"item.name\"\n [placeholder]=\"item.label\"\n (change)='todate($event.target.value)'\n [ngModel]=\"textValue | date:'MM/dd/yyyy'\"\n [errorStateMatcher]=\"matcher\"\n [required]=\"item.required\"\n mask=\"M0/d0/0000\"\n (blur)=\"onBlur()\"\n >\n <mat-error *ngIf=\"item.errors && item.errors.length\">\n <div *ngFor=\"let error of item.errors\">{{error.message}}</div>\n </mat-error>\n <mat-hint align=\"start\" *ngIf=\"!(item.errors && item.errors.length)\"><strong>{{item.hint}}</strong> </mat-hint>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker (selectedChanged)=\"onChange($event)\" #picker></mat-datepicker>\n </mat-form-field>\n</div>\n\n", styles: [".example-full-width{width:100%}\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.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.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i5.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i5.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i5.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i6.MaskDirective, selector: "input[mask], textarea[mask]", inputs: ["mask", "specialCharacters", "patterns", "prefix", "suffix", "thousandSeparator", "decimalMarker", "dropSpecialCharacters", "hiddenInput", "showMaskTyped", "placeHolderCharacter", "shownMaskExpression", "showTemplate", "clearIfNotMatch", "validation", "separatorLimit", "allowNegativeNumbers", "leadZeroDateTime", "triggerOnMaskChange"], outputs: ["maskFilled"], exportAs: ["mask", "ngxMask"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FormItemDateComponent, decorators: [{ type: Component, args: [{ selector: 'ammo-form-item-date', providers: [ CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR ], template: "<div class=\"form-group\">\n <mat-form-field class=\"example-full-width\">\n <input type=\"hidden\" [matDatepicker]=\"picker\" [(ngModel)]='value' (dateChange)=\"onValueChanges($event)\">\n <input matInput #inputField\n [name]=\"item.name\"\n [disabled]=\"!editable || (value && item.readOnly)\"\n [attr.id]=\"item.name\"\n [placeholder]=\"item.label\"\n (change)='todate($event.target.value)'\n [ngModel]=\"textValue | date:'MM/dd/yyyy'\"\n [errorStateMatcher]=\"matcher\"\n [required]=\"item.required\"\n mask=\"M0/d0/0000\"\n (blur)=\"onBlur()\"\n >\n <mat-error *ngIf=\"item.errors && item.errors.length\">\n <div *ngFor=\"let error of item.errors\">{{error.message}}</div>\n </mat-error>\n <mat-hint align=\"start\" *ngIf=\"!(item.errors && item.errors.length)\"><strong>{{item.hint}}</strong> </mat-hint>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker (selectedChanged)=\"onChange($event)\" #picker></mat-datepicker>\n </mat-form-field>\n</div>\n\n", styles: [".example-full-width{width:100%}\n"] }] }], ctorParameters: () => [], propDecorators: { inputField: [{ type: ViewChild, args: ['inputField', { static: true }] }], item: [{ type: Input }], editable: [{ type: Input }], changes: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1pdGVtLWRhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN1cnZleXMvc3JjL2xpYi9mb3JtLWl0ZW0vZm9ybS1pdGVtLWRhdGUvZm9ybS1pdGVtLWRhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN1cnZleXMvc3JjL2xpYi9mb3JtLWl0ZW0vZm9ybS1pdGVtLWRhdGUvZm9ybS1pdGVtLWRhdGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNySCxPQUFPLEVBQUUsUUFBUSxFQUFFLHVCQUF1QixFQUFrQixNQUFNLFVBQVUsQ0FBQztBQUM3RSxPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7QUFFekUsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDOzs7Ozs7OztBQUU1QixNQUFNLE9BQU8sWUFBYSxTQUFRLFFBQVE7Q0FFekM7QUFHRCxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBUTtJQUN0RCxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUM7SUFDcEQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBRUYsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO0FBQ2xCLENBQUMsQ0FBQztBQVVGLE1BQU0sT0FBTyxxQkFBcUI7SUFXOUI7UUFOUyxhQUFRLEdBQVUsSUFBSSxDQUFDO1FBQ3RCLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBZ0IsQ0FBQztRQUNyRCxZQUFPLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBbUN4Qyx5REFBeUQ7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SyxFQUFFLElBQUksQ0FBQyxLQUFLO1NBQ2xCLENBQUMsQ0FBQTtJQUNOLENBQUM7K0dBNUZVLHFCQUFxQjttR0FBckIscUJBQXFCLCtIQUpyQjtZQUNULG1DQUFtQztTQUNwQyx1S0MxQkgsa3FDQXdCQTs7NEZESWEscUJBQXFCO2tCQVJqQyxTQUFTOytCQUNFLHFCQUFxQixhQUdwQjt3QkFDVCxtQ0FBbUM7cUJBQ3BDO3dEQUltRCxVQUFVO3NCQUEzRCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRWhDLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLE9BQU87c0JBQWhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgT3V0cHV0LCBWaWV3Q2hpbGQsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1JdGVtLCBTdXJ2ZXlFcnJvclN0YXRlTWF0Y2hlciwgRm9ybUl0ZW1XaWRnZXQgfSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xuXG5leHBvcnQgY2xhc3MgRm9ybUl0ZW1EYXRlIGV4dGVuZHMgRm9ybUl0ZW0ge1xuXG59XG5cblxuZXhwb3J0IGNvbnN0IENVU1RPTV9JTlBVVF9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SOiBhbnkgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGb3JtSXRlbURhdGVDb21wb25lbnQpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuY29uc3Qgbm9vcCA9ICgpID0+IHtcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FtbW8tZm9ybS1pdGVtLWRhdGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1pdGVtLWRhdGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtLWl0ZW0tZGF0ZS5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICBDVVNUT01fSU5QVVRfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUlxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtSXRlbURhdGVDb21wb25lbnQgaW1wbGVtZW50cyBGb3JtSXRlbVdpZGdldCwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgICBAVmlld0NoaWxkKCdpbnB1dEZpZWxkJywgeyBzdGF0aWM6IHRydWUgfSkgcHVibGljIGlucHV0RmllbGQ6TWF0SW5wdXQ7XG5cbiAgICBASW5wdXQoKSBpdGVtOiBGb3JtSXRlbURhdGU7XG4gICAgQElucHV0KCkgZWRpdGFibGU6IGJvb2xlYW49dHJ1ZTtcbiAgICBAT3V0cHV0KCkgY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9ybUl0ZW1EYXRlPigpO1xuICAgIG1hdGNoZXIgPSBuZXcgU3VydmV5RXJyb3JTdGF0ZU1hdGNoZXIoKTtcblxuICAgIGlubmVyVmFsdWU6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5tYXRjaGVyLml0ZW09dGhpcy5pdGVtO1xuICAgICAgICBpZiAodGhpcy5pdGVtLnZhbHVlKXtcbiAgICAgICAgICAgIHRoaXMudmFsdWU9bW9tZW50KHRoaXMuaXRlbS52YWx1ZS50b1N0cmluZygpKTsvL1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKXtcbiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmlucHV0RmllbGQpO1xuICAgICAgICB0aGlzLmlucHV0RmllbGQudmFsdWU9JzUvMTQvMjAyMSc7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMubWF0Y2hlci5pdGVtPXRoaXMuaXRlbTtcbiAgICB9XG5cbiAgICBjaGVja1JlcXVpcmVkKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgIGlmIChwbGFjZWhvbGRlciA9PT0gJ1JlcXVpcmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblZhbHVlQ2hhbmdlcyhldikge1xuICAgICAgICBjb25zdCB2YWw9ZXYudmFsdWUgPyBldi52YWx1ZS5mb3JtYXQoJ0wnKSA6ICcnO1xuICAgICAgICB0aGlzLml0ZW0udmFsdWU9dmFsO1xuICAgICAgICB0aGlzLmNoYW5nZXMuZW1pdCh0aGlzLml0ZW0pO1xuICAgIH1cblxuICAgIC8vUGxhY2Vob2xkZXJzIGZvciB0aGUgY2FsbGJhY2tzIHdoaWNoIGFyZSBsYXRlciBwcm92aWRlZFxuICAvL2J5IHRoZSBDb250cm9sIFZhbHVlIEFjY2Vzc29yXG4gIHByaXZhdGUgb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIG9uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuXG5cbiAgLy9nZXQgYWNjZXNzb3JcbiAgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuaW5uZXJWYWx1ZTtcbiAgfTtcblxuICBnZXQgdGV4dFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlLmZvcm1hdCgnTCcpIDogJyc7XG4gIH07XG5cbiAgLy9zZXQgYWNjZXNzb3IgaW5jbHVkaW5nIGNhbGwgdGhlIG9uY2hhbmdlIGNhbGxiYWNrXG4gIHNldCB2YWx1ZSh2OiBhbnkpIHtcbiAgICBpZiAodiAhPT0gdGhpcy5pbm5lclZhbHVlKSB7XG4gICAgICB0aGlzLmlubmVyVmFsdWUgPSB2O1xuICAgIH1cbiAgfVxuICAgLy9PY2N1cmVkIHZhbHVlIGNoYW5nZWQgZnJvbSBtb2R1bGVcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLmlubmVyVmFsdWUpIHtcbiAgICAgIHRoaXMuaW5uZXJWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cblxuICBvbkNoYW5nZShldmVudCkge1xuICAgIHRoaXMudmFsdWUgPSBldmVudDtcbiAgICB0aGlzLm9uQmx1cigpO1xuICB9XG5cbiAgb25CbHVyKCkge1xuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh0aGlzLmlubmVyVmFsdWUpO1xuICB9XG5cbiAgdG9kYXRlKHZhbHVlKXtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWUgPyBtb21lbnQodmFsdWUpIDogJyc7XG4gICAgdGhpcy5vblZhbHVlQ2hhbmdlcyh7XG4gICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlXG4gICAgICB9KVxuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZXhhbXBsZS1mdWxsLXdpZHRoXCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgW21hdERhdGVwaWNrZXJdPVwicGlja2VyXCIgWyhuZ01vZGVsKV09J3ZhbHVlJyAoZGF0ZUNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlcygkZXZlbnQpXCI+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCAjaW5wdXRGaWVsZFxuICAgICAgICAgICAgW25hbWVdPVwiaXRlbS5uYW1lXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdGFibGUgfHwgKHZhbHVlICYmIGl0ZW0ucmVhZE9ubHkpXCJcbiAgICAgICAgICAgIFthdHRyLmlkXT1cIml0ZW0ubmFtZVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiaXRlbS5sYWJlbFwiXG4gICAgICAgICAgICAoY2hhbmdlKT0ndG9kYXRlKCRldmVudC50YXJnZXQudmFsdWUpJ1xuICAgICAgICAgICAgW25nTW9kZWxdPVwidGV4dFZhbHVlIHwgZGF0ZTonTU0vZGQveXl5eSdcIlxuICAgICAgICAgICAgW2Vycm9yU3RhdGVNYXRjaGVyXT1cIm1hdGNoZXJcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cIml0ZW0ucmVxdWlyZWRcIlxuICAgICAgICAgICAgbWFzaz1cIk0wL2QwLzAwMDBcIlxuICAgICAgICAgICAgKGJsdXIpPVwib25CbHVyKClcIlxuICAgICAgICA+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpdGVtLmVycm9ycyAmJiBpdGVtLmVycm9ycy5sZW5ndGhcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBlcnJvciBvZiBpdGVtLmVycm9yc1wiPnt7ZXJyb3IubWVzc2FnZX19PC9kaXY+XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWhpbnQgYWxpZ249XCJzdGFydFwiICpuZ0lmPVwiIShpdGVtLmVycm9ycyAmJiBpdGVtLmVycm9ycy5sZW5ndGgpXCI+PHN0cm9uZz57e2l0ZW0uaGludH19PC9zdHJvbmc+IDwvbWF0LWhpbnQ+XG4gICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwicGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgIDxtYXQtZGF0ZXBpY2tlciAgKHNlbGVjdGVkQ2hhbmdlZCk9XCJvbkNoYW5nZSgkZXZlbnQpXCIgI3BpY2tlcj48L21hdC1kYXRlcGlja2VyPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG48L2Rpdj5cblxuIl19