UNPKG

@shikshalokam/sl-questionnaire

Version:
100 lines 29.9 kB
import { Component, Input } from '@angular/core'; import { ResponseType } from '../interfaces/questionnaire.type'; import * as i0 from "@angular/core"; import * as i1 from "../services/translate.service"; import * as i2 from "../services/sl-questionnaire.service"; import * as i3 from "@angular/common"; import * as i4 from "../text-input/text-input.component"; import * as i5 from "../date-input/date-input.component"; import * as i6 from "../number-input/number-input.component"; import * as i7 from "../range-input/range-input.component"; import * as i8 from "../radio-input/radio-input.component"; import * as i9 from "../checkbox-input/checkbox-input.component"; import * as i10 from "../ques-remarks/ques-remarks.component"; import * as i11 from "../attachment/attachment.component"; import * as i12 from "../matrix-questions/matrix-questions.component"; import * as i13 from "../shared/alert-modal/alert-modal.component"; export class InputComponent { constructor(translate, qService) { this.translate = translate; this.qService = qService; } get reponseType() { return ResponseType; } toggleQuestion(parent) { const { children } = parent; this.questions.map((q, i) => { if (children.includes(q._id)) { let child = this.questions[i]; child['canDisplay'] = this.canDisplayChildQ(child, i); if (child['canDisplay'] == false) { child.value = ''; this.questionnaireForm.removeControl(child._id); } } }); } canDisplayChildQ(currentQuestion, currentQuestionIndex) { let display = true; if (typeof currentQuestion.visibleIf == 'string' || null || undefined) { return false; //if condition not present } for (const question of this.questions) { for (const condition of currentQuestion.visibleIf) { if (condition._id === question._id) { let expression = []; if (condition.operator != '===') { if (question.responseType === 'multiselect') { for (const parentValue of question.value) { for (const value of condition.value) { expression.push('(', "'" + parentValue + "'", '===', "'" + value + "'", ')', condition.operator); } } } else { for (const value of condition.value) { expression.push('(', "'" + question.value + "'", '===', "'" + value + "'", ')', condition.operator); } } expression.pop(); } else { if (question.responseType === 'multiselect') { for (const value of question.value) { expression.push('(', "'" + condition.value + "'", '===', "'" + value + "'", ')', '||'); } expression.pop(); } else { expression.push('(', "'" + question.value + "'", condition.operator, "'" + condition.value + "'", ')'); } } if (!eval(expression.join(''))) { this.questions[currentQuestionIndex].isCompleted = true; return false; } else { // this.questions[currentQuestionIndex].isCompleted = // this.utils.isQuestionComplete(currentQuestion); } } } } return display; } closeHint() { this.isDimmed = false; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: InputComponent, deps: [{ token: i1.SlTranslateService }, { token: i2.SlQuestionnaireService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: InputComponent, selector: "sl-input", inputs: { questions: "questions", questionnaireForm: "questionnaireForm" }, ngImport: i0, template: "<div *ngFor=\"let question of questions; let qi = index\">\n <div *ngIf=\"question?.sectionHeader && (!question.visibleIf.length || question.canDisplay == true)\">\n <h4 class=\"section-header-style\">{{question?.sectionHeader}}</h4>\n </div>\n <div\n [ngClass]=\"{\n 'ui card question-card sb--card relative9':\n question.responseType != 'pageQuestions'\n }\"\n *ngIf=\"!question.visibleIf.length || question.canDisplay == true\"\n >\n <div [ngClass]=\"{ content: question.responseType != 'pageQuestions' }\">\n <div class=\"d-flex flex-ai-flex-start flex-jc-space-between\">\n <div\n *ngFor=\"let q of question.question; let qai = index\"\n [ngClass]=\"{\n 'mb-20': q.length,\n 'valid-response': questionnaireForm?.controls[question._id]?.valid\n }\"\n >\n <div class=\"sb-h5\" *ngIf=\"q!=''\">\n {{ question.questionNumber + \" . \"}}&nbsp;{{ q }}\n </div>\n </div>\n <div *ngIf=\"question?.hint\">\n <i\n class=\"icon large lightbulb\"\n (click)=\"dimmerIndex = qi; isDimmed = !isDimmed\"\n ></i>\n </div>\n </div>\n <div *ngIf=\"question?.tip\" class=\"mb-10\">\n <small class=\"mb-10\">{{ question?.tip }}</small>\n </div>\n <div class=\"sbt-page-content-questionnaireFormarea'\">\n <sl-text-input\n *ngIf=\"question.responseType == reponseType.TEXT\"\n [questionnaireForm]=\"questionnaireForm\"\n [question]=\"question\"\n ></sl-text-input>\n <sl-date-input\n *ngIf=\"question.responseType == reponseType.DATE\"\n [questionnaireForm]=\"questionnaireForm\"\n [question]=\"question\"\n ></sl-date-input>\n <sl-number-input\n *ngIf=\"question.responseType == reponseType.NUMBER\"\n [questionnaireForm]=\"questionnaireForm\"\n [question]=\"question\"\n ></sl-number-input>\n <sl-range-input\n *ngIf=\"question.responseType == reponseType.SLIDER\"\n [questionnaireForm]=\"questionnaireForm\"\n [question]=\"question\"\n ></sl-range-input>\n <sl-radio-input\n *ngIf=\"question.responseType == reponseType.RADIO\"\n [questionnaireForm]=\"questionnaireForm\"\n [question]=\"question\"\n [options]=\"question.options\"\n (dependentParent)=\"toggleQuestion($event)\"\n ></sl-radio-input>\n <sl-checkbox-input\n *ngIf=\"question.responseType == reponseType.MULTISELECT\"\n [questionnaireForm]=\"questionnaireForm\"\n [question]=\"question\"\n [options]=\"question.options\"\n (dependentParent)=\"toggleQuestion($event)\"\n ></sl-checkbox-input>\n <ng-container *ngIf=\"question.responseType == reponseType.PAGEQUESTIONS\">\n <sl-input\n [questionnaireForm]=\"questionnaireForm\"\n [questions]=\"question.pageQuestions\"\n ></sl-input>\n </ng-container>\n <sl-matrix-questions *ngIf=\"question.responseType == reponseType.MATRIX\"\n [questionnaireForm]=\"questionnaireForm\"\n [question]=\"question\"\n #matrixComponent>\n <ng-template #matrixTemplateRef>\n <sl-input\n [questions]=\"matrixComponent.context?.questions\"\n [questionnaireForm]=\"matrixComponent.matrixForm\"\n ></sl-input>\n </ng-template>\n </sl-matrix-questions>\n <sl-ques-remarks\n [question]=\"question\"\n *ngIf=\"question.showRemarks\"\n ></sl-ques-remarks>\n <sl-attachment\n [data]=\"{\n submissionId: qService.getSubmissionId(),\n files: question.fileName\n }\"\n *ngIf=\"question.file\"\n ></sl-attachment>\n <sl-alert-modal *ngIf=\"dimmerIndex == qi && question?.hint\" [isDimmed]=\"isDimmed\" [hint]=\"question?.hint\" (closeHintEmitter)=\"closeHint()\"></sl-alert-modal>\n </div>\n </div>\n </div>\n</div>\n", styles: [".section-header-style{font-size:large;font-weight:700;color:green!important}.help{font-size:30px;z-index:557;margin-right:15px;position:absolute;color:gray}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.TextInputComponent, selector: "sl-text-input", inputs: ["questionnaireForm", "question"] }, { kind: "component", type: i5.DateInputComponent, selector: "sl-date-input", inputs: ["questionnaireForm", "question", "autoCaptureText"] }, { kind: "component", type: i6.NumberInputComponent, selector: "sl-number-input", inputs: ["questionnaireForm", "question"] }, { kind: "component", type: i7.RangeInputComponent, selector: "sl-range-input", inputs: ["questionnaireForm", "question"] }, { kind: "component", type: i8.RadioInputComponent, selector: "sl-radio-input", inputs: ["options", "questionnaireForm", "question"], outputs: ["dependentParent"] }, { kind: "component", type: i9.CheckboxInputComponent, selector: "sl-checkbox-input", inputs: ["options", "questionnaireForm", "question"], outputs: ["dependentParent"] }, { kind: "component", type: i10.QuesRemarksComponent, selector: "sl-ques-remarks", inputs: ["question"], outputs: ["saveClicked"] }, { kind: "component", type: i11.AttachmentComponent, selector: "sl-attachment", inputs: ["data"] }, { kind: "component", type: InputComponent, selector: "sl-input", inputs: ["questions", "questionnaireForm"] }, { kind: "component", type: i12.MatrixQuestionsComponent, selector: "sl-matrix-questions", inputs: ["questionnaireForm", "question"] }, { kind: "component", type: i13.AlertModalComponent, selector: "sl-alert-modal", inputs: ["isDimmed", "hint"], outputs: ["closeHintEmitter"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: InputComponent, decorators: [{ type: Component, args: [{ selector: 'sl-input', template: "<div *ngFor=\"let question of questions; let qi = index\">\n <div *ngIf=\"question?.sectionHeader && (!question.visibleIf.length || question.canDisplay == true)\">\n <h4 class=\"section-header-style\">{{question?.sectionHeader}}</h4>\n </div>\n <div\n [ngClass]=\"{\n 'ui card question-card sb--card relative9':\n question.responseType != 'pageQuestions'\n }\"\n *ngIf=\"!question.visibleIf.length || question.canDisplay == true\"\n >\n <div [ngClass]=\"{ content: question.responseType != 'pageQuestions' }\">\n <div class=\"d-flex flex-ai-flex-start flex-jc-space-between\">\n <div\n *ngFor=\"let q of question.question; let qai = index\"\n [ngClass]=\"{\n 'mb-20': q.length,\n 'valid-response': questionnaireForm?.controls[question._id]?.valid\n }\"\n >\n <div class=\"sb-h5\" *ngIf=\"q!=''\">\n {{ question.questionNumber + \" . \"}}&nbsp;{{ q }}\n </div>\n </div>\n <div *ngIf=\"question?.hint\">\n <i\n class=\"icon large lightbulb\"\n (click)=\"dimmerIndex = qi; isDimmed = !isDimmed\"\n ></i>\n </div>\n </div>\n <div *ngIf=\"question?.tip\" class=\"mb-10\">\n <small class=\"mb-10\">{{ question?.tip }}</small>\n </div>\n <div class=\"sbt-page-content-questionnaireFormarea'\">\n <sl-text-input\n *ngIf=\"question.responseType == reponseType.TEXT\"\n [questionnaireForm]=\"questionnaireForm\"\n [question]=\"question\"\n ></sl-text-input>\n <sl-date-input\n *ngIf=\"question.responseType == reponseType.DATE\"\n [questionnaireForm]=\"questionnaireForm\"\n [question]=\"question\"\n ></sl-date-input>\n <sl-number-input\n *ngIf=\"question.responseType == reponseType.NUMBER\"\n [questionnaireForm]=\"questionnaireForm\"\n [question]=\"question\"\n ></sl-number-input>\n <sl-range-input\n *ngIf=\"question.responseType == reponseType.SLIDER\"\n [questionnaireForm]=\"questionnaireForm\"\n [question]=\"question\"\n ></sl-range-input>\n <sl-radio-input\n *ngIf=\"question.responseType == reponseType.RADIO\"\n [questionnaireForm]=\"questionnaireForm\"\n [question]=\"question\"\n [options]=\"question.options\"\n (dependentParent)=\"toggleQuestion($event)\"\n ></sl-radio-input>\n <sl-checkbox-input\n *ngIf=\"question.responseType == reponseType.MULTISELECT\"\n [questionnaireForm]=\"questionnaireForm\"\n [question]=\"question\"\n [options]=\"question.options\"\n (dependentParent)=\"toggleQuestion($event)\"\n ></sl-checkbox-input>\n <ng-container *ngIf=\"question.responseType == reponseType.PAGEQUESTIONS\">\n <sl-input\n [questionnaireForm]=\"questionnaireForm\"\n [questions]=\"question.pageQuestions\"\n ></sl-input>\n </ng-container>\n <sl-matrix-questions *ngIf=\"question.responseType == reponseType.MATRIX\"\n [questionnaireForm]=\"questionnaireForm\"\n [question]=\"question\"\n #matrixComponent>\n <ng-template #matrixTemplateRef>\n <sl-input\n [questions]=\"matrixComponent.context?.questions\"\n [questionnaireForm]=\"matrixComponent.matrixForm\"\n ></sl-input>\n </ng-template>\n </sl-matrix-questions>\n <sl-ques-remarks\n [question]=\"question\"\n *ngIf=\"question.showRemarks\"\n ></sl-ques-remarks>\n <sl-attachment\n [data]=\"{\n submissionId: qService.getSubmissionId(),\n files: question.fileName\n }\"\n *ngIf=\"question.file\"\n ></sl-attachment>\n <sl-alert-modal *ngIf=\"dimmerIndex == qi && question?.hint\" [isDimmed]=\"isDimmed\" [hint]=\"question?.hint\" (closeHintEmitter)=\"closeHint()\"></sl-alert-modal>\n </div>\n </div>\n </div>\n</div>\n", styles: [".section-header-style{font-size:large;font-weight:700;color:green!important}.help{font-size:30px;z-index:557;margin-right:15px;position:absolute;color:gray}\n"] }] }], ctorParameters: function () { return [{ type: i1.SlTranslateService }, { type: i2.SlQuestionnaireService }]; }, propDecorators: { questions: [{ type: Input }], questionnaireForm: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2wtcXVlc3Rpb25uYWlyZS9zcmMvbGliL2lucHV0L2lucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NsLXF1ZXN0aW9ubmFpcmUvc3JjL2xpYi9pbnB1dC9pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQVksWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQVMxRSxNQUFNLE9BQU8sY0FBYztJQU96QixZQUFvQixTQUE2QixFQUFRLFFBQStCO1FBQXBFLGNBQVMsR0FBVCxTQUFTLENBQW9CO1FBQVEsYUFBUSxHQUFSLFFBQVEsQ0FBdUI7SUFBRyxDQUFDO0lBRTVGLElBQVcsV0FBVztRQUNwQixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQU07UUFDbkIsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUU1QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM1QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSyxFQUFFO29CQUNoQyxLQUFLLENBQUMsS0FB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LEtBQUssQ0FBQztJQUN4QixDQUFDOytHQXRHVSxjQUFjO21HQUFkLGNBQWMsNEhDWDNCLG1rSUFzR0EsK2tERDNGYSxjQUFjOzs0RkFBZCxjQUFjO2tCQUwxQixTQUFTOytCQUNFLFVBQVU7OElBS1gsU0FBUztzQkFBakIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBRdWVzdGlvbiwgUmVzcG9uc2VUeXBlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9xdWVzdGlvbm5haXJlLnR5cGUnO1xuaW1wb3J0IHsgU2xUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2xRdWVzdGlvbm5haXJlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3NsLXF1ZXN0aW9ubmFpcmUuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NsLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW5wdXQuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgSW5wdXRDb21wb25lbnQge1xuICBASW5wdXQoKSBxdWVzdGlvbnM6IEFycmF5PFF1ZXN0aW9uPjtcbiAgQElucHV0KCkgcXVlc3Rpb25uYWlyZUZvcm06IFVudHlwZWRGb3JtR3JvdXA7XG4gIHNlbGVjdGVkSW5kZXg6IG51bWJlcjtcbiAgZGltbWVySW5kZXg7XG4gIGlzRGltbWVkO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhbnNsYXRlOiBTbFRyYW5zbGF0ZVNlcnZpY2UscHVibGljIHFTZXJ2aWNlOlNsUXVlc3Rpb25uYWlyZVNlcnZpY2UpIHt9XG5cbiAgcHVibGljIGdldCByZXBvbnNlVHlwZSgpOiB0eXBlb2YgUmVzcG9uc2VUeXBlIHtcbiAgICByZXR1cm4gUmVzcG9uc2VUeXBlO1xuICB9XG5cbiAgdG9nZ2xlUXVlc3Rpb24ocGFyZW50KSB7XG4gICAgY29uc3QgeyBjaGlsZHJlbiB9ID0gcGFyZW50O1xuXG4gICAgdGhpcy5xdWVzdGlvbnMubWFwKChxLCBpKSA9PiB7XG4gICAgICBpZiAoY2hpbGRyZW4uaW5jbHVkZXMocS5faWQpKSB7XG4gICAgICAgIGxldCBjaGlsZCA9IHRoaXMucXVlc3Rpb25zW2ldO1xuICAgICAgICBjaGlsZFsnY2FuRGlzcGxheSddID0gdGhpcy5jYW5EaXNwbGF5Q2hpbGRRKGNoaWxkLCBpKTtcbiAgICAgICAgaWYgKGNoaWxkWydjYW5EaXNwbGF5J10gPT0gZmFsc2UpIHtcbiAgICAgICAgICBjaGlsZC52YWx1ZSA9ICcnO1xuICAgICAgICAgIHRoaXMucXVlc3Rpb25uYWlyZUZvcm0ucmVtb3ZlQ29udHJvbChjaGlsZC5faWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjYW5EaXNwbGF5Q2hpbGRRKGN1cnJlbnRRdWVzdGlvbjogUXVlc3Rpb24sIGN1cnJlbnRRdWVzdGlvbkluZGV4OiBudW1iZXIpIHtcbiAgICBsZXQgZGlzcGxheSA9IHRydWU7XG4gICAgaWYgKHR5cGVvZiBjdXJyZW50UXVlc3Rpb24udmlzaWJsZUlmID09ICdzdHJpbmcnIHx8IG51bGwgfHwgdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vaWYgY29uZGl0aW9uIG5vdCBwcmVzZW50XG4gICAgfVxuICAgIGZvciAoY29uc3QgcXVlc3Rpb24gb2YgdGhpcy5xdWVzdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGN1cnJlbnRRdWVzdGlvbi52aXNpYmxlSWYpIHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbi5faWQgPT09IHF1ZXN0aW9uLl9pZCkge1xuICAgICAgICAgIGxldCBleHByZXNzaW9uID0gW107XG4gICAgICAgICAgaWYgKGNvbmRpdGlvbi5vcGVyYXRvciAhPSAnPT09Jykge1xuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uLnJlc3BvbnNlVHlwZSA9PT0gJ211bHRpc2VsZWN0Jykge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhcmVudFZhbHVlIG9mIHF1ZXN0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBjb25kaXRpb24udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24ucHVzaChcbiAgICAgICAgICAgICAgICAgICAgJygnLFxuICAgICAgICAgICAgICAgICAgICBcIidcIiArIHBhcmVudFZhbHVlICsgXCInXCIsXG4gICAgICAgICAgICAgICAgICAgICc9PT0nLFxuICAgICAgICAgICAgICAgICAgICBcIidcIiArIHZhbHVlICsgXCInXCIsXG4gICAgICAgICAgICAgICAgICAgICcpJyxcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uLm9wZXJhdG9yXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBjb25kaXRpb24udmFsdWUpIHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uLnB1c2goXG4gICAgICAgICAgICAgICAgICAnKCcsXG4gICAgICAgICAgICAgICAgICBcIidcIiArIHF1ZXN0aW9uLnZhbHVlICsgXCInXCIsXG4gICAgICAgICAgICAgICAgICAnPT09JyxcbiAgICAgICAgICAgICAgICAgIFwiJ1wiICsgdmFsdWUgKyBcIidcIixcbiAgICAgICAgICAgICAgICAgICcpJyxcbiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbi5vcGVyYXRvclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV4cHJlc3Npb24ucG9wKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChxdWVzdGlvbi5yZXNwb25zZVR5cGUgPT09ICdtdWx0aXNlbGVjdCcpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBxdWVzdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb24ucHVzaChcbiAgICAgICAgICAgICAgICAgICcoJyxcbiAgICAgICAgICAgICAgICAgIFwiJ1wiICsgY29uZGl0aW9uLnZhbHVlICsgXCInXCIsXG4gICAgICAgICAgICAgICAgICAnPT09JyxcbiAgICAgICAgICAgICAgICAgIFwiJ1wiICsgdmFsdWUgKyBcIidcIixcbiAgICAgICAgICAgICAgICAgICcpJyxcbiAgICAgICAgICAgICAgICAgICd8fCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGV4cHJlc3Npb24ucG9wKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBleHByZXNzaW9uLnB1c2goXG4gICAgICAgICAgICAgICAgJygnLFxuICAgICAgICAgICAgICAgIFwiJ1wiICsgcXVlc3Rpb24udmFsdWUgKyBcIidcIixcbiAgICAgICAgICAgICAgICBjb25kaXRpb24ub3BlcmF0b3IsXG4gICAgICAgICAgICAgICAgXCInXCIgKyBjb25kaXRpb24udmFsdWUgKyBcIidcIixcbiAgICAgICAgICAgICAgICAnKSdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFldmFsKGV4cHJlc3Npb24uam9pbignJykpKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uc1tjdXJyZW50UXVlc3Rpb25JbmRleF0uaXNDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0aGlzLnF1ZXN0aW9uc1tjdXJyZW50UXVlc3Rpb25JbmRleF0uaXNDb21wbGV0ZWQgPVxuICAgICAgICAgICAgLy8gICB0aGlzLnV0aWxzLmlzUXVlc3Rpb25Db21wbGV0ZShjdXJyZW50UXVlc3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlzcGxheTtcbiAgfVxuXG4gIGNsb3NlSGludCgpe1xuICAgIHRoaXMuaXNEaW1tZWQgPSBmYWxzZTtcbiAgfVxufVxuIiwiPGRpdiAqbmdGb3I9XCJsZXQgcXVlc3Rpb24gb2YgcXVlc3Rpb25zOyBsZXQgcWkgPSBpbmRleFwiPlxuICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24/LnNlY3Rpb25IZWFkZXIgJiYgKCFxdWVzdGlvbi52aXNpYmxlSWYubGVuZ3RoIHx8IHF1ZXN0aW9uLmNhbkRpc3BsYXkgPT0gdHJ1ZSlcIj5cbiAgICA8aDQgY2xhc3M9XCJzZWN0aW9uLWhlYWRlci1zdHlsZVwiPnt7cXVlc3Rpb24/LnNlY3Rpb25IZWFkZXJ9fTwvaDQ+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgJ3VpIGNhcmQgcXVlc3Rpb24tY2FyZCBzYi0tY2FyZCByZWxhdGl2ZTknOlxuICAgICAgICBxdWVzdGlvbi5yZXNwb25zZVR5cGUgIT0gJ3BhZ2VRdWVzdGlvbnMnXG4gICAgfVwiXG4gICAgKm5nSWY9XCIhcXVlc3Rpb24udmlzaWJsZUlmLmxlbmd0aCB8fCBxdWVzdGlvbi5jYW5EaXNwbGF5ID09IHRydWVcIlxuICA+XG4gICAgPGRpdiBbbmdDbGFzc109XCJ7IGNvbnRlbnQ6IHF1ZXN0aW9uLnJlc3BvbnNlVHlwZSAhPSAncGFnZVF1ZXN0aW9ucycgfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWFpLWZsZXgtc3RhcnQgZmxleC1qYy1zcGFjZS1iZXR3ZWVuXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgcSBvZiBxdWVzdGlvbi5xdWVzdGlvbjsgbGV0IHFhaSA9IGluZGV4XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnbWItMjAnOiBxLmxlbmd0aCxcbiAgICAgICAgICAgICd2YWxpZC1yZXNwb25zZSc6IHF1ZXN0aW9ubmFpcmVGb3JtPy5jb250cm9sc1txdWVzdGlvbi5faWRdPy52YWxpZFxuICAgICAgICAgIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNiLWg1XCIgKm5nSWY9XCJxIT0nJ1wiPlxuICAgICAgICAgICAge3sgcXVlc3Rpb24ucXVlc3Rpb25OdW1iZXIgKyBcIiAuICBcIn19Jm5ic3A7e3sgcSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uPy5oaW50XCI+XG4gICAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwiaWNvbiBsYXJnZSBsaWdodGJ1bGJcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImRpbW1lckluZGV4ID0gcWk7IGlzRGltbWVkID0gIWlzRGltbWVkXCJcbiAgICAgICAgICA+PC9pPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cInF1ZXN0aW9uPy50aXBcIiBjbGFzcz1cIm1iLTEwXCI+XG4gICAgICAgIDxzbWFsbCBjbGFzcz1cIm1iLTEwXCI+e3sgcXVlc3Rpb24/LnRpcCB9fTwvc21hbGw+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYnQtcGFnZS1jb250ZW50LXF1ZXN0aW9ubmFpcmVGb3JtYXJlYSdcIj5cbiAgICAgICAgPHNsLXRleHQtaW5wdXRcbiAgICAgICAgICAqbmdJZj1cInF1ZXN0aW9uLnJlc3BvbnNlVHlwZSA9PSByZXBvbnNlVHlwZS5URVhUXCJcbiAgICAgICAgICBbcXVlc3Rpb25uYWlyZUZvcm1dPVwicXVlc3Rpb25uYWlyZUZvcm1cIlxuICAgICAgICAgIFtxdWVzdGlvbl09XCJxdWVzdGlvblwiXG4gICAgICAgID48L3NsLXRleHQtaW5wdXQ+XG4gICAgICAgIDxzbC1kYXRlLWlucHV0XG4gICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbi5yZXNwb25zZVR5cGUgPT0gcmVwb25zZVR5cGUuREFURVwiXG4gICAgICAgICAgW3F1ZXN0aW9ubmFpcmVGb3JtXT1cInF1ZXN0aW9ubmFpcmVGb3JtXCJcbiAgICAgICAgICBbcXVlc3Rpb25dPVwicXVlc3Rpb25cIlxuICAgICAgICA+PC9zbC1kYXRlLWlucHV0PlxuICAgICAgICA8c2wtbnVtYmVyLWlucHV0XG4gICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbi5yZXNwb25zZVR5cGUgPT0gcmVwb25zZVR5cGUuTlVNQkVSXCJcbiAgICAgICAgICBbcXVlc3Rpb25uYWlyZUZvcm1dPVwicXVlc3Rpb25uYWlyZUZvcm1cIlxuICAgICAgICAgIFtxdWVzdGlvbl09XCJxdWVzdGlvblwiXG4gICAgICAgID48L3NsLW51bWJlci1pbnB1dD5cbiAgICAgICAgPHNsLXJhbmdlLWlucHV0XG4gICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbi5yZXNwb25zZVR5cGUgPT0gcmVwb25zZVR5cGUuU0xJREVSXCJcbiAgICAgICAgICBbcXVlc3Rpb25uYWlyZUZvcm1dPVwicXVlc3Rpb25uYWlyZUZvcm1cIlxuICAgICAgICAgIFtxdWVzdGlvbl09XCJxdWVzdGlvblwiXG4gICAgICAgID48L3NsLXJhbmdlLWlucHV0PlxuICAgICAgICA8c2wtcmFkaW8taW5wdXRcbiAgICAgICAgICAqbmdJZj1cInF1ZXN0aW9uLnJlc3BvbnNlVHlwZSA9PSByZXBvbnNlVHlwZS5SQURJT1wiXG4gICAgICAgICAgW3F1ZXN0aW9ubmFpcmVGb3JtXT1cInF1ZXN0aW9ubmFpcmVGb3JtXCJcbiAgICAgICAgICBbcXVlc3Rpb25dPVwicXVlc3Rpb25cIlxuICAgICAgICAgIFtvcHRpb25zXT1cInF1ZXN0aW9uLm9wdGlvbnNcIlxuICAgICAgICAgIChkZXBlbmRlbnRQYXJlbnQpPVwidG9nZ2xlUXVlc3Rpb24oJGV2ZW50KVwiXG4gICAgICAgID48L3NsLXJhZGlvLWlucHV0PlxuICAgICAgICA8c2wtY2hlY2tib3gtaW5wdXRcbiAgICAgICAgICAqbmdJZj1cInF1ZXN0aW9uLnJlc3BvbnNlVHlwZSA9PSByZXBvbnNlVHlwZS5NVUxUSVNFTEVDVFwiXG4gICAgICAgICAgW3F1ZXN0aW9ubmFpcmVGb3JtXT1cInF1ZXN0aW9ubmFpcmVGb3JtXCJcbiAgICAgICAgICBbcXVlc3Rpb25dPVwicXVlc3Rpb25cIlxuICAgICAgICAgIFtvcHRpb25zXT1cInF1ZXN0aW9uLm9wdGlvbnNcIlxuICAgICAgICAgIChkZXBlbmRlbnRQYXJlbnQpPVwidG9nZ2xlUXVlc3Rpb24oJGV2ZW50KVwiXG4gICAgICAgID48L3NsLWNoZWNrYm94LWlucHV0PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlc3Rpb24ucmVzcG9uc2VUeXBlID09IHJlcG9uc2VUeXBlLlBBR0VRVUVTVElPTlNcIj5cbiAgICAgICAgICA8c2wtaW5wdXRcbiAgICAgICAgICBbcXVlc3Rpb25uYWlyZUZvcm1dPVwicXVlc3Rpb25uYWlyZUZvcm1cIlxuICAgICAgICAgIFtxdWVzdGlvbnNdPVwicXVlc3Rpb24ucGFnZVF1ZXN0aW9uc1wiXG4gICAgICAgICAgPjwvc2wtaW5wdXQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxzbC1tYXRyaXgtcXVlc3Rpb25zICpuZ0lmPVwicXVlc3Rpb24ucmVzcG9uc2VUeXBlID09IHJlcG9uc2VUeXBlLk1BVFJJWFwiXG4gICAgICAgICAgW3F1ZXN0aW9ubmFpcmVGb3JtXT1cInF1ZXN0aW9ubmFpcmVGb3JtXCJcbiAgICAgICAgICBbcXVlc3Rpb25dPVwicXVlc3Rpb25cIlxuICAgICAgICAgICNtYXRyaXhDb21wb25lbnQ+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI21hdHJpeFRlbXBsYXRlUmVmPlxuICAgICAgICAgICAgICA8c2wtaW5wdXRcbiAgICAgICAgICAgICAgW3F1ZXN0aW9uc109XCJtYXRyaXhDb21wb25lbnQuY29udGV4dD8ucXVlc3Rpb25zXCJcbiAgICAgICAgICAgICAgW3F1ZXN0aW9ubmFpcmVGb3JtXT1cIm1hdHJpeENvbXBvbmVudC5tYXRyaXhGb3JtXCJcbiAgICAgICAgICAgICAgPjwvc2wtaW5wdXQ+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvc2wtbWF0cml4LXF1ZXN0aW9ucz5cbiAgICAgICAgPHNsLXF1ZXMtcmVtYXJrc1xuICAgICAgICAgIFtxdWVzdGlvbl09XCJxdWVzdGlvblwiXG4gICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbi5zaG93UmVtYXJrc1wiXG4gICAgICAgID48L3NsLXF1ZXMtcmVtYXJrcz5cbiAgICAgICAgPHNsLWF0dGFjaG1lbnRcbiAgICAgICAgICBbZGF0YV09XCJ7XG4gICAgICAgICAgICBzdWJtaXNzaW9uSWQ6IHFTZXJ2aWNlLmdldFN1Ym1pc3Npb25JZCgpLFxuICAgICAgICAgICAgZmlsZXM6IHF1ZXN0aW9uLmZpbGVOYW1lXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgKm5nSWY9XCJxdWVzdGlvbi5maWxlXCJcbiAgICAgICAgPjwvc2wtYXR0YWNobWVudD5cbiAgICAgICAgPHNsLWFsZXJ0LW1vZGFsICpuZ0lmPVwiZGltbWVySW5kZXggPT0gcWkgJiYgcXVlc3Rpb24/LmhpbnRcIiBbaXNEaW1tZWRdPVwiaXNEaW1tZWRcIiBbaGludF09XCJxdWVzdGlvbj8uaGludFwiIChjbG9zZUhpbnRFbWl0dGVyKT1cImNsb3NlSGludCgpXCI+PC9zbC1hbGVydC1tb2RhbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19