UNPKG

acr-assist-simulator-module

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.

300 lines 56.5 kB
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes} checked by tsc
 */
import { Component, Input, EventEmitter, Output } from '@angular/core';
import { ChoiceDataElement } from '../../../core/elements/models/choice-data-element-model';
import { ChoiceElement } from '../assist-data-element.component';
import { SelectedCondition } from '../../../core/models/executed-result.model';
var /** @type {?} */ $ = require('jquery');
import { FormBuilder, Validators } from '@angular/forms';
import { SimulatorEngineService } from '../../../core/services/simulator-engine.service';
var AssistChoiceElementComponent = /** @class */ (function () {
    function AssistChoiceElementComponent(formBuilder, simulatorEngineService) {
        this.formBuilder = formBuilder;
        this.simulatorEngineService = simulatorEngineService;
        this.returnChoiceElement = new EventEmitter();
        this.choiceChange = new EventEmitter();
    }
    /**
     * @return {?}
     */
    AssistChoiceElementComponent.prototype.ngOnInit = /**
     * @return {?}
     */
    function () {
        this.createChoiceElementForm();
    };
    /**
     * @return {?}
     */
    AssistChoiceElementComponent.prototype.ngAfterViewInit = /**
     * @return {?}
     */
    function () {
        $('#div_' + this.choiceDataElement.id + '_other').hide();
        if (this.choiceDataElement.currentValue !== undefined) {
            $('#' + this.choiceDataElement.currentValue + '_' + this.choiceDataElement.id).prop('checked', true);
            this.choiceValue = this.choiceDataElement.currentValue;
            // tslint:disable-next-line:forin
            for (var /** @type {?} */ choice in this.choiceDataElement.choiceInfo) {
                // if (this.choiceDataElement.choiceInfo[choice].value === 'hypoEnhancing'){
                //     console.log('asdasd');
                // }
                if (this.choiceDataElement.choiceInfo[choice].value === this.choiceDataElement.currentValue) {
                    if (this.choiceDataElement.choiceInfo[choice].reportText !== undefined) {
                        this.selectedChoiceReportText = this.choiceDataElement.choiceInfo[choice].reportText;
                    }
                    else {
                        this.selectedChoiceReportLabel = this.choiceDataElement.choiceInfo[choice].label;
                    }
                }
            }
            if (this.choiceDataElement.choiceInfo.length <= 5) {
                this.updateChoiceValue(this.choiceDataElement.id, this.choiceDataElement.label, (this.selectedChoiceReportText !== undefined) ? this.selectedChoiceReportText : this.selectedChoiceReportLabel, this.choiceDataElement.currentValue);
            }
            else {
                this.updateDropdownChoiceSelected(this.choiceDataElement.id, this.selectedChoiceReportLabel, this.choiceDataElement.currentValue, this.choiceDataElement.label);
            }
        }
        else {
            this.returnChoiceElement.emit(undefined);
        }
    };
    /**
     * @param {?} elementId
     * @param {?} selectedElement
     * @param {?} selectedText
     * @param {?} selectedValue
     * @return {?}
     */
    AssistChoiceElementComponent.prototype.updateChoiceValue = /**
     * @param {?} elementId
     * @param {?} selectedElement
     * @param {?} selectedText
     * @param {?} selectedValue
     * @return {?}
     */
    function (elementId, selectedElement, selectedText, selectedValue) {
        if (selectedValue !== undefined) {
            var /** @type {?} */ choiceElement = new ChoiceElement();
            choiceElement.elementId = elementId;
            choiceElement.selectedValue = selectedValue;
            choiceElement.selectedText = selectedText;
            this.showOrHideFreeText(elementId, choiceElement.selectedValue);
            this.selectedCondition = new SelectedCondition();
            this.selectedCondition.selectedConditionId = elementId;
            this.selectedCondition.selectedCondition = selectedElement;
            this.selectedCondition.selectedValue = selectedText;
            this.returnChoiceElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
        }
    };
    /**
     * @param {?} elementId
     * @param {?} elementLabel
     * @param {?} elementValue
     * @param {?} selectedCondition
     * @return {?}
     */
    AssistChoiceElementComponent.prototype.updateDropdownChoiceSelected = /**
     * @param {?} elementId
     * @param {?} elementLabel
     * @param {?} elementValue
     * @param {?} selectedCondition
     * @return {?}
     */
    function (elementId, elementLabel, elementValue, selectedCondition) {
        var /** @type {?} */ choiceElement = new ChoiceElement();
        choiceElement.elementId = elementId;
        choiceElement.selectedValue = elementValue;
        choiceElement.selectedText = elementLabel;
        if (this.choiceValue === 'undefined' || this.choiceValue === '--Select--' || this.choiceValue === undefined || this.choiceValue === '') {
            choiceElement.selectedText = '';
            choiceElement.selectedValue = '';
        }
        this.selectedCondition = new SelectedCondition();
        this.selectedCondition.selectedConditionId = elementId;
        this.selectedCondition.selectedCondition = selectedCondition;
        this.selectedCondition.selectedValue = elementLabel;
        this.returnChoiceElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
    };
    /**
     * @param {?} elementId
     * @param {?} selectedElement
     * @param {?} selectedText
     * @param {?} selectedValue
     * @return {?}
     */
    AssistChoiceElementComponent.prototype.choiceSelected = /**
     * @param {?} elementId
     * @param {?} selectedElement
     * @param {?} selectedText
     * @param {?} selectedValue
     * @return {?}
     */
    function (elementId, selectedElement, selectedText, selectedValue) {
        var /** @type {?} */ choiceElement = new ChoiceElement();
        choiceElement.elementId = elementId;
        choiceElement.selectedValue = selectedValue;
        choiceElement.selectedText = selectedText;
        this.showOrHideFreeText(elementId, choiceElement.selectedValue);
        this.selectedCondition = new SelectedCondition();
        this.selectedCondition.selectedConditionId = elementId;
        this.selectedCondition.selectedCondition = selectedElement;
        this.selectedCondition.selectedValue = selectedText;
        this.returnChoiceElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
    };
    /**
     * @param {?} element
     * @param {?} selectedCondition
     * @return {?}
     */
    AssistChoiceElementComponent.prototype.dropdownChoiceSelected = /**
     * @param {?} element
     * @param {?} selectedCondition
     * @return {?}
     */
    function (element, selectedCondition) {
        var /** @type {?} */ choiceElement = new ChoiceElement();
        choiceElement.elementId = element.id;
        choiceElement.selectedValue = (element.options[element.selectedIndex].text === 'Other, please specify…') ? 'freetext' : element.value;
        choiceElement.selectedText = element.options[element.selectedIndex].text;
        this.showOrHideFreeText(element.id, choiceElement.selectedValue);
        if (this.choiceValue === 'undefined' || this.choiceValue === '--Select--' || this.choiceValue === undefined || this.choiceValue === '') {
            choiceElement.selectedText = '';
            choiceElement.selectedValue = '';
        }
        this.selectedCondition = new SelectedCondition();
        this.selectedCondition.selectedConditionId = element.id;
        this.selectedCondition.selectedCondition = selectedCondition;
        this.selectedCondition.selectedValue = element.options[element.selectedIndex].text;
        // Code should comes here //
        this.returnChoiceElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
    };
    /**
     * @return {?}
     */
    AssistChoiceElementComponent.prototype.createChoiceElementForm = /**
     * @return {?}
     */
    function () {
        this.choiceElementForm = this.formBuilder.group({
            checkBox: ['', Validators.required],
        }, {
            validator: this.specificValueInsideRange('checkBox')
        });
    };
    /**
     * @param {?} elementId
     * @param {?} selectedValue
     * @return {?}
     */
    AssistChoiceElementComponent.prototype.showOrHideFreeText = /**
     * @param {?} elementId
     * @param {?} selectedValue
     * @return {?}
     */
    function (elementId, selectedValue) {
        if (selectedValue === 'freetext') {
            $('#div_' + elementId + '_other').show();
        }
        else {
            $('#div_' + elementId + '_other').hide();
            $('#txt_other_' + elementId).val('');
        }
    };
    /**
     * @param {?} element
     * @param {?} elementId
     * @param {?} selectedCondition
     * @return {?}
     */
    AssistChoiceElementComponent.prototype.updateFreeText = /**
     * @param {?} element
     * @param {?} elementId
     * @param {?} selectedCondition
     * @return {?}
     */
    function (element, elementId, selectedCondition) {
        var /** @type {?} */ choiceElement = new ChoiceElement();
        choiceElement.elementId = elementId;
        choiceElement.selectedValue = (element.value === 'Other') ? 'freetext' : element.value;
        choiceElement.selectedText = element.value;
        this.selectedCondition = new SelectedCondition();
        this.selectedCondition.selectedConditionId = elementId;
        this.selectedCondition.selectedCondition = selectedCondition;
        this.selectedCondition.selectedValue = element.value;
        this.returnChoiceElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
    };
    /**
     * @param {?} checkBoxKey
     * @return {?}
     */
    AssistChoiceElementComponent.prototype.specificValueInsideRange = /**
     * @param {?} checkBoxKey
     * @return {?}
     */
    function (checkBoxKey) {
        var _this = this;
        return function (group) {
            var /** @type {?} */ choiceControl = group.controls[checkBoxKey];
            if ((choiceControl.value === undefined || choiceControl.value === '' || choiceControl.value === '--Select--' || _this.choiceValue === '')) {
                return choiceControl.setErrors({ notEquivalent: true });
            }
            else {
                return choiceControl.setErrors(null);
            }
        };
    };
    AssistChoiceElementComponent.decorators = [
        { type: Component, args: [{
                    selector: 'acr-assist-choice-element',
                    template: "<form [formGroup]=\"choiceElementForm\" novalidate>\n  <div class=\"form-group\">\n    <div class=\"col-sm-5 text-right\">\n      <label class=\"control-label break-word\">\n        {{choiceDataElement.label}} <span *ngIf=\"choiceDataElement.unit != undefined && choiceDataElement.unit != ''\"> ({{choiceDataElement.unit}})</span>\n      </label>\n      <ng-container *ngIf=\"choiceDataElement.hint !== '' && choiceDataElement.hint !== undefined\">\n        <i class=\"whitespace\">\n          <span class=\"fa fa-info-circle text-primary\" data-toggle=\"tooltip\" data-placement=\"right\" title=\"{{choiceDataElement.hint}}\"></span>\n        </i>\n      </ng-container>\n      <ng-container *ngIf=\"choiceDataElement.diagrams != undefined \">\n        <acr-hint-diagram [dataElement]=\"choiceDataElement\" [imagePath]=\"imagePath\"></acr-hint-diagram>\n      </ng-container>\n      <span *ngIf=\"choiceElementForm.controls['checkBox'].invalid  && this.choiceDataElement.isRequired\" class=\"required-field whitespace\"\n        title=\"Required Field\">*</span>\n    </div>\n    \n    <div class=\"col-sm-7 text-left content-padding\">\n      <ng-container *ngIf=\"choiceDataElement.choiceInfo.length <= 2\">\n        <ng-container *ngIf=\"imagePath != undefined\">\n          <ng-container *ngIf=\"choiceDataElement.imageMap == undefined\">\n            <ng-container *ngFor=\"let choice of choiceDataElement.choiceInfo\">\n              <div class=\"radio custom-radio-style\">\n                <label>                \n                  <input [attr.disabled]=\"choiceDataElement.isEditable == false ? 'disabled' : null\" [(ngModel)]=\"choiceValue\" id=\"{{choice.value}}_{{choiceDataElement.id}}\" type=\"radio\" formControlName=\"checkBox\" value=\"{{choice.value}}\"\n                    (change)=\"choiceSelected(choiceDataElement.id, choiceDataElement.label, (choice.reportText !== undefined) ? choice.reportText : choice.label, choice.value)\"> {{choice.label}}\n                </label>\n              </div>\n            </ng-container>\n            <ng-container *ngIf=\"choiceDataElement.allowFreetext\">\n              <div class=\"radio custom-radio-style\">\n                <label>\n                  <input [attr.disabled]=\"choiceDataElement.isEditable == false ? 'disabled' : null\" id=\"other_{{choiceDataElement.id}}\" type=\"radio\" formControlName=\"checkBox\" value=\"freetext\" (change)=\"choiceSelected(choiceDataElement.id, choiceDataElement.label, 'Other', 'freetext')\"> Other, please specify\u2026</label>\n              </div>\n              <div id='div_{{choiceDataElement.id}}_other'>\n                <input [attr.disabled]=\"choiceDataElement.isEditable == false ? 'disabled' : null\" id=\"txt_other_{{choiceDataElement.id}}\" class=\"form-control\" type=\"text\" formControlName=\"checkBox\" value=\"other\"\n                  class=\"form-control\" (keyup)='updateFreeText($event.target, choiceDataElement.id, choiceDataElement.label)'\n                  placeholder=\"Please specify '{{choiceDataElement.label}}'\">\n              </div>\n            </ng-container>\n          </ng-container>\n          <ng-container *ngIf=\"choiceDataElement.imageMap != undefined\">\n            <div class=\"row\">\n              <div class=\"col-xs-6 col-sm-2\">\n                <ng-container *ngFor=\"let choice of choiceDataElement.choiceInfo\">\n                  <div class=\"radio custom-radio-style\">\n                    <label>\n                      <input [attr.disabled]=\"choiceDataElement.isEditable == false ? 'disabled' : null\" [(ngModel)]=\"choiceValue\" id=\"{{choice.value}}_{{choiceDataElement.id}}\" type=\"radio\" formControlName=\"checkBox\" value=\"{{choice.value}}\"\n                        (change)=\"choiceSelected(choiceDataElement.id, choiceDataElement.label, (choice.reportText !== undefined) ? choice.reportText : choice.label, choice.value)\"> {{choice.label}}\n                    </label>\n                  </div>\n                </ng-container>\n                <ng-container *ngIf=\"choiceDataElement.allowFreetext\">\n                  <div class=\"radio custom-radio-style\">\n                    <label>\n                      <input [attr.disabled]=\"choiceDataElement.isEditable == false ? 'disabled' : null\" id=\"other_{{choiceDataElement.id}}\" type=\"radio\" formControlName=\"checkBox\" value=\"other\" (change)=\"choiceSelected(choiceDataElement.id, choiceDataElement.label, 'Other', 'freetext')\"> Other, please specify\u2026</label>\n                  </div>\n                  <div id='div_{{choiceDataElement.id}}_other'>\n                    <input  [attr.disabled]=\"choiceDataElement.isEditable == false ? 'disabled' : null\" id=\"txt_other_{{choiceDataElement.id}}\" class=\"form-control\" type=\"text\" formControlName=\"checkBox\" value=\"other\"\n                      class=\"form-control\" (keyup)='updateFreeText($event.target, choiceDataElement.id, choiceDataElement.label)'\n                      placeholder=\"Please specify '{{choiceDataElement.label}}'\">\n                  </div>\n                </ng-container>\n              </div>\n              <div class=\"col-xs-6 col-sm-2\">\n                <label class=\"control-label\">OR</label>\n              </div>\n              <acr-image-map [DataElement]=\"choiceDataElement\" [imagePath]=\"imagePath\"></acr-image-map>\n            </div>\n          </ng-container>\n        </ng-container>\n      </ng-container>\n    \n      <ng-container *ngIf=\"choiceDataElement.choiceInfo.length > 2\">            \n        <select [attr.disabled]=\"choiceDataElement.isEditable == false ? 'disabled' : null\"\n         [(ngModel)]=\"choiceValue\" id=\"{{choiceDataElement.id}}\" (change)=\"dropdownChoiceSelected($event.target, choiceDataElement.label)\"\n          formControlName=\"checkBox\" class=\"form-control\">\n          <!-- <option \n          [selected]=\"choiceDataElement.currentValue == choiceDataElement.ChoiceNotRelevant ? true : false\">--Select--</option>\n         -->\n           <option [selected]=\"\n          choiceDataElement.ChoiceNotRelevant != undefined ?\n          (choiceDataElement.ChoiceNotRelevant.indexOf(choiceDataElement.currentValue) > -1 ? \n          true :\n          true)\n          : true\">--Select--</option>\n\n          <!-- [selected]=\"choice.value === choiceDataElement.currentValue\" -->\n\n        \n          <option *ngFor=\"let choice of choiceDataElement.choiceInfo\"\n          [hidden]=\"choiceDataElement.ChoiceNotRelevant != undefined ? \n              choiceDataElement.ChoiceNotRelevant.indexOf(choice.value) > -1 ? true: null\n              : null\"\n          [value]=\"choice.value\"   \n          [selected]=\"choiceDataElement.ChoiceNotRelevant != undefined ?\n           choiceDataElement.ChoiceNotRelevant.indexOf(choiceDataElement.currentValue) > -1\n           || choiceDataElement.ChoiceNotRelevant.indexOf(choice.value) > -1? false : \n           choice.value === choiceDataElement.currentValue ? true : false\n           : choice.value === choiceDataElement.currentValue ? true : false\"       \n          >{{choice.label}}</option>\n          <option *ngIf=\"choiceDataElement.allowFreetext\" [value]=\"'freetext'\" [selected]=\"'freetext'\">Other, please specify\u2026</option>\n        </select>\n        <div id='div_{{choiceDataElement.id}}_other'>\n\n          <input id=\"txt_other_{{choiceDataElement.id}}\" class=\"form-control\" type=\"text\" formControlName=\"checkBox\" value=\"other\"\n            placeholder=\"Please specify '{{choiceDataElement.label}}'\" (keyup)='updateFreeText($event.target, choiceDataElement.id, choiceDataElement.label)'>\n        </div>\n        <ng-container *ngIf=\"choiceDataElement.imageMap != undefined  && imagePath != undefined\">\n          <div class=\"row padding-top-10\">\n            <div class=\"col-xs-6 col-sm-2\">\n              <label class=\"control-label\">OR</label>\n            </div>\n            <acr-image-map [DataElement]=\"choiceDataElement\" [imagePath]=\"imagePath\"></acr-image-map>\n          </div>\n        </ng-container>\n      </ng-container>\n    </div>\n  </div>\n</form>\n\n",
                    styles: ["", ".required-field{color:red}.padding-l-5{padding-left:5px}.whitespace{margin-left:5px}.max-w-h-100{max-width:100%;max-height:100%}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.carousel-control.left{background-repeat:repeat-x}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control.right{background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x}.scroll{overflow-y:scroll;overflow-x:hidden}.div-simulator-form-height{height:calc(100vh - 100px);overflow-y:scroll;overflow-x:hidden}.div-report-text-scroll{overflow-x:hidden;overflow-y:auto;max-height:calc(100vh - 300px)}.padding-r-10{padding-right:10px}.slide-left{left:30px}.slide-right{right:30px}hr{margin-top:10px;margin-bottom:10px}.white-space-line{white-space:pre-line;word-wrap:break-word}p{margin:0 0 10px}.form-control{border-radius:0;box-shadow:none;border-color:#d2d6de}h4.modal-title.float-left{float:left}.margin-b-0{margin-bottom:0}.font-weight-400{font-weight:400}.custom-radio-style{float:left;margin-right:15px}.zoom{width:100%;overflow:auto}.zoom img{height:auto;width:100%;min-width:100%;max-width:inherit!important}.btn-zoom{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-zoom.hover,.btn-zoom:active,.btn-zoom:hover{background-color:#e7e7e7}@media (min-width:768px){label.control-label{padding-left:20px}}.padding-5{padding:5px}"]
                },] },
    ];
    /** @nocollapse */
    AssistChoiceElementComponent.ctorParameters = function () { return [
        { type: FormBuilder },
        { type: SimulatorEngineService }
    ]; };
    AssistChoiceElementComponent.propDecorators = {
        choiceDataElement: [{ type: Input }],
        imagePath: [{ type: Input }],
        returnChoiceElement: [{ type: Output }],
        choiceChange: [{ type: Output }],
        disabled: [{ type: Input }]
    };
    return AssistChoiceElementComponent;
}());
export { AssistChoiceElementComponent };
function AssistChoiceElementComponent_tsickle_Closure_declarations() {
    /** @type {?} */
    AssistChoiceElementComponent.prototype.choiceDataElement;
    /** @type {?} */
    AssistChoiceElementComponent.prototype.imagePath;
    /** @type {?} */
    AssistChoiceElementComponent.prototype.returnChoiceElement;
    /** @type {?} */
    AssistChoiceElementComponent.prototype.choiceChange;
    /** @type {?} */
    AssistChoiceElementComponent.prototype.choiceValue;
    /** @type {?} */
    AssistChoiceElementComponent.prototype.choiceElementForm;
    /** @type {?} */
    AssistChoiceElementComponent.prototype.selectedCondition;
    /** @type {?} */
    AssistChoiceElementComponent.prototype.selectedIndex;
    /** @type {?} */
    AssistChoiceElementComponent.prototype.selectedChoiceReportText;
    /** @type {?} */
    AssistChoiceElementComponent.prototype.selectedChoiceReportLabel;
    /** @type {?} */
    AssistChoiceElementComponent.prototype.disabled;
    /** @type {?} */
    AssistChoiceElementComponent.prototype.formBuilder;
    /** @type {?} */
    AssistChoiceElementComponent.prototype.simulatorEngineService;
}

