UNPKG

acr-assist-simulator-module

Version:

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

6,865 lines 888 kB
(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('rxjs/BehaviorSubject'), require('util'), require('@angular/common'), require('rxjs/internal/Subject'), require('@angular/platform-browser'), require('@angular/forms'), require('ngx-bootstrap/carousel/slide.component'), require('ngx-bootstrap/carousel/carousel.component'), require('ngx-bootstrap/carousel/carousel.config'), require('ngx-drag-scroll'), require('angular2-datetimepicker'), require('ngx-duration-picker'), require('@angular/http'), require('rxjs/add/operator/map')) :
    typeof define === 'function' && define.amd ? define('acr-assist-simulator-module', ['exports', '@angular/core', 'rxjs/BehaviorSubject', 'util', '@angular/common', 'rxjs/internal/Subject', '@angular/platform-browser', '@angular/forms', 'ngx-bootstrap/carousel/slide.component', 'ngx-bootstrap/carousel/carousel.component', 'ngx-bootstrap/carousel/carousel.config', 'ngx-drag-scroll', 'angular2-datetimepicker', 'ngx-duration-picker', '@angular/http', 'rxjs/add/operator/map'], factory) :
    (factory((global['acr-assist-simulator-module'] = {}),global.ng.core,global.rxjs.BehaviorSubject,null,global.ng.common,global.rxjs['internal/Subject'],global.ng.platformBrowser,global.ng.forms,null,null,null,null,null,null,global.ng.http));
}(this, (function (exports,core,BehaviorSubject,util,common,Subject,platformBrowser,forms,slide_component,carousel_component,carousel_config,ngxDragScroll,angular2Datetimepicker,ngxDurationPicker,http) { 'use strict';

    /*! *****************************************************************************
    Copyright (c) Microsoft Corporation. All rights reserved.
    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
    this file except in compliance with the License. You may obtain a copy of the
    License at http://www.apache.org/licenses/LICENSE-2.0

    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
    MERCHANTABLITY OR NON-INFRINGEMENT.

    See the Apache Version 2.0 License for specific language governing permissions
    and limitations under the License.
    ***************************************************************************** */
    /* global Reflect, Promise */
    var extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b)
            if (b.hasOwnProperty(p))
                d[p] = b[p]; };
    function __extends(d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    }
    function __values(o) {
        var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0;
        if (m)
            return m.call(o);
        return {
            next: function () {
                if (o && i >= o.length)
                    o = void 0;
                return { value: o && o[i++], done: !o };
            }
        };
    }

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var SimulatorState = (function () {
        function SimulatorState() {
            this.nonRelevantDataElementIds = [];
            this.endPointId = '';
            this.selectedDecisionPointId = '';
            this.selectedDecisionPointLabel = '';
            this.selectedBranchLabel = '';
        }
        return SimulatorState;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var DataElementValues = (function () {
        function DataElementValues(values) {
            this.values = values;
        }
        /**
         * @param {?} key
         * @param {?} value
         * @return {?}
         */
        DataElementValues.prototype.addOrUpdate = /**
         * @param {?} key
         * @param {?} value
         * @return {?}
         */
            function (key, value) {
                this.values[key] = value;
            };
        /**
         * @param {?} key
         * @return {?}
         */
        DataElementValues.prototype.get = /**
         * @param {?} key
         * @return {?}
         */
            function (key) {
                return this.values[key];
            };
        /**
         * @param {?} key
         * @return {?}
         */
        DataElementValues.prototype.delete = /**
         * @param {?} key
         * @return {?}
         */
            function (key) {
                return this.values.delete(key);
            };
        /**
         * @return {?}
         */
        DataElementValues.prototype.getAll = /**
         * @return {?}
         */
            function () {
                return this.values;
            };
        return DataElementValues;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var ArithmeticExpression = (function () {
        function ArithmeticExpression() {
        }
        return ArithmeticExpression;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var /** @type {?} */ expressionParser = require('expr-eval').Parser;
    var SimulatorEngineService = (function () {
        function SimulatorEngineService() {
            this.endOfRoadReached = false;
            this.lastConditionMetBranchLevel = 1;
            this.nonRelevantDataElementIds = new Array();
            this.simulatorStateChanged = new BehaviorSubject.BehaviorSubject(new SimulatorState());
            this.dataElementValues = new Map();
            this.dataElementTexts = new Map();
            this.nonRelevantDataElementIds = new Array();
        }
        /**
         * @return {?}
         */
        SimulatorEngineService.prototype.getTemplate = /**
         * @return {?}
         */
            function () {
                return this.template;
            };
        /**
         * @return {?}
         */
        SimulatorEngineService.prototype.getAllDataElementValues = /**
         * @return {?}
         */
            function () {
                return this.dataElementValues;
            };
        /**
         * @return {?}
         */
        SimulatorEngineService.prototype.getAllDataElementTexts = /**
         * @return {?}
         */
            function () {
                return this.dataElementTexts;
            };
        /**
         * @param {?} dataElementId
         * @return {?}
         */
        SimulatorEngineService.prototype.getDataElementValue = /**
         * @param {?} dataElementId
         * @return {?}
         */
            function (dataElementId) {
                return this.dataElementValues[dataElementId];
            };
        /**
         * @param {?} dataElementId
         * @return {?}
         */
        SimulatorEngineService.prototype.getDataElementText = /**
         * @param {?} dataElementId
         * @return {?}
         */
            function (dataElementId) {
                return this.dataElementTexts[dataElementId];
            };
        /**
         * @param {?} dataElementId
         * @param {?} value
         * @param {?} text
         * @return {?}
         */
        SimulatorEngineService.prototype.addOrUpdateDataElement = /**
         * @param {?} dataElementId
         * @param {?} value
         * @param {?} text
         * @return {?}
         */
            function (dataElementId, value, text) {
                this.dataElementValues[dataElementId] = value;
                this.dataElementTexts[dataElementId] = text;
                this.evaluateDecisionPoints();
            };
        /**
         * @param {?} decisionPoint
         * @param {?} branchingLevel
         * @return {?}
         */
        SimulatorEngineService.prototype.evaluateDecisionPoint = /**
         * @param {?} decisionPoint
         * @param {?} branchingLevel
         * @return {?}
         */
            function (decisionPoint, branchingLevel) {
                var /** @type {?} */ currentBranchCount = 0;
                var /** @type {?} */ totalBranchesInDecisionPoint = decisionPoint.branches.length;
                try {
                    for (var _a = __values(decisionPoint.branches), _b = _a.next(); !_b.done; _b = _a.next()) {
                        var branch = _b.value;
                        currentBranchCount++;
                        var /** @type {?} */ conditionMet = false;
                        if (this.endOfRoadReached) {
                            break;
                        }
                        if (branch.compositeCondition !== undefined) {
                            conditionMet = branch.compositeCondition.evaluate(new DataElementValues(this.dataElementValues));
                        }
                        else if (branch.condition !== undefined) {
                            conditionMet = branch.condition.evaluate(new DataElementValues(this.dataElementValues));
                        }
                        if (conditionMet) {
                            this.lastConditionMetBranchLevel = branchingLevel;
                            // if (nonRelevantDataElementIds === undefined) {
                            //   nonRelevantDataElementIds = new Array<string>();
                            // }
                            // if (branch.notRelevantDataElements !== undefined) {
                            //   for (const nonRelevantDataElementReference of branch.notRelevantDataElements.dataElementReferences) {
                            //     nonRelevantDataElementIds.push(nonRelevantDataElementReference.dataElementId);
                            //   }
                            // }
                            if (branch.decisionPoints !== undefined) {
                                try {
                                    for (var _c = __values(branch.decisionPoints), _d = _c.next(); !_d.done; _d = _c.next()) {
                                        var branchDecisionPoint = _d.value;
                                        var /** @type {?} */ newBranchingLevel = branchingLevel + 1;
                                        // this.evaluateDecisionPoint(branchDecisionPoint, newBranchingLevel, nonRelevantDataElementIds);
                                        this.evaluateDecisionPoint(branchDecisionPoint, newBranchingLevel);
                                    }
                                }
                                catch (e_1_1) {
                                    e_1 = { error: e_1_1 };
                                }
                                finally {
                                    try {
                                        if (_d && !_d.done && (_e = _c.return))
                                            _e.call(_c);
                                    }
                                    finally {
                                        if (e_1)
                                            throw e_1.error;
                                    }
                                }
                            }
                            else if (branch.endPointRef !== undefined) {
                                var /** @type {?} */ simulatorState = new SimulatorState();
                                simulatorState.endPointId = branch.endPointRef.endPointId;
                                // simulatorState.nonRelevantDataElementIds = nonRelevantDataElementIds;
                                simulatorState.selectedBranchLabel = branch.label;
                                simulatorState.selectedDecisionPointId = decisionPoint.id;
                                simulatorState.selectedDecisionPointLabel = decisionPoint.label;
                                // this.resetValuesOfNonRelevantDataElements(nonRelevantDataElementIds);
                                this.simulatorStateChanged.next(simulatorState);
                                this.endOfRoadReached = true;
                                break;
                            }
                        }
                        else {
                            if (currentBranchCount >= totalBranchesInDecisionPoint) {
                                this.endOfRoadReached = true;
                                var /** @type {?} */ simulatorState = new SimulatorState();
                                // simulatorState.nonRelevantDataElementIds = nonRelevantDataElementIds;
                                // this.resetValuesOfNonRelevantDataElements(nonRelevantDataElementIds);
                                this.simulatorStateChanged.next(simulatorState);
                                return;
                            }
                            else {
                                continue;
                            }
                        }
                    }
                }
                catch (e_2_1) {
                    e_2 = { error: e_2_1 };
                }
                finally {
                    try {
                        if (_b && !_b.done && (_f = _a.return))
                            _f.call(_a);
                    }
                    finally {
                        if (e_2)
                            throw e_2.error;
                    }
                }
                var e_2, _f, e_1, _e;
            };
        /**
         * @param {?} nonRelevantDataElementIds
         * @return {?}
         */
        SimulatorEngineService.prototype.resetValuesOfNonRelevantDataElements = /**
         * @param {?} nonRelevantDataElementIds
         * @return {?}
         */
            function (nonRelevantDataElementIds) {
                // console.log(this.template.dataElements);
                if (nonRelevantDataElementIds !== undefined) {
                    try {
                        for (var nonRelevantDataElementIds_1 = __values(nonRelevantDataElementIds), nonRelevantDataElementIds_1_1 = nonRelevantDataElementIds_1.next(); !nonRelevantDataElementIds_1_1.done; nonRelevantDataElementIds_1_1 = nonRelevantDataElementIds_1.next()) {
                            var nonRelevantDataElementId = nonRelevantDataElementIds_1_1.value;
                            var /** @type {?} */ defaultValue = void 0;
                            try {
                                for (var _a = __values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) {
                                    var dataElement = _b.value;
                                    if (dataElement.id === nonRelevantDataElementId) {
                                        defaultValue = dataElement.defaultValue;
                                        break;
                                    }
                                }
                            }
                            catch (e_3_1) {
                                e_3 = { error: e_3_1 };
                            }
                            finally {
                                try {
                                    if (_b && !_b.done && (_c = _a.return))
                                        _c.call(_a);
                                }
                                finally {
                                    if (e_3)
                                        throw e_3.error;
                                }
                            }
                            this.dataElementValues[nonRelevantDataElementId] = defaultValue;
                        }
                    }
                    catch (e_4_1) {
                        e_4 = { error: e_4_1 };
                    }
                    finally {
                        try {
                            if (nonRelevantDataElementIds_1_1 && !nonRelevantDataElementIds_1_1.done && (_d = nonRelevantDataElementIds_1.return))
                                _d.call(nonRelevantDataElementIds_1);
                        }
                        finally {
                            if (e_4)
                                throw e_4.error;
                        }
                    }
                }
                var e_4, _d, e_3, _c;
            };
        /**
         * @param {?} elementId
         * @param {?} decisionPoint
         * @param {?} branchingLevel
         * @return {?}
         */
        SimulatorEngineService.prototype.evaluateComputedElementDecisionPoint = /**
         * @param {?} elementId
         * @param {?} decisionPoint
         * @param {?} branchingLevel
         * @return {?}
         */
            function (elementId, decisionPoint, branchingLevel) {
                var /** @type {?} */ currentBranchCount = 0;
                var /** @type {?} */ totalBranchesInDecisionPoint = decisionPoint.branches.length;
                try {
                    for (var _a = __values(decisionPoint.branches), _b = _a.next(); !_b.done; _b = _a.next()) {
                        var branch = _b.value;
                        currentBranchCount++;
                        var /** @type {?} */ conditionMet = false;
                        if (this.endOfRoadReached) {
                            break;
                        }
                        if (branch.compositeCondition !== undefined) {
                            conditionMet = branch.compositeCondition.evaluate(new DataElementValues(this.dataElementValues));
                        }
                        else if (branch.condition !== undefined) {
                            conditionMet = branch.condition.evaluate(new DataElementValues(this.dataElementValues));
                        }
                        if (conditionMet) {
                            this.lastConditionMetBranchLevel = branchingLevel;
                            if (branch.decisionPoints !== undefined) {
                                try {
                                    for (var _c = __values(branch.decisionPoints), _d = _c.next(); !_d.done; _d = _c.next()) {
                                        var branchDecisionPoint = _d.value;
                                        var /** @type {?} */ newBranchingLevel = branchingLevel + 1;
                                        this.evaluateComputedElementDecisionPoint(elementId, branchDecisionPoint, newBranchingLevel);
                                    }
                                }
                                catch (e_5_1) {
                                    e_5 = { error: e_5_1 };
                                }
                                finally {
                                    try {
                                        if (_d && !_d.done && (_e = _c.return))
                                            _e.call(_c);
                                    }
                                    finally {
                                        if (e_5)
                                            throw e_5.error;
                                    }
                                }
                            }
                            else if (branch.computedValue !== undefined) {
                                this.dataElementValues[elementId] = branch.computedValue.expressionText;
                                this.endOfRoadReached = true;
                                if (branch.computedValue instanceof ArithmeticExpression) {
                                    this.dataElementValues[elementId] = this.evaluateArithmeticExpression(branch.computedValue.expressionText);
                                    this.endOfRoadReached = true;
                                }
                                else {
                                    this.dataElementValues[elementId] = branch.computedValue.expressionText;
                                    this.endOfRoadReached = true;
                                }
                                break;
                            }
                        }
                        else {
                            if (currentBranchCount >= totalBranchesInDecisionPoint) {
                                this.endOfRoadReached = true;
                                this.dataElementValues[elementId] = undefined;
                                return;
                            }
                            else {
                                continue;
                            }
                        }
                    }
                }
                catch (e_6_1) {
                    e_6 = { error: e_6_1 };
                }
                finally {
                    try {
                        if (_b && !_b.done && (_f = _a.return))
                            _f.call(_a);
                    }
                    finally {
                        if (e_6)
                            throw e_6.error;
                    }
                }
                var e_6, _f, e_5, _e;
            };
        /**
         * @param {?} computedValue
         * @return {?}
         */
        SimulatorEngineService.prototype.evaluateArithmeticExpression = /**
         * @param {?} computedValue
         * @return {?}
         */
            function (computedValue) {
                var /** @type {?} */ startIndex = 0;
                var /** @type {?} */ endIndex = 0;
                var _loop_1 = function () {
                    startIndex = computedValue.indexOf('{');
                    endIndex = computedValue.indexOf('}');
                    if (startIndex !== -1 && endIndex !== -1) {
                        var /** @type {?} */ dataElementId = computedValue.substring(startIndex + 1, endIndex);
                        var /** @type {?} */ replacingValue = computedValue.substring(startIndex, endIndex + 1);
                        var /** @type {?} */ dataElementValue = this_1.dataElementValues[dataElementId];
                        if (util.isArray(dataElementValue)) {
                            var /** @type {?} */ sum_1 = 0;
                            dataElementValue.forEach(function (val) {
                                sum_1 += +val;
                            });
                            dataElementValue = sum_1;
                        }
                        computedValue = computedValue.replace(replacingValue, dataElementValue);
                    }
                };
                var this_1 = this;
                while (startIndex !== -1 && endIndex !== -1) {
                    _loop_1();
                }
                return expressionParser.evaluate(computedValue).toString();
            };
        /**
         * @return {?}
         */
        SimulatorEngineService.prototype.evaluateComputedExpressions = /**
         * @return {?}
         */
            function () {
                this.endOfRoadReached = false;
                try {
                    for (var _a = __values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) {
                        var element = _b.value;
                        if (element.dataElementType === 'ComputedDataElement') {
                            var /** @type {?} */ computedElement = (element);
                            try {
                                for (var _c = __values(computedElement.decisionPoints), _d = _c.next(); !_d.done; _d = _c.next()) {
                                    var decisionPoint = _d.value;
                                    this.evaluateComputedElementDecisionPoint(element.id, decisionPoint, 1);
                                    if (this.dataElementValues[element.id] === undefined && decisionPoint.defaultBranch &&
                                        decisionPoint.defaultBranch.computedValue) {
                                        this.dataElementValues[element.id] = decisionPoint.defaultBranch.computedValue.expressionText;
                                    }
                                    this.endOfRoadReached = false;
                                }
                            }
                            catch (e_7_1) {
                                e_7 = { error: e_7_1 };
                            }
                            finally {
                                try {
                                    if (_d && !_d.done && (_e = _c.return))
                                        _e.call(_c);
                                }
                                finally {
                                    if (e_7)
                                        throw e_7.error;
                                }
                            }
                        }
                    }
                }
                catch (e_8_1) {
                    e_8 = { error: e_8_1 };
                }
                finally {
                    try {
                        if (_b && !_b.done && (_f = _a.return))
                            _f.call(_a);
                    }
                    finally {
                        if (e_8)
                            throw e_8.error;
                    }
                }
                var e_8, _f, e_7, _e;
            };
        /**
         * @param {?} dataelement
         * @param {?=} nonRelevantDataElementIds
         * @return {?}
         */
        SimulatorEngineService.prototype.evaluateConditionalProperty = /**
         * @param {?} dataelement
         * @param {?=} nonRelevantDataElementIds
         * @return {?}
         */
            function (dataelement, nonRelevantDataElementIds) {
                if (nonRelevantDataElementIds === void 0) {
                    nonRelevantDataElementIds = [];
                }
                if (dataelement.conditionalProperties !== undefined) {
                    var /** @type {?} */ conditionMet = false;
                    try {
                        for (var _a = __values(dataelement.conditionalProperties), _b = _a.next(); !_b.done; _b = _a.next()) {
                            var conditionalProperty = _b.value;
                            if (conditionalProperty.condition !== undefined) {
                                conditionMet = conditionalProperty.condition.evaluate(new DataElementValues(this.dataElementValues));
                            }
                            else if (conditionalProperty.compositeCondition !== undefined) {
                                conditionMet = conditionalProperty.compositeCondition.evaluate(new DataElementValues(this.dataElementValues));
                            }
                            if (conditionMet) {
                                if (nonRelevantDataElementIds === undefined) {
                                    this.nonRelevantDataElementIds = new Array();
                                }
                                if (conditionalProperty.isRelevant === 'false') {
                                    this.nonRelevantDataElementIds.push(dataelement.id);
                                }
                                else {
                                    dataelement.displaySequence = conditionalProperty.DisplaySequence;
                                    dataelement.isRequired = conditionalProperty.isRequired !== undefined ?
                                        (conditionalProperty.isRequired.toLowerCase() === 'true' ? true : false)
                                        : true;
                                    if (conditionalProperty.Minimum !== undefined && conditionalProperty.Minimum != null) {
                                        dataelement.minimum = +conditionalProperty.Minimum;
                                    }
                                    if (conditionalProperty.Maximum !== undefined && conditionalProperty.Maximum != null) {
                                        dataelement.maximum = +conditionalProperty.Maximum;
                                    }
                                    if (dataelement.dataElementType === 'ChoiceDataElement') {
                                        ((dataelement)).ChoiceNotRelevant = conditionalProperty.ChoiceNotRelevant;
                                    }
                                    if (dataelement.dataElementType === 'MultiChoiceDataElement') {
                                        ((dataelement)).ChoiceNotRelevant = conditionalProperty.ChoiceNotRelevant;
                                    }
                                    if (dataelement.dataElementType === 'DurationDataElement') {
                                        ((dataelement)).MinimumDay = +conditionalProperty.MinimumDay;
                                        ((dataelement)).MaximumDay = +conditionalProperty.MaximumDay;
                                        ((dataelement)).MinimumHours = +conditionalProperty.MinimumHours;
                                        ((dataelement)).MaximumHours = +conditionalProperty.MaximumHours;
                                        ((dataelement)).MinimumMinutes = +conditionalProperty.MinimumMinutes;
                                        ((dataelement)).MaxmimumMinutes = +conditionalProperty.MaxmimumMinutes;
                                    }
                                }
                                return this.nonRelevantDataElementIds;
                            }
                            else {
                                if (dataelement.dataElementType === 'ChoiceDataElement') {
                                    ((dataelement)).ChoiceNotRelevant = new Array();
                                }
                                if (dataelement.dataElementType === 'MultiChoiceDataElement') {
                                    ((dataelement)).ChoiceNotRelevant = new Array();
                                }
                            }
                        }
                    }
                    catch (e_9_1) {
                        e_9 = { error: e_9_1 };
                    }
                    finally {
                        try {
                            if (_b && !_b.done && (_c = _a.return))
                                _c.call(_a);
                        }
                        finally {
                            if (e_9)
                                throw e_9.error;
                        }
                    }
                }
                var e_9, _c;
            };
        /**
         * @return {?}
         */
        SimulatorEngineService.prototype.isCondtionMet = /**
         * @return {?}
         */
            function () {
                try {
                    for (var _a = __values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) {
                        var dataelement = _b.value;
                        if (dataelement.conditionalProperties !== undefined) {
                            var /** @type {?} */ conditionMet = false;
                            try {
                                for (var _c = __values(dataelement.conditionalProperties), _d = _c.next(); !_d.done; _d = _c.next()) {
                                    var conditionalProperty = _d.value;
                                    if (conditionalProperty.condition !== undefined) {
                                        conditionMet = conditionalProperty.condition.evaluate(new DataElementValues(this.dataElementValues));
                                    }
                                    else if (conditionalProperty.compositeCondition !== undefined) {
                                        conditionMet = conditionalProperty.compositeCondition.evaluate(new DataElementValues(this.dataElementValues));
                                    }
                                    if (conditionMet) {
                                        return true;
                                    }
                                    return false;
                                }
                            }
                            catch (e_10_1) {
                                e_10 = { error: e_10_1 };
                            }
                            finally {
                                try {
                                    if (_d && !_d.done && (_e = _c.return))
                                        _e.call(_c);
                                }
                                finally {
                                    if (e_10)
                                        throw e_10.error;
                                }
                            }
                        }
                    }
                }
                catch (e_11_1) {
                    e_11 = { error: e_11_1 };
                }
                finally {
                    try {
                        if (_b && !_b.done && (_f = _a.return))
                            _f.call(_a);
                    }
                    finally {
                        if (e_11)
                            throw e_11.error;
                    }
                }
                var e_11, _f, e_10, _e;
            };
        /**
         * @return {?}
         */
        SimulatorEngineService.prototype.evaluateDecisionAndConditionalProperty = /**
         * @return {?}
         */
            function () {
                this.nonRelevantDataElementIds = new Array();
                this.RevertConditionValues();
                try {
                    for (var _a = __values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) {
                        var dataelement = _b.value;
                        this.evaluateConditionalProperty(dataelement, new Array());
                    }
                }
                catch (e_12_1) {
                    e_12 = { error: e_12_1 };
                }
                finally {
                    try {
                        if (_b && !_b.done && (_c = _a.return))
                            _c.call(_a);
                    }
                    finally {
                        if (e_12)
                            throw e_12.error;
                    }
                }
                this.resetValuesOfNonRelevantDataElements(this.nonRelevantDataElementIds);
                return this.nonRelevantDataElementIds;
                var e_12, _c;
            };
        /**
         * @return {?}
         */
        SimulatorEngineService.prototype.RevertConditionValues = /**
         * @return {?}
         */
            function () {
                try {
                    for (var _a = __values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) {
                        var dataelement = _b.value;
                        dataelement.isRequired = dataelement.isRequiredOverrider;
                        dataelement.displaySequence = dataelement.displaySequenceOverrider;
                        if (dataelement.dataElementType === 'NumericDataElement') {
                            ((dataelement)).minimum = +((dataelement)).minimumOverrider;
                            ((dataelement)).maximum = +((dataelement)).maximumOverrider;
                        }
                        if (dataelement.dataElementType === 'IntegerDataElement') {
                            ((dataelement)).minimum = +((dataelement)).minimumOverrider;
                            ((dataelement)).maximum = +((dataelement)).maximumOverrider;
                        }
                        if (dataelement.dataElementType === 'DurationDataElement') {
                            ((dataelement)).MinimumDay = +((dataelement)).MinimumDayOverrider;
                            ((dataelement)).MaximumDay = +((dataelement)).MaximumDayOverrider;
                            ((dataelement)).MinimumHours = +((dataelement)).MinimumHoursOverrider;
                            ((dataelement)).MaximumHours = +((dataelement)).MaximumHoursOverrider;
                            ((dataelement)).MinimumMinutes = +((dataelement)).MinimumMinutesOverrider;
                            ((dataelement)).MaxmimumMinutes = +((dataelement)).MaxmimumMinutesOverrider;
                        }
                    }
                }
                catch (e_13_1) {
                    e_13 = { error: e_13_1 };
                }
                finally {
                    try {
                        if (_b && !_b.done && (_c = _a.return))
                            _c.call(_a);
                    }
                    finally {
                        if (e_13)
                            throw e_13.error;
                    }
                }
                var e_13, _c;
            };
        /**
         * @return {?}
         */
        SimulatorEngineService.prototype.evaluateDecisionPoints = /**
         * @return {?}
         */
            function () {
                this.evaluateComputedExpressions();
                this.endOfRoadReached = false;
                try {
                    for (var _a = __values(this.template.rules.decisionPoints), _b = _a.next(); !_b.done; _b = _a.next()) {
                        var decisionPoint = _b.value;
                        this.evaluateDecisionPoint(decisionPoint, 1);
                    }
                }
                catch (e_14_1) {
                    e_14 = { error: e_14_1 };
                }
                finally {
                    try {
                        if (_b && !_b.done && (_c = _a.return))
                            _c.call(_a);
                    }
                    finally {
                        if (e_14)
                            throw e_14.error;
                    }
                }
                var e_14, _c;
            };
        /**
         * @param {?} template
         * @return {?}
         */
        SimulatorEngineService.prototype.initialize = /**
         * @param {?} template
         * @return {?}
         */
            function (template) {
                this.template = template;
                try {
                    for (var _a = __values(this.template.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) {
                        var dataElement = _b.value;
                        this.dataElementValues[dataElement.id] = dataElement.currentValue;
                    }
                }
                catch (e_15_1) {
                    e_15 = { error: e_15_1 };
                }
                finally {
                    try {
                        if (_b && !_b.done && (_c = _a.return))
                            _c.call(_a);
                    }
                    finally {
                        if (e_15)
                            throw e_15.error;
                    }
                }
                var e_15, _c;
            };
        SimulatorEngineService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        SimulatorEngineService.ctorParameters = function () { return []; };
        return SimulatorEngineService;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var CoreModule = (function () {
        function CoreModule() {
        }
        /**
         * @return {?}
         */
        CoreModule.forRoot = /**
         * @return {?}
         */
            function () {
                return {
                    ngModule: CoreModule,
                    providers: [SimulatorEngineService]
                };
            };
        CoreModule.decorators = [
            { type: core.NgModule, args: [{
                        imports: [
                            common.CommonModule
                        ],
                        declarations: []
                    },] },
        ];
        return CoreModule;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var Template = (function () {
        function Template() {
        }
        return Template;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var Metadata = (function () {
        function Metadata() {
        }
        return Metadata;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var Diagram = (function () {
        function Diagram() {
        }
        return Diagram;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var ArrayCheckerService = (function () {
        function ArrayCheckerService() {
        }
        /**
         * @param {?} item
         * @return {?}
         */
        ArrayCheckerService.prototype.isArray = /**
         * @param {?} item
         * @return {?}
         */
            function (item) {
                return item instanceof Array;
            };
        ArrayCheckerService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        ArrayCheckerService.ctorParameters = function () { return []; };
        return ArrayCheckerService;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var DiagramService = (function () {
        function DiagramService(arrayCheckerSeviceService) {
            this.arrayCheckerSeviceService = arrayCheckerSeviceService;
        }
        /**
         * @param {?} diagramJSON
         * @return {?}
         */
        DiagramService.prototype.returnDiagram = /**
         * @param {?} diagramJSON
         * @return {?}
         */
            function (diagramJSON) {
                var /** @type {?} */ diagram = new Diagram();
                if (diagramJSON.Attr) {
                    diagram.displaySequence = diagramJSON.Attr.DisplaySequence;
                    diagram.keyDiagram = diagramJSON.Attr.IsKeyDiagram ? diagramJSON.Attr.IsKeyDiagram : false;
                }
                else {
                    diagram.displaySequence = undefined;
                    diagram.keyDiagram = false;
                }
                diagram.label = diagramJSON.Label;
                diagram.location = diagramJSON.Location;
                return diagram;
            };
        /**
         * @param {?} diagramsAsJSON
         * @return {?}
         */
        DiagramService.prototype.returnDiagrams = /**
         * @param {?} diagramsAsJSON
         * @return {?}
         */
            function (diagramsAsJSON) {
                var /** @type {?} */ diagrams = new Array();
                if (diagramsAsJSON !== undefined) {
                    if (this.arrayCheckerSeviceService.isArray(diagramsAsJSON)) {
                        try {
                            for (var diagramsAsJSON_1 = __values(diagramsAsJSON), diagramsAsJSON_1_1 = diagramsAsJSON_1.next(); !diagramsAsJSON_1_1.done; diagramsAsJSON_1_1 = diagramsAsJSON_1.next()) {
                                var diagram = diagramsAsJSON_1_1.value;
                                diagrams.push(this.returnDiagram(diagram));
                            }
                        }
                        catch (e_1_1) {
                            e_1 = { error: e_1_1 };
                        }
                        finally {
                            try {
                                if (diagramsAsJSON_1_1 && !diagramsAsJSON_1_1.done && (_a = diagramsAsJSON_1.return))
                                    _a.call(diagramsAsJSON_1);
                            }
                            finally {
                                if (e_1)
                                    throw e_1.error;
                            }
                        }
                    }
                    else {
                        diagrams.push(this.returnDiagram(diagramsAsJSON));
                    }
                }
                return diagrams;
                var e_1, _a;
            };
        DiagramService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        DiagramService.ctorParameters = function () {
            return [
                { type: ArrayCheckerService }
            ];
        };
        return DiagramService;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var /** @type {?} */ CreationServiceInjectorToken = new core.InjectionToken('one');

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var DecisionPoint = (function () {
        function DecisionPoint() {
        }
        return DecisionPoint;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var Branch = (function () {
        function Branch() {
        }
        return Branch;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var EndPointRef = (function () {
        function EndPointRef() {
        }
        return EndPointRef;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var DataElementRef = (function () {
        function DataElementRef() {
        }
        return DataElementRef;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var NotRelevantDataElements = (function () {
        function NotRelevantDataElements() {
        }
        return NotRelevantDataElements;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var EqualCondition = (function () {
        function EqualCondition(conditionType) {
            this.conditionType = conditionType;
        }
        /**
         * @param {?} dataElementValues
         * @return {?}
         */
        EqualCondition.prototype.evaluate = /**
         * @param {?} dataElementValues
         * @return {?}
         */
            function (dataElementValues) {
                var /** @type {?} */ value = dataElementValues.get(this.conditionType.dataElementId);
                if (value !== undefined) {
                    return value.toUpperCase() === this.conditionType.comparisonValue.toUpperCase();
                }
                return false;
            };
        return EqualCondition;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var ConditionType = (function () {
        function ConditionType() {
        }
        return ConditionType;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var GreaterThanCondition = (function () {
        function GreaterThanCondition(conditionType) {
            this.conditionType = conditionType;
        }
        /**
         * @param {?} dataElementValues
         * @return {?}
         */
        GreaterThanCondition.prototype.evaluate = /**
         * @param {?} dataElementValues
         * @return {?}
         */
            function (dataElementValues) {
                var /** @type {?} */ value = (+dataElementValues.get(this.conditionType.dataElementId));
                var /** @type {?} */ comparisonValue = -1;
                if (isNaN(this.conditionType.comparisonValue)) {
                    comparisonValue = /** @type {?} */ (+dataElementValues.get(this.conditionType.comparisonValue));
                }
                else {
                    comparisonValue = /** @type {?} */ (+this.conditionType.comparisonValue);
                }
                return value > comparisonValue;
            };
        return GreaterThanCondition;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var LessThanCondition = (function () {
        function LessThanCondition(conditionType) {
            this.conditionType = conditionType;
        }
        /**
         * @param {?} dataElementValues
         * @return {?}
         */
        LessThanCondition.prototype.evaluate = /**
         * @param {?} dataElementValues
         * @return {?}
         */
            function (dataElementValues) {
                var /** @type {?} */ value = (+dataElementValues.get(this.conditionType.dataElementId));
                var /** @type {?} */ comparisonValue = -1;
                if (isNaN(this.conditionType.comparisonValue)) {
                    comparisonValue = /** @type {?} */ (+dataElementValues.get(this.conditionType.comparisonValue));
                }
                else {
                    comparisonValue = /** @type {?} */ (+this.conditionType.comparisonValue);
                }
                return value < comparisonValue;
            };
        return LessThanCondition;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var GreaterThanOrEqualsCondition = (function () {
        function GreaterThanOrEqualsCondition(conditionType) {
            this.conditionType = conditionType;
        }
        /**
         * @param {?} dataElementValues
         * @return {?}
         */
        GreaterThanOrEqualsCondition.prototype.evaluate = /**
         * @param {?} dataElementValues
         * @return {?}
         */
            function (dataElementValues) {
                var /** @type {?} */ value = (+dataElementValues.get(this.conditionType.dataElementId));
                var /** @type {?} */ comparisonValue = -1;
                if (isNaN(this.conditionType.comparisonValue)) {
                    comparisonValue = /** @type {?} */ (+dataElementValues.get(this.conditionType.comparisonValue));
                }
                else {
                    comparisonValue = /** @type {?} */ (+this.conditionType.comparisonValue);
                }
                return value >= comparisonValue;
            };
        return GreaterThanOrEqualsCondition;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var LessThanOrEqualsCondition = (function () {
        function LessThanOrEqualsCondition(conditionType) {
            this.conditionType = conditionType;
        }
        /**
         * @param {?} dataElementValues
         * @return {?}
         */
        LessThanOrEqualsCondition.prototype.evaluate = /**
         * @param {?} dataElementValues
         * @return {?}
         */
            function (dataElementValues) {
                var /** @type {?} */ value = (+dataElementValues.get(this.conditionType.dataElementId));
                var /** @type {?} */ comparisonValue = -1;
                if (isNaN(this.conditionType.comparisonValue)) {
                    comparisonValue = /** @type {?} */ (+dataElementValues.get(this.conditionType.comparisonValue));
                }
                else {
                    comparisonValue = /** @type {?} */ (+this.conditionType.comparisonValue);
                }
                return value <= comparisonValue;
            };
        return LessThanOrEqualsCondition;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var ContainsCondition = (function () {
        function ContainsCondition(conditionType) {
            this.conditionType = conditionType;
        }
        /**
         * @param {?} dataElementValues
         * @return {?}
         */
        ContainsCondition.prototype.evaluate = /**
         * @param {?} dataElementValues
         * @return {?}
         */
            function (dataElementValues) {
                var /** @type {?} */ returnValue = false;
                var /** @type {?} */ value = dataElementValues.get(this.conditionType.dataElementId);
                if (value !== undefined) {
                    for (var /** @type {?} */ counter = 0; counter < value.length; counter++) {
                        var /** @type {?} */ value1 = value[counter];
                        if (value1.toUpperCase() === this.conditionType.comparisonValue.toUpperCase()) {
                            returnValue = true;
                        }
                    }
                }
                return returnValue;
            };
        return ContainsCondition;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var AndCondition = (function () {
        function AndCondition() {
            this.conditions = [];
            this.conditionType = 'AndCondition';
        }
        /**
         * @param {?} dataElementValues
         * @return {?}
         */
        AndCondition.prototype.evaluate = /**
         * @param {?} dataElementValues
         * @return {?}
         */
            function (dataElementValues) {
                var /** @type {?} */ returnValue = true;
                for (var /** @type {?} */ conditionCounter = 0; conditionCounter < this.conditions.length; conditionCounter++) {
                    var /** @type {?} */ condition = this.conditions[conditionCounter];
                    var /** @type {?} */ executedCondition = condition.evaluate(dataElementValues);
                    returnValue = (!executedCondition) ? false : (returnValue && executedCondition);
                    if (!returnValue) {
                        break;
                    }
                }
                return returnValue;
            };
        return AndCondition;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var OrCondition = (function () {
        function OrCondition() {
            this.conditions = [];
            this.conditionType = 'OrCondition';
        }
        /**
         * @param {?} dataElementValues
         * @return {?}
         */
        OrCondition.prototype.evaluate = /**
         * @param {?} dataElementValues
         * @return {?}
         */
            function (dataElementValues) {
                var /** @type {?} */ returnValue = false;
                for (var /** @type {?} */ conditionCounter = 0; conditionCounter < this.conditions.length; conditionCounter++) {
                    var /** @type {?} */ condition = this.conditions[conditionCounter];
                    var /** @type {?} */ executedCondition = condition.evaluate(dataElementValues);
                    returnValue = (returnValue || executedCondition);
                    if (returnValue) {
                        break;
                    }
                }
                return returnValue;
            };
        return OrCondition;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var NotCondition = (function () {
        function NotCondition() {
            this.conditions = [];
            this.conditionType = 'NotCondition';
        }
        /**
         * @param {?} dataElementValues
         * @return {?}
         */
        NotCondition.prototype.evaluate = /**
         * @param {?} dataElementValues
         * @return {?}
         */
            function (dataElementValues) {
                var /** @type {?} */ results = new Array();
                try {
                    for (var _a = __values(this.conditions), _b = _a.next(); !_b.done; _b = _a.next()) {
                        var condition = _b.value;
                        results.push(condition.evaluate(dataElementValues));
                    }
                }
                catch (e_1_1) {
                    e_1 = { error: e_1_1 };
                }
                finally {
                    try {
                        if (_b && !_b.done && (_c = _a.return))
                            _c.call(_a);
                    }
                    finally {
                        if (e_1)
                            throw e_1.error;
                    }
                }
                return !(results[0]);
                var e_1, _c;
            };
        return NotCondition;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var ConditionsCreationService = (function () {
        function ConditionsCreationService(arrayCheckerService) {
            this.arrayCheckerService = arrayCheckerService;
        }
        /**
         * @param {?} conditionJSON
         * @return {?}
         */
        ConditionsCreationService.prototype.returnConditionType = /**
         * @param {?} conditionJSON
         * @return {?}
         */
            function (conditionJSON) {
                var /** @type {?} */ conditionType = new ConditionType();
                conditionType.comparisonValue = conditionJSON.Attr.ComparisonValue;
                conditionType.dataElementId = conditionJSON.Attr.DataElementId;
                return conditionType;
            };
        /**
         * @param {?} branchJSON
         * @return {?}
         */
        ConditionsCreationService.prototype.returnCondition = /**
         * @param {?} branchJSON
         * @return {?}
         */
            function (branchJSON) {
                var /** @type {?} */ condition;
                if (branchJSON.hasOwnProperty('EqualCondition')) {
                    condition = new EqualCondition(this.returnConditionType(branchJSON.EqualCondition));
                }
                if (branchJSON.hasOwnProperty('GreaterThanCondition')) {
                    condition = new GreaterThanCondition(this.returnConditionType(branchJSON.GreaterThanCondition));
                }
                if (branchJSON.hasOwnProperty('LessThanCondition')) {
                    condition = new LessThanCondition(this.returnConditionType(branchJSON.LessThanCondition));
                }
                if (branchJSON.hasOwnProperty('GreaterThanOrEqualsCondition')) {
                    condition = new GreaterThanOrEqualsCondition(this.returnConditionType(branchJSON.GreaterThanOrEqualsCondition));
                }
                if (branchJSON.hasOwnProperty('LessThanOrEqualsCondition')) {
                    condition = new LessThanOrEqualsCondition(this.returnConditionType(branchJSON.LessThanOrEqualsCondition));
                }
                if (branchJSON.hasOwnProperty('ContainsCondition')) {
                    condition = new ContainsCondition(this.returnConditionType(branchJSON.ContainsCondition));
                }
                // if (condition !== undefined) {
                //   condition.IsRelevant = branchJSON.IsRelevant !== undefined
                //                          ? branchJSON.IsRelevant : false;
                // }
                // condition.IsRelevant = branchJSON.IsRelevant !== undefined
                //                               ? branchJSON.IsRelevant : true;
                return condition;
            };
        /**
         * @param {?} compositeElementJSON
         * @return {?}
         */
        ConditionsCreationService.prototype.isComposite = /**
         * @param {?} compositeElementJSON
         * @return {?}
         */
            function (compositeElementJSON) {
                return compositeElementJSON.hasOwnProperty('AndCondition') ||
                    compositeElementJSON.hasOwnProperty('OrCondition') ||
                    compositeElementJSON.hasOwnProperty('NotCondition');
            };
        /**
         * @param {?} conditionIdentifier
         * @param {?} conditionJSON
         * @return {?}
         */
        ConditionsCreationService.prototype.returnConditionFromJSON = /**
         * @param {?} conditionIdentifier
         * @param {?} conditionJSON
         * @return {?}
         */
            function (conditionIdentifier, conditionJSON) {
                var /** @type {?} */ condition;
                if (conditionIdentifier === 'EqualCondition') {
                    condition = new EqualCondition(this.returnConditionType(conditionJSON));
                }
                if (conditionIdentifier === 'GreaterThanCondition') {
                    condition = new GreaterThanCondition(this.returnConditionType(conditionJSON));
                }
                if (conditionIdentifier === 'LessThanCondition') {
                    condition = new LessThanCondition(this.returnConditionType(conditionJSON));
                }
                if (conditionIdentifier === 'GreaterThanOrEqualsCondition') {
                    condition = new GreaterThanOrEqualsCondition(this.returnConditionType(conditionJSON));
                }
                if (conditionIdentifier === 'LessThanOrEqualsCondition') {
                    condition = new LessThanOrEqualsCondition(this.returnConditionType(conditionJSON));
                }
                if (conditionIdentifier === 'ContainsCondition') {
                    condition = new ContainsCondition(this.returnConditionType(conditionJSON));
                }
                return condition;
            };
        /**
         * @param {?} conditionsJSON
         * @return {?}
         */
        ConditionsCreationService.prototype.returnConditions = /**
         * @param {?} conditionsJSON
         * @return {?}
         */
            function (conditionsJSON) {
                var /** @type {?} */ conditions;
                var /** @type {?} */ conditionIdentifiers = ['EqualCondition', 'GreaterThanCondition', 'LessThanCondition',
                    'GreaterThanOrEqualsCondition', 'LessThanOrEqualsCondition', 'ContainsCondition'];
                try {
                    for (var conditionIdentifiers_1 = __values(conditionIdentifiers), conditionIdentifiers_1_1 = conditionIdentifiers_1.next(); !conditionIdentifiers_1_1.done; conditionIdentifiers_1_1 = conditionIdentifiers_1.next()) {
                        var conditionIdentifier = conditionIdentifiers_1_1.value;
                        var /** @type {?} */ conditionJSON = conditionsJSON[conditionIdentifier];
                        if (conditionJSON !== undefined) {
                            conditions = new Array();
                            if (this.arrayCheckerService.isArray(conditionJSON)) {
                                try {
                                    for (var conditionJSON_1 = __values(conditionJSON), conditionJSON_1_1 = conditionJSON_1.next(); !conditionJSON_1_1.done; conditionJSON_1_1 = conditionJSON_1.next()) {
                                        var jsonValue = conditionJSON_1_1.value;
                                        conditions.push(this.returnConditionFromJSON(conditionIdentifier, jsonValue));
                                    }
                                }
                                catch (e_1_1) {
                                    e_1 = { error: e_1_1 };
                                }
                                finally {
                                    try {
                                        if (conditionJSON_1_1 && !conditionJSON_1_1.done && (_a = conditionJSON_1.return))
                                            _a.call(conditionJSON_1);
                                    }
                                    finally {
                                        if (e_1)
                                            throw e_1.error;
                                    }
                                }
                            }
                            else {
                                conditions.push(this.returnConditionFromJSON(conditionIdentifier, conditionJSON));
                            }
                        }
                    }
                }
                catch (e_2_1) {
                    e_2 = { error: e_2_1 };
                }
                finally {
                    try {
                        if (conditionIdentifiers_1_1 && !conditionIdentifiers_1_1.done && (_b = conditionIdentifiers_1.return))
                            _b.call(conditionIdentifiers_1);
                    }
                    finally {
                        if (e_2)
                            throw e_2.error;
                    }
                }
                return conditions;
                var e_2, _b, e_1, _a;
            };
        /**
         * @param {?} compositeElementJSON
         * @return {?}
         */
        ConditionsCreationService.prototype.isHybrid = /**
         * @param {?} compositeElementJSON
         * @return {?}
         */
            function (compositeElementJSON) {
                var /** @type {?} */ compositeExists = compositeElementJSON.hasOwnProperty('AndCondition') ||
                    compositeElementJSON.hasOwnProperty('OrCondition') ||
                    compositeElementJSON.hasOwnProperty('NotCondition');
                var /** @type {?} */ primitiveExists = compositeElementJSON.hasOwnProperty('EqualCondition') ||
                    compositeElementJSON.hasOwnProperty('GreaterThanCondition') ||
                    compositeElementJSON.hasOwnProperty('LessThanCondition') ||
                    compositeElementJSON.hasOwnProperty('GreaterThanOrEqualsCondition') ||
                    compositeElementJSON.hasOwnProperty('LessThanOrEqualsCondition') ||
                    compositeElementJSON.hasOwnProperty('ContainsCondition');
                return compositeExists && primitiveExists;
            };
        /**
         * @param {?} data
         * @return {?}
         */
        ConditionsCreationService.prototype.returnCompositeCondition = /**
         * @param {?} data
         * @return {?}
         */
            function (data) {
                if (!this.isComposite(data)) {
                    return;
                }
                var /** @type {?} */ compositeConditionJSON;
                var /** @type {?} */ compositeCondition;
                if (data.hasOwnProperty('AndCondition')) {
                    compositeConditionJSON = data.AndCondition;
                    compositeCondition = new AndCondition();
                }
                else if (data.hasOwnProperty('OrCondition')) {
                    compositeConditionJSON = data.OrCondition;
                    compositeCondition = new OrCondition();
                }
                else if (data.hasOwnProperty('NotCondition')) {
                    compositeConditionJSON = data.NotCondition;
                    compositeCondition = new NotCondition();
                }
                // if (data.hasOwnProperty('IsRelevant')){
                //   compositeConditionJSON += data.IsRelevant;
                // }
                if (!this.isComposite(compositeConditionJSON)) {
                    compositeCondition.conditions = this.returnConditions(compositeConditionJSON);
                }
                else if (this.isHybrid(compositeConditionJSON)) {
                    var /** @type {?} */ jsonKeys = Object.keys(compositeConditionJSON);
                    try {
                        for (var jsonKeys_1 = __values(jsonKeys), jsonKeys_1_1 = jsonKeys_1.next(); !jsonKeys_1_1.done; jsonKeys_1_1 = jsonKeys_1.next()) {
                            var jsonKey = jsonKeys_1_1.value;
                            var /** @type {?} */ jsonValue = compositeConditionJSON[jsonKey];
                            var /** @type {?} */ jsonString = '{"' + jsonKey + '":' + JSON.stringify(jsonValue) + '}';
                            var /** @type {?} */ jsonObject = JSON.parse(jsonString);
                            if (this.isComposite(jsonObject)) {
                                this.returnInnerConditions(jsonObject, compositeCondition);
                            }
                            else {
                                if (this.arrayCheckerService.isArray(jsonValue)) {
                                    try {
                                        for (var jsonValue_1 = __values(jsonValue), jsonValue_1_1 = jsonValue_1.next(); !jsonValue_1_1.done; jsonValue_1_1 = jsonValue_1.next()) {
                                            var arrayValue = jsonValue_1_1.value;
                                            compositeCondition.conditions.push(this.returnConditionFromJSON(jsonKey, arrayValue));
                                        }
                                    }
                                    catch (e_3_1) {
                                        e_3 = { error: e_3_1 };
                                    }
                                    finally {
                                        try {
                                            if (jsonValue_1_1 && !jsonValue_1_1.done && (_a = jsonValue_1.return))
                                                _a.call(jsonValue_1);
                                        }
                                        finally {
                                            if (e_3)
                                                throw e_3.error;
                                        }
                                    }
                                }
                                else {
                                    compositeCondition.conditions.push(this.returnConditionFromJSON(jsonKey, jsonValue));
                                }
                            }
                        }
                    }
                    catch (e_4_1) {
                        e_4 = { error: e_4_1 };
                    }
                    finally {
                        try {
                            if (jsonKeys_1_1 && !jsonKeys_1_1.done && (_b = jsonKeys_1.return))
                                _b.call(jsonKeys_1);
                        }
                        finally {
                            if (e_4)
                                throw e_4.error;
                        }
                    }
                }
                else {
                    this.returnInnerConditions(compositeConditionJSON, compositeCondition);
                }
                return compositeCondition;
                var e_4, _b, e_3, _a;
            };
        /**
         * @param {?} elementName
         * @return {?}
         */
        ConditionsCreationService.prototype.returnCompositeConditionFromName = /**
         * @param {?} elementName
         * @return {?}
         */
            function (elementName) {
                var /** @type {?} */ compositeCondition;
                switch (elementName) {
                    case 'AndCondition':
                        {
                            compositeCondition = new AndCondition();
                            break;
                        }
                    case 'OrCondition':
                        {
                            compositeCondition = new OrCondition();
                            break;
                        }
                    case 'NotCondition':
                        {
                            compositeCondition = new NotCondition();
                        }
                }
                return compositeCondition;
            };
        /**
         * @param {?} key
         * @param {?} value
         * @param {?} compositeCondition
         * @return {?}
         */
        ConditionsCreationService.prototype.addConditionsToInnerConditions = /**
         * @param {?} key
         * @param {?} value
         * @param {?} compositeCondition
         * @return {?}
         */
            function (key, value, compositeCondition) {
                var /** @type {?} */ condition = this.returnCompositeConditionFromName(key);
                compositeCondition.conditions.push(condition);
                if (this.isHybrid(value)) {
                    var /** @type {?} */ jsonKeys = Object.keys(value);
                    try {
                        for (var jsonKeys_2 = __values(jsonKeys), jsonKeys_2_1 = jsonKeys_2.next(); !jsonKeys_2_1.done; jsonKeys_2_1 = jsonKeys_2.next()) {
                            var jsonKey = jsonKeys_2_1.value;
                            var /** @type {?} */ jsonValue = value[jsonKey];
                            var /** @type {?} */ jsonString = '{"' + jsonKey + '":' + JSON.stringify(jsonValue) + '}';
                            var /** @type {?} */ jsonObject = JSON.parse(jsonString);
                            if (this.isComposite(jsonObject)) {
                                this.returnInnerConditions(jsonObject, condition);
                            }
                            else {
                                if (this.arrayCheckerService.isArray(jsonValue)) {
                                    try {
                                        for (var jsonValue_2 = __values(jsonValue), jsonValue_2_1 = jsonValue_2.next(); !jsonValue_2_1.done; jsonValue_2_1 = jsonValue_2.next()) {
                                            var arrayValue = jsonValue_2_1.value;
                                            condition.conditions.push(this.returnConditionFromJSON(jsonKey, arrayValue));
                                        }
                                    }
                                    catch (e_5_1) {
                                        e_5 = { error: e_5_1 };
                                    }
                                    finally {
                                        try {
                                            if (jsonValue_2_1 && !jsonValue_2_1.done && (_a = jsonValue_2.return))
                                                _a.call(jsonValue_2);
                                        }
                                        finally {
                                            if (e_5)
                                                throw e_5.error;
                                        }
                                    }
                                }
                                else {
                                    condition.conditions.push(this.returnConditionFromJSON(jsonKey, jsonValue));
                                }
                            }
                        }
                    }
                    catch (e_6_1) {
                        e_6 = { error: e_6_1 };
                    }
                    finally {
                        try {
                            if (jsonKeys_2_1 && !jsonKeys_2_1.done && (_b = jsonKeys_2.return))
                                _b.call(jsonKeys_2);
                        }
                        finally {
                            if (e_6)
                                throw e_6.error;
                        }
                    }
                }
                else if (this.isComposite(value)) ;
                else {
                    condition.conditions = this.returnConditions(value);
                }
                var e_6, _b, e_5, _a;
            };
        /**
         * @param {?} innerConditionsJSON
         * @param {?} compositeCondition
         * @return {?}
         */
        ConditionsCreationService.prototype.returnInnerConditions = /**
         * @param {?} innerConditionsJSON
         * @param {?} compositeCondition
         * @return {?}
         */
            function (innerConditionsJSON, compositeCondition) {
                var /** @type {?} */ jsonKeys = Object.keys(innerConditionsJSON);
                try {
                    for (var jsonKeys_3 = __values(jsonKeys), jsonKeys_3_1 = jsonKeys_3.next(); !jsonKeys_3_1.done; jsonKeys_3_1 = jsonKeys_3.next()) {
                        var key = jsonKeys_3_1.value;
                        var /** @type {?} */ values = innerConditionsJSON[key];
                        if (this.arrayCheckerService.isArray(values)) {
                            try {
                                for (var values_1 = __values(values), values_1_1 = values_1.next(); !values_1_1.done; values_1_1 = values_1.next()) {
                                    var value = values_1_1.value;
                                    this.addConditionsToInnerConditions(key, value, compositeCondition);
                                }
                            }
                            catch (e_7_1) {
                                e_7 = { error: e_7_1 };
                            }
                            finally {
                                try {
                                    if (values_1_1 && !values_1_1.done && (_a = values_1.return))
                                        _a.call(values_1);
                                }
                                finally {
                                    if (e_7)
                                        throw e_7.error;
                                }
                            }
                        }
                        else {
                            this.addConditionsToInnerConditions(key, innerConditionsJSON[key], compositeCondition);
                        }
                    }
                }
                catch (e_8_1) {
                    e_8 = { error: e_8_1 };
                }
                finally {
                    try {
                        if (jsonKeys_3_1 && !jsonKeys_3_1.done && (_b = jsonKeys_3.return))
                            _b.call(jsonKeys_3);
                    }
                    finally {
                        if (e_8)
                            throw e_8.error;
                    }
                }
                var e_8, _b, e_7, _a;
            };
        ConditionsCreationService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        ConditionsCreationService.ctorParameters = function () {
            return [
                { type: ArrayCheckerService }
            ];
        };
        return ConditionsCreationService;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var TextExpression = (function () {
        function TextExpression() {
        }
        return TextExpression;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var ComputedValueCreationService = (function () {
        function ComputedValueCreationService() {
        }
        /**
         * @param {?} dataAsJSON
         * @return {?}
         */
        ComputedValueCreationService.prototype.createComputedValue = /**
         * @param {?} dataAsJSON
         * @return {?}
         */
            function (dataAsJSON) {
                if (dataAsJSON['TextExpression'] !== undefined) {
                    var /** @type {?} */ computedValue = new TextExpression();
                    computedValue.expressionText = dataAsJSON.TextExpression;
                    return computedValue;
                }
                if (dataAsJSON['ArithmeticExpression'] !== undefined) {
                    {
                        var /** @type {?} */ computedValue = new ArithmeticExpression();
                        computedValue.expressionText = dataAsJSON.ArithmeticExpression;
                        return computedValue;
                    }
                }
            };
        ComputedValueCreationService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        ComputedValueCreationService.ctorParameters = function () { return []; };
        return ComputedValueCreationService;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var DecisionPointsCreationService = (function () {
        function DecisionPointsCreationService(arrayCheckerService, conditionsCreationService, computedValueCreationService) {
            this.arrayCheckerService = arrayCheckerService;
            this.conditionsCreationService = conditionsCreationService;
            this.computedValueCreationService = computedValueCreationService;
        }
        /**
         * @param {?} dataElementRefJSON
         * @return {?}
         */
        DecisionPointsCreationService.prototype.createRelevantDataElementReferences = /**
         * @param {?} dataElementRefJSON
         * @return {?}
         */
            function (dataElementRefJSON) {
                var /** @type {?} */ dataElementRef = new DataElementRef();
                dataElementRef.dataElementId = dataElementRefJSON.Attr.DataElementId;
                return dataElementRef;
            };
        /**
         * @param {?} branchJSON
         * @return {?}
         */
        DecisionPointsCreationService.prototype.returnBranch = /**
         * @param {?} branchJSON
         * @return {?}
         */
            function (branchJSON) {
                var /** @type {?} */ branch = new Branch();
                branch.label = branchJSON.Label;
                if (branchJSON.EndPointRef) {
                    branch.endPointRef = new EndPointRef();
                    branch.endPointRef.endPointId = branchJSON.EndPointRef.Attr.EndPointId;
                }
                branch.condition = this.conditionsCreationService.returnCondition(branchJSON);
                branch.computedValue = this.computedValueCreationService.createComputedValue(branchJSON);
                if (this.conditionsCreationService.isComposite(branchJSON)) {
                    branch.compositeCondition = this.conditionsCreationService.returnCompositeCondition(branchJSON);
                }
                if (branchJSON.NotRelevantDataElements) {
                    var /** @type {?} */ notRelevantDataElements = new NotRelevantDataElements();
                    notRelevantDataElements.dataElementReferences = new Array();
                    var /** @type {?} */ dataElementRefs = branchJSON.NotRelevantDataElements.DataElementRef;
                    if (this.arrayCheckerService.isArray(dataElementRefs)) {
                        try {
                            for (var dataElementRefs_1 = __values(dataElementRefs), dataElementRefs_1_1 = dataElementRefs_1.next(); !dataElementRefs_1_1.done; dataElementRefs_1_1 = dataElementRefs_1.next()) {
                                var dataElementRefJSON = dataElementRefs_1_1.value;
                                notRelevantDataElements.dataElementReferences.push(this.createRelevantDataElementReferences(dataElementRefJSON));
                            }
                        }
                        catch (e_1_1) {
                            e_1 = { error: e_1_1 };
                        }
                        finally {
                            try {
                                if (dataElementRefs_1_1 && !dataElementRefs_1_1.done && (_a = dataElementRefs_1.return))
                                    _a.call(dataElementRefs_1);
                            }
                            finally {
                                if (e_1)
                                    throw e_1.error;
                            }
                        }
                    }
                    else {
                        notRelevantDataElements.dataElementReferences.push(this.createRelevantDataElementReferences(dataElementRefs));
                    }
                    branch.notRelevantDataElements = notRelevantDataElements;
                }
                if (branchJSON.DecisionPoint) {
                    branch.decisionPoints = new Array();
                    this.addDecisionPoints(branchJSON.DecisionPoint, branch.decisionPoints);
                }
                return branch;
                var e_1, _a;
            };
        /**
         * @param {?} decsionPointAsJSON
         * @param {?} decisionPoints
         * @return {?}
         */
        DecisionPointsCreationService.prototype.addDecisionPoint = /**
         * @param {?} decsionPointAsJSON
         * @param {?} decisionPoints
         * @return {?}
         */
            function (decsionPointAsJSON, decisionPoints) {
                var /** @type {?} */ decisionPoint = new DecisionPoint();
                if (decsionPointAsJSON.Attr && decsionPointAsJSON.Attr.Id) {
                    decisionPoint.id = decsionPointAsJSON.Attr.Id;
                }
                decisionPoint.label = decsionPointAsJSON.Label;
                var /** @type {?} */ branchesJSON = decsionPointAsJSON.Branch;
                if (branchesJSON !== undefined) {
                    decisionPoint.branches = new Array();
                    if (this.arrayCheckerService.isArray(branchesJSON)) {
                        try {
                            for (var branchesJSON_1 = __values(branchesJSON), branchesJSON_1_1 = branchesJSON_1.next(); !branchesJSON_1_1.done; branchesJSON_1_1 = branchesJSON_1.next()) {
                                var branchJSON = branchesJSON_1_1.value;
                                decisionPoint.branches.push(this.returnBranch(branchJSON));
                            }
                        }
                        catch (e_2_1) {
                            e_2 = { error: e_2_1 };
                        }
                        finally {
                            try {
                                if (branchesJSON_1_1 && !branchesJSON_1_1.done && (_a = branchesJSON_1.return))
                                    _a.call(branchesJSON_1);
                            }
                            finally {
                                if (e_2)
                                    throw e_2.error;
                            }
                        }
                    }
                    else {
                        decisionPoint.branches.push(this.returnBranch(branchesJSON));
                    }
                    var /** @type {?} */ defaultBranchJSON = decsionPointAsJSON.DefaultBranch;
                    if (defaultBranchJSON !== undefined) {
                        decisionPoint.defaultBranch = this.createDefaultBranch(defaultBranchJSON);
                    }
                }
                decisionPoints.push(decisionPoint);
                var e_2, _a;
            };
        /**
         * @param {?} decsionPointsAsJSON
         * @param {?} decisionPoints
         * @return {?}
         */
        DecisionPointsCreationService.prototype.addDecisionPoints = /**
         * @param {?} decsionPointsAsJSON
         * @param {?} decisionPoints
         * @return {?}
         */
            function (decsionPointsAsJSON, decisionPoints) {
                if (this.arrayCheckerService.isArray(decsionPointsAsJSON)) {
                    try {
                        for (var decsionPointsAsJSON_1 = __values(decsionPointsAsJSON), decsionPointsAsJSON_1_1 = decsionPointsAsJSON_1.next(); !decsionPointsAsJSON_1_1.done; decsionPointsAsJSON_1_1 = decsionPointsAsJSON_1.next()) {
                            var decisionPoint = decsionPointsAsJSON_1_1.value;
                            this.addDecisionPoint(decisionPoint, decisionPoints);
                        }
                    }
                    catch (e_3_1) {
                        e_3 = { error: e_3_1 };
                    }
                    finally {
                        try {
                            if (decsionPointsAsJSON_1_1 && !decsionPointsAsJSON_1_1.done && (_a = decsionPointsAsJSON_1.return))
                                _a.call(decsionPointsAsJSON_1);
                        }
                        finally {
                            if (e_3)
                                throw e_3.error;
                        }
                    }
                }
                else {
                    this.addDecisionPoint(decsionPointsAsJSON, decisionPoints);
                }
                var e_3, _a;
            };
        /**
         * @param {?} data
         * @return {?}
         */
        DecisionPointsCreationService.prototype.createDecisionPoints = /**
         * @param {?} data
         * @return {?}
         */
            function (data) {
                var /** @type {?} */ decisionPoints = new Array();
                this.addDecisionPoints(data, decisionPoints);
                return decisionPoints;
            };
        /**
         * @param {?} data
         * @return {?}
         */
        DecisionPointsCreationService.prototype.createDefaultBranch = /**
         * @param {?} data
         * @return {?}
         */
            function (data) {
                var /** @type {?} */ defaultBranch = new Branch();
                defaultBranch.label = 'Default Branch';
                defaultBranch.computedValue = this.computedValueCreationService.createComputedValue(data);
                return defaultBranch;
            };
        DecisionPointsCreationService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        DecisionPointsCreationService.ctorParameters = function () {
            return [
                { type: ArrayCheckerService },
                { type: ConditionsCreationService },
                { type: ComputedValueCreationService }
            ];
        };
        return DecisionPointsCreationService;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var Rules = (function () {
        function Rules() {
        }
        return Rules;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var TemplatePartial = (function () {
        function TemplatePartial() {
        }
        return TemplatePartial;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var TemplateManagerService = (function () {
        function TemplateManagerService(diagramService, elememtcreationService, arrayCheckerService, decisionPointsCreationService) {
            this.diagramService = diagramService;
            this.elememtcreationService = elememtcreationService;
            this.arrayCheckerService = arrayCheckerService;
            this.decisionPointsCreationService = decisionPointsCreationService;
            this.endPointXMLString = [];
            this.stringParser = require('string');
        }
        /**
         * @param {?} templateContent
         * @return {?}
         */
        TemplateManagerService.prototype.getTemplate = /**
         * @param {?} templateContent
         * @return {?}
         */
            function (templateContent) {
                var /** @type {?} */ template = new Template();
                var /** @type {?} */ templateContentAsJSON;
                templateContentAsJSON = this.parseToJson(templateContent);
                if (template === undefined) {
                    throw new Error('Unable to parse the template');
                }
                template.metadata = this.getMetaData(templateContentAsJSON.Metadata);
                template.dataElements = this.getDataElements(templateContentAsJSON.DataElements);
                if (templateContentAsJSON.Rules) {
                    template.rules = new Rules();
                    template.rules.decisionPoints = this.decisionPointsCreationService.
                        createDecisionPoints(templateContentAsJSON.Rules.DecisionPoint);
                }
                template.templatePartial = this.returnEndpoints(templateContent);
                template.endPointsString = this.endPointXMLString;
                template.xmlContent = templateContent;
                // console.log(template.templatePartial);
                //console.log(template.endPointsString);
                return template;
            };
        /**
         * @param {?} templatePartialJSON
         * @return {?}
         */
        TemplateManagerService.prototype.getTemplatePartial = /**
         * @param {?} templatePartialJSON
         * @return {?}
         */
            function (templatePartialJSON) {
                var /** @type {?} */ templatePartial = new TemplatePartial;
                templatePartial.id = templatePartialJSON.Attr.Id;
                templatePartial.sectionIfNotValue = templatePartialJSON.SectionIfValueNot;
                templatePartial.sectionIfValues = templatePartialJSON.SectionIfValue;
                return templatePartial;
            };
        /**
         * @param {?} content
         * @param {?} startToken
         * @param {?} endToken
         * @return {?}
         */
        TemplateManagerService.prototype.returnEndPointContents = /**
         * @param {?} content
         * @param {?} startToken
         * @param {?} endToken
         * @return {?}
         */
            function (content, startToken, endToken) {
                var /** @type {?} */ contents = new Array();
                var /** @type {?} */ templateSearchIndexPosition = 0;
                while (true) {
                    var /** @type {?} */ contentStartPosition = content.indexOf(startToken, templateSearchIndexPosition);
                    var /** @type {?} */ contentEndPosition = content.indexOf(endToken, templateSearchIndexPosition);
                    if (contentStartPosition >= 0 && contentEndPosition >= 0) {
                        var /** @type {?} */ endPosition = contentEndPosition + endToken.length;
                        var /** @type {?} */ contentData = content.substring(contentStartPosition, endPosition);
                        contents.push(contentData);
                        templateSearchIndexPosition = endPosition + 1;
                    }
                    else {
                        break;
                    }
                }
                return contents;
            };
        /**
         * @param {?} templatePartialArray
         * @return {?}
         */
        TemplateManagerService.prototype.returnTemplatePartials = /**
         * @param {?} templatePartialArray
         * @return {?}
         */
            function (templatePartialArray) {
                var /** @type {?} */ templatePartials = new Array();
                try {
                    for (var templatePartialArray_1 = __values(templatePartialArray), templatePartialArray_1_1 = templatePartialArray_1.next(); !templatePartialArray_1_1.done; templatePartialArray_1_1 = templatePartialArray_1.next()) {
                        var arrayItem = templatePartialArray_1_1.value;
                        var /** @type {?} */ templatePartial = new TemplatePartial();
                        var /** @type {?} */ templatePartialAsJSON = this.parseToJson(arrayItem);
                        templatePartial.id = templatePartialAsJSON.Attr.Id;
                    }
                }
                catch (e_1_1) {
                    e_1 = { error: e_1_1 };
                }
                finally {
                    try {
                        if (templatePartialArray_1_1 && !templatePartialArray_1_1.done && (_a = templatePartialArray_1.return))
                            _a.call(templatePartialArray_1);
                    }
                    finally {
                        if (e_1)
                            throw e_1.error;
                    }
                }
                return templatePartials;
                var e_1, _a;
            };
        /**
         * @param {?} xmlData
         * @return {?}
         */
        TemplateManagerService.prototype.returnEndpoints = /**
         * @param {?} xmlData
         * @return {?}
         */
            function (xmlData) {
                var /** @type {?} */ endPointStartToken = '<EndPoints>';
                var /** @type {?} */ endPointEndToken = '</EndPoints>';
                var /** @type {?} */ endPointStartTokenPosition = xmlData.indexOf(endPointStartToken);
                var /** @type {?} */ endPointEndTokenPosition = xmlData.indexOf(endPointEndToken);
                if (endPointStartTokenPosition >= 0 && endPointEndTokenPosition >= 0) {
                    var /** @type {?} */ contentStartPosition = (endPointStartTokenPosition + endPointStartToken.length);
                    var /** @type {?} */ endPointContent = xmlData.substring(contentStartPosition, endPointEndTokenPosition);
                    if (endPointContent.length > 0) {
                        var /** @type {?} */ templatePartials = this.returnEndPointContents(endPointContent, '<TemplatePartial', '</TemplatePartial>');
                        this.endPointXMLString = this.returnEndPointContents(endPointContent, '<EndPoint', '</EndPoint>');
                        return templatePartials;
                    }
                }
            };
        /**
         * @param {?} xmlData
         * @return {?}
         */
        TemplateManagerService.prototype.parseToJson = /**
         * @param {?} xmlData
         * @return {?}
         */
            function (xmlData) {
                var /** @type {?} */ jsonResult;
                var /** @type {?} */ parseString = require('xml2js').parseString;
                parseString(xmlData, { explicitRoot: false, explicitArray: false, attrkey: 'Attr' }, function (err, result) {
                    jsonResult = result;
                });
                return jsonResult;
            };
        /**
         * @param {?} metadataJSON
         * @return {?}
         */
        TemplateManagerService.prototype.getMetaData = /**
         * @param {?} metadataJSON
         * @return {?}
         */
            function (metadataJSON) {
                var /** @type {?} */ metadata = new Metadata();
                metadata.label = metadataJSON.Label;
                metadata.id = metadataJSON.ID;
                metadata.schemaVersion = metadataJSON.SchemaVersion;
                metadata.ruleVersion = metadataJSON.RuleVersion;
                var /** @type {?} */ diagramsAsJSON = metadataJSON.Info.Diagrams.Diagram;
                metadata.diagrams = this.diagramService.returnDiagrams(diagramsAsJSON);
                metadata.approvedBy = metadataJSON.ApprovedBy;
                metadata.createdDate = metadataJSON.CreatedDate;
                metadata.lastModifiedDate = metadataJSON.LastModifiedDate;
                metadata.reviewedBy = metadataJSON.ReviewedBy;
                metadata.developedBy = metadataJSON.DevelopedBy;
                metadata.radElementSetID = metadataJSON.RadElementSetID;
                return metadata;
            };
        /**
         * @param {?} elementType
         * @param {?} dataElementsJSON
         * @return {?}
         */
        TemplateManagerService.prototype.returnDataElement = /**
         * @param {?} elementType
         * @param {?} dataElementsJSON
         * @return {?}
         */
            function (elementType, dataElementsJSON) {
                var /** @type {?} */ dataElements = new Array();
                var /** @type {?} */ dataElementCreationServiceInstance;
                try {
                    for (var _a = __values(this.elememtcreationService), _b = _a.next(); !_b.done; _b = _a.next()) {
                        var dataElementCreationService = _b.value;
                        if (dataElementCreationService.elementType === elementType) {
                            dataElementCreationServiceInstance = dataElementCreationService;
                            break;
                        }
                    }
                }
                catch (e_2_1) {
                    e_2 = { error: e_2_1 };
                }
                finally {
                    try {
                        if (_b && !_b.done && (_c = _a.return))
                            _c.call(_a);
                    }
                    finally {
                        if (e_2)
                            throw e_2.error;
                    }
                }
                if (dataElementCreationServiceInstance !== undefined && dataElementsJSON !== undefined) {
                    if (this.arrayCheckerService.isArray(dataElementsJSON)) {
                        try {
                            for (var dataElementsJSON_1 = __values(dataElementsJSON), dataElementsJSON_1_1 = dataElementsJSON_1.next(); !dataElementsJSON_1_1.done; dataElementsJSON_1_1 = dataElementsJSON_1.next()) {
                                var dataElementJSON = dataElementsJSON_1_1.value;
                                var /** @type {?} */ dataElement = dataElementCreationServiceInstance.createElement(dataElementJSON);
                                dataElements.push(dataElement);
                            }
                        }
                        catch (e_3_1) {
                            e_3 = { error: e_3_1 };
                        }
                        finally {
                            try {
                                if (dataElementsJSON_1_1 && !dataElementsJSON_1_1.done && (_d = dataElementsJSON_1.return))
                                    _d.call(dataElementsJSON_1);
                            }
                            finally {
                                if (e_3)
                                    throw e_3.error;
                            }
                        }
                    }
                    else {
                        var /** @type {?} */ dataElement = dataElementCreationServiceInstance.createElement(dataElementsJSON);
                        dataElements.push(dataElement);
                    }
                }
                return dataElements;
                var e_2, _c, e_3, _d;
            };
        /**
         * @param {?} dataElementsJSON
         * @return {?}
         */
        TemplateManagerService.prototype.getDataElements = /**
         * @param {?} dataElementsJSON
         * @return {?}
         */
            function (dataElementsJSON) {
                var /** @type {?} */ dataElements = new Array();
                dataElements = dataElements.concat(this.returnDataElement('ChoiceDataElement', dataElementsJSON.ChoiceDataElement));
                dataElements = dataElements.concat(this.returnDataElement('MultiChoiceDataElement', dataElementsJSON.MultiChoiceDataElement));
                dataElements = dataElements.concat(this.returnDataElement('NumericDataElement', dataElementsJSON.NumericDataElement));
                dataElements = dataElements.concat(this.returnDataElement('GlobalValue', dataElementsJSON.GlobalValue));
                dataElements = dataElements.concat(this.returnDataElement('ComputedDataElement', dataElementsJSON.ComputedDataElement));
                dataElements = dataElements.concat(this.returnDataElement('IntegerDataElement', dataElementsJSON.IntegerDataElement));
                dataElements = dataElements.concat(this.returnDataElement('DateTimeDataElement', dataElementsJSON.DateTimeDataElement));
                dataElements = dataElements.concat(this.returnDataElement('DurationDataElement', dataElementsJSON.TimeSpanDataElement));
                return dataElements;
            };
        TemplateManagerService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        TemplateManagerService.ctorParameters = function () {
            return [
                { type: DiagramService },
                { type: Array, decorators: [{ type: core.Inject, args: [CreationServiceInjectorToken,] }] },
                { type: ArrayCheckerService },
                { type: DecisionPointsCreationService }
            ];
        };
        return TemplateManagerService;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var AllTextReport = (function () {
        function AllTextReport() {
        }
        return AllTextReport;
    }());
    /** @enum {number} */
    var ReportTextPosition = {
        Top: 0,
        Right: 1,
    };
    ReportTextPosition[ReportTextPosition.Top] = "Top";
    ReportTextPosition[ReportTextPosition.Right] = "Right";

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var /** @type {?} */ $ = require('jquery');
    var AcrAssistSimulatorComponent = (function () {
        function AcrAssistSimulatorComponent(templateManagerService, simulatorEngineService) {
            this.templateManagerService = templateManagerService;
            this.simulatorEngineService = simulatorEngineService;
            this.inputValues = [];
            this.resetButton = true;
            this.returnExecutionHistory = new core.EventEmitter();
            this.returnDataElementChanged = new core.EventEmitter();
            this.returnDefaultElements = new core.EventEmitter();
            this.position = ReportTextPosition;
            this.acceptedFileTypes = ['image/png', 'image/gif', 'image/jpg', 'image/jpeg'];
        }
        /**
         * @param {?} changes
         * @return {?}
         */
        AcrAssistSimulatorComponent.prototype.ngOnChanges = /**
         * @param {?} changes
         * @return {?}
         */
            function (changes) {
                this.isReset = true;
                this.isEmptyContent = this.templateContent === undefined || this.templateContent.length === 0 && this.inputValues.length === 0 &&
                    this.inputData === undefined;
                if (this.isEmptyContent) {
                    return;
                }
                if (this.inputData !== undefined) {
                    if (this.inputData.length > 0) {
                        this.inputValues = JSON.parse(this.inputData);
                    }
                }
                if (this.imageUpload !== undefined) {
                    this.imageUpload.nativeElement.value = '';
                }
                this.template = this.templateManagerService.getTemplate(this.templateContent);
                // this.simulatorEngineService.initialize(this.template);
                if (this.inputValues.length !== 0) {
                    this.populateTestCaseData();
                }
                this.simulatorEngineService.initialize(this.template);
                this.dataElements = this.template.dataElements;
                this.keyDiagrams = new Array();
                for (var /** @type {?} */ index = 0; index < this.template.metadata.diagrams.length; index++) {
                    var /** @type {?} */ element = new Diagram();
                    element.label = this.template.metadata.diagrams[index].label;
                    element.location = this.imagePath + '/' + this.template.metadata.diagrams[index].location;
                    element.keyDiagram = this.template.metadata.diagrams[index].keyDiagram;
                    this.keyDiagrams.push(element);
                }
                this.resultText = undefined;
            };
        /**
         * @return {?}
         */
        AcrAssistSimulatorComponent.prototype.resetElements = /**
         * @return {?}
         */
            function () {
                this.template = this.templateManagerService.getTemplate(this.templateContent);
                this.simulatorEngineService.initialize(this.template);
                this.dataElements = Object.assign({}, this.template.dataElements);
                this.resultText = undefined;
                this.returnDefaultElements.emit();
            };
        /**
         * @param {?} textReport
         * @return {?}
         */
        AcrAssistSimulatorComponent.prototype.recieveReportText = /**
         * @param {?} textReport
         * @return {?}
         */
            function (textReport) {
                this.resultText = textReport;
            };
        /**
         * @param {?} finalExecutionHistory
         * @return {?}
         */
        AcrAssistSimulatorComponent.prototype.recievedExecutionHistory = /**
         * @param {?} finalExecutionHistory
         * @return {?}
         */
            function (finalExecutionHistory) {
                this.returnExecutionHistory.emit(finalExecutionHistory);
            };
        /**
         * @param {?} data
         * @return {?}
         */
        AcrAssistSimulatorComponent.prototype.recivedOnDataElementChanged = /**
         * @param {?} data
         * @return {?}
         */
            function (data) {
                this.returnDataElementChanged.emit(data);
            };
        /**
         * @param {?} event
         * @return {?}
         */
        AcrAssistSimulatorComponent.prototype.changeListener = /**
         * @param {?} event
         * @return {?}
         */
            function (event) {
                var _this = this;
                this.isInvalidFile = false;
                this.keyDiagrams = new Array();
                var _loop_1 = function (i) {
                    var /** @type {?} */ reader = new FileReader();
                    var /** @type {?} */ diagram = new Diagram();
                    diagram.label = event.target.files[i].name;
                    diagram.keyDiagram = i === 0 ? true : false;
                    if (!(this_1.acceptedFileTypes.indexOf(event.target.files[i].type) > -1)) {
                        this_1.isInvalidFile = true;
                    }
                    reader.onload = function (event1) {
                        diagram.location = reader.result.toString();
                    };
                    reader.readAsDataURL(event.target.files[i]);
                    reader.onloadend = function (event1) {
                        _this.keyDiagrams.push(diagram);
                    };
                };
                var this_1 = this;
                for (var /** @type {?} */ i = 0; i < event.target.files.length; i++) {
                    _loop_1(i);
                }
            };
        /**
         * @return {?}
         */
        AcrAssistSimulatorComponent.prototype.collapseKeyDiagram = /**
         * @return {?}
         */
            function () {
                if ($('#icon_keydiagram').hasClass('fa fa-minus')) {
                    $('#icon_keydiagram').removeClass('fa fa-minus');
                    $('#icon_keydiagram').addClass('fa fa-plus');
                    $('#body_keydiagram').css({
                        'display': 'none'
                    });
                }
                else {
                    $('#icon_keydiagram').removeClass('fa fa-plus');
                    $('#icon_keydiagram').addClass('fa fa-minus');
                    $('#body_keydiagram').removeAttr('style');
                }
            };
        /**
         * @return {?}
         */
        AcrAssistSimulatorComponent.prototype.collapseReportText = /**
         * @return {?}
         */
            function () {
                if ($('#icon_reporttext').hasClass('fa fa-minus')) {
                    $('#icon_reporttext').removeClass('fa fa-minus');
                    $('#icon_reporttext').addClass('fa fa-plus');
                    $('#body_reporttext').css({
                        'display': 'none'
                    });
                }
                else {
                    $('#icon_reporttext').removeClass('fa fa-plus');
                    $('#icon_reporttext').addClass('fa fa-minus');
                    $('#body_reporttext').removeAttr('style');
                }
            };
        /**
         * @return {?}
         */
        AcrAssistSimulatorComponent.prototype.populateTestCaseData = /**
         * @return {?}
         */
            function () {
                var _this = this;
                this.template.dataElements.forEach(function (dataeElement) {
                    var /** @type {?} */ inputValue = _this.inputValues.filter(function (x) { return x.dataElementId.toUpperCase() === dataeElement.id.toUpperCase(); });
                    if (inputValue !== undefined && inputValue.length > 0) {
                        if (dataeElement.dataElementType === 'ChoiceDataElement' || dataeElement.dataElementType === 'MultiChoiceDataElement') {
                            var /** @type {?} */ choiceElement = (dataeElement);
                            if (Array.isArray(inputValue[0].dataElementValue)) {
                                var /** @type {?} */ values_1 = [];
                                choiceElement.choiceInfo.forEach(function (choice) {
                                    inputValue[0].dataElementValue.forEach(function (value) {
                                        if (choice.value.toUpperCase() === value.toUpperCase()) {
                                            values_1.push(choice.value);
                                        }
                                    });
                                });
                                inputValue[0].dataElementValue = values_1;
                            }
                            else {
                                choiceElement.choiceInfo.forEach(function (choice) {
                                    if (inputValue[0].dataElementValue !== undefined) {
                                        if (choice.value.toUpperCase() === inputValue[0].dataElementValue.toUpperCase()) {
                                            inputValue[0].dataElementValue = choice.value;
                                            return;
                                        }
                                    }
                                });
                            }
                        }
                        dataeElement.currentValue = inputValue[0].dataElementValue;
                    }
                });
            };
        AcrAssistSimulatorComponent.decorators = [
            { type: core.Component, args: [{
                        selector: 'acr-assist-simulator',
                        template: "<ng-container *ngIf=\"!isEmptyContent\">\n  <div id=\"topReportTextPosition\" *ngIf=\"reportTextPosition === position.Top\">\n    <div class=\"col-sm-12 col-md-12 col-lg-12\">\n      <div id=\"div-simulator-block\">\n        <div class=\"box box-primary box-solid margin-b-0\">\n          <div *ngIf=\"resetButton == true\" class=\"with-border  text-right padding-5 padding-r-10\">\n            <button (click)=\"resetElements()\" class=\"btn btn-xs btn-primary\">Reset Values</button>\n          </div>\n          <div class=\"box-body\">\n            <div #simulatorResultsBlock>\n              <ng-container *ngIf=\"resultText !== undefined\">\n                <div class=\"box box-primary\">\n                  <div class=\"box-header with-border\">\n                    <h3 class=\"box-title\">Report Text</h3>\n                    <div class=\"box-tools pull-right\">\n                      <button type=\"button\" class=\"btn btn-box-tool btn-report-text\" (click)=\"collapseReportText()\">\n                        <i id=\"icon_reporttext\" class=\"fa fa-minus\"></i>\n                      </button>\n                    </div>\n                  </div>\n                  <div id=\"body_reporttext\" class=\"box-body report-text div-report-text-scroll\">\n                    <dl>\n                      <acr-assist-report-text [reportText]=\"resultText\"></acr-assist-report-text>\n                    </dl>\n                  </div>\n                </div>\n              </ng-container>\n            </div>\n            <div class=\"padding-r-10 scroll\" acrDynamicHeightDirective [simulatorElement]=\"simulatorResultsBlock\">\n              <form class=\"form-horizontal\">\n                <acr-assist-data-element [dataElements]=\"dataElements\" [templatePartial]=\"template.templatePartial\"\n                  [endPointXMLString]=\"template.endPointsString\" [imagePath]=\"imagePath\" [xmlContent]=\"template.xmlContent\"\n                  (returnReportText)='recieveReportText($event)' [inputValues]=\"inputValues\" [isReset]=\"isReset\"\n                  (returnDataElementChanged)='recivedOnDataElementChanged($event)' (returnExecutionHistory)='recievedExecutionHistory($event)'></acr-assist-data-element>\n              </form>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div id=\"rightReportTextPosition\" *ngIf=\"reportTextPosition === position.Right\">\n    <div class=\"col-sm-6 col-md-6 col-lg-6\">\n      <div id=\"div-simulator-block\">\n        <div class=\"box box-primary box-solid margin-b-0\">\n          <div *ngIf=\"resetButton == true\" class=\"with-border text-right padding-5 padding-r-10\">\n            <button (click)=\"resetElements()\" class=\"btn btn-xs btn-primary\">Reset Values</button>\n          </div>\n          <div class=\"box-body\">\n            <div id=\"div-simulator-form\" class=\"padding-r-10 div-simulator-form-height\">\n              <form class=\"form-horizontal\">\n                <acr-assist-data-element [dataElements]=\"dataElements\" [templatePartial]=\"template.templatePartial\"\n                  [endPointXMLString]=\"template.endPointsString\" [imagePath]=\"imagePath\" [xmlContent]=\"template.xmlContent\"\n                  (returnReportText)='recieveReportText($event)' [inputValues]=\"inputValues\" [isReset]=\"isReset\"\n                  (returnDataElementChanged)='recivedOnDataElementChanged($event)' (returnExecutionHistory)='recievedExecutionHistory($event)'></acr-assist-data-element>\n              </form>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n    <div class=\"col-sm-6 col-md-6 col-lg-6\">\n      <div #simulatorResultsBlock>\n        <ng-container *ngIf=\"resultText !== undefined\">\n          <div class=\"box box-primary\">\n            <div class=\"box-header with-border\">\n              <h3 class=\"box-title\">Report Text</h3>\n              <div class=\"box-tools pull-right\">\n                <button type=\"button\" class=\"btn btn-box-tool btn-report-text\" (click)=\"collapseReportText()\">\n                  <i id=\"icon_reporttext\" class=\"fa fa-minus\"></i>\n                </button>\n              </div>\n            </div>\n            <div id=\"body_reporttext\" class=\"box-body report-text\">\n              <dl>\n                <acr-assist-report-text [reportText]=\"resultText\"></acr-assist-report-text>\n              </dl>\n            </div>\n          </div>\n        </ng-container>\n      </div>\n    </div>\n    <div class=\"col-sm-6 col-md-6 col-lg-6\">\n      <ng-container *ngIf=\"showKeyDiagram === true\">\n        <div class=\"box box-primary margin-b-0\">\n          <div class=\"box-header with-border\">\n            <h3 class=\"box-title\">Key Images</h3>\n            <input #imageUpload id=\"diagramUpload\" class=\"hidden\" type=\"file\" accept=\"image/*\" multiple (change)=\"changeListener($event)\">\n            <label for=\"diagramUpload\" class=\"btn btn-success bg-olive margin-10\" title=\"Choose Diagrams\">Choose a\n              Diagram</label>\n            <div class=\"pull-right padding-l-5\">\n              <button type=\"button\" class=\"btn btn-box-tool\" data-widget=\"collapse\" (click)=\"collapseKeyDiagram()\">\n                <i id=\"icon_keydiagram\" class=\"fa fa-minus\"></i>\n              </button>\n            </div>\n            <div class=\"pull-right padding-l-5\">\n              <button type=\"button\" class=\"btn btn-zoom btn-sm\" onclick=\"zoomIn()\">\n                <i class=\"fa fa-search-plus fa-lg\"></i>\n              </button>\n            </div>\n            <div class=\"pull-right padding-l-5\">\n              <button type=\"button\" class=\"btn btn-zoom btn-sm\" onclick=\"zoomOut()\">\n                <i class=\"fa fa-search-minus fa-lg\"></i>\n              </button>\n            </div>\n            <div [hidden]=\"!isInvalidFile\" class=\"error-msg\">Only image files are supported !!!</div>\n          </div>\n          <div id=\"body_keydiagram\" class=\"box-body\">\n            <div id=\"carousel-example-generic\" class=\"carousel slide scroll\" data-interval=\"false\" data-ride=\"carousel\"\n              acrDynamicHeightDirective [carouselElement]=\"simulatorResultsBlock\">\n              <div class=\"carousel-inner\">\n                <ng-container *ngFor=\"let diagram of keyDiagrams; let i = index\">\n                  <div class=\"item zoom\" [ngClass]=\"{'active': diagram.keyDiagram}\">\n                    <drag-scroll>\n                      <img drag-scroll-item id=\"map_id_{{ i }}\" class=\"img-responsive img-decissionTree\" src=\"{{ diagram.location }}\">\n                    </drag-scroll>\n                  </div>\n                </ng-container>\n              </div>\n              <ng-container *ngIf=\"keyDiagrams && keyDiagrams.length > 1\">\n                <a class=\"left carousel-control\" href=\"#carousel-example-generic\" data-slide=\"prev\">\n                  <span class=\"fa fa-angle-left slide-left\"></span>\n                </a>\n                <a class=\"right carousel-control\" href=\"#carousel-example-generic\" data-slide=\"next\">\n                  <span class=\"fa fa-angle-right slide-right\"></span>\n                </a>\n              </ng-container>\n            </div>\n          </div>\n        </div>\n      </ng-container>\n    </div>\n  </div>\n</ng-container>",
                        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 */
        AcrAssistSimulatorComponent.ctorParameters = function () {
            return [
                { type: TemplateManagerService },
                { type: SimulatorEngineService }
            ];
        };
        AcrAssistSimulatorComponent.propDecorators = {
            templateContent: [{ type: core.Input }],
            imagePath: [{ type: core.Input }],
            showKeyDiagram: [{ type: core.Input }],
            reportTextPosition: [{ type: core.Input }],
            inputValues: [{ type: core.Input }],
            inputData: [{ type: core.Input }],
            resetButton: [{ type: core.Input }],
            returnExecutionHistory: [{ type: core.Output }],
            returnDataElementChanged: [{ type: core.Output }],
            returnDefaultElements: [{ type: core.Output }],
            imageUpload: [{ type: core.ViewChild, args: ['imageUpload',] }]
        };
        return AcrAssistSimulatorComponent;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var CodableConcept = (function () {
        function CodableConcept() {
            this.coding = new Array();
        }
        return CodableConcept;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var CodingSystem = (function () {
        function CodingSystem() {
        }
        return CodingSystem;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var CodingVersion = (function () {
        function CodingVersion() {
        }
        return CodingVersion;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var CodingCode = (function () {
        function CodingCode() {
        }
        return CodingCode;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var CodingDisplay = (function () {
        function CodingDisplay() {
        }
        return CodingDisplay;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var CodingUserSelected = (function () {
        function CodingUserSelected() {
        }
        return CodingUserSelected;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var Coding = (function () {
        function Coding() {
            this.codingSystem = new CodingSystem();
            this.codingVersion = new CodingVersion();
            this.codingCode = new CodingCode();
            this.codingDisplay = new CodingDisplay();
            this.codingUserSelected = new CodingUserSelected();
        }
        return Coding;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    /**
     * @abstract
     */
    var DataElementCreationBaseService = (function () {
        function DataElementCreationBaseService(diagramService) {
            this.diagramService = diagramService;
        }
        /**
         * @param {?} diagramJSON
         * @return {?}
         */
        DataElementCreationBaseService.prototype.returnDiagram = /**
         * @param {?} diagramJSON
         * @return {?}
         */
            function (diagramJSON) {
                var /** @type {?} */ metadataDiagram = new Diagram();
                metadataDiagram.displaySequence = diagramJSON.Attr.DisplaySequence;
                metadataDiagram.keyDiagram = diagramJSON.Attr.IsKeyDiagram ? diagramJSON.Attr.IsKeyDiagram : false;
                metadataDiagram.label = diagramJSON.Label;
                metadataDiagram.location = diagramJSON.Location;
                return metadataDiagram;
            };
        /**
         * @param {?} data
         * @param {?} dataElement
         * @return {?}
         */
        DataElementCreationBaseService.prototype.populateBasicData = /**
         * @param {?} data
         * @param {?} dataElement
         * @return {?}
         */
            function (data, dataElement) {
                dataElement.dataElementType = this.elementType;
                dataElement.displaySequence = data.Attr.DisplaySequence;
                dataElement.id = data.Attr.Id;
                dataElement.isRequired = data.Attr.IsRequired === 'true' ? true : false;
                dataElement.label = data.Label;
                dataElement.hint = data.Hint;
                dataElement.cdeId = data.Attr.CdeId;
                if (data.Diagrams) {
                    dataElement.diagrams = this.diagramService.returnDiagrams(data.Diagrams.Diagram);
                }
                dataElement.currentValue = undefined;
                dataElement.defaultValue = undefined;
                dataElement.isEditable = data.Attr.Editable === 'false' ? false : true;
                dataElement.hasprefilled = data.Attr.Hasprefilled === 'true' ? true : false;
                dataElement.output = data.Attr.Output === 'true' ? true : false;
                dataElement.unit = data.Attr.Unit !== undefined ? data.Attr.Unit : '';
                dataElement.sourceFilled = data.Attr.SourceFilled;
                dataElement.displaySequenceOverrider = data.Attr.DisplaySequence;
                dataElement.isRequiredOverrider = data.Attr.IsRequired === 'true' ? true : false;
                if (data.CodableConcept !== undefined) {
                    dataElement.codableConcept = new CodableConcept();
                    dataElement.codableConcept.name = data.CodableConcept.Attr.Name;
                    if (data.CodableConcept.Coding !== undefined && data.CodableConcept.Coding.length > 0) {
                        try {
                            for (var _a = __values(data.CodableConcept.Coding), _b = _a.next(); !_b.done; _b = _a.next()) {
                                var coding = _b.value;
                                var /** @type {?} */ _coding = new Coding();
                                _coding.codingSystem.value = coding.System.Attr.Value;
                                _coding.codingVersion.value = coding.Version.Attr.Value;
                                _coding.codingCode.value = coding.Code.Attr.Value;
                                _coding.codingDisplay.value = coding.Display.Attr.Value;
                                // if (coding.UserSelected !== undefined) {
                                _coding.codingUserSelected.value = coding.UserSelected !== undefined ? coding.UserSelected.Attr.Value : null;
                                // }
                                dataElement.codableConcept.coding.push(_coding);
                            }
                        }
                        catch (e_1_1) {
                            e_1 = { error: e_1_1 };
                        }
                        finally {
                            try {
                                if (_b && !_b.done && (_c = _a.return))
                                    _c.call(_a);
                            }
                            finally {
                                if (e_1)
                                    throw e_1.error;
                            }
                        }
                    }
                }
                var e_1, _c;
            };
        DataElementCreationBaseService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        DataElementCreationBaseService.ctorParameters = function () {
            return [
                { type: DiagramService }
            ];
        };
        return DataElementCreationBaseService;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var BaseDataElement = (function () {
        function BaseDataElement() {
            this.isRequired = true;
            this.isVisible = true;
            this.isEditable = true;
            this.hasprefilled = false;
            this.output = false;
            this.isRequiredOverrider = true;
        }
        return BaseDataElement;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var ChoiceDataElement = (function (_super) {
        __extends(ChoiceDataElement, _super);
        function ChoiceDataElement() {
            var _this = _super !== null && _super.apply(this, arguments) || this;
            _this.allowFreetext = false;
            return _this;
        }
        return ChoiceDataElement;
    }(BaseDataElement));

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var Choice = (function () {
        function Choice() {
        }
        return Choice;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var ImageElements = (function () {
        function ImageElements() {
        }
        return ImageElements;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var ImageMap = (function (_super) {
        __extends(ImageMap, _super);
        function ImageMap() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        return ImageMap;
    }(ImageElements));

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var Area = (function () {
        function Area() {
        }
        return Area;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var AreaMap = (function () {
        function AreaMap() {
        }
        return AreaMap;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var ConditionalProperty = (function () {
        function ConditionalProperty() {
        }
        return ConditionalProperty;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var ChoiceDataElementCreationService = (function (_super) {
        __extends(ChoiceDataElementCreationService, _super);
        function ChoiceDataElementCreationService(diagramService, arrayCheckerService, conditionsCreationService, computedValueCreationService) {
            var _this = _super.call(this, diagramService) || this;
            _this.arrayCheckerService = arrayCheckerService;
            _this.conditionsCreationService = conditionsCreationService;
            _this.computedValueCreationService = computedValueCreationService;
            _this.elementType = 'ChoiceDataElement';
            return _this;
        }
        /**
         * @param {?} choiceItem
         * @return {?}
         */
        ChoiceDataElementCreationService.prototype.returnChoice = /**
         * @param {?} choiceItem
         * @return {?}
         */
            function (choiceItem) {
                var /** @type {?} */ choice = new Choice();
                choice.label = choiceItem.Label;
                choice.value = choiceItem.Value;
                choice.hint = choiceItem.Hint;
                choice.reportText = choiceItem.ReportText;
                choice.default = false;
                if (choiceItem.Attr && choiceItem.Attr.IsDefault) {
                    choice.default = choiceItem.Attr.IsDefault;
                }
                return choice;
            };
        /**
         * @param {?} areaJSON
         * @return {?}
         */
        ChoiceDataElementCreationService.prototype.returnArea = /**
         * @param {?} areaJSON
         * @return {?}
         */
            function (areaJSON) {
                var /** @type {?} */ area = new Area();
                area.choiceValue = areaJSON.Attr.ChoiceValue;
                area.coords = areaJSON.Attr.Coords;
                area.shape = areaJSON.Attr.Shape;
                return area;
            };
        /**
         * @param {?} data
         * @return {?}
         */
        ChoiceDataElementCreationService.prototype.createElement = /**
         * @param {?} data
         * @return {?}
         */
            function (data) {
                var /** @type {?} */ dataElement = new ChoiceDataElement();
                _super.prototype.populateBasicData.call(this, data, dataElement);
                dataElement.allowFreetext = data.Attr.AllowFreetext ? data.Attr.AllowFreetext : false;
                var /** @type {?} */ choiceItems = data.ChoiceInfo.Choice;
                var /** @type {?} */ defaultValue;
                if (choiceItems !== undefined) {
                    dataElement.choiceInfo = new Array();
                    if (this.arrayCheckerService.isArray(choiceItems)) {
                        try {
                            for (var choiceItems_1 = __values(choiceItems), choiceItems_1_1 = choiceItems_1.next(); !choiceItems_1_1.done; choiceItems_1_1 = choiceItems_1.next()) {
                                var choiceItem = choiceItems_1_1.value;
                                var /** @type {?} */ choice = this.returnChoice(choiceItem);
                                if (choice.default) {
                                    defaultValue = choice.value;
                                }
                                dataElement.choiceInfo.push(choice);
                            }
                        }
                        catch (e_1_1) {
                            e_1 = { error: e_1_1 };
                        }
                        finally {
                            try {
                                if (choiceItems_1_1 && !choiceItems_1_1.done && (_a = choiceItems_1.return))
                                    _a.call(choiceItems_1);
                            }
                            finally {
                                if (e_1)
                                    throw e_1.error;
                            }
                        }
                    }
                    else {
                        var /** @type {?} */ choice = this.returnChoice(choiceItems);
                        if (choice.default) {
                            defaultValue = choice.value;
                        }
                        dataElement.choiceInfo.push(choice);
                    }
                }
                dataElement.defaultValue = defaultValue;
                dataElement.currentValue = defaultValue;
                var /** @type {?} */ imageMap = data.ImageMap;
                if (imageMap !== undefined) {
                    dataElement.imageMap = new ImageMap();
                    dataElement.imageMap.location = imageMap.Location;
                    var /** @type {?} */ areaMaps = imageMap.Map.Area;
                    if (areaMaps !== undefined) {
                        dataElement.imageMap.map = new AreaMap();
                        dataElement.imageMap.map.areas = new Array();
                        if (this.arrayCheckerService.isArray(areaMaps)) {
                            try {
                                for (var areaMaps_1 = __values(areaMaps), areaMaps_1_1 = areaMaps_1.next(); !areaMaps_1_1.done; areaMaps_1_1 = areaMaps_1.next()) {
                                    var areaMap = areaMaps_1_1.value;
                                    dataElement.imageMap.map.areas.push(this.returnArea(areaMap));
                                }
                            }
                            catch (e_2_1) {
                                e_2 = { error: e_2_1 };
                            }
                            finally {
                                try {
                                    if (areaMaps_1_1 && !areaMaps_1_1.done && (_b = areaMaps_1.return))
                                        _b.call(areaMaps_1);
                                }
                                finally {
                                    if (e_2)
                                        throw e_2.error;
                                }
                            }
                        }
                        else {
                            dataElement.imageMap.map.areas.push(this.returnArea(areaMaps));
                        }
                    }
                }
                var /** @type {?} */ ConditionalProperties = data.ConditionalProperties;
                if (ConditionalProperties !== undefined) {
                    var /** @type {?} */ dataElementRefs = data.ConditionalProperties;
                    // .NotRelevantDataElements.DataElementRef;
                    if (data.ConditionalProperties !== undefined) {
                        dataElement.conditionalProperties = new Array();
                        if (data.ConditionalProperties.ConditionalProperty instanceof Array) {
                            try {
                                for (var _c = __values(data.ConditionalProperties.ConditionalProperty), _d = _c.next(); !_d.done; _d = _c.next()) {
                                    var conditionalProperty = _d.value;
                                    dataElement.conditionalProperties.push(this.GetConditionalProperties(conditionalProperty));
                                }
                            }
                            catch (e_3_1) {
                                e_3 = { error: e_3_1 };
                            }
                            finally {
                                try {
                                    if (_d && !_d.done && (_e = _c.return))
                                        _e.call(_c);
                                }
                                finally {
                                    if (e_3)
                                        throw e_3.error;
                                }
                            }
                        }
                        else {
                            dataElement.conditionalProperties.push(this.GetConditionalProperties(data.ConditionalProperties.ConditionalProperty));
                        }
                    }
                }
                return dataElement;
                var e_1, _a, e_2, _b, e_3, _e;
            };
        /**
         * @param {?} conditionalProperty
         * @return {?}
         */
        ChoiceDataElementCreationService.prototype.GetConditionalProperties = /**
         * @param {?} conditionalProperty
         * @return {?}
         */
            function (conditionalProperty) {
                var /** @type {?} */ _conditionalProperty = new ConditionalProperty();
                _conditionalProperty.condition = this.conditionsCreationService.returnCondition(conditionalProperty);
                // var test = this.computedValueCreationService.createComputedValue(conditionalProperty);
                if (this.conditionsCreationService.isComposite(conditionalProperty)) {
                    _conditionalProperty.compositeCondition = this.conditionsCreationService.returnCompositeCondition(conditionalProperty);
                }
                _conditionalProperty.isRelevant = conditionalProperty.IsRelevant;
                _conditionalProperty.isRequired = conditionalProperty.IsRequired;
                _conditionalProperty.DisplaySequence = conditionalProperty.DisplaySequence;
                if (conditionalProperty.ChoiceNotRelevant !== undefined) {
                    _conditionalProperty.ChoiceNotRelevant = new Array();
                    try {
                        for (var _a = __values(conditionalProperty.ChoiceNotRelevant), _b = _a.next(); !_b.done; _b = _a.next()) {
                            var choiceNotRelevant = _b.value;
                            _conditionalProperty.ChoiceNotRelevant.push(choiceNotRelevant.Attr.ChoiceValue);
                        }
                    }
                    catch (e_4_1) {
                        e_4 = { error: e_4_1 };
                    }
                    finally {
                        try {
                            if (_b && !_b.done && (_c = _a.return))
                                _c.call(_a);
                        }
                        finally {
                            if (e_4)
                                throw e_4.error;
                        }
                    }
                }
                return _conditionalProperty;
                var e_4, _c;
            };
        ChoiceDataElementCreationService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        ChoiceDataElementCreationService.ctorParameters = function () {
            return [
                { type: DiagramService },
                { type: ArrayCheckerService },
                { type: ConditionsCreationService },
                { type: ComputedValueCreationService }
            ];
        };
        return ChoiceDataElementCreationService;
    }(DataElementCreationBaseService));

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var MultipleChoiceDataElementCreationService = (function (_super) {
        __extends(MultipleChoiceDataElementCreationService, _super);
        function MultipleChoiceDataElementCreationService(diagramService, arrayCheckerService, conditionsCreationService, computedValueCreationService) {
            var _this = _super.call(this, diagramService, arrayCheckerService, conditionsCreationService, computedValueCreationService) || this;
            _this.elementType = 'MultiChoiceDataElement';
            return _this;
        }
        MultipleChoiceDataElementCreationService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        MultipleChoiceDataElementCreationService.ctorParameters = function () {
            return [
                { type: DiagramService },
                { type: ArrayCheckerService },
                { type: ConditionsCreationService },
                { type: ComputedValueCreationService }
            ];
        };
        return MultipleChoiceDataElementCreationService;
    }(ChoiceDataElementCreationService));

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var NumericDataElement = (function (_super) {
        __extends(NumericDataElement, _super);
        function NumericDataElement() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        return NumericDataElement;
    }(BaseDataElement));

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var NumericDataElementCreationService = (function (_super) {
        __extends(NumericDataElementCreationService, _super);
        function NumericDataElementCreationService(diagramService, conditionsCreationService, computedValueCreationService) {
            var _this = _super.call(this, diagramService) || this;
            _this.conditionsCreationService = conditionsCreationService;
            _this.computedValueCreationService = computedValueCreationService;
            _this.elementType = 'NumericDataElement';
            return _this;
        }
        /**
         * @param {?} data
         * @return {?}
         */
        NumericDataElementCreationService.prototype.createElement = /**
         * @param {?} data
         * @return {?}
         */
            function (data) {
                var /** @type {?} */ dataElement = new NumericDataElement();
                _super.prototype.populateBasicData.call(this, data, dataElement);
                dataElement.minimum = data.Minimum;
                dataElement.maximum = data.Maximum;
                dataElement.maximumOverrider = data.Maximum;
                dataElement.minimumOverrider = data.Minimum;
                var /** @type {?} */ ConditionalProperties = data.ConditionalProperties;
                if (ConditionalProperties !== undefined) {
                    var /** @type {?} */ dataElementRefs = data.ConditionalProperties;
                    // .NotRelevantDataElements.DataElementRef;
                    if (data.ConditionalProperties !== undefined) {
                        dataElement.conditionalProperties = new Array();
                        if (data.ConditionalProperties.ConditionalProperty instanceof Array) {
                            try {
                                for (var _a = __values(data.ConditionalProperties.ConditionalProperty), _b = _a.next(); !_b.done; _b = _a.next()) {
                                    var conditionalProperty = _b.value;
                                    dataElement.conditionalProperties.push(this.GetConditionalProperties(conditionalProperty));
                                }
                            }
                            catch (e_1_1) {
                                e_1 = { error: e_1_1 };
                            }
                            finally {
                                try {
                                    if (_b && !_b.done && (_c = _a.return))
                                        _c.call(_a);
                                }
                                finally {
                                    if (e_1)
                                        throw e_1.error;
                                }
                            }
                        }
                        else {
                            dataElement.conditionalProperties.push(this.GetConditionalProperties(data.ConditionalProperties.ConditionalProperty));
                        }
                    }
                }
                return dataElement;
                var e_1, _c;
            };
        /**
         * @param {?} conditionalProperty
         * @return {?}
         */
        NumericDataElementCreationService.prototype.GetConditionalProperties = /**
         * @param {?} conditionalProperty
         * @return {?}
         */
            function (conditionalProperty) {
                var /** @type {?} */ _conditionalProperty = new ConditionalProperty();
                _conditionalProperty.condition = this.conditionsCreationService.returnCondition(conditionalProperty);
                // var test = this.computedValueCreationService.createComputedValue(conditionalProperty);
                if (this.conditionsCreationService.isComposite(conditionalProperty)) {
                    _conditionalProperty.compositeCondition = this.conditionsCreationService.returnCompositeCondition(conditionalProperty);
                }
                _conditionalProperty.isRelevant = conditionalProperty.IsRelevant;
                _conditionalProperty.isRequired = conditionalProperty.IsRequired;
                _conditionalProperty.DisplaySequence = conditionalProperty.DisplaySequence;
                _conditionalProperty.Minimum = conditionalProperty.Minimum;
                _conditionalProperty.Maximum = conditionalProperty.Maximum;
                return _conditionalProperty;
            };
        NumericDataElementCreationService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        NumericDataElementCreationService.ctorParameters = function () {
            return [
                { type: DiagramService },
                { type: ConditionsCreationService },
                { type: ComputedValueCreationService }
            ];
        };
        return NumericDataElementCreationService;
    }(DataElementCreationBaseService));

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var IntegerDataElement = (function (_super) {
        __extends(IntegerDataElement, _super);
        function IntegerDataElement() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        return IntegerDataElement;
    }(BaseDataElement));

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var IntegerDataElementCreationService = (function (_super) {
        __extends(IntegerDataElementCreationService, _super);
        function IntegerDataElementCreationService(diagramService, conditionsCreationService, computedValueCreationService) {
            var _this = _super.call(this, diagramService) || this;
            _this.conditionsCreationService = conditionsCreationService;
            _this.computedValueCreationService = computedValueCreationService;
            _this.elementType = 'IntegerDataElement';
            return _this;
        }
        /**
         * @param {?} data
         * @return {?}
         */
        IntegerDataElementCreationService.prototype.createElement = /**
         * @param {?} data
         * @return {?}
         */
            function (data) {
                var /** @type {?} */ dataElement = new IntegerDataElement();
                _super.prototype.populateBasicData.call(this, data, dataElement);
                dataElement.minimum = data.Minimum;
                dataElement.maximum = data.Maximum;
                dataElement.maximumOverrider = data.Maximum;
                dataElement.minimumOverrider = data.Minimum;
                var /** @type {?} */ ConditionalProperties = data.ConditionalProperties;
                if (ConditionalProperties !== undefined) {
                    var /** @type {?} */ dataElementRefs = data.ConditionalProperties;
                    // .NotRelevantDataElements.DataElementRef;
                    if (data.ConditionalProperties !== undefined) {
                        dataElement.conditionalProperties = new Array();
                        if (data.ConditionalProperties.ConditionalProperty instanceof Array) {
                            try {
                                for (var _a = __values(data.ConditionalProperties.ConditionalProperty), _b = _a.next(); !_b.done; _b = _a.next()) {
                                    var conditionalProperty = _b.value;
                                    dataElement.conditionalProperties.push(this.GetConditionalProperties(conditionalProperty));
                                }
                            }
                            catch (e_1_1) {
                                e_1 = { error: e_1_1 };
                            }
                            finally {
                                try {
                                    if (_b && !_b.done && (_c = _a.return))
                                        _c.call(_a);
                                }
                                finally {
                                    if (e_1)
                                        throw e_1.error;
                                }
                            }
                        }
                        else {
                            dataElement.conditionalProperties.push(this.GetConditionalProperties(data.ConditionalProperties.ConditionalProperty));
                        }
                    }
                }
                return dataElement;
                var e_1, _c;
            };
        /**
         * @param {?} conditionalProperty
         * @return {?}
         */
        IntegerDataElementCreationService.prototype.GetConditionalProperties = /**
         * @param {?} conditionalProperty
         * @return {?}
         */
            function (conditionalProperty) {
                var /** @type {?} */ _conditionalProperty = new ConditionalProperty();
                _conditionalProperty.condition = this.conditionsCreationService.returnCondition(conditionalProperty);
                // var test = this.computedValueCreationService.createComputedValue(conditionalProperty);
                if (this.conditionsCreationService.isComposite(conditionalProperty)) {
                    _conditionalProperty.compositeCondition = this.conditionsCreationService.returnCompositeCondition(conditionalProperty);
                }
                _conditionalProperty.isRelevant = conditionalProperty.IsRelevant;
                _conditionalProperty.isRequired = conditionalProperty.IsRequired;
                _conditionalProperty.DisplaySequence = conditionalProperty.DisplaySequence;
                _conditionalProperty.Minimum = conditionalProperty.Minimum;
                _conditionalProperty.Maximum = conditionalProperty.Maximum;
                return _conditionalProperty;
            };
        IntegerDataElementCreationService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        IntegerDataElementCreationService.ctorParameters = function () {
            return [
                { type: DiagramService },
                { type: ConditionsCreationService },
                { type: ComputedValueCreationService }
            ];
        };
        return IntegerDataElementCreationService;
    }(DataElementCreationBaseService));

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var InputData = (function () {
        function InputData() {
            this.dataElementLabel = '';
            this.dataElementDisplayValue = '';
        }
        return InputData;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var SimulatorCommunicationService = (function () {
        function SimulatorCommunicationService() {
            this.simulatorSource = new Subject.Subject();
            // Observable string streams
            this.simulatorSource$ = this.simulatorSource.asObservable();
        }
        // Service message commands
        /**
         * @param {?} mission
         * @return {?}
         */
        SimulatorCommunicationService.prototype.messageEmitter = /**
         * @param {?} mission
         * @return {?}
         */
            function (mission) {
                this.simulatorSource.next(mission);
            };
        SimulatorCommunicationService.decorators = [
            { type: core.Injectable },
        ];
        return SimulatorCommunicationService;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var /** @type {?} */ $$1 = require('jquery');
    var AssistDataElementComponent = (function () {
        function AssistDataElementComponent(simulatorEngineService, simulatorCommunicationService) {
            this.simulatorEngineService = simulatorEngineService;
            this.simulatorCommunicationService = simulatorCommunicationService;
            this.Endpoints = [];
            this.returnReportText = new core.EventEmitter();
            this.returnExecutionHistory = new core.EventEmitter();
            this.returnDataElementChanged = new core.EventEmitter();
            this.inputValues = [];
            this.comparisonValues = [];
            this.selectedChoiceValues = [];
            this.executedResultIds = [];
            this.executedResultHistories = [];
        }
        /**
         * @return {?}
         */
        AssistDataElementComponent.prototype.ngOnInit = /**
         * @return {?}
         */
            function () {
                var _this = this;
                this.simulatorEngineService.simulatorStateChanged.subscribe(function (message) {
                    _this.simulatorState = /** @type {?} */ (message);
                    _this.dataElementValues = _this.simulatorEngineService.getAllDataElementValues();
                    var /** @type {?} */ nonRelevantIDs = _this.simulatorEngineService.evaluateDecisionAndConditionalProperty();
                    try {
                        for (var _a = __values(_this.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) {
                            var dataElement = _b.value;
                            if (nonRelevantIDs && nonRelevantIDs.length > 0) {
                                if (nonRelevantIDs.indexOf(dataElement.id) >= 0) {
                                    dataElement.isVisible = false;
                                }
                                else {
                                    dataElement.isVisible = true;
                                }
                            }
                            else {
                                dataElement.isVisible = true;
                            }
                            if (_this.dataElementValues[dataElement.id] !== undefined && dataElement.currentValue !== _this.dataElementValues[dataElement.id]) {
                                dataElement.currentValue = _this.dataElementValues[dataElement.id];
                            }
                            dataElement.currentValue = (dataElement.currentValue !== undefined) ? dataElement.currentValue : _this.dataElementValues[dataElement.id];
                        }
                    }
                    catch (e_1_1) {
                        e_1 = { error: e_1_1 };
                    }
                    finally {
                        try {
                            if (_b && !_b.done && (_c = _a.return))
                                _c.call(_a);
                        }
                        finally {
                            if (e_1)
                                throw e_1.error;
                        }
                    }
                    _this.dataElements = _this.dataElements.filter(function (x) { return x.displaySequence != null; }).sort(function (DE_1, DE_2) { return DE_1.displaySequence - DE_2.displaySequence; });
                    if (_this.simulatorState.endPointId && _this.simulatorState.endPointId.length > 0) {
                        _this.generateReportText(_this.simulatorState.endPointId);
                    }
                    else {
                        _this.returnReportText.emit(undefined);
                    }
                    _this.simulatorCommunicationService.messageEmitter('');
                    var e_1, _c;
                });
            };
        /**
         * @param {?} changes
         * @return {?}
         */
        AssistDataElementComponent.prototype.ngOnChanges = /**
         * @param {?} changes
         * @return {?}
         */
            function (changes) {
                this.dataElements = this.dataElements.filter(function (x) { return x.displaySequence != null; }).sort(function (DE_1, DE_2) { return DE_1.displaySequence - DE_2.displaySequence; });
                this.executedResultIds = [];
            };
        /**
         * @param {?} $event
         * @return {?}
         */
        AssistDataElementComponent.prototype.choiceSelected = /**
         * @param {?} $event
         * @return {?}
         */
            function ($event) {
                if ($event !== undefined) {
                    if ($event.receivedElement !== undefined && $event.selectedCondition !== undefined) {
                        this.selectedChoiceValues[$event.receivedElement.elementId + 'SelectedValue'] = $event.receivedElement.selectedText;
                        this.simulatorEngineService.addOrUpdateDataElement($event.receivedElement.elementId, $event.receivedElement.selectedValue, $event.receivedElement.selectedText);
                        var /** @type {?} */ executedResults = [];
                        executedResults[$event.selectedCondition.selectedCondition] = $event.selectedCondition.selectedValue;
                        this.executedResultIds[$event.selectedCondition.selectedConditionId] = executedResults;
                        if (this.simulatorState.endPointId && this.simulatorState.endPointId.length > 0) {
                            this.generateExecutionHistory();
                        }
                        this.afterDataElementChanged();
                    }
                }
                else {
                    this.afterDataElementChanged();
                }
            };
        /**
         * @param {?} $event
         * @return {?}
         */
        AssistDataElementComponent.prototype.numericSelected = /**
         * @param {?} $event
         * @return {?}
         */
            function ($event) {
                if ($event !== undefined) {
                    if ($event.receivedElement !== undefined && $event.selectedCondition !== undefined) {
                        this.simulatorEngineService.addOrUpdateDataElement($event.receivedElement.elementId, $event.receivedElement.selectedValue, $event.receivedElement.selectedValue);
                        var /** @type {?} */ executedResults = [];
                        executedResults[$event.selectedCondition.selectedCondition] = $event.selectedCondition.selectedValue;
                        this.executedResultIds[$event.selectedCondition.selectedConditionId] = executedResults;
                        if (this.simulatorState.endPointId && this.simulatorState.endPointId.length > 0) {
                            this.generateExecutionHistory();
                        }
                        this.afterDataElementChanged();
                    }
                }
                else {
                    this.afterDataElementChanged();
                }
            };
        /**
         * @param {?} $event
         * @return {?}
         */
        AssistDataElementComponent.prototype.multiSelected = /**
         * @param {?} $event
         * @return {?}
         */
            function ($event) {
                if ($event !== undefined) {
                    if ($event.receivedElement !== undefined && $event.selectedCondition !== undefined) {
                        this.comparisonValues[$event.receivedElement.elementId + 'ComparisonValue'] = $event.receivedElement.selectedComparisonValues;
                        this.simulatorEngineService.addOrUpdateDataElement($event.receivedElement.elementId, $event.receivedElement.selectedComparisonValues, $event.receivedElement.selectedValues);
                        var /** @type {?} */ executedResults = [];
                        executedResults[$event.selectedCondition.selectedCondition] = $event.selectedCondition.selectedValue;
                        this.executedResultIds[$event.selectedCondition.selectedConditionId] = executedResults;
                        if (this.simulatorState.endPointId && this.simulatorState.endPointId.length > 0) {
                            this.generateExecutionHistory();
                        }
                        this.afterDataElementChanged();
                    }
                }
                else {
                    this.afterDataElementChanged();
                }
            };
        /**
         * @param {?} endpointId
         * @return {?}
         */
        AssistDataElementComponent.prototype.generateReportText = /**
         * @param {?} endpointId
         * @return {?}
         */
            function (endpointId) {
                var /** @type {?} */ endpointContent = this.returnEndPointContents(this.xmlContent, '<EndPoint Id="' + endpointId + '">', '</EndPoint>');
                this.parseXml(endpointId, endpointContent);
            };
        /**
         * @return {?}
         */
        AssistDataElementComponent.prototype.afterDataElementChanged = /**
         * @return {?}
         */
            function () {
                var /** @type {?} */ deValues = [];
                var _loop_1 = function (de) {
                    if (de.isVisible && de.dataElementType !== 'ComputedDataElement' && de.dataElementType !== 'GlobalValue') {
                        var /** @type {?} */ inputData_1 = new InputData();
                        inputData_1.dataElementId = de.id;
                        inputData_1.dataElementLabel = de.label;
                        inputData_1.dataElementValue = de.currentValue;
                        if (de.currentValue === undefined || de.currentValue === '') {
                            inputData_1.dataElementDisplayValue = undefined;
                        }
                        else {
                            if (de.dataElementType === 'ChoiceDataElement') {
                                var /** @type {?} */ choices = ((de)).choiceInfo;
                                inputData_1.dataElementDisplayValue = choices.filter(function (ch) { return ch.value === de.currentValue; })[0].label;
                            }
                            else if (de.dataElementType === 'MultiChoiceDataElement') {
                                var /** @type {?} */ choices = ((de)).choiceInfo;
                                inputData_1.dataElementDisplayValue = [];
                                choices.forEach(function (choice) {
                                    if (Array.isArray(de.currentValue)) {
                                        de.currentValue.forEach(function (element) {
                                            if (choice.value === element) {
                                                inputData_1.dataElementDisplayValue.push(choice.label);
                                            }
                                        });
                                    }
                                    else {
                                        if (choice.value === de.currentValue) {
                                            inputData_1.dataElementDisplayValue.push(choice.label);
                                        }
                                    }
                                });
                            }
                            else {
                                inputData_1.dataElementDisplayValue = de.currentValue;
                            }
                        }
                        deValues.push(inputData_1);
                    }
                };
                try {
                    for (var _a = __values(this.dataElements), _b = _a.next(); !_b.done; _b = _a.next()) {
                        var de = _b.value;
                        _loop_1(de);
                    }
                }
                catch (e_2_1) {
                    e_2 = { error: e_2_1 };
                }
                finally {
                    try {
                        if (_b && !_b.done && (_c = _a.return))
                            _c.call(_a);
                    }
                    finally {
                        if (e_2)
                            throw e_2.error;
                    }
                }
                this.returnDataElementChanged.emit(deValues);
                var e_2, _c;
            };
        /**
         * @return {?}
         */
        AssistDataElementComponent.prototype.generateExecutionHistory = /**
         * @return {?}
         */
            function () {
                this.executedResultHistories = [];
                var /** @type {?} */ isNonRelevant;
                isNonRelevant = false;
                // tslint:disable-next-line:forin
                for (var /** @type {?} */ resultId in this.executedResultIds) {
                    try {
                        for (var _a = __values(this.simulatorState.nonRelevantDataElementIds), _b = _a.next(); !_b.done; _b = _a.next()) {
                            var nonRelevantDataElement = _b.value;
                            if (nonRelevantDataElement === resultId) {
                                isNonRelevant = true;
                                break;
                            }
                            else {
                                isNonRelevant = false;
                            }
                        }
                    }
                    catch (e_3_1) {
                        e_3 = { error: e_3_1 };
                    }
                    finally {
                        try {
                            if (_b && !_b.done && (_c = _a.return))
                                _c.call(_a);
                        }
                        finally {
                            if (e_3)
                                throw e_3.error;
                        }
                    }
                    if (!isNonRelevant) {
                        // tslint:disable-next-line:forin
                        for (var /** @type {?} */ label in this.executedResultIds[resultId]) {
                            var /** @type {?} */ executedResultHistory = new ExecutedResultHistory();
                            executedResultHistory.resultCondition = label;
                            executedResultHistory.resultValue = this.executedResultIds[resultId][label];
                            this.executedResultHistories.push(executedResultHistory);
                        }
                    }
                }
                var /** @type {?} */ finalExecution = new FinalExecutedHistory();
                if (this.executedResultHistories.length > 0) {
                    finalExecution.executionHistories = this.executedResultHistories;
                    finalExecution.resultText = this.mainReportTextObj;
                    finalExecution.inputData = [];
                    try {
                        for (var _d = __values(this.dataElements), _e = _d.next(); !_e.done; _e = _d.next()) {
                            var de = _e.value;
                            if (de.isVisible && de.dataElementType !== 'ComputedDataElement' && de.dataElementType !== 'GlobalValue') {
                                var /** @type {?} */ inputData = new InputData();
                                inputData.dataElementId = de.id;
                                inputData.dataElementValue = de.currentValue;
                                finalExecution.inputData.push(inputData);
                            }
                        }
                    }
                    catch (e_4_1) {
                        e_4 = { error: e_4_1 };
                    }
                    finally {
                        try {
                            if (_e && !_e.done && (_f = _d.return))
                                _f.call(_d);
                        }
                        finally {
                            if (e_4)
                                throw e_4.error;
                        }
                    }
                }
                this.returnExecutionHistory.emit(finalExecution);
                var e_3, _c, e_4, _f;
            };
        /**
         * @param {?} content
         * @param {?} startToken
         * @param {?} endToken
         * @return {?}
         */
        AssistDataElementComponent.prototype.returnEndPointContents = /**
         * @param {?} content
         * @param {?} startToken
         * @param {?} endToken
         * @return {?}
         */
            function (content, startToken, endToken) {
                var /** @type {?} */ contents;
                var /** @type {?} */ templateSearchIndexPosition = 0;
                while (true) {
                    var /** @type {?} */ contentStartPosition = content.indexOf(startToken, templateSearchIndexPosition);
                    var /** @type {?} */ contentEndPosition = content.indexOf(endToken, templateSearchIndexPosition);
                    if (contentStartPosition >= 0 && contentEndPosition >= 0) {
                        var /** @type {?} */ endPosition = contentEndPosition + endToken.length;
                        var /** @type {?} */ contentData = content.substring(contentStartPosition, endPosition);
                        contents = contentData;
                        templateSearchIndexPosition = endPosition + 1;
                    }
                    else {
                        break;
                    }
                }
                return contents;
            };
        /**
         * @param {?} xmlData
         * @return {?}
         */
        AssistDataElementComponent.prototype.parseToJson = /**
         * @param {?} xmlData
         * @return {?}
         */
            function (xmlData) {
                var /** @type {?} */ jsonResult;
                var /** @type {?} */ parseString = require('xml2js').parseString;
                parseString(xmlData, { explicitRoot: false, explicitArray: false, attrkey: 'Attr' }, function (err, result) {
                    jsonResult = result;
                });
                return jsonResult;
            };
        /**
         * @param {?} endPointId
         * @param {?} endpointContent
         * @return {?}
         */
        AssistDataElementComponent.prototype.parseXml = /**
         * @param {?} endPointId
         * @param {?} endpointContent
         * @return {?}
         */
            function (endPointId, endpointContent) {
                var /** @type {?} */ canInsertText;
                var /** @type {?} */ isSectionIf;
                var /** @type {?} */ selectedElements;
                var /** @type {?} */ executeSectionIfNot;
                var /** @type {?} */ hasSectionNot;
                var /** @type {?} */ executeTemplate;
                var /** @type {?} */ isImpression;
                var /** @type {?} */ isNewTemplate;
                var /** @type {?} */ hasInsertPartial;
                var /** @type {?} */ isMainText;
                var /** @type {?} */ allReportText = [];
                var /** @type {?} */ endpoints = this.Endpoints;
                var /** @type {?} */ templatePartialsText;
                var /** @type {?} */ selectedComparisonValues;
                var /** @type {?} */ findingsText;
                var /** @type {?} */ impressionText;
                var /** @type {?} */ selectedSection;
                var /** @type {?} */ selectedChoiceTexts;
                var /** @type {?} */ textExpressionValue;
                selectedElements = this.simulatorEngineService.getAllDataElementValues();
                templatePartialsText = this.templatePartial;
                selectedComparisonValues = this.comparisonValues;
                selectedChoiceTexts = this.simulatorEngineService.getAllDataElementTexts();
                executeSectionIfNot = false;
                hasInsertPartial = false;
                endpointContent = endpointContent.replace(/\n/g, '&#10;');
                endpointContent = endpointContent.replace(/\t/g, '&emsp;');
                //  endpointContent = endpointContent.replace(/\s/g, ' &nbsp; ');
                // tslint:disable-next-line:forin
                for (var /** @type {?} */ i in templatePartialsText) {
                    templatePartialsText[i] = templatePartialsText[i].replace(/\n/g, '&#10;');
                    templatePartialsText[i] = templatePartialsText[i].replace(/\t/g, '&emsp;');
                    //  templatePartialsText[i] = templatePartialsText[i].replace(/\s+/g, ' &nbsp; ');
                }
                findingsText = '';
                impressionText = '';
                var /** @type {?} */ isReportText;
                var /** @type {?} */ reportTextContent = '';
                var /** @type {?} */ endpointSax = require('sax'), /** @type {?} */ strict = true, // set to false for html-mode
                trim = true, /** @type {?} */ reportTextParser = endpointSax.parser(strict, trim);
                reportTextParser.onerror = function (e) {
                    // an error happened.
                    reportTextParser.resume();
                };
                reportTextParser.ontext = function (t) {
                    debugger;
                    // if (t.length > 1) {
                    //   t = t.trim();
                    // }
                    var /** @type {?} */ isTextInserted;
                    isTextInserted = false;
                    if (executeTemplate) {
                        if (!isImpression) {
                            if (canInsertText && hasSectionNot && hasSectionNot !== undefined && executeSectionIfNot) {
                                findingsText = findingsText + t;
                            }
                            else if (canInsertText && isNewTemplate && hasInsertPartial && !isSectionIf) {
                                findingsText = findingsText + t;
                            }
                            else if (canInsertText && !isImpression) {
                                findingsText = findingsText + t;
                            }
                        }
                        else {
                            if (canInsertText && hasSectionNot && hasSectionNot !== undefined && executeSectionIfNot) {
                                impressionText = impressionText + t;
                            }
                            else if (canInsertText && !hasSectionNot && isImpression) {
                                impressionText = impressionText + t;
                            }
                            else if (canInsertText && isNewTemplate) {
                                impressionText = impressionText + t;
                            }
                        }
                        if (isReportText && !isTextInserted && isMainText && canInsertText) {
                            reportTextContent = reportTextContent + t;
                        }
                    }
                };
                reportTextParser.onopentag = function (node) {
                    switch (node.name) {
                        case 'Label':
                            canInsertText = false;
                            isReportText = false;
                            isMainText = false;
                            break;
                        case 'ReportText':
                            if (executeTemplate) {
                                isReportText = true;
                                canInsertText = true;
                                selectedSection = node.attributes.SectionId;
                                impressionText = '';
                                if (node.attributes.SectionId === 'findings' && executeTemplate) {
                                    isImpression = false;
                                }
                                else if (node.attributes.SectionId === 'impression' && executeTemplate) {
                                    isImpression = true;
                                }
                            }
                            isSectionIf = false;
                            // isMainText = true;
                            break;
                        case 'InsertPartial':
                            if (executeTemplate) {
                                generatePartialView(node.attributes.PartialId, isImpression);
                                executeTemplate = true;
                                canInsertText = true;
                                if (isReportText) {
                                    hasInsertPartial = true;
                                }
                                else {
                                    hasInsertPartial = false;
                                }
                            }
                            else {
                                canInsertText = false;
                            }
                            isReportText = false;
                            isMainText = false;
                            break;
                        case 'SectionIfValueNot':
                            if (executeTemplate) {
                                if (Array.isArray(selectedElements[node.attributes.DataElementId])) {
                                    try {
                                        for (var _a = __values(selectedElements[node.attributes.DataElementId]), _b = _a.next(); !_b.done; _b = _a.next()) {
                                            var comaprisonValue = _b.value;
                                            if (comaprisonValue !== node.attributes.ComparisonValue &&
                                                comaprisonValue !== undefined && !isSectionIf) {
                                                canInsertText = true;
                                                executeSectionIfNot = true;
                                                break;
                                            }
                                            else {
                                                canInsertText = false;
                                                executeSectionIfNot = false;
                                            }
                                        }
                                    }
                                    catch (e_5_1) {
                                        e_5 = { error: e_5_1 };
                                    }
                                    finally {
                                        try {
                                            if (_b && !_b.done && (_c = _a.return))
                                                _c.call(_a);
                                        }
                                        finally {
                                            if (e_5)
                                                throw e_5.error;
                                        }
                                    }
                                }
                                else if (selectedElements[node.attributes.DataElementId] !== node.attributes.ComparisonValue &&
                                    selectedElements[node.attributes.DataElementId] !== '--Select--' &&
                                    selectedElements[node.attributes.DataElementId] !== undefined &&
                                    selectedElements[node.attributes.DataElementId] !== null) {
                                    canInsertText = true;
                                    executeSectionIfNot = true;
                                }
                                else {
                                    canInsertText = false;
                                    executeSectionIfNot = false;
                                }
                            }
                            hasSectionNot = true;
                            isMainText = false;
                            break;
                        case 'SectionIf':
                            if (selectedElements[node.attributes.DataElementId] !== undefined && selectedElements[node.attributes.DataElementId].length > 0 && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
                                isSectionIf = true;
                                canInsertText = true;
                            }
                            else {
                                isSectionIf = false;
                                canInsertText = false;
                            }
                            break;
                        case 'SectionIfValue':
                            if (executeTemplate) {
                                if (executeTemplate) {
                                    if (Array.isArray(selectedElements[node.attributes.DataElementId])) {
                                        try {
                                            for (var _d = __values(selectedElements[node.attributes.DataElementId]), _e = _d.next(); !_e.done; _e = _d.next()) {
                                                var comaprisonValue = _e.value;
                                                if (comaprisonValue === node.attributes.ComparisonValue &&
                                                    comaprisonValue !== undefined) {
                                                    isSectionIf = true;
                                                    if (selectedElements[node.attributes.DataElementId] !== undefined && !isSectionIf && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
                                                        findingsText = findingsText + selectedChoiceTexts[node.attributes.DataElementId];
                                                    }
                                                    canInsertText = true;
                                                    break;
                                                }
                                                else {
                                                    isSectionIf = false;
                                                    canInsertText = false;
                                                }
                                            }
                                        }
                                        catch (e_6_1) {
                                            e_6 = { error: e_6_1 };
                                        }
                                        finally {
                                            try {
                                                if (_e && !_e.done && (_f = _d.return))
                                                    _f.call(_d);
                                            }
                                            finally {
                                                if (e_6)
                                                    throw e_6.error;
                                            }
                                        }
                                    }
                                    else if (selectedElements[node.attributes.DataElementId] === node.attributes.ComparisonValue &&
                                        selectedElements[node.attributes.DataElementId] !== undefined) {
                                        isSectionIf = true;
                                        if (selectedElements[node.attributes.DataElementId] !== undefined && !isSectionIf && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
                                            findingsText = findingsText + selectedChoiceTexts[node.attributes.DataElementId];
                                        }
                                        canInsertText = true;
                                    }
                                    else {
                                        canInsertText = false;
                                    }
                                }
                                break;
                            }
                            isMainText = false;
                            break;
                        case 'InsertValue':
                            if (executeTemplate) {
                                isReportText = false;
                                var /** @type {?} */ choiceText = selectedChoiceTexts[node.attributes.DataElementId];
                                if (node.attributes.Id === 'findings' || canInsertText) {
                                    if (selectedElements[node.attributes.DataElementId] !== undefined && hasSectionNot && executeSectionIfNot) {
                                        if (isImpression) {
                                            if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
                                                impressionText = impressionText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
                                            }
                                            else {
                                                getTextExpressionValue(selectedElements[node.attributes.DataElementId]);
                                                impressionText = impressionText + (Array.isArray(selectedElements[node.attributes.DataElementId]) ? selectedElements[node.attributes.DataElementId].join(', ') : textExpressionValue);
                                            }
                                        }
                                        else {
                                            if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
                                                findingsText = findingsText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
                                            }
                                            else {
                                                getTextExpressionValue(selectedElements[node.attributes.DataElementId]);
                                                findingsText = findingsText + (Array.isArray(selectedElements[node.attributes.DataElementId]) ? selectedElements[node.attributes.DataElementId].join(', ') : textExpressionValue);
                                            }
                                        }
                                    }
                                    else if (selectedElements[node.attributes.DataElementId] !== undefined && !hasSectionNot) {
                                        if (isImpression) {
                                            if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
                                                impressionText = impressionText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
                                            }
                                            else {
                                                getTextExpressionValue(selectedElements[node.attributes.DataElementId]);
                                                impressionText = impressionText + (Array.isArray(selectedElements[node.attributes.DataElementId]) ? selectedElements[node.attributes.DataElementId].join(', ') : textExpressionValue);
                                            }
                                        }
                                        else {
                                            if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
                                                findingsText = findingsText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
                                            }
                                            else {
                                                getTextExpressionValue(selectedElements[node.attributes.DataElementId]);
                                                findingsText = findingsText + (Array.isArray(selectedElements[node.attributes.DataElementId]) ? selectedElements[node.attributes.DataElementId].join(', ') : textExpressionValue);
                                            }
                                        }
                                    }
                                    if (isImpression) {
                                        canInsertText = true;
                                    }
                                }
                                isMainText = false;
                                break;
                            }
                    }
                    executeTemplate = true;
                    isNewTemplate = true;
                    var e_5, _c, e_6, _f;
                };
                reportTextParser.onclosetag = function (node) {
                    switch (node) {
                        case 'SectionIfValueNot':
                            executeSectionIfNot = false;
                            hasSectionNot = false;
                            if (isSectionIf) {
                                canInsertText = true;
                            }
                            break;
                        case 'TemplatePartial':
                            isNewTemplate = false;
                            canInsertText = false;
                            executeTemplate = false;
                            break;
                        case 'ReportText':
                            // isImpression = false;
                            if (!hasInsertPartial && !isImpression) {
                                var /** @type {?} */ reportTextObj = new AllReportText();
                                reportTextObj.sectionId = 'findings';
                                reportTextObj.reportText = findingsText;
                                allReportText[reportTextObj.sectionId] = reportTextObj;
                            }
                            if (impressionText !== '' && impressionText !== undefined) {
                                var /** @type {?} */ reportTextObj = new AllReportText();
                                reportTextObj.sectionId = selectedSection;
                                reportTextObj.reportText = impressionText;
                                allReportText[reportTextObj.sectionId] = reportTextObj;
                            }
                            hasInsertPartial = false;
                            break;
                        case 'SectionIf':
                            isSectionIf = false;
                            canInsertText = true;
                            break;
                        case 'InsertPartial':
                            canInsertText = true;
                            break;
                        case 'InsertValue':
                            if ((hasSectionNot && executeSectionIfNot || !hasSectionNot)) {
                                canInsertText = true;
                            }
                            break;
                        case 'SectionIfValue':
                            canInsertText = true;
                            break;
                    }
                };
                reportTextParser.onend = function () {
                    // parser stream is done, and ready to have more stuff written to it.
                    // if (impressionText !== '' && impressionText !== undefined) {
                    // const reportTextObj: AllReportText = new AllReportText();
                    // reportTextObj.sectionId = selectedSection;
                    // reportTextObj.reportText = impressionText;
                    // allReportText[reportTextObj.sectionId] = reportTextObj;
                    // }
                };
                reportTextParser.write(endpointContent).onend();
                /**
                 * @param {?} textExpression
                 * @return {?}
                 */
                function getTextExpressionValue(textExpression) {
                    if (textExpression.indexOf('{') === 0 && (textExpression.indexOf('}') > 1)) {
                        var /** @type {?} */ subString = textExpression.substr(textExpression.indexOf('{') + 1, textExpression.indexOf('}') - 1);
                        getTextExpressionValue(selectedElements[subString]);
                    }
                    else {
                        textExpressionValue = textExpression;
                    }
                }
                /**
                 * @param {?} partialViewId
                 * @param {?} isImpressionTemplate
                 * @return {?}
                 */
                function generatePartialView(partialViewId, isImpressionTemplate) {
                    // this.templateIds = [];
                    var /** @type {?} */ sax = require('sax'), /** @type {?} */ parser = sax.parser(strict, trim);
                    parser.onerror = function (e) {
                        // an error happened.
                        // parser.resume();
                    };
                    parser.ontext = function (t) {
                        if (executeTemplate) {
                            if (!isImpressionTemplate) {
                                if (canInsertText && hasSectionNot && hasSectionNot !== undefined && executeSectionIfNot) {
                                    findingsText = findingsText + t;
                                }
                                else if (canInsertText && !hasSectionNot && isImpression) {
                                    findingsText = findingsText + t;
                                }
                                else if (canInsertText && isNewTemplate) {
                                    findingsText = findingsText + t;
                                }
                            }
                            else {
                                if (canInsertText && hasSectionNot && hasSectionNot !== undefined && executeSectionIfNot) {
                                    impressionText = impressionText + t;
                                }
                                else if (canInsertText && !hasSectionNot && isImpression) {
                                    impressionText = impressionText + t;
                                }
                                else if (canInsertText && isNewTemplate) {
                                    impressionText = impressionText + t;
                                }
                            }
                        }
                    };
                    parser.onopentag = function (node) {
                        switch (node.name) {
                            case 'Label':
                                canInsertText = false;
                                break;
                            case 'EndPoint':
                                if (node.attributes.Id !== '') {
                                    canInsertText = true;
                                    isImpression = true;
                                }
                                else {
                                    canInsertText = false;
                                    isImpression = false;
                                }
                                break;
                            case 'InsertPartial':
                                canInsertText = false;
                                break;
                            case 'ReportText':
                                canInsertText = true;
                                break;
                            case 'TemplatePartial':
                                hasSectionNot = false;
                                executeSectionIfNot = false;
                                if (node.attributes.Id === partialViewId) {
                                    executeTemplate = true;
                                    canInsertText = true;
                                    isNewTemplate = true;
                                    break;
                                }
                                else {
                                    isNewTemplate = false;
                                    executeTemplate = false;
                                }
                                break;
                            case 'SectionIfValueNot':
                                if (executeTemplate) {
                                    if (Array.isArray(selectedElements[node.attributes.DataElementId])) {
                                        try {
                                            for (var _a = __values(selectedComparisonValues[node.attributes.DataElementId + 'ComparisonValue']), _b = _a.next(); !_b.done; _b = _a.next()) {
                                                var comaprisonValue = _b.value;
                                                if (comaprisonValue !== node.attributes.ComparisonValue &&
                                                    comaprisonValue !== undefined && !isSectionIf) {
                                                    canInsertText = true;
                                                    executeSectionIfNot = true;
                                                    break;
                                                }
                                                else {
                                                    canInsertText = false;
                                                    executeSectionIfNot = false;
                                                }
                                            }
                                        }
                                        catch (e_7_1) {
                                            e_7 = { error: e_7_1 };
                                        }
                                        finally {
                                            try {
                                                if (_b && !_b.done && (_c = _a.return))
                                                    _c.call(_a);
                                            }
                                            finally {
                                                if (e_7)
                                                    throw e_7.error;
                                            }
                                        }
                                    }
                                    else if (selectedElements[node.attributes.DataElementId] !== node.attributes.ComparisonValue &&
                                        selectedElements[node.attributes.DataElementId] !== '--Select--' &&
                                        selectedElements[node.attributes.DataElementId] !== undefined &&
                                        selectedElements[node.attributes.DataElementId] !== null) {
                                        canInsertText = true;
                                        executeSectionIfNot = true;
                                    }
                                    else {
                                        canInsertText = false;
                                        executeSectionIfNot = false;
                                    }
                                }
                                hasSectionNot = true;
                                break;
                            case 'SectionIf':
                                if (selectedElements[node.attributes.DataElementId] !== undefined && selectedElements[node.attributes.DataElementId].length > 0 && (!hasSectionNot || (hasSectionNot && executeSectionIfNot))
                                    && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
                                    isSectionIf = true;
                                    canInsertText = true;
                                }
                                else {
                                    isSectionIf = false;
                                    canInsertText = false;
                                }
                                break;
                            case 'SectionIfValue':
                                if (executeTemplate) {
                                    if (Array.isArray(selectedElements[node.attributes.DataElementId])) {
                                        try {
                                            for (var _d = __values(selectedComparisonValues[node.attributes.DataElementId + 'ComparisonValue']), _e = _d.next(); !_e.done; _e = _d.next()) {
                                                var comaprisonValue = _e.value;
                                                if (comaprisonValue === node.attributes.ComparisonValue &&
                                                    comaprisonValue !== undefined) {
                                                    isSectionIf = true;
                                                    if (selectedElements[node.attributes.DataElementId] !== undefined && !isSectionIf && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
                                                        findingsText = findingsText + selectedChoiceTexts[node.attributes.DataElementId];
                                                    }
                                                    canInsertText = true;
                                                    break;
                                                }
                                                else {
                                                    isSectionIf = false;
                                                    canInsertText = false;
                                                }
                                            }
                                        }
                                        catch (e_8_1) {
                                            e_8 = { error: e_8_1 };
                                        }
                                        finally {
                                            try {
                                                if (_e && !_e.done && (_f = _d.return))
                                                    _f.call(_d);
                                            }
                                            finally {
                                                if (e_8)
                                                    throw e_8.error;
                                            }
                                        }
                                    }
                                    else if (selectedElements[node.attributes.DataElementId] === node.attributes.ComparisonValue &&
                                        selectedElements[node.attributes.DataElementId] !== undefined) {
                                        isSectionIf = true;
                                        if (selectedElements[node.attributes.DataElementId] !== undefined && !isSectionIf && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
                                            findingsText = findingsText + selectedChoiceTexts[node.attributes.DataElementId];
                                        }
                                        canInsertText = true;
                                    }
                                    else {
                                        canInsertText = false;
                                    }
                                }
                                break;
                            case 'InsertValue':
                                if (executeTemplate) {
                                    var /** @type {?} */ choiceText = selectedChoiceTexts[node.attributes.DataElementId];
                                    if (node.attributes.Id === 'findings' || canInsertText) {
                                        if (isImpression) {
                                            canInsertText = true;
                                            if (selectedElements[node.attributes.DataElementId] !== undefined && hasSectionNot && executeSectionIfNot && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
                                                if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined) {
                                                    impressionText = impressionText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
                                                }
                                                else {
                                                    impressionText = impressionText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
                                                }
                                            }
                                            else if (selectedElements[node.attributes.DataElementId] !== undefined && !hasSectionNot && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
                                                if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined) {
                                                    impressionText = impressionText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
                                                }
                                                else {
                                                    if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
                                                        impressionText = impressionText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
                                                    }
                                                }
                                            }
                                        }
                                        else {
                                            if (selectedElements[node.attributes.DataElementId] !== undefined && hasSectionNot && executeSectionIfNot && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
                                                if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined) {
                                                    findingsText = findingsText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
                                                }
                                            }
                                            else if (selectedElements[node.attributes.DataElementId] !== undefined && !hasSectionNot && selectedChoiceTexts[node.attributes.DataElementId] !== 'Other, please specify…') {
                                                if (selectedChoiceTexts[node.attributes.DataElementId] !== undefined) {
                                                    findingsText = findingsText + (Array.isArray(choiceText) ? choiceText.join(', ') : choiceText);
                                                }
                                            }
                                        }
                                    }
                                    break;
                                }
                        }
                        var e_7, _c, e_8, _f;
                    };
                    parser.onclosetag = function (node) {
                        switch (node) {
                            case 'SectionIfValueNot':
                                executeSectionIfNot = false;
                                hasSectionNot = false;
                                if (isSectionIf) {
                                    canInsertText = true;
                                }
                                break;
                            case 'TemplatePartial':
                                isNewTemplate = true;
                                canInsertText = false;
                                executeTemplate = true;
                                break;
                            case 'InsertPartial':
                                canInsertText = true;
                                break;
                            case 'SectionIf':
                                isSectionIf = false;
                                break;
                        }
                    };
                    parser.onend = function () {
                        // parser stream is done, and ready to have more stuff written to it.
                        var /** @type {?} */ reportTextObj = new AllReportText();
                        reportTextObj.sectionId = 'findings';
                        reportTextObj.reportText = findingsText;
                        allReportText[reportTextObj.sectionId] = reportTextObj;
                    };
                    parser.write(templatePartialsText).onend();
                }
                this.mainReportTextObj = new MainReportText();
                this.mainReportTextObj.reportTextMainContent = reportTextContent;
                this.mainReportTextObj.allReportText = allReportText;
                this.returnReportText.emit(this.mainReportTextObj);
            };
        AssistDataElementComponent.decorators = [
            { type: core.Component, args: [{
                        selector: 'acr-assist-data-element',
                        template: "<ng-container *ngFor=\"let DataElement of dataElements\">  \n  <ng-container *ngIf=\"(DataElement.dataElementType == 'ChoiceDataElement'\n    || DataElement.dataElementType == 'NumericDataElement'\n    || DataElement.dataElementType == 'IntegerDataElement' \n    || DataElement.dataElementType == 'MultiChoiceDataElement'\n    || DataElement.dataElementType == 'DateTimeDataElement'\n    || DataElement.dataElementType == 'DurationDataElement') \">\n    <ng-container *ngIf=\"DataElement.isVisible\">\n      <div id=\"div_{{DataElement.id}}\">\n        <ng-container *ngIf=\"DataElement.dataElementType == 'ChoiceDataElement'\">\n          <acr-assist-choice-element [choiceDataElement]='DataElement' [imagePath]='imagePath' (returnChoiceElement)='choiceSelected($event)'></acr-assist-choice-element>\n        </ng-container>\n        <ng-container *ngIf=\"DataElement.dataElementType == 'MultiChoiceDataElement'\">\n          <acr-assist-multi-choice-element [multiChoiceElement]='DataElement' [imagePath]='imagePath' (returnMultiChoice)='multiSelected($event)'></acr-assist-multi-choice-element>\n        </ng-container>\n        <ng-container *ngIf=\"DataElement.dataElementType == 'NumericDataElement' || DataElement.dataElementType == 'IntegerDataElement'\">\n          <acr-assist-numeric-element [numericDataElement]='DataElement' [imagePath]='imagePath' (returnNumericElement)='numericSelected($event)'></acr-assist-numeric-element>\n        </ng-container>\n        <ng-container *ngIf=\"DataElement.dataElementType == 'DateTimeDataElement'\">\n          <acr-assist-date-time-element [dateTimeDataElement]='DataElement'></acr-assist-date-time-element>\n        </ng-container>\n        <ng-container *ngIf=\"DataElement.dataElementType == 'DurationDataElement'\">\n            <acr-assist-duration-element [durationDataElement]='DataElement'></acr-assist-duration-element>\n          </ng-container>\n      </div>\n    </ng-container>\n  </ng-container>\n</ng-container>\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 */
        AssistDataElementComponent.ctorParameters = function () {
            return [
                { type: SimulatorEngineService },
                { type: SimulatorCommunicationService }
            ];
        };
        AssistDataElementComponent.propDecorators = {
            dataElements: [{ type: core.Input }],
            imagePath: [{ type: core.Input }],
            Endpoints: [{ type: core.Input }],
            templatePartial: [{ type: core.Input }],
            endPointXMLString: [{ type: core.Input }],
            xmlContent: [{ type: core.Input }],
            returnReportText: [{ type: core.Output }],
            returnExecutionHistory: [{ type: core.Output }],
            returnDataElementChanged: [{ type: core.Output }],
            isReset: [{ type: core.Input }],
            inputValues: [{ type: core.Input }]
        };
        return AssistDataElementComponent;
    }());
    var ChoiceElement = (function () {
        function ChoiceElement() {
        }
        return ChoiceElement;
    }());
    var NumericElement = (function () {
        function NumericElement() {
        }
        return NumericElement;
    }());
    var MultiChoiceElement = (function () {
        function MultiChoiceElement() {
        }
        return MultiChoiceElement;
    }());
    var MainReportText = (function () {
        function MainReportText() {
        }
        return MainReportText;
    }());
    var AllReportText = (function () {
        function AllReportText() {
        }
        return AllReportText;
    }());
    var ExecutedResultHistory = (function () {
        function ExecutedResultHistory() {
        }
        return ExecutedResultHistory;
    }());
    var FinalExecutedHistory = (function () {
        function FinalExecutedHistory() {
        }
        return FinalExecutedHistory;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var HintDiagramComponent = (function () {
        function HintDiagramComponent(domSanitizer) {
            this.isDataURL = /^\s*data:([a-z]+\/[a-z]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i;
            this.activeSlideIndex = 0;
            this.domSanitizer = domSanitizer;
        }
        /**
         * @return {?}
         */
        HintDiagramComponent.prototype.resetCarouselIndex = /**
         * @return {?}
         */
            function () {
                this.activeSlideIndex = 0;
            };
        /**
         * @param {?} location
         * @return {?}
         */
        HintDiagramComponent.prototype.getImageDataUrl = /**
         * @param {?} location
         * @return {?}
         */
            function (location) {
                var /** @type {?} */ isDataURL = !!location.match(this.isDataURL);
                if (isDataURL) {
                    location = location.replace('unsafe:', '');
                    return location;
                }
                else {
                    return this.imagePath + '/' + location;
                }
            };
        HintDiagramComponent.decorators = [
            { type: core.Component, args: [{
                        selector: 'acr-hint-diagram',
                        template: "<ng-container *ngIf=\"dataElement !== undefined\">\n  <button type=\"button\" class=\"btn btn-default btn-xs\" data-toggle=\"modal\" attr.data-target=\"#{{'diag_'+dataElement.id}}\"\n    (click)=\"resetCarouselIndex()\">\n    <span class=\"glyphicon glyphicon-picture\" aria-hidden=\"true\" data-toggle=\"tooltip\" data-placement=\"right\" title=\"Hint Diagrams\"></span>\n  </button>\n  <div class=\"modal inmodal fade\" id=\"{{'diag_'+dataElement.id}}\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n    <div class=\"modal-dialog modal-lg\">\n      <div class=\"modal-content\">\n        <div class=\"modal-header\">\n          <button type=\"button\" class=\"close\" data-dismiss=\"modal\">\n            <span aria-hidden=\"true\">&times;</span>\n            <span class=\"sr-only\">Close</span>\n          </button>\n          <h4 class=\"modal-title float-left\">{{dataElement.label}}</h4>\n        </div>\n        <div class=\"modal-body\">\n          <ng-container>\n            <carousel [(activeSlide)]=\"activeSlideIndex\" interval=\"false\">\n              <ng-container *ngFor=\"let diag of dataElement.diagrams \">\n                <slide>\n                    <img class=\"img-responsive max-w-h-100\" [src]=\"domSanitizer.bypassSecurityTrustUrl(getImageDataUrl(diag.location))\" alt=\"{{ diag.label }}\">\n                </slide>\n              </ng-container>\n            </carousel>\n          </ng-container>\n        </div>\n        <div class=\"modal-footer\">\n          <button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\">Close</button>\n        </div>\n      </div>\n    </div>\n  </div>\n</ng-container>\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 */
        HintDiagramComponent.ctorParameters = function () {
            return [
                { type: platformBrowser.DomSanitizer }
            ];
        };
        HintDiagramComponent.propDecorators = {
            dataElement: [{ type: core.Input }],
            imagePath: [{ type: core.Input }]
        };
        return HintDiagramComponent;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var GlobalValue = (function (_super) {
        __extends(GlobalValue, _super);
        function GlobalValue() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        return GlobalValue;
    }(BaseDataElement));

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var GlobalValueCreationService = (function (_super) {
        __extends(GlobalValueCreationService, _super);
        function GlobalValueCreationService(diagramService) {
            var _this = _super.call(this, diagramService) || this;
            _this.elementType = 'GlobalValue';
            return _this;
        }
        /**
         * @param {?} data
         * @return {?}
         */
        GlobalValueCreationService.prototype.createElement = /**
         * @param {?} data
         * @return {?}
         */
            function (data) {
                var /** @type {?} */ dataElement = new GlobalValue();
                dataElement.id = data.Attr.Id;
                dataElement.currentValue = data._;
                dataElement.dataElementType = 'GlobalValue';
                return dataElement;
            };
        GlobalValueCreationService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        GlobalValueCreationService.ctorParameters = function () {
            return [
                { type: DiagramService }
            ];
        };
        return GlobalValueCreationService;
    }(DataElementCreationBaseService));

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var SelectedCondition = (function () {
        function SelectedCondition() {
        }
        return SelectedCondition;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var AssistNumericElementComponent = (function () {
        function AssistNumericElementComponent(formBuilder, simulatorEngineService, simulatorCommunicationService) {
            var _this = this;
            this.formBuilder = formBuilder;
            this.simulatorEngineService = simulatorEngineService;
            this.returnNumericElement = new core.EventEmitter();
            this.subscription = simulatorCommunicationService.simulatorSource$.subscribe(function (mission) {
                _this.UpdateFormValidator();
            });
        }
        // tslint:disable-next-line:use-life-cycle-interface
        /**
         * @return {?}
         */
        AssistNumericElementComponent.prototype.ngOnDestroy = /**
         * @return {?}
         */
            function () {
                // prevent memory leak when component destroyed
                this.subscription.unsubscribe();
            };
        /**
         * @return {?}
         */
        AssistNumericElementComponent.prototype.ngOnInit = /**
         * @return {?}
         */
            function () {
                this.createNumericElementForm();
            };
        // tslint:disable-next-line:use-life-cycle-interface
        /**
         * @param {?} changes
         * @return {?}
         */
        AssistNumericElementComponent.prototype.ngOnChanges = /**
         * @param {?} changes
         * @return {?}
         */
            function (changes) {
                // console.log('asda');
            };
        /**
         * @return {?}
         */
        AssistNumericElementComponent.prototype.ngAfterViewInit = /**
         * @return {?}
         */
            function () {
                if (this.numericDataElement.currentValue !== undefined && this.numericDataElement.currentValue !== 0) {
                    this.simulatorEngineService.addOrUpdateDataElement(this.numericDataElement.id, this.numericDataElement.currentValue, this.numericDataElement.currentValue);
                    this.numberValue = this.numericDataElement.currentValue;
                    this.loadedNumericValue(this.numericDataElement.id, this.numericDataElement.currentValue, this.numericDataElement.label);
                }
                else {
                    this.returnNumericElement.emit(undefined);
                }
            };
        /**
         * @param {?} id
         * @param {?} value
         * @param {?} selectedCondition
         * @return {?}
         */
        AssistNumericElementComponent.prototype.loadedNumericValue = /**
         * @param {?} id
         * @param {?} value
         * @param {?} selectedCondition
         * @return {?}
         */
            function (id, value, selectedCondition) {
                var /** @type {?} */ choiceElement = new NumericElement();
                choiceElement.elementId = id;
                choiceElement.selectedValue = value;
                this.selectedCondition = new SelectedCondition();
                this.selectedCondition.selectedConditionId = id;
                this.selectedCondition.selectedCondition = selectedCondition;
                this.selectedCondition.selectedValue = value;
                this.returnNumericElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
            };
        /**
         * @param {?} element
         * @param {?} selectedCondition
         * @return {?}
         */
        AssistNumericElementComponent.prototype.choiceSelected = /**
         * @param {?} element
         * @param {?} selectedCondition
         * @return {?}
         */
            function (element, selectedCondition) {
                var /** @type {?} */ choiceElement = new NumericElement();
                choiceElement.elementId = element.id;
                choiceElement.selectedValue = element.value;
                this.selectedCondition = new SelectedCondition();
                this.selectedCondition.selectedConditionId = element.id;
                this.selectedCondition.selectedCondition = selectedCondition;
                this.selectedCondition.selectedValue = element.value;
                this.returnNumericElement.emit({ receivedElement: choiceElement, selectedCondition: this.selectedCondition });
            };
        /**
         * @param {?} event
         * @return {?}
         */
        AssistNumericElementComponent.prototype.onlyIntegerKey = /**
         * @param {?} event
         * @return {?}
         */
            function (event) {
                return (event.charCode === 8 || event.charCode === 0) ? null : event.charCode >= 48 && event.charCode <= 57;
            };
        /**
         * @return {?}
         */
        AssistNumericElementComponent.prototype.createNumericElementForm = /**
         * @return {?}
         */
            function () {
                this.numericElementForm = this.formBuilder.group({
                    numericElement: ['', forms.Validators.compose([forms.Validators.required, forms.Validators.min(+this.numericDataElement.minimum), forms.Validators.max(+this.numericDataElement.maximum)])],
                });
            };
        /**
         * @return {?}
         */
        AssistNumericElementComponent.prototype.UpdateFormValidator = /**
         * @return {?}
         */
            function () {
                this.numericElementForm.controls['numericElement'].setValidators([forms.Validators.compose([forms.Validators.required,
                        forms.Validators.min(+this.numericDataElement.minimum), forms.Validators.max(+this.numericDataElement.maximum)])]);
                this.numericElementForm.controls['numericElement'].updateValueAndValidity();
            };
        AssistNumericElementComponent.decorators = [
            { type: core.Component, args: [{
                        selector: 'acr-assist-numeric-element',
                        template: "<form [formGroup]=\"numericElementForm\" novalidate>\n  <div class=\"form-group\">\n    <div class=\"col-sm-5 text-right\">\n      <label class=\"control-label break-word\">\n        {{numericDataElement.label}}\n        <span *ngIf=\"numericDataElement.unit != undefined && numericDataElement.unit != ''\"> ({{numericDataElement.unit}})</span>\n      </label>\n      <ng-container *ngIf=\"numericDataElement.hint !== '' && numericDataElement.hint !== undefined\">\n        <i class=\"fa fa-info-circle text-primary whitespace\" title=\"{{numericDataElement.hint}}\"></i>\n      </ng-container>\n      <ng-container *ngIf=\"numericDataElement.diagrams != undefined \">\n        <acr-hint-diagram [dataElement]=\"numericDataElement\" [imagePath]=\"imagePath\"></acr-hint-diagram>\n      </ng-container>\n      <ng-container *ngIf=\"this.numericDataElement.isRequired\">\n        <span *ngIf=\"numericElementForm.controls['numericElement'].invalid\">\n          <span *ngIf=\"numericElementForm.controls['numericElement'].errors.required\" class=\"required-field\" title=\"Required Field\">\n            *\n          </span>\n        </span>\n      </ng-container>\n      <span *ngIf=\"numericElementForm.controls['numericElement'].invalid && numericElementForm.controls['numericElement'].errors.min\"\n        class=\"required-field\" title=\" Minimum value is {{numericDataElement.minimum}}\">\n        *\n      </span>      \n      <span *ngIf=\"numericElementForm.controls['numericElement'].invalid && numericElementForm.controls['numericElement'].errors.max\"\n        class=\"required-field\" title=\" Maximum value is {{numericDataElement.maximum}}\">\n        *\n      </span>\n    </div>\n    <ng-container *ngIf=\"numericDataElement.dataElementType === 'NumericDataElement'\">\n      <div class=\"col-sm-7\">\n        <input [attr.disabled]=\"numericDataElement.isEditable == false ? 'disabled' : null\" acrNumericOnly [(ngModel)]=\"numberValue\" id=\"{{numericDataElement.id}}\" type=\"text\" class=\"form-control\" formControlName=\"numericElement\"\n          onpaste=\"return false;\" (input)=\"choiceSelected($event.target, numericDataElement.label)\"\n          min=\"{{numericDataElement.minimum}}\" max=\"{{numericDataElement.maximum}}\" required>          \n      </div>\n    </ng-container>\n    <ng-container *ngIf=\"numericDataElement.dataElementType === 'IntegerDataElement'\">\n      <div class=\"col-sm-7\">\n        <input [attr.disabled]=\"numericDataElement.isEditable == false ? 'disabled' : null\" [(ngModel)]=\"numberValue\" id=\"{{numericDataElement.id}}\" type=\"text\" class=\"form-control\" formControlName=\"numericElement\"\n          (keypress)=\"onlyIntegerKey($event)\" onpaste=\"return false;\" (input)=\"choiceSelected($event.target, numericDataElement.label)\"\n          min=\"{{numericDataElement.minimum}}\" max=\"{{numericDataElement.maximum}}\" required>\n      </div>\n    </ng-container>\n  </div>\n</form>\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 */
        AssistNumericElementComponent.ctorParameters = function () {
            return [
                { type: forms.FormBuilder },
                { type: SimulatorEngineService },
                { type: SimulatorCommunicationService }
            ];
        };
        AssistNumericElementComponent.propDecorators = {
            numericDataElement: [{ type: core.Input }],
            imagePath: [{ type: core.Input }],
            returnNumericElement: [{ type: core.Output }]
        };
        return AssistNumericElementComponent;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var /** @type {?} */ $$2 = require('jquery');
    var AssistChoiceElementComponent = (function () {
        function AssistChoiceElementComponent(formBuilder, simulatorEngineService) {
            this.formBuilder = formBuilder;
            this.simulatorEngineService = simulatorEngineService;
            this.returnChoiceElement = new core.EventEmitter();
            this.choiceChange = new core.EventEmitter();
        }
        /**
         * @return {?}
         */
        AssistChoiceElementComponent.prototype.ngOnInit = /**
         * @return {?}
         */
            function () {
                this.createChoiceElementForm();
            };
        /**
         * @return {?}
         */
        AssistChoiceElementComponent.prototype.ngAfterViewInit = /**
         * @return {?}
         */
            function () {
                $$2('#div_' + this.choiceDataElement.id + '_other').hide();
                if (this.choiceDataElement.currentValue !== undefined) {
                    $$2('#' + 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: ['', forms.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') {
                    $$2('#div_' + elementId + '_other').show();
                }
                else {
                    $$2('#div_' + elementId + '_other').hide();
                    $$2('#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: core.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: forms.FormBuilder },
                { type: SimulatorEngineService }
            ];
        };
        AssistChoiceElementComponent.propDecorators = {
            choiceDataElement: [{ type: core.Input }],
            imagePath: [{ type: core.Input }],
            returnChoiceElement: [{ type: core.Output }],
            choiceChange: [{ type: core.Output }],
            disabled: [{ type: core.Input }]
        };
        return AssistChoiceElementComponent;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var /** @type {?} */ $$3 = require('jquery');
    var AssistMultiChoiceElementComponent = (function () {
        function AssistMultiChoiceElementComponent(formBuilder, simulatorEngineService) {
            this.formBuilder = formBuilder;
            this.simulatorEngineService = simulatorEngineService;
            this.returnMultiChoice = new core.EventEmitter();
            this.multiElements = [];
            this.multiChoiceValues = [];
            this.multiChoiceComaprisonValues = [];
            this.choiceValue = [];
        }
        /**
         * @return {?}
         */
        AssistMultiChoiceElementComponent.prototype.ngOnInit = /**
         * @return {?}
         */
            function () {
                this.createMultiChoiceElementForm();
            };
        /**
         * @return {?}
         */
        AssistMultiChoiceElementComponent.prototype.ngAfterViewInit = /**
         * @return {?}
         */
            function () {
                if (this.multiChoiceElement.currentValue !== undefined) {
                    var /** @type {?} */ values = [];
                    var /** @type {?} */ labels = [];
                    for (var /** @type {?} */ choice in this.multiChoiceElement.choiceInfo) {
                        if (Array.isArray(this.multiChoiceElement.currentValue)) {
                            try {
                                for (var _a = __values(this.multiChoiceElement.currentValue), _b = _a.next(); !_b.done; _b = _a.next()) {
                                    var currValue = _b.value;
                                    if (currValue === this.multiChoiceElement.choiceInfo[choice].value && this.multiChoiceElement.choiceInfo[choice].value !== undefined) {
                                        this.choiceValue = this.multiChoiceElement.currentValue;
                                        $$3('#' + this.multiChoiceElement.id + '_' + this.multiChoiceElement.choiceInfo[choice].value).prop('checked', true);
                                        values.push(currValue);
                                        labels.push(this.multiChoiceElement.choiceInfo[choice].label);
                                        break;
                                    }
                                }
                            }
                            catch (e_1_1) {
                                e_1 = { error: e_1_1 };
                            }
                            finally {
                                try {
                                    if (_b && !_b.done && (_c = _a.return))
                                        _c.call(_a);
                                }
                                finally {
                                    if (e_1)
                                        throw e_1.error;
                                }
                            }
                        }
                        else {
                            if (this.multiChoiceElement.currentValue === this.multiChoiceElement.choiceInfo[choice].value && this.multiChoiceElement.choiceInfo[choice].value !== undefined) {
                                this.choiceValue = this.multiChoiceElement.currentValue;
                                $$3('#' + this.multiChoiceElement.id + '_' + this.multiChoiceElement.currentValue).prop('checked', true);
                                values.push(this.multiChoiceElement.currentValue);
                                labels.push(this.multiChoiceElement.choiceInfo[choice].label);
                            }
                        }
                    }
                    this.selectedMultiChoice(this.multiChoiceElement.id, this.multiChoiceElement.label, values, labels);
                }
                else {
                    this.returnMultiChoice.emit(undefined);
                }
                var e_1, _c;
            };
        /**
         * @param {?} elementId
         * @param {?} selectedCondition
         * @param {?} choiceValue
         * @param {?} choiceLabel
         * @return {?}
         */
        AssistMultiChoiceElementComponent.prototype.selectedMultiChoice = /**
         * @param {?} elementId
         * @param {?} selectedCondition
         * @param {?} choiceValue
         * @param {?} choiceLabel
         * @return {?}
         */
            function (elementId, selectedCondition, choiceValue, choiceLabel) {
                var /** @type {?} */ multiElement = new MultiChoiceElement();
                if ($$3('#' + elementId + '_' + choiceValue).is(':checked')) {
                    this.multiChoiceValues = choiceLabel;
                    this.multiChoiceComaprisonValues = choiceValue;
                }
                else {
                    var /** @type {?} */ index = this.multiChoiceValues.indexOf(choiceLabel);
                    var /** @type {?} */ comparisonIndex = this.multiChoiceComaprisonValues.indexOf(choiceValue);
                    if (index > -1) {
                        this.multiChoiceValues.splice(index, 1);
                    }
                    if (comparisonIndex > -1) {
                        this.multiChoiceComaprisonValues.splice(comparisonIndex, 1);
                    }
                }
                multiElement.elementId = elementId;
                multiElement.selectedValues = this.multiChoiceValues;
                multiElement.selectedComparisonValues = this.multiChoiceComaprisonValues;
                this.selectedCondition = new SelectedCondition();
                this.selectedCondition.selectedConditionId = elementId;
                this.selectedCondition.selectedCondition = selectedCondition;
                this.selectedCondition.selectedValue = this.multiChoiceValues;
                this.returnMultiChoice.emit({ receivedElement: multiElement, selectedCondition: this.selectedCondition });
            };
        /**
         * @param {?} elementId
         * @param {?} selectedCondition
         * @param {?} value
         * @param {?} event
         * @return {?}
         */
        AssistMultiChoiceElementComponent.prototype.updateMultiChoice = /**
         * @param {?} elementId
         * @param {?} selectedCondition
         * @param {?} value
         * @param {?} event
         * @return {?}
         */
            function (elementId, selectedCondition, value, event) {
                var /** @type {?} */ multiElement = new MultiChoiceElement();
                if (event.currentTarget.checked) {
                    this.multiChoiceValues.push(value);
                    this.multiChoiceComaprisonValues.push(event.currentTarget.value);
                }
                else {
                    var /** @type {?} */ index = this.multiChoiceValues.indexOf(value);
                    var /** @type {?} */ comparisonIndex = this.multiChoiceComaprisonValues.indexOf(event.currentTarget.value);
                    if (index > -1) {
                        this.multiChoiceValues.splice(index, 1);
                    }
                    if (comparisonIndex > -1) {
                        this.multiChoiceComaprisonValues.splice(comparisonIndex, 1);
                    }
                }
                multiElement.elementId = elementId;
                multiElement.selectedValues = this.multiChoiceValues;
                multiElement.selectedComparisonValues = this.multiChoiceComaprisonValues;
                this.selectedCondition = new SelectedCondition();
                this.selectedCondition.selectedConditionId = elementId;
                this.selectedCondition.selectedCondition = selectedCondition;
                this.selectedCondition.selectedValue = this.multiChoiceValues;
                this.returnMultiChoice.emit({ receivedElement: multiElement, selectedCondition: this.selectedCondition });
            };
        /**
         * @return {?}
         */
        AssistMultiChoiceElementComponent.prototype.createMultiChoiceElementForm = /**
         * @return {?}
         */
            function () {
                this.multiChoiceElementForm = this.formBuilder.group({
                    multiCheckBox: ['', forms.Validators.required],
                }, {
                    validator: this.specificValueInsideRange('multiCheckBox')
                });
            };
        /**
         * @param {?} checkBoxKey
         * @return {?}
         */
        AssistMultiChoiceElementComponent.prototype.specificValueInsideRange = /**
         * @param {?} checkBoxKey
         * @return {?}
         */
            function (checkBoxKey) {
                var _this = this;
                return function (group) {
                    var /** @type {?} */ choiceControl = group.controls[checkBoxKey];
                    if (_this.multiChoiceElement.isRequired) {
                        return choiceControl.setErrors({ notEquivalent: true });
                    }
                    else {
                        return choiceControl.setErrors(null);
                    }
                };
            };
        AssistMultiChoiceElementComponent.decorators = [
            { type: core.Component, args: [{
                        selector: 'acr-assist-multi-choice-element',
                        template: "<form [formGroup]=\"multiChoiceElementForm\" novalidate>\n  <div class=\"form-group\">\n    <div class=\"col-sm-5 text-right\">\n      <label class=\"control-label break-word\">{{multiChoiceElement.label}} <span *ngIf=\"multiChoiceElement.unit != undefined && multiChoiceElement.unit != ''\"> ({{multiChoiceElement.unit}})</span>\n      </label>\n      <ng-container *ngIf=\"multiChoiceElement.hint !== '' && multiChoiceElement.hint !== undefined\">\n        <i class=\"fa fa-info-circle text-primary whitespace\" title=\"{{multiChoiceElement.hint}}\"></i>\n      </ng-container>\n      <ng-container *ngIf=\"multiChoiceElement.diagrams != undefined \">\n        <acr-hint-diagram [dataElement]=\"multiChoiceElement\" [imagePath]=\"imagePath\"></acr-hint-diagram>\n      </ng-container>\n      <ng-container *ngIf=\"multiChoiceElement.isRequired\">\n      <span *ngIf=\"multiChoiceElementForm.controls['multiCheckBox'].invalid && !multiChoiceValues.length\" class=\"required-field\"\n        title=\"Required Field\">\n        *\n      </span>\n    </ng-container>\n    </div>\n    <div class=\"col-sm-7\" [ngClass]=\"multiChoiceElement.isEditable == false ? 'disabled-element' : ''\">\n      <div *ngFor=\"let choice of multiChoiceElement.choiceInfo\" class=\"checkbox checkboxCustomized\" title=\"{{choice.hint}}\">\n        <label [hidden]=\"multiChoiceElement.ChoiceNotRelevant != undefined ? \n        multiChoiceElement.ChoiceNotRelevant.indexOf(choice.value) > -1 ? true: null\n        : null\">\n          <input type=\"checkbox\" id=\"{{multiChoiceElement.id}}_{{choice.value}}\" [checked]=\"false\" formControlName=\"multiCheckBox\"\n            value=\"{{choice.value}}\" (change)=\"updateMultiChoice(multiChoiceElement.id, multiChoiceElement.label, (choice.reportText !== undefined) ? choice.reportText : choice.label, $event)\">\n          {{choice.label}}\n        </label>\n      </div>\n    </div>\n  </div>\n</form>",
                        styles: [".checkboxCustomized{min-height:0!important;padding-top:0!important}.disabled-element{cursor:not-allowed}.disabled-element:before{content:\"\";z-index:1;position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(255,255,255,.8)}", ".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 */
        AssistMultiChoiceElementComponent.ctorParameters = function () {
            return [
                { type: forms.FormBuilder },
                { type: SimulatorEngineService }
            ];
        };
        AssistMultiChoiceElementComponent.propDecorators = {
            multiChoiceElement: [{ type: core.Input }],
            imagePath: [{ type: core.Input }],
            returnMultiChoice: [{ type: core.Output }]
        };
        return AssistMultiChoiceElementComponent;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var ImageMapComponent = (function () {
        function ImageMapComponent(domSanitizer) {
            this.$ = require('jquery');
            this.DataElements = {};
            this.FormValues = {};
            this.isDataURL = /^\s*data:([a-z]+\/[a-z]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i;
            this.imageExist = true;
            this.SelectionValue = '';
            this.domSanitizer = domSanitizer;
        }
        /**
         * @return {?}
         */
        ImageMapComponent.prototype.ngOnInit = /**
         * @return {?}
         */
            function () {
                if (this.DataElement === undefined) {
                    return;
                }
                this.displayValue('');
            };
        /**
         * @param {?} mouseX
         * @param {?} mouseY
         * @param {?} Coordinates
         * @return {?}
         */
        ImageMapComponent.prototype.isInRectangle = /**
         * @param {?} mouseX
         * @param {?} mouseY
         * @param {?} Coordinates
         * @return {?}
         */
            function (mouseX, mouseY, Coordinates) {
                var /** @type {?} */ COArray = Coordinates.split(',');
                if (COArray[0] < mouseX
                    && (COArray[0] + COArray[2]) > mouseX
                    && COArray[1] < mouseY
                    && (COArray[1] + COArray[3]) > mouseY) {
                    return true;
                }
                return false;
            };
        /**
         * @param {?} mouseX
         * @param {?} mouseY
         * @param {?} Coordinates
         * @return {?}
         */
        ImageMapComponent.prototype.isInCircle = /**
         * @param {?} mouseX
         * @param {?} mouseY
         * @param {?} Coordinates
         * @return {?}
         */
            function (mouseX, mouseY, Coordinates) {
                var /** @type {?} */ COArray = Coordinates.split(',');
                if (Math.sqrt(Math.pow((mouseX - COArray[0]), 2) + Math.pow((mouseY - COArray[1]), 2)) < COArray[2]) {
                    return true;
                }
                else {
                    return false;
                }
            };
        /**
         * @param {?} x
         * @param {?} y
         * @param {?} Coordinates
         * @return {?}
         */
        ImageMapComponent.prototype.isInPolygon = /**
         * @param {?} x
         * @param {?} y
         * @param {?} Coordinates
         * @return {?}
         */
            function (x, y, Coordinates) {
                var /** @type {?} */ COArray = Coordinates.split(',');
                var /** @type {?} */ vs = [];
                for (var /** @type {?} */ i = 0; i < COArray.length; i++) {
                    var /** @type {?} */ point = [];
                    point.push(COArray[i]);
                    point.push(COArray[i + 1]);
                    i += 1;
                    vs.push(point);
                }
                var /** @type {?} */ inside = false;
                for (var /** @type {?} */ i = 0, /** @type {?} */ j = vs.length - 1; i < vs.length; j = i++) {
                    var /** @type {?} */ xi = vs[i][0], /** @type {?} */ yi = vs[i][1];
                    var /** @type {?} */ xj = vs[j][0], /** @type {?} */ yj = vs[j][1];
                    var /** @type {?} */ intersect = ((yi > y) !== (yj > y))
                        && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
                    if (intersect) {
                        inside = !inside;
                    }
                }
                return inside;
            };
        /**
         * @param {?} e
         * @param {?} dataElement
         * @return {?}
         */
        ImageMapComponent.prototype.imageClick = /**
         * @param {?} e
         * @param {?} dataElement
         * @return {?}
         */
            function (e, dataElement) {
                var /** @type {?} */ O_height = dataElement.ImageProp.height;
                var /** @type {?} */ O_width = dataElement.ImageProp.width;
                var /** @type {?} */ $elem = this.$(e.target);
                var /** @type {?} */ N_height = $elem.height();
                var /** @type {?} */ N_width = $elem.width();
                var /** @type {?} */ offset = $elem.offset();
                var /** @type {?} */ offset_t = offset.top - this.$(window).scrollTop();
                var /** @type {?} */ offset_l = offset.left - this.$(window).scrollLeft();
                var /** @type {?} */ x = e.clientX - offset_l;
                var /** @type {?} */ y = e.clientY - offset_t;
                try {
                    for (var _a = __values(dataElement.ImageOptions), _b = _a.next(); !_b.done; _b = _a.next()) {
                        var opt = _b.value;
                        if (opt.Shape === 'rect') {
                            if (this.isInRectangle(x, y, opt.Coordinates)) {
                                this.FormValues[dataElement.ID] = opt.Value;
                                break;
                            }
                        }
                        else if (opt.Shape === 'circle') {
                            if (this.isInCircle(x, y, opt.Coordinates)) {
                                this.FormValues[dataElement.ID] = opt.Value;
                                break;
                            }
                        }
                        else if (opt.Shape === 'poly') {
                            if (this.isInPolygon(x, y, opt.Coordinates)) {
                                this.FormValues[dataElement.ID] = opt.Value;
                                break;
                            }
                        }
                    }
                }
                catch (e_1_1) {
                    e_1 = { error: e_1_1 };
                }
                finally {
                    try {
                        if (_b && !_b.done && (_c = _a.return))
                            _c.call(_a);
                    }
                    finally {
                        if (e_1)
                            throw e_1.error;
                    }
                }
                var e_1, _c;
            };
        /**
         * @param {?} val
         * @return {?}
         */
        ImageMapComponent.prototype.setValue = /**
         * @param {?} val
         * @return {?}
         */
            function (val) {
                try {
                    for (var _a = __values(this.DataElement.choiceInfo), _b = _a.next(); !_b.done; _b = _a.next()) {
                        var optValue = _b.value;
                        if (this.DataElement.choiceInfo.length <= 5 && this.DataElement.choiceInfo.length > 0) {
                            if (optValue.value === val) {
                                this.$('#' + val + '_' + this.DataElement.id).prop('checked', true);
                                var /** @type {?} */ customEvent = document.createEvent('Event');
                                customEvent.initEvent('change', true, true);
                                this.$('#' + val + '_' + this.DataElement.id)[0].dispatchEvent(customEvent);
                            }
                            else {
                                this.$('#' + optValue.value + '_' + this.DataElement.id).prop('checked', false);
                            }
                        }
                        else {
                            if (optValue.value === val) {
                                this.$('#' + this.DataElement.id).val(optValue.value);
                                var /** @type {?} */ customEvent = document.createEvent('Event');
                                customEvent.initEvent('change', true, true);
                                this.$('#' + this.DataElement.id)[0].dispatchEvent(customEvent);
                                break;
                            }
                        }
                    }
                }
                catch (e_2_1) {
                    e_2 = { error: e_2_1 };
                }
                finally {
                    try {
                        if (_b && !_b.done && (_c = _a.return))
                            _c.call(_a);
                    }
                    finally {
                        if (e_2)
                            throw e_2.error;
                    }
                }
                this.DataElement.currentValue = val;
                // this.FormValues[this.DataElement.id] = val;
                var e_2, _c;
            };
        /**
         * @param {?} val
         * @return {?}
         */
        ImageMapComponent.prototype.displayValue = /**
         * @param {?} val
         * @return {?}
         */
            function (val) {
                if (val === '') {
                    this.SelectionValue = 'Image Map Diagram';
                }
                else {
                    this.SelectionValue = 'Selected Value : ' + val;
                }
            };
        /**
         * @param {?} location
         * @return {?}
         */
        ImageMapComponent.prototype.getImageDataUrl = /**
         * @param {?} location
         * @return {?}
         */
            function (location) {
                var /** @type {?} */ isDataURL = !!location.match(this.isDataURL);
                if (isDataURL) {
                    location = location.replace('unsafe:', '');
                    return location;
                }
                else {
                    return this.imagePath + '/' + location;
                }
            };
        ImageMapComponent.decorators = [
            { type: core.Component, args: [{
                        selector: 'acr-image-map',
                        template: "<div class=\"col-sm-8\">\n  <label class=\"control-label font-weight-400\">Not sure? try out this image </label>\n  <button type=\"button\" class=\"btn btn-default\" data-toggle=\"modal\" attr.data-target=\"#{{'imgMap_Modal_'+DataElement.id}}\">\n    <span class=\"glyphicon glyphicon-picture\" aria-hidden=\"true\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Image Map\"></span>\n  </button>\n</div>\n<ng-container *ngIf=\"imagePath != undefined\">\n  <div class=\"modal inmodal fade\" id=\"{{'imgMap_Modal_'+DataElement.id}}\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n    <div class=\"modal-dialog modal-lg\">\n      <div class=\"modal-content\">\n        <div class=\"modal-header\">\n          <button type=\"button\" class=\"close\" data-dismiss=\"modal\">\n            <span aria-hidden=\"true\">&times;</span>\n            <span class=\"sr-only\">Close</span>\n          </button>\n          <h4 class=\"modal-title\"> {{SelectionValue}}</h4>\n        </div>\n        <div class=\"modal-body\">\n          <div class=\"row\">\n            <div class=\"col-md-12\">\n              <ng-container *ngIf=\"imageExist == true\">\n                  <img class=\"ImgOption danger img-responsive max-w-h-100\" alt=\"{{ DataElement.imageMap.label }}\" data-dismiss=\"modal\" attr.id=\"{{'imgMap_Img_'+DataElement.id}}\"\n                    (click)=\"imageClick($event,DataElement);\" attr.data-elementID=\"{{DataElement.id}}\" attr.usemap=\"#{{'imgMap_'+DataElement.id}}\"\n                    [src]=\"domSanitizer.bypassSecurityTrustUrl(getImageDataUrl(DataElement.imageMap.location))\">\n                <map name=\"{{'imgMap_'+DataElement.id}}\">\n                  <ng-container *ngFor=\"let imgOpt of DataElement.imageMap.map.areas\">\n                    <area attr.shape=\"{{imgOpt.shape}}\" attr.imgID=\"{{'imgMap_Img_'+DataElement.id}}\" attr.coords=\"{{imgOpt.coords}}\"\n                      attr.alt=\"{{imgOpt.choiceValue}}\" (mouseover)='displayValue(imgOpt.choiceValue);' (mouseout)='displayValue(\"\");'\n                      (click)=\"setValue(imgOpt.choiceValue);\" data-dismiss=\"modal\">\n                  </ng-container>\n                </map>\n              </ng-container>\n              <ng-container *ngIf=\"imageExist == false\">\n                <div class=\"\">\n                  No Image Map Available...\n                </div>\n              </ng-container>\n            </div>\n          </div>\n        </div>\n        <div class=\"modal-footer\">\n          <button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\">Close</button>\n        </div>\n      </div>\n    </div>\n  </div>\n</ng-container>\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 */
        ImageMapComponent.ctorParameters = function () {
            return [
                { type: platformBrowser.DomSanitizer }
            ];
        };
        ImageMapComponent.propDecorators = {
            DataElement: [{ type: core.Input }],
            DataElements: [{ type: core.Input }],
            FormValues: [{ type: core.Input }],
            imagePath: [{ type: core.Input }]
        };
        return ImageMapComponent;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var ComputedDataElement = (function (_super) {
        __extends(ComputedDataElement, _super);
        function ComputedDataElement() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        return ComputedDataElement;
    }(BaseDataElement));

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var ComputedDataElementCreationService = (function (_super) {
        __extends(ComputedDataElementCreationService, _super);
        function ComputedDataElementCreationService(diagramService, arrayCheckerService, computedValueCreationService, decisionPointsCreationService) {
            var _this = _super.call(this, diagramService) || this;
            _this.arrayCheckerService = arrayCheckerService;
            _this.computedValueCreationService = computedValueCreationService;
            _this.decisionPointsCreationService = decisionPointsCreationService;
            _this.elementType = 'ComputedDataElement';
            return _this;
        }
        /**
         * @param {?} data
         * @return {?}
         */
        ComputedDataElementCreationService.prototype.createElement = /**
         * @param {?} data
         * @return {?}
         */
            function (data) {
                var /** @type {?} */ dataElement = new ComputedDataElement();
                _super.prototype.populateBasicData.call(this, data, dataElement);
                dataElement.computeValue = this.computedValueCreationService.createComputedValue(data);
                if (data.DecisionPoint) {
                    dataElement.decisionPoints = this.decisionPointsCreationService.createDecisionPoints(data.DecisionPoint);
                }
                return dataElement;
            };
        ComputedDataElementCreationService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        ComputedDataElementCreationService.ctorParameters = function () {
            return [
                { type: DiagramService },
                { type: ArrayCheckerService },
                { type: ComputedValueCreationService },
                { type: DecisionPointsCreationService }
            ];
        };
        return ComputedDataElementCreationService;
    }(DataElementCreationBaseService));

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var /** @type {?} */ $$4 = require('jquery');
    var AssistReportTextComponent = (function () {
        function AssistReportTextComponent() {
            this.allReportTexts = [];
            this.sections = [];
            setInterval(function () {
            }, 1000);
        }
        /**
         * @param {?} changes
         * @return {?}
         */
        AssistReportTextComponent.prototype.ngOnChanges = /**
         * @param {?} changes
         * @return {?}
         */
            function (changes) {
                this.mainReportTexts = new MainReportText();
                this.onSelect(this.selectedSectionId);
            };
        /**
         * @param {?} sectionId
         * @return {?}
         */
        AssistReportTextComponent.prototype.onSelect = /**
         * @param {?} sectionId
         * @return {?}
         */
            function (sectionId) {
                // console.log(this.reportText.allReportText);
                this.selectedSectionId = sectionId;
                this.sections = [];
                this.selectedSection = null;
                for (var /** @type {?} */ section in this.reportText.allReportText) {
                    if (this.reportText.allReportText[section].reportText !== '') {
                        this.sections.push(section);
                    }
                }
                if (sectionId === 'undefined' || sectionId === undefined || sectionId === 'All') {
                    this.allTextReport = [];
                    for (var /** @type {?} */ section in this.reportText.allReportText) {
                        if (this.reportText.allReportText[section].reportText !== '') {
                            var /** @type {?} */ textReport = new AllTextReport();
                            textReport.heading = section;
                            textReport.content = this.removeEmptyLine(this.reportText.allReportText[section].reportText);
                            this.allTextReport.push(textReport);
                        }
                    }
                    this.selectedSectionId = 'All';
                }
                for (var /** @type {?} */ section in this.reportText.allReportText) {
                    if (this.reportText.allReportText[section].sectionId === sectionId) {
                        this.selectedSection = this.reportText.allReportText[section].reportText;
                        this.selectedSection = this.reportText.reportTextMainContent + ((this.selectedSection !== undefined && this.selectedSection !== '') ? this.removeEmptyLine(this.selectedSection) : '');
                        break;
                    }
                }
                this.mainReportTexts = new MainReportText();
                this.allReportTexts = [];
                for (var /** @type {?} */ section in this.reportText.allReportText) {
                    var /** @type {?} */ allreportText = new AllReportText();
                    allreportText.reportText = this.removeEmptyLine(this.reportText.allReportText[section].reportText);
                    allreportText.sectionId = this.reportText.allReportText[section].sectionId;
                    this.allReportTexts.push(allreportText);
                }
                this.mainReportTexts.allReportText = this.allReportTexts;
                this.mainReportTexts.reportTextMainContent = this.reportText.reportTextMainContent;
            };
        /**
         * @param {?} inputText
         * @return {?}
         */
        AssistReportTextComponent.prototype.removeEmptyLine = /**
         * @param {?} inputText
         * @return {?}
         */
            function (inputText) {
                if (inputText.trim().length !== 0) {
                    var /** @type {?} */ lines = inputText.split('\n');
                    var /** @type {?} */ uniquelines_1 = [];
                    lines.forEach(function (line, i) {
                        if (line.trim().length !== 0) {
                            uniquelines_1.push(line);
                        }
                    });
                    return uniquelines_1.join('\n');
                }
            };
        AssistReportTextComponent.decorators = [
            { type: core.Component, args: [{
                        selector: 'acr-assist-report-text',
                        template: "<ng-container *ngFor=\"let textReport of allTextReport; let lastitem = last\">\n  <dt class=\"text-capitalize\">{{textReport.heading}}</dt>\n  <dd>\n    <p class=\"white-space-line\" [innerHTML]=\"textReport.content\"></p>\n  </dd>\n  <hr *ngIf=\"!lastitem\">\n</ng-container>\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 */
        AssistReportTextComponent.ctorParameters = function () { return []; };
        AssistReportTextComponent.propDecorators = {
            reportText: [{ type: core.Input }]
        };
        return AssistReportTextComponent;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var DynamicHeightDirective = (function () {
        function DynamicHeightDirective(dynamicElement) {
            this.dynamicElement = dynamicElement;
        }
        /**
         * @return {?}
         */
        DynamicHeightDirective.prototype.ngAfterViewChecked = /**
         * @return {?}
         */
            function () {
                if (this.dynamicElement !== undefined) {
                    if (this.simulatorElement !== undefined) {
                        this.setDynamicHeightForSimualtorDiv(this.simulatorElement);
                    }
                    else if (this.carouselElement !== undefined) {
                        this.setDynamicHeightForCarouselDiv(this.carouselElement);
                    }
                }
            };
        /**
         * @param {?} simulatorElement
         * @return {?}
         */
        DynamicHeightDirective.prototype.setDynamicHeightForSimualtorDiv = /**
         * @param {?} simulatorElement
         * @return {?}
         */
            function (simulatorElement) {
                var /** @type {?} */ simulatorResultsBlockHeight = simulatorElement.offsetHeight;
                this.dynamicElement.nativeElement.style.height = (window.innerHeight - 100) - simulatorResultsBlockHeight + 'px';
            };
        /**
         * @param {?} carouselElement
         * @return {?}
         */
        DynamicHeightDirective.prototype.setDynamicHeightForCarouselDiv = /**
         * @param {?} carouselElement
         * @return {?}
         */
            function (carouselElement) {
                var /** @type {?} */ simulatorResultsBlockHeight = carouselElement.offsetHeight;
                this.dynamicElement.nativeElement.style.height = (window.innerHeight - 200) - simulatorResultsBlockHeight + 'px';
            };
        DynamicHeightDirective.decorators = [
            { type: core.Directive, args: [{
                        selector: '[acrDynamicHeightDirective]'
                    },] },
        ];
        /** @nocollapse */
        DynamicHeightDirective.ctorParameters = function () {
            return [
                { type: core.ElementRef }
            ];
        };
        DynamicHeightDirective.propDecorators = {
            simulatorElement: [{ type: core.Input }],
            carouselElement: [{ type: core.Input }]
        };
        return DynamicHeightDirective;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var NumericOnlyDirective = (function () {
        function NumericOnlyDirective(el) {
            this.el = el;
            this.regex = new RegExp(/^(?:[0-9]{0,3}(?:\.[0-9]{0,2})?)?$/);
            this.specialKeys = ['Backspace', 'Tab', 'End', 'Home', 'ArrowLeft', 'ArrowRight'];
        }
        /**
         * @param {?} event
         * @return {?}
         */
        NumericOnlyDirective.prototype.onKeyDown = /**
         * @param {?} event
         * @return {?}
         */
            function (event) {
                // Allow Backspace, tab, end, and home keys
                if (this.specialKeys.indexOf(event.key) !== -1) {
                    return;
                }
                var /** @type {?} */ current = this.el.nativeElement.value;
                var /** @type {?} */ next = current.concat(event.key);
                var /** @type {?} */ value = +next;
                if (next && (next === '.' || value > 100.00 || !String(next).match(this.regex))) {
                    event.preventDefault();
                }
            };
        NumericOnlyDirective.decorators = [
            { type: core.Directive, args: [{
                        selector: '[acrNumericOnly]'
                    },] },
        ];
        /** @nocollapse */
        NumericOnlyDirective.ctorParameters = function () {
            return [
                { type: core.ElementRef }
            ];
        };
        NumericOnlyDirective.propDecorators = {
            onKeyDown: [{ type: core.HostListener, args: ['keydown', ['$event'],] }]
        };
        return NumericOnlyDirective;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var DateTimeDataElement = (function (_super) {
        __extends(DateTimeDataElement, _super);
        function DateTimeDataElement() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        return DateTimeDataElement;
    }(BaseDataElement));

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var DateTimeDataElementCreationService = (function (_super) {
        __extends(DateTimeDataElementCreationService, _super);
        function DateTimeDataElementCreationService(diagramService, conditionsCreationService, computedValueCreationService) {
            var _this = _super.call(this, diagramService) || this;
            _this.conditionsCreationService = conditionsCreationService;
            _this.computedValueCreationService = computedValueCreationService;
            _this.elementType = 'DateTimeDataElement';
            return _this;
        }
        /**
         * @param {?} data
         * @return {?}
         */
        DateTimeDataElementCreationService.prototype.createElement = /**
         * @param {?} data
         * @return {?}
         */
            function (data) {
                var /** @type {?} */ dataElement = new DateTimeDataElement();
                _super.prototype.populateBasicData.call(this, data, dataElement);
                var /** @type {?} */ ConditionalProperties = data.ConditionalProperties;
                if (ConditionalProperties !== undefined) {
                    var /** @type {?} */ dataElementRefs = data.ConditionalProperties;
                    if (data.ConditionalProperties !== undefined) {
                        dataElement.conditionalProperties = new Array();
                        if (data.ConditionalProperties.ConditionalProperty instanceof Array) {
                            try {
                                for (var _a = __values(data.ConditionalProperties.ConditionalProperty), _b = _a.next(); !_b.done; _b = _a.next()) {
                                    var conditionalProperty = _b.value;
                                    dataElement.conditionalProperties.push(this.GetConditionalProperties(conditionalProperty));
                                }
                            }
                            catch (e_1_1) {
                                e_1 = { error: e_1_1 };
                            }
                            finally {
                                try {
                                    if (_b && !_b.done && (_c = _a.return))
                                        _c.call(_a);
                                }
                                finally {
                                    if (e_1)
                                        throw e_1.error;
                                }
                            }
                        }
                        else {
                            dataElement.conditionalProperties.push(this.GetConditionalProperties(data.ConditionalProperties.ConditionalProperty));
                        }
                    }
                }
                return dataElement;
                var e_1, _c;
            };
        /**
         * @param {?} conditionalProperty
         * @return {?}
         */
        DateTimeDataElementCreationService.prototype.GetConditionalProperties = /**
         * @param {?} conditionalProperty
         * @return {?}
         */
            function (conditionalProperty) {
                var /** @type {?} */ _conditionalProperty = new ConditionalProperty();
                _conditionalProperty.condition = this.conditionsCreationService.returnCondition(conditionalProperty);
                // var test = this.computedValueCreationService.createComputedValue(conditionalProperty);
                if (this.conditionsCreationService.isComposite(conditionalProperty)) {
                    _conditionalProperty.compositeCondition = this.conditionsCreationService.returnCompositeCondition(conditionalProperty);
                }
                _conditionalProperty.isRelevant = conditionalProperty.IsRelevant;
                _conditionalProperty.isRequired = conditionalProperty.IsRequired;
                _conditionalProperty.DisplaySequence = conditionalProperty.DisplaySequence;
                return _conditionalProperty;
            };
        DateTimeDataElementCreationService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        DateTimeDataElementCreationService.ctorParameters = function () {
            return [
                { type: DiagramService },
                { type: ConditionsCreationService },
                { type: ComputedValueCreationService }
            ];
        };
        return DateTimeDataElementCreationService;
    }(DataElementCreationBaseService));

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var AssistDateTimeElementComponent = (function () {
        function AssistDateTimeElementComponent(formBuilder, simulatorEngineService) {
            this.formBuilder = formBuilder;
            this.simulatorEngineService = simulatorEngineService;
            this.date = new Date();
            this.settings = {
                bigBanner: true,
                format: 'dd-MMM-yyyy hh:mm a',
                defaultOpen: false,
                timePicker: true,
                closeOnSelect: true,
            };
        }
        /**
         * @return {?}
         */
        AssistDateTimeElementComponent.prototype.ngOnInit = /**
         * @return {?}
         */
            function () {
                this.createDateTimeElementForm();
            };
        /**
         * @return {?}
         */
        AssistDateTimeElementComponent.prototype.onDateSelect = /**
         * @return {?}
         */
            function () {
                // alert();
            };
        /**
         * @return {?}
         */
        AssistDateTimeElementComponent.prototype.createDateTimeElementForm = /**
         * @return {?}
         */
            function () {
                this.dateTimeElementForm = this.formBuilder.group({
                    dateTimeElement: ['', forms.Validators.compose([forms.Validators.required, forms.Validators.min(+0), forms.Validators.max(+1)])],
                });
            };
        AssistDateTimeElementComponent.decorators = [
            { type: core.Component, args: [{
                        selector: 'acr-assist-date-time-element',
                        template: "<form [formGroup]=\"dateTimeElementForm\" novalidate *ngIf=\"dateTimeDataElement.isVisible\">\n  <div class=\"form-group\">\n    <div class=\"col-sm-5 text-right\">\n      <label class=\"control-label break-word\">\n        <!-- {{dateTimeDataElement | json}} -->\n        {{dateTimeDataElement.label}}\n        <span *ngIf=\"dateTimeDataElement.unit != undefined && dateTimeDataElement.unit != ''\"> ({{dateTimeDataElement.unit}})</span>\n      </label>\n      <ng-container *ngIf=\"dateTimeDataElement.hint !== '' && dateTimeDataElement.hint !== undefined\">\n        <i class=\"fa fa-info-circle text-primary whitespace\" title=\"{{dateTimeDataElement.hint}}\"></i>\n      </ng-container>\n      <!-- <ng-container *ngIf=\"dateTimeDataElement.diagrams != undefined \">\n        <acr-hint-diagram [dataElement]=\"dateTimeDataElement\" [imagePath]=\"imagePath\"></acr-hint-diagram>\n      </ng-container> -->\n      <ng-container *ngIf=\"this.dateTimeDataElement.isRequired\">\n          <span *ngIf=\"dateTimeElementForm.controls['dateTimeElement'].invalid\">\n            <span *ngIf=\"dateTimeElementForm.controls['dateTimeElement'].errors.required\" class=\"required-field\" title=\"Required Field\">\n              *\n            </span>\n          </span>\n        </ng-container>\n    </div>\n    <div class=\"col-sm-7\">      \n      <div [ngClass]=\"dateTimeDataElement.isEditable == false ? 'disabled-picker' : ''\">\n          <angular2-date-picker  formControlName=\"dateTimeElement\" [(ngModel)]=\"date\" [settings]=\"settings\"></angular2-date-picker>\n      </div>     \n    </div>\n  </div>\n</form>\n",
                        styles: [".dec-btn[_ngcontent-c13],.inc-btn[_ngcontent-c13],.ng-scope.wc-time-sec.wc-time-sec[_ngcontent-c13]{cursor:pointer}.wc-date-container[_ngcontent-c13],.wc-date-container[_ngcontent-c13]>span[_ngcontent-c13]{color:#000!important}.disabled-picker{cursor:not-allowed}.disabled-picker:before{content:\"\";z-index:1;position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(255,255,255,.8)}.required-field{color:red}"]
                    },] },
        ];
        /** @nocollapse */
        AssistDateTimeElementComponent.ctorParameters = function () {
            return [
                { type: forms.FormBuilder },
                { type: SimulatorEngineService }
            ];
        };
        AssistDateTimeElementComponent.propDecorators = {
            dateTimeDataElement: [{ type: core.Input }]
        };
        return AssistDateTimeElementComponent;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var AssistDurationElementComponent = (function () {
        function AssistDurationElementComponent(formBuilder, simulatorEngineService, simulatorCommunicationService) {
            var _this = this;
            this.formBuilder = formBuilder;
            this.simulatorEngineService = simulatorEngineService;
            this.supportedUnits = {
                millisecond: {
                    'label': 'Millisecond',
                    'max': 999,
                    'min': 0,
                    'value': 0,
                    'step': 1
                },
                second: {
                    'label': 'Second',
                    'max': 59,
                    'min': 0,
                    'value': 0,
                    'step': 1
                },
                minute: {
                    'label': 'Minutes',
                    'max': 59,
                    'min': 0,
                    'value': 0,
                    'step': 1
                },
                hour: {
                    'label': 'Hours',
                    'max': 23,
                    'min': 0,
                    'value': 0,
                    'step': 1
                },
                day: {
                    'label': 'Days',
                    'max': 7,
                    'min': 0,
                    'value': 0,
                    'step': 1
                },
                week: {
                    'label': 'Week',
                    'max': 51,
                    'min': 0,
                    'value': 0,
                    'step': 1
                }
            };
            this.daysvalue = 0;
            this.hoursvalue = 0;
            this.minutesvalue = 0;
            this.DurationVal = 'PT0S';
            this.durationOptions = {
                showNegative: false,
                showPreview: false,
                showYears: false,
                showMonths: false,
                showWeeks: false,
                min: 0
            };
            this.showdayminValidation = false;
            this.showdaymaxValidation = false;
            this.showminutemaxValidation = false;
            this.showminuteminValidation = false;
            this.showhourminValidation = false;
            this.showhourmaxValidation = false;
            this.subscription = simulatorCommunicationService.simulatorSource$.subscribe(function (mission) {
                _this.SetRangeValuesForDurationPicker();
                _this.UpdateFormValidator();
            });
        }
        /**
         * @return {?}
         */
        AssistDurationElementComponent.prototype.ngOnInit = /**
         * @return {?}
         */
            function () {
                this.SetRangeValuesForDurationPicker();
                this.createDurationElementForm();
                this.onChanges();
            };
        /**
         * @return {?}
         */
        AssistDurationElementComponent.prototype.ResetValidationVisibility = /**
         * @return {?}
         */
            function () {
                this.showdayminValidation = false;
                this.showdaymaxValidation = false;
                this.showminutemaxValidation = false;
                this.showminuteminValidation = false;
                this.showhourminValidation = false;
                this.showhourmaxValidation = false;
            };
        /**
         * @return {?}
         */
        AssistDurationElementComponent.prototype.onChanges = /**
         * @return {?}
         */
            function () {
                var _this = this;
                this.durationElementForm.statusChanges
                    .subscribe(function (val) {
                    _this.ResetValidationVisibility();
                    if (_this.durationElementForm.controls['durationdayselement'].invalid
                        && _this.durationElementForm.controls['durationdayselement'].errors["max"]) {
                        _this.showdaymaxValidation = true;
                    }
                    else if (_this.durationElementForm.controls['durationdayselement'].invalid
                        && _this.durationElementForm.controls['durationdayselement'].errors["min"]) {
                        _this.showdayminValidation = true;
                    }
                    else if (_this.durationElementForm.controls['durationminuteselement'].invalid
                        && _this.durationElementForm.controls['durationminuteselement'].errors["min"]) {
                        _this.showminuteminValidation = true;
                    }
                    else if (_this.durationElementForm.controls['durationminuteselement'].invalid
                        && _this.durationElementForm.controls['durationminuteselement'].errors["max"]) {
                        _this.showminutemaxValidation = true;
                    }
                    else if (_this.durationElementForm.controls['durationhourselement'].invalid
                        && _this.durationElementForm.controls['durationhourselement'].errors["min"]) {
                        _this.showhourminValidation = true;
                    }
                    else if (_this.durationElementForm.controls['durationhourselement'].invalid
                        && _this.durationElementForm.controls['durationhourselement'].errors["max"]) {
                        _this.showhourmaxValidation = true;
                    }
                });
            };
        /**
         * @return {?}
         */
        AssistDurationElementComponent.prototype.SetRangeValuesForDurationPicker = /**
         * @return {?}
         */
            function () {
                var /** @type {?} */ $element = this.durationDataElement;
                this.supportedUnits['day'].min = $element.MinimumDay !== undefined && $element.MinimumDay != null ?
                    $element.MinimumDay : 0;
                this.supportedUnits['hour'].min = $element.MinimumHours !== undefined && $element.MinimumHours != null ?
                    $element.MinimumHours : 0;
                this.supportedUnits['minute'].min = $element.MinimumMinutes !== undefined && $element.MinimumMinutes != null ?
                    $element.MinimumMinutes : 0;
                this.supportedUnits['day'].max = $element.MaximumDay !== undefined && $element.MaximumDay != null ?
                    $element.MaximumDay : 9007199254740991;
                this.supportedUnits['hour'].max = $element.MaximumHours !== undefined && $element.MaximumHours != null ?
                    $element.MaximumHours : 9007199254740991;
                this.supportedUnits['minute'].max = $element.MaxmimumMinutes !== undefined && $element.MaxmimumMinutes != null ?
                    $element.MaxmimumMinutes : 9007199254740991;
            };
        /**
         * @return {?}
         */
        AssistDurationElementComponent.prototype.createDurationElementForm = /**
         * @return {?}
         */
            function () {
                this.durationElementForm = this.formBuilder.group({
                    durationdayselement: ['', forms.Validators.compose([forms.Validators.required,
                            forms.Validators.min(+this.supportedUnits['day'].min), forms.Validators.max(+this.supportedUnits['day'].max)])],
                    durationminuteselement: ['', forms.Validators.compose([forms.Validators.required,
                            forms.Validators.min(+this.supportedUnits['minute'].min), forms.Validators.max(+this.supportedUnits['minute'].max)])],
                    durationhourselement: ['', forms.Validators.compose([forms.Validators.required,
                            forms.Validators.min(+this.supportedUnits['hour'].min), forms.Validators.max(+this.supportedUnits['hour'].max)])]
                });
            };
        /**
         * @param {?} event
         * @return {?}
         */
        AssistDurationElementComponent.prototype.onlyInteger = /**
         * @param {?} event
         * @return {?}
         */
            function (event) {
                return (event.charCode === 8 || event.charCode === 0) ? null : event.charCode >= 48 && event.charCode <= 57;
            };
        /**
         * @return {?}
         */
        AssistDurationElementComponent.prototype.UpdateFormValidator = /**
         * @return {?}
         */
            function () {
                this.durationElementForm.controls['durationdayselement'].setValidators([forms.Validators.compose([forms.Validators.required,
                        forms.Validators.min(+this.supportedUnits['day'].min), forms.Validators.max(+this.supportedUnits['day'].max)])]);
                this.durationElementForm.controls['durationdayselement'].updateValueAndValidity();
                this.durationElementForm.controls['durationminuteselement'].setValidators([forms.Validators.compose([forms.Validators.required,
                        forms.Validators.min(+this.supportedUnits['minute'].min), forms.Validators.max(+this.supportedUnits['minute'].max)])]);
                this.durationElementForm.controls['durationminuteselement'].updateValueAndValidity();
                this.durationElementForm.controls['durationhourselement'].setValidators([forms.Validators.compose([forms.Validators.required,
                        forms.Validators.min(+this.supportedUnits['hour'].min), forms.Validators.max(+this.supportedUnits['hour'].max)])]);
                this.durationElementForm.controls['durationhourselement'].updateValueAndValidity();
            };
        /**
         * @param {?} property
         * @return {?}
         */
        AssistDurationElementComponent.prototype.increaseValue = /**
         * @param {?} property
         * @return {?}
         */
            function (property) {
                var /** @type {?} */ currentValue = 0;
                switch (property) {
                    case 'days':
                        currentValue = this.daysvalue === undefined || this.daysvalue == null ? 0 : this.daysvalue;
                        if (currentValue < this.supportedUnits['day'].max) {
                            currentValue = currentValue + this.supportedUnits['day'].step;
                        }
                        this.daysvalue = currentValue;
                        break;
                    case 'hour':
                        currentValue = this.hoursvalue === undefined || this.hoursvalue == null ? 0 : this.hoursvalue;
                        if (currentValue < this.supportedUnits['hour'].max) {
                            currentValue = currentValue + this.supportedUnits['hour'].step;
                        }
                        this.hoursvalue = currentValue;
                        break;
                    case 'minute':
                        currentValue = this.minutesvalue === undefined || this.minutesvalue == null ? 0 : this.minutesvalue;
                        if (currentValue < this.supportedUnits['minute'].max) {
                            currentValue = currentValue + this.supportedUnits['minute'].step;
                        }
                        this.minutesvalue = currentValue;
                        break;
                }
            };
        /**
         * @param {?} property
         * @return {?}
         */
        AssistDurationElementComponent.prototype.decreaseValue = /**
         * @param {?} property
         * @return {?}
         */
            function (property) {
                var /** @type {?} */ currentValue = 0;
                switch (property) {
                    case 'days':
                        currentValue = this.daysvalue;
                        if (currentValue > this.supportedUnits['day'].min) {
                            currentValue = currentValue - this.supportedUnits['day'].step;
                        }
                        this.daysvalue = currentValue;
                        break;
                    case 'hour':
                        currentValue = this.hoursvalue;
                        if (currentValue > this.supportedUnits['hour'].min) {
                            currentValue = currentValue - this.supportedUnits['hour'].step;
                        }
                        this.hoursvalue = currentValue;
                        break;
                    case 'minute':
                        currentValue = this.minutesvalue;
                        if (currentValue > this.supportedUnits['minute'].min) {
                            currentValue = currentValue - this.supportedUnits['minute'].step;
                        }
                        this.minutesvalue = currentValue;
                        break;
                }
            };
        /**
         * @param {?} event
         * @param {?} property
         * @return {?}
         */
        AssistDurationElementComponent.prototype.checkValue = /**
         * @param {?} event
         * @param {?} property
         * @return {?}
         */
            function (event, property) {
                var /** @type {?} */ currentValue = 0;
                switch (property) {
                    case 'days':
                        currentValue = this.daysvalue;
                        if (currentValue === undefined || currentValue == null) {
                            currentValue = 0;
                        }
                        this.daysvalue = currentValue;
                        break;
                    case 'hour':
                        currentValue = this.hoursvalue;
                        if (currentValue === undefined || currentValue == null) {
                            currentValue = 0;
                        }
                        this.hoursvalue = currentValue;
                        break;
                    case 'minute':
                        currentValue = this.minutesvalue;
                        if (currentValue === undefined || currentValue == null) {
                            currentValue = 0;
                        }
                        this.minutesvalue = currentValue;
                        break;
                }
            };
        // tslint:disable-next-line:use-life-cycle-interface
        /**
         * @return {?}
         */
        AssistDurationElementComponent.prototype.ngOnDestroy = /**
         * @return {?}
         */
            function () {
                // prevent memory leak when component destroyed
                this.subscription.unsubscribe();
            };
        AssistDurationElementComponent.decorators = [
            { type: core.Component, args: [{
                        selector: 'acr-assist-duration-element',
                        template: "<form [formGroup]=\"durationElementForm\" novalidate>\n  <div class=\"form-group\">\n    <div class=\"col-sm-5 text-right\">\n      <label class=\"control-label break-word\">\n        <!-- {{dateTimeDataElement | json}} -->\n        {{durationDataElement.label}}\n        <span *ngIf=\"durationDataElement.unit != undefined && durationDataElement.unit != ''\">\n          ({{durationDataElement.unit}})</span>\n      </label>\n      <ng-container *ngIf=\"durationDataElement.hint !== '' && durationDataElement.hint !== undefined\">\n        <i class=\"fa fa-info-circle text-primary whitespace\" title=\"{{durationDataElement.hint}}\"></i>\n      </ng-container>\n      <!-- <ng-container *ngIf=\"durationDataElement.diagrams != undefined \">\n        <acr-hint-diagram [dataElement]=\"durationDataElement\" [imagePath]=\"imagePath\"></acr-hint-diagram>\n      </ng-container> -->\n\n      <!-- <ng-container *ngIf=\"this.durationDataElement.isRequired\">      \n        <span *ngIf=\"DurationVal == 'PT0S' || DurationVal == null\" class=\"required-field\" title=\"Duration field should be non zero\">\n          *\n        </span>\n      </ng-container> -->\n      <ng-container *ngIf=\"this.durationDataElement.isRequired\n      && (!showdayminValidation && !showdaymaxValidation && !showminuteminValidation\n           && !showminutemaxValidation && !showhourminValidation && !showhourmaxValidation)\">\n        <span *ngIf=\"durationElementForm.controls['durationdayselement'].invalid\n         || durationElementForm.controls['durationminuteselement'].invalid\n         || durationElementForm.controls['durationhourselement'].invalid\">\n          <span *ngIf=\"durationElementForm.controls['durationdayselement'].errors != null && durationElementForm.controls['durationdayselement'].errors.required \n          || durationElementForm.controls['durationminuteselement'].errors != null && durationElementForm.controls['durationminuteselement'].errors.required \n          ||  durationElementForm.controls['durationhourselement'].errors != null && durationElementForm.controls['durationhourselement'].errors.required \"\n            class=\"required-field\" title=\"Required Field\">\n            *\n          </span>\n        </span>\n      </ng-container>      \n\n      <span *ngIf=\"showdayminValidation\"\n        class=\"required-field\" title=\" Minimum value for day is {{supportedUnits['day'].min}}\">\n        *\n      </span>\n      \n      <span *ngIf=\"showdaymaxValidation\"\n        class=\"required-field\" title=\" Maximum value for day is {{supportedUnits['day'].max}}\">\n        *\n      </span>\n\n      <span *ngIf=\"showminuteminValidation\"\n        class=\"required-field\" title=\" Minimum value for minute is {{supportedUnits['minute'].min}}\">\n        *\n      </span>\n      <span *ngIf=\"showminutemaxValidation\"\n        class=\"required-field\" title=\" Maximum value for minute is {{supportedUnits['minute'].max}}\">\n        *\n      </span>\n\n      <span *ngIf=\"showhourminValidation\"\n        class=\"required-field\" title=\" Minimum value for hour is {{supportedUnits['hour'].min}}\">\n        *\n      </span>\n      <span *ngIf=\"showhourmaxValidation\"\n        class=\"required-field\" title=\" Maximum value for hour is {{supportedUnits['hour'].max}}\">\n        *\n      </span>\n    </div>\n\n    <div class=\"col-sm-7\" style=\"display:inline-flex\">\n      <!-- <div [ngClass]=\"durationDataElement.isEditable == false ? 'disabled-picker' : ''\">\n        <ngx-duration-picker min=\"0\" formControlName=\"durationElement\" [options]=\"durationOptions\" [(value)]=\"DurationVal\"></ngx-duration-picker>\n      </div> -->\n\n\n      <!-- <div class=\"form-group\"> -->\n      <div [ngClass]=\"durationDataElement.isEditable == false ? 'disabled-picker' : ''\">\n        <table>\n          <tbody>\n            <!-- <tr class=\"text-center\">\n              <td>\n                <button type=\"button\" (click)=\"increaseValue('days')\" class=\"btn btn-link btn-decrementer\">\n                  +\n                </button>\n              </td>\n            </tr> -->\n            <tr class=\"text-center\">\n              <td class=\"input-group input-group-sm\">\n                <input tabindex=\"1\" [attr.disabled]=\"durationDataElement.isEditable == false ? 'disabled' : null\"\n                  formControlName=\"durationdayselement\" [(ngModel)]=\"daysvalue\" class=\"form-control text-center txt-duration\"\n                  (blur)=\"checkValue($event, 'days')\" type=\"number\" min=\"{{supportedUnits['day'].min}}\" max=\"{{supportedUnits['day'].max}}\"\n                  (keypress)=\"onlyInteger($event)\" onpaste=\"return false;\" required />\n                <span class=\"input-group-addon\" style=\"padding: 5px;\">{{supportedUnits['day'].label}}</span>\n              </td>\n            </tr>\n            <!-- <tr class=\"text-center\">\n              <td>\n                <button type=\"button\" (click)=\"decreaseValue('days')\" class=\"btn btn-link btn-decrementer\">\n                  -\n                </button>\n              </td>\n            </tr> -->\n          </tbody>\n        </table>\n      </div>\n\n      <table style=\"margin-left:10px;\">\n        <tbody>\n          <!-- <tr class=\"text-center\">\n            <td>\n              <button type=\"button\" (click)=\"increaseValue('hour')\" class=\"btn btn-link btn-incrementer\">\n                +\n              </button>\n            </td>\n          </tr> -->\n          <tr class=\"text-center\">\n            <td class=\"input-group input-group-sm\">\n              <input tabindex=\"2\" [attr.disabled]=\"durationDataElement.isEditable == false ? 'disabled' : null\"\n                formControlName=\"durationhourselement\" [(ngModel)]=\"hoursvalue\" class=\"form-control text-center txt-duration\"\n                (blur)=\"checkValue($event,'hour')\" type=\"number\" min=\"{{supportedUnits['hour'].min}}\" max=\"{{supportedUnits['hour'].max}}\"\n                (keypress)=\"onlyInteger($event)\" onpaste=\"return false;\" required />\n              <span class=\"input-group-addon\" style=\"padding: 5px;\">{{supportedUnits['hour'].label}}</span>\n            </td>\n          </tr>\n          <!-- <tr class=\"text-center\">\n            <td>\n              <button type=\"button\" (click)=\"decreaseValue('hour')\" class=\"btn btn-link btn-decrementer\">\n                -\n              </button>\n            </td>\n          </tr> -->\n        </tbody>\n      </table>\n\n      <table style=\"margin-left:10px;\">\n        <tbody>\n          <!-- <tr class=\"text-center\">\n            <td>\n              <button type=\"button\" (click)=\"increaseValue('minute')\" class=\"btn btn-link btn-decrementer\">\n                +\n              </button>\n            </td>\n          </tr> -->\n          <tr class=\"text-center\">\n            <td class=\"input-group input-group-sm\">\n              <input tabindex=\"3\" [(ngModel)]=\"minutesvalue\" formControlName=\"durationminuteselement\" [attr.disabled]=\"durationDataElement.isEditable == false ? 'disabled' : null\"\n                class=\"form-control text-center txt-duration\" (blur)=\"checkValue($event, 'minute')\" type=\"number\" min=\"{{supportedUnits['minute'].min}}\"\n                max=\"{{supportedUnits['minute'].max}}\" (keypress)=\"onlyInteger($event)\" onpaste=\"return false;\" required />\n              <span class=\"input-group-addon\" style=\"padding: 5px;\">{{supportedUnits['minute'].label}}</span>\n            </td>\n          </tr>\n          <!-- <tr class=\"text-center\">\n            <td>\n              <button type=\"button\" (click)=\"decreaseValue('minute')\" class=\"btn btn-link btn-decrementer\">\n                -\n              </button>\n            </td>\n          </tr> -->\n        </tbody>\n      </table>\n\n      <!-- </div> -->\n\n\n    </div>\n  </div>\n</form>",
                        styles: [".required-field{color:red}.disabled-picker{cursor:not-allowed}.disabled-picker:before{content:\"\";z-index:1;position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(255,255,255,.8)}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[type=number]{text-align:center}.btn-decrementer,.btn-incrementer{text-decoration:none;outline:0}.txt-duration{width:42px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:0!important;outline-offset:-2px}"]
                    },] },
        ];
        /** @nocollapse */
        AssistDurationElementComponent.ctorParameters = function () {
            return [
                { type: forms.FormBuilder },
                { type: SimulatorEngineService },
                { type: SimulatorCommunicationService }
            ];
        };
        AssistDurationElementComponent.propDecorators = {
            durationDataElement: [{ type: core.Input }]
        };
        return AssistDurationElementComponent;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var DurationDataElement = (function (_super) {
        __extends(DurationDataElement, _super);
        function DurationDataElement() {
            return _super !== null && _super.apply(this, arguments) || this;
        }
        return DurationDataElement;
    }(BaseDataElement));

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var DurationDataElementCreationService = (function (_super) {
        __extends(DurationDataElementCreationService, _super);
        function DurationDataElementCreationService(diagramService, conditionsCreationService, computedValueCreationService) {
            var _this = _super.call(this, diagramService) || this;
            _this.conditionsCreationService = conditionsCreationService;
            _this.computedValueCreationService = computedValueCreationService;
            _this.elementType = 'DurationDataElement';
            return _this;
        }
        /**
         * @param {?} data
         * @return {?}
         */
        DurationDataElementCreationService.prototype.createElement = /**
         * @param {?} data
         * @return {?}
         */
            function (data) {
                var /** @type {?} */ dataElement = new DurationDataElement();
                _super.prototype.populateBasicData.call(this, data, dataElement);
                dataElement.MinimumDay = data.MinimumDay;
                dataElement.MaximumDay = data.MaximumDay;
                dataElement.MinimumHours = data.MinimumHours;
                dataElement.MaximumHours = data.MaximumHours;
                dataElement.MinimumMinutes = data.MinimumMinutes;
                dataElement.MaxmimumMinutes = data.MaxmimumMinutes;
                dataElement.MinimumDayOverrider = data.MinimumDay;
                dataElement.MaximumDayOverrider = data.MaximumDay;
                dataElement.MinimumHoursOverrider = data.MinimumHours;
                dataElement.MaximumHoursOverrider = data.MaximumHours;
                dataElement.MinimumMinutesOverrider = data.MinimumMinutes;
                dataElement.MaxmimumMinutesOverrider = data.MaxmimumMinutes;
                var /** @type {?} */ ConditionalProperties = data.ConditionalProperties;
                if (ConditionalProperties !== undefined) {
                    var /** @type {?} */ dataElementRefs = data.ConditionalProperties;
                    if (data.ConditionalProperties !== undefined) {
                        dataElement.conditionalProperties = new Array();
                        if (data.ConditionalProperties.ConditionalProperty instanceof Array) {
                            try {
                                for (var _a = __values(data.ConditionalProperties.ConditionalProperty), _b = _a.next(); !_b.done; _b = _a.next()) {
                                    var conditionalProperty = _b.value;
                                    dataElement.conditionalProperties.push(this.GetConditionalProperties(conditionalProperty));
                                }
                            }
                            catch (e_1_1) {
                                e_1 = { error: e_1_1 };
                            }
                            finally {
                                try {
                                    if (_b && !_b.done && (_c = _a.return))
                                        _c.call(_a);
                                }
                                finally {
                                    if (e_1)
                                        throw e_1.error;
                                }
                            }
                        }
                        else {
                            dataElement.conditionalProperties.push(this.GetConditionalProperties(data.ConditionalProperties.ConditionalProperty));
                        }
                    }
                }
                return dataElement;
                var e_1, _c;
            };
        /**
         * @param {?} conditionalProperty
         * @return {?}
         */
        DurationDataElementCreationService.prototype.GetConditionalProperties = /**
         * @param {?} conditionalProperty
         * @return {?}
         */
            function (conditionalProperty) {
                var /** @type {?} */ _conditionalProperty = new ConditionalProperty();
                _conditionalProperty.condition = this.conditionsCreationService.returnCondition(conditionalProperty);
                // var test = this.computedValueCreationService.createComputedValue(conditionalProperty);
                if (this.conditionsCreationService.isComposite(conditionalProperty)) {
                    _conditionalProperty.compositeCondition = this.conditionsCreationService.returnCompositeCondition(conditionalProperty);
                }
                _conditionalProperty.isRelevant = conditionalProperty.IsRelevant;
                _conditionalProperty.isRequired = conditionalProperty.IsRequired;
                _conditionalProperty.DisplaySequence = conditionalProperty.DisplaySequence;
                _conditionalProperty.MinimumDay = conditionalProperty.MinimumDay;
                _conditionalProperty.MaximumDay = conditionalProperty.MaximumDay;
                _conditionalProperty.MinimumHours = conditionalProperty.MinimumHours;
                _conditionalProperty.MaximumHours = conditionalProperty.MaximumHours;
                _conditionalProperty.MaxmimumMinutes = conditionalProperty.MaximumHours;
                _conditionalProperty.MinimumMinutes = conditionalProperty.MinimumHours;
                return _conditionalProperty;
            };
        DurationDataElementCreationService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        DurationDataElementCreationService.ctorParameters = function () {
            return [
                { type: DiagramService },
                { type: ConditionsCreationService },
                { type: ComputedValueCreationService }
            ];
        };
        return DurationDataElementCreationService;
    }(DataElementCreationBaseService));

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var /** @type {?} */ components = [AcrAssistSimulatorComponent, AssistDataElementComponent, HintDiagramComponent, slide_component.SlideComponent, carousel_component.CarouselComponent,
        AssistNumericElementComponent, AssistChoiceElementComponent, AssistMultiChoiceElementComponent,
        ImageMapComponent, AssistReportTextComponent, DynamicHeightDirective, NumericOnlyDirective,
        AssistDateTimeElementComponent, AssistDurationElementComponent];
    var AcrAssistSimulatorModule = (function () {
        function AcrAssistSimulatorModule() {
        }
        AcrAssistSimulatorModule.decorators = [
            { type: core.NgModule, args: [{
                        imports: [
                            common.CommonModule,
                            CoreModule,
                            forms.FormsModule,
                            forms.ReactiveFormsModule,
                            ngxDragScroll.DragScrollModule,
                            angular2Datetimepicker.AngularDateTimePickerModule,
                            ngxDurationPicker.DurationPickerModule
                        ],
                        declarations: components,
                        providers: [TemplateManagerService,
                            DiagramService,
                            carousel_config.CarouselConfig,
                            ArrayCheckerService,
                            ConditionsCreationService,
                            DecisionPointsCreationService,
                            ComputedValueCreationService,
                            SimulatorEngineService,
                            SimulatorCommunicationService,
                            { provide: CreationServiceInjectorToken, useClass: ChoiceDataElementCreationService, multi: true },
                            { provide: CreationServiceInjectorToken, useClass: MultipleChoiceDataElementCreationService, multi: true },
                            { provide: CreationServiceInjectorToken, useClass: NumericDataElementCreationService, multi: true },
                            { provide: CreationServiceInjectorToken, useClass: IntegerDataElementCreationService, multi: true },
                            { provide: CreationServiceInjectorToken, useClass: GlobalValueCreationService, multi: true },
                            { provide: CreationServiceInjectorToken, useClass: ComputedDataElementCreationService, multi: true },
                            { provide: CreationServiceInjectorToken, useClass: DateTimeDataElementCreationService, multi: true },
                            { provide: CreationServiceInjectorToken, useClass: DurationDataElementCreationService, multi: true }
                        ],
                        exports: components
                    },] },
        ];
        return AcrAssistSimulatorModule;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    /**
     * @template T
     */
    var /**
     * @template T
     */ Dictionary = (function () {
        function Dictionary() {
            this.items = {};
            this.count = 0;
        }
        /**
         * @param {?} key
         * @return {?}
         */
        Dictionary.prototype.ContainsKey = /**
         * @param {?} key
         * @return {?}
         */
            function (key) {
                return this.items.hasOwnProperty(key);
            };
        /**
         * @return {?}
         */
        Dictionary.prototype.Count = /**
         * @return {?}
         */
            function () {
                return this.count;
            };
        /**
         * @param {?} key
         * @param {?} value
         * @return {?}
         */
        Dictionary.prototype.Add = /**
         * @param {?} key
         * @param {?} value
         * @return {?}
         */
            function (key, value) {
                if (!this.items.hasOwnProperty(key)) {
                    this.count++;
                }
                this.items[key] = value;
            };
        /**
         * @param {?} key
         * @return {?}
         */
        Dictionary.prototype.Remove = /**
         * @param {?} key
         * @return {?}
         */
            function (key) {
                var /** @type {?} */ val = this.items[key];
                delete this.items[key];
                this.count--;
                return val;
            };
        /**
         * @param {?} key
         * @return {?}
         */
        Dictionary.prototype.Item = /**
         * @param {?} key
         * @return {?}
         */
            function (key) {
                return this.items[key];
            };
        /**
         * @return {?}
         */
        Dictionary.prototype.Keys = /**
         * @return {?}
         */
            function () {
                var /** @type {?} */ keySet = [];
                for (var /** @type {?} */ prop in this.items) {
                    if (this.items.hasOwnProperty(prop)) {
                        keySet.push(prop);
                    }
                }
                return keySet;
            };
        /**
         * @return {?}
         */
        Dictionary.prototype.Values = /**
         * @return {?}
         */
            function () {
                var /** @type {?} */ values = [];
                for (var /** @type {?} */ prop in this.items) {
                    if (this.items.hasOwnProperty(prop)) {
                        values.push(this.items[prop]);
                    }
                }
                return values;
            };
        return Dictionary;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var GlobalsService = (function () {
        function GlobalsService(http$$1) {
            this.http = http$$1;
            this.defaultModule = 'assets/XMLFIles/hello_assist/Hello_Assist.xml';
            this.defaultTestModule = 'assets/XMLFIles/test_module/Test_Module.xml';
            this.XMLList = new Dictionary();
        }
        /**
         * @return {?}
         */
        GlobalsService.prototype.getDefaultModulePath = /**
         * @return {?}
         */
            function () {
                return this.http.get(this.defaultModule).map(function (res) { return res.text(); });
            };
        /**
         * @return {?}
         */
        GlobalsService.prototype.getDefaultTestModulePath = /**
         * @return {?}
         */
            function () {
                return this.http.get(this.defaultTestModule).map(function (res) { return res.text(); });
            };
        GlobalsService.decorators = [
            { type: core.Injectable },
        ];
        /** @nocollapse */
        GlobalsService.ctorParameters = function () {
            return [
                { type: http.Http }
            ];
        };
        return GlobalsService;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var /** @type {?} */ $$5 = require('jquery');
    var ViewUploadLoaderComponent = (function () {
        function ViewUploadLoaderComponent(globalsService) {
            this.onFileSelected = new core.EventEmitter();
            this.globalsService = globalsService;
        }
        /**
         * @param {?} fileDetails
         * @return {?}
         */
        ViewUploadLoaderComponent.prototype.onFileContentRead = /**
         * @param {?} fileDetails
         * @return {?}
         */
            function (fileDetails) {
                this.selectedXML = fileDetails;
                if (this.globalsService.XMLList.ContainsKey(fileDetails.fileLabel)) {
                    this.globalsService.XMLList.Remove(fileDetails.fileLabel);
                }
                this.globalsService.XMLList.Add(fileDetails.fileLabel, fileDetails);
                this.onFileSelected.emit(fileDetails);
            };
        /**
         * @param {?} fileDetails
         * @return {?}
         */
        ViewUploadLoaderComponent.prototype.onFileClick = /**
         * @param {?} fileDetails
         * @return {?}
         */
            function (fileDetails) {
                this.selectedXML = fileDetails;
                this.onFileSelected.emit(fileDetails);
                $$5('#xmlOnlyMsg').hide();
            };
        ViewUploadLoaderComponent.decorators = [
            { type: core.Component, args: [{
                        selector: 'acr-view-upload-loader',
                        template: "<ul class=\"sidebar-menu\" data-widget=\"tree\">\n  <li class=\"header\">Want to try your assist module?</li>\n  <li class=\"text-center\">\n    <acr-file-upload-loader (onFileContentRead)=\"onFileContentRead($event)\"></acr-file-upload-loader>\n  </li>\n  <li [ngClass]=\"{'active':(selectedXML.fileLabel === file.fileLabel)}\" *ngFor=\"let file of globalsService.XMLList.Values().reverse()\"\n     class=\"treeview\">\n    <a href=\"#\" (click)=\"onFileClick(file)\">\n      <i class=\"fa fa-book\"></i>\n      <span class=\"whitespace\">{{file.fileLabel}}</span>\n    </a>\n  </li>\n</ul>\n",
                        styles: [""]
                    },] },
        ];
        /** @nocollapse */
        ViewUploadLoaderComponent.ctorParameters = function () {
            return [
                { type: GlobalsService }
            ];
        };
        ViewUploadLoaderComponent.propDecorators = {
            onFileSelected: [{ type: core.Output }]
        };
        return ViewUploadLoaderComponent;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var FileDetails = (function () {
        function FileDetails(fileLabel, fileName, fileContents) {
            this.fileLabel = fileLabel;
            this.fileName = fileName;
            this.fileContents = fileContents;
        }
        return FileDetails;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var /** @type {?} */ $$6 = require('jquery');
    var FileUploadLoaderComponent = (function () {
        function FileUploadLoaderComponent(configService) {
            this.configService = configService;
            this.onFileContentRead = new core.EventEmitter();
            this.fileReader = new FileReader();
        }
        /**
         * @return {?}
         */
        FileUploadLoaderComponent.prototype.ngOnInit = /**
         * @return {?}
         */
            function () {
                var _this = this;
                this.hideMessage();
                this.showTestModule();
                setTimeout(function () {
                    _this.showDefaultModule();
                }, 100);
            };
        /**
         * @param {?} $event
         * @return {?}
         */
        FileUploadLoaderComponent.prototype.changeListener = /**
         * @param {?} $event
         * @return {?}
         */
            function ($event) {
                var /** @type {?} */ fileName;
                fileName = $event.target.value;
                if (fileName.includes('.xml') || fileName.includes('.Xml') || fileName.includes('.XML') ||
                    fileName.includes('.zip') || fileName.includes('.Zip') || fileName.includes('.ZIP')) {
                    this.hideMessage();
                    this.readThis($event.target);
                }
                else {
                    if (fileName !== '' && fileName !== undefined) {
                        $$6('#xmlOnlyMsg').show();
                    }
                }
            };
        /**
         * @return {?}
         */
        FileUploadLoaderComponent.prototype.hideMessage = /**
         * @return {?}
         */
            function () {
                $$6('#xmlOnlyMsg').hide();
            };
        /**
         * @param {?} inputValue
         * @return {?}
         */
        FileUploadLoaderComponent.prototype.readThis = /**
         * @param {?} inputValue
         * @return {?}
         */
            function (inputValue) {
                var _this = this;
                this.readFile = inputValue.files[0];
                var /** @type {?} */ self = this;
                var /** @type {?} */ extensionStartPosition = self.readFile.name.lastIndexOf('.');
                this.fileReader.onloadend = function (e) {
                    self.onFileContentRead.emit(new FileDetails(self.readFile.name.substring(0, extensionStartPosition), self.readFile.name, _this.fileReader.result));
                };
                this.fileReader.readAsText(this.readFile);
            };
        /**
         * @return {?}
         */
        FileUploadLoaderComponent.prototype.showDefaultModule = /**
         * @return {?}
         */
            function () {
                var _this = this;
                this.configService.getDefaultModulePath()
                    .subscribe(function (data) {
                    var /** @type {?} */ self = _this;
                    self.onFileContentRead.emit(new FileDetails('Hello Assist 2.0', 'Hello_Assist.xml', data));
                });
            };
        /**
         * @return {?}
         */
        FileUploadLoaderComponent.prototype.showTestModule = /**
         * @return {?}
         */
            function () {
                var _this = this;
                this.configService.getDefaultTestModulePath()
                    .subscribe(function (data) {
                    var /** @type {?} */ self = _this;
                    self.onFileContentRead.emit(new FileDetails('Test Module', 'Test_Module.xml', data));
                });
            };
        FileUploadLoaderComponent.decorators = [
            { type: core.Component, args: [{
                        selector: 'acr-file-upload-loader',
                        template: "<input id=\"xmlFileUpload\" class=\"hidden\" type=\"file\" accept=\".xml\" (change)=\"changeListener($event)\" (click)=\"hideMessage()\">\n<label for=\"xmlFileUpload\" class=\"btn btn-success bg-olive margin-10\" title=\"Choose a Module\">Choose a Module</label>\n<br>\n<div id=\"xmlOnlyMsg\" class=\"error-msg\"> Only XML files are supported !!!</div>\n",
                        styles: [""]
                    },] },
        ];
        /** @nocollapse */
        FileUploadLoaderComponent.ctorParameters = function () {
            return [
                { type: GlobalsService }
            ];
        };
        FileUploadLoaderComponent.propDecorators = {
            onFileContentRead: [{ type: core.Output }]
        };
        return FileUploadLoaderComponent;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */
    var /** @type {?} */ components$1 = [FileUploadLoaderComponent, ViewUploadLoaderComponent];
    var SimulatorLoaderModule = (function () {
        function SimulatorLoaderModule() {
        }
        SimulatorLoaderModule.decorators = [
            { type: core.NgModule, args: [{
                        imports: [
                            common.CommonModule
                        ],
                        declarations: [components$1],
                        providers: [GlobalsService],
                        exports: [components$1]
                    },] },
        ];
        return SimulatorLoaderModule;
    }());

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */

    /**
     * @fileoverview added by tsickle
     * @suppress {checkTypes} checked by tsc
     */

    exports.AcrAssistSimulatorModule = AcrAssistSimulatorModule;
    exports.SimulatorLoaderModule = SimulatorLoaderModule;
    exports.ɵc = AcrAssistSimulatorComponent;
    exports.ɵp = AssistChoiceElementComponent;
    exports.ɵl = AssistDataElementComponent;
    exports.ɵv = AssistDateTimeElementComponent;
    exports.ɵw = AssistDurationElementComponent;
    exports.ɵq = AssistMultiChoiceElementComponent;
    exports.ɵo = AssistNumericElementComponent;
    exports.ɵn = HintDiagramComponent;
    exports.ɵr = ImageMapComponent;
    exports.ɵs = AssistReportTextComponent;
    exports.ɵe = CreationServiceInjectorToken;
    exports.ɵt = DynamicHeightDirective;
    exports.ɵu = NumericOnlyDirective;
    exports.ɵg = ArrayCheckerService;
    exports.ɵx = ChoiceDataElementCreationService;
    exports.ɵbc = ComputedDataElementCreationService;
    exports.ɵk = ComputedValueCreationService;
    exports.ɵj = ConditionsCreationService;
    exports.ɵh = DataElementCreationBaseService;
    exports.ɵbd = DateTimeDataElementCreationService;
    exports.ɵi = DecisionPointsCreationService;
    exports.ɵf = DiagramService;
    exports.ɵbe = DurationDataElementCreationService;
    exports.ɵbb = GlobalValueCreationService;
    exports.ɵba = IntegerDataElementCreationService;
    exports.ɵy = MultipleChoiceDataElementCreationService;
    exports.ɵz = NumericDataElementCreationService;
    exports.ɵm = SimulatorCommunicationService;
    exports.ɵd = TemplateManagerService;
    exports.ɵa = CoreModule;
    exports.ɵb = SimulatorEngineService;
    exports.ɵbf = FileUploadLoaderComponent;
    exports.ɵbg = GlobalsService;
    exports.ɵbh = ViewUploadLoaderComponent;

    Object.defineProperty(exports, '__esModule', { value: true });

})));

//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlLnVtZC5qcy5tYXAiLCJzb3VyY2VzIjpbbnVsbCwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvbW9kZWxzL3NpbXVsYXRvci1zdGF0ZS5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL2RhdGFlbGVtZW50dmFsdWVzLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvbW9kZWxzL2FyaXRobWV0aWMtZXhwcmVzc2lvbi5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL3NlcnZpY2VzL3NpbXVsYXRvci1lbmdpbmUuc2VydmljZS50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL2NvcmUubW9kdWxlLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvbW9kZWxzL3RlbXBsYXRlLm1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvbWV0YWRhdGEvbW9kZWxzL21ldGFkYXRhLW1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvbW9kZWxzL2RpYWdyYW0ubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3Ivc2hhcmVkL3NlcnZpY2VzL2FycmF5LWNoZWNrZXIuc2VydmljZS50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9zaGFyZWQvc2VydmljZXMvZGlhZ3JhbS5zZXJ2aWNlLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL2NvbnN0YW50cy50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL21vZGVscy9kZWNpc2lvbnBvaW50Lm1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvbW9kZWxzL2JyYW5jaC5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL21vZGVscy9lbmRwb2ludHJlZi5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL21vZGVscy9kYXRhZWxlbWVudHJlZi5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL21vZGVscy9ub3RyZWxldmFudGRhdGFlbGVtZW50cy5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL3J1bGVzL2VxdWFsLWNvbmRpdGlvbi50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL21vZGVscy9jb25kaXRpb250eXBlLm1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvcnVsZXMvZ3JlYXRlci10aGFuLWNvbmRpdGlvbi50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL3J1bGVzL2xlc3MtdGhhbi1jb25kaXRpb24udHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9ydWxlcy9ncmVhdGVyLXRoYW4tb3ItZXF1YWxzLWNvbmRpdGlvbi50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL3J1bGVzL2xlc3MtdGhhbi1vci1lcXVhbHMtY29uZGl0aW9uLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvcnVsZXMvY29udGFpbnMtY29uZGl0aW9uLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvcnVsZXMvYW5kLWNvbmRpdGlvbi50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL3J1bGVzL29yLWNvbmRpdGlvbi50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL3J1bGVzL25vdC1jb25kaXRpb24udHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3Ivc2hhcmVkL3NlcnZpY2VzL2NvbmRpdGlvbnMtY3JlYXRpb24uc2VydmljZS50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL21vZGVscy90ZXh0LWV4cHJlc3Npb24ubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3Ivc2hhcmVkL3NlcnZpY2VzL2NvbXB1dGVkLXZhbHVlLWNyZWF0aW9uLnNlcnZpY2UudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3Ivc2hhcmVkL3NlcnZpY2VzL2RlY2lzaW9uLXBvaW50cy1jcmVhdGlvbi5zZXJ2aWNlLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvcnVsZXMvbW9kZWxzL3J1bGVzLm1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvZW5kcG9pbnQvdGVtcGxhdGUtcGFydGlhbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9zaGFyZWQvc2VydmljZXMvdGVtcGxhdGUtbWFuYWdlci5zZXJ2aWNlLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvbW9kZWxzL3JlcG9ydC10ZXh0Lm1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLmNvbXBvbmVudC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL2VsZW1lbnRzL21vZGVscy9jb2RhYmxlQ29uY2VwdC5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL2VsZW1lbnRzL21vZGVscy9jb2RpbmdTeXN0ZW0ubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvY29kaW5nLnZlcnNpb24udHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvY29kaW5nQ29kZS5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL2VsZW1lbnRzL21vZGVscy9jb2RpbmdEaXNwbGF5Lm1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvZWxlbWVudHMvbW9kZWxzL2NvZGluZ1VzZXJTZWxlY3RlZC5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL2VsZW1lbnRzL21vZGVscy9jb2RpbmcubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3Ivc2hhcmVkL3NlcnZpY2VzL2RhdGEtZWxlbWVudC1jcmVhdGlvbi1iYXNlLXNlcnZpY2UudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvYmFzZS1kYXRhLWVsZW1lbnQubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLWRhdGEtZWxlbWVudC1tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9jb3JlL2VsZW1lbnRzL21vZGVscy9jaG9pY2UubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvaW1hZ2UtZWxlbWVudHMubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvaW1hZ2UtbWFwLm1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvZWxlbWVudHMvbW9kZWxzL2FyZWEtbW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvYXJlYS1tYXAubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvY29uZGl0aW9uYWxwcm9wZXJ0eS5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9zaGFyZWQvc2VydmljZXMvY2hvaWNlLWRhdGEtZWxlbWVudC1jcmVhdGlvbi5zZXJ2aWNlLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL3NoYXJlZC9zZXJ2aWNlcy9tdWx0aXBsZS1jaG9pY2UtZGF0YS1lbGVtZW50LWNyZWF0aW9uLnNlcnZpY2UudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvbnVtZXJpYy1kYXRhLWVsZW1lbnQubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3Ivc2hhcmVkL3NlcnZpY2VzL251bWVyaWMtZGF0YS1lbGVtZW50LWNyZWF0aW9uLnNlcnZpY2UudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvaW50ZWdlci1kYXRhLWVsZW1lbnQubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3Ivc2hhcmVkL3NlcnZpY2VzL2ludGVnZXItZGF0YS1lbGVtZW50LWNyZWF0aW9uLnNlcnZpY2UudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9tb2RlbHMvaW5wdXQtZGF0YS5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9zaGFyZWQvc2VydmljZXMvc2ltdWxhdG9yLWNvbW11bmljYXRpb24uc2VydmljZS50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtZGF0YS1lbGVtZW50L2Fzc2lzdC1kYXRhLWVsZW1lbnQuY29tcG9uZW50LnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL2Fzc2lzdC1kYXRhLWVsZW1lbnQvaGludC1kaWFncmFtL2hpbnQtZGlhZ3JhbS5jb21wb25lbnQudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvZ2xvYmFsdmFsdWUubW9kZWwudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3Ivc2hhcmVkL3NlcnZpY2VzL2dsb2JhbC12YWx1ZS1jcmVhdGlvbi5zZXJ2aWNlLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvbW9kZWxzL2V4ZWN1dGVkLXJlc3VsdC5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtZGF0YS1lbGVtZW50L2Fzc2lzdC1udW1lcmljLWVsZW1lbnQvYXNzaXN0LW51bWVyaWMtZWxlbWVudC5jb21wb25lbnQudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3IvYXNzaXN0LWRhdGEtZWxlbWVudC9hc3Npc3QtY2hvaWNlLWVsZW1lbnQvYXNzaXN0LWNob2ljZS1lbGVtZW50LmNvbXBvbmVudC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtZGF0YS1lbGVtZW50L2Fzc2lzdC1tdWx0aS1jaG9pY2UtZWxlbWVudC9hc3Npc3QtbXVsdGktY2hvaWNlLWVsZW1lbnQuY29tcG9uZW50LnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL2Fzc2lzdC1kYXRhLWVsZW1lbnQvaW1hZ2UtbWFwL2ltYWdlLW1hcC5jb21wb25lbnQudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvY29yZS9lbGVtZW50cy9tb2RlbHMvY29tcHV0ZWQtZGF0YS1lbGVtZW50LW1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL3NoYXJlZC9zZXJ2aWNlcy9jb21wdXRlZC1kYXRhLWVsZW1lbnQtY3JlYXRpb24uc2VydmljZS50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtcmVwb3J0LXRleHQvYXNzaXN0LXJlcG9ydC10ZXh0LmNvbXBvbmVudC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9zaGFyZWQvZGlyZWN0aXZlcy9keW5hbWljaGVpZ2h0LmRpcmVjdGl2ZS50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9zaGFyZWQvZGlyZWN0aXZlcy9udW1lcmljLW9ubHkuZGlyZWN0aXZlLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvZWxlbWVudHMvbW9kZWxzL2RhdGV0aW1lLm1vZGVsLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL3NoYXJlZC9zZXJ2aWNlcy9kYXRlVGltZS1kYXRhLWVsZW1lbnQtY3JlYXRpb24uc2VydmljZS50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtZGF0YS1lbGVtZW50L2Fzc2lzdC1kYXRlVGltZS1lbGVtZW50L2Fzc2lzdC1kYXRlLXRpbWUtZWxlbWVudC9hc3Npc3QtZGF0ZS10aW1lLWVsZW1lbnQuY29tcG9uZW50LnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL2Fzc2lzdC1kYXRhLWVsZW1lbnQvYXNzaXN0LWR1cmF0aW9uLWVsZW1lbnQvYXNzaXN0LWR1cmF0aW9uLWVsZW1lbnQuY29tcG9uZW50LnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL2NvcmUvZWxlbWVudHMvbW9kZWxzL2R1cmF0aW9uLWRhdGEtZWxlbWVudC5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9zaGFyZWQvc2VydmljZXMvZHVyYXRpb24tZGF0YS1lbGVtZW50LWNyZWF0aW9uLnNlcnZpY2UudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvYWNyLWFzc2lzdC1zaW11bGF0b3IvYWNyLWFzc2lzdC1zaW11bGF0b3IubW9kdWxlLnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL3NpbXVsYXRvcmxvYWRlci9zaGFyZWQvbW9kZWxzL2RpY3Rpb25hcnkudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvc2ltdWxhdG9ybG9hZGVyL3NoYXJlZC9zZXJ2aWNlcy9nbG9iYWxzLnNlcnZpY2UudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvc2ltdWxhdG9ybG9hZGVyL3ZpZXctdXBsb2FkLWxvYWRlci92aWV3LXVwbG9hZC1sb2FkZXIuY29tcG9uZW50LnRzIiwibmc6Ly9hY3ItYXNzaXN0LXNpbXVsYXRvci1tb2R1bGUvc3JjL2FwcC9tb2R1bGVzL3NpbXVsYXRvcmxvYWRlci9zaGFyZWQvbW9kZWxzL2ZpbGUtZGV0YWlscy5tb2RlbC50cyIsIm5nOi8vYWNyLWFzc2lzdC1zaW11bGF0b3ItbW9kdWxlL3NyYy9hcHAvbW9kdWxlcy9zaW11bGF0b3Jsb2FkZXIvZmlsZS11cGxvYWQtbG9hZGVyL2ZpbGUtdXBsb2FkLWxvYWRlci5jb21wb25lbnQudHMiLCJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS9zcmMvYXBwL21vZHVsZXMvc2ltdWxhdG9ybG9hZGVyL3NpbXVsYXRvcmxvYWRlci5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDApXHJcbiAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUocmVzdWx0LnZhbHVlKTsgfSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSB5W29wWzBdICYgMiA/IFwicmV0dXJuXCIgOiBvcFswXSA/IFwidGhyb3dcIiA6IFwibmV4dFwiXSkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbMCwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIGV4cG9ydHMpIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgIH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChvW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9OyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XHJcbiAgICByZXN1bHQuZGVmYXVsdCA9IG1vZDtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBTaW11bGF0b3JTdGF0ZSB7XHJcbiAgbm9uUmVsZXZhbnREYXRhRWxlbWVudElkczogc3RyaW5nW10gPSBbXTtcclxuICBlbmRQb2ludElkID0gJyc7XHJcbiAgc2VsZWN0ZWREZWNpc2lvblBvaW50SWQgPSAnJztcclxuICBzZWxlY3RlZERlY2lzaW9uUG9pbnRMYWJlbCA9ICcnO1xyXG4gIHNlbGVjdGVkQnJhbmNoTGFiZWwgPSAnJztcclxuXHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIERhdGFFbGVtZW50VmFsdWVzIHtcclxuXHJcbiAgcHJpdmF0ZSB2YWx1ZXM6IE1hcDxzdHJpbmcsIGFueT47XHJcblxyXG4gIGNvbnN0cnVjdG9yKHZhbHVlczogTWFwPHN0cmluZywgYW55Pikge1xyXG4gICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgYWRkT3JVcGRhdGUoa2V5OiBzdHJpbmcgLCB2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLnZhbHVlc1trZXldID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBnZXQoa2V5OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMudmFsdWVzW2tleV07XHJcbiAgIH1cclxuXHJcbiAgIGRlbGV0ZShrZXk6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy52YWx1ZXMuZGVsZXRlKGtleSk7XHJcbiAgIH1cclxuXHJcbiAgIGdldEFsbCgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnZhbHVlcztcclxuICAgfVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wdXRlZFZhbHVlIH0gZnJvbSAnLi9jb21wdXRlZC12YWx1ZS5tb2RlbCc7XHJcblxyXG5leHBvcnQgY2xhc3MgQXJpdGhtZXRpY0V4cHJlc3Npb24gaW1wbGVtZW50cyBDb21wdXRlZFZhbHVlIHtcclxuICBleHByZXNzaW9uVGV4dDogc3RyaW5nO1xyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICcuLi9tb2RlbHMvdGVtcGxhdGUubW9kZWwnO1xyXG5pbXBvcnQgeyBTaW11bGF0b3JTdGF0ZSB9IGZyb20gJy4uL21vZGVscy9zaW11bGF0b3Itc3RhdGUubW9kZWwnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzL0JlaGF2aW9yU3ViamVjdCc7XHJcbmltcG9ydCB7IERlY2lzaW9uUG9pbnQgfSBmcm9tICcuLi9tb2RlbHMvZGVjaXNpb25wb2ludC5tb2RlbCc7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50VmFsdWVzIH0gZnJvbSAnLi4vZGF0YWVsZW1lbnR2YWx1ZXMnO1xyXG5pbXBvcnQgeyBDb21wdXRlZERhdGFFbGVtZW50IH0gZnJvbSAnLi4vZWxlbWVudHMvbW9kZWxzL2NvbXB1dGVkLWRhdGEtZWxlbWVudC1tb2RlbCc7XHJcbmltcG9ydCB7IEFyaXRobWV0aWNFeHByZXNzaW9uIH0gZnJvbSAnLi4vbW9kZWxzL2FyaXRobWV0aWMtZXhwcmVzc2lvbi5tb2RlbCc7XHJcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICd1dGlsJztcclxuaW1wb3J0IHsgQ2hvaWNlRGF0YUVsZW1lbnQgfSBmcm9tICcuLi9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLWRhdGEtZWxlbWVudC1tb2RlbCc7XHJcbmltcG9ydCB7IE51bWVyaWNEYXRhRWxlbWVudCB9IGZyb20gJy4uL2VsZW1lbnRzL21vZGVscy9udW1lcmljLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEludGVnZXJEYXRhRWxlbWVudCB9IGZyb20gJy4uL2VsZW1lbnRzL21vZGVscy9pbnRlZ2VyLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IER1cmF0aW9uRGF0YUVsZW1lbnQgfSBmcm9tICcuLi9lbGVtZW50cy9tb2RlbHMvZHVyYXRpb24tZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgTXVsdGlDaG9pY2VEYXRhRWxlbWVudCB9IGZyb20gJy4uL2VsZW1lbnRzL21vZGVscy9tdWx0aS1jaG9pY2UtZGF0YS1lbGVtZW50JztcclxuY29uc3QgZXhwcmVzc2lvblBhcnNlciA9IHJlcXVpcmUoJ2V4cHItZXZhbCcpLlBhcnNlcjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFNpbXVsYXRvckVuZ2luZVNlcnZpY2Uge1xyXG5cclxuICBwcml2YXRlIHRlbXBsYXRlOiBUZW1wbGF0ZTtcclxuICBwcml2YXRlIGRhdGFFbGVtZW50VmFsdWVzOiBNYXA8c3RyaW5nLCBhbnk+O1xyXG4gIHByaXZhdGUgZGF0YUVsZW1lbnRUZXh0czogTWFwPHN0cmluZywgYW55PjtcclxuICBwcml2YXRlIGVuZE9mUm9hZFJlYWNoZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIGxhc3RDb25kaXRpb25NZXRCcmFuY2hMZXZlbCA9IDE7XHJcbiAgcHJpdmF0ZSBub25SZWxldmFudERhdGFFbGVtZW50SWRzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcclxuXHJcbiAgc2ltdWxhdG9yU3RhdGVDaGFuZ2VkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTaW11bGF0b3JTdGF0ZT4obmV3IFNpbXVsYXRvclN0YXRlKCkpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuZGF0YUVsZW1lbnRWYWx1ZXMgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xyXG4gICAgdGhpcy5kYXRhRWxlbWVudFRleHRzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcclxuICAgIHRoaXMubm9uUmVsZXZhbnREYXRhRWxlbWVudElkcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgfVxyXG5cclxuICBnZXRUZW1wbGF0ZSgpOiBUZW1wbGF0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZTtcclxuICB9XHJcblxyXG4gIGdldEFsbERhdGFFbGVtZW50VmFsdWVzKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YUVsZW1lbnRWYWx1ZXM7XHJcbiAgfVxyXG5cclxuICBnZXRBbGxEYXRhRWxlbWVudFRleHRzKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YUVsZW1lbnRUZXh0cztcclxuICB9XHJcblxyXG4gIGdldERhdGFFbGVtZW50VmFsdWUoZGF0YUVsZW1lbnRJZDogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFFbGVtZW50VmFsdWVzW2RhdGFFbGVtZW50SWRdO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0YUVsZW1lbnRUZXh0KGRhdGFFbGVtZW50SWQ6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhRWxlbWVudFRleHRzW2RhdGFFbGVtZW50SWRdO1xyXG4gIH1cclxuXHJcbiAgYWRkT3JVcGRhdGVEYXRhRWxlbWVudChkYXRhRWxlbWVudElkOiBzdHJpbmcsIHZhbHVlOiBhbnksIHRleHQ6IGFueSkge1xyXG4gICAgdGhpcy5kYXRhRWxlbWVudFZhbHVlc1tkYXRhRWxlbWVudElkXSA9IHZhbHVlO1xyXG4gICAgdGhpcy5kYXRhRWxlbWVudFRleHRzW2RhdGFFbGVtZW50SWRdID0gdGV4dDtcclxuICAgIHRoaXMuZXZhbHVhdGVEZWNpc2lvblBvaW50cygpO1xyXG4gIH1cclxuXHJcblxyXG4gIGV2YWx1YXRlRGVjaXNpb25Qb2ludChkZWNpc2lvblBvaW50OiBEZWNpc2lvblBvaW50LCBicmFuY2hpbmdMZXZlbCkge1xyXG4gICAgbGV0IGN1cnJlbnRCcmFuY2hDb3VudCA9IDA7XHJcbiAgICBjb25zdCB0b3RhbEJyYW5jaGVzSW5EZWNpc2lvblBvaW50ID0gZGVjaXNpb25Qb2ludC5icmFuY2hlcy5sZW5ndGg7XHJcbiAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiBkZWNpc2lvblBvaW50LmJyYW5jaGVzKSB7XHJcbiAgICAgIGN1cnJlbnRCcmFuY2hDb3VudCsrO1xyXG4gICAgICBsZXQgY29uZGl0aW9uTWV0ID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLmVuZE9mUm9hZFJlYWNoZWQpIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGJyYW5jaC5jb21wb3NpdGVDb25kaXRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbmRpdGlvbk1ldCA9IGJyYW5jaC5jb21wb3NpdGVDb25kaXRpb24uZXZhbHVhdGUobmV3IERhdGFFbGVtZW50VmFsdWVzKHRoaXMuZGF0YUVsZW1lbnRWYWx1ZXMpKTtcclxuICAgICAgfSBlbHNlIGlmIChicmFuY2guY29uZGl0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25kaXRpb25NZXQgPSBicmFuY2guY29uZGl0aW9uLmV2YWx1YXRlKG5ldyBEYXRhRWxlbWVudFZhbHVlcyh0aGlzLmRhdGFFbGVtZW50VmFsdWVzKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjb25kaXRpb25NZXQpIHtcclxuICAgICAgICB0aGlzLmxhc3RDb25kaXRpb25NZXRCcmFuY2hMZXZlbCA9IGJyYW5jaGluZ0xldmVsO1xyXG4gICAgICAgIC8vIGlmIChub25SZWxldmFudERhdGFFbGVtZW50SWRzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyAgIG5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBpZiAoYnJhbmNoLm5vdFJlbGV2YW50RGF0YUVsZW1lbnRzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyAgIGZvciAoY29uc3Qgbm9uUmVsZXZhbnREYXRhRWxlbWVudFJlZmVyZW5jZSBvZiBicmFuY2gubm90UmVsZXZhbnREYXRhRWxlbWVudHMuZGF0YUVsZW1lbnRSZWZlcmVuY2VzKSB7XHJcbiAgICAgICAgLy8gICAgIG5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHMucHVzaChub25SZWxldmFudERhdGFFbGVtZW50UmVmZXJlbmNlLmRhdGFFbGVtZW50SWQpO1xyXG4gICAgICAgIC8vICAgfVxyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgaWYgKGJyYW5jaC5kZWNpc2lvblBvaW50cyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGJyYW5jaERlY2lzaW9uUG9pbnQgb2YgYnJhbmNoLmRlY2lzaW9uUG9pbnRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0JyYW5jaGluZ0xldmVsID0gYnJhbmNoaW5nTGV2ZWwgKyAxO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmV2YWx1YXRlRGVjaXNpb25Qb2ludChicmFuY2hEZWNpc2lvblBvaW50LCBuZXdCcmFuY2hpbmdMZXZlbCwgbm9uUmVsZXZhbnREYXRhRWxlbWVudElkcyk7XHJcbiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVEZWNpc2lvblBvaW50KGJyYW5jaERlY2lzaW9uUG9pbnQsIG5ld0JyYW5jaGluZ0xldmVsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGJyYW5jaC5lbmRQb2ludFJlZiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBjb25zdCBzaW11bGF0b3JTdGF0ZSA9IG5ldyBTaW11bGF0b3JTdGF0ZSgpO1xyXG4gICAgICAgICAgc2ltdWxhdG9yU3RhdGUuZW5kUG9pbnRJZCA9IGJyYW5jaC5lbmRQb2ludFJlZi5lbmRQb2ludElkO1xyXG4gICAgICAgICAgLy8gc2ltdWxhdG9yU3RhdGUubm9uUmVsZXZhbnREYXRhRWxlbWVudElkcyA9IG5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHM7XHJcbiAgICAgICAgICBzaW11bGF0b3JTdGF0ZS5zZWxlY3RlZEJyYW5jaExhYmVsID0gYnJhbmNoLmxhYmVsO1xyXG4gICAgICAgICAgc2ltdWxhdG9yU3RhdGUuc2VsZWN0ZWREZWNpc2lvblBvaW50SWQgPSBkZWNpc2lvblBvaW50LmlkO1xyXG4gICAgICAgICAgc2ltdWxhdG9yU3RhdGUuc2VsZWN0ZWREZWNpc2lvblBvaW50TGFiZWwgPSBkZWNpc2lvblBvaW50LmxhYmVsO1xyXG4gICAgICAgICAgLy8gdGhpcy5yZXNldFZhbHVlc09mTm9uUmVsZXZhbnREYXRhRWxlbWVudHMobm9uUmVsZXZhbnREYXRhRWxlbWVudElkcyk7XHJcblxyXG4gICAgICAgICAgdGhpcy5zaW11bGF0b3JTdGF0ZUNoYW5nZWQubmV4dChzaW11bGF0b3JTdGF0ZSk7XHJcbiAgICAgICAgICB0aGlzLmVuZE9mUm9hZFJlYWNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChjdXJyZW50QnJhbmNoQ291bnQgPj0gdG90YWxCcmFuY2hlc0luRGVjaXNpb25Qb2ludCkge1xyXG4gICAgICAgICAgdGhpcy5lbmRPZlJvYWRSZWFjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgIGNvbnN0IHNpbXVsYXRvclN0YXRlID0gbmV3IFNpbXVsYXRvclN0YXRlKCk7XHJcbiAgICAgICAgICAvLyBzaW11bGF0b3JTdGF0ZS5ub25SZWxldmFudERhdGFFbGVtZW50SWRzID0gbm9uUmVsZXZhbnREYXRhRWxlbWVudElkcztcclxuICAgICAgICAgIC8vIHRoaXMucmVzZXRWYWx1ZXNPZk5vblJlbGV2YW50RGF0YUVsZW1lbnRzKG5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHMpO1xyXG4gICAgICAgICAgdGhpcy5zaW11bGF0b3JTdGF0ZUNoYW5nZWQubmV4dChzaW11bGF0b3JTdGF0ZSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNldFZhbHVlc09mTm9uUmVsZXZhbnREYXRhRWxlbWVudHMobm9uUmVsZXZhbnREYXRhRWxlbWVudElkczogc3RyaW5nW10pIHtcclxuICAgLy8gY29uc29sZS5sb2codGhpcy50ZW1wbGF0ZS5kYXRhRWxlbWVudHMpO1xyXG4gICAgaWYgKG5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmb3IgKGNvbnN0IG5vblJlbGV2YW50RGF0YUVsZW1lbnRJZCBvZiBub25SZWxldmFudERhdGFFbGVtZW50SWRzKSB7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZTogYW55O1xyXG4gICAgICAgIGZvciAoY29uc3QgZGF0YUVsZW1lbnQgb2YgdGhpcy50ZW1wbGF0ZS5kYXRhRWxlbWVudHMpIHtcclxuICAgICAgICAgIGlmIChkYXRhRWxlbWVudC5pZCA9PT0gbm9uUmVsZXZhbnREYXRhRWxlbWVudElkKSB7XHJcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRhdGFFbGVtZW50LmRlZmF1bHRWYWx1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRhdGFFbGVtZW50VmFsdWVzW25vblJlbGV2YW50RGF0YUVsZW1lbnRJZF0gPSBkZWZhdWx0VmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV2YWx1YXRlQ29tcHV0ZWRFbGVtZW50RGVjaXNpb25Qb2ludChlbGVtZW50SWQ6IHN0cmluZywgZGVjaXNpb25Qb2ludDogRGVjaXNpb25Qb2ludCwgYnJhbmNoaW5nTGV2ZWwpIHtcclxuICAgIGxldCBjdXJyZW50QnJhbmNoQ291bnQgPSAwO1xyXG4gICAgY29uc3QgdG90YWxCcmFuY2hlc0luRGVjaXNpb25Qb2ludCA9IGRlY2lzaW9uUG9pbnQuYnJhbmNoZXMubGVuZ3RoO1xyXG4gICAgZm9yIChjb25zdCBicmFuY2ggb2YgZGVjaXNpb25Qb2ludC5icmFuY2hlcykge1xyXG5cclxuICAgICAgY3VycmVudEJyYW5jaENvdW50Kys7XHJcbiAgICAgIGxldCBjb25kaXRpb25NZXQgPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuZW5kT2ZSb2FkUmVhY2hlZCkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChicmFuY2guY29tcG9zaXRlQ29uZGl0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25kaXRpb25NZXQgPSBicmFuY2guY29tcG9zaXRlQ29uZGl0aW9uLmV2YWx1YXRlKG5ldyBEYXRhRWxlbWVudFZhbHVlcyh0aGlzLmRhdGFFbGVtZW50VmFsdWVzKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoYnJhbmNoLmNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uZGl0aW9uTWV0ID0gYnJhbmNoLmNvbmRpdGlvbi5ldmFsdWF0ZShuZXcgRGF0YUVsZW1lbnRWYWx1ZXModGhpcy5kYXRhRWxlbWVudFZhbHVlcykpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29uZGl0aW9uTWV0KSB7XHJcbiAgICAgICAgdGhpcy5sYXN0Q29uZGl0aW9uTWV0QnJhbmNoTGV2ZWwgPSBicmFuY2hpbmdMZXZlbDtcclxuICAgICAgICBpZiAoYnJhbmNoLmRlY2lzaW9uUG9pbnRzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGZvciAoY29uc3QgYnJhbmNoRGVjaXNpb25Qb2ludCBvZiBicmFuY2guZGVjaXNpb25Qb2ludHMpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV3QnJhbmNoaW5nTGV2ZWwgPSBicmFuY2hpbmdMZXZlbCArIDE7XHJcbiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVDb21wdXRlZEVsZW1lbnREZWNpc2lvblBvaW50KGVsZW1lbnRJZCwgYnJhbmNoRGVjaXNpb25Qb2ludCwgbmV3QnJhbmNoaW5nTGV2ZWwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoYnJhbmNoLmNvbXB1dGVkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG5cclxuICAgICAgICAgIHRoaXMuZGF0YUVsZW1lbnRWYWx1ZXNbZWxlbWVudElkXSA9IGJyYW5jaC5jb21wdXRlZFZhbHVlLmV4cHJlc3Npb25UZXh0O1xyXG4gICAgICAgICAgdGhpcy5lbmRPZlJvYWRSZWFjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgIGlmIChicmFuY2guY29tcHV0ZWRWYWx1ZSBpbnN0YW5jZW9mIEFyaXRobWV0aWNFeHByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YUVsZW1lbnRWYWx1ZXNbZWxlbWVudElkXSA9IHRoaXMuZXZhbHVhdGVBcml0aG1ldGljRXhwcmVzc2lvbihicmFuY2guY29tcHV0ZWRWYWx1ZS5leHByZXNzaW9uVGV4dCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kT2ZSb2FkUmVhY2hlZCA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFFbGVtZW50VmFsdWVzW2VsZW1lbnRJZF0gPSBicmFuY2guY29tcHV0ZWRWYWx1ZS5leHByZXNzaW9uVGV4dDtcclxuICAgICAgICAgICAgdGhpcy5lbmRPZlJvYWRSZWFjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRCcmFuY2hDb3VudCA+PSB0b3RhbEJyYW5jaGVzSW5EZWNpc2lvblBvaW50KSB7XHJcbiAgICAgICAgICB0aGlzLmVuZE9mUm9hZFJlYWNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5kYXRhRWxlbWVudFZhbHVlc1tlbGVtZW50SWRdID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXZhbHVhdGVBcml0aG1ldGljRXhwcmVzc2lvbihjb21wdXRlZFZhbHVlOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgbGV0IHN0YXJ0SW5kZXggPSAwO1xyXG4gICAgbGV0IGVuZEluZGV4ID0gMDtcclxuICAgIHdoaWxlIChzdGFydEluZGV4ICE9PSAtMSAmJiBlbmRJbmRleCAhPT0gLTEpIHtcclxuICAgICAgc3RhcnRJbmRleCA9IGNvbXB1dGVkVmFsdWUuaW5kZXhPZigneycpO1xyXG4gICAgICBlbmRJbmRleCA9IGNvbXB1dGVkVmFsdWUuaW5kZXhPZignfScpO1xyXG4gICAgICBpZiAoc3RhcnRJbmRleCAhPT0gLTEgJiYgZW5kSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YUVsZW1lbnRJZCA9IGNvbXB1dGVkVmFsdWUuc3Vic3RyaW5nKHN0YXJ0SW5kZXggKyAxLCBlbmRJbmRleCk7XHJcbiAgICAgICAgY29uc3QgcmVwbGFjaW5nVmFsdWUgPSBjb21wdXRlZFZhbHVlLnN1YnN0cmluZyhzdGFydEluZGV4LCBlbmRJbmRleCArIDEpO1xyXG4gICAgICAgIGxldCBkYXRhRWxlbWVudFZhbHVlID0gdGhpcy5kYXRhRWxlbWVudFZhbHVlc1tkYXRhRWxlbWVudElkXTtcclxuICAgICAgICBpZiAoaXNBcnJheShkYXRhRWxlbWVudFZhbHVlKSkge1xyXG4gICAgICAgICAgbGV0IHN1bSA9IDA7XHJcbiAgICAgICAgICBkYXRhRWxlbWVudFZhbHVlLmZvckVhY2godmFsID0+IHtcclxuICAgICAgICAgICAgc3VtICs9ICt2YWw7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGRhdGFFbGVtZW50VmFsdWUgPSBzdW07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb21wdXRlZFZhbHVlID0gY29tcHV0ZWRWYWx1ZS5yZXBsYWNlKHJlcGxhY2luZ1ZhbHVlLCBkYXRhRWxlbWVudFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBleHByZXNzaW9uUGFyc2VyLmV2YWx1YXRlKGNvbXB1dGVkVmFsdWUpLnRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBldmFsdWF0ZUNvbXB1dGVkRXhwcmVzc2lvbnMoKSB7XHJcbiAgICB0aGlzLmVuZE9mUm9hZFJlYWNoZWQgPSBmYWxzZTtcclxuICAgIGxldCBleHByZXNzaW9uVmFsdWU6IGFueTtcclxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLnRlbXBsYXRlLmRhdGFFbGVtZW50cykge1xyXG4gICAgICBpZiAoZWxlbWVudC5kYXRhRWxlbWVudFR5cGUgPT09ICdDb21wdXRlZERhdGFFbGVtZW50Jykge1xyXG4gICAgICAgIGV4cHJlc3Npb25WYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBjb21wdXRlZEVsZW1lbnQ6IENvbXB1dGVkRGF0YUVsZW1lbnQgPSBlbGVtZW50IGFzIENvbXB1dGVkRGF0YUVsZW1lbnQ7XHJcbiAgICAgICAgZm9yIChjb25zdCBkZWNpc2lvblBvaW50IG9mIGNvbXB1dGVkRWxlbWVudC5kZWNpc2lvblBvaW50cykge1xyXG4gICAgICAgICAgdGhpcy5ldmFsdWF0ZUNvbXB1dGVkRWxlbWVudERlY2lzaW9uUG9pbnQoZWxlbWVudC5pZCwgZGVjaXNpb25Qb2ludCwgMSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5kYXRhRWxlbWVudFZhbHVlc1tlbGVtZW50LmlkXSA9PT0gdW5kZWZpbmVkICYmIGRlY2lzaW9uUG9pbnQuZGVmYXVsdEJyYW5jaCAmJlxyXG4gICAgICAgICAgICBkZWNpc2lvblBvaW50LmRlZmF1bHRCcmFuY2guY29tcHV0ZWRWYWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFFbGVtZW50VmFsdWVzW2VsZW1lbnQuaWRdID0gZGVjaXNpb25Qb2ludC5kZWZhdWx0QnJhbmNoLmNvbXB1dGVkVmFsdWUuZXhwcmVzc2lvblRleHQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmVuZE9mUm9hZFJlYWNoZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXZhbHVhdGVDb25kaXRpb25hbFByb3BlcnR5KGRhdGFlbGVtZW50LCBub25SZWxldmFudERhdGFFbGVtZW50SWRzOiBzdHJpbmdbXSA9IFtdKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICBpZiAoZGF0YWVsZW1lbnQuY29uZGl0aW9uYWxQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgbGV0IGNvbmRpdGlvbk1ldCA9IGZhbHNlO1xyXG4gICAgICBsZXQgaXNDb21wb3NpdGVDb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgZm9yIChjb25zdCBjb25kaXRpb25hbFByb3BlcnR5IG9mIGRhdGFlbGVtZW50LmNvbmRpdGlvbmFsUHJvcGVydGllcykge1xyXG4gICAgICAgIGlmIChjb25kaXRpb25hbFByb3BlcnR5LmNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBjb25kaXRpb25NZXQgPSBjb25kaXRpb25hbFByb3BlcnR5LmNvbmRpdGlvbi5ldmFsdWF0ZShuZXcgRGF0YUVsZW1lbnRWYWx1ZXModGhpcy5kYXRhRWxlbWVudFZhbHVlcykpO1xyXG4gICAgICAgICAgaXNDb21wb3NpdGVDb25kaXRpb24gPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbmFsUHJvcGVydHkuY29tcG9zaXRlQ29uZGl0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbk1ldCA9IGNvbmRpdGlvbmFsUHJvcGVydHkuY29tcG9zaXRlQ29uZGl0aW9uLmV2YWx1YXRlKG5ldyBEYXRhRWxlbWVudFZhbHVlcyh0aGlzLmRhdGFFbGVtZW50VmFsdWVzKSk7XHJcbiAgICAgICAgICBpc0NvbXBvc2l0ZUNvbmRpdGlvbiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY29uZGl0aW9uTWV0KSB7XHJcbiAgICAgICAgICBpZiAobm9uUmVsZXZhbnREYXRhRWxlbWVudElkcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9uUmVsZXZhbnREYXRhRWxlbWVudElkcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGNvbmRpdGlvbmFsUHJvcGVydHkuaXNSZWxldmFudCA9PT0gJ2ZhbHNlJykge1xyXG4gICAgICAgICAgICB0aGlzLm5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHMucHVzaChkYXRhZWxlbWVudC5pZCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkYXRhZWxlbWVudC5kaXNwbGF5U2VxdWVuY2UgPSBjb25kaXRpb25hbFByb3BlcnR5LkRpc3BsYXlTZXF1ZW5jZTtcclxuICAgICAgICAgICAgZGF0YWVsZW1lbnQuaXNSZXF1aXJlZCA9IGNvbmRpdGlvbmFsUHJvcGVydHkuaXNSZXF1aXJlZCAhPT0gdW5kZWZpbmVkID9cclxuICAgICAgICAgICAgICAoY29uZGl0aW9uYWxQcm9wZXJ0eS5pc1JlcXVpcmVkLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJyA/IHRydWUgOiBmYWxzZSlcclxuICAgICAgICAgICAgICA6IHRydWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uYWxQcm9wZXJ0eS5NaW5pbXVtICE9PSB1bmRlZmluZWQgJiYgY29uZGl0aW9uYWxQcm9wZXJ0eS5NaW5pbXVtICE9IG51bGwgICkge1xyXG4gICAgICAgICAgICAgIGRhdGFlbGVtZW50Lm1pbmltdW0gPSArY29uZGl0aW9uYWxQcm9wZXJ0eS5NaW5pbXVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjb25kaXRpb25hbFByb3BlcnR5Lk1heGltdW0gIT09IHVuZGVmaW5lZCAmJiBjb25kaXRpb25hbFByb3BlcnR5Lk1heGltdW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIGRhdGFlbGVtZW50Lm1heGltdW0gPSArY29uZGl0aW9uYWxQcm9wZXJ0eS5NYXhpbXVtO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YWVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09PSAnQ2hvaWNlRGF0YUVsZW1lbnQnKSB7XHJcbiAgICAgICAgICAgICAgKGRhdGFlbGVtZW50IGFzIENob2ljZURhdGFFbGVtZW50KS5DaG9pY2VOb3RSZWxldmFudCA9IGNvbmRpdGlvbmFsUHJvcGVydHkuQ2hvaWNlTm90UmVsZXZhbnQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhZWxlbWVudC5kYXRhRWxlbWVudFR5cGUgPT09ICdNdWx0aUNob2ljZURhdGFFbGVtZW50Jykge1xyXG4gICAgICAgICAgICAgIChkYXRhZWxlbWVudCBhcyBNdWx0aUNob2ljZURhdGFFbGVtZW50KS5DaG9pY2VOb3RSZWxldmFudCA9IGNvbmRpdGlvbmFsUHJvcGVydHkuQ2hvaWNlTm90UmVsZXZhbnQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhZWxlbWVudC5kYXRhRWxlbWVudFR5cGUgPT09ICdEdXJhdGlvbkRhdGFFbGVtZW50Jykge1xyXG4gICAgICAgICAgICAgIChkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NaW5pbXVtRGF5ID0gK2NvbmRpdGlvbmFsUHJvcGVydHkuTWluaW11bURheTtcclxuICAgICAgICAgICAgICAoZGF0YWVsZW1lbnQgYXMgRHVyYXRpb25EYXRhRWxlbWVudCkuTWF4aW11bURheSA9ICtjb25kaXRpb25hbFByb3BlcnR5Lk1heGltdW1EYXk7XHJcbiAgICAgICAgICAgICAgKGRhdGFlbGVtZW50IGFzIER1cmF0aW9uRGF0YUVsZW1lbnQpLk1pbmltdW1Ib3VycyA9ICtjb25kaXRpb25hbFByb3BlcnR5Lk1pbmltdW1Ib3VycztcclxuICAgICAgICAgICAgICAoZGF0YWVsZW1lbnQgYXMgRHVyYXRpb25EYXRhRWxlbWVudCkuTWF4aW11bUhvdXJzID0gK2NvbmRpdGlvbmFsUHJvcGVydHkuTWF4aW11bUhvdXJzO1xyXG4gICAgICAgICAgICAgIChkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NaW5pbXVtTWludXRlcyA9ICtjb25kaXRpb25hbFByb3BlcnR5Lk1pbmltdW1NaW51dGVzO1xyXG4gICAgICAgICAgICAgIChkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NYXhtaW11bU1pbnV0ZXMgPSArY29uZGl0aW9uYWxQcm9wZXJ0eS5NYXhtaW11bU1pbnV0ZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5ub25SZWxldmFudERhdGFFbGVtZW50SWRzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoZGF0YWVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09PSAnQ2hvaWNlRGF0YUVsZW1lbnQnKSB7XHJcbiAgICAgICAgICAgIChkYXRhZWxlbWVudCBhcyBDaG9pY2VEYXRhRWxlbWVudCkuQ2hvaWNlTm90UmVsZXZhbnQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGRhdGFlbGVtZW50LmRhdGFFbGVtZW50VHlwZSA9PT0gJ011bHRpQ2hvaWNlRGF0YUVsZW1lbnQnKSB7XHJcbiAgICAgICAgICAgIChkYXRhZWxlbWVudCBhcyBDaG9pY2VEYXRhRWxlbWVudCkuQ2hvaWNlTm90UmVsZXZhbnQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gdGVtcCBjb2RlXHJcbiAgICAgIC8vIGlmICh0aGlzLm5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIC8vICAgZGF0YWVsZW1lbnQuaXNSZXF1aXJlZCA9IHRydWU7XHJcbiAgICAgIC8vIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNDb25kdGlvbk1ldCgpOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3QgZGF0YWVsZW1lbnQgb2YgdGhpcy50ZW1wbGF0ZS5kYXRhRWxlbWVudHMpIHtcclxuICAgICAgaWYgKGRhdGFlbGVtZW50LmNvbmRpdGlvbmFsUHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgbGV0IGNvbmRpdGlvbk1ldCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBpc0NvbXBvc2l0ZUNvbmRpdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uYWxQcm9wZXJ0eSBvZiBkYXRhZWxlbWVudC5jb25kaXRpb25hbFByb3BlcnRpZXMpIHtcclxuICAgICAgICAgIGlmIChjb25kaXRpb25hbFByb3BlcnR5LmNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbmRpdGlvbk1ldCA9IGNvbmRpdGlvbmFsUHJvcGVydHkuY29uZGl0aW9uLmV2YWx1YXRlKG5ldyBEYXRhRWxlbWVudFZhbHVlcyh0aGlzLmRhdGFFbGVtZW50VmFsdWVzKSk7XHJcbiAgICAgICAgICAgIGlzQ29tcG9zaXRlQ29uZGl0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbmFsUHJvcGVydHkuY29tcG9zaXRlQ29uZGl0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uTWV0ID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5jb21wb3NpdGVDb25kaXRpb24uZXZhbHVhdGUobmV3IERhdGFFbGVtZW50VmFsdWVzKHRoaXMuZGF0YUVsZW1lbnRWYWx1ZXMpKTtcclxuICAgICAgICAgICAgaXNDb21wb3NpdGVDb25kaXRpb24gPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChjb25kaXRpb25NZXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXZhbHVhdGVEZWNpc2lvbkFuZENvbmRpdGlvbmFsUHJvcGVydHkoKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICB0aGlzLm5vblJlbGV2YW50RGF0YUVsZW1lbnRJZHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgdGhpcy5SZXZlcnRDb25kaXRpb25WYWx1ZXMoKTtcclxuICAgIGZvciAoY29uc3QgZGF0YWVsZW1lbnQgb2YgdGhpcy50ZW1wbGF0ZS5kYXRhRWxlbWVudHMpIHtcclxuICAgICAgdGhpcy5ldmFsdWF0ZUNvbmRpdGlvbmFsUHJvcGVydHkoZGF0YWVsZW1lbnQsIG5ldyBBcnJheTxzdHJpbmc+KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVzZXRWYWx1ZXNPZk5vblJlbGV2YW50RGF0YUVsZW1lbnRzKHRoaXMubm9uUmVsZXZhbnREYXRhRWxlbWVudElkcyk7XHJcbiAgICByZXR1cm4gdGhpcy5ub25SZWxldmFudERhdGFFbGVtZW50SWRzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBSZXZlcnRDb25kaXRpb25WYWx1ZXMoKSB7XHJcbiAgICBmb3IgKGNvbnN0IGRhdGFlbGVtZW50IG9mIHRoaXMudGVtcGxhdGUuZGF0YUVsZW1lbnRzKSB7XHJcbiAgICAgIGRhdGFlbGVtZW50LmlzUmVxdWlyZWQgPSBkYXRhZWxlbWVudC5pc1JlcXVpcmVkT3ZlcnJpZGVyO1xyXG4gICAgICBkYXRhZWxlbWVudC5kaXNwbGF5U2VxdWVuY2UgPSBkYXRhZWxlbWVudC5kaXNwbGF5U2VxdWVuY2VPdmVycmlkZXI7XHJcbiAgICAgIGlmIChkYXRhZWxlbWVudC5kYXRhRWxlbWVudFR5cGUgPT09ICdOdW1lcmljRGF0YUVsZW1lbnQnKSB7XHJcbiAgICAgICAgKGRhdGFlbGVtZW50IGFzIE51bWVyaWNEYXRhRWxlbWVudCkubWluaW11bSA9ICsoZGF0YWVsZW1lbnQgYXMgTnVtZXJpY0RhdGFFbGVtZW50KS5taW5pbXVtT3ZlcnJpZGVyO1xyXG4gICAgICAgIChkYXRhZWxlbWVudCBhcyBOdW1lcmljRGF0YUVsZW1lbnQpLm1heGltdW0gPSArKGRhdGFlbGVtZW50IGFzIE51bWVyaWNEYXRhRWxlbWVudCkubWF4aW11bU92ZXJyaWRlcjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZGF0YWVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09PSAnSW50ZWdlckRhdGFFbGVtZW50Jykge1xyXG4gICAgICAgIChkYXRhZWxlbWVudCBhcyBJbnRlZ2VyRGF0YUVsZW1lbnQpLm1pbmltdW0gPSArKGRhdGFlbGVtZW50IGFzIEludGVnZXJEYXRhRWxlbWVudCkubWluaW11bU92ZXJyaWRlcjtcclxuICAgICAgICAoZGF0YWVsZW1lbnQgYXMgSW50ZWdlckRhdGFFbGVtZW50KS5tYXhpbXVtID0gKyhkYXRhZWxlbWVudCBhcyBJbnRlZ2VyRGF0YUVsZW1lbnQpLm1heGltdW1PdmVycmlkZXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkYXRhZWxlbWVudC5kYXRhRWxlbWVudFR5cGUgPT09ICdEdXJhdGlvbkRhdGFFbGVtZW50Jykge1xyXG4gICAgICAgIChkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NaW5pbXVtRGF5ID0gKyhkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NaW5pbXVtRGF5T3ZlcnJpZGVyO1xyXG4gICAgICAgIChkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NYXhpbXVtRGF5ID0gKyhkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NYXhpbXVtRGF5T3ZlcnJpZGVyO1xyXG4gICAgICAgIChkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NaW5pbXVtSG91cnMgPSArKGRhdGFlbGVtZW50IGFzIER1cmF0aW9uRGF0YUVsZW1lbnQpLk1pbmltdW1Ib3Vyc092ZXJyaWRlcjtcclxuICAgICAgICAoZGF0YWVsZW1lbnQgYXMgRHVyYXRpb25EYXRhRWxlbWVudCkuTWF4aW11bUhvdXJzID0gKyhkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NYXhpbXVtSG91cnNPdmVycmlkZXI7XHJcbiAgICAgICAgKGRhdGFlbGVtZW50IGFzIER1cmF0aW9uRGF0YUVsZW1lbnQpLk1pbmltdW1NaW51dGVzID0gKyhkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NaW5pbXVtTWludXRlc092ZXJyaWRlcjtcclxuICAgICAgICAoZGF0YWVsZW1lbnQgYXMgRHVyYXRpb25EYXRhRWxlbWVudCkuTWF4bWltdW1NaW51dGVzID0gKyhkYXRhZWxlbWVudCBhcyBEdXJhdGlvbkRhdGFFbGVtZW50KS5NYXhtaW11bU1pbnV0ZXNPdmVycmlkZXI7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXZhbHVhdGVEZWNpc2lvblBvaW50cygpIHtcclxuICAgIHRoaXMuZXZhbHVhdGVDb21wdXRlZEV4cHJlc3Npb25zKCk7XHJcbiAgICB0aGlzLmVuZE9mUm9hZFJlYWNoZWQgPSBmYWxzZTtcclxuICAgIGZvciAoY29uc3QgZGVjaXNpb25Qb2ludCBvZiB0aGlzLnRlbXBsYXRlLnJ1bGVzLmRlY2lzaW9uUG9pbnRzKSB7XHJcbiAgICAgIHRoaXMuZXZhbHVhdGVEZWNpc2lvblBvaW50KGRlY2lzaW9uUG9pbnQsIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZSh0ZW1wbGF0ZTogVGVtcGxhdGUpIHtcclxuICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcclxuICAgIGZvciAoY29uc3QgZGF0YUVsZW1lbnQgb2YgdGhpcy50ZW1wbGF0ZS5kYXRhRWxlbWVudHMpIHtcclxuICAgICAgdGhpcy5kYXRhRWxlbWVudFZhbHVlc1tkYXRhRWxlbWVudC5pZF0gPSBkYXRhRWxlbWVudC5jdXJyZW50VmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7TmdNb2R1bGUgLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7Q29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtTaW11bGF0b3JFbmdpbmVTZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzL3NpbXVsYXRvci1lbmdpbmUuc2VydmljZSc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZVxyXG4gIF0sXHJcbiAgZGVjbGFyYXRpb25zOiBbXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29yZU1vZHVsZSB7XHJcbiAgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuZ01vZHVsZTogQ29yZU1vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzOiBbIFNpbXVsYXRvckVuZ2luZVNlcnZpY2VdXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcblxyXG4gfVxyXG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJy4uL21ldGFkYXRhL21vZGVscy9tZXRhZGF0YS1tb2RlbCc7XHJcbmltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4uL2VsZW1lbnRzL21vZGVscy9iYXNlLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IFJ1bGVzIH0gZnJvbSAnLi4vcnVsZXMvbW9kZWxzL3J1bGVzLm1vZGVsJztcclxuaW1wb3J0IHsgVGVtcGxhdGVQYXJ0aWFsIH0gZnJvbSAnLi4vZW5kcG9pbnQvdGVtcGxhdGUtcGFydGlhbCc7XHJcbmltcG9ydCB7IFNlY3Rpb25JZlZhbHVlTm90Q29uZGl0aW9uIH0gZnJvbSAnLi4vZW5kcG9pbnQvc2VjdGlvbi1pZi12YWx1ZS1ub3QtY29uZGl0aW9uJztcclxuXHJcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZSB7XHJcbiAgbWV0YWRhdGE6IE1ldGFkYXRhO1xyXG4gIGRhdGFFbGVtZW50czogQmFzZURhdGFFbGVtZW50W107XHJcbiAgcnVsZXM6IFJ1bGVzO1xyXG4gIHRlbXBsYXRlUGFydGlhbDogc3RyaW5nW107XHJcbiAgZW5kUG9pbnRzU3RyaW5nOiBzdHJpbmdbXTtcclxuICB4bWxDb250ZW50OiBzdHJpbmc7XHJcblxyXG59XHJcbiIsImltcG9ydCB7IERpYWdyYW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvZGlhZ3JhbS5tb2RlbCc7XHJcblxyXG5leHBvcnQgY2xhc3MgTWV0YWRhdGEge1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgaWQ6IHN0cmluZztcclxuICBzY2hlbWFWZXJzaW9uOiBzdHJpbmc7XHJcbiAgcnVsZVZlcnNpb246IHN0cmluZztcclxuICBkaWFncmFtczogRGlhZ3JhbVtdO1xyXG4gIGNyZWF0ZWREYXRlOiBEYXRlO1xyXG4gIGxhc3RNb2RpZmllZERhdGU6IERhdGU7XHJcbiAgYXBwcm92ZWRCeTogc3RyaW5nO1xyXG4gIHJldmlld2VkQnk6IHN0cmluZztcclxuICBkZXZlbG9wZWRCeTogc3RyaW5nO1xyXG4gIHJhZEVsZW1lbnRTZXRJRDogc3RyaW5nO1xyXG4gfVxyXG4iLCJleHBvcnQgY2xhc3MgRGlhZ3JhbSB7XHJcbiAgcHVibGljIGRpc3BsYXlTZXF1ZW5jZTogTnVtYmVyO1xyXG4gIHB1YmxpYyBrZXlEaWFncmFtOiBib29sZWFuO1xyXG4gIHB1YmxpYyBsYWJlbDogc3RyaW5nO1xyXG4gIHB1YmxpYyBsb2NhdGlvbjogc3RyaW5nO1xyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEFycmF5Q2hlY2tlclNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBpc0FycmF5KGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGl0ZW0gaW5zdGFuY2VvZiBBcnJheTtcclxuICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGlhZ3JhbSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2RpYWdyYW0ubW9kZWwnO1xyXG5pbXBvcnQgeyBBcnJheUNoZWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9hcnJheS1jaGVja2VyLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRGlhZ3JhbVNlcnZpY2Uge1xyXG5cclxuIGNvbnN0cnVjdG9yKHByaXZhdGUgYXJyYXlDaGVja2VyU2V2aWNlU2VydmljZTogQXJyYXlDaGVja2VyU2VydmljZSkge1xyXG5cclxuIH1cclxuXHJcbnByaXZhdGUgIHJldHVybkRpYWdyYW0oZGlhZ3JhbUpTT046IGFueSApOiBEaWFncmFtIHtcclxuXHJcbiAgICBjb25zdCBkaWFncmFtID0gbmV3IERpYWdyYW0oKTtcclxuXHJcbiAgICBpZiAoIGRpYWdyYW1KU09OLkF0dHIpICB7XHJcbiAgICAgIGRpYWdyYW0uZGlzcGxheVNlcXVlbmNlID0gZGlhZ3JhbUpTT04uQXR0ci5EaXNwbGF5U2VxdWVuY2U7XHJcbiAgICAgIGRpYWdyYW0ua2V5RGlhZ3JhbSA9IGRpYWdyYW1KU09OLkF0dHIuSXNLZXlEaWFncmFtID8gIGRpYWdyYW1KU09OLkF0dHIuSXNLZXlEaWFncmFtIDogZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkaWFncmFtLmRpc3BsYXlTZXF1ZW5jZSA9IHVuZGVmaW5lZDtcclxuICAgICAgZGlhZ3JhbS5rZXlEaWFncmFtID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBkaWFncmFtLmxhYmVsID0gZGlhZ3JhbUpTT04uTGFiZWw7XHJcbiAgICBkaWFncmFtLmxvY2F0aW9uID0gZGlhZ3JhbUpTT04uTG9jYXRpb247XHJcbiAgICByZXR1cm4gZGlhZ3JhbTtcclxuICB9XHJcblxyXG4gIHJldHVybkRpYWdyYW1zKGRpYWdyYW1zQXNKU09OOiBhbnkpOiBEaWFncmFtW10ge1xyXG4gICAgY29uc3QgZGlhZ3JhbXMgPSBuZXcgQXJyYXk8RGlhZ3JhbT4oKTtcclxuICAgIGlmIChkaWFncmFtc0FzSlNPTiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNldmljZVNlcnZpY2UuaXNBcnJheShkaWFncmFtc0FzSlNPTikpIHtcclxuICAgICAgICAgIGZvciAoY29uc3QgZGlhZ3JhbSBvZiBkaWFncmFtc0FzSlNPTikge1xyXG4gICAgICAgICAgICBkaWFncmFtcy5wdXNoKHRoaXMucmV0dXJuRGlhZ3JhbShkaWFncmFtKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZGlhZ3JhbXMucHVzaCh0aGlzLnJldHVybkRpYWdyYW0oZGlhZ3JhbXNBc0pTT04pKTtcclxuICAgICAgfVxyXG4gICB9XHJcbiAgIHJldHVybiBkaWFncmFtcztcclxuICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7SW5qZWN0aW9uVG9rZW59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5leHBvcnQgY29uc3QgQ3JlYXRpb25TZXJ2aWNlSW5qZWN0b3JUb2tlbiA9IG5ldyBJbmplY3Rpb25Ub2tlbignb25lJyk7XHJcbiIsImltcG9ydCB7IEJyYW5jaCB9IGZyb20gJy4vYnJhbmNoLm1vZGVsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBEZWNpc2lvblBvaW50IHtcclxuICBpZDogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgYnJhbmNoZXM6IEJyYW5jaFtdO1xyXG4gIGRlZmF1bHRCcmFuY2g6IEJyYW5jaDtcclxufVxyXG4iLCJpbXBvcnQgeyBOb3RSZWxldmFudERhdGFFbGVtZW50cyB9IGZyb20gJy4vbm90cmVsZXZhbnRkYXRhZWxlbWVudHMubW9kZWwnO1xyXG5pbXBvcnQgeyBDb21wb3NpdGVDb25kaXRpb24gfSBmcm9tICcuLi9jb21wb3NpdGUtY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSAnLi4vY29uZGl0aW9uJztcclxuaW1wb3J0IHsgRGVjaXNpb25Qb2ludCB9IGZyb20gJy4vZGVjaXNpb25wb2ludC5tb2RlbCc7XHJcbmltcG9ydCB7IEVuZFBvaW50UmVmIH0gZnJvbSAnLi9lbmRwb2ludHJlZi5tb2RlbCc7XHJcbmltcG9ydCB7IENvbXB1dGVkVmFsdWUgfSBmcm9tICcuL2NvbXB1dGVkLXZhbHVlLm1vZGVsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBCcmFuY2gge1xyXG5cclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIG5vdFJlbGV2YW50RGF0YUVsZW1lbnRzOiBOb3RSZWxldmFudERhdGFFbGVtZW50cztcclxuICBjb21wb3NpdGVDb25kaXRpb246IENvbXBvc2l0ZUNvbmRpdGlvbjtcclxuICBjb25kaXRpb246IENvbmRpdGlvbjtcclxuICBkZWNpc2lvblBvaW50czogRGVjaXNpb25Qb2ludFtdO1xyXG4gIGVuZFBvaW50UmVmOiBFbmRQb2ludFJlZjtcclxuICBjb21wdXRlZFZhbHVlOiBDb21wdXRlZFZhbHVlO1xyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBFbmRQb2ludFJlZiB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xyXG4gIGVuZFBvaW50SWQ6IHN0cmluZztcclxufVxyXG4iLCJleHBvcnQgY2xhc3MgRGF0YUVsZW1lbnRSZWYge1xyXG4gIGRhdGFFbGVtZW50SWQ6IHN0cmluZztcclxufVxyXG4iLCJpbXBvcnQgeyBEYXRhRWxlbWVudFJlZiB9IGZyb20gJy4vZGF0YWVsZW1lbnRyZWYubW9kZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIE5vdFJlbGV2YW50RGF0YUVsZW1lbnRzIHtcclxuICBkYXRhRWxlbWVudFJlZmVyZW5jZXM6IERhdGFFbGVtZW50UmVmW107XHJcbn1cclxuIiwiaW1wb3J0IHtDb25kaXRpb25UeXBlfSBmcm9tICcuLi9tb2RlbHMvY29uZGl0aW9udHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gJy4uL2NvbmRpdGlvbic7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50VmFsdWVzIH0gZnJvbSAnLi4vZGF0YWVsZW1lbnR2YWx1ZXMnO1xyXG5leHBvcnQgY2xhc3MgRXF1YWxDb25kaXRpb24gaW1wbGVtZW50cyBDb25kaXRpb24ge1xyXG4gIElzUmVsZXZhbnQ6IGJvb2xlYW47XHJcblxyXG4gIGNvbmRpdGlvblR5cGU6IENvbmRpdGlvblR5cGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbmRpdGlvblR5cGU6IENvbmRpdGlvblR5cGUpIHtcclxuICAgIHRoaXMuY29uZGl0aW9uVHlwZSA9IGNvbmRpdGlvblR5cGU7XHJcbiAgfVxyXG5cclxuICBldmFsdWF0ZShkYXRhRWxlbWVudFZhbHVlczogRGF0YUVsZW1lbnRWYWx1ZXMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHZhbHVlID0gZGF0YUVsZW1lbnRWYWx1ZXMuZ2V0KHRoaXMuY29uZGl0aW9uVHlwZS5kYXRhRWxlbWVudElkKTtcclxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZS50b1VwcGVyQ2FzZSgpID09PSB0aGlzLmNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlLnRvVXBwZXJDYXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgRGF0YUVsZW1lbnRJZEF0dHJpYnV0ZSB9IGZyb20gJy4vZGF0YWVsZW1lbnRpZGF0dHJpYnV0ZS5tb2RlbCc7XHJcblxyXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uVHlwZSB7XHJcbiAgZGF0YUVsZW1lbnRJZDogc3RyaW5nO1xyXG4gIGNvbXBhcmlzb25WYWx1ZTogYW55OyAgXHJcbn1cclxuIiwiaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSAnLi4vY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uVHlwZSB9IGZyb20gJy4uL21vZGVscy9jb25kaXRpb250eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgRGF0YUVsZW1lbnRWYWx1ZXMgfSBmcm9tICcuLi9kYXRhZWxlbWVudHZhbHVlcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgR3JlYXRlclRoYW5Db25kaXRpb24gaW1wbGVtZW50cyBDb25kaXRpb24ge1xyXG4gIGNvbmRpdGlvblR5cGU6IENvbmRpdGlvblR5cGU7XHJcbiAgSXNSZWxldmFudDogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoY29uZGl0aW9uVHlwZTogQ29uZGl0aW9uVHlwZSkge1xyXG4gICAgdGhpcy5jb25kaXRpb25UeXBlID0gY29uZGl0aW9uVHlwZTsgICAgXHJcbiAgfVxyXG5cclxuICBldmFsdWF0ZShkYXRhRWxlbWVudFZhbHVlczogRGF0YUVsZW1lbnRWYWx1ZXMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHZhbHVlID0gK2RhdGFFbGVtZW50VmFsdWVzLmdldCh0aGlzLmNvbmRpdGlvblR5cGUuZGF0YUVsZW1lbnRJZCkgYXMgbnVtYmVyO1xyXG4gICAgbGV0IGNvbXBhcmlzb25WYWx1ZSA9ICAtMTtcclxuICAgIGlmIChpc05hTih0aGlzLmNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlKSkgIHtcclxuICAgICAgY29tcGFyaXNvblZhbHVlID0gKyBkYXRhRWxlbWVudFZhbHVlcy5nZXQodGhpcy5jb25kaXRpb25UeXBlLmNvbXBhcmlzb25WYWx1ZSkgYXMgbnVtYmVyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29tcGFyaXNvblZhbHVlID0gICsgdGhpcy5jb25kaXRpb25UeXBlLmNvbXBhcmlzb25WYWx1ZSBhcyBudW1iZXI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWUgPiBjb21wYXJpc29uVmFsdWU7XHJcbiAgfVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tICcuLi9jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBDb25kaXRpb25UeXBlIH0gZnJvbSAnLi4vbW9kZWxzL2NvbmRpdGlvbnR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBEYXRhRWxlbWVudFZhbHVlcyB9IGZyb20gJy4uL2RhdGFlbGVtZW50dmFsdWVzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBMZXNzVGhhbkNvbmRpdGlvbiBpbXBsZW1lbnRzIENvbmRpdGlvbiB7XHJcbiAgY29uZGl0aW9uVHlwZTogQ29uZGl0aW9uVHlwZTtcclxuICBJc1JlbGV2YW50OiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb25kaXRpb25UeXBlOiBDb25kaXRpb25UeXBlKSB7XHJcbiAgICB0aGlzLmNvbmRpdGlvblR5cGUgPSBjb25kaXRpb25UeXBlO1xyXG4gIH1cclxuICBldmFsdWF0ZShkYXRhRWxlbWVudFZhbHVlczogRGF0YUVsZW1lbnRWYWx1ZXMpOiBib29sZWFuIHtcclxuXHJcblxyXG4gICAgY29uc3QgdmFsdWUgPSArZGF0YUVsZW1lbnRWYWx1ZXMuZ2V0KHRoaXMuY29uZGl0aW9uVHlwZS5kYXRhRWxlbWVudElkKSBhcyBudW1iZXI7XHJcbiAgICBsZXQgY29tcGFyaXNvblZhbHVlID0gIC0xO1xyXG4gICAgaWYgKGlzTmFOKHRoaXMuY29uZGl0aW9uVHlwZS5jb21wYXJpc29uVmFsdWUpKSAge1xyXG4gICAgICBjb21wYXJpc29uVmFsdWUgPSArIGRhdGFFbGVtZW50VmFsdWVzLmdldCh0aGlzLmNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlKSBhcyBudW1iZXI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb21wYXJpc29uVmFsdWUgPSAgKyB0aGlzLmNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlIGFzIG51bWJlcjtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZSA8IGNvbXBhcmlzb25WYWx1ZTtcclxuICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gJy4uL2NvbmRpdGlvbic7XHJcbmltcG9ydCB7IENvbmRpdGlvblR5cGUgfSBmcm9tICcuLi9tb2RlbHMvY29uZGl0aW9udHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50VmFsdWVzIH0gZnJvbSAnLi4vZGF0YWVsZW1lbnR2YWx1ZXMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdyZWF0ZXJUaGFuT3JFcXVhbHNDb25kaXRpb24gaW1wbGVtZW50cyBDb25kaXRpb24ge1xyXG4gIGNvbmRpdGlvblR5cGU6IENvbmRpdGlvblR5cGU7XHJcbiAgSXNSZWxldmFudDogYm9vbGVhbjtcclxuXHJcbiAgY29uc3RydWN0b3IoY29uZGl0aW9uVHlwZTogQ29uZGl0aW9uVHlwZSkge1xyXG4gICAgdGhpcy5jb25kaXRpb25UeXBlID0gY29uZGl0aW9uVHlwZTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlKGRhdGFFbGVtZW50VmFsdWVzOiBEYXRhRWxlbWVudFZhbHVlcyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdmFsdWUgPSArZGF0YUVsZW1lbnRWYWx1ZXMuZ2V0KHRoaXMuY29uZGl0aW9uVHlwZS5kYXRhRWxlbWVudElkKSBhcyBudW1iZXI7XHJcbiAgICBsZXQgY29tcGFyaXNvblZhbHVlID0gIC0xO1xyXG4gICAgaWYgKGlzTmFOKHRoaXMuY29uZGl0aW9uVHlwZS5jb21wYXJpc29uVmFsdWUpKSAge1xyXG4gICAgICBjb21wYXJpc29uVmFsdWUgPSArIGRhdGFFbGVtZW50VmFsdWVzLmdldCh0aGlzLmNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlKSBhcyBudW1iZXI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb21wYXJpc29uVmFsdWUgPSAgKyB0aGlzLmNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlIGFzIG51bWJlcjtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZSA+PSBjb21wYXJpc29uVmFsdWU7XHJcbiAgfVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tICcuLi9jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBDb25kaXRpb25UeXBlIH0gZnJvbSAnLi4vbW9kZWxzL2NvbmRpdGlvbnR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBEYXRhRWxlbWVudFZhbHVlcyB9IGZyb20gJy4uL2RhdGFlbGVtZW50dmFsdWVzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uIGltcGxlbWVudHMgQ29uZGl0aW9uIHtcclxuICBjb25kaXRpb25UeXBlOiBDb25kaXRpb25UeXBlO1xyXG4gIElzUmVsZXZhbnQ6IGJvb2xlYW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbmRpdGlvblR5cGU6IENvbmRpdGlvblR5cGUpIHtcclxuICAgIHRoaXMuY29uZGl0aW9uVHlwZSA9IGNvbmRpdGlvblR5cGU7XHJcbiAgfVxyXG4gIGV2YWx1YXRlKGRhdGFFbGVtZW50VmFsdWVzOiBEYXRhRWxlbWVudFZhbHVlcyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgdmFsdWUgPSArZGF0YUVsZW1lbnRWYWx1ZXMuZ2V0KHRoaXMuY29uZGl0aW9uVHlwZS5kYXRhRWxlbWVudElkKSBhcyBudW1iZXI7XHJcbiAgICBsZXQgY29tcGFyaXNvblZhbHVlID0gIC0xO1xyXG4gICAgaWYgKGlzTmFOKHRoaXMuY29uZGl0aW9uVHlwZS5jb21wYXJpc29uVmFsdWUpKSAge1xyXG4gICAgICBjb21wYXJpc29uVmFsdWUgPSArIGRhdGFFbGVtZW50VmFsdWVzLmdldCh0aGlzLmNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlKSBhcyBudW1iZXI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb21wYXJpc29uVmFsdWUgPSAgKyB0aGlzLmNvbmRpdGlvblR5cGUuY29tcGFyaXNvblZhbHVlIGFzIG51bWJlcjtcclxuICAgIH1cclxuICAgICByZXR1cm4gdmFsdWUgPD0gY29tcGFyaXNvblZhbHVlO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSAnLi4vY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uVHlwZSB9IGZyb20gJy4uL21vZGVscy9jb25kaXRpb250eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgRGF0YUVsZW1lbnRWYWx1ZXMgfSBmcm9tICcuLi9kYXRhZWxlbWVudHZhbHVlcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgQ29udGFpbnNDb25kaXRpb24gaW1wbGVtZW50cyBDb25kaXRpb24ge1xyXG4gIGNvbmRpdGlvblR5cGU6IENvbmRpdGlvblR5cGU7XHJcbiAgSXNSZWxldmFudDogYm9vbGVhbjtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25kaXRpb25UeXBlOiBDb25kaXRpb25UeXBlKSB7XHJcbiAgICAgIHRoaXMuY29uZGl0aW9uVHlwZSA9IGNvbmRpdGlvblR5cGU7XHJcbiAgICB9XHJcblxyXG4gICBldmFsdWF0ZShkYXRhRWxlbWVudFZhbHVlczogRGF0YUVsZW1lbnRWYWx1ZXMpOiBib29sZWFuIHtcclxuICAgIGxldCByZXR1cm5WYWx1ZSA9IGZhbHNlO1xyXG4gICAgY29uc3QgdmFsdWUgPSBkYXRhRWxlbWVudFZhbHVlcy5nZXQodGhpcy5jb25kaXRpb25UeXBlLmRhdGFFbGVtZW50SWQpO1xyXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZm9yIChsZXQgY291bnRlciA9IDAgOyAgY291bnRlciA8IHZhbHVlLmxlbmd0aCA7ICBjb3VudGVyKyspIHtcclxuICAgICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZVtjb3VudGVyXTtcclxuICAgICAgICBpZiAodmFsdWUxLnRvVXBwZXJDYXNlKCkgPT09IHRoaXMuY29uZGl0aW9uVHlwZS5jb21wYXJpc29uVmFsdWUudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgcmV0dXJuVmFsdWUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb25kaXRpb25UeXBlIH0gZnJvbSAnLi4vbW9kZWxzL2NvbmRpdGlvbnR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBDb21wb3NpdGVDb25kaXRpb24gfSBmcm9tICcuLi9jb21wb3NpdGUtY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSAnLi4vY29uZGl0aW9uJztcclxuaW1wb3J0IHsgRGF0YUVsZW1lbnRWYWx1ZXMgfSBmcm9tICcuLi9kYXRhZWxlbWVudHZhbHVlcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgQW5kQ29uZGl0aW9uIGltcGxlbWVudHMgQ29tcG9zaXRlQ29uZGl0aW9uIHtcclxuICBjb25kaXRpb25zOiBhbnkgPSBbXTtcclxuICBJc1JlbGV2YW50OiBib29sZWFuO1xyXG5cclxuICAgY29uZGl0aW9uVHlwZTogc3RyaW5nO1xyXG4gICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICB0aGlzLmNvbmRpdGlvblR5cGUgPSAgJ0FuZENvbmRpdGlvbic7XHJcbiAgIH1cclxuXHJcbiAgZXZhbHVhdGUoZGF0YUVsZW1lbnRWYWx1ZXM6IERhdGFFbGVtZW50VmFsdWVzKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSB0cnVlO1xyXG4gICAgZm9yIChsZXQgY29uZGl0aW9uQ291bnRlciA9IDAgOyAgY29uZGl0aW9uQ291bnRlciA8IHRoaXMuY29uZGl0aW9ucy5sZW5ndGggOyAgY29uZGl0aW9uQ291bnRlcisrKSB7XHJcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uc1tjb25kaXRpb25Db3VudGVyXTtcclxuICAgICAgY29uc3QgZXhlY3V0ZWRDb25kaXRpb24gPSBjb25kaXRpb24uZXZhbHVhdGUoZGF0YUVsZW1lbnRWYWx1ZXMpO1xyXG4gICAgICByZXR1cm5WYWx1ZSA9ICghZXhlY3V0ZWRDb25kaXRpb24pID8gZmFsc2UgOiAgKHJldHVyblZhbHVlICYmIGV4ZWN1dGVkQ29uZGl0aW9uKTtcclxuICAgICAgaWYgKCFyZXR1cm5WYWx1ZSkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29uZGl0aW9uVHlwZSB9IGZyb20gJy4uL21vZGVscy9jb25kaXRpb250eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgQ29tcG9zaXRlQ29uZGl0aW9uIH0gZnJvbSAnLi4vY29tcG9zaXRlLWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gJy4uL2NvbmRpdGlvbic7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50VmFsdWVzIH0gZnJvbSAnLi4vZGF0YWVsZW1lbnR2YWx1ZXMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIE9yQ29uZGl0aW9uIGltcGxlbWVudHMgQ29tcG9zaXRlQ29uZGl0aW9uIHtcclxuICBjb25kaXRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIElzUmVsZXZhbnQ6IGJvb2xlYW47XHJcblxyXG4gIGNvbmRpdGlvblR5cGU6IHN0cmluZztcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuY29uZGl0aW9uVHlwZSA9ICAnT3JDb25kaXRpb24nO1xyXG4gIH1cclxuXHJcblxyXG4gIGV2YWx1YXRlKGRhdGFFbGVtZW50VmFsdWVzOiBEYXRhRWxlbWVudFZhbHVlcyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGxldCByZXR1cm5WYWx1ZSA9IGZhbHNlO1xyXG4gICAgZm9yIChsZXQgY29uZGl0aW9uQ291bnRlciA9IDAgOyAgY29uZGl0aW9uQ291bnRlciA8IHRoaXMuY29uZGl0aW9ucy5sZW5ndGggOyAgY29uZGl0aW9uQ291bnRlcisrKSB7XHJcbiAgICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uc1tjb25kaXRpb25Db3VudGVyXTtcclxuXHJcbiAgICAgICAgIGNvbnN0IGV4ZWN1dGVkQ29uZGl0aW9uID0gY29uZGl0aW9uLmV2YWx1YXRlKGRhdGFFbGVtZW50VmFsdWVzKTtcclxuICAgICAgICAgcmV0dXJuVmFsdWUgPSAocmV0dXJuVmFsdWUgfHwgZXhlY3V0ZWRDb25kaXRpb24pO1xyXG4gICAgICAgICBpZiAocmV0dXJuVmFsdWUpIHtcclxuICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgfVxyXG5cclxuICAgIH1cclxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9zaXRlQ29uZGl0aW9uIH0gZnJvbSAnLi4vY29tcG9zaXRlLWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50VmFsdWVzIH0gZnJvbSAnLi4vZGF0YWVsZW1lbnR2YWx1ZXMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIE5vdENvbmRpdGlvbiBpbXBsZW1lbnRzIENvbXBvc2l0ZUNvbmRpdGlvbiB7XHJcbiAgY29uZGl0aW9uczogYW55ID0gW107XHJcbiAgSXNSZWxldmFudDogYm9vbGVhbjtcclxuICBcclxuICBjb25kaXRpb25UeXBlOiBzdHJpbmc7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLmNvbmRpdGlvblR5cGUgPSAgJ05vdENvbmRpdGlvbic7XHJcbiAgfVxyXG5cclxuICBldmFsdWF0ZShkYXRhRWxlbWVudFZhbHVlczogRGF0YUVsZW1lbnRWYWx1ZXMpOiBib29sZWFuIHtcclxuICAgIGNvbnN0ICByZXN1bHRzID0gbmV3IEFycmF5PGJvb2xlYW4+KCk7XHJcbiAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiB0aGlzLmNvbmRpdGlvbnMpIHtcclxuICAgICAgcmVzdWx0cy5wdXNoKGNvbmRpdGlvbi5ldmFsdWF0ZShkYXRhRWxlbWVudFZhbHVlcykpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICEocmVzdWx0c1swXSk7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBFcXVhbENvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvZXF1YWwtY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uVHlwZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2NvbmRpdGlvbnR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBHcmVhdGVyVGhhbkNvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvZ3JlYXRlci10aGFuLWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IExlc3NUaGFuQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9sZXNzLXRoYW4tY29uZGl0aW9uJztcclxuaW1wb3J0IHsgR3JlYXRlclRoYW5PckVxdWFsc0NvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvZ3JlYXRlci10aGFuLW9yLWVxdWFscy1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9sZXNzLXRoYW4tb3ItZXF1YWxzLWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IENvbnRhaW5zQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9jb250YWlucy1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBDb21wb3NpdGVDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL2NvbXBvc2l0ZS1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBBbmRDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL3J1bGVzL2FuZC1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBPckNvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcnVsZXMvb3ItY29uZGl0aW9uJztcclxuaW1wb3J0IHsgQXJyYXlDaGVja2VyU2VydmljZSB9IGZyb20gJy4vYXJyYXktY2hlY2tlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTm90Q29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9ub3QtY29uZGl0aW9uJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2Uge1xyXG5cclxuXHJcblxyXG4gICBjb25zdHJ1Y3Rvcihwcml2YXRlICBhcnJheUNoZWNrZXJTZXJ2aWNlOiBBcnJheUNoZWNrZXJTZXJ2aWNlKSB7IH1cclxuXHJcbiAgICBwcml2YXRlIHJldHVybkNvbmRpdGlvblR5cGUoY29uZGl0aW9uSlNPTjogYW55KTogQ29uZGl0aW9uVHlwZSB7XHJcbiAgICAgIGNvbnN0IGNvbmRpdGlvblR5cGUgPSBuZXcgQ29uZGl0aW9uVHlwZSgpO1xyXG4gICAgICBjb25kaXRpb25UeXBlLmNvbXBhcmlzb25WYWx1ZSA9IGNvbmRpdGlvbkpTT04uQXR0ci5Db21wYXJpc29uVmFsdWU7XHJcbiAgICAgIGNvbmRpdGlvblR5cGUuZGF0YUVsZW1lbnRJZCA9IGNvbmRpdGlvbkpTT04uQXR0ci5EYXRhRWxlbWVudElkO1xyXG4gICAgICByZXR1cm4gY29uZGl0aW9uVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5Db25kaXRpb24oYnJhbmNoSlNPTjogYW55KTogQ29uZGl0aW9uIHtcclxuICAgICAgICBsZXQgY29uZGl0aW9uOiBDb25kaXRpb247XHJcbiAgICAgICAgaWYgKGJyYW5jaEpTT04uaGFzT3duUHJvcGVydHkoJ0VxdWFsQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uID0gbmV3IEVxdWFsQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShicmFuY2hKU09OLkVxdWFsQ29uZGl0aW9uKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChicmFuY2hKU09OLmhhc093blByb3BlcnR5KCdHcmVhdGVyVGhhbkNvbmRpdGlvbicpKSB7XHJcbiAgICAgICAgICBjb25kaXRpb24gPSBuZXcgR3JlYXRlclRoYW5Db25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGJyYW5jaEpTT04uR3JlYXRlclRoYW5Db25kaXRpb24pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJyYW5jaEpTT04uaGFzT3duUHJvcGVydHkoJ0xlc3NUaGFuQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBMZXNzVGhhbkNvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoYnJhbmNoSlNPTi5MZXNzVGhhbkNvbmRpdGlvbikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYnJhbmNoSlNPTi5oYXNPd25Qcm9wZXJ0eSgnR3JlYXRlclRoYW5PckVxdWFsc0NvbmRpdGlvbicpKSB7XHJcbiAgICAgICAgICBjb25kaXRpb24gPSBuZXcgR3JlYXRlclRoYW5PckVxdWFsc0NvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoYnJhbmNoSlNPTi5HcmVhdGVyVGhhbk9yRXF1YWxzQ29uZGl0aW9uKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChicmFuY2hKU09OLmhhc093blByb3BlcnR5KCdMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShicmFuY2hKU09OLkxlc3NUaGFuT3JFcXVhbHNDb25kaXRpb24pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJyYW5jaEpTT04uaGFzT3duUHJvcGVydHkoJ0NvbnRhaW5zQ29uZGl0aW9uJykpIHtcclxuICAgICAgICAgIGNvbmRpdGlvbiA9IG5ldyBDb250YWluc0NvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoYnJhbmNoSlNPTi5Db250YWluc0NvbmRpdGlvbikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgKGNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgLy8gICBjb25kaXRpb24uSXNSZWxldmFudCA9IGJyYW5jaEpTT04uSXNSZWxldmFudCAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgID8gYnJhbmNoSlNPTi5Jc1JlbGV2YW50IDogZmFsc2U7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGNvbmRpdGlvbi5Jc1JlbGV2YW50ID0gYnJhbmNoSlNPTi5Jc1JlbGV2YW50ICE9PSB1bmRlZmluZWRcclxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJyYW5jaEpTT04uSXNSZWxldmFudCA6IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGNvbmRpdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAgaXNDb21wb3NpdGUoY29tcG9zaXRlRWxlbWVudEpTT04pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0FuZENvbmRpdGlvbicpIHx8XHJcbiAgICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ09yQ29uZGl0aW9uJykgfHxcclxuICAgICAgICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnTm90Q29uZGl0aW9uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXR1cm5Db25kaXRpb25Gcm9tSlNPTihjb25kaXRpb25JZGVudGlmaWVyOiBzdHJpbmcgLCBjb25kaXRpb25KU09OOiBhbnkpOiBDb25kaXRpb24ge1xyXG4gICAgICBsZXQgY29uZGl0aW9uOiBDb25kaXRpb247XHJcbiAgICAgIGlmIChjb25kaXRpb25JZGVudGlmaWVyID09PSAnRXF1YWxDb25kaXRpb24nKSB7XHJcbiAgICAgICAgICBjb25kaXRpb24gPSBuZXcgRXF1YWxDb25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGNvbmRpdGlvbkpTT04pKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29uZGl0aW9uSWRlbnRpZmllciA9PT0gJ0dyZWF0ZXJUaGFuQ29uZGl0aW9uJykge1xyXG4gICAgICAgIGNvbmRpdGlvbiA9IG5ldyBHcmVhdGVyVGhhbkNvbmRpdGlvbih0aGlzLnJldHVybkNvbmRpdGlvblR5cGUoY29uZGl0aW9uSlNPTikpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb25kaXRpb25JZGVudGlmaWVyID09PSAnTGVzc1RoYW5Db25kaXRpb24nKSB7XHJcbiAgICAgICAgY29uZGl0aW9uID0gbmV3IExlc3NUaGFuQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShjb25kaXRpb25KU09OKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbmRpdGlvbklkZW50aWZpZXIgPT09ICdHcmVhdGVyVGhhbk9yRXF1YWxzQ29uZGl0aW9uJykge1xyXG4gICAgICAgIGNvbmRpdGlvbiA9IG5ldyBHcmVhdGVyVGhhbk9yRXF1YWxzQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShjb25kaXRpb25KU09OKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbmRpdGlvbklkZW50aWZpZXIgPT09ICdMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uJykge1xyXG4gICAgICAgIGNvbmRpdGlvbiA9IG5ldyBMZXNzVGhhbk9yRXF1YWxzQ29uZGl0aW9uKHRoaXMucmV0dXJuQ29uZGl0aW9uVHlwZShjb25kaXRpb25KU09OKSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbmRpdGlvbklkZW50aWZpZXIgPT09ICdDb250YWluc0NvbmRpdGlvbicpIHtcclxuICAgICAgICBjb25kaXRpb24gPSBuZXcgQ29udGFpbnNDb25kaXRpb24odGhpcy5yZXR1cm5Db25kaXRpb25UeXBlKGNvbmRpdGlvbkpTT04pKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY29uZGl0aW9uO1xyXG4gIH1cclxuXHJcbiAgICBwcml2YXRlICByZXR1cm5Db25kaXRpb25zKGNvbmRpdGlvbnNKU09OOiBKU09OKTogQ29uZGl0aW9uW10ge1xyXG4gICAgICAgICBsZXQgY29uZGl0aW9uczogQ29uZGl0aW9uW107XHJcbiAgICAgICAgY29uc3QgY29uZGl0aW9uSWRlbnRpZmllcnMgPSBbJ0VxdWFsQ29uZGl0aW9uJywgJ0dyZWF0ZXJUaGFuQ29uZGl0aW9uJywgJ0xlc3NUaGFuQ29uZGl0aW9uJyxcclxuICAgICAgICAgICAgJ0dyZWF0ZXJUaGFuT3JFcXVhbHNDb25kaXRpb24nLCAnTGVzc1RoYW5PckVxdWFsc0NvbmRpdGlvbicsICdDb250YWluc0NvbmRpdGlvbiddO1xyXG4gICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uSWRlbnRpZmllciBvZiBjb25kaXRpb25JZGVudGlmaWVycykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkpTT04gPSBjb25kaXRpb25zSlNPTltjb25kaXRpb25JZGVudGlmaWVyXTtcclxuICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uSlNPTiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25kaXRpb25zID0gbmV3IEFycmF5PENvbmRpdGlvbj4oKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShjb25kaXRpb25KU09OKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBqc29uVmFsdWUgb2YgY29uZGl0aW9uSlNPTikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zLnB1c2godGhpcy5yZXR1cm5Db25kaXRpb25Gcm9tSlNPTihjb25kaXRpb25JZGVudGlmaWVyLCBqc29uVmFsdWUpKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMucHVzaCh0aGlzLnJldHVybkNvbmRpdGlvbkZyb21KU09OKGNvbmRpdGlvbklkZW50aWZpZXIsIGNvbmRpdGlvbkpTT04pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb25kaXRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGlzSHlicmlkKGNvbXBvc2l0ZUVsZW1lbnRKU09OKTogYm9vbGVhbiB7XHJcbiAgICAgIGNvbnN0IGNvbXBvc2l0ZUV4aXN0cyA9ICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnQW5kQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ09yQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ05vdENvbmRpdGlvbicpO1xyXG5cclxuICAgICAgY29uc3QgcHJpbWl0aXZlRXhpc3RzID0gY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0VxdWFsQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0dyZWF0ZXJUaGFuQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0xlc3NUaGFuQ29uZGl0aW9uJykgfHxcclxuICAgICAgY29tcG9zaXRlRWxlbWVudEpTT04uaGFzT3duUHJvcGVydHkoJ0dyZWF0ZXJUaGFuT3JFcXVhbHNDb25kaXRpb24nKSB8fFxyXG4gICAgICBjb21wb3NpdGVFbGVtZW50SlNPTi5oYXNPd25Qcm9wZXJ0eSgnTGVzc1RoYW5PckVxdWFsc0NvbmRpdGlvbicpIHx8XHJcbiAgICAgIGNvbXBvc2l0ZUVsZW1lbnRKU09OLmhhc093blByb3BlcnR5KCdDb250YWluc0NvbmRpdGlvbicpO1xyXG4gICAgICByZXR1cm4gIGNvbXBvc2l0ZUV4aXN0cyAmJiBwcmltaXRpdmVFeGlzdHM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHJldHVybkNvbXBvc2l0ZUNvbmRpdGlvbihkYXRhOiBhbnkpOiBDb21wb3NpdGVDb25kaXRpb24ge1xyXG4gICAgICBpZiAoIXRoaXMuaXNDb21wb3NpdGUoZGF0YSkpICB7XHJcbiAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZGl0aW9uSlNPTjogYW55O1xyXG4gICAgICBsZXQgY29tcG9zaXRlQ29uZGl0aW9uOiBDb21wb3NpdGVDb25kaXRpb247XHJcblxyXG4gICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eSgnQW5kQ29uZGl0aW9uJykgKSB7XHJcbiAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb25KU09OID0gZGF0YS5BbmRDb25kaXRpb247XHJcbiAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24gPSBuZXcgQW5kQ29uZGl0aW9uKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eSgnT3JDb25kaXRpb24nKSkge1xyXG4gICAgICAgICBjb21wb3NpdGVDb25kaXRpb25KU09OID0gZGF0YS5PckNvbmRpdGlvbjtcclxuICAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uID0gbmV3IE9yQ29uZGl0aW9uKCk7XHJcbiAgICAgICB9IGVsc2UgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoJ05vdENvbmRpdGlvbicpKSB7XHJcbiAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uSlNPTiA9IGRhdGEuTm90Q29uZGl0aW9uO1xyXG4gICAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbiA9IG5ldyBOb3RDb25kaXRpb24oKTtcclxuICAgICB9XHJcbi8vIGlmIChkYXRhLmhhc093blByb3BlcnR5KCdJc1JlbGV2YW50Jykpe1xyXG4vLyAgIGNvbXBvc2l0ZUNvbmRpdGlvbkpTT04gKz0gZGF0YS5Jc1JlbGV2YW50O1xyXG4vLyB9XHJcblxyXG4gICAgICBpZiAoIXRoaXMuaXNDb21wb3NpdGUoY29tcG9zaXRlQ29uZGl0aW9uSlNPTikpIHtcclxuICAgICAgICAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uLmNvbmRpdGlvbnMgPSB0aGlzLnJldHVybkNvbmRpdGlvbnMoY29tcG9zaXRlQ29uZGl0aW9uSlNPTik7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0h5YnJpZChjb21wb3NpdGVDb25kaXRpb25KU09OKSkge1xyXG4gICAgICAgICAgIGNvbnN0IGpzb25LZXlzID0gT2JqZWN0LmtleXMoY29tcG9zaXRlQ29uZGl0aW9uSlNPTik7XHJcbiAgICAgICAgIGZvciAoY29uc3QganNvbktleSBvZiBqc29uS2V5cykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGpzb25WYWx1ZSA9ICBjb21wb3NpdGVDb25kaXRpb25KU09OW2pzb25LZXldO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSAgJ3tcIicgKyBqc29uS2V5ICArICdcIjonICsgSlNPTi5zdHJpbmdpZnkoanNvblZhbHVlKSArICd9JyA7XHJcbiAgICAgICAgICAgICAgY29uc3QganNvbk9iamVjdCA9IEpTT04ucGFyc2UoanNvblN0cmluZyk7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb3NpdGUoanNvbk9iamVjdCkpIHtcclxuICAgICAgICAgICAgICAgICB0aGlzLnJldHVybklubmVyQ29uZGl0aW9ucyhqc29uT2JqZWN0LCBjb21wb3NpdGVDb25kaXRpb24pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShqc29uVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFycmF5VmFsdWUgb2YgIGpzb25WYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24uY29uZGl0aW9ucy5wdXNoKHRoaXMucmV0dXJuQ29uZGl0aW9uRnJvbUpTT04oanNvbktleSwgYXJyYXlWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24uY29uZGl0aW9ucy5wdXNoKHRoaXMucmV0dXJuQ29uZGl0aW9uRnJvbUpTT04oanNvbktleSwganNvblZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgIHRoaXMucmV0dXJuSW5uZXJDb25kaXRpb25zKGNvbXBvc2l0ZUNvbmRpdGlvbkpTT04sIGNvbXBvc2l0ZUNvbmRpdGlvbik7XHJcbiAgICAgIH1cclxuICAgICByZXR1cm4gY29tcG9zaXRlQ29uZGl0aW9uO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICByZXR1cm5Db21wb3NpdGVDb25kaXRpb25Gcm9tTmFtZShlbGVtZW50TmFtZTogc3RyaW5nKTogQ29tcG9zaXRlQ29uZGl0aW9uIHtcclxuICAgICAgbGV0IGNvbXBvc2l0ZUNvbmRpdGlvbjogQ29tcG9zaXRlQ29uZGl0aW9uO1xyXG4gICAgICBzd2l0Y2ggKGVsZW1lbnROYW1lKSB7XHJcbiAgICAgICAgICBjYXNlICAnQW5kQ29uZGl0aW9uJzpcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICBjb21wb3NpdGVDb25kaXRpb24gPSBuZXcgQW5kQ29uZGl0aW9uKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgICdPckNvbmRpdGlvbic6XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgY29tcG9zaXRlQ29uZGl0aW9uID0gbmV3IE9yQ29uZGl0aW9uKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgJ05vdENvbmRpdGlvbicgOlxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbiA9IG5ldyBOb3RDb25kaXRpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUNvbmRpdGlvbjtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgIGFkZENvbmRpdGlvbnNUb0lubmVyQ29uZGl0aW9ucyhrZXk6IGFueSAsIHZhbHVlOiBhbnksIGNvbXBvc2l0ZUNvbmRpdGlvbjogQ29tcG9zaXRlQ29uZGl0aW9uKSB7XHJcblxyXG4gICAgICBjb25zdCBjb25kaXRpb24gPSB0aGlzLnJldHVybkNvbXBvc2l0ZUNvbmRpdGlvbkZyb21OYW1lKGtleSk7XHJcbiAgICAgIGNvbXBvc2l0ZUNvbmRpdGlvbi5jb25kaXRpb25zLnB1c2goY29uZGl0aW9uKTtcclxuICAgICAgaWYgKHRoaXMuaXNIeWJyaWQodmFsdWUpKSB7XHJcbiAgICAgICAgIGNvbnN0IGpzb25LZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xyXG4gICAgICAgIGZvciAoY29uc3QganNvbktleSBvZiBqc29uS2V5cykge1xyXG4gICAgICAgICAgICAgY29uc3QganNvblZhbHVlID0gIHZhbHVlW2pzb25LZXldO1xyXG4gICAgICAgICAgICAgY29uc3QganNvblN0cmluZyA9ICAne1wiJyArIGpzb25LZXkgICsgJ1wiOicgKyBKU09OLnN0cmluZ2lmeShqc29uVmFsdWUpICsgJ30nIDtcclxuICAgICAgICAgICAgIGNvbnN0IGpzb25PYmplY3QgPSBKU09OLnBhcnNlKGpzb25TdHJpbmcpO1xyXG4gICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb3NpdGUoanNvbk9iamVjdCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuSW5uZXJDb25kaXRpb25zKGpzb25PYmplY3QsIGNvbmRpdGlvbik7XHJcbiAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShqc29uVmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXJyYXlWYWx1ZSBvZiAganNvblZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24uY29uZGl0aW9ucy5wdXNoKHRoaXMucmV0dXJuQ29uZGl0aW9uRnJvbUpTT04oanNvbktleSwgYXJyYXlWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbi5jb25kaXRpb25zLnB1c2godGhpcy5yZXR1cm5Db25kaXRpb25Gcm9tSlNPTihqc29uS2V5LCBqc29uVmFsdWUpKTtcclxuICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9IGVsc2UgIGlmICh0aGlzLmlzQ29tcG9zaXRlKHZhbHVlKSkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCAnaXNDb21wb3NpdGUnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbmRpdGlvbi5jb25kaXRpb25zID0gdGhpcy5yZXR1cm5Db25kaXRpb25zKHZhbHVlKTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJldHVybklubmVyQ29uZGl0aW9ucyhpbm5lckNvbmRpdGlvbnNKU09OOiBhbnksIGNvbXBvc2l0ZUNvbmRpdGlvbjogQ29tcG9zaXRlQ29uZGl0aW9uKSB7XHJcbiAgICAgICAgY29uc3QganNvbktleXMgPSBPYmplY3Qua2V5cyhpbm5lckNvbmRpdGlvbnNKU09OKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBqc29uS2V5cyApIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gaW5uZXJDb25kaXRpb25zSlNPTltrZXldO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5hcnJheUNoZWNrZXJTZXJ2aWNlLmlzQXJyYXkodmFsdWVzKSkge1xyXG4gICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xyXG4gICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDb25kaXRpb25zVG9Jbm5lckNvbmRpdGlvbnMoa2V5LCB2YWx1ZSwgY29tcG9zaXRlQ29uZGl0aW9uKTtcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDb25kaXRpb25zVG9Jbm5lckNvbmRpdGlvbnMoa2V5LCBpbm5lckNvbmRpdGlvbnNKU09OW2tleV0sIGNvbXBvc2l0ZUNvbmRpdGlvbik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuIiwiaW1wb3J0IHtDb21wdXRlZFZhbHVlfSBmcm9tICcuL2NvbXB1dGVkLXZhbHVlLm1vZGVsJztcclxuZXhwb3J0IGNsYXNzIFRleHRFeHByZXNzaW9uIGltcGxlbWVudHMgQ29tcHV0ZWRWYWx1ZSB7XHJcblxyXG4gIGV4cHJlc3Npb25UZXh0OiBzdHJpbmc7XHJcblxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVGV4dEV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy90ZXh0LWV4cHJlc3Npb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBDb21wdXRlZFZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvY29tcHV0ZWQtdmFsdWUubW9kZWwnO1xyXG5pbXBvcnQgeyBBcml0aG1ldGljRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2FyaXRobWV0aWMtZXhwcmVzc2lvbi5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgY3JlYXRlQ29tcHV0ZWRWYWx1ZShkYXRhQXNKU09OOiBhbnkpOiBDb21wdXRlZFZhbHVlIHtcclxuXHJcbiAgICAgICBpZiAoZGF0YUFzSlNPTlsnVGV4dEV4cHJlc3Npb24nXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgIGNvbnN0IGNvbXB1dGVkVmFsdWUgPSBuZXcgVGV4dEV4cHJlc3Npb24oKTtcclxuICAgICAgICAgIGNvbXB1dGVkVmFsdWUuZXhwcmVzc2lvblRleHQgPSBkYXRhQXNKU09OLlRleHRFeHByZXNzaW9uO1xyXG4gICAgICAgICAgcmV0dXJuIGNvbXB1dGVkVmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGRhdGFBc0pTT05bJ0FyaXRobWV0aWNFeHByZXNzaW9uJ10gIT09IHVuZGVmaW5lZCkgeyB7XHJcbiAgICAgICAgY29uc3QgY29tcHV0ZWRWYWx1ZSA9IG5ldyBBcml0aG1ldGljRXhwcmVzc2lvbigpO1xyXG4gICAgICAgIGNvbXB1dGVkVmFsdWUuZXhwcmVzc2lvblRleHQgPSBkYXRhQXNKU09OLkFyaXRobWV0aWNFeHByZXNzaW9uO1xyXG4gICAgICAgIHJldHVybiBjb21wdXRlZFZhbHVlO1xyXG4gICAgICB9XHJcbiAgfVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJ1bGVzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9tb2RlbHMvcnVsZXMubW9kZWwnO1xyXG5pbXBvcnQgeyBBcnJheUNoZWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9hcnJheS1jaGVja2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEZWNpc2lvblBvaW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvZGVjaXNpb25wb2ludC5tb2RlbCc7XHJcbmltcG9ydCB7IEJyYW5jaCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvL21vZGVscy9icmFuY2gubW9kZWwnO1xyXG5pbXBvcnQgeyBFbmRQb2ludFJlZiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2VuZHBvaW50cmVmLm1vZGVsJztcclxuaW1wb3J0IHsgRGF0YUVsZW1lbnRSZWYgfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9kYXRhZWxlbWVudHJlZi5tb2RlbCc7XHJcbmltcG9ydCB7IE5vdFJlbGV2YW50RGF0YUVsZW1lbnRzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvbm90cmVsZXZhbnRkYXRhZWxlbWVudHMubW9kZWwnO1xyXG5pbXBvcnQgeyBDb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9jb25kaXRpb25zLWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9jb21wdXRlZC12YWx1ZS1jcmVhdGlvbi5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIERlY2lzaW9uUG9pbnRzQ3JlYXRpb25TZXJ2aWNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhcnJheUNoZWNrZXJTZXJ2aWNlOiBBcnJheUNoZWNrZXJTZXJ2aWNlICxcclxuICAgIHByaXZhdGUgY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZTogQ29uZGl0aW9uc0NyZWF0aW9uU2VydmljZSxcclxuICBwcml2YXRlIGNvbXB1dGVkVmFsdWVDcmVhdGlvblNlcnZpY2U6IENvbXB1dGVkVmFsdWVDcmVhdGlvblNlcnZpY2UgKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVSZWxldmFudERhdGFFbGVtZW50UmVmZXJlbmNlcyhkYXRhRWxlbWVudFJlZkpTT04pOiBEYXRhRWxlbWVudFJlZiAgICAge1xyXG4gICAgICBjb25zdCBkYXRhRWxlbWVudFJlZiA9IG5ldyBEYXRhRWxlbWVudFJlZigpO1xyXG4gICAgICBkYXRhRWxlbWVudFJlZi5kYXRhRWxlbWVudElkID0gZGF0YUVsZW1lbnRSZWZKU09OLkF0dHIuRGF0YUVsZW1lbnRJZDtcclxuICAgICAgcmV0dXJuIGRhdGFFbGVtZW50UmVmO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgIHJldHVybkJyYW5jaChicmFuY2hKU09OKTogQnJhbmNoIHtcclxuICAgIGNvbnN0IGJyYW5jaCA9IG5ldyBCcmFuY2goKTtcclxuICAgIGJyYW5jaC5sYWJlbCA9IGJyYW5jaEpTT04uTGFiZWw7XHJcbiAgICBpZiAoYnJhbmNoSlNPTi5FbmRQb2ludFJlZikge1xyXG4gICAgICBicmFuY2guZW5kUG9pbnRSZWYgPSBuZXcgRW5kUG9pbnRSZWYoKTtcclxuICAgICAgYnJhbmNoLmVuZFBvaW50UmVmLmVuZFBvaW50SWQgPSBicmFuY2hKU09OLkVuZFBvaW50UmVmLkF0dHIuRW5kUG9pbnRJZDtcclxuICAgIH1cclxuICAgIGJyYW5jaC5jb25kaXRpb24gPSB0aGlzLmNvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UucmV0dXJuQ29uZGl0aW9uKGJyYW5jaEpTT04pO1xyXG4gICAgYnJhbmNoLmNvbXB1dGVkVmFsdWUgPSB0aGlzLmNvbXB1dGVkVmFsdWVDcmVhdGlvblNlcnZpY2UuY3JlYXRlQ29tcHV0ZWRWYWx1ZShicmFuY2hKU09OKTtcclxuICAgIGlmICh0aGlzLmNvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UuaXNDb21wb3NpdGUoYnJhbmNoSlNPTikpIHtcclxuICAgICAgICAgYnJhbmNoLmNvbXBvc2l0ZUNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZS5yZXR1cm5Db21wb3NpdGVDb25kaXRpb24oYnJhbmNoSlNPTik7XHJcbiAgICB9XHJcbiAgICBpZiAoYnJhbmNoSlNPTi5Ob3RSZWxldmFudERhdGFFbGVtZW50cykge1xyXG4gICAgICAgICAgIGNvbnN0IG5vdFJlbGV2YW50RGF0YUVsZW1lbnRzID0gbmV3IE5vdFJlbGV2YW50RGF0YUVsZW1lbnRzKCk7XHJcbiAgICAgICAgICBub3RSZWxldmFudERhdGFFbGVtZW50cy5kYXRhRWxlbWVudFJlZmVyZW5jZXMgPSBuZXcgQXJyYXk8RGF0YUVsZW1lbnRSZWY+KCk7XHJcbiAgICAgICAgICBjb25zdCBkYXRhRWxlbWVudFJlZnMgPSBicmFuY2hKU09OLk5vdFJlbGV2YW50RGF0YUVsZW1lbnRzLkRhdGFFbGVtZW50UmVmO1xyXG4gICAgICAgICAgaWYgKHRoaXMuYXJyYXlDaGVja2VyU2VydmljZS5pc0FycmF5KGRhdGFFbGVtZW50UmVmcykpIHtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRhdGFFbGVtZW50UmVmSlNPTiBvZiAgZGF0YUVsZW1lbnRSZWZzKSB7XHJcbiAgICAgICAgICAgICAgICBub3RSZWxldmFudERhdGFFbGVtZW50cy5kYXRhRWxlbWVudFJlZmVyZW5jZXMucHVzaCh0aGlzLmNyZWF0ZVJlbGV2YW50RGF0YUVsZW1lbnRSZWZlcmVuY2VzKGRhdGFFbGVtZW50UmVmSlNPTikpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG5vdFJlbGV2YW50RGF0YUVsZW1lbnRzLmRhdGFFbGVtZW50UmVmZXJlbmNlcy5wdXNoKHRoaXMuY3JlYXRlUmVsZXZhbnREYXRhRWxlbWVudFJlZmVyZW5jZXMoZGF0YUVsZW1lbnRSZWZzKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmFuY2gubm90UmVsZXZhbnREYXRhRWxlbWVudHMgPSBub3RSZWxldmFudERhdGFFbGVtZW50cztcclxuICAgIH1cclxuICAgIGlmIChicmFuY2hKU09OLkRlY2lzaW9uUG9pbnQpIHtcclxuICAgICAgIGJyYW5jaC5kZWNpc2lvblBvaW50cyA9IG5ldyBBcnJheTxEZWNpc2lvblBvaW50PigpO1xyXG4gICAgICAgdGhpcy5hZGREZWNpc2lvblBvaW50cyhicmFuY2hKU09OLkRlY2lzaW9uUG9pbnQsICBicmFuY2guZGVjaXNpb25Qb2ludHMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJyYW5jaDtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGFkZERlY2lzaW9uUG9pbnQoZGVjc2lvblBvaW50QXNKU09OOiBhbnkgLCBkZWNpc2lvblBvaW50czogRGVjaXNpb25Qb2ludFtdKSB7XHJcbiAgICAgY29uc3QgZGVjaXNpb25Qb2ludCA9IG5ldyBEZWNpc2lvblBvaW50KCk7XHJcbiAgICAgIGlmIChkZWNzaW9uUG9pbnRBc0pTT04uQXR0ciAmJiBkZWNzaW9uUG9pbnRBc0pTT04uQXR0ci5JZCkge1xyXG4gICAgICAgIGRlY2lzaW9uUG9pbnQuaWQgPSBkZWNzaW9uUG9pbnRBc0pTT04uQXR0ci5JZDtcclxuICAgICB9XHJcbiAgICAgZGVjaXNpb25Qb2ludC5sYWJlbCA9IGRlY3Npb25Qb2ludEFzSlNPTi5MYWJlbDtcclxuICAgICAgY29uc3QgYnJhbmNoZXNKU09OID0gZGVjc2lvblBvaW50QXNKU09OLkJyYW5jaDtcclxuICAgICBpZiAoYnJhbmNoZXNKU09OICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZGVjaXNpb25Qb2ludC5icmFuY2hlcyA9IG5ldyBBcnJheTxCcmFuY2g+KCk7XHJcbiAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShicmFuY2hlc0pTT04pKSAge1xyXG4gICAgICAgIGZvciAoY29uc3QgYnJhbmNoSlNPTiBvZiBicmFuY2hlc0pTT04pIHtcclxuICAgICAgICAgIGRlY2lzaW9uUG9pbnQuYnJhbmNoZXMucHVzaCh0aGlzLnJldHVybkJyYW5jaChicmFuY2hKU09OKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkZWNpc2lvblBvaW50LmJyYW5jaGVzLnB1c2godGhpcy5yZXR1cm5CcmFuY2goYnJhbmNoZXNKU09OKSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZGVmYXVsdEJyYW5jaEpTT04gPSBkZWNzaW9uUG9pbnRBc0pTT04uRGVmYXVsdEJyYW5jaDtcclxuICAgICAgaWYgKGRlZmF1bHRCcmFuY2hKU09OICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBkZWNpc2lvblBvaW50LmRlZmF1bHRCcmFuY2ggPSB0aGlzLmNyZWF0ZURlZmF1bHRCcmFuY2goZGVmYXVsdEJyYW5jaEpTT04pO1xyXG4gICAgICB9XHJcblxyXG4gICAgIH1cclxuICAgICBkZWNpc2lvblBvaW50cy5wdXNoKGRlY2lzaW9uUG9pbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGREZWNpc2lvblBvaW50cyhkZWNzaW9uUG9pbnRzQXNKU09OOiBhbnkgLCBkZWNpc2lvblBvaW50czogRGVjaXNpb25Qb2ludFtdKSB7XHJcbiAgICBpZiAodGhpcy5hcnJheUNoZWNrZXJTZXJ2aWNlLmlzQXJyYXkoZGVjc2lvblBvaW50c0FzSlNPTikpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGRlY2lzaW9uUG9pbnQgb2YgIGRlY3Npb25Qb2ludHNBc0pTT04pe1xyXG4gICAgICAgICAgdGhpcy5hZGREZWNpc2lvblBvaW50KGRlY2lzaW9uUG9pbnQsIGRlY2lzaW9uUG9pbnRzKTtcclxuICAgICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFkZERlY2lzaW9uUG9pbnQoZGVjc2lvblBvaW50c0FzSlNPTiwgZGVjaXNpb25Qb2ludHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlRGVjaXNpb25Qb2ludHMoZGF0YTogYW55KTogRGVjaXNpb25Qb2ludFtdIHtcclxuICAgIGNvbnN0IGRlY2lzaW9uUG9pbnRzID0gbmV3IEFycmF5PERlY2lzaW9uUG9pbnQ+KCk7XHJcbiAgICB0aGlzLmFkZERlY2lzaW9uUG9pbnRzKGRhdGEsIGRlY2lzaW9uUG9pbnRzKTtcclxuICAgIHJldHVybiBkZWNpc2lvblBvaW50cztcclxuICB9XHJcblxyXG5cclxuICBjcmVhdGVEZWZhdWx0QnJhbmNoKGRhdGE6IGFueSk6IEJyYW5jaCB7XHJcbiAgICBjb25zdCBkZWZhdWx0QnJhbmNoOiBCcmFuY2ggID0gbmV3IEJyYW5jaCgpO1xyXG4gICAgZGVmYXVsdEJyYW5jaC5sYWJlbCA9ICAnRGVmYXVsdCBCcmFuY2gnO1xyXG4gICAgZGVmYXVsdEJyYW5jaC5jb21wdXRlZFZhbHVlID0gdGhpcy5jb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlLmNyZWF0ZUNvbXB1dGVkVmFsdWUoZGF0YSk7XHJcbiAgICByZXR1cm4gZGVmYXVsdEJyYW5jaDtcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRGVjaXNpb25Qb2ludCB9IGZyb20gJy4uLy4uL21vZGVscy9kZWNpc2lvbnBvaW50Lm1vZGVsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBSdWxlcyB7XHJcbiAgIGRlY2lzaW9uUG9pbnRzOiBEZWNpc2lvblBvaW50W107XHJcbn1cclxuIiwiaW1wb3J0IHsgU2VjdGlvbklmVmFsdWVOb3RDb25kaXRpb24gfSBmcm9tICcuL3NlY3Rpb24taWYtdmFsdWUtbm90LWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IFNlY3Rpb25JZlZhbHVlQ29uZGl0aW9uIH0gZnJvbSAnLi9zZWN0aW9uLWlmLXZhbHVlLWNvbmRpdGlvbic7XHJcblxyXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVQYXJ0aWFsIHtcclxuICAgIGlkOiBTdHJpbmc7XHJcbiAgICBzZWN0aW9uSWZOb3RWYWx1ZTogU2VjdGlvbklmVmFsdWVOb3RDb25kaXRpb247XHJcbiAgICBzZWN0aW9uSWZWYWx1ZXM6IFNlY3Rpb25JZlZhbHVlQ29uZGl0aW9uW107XHJcbn1cclxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSAsIEluamVjdCAgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtUZW1wbGF0ZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvdGVtcGxhdGUubW9kZWwnO1xyXG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbWV0YWRhdGEvbW9kZWxzL21ldGFkYXRhLW1vZGVsJztcclxuaW1wb3J0IHsgRGlhZ3JhbSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2RpYWdyYW0ubW9kZWwnO1xyXG5pbXBvcnQgeyBEaWFncmFtU2VydmljZSB9IGZyb20gJy4vZGlhZ3JhbS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3JlYXRpb25TZXJ2aWNlSW5qZWN0b3JUb2tlbiB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7RGF0YUVsZW1lbnRDcmVhdGlvbkJhc2VTZXJ2aWNlfSBmcm9tICcuL2RhdGEtZWxlbWVudC1jcmVhdGlvbi1iYXNlLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9iYXNlLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEFycmF5Q2hlY2tlclNlcnZpY2UgfSBmcm9tICcuL2FycmF5LWNoZWNrZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IERlY2lzaW9uUG9pbnRzQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9kZWNpc2lvbi1wb2ludHMtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFJ1bGVzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9ydWxlcy9tb2RlbHMvcnVsZXMubW9kZWwnO1xyXG5pbXBvcnQgeyBmYWlsIH0gZnJvbSAnYXNzZXJ0JztcclxuaW1wb3J0IHsgVGVtcGxhdGVQYXJ0aWFsIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbmRwb2ludC90ZW1wbGF0ZS1wYXJ0aWFsJztcclxuaW1wb3J0IHsgU2VjdGlvbklmVmFsdWVOb3RDb25kaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VuZHBvaW50L3NlY3Rpb24taWYtdmFsdWUtbm90LWNvbmRpdGlvbic7XHJcbmltcG9ydCB7IFNlY3Rpb25JZlZhbHVlQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbmRwb2ludC9zZWN0aW9uLWlmLXZhbHVlLWNvbmRpdGlvbic7XHJcbmRlY2xhcmUgdmFyIHJlcXVpcmU6IGFueTtcclxuXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZU1hbmFnZXJTZXJ2aWNlIHtcclxuICBwcml2YXRlIGVuZFBvaW50WE1MU3RyaW5nOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIHN0cmluZ1BhcnNlcjogYW55ID0gcmVxdWlyZSgnc3RyaW5nJyk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgIGRpYWdyYW1TZXJ2aWNlOiBEaWFncmFtU2VydmljZSAsXHJcbiAgICBASW5qZWN0KENyZWF0aW9uU2VydmljZUluamVjdG9yVG9rZW4pIHByaXZhdGUgZWxlbWVtdGNyZWF0aW9uU2VydmljZTogRGF0YUVsZW1lbnRDcmVhdGlvbkJhc2VTZXJ2aWNlW10gLFxyXG4gICAgcHJpdmF0ZSBhcnJheUNoZWNrZXJTZXJ2aWNlOiBBcnJheUNoZWNrZXJTZXJ2aWNlICwgcHJpdmF0ZSBkZWNpc2lvblBvaW50c0NyZWF0aW9uU2VydmljZTogRGVjaXNpb25Qb2ludHNDcmVhdGlvblNlcnZpY2UpIHsgfVxyXG5cclxuICBnZXRUZW1wbGF0ZSh0ZW1wbGF0ZUNvbnRlbnQ6IHN0cmluZyk6IFRlbXBsYXRlICB7XHJcbiAgIGNvbnN0IHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKCk7XHJcbiAgIGxldCB0ZW1wbGF0ZUNvbnRlbnRBc0pTT046IGFueTtcclxuICAgdGVtcGxhdGVDb250ZW50QXNKU09OID0gdGhpcy5wYXJzZVRvSnNvbih0ZW1wbGF0ZUNvbnRlbnQpO1xyXG4gICBpZiAodGVtcGxhdGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgdGhyb3cgIG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIHRoZSB0ZW1wbGF0ZScpO1xyXG4gICB9XHJcbiAgIHRlbXBsYXRlLm1ldGFkYXRhID0gdGhpcy5nZXRNZXRhRGF0YSh0ZW1wbGF0ZUNvbnRlbnRBc0pTT04uTWV0YWRhdGEpO1xyXG4gICB0ZW1wbGF0ZS5kYXRhRWxlbWVudHMgPSB0aGlzLmdldERhdGFFbGVtZW50cyh0ZW1wbGF0ZUNvbnRlbnRBc0pTT04uRGF0YUVsZW1lbnRzKTtcclxuICAgaWYgKHRlbXBsYXRlQ29udGVudEFzSlNPTi5SdWxlcykge1xyXG4gICAgdGVtcGxhdGUucnVsZXMgID0gbmV3IFJ1bGVzKCk7XHJcbiAgICB0ZW1wbGF0ZS5ydWxlcy5kZWNpc2lvblBvaW50cyA9IHRoaXMuZGVjaXNpb25Qb2ludHNDcmVhdGlvblNlcnZpY2UuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVjaXNpb25Qb2ludHModGVtcGxhdGVDb250ZW50QXNKU09OLlJ1bGVzLkRlY2lzaW9uUG9pbnQpO1xyXG4gIH1cclxuICAgIHRlbXBsYXRlLnRlbXBsYXRlUGFydGlhbCA9IHRoaXMucmV0dXJuRW5kcG9pbnRzKHRlbXBsYXRlQ29udGVudCk7XHJcbiAgICB0ZW1wbGF0ZS5lbmRQb2ludHNTdHJpbmcgPSB0aGlzLmVuZFBvaW50WE1MU3RyaW5nO1xyXG4gICAgdGVtcGxhdGUueG1sQ29udGVudCA9IHRlbXBsYXRlQ29udGVudDtcclxuXHJcbi8vIGNvbnNvbGUubG9nKHRlbXBsYXRlLnRlbXBsYXRlUGFydGlhbCk7XHJcbi8vY29uc29sZS5sb2codGVtcGxhdGUuZW5kUG9pbnRzU3RyaW5nKTtcclxuXHJcbiAgICByZXR1cm4gdGVtcGxhdGU7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRUZW1wbGF0ZVBhcnRpYWwodGVtcGxhdGVQYXJ0aWFsSlNPTjogYW55KTogVGVtcGxhdGVQYXJ0aWFsIHtcclxuICAgIGNvbnN0IHRlbXBsYXRlUGFydGlhbCA9IG5ldyBUZW1wbGF0ZVBhcnRpYWw7XHJcbiAgICB0ZW1wbGF0ZVBhcnRpYWwuaWQgPSB0ZW1wbGF0ZVBhcnRpYWxKU09OLkF0dHIuSWQ7XHJcbiAgICB0ZW1wbGF0ZVBhcnRpYWwuc2VjdGlvbklmTm90VmFsdWUgPSB0ZW1wbGF0ZVBhcnRpYWxKU09OLlNlY3Rpb25JZlZhbHVlTm90O1xyXG4gICAgdGVtcGxhdGVQYXJ0aWFsLnNlY3Rpb25JZlZhbHVlcyA9IHRlbXBsYXRlUGFydGlhbEpTT04uU2VjdGlvbklmVmFsdWU7XHJcbiAgICByZXR1cm4gdGVtcGxhdGVQYXJ0aWFsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXR1cm5FbmRQb2ludENvbnRlbnRzKGNvbnRlbnQ6IHN0cmluZywgc3RhcnRUb2tlbjogc3RyaW5nLCBlbmRUb2tlbjogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgY29udGVudHMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgbGV0IHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbiA9IDA7XHJcbiAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgICBjb25zdCBjb250ZW50U3RhcnRQb3NpdGlvbiA9IGNvbnRlbnQuaW5kZXhPZihzdGFydFRva2VuLCB0ZW1wbGF0ZVNlYXJjaEluZGV4UG9zaXRpb24pO1xyXG4gICAgICAgICBjb25zdCBjb250ZW50RW5kUG9zaXRpb24gID0gY29udGVudC5pbmRleE9mKGVuZFRva2VuLCB0ZW1wbGF0ZVNlYXJjaEluZGV4UG9zaXRpb24pO1xyXG5cclxuICAgICAgICAgaWYgKGNvbnRlbnRTdGFydFBvc2l0aW9uID49IDAgICYmIGNvbnRlbnRFbmRQb3NpdGlvbiA+PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gY29udGVudEVuZFBvc2l0aW9uICsgZW5kVG9rZW4ubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50RGF0YSA9IGNvbnRlbnQuc3Vic3RyaW5nKGNvbnRlbnRTdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbik7XHJcbiAgICAgICAgICAgIGNvbnRlbnRzLnB1c2goY29udGVudERhdGEpO1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZVNlYXJjaEluZGV4UG9zaXRpb24gPSBlbmRQb3NpdGlvbiArIDE7XHJcbiAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBjb250ZW50cztcclxuICB9XHJcblxyXG5wcml2YXRlIHJldHVyblRlbXBsYXRlUGFydGlhbHModGVtcGxhdGVQYXJ0aWFsQXJyYXk6IHN0cmluZ1tdKTogVGVtcGxhdGVQYXJ0aWFsW10ge1xyXG4gICAgICBjb25zdCB0ZW1wbGF0ZVBhcnRpYWxzID0gbmV3IEFycmF5PFRlbXBsYXRlUGFydGlhbD4oKTtcclxuICAgICAgZm9yIChjb25zdCBhcnJheUl0ZW0gb2YgdGVtcGxhdGVQYXJ0aWFsQXJyYXkpIHtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZVBhcnRpYWwgPSBuZXcgVGVtcGxhdGVQYXJ0aWFsKCk7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGVQYXJ0aWFsQXNKU09OID0gdGhpcy5wYXJzZVRvSnNvbihhcnJheUl0ZW0pO1xyXG4gICAgICAgIHRlbXBsYXRlUGFydGlhbC5pZCA9IHRlbXBsYXRlUGFydGlhbEFzSlNPTi5BdHRyLklkO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRlbXBsYXRlUGFydGlhbHM7XHJcbn1cclxuXHJcbiAgcHJpdmF0ZSByZXR1cm5FbmRwb2ludHMoeG1sRGF0YTogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgZW5kUG9pbnRTdGFydFRva2VuID0gJzxFbmRQb2ludHM+JztcclxuICAgIGNvbnN0IGVuZFBvaW50RW5kVG9rZW4gPSAnPC9FbmRQb2ludHM+JztcclxuXHJcbiAgICBjb25zdCBlbmRQb2ludFN0YXJ0VG9rZW5Qb3NpdGlvbiA9IHhtbERhdGEuaW5kZXhPZihlbmRQb2ludFN0YXJ0VG9rZW4pO1xyXG4gICAgY29uc3QgZW5kUG9pbnRFbmRUb2tlblBvc2l0aW9uID0geG1sRGF0YS5pbmRleE9mKGVuZFBvaW50RW5kVG9rZW4pO1xyXG4gICAgaWYgKGVuZFBvaW50U3RhcnRUb2tlblBvc2l0aW9uID49IDAgICYmIGVuZFBvaW50RW5kVG9rZW5Qb3NpdGlvbiA+PSAwICkge1xyXG4gICAgICBjb25zdCBjb250ZW50U3RhcnRQb3NpdGlvbiA9ICAoZW5kUG9pbnRTdGFydFRva2VuUG9zaXRpb24gKyBlbmRQb2ludFN0YXJ0VG9rZW4ubGVuZ3RoKTtcclxuICAgICAgY29uc3QgZW5kUG9pbnRDb250ZW50ID0geG1sRGF0YS5zdWJzdHJpbmcoY29udGVudFN0YXJ0UG9zaXRpb24gLCBlbmRQb2ludEVuZFRva2VuUG9zaXRpb24pO1xyXG4gICAgaWYgKGVuZFBvaW50Q29udGVudC5sZW5ndGggPiAwICkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZVBhcnRpYWxzID0gdGhpcy5yZXR1cm5FbmRQb2ludENvbnRlbnRzKGVuZFBvaW50Q29udGVudCwgJzxUZW1wbGF0ZVBhcnRpYWwnICwgJzwvVGVtcGxhdGVQYXJ0aWFsPicpO1xyXG4gICAgICAgICAgICB0aGlzLmVuZFBvaW50WE1MU3RyaW5nID0gdGhpcy5yZXR1cm5FbmRQb2ludENvbnRlbnRzKGVuZFBvaW50Q29udGVudCwgJzxFbmRQb2ludCcgLCAnPC9FbmRQb2ludD4nKTtcclxuICAgIHJldHVybiB0ZW1wbGF0ZVBhcnRpYWxzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxucHJpdmF0ZSBwYXJzZVRvSnNvbih4bWxEYXRhOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgbGV0IGpzb25SZXN1bHQ6IEpTT047XHJcbiAgICBjb25zdCBwYXJzZVN0cmluZyA9ICByZXF1aXJlKCd4bWwyanMnKS5wYXJzZVN0cmluZztcclxuICAgIHBhcnNlU3RyaW5nKHhtbERhdGEsIHtleHBsaWNpdFJvb3QgOiBmYWxzZSwgZXhwbGljaXRBcnJheSA6IGZhbHNlLCBhdHRya2V5IDogJ0F0dHInfSAsIGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkge1xyXG4gICAgICAgIGpzb25SZXN1bHQgID0gcmVzdWx0O1xyXG4gIH0pO1xyXG4gIHJldHVybiBqc29uUmVzdWx0O1xyXG4gfVxyXG5cclxuIHByaXZhdGUgZ2V0TWV0YURhdGEobWV0YWRhdGFKU09OOiBhbnkpOiBNZXRhZGF0YSB7XHJcbiAgICBjb25zdCBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpO1xyXG4gICAgbWV0YWRhdGEubGFiZWwgPSBtZXRhZGF0YUpTT04uTGFiZWw7XHJcbiAgICBtZXRhZGF0YS5pZCA9IG1ldGFkYXRhSlNPTi5JRDtcclxuICAgIG1ldGFkYXRhLnNjaGVtYVZlcnNpb24gPSBtZXRhZGF0YUpTT04uU2NoZW1hVmVyc2lvbjtcclxuICAgIG1ldGFkYXRhLnJ1bGVWZXJzaW9uID0gbWV0YWRhdGFKU09OLlJ1bGVWZXJzaW9uO1xyXG4gICAgY29uc3QgZGlhZ3JhbXNBc0pTT04gPSBtZXRhZGF0YUpTT04uSW5mby5EaWFncmFtcy5EaWFncmFtO1xyXG4gICAgbWV0YWRhdGEuZGlhZ3JhbXMgPSB0aGlzLmRpYWdyYW1TZXJ2aWNlLnJldHVybkRpYWdyYW1zKGRpYWdyYW1zQXNKU09OKTtcclxuXHJcbiAgICBtZXRhZGF0YS5hcHByb3ZlZEJ5ID0gbWV0YWRhdGFKU09OLkFwcHJvdmVkQnk7XHJcbiAgICBtZXRhZGF0YS5jcmVhdGVkRGF0ZSA9IG1ldGFkYXRhSlNPTi5DcmVhdGVkRGF0ZTtcclxuICAgIG1ldGFkYXRhLmxhc3RNb2RpZmllZERhdGUgPSBtZXRhZGF0YUpTT04uTGFzdE1vZGlmaWVkRGF0ZTtcclxuICAgIG1ldGFkYXRhLnJldmlld2VkQnkgPSBtZXRhZGF0YUpTT04uUmV2aWV3ZWRCeTtcclxuICAgIG1ldGFkYXRhLmRldmVsb3BlZEJ5ID0gbWV0YWRhdGFKU09OLkRldmVsb3BlZEJ5O1xyXG4gICAgbWV0YWRhdGEucmFkRWxlbWVudFNldElEID0gbWV0YWRhdGFKU09OLlJhZEVsZW1lbnRTZXRJRDtcclxuICAgIHJldHVybiBtZXRhZGF0YTtcclxuIH1cclxuXHJcbiBwcml2YXRlICByZXR1cm5EYXRhRWxlbWVudCAoZWxlbWVudFR5cGU6IHN0cmluZywgZGF0YUVsZW1lbnRzSlNPTjogYW55KTogQmFzZURhdGFFbGVtZW50W10ge1xyXG4gICAgY29uc3QgIGRhdGFFbGVtZW50cyA9IG5ldyBBcnJheTxCYXNlRGF0YUVsZW1lbnQ+KCk7XHJcbiAgICBsZXQgZGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2VJbnN0YW5jZTogRGF0YUVsZW1lbnRDcmVhdGlvbkJhc2VTZXJ2aWNlO1xyXG4gICAgZm9yIChjb25zdCBkYXRhRWxlbWVudENyZWF0aW9uU2VydmljZSBvZiB0aGlzLmVsZW1lbXRjcmVhdGlvblNlcnZpY2UpIHtcclxuICAgICAgICAgIGlmIChkYXRhRWxlbWVudENyZWF0aW9uU2VydmljZS5lbGVtZW50VHlwZSA9PT0gZWxlbWVudFR5cGUpIHtcclxuICAgICAgICAgICAgZGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2VJbnN0YW5jZSA9IGRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2VJbnN0YW5jZSAhPT0gdW5kZWZpbmVkICYmIGRhdGFFbGVtZW50c0pTT04gIT09IHVuZGVmaW5lZCkgIHtcclxuICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShkYXRhRWxlbWVudHNKU09OKSkge1xyXG4gICAgICAgIGZvciAoY29uc3QgZGF0YUVsZW1lbnRKU09OIG9mIGRhdGFFbGVtZW50c0pTT04pIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YUVsZW1lbnQgPSBkYXRhRWxlbWVudENyZWF0aW9uU2VydmljZUluc3RhbmNlLmNyZWF0ZUVsZW1lbnQoZGF0YUVsZW1lbnRKU09OKTtcclxuICAgICAgICAgICAgZGF0YUVsZW1lbnRzLnB1c2goZGF0YUVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBkYXRhRWxlbWVudCA9IGRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlSW5zdGFuY2UuY3JlYXRlRWxlbWVudChkYXRhRWxlbWVudHNKU09OKTtcclxuICAgICAgICBkYXRhRWxlbWVudHMucHVzaChkYXRhRWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBkYXRhRWxlbWVudHM7XHJcbiB9XHJcblxyXG4gcHJpdmF0ZSBnZXREYXRhRWxlbWVudHMoZGF0YUVsZW1lbnRzSlNPTjogYW55KTogQmFzZURhdGFFbGVtZW50W10ge1xyXG4gICBsZXQgIGRhdGFFbGVtZW50cyA9IG5ldyBBcnJheTxCYXNlRGF0YUVsZW1lbnQ+KCk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnQ2hvaWNlRGF0YUVsZW1lbnQnLCBkYXRhRWxlbWVudHNKU09OLkNob2ljZURhdGFFbGVtZW50KSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnTXVsdGlDaG9pY2VEYXRhRWxlbWVudCcsIGRhdGFFbGVtZW50c0pTT04uTXVsdGlDaG9pY2VEYXRhRWxlbWVudCkpO1xyXG4gICBkYXRhRWxlbWVudHMgPSBkYXRhRWxlbWVudHMuY29uY2F0KHRoaXMucmV0dXJuRGF0YUVsZW1lbnQoJ051bWVyaWNEYXRhRWxlbWVudCcsIGRhdGFFbGVtZW50c0pTT04uTnVtZXJpY0RhdGFFbGVtZW50KSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnR2xvYmFsVmFsdWUnLCBkYXRhRWxlbWVudHNKU09OLkdsb2JhbFZhbHVlKSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnQ29tcHV0ZWREYXRhRWxlbWVudCcsIGRhdGFFbGVtZW50c0pTT04uQ29tcHV0ZWREYXRhRWxlbWVudCkpO1xyXG4gICBkYXRhRWxlbWVudHMgPSBkYXRhRWxlbWVudHMuY29uY2F0KHRoaXMucmV0dXJuRGF0YUVsZW1lbnQoJ0ludGVnZXJEYXRhRWxlbWVudCcsIGRhdGFFbGVtZW50c0pTT04uSW50ZWdlckRhdGFFbGVtZW50KSk7XHJcbiAgIGRhdGFFbGVtZW50cyA9IGRhdGFFbGVtZW50cy5jb25jYXQodGhpcy5yZXR1cm5EYXRhRWxlbWVudCgnRGF0ZVRpbWVEYXRhRWxlbWVudCcsIGRhdGFFbGVtZW50c0pTT04uRGF0ZVRpbWVEYXRhRWxlbWVudCkpO1xyXG4gICBkYXRhRWxlbWVudHMgPSBkYXRhRWxlbWVudHMuY29uY2F0KHRoaXMucmV0dXJuRGF0YUVsZW1lbnQoJ0R1cmF0aW9uRGF0YUVsZW1lbnQnLCBkYXRhRWxlbWVudHNKU09OLlRpbWVTcGFuRGF0YUVsZW1lbnQpKTtcclxuICAgcmV0dXJuIGRhdGFFbGVtZW50cztcclxuIH1cclxufVxyXG4iLCJleHBvcnQgY2xhc3MgQWxsVGV4dFJlcG9ydCB7XHJcbiAgICBoZWFkaW5nOiBzdHJpbmc7XHJcbiAgICBjb250ZW50OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFJlcG9ydFRleHRQb3NpdGlvbiB7XHJcbiAgICBUb3AsXHJcbiAgICBSaWdodFxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9zZXJ2aWNlcy90ZW1wbGF0ZS1tYW5hZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlL3NyYy9tZXRhZGF0YS9saWZlY3ljbGVfaG9va3MnO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL3RlbXBsYXRlLm1vZGVsJztcclxuaW1wb3J0IHsgTWFpblJlcG9ydFRleHQsIEZpbmFsRXhlY3V0ZWRIaXN0b3J5IH0gZnJvbSAnLi4vYXNzaXN0LWRhdGEtZWxlbWVudC9hc3Npc3QtZGF0YS1lbGVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNpbXVsYXRvckVuZ2luZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL3NpbXVsYXRvci1lbmdpbmUuc2VydmljZSc7XHJcbmltcG9ydCB7IERpYWdyYW0gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9kaWFncmFtLm1vZGVsJztcclxuaW1wb3J0IHsgQmFzZURhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvYmFzZS1kYXRhLWVsZW1lbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBJbnB1dERhdGEgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9pbnB1dC1kYXRhLm1vZGVsJztcclxuaW1wb3J0IHsgUmVwb3J0VGV4dFBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LXRleHQubW9kZWwnO1xyXG5pbXBvcnQgeyBDaG9pY2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Nob2ljZS1kYXRhLWVsZW1lbnQtbW9kZWwnO1xyXG5jb25zdCAkID0gcmVxdWlyZSgnanF1ZXJ5Jyk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci1hc3Npc3Qtc2ltdWxhdG9yJyxcclxuICB0ZW1wbGF0ZTogYDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNFbXB0eUNvbnRlbnRcIj5cclxuICA8ZGl2IGlkPVwidG9wUmVwb3J0VGV4dFBvc2l0aW9uXCIgKm5nSWY9XCJyZXBvcnRUZXh0UG9zaXRpb24gPT09IHBvc2l0aW9uLlRvcFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMiBjb2wtbWQtMTIgY29sLWxnLTEyXCI+XHJcbiAgICAgIDxkaXYgaWQ9XCJkaXYtc2ltdWxhdG9yLWJsb2NrXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJveCBib3gtcHJpbWFyeSBib3gtc29saWQgbWFyZ2luLWItMFwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cInJlc2V0QnV0dG9uID09IHRydWVcIiBjbGFzcz1cIndpdGgtYm9yZGVyICB0ZXh0LXJpZ2h0IHBhZGRpbmctNSBwYWRkaW5nLXItMTBcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicmVzZXRFbGVtZW50cygpXCIgY2xhc3M9XCJidG4gYnRuLXhzIGJ0bi1wcmltYXJ5XCI+UmVzZXQgVmFsdWVzPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3gtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2ICNzaW11bGF0b3JSZXN1bHRzQmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlc3VsdFRleHQgIT09IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveCBib3gtcHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlciB3aXRoLWJvcmRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImJveC10aXRsZVwiPlJlcG9ydCBUZXh0PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LXRvb2xzIHB1bGwtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1ib3gtdG9vbCBidG4tcmVwb3J0LXRleHRcIiAoY2xpY2spPVwiY29sbGFwc2VSZXBvcnRUZXh0KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgaWQ9XCJpY29uX3JlcG9ydHRleHRcIiBjbGFzcz1cImZhIGZhLW1pbnVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiYm9keV9yZXBvcnR0ZXh0XCIgY2xhc3M9XCJib3gtYm9keSByZXBvcnQtdGV4dCBkaXYtcmVwb3J0LXRleHQtc2Nyb2xsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGFjci1hc3Npc3QtcmVwb3J0LXRleHQgW3JlcG9ydFRleHRdPVwicmVzdWx0VGV4dFwiPjwvYWNyLWFzc2lzdC1yZXBvcnQtdGV4dD5cclxuICAgICAgICAgICAgICAgICAgICA8L2RsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhZGRpbmctci0xMCBzY3JvbGxcIiBhY3JEeW5hbWljSGVpZ2h0RGlyZWN0aXZlIFtzaW11bGF0b3JFbGVtZW50XT1cInNpbXVsYXRvclJlc3VsdHNCbG9ja1wiPlxyXG4gICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZm9ybS1ob3Jpem9udGFsXCI+XHJcbiAgICAgICAgICAgICAgICA8YWNyLWFzc2lzdC1kYXRhLWVsZW1lbnQgW2RhdGFFbGVtZW50c109XCJkYXRhRWxlbWVudHNcIiBbdGVtcGxhdGVQYXJ0aWFsXT1cInRlbXBsYXRlLnRlbXBsYXRlUGFydGlhbFwiXHJcbiAgICAgICAgICAgICAgICAgIFtlbmRQb2ludFhNTFN0cmluZ109XCJ0ZW1wbGF0ZS5lbmRQb2ludHNTdHJpbmdcIiBbaW1hZ2VQYXRoXT1cImltYWdlUGF0aFwiIFt4bWxDb250ZW50XT1cInRlbXBsYXRlLnhtbENvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAocmV0dXJuUmVwb3J0VGV4dCk9J3JlY2lldmVSZXBvcnRUZXh0KCRldmVudCknIFtpbnB1dFZhbHVlc109XCJpbnB1dFZhbHVlc1wiIFtpc1Jlc2V0XT1cImlzUmVzZXRcIlxyXG4gICAgICAgICAgICAgICAgICAocmV0dXJuRGF0YUVsZW1lbnRDaGFuZ2VkKT0ncmVjaXZlZE9uRGF0YUVsZW1lbnRDaGFuZ2VkKCRldmVudCknIChyZXR1cm5FeGVjdXRpb25IaXN0b3J5KT0ncmVjaWV2ZWRFeGVjdXRpb25IaXN0b3J5KCRldmVudCknPjwvYWNyLWFzc2lzdC1kYXRhLWVsZW1lbnQ+XHJcbiAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgaWQ9XCJyaWdodFJlcG9ydFRleHRQb3NpdGlvblwiICpuZ0lmPVwicmVwb3J0VGV4dFBvc2l0aW9uID09PSBwb3NpdGlvbi5SaWdodFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS02IGNvbC1tZC02IGNvbC1sZy02XCI+XHJcbiAgICAgIDxkaXYgaWQ9XCJkaXYtc2ltdWxhdG9yLWJsb2NrXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJveCBib3gtcHJpbWFyeSBib3gtc29saWQgbWFyZ2luLWItMFwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cInJlc2V0QnV0dG9uID09IHRydWVcIiBjbGFzcz1cIndpdGgtYm9yZGVyIHRleHQtcmlnaHQgcGFkZGluZy01IHBhZGRpbmctci0xMFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJyZXNldEVsZW1lbnRzKClcIiBjbGFzcz1cImJ0biBidG4teHMgYnRuLXByaW1hcnlcIj5SZXNldCBWYWx1ZXM8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJkaXYtc2ltdWxhdG9yLWZvcm1cIiBjbGFzcz1cInBhZGRpbmctci0xMCBkaXYtc2ltdWxhdG9yLWZvcm0taGVpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIj5cclxuICAgICAgICAgICAgICAgIDxhY3ItYXNzaXN0LWRhdGEtZWxlbWVudCBbZGF0YUVsZW1lbnRzXT1cImRhdGFFbGVtZW50c1wiIFt0ZW1wbGF0ZVBhcnRpYWxdPVwidGVtcGxhdGUudGVtcGxhdGVQYXJ0aWFsXCJcclxuICAgICAgICAgICAgICAgICAgW2VuZFBvaW50WE1MU3RyaW5nXT1cInRlbXBsYXRlLmVuZFBvaW50c1N0cmluZ1wiIFtpbWFnZVBhdGhdPVwiaW1hZ2VQYXRoXCIgW3htbENvbnRlbnRdPVwidGVtcGxhdGUueG1sQ29udGVudFwiXHJcbiAgICAgICAgICAgICAgICAgIChyZXR1cm5SZXBvcnRUZXh0KT0ncmVjaWV2ZVJlcG9ydFRleHQoJGV2ZW50KScgW2lucHV0VmFsdWVzXT1cImlucHV0VmFsdWVzXCIgW2lzUmVzZXRdPVwiaXNSZXNldFwiXHJcbiAgICAgICAgICAgICAgICAgIChyZXR1cm5EYXRhRWxlbWVudENoYW5nZWQpPSdyZWNpdmVkT25EYXRhRWxlbWVudENoYW5nZWQoJGV2ZW50KScgKHJldHVybkV4ZWN1dGlvbkhpc3RvcnkpPSdyZWNpZXZlZEV4ZWN1dGlvbkhpc3RvcnkoJGV2ZW50KSc+PC9hY3ItYXNzaXN0LWRhdGEtZWxlbWVudD5cclxuICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLW1kLTYgY29sLWxnLTZcIj5cclxuICAgICAgPGRpdiAjc2ltdWxhdG9yUmVzdWx0c0Jsb2NrPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZXN1bHRUZXh0ICE9PSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3ggYm94LXByaW1hcnlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC1oZWFkZXIgd2l0aC1ib3JkZXJcIj5cclxuICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJib3gtdGl0bGVcIj5SZXBvcnQgVGV4dDwvaDM+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJveC10b29scyBwdWxsLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tYm94LXRvb2wgYnRuLXJlcG9ydC10ZXh0XCIgKGNsaWNrKT1cImNvbGxhcHNlUmVwb3J0VGV4dCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpIGlkPVwiaWNvbl9yZXBvcnR0ZXh0XCIgY2xhc3M9XCJmYSBmYS1taW51c1wiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBpZD1cImJvZHlfcmVwb3J0dGV4dFwiIGNsYXNzPVwiYm94LWJvZHkgcmVwb3J0LXRleHRcIj5cclxuICAgICAgICAgICAgICA8ZGw+XHJcbiAgICAgICAgICAgICAgICA8YWNyLWFzc2lzdC1yZXBvcnQtdGV4dCBbcmVwb3J0VGV4dF09XCJyZXN1bHRUZXh0XCI+PC9hY3ItYXNzaXN0LXJlcG9ydC10ZXh0PlxyXG4gICAgICAgICAgICAgIDwvZGw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTYgY29sLW1kLTYgY29sLWxnLTZcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dLZXlEaWFncmFtID09PSB0cnVlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJveCBib3gtcHJpbWFyeSBtYXJnaW4tYi0wXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm94LWhlYWRlciB3aXRoLWJvcmRlclwiPlxyXG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJib3gtdGl0bGVcIj5LZXkgSW1hZ2VzPC9oMz5cclxuICAgICAgICAgICAgPGlucHV0ICNpbWFnZVVwbG9hZCBpZD1cImRpYWdyYW1VcGxvYWRcIiBjbGFzcz1cImhpZGRlblwiIHR5cGU9XCJmaWxlXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIG11bHRpcGxlIChjaGFuZ2UpPVwiY2hhbmdlTGlzdGVuZXIoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwiZGlhZ3JhbVVwbG9hZFwiIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzIGJnLW9saXZlIG1hcmdpbi0xMFwiIHRpdGxlPVwiQ2hvb3NlIERpYWdyYW1zXCI+Q2hvb3NlIGFcclxuICAgICAgICAgICAgICBEaWFncmFtPC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHQgcGFkZGluZy1sLTVcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tYm94LXRvb2xcIiBkYXRhLXdpZGdldD1cImNvbGxhcHNlXCIgKGNsaWNrKT1cImNvbGxhcHNlS2V5RGlhZ3JhbSgpXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBpZD1cImljb25fa2V5ZGlhZ3JhbVwiIGNsYXNzPVwiZmEgZmEtbWludXNcIj48L2k+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodCBwYWRkaW5nLWwtNVwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi16b29tIGJ0bi1zbVwiIG9uY2xpY2s9XCJ6b29tSW4oKVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2gtcGx1cyBmYS1sZ1wiPjwvaT5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0IHBhZGRpbmctbC01XCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXpvb20gYnRuLXNtXCIgb25jbGljaz1cInpvb21PdXQoKVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2gtbWludXMgZmEtbGdcIj48L2k+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IFtoaWRkZW5dPVwiIWlzSW52YWxpZEZpbGVcIiBjbGFzcz1cImVycm9yLW1zZ1wiPk9ubHkgaW1hZ2UgZmlsZXMgYXJlIHN1cHBvcnRlZCAhISE8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBpZD1cImJvZHlfa2V5ZGlhZ3JhbVwiIGNsYXNzPVwiYm94LWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBpZD1cImNhcm91c2VsLWV4YW1wbGUtZ2VuZXJpY1wiIGNsYXNzPVwiY2Fyb3VzZWwgc2xpZGUgc2Nyb2xsXCIgZGF0YS1pbnRlcnZhbD1cImZhbHNlXCIgZGF0YS1yaWRlPVwiY2Fyb3VzZWxcIlxyXG4gICAgICAgICAgICAgIGFjckR5bmFtaWNIZWlnaHREaXJlY3RpdmUgW2Nhcm91c2VsRWxlbWVudF09XCJzaW11bGF0b3JSZXN1bHRzQmxvY2tcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Fyb3VzZWwtaW5uZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRpYWdyYW0gb2Yga2V5RGlhZ3JhbXM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0gem9vbVwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogZGlhZ3JhbS5rZXlEaWFncmFtfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkcmFnLXNjcm9sbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgZHJhZy1zY3JvbGwtaXRlbSBpZD1cIm1hcF9pZF97eyBpIH19XCIgY2xhc3M9XCJpbWctcmVzcG9uc2l2ZSBpbWctZGVjaXNzaW9uVHJlZVwiIHNyYz1cInt7IGRpYWdyYW0ubG9jYXRpb24gfX1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2RyYWctc2Nyb2xsPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJrZXlEaWFncmFtcyAmJiBrZXlEaWFncmFtcy5sZW5ndGggPiAxXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImxlZnQgY2Fyb3VzZWwtY29udHJvbFwiIGhyZWY9XCIjY2Fyb3VzZWwtZXhhbXBsZS1nZW5lcmljXCIgZGF0YS1zbGlkZT1cInByZXZcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1hbmdsZS1sZWZ0IHNsaWRlLWxlZnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInJpZ2h0IGNhcm91c2VsLWNvbnRyb2xcIiBocmVmPVwiI2Nhcm91c2VsLWV4YW1wbGUtZ2VuZXJpY1wiIGRhdGEtc2xpZGU9XCJuZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtYW5nbGUtcmlnaHQgc2xpZGUtcmlnaHRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPmAsXHJcbiAgc3R5bGVzOiBbYGAsIGAucmVxdWlyZWQtZmllbGR7Y29sb3I6cmVkfS5wYWRkaW5nLWwtNXtwYWRkaW5nLWxlZnQ6NXB4fS53aGl0ZXNwYWNle21hcmdpbi1sZWZ0OjVweH0ubWF4LXctaC0xMDB7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jYXJvdXNlbC1jb250cm9sPi5mYXtmb250LXNpemU6NDBweDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO3otaW5kZXg6NTtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tdG9wOi0yMHB4fS5jYXJvdXNlbC1jb250cm9sLmxlZnR7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LmNhcm91c2VsLWNvbnRyb2wubGVmdCwuY2Fyb3VzZWwtY29udHJvbC5yaWdodHtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQscmdiYSgwLDAsMCwuMDAwMSkgMCxyZ2JhKDAsMCwwLC41KSAxMDAlKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0uc2Nyb2xse292ZXJmbG93LXk6c2Nyb2xsO292ZXJmbG93LXg6aGlkZGVufS5kaXYtc2ltdWxhdG9yLWZvcm0taGVpZ2h0e2hlaWdodDpjYWxjKDEwMHZoIC0gMTAwcHgpO292ZXJmbG93LXk6c2Nyb2xsO292ZXJmbG93LXg6aGlkZGVufS5kaXYtcmVwb3J0LXRleHQtc2Nyb2xse292ZXJmbG93LXg6aGlkZGVuO292ZXJmbG93LXk6YXV0bzttYXgtaGVpZ2h0OmNhbGMoMTAwdmggLSAzMDBweCl9LnBhZGRpbmctci0xMHtwYWRkaW5nLXJpZ2h0OjEwcHh9LnNsaWRlLWxlZnR7bGVmdDozMHB4fS5zbGlkZS1yaWdodHtyaWdodDozMHB4fWhye21hcmdpbi10b3A6MTBweDttYXJnaW4tYm90dG9tOjEwcHh9LndoaXRlLXNwYWNlLWxpbmV7d2hpdGUtc3BhY2U6cHJlLWxpbmU7d29yZC13cmFwOmJyZWFrLXdvcmR9cHttYXJnaW46MCAwIDEwcHh9LmZvcm0tY29udHJvbHtib3JkZXItcmFkaXVzOjA7Ym94LXNoYWRvdzpub25lO2JvcmRlci1jb2xvcjojZDJkNmRlfWg0Lm1vZGFsLXRpdGxlLmZsb2F0LWxlZnR7ZmxvYXQ6bGVmdH0ubWFyZ2luLWItMHttYXJnaW4tYm90dG9tOjB9LmZvbnQtd2VpZ2h0LTQwMHtmb250LXdlaWdodDo0MDB9LmN1c3RvbS1yYWRpby1zdHlsZXtmbG9hdDpsZWZ0O21hcmdpbi1yaWdodDoxNXB4fS56b29te3dpZHRoOjEwMCU7b3ZlcmZsb3c6YXV0b30uem9vbSBpbWd7aGVpZ2h0OmF1dG87d2lkdGg6MTAwJTttaW4td2lkdGg6MTAwJTttYXgtd2lkdGg6aW5oZXJpdCFpbXBvcnRhbnR9LmJ0bi16b29te2JhY2tncm91bmQtY29sb3I6I2Y0ZjRmNDtjb2xvcjojNDQ0O2JvcmRlci1jb2xvcjojZGRkfS5idG4tem9vbS5ob3ZlciwuYnRuLXpvb206YWN0aXZlLC5idG4tem9vbTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlN2U3ZTd9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpe2xhYmVsLmNvbnRyb2wtbGFiZWx7cGFkZGluZy1sZWZ0OjIwcHh9fS5wYWRkaW5nLTV7cGFkZGluZzo1cHh9YF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEFjckFzc2lzdFNpbXVsYXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgdGVtcGxhdGVDb250ZW50OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgaW1hZ2VQYXRoOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc2hvd0tleURpYWdyYW06IGJvb2xlYW47XHJcbiAgQElucHV0KCkgcmVwb3J0VGV4dFBvc2l0aW9uOiBSZXBvcnRUZXh0UG9zaXRpb247XHJcbiAgQElucHV0KCkgaW5wdXRWYWx1ZXM6IElucHV0RGF0YVtdID0gW107XHJcbiAgQElucHV0KCkgaW5wdXREYXRhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcmVzZXRCdXR0b246IEJvb2xlYW4gPSB0cnVlO1xyXG4gIEBPdXRwdXQoKSByZXR1cm5FeGVjdXRpb25IaXN0b3J5OiBFdmVudEVtaXR0ZXI8RmluYWxFeGVjdXRlZEhpc3Rvcnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaW5hbEV4ZWN1dGVkSGlzdG9yeT4oKTtcclxuICBAT3V0cHV0KCkgcmV0dXJuRGF0YUVsZW1lbnRDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8SW5wdXREYXRhW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxJbnB1dERhdGFbXT4oKTtcclxuICBAT3V0cHV0KCkgcmV0dXJuRGVmYXVsdEVsZW1lbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBWaWV3Q2hpbGQoJ2ltYWdlVXBsb2FkJykgaW1hZ2VVcGxvYWQ6IGFueTtcclxuICB0ZW1wbGF0ZTogVGVtcGxhdGU7XHJcbiAgaXNFbXB0eUNvbnRlbnQ6IGJvb2xlYW47XHJcbiAga2V5RGlhZ3JhbXM6IERpYWdyYW1bXTtcclxuICByZXN1bHRUZXh0OiBNYWluUmVwb3J0VGV4dDtcclxuICBpc1Jlc2V0OiBib29sZWFuO1xyXG4gIGRhdGFFbGVtZW50czogQmFzZURhdGFFbGVtZW50W107XHJcbiAgcG9zaXRpb24gPSBSZXBvcnRUZXh0UG9zaXRpb247XHJcbiAgaXNJbnZhbGlkRmlsZTogYm9vbGVhbjtcclxuICBhY2NlcHRlZEZpbGVUeXBlcyA9IFsnaW1hZ2UvcG5nJywgJ2ltYWdlL2dpZicsICdpbWFnZS9qcGcnLCAnaW1hZ2UvanBlZyddO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRlbXBsYXRlTWFuYWdlclNlcnZpY2U6IFRlbXBsYXRlTWFuYWdlclNlcnZpY2UsIHByaXZhdGUgc2ltdWxhdG9yRW5naW5lU2VydmljZTogU2ltdWxhdG9yRW5naW5lU2VydmljZSkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5pc1Jlc2V0ID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNFbXB0eUNvbnRlbnQgPSB0aGlzLnRlbXBsYXRlQ29udGVudCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudGVtcGxhdGVDb250ZW50Lmxlbmd0aCA9PT0gMCAmJiB0aGlzLmlucHV0VmFsdWVzLmxlbmd0aCA9PT0gMCAmJlxyXG4gICAgICB0aGlzLmlucHV0RGF0YSA9PT0gdW5kZWZpbmVkO1xyXG4gICAgaWYgKHRoaXMuaXNFbXB0eUNvbnRlbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaW5wdXREYXRhICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKHRoaXMuaW5wdXREYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLmlucHV0VmFsdWVzID0gSlNPTi5wYXJzZSh0aGlzLmlucHV0RGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLmltYWdlVXBsb2FkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5pbWFnZVVwbG9hZC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVNYW5hZ2VyU2VydmljZS5nZXRUZW1wbGF0ZSh0aGlzLnRlbXBsYXRlQ29udGVudCk7XHJcbiAgICAvLyB0aGlzLnNpbXVsYXRvckVuZ2luZVNlcnZpY2UuaW5pdGlhbGl6ZSh0aGlzLnRlbXBsYXRlKTtcclxuICAgIGlmICh0aGlzLmlucHV0VmFsdWVzLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICB0aGlzLnBvcHVsYXRlVGVzdENhc2VEYXRhKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNpbXVsYXRvckVuZ2luZVNlcnZpY2UuaW5pdGlhbGl6ZSh0aGlzLnRlbXBsYXRlKTtcclxuICAgIHRoaXMuZGF0YUVsZW1lbnRzID0gdGhpcy50ZW1wbGF0ZS5kYXRhRWxlbWVudHM7XHJcbiAgICB0aGlzLmtleURpYWdyYW1zID0gbmV3IEFycmF5PERpYWdyYW0+KCk7XHJcblxyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMudGVtcGxhdGUubWV0YWRhdGEuZGlhZ3JhbXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBuZXcgRGlhZ3JhbSgpO1xyXG4gICAgICBlbGVtZW50LmxhYmVsID0gdGhpcy50ZW1wbGF0ZS5tZXRhZGF0YS5kaWFncmFtc1tpbmRleF0ubGFiZWw7XHJcbiAgICAgIGVsZW1lbnQubG9jYXRpb24gPSB0aGlzLmltYWdlUGF0aCArICcvJyArIHRoaXMudGVtcGxhdGUubWV0YWRhdGEuZGlhZ3JhbXNbaW5kZXhdLmxvY2F0aW9uO1xyXG4gICAgICBlbGVtZW50LmtleURpYWdyYW0gPSB0aGlzLnRlbXBsYXRlLm1ldGFkYXRhLmRpYWdyYW1zW2luZGV4XS5rZXlEaWFncmFtO1xyXG4gICAgICB0aGlzLmtleURpYWdyYW1zLnB1c2goZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXN1bHRUZXh0ID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRFbGVtZW50cygpIHtcclxuICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlTWFuYWdlclNlcnZpY2UuZ2V0VGVtcGxhdGUodGhpcy50ZW1wbGF0ZUNvbnRlbnQpO1xyXG4gICAgdGhpcy5zaW11bGF0b3JFbmdpbmVTZXJ2aWNlLmluaXRpYWxpemUodGhpcy50ZW1wbGF0ZSk7XHJcbiAgICB0aGlzLmRhdGFFbGVtZW50cyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMudGVtcGxhdGUuZGF0YUVsZW1lbnRzKTtcclxuICAgIHRoaXMucmVzdWx0VGV4dCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMucmV0dXJuRGVmYXVsdEVsZW1lbnRzLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHJlY2lldmVSZXBvcnRUZXh0KHRleHRSZXBvcnQ6IE1haW5SZXBvcnRUZXh0KSB7XHJcbiAgICB0aGlzLnJlc3VsdFRleHQgPSB0ZXh0UmVwb3J0O1xyXG4gIH1cclxuXHJcbiAgcmVjaWV2ZWRFeGVjdXRpb25IaXN0b3J5KGZpbmFsRXhlY3V0aW9uSGlzdG9yeTogRmluYWxFeGVjdXRlZEhpc3RvcnkpIHtcclxuICAgIHRoaXMucmV0dXJuRXhlY3V0aW9uSGlzdG9yeS5lbWl0KGZpbmFsRXhlY3V0aW9uSGlzdG9yeSk7XHJcbiAgfVxyXG4gIHJlY2l2ZWRPbkRhdGFFbGVtZW50Q2hhbmdlZChkYXRhOiBJbnB1dERhdGFbXSkge1xyXG4gICAgdGhpcy5yZXR1cm5EYXRhRWxlbWVudENoYW5nZWQuZW1pdChkYXRhKTtcclxuICB9XHJcblxyXG4gIGNoYW5nZUxpc3RlbmVyKGV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLmlzSW52YWxpZEZpbGUgPSBmYWxzZTtcclxuICAgIHRoaXMua2V5RGlhZ3JhbXMgPSBuZXcgQXJyYXk8RGlhZ3JhbT4oKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50LnRhcmdldC5maWxlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICBjb25zdCBkaWFncmFtID0gbmV3IERpYWdyYW0oKTtcclxuICAgICAgZGlhZ3JhbS5sYWJlbCA9IGV2ZW50LnRhcmdldC5maWxlc1tpXS5uYW1lO1xyXG4gICAgICBkaWFncmFtLmtleURpYWdyYW0gPSBpID09PSAwID8gdHJ1ZSA6IGZhbHNlO1xyXG5cclxuICAgICAgaWYgKCEodGhpcy5hY2NlcHRlZEZpbGVUeXBlcy5pbmRleE9mKGV2ZW50LnRhcmdldC5maWxlc1tpXS50eXBlKSA+IC0xKSkge1xyXG4gICAgICAgIHRoaXMuaXNJbnZhbGlkRmlsZSA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQxOiBhbnkpID0+IHtcclxuICAgICAgICBkaWFncmFtLmxvY2F0aW9uID0gcmVhZGVyLnJlc3VsdC50b1N0cmluZygpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZXZlbnQudGFyZ2V0LmZpbGVzW2ldKTtcclxuXHJcbiAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoZXZlbnQxOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmtleURpYWdyYW1zLnB1c2goZGlhZ3JhbSk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb2xsYXBzZUtleURpYWdyYW0oKSB7XHJcbiAgICBpZiAoJCgnI2ljb25fa2V5ZGlhZ3JhbScpLmhhc0NsYXNzKCdmYSBmYS1taW51cycpKSB7XHJcbiAgICAgICQoJyNpY29uX2tleWRpYWdyYW0nKS5yZW1vdmVDbGFzcygnZmEgZmEtbWludXMnKTtcclxuICAgICAgJCgnI2ljb25fa2V5ZGlhZ3JhbScpLmFkZENsYXNzKCdmYSBmYS1wbHVzJyk7XHJcbiAgICAgICQoJyNib2R5X2tleWRpYWdyYW0nKS5jc3Moe1xyXG4gICAgICAgICdkaXNwbGF5JzogJ25vbmUnXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgJCgnI2ljb25fa2V5ZGlhZ3JhbScpLnJlbW92ZUNsYXNzKCdmYSBmYS1wbHVzJyk7XHJcbiAgICAgICQoJyNpY29uX2tleWRpYWdyYW0nKS5hZGRDbGFzcygnZmEgZmEtbWludXMnKTtcclxuICAgICAgJCgnI2JvZHlfa2V5ZGlhZ3JhbScpLnJlbW92ZUF0dHIoJ3N0eWxlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb2xsYXBzZVJlcG9ydFRleHQoKSB7XHJcbiAgICBpZiAoJCgnI2ljb25fcmVwb3J0dGV4dCcpLmhhc0NsYXNzKCdmYSBmYS1taW51cycpKSB7XHJcbiAgICAgICQoJyNpY29uX3JlcG9ydHRleHQnKS5yZW1vdmVDbGFzcygnZmEgZmEtbWludXMnKTtcclxuICAgICAgJCgnI2ljb25fcmVwb3J0dGV4dCcpLmFkZENsYXNzKCdmYSBmYS1wbHVzJyk7XHJcbiAgICAgICQoJyNib2R5X3JlcG9ydHRleHQnKS5jc3Moe1xyXG4gICAgICAgICdkaXNwbGF5JzogJ25vbmUnXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgJCgnI2ljb25fcmVwb3J0dGV4dCcpLnJlbW92ZUNsYXNzKCdmYSBmYS1wbHVzJyk7XHJcbiAgICAgICQoJyNpY29uX3JlcG9ydHRleHQnKS5hZGRDbGFzcygnZmEgZmEtbWludXMnKTtcclxuICAgICAgJCgnI2JvZHlfcmVwb3J0dGV4dCcpLnJlbW92ZUF0dHIoJ3N0eWxlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwb3B1bGF0ZVRlc3RDYXNlRGF0YSgpIHtcclxuICAgIHRoaXMudGVtcGxhdGUuZGF0YUVsZW1lbnRzLmZvckVhY2goZGF0YWVFbGVtZW50ID0+IHtcclxuICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IHRoaXMuaW5wdXRWYWx1ZXMuZmlsdGVyKHggPT4geC5kYXRhRWxlbWVudElkLnRvVXBwZXJDYXNlKCkgPT09IGRhdGFlRWxlbWVudC5pZC50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgaWYgKGlucHV0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiBpbnB1dFZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBpZiAoZGF0YWVFbGVtZW50LmRhdGFFbGVtZW50VHlwZSA9PT0gJ0Nob2ljZURhdGFFbGVtZW50JyB8fCBkYXRhZUVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09PSAnTXVsdGlDaG9pY2VEYXRhRWxlbWVudCcpIHtcclxuICAgICAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSA8Q2hvaWNlRGF0YUVsZW1lbnQ+ZGF0YWVFbGVtZW50O1xyXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXRWYWx1ZVswXS5kYXRhRWxlbWVudFZhbHVlKSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcclxuICAgICAgICAgICAgY2hvaWNlRWxlbWVudC5jaG9pY2VJbmZvLmZvckVhY2goY2hvaWNlID0+IHtcclxuICAgICAgICAgICAgICBpbnB1dFZhbHVlWzBdLmRhdGFFbGVtZW50VmFsdWUuZm9yRWFjaCh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hvaWNlLnZhbHVlLnRvVXBwZXJDYXNlKCkgPT09IHZhbHVlLnRvVXBwZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goY2hvaWNlLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlucHV0VmFsdWVbMF0uZGF0YUVsZW1lbnRWYWx1ZSA9IHZhbHVlcztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNob2ljZUVsZW1lbnQuY2hvaWNlSW5mby5mb3JFYWNoKGNob2ljZSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChpbnB1dFZhbHVlWzBdLmRhdGFFbGVtZW50VmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNob2ljZS52YWx1ZS50b1VwcGVyQ2FzZSgpID09PSBpbnB1dFZhbHVlWzBdLmRhdGFFbGVtZW50VmFsdWUudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlWzBdLmRhdGFFbGVtZW50VmFsdWUgPSBjaG9pY2UudmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0YWVFbGVtZW50LmN1cnJlbnRWYWx1ZSA9IGlucHV0VmFsdWVbMF0uZGF0YUVsZW1lbnRWYWx1ZTtcclxuXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb2RpbmcgfSBmcm9tICcuL2NvZGluZy5tb2RlbCc7XHJcblxyXG5leHBvcnQgY2xhc3MgQ29kYWJsZUNvbmNlcHQge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgY29kaW5nOiBDb2RpbmdbXTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmNvZGluZyA9IG5ldyBBcnJheTxDb2Rpbmc+KCk7XHJcbiAgICB9XHJcbn1cclxuIiwiZXhwb3J0IGNsYXNzIENvZGluZ1N5c3RlbSB7XHJcbiAgICBlbGVtZW50OiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBDb2RpbmdWZXJzaW9uIHtcclxuICAgIGVsZW1lbnQ6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbn0iLCJleHBvcnQgY2xhc3MgQ29kaW5nQ29kZSB7XHJcbiAgICBlbGVtZW50OiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG59IiwiZXhwb3J0IGNsYXNzIENvZGluZ0Rpc3BsYXkge1xyXG4gICAgZWxlbWVudDogc3RyaW5nO1xyXG4gICAgdmFsdWU6IHN0cmluZztcclxufVxyXG4iLCJleHBvcnQgY2xhc3MgQ29kaW5nVXNlclNlbGVjdGVkIHtcclxuICAgIGVsZW1lbnQ6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29kaW5nU3lzdGVtIH0gZnJvbSAnLi9jb2RpbmdTeXN0ZW0ubW9kZWwnO1xyXG5pbXBvcnQgeyBDb2RpbmdWZXJzaW9uIH0gZnJvbSAnLi9jb2RpbmcudmVyc2lvbic7XHJcbmltcG9ydCB7IENvZGluZ0NvZGUgfSBmcm9tICcuL2NvZGluZ0NvZGUubW9kZWwnO1xyXG5pbXBvcnQgeyBDb2RpbmdEaXNwbGF5IH0gZnJvbSAnLi9jb2RpbmdEaXNwbGF5Lm1vZGVsJztcclxuaW1wb3J0IHsgQ29kaW5nVXNlclNlbGVjdGVkIH0gZnJvbSAnLi9jb2RpbmdVc2VyU2VsZWN0ZWQubW9kZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvZGluZyB7XHJcbiAgICBjb2RpbmdTeXN0ZW06IENvZGluZ1N5c3RlbTtcclxuICAgIGNvZGluZ1ZlcnNpb246IENvZGluZ1ZlcnNpb247XHJcbiAgICBjb2RpbmdDb2RlOiBDb2RpbmdDb2RlO1xyXG4gICAgY29kaW5nRGlzcGxheTogQ29kaW5nRGlzcGxheTtcclxuICAgIGNvZGluZ1VzZXJTZWxlY3RlZDogQ29kaW5nVXNlclNlbGVjdGVkO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgdGhpcy5jb2RpbmdTeXN0ZW0gPSBuZXcgQ29kaW5nU3lzdGVtKCk7XHJcbiAgICAgICB0aGlzLmNvZGluZ1ZlcnNpb24gPSBuZXcgQ29kaW5nVmVyc2lvbigpO1xyXG4gICAgICAgdGhpcy5jb2RpbmdDb2RlID0gbmV3IENvZGluZ0NvZGUoKTtcclxuICAgICAgIHRoaXMuY29kaW5nRGlzcGxheSA9IG5ldyBDb2RpbmdEaXNwbGF5KCk7XHJcbiAgICAgICB0aGlzLmNvZGluZ1VzZXJTZWxlY3RlZCA9IG5ldyBDb2RpbmdVc2VyU2VsZWN0ZWQoKTtcclxuICAgIH1cclxufVxyXG5cclxuIiwiaW1wb3J0IHsgRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL2RhdGFlbGVtZW50LWNyZWF0aW9uLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9iYXNlLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IENob2ljZURhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLWRhdGEtZWxlbWVudC1tb2RlbCc7XHJcbmltcG9ydCB7IERpYWdyYW0gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9kaWFncmFtLm1vZGVsJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEaWFncmFtU2VydmljZSB9IGZyb20gJy4vZGlhZ3JhbS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29kYWJsZUNvbmNlcHQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9jb2RhYmxlQ29uY2VwdC5tb2RlbCc7XHJcbmltcG9ydCB7IENvZGluZyB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2NvZGluZy5tb2RlbCc7XHJcbmltcG9ydCB7IENvZGluZ1N5c3RlbSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2NvZGluZ1N5c3RlbS5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2UgaW1wbGVtZW50cyBEYXRhRWxlbWVudENyZWF0aW9uU2VydmljZSB7XHJcbiAgZWxlbWVudFR5cGU6IHN0cmluZztcclxuICBhYnN0cmFjdCBjcmVhdGVFbGVtZW50KGRhdGE6IGFueSk6IEJhc2VEYXRhRWxlbWVudDtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRpYWdyYW1TZXJ2aWNlOiBEaWFncmFtU2VydmljZSkge1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmV0dXJuRGlhZ3JhbShkaWFncmFtSlNPTjogYW55KTogRGlhZ3JhbSB7XHJcbiAgICBjb25zdCBtZXRhZGF0YURpYWdyYW0gPSBuZXcgRGlhZ3JhbSgpO1xyXG4gICAgbWV0YWRhdGFEaWFncmFtLmRpc3BsYXlTZXF1ZW5jZSA9IGRpYWdyYW1KU09OLkF0dHIuRGlzcGxheVNlcXVlbmNlO1xyXG4gICAgbWV0YWRhdGFEaWFncmFtLmtleURpYWdyYW0gPSBkaWFncmFtSlNPTi5BdHRyLklzS2V5RGlhZ3JhbSA/IGRpYWdyYW1KU09OLkF0dHIuSXNLZXlEaWFncmFtIDogZmFsc2U7XHJcbiAgICBtZXRhZGF0YURpYWdyYW0ubGFiZWwgPSBkaWFncmFtSlNPTi5MYWJlbDtcclxuICAgIG1ldGFkYXRhRGlhZ3JhbS5sb2NhdGlvbiA9IGRpYWdyYW1KU09OLkxvY2F0aW9uO1xyXG4gICAgcmV0dXJuIG1ldGFkYXRhRGlhZ3JhbTtcclxuICB9XHJcblxyXG4gIHBvcHVsYXRlQmFzaWNEYXRhKGRhdGE6IGFueSwgZGF0YUVsZW1lbnQ6IEJhc2VEYXRhRWxlbWVudCkge1xyXG4gICAgZGF0YUVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID0gdGhpcy5lbGVtZW50VHlwZTtcclxuICAgIGRhdGFFbGVtZW50LmRpc3BsYXlTZXF1ZW5jZSA9IGRhdGEuQXR0ci5EaXNwbGF5U2VxdWVuY2U7XHJcbiAgICBkYXRhRWxlbWVudC5pZCA9IGRhdGEuQXR0ci5JZDtcclxuICAgIGRhdGFFbGVtZW50LmlzUmVxdWlyZWQgPSBkYXRhLkF0dHIuSXNSZXF1aXJlZCA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgZGF0YUVsZW1lbnQubGFiZWwgPSBkYXRhLkxhYmVsO1xyXG4gICAgZGF0YUVsZW1lbnQuaGludCA9IGRhdGEuSGludDtcclxuICAgIGRhdGFFbGVtZW50LmNkZUlkID0gZGF0YS5BdHRyLkNkZUlkO1xyXG4gICAgaWYgKGRhdGEuRGlhZ3JhbXMpIHtcclxuICAgICAgZGF0YUVsZW1lbnQuZGlhZ3JhbXMgPSB0aGlzLmRpYWdyYW1TZXJ2aWNlLnJldHVybkRpYWdyYW1zKGRhdGEuRGlhZ3JhbXMuRGlhZ3JhbSk7XHJcbiAgICB9XHJcbiAgICBkYXRhRWxlbWVudC5jdXJyZW50VmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICBkYXRhRWxlbWVudC5kZWZhdWx0VmFsdWUgPSB1bmRlZmluZWQ7XHJcbiAgICBkYXRhRWxlbWVudC5pc0VkaXRhYmxlID0gZGF0YS5BdHRyLkVkaXRhYmxlID09PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xyXG4gICAgZGF0YUVsZW1lbnQuaGFzcHJlZmlsbGVkID0gZGF0YS5BdHRyLkhhc3ByZWZpbGxlZCA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgZGF0YUVsZW1lbnQub3V0cHV0ID0gZGF0YS5BdHRyLk91dHB1dCA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgZGF0YUVsZW1lbnQudW5pdCA9IGRhdGEuQXR0ci5Vbml0ICE9PSB1bmRlZmluZWQgPyBkYXRhLkF0dHIuVW5pdCA6ICcnO1xyXG4gICAgZGF0YUVsZW1lbnQuc291cmNlRmlsbGVkID0gZGF0YS5BdHRyLlNvdXJjZUZpbGxlZDtcclxuXHJcbiAgICBkYXRhRWxlbWVudC5kaXNwbGF5U2VxdWVuY2VPdmVycmlkZXIgPSBkYXRhLkF0dHIuRGlzcGxheVNlcXVlbmNlO1xyXG4gICAgZGF0YUVsZW1lbnQuaXNSZXF1aXJlZE92ZXJyaWRlciA9IGRhdGEuQXR0ci5Jc1JlcXVpcmVkID09PSAndHJ1ZScgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgaWYgKGRhdGEuQ29kYWJsZUNvbmNlcHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBkYXRhRWxlbWVudC5jb2RhYmxlQ29uY2VwdCA9IG5ldyBDb2RhYmxlQ29uY2VwdCgpO1xyXG4gICAgICBkYXRhRWxlbWVudC5jb2RhYmxlQ29uY2VwdC5uYW1lID0gZGF0YS5Db2RhYmxlQ29uY2VwdC5BdHRyLk5hbWU7XHJcbiAgICAgIGlmIChkYXRhLkNvZGFibGVDb25jZXB0LkNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGRhdGEuQ29kYWJsZUNvbmNlcHQuQ29kaW5nLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNvZGluZyBvZiBkYXRhLkNvZGFibGVDb25jZXB0LkNvZGluZykge1xyXG4gICAgICAgICAgY29uc3QgX2NvZGluZyA9IG5ldyBDb2RpbmcoKTtcclxuICAgICAgICAgIF9jb2RpbmcuY29kaW5nU3lzdGVtLnZhbHVlID0gY29kaW5nLlN5c3RlbS5BdHRyLlZhbHVlO1xyXG4gICAgICAgICAgX2NvZGluZy5jb2RpbmdWZXJzaW9uLnZhbHVlID0gY29kaW5nLlZlcnNpb24uQXR0ci5WYWx1ZTtcclxuICAgICAgICAgIF9jb2RpbmcuY29kaW5nQ29kZS52YWx1ZSA9IGNvZGluZy5Db2RlLkF0dHIuVmFsdWU7XHJcbiAgICAgICAgICBfY29kaW5nLmNvZGluZ0Rpc3BsYXkudmFsdWUgPSBjb2RpbmcuRGlzcGxheS5BdHRyLlZhbHVlO1xyXG4gICAgICAgICAgLy8gaWYgKGNvZGluZy5Vc2VyU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBfY29kaW5nLmNvZGluZ1VzZXJTZWxlY3RlZC52YWx1ZSA9IGNvZGluZy5Vc2VyU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCA/IGNvZGluZy5Vc2VyU2VsZWN0ZWQuQXR0ci5WYWx1ZSA6IG51bGw7XHJcbiAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgZGF0YUVsZW1lbnQuY29kYWJsZUNvbmNlcHQuY29kaW5nLnB1c2goX2NvZGluZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IERpYWdyYW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvZGlhZ3JhbS5tb2RlbCc7XHJcbmltcG9ydCB7IENvbmRpdGlvbmFsUHJvcGVydHkgfSBmcm9tICcuL2NvbmRpdGlvbmFscHJvcGVydHkubW9kZWwnO1xyXG5pbXBvcnQgeyBDb2RhYmxlQ29uY2VwdCB9IGZyb20gJy4vY29kYWJsZUNvbmNlcHQubW9kZWwnO1xyXG5cclxuZXhwb3J0ICBjbGFzcyBCYXNlRGF0YUVsZW1lbnQge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgaXNSZXF1aXJlZDogQm9vbGVhbiA9IHRydWU7XHJcbiAgZGlzcGxheVNlcXVlbmNlOiBudW1iZXI7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBoaW50OiBzdHJpbmc7XHJcbiAgZGlhZ3JhbXM6IERpYWdyYW1bXTtcclxuICB2b2ljZUNvbW1hbmQ6IFN0cmluZztcclxuICBjdXJyZW50VmFsdWU6IGFueTtcclxuICBkYXRhRWxlbWVudFR5cGU6IHN0cmluZztcclxuICBpc1Zpc2libGU6IEJvb2xlYW4gPSB0cnVlO1xyXG4gIGRlZmF1bHRWYWx1ZTogYW55O1xyXG4gIGNkZUlkOiBzdHJpbmc7XHJcbiAgY29uZGl0aW9uYWxQcm9wZXJ0aWVzOiBDb25kaXRpb25hbFByb3BlcnR5W107XHJcbiAgaXNFZGl0YWJsZTogQm9vbGVhbiA9IHRydWU7XHJcbiAgaGFzcHJlZmlsbGVkOiBCb29sZWFuID0gZmFsc2U7XHJcbiAgb3V0cHV0OiBCb29sZWFuID0gZmFsc2U7XHJcbiAgdW5pdDogc3RyaW5nO1xyXG4gIHNvdXJjZUZpbGxlZDogc3RyaW5nO1xyXG4gIGNvZGFibGVDb25jZXB0OiBDb2RhYmxlQ29uY2VwdDtcclxuXHJcbiAgaXNSZXF1aXJlZE92ZXJyaWRlcjogQm9vbGVhbiA9IHRydWU7XHJcbiAgZGlzcGxheVNlcXVlbmNlT3ZlcnJpZGVyOiBudW1iZXI7XHJcbn1cclxuIiwiaW1wb3J0IHsgQmFzZURhdGFFbGVtZW50IH0gZnJvbSAnLi9iYXNlLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEltYWdlTWFwIH0gZnJvbSAnLi9pbWFnZS1tYXAubW9kZWwnO1xyXG5pbXBvcnQgeyBDaG9pY2VJbmZvIH0gZnJvbSAnLi9jaG9pY2VJbmZvLm1vZGVsJztcclxuaW1wb3J0IHsgQ2hvaWNlIH0gZnJvbSAnLi9jaG9pY2UubW9kZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIENob2ljZURhdGFFbGVtZW50IGV4dGVuZHMgQmFzZURhdGFFbGVtZW50ICB7XHJcblxyXG4gIGNob2ljZUluZm86IENob2ljZVtdO1xyXG4gIGltYWdlTWFwOiBJbWFnZU1hcDtcclxuICBhbGxvd0ZyZWV0ZXh0ID0gZmFsc2U7XHJcbiAgQ2hvaWNlTm90UmVsZXZhbnQ6IHN0cmluZ1tdO1xyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBDaG9pY2Uge1xyXG5cclxuICAgIGxhYmVsOiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gICAgZGVmYXVsdDogYm9vbGVhbjtcclxuICAgIGhpbnQ6IHN0cmluZztcclxuICAgIHJlcG9ydFRleHQ6IHN0cmluZztcclxufVxyXG4iLCJleHBvcnQgY2xhc3MgSW1hZ2VFbGVtZW50cyB7XHJcbiAgbG9jYXRpb246IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBJbWFnZUVsZW1lbnRzIH0gZnJvbSAnLi9pbWFnZS1lbGVtZW50cy5tb2RlbCc7XHJcbmltcG9ydCB7IERyYXdTdHlsZSB9IGZyb20gJy4vZHJhd1N0eWxlLm1vZGVsJztcclxuaW1wb3J0IHtBcmVhTWFwfSBmcm9tICcuL2FyZWEtbWFwLm1vZGVsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBJbWFnZU1hcCBleHRlbmRzIEltYWdlRWxlbWVudHMge1xyXG5cclxuICBkcmF3U3R5bGU6IERyYXdTdHlsZTtcclxuICBtYXA6IEFyZWFNYXA7XHJcblxyXG4gIH1cclxuIiwiXHJcblxyXG5leHBvcnQgY2xhc3MgQXJlYSB7XHJcbiAgc2hhcGU6IHN0cmluZztcclxuICBjb29yZHM6IHN0cmluZztcclxuICBjaG9pY2VWYWx1ZTogc3RyaW5nO1xyXG59XHJcbiIsImltcG9ydCB7IEFyZWEgfSBmcm9tICcuL2FyZWEtbW9kZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFyZWFNYXAge1xyXG4gICAgYXJlYXM6IEFyZWFbXTtcclxufVxyXG4iLCJpbXBvcnQgeyBOb3RSZWxldmFudERhdGFFbGVtZW50cyB9IGZyb20gJy4uLy4uL21vZGVscy9ub3RyZWxldmFudGRhdGFlbGVtZW50cy5tb2RlbCc7XHJcbmltcG9ydCB7IENvbXBvc2l0ZUNvbmRpdGlvbiB9IGZyb20gJy4uLy4uL2NvbXBvc2l0ZS1jb25kaXRpb24nO1xyXG5pbXBvcnQgeyBDb25kaXRpb24gfSBmcm9tICcuLi8uLi9jb25kaXRpb24nO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbmFsUHJvcGVydHkge1xyXG4gICAgbm90UmVsZXZhbnREYXRhRWxlbWVudHM6IE5vdFJlbGV2YW50RGF0YUVsZW1lbnRzO1xyXG4gICAgY29tcG9zaXRlQ29uZGl0aW9uOiBDb21wb3NpdGVDb25kaXRpb247XHJcbiAgICBjb25kaXRpb246IENvbmRpdGlvbjtcclxuICAgIGlzUmVsZXZhbnQ6IGJvb2xlYW47XHJcbiAgICBpc1JlcXVpcmVkOiBib29sZWFuO1xyXG4gICAgRGlzcGxheVNlcXVlbmNlOiBudW1iZXI7XHJcbiAgICBDaG9pY2VOb3RSZWxldmFudDogc3RyaW5nW107XHJcbiAgICBNaW5pbXVtOiBudW1iZXI7XHJcbiAgICBNYXhpbXVtOiBudW1iZXI7XHJcbiAgICBNaW5pbXVtRGF5OiBudW1iZXI7XHJcbiAgICBNYXhpbXVtRGF5OiBudW1iZXI7XHJcbiAgICBNaW5pbXVtSG91cnM6IG51bWJlcjtcclxuICAgIE1heGltdW1Ib3VyczogbnVtYmVyO1xyXG4gICAgTWluaW11bU1pbnV0ZXM6IG51bWJlcjtcclxuICAgIE1heG1pbXVtTWludXRlczogbnVtYmVyO1xyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGF0YUVsZW1lbnRDcmVhdGlvbkJhc2VTZXJ2aWNlIH0gZnJvbSAnLi9kYXRhLWVsZW1lbnQtY3JlYXRpb24tYmFzZS1zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGlhZ3JhbVNlcnZpY2UgfSBmcm9tICcuL2RpYWdyYW0uc2VydmljZSc7XHJcbmltcG9ydCB7IENob2ljZURhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLWRhdGEtZWxlbWVudC1tb2RlbCc7XHJcbmltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgQ2hvaWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLm1vZGVsJztcclxuaW1wb3J0IHsgSW1hZ2VNYXAgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9pbWFnZS1tYXAubW9kZWwnO1xyXG5pbXBvcnQgeyBBcmVhIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvYXJlYS1tb2RlbCc7XHJcbmltcG9ydCB7IEFyZWFNYXAgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9hcmVhLW1hcC5tb2RlbCc7XHJcbmltcG9ydCB7IEFycmF5Q2hlY2tlclNlcnZpY2UgfSBmcm9tICcuL2FycmF5LWNoZWNrZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE5vdFJlbGV2YW50RGF0YUVsZW1lbnRzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvbm90cmVsZXZhbnRkYXRhZWxlbWVudHMubW9kZWwnO1xyXG5pbXBvcnQgeyBDb25kaXRpb25hbFByb3BlcnR5IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY29uZGl0aW9uYWxwcm9wZXJ0eS5tb2RlbCc7XHJcbmltcG9ydCB7IENvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL2NvbmRpdGlvbnMtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXB1dGVkVmFsdWVDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL2NvbXB1dGVkLXZhbHVlLWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCcmFuY2ggfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9icmFuY2gubW9kZWwnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ2hvaWNlRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2UgZXh0ZW5kcyBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3RvcihkaWFncmFtU2VydmljZTogRGlhZ3JhbVNlcnZpY2UsIHByaXZhdGUgYXJyYXlDaGVja2VyU2VydmljZTogQXJyYXlDaGVja2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZTogQ29uZGl0aW9uc0NyZWF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgY29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZTogQ29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZVxyXG4gICkge1xyXG4gICAgc3VwZXIoZGlhZ3JhbVNlcnZpY2UpO1xyXG4gICAgdGhpcy5lbGVtZW50VHlwZSA9ICdDaG9pY2VEYXRhRWxlbWVudCc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJldHVybkNob2ljZShjaG9pY2VJdGVtOiBhbnkpOiBDaG9pY2Uge1xyXG4gICAgY29uc3QgY2hvaWNlID0gbmV3IENob2ljZSgpO1xyXG4gICAgY2hvaWNlLmxhYmVsID0gY2hvaWNlSXRlbS5MYWJlbDtcclxuICAgIGNob2ljZS52YWx1ZSA9IGNob2ljZUl0ZW0uVmFsdWU7XHJcbiAgICBjaG9pY2UuaGludCA9IGNob2ljZUl0ZW0uSGludDtcclxuICAgIGNob2ljZS5yZXBvcnRUZXh0ID0gY2hvaWNlSXRlbS5SZXBvcnRUZXh0O1xyXG4gICAgY2hvaWNlLmRlZmF1bHQgPSBmYWxzZTtcclxuICAgIGlmIChjaG9pY2VJdGVtLkF0dHIgJiYgY2hvaWNlSXRlbS5BdHRyLklzRGVmYXVsdCkge1xyXG4gICAgICBjaG9pY2UuZGVmYXVsdCA9IGNob2ljZUl0ZW0uQXR0ci5Jc0RlZmF1bHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hvaWNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXR1cm5BcmVhKGFyZWFKU09OOiBhbnkpOiBBcmVhIHtcclxuICAgIGNvbnN0IGFyZWEgPSBuZXcgQXJlYSgpO1xyXG4gICAgYXJlYS5jaG9pY2VWYWx1ZSA9IGFyZWFKU09OLkF0dHIuQ2hvaWNlVmFsdWU7XHJcbiAgICBhcmVhLmNvb3JkcyA9IGFyZWFKU09OLkF0dHIuQ29vcmRzO1xyXG4gICAgYXJlYS5zaGFwZSA9IGFyZWFKU09OLkF0dHIuU2hhcGU7XHJcbiAgICByZXR1cm4gYXJlYTtcclxuICB9XHJcblxyXG5cclxuICBjcmVhdGVFbGVtZW50KGRhdGE6IGFueSk6IEJhc2VEYXRhRWxlbWVudCB7XHJcbiAgICBjb25zdCBkYXRhRWxlbWVudCA9IG5ldyBDaG9pY2VEYXRhRWxlbWVudCgpO1xyXG4gICAgc3VwZXIucG9wdWxhdGVCYXNpY0RhdGEoZGF0YSwgZGF0YUVsZW1lbnQpO1xyXG4gICAgZGF0YUVsZW1lbnQuYWxsb3dGcmVldGV4dCA9IGRhdGEuQXR0ci5BbGxvd0ZyZWV0ZXh0ID8gZGF0YS5BdHRyLkFsbG93RnJlZXRleHQgOiBmYWxzZTtcclxuICAgIGNvbnN0IGNob2ljZUl0ZW1zID0gZGF0YS5DaG9pY2VJbmZvLkNob2ljZTtcclxuICAgIGxldCBkZWZhdWx0VmFsdWU6IGFueTtcclxuICAgIGlmIChjaG9pY2VJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGRhdGFFbGVtZW50LmNob2ljZUluZm8gPSBuZXcgQXJyYXk8Q2hvaWNlPigpO1xyXG4gICAgICBpZiAodGhpcy5hcnJheUNoZWNrZXJTZXJ2aWNlLmlzQXJyYXkoY2hvaWNlSXRlbXMpKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjaG9pY2VJdGVtIG9mIGNob2ljZUl0ZW1zKSB7XHJcbiAgICAgICAgICBjb25zdCBjaG9pY2UgPSB0aGlzLnJldHVybkNob2ljZShjaG9pY2VJdGVtKTtcclxuICAgICAgICAgIGlmIChjaG9pY2UuZGVmYXVsdCkge1xyXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBjaG9pY2UudmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkYXRhRWxlbWVudC5jaG9pY2VJbmZvLnB1c2goY2hvaWNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgY2hvaWNlID0gdGhpcy5yZXR1cm5DaG9pY2UoY2hvaWNlSXRlbXMpO1xyXG4gICAgICAgIGlmIChjaG9pY2UuZGVmYXVsdCkge1xyXG4gICAgICAgICAgZGVmYXVsdFZhbHVlID0gY2hvaWNlLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkYXRhRWxlbWVudC5jaG9pY2VJbmZvLnB1c2goY2hvaWNlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZGF0YUVsZW1lbnQuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xyXG4gICAgZGF0YUVsZW1lbnQuY3VycmVudFZhbHVlID0gZGVmYXVsdFZhbHVlO1xyXG4gICAgY29uc3QgaW1hZ2VNYXAgPSBkYXRhLkltYWdlTWFwO1xyXG4gICAgaWYgKGltYWdlTWFwICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZGF0YUVsZW1lbnQuaW1hZ2VNYXAgPSBuZXcgSW1hZ2VNYXAoKTtcclxuICAgICAgZGF0YUVsZW1lbnQuaW1hZ2VNYXAubG9jYXRpb24gPSBpbWFnZU1hcC5Mb2NhdGlvbjtcclxuICAgICAgY29uc3QgYXJlYU1hcHMgPSBpbWFnZU1hcC5NYXAuQXJlYTtcclxuICAgICAgaWYgKGFyZWFNYXBzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBkYXRhRWxlbWVudC5pbWFnZU1hcC5tYXAgPSBuZXcgQXJlYU1hcCgpO1xyXG4gICAgICAgIGRhdGFFbGVtZW50LmltYWdlTWFwLm1hcC5hcmVhcyA9IG5ldyBBcnJheTxBcmVhPigpO1xyXG4gICAgICAgIGlmICh0aGlzLmFycmF5Q2hlY2tlclNlcnZpY2UuaXNBcnJheShhcmVhTWFwcykpIHtcclxuICAgICAgICAgIGZvciAoY29uc3QgYXJlYU1hcCBvZiBhcmVhTWFwcykge1xyXG4gICAgICAgICAgICBkYXRhRWxlbWVudC5pbWFnZU1hcC5tYXAuYXJlYXMucHVzaCh0aGlzLnJldHVybkFyZWEoYXJlYU1hcCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBkYXRhRWxlbWVudC5pbWFnZU1hcC5tYXAuYXJlYXMucHVzaCh0aGlzLnJldHVybkFyZWEoYXJlYU1hcHMpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgY29uc3QgQ29uZGl0aW9uYWxQcm9wZXJ0aWVzID0gZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXM7XHJcbiAgICBpZiAoQ29uZGl0aW9uYWxQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uc3Qgbm90UmVsZXZhbnREYXRhRWxlbWVudHMgPSBuZXcgTm90UmVsZXZhbnREYXRhRWxlbWVudHMoKTtcclxuICAgICAgY29uc3QgZGF0YUVsZW1lbnRSZWZzID0gZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXM7XHJcbiAgICAgIC8vIC5Ob3RSZWxldmFudERhdGFFbGVtZW50cy5EYXRhRWxlbWVudFJlZjtcclxuXHJcbiAgICAgIGlmIChkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZGF0YUVsZW1lbnQuY29uZGl0aW9uYWxQcm9wZXJ0aWVzID0gbmV3IEFycmF5PENvbmRpdGlvbmFsUHJvcGVydHk+KCk7XHJcbiAgICAgICAgaWYgKGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzLkNvbmRpdGlvbmFsUHJvcGVydHkgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBjb25kaXRpb25hbFByb3BlcnR5IG9mIGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzLkNvbmRpdGlvbmFsUHJvcGVydHkpIHtcclxuICAgICAgICAgICAgZGF0YUVsZW1lbnQuY29uZGl0aW9uYWxQcm9wZXJ0aWVzLnB1c2godGhpcy5HZXRDb25kaXRpb25hbFByb3BlcnRpZXMoY29uZGl0aW9uYWxQcm9wZXJ0eSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBkYXRhRWxlbWVudC5jb25kaXRpb25hbFByb3BlcnRpZXMucHVzaCh0aGlzLkdldENvbmRpdGlvbmFsUHJvcGVydGllcyhkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcy5Db25kaXRpb25hbFByb3BlcnR5KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRhdGFFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBHZXRDb25kaXRpb25hbFByb3BlcnRpZXMoY29uZGl0aW9uYWxQcm9wZXJ0eSk6IENvbmRpdGlvbmFsUHJvcGVydHkge1xyXG4gICAgY29uc3QgX2NvbmRpdGlvbmFsUHJvcGVydHkgPSBuZXcgQ29uZGl0aW9uYWxQcm9wZXJ0eSgpO1xyXG4gICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuY29uZGl0aW9uID0gdGhpcy5jb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlLnJldHVybkNvbmRpdGlvbihjb25kaXRpb25hbFByb3BlcnR5KTtcclxuICAgIC8vIHZhciB0ZXN0ID0gdGhpcy5jb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlLmNyZWF0ZUNvbXB1dGVkVmFsdWUoY29uZGl0aW9uYWxQcm9wZXJ0eSk7XHJcbiAgICBpZiAodGhpcy5jb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlLmlzQ29tcG9zaXRlKGNvbmRpdGlvbmFsUHJvcGVydHkpKSB7XHJcbiAgICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmNvbXBvc2l0ZUNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZS5yZXR1cm5Db21wb3NpdGVDb25kaXRpb24oY29uZGl0aW9uYWxQcm9wZXJ0eSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuaXNSZWxldmFudCA9IGNvbmRpdGlvbmFsUHJvcGVydHkuSXNSZWxldmFudDtcclxuICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmlzUmVxdWlyZWQgPSBjb25kaXRpb25hbFByb3BlcnR5LklzUmVxdWlyZWQ7XHJcbiAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5EaXNwbGF5U2VxdWVuY2UgPSBjb25kaXRpb25hbFByb3BlcnR5LkRpc3BsYXlTZXF1ZW5jZTtcclxuICAgIGlmIChjb25kaXRpb25hbFByb3BlcnR5LkNob2ljZU5vdFJlbGV2YW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuQ2hvaWNlTm90UmVsZXZhbnQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgICBmb3IgKGNvbnN0IGNob2ljZU5vdFJlbGV2YW50IG9mIGNvbmRpdGlvbmFsUHJvcGVydHkuQ2hvaWNlTm90UmVsZXZhbnQpIHtcclxuICAgICAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5DaG9pY2VOb3RSZWxldmFudC5wdXNoKGNob2ljZU5vdFJlbGV2YW50LkF0dHIuQ2hvaWNlVmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIF9jb25kaXRpb25hbFByb3BlcnR5O1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENob2ljZURhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9jaG9pY2UtZGF0YS1lbGVtZW50LWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaWFncmFtU2VydmljZSB9IGZyb20gJy4vZGlhZ3JhbS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXJyYXlDaGVja2VyU2VydmljZSB9IGZyb20gJy4vYXJyYXktY2hlY2tlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uc0NyZWF0aW9uU2VydmljZSB9IGZyb20gJy4vY29uZGl0aW9ucy1jcmVhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZSB9IGZyb20gJy4vY29tcHV0ZWQtdmFsdWUtY3JlYXRpb24uc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBNdWx0aXBsZUNob2ljZURhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlICBleHRlbmRzIENob2ljZURhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihkaWFncmFtU2VydmljZTogRGlhZ3JhbVNlcnZpY2UsICBhcnJheUNoZWNrZXJTZXJ2aWNlOiBBcnJheUNoZWNrZXJTZXJ2aWNlLFxyXG4gICAgIGNvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2U6IENvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UsXHJcbiAgICAgY29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZTogQ29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZVxyXG4gICAgKSB7XHJcbiAgICBzdXBlcihkaWFncmFtU2VydmljZSwgYXJyYXlDaGVja2VyU2VydmljZSwgY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZSwgY29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZSk7XHJcbiAgICB0aGlzLmVsZW1lbnRUeXBlID0gJ011bHRpQ2hvaWNlRGF0YUVsZW1lbnQnO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgQmFzZURhdGFFbGVtZW50IH0gZnJvbSAnLi9iYXNlLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcblxyXG5leHBvcnQgY2xhc3MgTnVtZXJpY0RhdGFFbGVtZW50IGV4dGVuZHMgQmFzZURhdGFFbGVtZW50IHtcclxuXHJcbiAgbWluaW11bTogTnVtYmVyO1xyXG4gIG1heGltdW06IE51bWJlcjtcclxuXHJcbiAgbWluaW11bU92ZXJyaWRlcjogTnVtYmVyO1xyXG4gIG1heGltdW1PdmVycmlkZXI6IE51bWJlcjtcclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50Q3JlYXRpb25CYXNlU2VydmljZSB9IGZyb20gJy4vZGF0YS1lbGVtZW50LWNyZWF0aW9uLWJhc2Utc2VydmljZSc7XHJcbmltcG9ydCB7IERpYWdyYW1TZXJ2aWNlIH0gZnJvbSAnLi9kaWFncmFtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9iYXNlLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IE51bWVyaWNEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL251bWVyaWMtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uYWxQcm9wZXJ0eSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2NvbmRpdGlvbmFscHJvcGVydHkubW9kZWwnO1xyXG5pbXBvcnQgeyBDb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9jb25kaXRpb25zLWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RSZWxldmFudERhdGFFbGVtZW50cyB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL25vdHJlbGV2YW50ZGF0YWVsZW1lbnRzLm1vZGVsJztcclxuaW1wb3J0IHsgQ29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZSB9IGZyb20gJy4vY29tcHV0ZWQtdmFsdWUtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOdW1lcmljRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2UgZXh0ZW5kcyBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2Uge1xyXG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGNvbnN0cnVjdG9yKGRpYWdyYW1TZXJ2aWNlOiBEaWFncmFtU2VydmljZSxcclxuICAgIHByaXZhdGUgY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZTogQ29uZGl0aW9uc0NyZWF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgY29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZTogQ29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZVxyXG4gICAgKSB7XHJcbiAgICBzdXBlcihkaWFncmFtU2VydmljZSk7XHJcbiAgICB0aGlzLmVsZW1lbnRUeXBlID0gJ051bWVyaWNEYXRhRWxlbWVudCc7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVFbGVtZW50KGRhdGE6IGFueSk6IEJhc2VEYXRhRWxlbWVudCB7XHJcbiAgICBjb25zdCBkYXRhRWxlbWVudCA9IG5ldyBOdW1lcmljRGF0YUVsZW1lbnQoKTtcclxuICAgIHN1cGVyLnBvcHVsYXRlQmFzaWNEYXRhKGRhdGEsIGRhdGFFbGVtZW50KTtcclxuICAgIGRhdGFFbGVtZW50Lm1pbmltdW0gPSBkYXRhLk1pbmltdW07XHJcbiAgICBkYXRhRWxlbWVudC5tYXhpbXVtID0gZGF0YS5NYXhpbXVtO1xyXG5cclxuICAgIGRhdGFFbGVtZW50Lm1heGltdW1PdmVycmlkZXIgPSBkYXRhLk1heGltdW07XHJcbiAgICBkYXRhRWxlbWVudC5taW5pbXVtT3ZlcnJpZGVyID0gZGF0YS5NaW5pbXVtO1xyXG5cclxuICAgIGNvbnN0IENvbmRpdGlvbmFsUHJvcGVydGllcyA9IGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzO1xyXG4gICAgaWYgKENvbmRpdGlvbmFsUHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbnN0IG5vdFJlbGV2YW50RGF0YUVsZW1lbnRzID0gbmV3IE5vdFJlbGV2YW50RGF0YUVsZW1lbnRzKCk7XHJcbiAgICAgIGNvbnN0IGRhdGFFbGVtZW50UmVmcyA9IGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzO1xyXG4gICAgICAvLyAuTm90UmVsZXZhbnREYXRhRWxlbWVudHMuRGF0YUVsZW1lbnRSZWY7XHJcblxyXG4gICAgICBpZiAoZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGRhdGFFbGVtZW50LmNvbmRpdGlvbmFsUHJvcGVydGllcyA9IG5ldyBBcnJheTxDb25kaXRpb25hbFByb3BlcnR5PigpO1xyXG4gICAgICAgIGlmIChkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcy5Db25kaXRpb25hbFByb3BlcnR5IGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uYWxQcm9wZXJ0eSBvZiBkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcy5Db25kaXRpb25hbFByb3BlcnR5KSB7XHJcbiAgICAgICAgICAgIGRhdGFFbGVtZW50LmNvbmRpdGlvbmFsUHJvcGVydGllcy5wdXNoKHRoaXMuR2V0Q29uZGl0aW9uYWxQcm9wZXJ0aWVzKGNvbmRpdGlvbmFsUHJvcGVydHkpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZGF0YUVsZW1lbnQuY29uZGl0aW9uYWxQcm9wZXJ0aWVzLnB1c2godGhpcy5HZXRDb25kaXRpb25hbFByb3BlcnRpZXMoZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXMuQ29uZGl0aW9uYWxQcm9wZXJ0eSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkYXRhRWxlbWVudDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgR2V0Q29uZGl0aW9uYWxQcm9wZXJ0aWVzKGNvbmRpdGlvbmFsUHJvcGVydHkpOiBDb25kaXRpb25hbFByb3BlcnR5IHtcclxuICAgIGNvbnN0IF9jb25kaXRpb25hbFByb3BlcnR5ID0gbmV3IENvbmRpdGlvbmFsUHJvcGVydHkoKTtcclxuICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZS5yZXR1cm5Db25kaXRpb24oY29uZGl0aW9uYWxQcm9wZXJ0eSk7XHJcbiAgICAvLyB2YXIgdGVzdCA9IHRoaXMuY29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZS5jcmVhdGVDb21wdXRlZFZhbHVlKGNvbmRpdGlvbmFsUHJvcGVydHkpO1xyXG4gICAgaWYgKHRoaXMuY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZS5pc0NvbXBvc2l0ZShjb25kaXRpb25hbFByb3BlcnR5KSkge1xyXG4gICAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5jb21wb3NpdGVDb25kaXRpb24gPSB0aGlzLmNvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UucmV0dXJuQ29tcG9zaXRlQ29uZGl0aW9uKGNvbmRpdGlvbmFsUHJvcGVydHkpO1xyXG4gICAgfVxyXG5cclxuICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmlzUmVsZXZhbnQgPSBjb25kaXRpb25hbFByb3BlcnR5LklzUmVsZXZhbnQ7XHJcbiAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5pc1JlcXVpcmVkID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5Jc1JlcXVpcmVkO1xyXG4gICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuRGlzcGxheVNlcXVlbmNlID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5EaXNwbGF5U2VxdWVuY2U7XHJcbiAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5NaW5pbXVtID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5NaW5pbXVtO1xyXG4gICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuTWF4aW11bSA9IGNvbmRpdGlvbmFsUHJvcGVydHkuTWF4aW11bTtcclxuICAgIHJldHVybiBfY29uZGl0aW9uYWxQcm9wZXJ0eTtcclxuICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4vYmFzZS1kYXRhLWVsZW1lbnQubW9kZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEludGVnZXJEYXRhRWxlbWVudCBleHRlbmRzIEJhc2VEYXRhRWxlbWVudCB7XHJcblxyXG4gIG1pbmltdW06IE51bWJlcjtcclxuICBtYXhpbXVtOiBOdW1iZXI7XHJcbiAgbWluaW11bU92ZXJyaWRlcjogTnVtYmVyO1xyXG4gIG1heGltdW1PdmVycmlkZXI6IE51bWJlcjtcclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERpYWdyYW1TZXJ2aWNlIH0gZnJvbSAnLi9kaWFncmFtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2UgfSBmcm9tICcuL2RhdGEtZWxlbWVudC1jcmVhdGlvbi1iYXNlLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9iYXNlLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEludGVnZXJEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2ludGVnZXItZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uc0NyZWF0aW9uU2VydmljZSB9IGZyb20gJy4vY29uZGl0aW9ucy1jcmVhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZSB9IGZyb20gJy4vY29tcHV0ZWQtdmFsdWUtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IE5vdFJlbGV2YW50RGF0YUVsZW1lbnRzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvbm90cmVsZXZhbnRkYXRhZWxlbWVudHMubW9kZWwnO1xyXG5pbXBvcnQgeyBDb25kaXRpb25hbFByb3BlcnR5IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY29uZGl0aW9uYWxwcm9wZXJ0eS5tb2RlbCc7XHJcblxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgSW50ZWdlckRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlIGV4dGVuZHMgRGF0YUVsZW1lbnRDcmVhdGlvbkJhc2VTZXJ2aWNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoZGlhZ3JhbVNlcnZpY2U6IERpYWdyYW1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlOiBDb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlOiBDb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihkaWFncmFtU2VydmljZSk7XHJcbiAgICB0aGlzLmVsZW1lbnRUeXBlID0gJ0ludGVnZXJEYXRhRWxlbWVudCc7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVFbGVtZW50KGRhdGE6IGFueSk6IEJhc2VEYXRhRWxlbWVudCB7XHJcbiAgICBjb25zdCBkYXRhRWxlbWVudCA9IG5ldyBJbnRlZ2VyRGF0YUVsZW1lbnQoKTtcclxuICAgIHN1cGVyLnBvcHVsYXRlQmFzaWNEYXRhKGRhdGEsIGRhdGFFbGVtZW50KTtcclxuICAgIGRhdGFFbGVtZW50Lm1pbmltdW0gPSBkYXRhLk1pbmltdW07XHJcbiAgICBkYXRhRWxlbWVudC5tYXhpbXVtID0gZGF0YS5NYXhpbXVtO1xyXG4gICAgZGF0YUVsZW1lbnQubWF4aW11bU92ZXJyaWRlciA9IGRhdGEuTWF4aW11bTtcclxuICAgIGRhdGFFbGVtZW50Lm1pbmltdW1PdmVycmlkZXIgPSBkYXRhLk1pbmltdW07XHJcblxyXG4gICAgY29uc3QgQ29uZGl0aW9uYWxQcm9wZXJ0aWVzID0gZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXM7XHJcbiAgICBpZiAoQ29uZGl0aW9uYWxQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uc3Qgbm90UmVsZXZhbnREYXRhRWxlbWVudHMgPSBuZXcgTm90UmVsZXZhbnREYXRhRWxlbWVudHMoKTtcclxuICAgICAgY29uc3QgZGF0YUVsZW1lbnRSZWZzID0gZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXM7XHJcbiAgICAgIC8vIC5Ob3RSZWxldmFudERhdGFFbGVtZW50cy5EYXRhRWxlbWVudFJlZjtcclxuXHJcbiAgICAgIGlmIChkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZGF0YUVsZW1lbnQuY29uZGl0aW9uYWxQcm9wZXJ0aWVzID0gbmV3IEFycmF5PENvbmRpdGlvbmFsUHJvcGVydHk+KCk7XHJcbiAgICAgICAgaWYgKGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzLkNvbmRpdGlvbmFsUHJvcGVydHkgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBjb25kaXRpb25hbFByb3BlcnR5IG9mIGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzLkNvbmRpdGlvbmFsUHJvcGVydHkpIHtcclxuICAgICAgICAgICAgZGF0YUVsZW1lbnQuY29uZGl0aW9uYWxQcm9wZXJ0aWVzLnB1c2godGhpcy5HZXRDb25kaXRpb25hbFByb3BlcnRpZXMoY29uZGl0aW9uYWxQcm9wZXJ0eSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBkYXRhRWxlbWVudC5jb25kaXRpb25hbFByb3BlcnRpZXMucHVzaCh0aGlzLkdldENvbmRpdGlvbmFsUHJvcGVydGllcyhkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcy5Db25kaXRpb25hbFByb3BlcnR5KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRhdGFFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBHZXRDb25kaXRpb25hbFByb3BlcnRpZXMoY29uZGl0aW9uYWxQcm9wZXJ0eSk6IENvbmRpdGlvbmFsUHJvcGVydHkge1xyXG4gICAgY29uc3QgX2NvbmRpdGlvbmFsUHJvcGVydHkgPSBuZXcgQ29uZGl0aW9uYWxQcm9wZXJ0eSgpO1xyXG4gICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuY29uZGl0aW9uID0gdGhpcy5jb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlLnJldHVybkNvbmRpdGlvbihjb25kaXRpb25hbFByb3BlcnR5KTtcclxuICAgIC8vIHZhciB0ZXN0ID0gdGhpcy5jb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlLmNyZWF0ZUNvbXB1dGVkVmFsdWUoY29uZGl0aW9uYWxQcm9wZXJ0eSk7XHJcbiAgICBpZiAodGhpcy5jb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlLmlzQ29tcG9zaXRlKGNvbmRpdGlvbmFsUHJvcGVydHkpKSB7XHJcbiAgICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmNvbXBvc2l0ZUNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZS5yZXR1cm5Db21wb3NpdGVDb25kaXRpb24oY29uZGl0aW9uYWxQcm9wZXJ0eSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuaXNSZWxldmFudCA9IGNvbmRpdGlvbmFsUHJvcGVydHkuSXNSZWxldmFudDtcclxuICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmlzUmVxdWlyZWQgPSBjb25kaXRpb25hbFByb3BlcnR5LklzUmVxdWlyZWQ7XHJcbiAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5EaXNwbGF5U2VxdWVuY2UgPSBjb25kaXRpb25hbFByb3BlcnR5LkRpc3BsYXlTZXF1ZW5jZTtcclxuICAgIF9jb25kaXRpb25hbFByb3BlcnR5Lk1pbmltdW0gPSBjb25kaXRpb25hbFByb3BlcnR5Lk1pbmltdW07XHJcbiAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5NYXhpbXVtID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5NYXhpbXVtO1xyXG4gICAgcmV0dXJuIF9jb25kaXRpb25hbFByb3BlcnR5O1xyXG4gIH1cclxufVxyXG4iLCJleHBvcnQgY2xhc3MgSW5wdXREYXRhIHtcclxuICAgIGRhdGFFbGVtZW50SWQ6IHN0cmluZztcclxuICAgIGRhdGFFbGVtZW50TGFiZWw6IHN0cmluZztcclxuICAgIGRhdGFFbGVtZW50VmFsdWU6IGFueTtcclxuICAgIGRhdGFFbGVtZW50RGlzcGxheVZhbHVlOiBhbnk7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmRhdGFFbGVtZW50TGFiZWwgPSAnJztcclxuICAgICAgICB0aGlzLmRhdGFFbGVtZW50RGlzcGxheVZhbHVlID0gJyc7XHJcblxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IFZpZXdDaGlsZCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcy9pbnRlcm5hbC9TdWJqZWN0JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTaW11bGF0b3JDb21tdW5pY2F0aW9uU2VydmljZSB7XHJcbiAgICAvLyBPYnNlcnZhYmxlIHN0cmluZyBzb3VyY2VzXHJcbiAgICBwcml2YXRlIHNpbXVsYXRvclNvdXJjZSA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuXHJcbiAgICAvLyBPYnNlcnZhYmxlIHN0cmluZyBzdHJlYW1zXHJcbiAgICBzaW11bGF0b3JTb3VyY2UkID0gdGhpcy5zaW11bGF0b3JTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgLy8gU2VydmljZSBtZXNzYWdlIGNvbW1hbmRzXHJcbiAgICBtZXNzYWdlRW1pdHRlcihtaXNzaW9uOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnNpbXVsYXRvclNvdXJjZS5uZXh0KG1pc3Npb24pO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy90ZW1wbGF0ZS5tb2RlbCc7XHJcbmltcG9ydCB7IEltYWdlRWxlbWVudHMgfSBmcm9tICcuLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9pbWFnZS1lbGVtZW50cy5tb2RlbCc7XHJcbmltcG9ydCB7IEVuZFBvaW50UmVmIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvZW5kcG9pbnRyZWYubW9kZWwnO1xyXG5pbXBvcnQgeyBTZWN0aW9uSWZWYWx1ZU5vdENvbmRpdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvZW5kcG9pbnQvc2VjdGlvbi1pZi12YWx1ZS1ub3QtY29uZGl0aW9uJztcclxuaW1wb3J0IHsgU2VjdGlvbklmVmFsdWVDb25kaXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL2VuZHBvaW50L3NlY3Rpb24taWYtdmFsdWUtY29uZGl0aW9uJztcclxuaW1wb3J0IHsgVGVtcGxhdGVQYXJ0aWFsIH0gZnJvbSAnLi4vLi4vY29yZS9lbmRwb2ludC90ZW1wbGF0ZS1wYXJ0aWFsJztcclxuaW1wb3J0IHsgQ29uc29sZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvc3JjL2NvbnNvbGUnO1xyXG5pbXBvcnQgeyBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9zaW11bGF0b3ItZW5naW5lLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTaW11bGF0b3JTdGF0ZSB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL3NpbXVsYXRvci1zdGF0ZS5tb2RlbCc7XHJcbmltcG9ydCB7IFNlbGVjdGVkQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvZXhlY3V0ZWQtcmVzdWx0Lm1vZGVsJztcclxuaW1wb3J0IHsgSW5wdXREYXRhIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvaW5wdXQtZGF0YS5tb2RlbCc7XHJcbmltcG9ydCB7IEFzc2lzdENob2ljZUVsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuL2Fzc2lzdC1jaG9pY2UtZWxlbWVudC9hc3Npc3QtY2hvaWNlLWVsZW1lbnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ2hvaWNlRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9jaG9pY2UtZGF0YS1lbGVtZW50LW1vZGVsJztcclxuLy8gaW1wb3J0IHsgQXNzaXN0TnVtZXJpY0VsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuL2Fzc2lzdC1udW1lcmljLWVsZW1lbnQvYXNzaXN0LW51bWVyaWMtZWxlbWVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTaW11bGF0b3JDb21tdW5pY2F0aW9uU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9zZXJ2aWNlcy9zaW11bGF0b3ItY29tbXVuaWNhdGlvbi5zZXJ2aWNlJztcclxuY29uc3QgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhY3ItYXNzaXN0LWRhdGEtZWxlbWVudCcsXHJcbiAgdGVtcGxhdGU6IGA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBEYXRhRWxlbWVudCBvZiBkYXRhRWxlbWVudHNcIj4gIFxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIoRGF0YUVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09ICdDaG9pY2VEYXRhRWxlbWVudCdcclxuICAgIHx8IERhdGFFbGVtZW50LmRhdGFFbGVtZW50VHlwZSA9PSAnTnVtZXJpY0RhdGFFbGVtZW50J1xyXG4gICAgfHwgRGF0YUVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09ICdJbnRlZ2VyRGF0YUVsZW1lbnQnIFxyXG4gICAgfHwgRGF0YUVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09ICdNdWx0aUNob2ljZURhdGFFbGVtZW50J1xyXG4gICAgfHwgRGF0YUVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09ICdEYXRlVGltZURhdGFFbGVtZW50J1xyXG4gICAgfHwgRGF0YUVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09ICdEdXJhdGlvbkRhdGFFbGVtZW50JykgXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiRGF0YUVsZW1lbnQuaXNWaXNpYmxlXCI+XHJcbiAgICAgIDxkaXYgaWQ9XCJkaXZfe3tEYXRhRWxlbWVudC5pZH19XCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkRhdGFFbGVtZW50LmRhdGFFbGVtZW50VHlwZSA9PSAnQ2hvaWNlRGF0YUVsZW1lbnQnXCI+XHJcbiAgICAgICAgICA8YWNyLWFzc2lzdC1jaG9pY2UtZWxlbWVudCBbY2hvaWNlRGF0YUVsZW1lbnRdPSdEYXRhRWxlbWVudCcgW2ltYWdlUGF0aF09J2ltYWdlUGF0aCcgKHJldHVybkNob2ljZUVsZW1lbnQpPSdjaG9pY2VTZWxlY3RlZCgkZXZlbnQpJz48L2Fjci1hc3Npc3QtY2hvaWNlLWVsZW1lbnQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkRhdGFFbGVtZW50LmRhdGFFbGVtZW50VHlwZSA9PSAnTXVsdGlDaG9pY2VEYXRhRWxlbWVudCdcIj5cclxuICAgICAgICAgIDxhY3ItYXNzaXN0LW11bHRpLWNob2ljZS1lbGVtZW50IFttdWx0aUNob2ljZUVsZW1lbnRdPSdEYXRhRWxlbWVudCcgW2ltYWdlUGF0aF09J2ltYWdlUGF0aCcgKHJldHVybk11bHRpQ2hvaWNlKT0nbXVsdGlTZWxlY3RlZCgkZXZlbnQpJz48L2Fjci1hc3Npc3QtbXVsdGktY2hvaWNlLWVsZW1lbnQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkRhdGFFbGVtZW50LmRhdGFFbGVtZW50VHlwZSA9PSAnTnVtZXJpY0RhdGFFbGVtZW50JyB8fCBEYXRhRWxlbWVudC5kYXRhRWxlbWVudFR5cGUgPT0gJ0ludGVnZXJEYXRhRWxlbWVudCdcIj5cclxuICAgICAgICAgIDxhY3ItYXNzaXN0LW51bWVyaWMtZWxlbWVudCBbbnVtZXJpY0RhdGFFbGVtZW50XT0nRGF0YUVsZW1lbnQnIFtpbWFnZVBhdGhdPSdpbWFnZVBhdGgnIChyZXR1cm5OdW1lcmljRWxlbWVudCk9J251bWVyaWNTZWxlY3RlZCgkZXZlbnQpJz48L2Fjci1hc3Npc3QtbnVtZXJpYy1lbGVtZW50PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJEYXRhRWxlbWVudC5kYXRhRWxlbWVudFR5cGUgPT0gJ0RhdGVUaW1lRGF0YUVsZW1lbnQnXCI+XHJcbiAgICAgICAgICA8YWNyLWFzc2lzdC1kYXRlLXRpbWUtZWxlbWVudCBbZGF0ZVRpbWVEYXRhRWxlbWVudF09J0RhdGFFbGVtZW50Jz48L2Fjci1hc3Npc3QtZGF0ZS10aW1lLWVsZW1lbnQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkRhdGFFbGVtZW50LmRhdGFFbGVtZW50VHlwZSA9PSAnRHVyYXRpb25EYXRhRWxlbWVudCdcIj5cclxuICAgICAgICAgICAgPGFjci1hc3Npc3QtZHVyYXRpb24tZWxlbWVudCBbZHVyYXRpb25EYXRhRWxlbWVudF09J0RhdGFFbGVtZW50Jz48L2Fjci1hc3Npc3QtZHVyYXRpb24tZWxlbWVudD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG48L25nLWNvbnRhaW5lcj5cclxuYCxcclxuICBzdHlsZXM6IFtgYCwgYC5yZXF1aXJlZC1maWVsZHtjb2xvcjpyZWR9LnBhZGRpbmctbC01e3BhZGRpbmctbGVmdDo1cHh9LndoaXRlc3BhY2V7bWFyZ2luLWxlZnQ6NXB4fS5tYXgtdy1oLTEwMHttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNhcm91c2VsLWNvbnRyb2w+LmZhe2ZvbnQtc2l6ZTo0MHB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7ei1pbmRleDo1O2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6LTIwcHh9LmNhcm91c2VsLWNvbnRyb2wubGVmdHtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0LC5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bm9uZX0uY2Fyb3VzZWwtY29udHJvbC5yaWdodHtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCxyZ2JhKDAsMCwwLC4wMDAxKSAwLHJnYmEoMCwwLDAsLjUpIDEwMCUpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5zY3JvbGx7b3ZlcmZsb3cteTpzY3JvbGw7b3ZlcmZsb3cteDpoaWRkZW59LmRpdi1zaW11bGF0b3ItZm9ybS1oZWlnaHR7aGVpZ2h0OmNhbGMoMTAwdmggLSAxMDBweCk7b3ZlcmZsb3cteTpzY3JvbGw7b3ZlcmZsb3cteDpoaWRkZW59LmRpdi1yZXBvcnQtdGV4dC1zY3JvbGx7b3ZlcmZsb3cteDpoaWRkZW47b3ZlcmZsb3cteTphdXRvO21heC1oZWlnaHQ6Y2FsYygxMDB2aCAtIDMwMHB4KX0ucGFkZGluZy1yLTEwe3BhZGRpbmctcmlnaHQ6MTBweH0uc2xpZGUtbGVmdHtsZWZ0OjMwcHh9LnNsaWRlLXJpZ2h0e3JpZ2h0OjMwcHh9aHJ7bWFyZ2luLXRvcDoxMHB4O21hcmdpbi1ib3R0b206MTBweH0ud2hpdGUtc3BhY2UtbGluZXt3aGl0ZS1zcGFjZTpwcmUtbGluZTt3b3JkLXdyYXA6YnJlYWstd29yZH1we21hcmdpbjowIDAgMTBweH0uZm9ybS1jb250cm9se2JvcmRlci1yYWRpdXM6MDtib3gtc2hhZG93Om5vbmU7Ym9yZGVyLWNvbG9yOiNkMmQ2ZGV9aDQubW9kYWwtdGl0bGUuZmxvYXQtbGVmdHtmbG9hdDpsZWZ0fS5tYXJnaW4tYi0we21hcmdpbi1ib3R0b206MH0uZm9udC13ZWlnaHQtNDAwe2ZvbnQtd2VpZ2h0OjQwMH0uY3VzdG9tLXJhZGlvLXN0eWxle2Zsb2F0OmxlZnQ7bWFyZ2luLXJpZ2h0OjE1cHh9Lnpvb217d2lkdGg6MTAwJTtvdmVyZmxvdzphdXRvfS56b29tIGltZ3toZWlnaHQ6YXV0bzt3aWR0aDoxMDAlO21pbi13aWR0aDoxMDAlO21heC13aWR0aDppbmhlcml0IWltcG9ydGFudH0uYnRuLXpvb217YmFja2dyb3VuZC1jb2xvcjojZjRmNGY0O2NvbG9yOiM0NDQ7Ym9yZGVyLWNvbG9yOiNkZGR9LmJ0bi16b29tLmhvdmVyLC5idG4tem9vbTphY3RpdmUsLmJ0bi16b29tOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2U3ZTdlN31AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7bGFiZWwuY29udHJvbC1sYWJlbHtwYWRkaW5nLWxlZnQ6MjBweH19LnBhZGRpbmctNXtwYWRkaW5nOjVweH1gXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEFzc2lzdERhdGFFbGVtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKSBkYXRhRWxlbWVudHM6IEJhc2VEYXRhRWxlbWVudFtdO1xyXG4gIEBJbnB1dCgpIGltYWdlUGF0aDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIEVuZHBvaW50cyA9IFtdO1xyXG4gIEBJbnB1dCgpIHRlbXBsYXRlUGFydGlhbDogc3RyaW5nW107XHJcbiAgQElucHV0KCkgZW5kUG9pbnRYTUxTdHJpbmc6IHN0cmluZ1tdO1xyXG4gIEBJbnB1dCgpIHhtbENvbnRlbnQ6IHN0cmluZztcclxuICBAT3V0cHV0KCkgcmV0dXJuUmVwb3J0VGV4dDogRXZlbnRFbWl0dGVyPE1haW5SZXBvcnRUZXh0PiA9IG5ldyBFdmVudEVtaXR0ZXI8TWFpblJlcG9ydFRleHQ+KCk7XHJcbiAgQE91dHB1dCgpIHJldHVybkV4ZWN1dGlvbkhpc3Rvcnk6IEV2ZW50RW1pdHRlcjxGaW5hbEV4ZWN1dGVkSGlzdG9yeT4gPSBuZXcgRXZlbnRFbWl0dGVyPEZpbmFsRXhlY3V0ZWRIaXN0b3J5PigpO1xyXG4gIEBPdXRwdXQoKSByZXR1cm5EYXRhRWxlbWVudENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxJbnB1dERhdGFbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPElucHV0RGF0YVtdPigpO1xyXG4gIEBJbnB1dCgpIGlzUmVzZXQ6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgaW5wdXRWYWx1ZXM6IElucHV0RGF0YVtdID0gW107XHJcblxyXG4gIG1haW5SZXBvcnRUZXh0T2JqOiBNYWluUmVwb3J0VGV4dDtcclxuICBzaW11bGF0b3JTdGF0ZTogU2ltdWxhdG9yU3RhdGU7XHJcbiAgZGF0YUVsZW1lbnRWYWx1ZXM6IE1hcDxzdHJpbmcsIGFueT47XHJcbiAgY29tcGFyaXNvblZhbHVlczogc3RyaW5nW10gPSBbXTtcclxuICBzZWxlY3RlZENob2ljZVZhbHVlczogc3RyaW5nW10gPSBbXTtcclxuICBleGVjdXRlZFJlc3VsdElkczogYW55W10gPSBbXTtcclxuICBleGVjdXRlZFJlc3VsdEhpc3RvcmllczogRXhlY3V0ZWRSZXN1bHRIaXN0b3J5W10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHNpbXVsYXRvckVuZ2luZVNlcnZpY2U6IFNpbXVsYXRvckVuZ2luZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNpbXVsYXRvckNvbW11bmljYXRpb25TZXJ2aWNlOiBTaW11bGF0b3JDb21tdW5pY2F0aW9uU2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNpbXVsYXRvckVuZ2luZVNlcnZpY2Uuc2ltdWxhdG9yU3RhdGVDaGFuZ2VkLnN1YnNjcmliZSgobWVzc2FnZSkgPT4ge1xyXG4gICAgICB0aGlzLnNpbXVsYXRvclN0YXRlID0gbWVzc2FnZSBhcyBTaW11bGF0b3JTdGF0ZTtcclxuICAgICAgdGhpcy5kYXRhRWxlbWVudFZhbHVlcyA9IHRoaXMuc2ltdWxhdG9yRW5naW5lU2VydmljZS5nZXRBbGxEYXRhRWxlbWVudFZhbHVlcygpO1xyXG4gICAgICBjb25zdCBub25SZWxldmFudElEcyA9IHRoaXMuc2ltdWxhdG9yRW5naW5lU2VydmljZS5ldmFsdWF0ZURlY2lzaW9uQW5kQ29uZGl0aW9uYWxQcm9wZXJ0eSgpO1xyXG4gICAgICBmb3IgKGNvbnN0IGRhdGFFbGVtZW50IG9mIHRoaXMuZGF0YUVsZW1lbnRzKSB7XHJcbiAgICAgICAgaWYgKG5vblJlbGV2YW50SURzICYmIG5vblJlbGV2YW50SURzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGlmIChub25SZWxldmFudElEcy5pbmRleE9mKGRhdGFFbGVtZW50LmlkKSA+PSAwKSB7XHJcbiAgICAgICAgICAgIGRhdGFFbGVtZW50LmlzVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YUVsZW1lbnQuaXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZGF0YUVsZW1lbnQuaXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YUVsZW1lbnRWYWx1ZXNbZGF0YUVsZW1lbnQuaWRdICE9PSB1bmRlZmluZWQgJiYgZGF0YUVsZW1lbnQuY3VycmVudFZhbHVlICE9PSB0aGlzLmRhdGFFbGVtZW50VmFsdWVzW2RhdGFFbGVtZW50LmlkXSkge1xyXG4gICAgICAgICAgZGF0YUVsZW1lbnQuY3VycmVudFZhbHVlID0gdGhpcy5kYXRhRWxlbWVudFZhbHVlc1tkYXRhRWxlbWVudC5pZF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSA9IChkYXRhRWxlbWVudC5jdXJyZW50VmFsdWUgIT09IHVuZGVmaW5lZCkgPyBkYXRhRWxlbWVudC5jdXJyZW50VmFsdWUgOiB0aGlzLmRhdGFFbGVtZW50VmFsdWVzW2RhdGFFbGVtZW50LmlkXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kYXRhRWxlbWVudHMgPSB0aGlzLmRhdGFFbGVtZW50cy5maWx0ZXIoeCA9PiB4LmRpc3BsYXlTZXF1ZW5jZSAhPSBudWxsKS5zb3J0KGZ1bmN0aW9uIChERV8xLCBERV8yKSB7IHJldHVybiBERV8xLmRpc3BsYXlTZXF1ZW5jZSAtIERFXzIuZGlzcGxheVNlcXVlbmNlOyB9KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnNpbXVsYXRvclN0YXRlLmVuZFBvaW50SWQgJiYgdGhpcy5zaW11bGF0b3JTdGF0ZS5lbmRQb2ludElkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlUmVwb3J0VGV4dCh0aGlzLnNpbXVsYXRvclN0YXRlLmVuZFBvaW50SWQpO1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnJldHVyblJlcG9ydFRleHQuZW1pdCh1bmRlZmluZWQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2ltdWxhdG9yQ29tbXVuaWNhdGlvblNlcnZpY2UubWVzc2FnZUVtaXR0ZXIoJycpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhdGFFbGVtZW50cyA9IHRoaXMuZGF0YUVsZW1lbnRzLmZpbHRlcih4ID0+IHguZGlzcGxheVNlcXVlbmNlICE9IG51bGwpLnNvcnQoZnVuY3Rpb24gKERFXzEsIERFXzIpIHsgcmV0dXJuIERFXzEuZGlzcGxheVNlcXVlbmNlIC0gREVfMi5kaXNwbGF5U2VxdWVuY2U7IH0pO1xyXG4gICAgdGhpcy5leGVjdXRlZFJlc3VsdElkcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgY2hvaWNlU2VsZWN0ZWQoJGV2ZW50KSB7XHJcbiAgICBpZiAoJGV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKCRldmVudC5yZWNlaXZlZEVsZW1lbnQgIT09IHVuZGVmaW5lZCAmJiAkZXZlbnQuc2VsZWN0ZWRDb25kaXRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDaG9pY2VWYWx1ZXNbJGV2ZW50LnJlY2VpdmVkRWxlbWVudC5lbGVtZW50SWQgKyAnU2VsZWN0ZWRWYWx1ZSddID0gJGV2ZW50LnJlY2VpdmVkRWxlbWVudC5zZWxlY3RlZFRleHQ7XHJcbiAgICAgICAgdGhpcy5zaW11bGF0b3JFbmdpbmVTZXJ2aWNlLmFkZE9yVXBkYXRlRGF0YUVsZW1lbnQoJGV2ZW50LnJlY2VpdmVkRWxlbWVudC5lbGVtZW50SWQsICRldmVudC5yZWNlaXZlZEVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSxcclxuICAgICAgICAgICRldmVudC5yZWNlaXZlZEVsZW1lbnQuc2VsZWN0ZWRUZXh0KTtcclxuICAgICAgICBjb25zdCBleGVjdXRlZFJlc3VsdHM6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgZXhlY3V0ZWRSZXN1bHRzWyRldmVudC5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbl0gPSAkZXZlbnQuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICB0aGlzLmV4ZWN1dGVkUmVzdWx0SWRzWyRldmVudC5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbklkXSA9IGV4ZWN1dGVkUmVzdWx0cztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2ltdWxhdG9yU3RhdGUuZW5kUG9pbnRJZCAmJiB0aGlzLnNpbXVsYXRvclN0YXRlLmVuZFBvaW50SWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZUV4ZWN1dGlvbkhpc3RvcnkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZnRlckRhdGFFbGVtZW50Q2hhbmdlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFmdGVyRGF0YUVsZW1lbnRDaGFuZ2VkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBudW1lcmljU2VsZWN0ZWQoJGV2ZW50KSB7XHJcbiAgICBpZiAoJGV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKCRldmVudC5yZWNlaXZlZEVsZW1lbnQgIT09IHVuZGVmaW5lZCAmJiAkZXZlbnQuc2VsZWN0ZWRDb25kaXRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuc2ltdWxhdG9yRW5naW5lU2VydmljZS5hZGRPclVwZGF0ZURhdGFFbGVtZW50KCRldmVudC5yZWNlaXZlZEVsZW1lbnQuZWxlbWVudElkLCAkZXZlbnQucmVjZWl2ZWRFbGVtZW50LnNlbGVjdGVkVmFsdWUsXHJcbiAgICAgICAgICAkZXZlbnQucmVjZWl2ZWRFbGVtZW50LnNlbGVjdGVkVmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IGV4ZWN1dGVkUmVzdWx0czogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBleGVjdXRlZFJlc3VsdHNbJGV2ZW50LnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uXSA9ICRldmVudC5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgIHRoaXMuZXhlY3V0ZWRSZXN1bHRJZHNbJGV2ZW50LnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWRdID0gZXhlY3V0ZWRSZXN1bHRzO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zaW11bGF0b3JTdGF0ZS5lbmRQb2ludElkICYmIHRoaXMuc2ltdWxhdG9yU3RhdGUuZW5kUG9pbnRJZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhlY3V0aW9uSGlzdG9yeSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFmdGVyRGF0YUVsZW1lbnRDaGFuZ2VkKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWZ0ZXJEYXRhRWxlbWVudENoYW5nZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG11bHRpU2VsZWN0ZWQoJGV2ZW50KSB7XHJcbiAgICBpZiAoJGV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKCRldmVudC5yZWNlaXZlZEVsZW1lbnQgIT09IHVuZGVmaW5lZCAmJiAkZXZlbnQuc2VsZWN0ZWRDb25kaXRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuY29tcGFyaXNvblZhbHVlc1skZXZlbnQucmVjZWl2ZWRFbGVtZW50LmVsZW1lbnRJZCArICdDb21wYXJpc29uVmFsdWUnXSA9ICRldmVudC5yZWNlaXZlZEVsZW1lbnQuc2VsZWN0ZWRDb21wYXJpc29uVmFsdWVzO1xyXG4gICAgICAgIHRoaXMuc2ltdWxhdG9yRW5naW5lU2VydmljZS5hZGRPclVwZGF0ZURhdGFFbGVtZW50KCRldmVudC5yZWNlaXZlZEVsZW1lbnQuZWxlbWVudElkLCAkZXZlbnQucmVjZWl2ZWRFbGVtZW50LnNlbGVjdGVkQ29tcGFyaXNvblZhbHVlcyxcclxuICAgICAgICAgICRldmVudC5yZWNlaXZlZEVsZW1lbnQuc2VsZWN0ZWRWYWx1ZXMpO1xyXG4gICAgICAgIGNvbnN0IGV4ZWN1dGVkUmVzdWx0czogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBleGVjdXRlZFJlc3VsdHNbJGV2ZW50LnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uXSA9ICRldmVudC5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgIHRoaXMuZXhlY3V0ZWRSZXN1bHRJZHNbJGV2ZW50LnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWRdID0gZXhlY3V0ZWRSZXN1bHRzO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zaW11bGF0b3JTdGF0ZS5lbmRQb2ludElkICYmIHRoaXMuc2ltdWxhdG9yU3RhdGUuZW5kUG9pbnRJZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmdlbmVyYXRlRXhlY3V0aW9uSGlzdG9yeSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFmdGVyRGF0YUVsZW1lbnRDaGFuZ2VkKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWZ0ZXJEYXRhRWxlbWVudENoYW5nZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdlbmVyYXRlUmVwb3J0VGV4dChlbmRwb2ludElkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGVuZHBvaW50Q29udGVudCA9IHRoaXMucmV0dXJuRW5kUG9pbnRDb250ZW50cyh0aGlzLnhtbENvbnRlbnQsICc8RW5kUG9pbnQgSWQ9XCInICsgZW5kcG9pbnRJZCArICdcIj4nLCAnPC9FbmRQb2ludD4nKTtcclxuICAgIHRoaXMucGFyc2VYbWwoZW5kcG9pbnRJZCwgZW5kcG9pbnRDb250ZW50KTtcclxuICB9XHJcblxyXG4gIGFmdGVyRGF0YUVsZW1lbnRDaGFuZ2VkKCkge1xyXG4gICAgY29uc3QgZGVWYWx1ZXM6IElucHV0RGF0YVtdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGRlIG9mIHRoaXMuZGF0YUVsZW1lbnRzKSB7XHJcbiAgICAgIGlmIChkZS5pc1Zpc2libGUgJiYgZGUuZGF0YUVsZW1lbnRUeXBlICE9PSAnQ29tcHV0ZWREYXRhRWxlbWVudCcgJiYgZGUuZGF0YUVsZW1lbnRUeXBlICE9PSAnR2xvYmFsVmFsdWUnKSB7XHJcbiAgICAgICAgY29uc3QgaW5wdXREYXRhID0gbmV3IElucHV0RGF0YSgpO1xyXG4gICAgICAgIGlucHV0RGF0YS5kYXRhRWxlbWVudElkID0gZGUuaWQ7XHJcbiAgICAgICAgaW5wdXREYXRhLmRhdGFFbGVtZW50TGFiZWwgPSBkZS5sYWJlbDtcclxuICAgICAgICBpbnB1dERhdGEuZGF0YUVsZW1lbnRWYWx1ZSA9IGRlLmN1cnJlbnRWYWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKGRlLmN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGRlLmN1cnJlbnRWYWx1ZSA9PT0gJycpIHtcclxuICAgICAgICAgIGlucHV0RGF0YS5kYXRhRWxlbWVudERpc3BsYXlWYWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGRlLmRhdGFFbGVtZW50VHlwZSA9PT0gJ0Nob2ljZURhdGFFbGVtZW50Jykge1xyXG4gICAgICAgICAgICBjb25zdCBjaG9pY2VzID0gKGRlIGFzIENob2ljZURhdGFFbGVtZW50KS5jaG9pY2VJbmZvO1xyXG4gICAgICAgICAgICBpbnB1dERhdGEuZGF0YUVsZW1lbnREaXNwbGF5VmFsdWUgPSBjaG9pY2VzLmZpbHRlcihjaCA9PiBjaC52YWx1ZSA9PT0gZGUuY3VycmVudFZhbHVlKVswXS5sYWJlbDtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZGUuZGF0YUVsZW1lbnRUeXBlID09PSAnTXVsdGlDaG9pY2VEYXRhRWxlbWVudCcpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hvaWNlcyA9IChkZSBhcyBDaG9pY2VEYXRhRWxlbWVudCkuY2hvaWNlSW5mbztcclxuICAgICAgICAgICAgaW5wdXREYXRhLmRhdGFFbGVtZW50RGlzcGxheVZhbHVlID0gW107XHJcbiAgICAgICAgICAgIGNob2ljZXMuZm9yRWFjaChjaG9pY2UgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlLmN1cnJlbnRWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGRlLmN1cnJlbnRWYWx1ZS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoY2hvaWNlLnZhbHVlID09PSBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLmRhdGFFbGVtZW50RGlzcGxheVZhbHVlLnB1c2goY2hvaWNlLmxhYmVsKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChjaG9pY2UudmFsdWUgPT09IGRlLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICBpbnB1dERhdGEuZGF0YUVsZW1lbnREaXNwbGF5VmFsdWUucHVzaChjaG9pY2UubGFiZWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbnB1dERhdGEuZGF0YUVsZW1lbnREaXNwbGF5VmFsdWUgPSBkZS5jdXJyZW50VmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlVmFsdWVzLnB1c2goaW5wdXREYXRhKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmV0dXJuRGF0YUVsZW1lbnRDaGFuZ2VkLmVtaXQoZGVWYWx1ZXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUV4ZWN1dGlvbkhpc3RvcnkoKSB7XHJcblxyXG4gICAgdGhpcy5leGVjdXRlZFJlc3VsdEhpc3RvcmllcyA9IFtdO1xyXG4gICAgbGV0IGlzTm9uUmVsZXZhbnQ6IGJvb2xlYW47XHJcbiAgICBpc05vblJlbGV2YW50ID0gZmFsc2U7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Zm9yaW5cclxuICAgIGZvciAoY29uc3QgcmVzdWx0SWQgaW4gdGhpcy5leGVjdXRlZFJlc3VsdElkcykge1xyXG4gICAgICBmb3IgKGNvbnN0IG5vblJlbGV2YW50RGF0YUVsZW1lbnQgb2YgdGhpcy5zaW11bGF0b3JTdGF0ZS5ub25SZWxldmFudERhdGFFbGVtZW50SWRzKSB7XHJcbiAgICAgICAgaWYgKG5vblJlbGV2YW50RGF0YUVsZW1lbnQgPT09IHJlc3VsdElkKSB7XHJcbiAgICAgICAgICBpc05vblJlbGV2YW50ID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpc05vblJlbGV2YW50ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghaXNOb25SZWxldmFudCkge1xyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpmb3JpblxyXG4gICAgICAgIGZvciAoY29uc3QgbGFiZWwgaW4gdGhpcy5leGVjdXRlZFJlc3VsdElkc1tyZXN1bHRJZF0pIHtcclxuICAgICAgICAgIGNvbnN0IGV4ZWN1dGVkUmVzdWx0SGlzdG9yeTogRXhlY3V0ZWRSZXN1bHRIaXN0b3J5ID0gbmV3IEV4ZWN1dGVkUmVzdWx0SGlzdG9yeSgpO1xyXG5cclxuICAgICAgICAgIGV4ZWN1dGVkUmVzdWx0SGlzdG9yeS5yZXN1bHRDb25kaXRpb24gPSBsYWJlbDtcclxuICAgICAgICAgIGV4ZWN1dGVkUmVzdWx0SGlzdG9yeS5yZXN1bHRWYWx1ZSA9IHRoaXMuZXhlY3V0ZWRSZXN1bHRJZHNbcmVzdWx0SWRdW2xhYmVsXTtcclxuXHJcbiAgICAgICAgICB0aGlzLmV4ZWN1dGVkUmVzdWx0SGlzdG9yaWVzLnB1c2goZXhlY3V0ZWRSZXN1bHRIaXN0b3J5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGZpbmFsRXhlY3V0aW9uOiBGaW5hbEV4ZWN1dGVkSGlzdG9yeSA9IG5ldyBGaW5hbEV4ZWN1dGVkSGlzdG9yeSgpO1xyXG4gICAgaWYgKHRoaXMuZXhlY3V0ZWRSZXN1bHRIaXN0b3JpZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBmaW5hbEV4ZWN1dGlvbi5leGVjdXRpb25IaXN0b3JpZXMgPSB0aGlzLmV4ZWN1dGVkUmVzdWx0SGlzdG9yaWVzO1xyXG4gICAgICBmaW5hbEV4ZWN1dGlvbi5yZXN1bHRUZXh0ID0gdGhpcy5tYWluUmVwb3J0VGV4dE9iajtcclxuICAgICAgZmluYWxFeGVjdXRpb24uaW5wdXREYXRhID0gW107XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IGRlIG9mIHRoaXMuZGF0YUVsZW1lbnRzKSB7XHJcbiAgICAgICAgaWYgKGRlLmlzVmlzaWJsZSAmJiBkZS5kYXRhRWxlbWVudFR5cGUgIT09ICdDb21wdXRlZERhdGFFbGVtZW50JyAmJiBkZS5kYXRhRWxlbWVudFR5cGUgIT09ICdHbG9iYWxWYWx1ZScpIHtcclxuICAgICAgICAgIGNvbnN0IGlucHV0RGF0YSA9IG5ldyBJbnB1dERhdGEoKTtcclxuICAgICAgICAgIGlucHV0RGF0YS5kYXRhRWxlbWVudElkID0gZGUuaWQ7XHJcbiAgICAgICAgICBpbnB1dERhdGEuZGF0YUVsZW1lbnRWYWx1ZSA9IGRlLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgICAgIGZpbmFsRXhlY3V0aW9uLmlucHV0RGF0YS5wdXNoKGlucHV0RGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXR1cm5FeGVjdXRpb25IaXN0b3J5LmVtaXQoZmluYWxFeGVjdXRpb24pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXR1cm5FbmRQb2ludENvbnRlbnRzKGNvbnRlbnQ6IHN0cmluZywgc3RhcnRUb2tlbjogc3RyaW5nLCBlbmRUb2tlbjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBjb250ZW50czogc3RyaW5nO1xyXG4gICAgbGV0IHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbiA9IDA7XHJcbiAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICBjb25zdCBjb250ZW50U3RhcnRQb3NpdGlvbiA9IGNvbnRlbnQuaW5kZXhPZihzdGFydFRva2VuLCB0ZW1wbGF0ZVNlYXJjaEluZGV4UG9zaXRpb24pO1xyXG4gICAgICBjb25zdCBjb250ZW50RW5kUG9zaXRpb24gPSBjb250ZW50LmluZGV4T2YoZW5kVG9rZW4sIHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbik7XHJcblxyXG4gICAgICBpZiAoY29udGVudFN0YXJ0UG9zaXRpb24gPj0gMCAmJiBjb250ZW50RW5kUG9zaXRpb24gPj0gMCkge1xyXG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gY29udGVudEVuZFBvc2l0aW9uICsgZW5kVG9rZW4ubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnREYXRhID0gY29udGVudC5zdWJzdHJpbmcoY29udGVudFN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uKTtcclxuICAgICAgICBjb250ZW50cyA9IGNvbnRlbnREYXRhO1xyXG4gICAgICAgIHRlbXBsYXRlU2VhcmNoSW5kZXhQb3NpdGlvbiA9IGVuZFBvc2l0aW9uICsgMTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbnRlbnRzO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBwYXJzZVhtbChlbmRwb2ludElkOiBzdHJpbmcsIGVuZHBvaW50Q29udGVudDogc3RyaW5nKTogYW55IHtcclxuICAvLyAgIGNvbnNvbGUubG9nKGVuZHBvaW50Q29udGVudCk7XHJcbiAgLy8gICBjb25zb2xlLmxvZygnLS0tLS0tLS0nKTtcclxuICAvLyAgIGNvbnNvbGUubG9nKGVuZHBvaW50SWQpO1xyXG5cclxuICAvLyAgIGNvbnN0IHJlcG9ydFRleHRKU09OID0gIHRoaXMucGFyc2VUb0pzb24oZW5kcG9pbnRDb250ZW50KTtcclxuXHJcbiAgLy8gICBjb25zb2xlLmxvZyhyZXBvcnRUZXh0SlNPTik7XHJcbiAgLy8gfVxyXG5cclxuICBwcml2YXRlIHBhcnNlVG9Kc29uKHhtbERhdGE6IHN0cmluZyk6IGFueSB7XHJcbiAgICBsZXQganNvblJlc3VsdDogSlNPTjtcclxuICAgIGNvbnN0IHBhcnNlU3RyaW5nID0gcmVxdWlyZSgneG1sMmpzJykucGFyc2VTdHJpbmc7XHJcbiAgICBwYXJzZVN0cmluZyh4bWxEYXRhLCB7IGV4cGxpY2l0Um9vdDogZmFsc2UsIGV4cGxpY2l0QXJyYXk6IGZhbHNlLCBhdHRya2V5OiAnQXR0cicgfSwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XHJcbiAgICAgIGpzb25SZXN1bHQgPSByZXN1bHQ7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4ganNvblJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFyc2VYbWwoZW5kUG9pbnRJZDogc3RyaW5nLCBlbmRwb2ludENvbnRlbnQ6IHN0cmluZyk6IGFueSB7XHJcbiAgICBjb25zdCB0ZW1wbGF0ZUlkczogc3RyaW5nW10gPSBbXTtcclxuICAgIGxldCBjYW5JbnNlcnRUZXh0OiBib29sZWFuO1xyXG4gICAgbGV0IGlzU2VjdGlvbklmOiBib29sZWFuO1xyXG4gICAgbGV0IHNlbGVjdGVkRWxlbWVudHM6IE1hcDxzdHJpbmcsIGFueT47XHJcbiAgICBsZXQgZXhlY3V0ZVNlY3Rpb25JZk5vdDogYm9vbGVhbjtcclxuICAgIGxldCBoYXNTZWN0aW9uTm90OiBib29sZWFuO1xyXG4gICAgbGV0IGluc2VydFZhbHVlOiBib29sZWFuO1xyXG4gICAgbGV0IGV4ZWN1dGVUZW1wbGF0ZTogYm9vbGVhbjtcclxuICAgIGxldCBpc0ltcHJlc3Npb246IGJvb2xlYW47XHJcbiAgICBsZXQgaXNOZXdUZW1wbGF0ZTogYm9vbGVhbjtcclxuICAgIGxldCBoYXNJbnNlcnRQYXJ0aWFsOiBib29sZWFuO1xyXG4gICAgbGV0IGlzTWFpblRleHQ6IGJvb2xlYW47XHJcbiAgICBjb25zdCBhbGxSZXBvcnRUZXh0OiBBbGxSZXBvcnRUZXh0W10gPSBbXTtcclxuICAgIGNvbnN0IGVuZHBvaW50cyA9IHRoaXMuRW5kcG9pbnRzO1xyXG4gICAgbGV0IHRlbXBsYXRlUGFydGlhbHNUZXh0OiBzdHJpbmdbXTtcclxuICAgIGxldCBzZWxlY3RlZENvbXBhcmlzb25WYWx1ZXM6IHN0cmluZ1tdO1xyXG4gICAgbGV0IGZpbmRpbmdzVGV4dDogc3RyaW5nO1xyXG4gICAgbGV0IGltcHJlc3Npb25UZXh0OiBzdHJpbmc7XHJcbiAgICBsZXQgc2VsZWN0ZWRTZWN0aW9uOiBzdHJpbmc7XHJcbiAgICBsZXQgc2VsZWN0ZWRDaG9pY2VUZXh0czogTWFwPHN0cmluZywgYW55PjtcclxuICAgIGxldCB0ZXh0RXhwcmVzc2lvblZhbHVlOiBzdHJpbmc7XHJcbiAgICBzZWxlY3RlZEVsZW1lbnRzID0gdGhpcy5zaW11bGF0b3JFbmdpbmVTZXJ2aWNlLmdldEFsbERhdGFFbGVtZW50VmFsdWVzKCk7XHJcbiAgICB0ZW1wbGF0ZVBhcnRpYWxzVGV4dCA9IHRoaXMudGVtcGxhdGVQYXJ0aWFsO1xyXG4gICAgc2VsZWN0ZWRDb21wYXJpc29uVmFsdWVzID0gdGhpcy5jb21wYXJpc29uVmFsdWVzO1xyXG4gICAgc2VsZWN0ZWRDaG9pY2VUZXh0cyA9IHRoaXMuc2ltdWxhdG9yRW5naW5lU2VydmljZS5nZXRBbGxEYXRhRWxlbWVudFRleHRzKCk7XHJcbiAgICBleGVjdXRlU2VjdGlvbklmTm90ID0gZmFsc2U7XHJcbiAgICBoYXNJbnNlcnRQYXJ0aWFsID0gZmFsc2U7XHJcbiAgICBlbmRwb2ludENvbnRlbnQgPSBlbmRwb2ludENvbnRlbnQucmVwbGFjZSgvXFxuL2csICcmIzEwOycpO1xyXG4gICAgZW5kcG9pbnRDb250ZW50ID0gZW5kcG9pbnRDb250ZW50LnJlcGxhY2UoL1xcdC9nLCAnJmVtc3A7Jyk7XHJcbiAgLy8gIGVuZHBvaW50Q29udGVudCA9IGVuZHBvaW50Q29udGVudC5yZXBsYWNlKC9cXHMvZywgJyAmbmJzcDsgJyk7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Zm9yaW5cclxuICAgIGZvciAoY29uc3QgaSBpbiB0ZW1wbGF0ZVBhcnRpYWxzVGV4dCkge1xyXG4gICAgICB0ZW1wbGF0ZVBhcnRpYWxzVGV4dFtpXSA9IHRlbXBsYXRlUGFydGlhbHNUZXh0W2ldLnJlcGxhY2UoL1xcbi9nLCAnJiMxMDsnKTtcclxuICAgICAgdGVtcGxhdGVQYXJ0aWFsc1RleHRbaV0gPSB0ZW1wbGF0ZVBhcnRpYWxzVGV4dFtpXS5yZXBsYWNlKC9cXHQvZywgJyZlbXNwOycpO1xyXG4gICAgLy8gIHRlbXBsYXRlUGFydGlhbHNUZXh0W2ldID0gdGVtcGxhdGVQYXJ0aWFsc1RleHRbaV0ucmVwbGFjZSgvXFxzKy9nLCAnICZuYnNwOyAnKTtcclxuICAgIH1cclxuXHJcbiAgICBmaW5kaW5nc1RleHQgPSAnJztcclxuICAgIGltcHJlc3Npb25UZXh0ID0gJyc7XHJcbiAgICBsZXQgaXNSZXBvcnRUZXh0OiBib29sZWFuO1xyXG4gICAgbGV0IHJlcG9ydFRleHRDb250ZW50ID0gJyc7XHJcbiAgICBjb25zdCBlbmRwb2ludFNheCA9IHJlcXVpcmUoJ3NheCcpLFxyXG4gICAgICBzdHJpY3QgPSB0cnVlLFxyXG4gICAgICBub3JtYWxpemUgPSB0cnVlLCAvLyBzZXQgdG8gZmFsc2UgZm9yIGh0bWwtbW9kZVxyXG4gICAgICB0cmltID0gdHJ1ZSxcclxuICAgICAgcmVwb3J0VGV4dFBhcnNlciA9IGVuZHBvaW50U2F4LnBhcnNlcihzdHJpY3QsIHRyaW0pO1xyXG4gICAgcmVwb3J0VGV4dFBhcnNlci5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgLy8gYW4gZXJyb3IgaGFwcGVuZWQuXHJcbiAgICAgIHJlcG9ydFRleHRQYXJzZXIucmVzdW1lKCk7XHJcbiAgICB9O1xyXG4gICAgcmVwb3J0VGV4dFBhcnNlci5vbnRleHQgPSBmdW5jdGlvbiAodCkge1xyXG4gICAgICBkZWJ1Z2dlcjtcclxuICAgICAgLy8gaWYgKHQubGVuZ3RoID4gMSkge1xyXG4gICAgICAvLyAgIHQgPSB0LnRyaW0oKTtcclxuICAgICAgLy8gfVxyXG4gICAgICBsZXQgaXNUZXh0SW5zZXJ0ZWQ6IGJvb2xlYW47XHJcbiAgICAgIGlzVGV4dEluc2VydGVkID0gZmFsc2U7XHJcbiAgICAgIGlmIChleGVjdXRlVGVtcGxhdGUpIHtcclxuICAgICAgICBpZiAoIWlzSW1wcmVzc2lvbikge1xyXG4gICAgICAgICAgaWYgKGNhbkluc2VydFRleHQgJiYgaGFzU2VjdGlvbk5vdCAmJiBoYXNTZWN0aW9uTm90ICE9PSB1bmRlZmluZWQgJiYgZXhlY3V0ZVNlY3Rpb25JZk5vdCkge1xyXG4gICAgICAgICAgICBmaW5kaW5nc1RleHQgPSBmaW5kaW5nc1RleHQgKyB0O1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjYW5JbnNlcnRUZXh0ICYmIGlzTmV3VGVtcGxhdGUgJiYgaGFzSW5zZXJ0UGFydGlhbCAmJiAhaXNTZWN0aW9uSWYpIHtcclxuICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgdDtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY2FuSW5zZXJ0VGV4dCAmJiAhaXNJbXByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgIGZpbmRpbmdzVGV4dCA9IGZpbmRpbmdzVGV4dCArIHQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChjYW5JbnNlcnRUZXh0ICYmIGhhc1NlY3Rpb25Ob3QgJiYgaGFzU2VjdGlvbk5vdCAhPT0gdW5kZWZpbmVkICYmIGV4ZWN1dGVTZWN0aW9uSWZOb3QpIHtcclxuICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIHQ7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNhbkluc2VydFRleHQgJiYgIWhhc1NlY3Rpb25Ob3QgJiYgaXNJbXByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgIGltcHJlc3Npb25UZXh0ID0gaW1wcmVzc2lvblRleHQgKyB0O1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjYW5JbnNlcnRUZXh0ICYmIGlzTmV3VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIHQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaXNSZXBvcnRUZXh0ICYmICFpc1RleHRJbnNlcnRlZCAmJiBpc01haW5UZXh0ICYmIGNhbkluc2VydFRleHQpIHtcclxuICAgICAgICAgIHJlcG9ydFRleHRDb250ZW50ID0gcmVwb3J0VGV4dENvbnRlbnQgKyB0O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJlcG9ydFRleHRQYXJzZXIub25vcGVudGFnID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgc3dpdGNoIChub2RlLm5hbWUpIHtcclxuICAgICAgICBjYXNlICdMYWJlbCc6XHJcbiAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgICBpc1JlcG9ydFRleHQgPSBmYWxzZTtcclxuICAgICAgICAgIGlzTWFpblRleHQgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdSZXBvcnRUZXh0JzpcclxuICAgICAgICAgIGlmIChleGVjdXRlVGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgaXNSZXBvcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkU2VjdGlvbiA9IG5vZGUuYXR0cmlidXRlcy5TZWN0aW9uSWQ7XHJcbiAgICAgICAgICAgIGltcHJlc3Npb25UZXh0ID0gJyc7XHJcbiAgICAgICAgICAgIGlmIChub2RlLmF0dHJpYnV0ZXMuU2VjdGlvbklkID09PSAnZmluZGluZ3MnICYmIGV4ZWN1dGVUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgIGlzSW1wcmVzc2lvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuYXR0cmlidXRlcy5TZWN0aW9uSWQgPT09ICdpbXByZXNzaW9uJyAmJiBleGVjdXRlVGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICBpc0ltcHJlc3Npb24gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpc1NlY3Rpb25JZiA9IGZhbHNlO1xyXG4gICAgICAgICAgLy8gaXNNYWluVGV4dCA9IHRydWU7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnSW5zZXJ0UGFydGlhbCc6XHJcbiAgICAgICAgICBpZiAoZXhlY3V0ZVRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIGdlbmVyYXRlUGFydGlhbFZpZXcobm9kZS5hdHRyaWJ1dGVzLlBhcnRpYWxJZCwgaXNJbXByZXNzaW9uKTtcclxuICAgICAgICAgICAgZXhlY3V0ZVRlbXBsYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmIChpc1JlcG9ydFRleHQpIHtcclxuICAgICAgICAgICAgICBoYXNJbnNlcnRQYXJ0aWFsID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBoYXNJbnNlcnRQYXJ0aWFsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlzUmVwb3J0VGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgaXNNYWluVGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ1NlY3Rpb25JZlZhbHVlTm90JzpcclxuICAgICAgICAgIGlmIChleGVjdXRlVGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0pKSB7XHJcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBjb21hcHJpc29uVmFsdWUgb2Ygc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb21hcHJpc29uVmFsdWUgIT09IG5vZGUuYXR0cmlidXRlcy5Db21wYXJpc29uVmFsdWUgJiZcclxuICAgICAgICAgICAgICAgICAgY29tYXByaXNvblZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWlzU2VjdGlvbklmKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBleGVjdXRlU2VjdGlvbklmTm90ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTZWN0aW9uSWZOb3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IG5vZGUuYXR0cmlidXRlcy5Db21wYXJpc29uVmFsdWUgJiZcclxuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJy0tU2VsZWN0LS0nICYmXHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgZXhlY3V0ZVNlY3Rpb25JZk5vdCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGV4ZWN1dGVTZWN0aW9uSWZOb3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaGFzU2VjdGlvbk5vdCA9IHRydWU7XHJcbiAgICAgICAgICBpc01haW5UZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdTZWN0aW9uSWYnOlxyXG4gICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0ubGVuZ3RoID4gMCAmJiBzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpicpIHtcclxuICAgICAgICAgICAgaXNTZWN0aW9uSWYgPSB0cnVlO1xyXG4gICAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlzU2VjdGlvbklmID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ1NlY3Rpb25JZlZhbHVlJzpcclxuICAgICAgICAgIGlmIChleGVjdXRlVGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgaWYgKGV4ZWN1dGVUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdKSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb21hcHJpc29uVmFsdWUgb2Ygc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0pIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGNvbWFwcmlzb25WYWx1ZSA9PT0gbm9kZS5hdHRyaWJ1dGVzLkNvbXBhcmlzb25WYWx1ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbWFwcmlzb25WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNTZWN0aW9uSWYgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gdW5kZWZpbmVkICYmICFpc1NlY3Rpb25JZiAmJiBzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZpbmRpbmdzVGV4dCA9IGZpbmRpbmdzVGV4dCArIHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpc1NlY3Rpb25JZiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gPT09IG5vZGUuYXR0cmlidXRlcy5Db21wYXJpc29uVmFsdWUgJiZcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlzU2VjdGlvbklmID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gdW5kZWZpbmVkICYmICFpc1NlY3Rpb25JZiAmJiBzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpicpIHtcclxuICAgICAgICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlzTWFpblRleHQgPSBmYWxzZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ0luc2VydFZhbHVlJzpcclxuICAgICAgICAgIGlmIChleGVjdXRlVGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgaXNSZXBvcnRUZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGluc2VydFZhbHVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc3QgY2hvaWNlVGV4dCA9IHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdO1xyXG4gICAgICAgICAgICBpZiAobm9kZS5hdHRyaWJ1dGVzLklkID09PSAnZmluZGluZ3MnIHx8IGNhbkluc2VydFRleHQpIHtcclxuICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCAmJiBoYXNTZWN0aW9uTm90ICYmIGV4ZWN1dGVTZWN0aW9uSWZOb3QpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0ltcHJlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09ICdPdGhlciwgcGxlYXNlIHNwZWNpZnnDosKAwqYnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIChBcnJheS5pc0FycmF5KGNob2ljZVRleHQpID8gY2hvaWNlVGV4dC5qb2luKCcsICcpIDogY2hvaWNlVGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0VGV4dEV4cHJlc3Npb25WYWx1ZShzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIChBcnJheS5pc0FycmF5KHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdKSA/IHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdLmpvaW4oJywgJykgOiB0ZXh0RXhwcmVzc2lvblZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09ICdPdGhlciwgcGxlYXNlIHNwZWNpZnnDosKAwqYnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgKEFycmF5LmlzQXJyYXkoY2hvaWNlVGV4dCkgPyBjaG9pY2VUZXh0LmpvaW4oJywgJykgOiBjaG9pY2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBnZXRUZXh0RXhwcmVzc2lvblZhbHVlKHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdKTtcclxuICAgICAgICAgICAgICAgICAgICBmaW5kaW5nc1RleHQgPSBmaW5kaW5nc1RleHQgKyAoQXJyYXkuaXNBcnJheShzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSkgPyBzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXS5qb2luKCcsICcpIDogdGV4dEV4cHJlc3Npb25WYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQgJiYgIWhhc1NlY3Rpb25Ob3QpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0ltcHJlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09ICdPdGhlciwgcGxlYXNlIHNwZWNpZnnDosKAwqYnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIChBcnJheS5pc0FycmF5KGNob2ljZVRleHQpID8gY2hvaWNlVGV4dC5qb2luKCcsICcpIDogY2hvaWNlVGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0VGV4dEV4cHJlc3Npb25WYWx1ZShzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIChBcnJheS5pc0FycmF5KHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdKSA/IHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdLmpvaW4oJywgJykgOiB0ZXh0RXhwcmVzc2lvblZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09ICdPdGhlciwgcGxlYXNlIHNwZWNpZnnDosKAwqYnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgKEFycmF5LmlzQXJyYXkoY2hvaWNlVGV4dCkgPyBjaG9pY2VUZXh0LmpvaW4oJywgJykgOiBjaG9pY2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBnZXRUZXh0RXhwcmVzc2lvblZhbHVlKHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdKTtcclxuICAgICAgICAgICAgICAgICAgICBmaW5kaW5nc1RleHQgPSBmaW5kaW5nc1RleHQgKyAoQXJyYXkuaXNBcnJheShzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSkgPyBzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXS5qb2luKCcsICcpIDogdGV4dEV4cHJlc3Npb25WYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGlzSW1wcmVzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlzTWFpblRleHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZXhlY3V0ZVRlbXBsYXRlID0gdHJ1ZTtcclxuICAgICAgaXNOZXdUZW1wbGF0ZSA9IHRydWU7XHJcbiAgICB9O1xyXG4gICAgcmVwb3J0VGV4dFBhcnNlci5vbmNsb3NldGFnID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgc3dpdGNoIChub2RlKSB7XHJcbiAgICAgICAgY2FzZSAnU2VjdGlvbklmVmFsdWVOb3QnOlxyXG4gICAgICAgICAgZXhlY3V0ZVNlY3Rpb25JZk5vdCA9IGZhbHNlO1xyXG4gICAgICAgICAgaGFzU2VjdGlvbk5vdCA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKGlzU2VjdGlvbklmKSB7XHJcbiAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnVGVtcGxhdGVQYXJ0aWFsJzpcclxuICAgICAgICAgIGlzTmV3VGVtcGxhdGUgPSBmYWxzZTtcclxuICAgICAgICAgIGNhbkluc2VydFRleHQgPSBmYWxzZTtcclxuICAgICAgICAgIGV4ZWN1dGVUZW1wbGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnUmVwb3J0VGV4dCc6XHJcbiAgICAgICAgICAvLyBpc0ltcHJlc3Npb24gPSBmYWxzZTtcclxuICAgICAgICAgIGlmICghaGFzSW5zZXJ0UGFydGlhbCAmJiAhaXNJbXByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcG9ydFRleHRPYmo6IEFsbFJlcG9ydFRleHQgPSBuZXcgQWxsUmVwb3J0VGV4dCgpO1xyXG4gICAgICAgICAgICByZXBvcnRUZXh0T2JqLnNlY3Rpb25JZCA9ICdmaW5kaW5ncyc7XHJcbiAgICAgICAgICAgIHJlcG9ydFRleHRPYmoucmVwb3J0VGV4dCA9IGZpbmRpbmdzVGV4dDtcclxuICAgICAgICAgICAgYWxsUmVwb3J0VGV4dFtyZXBvcnRUZXh0T2JqLnNlY3Rpb25JZF0gPSByZXBvcnRUZXh0T2JqO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChpbXByZXNzaW9uVGV4dCAhPT0gJycgJiYgaW1wcmVzc2lvblRleHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXBvcnRUZXh0T2JqOiBBbGxSZXBvcnRUZXh0ID0gbmV3IEFsbFJlcG9ydFRleHQoKTtcclxuICAgICAgICAgICAgcmVwb3J0VGV4dE9iai5zZWN0aW9uSWQgPSBzZWxlY3RlZFNlY3Rpb247XHJcbiAgICAgICAgICAgIHJlcG9ydFRleHRPYmoucmVwb3J0VGV4dCA9IGltcHJlc3Npb25UZXh0O1xyXG4gICAgICAgICAgICBhbGxSZXBvcnRUZXh0W3JlcG9ydFRleHRPYmouc2VjdGlvbklkXSA9IHJlcG9ydFRleHRPYmo7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBoYXNJbnNlcnRQYXJ0aWFsID0gZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdTZWN0aW9uSWYnOlxyXG4gICAgICAgICAgaXNTZWN0aW9uSWYgPSBmYWxzZTtcclxuICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnSW5zZXJ0UGFydGlhbCc6XHJcbiAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ0luc2VydFZhbHVlJzpcclxuICAgICAgICAgIGlmICgoaGFzU2VjdGlvbk5vdCAmJiBleGVjdXRlU2VjdGlvbklmTm90IHx8ICFoYXNTZWN0aW9uTm90KSkge1xyXG4gICAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ1NlY3Rpb25JZlZhbHVlJzpcclxuICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmVwb3J0VGV4dFBhcnNlci5vbmVuZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgLy8gcGFyc2VyIHN0cmVhbSBpcyBkb25lLCBhbmQgcmVhZHkgdG8gaGF2ZSBtb3JlIHN0dWZmIHdyaXR0ZW4gdG8gaXQuXHJcbiAgICAgIC8vIGlmIChpbXByZXNzaW9uVGV4dCAhPT0gJycgJiYgaW1wcmVzc2lvblRleHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyBjb25zdCByZXBvcnRUZXh0T2JqOiBBbGxSZXBvcnRUZXh0ID0gbmV3IEFsbFJlcG9ydFRleHQoKTtcclxuICAgICAgLy8gcmVwb3J0VGV4dE9iai5zZWN0aW9uSWQgPSBzZWxlY3RlZFNlY3Rpb247XHJcbiAgICAgIC8vIHJlcG9ydFRleHRPYmoucmVwb3J0VGV4dCA9IGltcHJlc3Npb25UZXh0O1xyXG4gICAgICAvLyBhbGxSZXBvcnRUZXh0W3JlcG9ydFRleHRPYmouc2VjdGlvbklkXSA9IHJlcG9ydFRleHRPYmo7XHJcbiAgICAgIC8vIH1cclxuICAgIH07XHJcblxyXG4gICAgcmVwb3J0VGV4dFBhcnNlci53cml0ZShlbmRwb2ludENvbnRlbnQpLm9uZW5kKCk7XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0VGV4dEV4cHJlc3Npb25WYWx1ZSh0ZXh0RXhwcmVzc2lvbjogc3RyaW5nKSB7XHJcbiAgICAgIGlmICh0ZXh0RXhwcmVzc2lvbi5pbmRleE9mKCd7JykgPT09IDAgJiYgKHRleHRFeHByZXNzaW9uLmluZGV4T2YoJ30nKSA+IDEpKSB7XHJcbiAgICAgICAgY29uc3Qgc3ViU3RyaW5nID0gdGV4dEV4cHJlc3Npb24uc3Vic3RyKHRleHRFeHByZXNzaW9uLmluZGV4T2YoJ3snKSArIDEsIHRleHRFeHByZXNzaW9uLmluZGV4T2YoJ30nKSAtIDEpO1xyXG4gICAgICAgIGdldFRleHRFeHByZXNzaW9uVmFsdWUoc2VsZWN0ZWRFbGVtZW50c1tzdWJTdHJpbmddKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0ZXh0RXhwcmVzc2lvblZhbHVlID0gdGV4dEV4cHJlc3Npb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlUGFydGlhbFZpZXcocGFydGlhbFZpZXdJZDogc3RyaW5nLCBpc0ltcHJlc3Npb25UZW1wbGF0ZTogYm9vbGVhbikge1xyXG4gICAgICAvLyB0aGlzLnRlbXBsYXRlSWRzID0gW107XHJcbiAgICAgIGNvbnN0IHNheCA9IHJlcXVpcmUoJ3NheCcpLFxyXG4gICAgICAgIHBhcnNlciA9IHNheC5wYXJzZXIoc3RyaWN0LCB0cmltKTtcclxuICAgICAgcGFyc2VyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIC8vIGFuIGVycm9yIGhhcHBlbmVkLlxyXG4gICAgICAgIC8vIHBhcnNlci5yZXN1bWUoKTtcclxuICAgICAgfTtcclxuICAgICAgcGFyc2VyLm9udGV4dCA9IGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgaWYgKGV4ZWN1dGVUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgaWYgKCFpc0ltcHJlc3Npb25UZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAoY2FuSW5zZXJ0VGV4dCAmJiBoYXNTZWN0aW9uTm90ICYmIGhhc1NlY3Rpb25Ob3QgIT09IHVuZGVmaW5lZCAmJiBleGVjdXRlU2VjdGlvbklmTm90KSB7XHJcbiAgICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgdDtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW5JbnNlcnRUZXh0ICYmICFoYXNTZWN0aW9uTm90ICYmIGlzSW1wcmVzc2lvbikge1xyXG4gICAgICAgICAgICAgIGZpbmRpbmdzVGV4dCA9IGZpbmRpbmdzVGV4dCArIHQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FuSW5zZXJ0VGV4dCAmJiBpc05ld1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNhbkluc2VydFRleHQgJiYgaGFzU2VjdGlvbk5vdCAmJiBoYXNTZWN0aW9uTm90ICE9PSB1bmRlZmluZWQgJiYgZXhlY3V0ZVNlY3Rpb25JZk5vdCkge1xyXG4gICAgICAgICAgICAgIGltcHJlc3Npb25UZXh0ID0gaW1wcmVzc2lvblRleHQgKyB0O1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhbkluc2VydFRleHQgJiYgIWhhc1NlY3Rpb25Ob3QgJiYgaXNJbXByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIHQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FuSW5zZXJ0VGV4dCAmJiBpc05ld1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIHBhcnNlci5vbm9wZW50YWcgPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHN3aXRjaCAobm9kZS5uYW1lKSB7XHJcbiAgICAgICAgICBjYXNlICdMYWJlbCc6IGNhbkluc2VydFRleHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdFbmRQb2ludCc6IGlmIChub2RlLmF0dHJpYnV0ZXMuSWQgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgICBpc0ltcHJlc3Npb24gPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpc0ltcHJlc3Npb24gPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdJbnNlcnRQYXJ0aWFsJzogY2FuSW5zZXJ0VGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ1JlcG9ydFRleHQnOiBjYW5JbnNlcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdUZW1wbGF0ZVBhcnRpYWwnOiBoYXNTZWN0aW9uTm90ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGV4ZWN1dGVTZWN0aW9uSWZOb3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKG5vZGUuYXR0cmlidXRlcy5JZCA9PT0gcGFydGlhbFZpZXdJZCkge1xyXG4gICAgICAgICAgICAgIGV4ZWN1dGVUZW1wbGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgaXNOZXdUZW1wbGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaXNOZXdUZW1wbGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGV4ZWN1dGVUZW1wbGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ1NlY3Rpb25JZlZhbHVlTm90JzogaWYgKGV4ZWN1dGVUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSkpIHtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbWFwcmlzb25WYWx1ZSBvZiBzZWxlY3RlZENvbXBhcmlzb25WYWx1ZXNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWQgKyAnQ29tcGFyaXNvblZhbHVlJ10pIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb21hcHJpc29uVmFsdWUgIT09IG5vZGUuYXR0cmlidXRlcy5Db21wYXJpc29uVmFsdWUgJiZcclxuICAgICAgICAgICAgICAgICAgY29tYXByaXNvblZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWlzU2VjdGlvbklmKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBleGVjdXRlU2VjdGlvbklmTm90ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTZWN0aW9uSWZOb3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IG5vZGUuYXR0cmlidXRlcy5Db21wYXJpc29uVmFsdWUgJiZcclxuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJy0tU2VsZWN0LS0nICYmXHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgZXhlY3V0ZVNlY3Rpb25JZk5vdCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGV4ZWN1dGVTZWN0aW9uSWZOb3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgICBoYXNTZWN0aW9uTm90ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnU2VjdGlvbklmJzpcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQgJiYgc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0ubGVuZ3RoID4gMCAmJiAoIWhhc1NlY3Rpb25Ob3QgfHwgKGhhc1NlY3Rpb25Ob3QgJiYgZXhlY3V0ZVNlY3Rpb25JZk5vdCkpXHJcbiAgICAgICAgICAgICAgJiYgc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09ICdPdGhlciwgcGxlYXNlIHNwZWNpZnnDosKAwqYnKSB7XHJcbiAgICAgICAgICAgICAgaXNTZWN0aW9uSWYgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlzU2VjdGlvbklmID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnU2VjdGlvbklmVmFsdWUnOlxyXG4gICAgICAgICAgICBpZiAoZXhlY3V0ZVRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0pKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbWFwcmlzb25WYWx1ZSBvZiBzZWxlY3RlZENvbXBhcmlzb25WYWx1ZXNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWQgKyAnQ29tcGFyaXNvblZhbHVlJ10pIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGNvbWFwcmlzb25WYWx1ZSA9PT0gbm9kZS5hdHRyaWJ1dGVzLkNvbXBhcmlzb25WYWx1ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbWFwcmlzb25WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNTZWN0aW9uSWYgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gdW5kZWZpbmVkICYmICFpc1NlY3Rpb25JZiAmJiBzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZpbmRpbmdzVGV4dCA9IGZpbmRpbmdzVGV4dCArIHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpc1NlY3Rpb25JZiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gPT09IG5vZGUuYXR0cmlidXRlcy5Db21wYXJpc29uVmFsdWUgJiZcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlzU2VjdGlvbklmID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gdW5kZWZpbmVkICYmICFpc1NlY3Rpb25JZiAmJiBzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpicpIHtcclxuICAgICAgICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYW5JbnNlcnRUZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ0luc2VydFZhbHVlJzpcclxuICAgICAgICAgICAgaWYgKGV4ZWN1dGVUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgIGluc2VydFZhbHVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBjb25zdCBjaG9pY2VUZXh0ID0gc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF07XHJcbiAgICAgICAgICAgICAgaWYgKG5vZGUuYXR0cmlidXRlcy5JZCA9PT0gJ2ZpbmRpbmdzJyB8fCBjYW5JbnNlcnRUZXh0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNJbXByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCAmJiBoYXNTZWN0aW9uTm90ICYmIGV4ZWN1dGVTZWN0aW9uSWZOb3QgJiYgc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09ICdPdGhlciwgcGxlYXNlIHNwZWNpZnnDosKAwqYnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGltcHJlc3Npb25UZXh0ID0gaW1wcmVzc2lvblRleHQgKyAoQXJyYXkuaXNBcnJheShjaG9pY2VUZXh0KSA/IGNob2ljZVRleHQuam9pbignLCAnKSA6IGNob2ljZVRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpbXByZXNzaW9uVGV4dCA9IGltcHJlc3Npb25UZXh0ICsgKEFycmF5LmlzQXJyYXkoY2hvaWNlVGV4dCkgPyBjaG9pY2VUZXh0LmpvaW4oJywgJykgOiBjaG9pY2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCAmJiAhaGFzU2VjdGlvbk5vdCAmJiBzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpicpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvblRleHQgPSBpbXByZXNzaW9uVGV4dCArIChBcnJheS5pc0FycmF5KGNob2ljZVRleHQpID8gY2hvaWNlVGV4dC5qb2luKCcsICcpIDogY2hvaWNlVGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gdW5kZWZpbmVkICYmIHNlbGVjdGVkQ2hvaWNlVGV4dHNbbm9kZS5hdHRyaWJ1dGVzLkRhdGFFbGVtZW50SWRdICE9PSAnT3RoZXIsIHBsZWFzZSBzcGVjaWZ5w6LCgMKmJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXByZXNzaW9uVGV4dCA9IGltcHJlc3Npb25UZXh0ICsgKEFycmF5LmlzQXJyYXkoY2hvaWNlVGV4dCkgPyBjaG9pY2VUZXh0LmpvaW4oJywgJykgOiBjaG9pY2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gdW5kZWZpbmVkICYmIGhhc1NlY3Rpb25Ob3QgJiYgZXhlY3V0ZVNlY3Rpb25JZk5vdCAmJiBzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpicpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgKEFycmF5LmlzQXJyYXkoY2hvaWNlVGV4dCkgPyBjaG9pY2VUZXh0LmpvaW4oJywgJykgOiBjaG9pY2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCAmJiAhaGFzU2VjdGlvbk5vdCAmJiBzZWxlY3RlZENob2ljZVRleHRzW25vZGUuYXR0cmlidXRlcy5EYXRhRWxlbWVudElkXSAhPT0gJ090aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpicpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRDaG9pY2VUZXh0c1tub2RlLmF0dHJpYnV0ZXMuRGF0YUVsZW1lbnRJZF0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZmluZGluZ3NUZXh0ID0gZmluZGluZ3NUZXh0ICsgKEFycmF5LmlzQXJyYXkoY2hvaWNlVGV4dCkgPyBjaG9pY2VUZXh0LmpvaW4oJywgJykgOiBjaG9pY2VUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIHBhcnNlci5vbmNsb3NldGFnID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgICBzd2l0Y2ggKG5vZGUpIHtcclxuICAgICAgICAgIGNhc2UgJ1NlY3Rpb25JZlZhbHVlTm90JzpcclxuICAgICAgICAgICAgZXhlY3V0ZVNlY3Rpb25JZk5vdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBoYXNTZWN0aW9uTm90ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChpc1NlY3Rpb25JZikge1xyXG4gICAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnVGVtcGxhdGVQYXJ0aWFsJzpcclxuICAgICAgICAgICAgaXNOZXdUZW1wbGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGNhbkluc2VydFRleHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgZXhlY3V0ZVRlbXBsYXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdJbnNlcnRQYXJ0aWFsJzpcclxuICAgICAgICAgICAgY2FuSW5zZXJ0VGV4dCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnU2VjdGlvbklmJyB8fCAnU2VjdGlvbklmVmFsdWUnOlxyXG4gICAgICAgICAgICBpc1NlY3Rpb25JZiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBwYXJzZXIub25lbmQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gcGFyc2VyIHN0cmVhbSBpcyBkb25lLCBhbmQgcmVhZHkgdG8gaGF2ZSBtb3JlIHN0dWZmIHdyaXR0ZW4gdG8gaXQuXHJcbiAgICAgICAgY29uc3QgcmVwb3J0VGV4dE9iajogQWxsUmVwb3J0VGV4dCA9IG5ldyBBbGxSZXBvcnRUZXh0KCk7XHJcbiAgICAgICAgcmVwb3J0VGV4dE9iai5zZWN0aW9uSWQgPSAnZmluZGluZ3MnO1xyXG4gICAgICAgIHJlcG9ydFRleHRPYmoucmVwb3J0VGV4dCA9IGZpbmRpbmdzVGV4dDtcclxuICAgICAgICBhbGxSZXBvcnRUZXh0W3JlcG9ydFRleHRPYmouc2VjdGlvbklkXSA9IHJlcG9ydFRleHRPYmo7XHJcbiAgICAgIH07XHJcbiAgICAgIHBhcnNlci53cml0ZSh0ZW1wbGF0ZVBhcnRpYWxzVGV4dCkub25lbmQoKTtcclxuXHJcbiAgICB9XHJcbiAgICB0aGlzLm1haW5SZXBvcnRUZXh0T2JqID0gbmV3IE1haW5SZXBvcnRUZXh0KCk7XHJcbiAgICB0aGlzLm1haW5SZXBvcnRUZXh0T2JqLnJlcG9ydFRleHRNYWluQ29udGVudCA9IHJlcG9ydFRleHRDb250ZW50O1xyXG4gICAgdGhpcy5tYWluUmVwb3J0VGV4dE9iai5hbGxSZXBvcnRUZXh0ID0gYWxsUmVwb3J0VGV4dDtcclxuICAgIHRoaXMucmV0dXJuUmVwb3J0VGV4dC5lbWl0KHRoaXMubWFpblJlcG9ydFRleHRPYmopO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENob2ljZUVsZW1lbnQge1xyXG4gIGVsZW1lbnRJZDogc3RyaW5nO1xyXG4gIHNlbGVjdGVkVmFsdWU6IHN0cmluZztcclxuICBzZWxlY3RlZFRleHQ6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE51bWVyaWNFbGVtZW50IHtcclxuICBlbGVtZW50SWQ6IHN0cmluZztcclxuICBzZWxlY3RlZFZhbHVlOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNdWx0aUNob2ljZUVsZW1lbnQge1xyXG4gIGVsZW1lbnRJZDogc3RyaW5nO1xyXG4gIHNlbGVjdGVkVmFsdWVzOiBzdHJpbmdbXTtcclxuICBzZWxlY3RlZENvbXBhcmlzb25WYWx1ZXM6IHN0cmluZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQWxsRWxlbWVudHMge1xyXG4gIGVsZW1lbnRJZDogc3RyaW5nO1xyXG4gIHNlbGVjdGVkVmFsdWVzOiBhbnlbXTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1haW5SZXBvcnRUZXh0IHtcclxuICByZXBvcnRUZXh0TWFpbkNvbnRlbnQ6IHN0cmluZztcclxuICBhbGxSZXBvcnRUZXh0OiBBbGxSZXBvcnRUZXh0W107XHJcbn1cclxuZXhwb3J0IGNsYXNzIEFsbFJlcG9ydFRleHQge1xyXG4gIHNlY3Rpb25JZDogc3RyaW5nO1xyXG4gIHJlcG9ydFRleHQ6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVkUmVzdWx0SGlzdG9yeSB7XHJcbiAgcmVzdWx0Q29uZGl0aW9uOiBzdHJpbmc7XHJcbiAgcmVzdWx0VmFsdWU6IGFueTtcclxufVxyXG5leHBvcnQgY2xhc3MgRmluYWxFeGVjdXRlZEhpc3Rvcnkge1xyXG4gIGV4ZWN1dGlvbkhpc3RvcmllczogRXhlY3V0ZWRSZXN1bHRIaXN0b3J5W107XHJcbiAgcmVzdWx0VGV4dDogTWFpblJlcG9ydFRleHQ7XHJcbiAgaW5wdXREYXRhOiBJbnB1dERhdGFbXTtcclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci1oaW50LWRpYWdyYW0nLFxyXG4gIHRlbXBsYXRlOiBgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGFFbGVtZW50ICE9PSB1bmRlZmluZWRcIj5cclxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4teHNcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgYXR0ci5kYXRhLXRhcmdldD1cIiN7eydkaWFnXycrZGF0YUVsZW1lbnQuaWR9fVwiXHJcbiAgICAoY2xpY2spPVwicmVzZXRDYXJvdXNlbEluZGV4KClcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1waWN0dXJlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS10b2dnbGU9XCJ0b29sdGlwXCIgZGF0YS1wbGFjZW1lbnQ9XCJyaWdodFwiIHRpdGxlPVwiSGludCBEaWFncmFtc1wiPjwvc3Bhbj5cclxuICA8L2J1dHRvbj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwgaW5tb2RhbCBmYWRlXCIgaWQ9XCJ7eydkaWFnXycrZGF0YUVsZW1lbnQuaWR9fVwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWxnXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkNsb3NlPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZSBmbG9hdC1sZWZ0XCI+e3tkYXRhRWxlbWVudC5sYWJlbH19PC9oND5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGNhcm91c2VsIFsoYWN0aXZlU2xpZGUpXT1cImFjdGl2ZVNsaWRlSW5kZXhcIiBpbnRlcnZhbD1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGlhZyBvZiBkYXRhRWxlbWVudC5kaWFncmFtcyBcIj5cclxuICAgICAgICAgICAgICAgIDxzbGlkZT5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXJlc3BvbnNpdmUgbWF4LXctaC0xMDBcIiBbc3JjXT1cImRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKGdldEltYWdlRGF0YVVybChkaWFnLmxvY2F0aW9uKSlcIiBhbHQ9XCJ7eyBkaWFnLmxhYmVsIH19XCI+XHJcbiAgICAgICAgICAgICAgICA8L3NsaWRlPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Nhcm91c2VsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPkNsb3NlPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG5gLFxyXG4gIHN0eWxlczogW2BgLCBgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0ucGFkZGluZy1sLTV7cGFkZGluZy1sZWZ0OjVweH0ud2hpdGVzcGFjZXttYXJnaW4tbGVmdDo1cHh9Lm1heC13LWgtMTAwe21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbD4uZmF7Zm9udC1zaXplOjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMjBweH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLmxlZnQsLmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LnNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXNpbXVsYXRvci1mb3JtLWhlaWdodHtoZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KTtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXJlcG9ydC10ZXh0LXNjcm9sbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMzAwcHgpfS5wYWRkaW5nLXItMTB7cGFkZGluZy1yaWdodDoxMHB4fS5zbGlkZS1sZWZ0e2xlZnQ6MzBweH0uc2xpZGUtcmlnaHR7cmlnaHQ6MzBweH1ocnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS53aGl0ZS1zcGFjZS1saW5le3doaXRlLXNwYWNlOnByZS1saW5lO3dvcmQtd3JhcDpicmVhay13b3JkfXB7bWFyZ2luOjAgMCAxMHB4fS5mb3JtLWNvbnRyb2x7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6I2QyZDZkZX1oNC5tb2RhbC10aXRsZS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnR9Lm1hcmdpbi1iLTB7bWFyZ2luLWJvdHRvbTowfS5mb250LXdlaWdodC00MDB7Zm9udC13ZWlnaHQ6NDAwfS5jdXN0b20tcmFkaW8tc3R5bGV7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTVweH0uem9vbXt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG99Lnpvb20gaW1ne2hlaWdodDphdXRvO3dpZHRoOjEwMCU7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOmluaGVyaXQhaW1wb3J0YW50fS5idG4tem9vbXtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ0NDtib3JkZXItY29sb3I6I2RkZH0uYnRuLXpvb20uaG92ZXIsLmJ0bi16b29tOmFjdGl2ZSwuYnRuLXpvb206aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXtsYWJlbC5jb250cm9sLWxhYmVse3BhZGRpbmctbGVmdDoyMHB4fX0ucGFkZGluZy01e3BhZGRpbmc6NXB4fWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBIaW50RGlhZ3JhbUNvbXBvbmVudCB7XHJcbiAgQElucHV0KCkgZGF0YUVsZW1lbnQ6IEJhc2VEYXRhRWxlbWVudDtcclxuICBASW5wdXQoKSBpbWFnZVBhdGg6IHN0cmluZztcclxuICBpc0RhdGFVUkwgPSAvXlxccypkYXRhOihbYS16XStcXC9bYS16XSsoO1thLXpcXC1dK1xcPVthLXpcXC1dKyk/KT8oO2Jhc2U2NCk/LFthLXowLTlcXCFcXCRcXCZcXCdcXCxcXChcXClcXCpcXCtcXCxcXDtcXD1cXC1cXC5cXF9cXH5cXDpcXEBcXC9cXD9cXCVcXHNdKlxccyokL2k7XHJcbiAgYWN0aXZlU2xpZGVJbmRleCA9IDA7XHJcbiAgZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7XHJcbiAgICB0aGlzLmRvbVNhbml0aXplciA9IGRvbVNhbml0aXplcjtcclxuICB9XHJcblxyXG4gIHJlc2V0Q2Fyb3VzZWxJbmRleCgpIHtcclxuICAgIHRoaXMuYWN0aXZlU2xpZGVJbmRleCA9IDA7XHJcbiAgfVxyXG5cclxuICBnZXRJbWFnZURhdGFVcmwobG9jYXRpb246IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBpc0RhdGFVUkwgPSAhIWxvY2F0aW9uLm1hdGNoKHRoaXMuaXNEYXRhVVJMKTtcclxuICAgIGlmIChpc0RhdGFVUkwpIHtcclxuICAgICAgbG9jYXRpb24gPSBsb2NhdGlvbi5yZXBsYWNlKCd1bnNhZmU6JywgJycpO1xyXG4gICAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5pbWFnZVBhdGggKyAnLycgKyBsb2NhdGlvbjtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHtCYXNlRGF0YUVsZW1lbnR9IGZyb20gJy4vYmFzZS1kYXRhLWVsZW1lbnQubW9kZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdsb2JhbFZhbHVlIGV4dGVuZHMgIEJhc2VEYXRhRWxlbWVudCB7XHJcblxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGlhZ3JhbVNlcnZpY2UgfSBmcm9tICcuL2RpYWdyYW0uc2VydmljZSc7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50Q3JlYXRpb25CYXNlU2VydmljZSB9IGZyb20gJy4vZGF0YS1lbGVtZW50LWNyZWF0aW9uLWJhc2Utc2VydmljZSc7XHJcbmltcG9ydCB7IEdsb2JhbFZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvZ2xvYmFsdmFsdWUubW9kZWwnO1xyXG5pbXBvcnQgeyBCYXNlRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9iYXNlLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBHbG9iYWxWYWx1ZUNyZWF0aW9uU2VydmljZSBleHRlbmRzIERhdGFFbGVtZW50Q3JlYXRpb25CYXNlU2VydmljZSB7XHJcblxyXG5cclxuICBjcmVhdGVFbGVtZW50KGRhdGE6IGFueSk6IEJhc2VEYXRhRWxlbWVudCB7XHJcbiAgIGNvbnN0IGRhdGFFbGVtZW50ID0gbmV3IEdsb2JhbFZhbHVlKCk7XHJcbiAgIGRhdGFFbGVtZW50LmlkICA9IGRhdGEuQXR0ci5JZDtcclxuICAgZGF0YUVsZW1lbnQuY3VycmVudFZhbHVlID0gZGF0YS5fO1xyXG4gICBkYXRhRWxlbWVudC5kYXRhRWxlbWVudFR5cGUgPSAnR2xvYmFsVmFsdWUnO1xyXG4gICAgcmV0dXJuIGRhdGFFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoZGlhZ3JhbVNlcnZpY2U6IERpYWdyYW1TZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihkaWFncmFtU2VydmljZSk7XHJcbiAgICB0aGlzLmVsZW1lbnRUeXBlID0gJ0dsb2JhbFZhbHVlJztcclxuICB9XHJcblxyXG59XHJcbiIsImV4cG9ydCBjbGFzcyBTZWxlY3RlZENvbmRpdGlvbiB7XHJcbiAgICBzZWxlY3RlZENvbmRpdGlvbklkOiBzdHJpbmc7XHJcbiAgICBzZWxlY3RlZENvbmRpdGlvbjogYW55O1xyXG4gICAgc2VsZWN0ZWRWYWx1ZTogYW55O1xyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEFmdGVyVmlld0luaXQsIFNpbXBsZUNoYW5nZXMsIFNpbXBsZUNoYW5nZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOdW1lcmljRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9udW1lcmljLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IE51bWVyaWNFbGVtZW50IH0gZnJvbSAnLi4vYXNzaXN0LWRhdGEtZWxlbWVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTZWxlY3RlZENvbmRpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2V4ZWN1dGVkLXJlc3VsdC5tb2RlbCc7XHJcbmltcG9ydCB7IFNpbXVsYXRvckVuZ2luZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3NpbXVsYXRvci1lbmdpbmUuc2VydmljZSc7XHJcbmltcG9ydCB7IFNpbXVsYXRvckNvbW11bmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3NpbXVsYXRvci1jb21tdW5pY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci1hc3Npc3QtbnVtZXJpYy1lbGVtZW50JyxcclxuICB0ZW1wbGF0ZTogYDxmb3JtIFtmb3JtR3JvdXBdPVwibnVtZXJpY0VsZW1lbnRGb3JtXCIgbm92YWxpZGF0ZT5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS01IHRleHQtcmlnaHRcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbCBicmVhay13b3JkXCI+XHJcbiAgICAgICAge3tudW1lcmljRGF0YUVsZW1lbnQubGFiZWx9fVxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwibnVtZXJpY0RhdGFFbGVtZW50LnVuaXQgIT0gdW5kZWZpbmVkICYmIG51bWVyaWNEYXRhRWxlbWVudC51bml0ICE9ICcnXCI+ICh7e251bWVyaWNEYXRhRWxlbWVudC51bml0fX0pPC9zcGFuPlxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibnVtZXJpY0RhdGFFbGVtZW50LmhpbnQgIT09ICcnICYmIG51bWVyaWNEYXRhRWxlbWVudC5oaW50ICE9PSB1bmRlZmluZWRcIj5cclxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWluZm8tY2lyY2xlIHRleHQtcHJpbWFyeSB3aGl0ZXNwYWNlXCIgdGl0bGU9XCJ7e251bWVyaWNEYXRhRWxlbWVudC5oaW50fX1cIj48L2k+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibnVtZXJpY0RhdGFFbGVtZW50LmRpYWdyYW1zICE9IHVuZGVmaW5lZCBcIj5cclxuICAgICAgICA8YWNyLWhpbnQtZGlhZ3JhbSBbZGF0YUVsZW1lbnRdPVwibnVtZXJpY0RhdGFFbGVtZW50XCIgW2ltYWdlUGF0aF09XCJpbWFnZVBhdGhcIj48L2Fjci1oaW50LWRpYWdyYW0+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGhpcy5udW1lcmljRGF0YUVsZW1lbnQuaXNSZXF1aXJlZFwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwibnVtZXJpY0VsZW1lbnRGb3JtLmNvbnRyb2xzWydudW1lcmljRWxlbWVudCddLmludmFsaWRcIj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwibnVtZXJpY0VsZW1lbnRGb3JtLmNvbnRyb2xzWydudW1lcmljRWxlbWVudCddLmVycm9ycy5yZXF1aXJlZFwiIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiB0aXRsZT1cIlJlcXVpcmVkIEZpZWxkXCI+XHJcbiAgICAgICAgICAgICpcclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cIm51bWVyaWNFbGVtZW50Rm9ybS5jb250cm9sc1snbnVtZXJpY0VsZW1lbnQnXS5pbnZhbGlkICYmIG51bWVyaWNFbGVtZW50Rm9ybS5jb250cm9sc1snbnVtZXJpY0VsZW1lbnQnXS5lcnJvcnMubWluXCJcclxuICAgICAgICBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgdGl0bGU9XCIgTWluaW11bSB2YWx1ZSBpcyB7e251bWVyaWNEYXRhRWxlbWVudC5taW5pbXVtfX1cIj5cclxuICAgICAgICAqXHJcbiAgICAgIDwvc3Bhbj4gICAgICBcclxuICAgICAgPHNwYW4gKm5nSWY9XCJudW1lcmljRWxlbWVudEZvcm0uY29udHJvbHNbJ251bWVyaWNFbGVtZW50J10uaW52YWxpZCAmJiBudW1lcmljRWxlbWVudEZvcm0uY29udHJvbHNbJ251bWVyaWNFbGVtZW50J10uZXJyb3JzLm1heFwiXHJcbiAgICAgICAgY2xhc3M9XCJyZXF1aXJlZC1maWVsZFwiIHRpdGxlPVwiIE1heGltdW0gdmFsdWUgaXMge3tudW1lcmljRGF0YUVsZW1lbnQubWF4aW11bX19XCI+XHJcbiAgICAgICAgKlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJudW1lcmljRGF0YUVsZW1lbnQuZGF0YUVsZW1lbnRUeXBlID09PSAnTnVtZXJpY0RhdGFFbGVtZW50J1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTdcIj5cclxuICAgICAgICA8aW5wdXQgW2F0dHIuZGlzYWJsZWRdPVwibnVtZXJpY0RhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIGFjck51bWVyaWNPbmx5IFsobmdNb2RlbCldPVwibnVtYmVyVmFsdWVcIiBpZD1cInt7bnVtZXJpY0RhdGFFbGVtZW50LmlkfX1cIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibnVtZXJpY0VsZW1lbnRcIlxyXG4gICAgICAgICAgb25wYXN0ZT1cInJldHVybiBmYWxzZTtcIiAoaW5wdXQpPVwiY2hvaWNlU2VsZWN0ZWQoJGV2ZW50LnRhcmdldCwgbnVtZXJpY0RhdGFFbGVtZW50LmxhYmVsKVwiXHJcbiAgICAgICAgICBtaW49XCJ7e251bWVyaWNEYXRhRWxlbWVudC5taW5pbXVtfX1cIiBtYXg9XCJ7e251bWVyaWNEYXRhRWxlbWVudC5tYXhpbXVtfX1cIiByZXF1aXJlZD4gICAgICAgICAgXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibnVtZXJpY0RhdGFFbGVtZW50LmRhdGFFbGVtZW50VHlwZSA9PT0gJ0ludGVnZXJEYXRhRWxlbWVudCdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03XCI+XHJcbiAgICAgICAgPGlucHV0IFthdHRyLmRpc2FibGVkXT1cIm51bWVyaWNEYXRhRWxlbWVudC5pc0VkaXRhYmxlID09IGZhbHNlID8gJ2Rpc2FibGVkJyA6IG51bGxcIiBbKG5nTW9kZWwpXT1cIm51bWJlclZhbHVlXCIgaWQ9XCJ7e251bWVyaWNEYXRhRWxlbWVudC5pZH19XCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cIm51bWVyaWNFbGVtZW50XCJcclxuICAgICAgICAgIChrZXlwcmVzcyk9XCJvbmx5SW50ZWdlcktleSgkZXZlbnQpXCIgb25wYXN0ZT1cInJldHVybiBmYWxzZTtcIiAoaW5wdXQpPVwiY2hvaWNlU2VsZWN0ZWQoJGV2ZW50LnRhcmdldCwgbnVtZXJpY0RhdGFFbGVtZW50LmxhYmVsKVwiXHJcbiAgICAgICAgICBtaW49XCJ7e251bWVyaWNEYXRhRWxlbWVudC5taW5pbXVtfX1cIiBtYXg9XCJ7e251bWVyaWNEYXRhRWxlbWVudC5tYXhpbXVtfX1cIiByZXF1aXJlZD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPlxyXG5gLFxyXG4gIHN0eWxlczogW2BgLCBgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0ucGFkZGluZy1sLTV7cGFkZGluZy1sZWZ0OjVweH0ud2hpdGVzcGFjZXttYXJnaW4tbGVmdDo1cHh9Lm1heC13LWgtMTAwe21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbD4uZmF7Zm9udC1zaXplOjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMjBweH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLmxlZnQsLmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LnNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXNpbXVsYXRvci1mb3JtLWhlaWdodHtoZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KTtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXJlcG9ydC10ZXh0LXNjcm9sbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMzAwcHgpfS5wYWRkaW5nLXItMTB7cGFkZGluZy1yaWdodDoxMHB4fS5zbGlkZS1sZWZ0e2xlZnQ6MzBweH0uc2xpZGUtcmlnaHR7cmlnaHQ6MzBweH1ocnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS53aGl0ZS1zcGFjZS1saW5le3doaXRlLXNwYWNlOnByZS1saW5lO3dvcmQtd3JhcDpicmVhay13b3JkfXB7bWFyZ2luOjAgMCAxMHB4fS5mb3JtLWNvbnRyb2x7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6I2QyZDZkZX1oNC5tb2RhbC10aXRsZS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnR9Lm1hcmdpbi1iLTB7bWFyZ2luLWJvdHRvbTowfS5mb250LXdlaWdodC00MDB7Zm9udC13ZWlnaHQ6NDAwfS5jdXN0b20tcmFkaW8tc3R5bGV7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTVweH0uem9vbXt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG99Lnpvb20gaW1ne2hlaWdodDphdXRvO3dpZHRoOjEwMCU7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOmluaGVyaXQhaW1wb3J0YW50fS5idG4tem9vbXtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ0NDtib3JkZXItY29sb3I6I2RkZH0uYnRuLXpvb20uaG92ZXIsLmJ0bi16b29tOmFjdGl2ZSwuYnRuLXpvb206aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXtsYWJlbC5jb250cm9sLWxhYmVse3BhZGRpbmctbGVmdDoyMHB4fX0ucGFkZGluZy01e3BhZGRpbmc6NXB4fWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3Npc3ROdW1lcmljRWxlbWVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgQElucHV0KCkgbnVtZXJpY0RhdGFFbGVtZW50OiBOdW1lcmljRGF0YUVsZW1lbnQ7XHJcbiAgQElucHV0KCkgaW1hZ2VQYXRoOiBzdHJpbmc7XHJcbiAgQE91dHB1dCgpIHJldHVybk51bWVyaWNFbGVtZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIG51bWVyaWNFbGVtZW50Rm9ybTogRm9ybUdyb3VwO1xyXG4gIHNlbGVjdGVkQ29uZGl0aW9uOiBTZWxlY3RlZENvbmRpdGlvbjtcclxuICBudW1iZXJWYWx1ZTogbnVtYmVyO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLCBwcml2YXRlIHNpbXVsYXRvckVuZ2luZVNlcnZpY2U6IFNpbXVsYXRvckVuZ2luZVNlcnZpY2UsXHJcbiAgICBzaW11bGF0b3JDb21tdW5pY2F0aW9uU2VydmljZTogU2ltdWxhdG9yQ29tbXVuaWNhdGlvblNlcnZpY2UpIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gc2ltdWxhdG9yQ29tbXVuaWNhdGlvblNlcnZpY2Uuc2ltdWxhdG9yU291cmNlJC5zdWJzY3JpYmUoXHJcbiAgICAgIG1pc3Npb24gPT4ge1xyXG4gICAgICAgIHRoaXMuVXBkYXRlRm9ybVZhbGlkYXRvcigpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1c2UtbGlmZS1jeWNsZS1pbnRlcmZhY2VcclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vIHByZXZlbnQgbWVtb3J5IGxlYWsgd2hlbiBjb21wb25lbnQgZGVzdHJveWVkXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmNyZWF0ZU51bWVyaWNFbGVtZW50Rm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnVzZS1saWZlLWN5Y2xlLWludGVyZmFjZVxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgW3Byb3BLZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZSB9KSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnYXNkYScpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubnVtZXJpY0RhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMubnVtZXJpY0RhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSAhPT0gMCkge1xyXG4gICAgICB0aGlzLnNpbXVsYXRvckVuZ2luZVNlcnZpY2UuYWRkT3JVcGRhdGVEYXRhRWxlbWVudCh0aGlzLm51bWVyaWNEYXRhRWxlbWVudC5pZCwgdGhpcy5udW1lcmljRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlLFxyXG4gICAgICAgIHRoaXMubnVtZXJpY0RhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgIHRoaXMubnVtYmVyVmFsdWUgPSB0aGlzLm51bWVyaWNEYXRhRWxlbWVudC5jdXJyZW50VmFsdWU7XHJcbiAgICAgIHRoaXMubG9hZGVkTnVtZXJpY1ZhbHVlKHRoaXMubnVtZXJpY0RhdGFFbGVtZW50LmlkLCB0aGlzLm51bWVyaWNEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUsIHRoaXMubnVtZXJpY0RhdGFFbGVtZW50LmxhYmVsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmV0dXJuTnVtZXJpY0VsZW1lbnQuZW1pdCh1bmRlZmluZWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZGVkTnVtZXJpY1ZhbHVlKGlkLCB2YWx1ZSwgc2VsZWN0ZWRDb25kaXRpb24pIHtcclxuICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBuZXcgTnVtZXJpY0VsZW1lbnQoKTtcclxuICAgIGNob2ljZUVsZW1lbnQuZWxlbWVudElkID0gaWQ7XHJcbiAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gbmV3IFNlbGVjdGVkQ29uZGl0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbklkID0gaWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uID0gc2VsZWN0ZWRDb25kaXRpb247XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkVmFsdWUgPSB2YWx1ZTtcclxuICAgIHRoaXMucmV0dXJuTnVtZXJpY0VsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG5cclxuICBjaG9pY2VTZWxlY3RlZChlbGVtZW50LCBzZWxlY3RlZENvbmRpdGlvbikge1xyXG4gICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IG5ldyBOdW1lcmljRWxlbWVudCgpO1xyXG4gICAgY2hvaWNlRWxlbWVudC5lbGVtZW50SWQgPSBlbGVtZW50LmlkO1xyXG4gICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFZhbHVlID0gZWxlbWVudC52YWx1ZTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gbmV3IFNlbGVjdGVkQ29uZGl0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbklkID0gZWxlbWVudC5pZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb24gPSBzZWxlY3RlZENvbmRpdGlvbjtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRWYWx1ZSA9IGVsZW1lbnQudmFsdWU7XHJcbiAgICB0aGlzLnJldHVybk51bWVyaWNFbGVtZW50LmVtaXQoeyByZWNlaXZlZEVsZW1lbnQ6IGNob2ljZUVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uOiB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uIH0pO1xyXG4gIH1cclxuXHJcbiAgb25seUludGVnZXJLZXkoZXZlbnQpIHtcclxuICAgIHJldHVybiAoZXZlbnQuY2hhckNvZGUgPT09IDggfHwgZXZlbnQuY2hhckNvZGUgPT09IDApID8gbnVsbCA6IGV2ZW50LmNoYXJDb2RlID49IDQ4ICYmIGV2ZW50LmNoYXJDb2RlIDw9IDU3O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVOdW1lcmljRWxlbWVudEZvcm0oKSB7XHJcbiAgICB0aGlzLm51bWVyaWNFbGVtZW50Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBudW1lcmljRWxlbWVudDogWycnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKCt0aGlzLm51bWVyaWNEYXRhRWxlbWVudC5taW5pbXVtKSwgVmFsaWRhdG9ycy5tYXgoK3RoaXMubnVtZXJpY0RhdGFFbGVtZW50Lm1heGltdW0pXSldLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBVcGRhdGVGb3JtVmFsaWRhdG9yKCkge1xyXG4gICAgdGhpcy5udW1lcmljRWxlbWVudEZvcm0uY29udHJvbHNbJ251bWVyaWNFbGVtZW50J10uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgVmFsaWRhdG9ycy5taW4oK3RoaXMubnVtZXJpY0RhdGFFbGVtZW50Lm1pbmltdW0pLCBWYWxpZGF0b3JzLm1heCgrdGhpcy5udW1lcmljRGF0YUVsZW1lbnQubWF4aW11bSldKV0pO1xyXG4gICAgdGhpcy5udW1lcmljRWxlbWVudEZvcm0uY29udHJvbHNbJ251bWVyaWNFbGVtZW50J10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENob2ljZURhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLWRhdGEtZWxlbWVudC1tb2RlbCc7XHJcbmltcG9ydCB7IENob2ljZUVsZW1lbnQgfSBmcm9tICcuLi9hc3Npc3QtZGF0YS1lbGVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNlbGVjdGVkQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvZXhlY3V0ZWQtcmVzdWx0Lm1vZGVsJztcclxuY29uc3QgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9zaW11bGF0b3ItZW5naW5lLnNlcnZpY2UnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci1hc3Npc3QtY2hvaWNlLWVsZW1lbnQnLFxyXG4gIHRlbXBsYXRlOiBgPGZvcm0gW2Zvcm1Hcm91cF09XCJjaG9pY2VFbGVtZW50Rm9ybVwiIG5vdmFsaWRhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNSB0ZXh0LXJpZ2h0XCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWwgYnJlYWstd29yZFwiPlxyXG4gICAgICAgIHt7Y2hvaWNlRGF0YUVsZW1lbnQubGFiZWx9fSA8c3BhbiAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LnVuaXQgIT0gdW5kZWZpbmVkICYmIGNob2ljZURhdGFFbGVtZW50LnVuaXQgIT0gJydcIj4gKHt7Y2hvaWNlRGF0YUVsZW1lbnQudW5pdH19KTwvc3Bhbj5cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmhpbnQgIT09ICcnICYmIGNob2ljZURhdGFFbGVtZW50LmhpbnQgIT09IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwid2hpdGVzcGFjZVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1pbmZvLWNpcmNsZSB0ZXh0LXByaW1hcnlcIiBkYXRhLXRvZ2dsZT1cInRvb2x0aXBcIiBkYXRhLXBsYWNlbWVudD1cInJpZ2h0XCIgdGl0bGU9XCJ7e2Nob2ljZURhdGFFbGVtZW50LmhpbnR9fVwiPjwvc3Bhbj5cclxuICAgICAgICA8L2k+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuZGlhZ3JhbXMgIT0gdW5kZWZpbmVkIFwiPlxyXG4gICAgICAgIDxhY3ItaGludC1kaWFncmFtIFtkYXRhRWxlbWVudF09XCJjaG9pY2VEYXRhRWxlbWVudFwiIFtpbWFnZVBhdGhdPVwiaW1hZ2VQYXRoXCI+PC9hY3ItaGludC1kaWFncmFtPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJjaG9pY2VFbGVtZW50Rm9ybS5jb250cm9sc1snY2hlY2tCb3gnXS5pbnZhbGlkICAmJiB0aGlzLmNob2ljZURhdGFFbGVtZW50LmlzUmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkLWZpZWxkIHdoaXRlc3BhY2VcIlxyXG4gICAgICAgIHRpdGxlPVwiUmVxdWlyZWQgRmllbGRcIj4qPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICBcclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyB0ZXh0LWxlZnQgY29udGVudC1wYWRkaW5nXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvLmxlbmd0aCA8PSAyXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImltYWdlUGF0aCAhPSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaG9pY2VEYXRhRWxlbWVudC5pbWFnZU1hcCA9PSB1bmRlZmluZWRcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2hvaWNlIG9mIGNob2ljZURhdGFFbGVtZW50LmNob2ljZUluZm9cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8gY3VzdG9tLXJhZGlvLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgW2F0dHIuZGlzYWJsZWRdPVwiY2hvaWNlRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZCcgOiBudWxsXCIgWyhuZ01vZGVsKV09XCJjaG9pY2VWYWx1ZVwiIGlkPVwie3tjaG9pY2UudmFsdWV9fV97e2Nob2ljZURhdGFFbGVtZW50LmlkfX1cIiB0eXBlPVwicmFkaW9cIiBmb3JtQ29udHJvbE5hbWU9XCJjaGVja0JveFwiIHZhbHVlPVwie3tjaG9pY2UudmFsdWV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaG9pY2VTZWxlY3RlZChjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwsIChjaG9pY2UucmVwb3J0VGV4dCAhPT0gdW5kZWZpbmVkKSA/IGNob2ljZS5yZXBvcnRUZXh0IDogY2hvaWNlLmxhYmVsLCBjaG9pY2UudmFsdWUpXCI+IHt7Y2hvaWNlLmxhYmVsfX1cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuYWxsb3dGcmVldGV4dFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYWRpbyBjdXN0b20tcmFkaW8tc3R5bGVcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIGlkPVwib3RoZXJfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgdHlwZT1cInJhZGlvXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2hlY2tCb3hcIiB2YWx1ZT1cImZyZWV0ZXh0XCIgKGNoYW5nZSk9XCJjaG9pY2VTZWxlY3RlZChjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwsICdPdGhlcicsICdmcmVldGV4dCcpXCI+IE90aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBpZD0nZGl2X3t7Y2hvaWNlRGF0YUVsZW1lbnQuaWR9fV9vdGhlcic+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgW2F0dHIuZGlzYWJsZWRdPVwiY2hvaWNlRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZCcgOiBudWxsXCIgaWQ9XCJ0eHRfb3RoZXJfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQm94XCIgdmFsdWU9XCJvdGhlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgKGtleXVwKT0ndXBkYXRlRnJlZVRleHQoJGV2ZW50LnRhcmdldCwgY2hvaWNlRGF0YUVsZW1lbnQuaWQsIGNob2ljZURhdGFFbGVtZW50LmxhYmVsKSdcclxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQbGVhc2Ugc3BlY2lmeSAne3tjaG9pY2VEYXRhRWxlbWVudC5sYWJlbH19J1wiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmltYWdlTWFwICE9IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy02IGNvbC1zbS0yXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjaG9pY2Ugb2YgY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8gY3VzdG9tLXJhZGlvLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIFsobmdNb2RlbCldPVwiY2hvaWNlVmFsdWVcIiBpZD1cInt7Y2hvaWNlLnZhbHVlfX1fe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgdHlwZT1cInJhZGlvXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2hlY2tCb3hcIiB2YWx1ZT1cInt7Y2hvaWNlLnZhbHVlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNob2ljZVNlbGVjdGVkKGNob2ljZURhdGFFbGVtZW50LmlkLCBjaG9pY2VEYXRhRWxlbWVudC5sYWJlbCwgKGNob2ljZS5yZXBvcnRUZXh0ICE9PSB1bmRlZmluZWQpID8gY2hvaWNlLnJlcG9ydFRleHQgOiBjaG9pY2UubGFiZWwsIGNob2ljZS52YWx1ZSlcIj4ge3tjaG9pY2UubGFiZWx9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuYWxsb3dGcmVldGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8gY3VzdG9tLXJhZGlvLXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIGlkPVwib3RoZXJfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgdHlwZT1cInJhZGlvXCIgZm9ybUNvbnRyb2xOYW1lPVwiY2hlY2tCb3hcIiB2YWx1ZT1cIm90aGVyXCIgKGNoYW5nZSk9XCJjaG9pY2VTZWxlY3RlZChjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwsICdPdGhlcicsICdmcmVldGV4dCcpXCI+IE90aGVyLCBwbGVhc2Ugc3BlY2lmecOiwoDCpjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGlkPSdkaXZfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19X290aGVyJz5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgIFthdHRyLmRpc2FibGVkXT1cImNob2ljZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiIGlkPVwidHh0X290aGVyX3t7Y2hvaWNlRGF0YUVsZW1lbnQuaWR9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9XCJjaGVja0JveFwiIHZhbHVlPVwib3RoZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAoa2V5dXApPSd1cGRhdGVGcmVlVGV4dCgkZXZlbnQudGFyZ2V0LCBjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwpJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJQbGVhc2Ugc3BlY2lmeSAne3tjaG9pY2VEYXRhRWxlbWVudC5sYWJlbH19J1wiPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtNiBjb2wtc20tMlwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPk9SPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8YWNyLWltYWdlLW1hcCBbRGF0YUVsZW1lbnRdPVwiY2hvaWNlRGF0YUVsZW1lbnRcIiBbaW1hZ2VQYXRoXT1cImltYWdlUGF0aFwiPjwvYWNyLWltYWdlLW1hcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICBcclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNob2ljZURhdGFFbGVtZW50LmNob2ljZUluZm8ubGVuZ3RoID4gMlwiPiAgICAgICAgICAgIFxyXG4gICAgICAgIDxzZWxlY3QgW2F0dHIuZGlzYWJsZWRdPVwiY2hvaWNlRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZCcgOiBudWxsXCJcclxuICAgICAgICAgWyhuZ01vZGVsKV09XCJjaG9pY2VWYWx1ZVwiIGlkPVwie3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgKGNoYW5nZSk9XCJkcm9wZG93bkNob2ljZVNlbGVjdGVkKCRldmVudC50YXJnZXQsIGNob2ljZURhdGFFbGVtZW50LmxhYmVsKVwiXHJcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjaGVja0JveFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XHJcbiAgICAgICAgICA8IS0tIDxvcHRpb24gXHJcbiAgICAgICAgICBbc2VsZWN0ZWRdPVwiY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlID09IGNob2ljZURhdGFFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50ID8gdHJ1ZSA6IGZhbHNlXCI+LS1TZWxlY3QtLTwvb3B0aW9uPlxyXG4gICAgICAgICAtLT5cclxuICAgICAgICAgICA8b3B0aW9uIFtzZWxlY3RlZF09XCJcclxuICAgICAgICAgIGNob2ljZURhdGFFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50ICE9IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICAoY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQuaW5kZXhPZihjaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUpID4gLTEgPyBcclxuICAgICAgICAgIHRydWUgOlxyXG4gICAgICAgICAgdHJ1ZSlcclxuICAgICAgICAgIDogdHJ1ZVwiPi0tU2VsZWN0LS08L29wdGlvbj5cclxuXHJcbiAgICAgICAgICA8IS0tIFtzZWxlY3RlZF09XCJjaG9pY2UudmFsdWUgPT09IGNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZVwiIC0tPlxyXG5cclxuICAgICAgICBcclxuICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNob2ljZSBvZiBjaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvXCJcclxuICAgICAgICAgIFtoaWRkZW5dPVwiY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQgIT0gdW5kZWZpbmVkID8gXHJcbiAgICAgICAgICAgICAgY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQuaW5kZXhPZihjaG9pY2UudmFsdWUpID4gLTEgPyB0cnVlOiBudWxsXHJcbiAgICAgICAgICAgICAgOiBudWxsXCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJjaG9pY2UudmFsdWVcIiAgIFxyXG4gICAgICAgICAgW3NlbGVjdGVkXT1cImNob2ljZURhdGFFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50ICE9IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICAgY2hvaWNlRGF0YUVsZW1lbnQuQ2hvaWNlTm90UmVsZXZhbnQuaW5kZXhPZihjaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUpID4gLTFcclxuICAgICAgICAgICB8fCBjaG9pY2VEYXRhRWxlbWVudC5DaG9pY2VOb3RSZWxldmFudC5pbmRleE9mKGNob2ljZS52YWx1ZSkgPiAtMT8gZmFsc2UgOiBcclxuICAgICAgICAgICBjaG9pY2UudmFsdWUgPT09IGNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSA/IHRydWUgOiBmYWxzZVxyXG4gICAgICAgICAgIDogY2hvaWNlLnZhbHVlID09PSBjaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUgPyB0cnVlIDogZmFsc2VcIiAgICAgICBcclxuICAgICAgICAgID57e2Nob2ljZS5sYWJlbH19PC9vcHRpb24+XHJcbiAgICAgICAgICA8b3B0aW9uICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuYWxsb3dGcmVldGV4dFwiIFt2YWx1ZV09XCInZnJlZXRleHQnXCIgW3NlbGVjdGVkXT1cIidmcmVldGV4dCdcIj5PdGhlciwgcGxlYXNlIHNwZWNpZnnDosKAwqY8L29wdGlvbj5cclxuICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8ZGl2IGlkPSdkaXZfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19X290aGVyJz5cclxuXHJcbiAgICAgICAgICA8aW5wdXQgaWQ9XCJ0eHRfb3RoZXJfe3tjaG9pY2VEYXRhRWxlbWVudC5pZH19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cImNoZWNrQm94XCIgdmFsdWU9XCJvdGhlclwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUGxlYXNlIHNwZWNpZnkgJ3t7Y2hvaWNlRGF0YUVsZW1lbnQubGFiZWx9fSdcIiAoa2V5dXApPSd1cGRhdGVGcmVlVGV4dCgkZXZlbnQudGFyZ2V0LCBjaG9pY2VEYXRhRWxlbWVudC5pZCwgY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwpJz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2hvaWNlRGF0YUVsZW1lbnQuaW1hZ2VNYXAgIT0gdW5kZWZpbmVkICAmJiBpbWFnZVBhdGggIT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHBhZGRpbmctdG9wLTEwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtNiBjb2wtc20tMlwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5PUjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YWNyLWltYWdlLW1hcCBbRGF0YUVsZW1lbnRdPVwiY2hvaWNlRGF0YUVsZW1lbnRcIiBbaW1hZ2VQYXRoXT1cImltYWdlUGF0aFwiPjwvYWNyLWltYWdlLW1hcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+XHJcblxyXG5gLFxyXG4gIHN0eWxlczogW2BgLCBgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0ucGFkZGluZy1sLTV7cGFkZGluZy1sZWZ0OjVweH0ud2hpdGVzcGFjZXttYXJnaW4tbGVmdDo1cHh9Lm1heC13LWgtMTAwe21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbD4uZmF7Zm9udC1zaXplOjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMjBweH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLmxlZnQsLmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LnNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXNpbXVsYXRvci1mb3JtLWhlaWdodHtoZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KTtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXJlcG9ydC10ZXh0LXNjcm9sbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMzAwcHgpfS5wYWRkaW5nLXItMTB7cGFkZGluZy1yaWdodDoxMHB4fS5zbGlkZS1sZWZ0e2xlZnQ6MzBweH0uc2xpZGUtcmlnaHR7cmlnaHQ6MzBweH1ocnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS53aGl0ZS1zcGFjZS1saW5le3doaXRlLXNwYWNlOnByZS1saW5lO3dvcmQtd3JhcDpicmVhay13b3JkfXB7bWFyZ2luOjAgMCAxMHB4fS5mb3JtLWNvbnRyb2x7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6I2QyZDZkZX1oNC5tb2RhbC10aXRsZS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnR9Lm1hcmdpbi1iLTB7bWFyZ2luLWJvdHRvbTowfS5mb250LXdlaWdodC00MDB7Zm9udC13ZWlnaHQ6NDAwfS5jdXN0b20tcmFkaW8tc3R5bGV7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTVweH0uem9vbXt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG99Lnpvb20gaW1ne2hlaWdodDphdXRvO3dpZHRoOjEwMCU7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOmluaGVyaXQhaW1wb3J0YW50fS5idG4tem9vbXtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ0NDtib3JkZXItY29sb3I6I2RkZH0uYnRuLXpvb20uaG92ZXIsLmJ0bi16b29tOmFjdGl2ZSwuYnRuLXpvb206aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXtsYWJlbC5jb250cm9sLWxhYmVse3BhZGRpbmctbGVmdDoyMHB4fX0ucGFkZGluZy01e3BhZGRpbmc6NXB4fWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3Npc3RDaG9pY2VFbGVtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuICBASW5wdXQoKSBjaG9pY2VEYXRhRWxlbWVudDogQ2hvaWNlRGF0YUVsZW1lbnQ7XHJcbiAgQElucHV0KCkgaW1hZ2VQYXRoOiBzdHJpbmc7XHJcbiAgQE91dHB1dCgpIHJldHVybkNob2ljZUVsZW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGNob2ljZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBjaG9pY2VWYWx1ZTogc3RyaW5nO1xyXG5cclxuICBjaG9pY2VFbGVtZW50Rm9ybTogRm9ybUdyb3VwO1xyXG4gIHNlbGVjdGVkQ29uZGl0aW9uOiBTZWxlY3RlZENvbmRpdGlvbjtcclxuICBzZWxlY3RlZEluZGV4OiBudW1iZXI7XHJcbiAgc2VsZWN0ZWRDaG9pY2VSZXBvcnRUZXh0OiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWRDaG9pY2VSZXBvcnRMYWJlbDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBzaW11bGF0b3JFbmdpbmVTZXJ2aWNlOiBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlKSB7IH1cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3JlYXRlQ2hvaWNlRWxlbWVudEZvcm0oKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICQoJyNkaXZfJyArIHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuaWQgKyAnX290aGVyJykuaGlkZSgpO1xyXG4gICAgaWYgKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgJCgnIycgKyB0aGlzLmNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSArICdfJyArIHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuaWQpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICAgdGhpcy5jaG9pY2VWYWx1ZSA9IHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlO1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Zm9yaW5cclxuICAgICAgZm9yIChjb25zdCBjaG9pY2UgaW4gdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvKSB7XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLnZhbHVlID09PSAnaHlwb0VuaGFuY2luZycpe1xyXG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZygnYXNkYXNkJyk7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0udmFsdWUgPT09IHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0ucmVwb3J0VGV4dCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRUZXh0ID0gdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0ucmVwb3J0VGV4dDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRMYWJlbCA9IHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLmxhYmVsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuY2hvaWNlSW5mby5sZW5ndGggPD0gNSkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2hvaWNlVmFsdWUodGhpcy5jaG9pY2VEYXRhRWxlbWVudC5pZCwgdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5sYWJlbCxcclxuICAgICAgICAgICh0aGlzLnNlbGVjdGVkQ2hvaWNlUmVwb3J0VGV4dCAhPT0gdW5kZWZpbmVkKSA/IHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRUZXh0IDogdGhpcy5zZWxlY3RlZENob2ljZVJlcG9ydExhYmVsLCB0aGlzLmNob2ljZURhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVEcm9wZG93bkNob2ljZVNlbGVjdGVkKHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQuaWQsIHRoaXMuc2VsZWN0ZWRDaG9pY2VSZXBvcnRMYWJlbCwgdGhpcy5jaG9pY2VEYXRhRWxlbWVudC5jdXJyZW50VmFsdWUsIHRoaXMuY2hvaWNlRGF0YUVsZW1lbnQubGFiZWwpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh1bmRlZmluZWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ2hvaWNlVmFsdWUoZWxlbWVudElkOiBzdHJpbmcsIHNlbGVjdGVkRWxlbWVudDogc3RyaW5nLCBzZWxlY3RlZFRleHQ6IHN0cmluZywgc2VsZWN0ZWRWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoc2VsZWN0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBuZXcgQ2hvaWNlRWxlbWVudCgpO1xyXG4gICAgICBjaG9pY2VFbGVtZW50LmVsZW1lbnRJZCA9IGVsZW1lbnRJZDtcclxuICAgICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFZhbHVlID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQ7XHJcbiAgICAgIHRoaXMuc2hvd09ySGlkZUZyZWVUZXh0KGVsZW1lbnRJZCwgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFZhbHVlKTtcclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb25JZCA9IGVsZW1lbnRJZDtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbiA9IHNlbGVjdGVkRWxlbWVudDtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlID0gc2VsZWN0ZWRUZXh0O1xyXG5cclxuICAgICAgdGhpcy5yZXR1cm5DaG9pY2VFbGVtZW50LmVtaXQoeyByZWNlaXZlZEVsZW1lbnQ6IGNob2ljZUVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uOiB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlRHJvcGRvd25DaG9pY2VTZWxlY3RlZChlbGVtZW50SWQsIGVsZW1lbnRMYWJlbCwgZWxlbWVudFZhbHVlLCBzZWxlY3RlZENvbmRpdGlvbikge1xyXG4gICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IG5ldyBDaG9pY2VFbGVtZW50KCk7XHJcbiAgICBjaG9pY2VFbGVtZW50LmVsZW1lbnRJZCA9IGVsZW1lbnRJZDtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9IGVsZW1lbnRWYWx1ZTtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gZWxlbWVudExhYmVsO1xyXG5cclxuICAgIGlmICh0aGlzLmNob2ljZVZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLmNob2ljZVZhbHVlID09PSAnLS1TZWxlY3QtLScgfHwgdGhpcy5jaG9pY2VWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuY2hvaWNlVmFsdWUgPT09ICcnKSB7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gJyc7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWQgPSBlbGVtZW50SWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uID0gc2VsZWN0ZWRDb25kaXRpb247XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkVmFsdWUgPSBlbGVtZW50TGFiZWw7XHJcbiAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG5cclxuICBjaG9pY2VTZWxlY3RlZChlbGVtZW50SWQ6IHN0cmluZywgc2VsZWN0ZWRFbGVtZW50OiBzdHJpbmcsIHNlbGVjdGVkVGV4dDogc3RyaW5nLCBzZWxlY3RlZFZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBuZXcgQ2hvaWNlRWxlbWVudCgpO1xyXG4gICAgY2hvaWNlRWxlbWVudC5lbGVtZW50SWQgPSBlbGVtZW50SWQ7XHJcbiAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVmFsdWUgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQ7XHJcbiAgICB0aGlzLnNob3dPckhpZGVGcmVlVGV4dChlbGVtZW50SWQsIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9IG5ldyBTZWxlY3RlZENvbmRpdGlvbigpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb25JZCA9IGVsZW1lbnRJZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb24gPSBzZWxlY3RlZEVsZW1lbnQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkVmFsdWUgPSBzZWxlY3RlZFRleHQ7XHJcbiAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG5cclxuICBkcm9wZG93bkNob2ljZVNlbGVjdGVkKGVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uKSB7XHJcbiAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gbmV3IENob2ljZUVsZW1lbnQoKTtcclxuICAgIGNob2ljZUVsZW1lbnQuZWxlbWVudElkID0gZWxlbWVudC5pZDtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9IChlbGVtZW50Lm9wdGlvbnNbZWxlbWVudC5zZWxlY3RlZEluZGV4XS50ZXh0ID09PSAnT3RoZXIsIHBsZWFzZSBzcGVjaWZ5w6LCgMKmJykgPyAnZnJlZXRleHQnIDogZWxlbWVudC52YWx1ZTtcclxuICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gZWxlbWVudC5vcHRpb25zW2VsZW1lbnQuc2VsZWN0ZWRJbmRleF0udGV4dDtcclxuXHJcbiAgICB0aGlzLnNob3dPckhpZGVGcmVlVGV4dChlbGVtZW50LmlkLCBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVmFsdWUpO1xyXG5cclxuICAgIGlmICh0aGlzLmNob2ljZVZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLmNob2ljZVZhbHVlID09PSAnLS1TZWxlY3QtLScgfHwgdGhpcy5jaG9pY2VWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuY2hvaWNlVmFsdWUgPT09ICcnKSB7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRUZXh0ID0gJyc7XHJcbiAgICAgIGNob2ljZUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZSA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWQgPSBlbGVtZW50LmlkO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbiA9IHNlbGVjdGVkQ29uZGl0aW9uO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlID0gZWxlbWVudC5vcHRpb25zW2VsZW1lbnQuc2VsZWN0ZWRJbmRleF0udGV4dDtcclxuXHJcbiAgICAvLyBDb2RlIHNob3VsZCBjb21lcyBoZXJlIC8vXHJcbiAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUNob2ljZUVsZW1lbnRGb3JtKCkge1xyXG4gICAgdGhpcy5jaG9pY2VFbGVtZW50Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBjaGVja0JveDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgIH0sIHtcclxuICAgICAgICB2YWxpZGF0b3I6IHRoaXMuc3BlY2lmaWNWYWx1ZUluc2lkZVJhbmdlKCdjaGVja0JveCcpXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2hvd09ySGlkZUZyZWVUZXh0KGVsZW1lbnRJZDogc3RyaW5nLCBzZWxlY3RlZFZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmIChzZWxlY3RlZFZhbHVlID09PSAnZnJlZXRleHQnKSB7XHJcbiAgICAgICQoJyNkaXZfJyArIGVsZW1lbnRJZCArICdfb3RoZXInKS5zaG93KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAkKCcjZGl2XycgKyBlbGVtZW50SWQgKyAnX290aGVyJykuaGlkZSgpO1xyXG4gICAgICAkKCcjdHh0X290aGVyXycgKyBlbGVtZW50SWQpLnZhbCgnJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGcmVlVGV4dChlbGVtZW50LCBlbGVtZW50SWQsIHNlbGVjdGVkQ29uZGl0aW9uKSB7XHJcbiAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gbmV3IENob2ljZUVsZW1lbnQoKTtcclxuICAgIGNob2ljZUVsZW1lbnQuZWxlbWVudElkID0gZWxlbWVudElkO1xyXG4gICAgY2hvaWNlRWxlbWVudC5zZWxlY3RlZFZhbHVlID0gKGVsZW1lbnQudmFsdWUgPT09ICdPdGhlcicpID8gJ2ZyZWV0ZXh0JyA6IGVsZW1lbnQudmFsdWU7XHJcbiAgICBjaG9pY2VFbGVtZW50LnNlbGVjdGVkVGV4dCA9IGVsZW1lbnQudmFsdWU7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbiA9IG5ldyBTZWxlY3RlZENvbmRpdGlvbigpO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb25JZCA9IGVsZW1lbnRJZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRDb25kaXRpb24gPSBzZWxlY3RlZENvbmRpdGlvbjtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24uc2VsZWN0ZWRWYWx1ZSA9IGVsZW1lbnQudmFsdWU7XHJcbiAgICB0aGlzLnJldHVybkNob2ljZUVsZW1lbnQuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogY2hvaWNlRWxlbWVudCwgc2VsZWN0ZWRDb25kaXRpb246IHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgc3BlY2lmaWNWYWx1ZUluc2lkZVJhbmdlKGNoZWNrQm94S2V5OiBzdHJpbmcpIHtcclxuICAgIHJldHVybiAoZ3JvdXA6IEZvcm1Hcm91cCkgPT4ge1xyXG4gICAgICBjb25zdCBjaG9pY2VDb250cm9sID0gZ3JvdXAuY29udHJvbHNbY2hlY2tCb3hLZXldO1xyXG4gICAgICBpZiAoKGNob2ljZUNvbnRyb2wudmFsdWUgPT09IHVuZGVmaW5lZCB8fCBjaG9pY2VDb250cm9sLnZhbHVlID09PSAnJyB8fCBjaG9pY2VDb250cm9sLnZhbHVlID09PSAnLS1TZWxlY3QtLScgfHwgdGhpcy5jaG9pY2VWYWx1ZSA9PT0gJycpKSB7XHJcbiAgICAgICAgcmV0dXJuIGNob2ljZUNvbnRyb2wuc2V0RXJyb3JzKHsgbm90RXF1aXZhbGVudDogdHJ1ZSB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gY2hvaWNlQ29udHJvbC5zZXRFcnJvcnMobnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTXVsdGlDaG9pY2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL211bHRpLWNob2ljZS1kYXRhLWVsZW1lbnQnO1xyXG5pbXBvcnQgeyBNdWx0aUNob2ljZUVsZW1lbnQgfSBmcm9tICcuLi9hc3Npc3QtZGF0YS1lbGVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFNlbGVjdGVkQ29uZGl0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvZXhlY3V0ZWQtcmVzdWx0Lm1vZGVsJztcclxuaW1wb3J0IHsgU2ltdWxhdG9yRW5naW5lU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvc2ltdWxhdG9yLWVuZ2luZS5zZXJ2aWNlJztcclxuY29uc3QgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhY3ItYXNzaXN0LW11bHRpLWNob2ljZS1lbGVtZW50JyxcclxuICB0ZW1wbGF0ZTogYDxmb3JtIFtmb3JtR3JvdXBdPVwibXVsdGlDaG9pY2VFbGVtZW50Rm9ybVwiIG5vdmFsaWRhdGU+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNSB0ZXh0LXJpZ2h0XCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWwgYnJlYWstd29yZFwiPnt7bXVsdGlDaG9pY2VFbGVtZW50LmxhYmVsfX0gPHNwYW4gKm5nSWY9XCJtdWx0aUNob2ljZUVsZW1lbnQudW5pdCAhPSB1bmRlZmluZWQgJiYgbXVsdGlDaG9pY2VFbGVtZW50LnVuaXQgIT0gJydcIj4gKHt7bXVsdGlDaG9pY2VFbGVtZW50LnVuaXR9fSk8L3NwYW4+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtdWx0aUNob2ljZUVsZW1lbnQuaGludCAhPT0gJycgJiYgbXVsdGlDaG9pY2VFbGVtZW50LmhpbnQgIT09IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaW5mby1jaXJjbGUgdGV4dC1wcmltYXJ5IHdoaXRlc3BhY2VcIiB0aXRsZT1cInt7bXVsdGlDaG9pY2VFbGVtZW50LmhpbnR9fVwiPjwvaT5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtdWx0aUNob2ljZUVsZW1lbnQuZGlhZ3JhbXMgIT0gdW5kZWZpbmVkIFwiPlxyXG4gICAgICAgIDxhY3ItaGludC1kaWFncmFtIFtkYXRhRWxlbWVudF09XCJtdWx0aUNob2ljZUVsZW1lbnRcIiBbaW1hZ2VQYXRoXT1cImltYWdlUGF0aFwiPjwvYWNyLWhpbnQtZGlhZ3JhbT5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtdWx0aUNob2ljZUVsZW1lbnQuaXNSZXF1aXJlZFwiPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cIm11bHRpQ2hvaWNlRWxlbWVudEZvcm0uY29udHJvbHNbJ211bHRpQ2hlY2tCb3gnXS5pbnZhbGlkICYmICFtdWx0aUNob2ljZVZhbHVlcy5sZW5ndGhcIiBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCJcclxuICAgICAgICB0aXRsZT1cIlJlcXVpcmVkIEZpZWxkXCI+XHJcbiAgICAgICAgKlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS03XCIgW25nQ2xhc3NdPVwibXVsdGlDaG9pY2VFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQtZWxlbWVudCcgOiAnJ1wiPlxyXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjaG9pY2Ugb2YgbXVsdGlDaG9pY2VFbGVtZW50LmNob2ljZUluZm9cIiBjbGFzcz1cImNoZWNrYm94IGNoZWNrYm94Q3VzdG9taXplZFwiIHRpdGxlPVwie3tjaG9pY2UuaGludH19XCI+XHJcbiAgICAgICAgPGxhYmVsIFtoaWRkZW5dPVwibXVsdGlDaG9pY2VFbGVtZW50LkNob2ljZU5vdFJlbGV2YW50ICE9IHVuZGVmaW5lZCA/IFxyXG4gICAgICAgIG11bHRpQ2hvaWNlRWxlbWVudC5DaG9pY2VOb3RSZWxldmFudC5pbmRleE9mKGNob2ljZS52YWx1ZSkgPiAtMSA/IHRydWU6IG51bGxcclxuICAgICAgICA6IG51bGxcIj5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInt7bXVsdGlDaG9pY2VFbGVtZW50LmlkfX1fe3tjaG9pY2UudmFsdWV9fVwiIFtjaGVja2VkXT1cImZhbHNlXCIgZm9ybUNvbnRyb2xOYW1lPVwibXVsdGlDaGVja0JveFwiXHJcbiAgICAgICAgICAgIHZhbHVlPVwie3tjaG9pY2UudmFsdWV9fVwiIChjaGFuZ2UpPVwidXBkYXRlTXVsdGlDaG9pY2UobXVsdGlDaG9pY2VFbGVtZW50LmlkLCBtdWx0aUNob2ljZUVsZW1lbnQubGFiZWwsIChjaG9pY2UucmVwb3J0VGV4dCAhPT0gdW5kZWZpbmVkKSA/IGNob2ljZS5yZXBvcnRUZXh0IDogY2hvaWNlLmxhYmVsLCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICB7e2Nob2ljZS5sYWJlbH19XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPmAsXHJcbiAgc3R5bGVzOiBbYC5jaGVja2JveEN1c3RvbWl6ZWR7bWluLWhlaWdodDowIWltcG9ydGFudDtwYWRkaW5nLXRvcDowIWltcG9ydGFudH0uZGlzYWJsZWQtZWxlbWVudHtjdXJzb3I6bm90LWFsbG93ZWR9LmRpc2FibGVkLWVsZW1lbnQ6YmVmb3Jle2NvbnRlbnQ6XCJcIjt6LWluZGV4OjE7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC44KX1gLCBgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0ucGFkZGluZy1sLTV7cGFkZGluZy1sZWZ0OjVweH0ud2hpdGVzcGFjZXttYXJnaW4tbGVmdDo1cHh9Lm1heC13LWgtMTAwe21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbD4uZmF7Zm9udC1zaXplOjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMjBweH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLmxlZnQsLmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LnNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXNpbXVsYXRvci1mb3JtLWhlaWdodHtoZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KTtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXJlcG9ydC10ZXh0LXNjcm9sbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMzAwcHgpfS5wYWRkaW5nLXItMTB7cGFkZGluZy1yaWdodDoxMHB4fS5zbGlkZS1sZWZ0e2xlZnQ6MzBweH0uc2xpZGUtcmlnaHR7cmlnaHQ6MzBweH1ocnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS53aGl0ZS1zcGFjZS1saW5le3doaXRlLXNwYWNlOnByZS1saW5lO3dvcmQtd3JhcDpicmVhay13b3JkfXB7bWFyZ2luOjAgMCAxMHB4fS5mb3JtLWNvbnRyb2x7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6I2QyZDZkZX1oNC5tb2RhbC10aXRsZS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnR9Lm1hcmdpbi1iLTB7bWFyZ2luLWJvdHRvbTowfS5mb250LXdlaWdodC00MDB7Zm9udC13ZWlnaHQ6NDAwfS5jdXN0b20tcmFkaW8tc3R5bGV7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTVweH0uem9vbXt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG99Lnpvb20gaW1ne2hlaWdodDphdXRvO3dpZHRoOjEwMCU7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOmluaGVyaXQhaW1wb3J0YW50fS5idG4tem9vbXtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ0NDtib3JkZXItY29sb3I6I2RkZH0uYnRuLXpvb20uaG92ZXIsLmJ0bi16b29tOmFjdGl2ZSwuYnRuLXpvb206aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXtsYWJlbC5jb250cm9sLWxhYmVse3BhZGRpbmctbGVmdDoyMHB4fX0ucGFkZGluZy01e3BhZGRpbmc6NXB4fWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3Npc3RNdWx0aUNob2ljZUVsZW1lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gIEBJbnB1dCgpIG11bHRpQ2hvaWNlRWxlbWVudDogTXVsdGlDaG9pY2VEYXRhRWxlbWVudDtcclxuICBASW5wdXQoKSBpbWFnZVBhdGg6IHN0cmluZztcclxuICBAT3V0cHV0KCkgcmV0dXJuTXVsdGlDaG9pY2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgbXVsdGlFbGVtZW50czogTXVsdGlDaG9pY2VFbGVtZW50W10gPSBbXTtcclxuICBtdWx0aUNob2ljZVZhbHVlczogc3RyaW5nW10gPSBbXTtcclxuICBtdWx0aUNob2ljZUNvbWFwcmlzb25WYWx1ZXM6IHN0cmluZ1tdID0gW107XHJcbiAgbXVsdGlDaG9pY2VFbGVtZW50Rm9ybTogRm9ybUdyb3VwO1xyXG4gIHNlbGVjdGVkQ29uZGl0aW9uOiBTZWxlY3RlZENvbmRpdGlvbjtcclxuICBjaG9pY2VWYWx1ZTogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgc2ltdWxhdG9yRW5naW5lU2VydmljZTogU2ltdWxhdG9yRW5naW5lU2VydmljZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jcmVhdGVNdWx0aUNob2ljZUVsZW1lbnRGb3JtKCk7XHJcbiAgfVxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuXHJcbiAgICBpZiAodGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uc3QgdmFsdWVzOiBhbnkgPSBbXTtcclxuICAgICAgY29uc3QgbGFiZWxzOiBhbnkgPSBbXTtcclxuICAgICAgZm9yIChjb25zdCBjaG9pY2UgaW4gdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY2hvaWNlSW5mbykge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmN1cnJlbnRWYWx1ZSkpIHtcclxuICAgICAgICAgIGZvciAoY29uc3QgY3VyclZhbHVlIG9mIHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAoY3VyclZhbHVlID09PSB0aGlzLm11bHRpQ2hvaWNlRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0udmFsdWUgJiYgdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLmNob2ljZVZhbHVlID0gdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY3VycmVudFZhbHVlO1xyXG4gICAgICAgICAgICAgICQoJyMnICsgdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuaWQgKyAnXycgKyB0aGlzLm11bHRpQ2hvaWNlRWxlbWVudC5jaG9pY2VJbmZvW2Nob2ljZV0udmFsdWUpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgICB2YWx1ZXMucHVzaChjdXJyVmFsdWUpO1xyXG4gICAgICAgICAgICAgIGxhYmVscy5wdXNoKHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmNob2ljZUluZm9bY2hvaWNlXS5sYWJlbCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmN1cnJlbnRWYWx1ZSA9PT0gdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLnZhbHVlICYmIHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmNob2ljZUluZm9bY2hvaWNlXS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hvaWNlVmFsdWUgPSB0aGlzLm11bHRpQ2hvaWNlRWxlbWVudC5jdXJyZW50VmFsdWU7XHJcbiAgICAgICAgICAgICQoJyMnICsgdGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuaWQgKyAnXycgKyB0aGlzLm11bHRpQ2hvaWNlRWxlbWVudC5jdXJyZW50VmFsdWUpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgdmFsdWVzLnB1c2godGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY3VycmVudFZhbHVlKTtcclxuICAgICAgICAgICAgbGFiZWxzLnB1c2godGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuY2hvaWNlSW5mb1tjaG9pY2VdLmxhYmVsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZWxlY3RlZE11bHRpQ2hvaWNlKHRoaXMubXVsdGlDaG9pY2VFbGVtZW50LmlkLCB0aGlzLm11bHRpQ2hvaWNlRWxlbWVudC5sYWJlbCwgdmFsdWVzLCBsYWJlbHMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZXR1cm5NdWx0aUNob2ljZS5lbWl0KHVuZGVmaW5lZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZE11bHRpQ2hvaWNlKGVsZW1lbnRJZDogc3RyaW5nLCBzZWxlY3RlZENvbmRpdGlvbjogc3RyaW5nLCBjaG9pY2VWYWx1ZTogYW55LCBjaG9pY2VMYWJlbDogYW55KSB7XHJcbiAgICBjb25zdCBtdWx0aUVsZW1lbnQgPSBuZXcgTXVsdGlDaG9pY2VFbGVtZW50KCk7XHJcbiAgICBpZiAoJCgnIycgKyBlbGVtZW50SWQgKyAnXycgKyBjaG9pY2VWYWx1ZSkuaXMoJzpjaGVja2VkJykpIHtcclxuICAgICAgdGhpcy5tdWx0aUNob2ljZVZhbHVlcyA9IGNob2ljZUxhYmVsO1xyXG4gICAgICB0aGlzLm11bHRpQ2hvaWNlQ29tYXByaXNvblZhbHVlcyA9IGNob2ljZVZhbHVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm11bHRpQ2hvaWNlVmFsdWVzLmluZGV4T2YoY2hvaWNlTGFiZWwpO1xyXG4gICAgICBjb25zdCBjb21wYXJpc29uSW5kZXggPSB0aGlzLm11bHRpQ2hvaWNlQ29tYXByaXNvblZhbHVlcy5pbmRleE9mKGNob2ljZVZhbHVlKTtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLm11bHRpQ2hvaWNlVmFsdWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNvbXBhcmlzb25JbmRleCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5tdWx0aUNob2ljZUNvbWFwcmlzb25WYWx1ZXMuc3BsaWNlKGNvbXBhcmlzb25JbmRleCwgMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIG11bHRpRWxlbWVudC5lbGVtZW50SWQgPSBlbGVtZW50SWQ7XHJcbiAgICBtdWx0aUVsZW1lbnQuc2VsZWN0ZWRWYWx1ZXMgPSB0aGlzLm11bHRpQ2hvaWNlVmFsdWVzO1xyXG4gICAgbXVsdGlFbGVtZW50LnNlbGVjdGVkQ29tcGFyaXNvblZhbHVlcyA9IHRoaXMubXVsdGlDaG9pY2VDb21hcHJpc29uVmFsdWVzO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRDb25kaXRpb24gPSBuZXcgU2VsZWN0ZWRDb25kaXRpb24oKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uSWQgPSBlbGVtZW50SWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkQ29uZGl0aW9uID0gc2VsZWN0ZWRDb25kaXRpb247XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uLnNlbGVjdGVkVmFsdWUgPSB0aGlzLm11bHRpQ2hvaWNlVmFsdWVzO1xyXG4gICAgdGhpcy5yZXR1cm5NdWx0aUNob2ljZS5lbWl0KHsgcmVjZWl2ZWRFbGVtZW50OiBtdWx0aUVsZW1lbnQsIHNlbGVjdGVkQ29uZGl0aW9uOiB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlTXVsdGlDaG9pY2UoZWxlbWVudElkOiBzdHJpbmcsIHNlbGVjdGVkQ29uZGl0aW9uOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGV2ZW50KSB7XHJcbiAgICBjb25zdCBtdWx0aUVsZW1lbnQgPSBuZXcgTXVsdGlDaG9pY2VFbGVtZW50KCk7XHJcbiAgICBpZiAoZXZlbnQuY3VycmVudFRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAgIHRoaXMubXVsdGlDaG9pY2VWYWx1ZXMucHVzaCh2YWx1ZSk7XHJcbiAgICAgIHRoaXMubXVsdGlDaG9pY2VDb21hcHJpc29uVmFsdWVzLnB1c2goZXZlbnQuY3VycmVudFRhcmdldC52YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubXVsdGlDaG9pY2VWYWx1ZXMuaW5kZXhPZih2YWx1ZSk7XHJcbiAgICAgIGNvbnN0IGNvbXBhcmlzb25JbmRleCA9IHRoaXMubXVsdGlDaG9pY2VDb21hcHJpc29uVmFsdWVzLmluZGV4T2YoZXZlbnQuY3VycmVudFRhcmdldC52YWx1ZSk7XHJcbiAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgdGhpcy5tdWx0aUNob2ljZVZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb21wYXJpc29uSW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMubXVsdGlDaG9pY2VDb21hcHJpc29uVmFsdWVzLnNwbGljZShjb21wYXJpc29uSW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBtdWx0aUVsZW1lbnQuZWxlbWVudElkID0gZWxlbWVudElkO1xyXG4gICAgbXVsdGlFbGVtZW50LnNlbGVjdGVkVmFsdWVzID0gdGhpcy5tdWx0aUNob2ljZVZhbHVlcztcclxuICAgIG11bHRpRWxlbWVudC5zZWxlY3RlZENvbXBhcmlzb25WYWx1ZXMgPSB0aGlzLm11bHRpQ2hvaWNlQ29tYXByaXNvblZhbHVlcztcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkQ29uZGl0aW9uID0gbmV3IFNlbGVjdGVkQ29uZGl0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbklkID0gZWxlbWVudElkO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZENvbmRpdGlvbiA9IHNlbGVjdGVkQ29uZGl0aW9uO1xyXG4gICAgdGhpcy5zZWxlY3RlZENvbmRpdGlvbi5zZWxlY3RlZFZhbHVlID0gdGhpcy5tdWx0aUNob2ljZVZhbHVlcztcclxuICAgIHRoaXMucmV0dXJuTXVsdGlDaG9pY2UuZW1pdCh7IHJlY2VpdmVkRWxlbWVudDogbXVsdGlFbGVtZW50LCBzZWxlY3RlZENvbmRpdGlvbjogdGhpcy5zZWxlY3RlZENvbmRpdGlvbiB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlTXVsdGlDaG9pY2VFbGVtZW50Rm9ybSgpIHtcclxuICAgIHRoaXMubXVsdGlDaG9pY2VFbGVtZW50Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBtdWx0aUNoZWNrQm94OiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgfSwge1xyXG4gICAgICAgIHZhbGlkYXRvcjogdGhpcy5zcGVjaWZpY1ZhbHVlSW5zaWRlUmFuZ2UoJ211bHRpQ2hlY2tCb3gnKVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3BlY2lmaWNWYWx1ZUluc2lkZVJhbmdlKGNoZWNrQm94S2V5OiBzdHJpbmcpIHtcclxuICAgIHJldHVybiAoZ3JvdXA6IEZvcm1Hcm91cCkgPT4ge1xyXG4gICAgICBjb25zdCBjaG9pY2VDb250cm9sID0gZ3JvdXAuY29udHJvbHNbY2hlY2tCb3hLZXldO1xyXG4gICAgICBpZiAodGhpcy5tdWx0aUNob2ljZUVsZW1lbnQuaXNSZXF1aXJlZCkge1xyXG4gICAgICAgIHJldHVybiBjaG9pY2VDb250cm9sLnNldEVycm9ycyh7IG5vdEVxdWl2YWxlbnQ6IHRydWUgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGNob2ljZUNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCAsIElucHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9kYXRhLWVsZW1lbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBDaG9pY2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Nob2ljZS1kYXRhLWVsZW1lbnQtbW9kZWwnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuXHJcbmRlY2xhcmUgdmFyIHJlcXVpcmU6IGFueTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYWNyLWltYWdlLW1hcCcsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsIGZvbnQtd2VpZ2h0LTQwMFwiPk5vdCBzdXJlPyB0cnkgb3V0IHRoaXMgaW1hZ2UgPC9sYWJlbD5cclxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIiBhdHRyLmRhdGEtdGFyZ2V0PVwiI3t7J2ltZ01hcF9Nb2RhbF8nK0RhdGFFbGVtZW50LmlkfX1cIj5cclxuICAgIDxzcGFuIGNsYXNzPVwiZ2x5cGhpY29uIGdseXBoaWNvbi1waWN0dXJlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS10b2dnbGU9XCJ0b29sdGlwXCIgZGF0YS1wbGFjZW1lbnQ9XCJ0b3BcIiB0aXRsZT1cIkltYWdlIE1hcFwiPjwvc3Bhbj5cclxuICA8L2J1dHRvbj5cclxuPC9kaXY+XHJcbjxuZy1jb250YWluZXIgKm5nSWY9XCJpbWFnZVBhdGggIT0gdW5kZWZpbmVkXCI+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsIGlubW9kYWwgZmFkZVwiIGlkPVwie3snaW1nTWFwX01vZGFsXycrRGF0YUVsZW1lbnQuaWR9fVwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWxnXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkNsb3NlPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPiB7e1NlbGVjdGlvblZhbHVlfX08L2g0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW1hZ2VFeGlzdCA9PSB0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJJbWdPcHRpb24gZGFuZ2VyIGltZy1yZXNwb25zaXZlIG1heC13LWgtMTAwXCIgYWx0PVwie3sgRGF0YUVsZW1lbnQuaW1hZ2VNYXAubGFiZWwgfX1cIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGF0dHIuaWQ9XCJ7eydpbWdNYXBfSW1nXycrRGF0YUVsZW1lbnQuaWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImltYWdlQ2xpY2soJGV2ZW50LERhdGFFbGVtZW50KTtcIiBhdHRyLmRhdGEtZWxlbWVudElEPVwie3tEYXRhRWxlbWVudC5pZH19XCIgYXR0ci51c2VtYXA9XCIje3snaW1nTWFwXycrRGF0YUVsZW1lbnQuaWR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NyY109XCJkb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybChnZXRJbWFnZURhdGFVcmwoRGF0YUVsZW1lbnQuaW1hZ2VNYXAubG9jYXRpb24pKVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hcCBuYW1lPVwie3snaW1nTWFwXycrRGF0YUVsZW1lbnQuaWR9fVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpbWdPcHQgb2YgRGF0YUVsZW1lbnQuaW1hZ2VNYXAubWFwLmFyZWFzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGFyZWEgYXR0ci5zaGFwZT1cInt7aW1nT3B0LnNoYXBlfX1cIiBhdHRyLmltZ0lEPVwie3snaW1nTWFwX0ltZ18nK0RhdGFFbGVtZW50LmlkfX1cIiBhdHRyLmNvb3Jkcz1cInt7aW1nT3B0LmNvb3Jkc319XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGF0dHIuYWx0PVwie3tpbWdPcHQuY2hvaWNlVmFsdWV9fVwiIChtb3VzZW92ZXIpPSdkaXNwbGF5VmFsdWUoaW1nT3B0LmNob2ljZVZhbHVlKTsnIChtb3VzZW91dCk9J2Rpc3BsYXlWYWx1ZShcIlwiKTsnXHJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0VmFsdWUoaW1nT3B0LmNob2ljZVZhbHVlKTtcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbWFwPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbWFnZUV4aXN0ID09IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgIE5vIEltYWdlIE1hcCBBdmFpbGFibGUuLi5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuYCxcclxuICBzdHlsZXM6IFtgYCwgYC5yZXF1aXJlZC1maWVsZHtjb2xvcjpyZWR9LnBhZGRpbmctbC01e3BhZGRpbmctbGVmdDo1cHh9LndoaXRlc3BhY2V7bWFyZ2luLWxlZnQ6NXB4fS5tYXgtdy1oLTEwMHttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNhcm91c2VsLWNvbnRyb2w+LmZhe2ZvbnQtc2l6ZTo0MHB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7ei1pbmRleDo1O2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6LTIwcHh9LmNhcm91c2VsLWNvbnRyb2wubGVmdHtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0LC5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bm9uZX0uY2Fyb3VzZWwtY29udHJvbC5yaWdodHtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCxyZ2JhKDAsMCwwLC4wMDAxKSAwLHJnYmEoMCwwLDAsLjUpIDEwMCUpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5zY3JvbGx7b3ZlcmZsb3cteTpzY3JvbGw7b3ZlcmZsb3cteDpoaWRkZW59LmRpdi1zaW11bGF0b3ItZm9ybS1oZWlnaHR7aGVpZ2h0OmNhbGMoMTAwdmggLSAxMDBweCk7b3ZlcmZsb3cteTpzY3JvbGw7b3ZlcmZsb3cteDpoaWRkZW59LmRpdi1yZXBvcnQtdGV4dC1zY3JvbGx7b3ZlcmZsb3cteDpoaWRkZW47b3ZlcmZsb3cteTphdXRvO21heC1oZWlnaHQ6Y2FsYygxMDB2aCAtIDMwMHB4KX0ucGFkZGluZy1yLTEwe3BhZGRpbmctcmlnaHQ6MTBweH0uc2xpZGUtbGVmdHtsZWZ0OjMwcHh9LnNsaWRlLXJpZ2h0e3JpZ2h0OjMwcHh9aHJ7bWFyZ2luLXRvcDoxMHB4O21hcmdpbi1ib3R0b206MTBweH0ud2hpdGUtc3BhY2UtbGluZXt3aGl0ZS1zcGFjZTpwcmUtbGluZTt3b3JkLXdyYXA6YnJlYWstd29yZH1we21hcmdpbjowIDAgMTBweH0uZm9ybS1jb250cm9se2JvcmRlci1yYWRpdXM6MDtib3gtc2hhZG93Om5vbmU7Ym9yZGVyLWNvbG9yOiNkMmQ2ZGV9aDQubW9kYWwtdGl0bGUuZmxvYXQtbGVmdHtmbG9hdDpsZWZ0fS5tYXJnaW4tYi0we21hcmdpbi1ib3R0b206MH0uZm9udC13ZWlnaHQtNDAwe2ZvbnQtd2VpZ2h0OjQwMH0uY3VzdG9tLXJhZGlvLXN0eWxle2Zsb2F0OmxlZnQ7bWFyZ2luLXJpZ2h0OjE1cHh9Lnpvb217d2lkdGg6MTAwJTtvdmVyZmxvdzphdXRvfS56b29tIGltZ3toZWlnaHQ6YXV0bzt3aWR0aDoxMDAlO21pbi13aWR0aDoxMDAlO21heC13aWR0aDppbmhlcml0IWltcG9ydGFudH0uYnRuLXpvb217YmFja2dyb3VuZC1jb2xvcjojZjRmNGY0O2NvbG9yOiM0NDQ7Ym9yZGVyLWNvbG9yOiNkZGR9LmJ0bi16b29tLmhvdmVyLC5idG4tem9vbTphY3RpdmUsLmJ0bi16b29tOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2U3ZTdlN31AbWVkaWEgKG1pbi13aWR0aDo3NjhweCl7bGFiZWwuY29udHJvbC1sYWJlbHtwYWRkaW5nLWxlZnQ6MjBweH19LnBhZGRpbmctNXtwYWRkaW5nOjVweH1gXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEltYWdlTWFwQ29tcG9uZW50ICBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgICAkID0gcmVxdWlyZSgnanF1ZXJ5Jyk7XHJcbiAgICBASW5wdXQoKSBEYXRhRWxlbWVudDogQ2hvaWNlRGF0YUVsZW1lbnQ7XHJcbiAgICBASW5wdXQoKSBEYXRhRWxlbWVudHM6IE9iamVjdCA9IHt9O1xyXG4gICAgQElucHV0KCkgRm9ybVZhbHVlczogT2JqZWN0ID0ge307XHJcbiAgICBASW5wdXQoKSBpbWFnZVBhdGg6IHN0cmluZztcclxuICAgIGlzRGF0YVVSTCA9IC9eXFxzKmRhdGE6KFthLXpdK1xcL1thLXpdKyg7W2EtelxcLV0rXFw9W2EtelxcLV0rKT8pPyg7YmFzZTY0KT8sW2EtejAtOVxcIVxcJFxcJlxcJ1xcLFxcKFxcKVxcKlxcK1xcLFxcO1xcPVxcLVxcLlxcX1xcflxcOlxcQFxcL1xcP1xcJVxcc10qXFxzKiQvaTtcclxuICAgIGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyO1xyXG4gICAgaW1hZ2VFeGlzdCA9IHRydWU7XHJcbiAgICBTZWxlY3Rpb25WYWx1ZSA9ICcnO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyKSB7XHJcbiAgICAgICAgdGhpcy5kb21TYW5pdGl6ZXIgPSBkb21TYW5pdGl6ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLkRhdGFFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSgnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNJblJlY3RhbmdsZShtb3VzZVgsIG1vdXNlWSwgQ29vcmRpbmF0ZXMpIHtcclxuICAgICAgICBjb25zdCBDT0FycmF5ID0gQ29vcmRpbmF0ZXMuc3BsaXQoJywnKTtcclxuICAgICAgICBpZiAoQ09BcnJheVswXSA8IG1vdXNlWFxyXG4gICAgICAgICAgICAmJiAoQ09BcnJheVswXSArIENPQXJyYXlbMl0pID4gbW91c2VYXHJcbiAgICAgICAgICAgICYmIENPQXJyYXlbMV0gPCBtb3VzZVlcclxuICAgICAgICAgICAgJiYgKENPQXJyYXlbMV0gKyBDT0FycmF5WzNdKSA+IG1vdXNlWSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlzSW5DaXJjbGUobW91c2VYLCBtb3VzZVksIENvb3JkaW5hdGVzKSB7XHJcbiAgICAgICAgY29uc3QgQ09BcnJheSA9IENvb3JkaW5hdGVzLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgaWYgKE1hdGguc3FydChNYXRoLnBvdygobW91c2VYIC0gQ09BcnJheVswXSksIDIpICsgTWF0aC5wb3coKG1vdXNlWSAtIENPQXJyYXlbMV0pLCAyKSkgPCBDT0FycmF5WzJdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaXNJblBvbHlnb24oeCwgeSwgQ29vcmRpbmF0ZXMpIHtcclxuICAgICAgICBjb25zdCBDT0FycmF5ID0gQ29vcmRpbmF0ZXMuc3BsaXQoJywnKTtcclxuICAgICAgICBjb25zdCB2cyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ09BcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IFtdO1xyXG4gICAgICAgICAgICBwb2ludC5wdXNoKENPQXJyYXlbaV0pO1xyXG4gICAgICAgICAgICBwb2ludC5wdXNoKENPQXJyYXlbaSArIDFdKTtcclxuICAgICAgICAgICAgaSArPSAxO1xyXG4gICAgICAgICAgICB2cy5wdXNoKHBvaW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGluc2lkZSA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gdnMubGVuZ3RoIC0gMTsgaSA8IHZzLmxlbmd0aDsgaiA9IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB4aSA9IHZzW2ldWzBdLCB5aSA9IHZzW2ldWzFdO1xyXG4gICAgICAgICAgICBjb25zdCB4aiA9IHZzW2pdWzBdLCB5aiA9IHZzW2pdWzFdO1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcnNlY3QgPSAoKHlpID4geSkgIT09ICh5aiA+IHkpKVxyXG4gICAgICAgICAgICAgICAgJiYgKHggPCAoeGogLSB4aSkgKiAoeSAtIHlpKSAvICh5aiAtIHlpKSArIHhpKTtcclxuICAgICAgICAgICAgaWYgKGludGVyc2VjdCkge1xyXG4gICAgICAgICAgICAgICAgaW5zaWRlID0gIWluc2lkZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW5zaWRlO1xyXG4gICAgfVxyXG5cclxuICAgIGltYWdlQ2xpY2soZSwgZGF0YUVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBPX2hlaWdodCA9IGRhdGFFbGVtZW50LkltYWdlUHJvcC5oZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgT193aWR0aCA9IGRhdGFFbGVtZW50LkltYWdlUHJvcC53aWR0aDtcclxuICAgICAgICBjb25zdCAkZWxlbSA9IHRoaXMuJChlLnRhcmdldCk7XHJcblxyXG4gICAgICAgIGNvbnN0IE5faGVpZ2h0ID0gJGVsZW0uaGVpZ2h0KCk7XHJcbiAgICAgICAgY29uc3QgTl93aWR0aCA9ICRlbGVtLndpZHRoKCk7XHJcblxyXG5cclxuICAgICAgICBjb25zdCBvZmZzZXQgPSAkZWxlbS5vZmZzZXQoKTtcclxuXHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0X3QgPSBvZmZzZXQudG9wIC0gdGhpcy4kKHdpbmRvdykuc2Nyb2xsVG9wKCk7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0X2wgPSBvZmZzZXQubGVmdCAtIHRoaXMuJCh3aW5kb3cpLnNjcm9sbExlZnQoKTtcclxuXHJcbiAgICAgICAgY29uc3QgeCA9IGUuY2xpZW50WCAtIG9mZnNldF9sO1xyXG4gICAgICAgIGNvbnN0IHkgPSBlLmNsaWVudFkgLSBvZmZzZXRfdDtcclxuICAgICAgICBmb3IgKGNvbnN0IG9wdCBvZiBkYXRhRWxlbWVudC5JbWFnZU9wdGlvbnMpIHtcclxuICAgICAgICAgICAgaWYgKG9wdC5TaGFwZSA9PT0gJ3JlY3QnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0luUmVjdGFuZ2xlKHgsIHksIG9wdC5Db29yZGluYXRlcykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkZvcm1WYWx1ZXNbZGF0YUVsZW1lbnQuSURdID0gb3B0LlZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5TaGFwZSA9PT0gJ2NpcmNsZScpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5DaXJjbGUoeCwgeSwgb3B0LkNvb3JkaW5hdGVzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRm9ybVZhbHVlc1tkYXRhRWxlbWVudC5JRF0gPSBvcHQuVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0LlNoYXBlID09PSAncG9seScpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5Qb2x5Z29uKHgsIHksIG9wdC5Db29yZGluYXRlcykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkZvcm1WYWx1ZXNbZGF0YUVsZW1lbnQuSURdID0gb3B0LlZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgc2V0VmFsdWUodmFsKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBvcHRWYWx1ZSBvZiB0aGlzLkRhdGFFbGVtZW50LmNob2ljZUluZm8pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuRGF0YUVsZW1lbnQuY2hvaWNlSW5mby5sZW5ndGggPD0gNSAmJiB0aGlzLkRhdGFFbGVtZW50LmNob2ljZUluZm8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdFZhbHVlLnZhbHVlID09PSB2YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoJyMnICsgdmFsICsgJ18nICsgdGhpcy5EYXRhRWxlbWVudC5pZCkucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRXZlbnQuaW5pdEV2ZW50KCdjaGFuZ2UnLCB0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoJyMnICsgdmFsICsgJ18nICsgdGhpcy5EYXRhRWxlbWVudC5pZClbMF0uZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCgnIycgKyBvcHRWYWx1ZS52YWx1ZSArICdfJyArIHRoaXMuRGF0YUVsZW1lbnQuaWQpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0VmFsdWUudmFsdWUgPT09IHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCgnIycgKyB0aGlzLkRhdGFFbGVtZW50LmlkKS52YWwob3B0VmFsdWUudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRXZlbnQuaW5pdEV2ZW50KCdjaGFuZ2UnLCB0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiQoJyMnICsgdGhpcy5EYXRhRWxlbWVudC5pZClbMF0uZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5EYXRhRWxlbWVudC5jdXJyZW50VmFsdWUgPSB2YWw7XHJcbiAgICAgICAgLy8gdGhpcy5Gb3JtVmFsdWVzW3RoaXMuRGF0YUVsZW1lbnQuaWRdID0gdmFsO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc3BsYXlWYWx1ZSh2YWwpIHtcclxuICAgICAgICBpZiAodmFsID09PSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLlNlbGVjdGlvblZhbHVlID0gJ0ltYWdlIE1hcCBEaWFncmFtJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLlNlbGVjdGlvblZhbHVlID0gJ1NlbGVjdGVkIFZhbHVlIDogJyArIHZhbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SW1hZ2VEYXRhVXJsKGxvY2F0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGlzRGF0YVVSTCA9ICEhbG9jYXRpb24ubWF0Y2godGhpcy5pc0RhdGFVUkwpO1xyXG4gICAgICAgIGlmIChpc0RhdGFVUkwpIHtcclxuICAgICAgICBsb2NhdGlvbiA9IGxvY2F0aW9uLnJlcGxhY2UoJ3Vuc2FmZTonLCAnJyk7XHJcbiAgICAgICAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmltYWdlUGF0aCArICcvJyArIGxvY2F0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4iLCJpbXBvcnQgeyBCYXNlRGF0YUVsZW1lbnQgfSBmcm9tICcuL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgQ29tcHV0ZWRWYWx1ZSB9IGZyb20gJy4uLy4uL21vZGVscy9jb21wdXRlZC12YWx1ZS5tb2RlbCc7XHJcbmltcG9ydCB7IERlY2lzaW9uUG9pbnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGVjaXNpb25wb2ludC5tb2RlbCc7XHJcbmltcG9ydCB7IEJyYW5jaCB9IGZyb20gJy4uLy4uL21vZGVscy9icmFuY2gubW9kZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIENvbXB1dGVkRGF0YUVsZW1lbnQgIGV4dGVuZHMgQmFzZURhdGFFbGVtZW50IHtcclxuXHJcbiAgICBjb21wdXRlVmFsdWU6IENvbXB1dGVkVmFsdWU7XHJcbiAgICBkZWNpc2lvblBvaW50czogRGVjaXNpb25Qb2ludFtdO1xyXG4gICAgZGVmYXVsdEJyYW5jaDogQnJhbmNoO1xyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50Q3JlYXRpb25CYXNlU2VydmljZSB9IGZyb20gJy4vZGF0YS1lbGVtZW50LWNyZWF0aW9uLWJhc2Utc2VydmljZSc7XHJcbmltcG9ydCB7IEFycmF5Q2hlY2tlclNlcnZpY2UgfSBmcm9tICcuL2FycmF5LWNoZWNrZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IERpYWdyYW1TZXJ2aWNlIH0gZnJvbSAnLi9kaWFncmFtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9jb21wdXRlZC12YWx1ZS1jcmVhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZURhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvYmFzZS1kYXRhLWVsZW1lbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBDb21wdXRlZERhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY29tcHV0ZWQtZGF0YS1lbGVtZW50LW1vZGVsJztcclxuaW1wb3J0IHsgRGVjaXNpb25Qb2ludHNDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL2RlY2lzaW9uLXBvaW50cy1jcmVhdGlvbi5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIENvbXB1dGVkRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2UgZXh0ZW5kcyBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2UgIHtcclxuXHJcbiAgY29uc3RydWN0b3IoZGlhZ3JhbVNlcnZpY2U6IERpYWdyYW1TZXJ2aWNlLCBwcml2YXRlIGFycmF5Q2hlY2tlclNlcnZpY2U6IEFycmF5Q2hlY2tlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbXB1dGVkVmFsdWVDcmVhdGlvblNlcnZpY2U6IENvbXB1dGVkVmFsdWVDcmVhdGlvblNlcnZpY2UgLFxyXG4gICAgcHJpdmF0ZSBkZWNpc2lvblBvaW50c0NyZWF0aW9uU2VydmljZTogRGVjaXNpb25Qb2ludHNDcmVhdGlvblNlcnZpY2UpIHtcclxuICAgIHN1cGVyKGRpYWdyYW1TZXJ2aWNlKTtcclxuICAgIHRoaXMuZWxlbWVudFR5cGUgPSAnQ29tcHV0ZWREYXRhRWxlbWVudCc7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVFbGVtZW50KGRhdGE6IGFueSk6IEJhc2VEYXRhRWxlbWVudCB7XHJcbiAgICBjb25zdCBkYXRhRWxlbWVudCA9ICBuZXcgQ29tcHV0ZWREYXRhRWxlbWVudCgpO1xyXG4gICAgc3VwZXIucG9wdWxhdGVCYXNpY0RhdGEoZGF0YSwgZGF0YUVsZW1lbnQpO1xyXG4gICAgZGF0YUVsZW1lbnQuY29tcHV0ZVZhbHVlID0gdGhpcy5jb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlLmNyZWF0ZUNvbXB1dGVkVmFsdWUoZGF0YSk7XHJcbiAgICBpZiAoZGF0YS5EZWNpc2lvblBvaW50KSB7XHJcbiAgICAgIGRhdGFFbGVtZW50LmRlY2lzaW9uUG9pbnRzID0gdGhpcy5kZWNpc2lvblBvaW50c0NyZWF0aW9uU2VydmljZS5jcmVhdGVEZWNpc2lvblBvaW50cyhkYXRhLkRlY2lzaW9uUG9pbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkYXRhRWxlbWVudDtcclxuICB9XHJcblxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFsbFJlcG9ydFRleHQsIE1haW5SZXBvcnRUZXh0IH0gZnJvbSAnLi4vYXNzaXN0LWRhdGEtZWxlbWVudC9hc3Npc3QtZGF0YS1lbGVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEFsbFRleHRSZXBvcnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtdGV4dC5tb2RlbCc7XHJcbmNvbnN0ICQgPSByZXF1aXJlKCdqcXVlcnknKTtcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhY3ItYXNzaXN0LXJlcG9ydC10ZXh0JyxcclxuICB0ZW1wbGF0ZTogYDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRleHRSZXBvcnQgb2YgYWxsVGV4dFJlcG9ydDsgbGV0IGxhc3RpdGVtID0gbGFzdFwiPlxyXG4gIDxkdCBjbGFzcz1cInRleHQtY2FwaXRhbGl6ZVwiPnt7dGV4dFJlcG9ydC5oZWFkaW5nfX08L2R0PlxyXG4gIDxkZD5cclxuICAgIDxwIGNsYXNzPVwid2hpdGUtc3BhY2UtbGluZVwiIFtpbm5lckhUTUxdPVwidGV4dFJlcG9ydC5jb250ZW50XCI+PC9wPlxyXG4gIDwvZGQ+XHJcbiAgPGhyICpuZ0lmPVwiIWxhc3RpdGVtXCI+XHJcbjwvbmctY29udGFpbmVyPlxyXG5gLFxyXG4gIHN0eWxlczogW2BgLCBgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0ucGFkZGluZy1sLTV7cGFkZGluZy1sZWZ0OjVweH0ud2hpdGVzcGFjZXttYXJnaW4tbGVmdDo1cHh9Lm1heC13LWgtMTAwe21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbD4uZmF7Zm9udC1zaXplOjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMjBweH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLmxlZnQsLmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LnNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXNpbXVsYXRvci1mb3JtLWhlaWdodHtoZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KTtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXJlcG9ydC10ZXh0LXNjcm9sbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMzAwcHgpfS5wYWRkaW5nLXItMTB7cGFkZGluZy1yaWdodDoxMHB4fS5zbGlkZS1sZWZ0e2xlZnQ6MzBweH0uc2xpZGUtcmlnaHR7cmlnaHQ6MzBweH1ocnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS53aGl0ZS1zcGFjZS1saW5le3doaXRlLXNwYWNlOnByZS1saW5lO3dvcmQtd3JhcDpicmVhay13b3JkfXB7bWFyZ2luOjAgMCAxMHB4fS5mb3JtLWNvbnRyb2x7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6I2QyZDZkZX1oNC5tb2RhbC10aXRsZS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnR9Lm1hcmdpbi1iLTB7bWFyZ2luLWJvdHRvbTowfS5mb250LXdlaWdodC00MDB7Zm9udC13ZWlnaHQ6NDAwfS5jdXN0b20tcmFkaW8tc3R5bGV7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTVweH0uem9vbXt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG99Lnpvb20gaW1ne2hlaWdodDphdXRvO3dpZHRoOjEwMCU7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOmluaGVyaXQhaW1wb3J0YW50fS5idG4tem9vbXtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ0NDtib3JkZXItY29sb3I6I2RkZH0uYnRuLXpvb20uaG92ZXIsLmJ0bi16b29tOmFjdGl2ZSwuYnRuLXpvb206aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXtsYWJlbC5jb250cm9sLWxhYmVse3BhZGRpbmctbGVmdDoyMHB4fX0ucGFkZGluZy01e3BhZGRpbmc6NXB4fWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3Npc3RSZXBvcnRUZXh0Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuXHJcbkBJbnB1dCgpIHJlcG9ydFRleHQ6IE1haW5SZXBvcnRUZXh0O1xyXG5hbGxSZXBvcnRUZXh0czogQWxsUmVwb3J0VGV4dCBbXSA9IFtdO1xyXG5zZWxlY3RlZFNlY3Rpb246IHN0cmluZztcclxubWFpblJlcG9ydFRleHRzOiBNYWluUmVwb3J0VGV4dDtcclxuc2VsZWN0ZWRTZWN0aW9uSWQ6IHN0cmluZztcclxuYWxsVGV4dFJlcG9ydDogQWxsVGV4dFJlcG9ydFtdO1xyXG5zZWN0aW9uczogc3RyaW5nIFtdID0gW107XHJcbnByZXZTZWN0aW9uSWQ6IHN0cmluZztcclxubmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gIHRoaXMubWFpblJlcG9ydFRleHRzID0gbmV3IE1haW5SZXBvcnRUZXh0KCk7XHJcbiAgdGhpcy5vblNlbGVjdCh0aGlzLnNlbGVjdGVkU2VjdGlvbklkKTtcclxufVxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICB9LCAxMDAwKTtcclxuICAgfVxyXG5cclxuICBvblNlbGVjdChzZWN0aW9uSWQpIHtcclxuICAgLy8gY29uc29sZS5sb2codGhpcy5yZXBvcnRUZXh0LmFsbFJlcG9ydFRleHQpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFNlY3Rpb25JZCA9IHNlY3Rpb25JZDtcclxuICAgIHRoaXMuc2VjdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuc2VsZWN0ZWRTZWN0aW9uID0gbnVsbDtcclxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBpbiB0aGlzLnJlcG9ydFRleHQuYWxsUmVwb3J0VGV4dCkge1xyXG4gICAgICBpZiAodGhpcy5yZXBvcnRUZXh0LmFsbFJlcG9ydFRleHRbc2VjdGlvbl0ucmVwb3J0VGV4dCAhPT0gJycpIHtcclxuICAgICAgICB0aGlzLnNlY3Rpb25zLnB1c2goc2VjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChzZWN0aW9uSWQgPT09ICd1bmRlZmluZWQnIHx8IHNlY3Rpb25JZCA9PT0gdW5kZWZpbmVkIHx8IHNlY3Rpb25JZCA9PT0gJ0FsbCcgKSB7XHJcbiAgICAgIGxldCBhbGxUZXh0OiBzdHJpbmc7XHJcbiAgICAgIHRoaXMuYWxsVGV4dFJlcG9ydCA9IFtdO1xyXG4gICAgICBhbGxUZXh0ID0gJyc7XHJcbiAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBpbiB0aGlzLnJlcG9ydFRleHQuYWxsUmVwb3J0VGV4dCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJlcG9ydFRleHQuYWxsUmVwb3J0VGV4dFtzZWN0aW9uXS5yZXBvcnRUZXh0ICE9PSAnJykge1xyXG4gICAgICAgICAgY29uc3QgdGV4dFJlcG9ydDogQWxsVGV4dFJlcG9ydCA9IG5ldyBBbGxUZXh0UmVwb3J0KCk7XHJcbiAgICAgICAgICB0ZXh0UmVwb3J0LmhlYWRpbmcgPSAgc2VjdGlvbjtcclxuICAgICAgICAgIHRleHRSZXBvcnQuY29udGVudCA9IHRoaXMucmVtb3ZlRW1wdHlMaW5lKHRoaXMucmVwb3J0VGV4dC5hbGxSZXBvcnRUZXh0W3NlY3Rpb25dLnJlcG9ydFRleHQpO1xyXG4gICAgICAgICAgdGhpcy5hbGxUZXh0UmVwb3J0LnB1c2ggKHRleHRSZXBvcnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlbGVjdGVkU2VjdGlvbklkID0gJ0FsbCc7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIGluIHRoaXMucmVwb3J0VGV4dC5hbGxSZXBvcnRUZXh0KSB7XHJcbiAgICAgIGlmICh0aGlzLnJlcG9ydFRleHQuYWxsUmVwb3J0VGV4dFtzZWN0aW9uXS5zZWN0aW9uSWQgPT09IHNlY3Rpb25JZCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTZWN0aW9uID0gdGhpcy5yZXBvcnRUZXh0LmFsbFJlcG9ydFRleHRbc2VjdGlvbl0ucmVwb3J0VGV4dDtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkU2VjdGlvbiA9IHRoaXMucmVwb3J0VGV4dC5yZXBvcnRUZXh0TWFpbkNvbnRlbnQgKyAoKHRoaXMuc2VsZWN0ZWRTZWN0aW9uICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zZWxlY3RlZFNlY3Rpb24gIT09ICcnKSA/IHRoaXMucmVtb3ZlRW1wdHlMaW5lKHRoaXMuc2VsZWN0ZWRTZWN0aW9uKSA6ICcnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5tYWluUmVwb3J0VGV4dHMgPSBuZXcgTWFpblJlcG9ydFRleHQoKTtcclxuICAgIHRoaXMuYWxsUmVwb3J0VGV4dHMgPSBbXTtcclxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBpbiB0aGlzLnJlcG9ydFRleHQuYWxsUmVwb3J0VGV4dCkge1xyXG4gICAgICBjb25zdCBhbGxyZXBvcnRUZXh0ID0gbmV3IEFsbFJlcG9ydFRleHQoKTtcclxuICAgICAgYWxscmVwb3J0VGV4dC5yZXBvcnRUZXh0ID0gdGhpcy5yZW1vdmVFbXB0eUxpbmUodGhpcy5yZXBvcnRUZXh0LmFsbFJlcG9ydFRleHRbc2VjdGlvbl0ucmVwb3J0VGV4dCk7XHJcbiAgICAgIGFsbHJlcG9ydFRleHQuc2VjdGlvbklkID0gdGhpcy5yZXBvcnRUZXh0LmFsbFJlcG9ydFRleHRbc2VjdGlvbl0uc2VjdGlvbklkO1xyXG4gICAgICB0aGlzLmFsbFJlcG9ydFRleHRzLnB1c2goYWxscmVwb3J0VGV4dCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1haW5SZXBvcnRUZXh0cy5hbGxSZXBvcnRUZXh0ID0gdGhpcy5hbGxSZXBvcnRUZXh0cztcclxuICAgIHRoaXMubWFpblJlcG9ydFRleHRzLnJlcG9ydFRleHRNYWluQ29udGVudCA9IHRoaXMucmVwb3J0VGV4dC5yZXBvcnRUZXh0TWFpbkNvbnRlbnQ7XHJcbn1cclxucmVtb3ZlRW1wdHlMaW5lKGlucHV0VGV4dDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmIChpbnB1dFRleHQudHJpbSgpLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICBjb25zdCBsaW5lcyA9IGlucHV0VGV4dC5zcGxpdCgnXFxuJyk7XHJcbiAgICAgIGNvbnN0IHVuaXF1ZWxpbmVzID0gW107XHJcbiAgICAgIGxpbmVzLmZvckVhY2goIGZ1bmN0aW9uIChsaW5lLCBpKSB7XHJcbiAgICAgICAgICBpZiAobGluZS50cmltKCkubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHVuaXF1ZWxpbmVzLnB1c2gobGluZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdW5pcXVlbGluZXMuam9pbignXFxuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0NoZWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW2FjckR5bmFtaWNIZWlnaHREaXJlY3RpdmVdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRHluYW1pY0hlaWdodERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0NoZWNrZWQgIHtcclxuXHJcbiAgQElucHV0KCkgc2ltdWxhdG9yRWxlbWVudDogYW55O1xyXG4gIEBJbnB1dCgpIGNhcm91c2VsRWxlbWVudDogYW55O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGR5bmFtaWNFbGVtZW50OiBFbGVtZW50UmVmKSB7IH1cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xyXG4gICAgaWYgKHRoaXMuZHluYW1pY0VsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAodGhpcy5zaW11bGF0b3JFbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLnNldER5bmFtaWNIZWlnaHRGb3JTaW11YWx0b3JEaXYodGhpcy5zaW11bGF0b3JFbGVtZW50KTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcm91c2VsRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5zZXREeW5hbWljSGVpZ2h0Rm9yQ2Fyb3VzZWxEaXYodGhpcy5jYXJvdXNlbEVsZW1lbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldER5bmFtaWNIZWlnaHRGb3JTaW11YWx0b3JEaXYoc2ltdWxhdG9yRWxlbWVudDogYW55KSB7XHJcbiAgICBjb25zdCBzaW11bGF0b3JSZXN1bHRzQmxvY2tIZWlnaHQgPSBzaW11bGF0b3JFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgIHRoaXMuZHluYW1pY0VsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAod2luZG93LmlubmVySGVpZ2h0IC0gMTAwKSAtIHNpbXVsYXRvclJlc3VsdHNCbG9ja0hlaWdodCArICdweCc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldER5bmFtaWNIZWlnaHRGb3JDYXJvdXNlbERpdihjYXJvdXNlbEVsZW1lbnQ6IGFueSkge1xyXG4gICAgY29uc3Qgc2ltdWxhdG9yUmVzdWx0c0Jsb2NrSGVpZ2h0ID0gY2Fyb3VzZWxFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgIHRoaXMuZHluYW1pY0VsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAod2luZG93LmlubmVySGVpZ2h0IC0gMjAwKSAtIHNpbXVsYXRvclJlc3VsdHNCbG9ja0hlaWdodCArICdweCc7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1thY3JOdW1lcmljT25seV0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOdW1lcmljT25seURpcmVjdGl2ZSB7XHJcblxyXG4gIHByaXZhdGUgcmVnZXg6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoL14oPzpbMC05XXswLDN9KD86XFwuWzAtOV17MCwyfSk/KT8kLyk7XHJcblxyXG4gIC8vIEFsbG93IGtleSBjb2RlcyBmb3Igc3BlY2lhbCBldmVudHMuIFJlZmxlY3QgOlxyXG4gIC8vIEJhY2tzcGFjZSwgdGFiLCBlbmQsIGhvbWVcclxuICBwcml2YXRlIHNwZWNpYWxLZXlzOiBBcnJheTxzdHJpbmc+ID0gWydCYWNrc3BhY2UnLCAnVGFiJywgJ0VuZCcsICdIb21lJywgJ0Fycm93TGVmdCcsICdBcnJvd1JpZ2h0J107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxyXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgLy8gQWxsb3cgQmFja3NwYWNlLCB0YWIsIGVuZCwgYW5kIGhvbWUga2V5c1xyXG4gICAgaWYgKHRoaXMuc3BlY2lhbEtleXMuaW5kZXhPZihldmVudC5rZXkpICE9PSAtMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgY3VycmVudDogc3RyaW5nID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlO1xyXG4gICAgbGV0IG5leHQ6IHN0cmluZyA9IGN1cnJlbnQuY29uY2F0KGV2ZW50LmtleSk7XHJcbiAgICBsZXQgdmFsdWU6IG51bWJlciA9ICtuZXh0O1xyXG4gICAgaWYgKG5leHQgJiYgKG5leHQgPT09ICcuJyB8fCB2YWx1ZSA+IDEwMC4wMCB8fCAhU3RyaW5nKG5leHQpLm1hdGNoKHRoaXMucmVnZXgpKSkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBCYXNlRGF0YUVsZW1lbnQgfSBmcm9tICcuL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRlVGltZURhdGFFbGVtZW50IGV4dGVuZHMgQmFzZURhdGFFbGVtZW50IHtcclxuXHJcbn1cclxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2UgfSBmcm9tICcuL2RhdGEtZWxlbWVudC1jcmVhdGlvbi1iYXNlLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9jb25kaXRpb25zLWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9jb21wdXRlZC12YWx1ZS1jcmVhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGlhZ3JhbVNlcnZpY2UgfSBmcm9tICcuL2RpYWdyYW0uc2VydmljZSc7XHJcbmltcG9ydCB7IERhdGVUaW1lRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9kYXRldGltZS5tb2RlbCc7XHJcbmltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgTm90UmVsZXZhbnREYXRhRWxlbWVudHMgfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9ub3RyZWxldmFudGRhdGFlbGVtZW50cy5tb2RlbCc7XHJcbmltcG9ydCB7IENvbmRpdGlvbmFsUHJvcGVydHkgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9jb25kaXRpb25hbHByb3BlcnR5Lm1vZGVsJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIERhdGVUaW1lRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2UgZXh0ZW5kcyBEYXRhRWxlbWVudENyZWF0aW9uQmFzZVNlcnZpY2Uge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGRpYWdyYW1TZXJ2aWNlOiBEaWFncmFtU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGNvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2U6IENvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlOiBDb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlKSB7XHJcbiAgICAgICAgc3VwZXIoZGlhZ3JhbVNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudFR5cGUgPSAnRGF0ZVRpbWVEYXRhRWxlbWVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlRWxlbWVudChkYXRhOiBhbnkpOiBCYXNlRGF0YUVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGRhdGFFbGVtZW50ID0gbmV3IERhdGVUaW1lRGF0YUVsZW1lbnQoKTtcclxuICAgICAgICBzdXBlci5wb3B1bGF0ZUJhc2ljRGF0YShkYXRhLCBkYXRhRWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgQ29uZGl0aW9uYWxQcm9wZXJ0aWVzID0gZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXM7XHJcbiAgICAgICAgaWYgKENvbmRpdGlvbmFsUHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBjb25zdCBub3RSZWxldmFudERhdGFFbGVtZW50cyA9IG5ldyBOb3RSZWxldmFudERhdGFFbGVtZW50cygpO1xyXG4gICAgICAgICAgY29uc3QgZGF0YUVsZW1lbnRSZWZzID0gZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXM7XHJcbiAgICAgICAgICBpZiAoZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBkYXRhRWxlbWVudC5jb25kaXRpb25hbFByb3BlcnRpZXMgPSBuZXcgQXJyYXk8Q29uZGl0aW9uYWxQcm9wZXJ0eT4oKTtcclxuICAgICAgICAgICAgaWYgKGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzLkNvbmRpdGlvbmFsUHJvcGVydHkgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uYWxQcm9wZXJ0eSBvZiBkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcy5Db25kaXRpb25hbFByb3BlcnR5KSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhRWxlbWVudC5jb25kaXRpb25hbFByb3BlcnRpZXMucHVzaCh0aGlzLkdldENvbmRpdGlvbmFsUHJvcGVydGllcyhjb25kaXRpb25hbFByb3BlcnR5KSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGRhdGFFbGVtZW50LmNvbmRpdGlvbmFsUHJvcGVydGllcy5wdXNoKHRoaXMuR2V0Q29uZGl0aW9uYWxQcm9wZXJ0aWVzKGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzLkNvbmRpdGlvbmFsUHJvcGVydHkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgR2V0Q29uZGl0aW9uYWxQcm9wZXJ0aWVzKGNvbmRpdGlvbmFsUHJvcGVydHkpOiBDb25kaXRpb25hbFByb3BlcnR5IHtcclxuICAgICAgICBjb25zdCBfY29uZGl0aW9uYWxQcm9wZXJ0eSA9IG5ldyBDb25kaXRpb25hbFByb3BlcnR5KCk7XHJcbiAgICAgICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuY29uZGl0aW9uID0gdGhpcy5jb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlLnJldHVybkNvbmRpdGlvbihjb25kaXRpb25hbFByb3BlcnR5KTtcclxuICAgICAgICAvLyB2YXIgdGVzdCA9IHRoaXMuY29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZS5jcmVhdGVDb21wdXRlZFZhbHVlKGNvbmRpdGlvbmFsUHJvcGVydHkpO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UuaXNDb21wb3NpdGUoY29uZGl0aW9uYWxQcm9wZXJ0eSkpIHtcclxuICAgICAgICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmNvbXBvc2l0ZUNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZS5yZXR1cm5Db21wb3NpdGVDb25kaXRpb24oY29uZGl0aW9uYWxQcm9wZXJ0eSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5pc1JlbGV2YW50ID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5Jc1JlbGV2YW50O1xyXG4gICAgICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmlzUmVxdWlyZWQgPSBjb25kaXRpb25hbFByb3BlcnR5LklzUmVxdWlyZWQ7XHJcbiAgICAgICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuRGlzcGxheVNlcXVlbmNlID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5EaXNwbGF5U2VxdWVuY2U7XHJcbiAgICAgICAgcmV0dXJuIF9jb25kaXRpb25hbFByb3BlcnR5O1xyXG4gICAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERhdGVUaW1lRGF0YUVsZW1lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9kYXRldGltZS5tb2RlbCc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFNpbXVsYXRvckVuZ2luZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3NpbXVsYXRvci1lbmdpbmUuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci1hc3Npc3QtZGF0ZS10aW1lLWVsZW1lbnQnLFxyXG4gIHRlbXBsYXRlOiBgPGZvcm0gW2Zvcm1Hcm91cF09XCJkYXRlVGltZUVsZW1lbnRGb3JtXCIgbm92YWxpZGF0ZSAqbmdJZj1cImRhdGVUaW1lRGF0YUVsZW1lbnQuaXNWaXNpYmxlXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNSB0ZXh0LXJpZ2h0XCI+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWwgYnJlYWstd29yZFwiPlxyXG4gICAgICAgIDwhLS0ge3tkYXRlVGltZURhdGFFbGVtZW50IHwganNvbn19IC0tPlxyXG4gICAgICAgIHt7ZGF0ZVRpbWVEYXRhRWxlbWVudC5sYWJlbH19XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJkYXRlVGltZURhdGFFbGVtZW50LnVuaXQgIT0gdW5kZWZpbmVkICYmIGRhdGVUaW1lRGF0YUVsZW1lbnQudW5pdCAhPSAnJ1wiPiAoe3tkYXRlVGltZURhdGFFbGVtZW50LnVuaXR9fSk8L3NwYW4+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRlVGltZURhdGFFbGVtZW50LmhpbnQgIT09ICcnICYmIGRhdGVUaW1lRGF0YUVsZW1lbnQuaGludCAhPT0gdW5kZWZpbmVkXCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1pbmZvLWNpcmNsZSB0ZXh0LXByaW1hcnkgd2hpdGVzcGFjZVwiIHRpdGxlPVwie3tkYXRlVGltZURhdGFFbGVtZW50LmhpbnR9fVwiPjwvaT5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGVUaW1lRGF0YUVsZW1lbnQuZGlhZ3JhbXMgIT0gdW5kZWZpbmVkIFwiPlxyXG4gICAgICAgIDxhY3ItaGludC1kaWFncmFtIFtkYXRhRWxlbWVudF09XCJkYXRlVGltZURhdGFFbGVtZW50XCIgW2ltYWdlUGF0aF09XCJpbWFnZVBhdGhcIj48L2Fjci1oaW50LWRpYWdyYW0+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRoaXMuZGF0ZVRpbWVEYXRhRWxlbWVudC5pc1JlcXVpcmVkXCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImRhdGVUaW1lRWxlbWVudEZvcm0uY29udHJvbHNbJ2RhdGVUaW1lRWxlbWVudCddLmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJkYXRlVGltZUVsZW1lbnRGb3JtLmNvbnRyb2xzWydkYXRlVGltZUVsZW1lbnQnXS5lcnJvcnMucmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgdGl0bGU9XCJSZXF1aXJlZCBGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTdcIj4gICAgICBcclxuICAgICAgPGRpdiBbbmdDbGFzc109XCJkYXRlVGltZURhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQtcGlja2VyJyA6ICcnXCI+XHJcbiAgICAgICAgICA8YW5ndWxhcjItZGF0ZS1waWNrZXIgIGZvcm1Db250cm9sTmFtZT1cImRhdGVUaW1lRWxlbWVudFwiIFsobmdNb2RlbCldPVwiZGF0ZVwiIFtzZXR0aW5nc109XCJzZXR0aW5nc1wiPjwvYW5ndWxhcjItZGF0ZS1waWNrZXI+XHJcbiAgICAgIDwvZGl2PiAgICAgXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPlxyXG5gLFxyXG4gIHN0eWxlczogW2AuZGVjLWJ0bltfbmdjb250ZW50LWMxM10sLmluYy1idG5bX25nY29udGVudC1jMTNdLC5uZy1zY29wZS53Yy10aW1lLXNlYy53Yy10aW1lLXNlY1tfbmdjb250ZW50LWMxM117Y3Vyc29yOnBvaW50ZXJ9LndjLWRhdGUtY29udGFpbmVyW19uZ2NvbnRlbnQtYzEzXSwud2MtZGF0ZS1jb250YWluZXJbX25nY29udGVudC1jMTNdPnNwYW5bX25nY29udGVudC1jMTNde2NvbG9yOiMwMDAhaW1wb3J0YW50fS5kaXNhYmxlZC1waWNrZXJ7Y3Vyc29yOm5vdC1hbGxvd2VkfS5kaXNhYmxlZC1waWNrZXI6YmVmb3Jle2NvbnRlbnQ6XCJcIjt6LWluZGV4OjE7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjA7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC44KX0ucmVxdWlyZWQtZmllbGR7Y29sb3I6cmVkfWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3Npc3REYXRlVGltZUVsZW1lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIGRhdGVUaW1lRGF0YUVsZW1lbnQ6IERhdGVUaW1lRGF0YUVsZW1lbnQ7XHJcbiAgZGF0ZVRpbWVFbGVtZW50Rm9ybTogRm9ybUdyb3VwO1xyXG4gIGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gIHNldHRpbmdzID0ge1xyXG4gICAgYmlnQmFubmVyOiB0cnVlLFxyXG4gICAgZm9ybWF0OiAnZGQtTU1NLXl5eXkgaGg6bW0gYScsXHJcbiAgICBkZWZhdWx0T3BlbjogZmFsc2UsXHJcbiAgICB0aW1lUGlja2VyOiB0cnVlLFxyXG4gICAgY2xvc2VPblNlbGVjdDogdHJ1ZSxcclxuICAgIC8vIGRpc2FibGVkOiB0cnVlXHJcbn07XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLCBwcml2YXRlIHNpbXVsYXRvckVuZ2luZVNlcnZpY2U6IFNpbXVsYXRvckVuZ2luZVNlcnZpY2UpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY3JlYXRlRGF0ZVRpbWVFbGVtZW50Rm9ybSgpO1xyXG4gIH1cclxuXHJcbiAgb25EYXRlU2VsZWN0KCl7XHJcbiAgICAvLyBhbGVydCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEYXRlVGltZUVsZW1lbnRGb3JtKCkge1xyXG4gICAgdGhpcy5kYXRlVGltZUVsZW1lbnRGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGRhdGVUaW1lRWxlbWVudDogWycnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKCswKSwgVmFsaWRhdG9ycy5tYXgoKzEpXSldLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRHVyYXRpb25EYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2R1cmF0aW9uLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFNpbXVsYXRvckVuZ2luZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL3NpbXVsYXRvci1lbmdpbmUuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTaW11bGF0b3JDb21tdW5pY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9zaW11bGF0b3ItY29tbXVuaWNhdGlvbi5zZXJ2aWNlJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci1hc3Npc3QtZHVyYXRpb24tZWxlbWVudCcsXHJcbiAgdGVtcGxhdGU6IGA8Zm9ybSBbZm9ybUdyb3VwXT1cImR1cmF0aW9uRWxlbWVudEZvcm1cIiBub3ZhbGlkYXRlPlxyXG4gIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTUgdGV4dC1yaWdodFwiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsIGJyZWFrLXdvcmRcIj5cclxuICAgICAgICA8IS0tIHt7ZGF0ZVRpbWVEYXRhRWxlbWVudCB8IGpzb259fSAtLT5cclxuICAgICAgICB7e2R1cmF0aW9uRGF0YUVsZW1lbnQubGFiZWx9fVxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiZHVyYXRpb25EYXRhRWxlbWVudC51bml0ICE9IHVuZGVmaW5lZCAmJiBkdXJhdGlvbkRhdGFFbGVtZW50LnVuaXQgIT0gJydcIj5cclxuICAgICAgICAgICh7e2R1cmF0aW9uRGF0YUVsZW1lbnQudW5pdH19KTwvc3Bhbj5cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImR1cmF0aW9uRGF0YUVsZW1lbnQuaGludCAhPT0gJycgJiYgZHVyYXRpb25EYXRhRWxlbWVudC5oaW50ICE9PSB1bmRlZmluZWRcIj5cclxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWluZm8tY2lyY2xlIHRleHQtcHJpbWFyeSB3aGl0ZXNwYWNlXCIgdGl0bGU9XCJ7e2R1cmF0aW9uRGF0YUVsZW1lbnQuaGludH19XCI+PC9pPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiZHVyYXRpb25EYXRhRWxlbWVudC5kaWFncmFtcyAhPSB1bmRlZmluZWQgXCI+XHJcbiAgICAgICAgPGFjci1oaW50LWRpYWdyYW0gW2RhdGFFbGVtZW50XT1cImR1cmF0aW9uRGF0YUVsZW1lbnRcIiBbaW1hZ2VQYXRoXT1cImltYWdlUGF0aFwiPjwvYWNyLWhpbnQtZGlhZ3JhbT5cclxuICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG5cclxuICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwidGhpcy5kdXJhdGlvbkRhdGFFbGVtZW50LmlzUmVxdWlyZWRcIj4gICAgICBcclxuICAgICAgICA8c3BhbiAqbmdJZj1cIkR1cmF0aW9uVmFsID09ICdQVDBTJyB8fCBEdXJhdGlvblZhbCA9PSBudWxsXCIgY2xhc3M9XCJyZXF1aXJlZC1maWVsZFwiIHRpdGxlPVwiRHVyYXRpb24gZmllbGQgc2hvdWxkIGJlIG5vbiB6ZXJvXCI+XHJcbiAgICAgICAgICAqXHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0aGlzLmR1cmF0aW9uRGF0YUVsZW1lbnQuaXNSZXF1aXJlZFxyXG4gICAgICAmJiAoIXNob3dkYXltaW5WYWxpZGF0aW9uICYmICFzaG93ZGF5bWF4VmFsaWRhdGlvbiAmJiAhc2hvd21pbnV0ZW1pblZhbGlkYXRpb25cclxuICAgICAgICAgICAmJiAhc2hvd21pbnV0ZW1heFZhbGlkYXRpb24gJiYgIXNob3dob3VybWluVmFsaWRhdGlvbiAmJiAhc2hvd2hvdXJtYXhWYWxpZGF0aW9uKVwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25kYXlzZWxlbWVudCddLmludmFsaWRcclxuICAgICAgICAgfHwgZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25taW51dGVzZWxlbWVudCddLmludmFsaWRcclxuICAgICAgICAgfHwgZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25ob3Vyc2VsZW1lbnQnXS5pbnZhbGlkXCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uZGF5c2VsZW1lbnQnXS5lcnJvcnMgIT0gbnVsbCAmJiBkdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmRheXNlbGVtZW50J10uZXJyb3JzLnJlcXVpcmVkIFxyXG4gICAgICAgICAgfHwgZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25taW51dGVzZWxlbWVudCddLmVycm9ycyAhPSBudWxsICYmIGR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9ubWludXRlc2VsZW1lbnQnXS5lcnJvcnMucmVxdWlyZWQgXHJcbiAgICAgICAgICB8fCAgZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25ob3Vyc2VsZW1lbnQnXS5lcnJvcnMgIT0gbnVsbCAmJiBkdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmhvdXJzZWxlbWVudCddLmVycm9ycy5yZXF1aXJlZCBcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInJlcXVpcmVkLWZpZWxkXCIgdGl0bGU9XCJSZXF1aXJlZCBGaWVsZFwiPlxyXG4gICAgICAgICAgICAqXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj4gICAgICBcclxuXHJcbiAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2RheW1pblZhbGlkYXRpb25cIlxyXG4gICAgICAgIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiB0aXRsZT1cIiBNaW5pbXVtIHZhbHVlIGZvciBkYXkgaXMge3tzdXBwb3J0ZWRVbml0c1snZGF5J10ubWlufX1cIj5cclxuICAgICAgICAqXHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgXHJcbiAgICAgIDxzcGFuICpuZ0lmPVwic2hvd2RheW1heFZhbGlkYXRpb25cIlxyXG4gICAgICAgIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiB0aXRsZT1cIiBNYXhpbXVtIHZhbHVlIGZvciBkYXkgaXMge3tzdXBwb3J0ZWRVbml0c1snZGF5J10ubWF4fX1cIj5cclxuICAgICAgICAqXHJcbiAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgIDxzcGFuICpuZ0lmPVwic2hvd21pbnV0ZW1pblZhbGlkYXRpb25cIlxyXG4gICAgICAgIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiB0aXRsZT1cIiBNaW5pbXVtIHZhbHVlIGZvciBtaW51dGUgaXMge3tzdXBwb3J0ZWRVbml0c1snbWludXRlJ10ubWlufX1cIj5cclxuICAgICAgICAqXHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJzaG93bWludXRlbWF4VmFsaWRhdGlvblwiXHJcbiAgICAgICAgY2xhc3M9XCJyZXF1aXJlZC1maWVsZFwiIHRpdGxlPVwiIE1heGltdW0gdmFsdWUgZm9yIG1pbnV0ZSBpcyB7e3N1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5tYXh9fVwiPlxyXG4gICAgICAgICpcclxuICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJzaG93aG91cm1pblZhbGlkYXRpb25cIlxyXG4gICAgICAgIGNsYXNzPVwicmVxdWlyZWQtZmllbGRcIiB0aXRsZT1cIiBNaW5pbXVtIHZhbHVlIGZvciBob3VyIGlzIHt7c3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5taW59fVwiPlxyXG4gICAgICAgICpcclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cInNob3dob3VybWF4VmFsaWRhdGlvblwiXHJcbiAgICAgICAgY2xhc3M9XCJyZXF1aXJlZC1maWVsZFwiIHRpdGxlPVwiIE1heGltdW0gdmFsdWUgZm9yIGhvdXIgaXMge3tzdXBwb3J0ZWRVbml0c1snaG91ciddLm1heH19XCI+XHJcbiAgICAgICAgKlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTdcIiBzdHlsZT1cImRpc3BsYXk6aW5saW5lLWZsZXhcIj5cclxuICAgICAgPCEtLSA8ZGl2IFtuZ0NsYXNzXT1cImR1cmF0aW9uRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZC1waWNrZXInIDogJydcIj5cclxuICAgICAgICA8bmd4LWR1cmF0aW9uLXBpY2tlciBtaW49XCIwXCIgZm9ybUNvbnRyb2xOYW1lPVwiZHVyYXRpb25FbGVtZW50XCIgW29wdGlvbnNdPVwiZHVyYXRpb25PcHRpb25zXCIgWyh2YWx1ZSldPVwiRHVyYXRpb25WYWxcIj48L25neC1kdXJhdGlvbi1waWNrZXI+XHJcbiAgICAgIDwvZGl2PiAtLT5cclxuXHJcblxyXG4gICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+IC0tPlxyXG4gICAgICA8ZGl2IFtuZ0NsYXNzXT1cImR1cmF0aW9uRGF0YUVsZW1lbnQuaXNFZGl0YWJsZSA9PSBmYWxzZSA/ICdkaXNhYmxlZC1waWNrZXInIDogJydcIj5cclxuICAgICAgICA8dGFibGU+XHJcbiAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgIDwhLS0gPHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiaW5jcmVhc2VWYWx1ZSgnZGF5cycpXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLWRlY3JlbWVudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICtcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwvdHI+IC0tPlxyXG4gICAgICAgICAgICA8dHIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdGFiaW5kZXg9XCIxXCIgW2F0dHIuZGlzYWJsZWRdPVwiZHVyYXRpb25EYXRhRWxlbWVudC5pc0VkaXRhYmxlID09IGZhbHNlID8gJ2Rpc2FibGVkJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkdXJhdGlvbmRheXNlbGVtZW50XCIgWyhuZ01vZGVsKV09XCJkYXlzdmFsdWVcIiBjbGFzcz1cImZvcm0tY29udHJvbCB0ZXh0LWNlbnRlciB0eHQtZHVyYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAoYmx1cik9XCJjaGVja1ZhbHVlKCRldmVudCwgJ2RheXMnKVwiIHR5cGU9XCJudW1iZXJcIiBtaW49XCJ7e3N1cHBvcnRlZFVuaXRzWydkYXknXS5taW59fVwiIG1heD1cInt7c3VwcG9ydGVkVW5pdHNbJ2RheSddLm1heH19XCJcclxuICAgICAgICAgICAgICAgICAgKGtleXByZXNzKT1cIm9ubHlJbnRlZ2VyKCRldmVudClcIiBvbnBhc3RlPVwicmV0dXJuIGZhbHNlO1wiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHg7XCI+e3tzdXBwb3J0ZWRVbml0c1snZGF5J10ubGFiZWx9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8IS0tIDx0ciBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImRlY3JlYXNlVmFsdWUoJ2RheXMnKVwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1kZWNyZW1lbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAtXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPiAtLT5cclxuICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8dGFibGUgc3R5bGU9XCJtYXJnaW4tbGVmdDoxMHB4O1wiPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDwhLS0gPHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJpbmNyZWFzZVZhbHVlKCdob3VyJylcIiBjbGFzcz1cImJ0biBidG4tbGluayBidG4taW5jcmVtZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICtcclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+IC0tPlxyXG4gICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc21cIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdGFiaW5kZXg9XCIyXCIgW2F0dHIuZGlzYWJsZWRdPVwiZHVyYXRpb25EYXRhRWxlbWVudC5pc0VkaXRhYmxlID09IGZhbHNlID8gJ2Rpc2FibGVkJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZHVyYXRpb25ob3Vyc2VsZW1lbnRcIiBbKG5nTW9kZWwpXT1cImhvdXJzdmFsdWVcIiBjbGFzcz1cImZvcm0tY29udHJvbCB0ZXh0LWNlbnRlciB0eHQtZHVyYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgKGJsdXIpPVwiY2hlY2tWYWx1ZSgkZXZlbnQsJ2hvdXInKVwiIHR5cGU9XCJudW1iZXJcIiBtaW49XCJ7e3N1cHBvcnRlZFVuaXRzWydob3VyJ10ubWlufX1cIiBtYXg9XCJ7e3N1cHBvcnRlZFVuaXRzWydob3VyJ10ubWF4fX1cIlxyXG4gICAgICAgICAgICAgICAgKGtleXByZXNzKT1cIm9ubHlJbnRlZ2VyKCRldmVudClcIiBvbnBhc3RlPVwicmV0dXJuIGZhbHNlO1wiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiIHN0eWxlPVwicGFkZGluZzogNXB4O1wiPnt7c3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5sYWJlbH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwhLS0gPHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJkZWNyZWFzZVZhbHVlKCdob3VyJylcIiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tZGVjcmVtZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIC1cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+IC0tPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcblxyXG4gICAgICA8dGFibGUgc3R5bGU9XCJtYXJnaW4tbGVmdDoxMHB4O1wiPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDwhLS0gPHRyIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJpbmNyZWFzZVZhbHVlKCdtaW51dGUnKVwiIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1kZWNyZW1lbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgK1xyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj4gLS0+XHJcbiAgICAgICAgICA8dHIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zbVwiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0YWJpbmRleD1cIjNcIiBbKG5nTW9kZWwpXT1cIm1pbnV0ZXN2YWx1ZVwiIGZvcm1Db250cm9sTmFtZT1cImR1cmF0aW9ubWludXRlc2VsZW1lbnRcIiBbYXR0ci5kaXNhYmxlZF09XCJkdXJhdGlvbkRhdGFFbGVtZW50LmlzRWRpdGFibGUgPT0gZmFsc2UgPyAnZGlzYWJsZWQnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCB0ZXh0LWNlbnRlciB0eHQtZHVyYXRpb25cIiAoYmx1cik9XCJjaGVja1ZhbHVlKCRldmVudCwgJ21pbnV0ZScpXCIgdHlwZT1cIm51bWJlclwiIG1pbj1cInt7c3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1pbn19XCJcclxuICAgICAgICAgICAgICAgIG1heD1cInt7c3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1heH19XCIgKGtleXByZXNzKT1cIm9ubHlJbnRlZ2VyKCRldmVudClcIiBvbnBhc3RlPVwicmV0dXJuIGZhbHNlO1wiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiIHN0eWxlPVwicGFkZGluZzogNXB4O1wiPnt7c3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLmxhYmVsfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPCEtLSA8dHIgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImRlY3JlYXNlVmFsdWUoJ21pbnV0ZScpXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLWRlY3JlbWVudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAtXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPiAtLT5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG5cclxuICAgICAgPCEtLSA8L2Rpdj4gLS0+XHJcblxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+YCxcclxuICBzdHlsZXM6IFtgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0uZGlzYWJsZWQtcGlja2Vye2N1cnNvcjpub3QtYWxsb3dlZH0uZGlzYWJsZWQtcGlja2VyOmJlZm9yZXtjb250ZW50OlwiXCI7ei1pbmRleDoxO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOCl9aW5wdXRbdHlwZT1udW1iZXJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLGlucHV0W3R5cGU9bnVtYmVyXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTttYXJnaW46MH1pbnB1dFt0eXBlPW51bWJlcl17dGV4dC1hbGlnbjpjZW50ZXJ9LmJ0bi1kZWNyZW1lbnRlciwuYnRuLWluY3JlbWVudGVye3RleHQtZGVjb3JhdGlvbjpub25lO291dGxpbmU6MH0udHh0LWR1cmF0aW9ue3dpZHRoOjQycHh9LmJ0bi5hY3RpdmUuZm9jdXMsLmJ0bi5hY3RpdmU6Zm9jdXMsLmJ0bi5mb2N1cywuYnRuOmFjdGl2ZS5mb2N1cywuYnRuOmFjdGl2ZTpmb2N1cywuYnRuOmZvY3Vze291dGxpbmU6MCFpbXBvcnRhbnQ7b3V0bGluZS1vZmZzZXQ6LTJweH1gXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXNzaXN0RHVyYXRpb25FbGVtZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSBkdXJhdGlvbkRhdGFFbGVtZW50OiBEdXJhdGlvbkRhdGFFbGVtZW50O1xyXG4gIGR1cmF0aW9uRWxlbWVudEZvcm06IEZvcm1Hcm91cDtcclxuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgc3VwcG9ydGVkVW5pdHM6IGFueSA9IHtcclxuICAgIG1pbGxpc2Vjb25kOiB7XHJcbiAgICAgICdsYWJlbCc6ICdNaWxsaXNlY29uZCcsXHJcbiAgICAgICdtYXgnOiA5OTksXHJcbiAgICAgICdtaW4nOiAwLFxyXG4gICAgICAndmFsdWUnOiAwLFxyXG4gICAgICAnc3RlcCc6IDFcclxuICAgIH0sXHJcbiAgICBzZWNvbmQ6IHtcclxuICAgICAgJ2xhYmVsJzogJ1NlY29uZCcsXHJcbiAgICAgICdtYXgnOiA1OSxcclxuICAgICAgJ21pbic6IDAsXHJcbiAgICAgICd2YWx1ZSc6IDAsXHJcbiAgICAgICdzdGVwJzogMVxyXG4gICAgfSxcclxuICAgIG1pbnV0ZToge1xyXG4gICAgICAnbGFiZWwnOiAnTWludXRlcycsXHJcbiAgICAgICdtYXgnOiA1OSxcclxuICAgICAgJ21pbic6IDAsXHJcbiAgICAgICd2YWx1ZSc6IDAsXHJcbiAgICAgICdzdGVwJzogMVxyXG4gICAgfSxcclxuICAgIGhvdXI6IHtcclxuICAgICAgJ2xhYmVsJzogJ0hvdXJzJyxcclxuICAgICAgJ21heCc6IDIzLFxyXG4gICAgICAnbWluJzogMCxcclxuICAgICAgJ3ZhbHVlJzogMCxcclxuICAgICAgJ3N0ZXAnOiAxXHJcbiAgICB9LFxyXG4gICAgZGF5OiB7XHJcbiAgICAgICdsYWJlbCc6ICdEYXlzJyxcclxuICAgICAgJ21heCc6IDcsXHJcbiAgICAgICdtaW4nOiAwLFxyXG4gICAgICAndmFsdWUnOiAwLFxyXG4gICAgICAnc3RlcCc6IDFcclxuICAgIH0sXHJcbiAgICB3ZWVrOiB7XHJcbiAgICAgICdsYWJlbCc6ICdXZWVrJyxcclxuICAgICAgJ21heCc6IDUxLFxyXG4gICAgICAnbWluJzogMCxcclxuICAgICAgJ3ZhbHVlJzogMCxcclxuICAgICAgJ3N0ZXAnOiAxXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgZGF5c3ZhbHVlID0gMDtcclxuICBob3Vyc3ZhbHVlID0gMDtcclxuICBtaW51dGVzdmFsdWUgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgcHJpdmF0ZSBzaW11bGF0b3JFbmdpbmVTZXJ2aWNlOiBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlLFxyXG4gICAgc2ltdWxhdG9yQ29tbXVuaWNhdGlvblNlcnZpY2U6IFNpbXVsYXRvckNvbW11bmljYXRpb25TZXJ2aWNlKSB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHNpbXVsYXRvckNvbW11bmljYXRpb25TZXJ2aWNlLnNpbXVsYXRvclNvdXJjZSQuc3Vic2NyaWJlKFxyXG4gICAgICBtaXNzaW9uID0+IHtcclxuICAgICAgICB0aGlzLlNldFJhbmdlVmFsdWVzRm9yRHVyYXRpb25QaWNrZXIoKTtcclxuICAgICAgICB0aGlzLlVwZGF0ZUZvcm1WYWxpZGF0b3IoKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIER1cmF0aW9uVmFsID0gJ1BUMFMnO1xyXG4gIGR1cmF0aW9uT3B0aW9ucyA9IHtcclxuICAgIHNob3dOZWdhdGl2ZTogZmFsc2UsXHJcbiAgICBzaG93UHJldmlldzogZmFsc2UsXHJcbiAgICBzaG93WWVhcnM6IGZhbHNlLFxyXG4gICAgc2hvd01vbnRoczogZmFsc2UsXHJcbiAgICBzaG93V2Vla3M6IGZhbHNlLFxyXG4gICAgbWluOiAwXHJcbiAgfTtcclxuXHJcbiAgc2hvd2RheW1pblZhbGlkYXRpb24gPSBmYWxzZTtcclxuICBzaG93ZGF5bWF4VmFsaWRhdGlvbiA9IGZhbHNlO1xyXG4gIHNob3dtaW51dGVtYXhWYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgc2hvd21pbnV0ZW1pblZhbGlkYXRpb24gPSBmYWxzZTtcclxuICBzaG93aG91cm1pblZhbGlkYXRpb24gPSBmYWxzZTtcclxuICBzaG93aG91cm1heFZhbGlkYXRpb24gPSBmYWxzZTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLlNldFJhbmdlVmFsdWVzRm9yRHVyYXRpb25QaWNrZXIoKTtcclxuICAgIHRoaXMuY3JlYXRlRHVyYXRpb25FbGVtZW50Rm9ybSgpO1xyXG4gICAgdGhpcy5vbkNoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIFJlc2V0VmFsaWRhdGlvblZpc2liaWxpdHkoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNob3dkYXltaW5WYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dkYXltYXhWYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dtaW51dGVtYXhWYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dtaW51dGVtaW5WYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dob3VybWluVmFsaWRhdGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93aG91cm1heFZhbGlkYXRpb24gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5zdGF0dXNDaGFuZ2VzXHJcbiAgICAgIC5zdWJzY3JpYmUodmFsID0+IHtcclxuICAgICAgICB0aGlzLlJlc2V0VmFsaWRhdGlvblZpc2liaWxpdHkoKTtcclxuICAgICAgICBpZiAodGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmRheXNlbGVtZW50J10uaW52YWxpZFxyXG4gICAgICAgICAgJiYgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmRheXNlbGVtZW50J10uZXJyb3JzLm1heCkge1xyXG4gICAgICAgICAgdGhpcy5zaG93ZGF5bWF4VmFsaWRhdGlvbiA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uZGF5c2VsZW1lbnQnXS5pbnZhbGlkXHJcbiAgICAgICAgICAmJiB0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uZGF5c2VsZW1lbnQnXS5lcnJvcnMubWluKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dkYXltaW5WYWxpZGF0aW9uID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25taW51dGVzZWxlbWVudCddLmludmFsaWRcclxuICAgICAgICAgICYmIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25taW51dGVzZWxlbWVudCddLmVycm9ycy5taW4pIHtcclxuICAgICAgICAgIHRoaXMuc2hvd21pbnV0ZW1pblZhbGlkYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbm1pbnV0ZXNlbGVtZW50J10uaW52YWxpZFxyXG4gICAgICAgICAgJiYgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbm1pbnV0ZXNlbGVtZW50J10uZXJyb3JzLm1heCkge1xyXG4gICAgICAgICAgdGhpcy5zaG93bWludXRlbWF4VmFsaWRhdGlvbiA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uaG91cnNlbGVtZW50J10uaW52YWxpZFxyXG4gICAgICAgICAgJiYgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmhvdXJzZWxlbWVudCddLmVycm9ycy5taW4pIHtcclxuICAgICAgICAgIHRoaXMuc2hvd2hvdXJtaW5WYWxpZGF0aW9uID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25ob3Vyc2VsZW1lbnQnXS5pbnZhbGlkXHJcbiAgICAgICAgICAmJiB0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uaG91cnNlbGVtZW50J10uZXJyb3JzLm1heCkge1xyXG4gICAgICAgICAgdGhpcy5zaG93aG91cm1heFZhbGlkYXRpb24gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIFNldFJhbmdlVmFsdWVzRm9yRHVyYXRpb25QaWNrZXIoKSB7XHJcbiAgICBjb25zdCAkZWxlbWVudCA9IHRoaXMuZHVyYXRpb25EYXRhRWxlbWVudDtcclxuICAgIHRoaXMuc3VwcG9ydGVkVW5pdHNbJ2RheSddLm1pbiA9ICRlbGVtZW50Lk1pbmltdW1EYXkgIT09IHVuZGVmaW5lZCAmJiAkZWxlbWVudC5NaW5pbXVtRGF5ICE9IG51bGwgP1xyXG4gICAgICAkZWxlbWVudC5NaW5pbXVtRGF5IDogMDtcclxuICAgIHRoaXMuc3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5taW4gPSAkZWxlbWVudC5NaW5pbXVtSG91cnMgIT09IHVuZGVmaW5lZCAmJiAkZWxlbWVudC5NaW5pbXVtSG91cnMgIT0gbnVsbCA/XHJcbiAgICAgICRlbGVtZW50Lk1pbmltdW1Ib3VycyA6IDA7XHJcbiAgICB0aGlzLnN1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5taW4gPSAkZWxlbWVudC5NaW5pbXVtTWludXRlcyAhPT0gdW5kZWZpbmVkICYmICRlbGVtZW50Lk1pbmltdW1NaW51dGVzICE9IG51bGwgP1xyXG4gICAgICAkZWxlbWVudC5NaW5pbXVtTWludXRlcyA6IDA7XHJcbiAgICB0aGlzLnN1cHBvcnRlZFVuaXRzWydkYXknXS5tYXggPSAkZWxlbWVudC5NYXhpbXVtRGF5ICE9PSB1bmRlZmluZWQgJiYgJGVsZW1lbnQuTWF4aW11bURheSAhPSBudWxsID9cclxuICAgICAgJGVsZW1lbnQuTWF4aW11bURheSA6IDkwMDcxOTkyNTQ3NDA5OTE7XHJcbiAgICB0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10ubWF4ID0gJGVsZW1lbnQuTWF4aW11bUhvdXJzICE9PSB1bmRlZmluZWQgJiYgJGVsZW1lbnQuTWF4aW11bUhvdXJzICE9IG51bGwgP1xyXG4gICAgICAkZWxlbWVudC5NYXhpbXVtSG91cnMgOiA5MDA3MTk5MjU0NzQwOTkxO1xyXG4gICAgdGhpcy5zdXBwb3J0ZWRVbml0c1snbWludXRlJ10ubWF4ID0gJGVsZW1lbnQuTWF4bWltdW1NaW51dGVzICE9PSB1bmRlZmluZWQgJiYgJGVsZW1lbnQuTWF4bWltdW1NaW51dGVzICE9IG51bGwgP1xyXG4gICAgICAkZWxlbWVudC5NYXhtaW11bU1pbnV0ZXMgOiA5MDA3MTk5MjU0NzQwOTkxO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEdXJhdGlvbkVsZW1lbnRGb3JtKCkge1xyXG4gICAgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGR1cmF0aW9uZGF5c2VsZW1lbnQ6IFsnJywgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBWYWxpZGF0b3JzLm1pbigrdGhpcy5zdXBwb3J0ZWRVbml0c1snZGF5J10ubWluKSwgVmFsaWRhdG9ycy5tYXgoK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ2RheSddLm1heCldKV0sXHJcbiAgICAgIGR1cmF0aW9ubWludXRlc2VsZW1lbnQ6IFsnJywgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBWYWxpZGF0b3JzLm1pbigrdGhpcy5zdXBwb3J0ZWRVbml0c1snbWludXRlJ10ubWluKSwgVmFsaWRhdG9ycy5tYXgoK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1heCldKV0sXHJcbiAgICAgIGR1cmF0aW9uaG91cnNlbGVtZW50OiBbJycsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgVmFsaWRhdG9ycy5taW4oK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5taW4pLCBWYWxpZGF0b3JzLm1heCgrdGhpcy5zdXBwb3J0ZWRVbml0c1snaG91ciddLm1heCldKV1cclxuICAgICAgLy8gZHVyYXRpb25kYXlzZWxlbWVudDogWycnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKV0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9ubHlJbnRlZ2VyKGV2ZW50KSB7XHJcbiAgICByZXR1cm4gKGV2ZW50LmNoYXJDb2RlID09PSA4IHx8IGV2ZW50LmNoYXJDb2RlID09PSAwKSA/IG51bGwgOiBldmVudC5jaGFyQ29kZSA+PSA0OCAmJiBldmVudC5jaGFyQ29kZSA8PSA1NztcclxuICB9XHJcblxyXG4gIFVwZGF0ZUZvcm1WYWxpZGF0b3IoKSB7XHJcbiAgICB0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9uZGF5c2VsZW1lbnQnXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICBWYWxpZGF0b3JzLm1pbigrdGhpcy5zdXBwb3J0ZWRVbml0c1snZGF5J10ubWluKSwgVmFsaWRhdG9ycy5tYXgoK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ2RheSddLm1heCldKV0pO1xyXG4gICAgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmRheXNlbGVtZW50J10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cclxuICAgIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25taW51dGVzZWxlbWVudCddLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgIFZhbGlkYXRvcnMubWluKCt0aGlzLnN1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5taW4pLCBWYWxpZGF0b3JzLm1heCgrdGhpcy5zdXBwb3J0ZWRVbml0c1snbWludXRlJ10ubWF4KV0pXSk7XHJcbiAgICB0aGlzLmR1cmF0aW9uRWxlbWVudEZvcm0uY29udHJvbHNbJ2R1cmF0aW9ubWludXRlc2VsZW1lbnQnXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblxyXG4gICAgdGhpcy5kdXJhdGlvbkVsZW1lbnRGb3JtLmNvbnRyb2xzWydkdXJhdGlvbmhvdXJzZWxlbWVudCddLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgIFZhbGlkYXRvcnMubWluKCt0aGlzLnN1cHBvcnRlZFVuaXRzWydob3VyJ10ubWluKSwgVmFsaWRhdG9ycy5tYXgoK3RoaXMuc3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5tYXgpXSldKTtcclxuICAgIHRoaXMuZHVyYXRpb25FbGVtZW50Rm9ybS5jb250cm9sc1snZHVyYXRpb25ob3Vyc2VsZW1lbnQnXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5jcmVhc2VWYWx1ZShwcm9wZXJ0eSk6IHZvaWQge1xyXG4gICAgbGV0IGN1cnJlbnRWYWx1ZSA9IDA7XHJcbiAgICBzd2l0Y2ggKHByb3BlcnR5KSB7XHJcbiAgICAgIGNhc2UgJ2RheXMnOlxyXG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9IHRoaXMuZGF5c3ZhbHVlID09PSB1bmRlZmluZWQgfHwgdGhpcy5kYXlzdmFsdWUgPT0gbnVsbCA/IDAgOiB0aGlzLmRheXN2YWx1ZTtcclxuICAgICAgICBpZiAoY3VycmVudFZhbHVlIDwgdGhpcy5zdXBwb3J0ZWRVbml0c1snZGF5J10ubWF4KSB7XHJcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUgKyB0aGlzLnN1cHBvcnRlZFVuaXRzWydkYXknXS5zdGVwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kYXlzdmFsdWUgPSBjdXJyZW50VmFsdWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLmhvdXJzdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmhvdXJzdmFsdWUgPT0gbnVsbCA/IDAgOiB0aGlzLmhvdXJzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA8IHRoaXMuc3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5tYXgpIHtcclxuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZSArIHRoaXMuc3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5zdGVwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ob3Vyc3ZhbHVlID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnbWludXRlJzpcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLm1pbnV0ZXN2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMubWludXRlc3ZhbHVlID09IG51bGwgPyAwIDogdGhpcy5taW51dGVzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA8IHRoaXMuc3VwcG9ydGVkVW5pdHNbJ21pbnV0ZSddLm1heCkge1xyXG4gICAgICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlICsgdGhpcy5zdXBwb3J0ZWRVbml0c1snbWludXRlJ10uc3RlcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWludXRlc3ZhbHVlID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlY3JlYXNlVmFsdWUocHJvcGVydHkpOiB2b2lkIHtcclxuICAgIGxldCBjdXJyZW50VmFsdWUgPSAwO1xyXG4gICAgc3dpdGNoIChwcm9wZXJ0eSkge1xyXG4gICAgICBjYXNlICdkYXlzJzpcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLmRheXN2YWx1ZTtcclxuICAgICAgICBpZiAoY3VycmVudFZhbHVlID4gdGhpcy5zdXBwb3J0ZWRVbml0c1snZGF5J10ubWluKSB7XHJcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUgLSB0aGlzLnN1cHBvcnRlZFVuaXRzWydkYXknXS5zdGVwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kYXlzdmFsdWUgPSBjdXJyZW50VmFsdWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLmhvdXJzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA+IHRoaXMuc3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5taW4pIHtcclxuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZSAtIHRoaXMuc3VwcG9ydGVkVW5pdHNbJ2hvdXInXS5zdGVwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ob3Vyc3ZhbHVlID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnbWludXRlJzpcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLm1pbnV0ZXN2YWx1ZTtcclxuICAgICAgICBpZiAoY3VycmVudFZhbHVlID4gdGhpcy5zdXBwb3J0ZWRVbml0c1snbWludXRlJ10ubWluKSB7XHJcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUgLSB0aGlzLnN1cHBvcnRlZFVuaXRzWydtaW51dGUnXS5zdGVwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5taW51dGVzdmFsdWUgPSBjdXJyZW50VmFsdWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGVja1ZhbHVlKGV2ZW50OiBhbnksIHByb3BlcnR5KSB7XHJcbiAgICBsZXQgY3VycmVudFZhbHVlID0gMDtcclxuICAgIHN3aXRjaCAocHJvcGVydHkpIHtcclxuICAgICAgY2FzZSAnZGF5cyc6XHJcbiAgICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5kYXlzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGN1cnJlbnRWYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kYXlzdmFsdWUgPSBjdXJyZW50VmFsdWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLmhvdXJzdmFsdWU7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGN1cnJlbnRWYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICBjdXJyZW50VmFsdWUgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ob3Vyc3ZhbHVlID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnbWludXRlJzpcclxuICAgICAgICBjdXJyZW50VmFsdWUgPSB0aGlzLm1pbnV0ZXN2YWx1ZTtcclxuICAgICAgICBpZiAoY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQgfHwgY3VycmVudFZhbHVlID09IG51bGwpIHtcclxuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1pbnV0ZXN2YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1c2UtbGlmZS1jeWNsZS1pbnRlcmZhY2VcclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vIHByZXZlbnQgbWVtb3J5IGxlYWsgd2hlbiBjb21wb25lbnQgZGVzdHJveWVkXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxufVxyXG5cclxuXHJcblxyXG4iLCJpbXBvcnQgeyBCYXNlRGF0YUVsZW1lbnQgfSBmcm9tICcuL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuXHJcbmV4cG9ydCBjbGFzcyBEdXJhdGlvbkRhdGFFbGVtZW50IGV4dGVuZHMgQmFzZURhdGFFbGVtZW50IHtcclxuICAgIE1pbmltdW1EYXk6IG51bWJlcjtcclxuICAgIE1heGltdW1EYXk6IG51bWJlcjtcclxuICAgIE1pbmltdW1Ib3VyczogbnVtYmVyO1xyXG4gICAgTWF4aW11bUhvdXJzOiBudW1iZXI7XHJcbiAgICBNaW5pbXVtTWludXRlczogbnVtYmVyO1xyXG4gICAgTWF4bWltdW1NaW51dGVzOiBudW1iZXI7XHJcblxyXG4gICAgTWluaW11bURheU92ZXJyaWRlcjogbnVtYmVyO1xyXG4gICAgTWF4aW11bURheU92ZXJyaWRlcjogbnVtYmVyO1xyXG4gICAgTWluaW11bUhvdXJzT3ZlcnJpZGVyOiBudW1iZXI7XHJcbiAgICBNYXhpbXVtSG91cnNPdmVycmlkZXI6IG51bWJlcjtcclxuICAgIE1pbmltdW1NaW51dGVzT3ZlcnJpZGVyOiBudW1iZXI7XHJcbiAgICBNYXhtaW11bU1pbnV0ZXNPdmVycmlkZXI6IG51bWJlcjtcclxufVxyXG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERhdGFFbGVtZW50Q3JlYXRpb25CYXNlU2VydmljZSB9IGZyb20gJy4vZGF0YS1lbGVtZW50LWNyZWF0aW9uLWJhc2Utc2VydmljZSc7XHJcbmltcG9ydCB7IENvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL2NvbmRpdGlvbnMtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXB1dGVkVmFsdWVDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL2NvbXB1dGVkLXZhbHVlLWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaWFncmFtU2VydmljZSB9IGZyb20gJy4vZGlhZ3JhbS5zZXJ2aWNlJztcclxuXHJcbmltcG9ydCB7IEJhc2VEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2Jhc2UtZGF0YS1lbGVtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgTm90UmVsZXZhbnREYXRhRWxlbWVudHMgfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9ub3RyZWxldmFudGRhdGFlbGVtZW50cy5tb2RlbCc7XHJcbmltcG9ydCB7IENvbmRpdGlvbmFsUHJvcGVydHkgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VsZW1lbnRzL21vZGVscy9jb25kaXRpb25hbHByb3BlcnR5Lm1vZGVsJztcclxuaW1wb3J0IHsgRHVyYXRpb25EYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvZWxlbWVudHMvbW9kZWxzL2R1cmF0aW9uLWRhdGEtZWxlbWVudC5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBEdXJhdGlvbkRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlIGV4dGVuZHMgRGF0YUVsZW1lbnRDcmVhdGlvbkJhc2VTZXJ2aWNlIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihkaWFncmFtU2VydmljZTogRGlhZ3JhbVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBjb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlOiBDb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgY29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZTogQ29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZSkge1xyXG4gICAgICAgIHN1cGVyKGRpYWdyYW1TZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLmVsZW1lbnRUeXBlID0gJ0R1cmF0aW9uRGF0YUVsZW1lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUVsZW1lbnQoZGF0YTogYW55KTogQmFzZURhdGFFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBkYXRhRWxlbWVudCA9IG5ldyBEdXJhdGlvbkRhdGFFbGVtZW50KCk7XHJcbiAgICAgICAgc3VwZXIucG9wdWxhdGVCYXNpY0RhdGEoZGF0YSwgZGF0YUVsZW1lbnQpO1xyXG5cclxuICAgICAgICBkYXRhRWxlbWVudC5NaW5pbXVtRGF5ID0gZGF0YS5NaW5pbXVtRGF5O1xyXG4gICAgICAgIGRhdGFFbGVtZW50Lk1heGltdW1EYXkgPSBkYXRhLk1heGltdW1EYXk7XHJcblxyXG4gICAgICAgIGRhdGFFbGVtZW50Lk1pbmltdW1Ib3VycyA9IGRhdGEuTWluaW11bUhvdXJzO1xyXG4gICAgICAgIGRhdGFFbGVtZW50Lk1heGltdW1Ib3VycyA9IGRhdGEuTWF4aW11bUhvdXJzO1xyXG5cclxuICAgICAgICBkYXRhRWxlbWVudC5NaW5pbXVtTWludXRlcyA9IGRhdGEuTWluaW11bU1pbnV0ZXM7XHJcbiAgICAgICAgZGF0YUVsZW1lbnQuTWF4bWltdW1NaW51dGVzID0gZGF0YS5NYXhtaW11bU1pbnV0ZXM7XHJcblxyXG5cclxuICAgICAgICBkYXRhRWxlbWVudC5NaW5pbXVtRGF5T3ZlcnJpZGVyID0gZGF0YS5NaW5pbXVtRGF5O1xyXG4gICAgICAgIGRhdGFFbGVtZW50Lk1heGltdW1EYXlPdmVycmlkZXIgPSBkYXRhLk1heGltdW1EYXk7XHJcblxyXG4gICAgICAgIGRhdGFFbGVtZW50Lk1pbmltdW1Ib3Vyc092ZXJyaWRlciA9IGRhdGEuTWluaW11bUhvdXJzO1xyXG4gICAgICAgIGRhdGFFbGVtZW50Lk1heGltdW1Ib3Vyc092ZXJyaWRlciA9IGRhdGEuTWF4aW11bUhvdXJzO1xyXG5cclxuICAgICAgICBkYXRhRWxlbWVudC5NaW5pbXVtTWludXRlc092ZXJyaWRlciA9IGRhdGEuTWluaW11bU1pbnV0ZXM7XHJcbiAgICAgICAgZGF0YUVsZW1lbnQuTWF4bWltdW1NaW51dGVzT3ZlcnJpZGVyID0gZGF0YS5NYXhtaW11bU1pbnV0ZXM7XHJcblxyXG4gICAgICAgIGNvbnN0IENvbmRpdGlvbmFsUHJvcGVydGllcyA9IGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzO1xyXG4gICAgICAgIGlmIChDb25kaXRpb25hbFByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgY29uc3Qgbm90UmVsZXZhbnREYXRhRWxlbWVudHMgPSBuZXcgTm90UmVsZXZhbnREYXRhRWxlbWVudHMoKTtcclxuICAgICAgICAgIGNvbnN0IGRhdGFFbGVtZW50UmVmcyA9IGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzO1xyXG4gICAgICAgICAgaWYgKGRhdGEuQ29uZGl0aW9uYWxQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgZGF0YUVsZW1lbnQuY29uZGl0aW9uYWxQcm9wZXJ0aWVzID0gbmV3IEFycmF5PENvbmRpdGlvbmFsUHJvcGVydHk+KCk7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcy5Db25kaXRpb25hbFByb3BlcnR5IGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbmFsUHJvcGVydHkgb2YgZGF0YS5Db25kaXRpb25hbFByb3BlcnRpZXMuQ29uZGl0aW9uYWxQcm9wZXJ0eSkge1xyXG4gICAgICAgICAgICAgICAgZGF0YUVsZW1lbnQuY29uZGl0aW9uYWxQcm9wZXJ0aWVzLnB1c2godGhpcy5HZXRDb25kaXRpb25hbFByb3BlcnRpZXMoY29uZGl0aW9uYWxQcm9wZXJ0eSkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkYXRhRWxlbWVudC5jb25kaXRpb25hbFByb3BlcnRpZXMucHVzaCh0aGlzLkdldENvbmRpdGlvbmFsUHJvcGVydGllcyhkYXRhLkNvbmRpdGlvbmFsUHJvcGVydGllcy5Db25kaXRpb25hbFByb3BlcnR5KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIEdldENvbmRpdGlvbmFsUHJvcGVydGllcyhjb25kaXRpb25hbFByb3BlcnR5KTogQ29uZGl0aW9uYWxQcm9wZXJ0eSB7XHJcbiAgICAgICAgY29uc3QgX2NvbmRpdGlvbmFsUHJvcGVydHkgPSBuZXcgQ29uZGl0aW9uYWxQcm9wZXJ0eSgpO1xyXG4gICAgICAgIF9jb25kaXRpb25hbFByb3BlcnR5LmNvbmRpdGlvbiA9IHRoaXMuY29uZGl0aW9uc0NyZWF0aW9uU2VydmljZS5yZXR1cm5Db25kaXRpb24oY29uZGl0aW9uYWxQcm9wZXJ0eSk7XHJcbiAgICAgICAgLy8gdmFyIHRlc3QgPSB0aGlzLmNvbXB1dGVkVmFsdWVDcmVhdGlvblNlcnZpY2UuY3JlYXRlQ29tcHV0ZWRWYWx1ZShjb25kaXRpb25hbFByb3BlcnR5KTtcclxuICAgICAgICBpZiAodGhpcy5jb25kaXRpb25zQ3JlYXRpb25TZXJ2aWNlLmlzQ29tcG9zaXRlKGNvbmRpdGlvbmFsUHJvcGVydHkpKSB7XHJcbiAgICAgICAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5jb21wb3NpdGVDb25kaXRpb24gPSB0aGlzLmNvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UucmV0dXJuQ29tcG9zaXRlQ29uZGl0aW9uKGNvbmRpdGlvbmFsUHJvcGVydHkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuaXNSZWxldmFudCA9IGNvbmRpdGlvbmFsUHJvcGVydHkuSXNSZWxldmFudDtcclxuICAgICAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5pc1JlcXVpcmVkID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5Jc1JlcXVpcmVkO1xyXG4gICAgICAgIF9jb25kaXRpb25hbFByb3BlcnR5LkRpc3BsYXlTZXF1ZW5jZSA9IGNvbmRpdGlvbmFsUHJvcGVydHkuRGlzcGxheVNlcXVlbmNlO1xyXG5cclxuICAgICAgICBfY29uZGl0aW9uYWxQcm9wZXJ0eS5NaW5pbXVtRGF5ID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5NaW5pbXVtRGF5O1xyXG4gICAgICAgIF9jb25kaXRpb25hbFByb3BlcnR5Lk1heGltdW1EYXkgPSBjb25kaXRpb25hbFByb3BlcnR5Lk1heGltdW1EYXk7XHJcbiAgICAgICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuTWluaW11bUhvdXJzID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5NaW5pbXVtSG91cnM7XHJcbiAgICAgICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuTWF4aW11bUhvdXJzID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5NYXhpbXVtSG91cnM7XHJcbiAgICAgICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuTWF4bWltdW1NaW51dGVzID0gY29uZGl0aW9uYWxQcm9wZXJ0eS5NYXhpbXVtSG91cnM7XHJcbiAgICAgICAgX2NvbmRpdGlvbmFsUHJvcGVydHkuTWluaW11bU1pbnV0ZXMgPSBjb25kaXRpb25hbFByb3BlcnR5Lk1pbmltdW1Ib3VycztcclxuICAgICAgICByZXR1cm4gX2NvbmRpdGlvbmFsUHJvcGVydHk7XHJcbiAgICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge0NvcmVNb2R1bGV9IGZyb20gJy4uL2NvcmUvY29yZS5tb2R1bGUnO1xyXG5pbXBvcnQgeyBBY3JBc3Npc3RTaW11bGF0b3JDb21wb25lbnQgfSBmcm9tICcuL2Fjci1hc3Npc3Qtc2ltdWxhdG9yL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7VGVtcGxhdGVNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4vc2hhcmVkL3NlcnZpY2VzL3RlbXBsYXRlLW1hbmFnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7RGlhZ3JhbVNlcnZpY2V9IGZyb20gJy4vc2hhcmVkL3NlcnZpY2VzL2RpYWdyYW0uc2VydmljZSc7XHJcbmltcG9ydCB7SW5qZWN0aW9uVG9rZW59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDcmVhdGlvblNlcnZpY2VJbmplY3RvclRva2VuIH0gZnJvbSAnLi9jb25zdGFudHMnO1xyXG5pbXBvcnQge0Nob2ljZURhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlfSBmcm9tICcuL3NoYXJlZC9zZXJ2aWNlcy9jaG9pY2UtZGF0YS1lbGVtZW50LWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge011bHRpcGxlQ2hvaWNlRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2V9IGZyb20gJy4vc2hhcmVkL3NlcnZpY2VzL211bHRpcGxlLWNob2ljZS1kYXRhLWVsZW1lbnQtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7TnVtZXJpY0RhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlfSBmcm9tICcuL3NoYXJlZC9zZXJ2aWNlcy9udW1lcmljLWRhdGEtZWxlbWVudC1jcmVhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHtJbnRlZ2VyRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2V9IGZyb20gJy4vc2hhcmVkL3NlcnZpY2VzL2ludGVnZXItZGF0YS1lbGVtZW50LWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBc3Npc3REYXRhRWxlbWVudENvbXBvbmVudCB9IGZyb20gJy4vYXNzaXN0LWRhdGEtZWxlbWVudC9hc3Npc3QtZGF0YS1lbGVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEhpbnREaWFncmFtQ29tcG9uZW50IH0gZnJvbSAnLi9hc3Npc3QtZGF0YS1lbGVtZW50L2hpbnQtZGlhZ3JhbS9oaW50LWRpYWdyYW0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2xpZGVDb21wb25lbnQgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nhcm91c2VsL3NsaWRlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdsb2JhbFZhbHVlQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvc2VydmljZXMvZ2xvYmFsLXZhbHVlLWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBcnJheUNoZWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvc2VydmljZXMvYXJyYXktY2hlY2tlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uZGl0aW9uc0NyZWF0aW9uU2VydmljZSB9IGZyb20gJy4vc2hhcmVkL3NlcnZpY2VzL2NvbmRpdGlvbnMtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IENhcm91c2VsQ29tcG9uZW50IH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jYXJvdXNlbC9jYXJvdXNlbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDYXJvdXNlbENvbmZpZyB9IGZyb20gJ25neC1ib290c3RyYXAvY2Fyb3VzZWwvY2Fyb3VzZWwuY29uZmlnJztcclxuaW1wb3J0IHsgQXNzaXN0TnVtZXJpY0VsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuL2Fzc2lzdC1kYXRhLWVsZW1lbnQvYXNzaXN0LW51bWVyaWMtZWxlbWVudC9hc3Npc3QtbnVtZXJpYy1lbGVtZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEFzc2lzdENob2ljZUVsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuL2Fzc2lzdC1kYXRhLWVsZW1lbnQvYXNzaXN0LWNob2ljZS1lbGVtZW50L2Fzc2lzdC1jaG9pY2UtZWxlbWVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBc3Npc3RNdWx0aUNob2ljZUVsZW1lbnRDb21wb25lbnQgfSBmcm9tICcuL2Fzc2lzdC1kYXRhLWVsZW1lbnQvYXNzaXN0LW11bHRpLWNob2ljZS1lbGVtZW50L2Fzc2lzdC1tdWx0aS1jaG9pY2UtZWxlbWVudC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBJbWFnZU1hcENvbXBvbmVudCB9IGZyb20gJy4vYXNzaXN0LWRhdGEtZWxlbWVudC9pbWFnZS1tYXAvaW1hZ2UtbWFwLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERlY2lzaW9uUG9pbnRzQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvc2VydmljZXMvZGVjaXNpb24tcG9pbnRzLWNyZWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wdXRlZFZhbHVlQ3JlYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvc2VydmljZXMvY29tcHV0ZWQtdmFsdWUtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXB1dGVkRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL3NoYXJlZC9zZXJ2aWNlcy9jb21wdXRlZC1kYXRhLWVsZW1lbnQtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEFzc2lzdFJlcG9ydFRleHRDb21wb25lbnQgfSBmcm9tICcuL2Fzc2lzdC1yZXBvcnQtdGV4dC9hc3Npc3QtcmVwb3J0LXRleHQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2ltdWxhdG9yRW5naW5lU2VydmljZSB9IGZyb20gJy4uL2NvcmUvc2VydmljZXMvc2ltdWxhdG9yLWVuZ2luZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IER5bmFtaWNIZWlnaHREaXJlY3RpdmUgfSBmcm9tICcuL3NoYXJlZC9kaXJlY3RpdmVzL2R5bmFtaWNoZWlnaHQuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgTnVtZXJpY09ubHlEaXJlY3RpdmUgfSBmcm9tICcuL3NoYXJlZC9kaXJlY3RpdmVzL251bWVyaWMtb25seS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBEcmFnU2Nyb2xsTW9kdWxlIH0gZnJvbSAnbmd4LWRyYWctc2Nyb2xsJztcclxuaW1wb3J0IHsgRGF0ZVRpbWVEYXRhRWxlbWVudENyZWF0aW9uU2VydmljZSB9IGZyb20gJy4vc2hhcmVkL3NlcnZpY2VzL2RhdGVUaW1lLWRhdGEtZWxlbWVudC1jcmVhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXNzaXN0RGF0ZVRpbWVFbGVtZW50Q29tcG9uZW50IH0gZnJvbSAnLi9hc3Npc3QtZGF0YS1lbGVtZW50L2Fzc2lzdC1kYXRlVGltZS1lbGVtZW50L2Fzc2lzdC1kYXRlLXRpbWUtZWxlbWVudC9hc3Npc3QtZGF0ZS10aW1lLWVsZW1lbnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQXNzaXN0RHVyYXRpb25FbGVtZW50Q29tcG9uZW50IH0gZnJvbSAnLi9hc3Npc3QtZGF0YS1lbGVtZW50L2Fzc2lzdC1kdXJhdGlvbi1lbGVtZW50L2Fzc2lzdC1kdXJhdGlvbi1lbGVtZW50LmNvbXBvbmVudCc7XHJcblxyXG5pbXBvcnQgeyBBbmd1bGFyRGF0ZVRpbWVQaWNrZXJNb2R1bGUgfSBmcm9tICdhbmd1bGFyMi1kYXRldGltZXBpY2tlcic7XHJcbmltcG9ydCB7IER1cmF0aW9uUGlja2VyTW9kdWxlIH0gZnJvbSAnbmd4LWR1cmF0aW9uLXBpY2tlcic7XHJcbmltcG9ydCB7IER1cmF0aW9uRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2UgfSBmcm9tICcuL3NoYXJlZC9zZXJ2aWNlcy9kdXJhdGlvbi1kYXRhLWVsZW1lbnQtY3JlYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFNpbXVsYXRvckNvbW11bmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvc2VydmljZXMvc2ltdWxhdG9yLWNvbW11bmljYXRpb24uc2VydmljZSc7XHJcblxyXG5cclxuY29uc3QgY29tcG9uZW50cyA9IFtBY3JBc3Npc3RTaW11bGF0b3JDb21wb25lbnQsIEFzc2lzdERhdGFFbGVtZW50Q29tcG9uZW50LCBIaW50RGlhZ3JhbUNvbXBvbmVudCwgU2xpZGVDb21wb25lbnQsIENhcm91c2VsQ29tcG9uZW50LFxyXG4gICAgQXNzaXN0TnVtZXJpY0VsZW1lbnRDb21wb25lbnQsIEFzc2lzdENob2ljZUVsZW1lbnRDb21wb25lbnQsIEFzc2lzdE11bHRpQ2hvaWNlRWxlbWVudENvbXBvbmVudCxcclxuICAgIEltYWdlTWFwQ29tcG9uZW50LCBBc3Npc3RSZXBvcnRUZXh0Q29tcG9uZW50LCBEeW5hbWljSGVpZ2h0RGlyZWN0aXZlLCBOdW1lcmljT25seURpcmVjdGl2ZSxcclxuICAgIEFzc2lzdERhdGVUaW1lRWxlbWVudENvbXBvbmVudCwgQXNzaXN0RHVyYXRpb25FbGVtZW50Q29tcG9uZW50XTtcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgQ29yZU1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIERyYWdTY3JvbGxNb2R1bGUsXHJcbiAgICBBbmd1bGFyRGF0ZVRpbWVQaWNrZXJNb2R1bGUsXHJcbiAgICAvLyBUaW1lRHVyYXRpb25QaWNrZXJNb2R1bGVcclxuICAgIER1cmF0aW9uUGlja2VyTW9kdWxlXHJcbiAgXSxcclxuICBkZWNsYXJhdGlvbnM6IGNvbXBvbmVudHMsXHJcbiAgcHJvdmlkZXJzOiBbVGVtcGxhdGVNYW5hZ2VyU2VydmljZSxcclxuICAgICBEaWFncmFtU2VydmljZSxcclxuICAgICBDYXJvdXNlbENvbmZpZyxcclxuICAgICBBcnJheUNoZWNrZXJTZXJ2aWNlLFxyXG4gICAgIENvbmRpdGlvbnNDcmVhdGlvblNlcnZpY2UsXHJcbiAgICAgRGVjaXNpb25Qb2ludHNDcmVhdGlvblNlcnZpY2UsXHJcbiAgICAgQ29tcHV0ZWRWYWx1ZUNyZWF0aW9uU2VydmljZSxcclxuICAgICBTaW11bGF0b3JFbmdpbmVTZXJ2aWNlLFxyXG4gICAgIFNpbXVsYXRvckNvbW11bmljYXRpb25TZXJ2aWNlLFxyXG4gICAgeyBwcm92aWRlOiBDcmVhdGlvblNlcnZpY2VJbmplY3RvclRva2VuLCB1c2VDbGFzczogQ2hvaWNlRGF0YUVsZW1lbnRDcmVhdGlvblNlcnZpY2UsIG11bHRpOiB0cnVlIH0sXHJcbiAgICB7IHByb3ZpZGU6IENyZWF0aW9uU2VydmljZUluamVjdG9yVG9rZW4sIHVzZUNsYXNzOiBNdWx0aXBsZUNob2ljZURhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlLCBtdWx0aTogdHJ1ZSB9LFxyXG4gICAgeyBwcm92aWRlOiBDcmVhdGlvblNlcnZpY2VJbmplY3RvclRva2VuLCB1c2VDbGFzczogTnVtZXJpY0RhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlLCBtdWx0aTogdHJ1ZSB9LFxyXG4gICAgeyBwcm92aWRlOiBDcmVhdGlvblNlcnZpY2VJbmplY3RvclRva2VuLCB1c2VDbGFzczogSW50ZWdlckRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlLCBtdWx0aTogdHJ1ZSB9LFxyXG4gICAgeyBwcm92aWRlOiBDcmVhdGlvblNlcnZpY2VJbmplY3RvclRva2VuLCB1c2VDbGFzczogR2xvYmFsVmFsdWVDcmVhdGlvblNlcnZpY2UsIG11bHRpOiB0cnVlIH0sXHJcbiAgICB7IHByb3ZpZGU6IENyZWF0aW9uU2VydmljZUluamVjdG9yVG9rZW4sIHVzZUNsYXNzOiBDb21wdXRlZERhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlLCBtdWx0aTogdHJ1ZSB9LFxyXG4gICAge3Byb3ZpZGU6IENyZWF0aW9uU2VydmljZUluamVjdG9yVG9rZW4sIHVzZUNsYXNzOiBEYXRlVGltZURhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlLCBtdWx0aTogdHJ1ZSB9LFxyXG4gICAge3Byb3ZpZGU6IENyZWF0aW9uU2VydmljZUluamVjdG9yVG9rZW4sIHVzZUNsYXNzOiBEdXJhdGlvbkRhdGFFbGVtZW50Q3JlYXRpb25TZXJ2aWNlLCBtdWx0aTogdHJ1ZSB9XHJcbiAgICBdLFxyXG4gIGV4cG9ydHM6IGNvbXBvbmVudHNcclxufSlcclxuZXhwb3J0IGNsYXNzIEFjckFzc2lzdFNpbXVsYXRvck1vZHVsZSB7IH1cclxuIiwiZXhwb3J0IGludGVyZmFjZSBJRGljdGlvbmFyeTxUPiB7XHJcbiAgICBBZGQoa2V5OiBzdHJpbmcsIHZhbHVlOiBUKTtcclxuICAgIENvbnRhaW5zS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbjtcclxuICAgIENvdW50KCk6IG51bWJlcjtcclxuICAgIEl0ZW0oa2V5OiBzdHJpbmcpOiBUO1xyXG4gICAgS2V5cygpOiBzdHJpbmdbXTtcclxuICAgIFJlbW92ZShrZXk6IHN0cmluZyk6IFQ7XHJcbiAgICBWYWx1ZXMoKTogVFtdO1xyXG59XHJcbmV4cG9ydCBjbGFzcyBEaWN0aW9uYXJ5PFQ+IGltcGxlbWVudHMgSURpY3Rpb25hcnk8VD4ge1xyXG4gICAgcHJpdmF0ZSBpdGVtczogeyBbaW5kZXg6IHN0cmluZ106IFQgfSA9IHt9O1xyXG5cclxuICAgIHByaXZhdGUgY291bnQgPSAwO1xyXG5cclxuICAgIHB1YmxpYyBDb250YWluc0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zLmhhc093blByb3BlcnR5KGtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIENvdW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEFkZChrZXk6IHN0cmluZywgdmFsdWU6IFQpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXRlbXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLml0ZW1zW2tleV0gPSB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgUmVtb3ZlKGtleTogc3RyaW5nKTogVCB7XHJcbiAgICAgICAgY29uc3QgdmFsID0gdGhpcy5pdGVtc1trZXldO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLml0ZW1zW2tleV07XHJcbiAgICAgICAgdGhpcy5jb3VudC0tO1xyXG4gICAgICAgIHJldHVybiB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIEl0ZW0oa2V5OiBzdHJpbmcpOiBUIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pdGVtc1trZXldO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBLZXlzKCk6IHN0cmluZ1tdIHtcclxuICAgICAgICBjb25zdCBrZXlTZXQ6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiB0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zLmhhc093blByb3BlcnR5KHByb3ApKSB7XHJcbiAgICAgICAgICAgICAgICBrZXlTZXQucHVzaChwcm9wKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGtleVNldDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgVmFsdWVzKCk6IFRbXSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVzOiBUW10gPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHRoaXMuaXRlbXNbcHJvcF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdmFsdWVzO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRmlsZURldGFpbHMgfSBmcm9tICcuLi9tb2RlbHMvZmlsZS1kZXRhaWxzLm1vZGVsJztcclxuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4uL21vZGVscy9kaWN0aW9uYXJ5JztcclxuaW1wb3J0IHsgSHR0cCB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnO1xyXG5pbXBvcnQgJ3J4anMvYWRkL29wZXJhdG9yL21hcCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzL09ic2VydmFibGUnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgR2xvYmFsc1NlcnZpY2Uge1xyXG4gIGRlZmF1bHRNb2R1bGUgPSAgJ2Fzc2V0cy9YTUxGSWxlcy9oZWxsb19hc3Npc3QvSGVsbG9fQXNzaXN0LnhtbCc7XHJcbiAgZGVmYXVsdFRlc3RNb2R1bGUgPSAnYXNzZXRzL1hNTEZJbGVzL3Rlc3RfbW9kdWxlL1Rlc3RfTW9kdWxlLnhtbCc7XHJcblxyXG4gIHB1YmxpYyBYTUxMaXN0OiBEaWN0aW9uYXJ5PEZpbGVEZXRhaWxzPiA9IG5ldyBEaWN0aW9uYXJ5PEZpbGVEZXRhaWxzPigpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHApIHsgfVxyXG5cclxuXHJcbiAgZ2V0RGVmYXVsdE1vZHVsZVBhdGgoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuZGVmYXVsdE1vZHVsZSkubWFwKHJlcyA9PiByZXMudGV4dCgpKTtcclxuICB9XHJcblxyXG4gIGdldERlZmF1bHRUZXN0TW9kdWxlUGF0aCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5kZWZhdWx0VGVzdE1vZHVsZSkubWFwKHJlcyA9PiByZXMudGV4dCgpKTtcclxuICB9XHJcbn1cclxuXHJcbiIsImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBGaWxlRGV0YWlscyB9IGZyb20gJy4uL3NoYXJlZC9tb2RlbHMvZmlsZS1kZXRhaWxzLm1vZGVsJztcclxuaW1wb3J0IHsgR2xvYmFsc1NlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvc2VydmljZXMvZ2xvYmFscy5zZXJ2aWNlJztcclxuY29uc3QgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci12aWV3LXVwbG9hZC1sb2FkZXInLFxyXG4gIHRlbXBsYXRlOiBgPHVsIGNsYXNzPVwic2lkZWJhci1tZW51XCIgZGF0YS13aWRnZXQ9XCJ0cmVlXCI+XHJcbiAgPGxpIGNsYXNzPVwiaGVhZGVyXCI+V2FudCB0byB0cnkgeW91ciBhc3Npc3QgbW9kdWxlPzwvbGk+XHJcbiAgPGxpIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cclxuICAgIDxhY3ItZmlsZS11cGxvYWQtbG9hZGVyIChvbkZpbGVDb250ZW50UmVhZCk9XCJvbkZpbGVDb250ZW50UmVhZCgkZXZlbnQpXCI+PC9hY3ItZmlsZS11cGxvYWQtbG9hZGVyPlxyXG4gIDwvbGk+XHJcbiAgPGxpIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzooc2VsZWN0ZWRYTUwuZmlsZUxhYmVsID09PSBmaWxlLmZpbGVMYWJlbCl9XCIgKm5nRm9yPVwibGV0IGZpbGUgb2YgZ2xvYmFsc1NlcnZpY2UuWE1MTGlzdC5WYWx1ZXMoKS5yZXZlcnNlKClcIlxyXG4gICAgIGNsYXNzPVwidHJlZXZpZXdcIj5cclxuICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uRmlsZUNsaWNrKGZpbGUpXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYm9va1wiPjwvaT5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJ3aGl0ZXNwYWNlXCI+e3tmaWxlLmZpbGVMYWJlbH19PC9zcGFuPlxyXG4gICAgPC9hPlxyXG4gIDwvbGk+XHJcbjwvdWw+XHJcbmAsXHJcbiAgc3R5bGVzOiBbYGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWaWV3VXBsb2FkTG9hZGVyQ29tcG9uZW50IHtcclxuXHJcbiAgQE91dHB1dCgpIG9uRmlsZVNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8RmlsZURldGFpbHM+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlRGV0YWlscz4oKTtcclxuXHJcbiAgc2VsZWN0ZWRYTUw6IEZpbGVEZXRhaWxzO1xyXG4gIGdsb2JhbHNTZXJ2aWNlOiBHbG9iYWxzU2VydmljZTtcclxuXHJcbiAgY29uc3RydWN0b3IoZ2xvYmFsc1NlcnZpY2U6IEdsb2JhbHNTZXJ2aWNlKSB7XHJcbiAgICB0aGlzLmdsb2JhbHNTZXJ2aWNlID0gZ2xvYmFsc1NlcnZpY2U7XHJcbiAgfVxyXG5cclxuICBvbkZpbGVDb250ZW50UmVhZChmaWxlRGV0YWlsczogRmlsZURldGFpbHMpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRYTUwgPSBmaWxlRGV0YWlscztcclxuICAgIGlmICh0aGlzLmdsb2JhbHNTZXJ2aWNlLlhNTExpc3QuQ29udGFpbnNLZXkoZmlsZURldGFpbHMuZmlsZUxhYmVsKSkge1xyXG4gICAgICB0aGlzLmdsb2JhbHNTZXJ2aWNlLlhNTExpc3QuUmVtb3ZlKGZpbGVEZXRhaWxzLmZpbGVMYWJlbCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmdsb2JhbHNTZXJ2aWNlLlhNTExpc3QuQWRkKGZpbGVEZXRhaWxzLmZpbGVMYWJlbCwgZmlsZURldGFpbHMpO1xyXG4gICAgdGhpcy5vbkZpbGVTZWxlY3RlZC5lbWl0KGZpbGVEZXRhaWxzKTtcclxuICB9XHJcbiAgb25GaWxlQ2xpY2soZmlsZURldGFpbHM6IEZpbGVEZXRhaWxzKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkWE1MID0gZmlsZURldGFpbHM7XHJcbiAgICB0aGlzLm9uRmlsZVNlbGVjdGVkLmVtaXQoZmlsZURldGFpbHMpO1xyXG5cclxuICAgICQoJyN4bWxPbmx5TXNnJykuaGlkZSgpO1xyXG4gIH1cclxufVxyXG4iLCJleHBvcnQgY2xhc3MgRmlsZURldGFpbHMge1xyXG4gICAgZmlsZU5hbWU6IHN0cmluZztcclxuICAgIGZpbGVDb250ZW50czogc3RyaW5nO1xyXG4gICAgZmlsZUxhYmVsOiBzdHJpbmc7XHJcbiAgICBjb25zdHJ1Y3RvciAoZmlsZUxhYmVsOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcsICAgZmlsZUNvbnRlbnRzOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmZpbGVMYWJlbCA9IGZpbGVMYWJlbDtcclxuICAgICAgICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZSA7XHJcbiAgICAgICAgICB0aGlzLmZpbGVDb250ZW50cyA9IGZpbGVDb250ZW50cztcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE91dHB1dCAsIEV2ZW50RW1pdHRlciwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZpbGVEZXRhaWxzIH0gZnJvbSAnLi4vc2hhcmVkL21vZGVscy9maWxlLWRldGFpbHMubW9kZWwnO1xyXG5pbXBvcnQgeyBHbG9iYWxzU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9zZXJ2aWNlcy9nbG9iYWxzLnNlcnZpY2UnO1xyXG5jb25zdCAkID0gcmVxdWlyZSgnanF1ZXJ5Jyk7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Fjci1maWxlLXVwbG9hZC1sb2FkZXInLFxyXG4gIHRlbXBsYXRlOiBgPGlucHV0IGlkPVwieG1sRmlsZVVwbG9hZFwiIGNsYXNzPVwiaGlkZGVuXCIgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCIueG1sXCIgKGNoYW5nZSk9XCJjaGFuZ2VMaXN0ZW5lcigkZXZlbnQpXCIgKGNsaWNrKT1cImhpZGVNZXNzYWdlKClcIj5cclxuPGxhYmVsIGZvcj1cInhtbEZpbGVVcGxvYWRcIiBjbGFzcz1cImJ0biBidG4tc3VjY2VzcyBiZy1vbGl2ZSBtYXJnaW4tMTBcIiB0aXRsZT1cIkNob29zZSBhIE1vZHVsZVwiPkNob29zZSBhIE1vZHVsZTwvbGFiZWw+XHJcbjxicj5cclxuPGRpdiBpZD1cInhtbE9ubHlNc2dcIiBjbGFzcz1cImVycm9yLW1zZ1wiPiBPbmx5IFhNTCBmaWxlcyBhcmUgc3VwcG9ydGVkICEhITwvZGl2PlxyXG5gLFxyXG4gIHN0eWxlczogW2BgXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRMb2FkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQgIHtcclxuICBAT3V0cHV0KCkgb25GaWxlQ29udGVudFJlYWQ6IEV2ZW50RW1pdHRlcjxGaWxlRGV0YWlscz4gPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGVEZXRhaWxzPigpO1xyXG4gIGZpbGVSZWFkZXI6IEZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gIHJlYWRGaWxlOiBGaWxlO1xyXG5jb25zdHJ1Y3RvciAocHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBHbG9iYWxzU2VydmljZSkge1xyXG5cclxufVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5oaWRlTWVzc2FnZSgpO1xyXG4gICAgdGhpcy5zaG93VGVzdE1vZHVsZSgpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd0RlZmF1bHRNb2R1bGUoKTtcclxuICAgICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIGNoYW5nZUxpc3RlbmVyKCRldmVudCk6IHZvaWQge1xyXG4gICAgbGV0IGZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgICBmaWxlTmFtZSA9ICRldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICBpZiAoZmlsZU5hbWUuaW5jbHVkZXMoJy54bWwnKSB8fCBmaWxlTmFtZS5pbmNsdWRlcygnLlhtbCcpIHx8IGZpbGVOYW1lLmluY2x1ZGVzKCcuWE1MJykgfHxcclxuICAgIGZpbGVOYW1lLmluY2x1ZGVzKCcuemlwJykgfHwgZmlsZU5hbWUuaW5jbHVkZXMoJy5aaXAnKSB8fCBmaWxlTmFtZS5pbmNsdWRlcygnLlpJUCcpKSB7XHJcbiAgICAgIHRoaXMuaGlkZU1lc3NhZ2UoKTtcclxuICAgIHRoaXMucmVhZFRoaXMoJGV2ZW50LnRhcmdldCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoZmlsZU5hbWUgIT09ICcnICYmIGZpbGVOYW1lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAkKCcjeG1sT25seU1zZycpLnNob3coKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGlkZU1lc3NhZ2UoKSB7XHJcbiAgICAkKCcjeG1sT25seU1zZycpLmhpZGUoKTtcclxuICB9XHJcblxyXG4gIHJlYWRUaGlzKGlucHV0VmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWFkRmlsZSA9IGlucHV0VmFsdWUuZmlsZXNbMF07XHJcbiAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgIGNvbnN0IGV4dGVuc2lvblN0YXJ0UG9zaXRpb24gPSBzZWxmLnJlYWRGaWxlLm5hbWUubGFzdEluZGV4T2YoJy4nKTtcclxuICAgIHRoaXMuZmlsZVJlYWRlci5vbmxvYWRlbmQgPSAoZSkgPT4ge1xyXG4gICAgICBzZWxmLm9uRmlsZUNvbnRlbnRSZWFkLmVtaXQoIG5ldyBGaWxlRGV0YWlscyhzZWxmLnJlYWRGaWxlLm5hbWUuc3Vic3RyaW5nKDAsIGV4dGVuc2lvblN0YXJ0UG9zaXRpb24pLCAgICBzZWxmLnJlYWRGaWxlLm5hbWUsIHRoaXMuZmlsZVJlYWRlci5yZXN1bHQpKTtcclxuICAgIH07XHJcbiAgICB0aGlzLmZpbGVSZWFkZXIucmVhZEFzVGV4dCh0aGlzLnJlYWRGaWxlKTtcclxuICB9XHJcblxyXG4gIHNob3dEZWZhdWx0TW9kdWxlKCkge1xyXG4gICAgdGhpcy5jb25maWdTZXJ2aWNlLmdldERlZmF1bHRNb2R1bGVQYXRoKClcclxuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLm9uRmlsZUNvbnRlbnRSZWFkLmVtaXQoIG5ldyBGaWxlRGV0YWlscygnSGVsbG8gQXNzaXN0IDIuMCcsICdIZWxsb19Bc3Npc3QueG1sJywgZGF0YSkpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHNob3dUZXN0TW9kdWxlKCkge1xyXG4gICAgdGhpcy5jb25maWdTZXJ2aWNlLmdldERlZmF1bHRUZXN0TW9kdWxlUGF0aCgpXHJcbiAgICAuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgc2VsZi5vbkZpbGVDb250ZW50UmVhZC5lbWl0KCBuZXcgRmlsZURldGFpbHMoJ1Rlc3QgTW9kdWxlJywgJ1Rlc3RfTW9kdWxlLnhtbCcsIGRhdGEpKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBWaWV3VXBsb2FkTG9hZGVyQ29tcG9uZW50IH0gZnJvbSAnLi92aWV3LXVwbG9hZC1sb2FkZXIvdmlldy11cGxvYWQtbG9hZGVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZpbGVVcGxvYWRMb2FkZXJDb21wb25lbnQgfSBmcm9tICcuL2ZpbGUtdXBsb2FkLWxvYWRlci9maWxlLXVwbG9hZC1sb2FkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgR2xvYmFsc1NlcnZpY2UgfSBmcm9tICcuL3NoYXJlZC9zZXJ2aWNlcy9nbG9iYWxzLnNlcnZpY2UnO1xyXG5cclxuY29uc3QgY29tcG9uZW50cyA9IFtGaWxlVXBsb2FkTG9hZGVyQ29tcG9uZW50LCBWaWV3VXBsb2FkTG9hZGVyQ29tcG9uZW50XTtcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlXHJcbiAgXSxcclxuICBkZWNsYXJhdGlvbnM6IFtjb21wb25lbnRzXSxcclxuICBwcm92aWRlcnMgOiBbR2xvYmFsc1NlcnZpY2VdLFxyXG4gIGV4cG9ydHM6IFtjb21wb25lbnRzXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2ltdWxhdG9yTG9hZGVyTW9kdWxlIHsgfVxyXG4iXSwibmFtZXMiOlsiQmVoYXZpb3JTdWJqZWN0IiwidHNsaWJfMS5fX3ZhbHVlcyIsImlzQXJyYXkiLCJJbmplY3RhYmxlIiwiTmdNb2R1bGUiLCJDb21tb25Nb2R1bGUiLCJJbmplY3Rpb25Ub2tlbiIsIkluamVjdCIsIkV2ZW50RW1pdHRlciIsIkNvbXBvbmVudCIsIklucHV0IiwiT3V0cHV0IiwiVmlld0NoaWxkIiwidHNsaWJfMS5fX2V4dGVuZHMiLCJTdWJqZWN0IiwiJCIsIkRvbVNhbml0aXplciIsIlZhbGlkYXRvcnMiLCJGb3JtQnVpbGRlciIsIkRpcmVjdGl2ZSIsIkVsZW1lbnRSZWYiLCJIb3N0TGlzdGVuZXIiLCJTbGlkZUNvbXBvbmVudCIsIkNhcm91c2VsQ29tcG9uZW50IiwiRm9ybXNNb2R1bGUiLCJSZWFjdGl2ZUZvcm1zTW9kdWxlIiwiRHJhZ1Njcm9sbE1vZHVsZSIsIkFuZ3VsYXJEYXRlVGltZVBpY2tlck1vZHVsZSIsIkR1cmF0aW9uUGlja2VyTW9kdWxlIiwiQ2Fyb3VzZWxDb25maWciLCJodHRwIiwiSHR0cCIsImNvbXBvbmVudHMiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBOzs7Ozs7Ozs7Ozs7OztJQWNBO0lBRUEsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLGNBQWM7U0FDcEMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFlBQVksS0FBSyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDNUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQztZQUFFLElBQUksQ0FBQyxD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