ngx-surveys
Version:
Angular 18+ survey / form builder
83 lines • 22.6 kB
JavaScript
import { Component, Input, EventEmitter, Output } from '@angular/core';
import { FormItem } from '../form-item';
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 "./radio-group/radio-group.component";
import * as i6 from "./selection-list/selection-list.component";
import * as i7 from "./select/select.component";
export class FormItemRadio extends FormItem {
constructor() {
super(...arguments);
this.hasOptions = true;
}
}
export class FormItemRadioComponent {
constructor() {
this.editable = true;
this.changes = new EventEmitter();
this.explanationValue = '';
}
ngOnInit() {
//console.log(this.item);
if (this.item && !this.item.multiple && Array.isArray(this.item.value)) {
this.item.value = this.item.value[0];
}
//console.log(this.item.value);
let selectedOptionObj = this.item.items.find(op => op.optionValue === this.item.value);
this.selectedOption = selectedOptionObj ? selectedOptionObj.optionValue : '';
if (!this.selectedOption && this.item.value && !this.item.multiple) {
const valArr = (this.item.value.toString()).split(', ');
selectedOptionObj = this.item.items.find(op => op.optionValue === valArr[0]);
//console.log(valArr, selectedOptionObj);
if (selectedOptionObj) {
this.selectedOption = selectedOptionObj.optionValue;
this.explanationValue = valArr.slice(1, valArr.length).join(', ');
}
}
//console.log(this.item.value);
}
onSelectionChange(value) {
//console.log(value);
this.item.value = value;
if (!Array.isArray(value)) {
this.selectedOption = value;
this.onExplanationValueChanges(this.explanationValue, this.item.value);
}
this.changes.emit(this.item);
}
onExplanationValueChanges(val, selectedOptionVal) {
//console.log(val);
//console.log(val, selectedOptionVal);
const option = this.item.items.find(op => op.optionValue === selectedOptionVal);
if (!option || !this.isExplanationRequired(option.optionValue)) {
return false;
}
this.item.value = option.optionValue + ', ' + val;
this.changes.emit(this.item);
}
isExplanationRequired(selectedOptionVal) {
//console.log(selectedOptionVal);
const option = this.item.items.find(op => op.optionValue === selectedOptionVal);
if (!option) {
return false;
}
this.explanationLabel = option.explanationLabel;
return option && option.showExplanation;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FormItemRadioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: FormItemRadioComponent, selector: "ammo-form-item-radio", inputs: { item: "item", editable: "editable" }, outputs: { changes: "changes" }, ngImport: i0, template: "<label *ngIf=\"item.label\" [ngClass]=\"{'has-error':item.errors && item.errors.length}\">{{item.label}} <span class=\"required\" *ngIf=\"item.required\">*</span></label>\n<ng-container *ngIf=\"item.items && item.items.length\">\n <app-selection-list *ngIf=\"!item.style || item.style==='list'\"\n [label]=\"item.label\"\n [editable]=\"editable\"\n [required]=\"item.required\"\n [value]=\"item.multiple ? item.value : selectedOption\"\n [options]=\"item.items\"\n [multiple]=\"item.multiple\"\n (selectionChange)=\"onSelectionChange($event)\"\n ></app-selection-list>\n <app-radio-group *ngIf=\"item.style==='buttons'\"\n [label]=\"item.label\"\n [editable]=\"editable\"\n [required]=\"item.required\"\n [label]=\"item.label\"\n [value]=\"item.multiple ? item.value : selectedOption\"\n [options]=\"item.items\"\n [multiple]=\"item.multiple\"\n (selectionChange)=\"onSelectionChange($event)\"\n ></app-radio-group>\n <app-select *ngIf=\"item.style==='select'\"\n [label]=\"item.label\"\n [editable]=\"editable\"\n [required]=\"item.required\"\n [value]=\"item.multiple ? item.value : selectedOption\"\n [options]=\"item.items\"\n [multiple]=\"item.multiple\"\n (selectionChange)=\"onSelectionChange($event)\"\n ></app-select>\n <mat-form-field *ngIf=\"isExplanationRequired(selectedOption)\" class=\"other-option-field\">\n <mat-label>{{explanationLabel}}</mat-label>\n <input #inputField\n matInput\n [(ngModel)]=\"explanationValue\"\n (ngModelChange)=\"onExplanationValueChanges($event, selectedOption)\"\n >\n </mat-form-field>\n</ng-container>\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", styles: [":host ::ng-deep .mat-list-item:not(:last-of-type){border-bottom:1px solid #eaeaea}:host ::ng-deep .mat-pseudo-checkbox{color:transparent}:host ::ng-deep .mat-list-single-selected-option .mat-list-text{display:flex;flex-direction:row!important}:host ::ng-deep .mat-list-single-selected-option .mat-list-text>span{width:100%}:host ::ng-deep .mat-pseudo-checkbox-checked{color:transparent;background:transparent}:host ::ng-deep .mat-pseudo-checkbox-checked:after{opacity:1}:host ::ng-deep .mat-error{padding:.54167em;border-top:1px solid red;font-size:75%;text-align:center}:host ::ng-deep .mat-radio-button{margin-left:15px}:host ::ng-deep .other-option-field{display:block}:host ::ng-deep label{color:#0000008a}:host ::ng-deep label.has-error{color:#f44336}.mat-list,.mat-selection-list{padding-top:0}.mat-mdc-form-field{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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.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.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i5.RadioGroupComponent, selector: "app-radio-group", inputs: ["label", "editable", "required", "multiple", "options", "value"], outputs: ["selectionChange"] }, { kind: "component", type: i6.SelectionListComponent, selector: "app-selection-list", inputs: ["label", "editable", "required", "multiple", "options", "value"], outputs: ["selectionChange"] }, { kind: "component", type: i7.SelectComponent, selector: "app-select", inputs: ["label", "editable", "required", "multiple", "options", "value"], outputs: ["selectionChange"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FormItemRadioComponent, decorators: [{
type: Component,
args: [{ selector: 'ammo-form-item-radio', template: "<label *ngIf=\"item.label\" [ngClass]=\"{'has-error':item.errors && item.errors.length}\">{{item.label}} <span class=\"required\" *ngIf=\"item.required\">*</span></label>\n<ng-container *ngIf=\"item.items && item.items.length\">\n <app-selection-list *ngIf=\"!item.style || item.style==='list'\"\n [label]=\"item.label\"\n [editable]=\"editable\"\n [required]=\"item.required\"\n [value]=\"item.multiple ? item.value : selectedOption\"\n [options]=\"item.items\"\n [multiple]=\"item.multiple\"\n (selectionChange)=\"onSelectionChange($event)\"\n ></app-selection-list>\n <app-radio-group *ngIf=\"item.style==='buttons'\"\n [label]=\"item.label\"\n [editable]=\"editable\"\n [required]=\"item.required\"\n [label]=\"item.label\"\n [value]=\"item.multiple ? item.value : selectedOption\"\n [options]=\"item.items\"\n [multiple]=\"item.multiple\"\n (selectionChange)=\"onSelectionChange($event)\"\n ></app-radio-group>\n <app-select *ngIf=\"item.style==='select'\"\n [label]=\"item.label\"\n [editable]=\"editable\"\n [required]=\"item.required\"\n [value]=\"item.multiple ? item.value : selectedOption\"\n [options]=\"item.items\"\n [multiple]=\"item.multiple\"\n (selectionChange)=\"onSelectionChange($event)\"\n ></app-select>\n <mat-form-field *ngIf=\"isExplanationRequired(selectedOption)\" class=\"other-option-field\">\n <mat-label>{{explanationLabel}}</mat-label>\n <input #inputField\n matInput\n [(ngModel)]=\"explanationValue\"\n (ngModelChange)=\"onExplanationValueChanges($event, selectedOption)\"\n >\n </mat-form-field>\n</ng-container>\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", styles: [":host ::ng-deep .mat-list-item:not(:last-of-type){border-bottom:1px solid #eaeaea}:host ::ng-deep .mat-pseudo-checkbox{color:transparent}:host ::ng-deep .mat-list-single-selected-option .mat-list-text{display:flex;flex-direction:row!important}:host ::ng-deep .mat-list-single-selected-option .mat-list-text>span{width:100%}:host ::ng-deep .mat-pseudo-checkbox-checked{color:transparent;background:transparent}:host ::ng-deep .mat-pseudo-checkbox-checked:after{opacity:1}:host ::ng-deep .mat-error{padding:.54167em;border-top:1px solid red;font-size:75%;text-align:center}:host ::ng-deep .mat-radio-button{margin-left:15px}:host ::ng-deep .other-option-field{display:block}:host ::ng-deep label{color:#0000008a}:host ::ng-deep label.has-error{color:#f44336}.mat-list,.mat-selection-list{padding-top:0}.mat-mdc-form-field{display:block}\n"] }]
}], ctorParameters: () => [], propDecorators: { item: [{
type: Input
}], editable: [{
type: Input
}], changes: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1pdGVtLXJhZGlvLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zdXJ2ZXlzL3NyYy9saWIvZm9ybS1pdGVtL2Zvcm0taXRlbS1yYWRpby9mb3JtLWl0ZW0tcmFkaW8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXN1cnZleXMvc3JjL2xpYi9mb3JtLWl0ZW0vZm9ybS1pdGVtLXJhZGlvL2Zvcm0taXRlbS1yYWRpby5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxRQUFRLEVBQXNDLE1BQU0sY0FBYyxDQUFDOzs7Ozs7Ozs7QUFFNUUsTUFBTSxPQUFPLGFBQWMsU0FBUSxRQUFRO0lBQTNDOztRQUlJLGVBQVUsR0FBVSxJQUFJLENBQUM7SUFFN0IsQ0FBQztDQUFBO0FBT0QsTUFBTSxPQUFPLHNCQUFzQjtJQVUvQjtRQVBTLGFBQVEsR0FBVSxJQUFJLENBQUM7UUFDdEIsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBRXRELHFCQUFnQixHQUFTLEVBQUUsQ0FBQztJQUlaLENBQUM7SUFFakIsUUFBUTtRQUNKLHlCQUF5QjtRQUN6QixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsK0JBQStCO1FBQy9CLElB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LElBQUksQ0FBQyxnQkFBZ0IsR0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUE7UUFDN0MsT0FBTyxNQUFNLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQztJQUM1QyxDQUFDOytHQWpFUSxzQkFBc0I7bUdBQXRCLHNCQUFzQiw2SUNoQm5DLCsvREE0Q0E7OzRGRDVCYSxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0Usc0JBQXNCO3dEQU1yQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUl0ZW0sIEZvcm1JdGVtT3B0aW9uSXRlbSwgRm9ybUl0ZW1XaWRnZXQgfSBmcm9tICcuLi9mb3JtLWl0ZW0nO1xuXG5leHBvcnQgY2xhc3MgRm9ybUl0ZW1SYWRpbyBleHRlbmRzIEZvcm1JdGVtIHtcbiAgICBpdGVtczogRm9ybUl0ZW1PcHRpb25JdGVtW107XG4gICAgbXVsdGlwbGU6IGJvb2xlYW47XG4gICAgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgIGhhc09wdGlvbnM6IGJvb2xlYW49dHJ1ZTtcbiAgICBvdGhlclRleHRWYWx1ZTogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhbW1vLWZvcm0taXRlbS1yYWRpbycsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWl0ZW0tcmFkaW8uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtLWl0ZW0tcmFkaW8uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBGb3JtSXRlbVJhZGlvQ29tcG9uZW50IGltcGxlbWVudHMgRm9ybUl0ZW1XaWRnZXQsIE9uSW5pdCB7XG5cbiAgICBASW5wdXQoKSBpdGVtOiBGb3JtSXRlbVJhZGlvO1xuICAgIEBJbnB1dCgpIGVkaXRhYmxlOiBib29sZWFuPXRydWU7XG4gICAgQE91dHB1dCgpIGNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1JdGVtUmFkaW8+KCk7XG5cbiAgICBleHBsYW5hdGlvblZhbHVlOiBzdHJpbmc9Jyc7XG4gICAgZXhwbGFuYXRpb25MYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHNlbGVjdGVkT3B0aW9uOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5pdGVtKTtcbiAgICAgICAgaWYgKHRoaXMuaXRlbSAmJiAhdGhpcy5pdGVtLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkodGhpcy5pdGVtLnZhbHVlKSl7XG4gICAgICAgICAgICB0aGlzLml0ZW0udmFsdWU9dGhpcy5pdGVtLnZhbHVlWzBdO1xuICAgICAgICB9XG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5pdGVtLnZhbHVlKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkT3B0aW9uT2JqPXRoaXMuaXRlbS5pdGVtcy5maW5kKG9wPT5vcC5vcHRpb25WYWx1ZT09PXRoaXMuaXRlbS52YWx1ZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb249c2VsZWN0ZWRPcHRpb25PYmogPyBzZWxlY3RlZE9wdGlvbk9iai5vcHRpb25WYWx1ZSA6ICcnO1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRPcHRpb24gJiYgdGhpcy5pdGVtLnZhbHVlICYmICF0aGlzLml0ZW0ubXVsdGlwbGUpe1xuICAgICAgICAgICAgY29uc3QgdmFsQXJyPSh0aGlzLml0ZW0udmFsdWUudG9TdHJpbmcoKSkuc3BsaXQoJywgJyk7XG5cbiAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9uT2JqPXRoaXMuaXRlbS5pdGVtcy5maW5kKG9wPT5vcC5vcHRpb25WYWx1ZT09PXZhbEFyclswXSk7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKHZhbEFyciwgc2VsZWN0ZWRPcHRpb25PYmopO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkT3B0aW9uT2JqKXtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9uPXNlbGVjdGVkT3B0aW9uT2JqLm9wdGlvblZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwbGFuYXRpb25WYWx1ZT12YWxBcnIuc2xpY2UoMSwgdmFsQXJyLmxlbmd0aCkuam9pbignLCAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMuaXRlbS52YWx1ZSk7XG4gICAgfVxuXG5cbiAgICBvblNlbGVjdGlvbkNoYW5nZSh2YWx1ZTpzdHJpbmcgfCBzdHJpbmdbXSl7XG4gICAgICAgIC8vY29uc29sZS5sb2codmFsdWUpO1xuICAgICAgICB0aGlzLml0ZW0udmFsdWU9dmFsdWU7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpe1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbj12YWx1ZTtcbiAgICAgICAgICAgIHRoaXMub25FeHBsYW5hdGlvblZhbHVlQ2hhbmdlcyh0aGlzLmV4cGxhbmF0aW9uVmFsdWUsIHRoaXMuaXRlbS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2VzLmVtaXQodGhpcy5pdGVtKTtcbiAgICB9XG5cblxuICAgIG9uRXhwbGFuYXRpb25WYWx1ZUNoYW5nZXModmFsOnN0cmluZywgc2VsZWN0ZWRPcHRpb25WYWw6c3RyaW5nIHwgc3RyaW5nW10pe1xuICAgICAgICAvL2NvbnNvbGUubG9nKHZhbCk7XG4gICAgICAgIC8vY29uc29sZS5sb2codmFsLCBzZWxlY3RlZE9wdGlvblZhbCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbj10aGlzLml0ZW0uaXRlbXMuZmluZChvcD0+b3Aub3B0aW9uVmFsdWU9PT1zZWxlY3RlZE9wdGlvblZhbCk7XG4gICAgICAgIGlmICghb3B0aW9uIHx8ICF0aGlzLmlzRXhwbGFuYXRpb25SZXF1aXJlZChvcHRpb24ub3B0aW9uVmFsdWUpKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXRlbS52YWx1ZT1vcHRpb24ub3B0aW9uVmFsdWUrJywgJyt2YWw7XG4gICAgICAgIHRoaXMuY2hhbmdlcy5lbWl0KHRoaXMuaXRlbSk7XG4gICAgfVxuXG4gICAgaXNFeHBsYW5hdGlvblJlcXVpcmVkKHNlbGVjdGVkT3B0aW9uVmFsOnN0cmluZyB8IHN0cmluZ1tdKXtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhzZWxlY3RlZE9wdGlvblZhbCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbj10aGlzLml0ZW0uaXRlbXMuZmluZChvcD0+b3Aub3B0aW9uVmFsdWU9PT1zZWxlY3RlZE9wdGlvblZhbCk7XG4gICAgICAgIGlmICghb3B0aW9uKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV4cGxhbmF0aW9uTGFiZWw9b3B0aW9uLmV4cGxhbmF0aW9uTGFiZWxcbiAgICAgICAgcmV0dXJuIG9wdGlvbiAmJiBvcHRpb24uc2hvd0V4cGxhbmF0aW9uO1xuICAgIH1cbn1cbiIsIjxsYWJlbCAqbmdJZj1cIml0ZW0ubGFiZWxcIiBbbmdDbGFzc109XCJ7J2hhcy1lcnJvcic6aXRlbS5lcnJvcnMgJiYgaXRlbS5lcnJvcnMubGVuZ3RofVwiPnt7aXRlbS5sYWJlbH19IDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIiAqbmdJZj1cIml0ZW0ucmVxdWlyZWRcIj4qPC9zcGFuPjwvbGFiZWw+XG48bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS5pdGVtcyAmJiBpdGVtLml0ZW1zLmxlbmd0aFwiPlxuICAgIDxhcHAtc2VsZWN0aW9uLWxpc3QgICpuZ0lmPVwiIWl0ZW0uc3R5bGUgfHwgaXRlbS5zdHlsZT09PSdsaXN0J1wiXG4gICAgICAgIFtsYWJlbF09XCJpdGVtLmxhYmVsXCJcbiAgICAgICAgW2VkaXRhYmxlXT1cImVkaXRhYmxlXCJcbiAgICAgICAgW3JlcXVpcmVkXT1cIml0ZW0ucmVxdWlyZWRcIlxuICAgICAgICBbdmFsdWVdPVwiaXRlbS5tdWx0aXBsZSA/IGl0ZW0udmFsdWUgOiBzZWxlY3RlZE9wdGlvblwiXG4gICAgICAgIFtvcHRpb25zXT1cIml0ZW0uaXRlbXNcIlxuICAgICAgICBbbXVsdGlwbGVdPVwiaXRlbS5tdWx0aXBsZVwiXG4gICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgPjwvYXBwLXNlbGVjdGlvbi1saXN0PlxuICAgIDxhcHAtcmFkaW8tZ3JvdXAgICpuZ0lmPVwiaXRlbS5zdHlsZT09PSdidXR0b25zJ1wiXG4gICAgICAgIFtsYWJlbF09XCJpdGVtLmxhYmVsXCJcbiAgICAgICAgW2VkaXRhYmxlXT1cImVkaXRhYmxlXCJcbiAgICAgICAgW3JlcXVpcmVkXT1cIml0ZW0ucmVxdWlyZWRcIlxuICAgICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICAgIFt2YWx1ZV09XCJpdGVtLm11bHRpcGxlID8gaXRlbS52YWx1ZSA6IHNlbGVjdGVkT3B0aW9uXCJcbiAgICAgICAgW29wdGlvbnNdPVwiaXRlbS5pdGVtc1wiXG4gICAgICAgIFttdWx0aXBsZV09XCJpdGVtLm11bHRpcGxlXCJcbiAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICA+PC9hcHAtcmFkaW8tZ3JvdXA+XG4gICAgPGFwcC1zZWxlY3QgICpuZ0lmPVwiaXRlbS5zdHlsZT09PSdzZWxlY3QnXCJcbiAgICAgICAgW2xhYmVsXT1cIml0ZW0ubGFiZWxcIlxuICAgICAgICBbZWRpdGFibGVdPVwiZWRpdGFibGVcIlxuICAgICAgICBbcmVxdWlyZWRdPVwiaXRlbS5yZXF1aXJlZFwiXG4gICAgICAgIFt2YWx1ZV09XCJpdGVtLm11bHRpcGxlID8gaXRlbS52YWx1ZSA6IHNlbGVjdGVkT3B0aW9uXCJcbiAgICAgICAgW29wdGlvbnNdPVwiaXRlbS5pdGVtc1wiXG4gICAgICAgIFttdWx0aXBsZV09XCJpdGVtLm11bHRpcGxlXCJcbiAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICA+PC9hcHAtc2VsZWN0PlxuICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImlzRXhwbGFuYXRpb25SZXF1aXJlZChzZWxlY3RlZE9wdGlvbilcIiBjbGFzcz1cIm90aGVyLW9wdGlvbi1maWVsZFwiPlxuICAgICAgICA8bWF0LWxhYmVsPnt7ZXhwbGFuYXRpb25MYWJlbH19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dCAjaW5wdXRGaWVsZFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZXhwbGFuYXRpb25WYWx1ZVwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkV4cGxhbmF0aW9uVmFsdWVDaGFuZ2VzKCRldmVudCwgc2VsZWN0ZWRPcHRpb24pXCJcbiAgICAgICAgPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG48L25nLWNvbnRhaW5lcj5cblxuPG1hdC1lcnJvciAqbmdJZj1cIml0ZW0uZXJyb3JzICYmIGl0ZW0uZXJyb3JzLmxlbmd0aFwiPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGVycm9yIG9mIGl0ZW0uZXJyb3JzXCI+e3tlcnJvci5tZXNzYWdlfX08L2Rpdj5cbjwvbWF0LWVycm9yPlxuPG1hdC1oaW50IGFsaWduPVwic3RhcnRcIiAqbmdJZj1cIiEoaXRlbS5lcnJvcnMgJiYgaXRlbS5lcnJvcnMubGVuZ3RoKVwiPjxzdHJvbmc+e3tpdGVtLmhpbnR9fTwvc3Ryb25nPiA8L21hdC1oaW50PlxuIl19