//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaXN0LWNob2ljZS1lbGVtZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS8iLCJzb3VyY2VzIjpbInNyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtZGF0YS1lbGVtZW50L2Fzc2lzdC1jaG9pY2UtZWxlbWVudC9hc3Npc3QtY2hvaWNlLWVsZW1lbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDL0UscUJBQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM1QixPQUFPLEVBQWEsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDOztJQThJdkYsc0NBQW9CLFdBQXdCLEVBQVUsc0JBQThDO1FBQWhGLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVUsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjttQ0FYcEUsSUFBSSxZQUFZLEVBQUU7NEJBQ3pCLElBQUksWUFBWSxFQUFFO0tBVThEOzs7O0lBQ3pHLCtDQUFROzs7SUFBUjtRQUNFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0tBQ2hDOzs7O0lBRUQsc0RBQWU7OztJQUFmO1FBQ0UsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxD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Q29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENob2ljZURhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLWRhdGEtZWxlbWVudC1tb2RlbCc7XHJcbmltcG9ydCB7IENob2ljZUVsZW1lbnQgfSBmcm9tICcuLi9hc3Npc3QtZGF0YS1lbGVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNlbGVjdGVkQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvZXhlY3V0ZWQtcmVzdWx0Lm1vZGVsJztcclxuY29uc3QgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9zaW11bGF0b3ItZW5naW5lLnNlcnZpY2UnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci1hc3Npc3QtY2hvaWNlLWVsZW1lbnQnLFxyXG4gIHRlbXBsYXRlOiBgPGZvcm0gW2Zvcm1Hcm91cF09XCJjaG9pY2VFbGVtZW50Rm9ybVwiIG5vdmFsaWRhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNSB0ZXh0LXJpZ2h0XCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWwgYnJlYWstd29yZFwiPlxyXG4gICAgICAgIHt7Y2hvaWNlRGF0YUVsZW1lbnQubGFiZWx9fSA8c3BhbiAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LnVuaXQgIT0gdW5kZWZpbmVkICYmIGNob2ljZURhdGFFbGVtZW50LnVuaXQgIT0gJydcIj4gKHt7Y2hvaWNlRGF0YUVsZW1lbnQudW5pdH19KTwvc3Bhbj5cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmhpbnQgIT09ICcnICYmIGNob2ljZURhdGFFbGVtZW50LmhpbnQgIT09IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwid2hpdGVzcGFjZVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1pbmZvLWNpcmNsZSB0ZXh0LXByaW1hcnlcIiBkYXRhLXRvZ2dsZT1cInRvb2x0aXBcIiBkYXRhLXBsYWNlbWVudD1cInJpZ2h0XCIgdGl0bGU9XCJ7e2Nob2ljZURhdGFFbGVtZW50LmhpbnR9fVwiPjwvc3Bhbj5cclxuICAgICAgICA8L2k+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuZGlhZ3JhbXMgIT0gdW5kZWZpbmVkIFwiPlxyXG4gICAgICAgIDxhY3ItaGludC1kaWFncmFtIFtkYXRhRWxlbWVudF09XCJjaG9pY2VEYXRhRWxlbWVudFwiIFtpbWFnZVBhdGhdPVwiaW1hZ2VQYXRoXCI+PC9hY3ItaGludC1kaWFncmFtPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJjaG9pY2VFbGVtZW50Rm9ybS5jb250cm9sc1snY2hlY2tCb3gnXS5pbnZhbGlkICAmJiB0aGlzLmNob2ljZURhdGFFbGVtZW50LmlzUmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkLWZpZWxkIHdoaXRlc3BhY2VcIlxyXG4gICAgICAgIHRpdGxlPVwiUmVxdWlyZWQgRmllbGRcIj4qPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICBcclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyB0ZXh0LWxlZnQgY29udGVudC1wYWRkaW5nXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvLmxlbmd0aCA8PSAyXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImltYWdlUGF0aCAhPSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaG9pY2VEYXRhRWxlbWVudC5pbWFnZU1hcCA9PSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2hvaWNlIG9mIGNob2ljZURhdGFFbGVtZW50LmNob2ljZUluZm9cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8gY3VzdG9tLXJhZGlvLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgW2F0dHIuZGlzYWJsZWRdPVwiY2hvaWNlRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZCcgOiBudWxsXCIgWyhuZ01vZGVsKV09XCJjaG9pY2VWYWx1ZVwiIGlkPVwie3tjaG9pY2UudmFsdWV9fV97e2Nob2ljZURhdGFFbGVtZW50LmlkfX1cIiB0eXBlPVwicmFkaW9cIiBmb3JtQ29udHJvbE5hbWU9XCJjaGVja0JveFwiIHZhbHVlPVwie3tjaG9pY2UudmFsdWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaG9pY2VTZWxlY3RlZChjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwsIChjaG9pY2UucmVwb3J0VGV4dCAhPT0gdW5kZWZpbmVkKSA/IGNob2ljZS5yZXBvcnRUZXh0IDogY2hvaWNlLmxhYmVsLCBjaG9pY2UudmFsdWUpXCI+IHt7Y2hvaWNlLmxhYmVsfX1cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuYWxsb3dGcmVldGV4dFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYWRpbyBjdXN0b20tcmFkaW8tc3R5bGVcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIGlkPVwib3RoZXJfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgdHlwZT1cInJhZGlvXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2hlY2tCb3hcIiB2YWx1ZT1cImZyZWV0ZXh0XCIgKGNoYW5nZSk9XCJjaG9pY2VTZWxlY3RlZChjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwsICdPdGhlcicsICdmcmVldGV4dCcpXCI+IE90aGVyLCBwbGVhc2Ugc3BlY2lmeeKApjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBpZD0nZGl2X3t7Y2hvaWNlRGF0YUVsZW1lbnQuaWR9fV9vdGhlcic+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgW2F0dHIuZGlzYWJsZWRdPVwiY2hvaWNlRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZCcgOiBudWxsXCIgaWQ9XCJ0eHRfb3RoZXJfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQm94XCIgdmFsdWU9XCJvdGhlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgKGtleXVwKT0ndXBkYXRlRnJlZVRleHQoJGV2ZW50LnRhcmdldCwgY2hvaWNlRGF0YUVsZW1lbnQuaWQsIGNob2ljZURhdGFFbGVtZW50LmxhYmVsKSdcclxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQbGVhc2Ugc3BlY2lmeSAne3tjaG9pY2VEYXRhRWxlbWVudC5sYWJlbH19J1wiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmltYWdlTWFwICE9IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy02IGNvbC1zbS0yXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjaG9pY2Ugb2YgY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8gY3VzdG9tLXJhZGlvLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIFsobmdNb2RlbCldPVwiY2hvaWNlVmFsdWVcIiBpZD1cInt7Y2hvaWNlLnZhbHVlfX1fe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgdHlwZT1cInJhZGlvXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2hlY2tCb3hcIiB2YWx1ZT1cInt7Y2hvaWNlLnZhbHVlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNob2ljZVNlbGVjdGVkKGNob2ljZURhdGFFbGVtZW50LmlkLCBjaG9pY2VEYXRhRWxlbWVudC5sYWJlbCwgKGNob2ljZS5yZXBvcnRUZXh0ICE9PSB1bmRlZmluZWQpID8gY2hvaWNlLnJlcG9ydFRleHQgOiBjaG9pY2UubGFiZWwsIGNob2ljZS52YWx1ZSlcIj4ge3tjaG9pY2UubGFiZWx9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuYWxsb3dGcmVldGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8gY3VzdG9tLXJhZGlvLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIGlkPVwib3RoZXJfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgdHlwZT1cInJhZGlvXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2hlY2tCb3hcIiB2YWx1ZT1cIm90aGVyXCIgKGNoYW5nZSk9XCJjaG9pY2VTZWxlY3RlZChjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwsICdPdGhlcicsICdmcmVldGV4dCcpXCI+IE90aGVyLCBwbGVhc2Ugc3BlY2lmeeKApjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGlkPSdkaXZfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19X290aGVyJz5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgIFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIGlkPVwidHh0X290aGVyX3t7Y2hvaWNlRGF0YUVsZW1lbnQuaWR9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJjaGVja0JveFwiIHZhbHVlPVwib3RoZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAoa2V5dXApPSd1cGRhdGVGcmVlVGV4dCgkZXZlbnQudGFyZ2V0LCBjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwpJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQbGVhc2Ugc3BlY2lmeSAne3tjaG9pY2VEYXRhRWxlbWVudC5sYWJlbH19J1wiPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtNiBjb2wtc20tMlwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPk9SPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8YWNyLWltYWdlLW1hcCBbRGF0YUVsZW1lbnRdPVwiY2hvaWNlRGF0YUVsZW1lbnRcIiBbaW1hZ2VQYXRoXT1cImltYWdlUGF0aFwiPjwvYWNyLWltYWdlLW1hcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICBcclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmNob2ljZUluZm8ubGVuZ3RoID4gMlwiPiAgICAgICAgICAgIFxyXG4gICAgICAgIDxzZWxlY3QgW2F0dHIuZGlzYWJsZWRdPVwiY2hvaWNlRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZCcgOiBudWxsXCJcclxuICAgICAgICAgWyhuZ01vZGVsKV09XCJjaG9pY2VWYWx1ZVwiIGlkPVwie3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgKGNoYW5nZSk9XCJkcm9wZG93bkNob2ljZVNlbGVjdGVkKCRldmVudC50YXJnZXQsIGNob2ljZURhdGFFbGVtZW50LmxhYmVsKVwiXHJcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjaGVja0JveFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XHJcbiAgICAgICAgICA8IS0tIDxvcHRpb24gXHJcbiAgICAgICAgICBbc2VsZWN0ZWRdPVwiY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlID09IGNob2ljZURhdGFFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50ID8gdHJ1ZSA6IGZhbHNlXCI+LS1TZWxlY3QtLTwvb3B0aW9uPlxyXG4gICAgICAgICAtLT5cclxuICAgICAgICAgICA8b3B0aW9uIFtzZWxlY3RlZF09XCJcclxuICAgICAgICAgIGNob2ljZURhdGFFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50ICE9IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICAoY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQuaW5kZXhPZihjaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUpID4gLTEgPyBcclxuICAgICAgICAgIHRydWUgOlxyXG4gICAgICAgICAgdHJ1ZSlcclxuICAgICAgICAgIDogdHJ1ZVwiPi0tU2VsZWN0LS08L29wdGlvbj5cclxuXHJcbiAgICAgICAgICA8IS0tIFtzZWxlY3RlZF09XCJjaG9pY2UudmFsdWUgPT09IGNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZVwiIC0tPlxyXG5cclxuICAgICAgICBcclxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNob2ljZSBvZiBjaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvXCJcclxuICAgICAgICAgIFtoaWRkZW5dPVwiY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQgIT0gdW5kZWZpbmVkID8gXHJcbiAgICAgICAgICAgICAgY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQuaW5kZXhPZihjaG9pY2UudmFsdWUpID4gLTEgPyB0cnVlOiBudWxsXHJcbiAgICAgICAgICAgICAgOiBudWxsXCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJjaG9pY2UudmFsdWVcIiAgIFxyXG4gICAgICAgICAgW3NlbGVjdGVkXT1cImNob2ljZURhdGFFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50ICE9IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICAgY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQuaW5kZXhPZihjaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUpID4gLTFcclxuICAgICAgICAgICB8fCBjaG9pY2VEYXRhRWxlbWVudC5DaG9pY2VOb3RSZWxldmFudC5pbmRleE9mKGNob2ljZS52YWx1ZSkgPiAtMT8gZmFsc2UgOiBcclxuICAgICAgICAgICBjaG9pY2UudmFsdWUgPT09IGNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSA/IHRydWUgOiBmYWxzZVxyXG4gICAgICAgICAgIDogY2hvaWNlLnZhbHVlID09PSBjaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUgPyB0cnVlIDogZmFsc2VcIiAgICAgICBcclxuICAgICAgICAgID57e2Nob2ljZS5sYWJlbH19PC9vcHRpb24+XHJcbiAgICAgICAgICA8b3B0aW9uICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuYWxsb3dGcmVldGV4dFwiIFt2YWx1ZV09XCInZnJlZXRleHQnXCIgW3NlbGVjdGVkXT1cIidmcmVldGV4dCdcIj5PdGhlciwgcGxlYXNlIHNwZWNpZnnigKY8L29wdGlvbj5cclxuICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8ZGl2IGlkPSdkaXZfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19X290aGVyJz5cclxuXHJcbiAgICAgICAgICA8aW5wdXQgaWQ9XCJ0eHRfb3RoZXJfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQm94XCIgdmFsdWU9XCJvdGhlclwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUGxlYXNlIHNwZWNpZnkgJ3t7Y2hvaWNlRGF0YUVsZW1lbnQubGFiZWx9fSdcIiAoa2V5dXApPSd1cGRhdGVGcmVlVGV4dCgkZXZlbnQudGFyZ2V0LCBjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwpJz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuaW1hZ2VNYXAgIT0gdW5kZWZpbmVkICAmJiBpbWFnZVBhdGggIT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHBhZGRpbmctdG9wLTEwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtNiBjb2wtc20tMlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5PUjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YWNyLWltYWdlLW1hcCBbRGF0YUVsZW1lbnRdPVwiY2hvaWNlRGF0YUVsZW1lbnRcIiBbaW1hZ2VQYXRoXT1cImltYWdlUGF0aFwiPjwvYWNyLWltYWdlLW1hcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+XHJcblxyXG5gLFxyXG4gIHN0eWxlczogW2BgLCBgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0ucGFkZGluZy1sLTV7cGFkZGluZy1sZWZ0OjVweH0ud2hpdGVzcGFjZXttYXJnaW4tbGVmdDo1cHh9Lm1heC13LWgtMTAwe21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbD4uZmF7Zm9udC1zaXplOjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMjBweH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLmxlZnQsLmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LnNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXNpbXVsYXRvci1mb3JtLWhlaWdodHtoZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KTtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXJlcG9ydC10ZXh0LXNjcm9sbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMzAwcHgpfS5wYWRkaW5nLXItMTB7cGFkZGluZy1yaWdodDoxMHB4fS5zbGlkZS1sZWZ0e2xlZnQ6MzBweH0uc2xpZGUtcmlnaHR7cmlnaHQ6MzBweH1ocnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS53aGl0ZS1zcGFjZS1saW5le3doaXRlLXNwYWNlOnByZS1saW5lO3dvcmQtd3JhcDpicmVhay13b3JkfXB7bWFyZ2luOjAgMCAxMHB4fS5mb3JtLWNvbnRyb2x7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6I2QyZDZkZX1oNC5tb2RhbC10aXRsZS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnR9Lm1hcmdpbi1iLTB7bWFyZ2luLWJvdHRvbTowfS5mb250LXdlaWdodC00MDB7Zm9udC13ZWlnaHQ6NDAwfS5jdXN0b20tcmFkaW8tc3R5bGV7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTVweH0uem9vbXt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG99Lnpvb20gaW1ne2hlaWdodDphdXRvO3dpZHRoOjEwMCU7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOmluaGVyaXQhaW1wb3J0YW50fS5idG4tem9vbXtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ0NDtib3JkZXItY29sb3I6I2RkZH0uYnRuLXpvb20uaG92ZXIsLmJ0bi16b29tOmFjdGl2ZSwuYnRuLXpvb206aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXtsYWJlbC5jb250cm9sLWxhYmVse3BhZGRpbmctbGVmdDoyMHB4fX0ucGFkZGluZy01e3BhZGRpbmc6NXB4fWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3Npc3RDaG9pY2VFbGVtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuICBASW5wdXQoKSBjaG9pY2VEYXRhRWxlbWVudDogQ2hvaWNlRGF0YUVsZW1lbnQ7XHJcbiAgQElucHV0KCkgaW1hZ2VQYXRoOiBzdHJpbmc7XHJcbiAgQE91dHB1dCgpIHJldHVybkNob2ljZUVsZW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGNob2ljZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBjaG9pY2VWYWx1ZTogc3RyaW5nO1xyXG5cclxuICBjaG9pY2VFbGVtZW50Rm9ybTogRm9ybUdyb3VwO1xyXG4gIHNlbGVjdGVkQ29uZGl0aW9uOiBTZWxlY3RlZENvbmRpdGlvbjtcclxuICBzZWxlY3RlZEluZGV4OiBudW1iZXI7XHJcbiAgc2VsZWN0ZWRDaG9pY2VSZXBvcnRUZXh0OiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWRDaG9pY2VSZXBvcnRMYWJlbDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBzaW11bGF0b3JFbmdpbmVTZXJ2aWNlOiBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlKSB7IH1cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3JlYXRlQ2hvaWNlRWxlbWVudEZvcm0oKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICQoJyNkaXZfJyArIHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuaWQgKyAnX290aGVyJykuaGlkZSgpO1xyXG4gICAgaWYgKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgJCgnIycgKyB0aGlzLmNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSArICdfJyArIHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuaWQpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICAgdGhpcy5jaG9pY2VWYWx1ZSA9IHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlO1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Zm9yaW5cclxuICAgICAgZm9yIChjb25zdCBjaG9pY2UgaW4gdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvKSB7XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLnZhbHVlID09PSAnaHlwb0VuaGFuY2luZycpe1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZygnYXNkYXNkJyk7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0udmFsdWUgPT09IHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0ucmVwb3J0VGV4dCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRUZXh0ID0gdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0ucmVwb3J0VGV4dDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRMYWJlbCA9IHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLmxhYmVsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mby5sZW5ndGggPD0gNSkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2hvaWNlVmFsdWUodGhpcy5jaG9pY2VEYXRhRWxlbWVudC5pZCwgdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5sYWJlbCxcclxuICAgICAgICAgICh0aGlzLnNlbGVjdGVkQ2hvaWNlUmVwb3J0VGV4dCAhPT0gdW5kZWZpbmVkKSA/IHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRUZXh0IDogdGhpcy5zZWxlY3RlZENob2ljZVJlcG9ydExhYmVsLCB0aGlzLmNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVEcm9wZG93bkNob2ljZVNlbGVjdGVkKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuaWQsIHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRMYWJlbCwgdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUsIHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh1bmRlZmluZWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ2hvaWNlVmFsdWUoZWxlbWVudElkOiBzdHJpbmcsIHNlbGVjdGVkRWxlbWVudDogc3RyaW5nLCBzZWxlY3RlZFRleHQ6IHN0cmluZywgc2VsZWN0ZWRWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBuZXcgQ2hvaWNlRWxlbWVudCgpO1xyXG4gICAgICBjaG9pY2VFbGVtZW50LmVsZW1lbnRJZCA9IGVsZW1lbnRJZDtcclxuICAgICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFZhbHVlID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQ7XHJcbiAgICAgIHRoaXMuc2hvd09ySGlkZUZyZWVUZXh0KGVsZW1lbnRJZCwgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFZhbHVlKTtcclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb25JZCA9IGVsZW1lbnRJZDtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbiA9IHNlbGVjdGVkRWxlbWVudDtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlID0gc2VsZWN0ZWRUZXh0O1xyXG5cclxuICAgICAgdGhpcy5yZXR1cm5DaG9pY2VFbGVtZW50LmVtaXQoeyByZWNlaXZlZEVsZW1lbnQ6IGNob2ljZUVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uOiB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlRHJvcGRvd25DaG9pY2VTZWxlY3RlZChlbGVtZW50SWQsIGVsZW1lbnRMYWJlbCwgZWxlbWVudFZhbHVlLCBzZWxlY3RlZENvbmRpdGlvbikge1xyXG4gICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IG5ldyBDaG9pY2VFbGVtZW50KCk7XHJcbiAgICBjaG9pY2VFbGVtZW50LmVsZW1lbnRJZCA9IGVsZW1lbnRJZDtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9IGVsZW1lbnRWYWx1ZTtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gZWxlbWVudExhYmVsO1xyXG5cclxuICAgIGlmICh0aGlzLmNob2ljZVZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLmNob2ljZVZhbHVlID09PSAnLS1TZWxlY3QtLScgfHwgdGhpcy5jaG9pY2VWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuY2hvaWNlVmFsdWUgPT09ICcnKSB7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gJyc7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWQgPSBlbGVtZW50SWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uID0gc2VsZWN0ZWRDb25kaXRpb247XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkVmFsdWUgPSBlbGVtZW50TGFiZWw7XHJcbiAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG5cclxuICBjaG9pY2VTZWxlY3RlZChlbGVtZW50SWQ6IHN0cmluZywgc2VsZWN0ZWRFbGVtZW50OiBzdHJpbmcsIHNlbGVjdGVkVGV4dDogc3RyaW5nLCBzZWxlY3RlZFZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBuZXcgQ2hvaWNlRWxlbWVudCgpO1xyXG4gICAgY2hvaWNlRWxlbWVudC5lbGVtZW50SWQgPSBlbGVtZW50SWQ7XHJcbiAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVmFsdWUgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQ7XHJcbiAgICB0aGlzLnNob3dPckhpZGVGcmVlVGV4dChlbGVtZW50SWQsIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9IG5ldyBTZWxlY3RlZENvbmRpdGlvbigpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb25JZCA9IGVsZW1lbnRJZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb24gPSBzZWxlY3RlZEVsZW1lbnQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkVmFsdWUgPSBzZWxlY3RlZFRleHQ7XHJcbiAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG5cclxuICBkcm9wZG93bkNob2ljZVNlbGVjdGVkKGVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uKSB7XHJcbiAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gbmV3IENob2ljZUVsZW1lbnQoKTtcclxuICAgIGNob2ljZUVsZW1lbnQuZWxlbWVudElkID0gZWxlbWVudC5pZDtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9IChlbGVtZW50Lm9wdGlvbnNbZWxlbWVudC5zZWxlY3RlZEluZGV4XS50ZXh0ID09PSAnT3RoZXIsIHBsZWFzZSBzcGVjaWZ54oCmJykgPyAnZnJlZXRleHQnIDogZWxlbWVudC52YWx1ZTtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gZWxlbWVudC5vcHRpb25zW2VsZW1lbnQuc2VsZWN0ZWRJbmRleF0udGV4dDtcclxuXHJcbiAgICB0aGlzLnNob3dPckhpZGVGcmVlVGV4dChlbGVtZW50LmlkLCBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVmFsdWUpO1xyXG5cclxuICAgIGlmICh0aGlzLmNob2ljZVZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLmNob2ljZVZhbHVlID09PSAnLS1TZWxlY3QtLScgfHwgdGhpcy5jaG9pY2VWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuY2hvaWNlVmFsdWUgPT09ICcnKSB7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gJyc7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWQgPSBlbGVtZW50LmlkO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbiA9IHNlbGVjdGVkQ29uZGl0aW9uO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlID0gZWxlbWVudC5vcHRpb25zW2VsZW1lbnQuc2VsZWN0ZWRJbmRleF0udGV4dDtcclxuXHJcbiAgICAvLyBDb2RlIHNob3VsZCBjb21lcyBoZXJlIC8vXHJcbiAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUNob2ljZUVsZW1lbnRGb3JtKCkge1xyXG4gICAgdGhpcy5jaG9pY2VFbGVtZW50Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBjaGVja0JveDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgIH0sIHtcclxuICAgICAgICB2YWxpZGF0b3I6IHRoaXMuc3BlY2lmaWNWYWx1ZUluc2lkZVJhbmdlKCdjaGVja0JveCcpXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2hvd09ySGlkZUZyZWVUZXh0KGVsZW1lbnRJZDogc3RyaW5nLCBzZWxlY3RlZFZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmIChzZWxlY3RlZFZhbHVlID09PSAnZnJlZXRleHQnKSB7XHJcbiAgICAgICQoJyNkaXZfJyArIGVsZW1lbnRJZCArICdfb3RoZXInKS5zaG93KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAkKCcjZGl2XycgKyBlbGVtZW50SWQgKyAnX290aGVyJykuaGlkZSgpO1xyXG4gICAgICAkKCcjdHh0X290aGVyXycgKyBlbGVtZW50SWQpLnZhbCgnJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGcmVlVGV4dChlbGVtZW50LCBlbGVtZW50SWQsIHNlbGVjdGVkQ29uZGl0aW9uKSB7XHJcbiAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gbmV3IENob2ljZUVsZW1lbnQoKTtcclxuICAgIGNob2ljZUVsZW1lbnQuZWxlbWVudElkID0gZWxlbWVudElkO1xyXG4gICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFZhbHVlID0gKGVsZW1lbnQudmFsdWUgPT09ICdPdGhlcicpID8gJ2ZyZWV0ZXh0JyA6IGVsZW1lbnQudmFsdWU7XHJcbiAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVGV4dCA9IGVsZW1lbnQudmFsdWU7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9IG5ldyBTZWxlY3RlZENvbmRpdGlvbigpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb25JZCA9IGVsZW1lbnRJZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb24gPSBzZWxlY3RlZENvbmRpdGlvbjtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRWYWx1ZSA9IGVsZW1lbnQudmFsdWU7XHJcbiAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgc3BlY2lmaWNWYWx1ZUluc2lkZVJhbmdlKGNoZWNrQm94S2V5OiBzdHJpbmcpIHtcclxuICAgIHJldHVybiAoZ3JvdXA6IEZvcm1Hcm91cCkgPT4ge1xyXG4gICAgICBjb25zdCBjaG9pY2VDb250cm9sID0gZ3JvdXAuY29udHJvbHNbY2hlY2tCb3hLZXldO1xyXG4gICAgICBpZiAoKGNob2ljZUNvbnRyb2wudmFsdWUgPT09IHVuZGVmaW5lZCB8fCBjaG9pY2VDb250cm9sLnZhbHVlID09PSAnJyB8fCBjaG9pY2VDb250cm9sLnZhbHVlID09PSAnLS1TZWxlY3QtLScgfHwgdGhpcy5jaG9pY2VWYWx1ZSA9PT0gJycpKSB7XHJcbiAgICAgICAgcmV0dXJuIGNob2ljZUNvbnRyb2wuc2V0RXJyb3JzKHsgbm90RXF1aXZhbGVudDogdHJ1ZSB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gY2hvaWNlQ29udHJvbC5zZXRFcnJvcnMobnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiJdfQ==