Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Bower components Debian packages RPM packages NuGet packages

vipera-npm-registry / motif-web-admin-core   js

Repository URL to install this package:

Version: 0.3.1 

/ esm5 / lib / services / ThemeDesigner / ThemeModel.js

/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
 */
import * as tslib_1 from "tslib";
/**
 * @record
 */
export function ThemeItem() { }
if (false) {
    /** @type {?} */
    ThemeItem.prototype.description;
}
var ThemeGroup = /** @class */ (function () {
    function ThemeGroup() {
    }
    return ThemeGroup;
}());
export { ThemeGroup };
if (false) {
    /** @type {?} */
    ThemeGroup.prototype.items;
    /** @type {?} */
    ThemeGroup.prototype.description;
}
/**
 * @abstract
 */
var /**
 * @abstract
 */
ThemeModel = /** @class */ (function (_super) {
    tslib_1.__extends(ThemeModel, _super);
    function ThemeModel() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    return ThemeModel;
}(ThemeGroup));
/**
 * @abstract
 */
export { ThemeModel };
if (false) {
    /** @type {?} */
    ThemeModel.prototype.description;
    /**
     * @abstract
     * @return {?}
     */
    ThemeModel.prototype.exportTheme = function () { };
}
/** @type {?} */
var LOG_TAG = '[DefaultThemeModel]';
var ThemeColorItem = /** @class */ (function () {
    function ThemeColorItem(name, description, cssPropertyName, scssVariableName, themeWrapper, logger) {
        this.name = name;
        this.description = description;
        this.cssPropertyName = cssPropertyName;
        this.scssVariableName = scssVariableName;
        this.themeWrapper = themeWrapper;
        this.logger = logger;
        this.presets = ['#00000000'];
        this._value = this.getColorProperty(cssPropertyName);
    }
    Object.defineProperty(ThemeColorItem.prototype, "value", {
        get: /**
         * @return {?}
         */
        function () {
            return this._value;
        },
        set: /**
         * @param {?} colorValue
         * @return {?}
         */
        function (colorValue) {
            this._value = colorValue;
            this.themeWrapper.style.setProperty(this.cssPropertyName, colorValue);
            //console.log(">>>>> Set color value: ", colorValue);
        },
        enumerable: true,
        configurable: true
    });
    /**
     * @private
     * @param {?} variableName
     * @return {?}
     */
    ThemeColorItem.prototype.getColorProperty = /**
     * @private
     * @param {?} variableName
     * @return {?}
     */
    function (variableName) {
        /** @type {?} */
        var style = getComputedStyle(this.themeWrapper);
        /** @type {?} */
        var ret = style.getPropertyValue(variableName).trim();
        return ret;
    };
    return ThemeColorItem;
}());
export { ThemeColorItem };
if (false) {
    /**
     * @type {?}
     * @private
     */
    ThemeColorItem.prototype._value;
    /** @type {?} */
    ThemeColorItem.prototype.presets;
    /** @type {?} */
    ThemeColorItem.prototype.name;
    /** @type {?} */
    ThemeColorItem.prototype.description;
    /** @type {?} */
    ThemeColorItem.prototype.cssPropertyName;
    /** @type {?} */
    ThemeColorItem.prototype.scssVariableName;
    /**
     * @type {?}
     * @private
     */
    ThemeColorItem.prototype.themeWrapper;
    /**
     * @type {?}
     * @private
     */
    ThemeColorItem.prototype.logger;
}
var DefaultThemeModel = /** @class */ (function () {
    function DefaultThemeModel(logger, document) {
        this.logger = logger;
        this.document = document;
        this.items = [];
        this.logger.debug(LOG_TAG, 'Initializing');
        this.themeWrapper = this.document.querySelector('app-root');
        this.createModel();
    }
    /**
     * @private
     * @return {?}
     */
    DefaultThemeModel.prototype.createModel = /**
     * @private
     * @return {?}
     */
    function () {
        this.items.push(this.createMainGroup());
        this.items.push(this.createToolbarGroup());
        this.items.push(this.createHeaderGroup());
        this.items.push(this.createFooterGroup());
        this.items.push(this.createGridGroup());
        this.items.push(this.createTabsGroup());
        this.items.push(this.createButtonsGroup());
        this.items.push(this.createComboboxGroup());
        this.items.push(this.createInputGroup());
    };
    /**
     * @private
     * @return {?}
     */
    DefaultThemeModel.prototype.createMainGroup = /**
     * @private
     * @return {?}
     */
    function () {
        /** @type {?} */
        var ret = new ThemeGroup();
        ret.description = "Main";
        ret.items = [
            // Main Colors
            this.createColorItem('background', 'Main Background', '--main-background-color', '$main_background_color'),
            //Titles
            this.createColorItem('background', 'Title 1 Color', '--title-1-color', '$title1_color'),
        ];
        return ret;
    };
    /**
     * @private
     * @return {?}
     */
    DefaultThemeModel.prototype.createHeaderGroup = /**
     * @private
     * @return {?}
     */
    function () {
        /** @type {?} */
        var ret = new ThemeGroup();
        ret.description = "Header";
        ret.items = [
            // Header Colors
            this.createColorItem('header', 'Header Background', '--header-background-color', '$header_background_color'),
            this.createColorItem('header', 'Header Color', '--header-color', '$header_description_color'),
            this.createColorItem('header', 'Header Hover', '--header-color-hover', '$header_description_hover_color')
        ];
        return ret;
    };
    /**
     * @private
     * @return {?}
     */
    DefaultThemeModel.prototype.createFooterGroup = /**
     * @private
     * @return {?}
     */
    function () {
        /** @type {?} */
        var ret = new ThemeGroup();
        ret.description = "Footer";
        ret.items = [
            // Footer Colors
            this.createColorItem('footer', 'Footer Background', '--footer-background-color', '$footer_background_color'),
            this.createColorItem('footer', 'Footer Color', '--footer-color', '$footer_color')
        ];
        return ret;
    };
    /**
     * @private
     * @return {?}
     */
    DefaultThemeModel.prototype.createGridGroup = /**
     * @private
     * @return {?}
     */
    function () {
        /** @type {?} */
        var ret = new ThemeGroup();
        ret.description = "Grid";
        ret.items = [
            // Grid Colors 
            this.createColorItem('grid', 'Grid Background', '--grid-background-color', '$grid_background_color'),
            this.createColorItem('grid', 'Grid Color', '--grid-color', '$grid_color'),
            this.createColorItem('grid', 'Grid Border Color', '--grid-border-color', '$grid_border_color'),
            this.createColorItem('grid', 'Grid Header Color', '--grid-header-color', '$grid_header_color'),
            this.createColorItem('grid', 'Grid Header Border', '--grid-header-border-color', '$grid_header_border_color'),
            this.createColorItem('grid', 'Grid Hover Backgorund', '--grid-row-hover-background-color', '$grid_tr_hover_background_color'),
            this.createColorItem('grid', 'Grid Hover Color', '--grid-row-hover-color', '$grid_tr_hover_color'),
            this.createColorItem('grid', 'Grid Selected Background Color', '--grid-row-selected-background-color', '$grid_selected_row_color'),
            this.createColorItem('grid', 'Grid Selected Color', '--grid-row-selected-color', '$grid_selected_row'),
            this.createColorItem('grid', 'Grid Command Color', '--grid-command-color', '$grid_command_color'),
            this.createColorItem('grid', 'Grid Selected Row Command Color', '--grid-selected-row-command-color', '$grid_selected_row_command_color')
        ];
        return ret;
    };
    /**
     * @private
     * @return {?}
     */
    DefaultThemeModel.prototype.createToolbarGroup = /**
     * @private
     * @return {?}
     */
    function () {
        /** @type {?} */
        var ret = new ThemeGroup();
        ret.description = "Main Toolbar";
        ret.items = [
            // Toolbar Colors
            this.createColorItem('mainToolbar', 'Background', '--nav-background-color', '$nav_background_color'),
            this.createColorItem('mainToolbar', 'Border', '--nav-border-color', '$nav_a_a_border_color'),
            this.createColorItem('mainToolbar', 'Color', '--nav-color', '$nav_color'),
            this.createColorItem('mainToolbar', 'Background Hover', '--nav-hover-background-color', '$nav_hover_background_color'),
            this.createColorItem('mainToolbar', 'Color Hover', '--nav-hover-color', '$nav_hover_color')
        ];
        return ret;
    };
    /**
     * @private
     * @return {?}
     */
    DefaultThemeModel.prototype.createTabsGroup = /**
     * @private
     * @return {?}
     */
    function () {
        /** @type {?} */
        var ret = new ThemeGroup();
        ret.description = "Tabs";
        ret.items = [
            // Toolbar Colors
            this.createColorItem('tabs', 'Background', '--tab-background-color', '$tab_background_color'),
            this.createColorItem('tabs', 'Color', '--tab-color', '$tab_color'),
            this.createColorItem('tabs', 'Selected Background', '--tab-selected-background-color', '$tab_selected_background_color'),
            this.createColorItem('tabs', 'Selected Color', '--tab-selected-color', '$tab_selected_color'),
        ];
        return ret;
    };
    /**
     * @private
     * @return {?}
     */
    DefaultThemeModel.prototype.createButtonsGroup = /**
     * @private
     * @return {?}
     */
    function () {
        /** @type {?} */
        var ret = new ThemeGroup();
        ret.description = "Buttons";
        ret.items = [
            // Toolbar Colors
            this.createColorItem('buttons', 'Background', '--button-background-color', '$button_background_color'),
            this.createColorItem('buttons', 'Color', '--button-color', '$button_color'),
            this.createColorItem('buttons', 'Border', '--button-border-color', '$button_border_color'),
            this.createColorItem('buttons', 'Hover Background', '--button-hover-background-color', '$button_hover_background_color'),
            this.createColorItem('buttons', 'Hover Color', '--button-hover-color', '$button_hover_color'),
            this.createColorItem('buttons', 'Hover Border', '--button-hover-border-color', '$button_hover_border_color'),
            this.createColorItem('buttons', 'Disabled Background', '--button-disabled-background-color', '$button_disabled_background_color'),
            this.createColorItem('buttons', 'Disabled Color', '--button-disabled-color', '$button_disabled_color'),
            this.createColorItem('buttons', 'Disabled Border', '--button-disabled-border-color', '$button_disabled_border_color')
        ];
        return ret;
    };
    /**
     * @private
     * @return {?}
     */
    DefaultThemeModel.prototype.createComboboxGroup = /**
     * @private
     * @return {?}
     */
    function () {
        /** @type {?} */
        var ret = new ThemeGroup();
        ret.description = "Comboboxes";
        ret.items = [
            // Toolbar Colors
            this.createColorItem('combobox', 'Background', '--combobox-background-color', '$combobox_background_color'),
            this.createColorItem('combobox', 'Color', '--combobox-color', '$combobox_color'),
            this.createColorItem('combobox', 'Selection Background', '--combobox-selected-item-background-color', '$combobox_selected_item_background_color'),
            this.createColorItem('combobox', 'Selection Color', '--combobox-selected-item-color', '$combobox_selected_item_color'),
            this.createColorItem('combobox', 'Button Background', '--combobox-button-background-color', '$combobox_button_background_color'),
            this.createColorItem('combobox', 'Button Color', '--combobox-button-color', '$combobox_button_color')
        ];
        return ret;
    };
    /**
     * @private
     * @return {?}
     */
    DefaultThemeModel.prototype.createInputGroup = /**
     * @private
     * @return {?}
     */
    function () {
        /** @type {?} */
        var ret = new ThemeGroup();
        ret.description = "Input";
        ret.items = [
            // Toolbar Colors
            this.createColorItem('input', 'Background', '--input-background-color', '$input_background_color'),
            this.createColorItem('input', 'Color', '--input-color', '$input_color'),
            this.createColorItem('input', 'Placeholder Color', '--input-placeholder-color', '$input_placeholder_color'),
            this.createColorItem('input', 'Border Color', '--input-border-color', '$input_border_color'),
            this.createColorItem('input', 'Focus Background', '--input-focus-background-color', '$input_focus_background_color'),
            this.createColorItem('input', 'Focus Color', '--input-focus-color', '$input_focus_color')
        ];
        return ret;
    };
    /**
     * @return {?}
     */
    DefaultThemeModel.prototype.exportTheme = /**
     * @return {?}
     */
    function () {
        /** @type {?} */
        var retStr = "";
        for (var i = 0; i < this.items.length; i++) {
            /** @type {?} */
            var groupItem = (/** @type {?} */ (this.items[i]));
            for (var k = 0; k < groupItem.items.length; k++) {
                /** @type {?} */
                var item = (/** @type {?} */ (groupItem.items[k]));
                retStr += "\n" + item.scssVariableName + ":" + item.value + ";";
            }
        }
        return retStr;
    };
    /**
     * @private
     * @param {?} name
     * @param {?} description
     * @param {?} cssPropertyName
     * @param {?} scssVariableName
     * @return {?}
     */
    DefaultThemeModel.prototype.createColorItem = /**
     * @private
     * @param {?} name
     * @param {?} description
     * @param {?} cssPropertyName
     * @param {?} scssVariableName
     * @return {?}
     */
    function (name, description, cssPropertyName, scssVariableName) {
        return new ThemeColorItem(name, description, cssPropertyName, scssVariableName, this.themeWrapper, this.logger);
    };
    return DefaultThemeModel;
}());
export { DefaultThemeModel };
if (false) {
    /**
     * @type {?}
     * @private
     */
    DefaultThemeModel.prototype.themeWrapper;
    /** @type {?} */
    DefaultThemeModel.prototype.items;
    /** @type {?} */
    DefaultThemeModel.prototype.description;
    /**
     * @type {?}
     * @private
     */
    DefaultThemeModel.prototype.logger;
    /**
     * @type {?}
     * @private
     */
    DefaultThemeModel.prototype.document;
}
import { Inject } from '@angular/core';
import { NGXLogger } from 'web-console-core';
import { DOCUMENT } from '@angular/common';
var ThemeModelBuilder = /** @class */ (function () {
    function ThemeModelBuilder(logger, document) {
        this.logger = logger;
        this.document = document;
        this.logger.debug(LOG_TAG, 'Initializing Theme Builder');
    }
    /**
     * @return {?}
     */
    ThemeModelBuilder.prototype.createModel = /**
     * @return {?}
     */
    function () {
        /** @type {?} */
        var model = new DefaultThemeModel(this.logger, this.document);
        //console.log("createModel :", model);
        return model;
    };
    /** @nocollapse */
    ThemeModelBuilder.ctorParameters = function () { return [
        { type: NGXLogger },
        { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
    ]; };
    return ThemeModelBuilder;
}());
export { ThemeModelBuilder };
if (false) {
    /**
     * @type {?}
     * @private
     */
    ThemeModelBuilder.prototype.logger;
    /**
     * @type {?}
     * @private
     */
    ThemeModelBuilder.prototype.document;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGhlbWVNb2RlbC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21vdGlmLXdlYi1hZG1pbi1jb3JlLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL1RoZW1lRGVzaWduZXIvVGhlbWVNb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUVBLCtCQUVDOzs7SUFEQyxnQ0FBbUI7O0FBR3JCO0lBQUE7SUFHQSxDQUFDO0lBQUQsaUJBQUM7QUFBRCxDQUFDLEFBSEQsSUFHQzs7OztJQUZDLDJCQUFtQjs7SUFDbkIsaUNBQW9COzs7OztBQUd0Qjs7OztJQUF5QyxzQ0FBVTtJQUFuRDs7SUFHQSxDQUFDO0lBQUQsaUJBQUM7QUFBRCxDQUFDLEFBSEQsQ0FBeUMsVUFBVSxHQUdsRDs7Ozs7OztJQUZDLGlDQUFvQjs7Ozs7SUFDcEIsbURBQStCOzs7SUFLM0IsT0FBTyxHQUFHLHFCQUFxQjtBQUVyQztJQU1FLHdCQUFtQixJQUFZLEVBQ3RCLFdBQW1CLEVBQ25CLGVBQXVCLEVBQ3ZCLGdCQUFnQixFQUNmLFlBQWlCLEVBQ2pCLE1BQWlCO1FBTFIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUN0QixnQkFBVyxHQUFYLFdBQVcsQ0FBUTtRQUNuQixvQkFBZSxHQUFmLGVBQWUsQ0FBUTtRQUN2QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQUE7UUFDZixpQkFBWSxHQUFaLFlBQVksQ0FBSztRQUNqQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBUHBCLFlBQU8sR0FBRyxDQUFFLFdBQVcsQ0FBQyxDQUFDO1FBUTVCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxzQkFBVyxpQ0FBSzs7OztRQUFoQjtZQUNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDOzs7OztRQUVELFVBQWlCLFVBQWlCO1lBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO1lBQ3pC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QUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0M7SUFFSSwyQkFBb0IsTUFBaUIsRUFBNEIsUUFBYTtRQUExRCxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQTRCLGFBQVEsR0FBUixRQUFRLENBQUs7UUFDNUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLDRCQUE0QixDQUFFLENBQUM7SUFDNUQsQ0FBQzs7OztJQUVNLHVDQUFXOzs7SUFBbEI7O1lBQ00sS0FBSyxHQUFlLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3pFLHNDQUFzQztRQUN0QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7OztnQkFiSSxTQUFTO2dEQUswQixNQUFNLFNBQUMsUUFBUTs7SUFXM0Qsd0JBQUM7Q0FBQSxBQWJELElBYUM7U0FiWSxpQkFBaUI7Ozs7OztJQUVkLG1DQUF5Qjs7Ozs7SUFBRSxxQ0FBdUMiLCJzb3VyY2VzQ29udGVudCI6WyJcblxuZXhwb3J0IGludGVyZmFjZSBUaGVtZUl0ZW0ge1xuICBkZXNjcmlwdGlvbjogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBUaGVtZUdyb3VwIGltcGxlbWVudHMgVGhlbWVJdGVtIHtcbiAgaXRlbXM6IFRoZW1lSXRlbVtdO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGhlbWVNb2RlbCBleHRlbmRzIFRoZW1lR3JvdXAge1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBhYnN0cmFjdCBleHBvcnRUaGVtZSgpOiBzdHJpbmc7XG59XG5cblxuXG5jb25zdCBMT0dfVEFHID0gJ1tEZWZhdWx0VGhlbWVNb2RlbF0nO1xuXG5leHBvcnQgY2xhc3MgVGhlbWVDb2xvckl0ZW0gaW1wbGVtZW50cyBUaGVtZUl0ZW0ge1xuXG4gIHByaXZhdGUgX3ZhbHVlOiBzdHJpbmc7XG5cbiAgcHVibGljIHByZXNldHMgPSBbICcjMDAwMDAwMDAnXTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIHB1YmxpYyBjc3NQcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgc2Nzc1ZhcmlhYmxlTmFtZSxcbiAgICBwcml2YXRlIHRoZW1lV3JhcHBlcjogYW55LFxuICAgIHByaXZhdGUgbG9nZ2VyOiBOR1hMb2dnZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5nZXRDb2xvclByb3BlcnR5KGNzc1Byb3BlcnR5TmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZhbHVlKCl7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgcHVibGljIHNldCB2YWx1ZShjb2xvclZhbHVlOnN0cmluZykge1xuICAgIHRoaXMuX3ZhbHVlID0gY29sb3JWYWx1ZTtcbiAgICB0aGlzLnRoZW1lV3JhcHBlci5zdHlsZS5zZXRQcm9wZXJ0eSh0aGlzLmNzc1Byb3BlcnR5TmFtZSwgY29sb3JWYWx1ZSk7XG4gICAgLy9jb25zb2xlLmxvZyhcIj4+Pj4+IFNldCBjb2xvciB2YWx1ZTogXCIsIGNvbG9yVmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2xvclByb3BlcnR5KHZhcmlhYmxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMudGhlbWVXcmFwcGVyKTtcbiAgICB2YXIgcmV0ID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSh2YXJpYWJsZU5hbWUpLnRyaW0oKTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cblxufVxuXG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0VGhlbWVNb2RlbCBpbXBsZW1lbnRzIFRoZW1lTW9kZWwge1xuXG4gIHByaXZhdGUgdGhlbWVXcmFwcGVyOiBhbnk7XG5cbiAgaXRlbXM6IFRoZW1lSXRlbVtdID0gW107XG4gIGRlc2NyaXB0aW9uOiBcIlRoZW1lIE1vZGVsXCI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBsb2dnZXI6IE5HWExvZ2dlciwgcHJpdmF0ZSBkb2N1bWVudDogYW55KXtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnSW5pdGlhbGl6aW5nJyApO1xuICAgIHRoaXMudGhlbWVXcmFwcGVyID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdhcHAtcm9vdCcpO1xuICAgIHRoaXMuY3JlYXRlTW9kZWwoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTW9kZWwoKXtcbiAgICB0aGlzLml0ZW1zLnB1c2godGhpcy5jcmVhdGVNYWluR3JvdXAoKSk7XG4gICAgdGhpcy5pdGVtcy5wdXNoKHRoaXMuY3JlYXRlVG9vbGJhckdyb3VwKCkpO1xuICAgIHRoaXMuaXRlbXMucHVzaCh0aGlzLmNyZWF0ZUhlYWRlckdyb3VwKCkpO1xuICAgIHRoaXMuaXRlbXMucHVzaCh0aGlzLmNyZWF0ZUZvb3Rlckdyb3VwKCkpO1xuICAgIHRoaXMuaXRlbXMucHVzaCh0aGlzLmNyZWF0ZUdyaWRHcm91cCgpKTtcbiAgICB0aGlzLml0ZW1zLnB1c2godGhpcy5jcmVhdGVUYWJzR3JvdXAoKSk7XG4gICAgdGhpcy5pdGVtcy5wdXNoKHRoaXMuY3JlYXRlQnV0dG9uc0dyb3VwKCkpO1xuICAgIHRoaXMuaXRlbXMucHVzaCh0aGlzLmNyZWF0ZUNvbWJvYm94R3JvdXAoKSk7XG4gICAgdGhpcy5pdGVtcy5wdXNoKHRoaXMuY3JlYXRlSW5wdXRHcm91cCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWFpbkdyb3VwKCk6IFRoZW1lR3JvdXAge1xuICAgIGxldCByZXQgPSBuZXcgVGhlbWVHcm91cCgpO1xuICAgIHJldC5kZXNjcmlwdGlvbiA9IFwiTWFpblwiO1xuICAgIHJldC5pdGVtcyA9IFtcblxuICAgICAgLy8gTWFpbiBDb2xvcnNcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdiYWNrZ3JvdW5kJywgJ01haW4gQmFja2dyb3VuZCcsICctLW1haW4tYmFja2dyb3VuZC1jb2xvcicsICckbWFpbl9iYWNrZ3JvdW5kX2NvbG9yJyksXG4gICAgICAgIC8vVGl0bGVzXG4gICAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdiYWNrZ3JvdW5kJywgJ1RpdGxlIDEgQ29sb3InLCAnLS10aXRsZS0xLWNvbG9yJywgJyR0aXRsZTFfY29sb3InKSxcbiAgICBdO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuXG4gIHByaXZhdGUgY3JlYXRlSGVhZGVyR3JvdXAoKTogVGhlbWVHcm91cCB7XG4gICAgbGV0IHJldCA9IG5ldyBUaGVtZUdyb3VwKCk7XG4gICAgcmV0LmRlc2NyaXB0aW9uID0gXCJIZWFkZXJcIjtcbiAgICByZXQuaXRlbXMgPSBbXG4gICAgICAvLyBIZWFkZXIgQ29sb3JzXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnaGVhZGVyJywgJ0hlYWRlciBCYWNrZ3JvdW5kJywgJy0taGVhZGVyLWJhY2tncm91bmQtY29sb3InLCAnJGhlYWRlcl9iYWNrZ3JvdW5kX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnaGVhZGVyJywgJ0hlYWRlciBDb2xvcicsICctLWhlYWRlci1jb2xvcicsICckaGVhZGVyX2Rlc2NyaXB0aW9uX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnaGVhZGVyJywgJ0hlYWRlciBIb3ZlcicsICctLWhlYWRlci1jb2xvci1ob3ZlcicsICckaGVhZGVyX2Rlc2NyaXB0aW9uX2hvdmVyX2NvbG9yJylcbiAgICBdO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZvb3Rlckdyb3VwKCk6IFRoZW1lR3JvdXAge1xuICAgIGxldCByZXQgPSBuZXcgVGhlbWVHcm91cCgpO1xuICAgIHJldC5kZXNjcmlwdGlvbiA9IFwiRm9vdGVyXCI7XG4gICAgcmV0Lml0ZW1zID0gW1xuICAgICAgLy8gRm9vdGVyIENvbG9yc1xuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2Zvb3RlcicsICdGb290ZXIgQmFja2dyb3VuZCcsICctLWZvb3Rlci1iYWNrZ3JvdW5kLWNvbG9yJywnJGZvb3Rlcl9iYWNrZ3JvdW5kX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnZm9vdGVyJywgJ0Zvb3RlciBDb2xvcicsICctLWZvb3Rlci1jb2xvcicsJyRmb290ZXJfY29sb3InKVxuICAgIF07XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBjcmVhdGVHcmlkR3JvdXAoKTogVGhlbWVHcm91cCB7XG4gICAgbGV0IHJldCA9IG5ldyBUaGVtZUdyb3VwKCk7XG4gICAgcmV0LmRlc2NyaXB0aW9uID0gXCJHcmlkXCI7XG4gICAgcmV0Lml0ZW1zID0gW1xuICAgICAgLy8gR3JpZCBDb2xvcnMgXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnZ3JpZCcsICdHcmlkIEJhY2tncm91bmQnLCAnLS1ncmlkLWJhY2tncm91bmQtY29sb3InLCckZ3JpZF9iYWNrZ3JvdW5kX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnZ3JpZCcsICdHcmlkIENvbG9yJywgJy0tZ3JpZC1jb2xvcicsICckZ3JpZF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2dyaWQnLCAnR3JpZCBCb3JkZXIgQ29sb3InLCAnLS1ncmlkLWJvcmRlci1jb2xvcicsICckZ3JpZF9ib3JkZXJfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdncmlkJywgJ0dyaWQgSGVhZGVyIENvbG9yJywgJy0tZ3JpZC1oZWFkZXItY29sb3InLCAnJGdyaWRfaGVhZGVyX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnZ3JpZCcsICdHcmlkIEhlYWRlciBCb3JkZXInLCAnLS1ncmlkLWhlYWRlci1ib3JkZXItY29sb3InLCAnJGdyaWRfaGVhZGVyX2JvcmRlcl9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2dyaWQnLCAnR3JpZCBIb3ZlciBCYWNrZ29ydW5kJywgJy0tZ3JpZC1yb3ctaG92ZXItYmFja2dyb3VuZC1jb2xvcicsICckZ3JpZF90cl9ob3Zlcl9iYWNrZ3JvdW5kX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnZ3JpZCcsICdHcmlkIEhvdmVyIENvbG9yJywgJy0tZ3JpZC1yb3ctaG92ZXItY29sb3InLCAnJGdyaWRfdHJfaG92ZXJfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdncmlkJywgJ0dyaWQgU2VsZWN0ZWQgQmFja2dyb3VuZCBDb2xvcicsICctLWdyaWQtcm93LXNlbGVjdGVkLWJhY2tncm91bmQtY29sb3InLCAnJGdyaWRfc2VsZWN0ZWRfcm93X2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnZ3JpZCcsICdHcmlkIFNlbGVjdGVkIENvbG9yJywgJy0tZ3JpZC1yb3ctc2VsZWN0ZWQtY29sb3InLCAnJGdyaWRfc2VsZWN0ZWRfcm93JyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnZ3JpZCcsICdHcmlkIENvbW1hbmQgQ29sb3InLCAnLS1ncmlkLWNvbW1hbmQtY29sb3InLCAnJGdyaWRfY29tbWFuZF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2dyaWQnLCAnR3JpZCBTZWxlY3RlZCBSb3cgQ29tbWFuZCBDb2xvcicsICctLWdyaWQtc2VsZWN0ZWQtcm93LWNvbW1hbmQtY29sb3InLCAnJGdyaWRfc2VsZWN0ZWRfcm93X2NvbW1hbmRfY29sb3InKVxuICAgIF07XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuICBcblxuICBwcml2YXRlIGNyZWF0ZVRvb2xiYXJHcm91cCgpOiBUaGVtZUdyb3VwIHtcbiAgICBsZXQgcmV0ID0gbmV3IFRoZW1lR3JvdXAoKTtcbiAgICByZXQuZGVzY3JpcHRpb24gPSBcIk1haW4gVG9vbGJhclwiO1xuICAgIHJldC5pdGVtcyA9IFtcbiAgICAgIC8vIFRvb2xiYXIgQ29sb3JzXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnbWFpblRvb2xiYXInLCAnQmFja2dyb3VuZCcsICctLW5hdi1iYWNrZ3JvdW5kLWNvbG9yJywgJyRuYXZfYmFja2dyb3VuZF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ21haW5Ub29sYmFyJywgJ0JvcmRlcicsICctLW5hdi1ib3JkZXItY29sb3InLCAnJG5hdl9hX2FfYm9yZGVyX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnbWFpblRvb2xiYXInLCAnQ29sb3InLCAnLS1uYXYtY29sb3InLCAnJG5hdl9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ21haW5Ub29sYmFyJywgJ0JhY2tncm91bmQgSG92ZXInLCAnLS1uYXYtaG92ZXItYmFja2dyb3VuZC1jb2xvcicsJyRuYXZfaG92ZXJfYmFja2dyb3VuZF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ21haW5Ub29sYmFyJywgJ0NvbG9yIEhvdmVyJywgJy0tbmF2LWhvdmVyLWNvbG9yJywnJG5hdl9ob3Zlcl9jb2xvcicpXG4gICAgXTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUYWJzR3JvdXAoKTogVGhlbWVHcm91cCB7XG4gICAgbGV0IHJldCA9IG5ldyBUaGVtZUdyb3VwKCk7XG4gICAgcmV0LmRlc2NyaXB0aW9uID0gXCJUYWJzXCI7XG4gICAgcmV0Lml0ZW1zID0gW1xuICAgICAgLy8gVG9vbGJhciBDb2xvcnNcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCd0YWJzJywgJ0JhY2tncm91bmQnLCAnLS10YWItYmFja2dyb3VuZC1jb2xvcicsICckdGFiX2JhY2tncm91bmRfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCd0YWJzJywgJ0NvbG9yJywgJy0tdGFiLWNvbG9yJywgJyR0YWJfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCd0YWJzJywgJ1NlbGVjdGVkIEJhY2tncm91bmQnLCAnLS10YWItc2VsZWN0ZWQtYmFja2dyb3VuZC1jb2xvcicsICckdGFiX3NlbGVjdGVkX2JhY2tncm91bmRfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCd0YWJzJywgJ1NlbGVjdGVkIENvbG9yJywgJy0tdGFiLXNlbGVjdGVkLWNvbG9yJywgJyR0YWJfc2VsZWN0ZWRfY29sb3InKSxcbiAgICBdO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuXG4gIHByaXZhdGUgY3JlYXRlQnV0dG9uc0dyb3VwKCk6IFRoZW1lR3JvdXAge1xuICAgIGxldCByZXQgPSBuZXcgVGhlbWVHcm91cCgpO1xuICAgIHJldC5kZXNjcmlwdGlvbiA9IFwiQnV0dG9uc1wiO1xuICAgIHJldC5pdGVtcyA9IFtcbiAgICAgIC8vIFRvb2xiYXIgQ29sb3JzXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnYnV0dG9ucycsICdCYWNrZ3JvdW5kJywgJy0tYnV0dG9uLWJhY2tncm91bmQtY29sb3InLCAnJGJ1dHRvbl9iYWNrZ3JvdW5kX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnYnV0dG9ucycsICdDb2xvcicsICctLWJ1dHRvbi1jb2xvcicsICckYnV0dG9uX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnYnV0dG9ucycsICdCb3JkZXInLCAnLS1idXR0b24tYm9yZGVyLWNvbG9yJywgJyRidXR0b25fYm9yZGVyX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnYnV0dG9ucycsICdIb3ZlciBCYWNrZ3JvdW5kJywgJy0tYnV0dG9uLWhvdmVyLWJhY2tncm91bmQtY29sb3InLCAnJGJ1dHRvbl9ob3Zlcl9iYWNrZ3JvdW5kX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnYnV0dG9ucycsICdIb3ZlciBDb2xvcicsICctLWJ1dHRvbi1ob3Zlci1jb2xvcicsICckYnV0dG9uX2hvdmVyX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnYnV0dG9ucycsICdIb3ZlciBCb3JkZXInLCAnLS1idXR0b24taG92ZXItYm9yZGVyLWNvbG9yJywgJyRidXR0b25faG92ZXJfYm9yZGVyX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnYnV0dG9ucycsICdEaXNhYmxlZCBCYWNrZ3JvdW5kJywgJy0tYnV0dG9uLWRpc2FibGVkLWJhY2tncm91bmQtY29sb3InLCAnJGJ1dHRvbl9kaXNhYmxlZF9iYWNrZ3JvdW5kX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnYnV0dG9ucycsICdEaXNhYmxlZCBDb2xvcicsICctLWJ1dHRvbi1kaXNhYmxlZC1jb2xvcicsICckYnV0dG9uX2Rpc2FibGVkX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnYnV0dG9ucycsICdEaXNhYmxlZCBCb3JkZXInLCAnLS1idXR0b24tZGlzYWJsZWQtYm9yZGVyLWNvbG9yJywgJyRidXR0b25fZGlzYWJsZWRfYm9yZGVyX2NvbG9yJylcbiAgICBdO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbWJvYm94R3JvdXAoKTogVGhlbWVHcm91cCB7XG4gICAgbGV0IHJldCA9IG5ldyBUaGVtZUdyb3VwKCk7XG4gICAgcmV0LmRlc2NyaXB0aW9uID0gXCJDb21ib2JveGVzXCI7XG4gICAgcmV0Lml0ZW1zID0gW1xuICAgICAgLy8gVG9vbGJhciBDb2xvcnNcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdjb21ib2JveCcsICdCYWNrZ3JvdW5kJywgJy0tY29tYm9ib3gtYmFja2dyb3VuZC1jb2xvcicsICckY29tYm9ib3hfYmFja2dyb3VuZF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2NvbWJvYm94JywgJ0NvbG9yJywgJy0tY29tYm9ib3gtY29sb3InLCAnJGNvbWJvYm94X2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnY29tYm9ib3gnLCAnU2VsZWN0aW9uIEJhY2tncm91bmQnLCAnLS1jb21ib2JveC1zZWxlY3RlZC1pdGVtLWJhY2tncm91bmQtY29sb3InLCAnJGNvbWJvYm94X3NlbGVjdGVkX2l0ZW1fYmFja2dyb3VuZF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2NvbWJvYm94JywgJ1NlbGVjdGlvbiBDb2xvcicsICctLWNvbWJvYm94LXNlbGVjdGVkLWl0ZW0tY29sb3InLCAnJGNvbWJvYm94X3NlbGVjdGVkX2l0ZW1fY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdjb21ib2JveCcsICdCdXR0b24gQmFja2dyb3VuZCcsICctLWNvbWJvYm94LWJ1dHRvbi1iYWNrZ3JvdW5kLWNvbG9yJywgJyRjb21ib2JveF9idXR0b25fYmFja2dyb3VuZF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2NvbWJvYm94JywgJ0J1dHRvbiBDb2xvcicsICctLWNvbWJvYm94LWJ1dHRvbi1jb2xvcicsICckY29tYm9ib3hfYnV0dG9uX2NvbG9yJylcbiAgICBdO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUlucHV0R3JvdXAoKTogVGhlbWVHcm91cCB7XG4gICAgbGV0IHJldCA9IG5ldyBUaGVtZUdyb3VwKCk7XG4gICAgcmV0LmRlc2NyaXB0aW9uID0gXCJJbnB1dFwiO1xuICAgIHJldC5pdGVtcyA9IFtcbiAgICAgIC8vIFRvb2xiYXIgQ29sb3JzXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnaW5wdXQnLCAnQmFja2dyb3VuZCcsICctLWlucHV0LWJhY2tncm91bmQtY29sb3InLCAnJGlucHV0X2JhY2tncm91bmRfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdpbnB1dCcsICdDb2xvcicsICctLWlucHV0LWNvbG9yJywgJyRpbnB1dF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2lucHV0JywgJ1BsYWNlaG9sZGVyIENvbG9yJywgJy0taW5wdXQtcGxhY2Vob2xkZXItY29sb3InLCAnJGlucHV0X3BsYWNlaG9sZGVyX2NvbG9yJyksXG4gICAgICB0aGlzLmNyZWF0ZUNvbG9ySXRlbSgnaW5wdXQnLCAnQm9yZGVyIENvbG9yJywgJy0taW5wdXQtYm9yZGVyLWNvbG9yJywgJyRpbnB1dF9ib3JkZXJfY29sb3InKSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sb3JJdGVtKCdpbnB1dCcsICdGb2N1cyBCYWNrZ3JvdW5kJywgJy0taW5wdXQtZm9jdXMtYmFja2dyb3VuZC1jb2xvcicsICckaW5wdXRfZm9jdXNfYmFja2dyb3VuZF9jb2xvcicpLFxuICAgICAgdGhpcy5jcmVhdGVDb2xvckl0ZW0oJ2lucHV0JywgJ0ZvY3VzIENvbG9yJywgJy0taW5wdXQtZm9jdXMtY29sb3InLCAnJGlucHV0X2ZvY3VzX2NvbG9yJylcbiAgICBdO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuXG4gIHB1YmxpYyBleHBvcnRUaGVtZSgpOiBzdHJpbmcge1xuICAgIGxldCByZXRTdHIgPSBcIlwiO1xuICAgIGZvciAodmFyIGk9MDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoO2krKyl7XG4gICAgICBjb25zdCBncm91cEl0ZW0gOiBUaGVtZUdyb3VwID0gdGhpcy5pdGVtc1tpXSBhcyBUaGVtZUdyb3VwO1xuICAgICAgZm9yKHZhciBrPTA7azxncm91cEl0ZW0uaXRlbXMubGVuZ3RoO2srKyl7XG4gICAgICAgIGNvbnN0IGl0ZW06VGhlbWVDb2xvckl0ZW0gPSBncm91cEl0ZW0uaXRlbXNba10gYXMgVGhlbWVDb2xvckl0ZW07XG4gICAgICAgIHJldFN0ciArPSBcIlxcblwiICsgaXRlbS5zY3NzVmFyaWFibGVOYW1lICtcIjpcIiArIGl0ZW0udmFsdWUgKyBcIjtcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldFN0cjtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBjcmVhdGVDb2xvckl0ZW0obmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbjpzdHJpbmcsIGNzc1Byb3BlcnR5TmFtZTogc3RyaW5nLCBzY3NzVmFyaWFibGVOYW1lOnN0cmluZyk6IFRoZW1lQ29sb3JJdGVtIHtcbiAgICByZXR1cm4gbmV3IFRoZW1lQ29sb3JJdGVtKG5hbWUsIGRlc2NyaXB0aW9uLCBjc3NQcm9wZXJ0eU5hbWUsIHNjc3NWYXJpYWJsZU5hbWUsIHRoaXMudGhlbWVXcmFwcGVyLCB0aGlzLmxvZ2dlcik7XG4gIH1cblxufVxuXG5cbmltcG9ydCB7IEluamVjdCwgZGVzdHJveVBsYXRmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR1hMb2dnZXIgfSBmcm9tICd3ZWItY29uc29sZS1jb3JlJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuZXhwb3J0IGNsYXNzIFRoZW1lTW9kZWxCdWlsZGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9nZ2VyOiBOR1hMb2dnZXIsIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSl7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnSW5pdGlhbGl6aW5nIFRoZW1lIEJ1aWxkZXInICk7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZU1vZGVsKCk6IFRoZW1lTW9kZWwge1xuICAgICAgbGV0IG1vZGVsOiBUaGVtZU1vZGVsID0gbmV3IERlZmF1bHRUaGVtZU1vZGVsKHRoaXMubG9nZ2VyLCB0aGlzLmRvY3VtZW50KTtcbiAgICAgIC8vY29uc29sZS5sb2coXCJjcmVhdGVNb2RlbCA6XCIsIG1vZGVsKTtcbiAgICAgIHJldHVybiBtb2RlbDtcbiAgICB9XG5cblxufVxuIl19