@shikshalokam/sl-questionnaire
Version:
Library to integrate questionnaire in SL Projects
156 lines • 31.2 kB
JavaScript
import { Component, ContentChild, HostListener, Input, ViewChild } from '@angular/core';
import { UntypedFormArray, UntypedFormControl, Validators, } from '@angular/forms';
import { TemplateModalConfig, } from '@project-sunbird/ng2-semantic-ui';
import * as _ from 'lodash-es';
import * as i0 from "@angular/core";
import * as i1 from "../services/translate.service";
import * as i2 from "@project-sunbird/ng2-semantic-ui";
import * as i3 from "@angular/forms";
import * as i4 from "../services/utils.service";
import * as i5 from "@angular/common";
export class MatrixQuestionsComponent {
onPopState(event) {
this.showBadgeAssingModel = false;
}
constructor(translate, modalService, fb, utils) {
this.translate = translate;
this.modalService = modalService;
this.fb = fb;
this.utils = utils;
this.instanceLastUpdated = [];
}
ngOnInit() {
this.addText = this.translate['frmelmnts'].btn.add;
this.submitText = this.translate['frmelmnts'].btn.submit;
this.cancelText = this.translate['frmelmnts'].btn.cancel;
setTimeout(() => {
this.matrixForm = this.fb.group({}, Validators.required);
this.questionnaireForm.addControl(this.question._id, new UntypedFormArray([], [Validators.required]));
this.initializeMatrix();
});
}
initializeMatrix() {
// let valid = true;
if (this.question.value.length) {
this.question.value.map((v) => {
let obj = {};
let endTime = [];
v.forEach((ques) => {
endTime.push(ques.endTime);
if (!ques.value)
return;
obj[ques._id] = ques.value;
});
this.questionnaireForm.controls[this.question._id].push(new UntypedFormControl(obj, [this.instanceValidation]));
let instanceupdatedAt = endTime.reduce(function (x, y) {
return x > y ? x : y;
});
this.instanceLastUpdated.push(instanceupdatedAt);
// if (_.isEmpty(obj)) {
// valid = false;
// }
});
}
// if (!valid)
// this.questionnaireForm.controls[this.question._id].setErrors({
// err: 'Matrix reposne not valid',
// });
}
instanceValidation(control) {
let value = control.value;
if (_.isEmpty(value)) {
return { err: 'Instance not filled' };
}
return null;
}
addInstances() {
this.question.value = this.question.value ? this.question.value : [];
this.question.value.push(JSON.parse(JSON.stringify(this.question.instanceQuestions)));
this.matrixForm.reset();
this.formAsArray.push(new UntypedFormControl([], [Validators.required]));
}
viewInstance(i) {
this.matrixForm.reset();
if (this.formAsArray.controls[i].value) {
this.matrixForm.patchValue(this.formAsArray.controls[i].value);
}
const config = new TemplateModalConfig(this.modalTemplate);
config.closeResult = 'closed!';
let deepClonedQuestion = _.cloneDeep(this.question.value[i]);
config.context = {
questions: deepClonedQuestion,
heading: `${this.question.instanceIdentifier} ${i + 1}`,
index: i,
};
this.context = config.context;
this.showBadgeAssingModel = true;
}
get formAsArray() {
return this.questionnaireForm.controls[this.question._id];
}
matrixSubmit(index) {
this.showBadgeAssingModel = false;
this.question.value[index] = this.context.questions;
this.formAsArray.at(index).patchValue(this.matrixForm.value);
if (this.matrixForm.invalid) {
this.formAsArray.at(index).setErrors({ err: 'Matrix reposne not valid' });
}
this.instanceLastUpdated[index] = Date.now();
}
async deleteInstanceAlert(index) {
// let metaData = await this.observationUtilService.getAlertMetaData();
// metaData.content.body.data =
// this.resourceService.frmelmnts.lbl.deleteSubmission;
// metaData.content.body.type = 'text';
// metaData.content.title = this.resourceService.frmelmnts.btn.delete;
// metaData.size = 'mini';
// metaData.footer.buttons.push({
// type: 'cancel',
// returnValue: false,
// buttonText: this.resourceService.frmelmnts.btn.no,
// });
// metaData.footer.buttons.push({
// type: 'accept',
// returnValue: true,
// buttonText: this.resourceService.frmelmnts.btn.yes,
// });
// metaData.footer.className = 'double-btn';
// const accepted = await this.observationUtilService.showPopupAlert(metaData);
const alertMeta = {
title: this.translate['frmelmnts'].btn.delete,
size: 'mini',
bodyType: 'text',
data: this.translate['frmelmnts'].lbl.deleteSubmission,
buttonClass: 'double-btn',
acceptText: this.translate['frmelmnts'].btn.yes,
cancelText: this.translate['frmelmnts'].btn.no,
};
const accepted = await this.utils.alert(alertMeta);
if (!accepted) {
return;
}
this.question.value.splice(index, 1);
this.questionnaireForm.controls[this.question._id].removeAt(index);
this.instanceLastUpdated.splice(index, 1);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MatrixQuestionsComponent, deps: [{ token: i1.SlTranslateService }, { token: i2.SuiModalService }, { token: i3.UntypedFormBuilder }, { token: i4.SlUtilsService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MatrixQuestionsComponent, selector: "sl-matrix-questions", inputs: { questionnaireForm: "questionnaireForm", question: "question" }, host: { listeners: { "window:popstate": "onPopState($event)" } }, queries: [{ propertyName: "matrixTemplateRef", first: true, predicate: ["matrixTemplateRef"], descendants: true }], viewQueries: [{ propertyName: "modalTemplate", first: true, predicate: ["modalTemplate"], descendants: true }], ngImport: i0, template: "<div class=\"d-flex flex-jc-flex-end\">\n <button class=\"sb-btn sb-btn-normal sb-btn-primary\" (click)=\"addInstances()\">\n {{ addText }}\n {{ question?.instanceIdentifier }}\n </button>\n</div>\n<div\n class=\"ui card student-card\"\n *ngFor=\"let instance of question?.value; let i = index\"\n>\n <div class=\"content flex-jc-space-between\">\n <div\n (click)=\"viewInstance(i)\"\n style=\"flex: 1\"\n class=\"d-flex flex-dc px-10\"\n [ngClass]=\"{\n 'valid-response':\n formAsArray?.controls[i].valid\n }\"\n >\n <span> {{ question?.instanceIdentifier }} {{ i + 1 }}</span>\n <span class=\"fs-0-785 modified\" *ngIf=\"instanceLastUpdated[i]\">Last Updated On : {{instanceLastUpdated[i] |date:'short'}}</span> \n </div>\n <div>\n <i class=\"trash large icon\" (click)=\"deleteInstanceAlert(i)\"></i>\n </div>\n </div>\n</div>\n\n<sui-modal\n [mustScroll]=\"true\"\n [isClosable]=\"true\"\n [transitionDuration]=\"0\"\n [size]=\"'normal'\"\n class=\"sb-modal\"\n appBodyScroll\n (dismissed)=\"showBadgeAssingModel = false\"\n *ngIf=\"showBadgeAssingModel\"\n #modal\n>\n <!--Header-->\n <div class=\"sb-modal-header\">\n {{ context?.heading }}\n </div>\n <!--/Header-->\n <!--Content-->\n <div class=\"sb-modal-content\">\n <ng-container *ngTemplateOutlet=\"matrixTemplateRef\"></ng-container>\n </div>\n <!--/Content-->\n\n <!--Actions-->\n <div class=\"sb-modal-actions\">\n <button\n [disabled]=\"!matrixForm?.valid\"\n type=\"button\"\n (click)=\"matrixSubmit(context.index)\"\n [ngClass]=\"{\n 'sb-btn sb-btn-normal': true,\n 'sb-btn-primary': matrixForm?.valid,\n 'sb-btn-disabled': !matrixForm?.valid\n }\"\n >\n {{ submitText }}\n </button>\n <button\n class=\"sb-btn sb-btn-normal sb-btn-outline-primary\"\n type=\"button\"\n (click)=\"showBadgeAssingModel = false\"\n >\n {{ cancelText }}\n </button>\n </div>\n <!--/Actions-->\n</sui-modal>\n", styles: [".card{width:100%;border-radius:90px}.content{display:flex;flex-direction:row}.ui.card>.content:after,.ui.cards>.card>.content:after{content:none}.modals.dimmer .ui.scrolling.modal{position:fixed!important}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.SuiModal, selector: "sui-modal", inputs: ["isClosable", "closeResult", "size", "isCentered", "isFullScreen", "isBasic", "mustScroll", "isInverted", "transition", "transitionDuration"], outputs: ["approved", "denied", "dismissed"] }, { kind: "pipe", type: i5.DatePipe, name: "date" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MatrixQuestionsComponent, decorators: [{
type: Component,
args: [{ selector: 'sl-matrix-questions', template: "<div class=\"d-flex flex-jc-flex-end\">\n <button class=\"sb-btn sb-btn-normal sb-btn-primary\" (click)=\"addInstances()\">\n {{ addText }}\n {{ question?.instanceIdentifier }}\n </button>\n</div>\n<div\n class=\"ui card student-card\"\n *ngFor=\"let instance of question?.value; let i = index\"\n>\n <div class=\"content flex-jc-space-between\">\n <div\n (click)=\"viewInstance(i)\"\n style=\"flex: 1\"\n class=\"d-flex flex-dc px-10\"\n [ngClass]=\"{\n 'valid-response':\n formAsArray?.controls[i].valid\n }\"\n >\n <span> {{ question?.instanceIdentifier }} {{ i + 1 }}</span>\n <span class=\"fs-0-785 modified\" *ngIf=\"instanceLastUpdated[i]\">Last Updated On : {{instanceLastUpdated[i] |date:'short'}}</span> \n </div>\n <div>\n <i class=\"trash large icon\" (click)=\"deleteInstanceAlert(i)\"></i>\n </div>\n </div>\n</div>\n\n<sui-modal\n [mustScroll]=\"true\"\n [isClosable]=\"true\"\n [transitionDuration]=\"0\"\n [size]=\"'normal'\"\n class=\"sb-modal\"\n appBodyScroll\n (dismissed)=\"showBadgeAssingModel = false\"\n *ngIf=\"showBadgeAssingModel\"\n #modal\n>\n <!--Header-->\n <div class=\"sb-modal-header\">\n {{ context?.heading }}\n </div>\n <!--/Header-->\n <!--Content-->\n <div class=\"sb-modal-content\">\n <ng-container *ngTemplateOutlet=\"matrixTemplateRef\"></ng-container>\n </div>\n <!--/Content-->\n\n <!--Actions-->\n <div class=\"sb-modal-actions\">\n <button\n [disabled]=\"!matrixForm?.valid\"\n type=\"button\"\n (click)=\"matrixSubmit(context.index)\"\n [ngClass]=\"{\n 'sb-btn sb-btn-normal': true,\n 'sb-btn-primary': matrixForm?.valid,\n 'sb-btn-disabled': !matrixForm?.valid\n }\"\n >\n {{ submitText }}\n </button>\n <button\n class=\"sb-btn sb-btn-normal sb-btn-outline-primary\"\n type=\"button\"\n (click)=\"showBadgeAssingModel = false\"\n >\n {{ cancelText }}\n </button>\n </div>\n <!--/Actions-->\n</sui-modal>\n", styles: [".card{width:100%;border-radius:90px}.content{display:flex;flex-direction:row}.ui.card>.content:after,.ui.cards>.card>.content:after{content:none}.modals.dimmer .ui.scrolling.modal{position:fixed!important}\n"] }]
}], ctorParameters: function () { return [{ type: i1.SlTranslateService }, { type: i2.SuiModalService }, { type: i3.UntypedFormBuilder }, { type: i4.SlUtilsService }]; }, propDecorators: { onPopState: [{
type: HostListener,
args: ['window:popstate', ['$event']]
}], matrixTemplateRef: [{
type: ContentChild,
args: ['matrixTemplateRef', { static: false }]
}], questionnaireForm: [{
type: Input
}], question: [{
type: Input
}], modalTemplate: [{
type: ViewChild,
args: ['modalTemplate']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cml4LXF1ZXN0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbC1xdWVzdGlvbm5haXJlL3NyYy9saWIvbWF0cml4LXF1ZXN0aW9ucy9tYXRyaXgtcXVlc3Rpb25zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NsLXF1ZXN0aW9ubmFpcmUvc3JjL2xpYi9tYXRyaXgtcXVlc3Rpb25zL21hdHJpeC1xdWVzdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBdUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdHLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsa0JBQWtCLEVBRWxCLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFHTCxtQkFBbUIsR0FDcEIsTUFBTSxrQ0FBa0MsQ0FBQztBQUcxQyxPQUFPLEtBQUssQ0FBQyxNQUFNLFdBQVcsQ0FBQzs7Ozs7OztBQWMvQixNQUFNLE9BQU8sd0JBQXdCO0lBRW5DLFVBQVUsQ0FBQyxLQUFLO1FBQ2QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztJQUNwQyxDQUFDO0lBZUQsWUFDVSxTQUE2QixFQUM5QixZQUE2QixFQUM3QixFQUFzQixFQUNyQixLQUFxQjtRQUhyQixjQUFTLEdBQVQsU0FBUyxDQUFvQjtRQUM5QixpQkFBWSxHQUFaLFlBQVksQ0FBaUI7UUFDN0IsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7UUFDckIsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFOL0Isd0JBQW1CLEdBQU8sRUFBRSxDQUFDO0lBTzFCLENBQUM7SUFFSixRQUFRO1FBQ04sSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFD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YTtzQkFEbkIsU0FBUzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgVW50eXBlZEZvcm1BcnJheSxcbiAgVW50eXBlZEZvcm1CdWlsZGVyLFxuICBVbnR5cGVkRm9ybUNvbnRyb2wsXG4gIFVudHlwZWRGb3JtR3JvdXAsXG4gIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIE1vZGFsVGVtcGxhdGUsXG4gIFN1aU1vZGFsU2VydmljZSxcbiAgVGVtcGxhdGVNb2RhbENvbmZpZyxcbn0gZnJvbSAnQHByb2plY3Qtc3VuYmlyZC9uZzItc2VtYW50aWMtdWknO1xuaW1wb3J0IHsgTWF0cml4UXVlc3Rpb24sIFF1ZXN0aW9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9xdWVzdGlvbm5haXJlLnR5cGUnO1xuaW1wb3J0IHsgU2xUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQWxlcnRNZXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9hbGVydC50eXBlJztcbmltcG9ydCB7IFNsVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdXRpbHMuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbnRleHQge1xuICBxdWVzdGlvbnM6IFF1ZXN0aW9uW107XG4gIGhlYWRpbmc6IHN0cmluZztcbiAgaW5kZXg6IG51bWJlcjtcbn1cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NsLW1hdHJpeC1xdWVzdGlvbnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWF0cml4LXF1ZXN0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21hdHJpeC1xdWVzdGlvbnMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTWF0cml4UXVlc3Rpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnBvcHN0YXRlJywgWyckZXZlbnQnXSlcbiAgb25Qb3BTdGF0ZShldmVudCkge1xuICAgIHRoaXMuc2hvd0JhZGdlQXNzaW5nTW9kZWwgPSBmYWxzZTtcbiAgfVxuICBAQ29udGVudENoaWxkKCdtYXRyaXhUZW1wbGF0ZVJlZicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBtYXRyaXhUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PjtcbiAgYWRkVGV4dDogc3RyaW5nO1xuICBzdWJtaXRUZXh0OiBzdHJpbmc7XG4gIGNhbmNlbFRleHQ6IHN0cmluZztcbiAgQElucHV0KCkgcXVlc3Rpb25uYWlyZUZvcm06IFVudHlwZWRGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIHF1ZXN0aW9uOiBNYXRyaXhRdWVzdGlvbjtcbiAgbWF0cml4Rm9ybTogVW50eXBlZEZvcm1Hcm91cDtcbiAgQFZpZXdDaGlsZCgnbW9kYWxUZW1wbGF0ZScpXG4gIHB1YmxpYyBtb2RhbFRlbXBsYXRlOiBNb2RhbFRlbXBsYXRlPElDb250ZXh0LCBzdHJpbmcsIHN0cmluZz47XG4gIGNvbnRleHQ6IElDb250ZXh0O1xuICBzaG93QmFkZ2VBc3NpbmdNb2RlbDogYm9vbGVhbjtcbiAgaW5zdGFuY2VMYXN0VXBkYXRlZDphbnlbXT1bXTtcbiAgbWF0cml4OlRlbXBsYXRlUmVmPGFueT47XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBTbFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHVibGljIG1vZGFsU2VydmljZTogU3VpTW9kYWxTZXJ2aWNlLFxuICAgIHB1YmxpYyBmYjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgdXRpbHM6IFNsVXRpbHNTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZFRleHQgPSB0aGlzLnRyYW5zbGF0ZVsnZnJtZWxtbnRzJ10uYnRuLmFkZDtcbiAgICB0aGlzLnN1Ym1pdFRleHQgPSB0aGlzLnRyYW5zbGF0ZVsnZnJtZWxtbnRzJ10uYnRuLnN1Ym1pdDtcbiAgICB0aGlzLmNhbmNlbFRleHQgPSB0aGlzLnRyYW5zbGF0ZVsnZnJtZWxtbnRzJ10uYnRuLmNhbmNlbDtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubWF0cml4Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30sIFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgdGhpcy5xdWVzdGlvbm5haXJlRm9ybS5hZGRDb250cm9sKFxuICAgICAgICB0aGlzLnF1ZXN0aW9uLl9pZCxcbiAgICAgICAgbmV3IFVudHlwZWRGb3JtQXJyYXkoW10sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSlcbiAgICAgICk7XG4gICAgICB0aGlzLmluaXRpYWxpemVNYXRyaXgoKTtcbiAgICB9KTtcbiAgfVxuICBpbml0aWFsaXplTWF0cml4KCkge1xuICAgIC8vIGxldCB2YWxpZCA9IHRydWU7XG4gICAgaWYgKHRoaXMucXVlc3Rpb24udmFsdWUubGVuZ3RoKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uLnZhbHVlLm1hcCgodikgPT4ge1xuICAgICAgICBsZXQgb2JqID0ge307XG4gICAgICAgIGxldCBlbmRUaW1lID0gW11cbiAgICAgICAgdi5mb3JFYWNoKChxdWVzKSA9PiB7XG4gICAgICAgICAgZW5kVGltZS5wdXNoKHF1ZXMuZW5kVGltZSlcbiAgICAgICAgICBpZiAoIXF1ZXMudmFsdWUpIHJldHVybjtcbiAgICAgICAgICBvYmpbcXVlcy5faWRdID0gcXVlcy52YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgICh0aGlzLnF1ZXN0aW9ubmFpcmVGb3JtLmNvbnRyb2xzW3RoaXMucXVlc3Rpb24uX2lkXSBhcyBVbnR5cGVkRm9ybUFycmF5KS5wdXNoKFxuICAgICAgICAgIG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wob2JqLFt0aGlzLmluc3RhbmNlVmFsaWRhdGlvbl0pXG4gICAgICAgICk7XG4gICAgICAgbGV0IGluc3RhbmNldXBkYXRlZEF0PSBlbmRUaW1lLnJlZHVjZShmdW5jdGlvbiAoeCwgeSkge1xuICAgICAgICAgIHJldHVybiB4ID4geSA/IHggOiB5O1xuICAgICAgIH0pO1xuICAgICAgICB0aGlzLmluc3RhbmNlTGFzdFVwZGF0ZWQucHVzaChpbnN0YW5jZXVwZGF0ZWRBdClcbiAgICAgICAgLy8gaWYgKF8uaXNFbXB0eShvYmopKSB7XG4gICAgICAgIC8vICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgLy8gfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gaWYgKCF2YWxpZClcbiAgICAvLyAgIHRoaXMucXVlc3Rpb25uYWlyZUZvcm0uY29udHJvbHNbdGhpcy5xdWVzdGlvbi5faWRdLnNldEVycm9ycyh7XG4gICAgLy8gICAgIGVycjogJ01hdHJpeCByZXBvc25lIG5vdCB2YWxpZCcsXG4gICAgLy8gICB9KTtcbiAgfVxuXG4gIGluc3RhbmNlVmFsaWRhdGlvbihjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wpIHtcbiAgbGV0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAoXy5pc0VtcHR5KHZhbHVlKSkge1xuICAgIHJldHVybiB7IGVycjogJ0luc3RhbmNlIG5vdCBmaWxsZWQnIH1cbiAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYWRkSW5zdGFuY2VzKCk6IHZvaWQge1xuICAgIHRoaXMucXVlc3Rpb24udmFsdWUgPSB0aGlzLnF1ZXN0aW9uLnZhbHVlID8gdGhpcy5xdWVzdGlvbi52YWx1ZSA6IFtdO1xuICAgIHRoaXMucXVlc3Rpb24udmFsdWUucHVzaChcbiAgICAgIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5xdWVzdGlvbi5pbnN0YW5jZVF1ZXN0aW9ucykpXG4gICAgKTtcbiAgICB0aGlzLm1hdHJpeEZvcm0ucmVzZXQoKTtcbiAgICB0aGlzLmZvcm1Bc0FycmF5LnB1c2gobmV3IFVudHlwZWRGb3JtQ29udHJvbChbXSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSk7XG4gIH1cblxuICB2aWV3SW5zdGFuY2UoaSk6IHZvaWQge1xuICAgIHRoaXMubWF0cml4Rm9ybS5yZXNldCgpO1xuICAgIGlmICh0aGlzLmZvcm1Bc0FycmF5LmNvbnRyb2xzW2ldLnZhbHVlKSB7XG4gICAgICB0aGlzLm1hdHJpeEZvcm0ucGF0Y2hWYWx1ZSh0aGlzLmZvcm1Bc0FycmF5LmNvbnRyb2xzW2ldLnZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnID0gbmV3IFRlbXBsYXRlTW9kYWxDb25maWc8SUNvbnRleHQsIHN0cmluZywgc3RyaW5nPihcbiAgICAgIHRoaXMubW9kYWxUZW1wbGF0ZVxuICAgICk7XG4gICAgY29uZmlnLmNsb3NlUmVzdWx0ID0gJ2Nsb3NlZCEnO1xuICAgIGxldCBkZWVwQ2xvbmVkUXVlc3Rpb24gPSBfLmNsb25lRGVlcCh0aGlzLnF1ZXN0aW9uLnZhbHVlW2ldKTtcbiAgICBjb25maWcuY29udGV4dCA9IHtcbiAgICAgIHF1ZXN0aW9uczogZGVlcENsb25lZFF1ZXN0aW9uLFxuICAgICAgaGVhZGluZzogYCR7dGhpcy5xdWVzdGlvbi5pbnN0YW5jZUlkZW50aWZpZXJ9ICR7aSArIDF9YCxcbiAgICAgIGluZGV4OiBpLFxuICAgIH07XG4gICAgdGhpcy5jb250ZXh0ID0gY29uZmlnLmNvbnRleHQ7XG4gICAgdGhpcy5zaG93QmFkZ2VBc3NpbmdNb2RlbCA9IHRydWU7XG4gIH1cblxuICBnZXQgZm9ybUFzQXJyYXkoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25uYWlyZUZvcm0uY29udHJvbHNbdGhpcy5xdWVzdGlvbi5faWRdIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gIH1cblxuICBtYXRyaXhTdWJtaXQoaW5kZXgpIHtcbiAgICB0aGlzLnNob3dCYWRnZUFzc2luZ01vZGVsID0gZmFsc2U7XG4gICAgdGhpcy5xdWVzdGlvbi52YWx1ZVtpbmRleF0gPSB0aGlzLmNvbnRleHQucXVlc3Rpb25zO1xuICAgIHRoaXMuZm9ybUFzQXJyYXkuYXQoaW5kZXgpLnBhdGNoVmFsdWUodGhpcy5tYXRyaXhGb3JtLnZhbHVlKTtcbiAgICBpZiAodGhpcy5tYXRyaXhGb3JtLmludmFsaWQpIHtcbiAgICAgIHRoaXMuZm9ybUFzQXJyYXkuYXQoaW5kZXgpLnNldEVycm9ycyh7IGVycjogJ01hdHJpeCByZXBvc25lIG5vdCB2YWxpZCcgfSk7XG4gICAgfVxuICAgIHRoaXMuaW5zdGFuY2VMYXN0VXBkYXRlZFtpbmRleF09RGF0ZS5ub3coKVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlSW5zdGFuY2VBbGVydChpbmRleCkge1xuICAgIC8vIGxldCBtZXRhRGF0YSA9IGF3YWl0IHRoaXMub2JzZXJ2YXRpb25VdGlsU2VydmljZS5nZXRBbGVydE1ldGFEYXRhKCk7XG4gICAgLy8gbWV0YURhdGEuY29udGVudC5ib2R5LmRhdGEgPVxuICAgIC8vICAgdGhpcy5yZXNvdXJjZVNlcnZpY2UuZnJtZWxtbnRzLmxibC5kZWxldGVTdWJtaXNzaW9uO1xuICAgIC8vIG1ldGFEYXRhLmNvbnRlbnQuYm9keS50eXBlID0gJ3RleHQnO1xuICAgIC8vIG1ldGFEYXRhLmNvbnRlbnQudGl0bGUgPSB0aGlzLnJlc291cmNlU2VydmljZS5mcm1lbG1udHMuYnRuLmRlbGV0ZTtcbiAgICAvLyBtZXRhRGF0YS5zaXplID0gJ21pbmknO1xuICAgIC8vIG1ldGFEYXRhLmZvb3Rlci5idXR0b25zLnB1c2goe1xuICAgIC8vICAgdHlwZTogJ2NhbmNlbCcsXG4gICAgLy8gICByZXR1cm5WYWx1ZTogZmFsc2UsXG4gICAgLy8gICBidXR0b25UZXh0OiB0aGlzLnJlc291cmNlU2VydmljZS5mcm1lbG1udHMuYnRuLm5vLFxuICAgIC8vIH0pO1xuICAgIC8vIG1ldGFEYXRhLmZvb3Rlci5idXR0b25zLnB1c2goe1xuICAgIC8vICAgdHlwZTogJ2FjY2VwdCcsXG4gICAgLy8gICByZXR1cm5WYWx1ZTogdHJ1ZSxcbiAgICAvLyAgIGJ1dHRvblRleHQ6IHRoaXMucmVzb3VyY2VTZXJ2aWNlLmZybWVsbW50cy5idG4ueWVzLFxuICAgIC8vIH0pO1xuICAgIC8vIG1ldGFEYXRhLmZvb3Rlci5jbGFzc05hbWUgPSAnZG91YmxlLWJ0bic7XG4gICAgLy8gY29uc3QgYWNjZXB0ZWQgPSBhd2FpdCB0aGlzLm9ic2VydmF0aW9uVXRpbFNlcnZpY2Uuc2hvd1BvcHVwQWxlcnQobWV0YURhdGEpO1xuICAgIGNvbnN0IGFsZXJ0TWV0YTogQWxlcnRNZXRhID0ge1xuICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlWydmcm1lbG1udHMnXS5idG4uZGVsZXRlLFxuICAgICAgc2l6ZTogJ21pbmknLFxuICAgICAgYm9keVR5cGU6ICd0ZXh0JyxcbiAgICAgIGRhdGE6IHRoaXMudHJhbnNsYXRlWydmcm1lbG1udHMnXS5sYmwuZGVsZXRlU3VibWlzc2lvbixcbiAgICAgIGJ1dHRvbkNsYXNzOiAnZG91YmxlLWJ0bicsXG4gICAgICBhY2NlcHRUZXh0OiB0aGlzLnRyYW5zbGF0ZVsnZnJtZWxtbnRzJ10uYnRuLnllcyxcbiAgICAgIGNhbmNlbFRleHQ6IHRoaXMudHJhbnNsYXRlWydmcm1lbG1udHMnXS5idG4ubm8sXG4gICAgfTtcbiAgICBjb25zdCBhY2NlcHRlZCA9IGF3YWl0IHRoaXMudXRpbHMuYWxlcnQoYWxlcnRNZXRhKTtcbiAgICBpZiAoIWFjY2VwdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5xdWVzdGlvbi52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICh0aGlzLnF1ZXN0aW9ubmFpcmVGb3JtLmNvbnRyb2xzW3RoaXMucXVlc3Rpb24uX2lkXSBhcyBVbnR5cGVkRm9ybUFycmF5KS5yZW1vdmVBdChcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgICB0aGlzLmluc3RhbmNlTGFzdFVwZGF0ZWQuc3BsaWNlKGluZGV4LDEpXG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1qYy1mbGV4LWVuZFwiPlxuICA8YnV0dG9uIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWwgc2ItYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiYWRkSW5zdGFuY2VzKClcIj5cbiAgICB7eyBhZGRUZXh0IH19XG4gICAge3sgcXVlc3Rpb24/Lmluc3RhbmNlSWRlbnRpZmllciB9fVxuICA8L2J1dHRvbj5cbjwvZGl2PlxuPGRpdlxuICBjbGFzcz1cInVpIGNhcmQgc3R1ZGVudC1jYXJkXCJcbiAgKm5nRm9yPVwibGV0IGluc3RhbmNlIG9mIHF1ZXN0aW9uPy52YWx1ZTsgbGV0IGkgPSBpbmRleFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJjb250ZW50IGZsZXgtamMtc3BhY2UtYmV0d2VlblwiPlxuICAgIDxkaXZcbiAgICAgIChjbGljayk9XCJ2aWV3SW5zdGFuY2UoaSlcIlxuICAgICAgc3R5bGU9XCJmbGV4OiAxXCJcbiAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtZGMgcHgtMTBcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAndmFsaWQtcmVzcG9uc2UnOlxuICAgICAgICAgZm9ybUFzQXJyYXk/LmNvbnRyb2xzW2ldLnZhbGlkXG4gICAgICB9XCJcbiAgICA+XG4gICAgICA8c3Bhbj4ge3sgcXVlc3Rpb24/Lmluc3RhbmNlSWRlbnRpZmllciB9fSB7eyBpICsgMSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZnMtMC03ODUgbW9kaWZpZWRcIiAqbmdJZj1cImluc3RhbmNlTGFzdFVwZGF0ZWRbaV1cIj5MYXN0IFVwZGF0ZWQgT24gOiB7e2luc3RhbmNlTGFzdFVwZGF0ZWRbaV0gfGRhdGU6J3Nob3J0J319PC9zcGFuPiBcbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPGkgY2xhc3M9XCJ0cmFzaCBsYXJnZSBpY29uXCIgKGNsaWNrKT1cImRlbGV0ZUluc3RhbmNlQWxlcnQoaSlcIj48L2k+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxzdWktbW9kYWxcbiAgW211c3RTY3JvbGxdPVwidHJ1ZVwiXG4gIFtpc0Nsb3NhYmxlXT1cInRydWVcIlxuICBbdHJhbnNpdGlvbkR1cmF0aW9uXT1cIjBcIlxuICBbc2l6ZV09XCInbm9ybWFsJ1wiXG4gIGNsYXNzPVwic2ItbW9kYWxcIlxuICBhcHBCb2R5U2Nyb2xsXG4gIChkaXNtaXNzZWQpPVwic2hvd0JhZGdlQXNzaW5nTW9kZWwgPSBmYWxzZVwiXG4gICpuZ0lmPVwic2hvd0JhZGdlQXNzaW5nTW9kZWxcIlxuICAjbW9kYWxcbj5cbiAgPCEtLUhlYWRlci0tPlxuICA8ZGl2IGNsYXNzPVwic2ItbW9kYWwtaGVhZGVyXCI+XG4gICAge3sgY29udGV4dD8uaGVhZGluZyB9fVxuICA8L2Rpdj5cbiAgPCEtLS9IZWFkZXItLT5cbiAgPCEtLUNvbnRlbnQtLT5cbiAgPGRpdiBjbGFzcz1cInNiLW1vZGFsLWNvbnRlbnRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0cml4VGVtcGxhdGVSZWZcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDwhLS0vQ29udGVudC0tPlxuXG4gIDwhLS1BY3Rpb25zLS0+XG4gIDxkaXYgY2xhc3M9XCJzYi1tb2RhbC1hY3Rpb25zXCI+XG4gICAgPGJ1dHRvblxuICAgICAgW2Rpc2FibGVkXT1cIiFtYXRyaXhGb3JtPy52YWxpZFwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJtYXRyaXhTdWJtaXQoY29udGV4dC5pbmRleClcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnc2ItYnRuIHNiLWJ0bi1ub3JtYWwnOiB0cnVlLFxuICAgICAgICAnc2ItYnRuLXByaW1hcnknOiBtYXRyaXhGb3JtPy52YWxpZCxcbiAgICAgICAgJ3NiLWJ0bi1kaXNhYmxlZCc6ICFtYXRyaXhGb3JtPy52YWxpZFxuICAgICAgfVwiXG4gICAgPlxuICAgICAge3sgc3VibWl0VGV4dCB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwic2ItYnRuIHNiLWJ0bi1ub3JtYWwgc2ItYnRuLW91dGxpbmUtcHJpbWFyeVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJzaG93QmFkZ2VBc3NpbmdNb2RlbCA9IGZhbHNlXCJcbiAgICA+XG4gICAgICB7eyBjYW5jZWxUZXh0IH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8IS0tL0FjdGlvbnMtLT5cbjwvc3VpLW1vZGFsPlxuIl19