@skireal/form-builder
Version:
Form builder for Angular apps
426 lines • 78.3 kB
JavaScript
import { __decorate } from "tslib";
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { moveItemInArray } from '@angular/cdk/drag-drop';
import { FormFieldType, defaultConditionalLogicBlock, fieldTypesNames, uniqueFieldTypes } from '../../constants/ui-constants';
import { UiFormService } from '../../services/ui-form.service';
import { FormDataService } from '../../services/form-data.service';
import { ConfirmationService } from '../../services/confirmation.service';
import { LocaleService } from '../../services/locale.service';
let UIComponent = class UIComponent {
constructor(uiFormService, formDataService, confirmationService, localeService) {
this.uiFormService = uiFormService;
this.formDataService = formDataService;
this.confirmationService = confirmationService;
this.localeService = localeService;
this.enableGeneralFields = true;
this.enableConditionalLogicBlocks = false;
this.isSurvey = true;
this.incomingFormData = {
formData: {
steps: [],
generalFields: []
},
options: {
name: '',
type: '',
country: ''
},
uniqueFormData: []
};
this.enableSetValidationOptions = false;
this.locale = {};
this.saveClicked = new EventEmitter();
this.formFieldType = FormFieldType;
this.formData = {
formData: {
steps: [],
generalFields: []
},
options: {
name: '',
type: '',
country: ''
},
uniqueFormData: []
};
this.addedFields = [];
this.generalFields = [];
this.conditionalLogicBlocks = [];
this.fieldLabels = fieldTypesNames;
this.currentStep = 0;
this.usedFieldTypes = [];
this.isSidebarOpen = false;
this.isFieldsInsertingOpen = false;
this.isFieldPropertiesOpen = false;
this.isGeneral = false;
this.fieldToEdit = { id: '', name: '' };
this.hasFeedBackText = false;
this.editedFieldId = null;
}
ngOnInit() {
this.insertFormData();
this.createForm();
this.initializeUsedFieldTypes(this.addedFields);
this.updateSpecialFieldStates();
if (this.locale) {
this.localeService.setLocale(this.locale);
}
}
ngOnChanges(changes) {
if (changes['locale'] && this.locale) {
this.localeService.setLocale(this.locale);
}
}
createForm() {
this.dynamicForm = this.uiFormService.createFormGroup(this.addedFields);
if (this.enableGeneralFields) {
this.generalForm = this.uiFormService.createFormGroup(this.generalFields);
}
}
removeField(field, isGeneral) {
let fieldsArray;
let formGroup;
if (isGeneral) {
fieldsArray = this.generalFields;
formGroup = this.generalForm;
}
else {
fieldsArray = this.addedFields;
formGroup = this.dynamicForm;
}
const index = fieldsArray.indexOf(field);
if (index !== -1) {
fieldsArray.splice(index, 1);
formGroup.removeControl(field.id);
}
if (this.isFieldUnique(field.type)) {
const typeIndex = this.usedFieldTypes.indexOf(field.type);
if (typeIndex !== -1) {
this.usedFieldTypes.splice(typeIndex, 1);
}
}
this.saveCurrentStepData();
}
copyField(field, isGeneral) {
let fieldsArray;
let formGroup;
if (isGeneral) {
fieldsArray = this.generalFields;
formGroup = this.generalForm;
}
else {
fieldsArray = this.addedFields;
formGroup = this.dynamicForm;
}
const copiedField = Object.assign({}, field);
copiedField.id = this.uiFormService.generateUniqueId();
if (copiedField.feedBackText) {
copiedField.feedBackText = false;
}
const originalFieldIndex = fieldsArray.indexOf(field);
fieldsArray.splice(originalFieldIndex + 1, 0, copiedField);
const newFormControl = this.uiFormService.createControl();
formGroup.addControl(copiedField.id, newFormControl);
this.saveCurrentStepData();
}
insertConditionalLogicBlock() {
const newBlock = defaultConditionalLogicBlock;
this.conditionalLogicBlocks.push(newBlock);
this.saveCurrentStepData();
}
removeConditionalLogicBlock(index) {
this.conditionalLogicBlocks.splice(index, 1);
this.saveCurrentStepData();
}
goToStep(step) {
this.currentStep = step;
if (!this.formData.formData.steps[this.currentStep]) {
this.formData.formData.steps[this.currentStep] = {
addedFields: [],
conditionalLogicBlocks: []
};
}
this.updateStep();
}
goToNextStep() {
if (this.addedFields.length === 0) {
return;
}
this.saveCurrentStepData();
this.currentStep++;
this.goToStep(this.currentStep);
}
goToPreviousStep() {
if (this.currentStep > 0) {
this.saveCurrentStepData();
this.currentStep--;
this.goToStep(this.currentStep);
}
}
saveCurrentStepData() {
this.formData.formData.generalFields = [...this.generalFields];
this.formData.formData.steps[this.currentStep] = {
addedFields: [...this.addedFields],
conditionalLogicBlocks: [...this.conditionalLogicBlocks]
};
this.updateSpecialFieldStates();
}
updateSpecialFieldStates() {
var _a;
const needContactField = this.findFieldInSteps(FormFieldType.NeedContact);
this.needContactDefaultValue = (_a = needContactField) === null || _a === void 0 ? void 0 : _a.defaultValue;
if (needContactField &&
needContactField.defaultValue !== undefined &&
!this.enableSetValidationOptions) {
this.updateRequiredFields(needContactField.defaultValue);
}
this.updateFeedBackTextFields();
}
updateFeedBackTextFields() {
this.hasFeedBackText = false;
for (const step of this.formData.formData.steps) {
for (const field of step.addedFields) {
if (field.type &&
[FormFieldType.Text, FormFieldType.Textarea].includes(field.type) &&
field.feedBackText) {
this.hasFeedBackText = true;
break;
}
}
if (this.hasFeedBackText)
break;
}
}
findFieldInSteps(fieldType) {
for (const step of this.formData.formData.steps) {
const field = step.addedFields.find((f) => f.type === fieldType);
if (field) {
return field;
}
}
return undefined;
}
updateRequiredFields(value) {
const isRequired = value === '1';
for (const step of this.formData.formData.steps) {
step.addedFields.forEach((field) => {
if (field.type &&
[
FormFieldType.ContactName,
FormFieldType.ContactSurname,
FormFieldType.ContactEmail
].includes(field.type)) {
field.required = isRequired;
}
});
}
}
insertFormData() {
var _a, _b, _c, _d, _e;
const incomingFormData = this.incomingFormData;
if (incomingFormData) {
this.formData = incomingFormData;
}
else {
this.formData = {
formData: {
steps: [],
generalFields: []
},
options: {
name: '',
type: '',
country: ''
},
uniqueFormData: []
};
}
this.addedFields = (_b = (_a = this.formData.formData.steps[this.currentStep]) === null || _a === void 0 ? void 0 : _a.addedFields, (_b !== null && _b !== void 0 ? _b : []));
this.generalFields = (_c = this.formData.formData.generalFields, (_c !== null && _c !== void 0 ? _c : []));
this.conditionalLogicBlocks = (_e = (_d = this.formData.formData.steps[this.currentStep]) === null || _d === void 0 ? void 0 : _d.conditionalLogicBlocks, (_e !== null && _e !== void 0 ? _e : []));
}
saveForm() {
this.saveCurrentStepData();
const payload = this.formDataService.prepareFormData(this.formData);
this.formDataService.setFormData(payload);
this.saveClicked.emit(payload);
}
preventDefault(event) {
event.preventDefault();
}
onDrop(event) {
const formArray = event.container.data;
moveItemInArray(formArray, event.previousIndex, event.currentIndex);
this.saveCurrentStepData();
}
copyStep(index) {
if (this.addedFields.length === 0) {
return;
}
const copiedStep = Object.assign({}, this.formData.formData.steps[index]);
copiedStep.addedFields = copiedStep.addedFields.map((field) => (Object.assign(Object.assign({}, field), { id: this.uiFormService.generateUniqueId() })));
this.formData.formData.steps.splice(index + 1, 0, copiedStep);
this.goToStep(index + 1);
this.saveCurrentStepData();
}
moveStep(index, direction) {
if (direction === 'next') {
[this.formData.formData.steps[index], this.formData.formData.steps[index + 1]] = [
this.formData.formData.steps[index + 1],
this.formData.formData.steps[index]
];
}
else if (direction === 'prev') {
[this.formData.formData.steps[index], this.formData.formData.steps[index - 1]] = [
this.formData.formData.steps[index - 1],
this.formData.formData.steps[index]
];
}
this.goToStep(index);
this.saveCurrentStepData();
}
deleteStepConfirmation(index) {
const localizedMessage = this.localeService.getCurrentLocale()['Are you sure you want to delete this step?'] ||
'Are you sure you want to delete this step?';
this.confirmationService.open(localizedMessage).then((result) => {
if (result) {
this.deleteStep(index);
}
});
}
deleteStep(index) {
this.formData.formData.steps.splice(index, 1);
if (this.currentStep >= index) {
this.currentStep = this.currentStep > 0 ? this.currentStep - 1 : 0;
}
if (this.formData.formData.steps.length > 0) {
this.updateStep();
}
else {
this.addedFields = [];
this.conditionalLogicBlocks = [];
this.createForm();
}
this.saveCurrentStepData();
}
updateStep() {
this.addedFields = this.formData.formData.steps[this.currentStep].addedFields;
this.conditionalLogicBlocks =
this.formData.formData.steps[this.currentStep].conditionalLogicBlocks;
this.createForm();
}
isFieldUnique(fieldType) {
return uniqueFieldTypes.includes(fieldType);
}
toggleSidebar() {
this.isSidebarOpen = this.isFieldsInsertingOpen || this.isFieldPropertiesOpen;
}
toggleFieldsInsertingSidebar(isGeneral = false) {
this.isFieldsInsertingOpen = !this.isFieldsInsertingOpen;
this.isFieldPropertiesOpen = false;
this.isGeneral = isGeneral;
this.toggleSidebar();
}
toggleFieldPropertiesSidebar(field, isGeneral) {
this.isFieldPropertiesOpen = !this.isFieldPropertiesOpen;
this.isFieldsInsertingOpen = false;
this.toggleSidebar();
this.fieldToEdit = field;
this.isGeneral = isGeneral;
this.editedFieldId = this.isFieldPropertiesOpen ? field.id : null;
if (!this.isSidebarOpen) {
this.editedFieldId = null;
}
}
onPropertiesSave(selectedField) {
if (selectedField) {
const newFormControl = this.uiFormService.createControl(selectedField.defaultValue);
if (this.isGeneral) {
this.generalFields.push(selectedField);
this.generalForm.addControl(selectedField.id, newFormControl);
}
else {
this.addedFields.push(selectedField);
this.dynamicForm.addControl(selectedField.id, newFormControl);
}
this.addUsedFieldType(selectedField.type);
this.saveCurrentStepData();
}
}
onPropertiesSaveAfterEdit(updatedField) {
if (updatedField) {
let fieldsArray;
if (this.isGeneral) {
fieldsArray = this.generalFields;
}
else {
fieldsArray = this.addedFields;
}
const index = fieldsArray.indexOf(this.fieldToEdit);
if (index !== -1) {
if (updatedField.step !== this.currentStep) {
fieldsArray.splice(index, 1);
const newStepIndex = updatedField.step;
const targetStep = this.formData.formData.steps[newStepIndex];
targetStep.addedFields.push(updatedField);
}
else {
fieldsArray[index] = updatedField;
}
}
if (updatedField.defaultValue !== undefined) {
const formControl = this.dynamicForm.get(updatedField.id);
if (formControl) {
formControl.setValue(updatedField.defaultValue);
}
}
this.saveCurrentStepData();
}
}
addUsedFieldType(type) {
if (this.isFieldUnique(type) && !this.usedFieldTypes.includes(type)) {
this.usedFieldTypes.push(type);
}
}
initializeUsedFieldTypes(fields) {
fields.forEach((field) => {
this.addUsedFieldType(field.type);
});
}
};
UIComponent.ctorParameters = () => [
{ type: UiFormService },
{ type: FormDataService },
{ type: ConfirmationService },
{ type: LocaleService }
];
__decorate([
Input()
], UIComponent.prototype, "enableGeneralFields", void 0);
__decorate([
Input()
], UIComponent.prototype, "enableConditionalLogicBlocks", void 0);
__decorate([
Input()
], UIComponent.prototype, "isSurvey", void 0);
__decorate([
Input()
], UIComponent.prototype, "incomingFormData", void 0);
__decorate([
Input()
], UIComponent.prototype, "enableSetValidationOptions", void 0);
__decorate([
Input()
], UIComponent.prototype, "locale", void 0);
__decorate([
Output()
], UIComponent.prototype, "saveClicked", void 0);
UIComponent = __decorate([
Component({
selector: 'app-ui',
template: "<div class=\"form-builder__test-form\">\r\n <div class=\"form-builder__test-form__main\" [ngClass]=\"{ collapsed: isSidebarOpen }\">\r\n <div class=\"form-builder__test-form__body\">\r\n <form\r\n *ngIf=\"enableGeneralFields === true\"\r\n [formGroup]=\"generalForm\"\r\n cdkDropList\r\n [cdkDropListData]=\"generalFields\"\r\n (cdkDropListDropped)=\"onDrop($event)\">\r\n <h3 *ngIf=\"generalFields.length\" class=\"form-builder__test-form__step\">\r\n {{ \"General Fields\" | localized }}\r\n </h3>\r\n <ng-container *ngFor=\"let field of generalFields\">\r\n <div\r\n class=\"form-builder__test-form__block\"\r\n [class.form-builder__test-form__block--editing]=\"field.id === editedFieldId\"\r\n cdkDrag>\r\n <div class=\"form-builder__test-form__label\">\r\n <label class=\"form-builder__form-label\">{{ field.title }}</label>\r\n </div>\r\n <div class=\"form-builder__test-form__field\" [ngSwitch]=\"field.type\">\r\n <div class=\"form-builder__test-form__field-label\">\r\n <span>{{ fieldLabels[field.type] | localized }}</span>\r\n </div>\r\n <div class=\"form-builder__test-form__field-toolbar\">\r\n <span\r\n class=\"form-builder__test-form__field-toolbar-icon\"\r\n [attr.data-tooltip]=\"'Delete' | localized\"\r\n (click)=\"removeField(field, true)\"\r\n ><i class=\"form-builder__bi form-builder__bi-trash\"></i\r\n ></span>\r\n <span\r\n class=\"form-builder__test-form__field-toolbar-icon\"\r\n [attr.data-tooltip]=\"'Edit' | localized\"\r\n (click)=\"toggleFieldPropertiesSidebar(field, true)\"\r\n ><i class=\"form-builder__bi form-builder__bi-pencil\"></i\r\n ></span>\r\n <span\r\n class=\"form-builder__test-form__field-toolbar-icon\"\r\n [attr.data-tooltip]=\"'Copy' | localized\"\r\n (click)=\"copyField(field, true)\"\r\n ><i class=\"form-builder__bi form-builder__bi-files\"></i\r\n ></span>\r\n <span\r\n class=\"form-builder__test-form__field-toolbar-icon form-builder__test-form__field-toolbar-icon--move\"\r\n [attr.data-tooltip]=\"'Move' | localized\"\r\n cdkDragHandle>\r\n <i class=\"form-builder__bi form-builder__bi-arrows-move\"></i>\r\n </span>\r\n </div>\r\n\r\n <ng-container *ngSwitchCase=\"formFieldType.Select\">\r\n <select\r\n [id]=\"field.id\"\r\n [formControlName]=\"field.id\"\r\n (mousedown)=\"preventDefault($event)\"\r\n class=\"form-builder__form-select\">\r\n <option value=\"\">{{ field.placeholder }}</option>\r\n <option *ngFor=\"let option of field.options\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </option>\r\n </select>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"formFieldType.Checkbox\">\r\n <input\r\n [id]=\"field.id\"\r\n type=\"checkbox\"\r\n [formControlName]=\"field.id\"\r\n class=\"form-builder__form-check-input\" />\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <input\r\n [id]=\"field.id\"\r\n [type]=\"field.type\"\r\n [formControlName]=\"field.id\"\r\n class=\"form-builder__form-control\"\r\n (mousedown)=\"preventDefault($event)\"\r\n (click)=\"preventDefault($event)\" />\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </form>\r\n <form\r\n [formGroup]=\"dynamicForm\"\r\n cdkDropList\r\n [cdkDropListData]=\"addedFields\"\r\n (cdkDropListDropped)=\"onDrop($event)\">\r\n <h3 class=\"form-builder__test-form__step\">\r\n {{ \"Step\" | localized }} {{ currentStep + 1 }}\r\n </h3>\r\n <ng-container *ngFor=\"let field of addedFields\">\r\n <div\r\n class=\"form-builder__test-form__block\"\r\n [class.form-builder__test-form__block--editing]=\"field.id === editedFieldId\"\r\n cdkDrag>\r\n <div\r\n class=\"form-builder__test-form__label\"\r\n *ngIf=\"\r\n field.type !== formFieldType.Likert &&\r\n field.type !== formFieldType.Csat &&\r\n field.type !== formFieldType.CES &&\r\n field.type !== formFieldType.QE &&\r\n field.type !== formFieldType.NPS\r\n \">\r\n <label class=\"form-builder__form-label\">{{ field.title }}</label>\r\n </div>\r\n <div class=\"form-builder__test-form__field\" [ngSwitch]=\"field.type\">\r\n <div class=\"form-builder__test-form__field-label\">\r\n <span\r\n *ngIf=\"field.feedBackText\"\r\n class=\"form-builder__field-label form-builder__field-label--feedback\"\r\n >{{ \"Feedback\" | localized }}</span\r\n >\r\n <span\r\n *ngIf=\"field.required\"\r\n class=\"form-builder__field-label form-builder__field-label--required\"\r\n >{{ \"Required\" | localized }}</span\r\n >\r\n <span\r\n *ngIf=\"field.active\"\r\n class=\"form-builder__field-label form-builder__field-label--active\"\r\n >{{ \"Active\" | localized }}</span\r\n >\r\n <span\r\n *ngIf=\"field.hasOther\"\r\n class=\"form-builder__field-label form-builder__field-label--other\"\r\n >{{ \"Has Other\" | localized }}</span\r\n >\r\n <span\r\n *ngIf=\"field.hasNA\"\r\n class=\"form-builder__field-label form-builder__field-label--na\"\r\n >{{ \"Has NA\" | localized }}</span\r\n >\r\n <span class=\"form-builder__field-label form-builder__field-label--title\">{{\r\n fieldLabels[field.type] | localized\r\n }}</span>\r\n </div>\r\n <div class=\"form-builder__test-form__field-toolbar\">\r\n <span\r\n class=\"form-builder__test-form__field-toolbar-icon\"\r\n [attr.data-tooltip]=\"'Delete' | localized\"\r\n (click)=\"removeField(field, false)\"\r\n ><i class=\"form-builder__bi form-builder__bi-trash\"></i\r\n ></span>\r\n <span\r\n class=\"form-builder__test-form__field-toolbar-icon\"\r\n [attr.data-tooltip]=\"'Edit' | localized\"\r\n (click)=\"toggleFieldPropertiesSidebar(field, false)\"\r\n ><i class=\"form-builder__bi form-builder__bi-pencil\"></i\r\n ></span>\r\n <span\r\n *ngIf=\"!(field.type | isFieldUnique)\"\r\n class=\"form-builder__test-form__field-toolbar-icon\"\r\n [attr.data-tooltip]=\"'Copy' | localized\"\r\n (click)=\"copyField(field, false)\"\r\n ><i class=\"form-builder__bi form-builder__bi-files\"></i\r\n ></span>\r\n <span\r\n class=\"form-builder__test-form__field-toolbar-icon form-builder__test-form__field-toolbar-icon--move\"\r\n [attr.data-tooltip]=\"'Move' | localized\"\r\n cdkDragHandle>\r\n <i class=\"form-builder__bi form-builder__bi-arrows-move\"></i>\r\n </span>\r\n </div>\r\n <ng-container *ngSwitchCase=\"formFieldType.Textarea\">\r\n <app-textarea [field]=\"field\"></app-textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.Select\">\r\n <app-select [field]=\"field\" [hasOptions]=\"true\"></app-select>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.CountryDropdown\">\r\n <app-select [field]=\"field\" [hasOptions]=\"false\"></app-select>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.CheckboxGroup\">\r\n <app-checkbox-group [field]=\"field\"></app-checkbox-group>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.Checkbox\">\r\n <app-checkbox [field]=\"field\"></app-checkbox>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.Radio\">\r\n <app-radio [field]=\"field\" [formGroup]=\"dynamicForm\"></app-radio>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.NeedContact\">\r\n <app-radio [field]=\"field\" [formGroup]=\"dynamicForm\"></app-radio>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.Likert\">\r\n <app-likert [field]=\"field\" \u0432></app-likert>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.Csat\">\r\n <app-csat [field]=\"field\"></app-csat>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.CES\">\r\n <app-csat [field]=\"field\" [isCes]=\"true\"></app-csat>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.NPS\">\r\n <app-nps [field]=\"field\"></app-nps>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"formFieldType.QE\">\r\n <app-qe [field]=\"field\"></app-qe>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <app-text [field]=\"field\"></app-text>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </form>\r\n <ng-container *ngIf=\"enableConditionalLogicBlocks\">\r\n <ng-container *ngFor=\"let block of conditionalLogicBlocks; let i = index\">\r\n <app-conditional-logic-block\r\n [block]=\"block\"\r\n [addedFields]=\"addedFields\"\r\n (remove)=\"removeConditionalLogicBlock(i)\">\r\n </app-conditional-logic-block>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"form-builder__test-form__footer\">\r\n <div class=\"form-builder__test-form__buttons\">\r\n <button\r\n class=\"form-builder__btn form-builder__btn-primary\"\r\n (click)=\"toggleFieldsInsertingSidebar(false)\">\r\n {{ \"Insert Field\" | localized }}\r\n </button>\r\n <ng-container *ngIf=\"enableGeneralFields\">\r\n <button\r\n class=\"form-builder__btn form-builder__btn-primary\"\r\n (click)=\"toggleFieldsInsertingSidebar(true)\">\r\n {{ \"Insert General Field\" | localized }}\r\n </button>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"enableConditionalLogicBlocks\">\r\n <button\r\n class=\"form-builder__btn form-builder__btn-primary\"\r\n (click)=\"insertConditionalLogicBlock()\">\r\n {{ \"Insert Conditional Logic Block\" | localized }}\r\n </button>\r\n <button\r\n class=\"form-builder__btn form-builder__btn-primary\"\r\n (click)=\"saveCurrentStepData()\"\r\n [disabled]=\"!conditionalLogicBlocks.length\">\r\n {{ \"Save Conditional Logic Blocks Data\" | localized }}\r\n </button>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"form-builder__test-form__buttons\">\r\n <button\r\n *ngIf=\"currentStep > 0\"\r\n class=\"form-builder__btn form-builder__btn-primary\"\r\n (click)=\"goToPreviousStep()\">\r\n {{ \"Previous Step\" | localized }}\r\n </button>\r\n <button class=\"form-builder__btn form-builder__btn-primary\" (click)=\"goToNextStep()\">\r\n {{ \"Next Step\" | localized }}\r\n </button>\r\n <button class=\"form-builder__btn form-builder__btn-success\" (click)=\"saveForm()\">\r\n {{ \"Save\" | localized }}\r\n </button>\r\n </div>\r\n\r\n <ng-container *ngIf=\"formData.formData.steps as steps\">\r\n <ng-container *ngIf=\"steps.length > 0\">\r\n <span>{{ \"Go to\" | localized }}:</span>\r\n </ng-container>\r\n <div class=\"form-builder__test-form__stepButtons\">\r\n <div\r\n class=\"form-builder__test-form__stepButton form-builder__stepButton\"\r\n [ngClass]=\"{ 'form-builder__stepButton--active': i === currentStep }\"\r\n *ngFor=\"let step of steps; let i = index\">\r\n <div class=\"form-builder__stepButton__toolbar\">\r\n <span\r\n class=\"form-builder__stepButton__toolbar-icon\"\r\n [attr.data-tooltip]=\"'Move step' | localized\"\r\n (click)=\"moveStep(i, 'prev')\"\r\n [ngClass]=\"{ 'form-builder__stepButton__toolbar-icon--disabled': i === 0 }\"\r\n ><i class=\"form-builder__bi form-builder__bi-arrow-left\"></i\r\n ></span>\r\n <span\r\n class=\"form-builder__stepButton__toolbar-icon\"\r\n [attr.data-tooltip]=\"'Move step' | localized\"\r\n (click)=\"moveStep(i, 'next')\"\r\n [ngClass]=\"{\r\n 'form-builder__stepButton__toolbar-icon--disabled': i === steps.length - 1\r\n }\"\r\n ><i class=\"form-builder__bi form-builder__bi-arrow-right\"></i\r\n ></span>\r\n <span\r\n class=\"form-builder__stepButton__toolbar-icon\"\r\n [attr.data-tooltip]=\"'Copy step' | localized\"\r\n (click)=\"copyStep(i)\"\r\n ><i class=\"form-builder__bi form-builder__bi-files\"></i\r\n ></span>\r\n <span\r\n class=\"form-builder__stepButton__toolbar-icon\"\r\n [attr.data-tooltip]=\"'Delete step' | localized\"\r\n (click)=\"deleteStepConfirmation(i)\"\r\n [ngClass]=\"{\r\n 'form-builder__stepButton__toolbar-icon--disabled': steps.length === 1\r\n }\"\r\n ><i class=\"form-builder__bi form-builder__bi-trash\"></i\r\n ></span>\r\n </div>\r\n <button class=\"form-builder__btn form-builder__btn-secondary\" (click)=\"goToStep(i)\">\r\n {{ \"Step\" | localized }} {{ i + 1 }}\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"form-builder__test-form__sidebar\"\r\n [ngClass]=\"{ 'form-builder__opened': isSidebarOpen }\">\r\n <app-ui-fields-inserting\r\n *ngIf=\"isFieldsInsertingOpen\"\r\n [isGeneral]=\"isGeneral\"\r\n [enableSetValidationOptions]=\"enableSetValidationOptions\"\r\n [isSurvey]=\"isSurvey\"\r\n [usedFieldTypes]=\"usedFieldTypes\"\r\n [needContactDefaultValue]=\"needContactDefaultValue\"\r\n [hasFeedBackText]=\"hasFeedBackText\"\r\n (propertiesSaved)=\"onPropertiesSave($event)\"\r\n (sidebarClosed)=\"toggleFieldsInsertingSidebar()\">\r\n </app-ui-fields-inserting>\r\n <app-ui-field-properties\r\n *ngIf=\"isFieldPropertiesOpen\"\r\n [field]=\"fieldToEdit\"\r\n [enableSetValidationOptions]=\"enableSetValidationOptions\"\r\n [isSurvey]=\"isSurvey\"\r\n [currentStep]=\"currentStep\"\r\n [stepsLength]=\"formData.formData.steps.length\"\r\n [needContactDefaultValue]=\"needContactDefaultValue\"\r\n [hasFeedBackText]=\"hasFeedBackText\"\r\n (propertiesSaved)=\"onPropertiesSaveAfterEdit($event)\"\r\n (sidebarClosed)=\"toggleFieldPropertiesSidebar()\">\r\n </app-ui-field-properties>\r\n </div>\r\n</div>\r\n",
styles: ["@charset \"UTF-8\";.form-builder__bi::before,[class*=\" form-builder__bi-\"]::before,[class^=form-builder__bi-]::before{display:inline-block;font-family:bootstrap-icons!important;font-style:normal;font-weight:400!important;font-variant:normal;text-transform:none;line-height:1;vertical-align:-.125em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.form-builder__bi-arrow-right::before{content:\"\uF138\"}.form-builder__bi-pencil::before{content:\"\uF4CB\"}.form-builder__bi-trash::before{content:\"\uF5DE\"}.form-builder__bi-files::before{content:\"\uF3C2\"}.form-builder__bi-arrows-move::before{content:\"\uF14E\"}.form-builder__bi-arrow-left::before{content:\"\uF12F\"}.form-builder__btn{display:inline-block;box-sizing:border-box;align-items:flex-start;padding:6px 12px;font-weight:400;text-align:center;-webkit-text-decoration:none #fff solid auto;text-decoration:none #fff solid auto;text-indent:0;text-shadow:none;text-transform:none;vertical-align:middle;word-spacing:normal;letter-spacing:normal;line-height:18px;color:#fff;background-color:rgba(169,157,184,.8);border:.8px solid rgba(169,157,184,.8);border-radius:6px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:auto;text-rendering:auto;-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}.form-builder__btn-sm{padding:3px 10px;font-size:.75rem}.form-builder__btn-primary{background-color:rgba(169,157,184,.8);border-color:rgba(169,157,184,.8)}.form-builder__btn-primary:active,.form-builder__btn-primary:hover{background-color:#a99db8;border-color:#a99db8}.form-builder__btn-secondary{background-color:rgba(148,169,160,.8);border-color:rgba(148,169,160,.8)}.form-builder__btn-secondary:active,.form-builder__btn-secondary:hover{background-color:#94a9a0;border-color:#94a9a0}.form-builder__btn-danger{background-color:rgba(230,88,88,.8);border-color:rgba(230,88,88,.8)}.form-builder__btn-danger:active,.form-builder__btn-danger:hover{background-color:#e65858;border-color:#e65858}.form-builder__btn-success{background-color:rgba(81,167,76,.8);border-color:rgba(81,167,76,.8)}.form-builder__btn-success:active,.form-builder__btn-success:hover{background-color:#51a74c;border-color:#51a74c}.form-builder__test-form{display:flex;align-items:flex-start;justify-content:space-between;overflow:hidden;position:relative;padding-bottom:50px}.form-builder__test-form__header{padding-top:10px;padding-bottom:10px;margin-bottom:40px}.form-builder__test-form__main{flex-shrink:0;width:100%;transition:.3s}.form-builder__test-form__main.collapsed{flex-shrink:1;width:55%}.form-builder__test-form__main.collapsed .form-builder__field-label:not(.form-builder__field-label--title){font-size:0;width:16px;padding:0;height:16px;margin-right:2px}.form-builder__test-form__sidebar{background-color:#f7f7f7;padding:25px;position:fixed;width:45%;top:0;right:0;height:100%;visibility:hidden;transform:translateX(100%);transition:transform .3s;box-shadow:-2px 0 5px rgba(0,0,0,.2);z-index:500;min-height:100%;box-sizing:border-box;overflow-y:auto}@media screen and (max-width:1000px){.form-builder__test-form__main.collapsed,.form-builder__test-form__sidebar{width:100%}}@media screen and (max-width:450px){.form-builder__test-form__sidebar{padding:15px}}.form-builder__test-form__sidebar.form-builder__opened{visibility:visible;transform:translateX(0)}.form-builder__test-form__title{text-align:center;font-size:3rem;margin-bottom:10px;margin-top:10px}.form-builder__test-form__step{text-align:center;text-transform:uppercase;margin-bottom:25px}.form-builder__test-form__body{min-height:200px;padding-left:20px;padding-right:20px}.form-builder__test-form__footer{padding-left:20px;padding-right:20px}.form-builder__test-form__block{background-color:rgba(148,169,160,.15);padding-bottom:40px;padding-top:33px;position:relative;margin-bottom:20px;border:1px solid #e5e7ebba;border-radius:5px}.form-builder__test-form__block:hover{background-color:rgba(148,169,160,.08)}.form-builder__test-form__block:hover .form-builder__test-form__field-toolbar{opacity:1}.form-builder__test-form__block--editing,.form-builder__test-form__block--editing:hover{background-color:rgba(169,157,184,.5)}.form-builder__test-form__field{padding-left:60px;padding-right:60px}@media screen and (max-width:768px){.form-builder__test-form__field{padding-left:20px;padding-right:20px}}.form-builder__test-form__field-label{position:absolute;right:10px;top:5px;display:flex;align-items:flex-start}.form-builder__test-form__field-toolbar{opacity:0;transition:.2s;position:absolute;left:10px;top:7px;display:flex}.form-builder__test-form__field-toolbar-icon{display:block;margin-right:5px;cursor:pointer;position:relative;padding:2px}.form-builder__test-form__field-toolbar-icon:before{content:attr(data-tooltip);position:absolute;left:50%;transform:translate(-50%,-100%);top:0;background:rgba(0,0,0,.8);color:#fff;padding:4px 8px;border-radius:4px;font-size:14px;white-space:nowrap;visibility:hidden;opacity:0;transition:opacity .3s,visibility .3s;z-index:1}.form-builder__test-form__field-toolbar-icon:hover:before{visibility:visible;opacity:1}.form-builder__test-form__field-toolbar-icon:last-child{margin-right:0}.form-builder__test-form__field-toolbar-icon .form-builder__bi:before{font-size:16px}.form-builder__test-form__field-toolbar-icon--move{cursor:move}.form-builder__test-form__label{padding-left:60px;padding-right:60px}@media screen and (max-width:768px){.form-builder__test-form__label{padding-left:20px;padding-right:20px}}.form-builder__test-form__buttons{display:flex;margin-bottom:30px;justify-content:flex-start;flex-wrap:wrap;gap:10px}.form-builder__test-form__buttons .form-builder__btn:last-child{margin-right:0}.form-builder__test-form__stepButtons{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:30px}.form-builder__test-form__stepButton:last-child{margin-right:0}.form-builder__test-form .form-builder__form-check-label{pointer-events:none}.form-builder__test-form .form-builder__form-check{background-color:#fff}.form-builder__test-form .form-builder__form-check input{pointer-events:none}.cdk-drop-list-dragging .cdk-drag{transition:transform 250ms cubic-bezier(0,0,.2,1)}.cdk-drag-animating{transition:transform .1s cubic-bezier(0,0,.2,1)}.cdk-drag-placeholder{opacity:0}.cdk-drag-preview{background-color:#fff;transition:transform 250ms cubic-bezier(0,0,.2,1)}.form-builder__test-form__block.cdk-drag-preview{box-sizing:border-box;background-color:rgba(148,169,160,.7)}.form-builder__stepButton{position:relative}.form-builder__stepButton:hover .form-builder__stepButton__toolbar{opacity:.8;pointer-events:auto}.form-builder__stepButton__toolbar{display:grid;grid-template-columns:repeat(2,.4fr);grid-gap:5px;justify-content:center;position:absolute;left:0;top:100%;opacity:0;transition:.2s;z-index:1;width:100%;margin-right:-5px;pointer-events:none;background-color:#fff}.form-builder__stepButton__toolbar-icon{display:flex;justify-content:center;align-items:center;cursor:pointer;position:relative;padding:2px}.form-builder__stepButton__toolbar-icon:before{content:attr(data-tooltip);position:absolute;left:50%;transform:translate(-50%,0);top:100%;background:rgba(0,0,0,.8);color:#fff;padding:4px 8px;border-radius:4px;font-size:14px;white-space:nowrap;visibility:hidden;opacity:0;transition:opacity .3s,visibility .3s;z-index:1;pointer-events:none}.form-builder__stepButton__toolbar-icon:hover:before{visibility:visible;opacity:1}.form-builder__stepButton__toolbar-icon .form-builder__bi:before{font-size:16px}.form-builder__stepButton__toolbar-icon--disabled{opacity:.5;pointer-events:none}.form-builder__stepButton--active .form-builder__btn-secondary{background-color:#94a9a0;border-color:#94a9a0}.form-builder__qe-scale__container h3{font-size:1.1em}.form-builder__qe-scale__child h3{font-size:1em}.form-builder__field-label{padding:2px 6px;font-size:12px;border-radius:4px;margin-right:6px;color:#fff;white-space:nowrap;display:flex;align-items:center;justify-content:center}@media screen and (max-width:450px){.form-builder__field-label:not(.form-builder__field-label--title){font-size:0;width:16px;padding:0;height:16px;margin-right:2px}}.form-builder__field-label:last-child{margin-right:0}.form-builder__field-label--required{background-color:#d9534f}.form-builder__field-label--active{background-color:#5cb85c}.form-builder__field-label--other{background-color:#0275d8}.form-builder__field-label--na{background-color:#ce9229}.form-builder__field-label--feedback{background-color:#19a99d}.form-builder__field-label--title{background:rgba(0,0,0,.8);padding:4px 8px;font-size:14px}"]
})
], UIComponent);
export { UIComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNraXJlYWwvZm9ybS1idWlsZGVyLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvdWkvdWkuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUU5RixPQUFPLEVBQWUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFNdEUsT0FBTyxFQUVMLGFBQWEsRUFDYiw0QkFBNEIsRUFDNUIsZUFBZSxFQUNmLGdCQUFnQixFQUNqQixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBTzlELElBQWEsV0FBVyxHQUF4QixNQUFhLFdBQVc7SUFtRHRCLFlBQ1UsYUFBNEIsRUFDNUIsZUFBZ0MsRUFDaEMsbUJBQXdDLEVBQ3hDLGFBQTRCO1FBSDVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBdEQ3Qix3QkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDM0IsaUNBQTRCLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFDaEIscUJBQWdCLEdBQW9CO1lBQzNDLFFBQVEsRUFBRTtnQkFDUixLQUFLLEVBQUUsRUFBRTtnQkFDVCxhQUFhLEVBQUUsRUFBRTthQUNsQjtZQUNELE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsRUFBRTtnQkFDUixJQUFJLEVBQUUsRUFBRTtnQkFDUixPQUFPLEVBQUUsRUFBRTthQUNaO1lBQ0QsY0FBYyxFQUFFLEVBQUU7U0FDbkIsQ0FBQztRQUNPLCtCQUEwQixHQUFHLEtBQUssQ0FBQztRQUNuQyxXQUFNLEdBQTJCLEVBQUUsQ0FBQztRQUVuQyxnQkFBVyxHQUFrQyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUUzRixrQkFBYSxHQUFHLGFBQWEsQ0FBQztRQUc5QixhQUFRLEdBQW9CO1lBQzFCLFFBQVEsRUFBRTtnQkFDUixLQUFLLEVBQUUsRUFBRTtnQkFDVCxhQUFhLEVBQUUsRUFBRTthQUNsQjtZQUNELE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsRUFBRTtnQkFDUixJQUFJLEVBQUUsRUFBRTtnQkFDUixPQUFPLEVBQUUsRUFBRTthQUNaO1lBQ0QsY0FBYyxFQUFFLEVBQUU7U0FDbkIsQ0FBQztRQUNGLGdCQUFXLEdBQWdCLEVBQUUsQ0FBQztRQUM5QixrQkFBYSxHQUFnQixFQUFFLENBQUM7UUFDaEMsMkJBQXNCLEdBQTRCLEVBQUUsQ0FBQztRQUNyRCxnQkFBVyxHQUFvQixlQUFlLENBQUM7UUFDL0MsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsbUJBQWMsR0FBb0IsRUFBRSxDQUFDO1FBQ3JDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUM5QiwwQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDOUIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixnQkFBVyxHQUFjLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFFOUMsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsa0JBQWEsR0FBa0IsSUFBSSxDQUFDO0lBT2pDLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMzQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNwQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0M7SUFDSCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hFLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQzNFO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFnQixFQUFFLFNBQWtCO1FBQzlDLElBQUksV0FBd0IsQ0FBQztRQUM3QixJQUFJLFNBQW9CLENBQUM7UUFFekIsSUFBSSxTQUFTLEVBQUU7WUFDYixXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUNqQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUM5QjthQUFNO1lBQ0wsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDL0IsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7U0FDOUI7UUFFRCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2hCLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdCLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ25DO1FBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFxQixDQUFDLEVBQUU7WUFDbkQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQXFCLENBQUMsQ0FBQztZQUMzRSxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzFDO1NBQ0Y7UUFFRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQWdCLEVBQUUsU0FBa0I7UUFDNUMsSUFBSSxXQUF3QixDQUFDO1FBQzdCLElBQUksU0FBb0IsQ0FBQztRQUV6QixJQUFJLFNBQVMsRUFBRTtZQUNiLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ2pDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQzlCO2FBQU07WUFDTCxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUMvQixTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUM5QjtRQUNELE1BQU0sV0FBVyxxQkFBUSxLQUFLLENBQUUsQ0FBQztRQUNqQyxXQUFXLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN2RCxJQUFJLFdBQVcsQ0FBQyxZQUFZLEVBQUU7WUFDNUIsV0FBVyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7U0FDbEM7UUFDRCxNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsV0FBVyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzNELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDMUQsU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCwyQkFBMkI7UUFDekIsTUFBTSxRQUFRLEdBQTBCLDRCQUE0QixDQUFDO1FBQ3JFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELDJCQUEyQixDQUFDLEtBQWE7UUFDdkMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFZO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBRXhCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ25ELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUc7Z0JBQy9DLFdBQVcsRUFBRSxFQUFFO2dCQUNmLHNCQUFzQixFQUFFLEVBQUU7YUFDM0IsQ0FBQztTQUNIO1FBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDakMsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNqQztJQUNILENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRztZQUMvQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDbEMsc0JBQXNCLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztTQUN6RCxDQUFDO1FBQ0YsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELHdCQUF3Qjs7UUFDdEIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyx1QkFBdUIsU0FBRyxnQkFBZ0IsMENBQUUsWUFBWSxDQUFDO1FBRTlELElBQ0UsZ0JBQWdCO1lBQ2hCLGdCQUFnQixDQUFDLFlBQVksS0FBSyxTQUFTO1lBQzNDLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUNoQztZQUNBLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMxRDtRQUVELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFFN0IsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7WUFDL0MsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNwQyxJQUNFLEtBQUssQ0FBQyxJQUFJO29CQUNWLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFxQixDQUFDO29CQUNsRixLQUFLLENBQUMsWUFBWSxFQUNsQjtvQkFDQSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztvQkFDNUIsTUFBTTtpQkFDUDthQUNGO1lBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZTtnQkFBRSxNQUFNO1NBQ2pDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLFNBQWlCO1FBQ2hDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDO1lBQ2pFLElBQUksS0FBSyxFQUFFO2dCQUNULE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFhO1FBQ2hDLE1BQU0sVUFBVSxHQUFHLEtBQUssS0FBSyxHQUFHLENBQUM7UUFFakMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7WUFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDakMsSUFDRSxLQUFLLENBQUMsSUFBSTtvQkFDVjt3QkFDRSxhQUFhLENBQUMsV0FBVzt3QkFDekIsYUFBYSxDQUFDLGNBQWM7d0JBQzVCLGFBQWEsQ0FBQyxZQUFZO3FCQUMzQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBcUIsQ0FBQyxFQUN2QztvQkFDQSxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztpQkF