UNPKG

dbweb-common

Version:

用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上

729 lines 62.1 kB
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
 */
import * as tslib_1 from "tslib";
import { EventEmitter, Injectable } from '@angular/core';
import { MatSnackBar } from '@angular/material';
import { CurrentService, ElementsService, ProjectService, BillOperate } from 'dbweb-core';
import { forkJoin, Subject } from 'rxjs';
import { map, tap } from 'rxjs/operators';
import { TabsService } from '../../home/tabs.service';
import { EleViewBackFaceService } from '../../services/eleview/eleview-backface';
import { map2WithLetter } from '../../services/eleview/mapletter';
import { OwnerByEnum } from '../../services/eleview/types/model';
import { ElementViewDigest } from '../model/element-columns-digest';
import { Order } from '../model/model';
import { DataType, Operates } from '../model/operate';
import { BackFaceService } from './backface';
import { combLabelColumnsItem, ServiceData, ConditionalTemplateRunner, defaultColumnsItem } from './data';
var EditView = /** @class */ (function () {
    function EditView(svr) {
        this.svr = svr;
        this.titleInput = true;
        this.isAdd = true;
        this.addOwnerBy = OwnerByEnum.ownerByUser; // 仅新增时用到
        this.modify = false; // current是否被修改过
        // current是否被修改过
        this.currentChange = new EventEmitter();
    }
    Object.defineProperty(EditView.prototype, "current", {
        get: /**
         * @return {?}
         */
        function () {
            return this._current;
        },
        set: /**
         * @param {?} val
         * @return {?}
         */
        function (val) {
            var _this = this;
            /** @type {?} */
            var process = (/**
             * @return {?}
             */
            function () {
                _this._current = val;
                _this.Readonly = !_this._current.canModify(_this.svr.current.data.UserName, _this.svr.current.data.Dept.Code);
                _this.currentChange.emit();
            });
            if (val === combLabelColumnsItem) {
                this.svr.backface.comboLabelsView().subscribe((/**
                 * @param {?} cols
                 * @return {?}
                 */
                function (cols) {
                    _this.SelectedColumns = cols.map((/**
                     * @param {?} col
                     * @return {?}
                     */
                    function (col) { return ({
                        Name: col,
                        Hidden: false,
                        Order: Order.OrderNone
                    }); }));
                }));
                process();
            }
            else {
                this.svr.backface.getViewColumns(val).subscribe((/**
                 * @param {?} cols
                 * @return {?}
                 */
                function (cols) {
                    _this.SelectedColumns = cols;
                    process();
                }));
            }
        },
        enumerable: true,
        configurable: true
    });
    /**
     * @return {?}
     */
    EditView.prototype.done = /**
     * @return {?}
     */
    function () {
        var _this = this;
        if (this.isAdd) {
            /** @type {?} */
            var view_1 = {
                Name: this.title,
                OwnerBy: this.addOwnerBy,
                Owner: this.addOwnerBy === OwnerByEnum.ownerByDept
                    ? this.svr.current.data.Dept.Code
                    : this.svr.current.data.UserName
            };
            return this.svr.backface.addView(view_1).pipe(map((/**
             * @return {?}
             */
            function () {
                /** @type {?} */
                var dView = ElementViewDigest.fromInterface(view_1);
                _this.svr.data.viewList.push(dView);
                _this.current = dView;
                _this.titleInput = false;
                return true;
            })));
        }
        else {
            return this.svr.backface
                .updateViewName({
                OldName: this.current.Name,
                Name: this.title,
                OwnerBy: this.current.OwnerBy,
                Owner: this.current.Owner
            })
                .pipe(map((/**
             * @param {?} v
             * @return {?}
             */
            function (v) {
                _this.current.Name = _this.title;
                _this.titleInput = false;
                return true;
            })));
        }
    };
    /**
     * @return {?}
     */
    EditView.prototype.remove = /**
     * @return {?}
     */
    function () {
        var _this = this;
        this.svr.backface.removeView(this.current).subscribe((/**
         * @return {?}
         */
        function () {
            /** @type {?} */
            var num = _this.svr.data.viewList.findIndex((/**
             * @param {?} v
             * @return {?}
             */
            function (v) { return v === _this.current; }));
            _this.svr.data.viewList.splice(num, 1);
            if (_this.svr.data.viewList.length > 0) {
                if (num < _this.svr.data.viewList.length) {
                    _this.current = _this.svr.data.viewList[num];
                }
                else {
                    _this.current = _this.svr.data.viewList[_this.svr.data.viewList.length - 1];
                }
            }
            else {
                _this.current = _this.svr.data.constViewItems[0];
            }
        }));
    };
    /**
     * @return {?}
     */
    EditView.prototype.add = /**
     * @return {?}
     */
    function () {
        this.title = '新的视图';
        this.isAdd = true;
        this.titleInput = true;
    };
    /**
     * @return {?}
     */
    EditView.prototype.edit = /**
     * @return {?}
     */
    function () {
        this.title = this._current.Name;
        this.isAdd = false;
        this.titleInput = true;
    };
    /**
     * @return {?}
     */
    EditView.prototype.cancel = /**
     * @return {?}
     */
    function () {
        this.titleInput = false;
        if (!this.current) {
            if (this.svr.data.viewList && this.svr.data.viewList.length > 0) {
                this.current = this.svr.data.viewList[0];
            }
            else {
                this.current = this.svr.data.constViewItems[0];
            }
        }
    };
    /**
     * @return {?}
     */
    EditView.prototype.save = /**
     * @return {?}
     */
    function () {
        var _this = this;
        return this.svr.backface
            .updateView({
            Name: this.current.Name,
            OwnerBy: this.current.OwnerBy,
            Owner: this.current.Owner,
            Columns: this.SelectedColumns
        })
            .pipe(tap((/**
         * @return {?}
         */
        function () {
            _this.modify = false;
        })));
    };
    return EditView;
}());
export { EditView };
if (false) {
    /** @type {?} */
    EditView.prototype.titleInput;
    /** @type {?} */
    EditView.prototype.isAdd;
    /** @type {?} */
    EditView.prototype.addOwnerBy;
    /** @type {?} */
    EditView.prototype.title;
    /**
     * @type {?}
     * @private
     */
    EditView.prototype._current;
    /** @type {?} */
    EditView.prototype.Readonly;
    /** @type {?} */
    EditView.prototype.SelectedColumns;
    /** @type {?} */
    EditView.prototype.modify;
    /** @type {?} */
    EditView.prototype.currentChange;
    /**
     * @type {?}
     * @private
     */
    EditView.prototype.svr;
}
/**
 * @record
 */
export function RefreshDataConfig() { }
if (false) {
    /** @type {?|undefined} */
    RefreshDataConfig.prototype.keepDivide;
    /** @type {?|undefined} */
    RefreshDataConfig.prototype.keepRowCount;
}
var ServiceService = /** @class */ (function () {
    function ServiceService(data, prj, backface, tabs, eles, current, eleview, snackBar, curr) {
        this.data = data;
        this.prj = prj;
        this.backface = backface;
        this.tabs = tabs;
        this.eles = eles;
        this.current = current;
        this.eleview = eleview;
        this.snackBar = snackBar;
        this.curr = curr;
        this.subscribe = [];
        this.editView = new EditView(this);
        this.paramsChange = new Subject(); // 参数发生变化,一般是初始化时一次,切换处理地一次
        // 参数发生变化,一般是初始化时一次,切换处理地一次
        // 标签定义界面的数据
        this.refreshDataEvent = new EventEmitter();
    }
    /**
     * @return {?}
     */
    ServiceService.prototype.ngOnDestroy = /**
     * @return {?}
     */
    function () {
        this.subscribe.forEach((/**
         * @param {?} v
         * @return {?}
         */
        function (v) { return v.unsubscribe(); }));
    };
    /**
     * @param {?} element
     * @param {?} title
     * @param {?} condition
     * @return {?}
     */
    ServiceService.prototype.initByCondition = /**
     * @param {?} element
     * @param {?} title
     * @param {?} condition
     * @return {?}
     */
    function (element, title, condition) {
        var _this = this;
        this.backface.eleName = element.Name;
        // 如果没有条件,则直接初始化
        if (!title && !condition) {
            this.init(element, this.prj.apiURL(element.Name));
        }
        else {
            this.backface
                .buildRecordViewURL({
                Title: title,
                Condition: condition
            })
                .subscribe((/**
             * @param {?} str
             * @return {?}
             */
            function (str) {
                _this.init(element, str);
            }));
        }
    };
    /**
     * @param {?} element
     * @param {?} url
     * @return {?}
     */
    ServiceService.prototype.init = /**
     * @param {?} element
     * @param {?} url
     * @return {?}
     */
    function (element, url) {
        var _this = this;
        this.element = element;
        this.backface.eleName = element.Name;
        this.backface.url = url;
        this.subscribe.push(this.curr.change$.subscribe((/**
         * @return {?}
         */
        function () {
            // tslint:disable-next-line: deprecation
            forkJoin(_this.backface.fetParamCache(), _this.eleview.fetchElementAllCategories(element.Name), _this.backface.fetchElementViewList(), _this.backface.fetchAllColumns()).subscribe((/**
             * @param {?} __0
             * @return {?}
             */
            function (_a) {
                var _b = tslib_1.__read(_a, 4), param = _b[0], categories = _b[1], columnsList = _b[2], allColumns = _b[3];
                if (param.Processes) {
                    // 注册相关的element,必须是第一时间注册,后面会引用到
                    param.Processes.forEach((/**
                     * @param {?} v
                     * @return {?}
                     */
                    function (v) {
                        _this.eles.addElement(tslib_1.__assign({}, v.Element, { NotMenu: true }));
                    }));
                    _this.data.rowProcesses = _this.withDefaultIconProcess(param.Processes.filter((/**
                     * @param {?} one
                     * @return {?}
                     */
                    function (one) { return one.BindRecord; })));
                    _this.data.toolbarProcesses = _this.withDefaultIconProcess(param.Processes.filter((/**
                     * @param {?} one
                     * @return {?}
                     */
                    function (one) { return !one.BindRecord; })));
                }
                else {
                    _this.data.rowProcesses = [];
                    _this.data.toolbarProcesses = [];
                }
                _this.data.uniqueFields = param.UniqueField;
                if (param.ConditionalTemplates) {
                    _this.data.conditionalTemplates = param.ConditionalTemplates.map((/**
                     * @param {?} v
                     * @return {?}
                     */
                    function (v) {
                        return ConditionalTemplateRunner.fromInterface(v);
                    }));
                }
                _this.data.categories = categories;
                _this.data.viewList = columnsList;
                _this.data.selectedView = defaultColumnsItem;
                _this.data.allColumns = allColumns;
                _this.data.allColumnNames = allColumns.map((/**
                 * @param {?} v
                 * @return {?}
                 */
                function (v) { return v.Name; }));
                _this.data.allColumnsWithLetter = map2WithLetter(_this.data.allColumnNames);
                _this.paramsChange.next();
                _this.refreshData().subscribe();
            }), (/**
             * @param {?} err
             * @return {?}
             */
            function (err) {
                console.log(err);
                if (err.error.Err.Message) {
                    _this.snackBar.open(err.error.Err.Message, '确定', { horizontalPosition: 'right' });
                }
            }));
        })));
    };
    /**
     * @param {?} process
     * @return {?}
     */
    ServiceService.prototype.withDefaultIconProcess = /**
     * @param {?} process
     * @return {?}
     */
    function (process) {
        var _this = this;
        return process.map((/**
         * @param {?} pro
         * @return {?}
         */
        function (pro) {
            /** @type {?} */
            var rev = pro;
            if (!pro.Icon) {
                /** @type {?} */
                var ele = _this.eles.get(pro.ElementName);
                if (ele.Bill) {
                    switch (pro.Element.BillOperate) {
                        case BillOperate.Add:
                            rev.Icon = 'add';
                            break;
                        case BillOperate.Edit:
                            rev.Icon = 'outlined:create';
                            break;
                        case BillOperate.Browse:
                            rev.Icon = 'outlined:visibility';
                            break;
                        case BillOperate.Delete:
                            rev.Icon = 'outlined:delete';
                            rev.Color = 'warn';
                            break;
                    }
                }
                else {
                    rev.Icon = '';
                }
            }
            return rev;
        }));
    };
    /**
     * @return {?}
     */
    ServiceService.prototype.refreshRowCount = /**
     * @return {?}
     */
    function () {
        var _this = this;
        this.data.fetchParam.View = this.data.selectedView;
        this.data.fetchParam.Labels = this.data.selectedLabels;
        this.data.fetchParam.SelKeys = this.data.tableRowSelection.selected;
        this.data.refreshRowCountProgress = true;
        if (this.data.conditionalTemplates) {
            this.data.fetchParam.ConditionalTemplate = this.data.conditionalTemplates
                .filter((/**
             * @param {?} v
             * @return {?}
             */
            function (v) { return v.enable; }))
                .map((/**
             * @param {?} v
             * @return {?}
             */
            function (v) { return v.Data; }));
        }
        return this.backface.fetchRowCount(this.data.fetchParam).pipe(map((/**
         * @param {?} v
         * @return {?}
         */
        function (v) {
            _this.data.rowCount = v.RowCount;
            _this.data.refreshRowCountProgress = false;
            return true;
        })));
    };
    // seek 指明是不是没有动过条件,仅仅翻页
    // seek 指明是不是没有动过条件,仅仅翻页
    /**
     * @param {?=} config
     * @return {?}
     */
    ServiceService.prototype.refreshData = 
    // seek 指明是不是没有动过条件,仅仅翻页
    /**
     * @param {?=} config
     * @return {?}
     */
    function (config) {
        var _this = this;
        if (config && config.keepDivide) {
            this.data.prevFetchDivide = this.data.fetchParam.Divide;
            this.data.prevFetchRowNum = this.data.fetchParam.DivideRowNum;
        }
        else {
            this.data.prevFetchDivide = undefined;
            this.data.prevFetchRowNum = undefined;
            this.data.fetchParam.Divide = undefined;
            this.data.fetchParam.DivideRowNum = undefined;
            this.data.upDivide = undefined;
            this.data.upRowNum = undefined;
        }
        this.data.fetchParam.View = this.data.selectedView;
        this.data.fetchParam.Labels = this.data.selectedLabels;
        this.data.fetchParam.SelKeys = this.data.tableRowSelection.selected;
        this.data.refreshDataProgress = true;
        if (this.data.conditionalTemplates) {
            this.data.fetchParam.ConditionalTemplate = this.data.conditionalTemplates
                .filter((/**
             * @param {?} v
             * @return {?}
             */
            function (v) { return v.enable; }))
                .map((/**
             * @param {?} v
             * @return {?}
             */
            function (v) { return v.Data; }));
        }
        return this.backface.fetchData(this.data.fetchParam).pipe(map((/**
         * @param {?} v
         * @return {?}
         */
        function (v) {
            if (v.Error) {
                _this.snackBar.open(v.Error, '确定', { duration: 5000 });
                _this.data.refreshDataProgress = false;
                return { ok: false, error: v.Error };
            }
            // console.log('=======:', v.FData);
            _this.data.tableData = v.FData;
            _this.data.timeConsuming = v.TimeConsuming;
            _this.data.nextPageDisable =
                (v.FData.RowCount === 0 && v.FData.Rows.length === 0) || v.FData.RowCount > 0;
            _this.data.prevPageDisable =
                (v.FData.RowCount === 0 && v.FData.Rows.length === 0) || v.FData.Rows[0].RowNum === 1;
            _this.registerURLS();
            if (v.FData.RowCount >= 0) {
                _this.data.rowCount = v.FData.RowCount;
            }
            else {
                if (!config || !config.keepRowCount) {
                    _this.data.rowCount = -1; // 放这里可以防止界面无必要刷新
                }
            }
            // 如果后端返回title,则说明是需要动态改变title值
            if (v.FData.Title) {
                _this.tabs.active.titleObservable.next(v.FData.Title);
            }
            _this.refreshDataEvent.emit(config);
            _this.data.refreshDataProgress = false;
            return { ok: true };
        })));
    };
    // 注册相关的url的签名
    // 注册相关的url的签名
    /**
     * @return {?}
     */
    ServiceService.prototype.registerURLS = 
    // 注册相关的url的签名
    /**
     * @return {?}
     */
    function () {
        var _this = this;
        Object.keys(this.data.tableData.Processes).forEach((/**
         * @param {?} v
         * @return {?}
         */
        function (v) {
            _this.eles.setURLSign(_this.data.tableData.Processes[v].URL, _this.data.tableData.Processes[v].Sign);
        }));
        this.data.tableData.Rows.forEach((/**
         * @param {?} row
         * @return {?}
         */
        function (row) {
            Object.keys(row.Processes).forEach((/**
             * @param {?} v
             * @return {?}
             */
            function (v) {
                _this.eles.setURLSign(row.Processes[v].URL, row.Processes[v].Sign);
            }));
        }));
    };
    // 获取指定列允许使用的运算符
    // 获取指定列允许使用的运算符
    /**
     * @private
     * @param {?} col
     * @return {?}
     */
    ServiceService.prototype.getOperates = 
    // 获取指定列允许使用的运算符
    /**
     * @private
     * @param {?} col
     * @return {?}
     */
    function (col) {
        if (!col) {
            return [];
        }
        /** @type {?} */
        var colType = DataType[this.data.tableData.Columns.find((/**
         * @param {?} c
         * @return {?}
         */
        function (c) { return c.Name === col; })).Type];
        return tslib_1.__spread([
            (/** @type {?} */ ({
                Name: '',
                Label: '(无)'
            }))
        ], Operates.filter((/**
         * @param {?} v
         * @return {?}
         */
        function (v) { return v.AllowTypes.includes(colType); })));
    };
    /**
     * @param {?} colName
     * @return {?}
     */
    ServiceService.prototype.onColumnChange = /**
     * @param {?} colName
     * @return {?}
     */
    function (colName) {
        var _this = this;
        this.data.Operates = this.getOperates(colName);
        // 如果之前的运算符已经不在列表中,则默认为 无
        if (this.data.fetchParam.Opt && !this.data.Operates.find((/**
         * @param {?} v
         * @return {?}
         */
        function (v) { return v.Name === _this.data.fetchParam.Opt; }))) {
            this.data.fetchParam.Opt = null;
        }
    };
    ServiceService.decorators = [
        { type: Injectable }
    ];
    /** @nocollapse */
    ServiceService.ctorParameters = function () { return [
        { type: ServiceData },
        { type: ProjectService },
        { type: BackFaceService },
        { type: TabsService },
        { type: ElementsService },
        { type: CurrentService },
        { type: EleViewBackFaceService },
        { type: MatSnackBar },
        { type: CurrentService }
    ]; };
    return ServiceService;
}());
export { ServiceService };
if (false) {
    /**
     * @type {?}
     * @private
     */
    ServiceService.prototype.subscribe;
    /** @type {?} */
    ServiceService.prototype.element;
    /** @type {?} */
    ServiceService.prototype.editView;
    /** @type {?} */
    ServiceService.prototype.paramsChange;
    /** @type {?} */
    ServiceService.prototype.refreshDataEvent;
    /** @type {?} */
    ServiceService.prototype.data;
    /**
     * @type {?}
     * @private
     */
    ServiceService.prototype.prj;
    /** @type {?} */
    ServiceService.prototype.backface;
    /**
     * @type {?}
     * @private
     */
    ServiceService.prototype.tabs;
    /**
     * @type {?}
     * @private
     */
    ServiceService.prototype.eles;
    /** @type {?} */
    ServiceService.prototype.current;
    /**
     * @type {?}
     * @private
     */
    ServiceService.prototype.eleview;
    /**
     * @type {?}
     * @private
     */
    ServiceService.prototype.snackBar;
    /**
     * @type {?}
     * @private
     */
    ServiceService.prototype.curr;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGJ3ZWItY29tbW9uLyIsInNvdXJjZXMiOlsibGliL3JlY29yZC12aWV3L3NlcnZpY2Uvc2VydmljZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxjQUFjLEVBQVcsZUFBZSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbkcsT0FBTyxFQUFFLFFBQVEsRUFBZ0IsT0FBTyxFQUFNLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDcEUsT0FBTyxFQUFrQixLQUFLLEVBQXNCLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFFBQVEsRUFBVyxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFHMUc7SUFtQ0Msa0JBQW9CLEdBQW1CO1FBQW5CLFFBQUcs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QUFjO2dCQUlkLHNCQUFzQjtnQkFMdEIsV0FBVztnQkFDWCxjQUFjOztJQW1YdkIscUJBQUM7Q0FBQSxBQXBPRCxJQW9PQztTQW5PWSxjQUFjOzs7Ozs7SUFDMUIsbUNBQXVDOztJQUN2QyxpQ0FBaUI7O0lBQ2pCLGtDQUE4Qjs7SUFDOUIsc0NBQTZCOztJQUU3QiwwQ0FBeUQ7O0lBRXhELDhCQUF3Qjs7Ozs7SUFDeEIsNkJBQTJCOztJQUMzQixrQ0FBZ0M7Ozs7O0lBQ2hDLDhCQUF5Qjs7Ozs7SUFDekIsOEJBQTZCOztJQUM3QixpQ0FBOEI7Ozs7O0lBQzlCLGlDQUF1Qzs7Ozs7SUFDdkMsa0NBQTZCOzs7OztJQUM3Qiw4QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcclxuaW1wb3J0IHsgQ3VycmVudFNlcnZpY2UsIEVsZW1lbnQsIEVsZW1lbnRzU2VydmljZSwgUHJvamVjdFNlcnZpY2UsIEJpbGxPcGVyYXRlIH0gZnJvbSAnZGJ3ZWItY29yZSc7XHJcbmltcG9ydCB7IGZvcmtKb2luLCBTdWJzY3JpcHRpb24sIFN1YmplY3QsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCwgdGFwLCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBUYWJzU2VydmljZSB9IGZyb20gJy4uLy4uL2hvbWUvdGFicy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRWxlVmlld0JhY2tGYWNlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VsZXZpZXcvZWxldmlldy1iYWNrZmFjZSc7XHJcbmltcG9ydCB7IG1hcDJXaXRoTGV0dGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZWxldmlldy9tYXBsZXR0ZXInO1xyXG5pbXBvcnQgeyBPd25lckJ5RW51bSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VsZXZpZXcvdHlwZXMvbW9kZWwnO1xyXG5pbXBvcnQgeyBFbGVtZW50Vmlld0RpZ2VzdCB9IGZyb20gJy4uL21vZGVsL2VsZW1lbnQtY29sdW1ucy1kaWdlc3QnO1xyXG5pbXBvcnQgeyBJRGlzcGxheUNvbHVtbiwgT3JkZXIsIElSZWNvcmRWaWV3UHJvY2VzcyB9IGZyb20gJy4uL21vZGVsL21vZGVsJztcclxuaW1wb3J0IHsgRGF0YVR5cGUsIE9wZXJhdGUsIE9wZXJhdGVzIH0gZnJvbSAnLi4vbW9kZWwvb3BlcmF0ZSc7XHJcbmltcG9ydCB7IEJhY2tGYWNlU2VydmljZSB9IGZyb20gJy4vYmFja2ZhY2UnO1xyXG5pbXBvcnQgeyBjb21iTGFiZWxDb2x1bW5zSXRlbSwgU2VydmljZURhdGEsIENvbmRpdGlvbmFsVGVtcGxhdGVSdW5uZXIsIGRlZmF1bHRDb2x1bW5zSXRlbSB9IGZyb20gJy4vZGF0YSc7XHJcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEVkaXRWaWV3IHtcclxuXHR0aXRsZUlucHV0ID0gdHJ1ZTtcclxuXHRpc0FkZCA9IHRydWU7XHJcblx0YWRkT3duZXJCeSA9IE93bmVyQnlFbnVtLm93bmVyQnlVc2VyOyAvLyDku4XmlrDlop7ml7bnlKjliLBcclxuXHR0aXRsZT86IHN0cmluZztcclxuXHRwcml2YXRlIF9jdXJyZW50PzogRWxlbWVudFZpZXdEaWdlc3Q7XHJcblx0UmVhZG9ubHk/OiBib29sZWFuO1xyXG5cdFNlbGVjdGVkQ29sdW1ucz86IElEaXNwbGF5Q29sdW1uW107XHJcblx0bW9kaWZ5ID0gZmFsc2U7IC8vIGN1cnJlbnTmmK/lkKbooqvkv67mlLnov4dcclxuXHRjdXJyZW50Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cdGdldCBjdXJyZW50KCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX2N1cnJlbnQ7XHJcblx0fVxyXG5cdHNldCBjdXJyZW50KHZhbDogRWxlbWVudFZpZXdEaWdlc3QpIHtcclxuXHRcdGNvbnN0IHByb2Nlc3MgPSAoKSA9PiB7XHJcblx0XHRcdHRoaXMuX2N1cnJlbnQgPSB2YWw7XHJcblx0XHRcdHRoaXMuUmVhZG9ubHkgPSAhdGhpcy5fY3VycmVudC5jYW5Nb2RpZnkodGhpcy5zdnIuY3VycmVudC5kYXRhLlVzZXJOYW1lLCB0aGlzLnN2ci5jdXJyZW50LmRhdGEuRGVwdC5Db2RlKTtcclxuXHRcdFx0dGhpcy5jdXJyZW50Q2hhbmdlLmVtaXQoKTtcclxuXHRcdH07XHJcblx0XHRpZiAodmFsID09PSBjb21iTGFiZWxDb2x1bW5zSXRlbSkge1xyXG5cdFx0XHR0aGlzLnN2ci5iYWNrZmFjZS5jb21ib0xhYmVsc1ZpZXcoKS5zdWJzY3JpYmUoY29scyA9PiB7XHJcblx0XHRcdFx0dGhpcy5TZWxlY3RlZENvbHVtbnMgPSBjb2xzLm1hcDxJRGlzcGxheUNvbHVtbj4oY29sID0+ICh7XHJcblx0XHRcdFx0XHROYW1lOiBjb2wsXHJcblx0XHRcdFx0XHRIaWRkZW46IGZhbHNlLFxyXG5cdFx0XHRcdFx0T3JkZXI6IE9yZGVyLk9yZGVyTm9uZVxyXG5cdFx0XHRcdH0pKTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHByb2Nlc3MoKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuc3ZyLmJhY2tmYWNlLmdldFZpZXdDb2x1bW5zKHZhbCkuc3Vic2NyaWJlKGNvbHMgPT4ge1xyXG5cdFx0XHRcdHRoaXMuU2VsZWN0ZWRDb2x1bW5zID0gY29scztcclxuXHRcdFx0XHRwcm9jZXNzKCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIHN2cjogU2VydmljZVNlcnZpY2UpIHt9XHJcblxyXG5cdGRvbmUoKSB7XHJcblx0XHRpZiAodGhpcy5pc0FkZCkge1xyXG5cdFx0XHRjb25zdCB2aWV3ID0ge1xyXG5cdFx0XHRcdE5hbWU6IHRoaXMudGl0bGUsXHJcblx0XHRcdFx0T3duZXJCeTogdGhpcy5hZGRPd25lckJ5LFxyXG5cdFx0XHRcdE93bmVyOlxyXG5cdFx0XHRcdFx0dGhpcy5hZGRPd25lckJ5ID09PSBPd25lckJ5RW51bS5vd25lckJ5RGVwdFxyXG5cdFx0XHRcdFx0XHQ/IHRoaXMuc3ZyLmN1cnJlbnQuZGF0YS5EZXB0LkNvZGVcclxuXHRcdFx0XHRcdFx0OiB0aGlzLnN2ci5jdXJyZW50LmRhdGEuVXNlck5hbWVcclxuXHRcdFx0fTtcclxuXHRcdFx0cmV0dXJuIHRoaXMuc3ZyLmJhY2tmYWNlLmFkZFZpZXcodmlldykucGlwZShcclxuXHRcdFx0XHRtYXAoKCkgPT4ge1xyXG5cdFx0XHRcdFx0Y29uc3QgZFZpZXcgPSBFbGVtZW50Vmlld0RpZ2VzdC5mcm9tSW50ZXJmYWNlKHZpZXcpO1xyXG5cdFx0XHRcdFx0dGhpcy5zdnIuZGF0YS52aWV3TGlzdC5wdXNoKGRWaWV3KTtcclxuXHRcdFx0XHRcdHRoaXMuY3VycmVudCA9IGRWaWV3O1xyXG5cdFx0XHRcdFx0dGhpcy50aXRsZUlucHV0ID0gZmFsc2U7XHJcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuc3ZyLmJhY2tmYWNlXHJcblx0XHRcdFx0LnVwZGF0ZVZpZXdOYW1lKHtcclxuXHRcdFx0XHRcdE9sZE5hbWU6IHRoaXMuY3VycmVudC5OYW1lLFxyXG5cdFx0XHRcdFx0TmFtZTogdGhpcy50aXRsZSxcclxuXHRcdFx0XHRcdE93bmVyQnk6IHRoaXMuY3VycmVudC5Pd25lckJ5LFxyXG5cdFx0XHRcdFx0T3duZXI6IHRoaXMuY3VycmVudC5Pd25lclxyXG5cdFx0XHRcdH0pXHJcblx0XHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0XHRtYXAodiA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMuY3VycmVudC5OYW1lID0gdGhpcy50aXRsZTtcclxuXHRcdFx0XHRcdFx0dGhpcy50aXRsZUlucHV0ID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0fSlcclxuXHRcdFx0XHQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZW1vdmUoKSB7XHJcblx0XHR0aGlzLnN2ci5iYWNrZmFjZS5yZW1vdmVWaWV3KHRoaXMuY3VycmVudCkuc3Vic2NyaWJlKCgpID0+IHtcclxuXHRcdFx0Y29uc3QgbnVtID0gdGhpcy5zdnIuZGF0YS52aWV3TGlzdC5maW5kSW5kZXgodiA9PiB2ID09PSB0aGlzLmN1cnJlbnQpO1xyXG5cdFx0XHR0aGlzLnN2ci5kYXRhLnZpZXdMaXN0LnNwbGljZShudW0sIDEpO1xyXG5cdFx0XHRpZiAodGhpcy5zdnIuZGF0YS52aWV3TGlzdC5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0aWYgKG51bSA8IHRoaXMuc3ZyLmRhdGEudmlld0xpc3QubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHR0aGlzLmN1cnJlbnQgPSB0aGlzLnN2ci5kYXRhLnZpZXdMaXN0W251bV07XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRoaXMuY3VycmVudCA9IHRoaXMuc3ZyLmRhdGEudmlld0xpc3RbdGhpcy5zdnIuZGF0YS52aWV3TGlzdC5sZW5ndGggLSAxXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50ID0gdGhpcy5zdnIuZGF0YS5jb25zdFZpZXdJdGVtc1swXTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cdGFkZCgpIHtcclxuXHRcdHRoaXMudGl0bGUgPSAn5paw55qE6KeG5Zu+JztcclxuXHRcdHRoaXMuaXNBZGQgPSB0cnVlO1xyXG5cdFx0dGhpcy50aXRsZUlucHV0ID0gdHJ1ZTtcclxuXHR9XHJcblx0ZWRpdCgpIHtcclxuXHRcdHRoaXMudGl0bGUgPSB0aGlzLl9jdXJyZW50Lk5hbWU7XHJcblx0XHR0aGlzLmlzQWRkID0gZmFsc2U7XHJcblx0XHR0aGlzLnRpdGxlSW5wdXQgPSB0cnVlO1xyXG5cdH1cclxuXHRjYW5jZWwoKSB7XHJcblx0XHR0aGlzLnRpdGxlSW5wdXQgPSBmYWxzZTtcclxuXHRcdGlmICghdGhpcy5jdXJyZW50KSB7XHJcblx0XHRcdGlmICh0aGlzLnN2ci5kYXRhLnZpZXdMaXN0ICYmIHRoaXMuc3ZyLmRhdGEudmlld0xpc3QubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdHRoaXMuY3VycmVudCA9IHRoaXMuc3ZyLmRhdGEudmlld0xpc3RbMF07XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50ID0gdGhpcy5zdnIuZGF0YS5jb25zdFZpZXdJdGVtc1swXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRzYXZlKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuc3ZyLmJhY2tmYWNlXHJcblx0XHRcdC51cGRhdGVWaWV3KHtcclxuXHRcdFx0XHROYW1lOiB0aGlzLmN1cnJlbnQuTmFtZSxcclxuXHRcdFx0XHRPd25lckJ5OiB0aGlzLmN1cnJlbnQuT3duZXJCeSxcclxuXHRcdFx0XHRPd25lcjogdGhpcy5jdXJyZW50Lk93bmVyLFxyXG5cdFx0XHRcdENvbHVtbnM6IHRoaXMuU2VsZWN0ZWRDb2x1bW5zXHJcblx0XHRcdH0pXHJcblx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdHRhcCgoKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLm1vZGlmeSA9IGZhbHNlO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlZnJlc2hEYXRhQ29uZmlnIHtcclxuXHRrZWVwRGl2aWRlPzogYm9vbGVhbjtcclxuXHRrZWVwUm93Q291bnQ/OiBib29sZWFuO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTZXJ2aWNlU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblx0cHJpdmF0ZSBzdWJzY3JpYmU6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblx0ZWxlbWVudDogRWxlbWVudDtcclxuXHRlZGl0VmlldyA9IG5ldyBFZGl0Vmlldyh0aGlzKTtcclxuXHRwYXJhbXNDaGFuZ2UgPSBuZXcgU3ViamVjdCgpOyAvLyDlj4LmlbDlj5HnlJ/lj5jljJbvvIzkuIDoiKzmmK/liJ3lp4vljJbml7bkuIDmrKHvvIzliIfmjaLlpITnkIblnLDkuIDmrKFcclxuXHQvLyDmoIfnrb7lrprkuYnnlYzpnaLnmoTmlbDmja5cclxuXHRyZWZyZXNoRGF0YUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWZyZXNoRGF0YUNvbmZpZz4oKTtcclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHB1YmxpYyBkYXRhOiBTZXJ2aWNlRGF0YSxcclxuXHRcdHByaXZhdGUgcHJqOiBQcm9qZWN0U2VydmljZSxcclxuXHRcdHB1YmxpYyBiYWNrZmFjZTogQmFja0ZhY2VTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSB0YWJzOiBUYWJzU2VydmljZSxcclxuXHRcdHByaXZhdGUgZWxlczogRWxlbWVudHNTZXJ2aWNlLFxyXG5cdFx0cHVibGljIGN1cnJlbnQ6IEN1cnJlbnRTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBlbGV2aWV3OiBFbGVWaWV3QmFja0ZhY2VTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsXHJcblx0XHRwcml2YXRlIGN1cnI6IEN1cnJlbnRTZXJ2aWNlXHJcblx0KSB7fVxyXG5cdG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zdWJzY3JpYmUuZm9yRWFjaCh2ID0+IHYudW5zdWJzY3JpYmUoKSk7XHJcblx0fVxyXG5cdGluaXRCeUNvbmRpdGlvbihlbGVtZW50OiBFbGVtZW50LCB0aXRsZTogc3RyaW5nLCBjb25kaXRpb246IHN0cmluZykge1xyXG5cdFx0dGhpcy5iYWNrZmFjZS5lbGVOYW1lID0gZWxlbWVudC5OYW1lO1xyXG5cdFx0Ly8g5aaC5p6c5rKh5pyJ5p2h5Lu277yM5YiZ55u05o6l5Yid5aeL5YyWXHJcblx0XHRpZiAoIXRpdGxlICYmICFjb25kaXRpb24pIHtcclxuXHRcdFx0dGhpcy5pbml0KGVsZW1lbnQsIHRoaXMucHJqLmFwaVVSTChlbGVtZW50Lk5hbWUpKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuYmFja2ZhY2VcclxuXHRcdFx0XHQuYnVpbGRSZWNvcmRWaWV3VVJMKHtcclxuXHRcdFx0XHRcdFRpdGxlOiB0aXRsZSxcclxuXHRcdFx0XHRcdENvbmRpdGlvbjogY29uZGl0aW9uXHJcblx0XHRcdFx0fSlcclxuXHRcdFx0XHQuc3Vic2NyaWJlKHN0ciA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLmluaXQoZWxlbWVudCwgc3RyKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcblx0aW5pdChlbGVtZW50OiBFbGVtZW50LCB1cmw6IHN0cmluZykge1xyXG5cdFx0dGhpcy5lbGVtZW50ID0gZWxlbWVudDtcclxuXHRcdHRoaXMuYmFja2ZhY2UuZWxlTmFtZSA9IGVsZW1lbnQuTmFtZTtcclxuXHRcdHRoaXMuYmFja2ZhY2UudXJsID0gdXJsO1xyXG5cdFx0dGhpcy5zdWJzY3JpYmUucHVzaChcclxuXHRcdFx0dGhpcy5jdXJyLmNoYW5nZSQuc3Vic2NyaWJlKCgpID0+IHtcclxuXHRcdFx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGRlcHJlY2F0aW9uXHJcblx0XHRcdFx0Zm9ya0pvaW4oXHJcblx0XHRcdFx0XHR0aGlzLmJhY2tmYWNlLmZldFBhcmFtQ2FjaGUoKSxcclxuXHRcdFx0XHRcdHRoaXMuZWxldmlldy5mZXRjaEVsZW1lbnRBbGxDYXRlZ29yaWVzKGVsZW1lbnQuTmFtZSksXHJcblx0XHRcdFx0XHR0aGlzLmJhY2tmYWNlLmZldGNoRWxlbWVudFZpZXdMaXN0KCksXHJcblx0XHRcdFx0XHR0aGlzLmJhY2tmYWNlLmZldGNoQWxsQ29sdW1ucygpXHJcblx0XHRcdFx0KS5zdWJzY3JpYmUoXHJcblx0XHRcdFx0XHQoW3BhcmFtLCBjYXRlZ29yaWVzLCBjb2x1bW5zTGlzdCwgYWxsQ29sdW1uc10pID0+IHtcclxuXHRcdFx0XHRcdFx0aWYgKHBhcmFtLlByb2Nlc3Nlcykge1xyXG5cdFx0XHRcdFx0XHRcdC8vIOazqOWGjOebuOWFs+eahGVsZW1lbnQs5b+F6aG75piv56ys5LiA5pe26Ze05rOo5YaM77yM5ZCO6Z2i5Lya5byV55So5YiwXHJcblx0XHRcdFx0XHRcdFx0cGFyYW0uUHJvY2Vzc2VzLmZvckVhY2godiA9PiB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmVsZXMuYWRkRWxlbWVudCh7IC4uLnYuRWxlbWVudCwgTm90TWVudTogdHJ1ZSB9KTtcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmRhdGEucm93UHJvY2Vzc2VzID0gdGhpcy53aXRoRGVmYXVsdEljb25Qcm9jZXNzKFxyXG5cdFx0XHRcdFx0XHRcdFx0cGFyYW0uUHJvY2Vzc2VzLmZpbHRlcihvbmUgPT4gb25lLkJpbmRSZWNvcmQpXHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmRhdGEudG9vbGJhclByb2Nlc3NlcyA9IHRoaXMud2l0aERlZmF1bHRJY29uUHJvY2VzcyhcclxuXHRcdFx0XHRcdFx0XHRcdHBhcmFtLlByb2Nlc3Nlcy5maWx0ZXIob25lID0+ICFvbmUuQmluZFJlY29yZClcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGF0YS5yb3dQcm9jZXNzZXMgPSBbXTtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmRhdGEudG9vbGJhclByb2Nlc3NlcyA9IFtdO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdHRoaXMuZGF0YS51bmlxdWVGaWVsZHMgPSBwYXJhbS5VbmlxdWVGaWVsZDtcclxuXHRcdFx0XHRcdFx0aWYgKHBhcmFtLkNvbmRpdGlvbmFsVGVtcGxhdGVzKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5kYXRhLmNvbmRpdGlvbmFsVGVtcGxhdGVzID0gcGFyYW0uQ29uZGl0aW9uYWxUZW1wbGF0ZXMubWFwKHYgPT5cclxuXHRcdFx0XHRcdFx0XHRcdENvbmRpdGlvbmFsVGVtcGxhdGVSdW5uZXIuZnJvbUludGVyZmFjZSh2KVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHRoaXMuZGF0YS5jYXRlZ29yaWVzID0gY2F0ZWdvcmllcztcclxuXHRcdFx0XHRcdFx0dGhpcy5kYXRhLnZpZXdMaXN0ID0gY29sdW1uc0xpc3Q7XHJcblx0XHRcdFx0XHRcdHRoaXMuZGF0YS5zZWxlY3RlZFZpZXcgPSBkZWZhdWx0Q29sdW1uc0l0ZW07XHJcblx0XHRcdFx0XHRcdHRoaXMuZGF0YS5hbGxDb2x1bW5zID0gYWxsQ29sdW1ucztcclxuXHRcdFx0XHRcdFx0dGhpcy5kYXRhLmFsbENvbHVtbk5hbWVzID0gYWxsQ29sdW1ucy5tYXAodiA9PiB2Lk5hbWUpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLmRhdGEuYWxsQ29sdW1uc1dpdGhMZXR0ZXIgPSBtYXAyV2l0aExldHRlcih0aGlzLmRhdGEuYWxsQ29sdW1uTmFtZXMpO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnBhcmFtc0NoYW5nZS5uZXh0KCk7XHJcblx0XHRcdFx0XHRcdHRoaXMucmVmcmVzaERhdGEoKS5zdWJzY3JpYmUoKTtcclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHQoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhlcnIpO1xyXG5cdFx0XHRcdFx0XHRpZiAoZXJyLmVycm9yLkVyci5NZXNzYWdlKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5zbmFja0Jhci5vcGVuKGVyci5lcnJvci5FcnIuTWVzc2FnZSwgJ+ehruWumicsIHsgaG9yaXpvbnRhbFBvc2l0aW9uOiAncmlnaHQnIH0pO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblx0fVxyXG5cdHdpdGhEZWZhdWx0SWNvblByb2Nlc3MocHJvY2VzczogSVJlY29yZFZpZXdQcm9jZXNzW10pIHtcclxuXHRcdHJldHVybiBwcm9jZXNzLm1hcChwcm8gPT4ge1xyXG5cdFx0XHRjb25zdCByZXYgPSBwcm87XHJcblx0XHRcdGlmICghcHJvLkljb24pIHtcclxuXHRcdFx0XHRjb25zdCBlbGUgPSB0aGlzLmVsZXMuZ2V0KHByby5FbGVtZW50TmFtZSk7XHJcblx0XHRcdFx0aWYgKGVsZS5CaWxsKSB7XHJcblx0XHRcdFx0XHRzd2l0Y2ggKHByby5FbGVtZW50LkJpbGxPcGVyYXRlKSB7XHJcblx0XHRcdFx0XHRcdGNhc2UgQmlsbE9wZXJhdGUuQWRkOlxyXG5cdFx0XHRcdFx0XHRcdHJldi5JY29uID0gJ2FkZCc7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdGNhc2UgQmlsbE9wZXJhdGUuRWRpdDpcclxuXHRcdFx0XHRcdFx0XHRyZXYuSWNvbiA9ICdvdXRsaW5lZDpjcmVhdGUnO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRjYXNlIEJpbGxPcGVyYXRlLkJyb3dzZTpcclxuXHRcdFx0XHRcdFx0XHRyZXYuSWNvbiA9ICdvdXRsaW5lZDp2aXNpYmlsaXR5JztcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0Y2FzZSBCaWxsT3BlcmF0ZS5EZWxldGU6XHJcblx0XHRcdFx0XHRcdFx0cmV2Lkljb24gPSAnb3V0bGluZWQ6ZGVsZXRlJztcclxuXHRcdFx0XHRcdFx0XHRyZXYuQ29sb3IgPSAnd2Fybic7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJldi5JY29uID0gJyc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiByZXY7XHJcblx0XHR9KTtcclxuXHR9XHJcblx0cmVmcmVzaFJvd0NvdW50KCkge1xyXG5cdFx0dGhpcy5kYXRhLmZldGNoUGFyYW0uVmlldyA9IHRoaXMuZGF0YS5zZWxlY3RlZFZpZXc7XHJcblx0XHR0aGlzLmRhdGEuZmV0Y2hQYXJhbS5MYWJlbHMgPSB0aGlzLmRhdGEuc2VsZWN0ZWRMYWJlbHM7XHJcblx0XHR0aGlzLmRhdGEuZmV0Y2hQYXJhbS5TZWxLZXlzID0gdGhpcy5kYXRhLnRhYmxlUm93U2VsZWN0aW9uLnNlbGVjdGVkO1xyXG5cdFx0dGhpcy5kYXRhLnJlZnJlc2hSb3dDb3VudFByb2dyZXNzID0gdHJ1ZTtcclxuXHRcdGlmICh0aGlzLmRhdGEuY29uZGl0aW9uYWxUZW1wbGF0ZXMpIHtcclxuXHRcdFx0dGhpcy5kYXRhLmZldGNoUGFyYW0uQ29uZGl0aW9uYWxUZW1wbGF0ZSA9IHRoaXMuZGF0YS5jb25kaXRpb25hbFRlbXBsYXRlc1xyXG5cdFx0XHRcdC5maWx0ZXIodiA9PiB2LmVuYWJsZSlcclxuXHRcdFx0XHQubWFwKHYgPT4gdi5EYXRhKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzLmJhY2tmYWNlLmZldGNoUm93Q291bnQodGhpcy5kYXRhLmZldGNoUGFyYW0pLnBpcGUoXHJcblx0XHRcdG1hcCh2ID0+IHtcclxuXHRcdFx0XHR0aGlzLmRhdGEucm93Q291bnQgPSB2LlJvd0NvdW50O1xyXG5cdFx0XHRcdHRoaXMuZGF0YS5yZWZyZXNoUm93Q291bnRQcm9ncmVzcyA9IGZhbHNlO1xyXG5cdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHR9XHJcblx0Ly8gc2VlayDmjIfmmI7mmK/kuI3mmK/msqHmnInliqjov4fmnaHku7bvvIzku4Xku4Xnv7vpobVcclxuXHRyZWZyZXNoRGF0YShjb25maWc/OiBSZWZyZXNoRGF0YUNvbmZpZykge1xyXG5cdFx0aWYgKGNvbmZpZyAmJiBjb25maWcua2VlcERpdmlkZSkge1xyXG5cdFx0XHR0aGlzLmRhdGEucHJldkZldGNoRGl2aWRlID0gdGhpcy5kYXRhLmZldGNoUGFyYW0uRGl2aWRlO1xyXG5cdFx0XHR0aGlzLmRhdGEucHJldkZldGNoUm93TnVtID0gdGhpcy5kYXRhLmZldGNoUGFyYW0uRGl2aWRlUm93TnVtO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5kYXRhLnByZXZGZXRjaERpdmlkZSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0dGhpcy5kYXRhLnByZXZGZXRjaFJvd051bSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0dGhpcy5kYXRhLmZldGNoUGFyYW0uRGl2aWRlID0gdW5kZWZpbmVkO1xyXG5cdFx0XHR0aGlzLmRhdGEuZmV0Y2hQYXJhbS5EaXZpZGVSb3dOdW0gPSB1bmRlZmluZWQ7XHJcblx0XHRcdHRoaXMuZGF0YS51cERpdmlkZSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0dGhpcy5kYXRhLnVwUm93TnVtID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuZGF0YS5mZXRjaFBhcmFtLlZpZXcgPSB0aGlzLmRhdGEuc2VsZWN0ZWRWaWV3O1xyXG5cdFx0dGhpcy5kYXRhLmZldGNoUGFyYW0uTGFiZWxzID0gdGhpcy5kYXRhLnNlbGVjdGVkTGFiZWxzO1xyXG5cdFx0dGhpcy5kYXRhLmZldGNoUGFyYW0uU2VsS2V5cyA9IHRoaXMuZGF0YS50YWJsZVJvd1NlbGVjdGlvbi5zZWxlY3RlZDtcclxuXHRcdHRoaXMuZGF0YS5yZWZyZXNoRGF0YVByb2dyZXNzID0gdHJ1ZTtcclxuXHRcdGlmICh0aGlzLmRhdGEuY29uZGl0aW9uYWxUZW1wbGF0ZXMpIHtcclxuXHRcdFx0dGhpcy5kYXRhLmZldGNoUGFyYW0uQ29uZGl0aW9uYWxUZW1wbGF0ZSA9IHRoaXMuZGF0YS5jb25kaXRpb25hbFRlbXBsYXRlc1xyXG5cdFx0XHRcdC5maWx0ZXIodiA9PiB2LmVuYWJsZSlcclxuXHRcdFx0XHQubWFwKHYgPT4gdi5EYXRhKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzLmJhY2tmYWNlLmZldGNoRGF0YSh0aGlzLmRhdGEuZmV0Y2hQYXJhbSkucGlwZShcclxuXHRcdFx0bWFwKHYgPT4ge1xyXG5cdFx0XHRcdGlmICh2LkVycm9yKSB7XHJcblx0XHRcdFx0XHR0aGlzLnNuYWNrQmFyLm9wZW4odi5FcnJvciwgJ+ehruWumicsIHsgZHVyYXRpb246IDUwMDAgfSk7XHJcblx0XHRcdFx0XHR0aGlzLmRhdGEucmVmcmVzaERhdGFQcm9ncmVzcyA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0cmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogdi5FcnJvciB9O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZygnPT09PT09PTonLCB2LkZEYXRhKTtcclxuXHRcdFx0XHR0aGlzLmRhdGEudGFibGVEYXRhID0gdi5GRGF0YTtcclxuXHRcdFx0XHR0aGlzLmRhdGEudGltZUNvbnN1bWluZyA9IHYuVGltZUNvbnN1bWluZztcclxuXHRcdFx0XHR0aGlzLmRhdGEubmV4dFBhZ2VEaXNhYmxlID1cclxuXHRcdFx0XHRcdCh2LkZEYXRhLlJvd0NvdW50ID09PSAwICYmIHYuRkRhdGEuUm93cy5sZW5ndGggPT09IDApIHx8IHYuRkRhdGEuUm93Q291bnQgPiAwO1xyXG5cdFx0XHRcdHRoaXMuZGF0YS5wcmV2UGFnZURpc2FibGUgPVxyXG5cdFx0XHRcdFx0KHYuRkRhdGEuUm93Q291bnQgPT09IDAgJiYgdi5GRGF0YS5Sb3dzLmxlbmd0aCA9PT0gMCkgfHwgdi5GRGF0YS5Sb3dzWzBdLlJvd051bSA9PT0gMTtcclxuXHRcdFx0XHR0aGlzLnJlZ2lzdGVyVVJMUygpO1xyXG5cdFx0XHRcdGlmICh2LkZEYXRhLlJvd0NvdW50ID49IDApIHtcclxuXHRcdFx0XHRcdHRoaXMuZGF0YS5yb3dDb3VudCA9IHYuRkRhdGEuUm93Q291bnQ7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGlmICghY29uZmlnIHx8ICFjb25maWcua2VlcFJvd0NvdW50KSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuZGF0YS5yb3dDb3VudCA9IC0xOyAvLyDmlL7ov5nph4zlj6/ku6XpmLLmraLnlYzpnaLml6Dlv4XopoHliLfmlrBcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIOWmguaenOWQjuerr+i/lOWbnnRpdGxl77yM5YiZ6K+05piO5piv6ZyA6KaB5Yqo5oCB5pS55Y+YdGl0bGXlgLxcclxuXHRcdFx0XHRpZiAodi5GRGF0YS5UaXRsZSkge1xyXG5cdFx0XHRcdFx0dGhpcy50YWJzLmFjdGl2ZS50aXRsZU9ic2VydmFibGUubmV4dCh2LkZEYXRhLlRpdGxlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGhpcy5yZWZyZXNoRGF0YUV2ZW50LmVtaXQoY29uZmlnKTtcclxuXHRcdFx0XHR0aGlzLmRhdGEucmVmcmVzaERhdGFQcm9ncmVzcyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4geyBvazogdHJ1ZSB9O1xyXG5cdFx0XHR9KVxyXG5cdFx0KTtcclxuXHR9XHJcblx0Ly8g5rOo5YaM55u45YWz55qEdXJs55qE562+5ZCNXHJcblx0cmVnaXN0ZXJVUkxTKCkge1xyXG5cdFx0T2JqZWN0LmtleXModGhpcy5kYXRhLnRhYmxlRGF0YS5Qcm9jZXNzZXMpLmZvckVhY2godiA9PiB7XHJcblx0XHRcdHRoaXMuZWxlcy5zZXRVUkxTaWduKHRoaXMuZGF0YS50YWJsZURhdGEuUHJvY2Vzc2VzW3ZdLlVSTCwgdGhpcy5kYXRhLnRhYmxlRGF0YS5Qcm9jZXNzZXNbdl0uU2lnbik7XHJcblx0XHR9KTtcclxuXHRcdHRoaXMuZGF0YS50YWJsZURhdGEuUm93cy5mb3JFYWNoKHJvdyA9PiB7XHJcblx0XHRcdE9iamVjdC5rZXlzKHJvdy5Qcm9jZXNzZXMpLmZvckVhY2godiA9PiB7XHJcblx0XHRcdFx0dGhpcy5lbGVzLnNldFVSTFNpZ24ocm93LlByb2Nlc3Nlc1t2XS5VUkwsIHJvdy5Qcm9jZXNzZXNbdl0uU2lnbik7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cdC8vIOiOt+WPluaMh+WumuWIl+WFgeiuuOS9v+eUqOeahOi/kOeul+esplxyXG5cdHByaXZhdGUgZ2V0T3BlcmF0ZXMoY29sOiBzdHJpbmcpIHtcclxuXHRcdGlmICghY29sKSB7XHJcblx0XHRcdHJldHVybiBbXTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGNvbFR5cGUgPSBEYXRhVHlwZVt0aGlzLmRhdGEudGFibGVEYXRhLkNvbHVtbnMuZmluZChjID0+IGMuTmFtZSA9PT0gY29sKS5UeXBlXTtcclxuXHRcdHJldHVybiBbXHJcblx0XHRcdHtcclxuXHRcdFx0XHROYW1lOiAnJyxcclxuXHRcdFx0XHRMYWJlbDogJyjml6ApJ1xyXG5cdFx0XHR9IGFzIE9wZXJhdGUsXHJcblx0XHRcdC4uLk9wZXJhdGVzLmZpbHRlcih2ID0+IHYuQWxsb3dUeXBlcy5pbmNsdWRlcyhjb2xUeXBlKSlcclxuXHRcdF07XHJcblx0fVxyXG5cdG9uQ29sdW1uQ2hhbmdlKGNvbE5hbWU6IHN0cmluZykge1xyXG5cdFx0dGhpcy5kYXRhLk9wZXJhdGVzID0gdGhpcy5nZXRPcGVyYXRlcyhjb2xOYW1lKTtcclxuXHRcdC8vIOWmguaenOS5i+WJjeeahOi/kOeul+espuW3sue7j+S4jeWcqOWIl+ihqOS4re+8jOWImem7mOiupOS4uiDml6BcclxuXHRcdGlmICh0aGlzLmRhdGEuZmV0Y2hQYXJhbS5PcHQgJiYgIXRoaXMuZGF0YS5PcGVyYXRlcy5maW5kKHYgPT4gdi5OYW1lID09PSB0aGlzLmRhdGEuZmV0Y2hQYXJhbS5PcHQpKSB7XHJcblx0XHRcdHRoaXMuZGF0YS5mZXRjaFBhcmFtLk9wdCA9IG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbiJdfQ==