UNPKG

dbweb-common

Version:

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

657 lines 58.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ 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'; export class EditView { /** * @param {?} svr */ constructor(svr) { this.svr = svr; this.titleInput = true; this.isAdd = true; this.addOwnerBy = OwnerByEnum.ownerByUser; // 仅新增时用到 this.modify = false; // current是否被修改过 // current是否被修改过 this.currentChange = new EventEmitter(); } /** * @return {?} */ get current() { return this._current; } /** * @param {?} val * @return {?} */ set current(val) { /** @type {?} */ const process = (/** * @return {?} */ () => { 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 {?} */ cols => { this.SelectedColumns = cols.map((/** * @param {?} col * @return {?} */ col => ({ Name: col, Hidden: false, Order: Order.OrderNone }))); })); process(); } else { this.svr.backface.getViewColumns(val).subscribe((/** * @param {?} cols * @return {?} */ cols => { this.SelectedColumns = cols; process(); })); } } /** * @return {?} */ done() { if (this.isAdd) { /** @type {?} */ const view = { 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).pipe(map((/** * @return {?} */ () => { /** @type {?} */ const dView = ElementViewDigest.fromInterface(view); 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 {?} */ v => { this.current.Name = this.title; this.titleInput = false; return true; }))); } } /** * @return {?} */ remove() { this.svr.backface.removeView(this.current).subscribe((/** * @return {?} */ () => { /** @type {?} */ const num = this.svr.data.viewList.findIndex((/** * @param {?} v * @return {?} */ v => 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 {?} */ add() { this.title = '新的视图'; this.isAdd = true; this.titleInput = true; } /** * @return {?} */ edit() { this.title = this._current.Name; this.isAdd = false; this.titleInput = true; } /** * @return {?} */ cancel() { 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 {?} */ save() { return this.svr.backface .updateView({ Name: this.current.Name, OwnerBy: this.current.OwnerBy, Owner: this.current.Owner, Columns: this.SelectedColumns }) .pipe(tap((/** * @return {?} */ () => { this.modify = false; }))); } } 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; } export class ServiceService { /** * @param {?} data * @param {?} prj * @param {?} backface * @param {?} tabs * @param {?} eles * @param {?} current * @param {?} eleview * @param {?} snackBar * @param {?} curr */ constructor(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 {?} */ ngOnDestroy() { this.subscribe.forEach((/** * @param {?} v * @return {?} */ v => v.unsubscribe())); } /** * @param {?} element * @param {?} title * @param {?} condition * @return {?} */ initByCondition(element, title, condition) { 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 {?} */ str => { this.init(element, str); })); } } /** * @param {?} element * @param {?} url * @return {?} */ init(element, url) { this.element = element; this.backface.eleName = element.Name; this.backface.url = url; this.subscribe.push(this.curr.change$.subscribe((/** * @return {?} */ () => { // tslint:disable-next-line: deprecation forkJoin(this.backface.fetParamCache(), this.eleview.fetchElementAllCategories(element.Name), this.backface.fetchElementViewList(), this.backface.fetchAllColumns()).subscribe((/** * @param {?} __0 * @return {?} */ ([param, categories, columnsList, allColumns]) => { if (param.Processes) { // 注册相关的element,必须是第一时间注册,后面会引用到 param.Processes.forEach((/** * @param {?} v * @return {?} */ v => { this.eles.addElement(Object.assign({}, v.Element, { NotMenu: true })); })); this.data.rowProcesses = this.withDefaultIconProcess(param.Processes.filter((/** * @param {?} one * @return {?} */ one => one.BindRecord))); this.data.toolbarProcesses = this.withDefaultIconProcess(param.Processes.filter((/** * @param {?} one * @return {?} */ one => !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 {?} */ v => 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 {?} */ v => v.Name)); this.data.allColumnsWithLetter = map2WithLetter(this.data.allColumnNames); this.paramsChange.next(); this.refreshData().subscribe(); }), (/** * @param {?} err * @return {?} */ (err) => { console.log(err); if (err.error.Err.Message) { this.snackBar.open(err.error.Err.Message, '确定', { horizontalPosition: 'right' }); } })); }))); } /** * @param {?} process * @return {?} */ withDefaultIconProcess(process) { return process.map((/** * @param {?} pro * @return {?} */ pro => { /** @type {?} */ const rev = pro; if (!pro.Icon) { /** @type {?} */ const 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 {?} */ refreshRowCount() { 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 {?} */ v => v.enable)) .map((/** * @param {?} v * @return {?} */ v => v.Data)); } return this.backface.fetchRowCount(this.data.fetchParam).pipe(map((/** * @param {?} v * @return {?} */ v => { this.data.rowCount = v.RowCount; this.data.refreshRowCountProgress = false; return true; }))); } // seek 指明是不是没有动过条件,仅仅翻页 /** * @param {?=} config * @return {?} */ refreshData(config) { 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 {?} */ v => v.enable)) .map((/** * @param {?} v * @return {?} */ v => v.Data)); } return this.backface.fetchData(this.data.fetchParam).pipe(map((/** * @param {?} v * @return {?} */ 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的签名 /** * @return {?} */ registerURLS() { Object.keys(this.data.tableData.Processes).forEach((/** * @param {?} v * @return {?} */ v => { this.eles.setURLSign(this.data.tableData.Processes[v].URL, this.data.tableData.Processes[v].Sign); })); this.data.tableData.Rows.forEach((/** * @param {?} row * @return {?} */ row => { Object.keys(row.Processes).forEach((/** * @param {?} v * @return {?} */ v => { this.eles.setURLSign(row.Processes[v].URL, row.Processes[v].Sign); })); })); } // 获取指定列允许使用的运算符 /** * @private * @param {?} col * @return {?} */ getOperates(col) { if (!col) { return []; } /** @type {?} */ const colType = DataType[this.data.tableData.Columns.find((/** * @param {?} c * @return {?} */ c => c.Name === col)).Type]; return [ (/** @type {?} */ ({ Name: '', Label: '(无)' })), ...Operates.filter((/** * @param {?} v * @return {?} */ v => v.AllowTypes.includes(colType))) ]; } /** * @param {?} colName * @return {?} */ onColumnChange(colName) { this.data.Operates = this.getOperates(colName); // 如果之前的运算符已经不在列表中,则默认为 无 if (this.data.fetchParam.Opt && !this.data.Operates.find((/** * @param {?} v * @return {?} */ v => v.Name === this.data.fetchParam.Opt))) { this.data.fetchParam.Opt = null; } } } ServiceService.decorators = [ { type: Injectable } ]; /** @nocollapse */ ServiceService.ctorParameters = () => [ { type: ServiceData }, { type: ProjectService }, { type: BackFaceService }, { type: TabsService }, { type: ElementsService }, { type: CurrentService }, { type: EleViewBackFaceService }, { type: MatSnackBar }, { type: CurrentService } ]; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGJ3ZWItY29tbW9uLyIsInNvdXJjZXMiOlsibGliL3JlY29yZC12aWV3L3NlcnZpY2Uvc2VydmljZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBVyxlQUFlLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNuRyxPQUFPLEVBQUUsUUFBUSxFQUFnQixPQUFPLEVBQU0sTUFBTSxNQUFNLENBQUM7QUFDM0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQWMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQWtCLEtBQUssRUFBc0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsUUFBUSxFQUFXLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDN0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUcxRyxNQUFNLE9BQU8sUUFBUTs7OztJQW1DcEIsWUFBb0Is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LEdBQUcsUUFBUSxDQUFDLE1BQU07Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFDO1NBQ3ZELENBQUM7SUFDSCxDQUFDOzs7OztJQUNELGNBQWMsQ0FBQyxPQUFlO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MseUJBQXlCO1FBQ3pCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSTs7OztRQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUMsRUFBRTtZQUNuRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1NBQ2hDO0lBQ0YsQ0FBQzs7O1lBbk9ELFVBQVU7Ozs7WUFwSW9CLFdBQVc7WUFYUyxjQUFjO1lBVXhELGVBQWU7WUFQZixXQUFXO1lBSGMsZUFBZTtZQUF4QyxjQUFjO1lBSWQsc0JBQXNCO1lBTHRCLFdBQVc7WUFDWCxjQUFjOzs7Ozs7O0lBaUp0QixtQ0FBdUM7O0lBQ3ZDLGlDQUFpQjs7SUFDakIsa0NBQThCOztJQUM5QixzQ0FBNkI7O0lBRTdCLDBDQUF5RDs7SUFFeEQsOEJBQXdCOzs7OztJQUN4Qiw2QkFBMkI7O0lBQzNCLGtDQUFnQzs7Ozs7SUFDaEMsOEJBQXlCOzs7OztJQUN6Qiw4QkFBNkI7O0lBQzdCLGlDQUE4Qjs7Ozs7SUFDOUIsaUNBQXVDOzs7OztJQUN2QyxrQ0FBNkI7Ozs7O0lBQzdCLDhCQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xyXG5pbXBvcnQgeyBDdXJyZW50U2VydmljZSwgRWxlbWVudCwgRWxlbWVudHNTZXJ2aWNlLCBQcm9qZWN0U2VydmljZSwgQmlsbE9wZXJhdGUgfSBmcm9tICdkYndlYi1jb3JlJztcclxuaW1wb3J0IHsgZm9ya0pvaW4sIFN1YnNjcmlwdGlvbiwgU3ViamVjdCwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCB0YXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFRhYnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaG9tZS90YWJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbGVWaWV3QmFja0ZhY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZWxldmlldy9lbGV2aWV3LWJhY2tmYWNlJztcclxuaW1wb3J0IHsgbWFwMldpdGhMZXR0ZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lbGV2aWV3L21hcGxldHRlcic7XHJcbmltcG9ydCB7IE93bmVyQnlFbnVtIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZWxldmlldy90eXBlcy9tb2RlbCc7XHJcbmltcG9ydCB7IEVsZW1lbnRWaWV3RGlnZXN0IH0gZnJvbSAnLi4vbW9kZWwvZWxlbWVudC1jb2x1bW5zLWRpZ2VzdCc7XHJcbmltcG9ydCB7IElEaXNwbGF5Q29sdW1uLCBPcmRlciwgSVJlY29yZFZpZXdQcm9jZXNzIH0gZnJvbSAnLi4vbW9kZWwvbW9kZWwnO1xyXG5pbXBvcnQgeyBEYXRhVHlwZSwgT3BlcmF0ZSwgT3BlcmF0ZXMgfSBmcm9tICcuLi9tb2RlbC9vcGVyYXRlJztcclxuaW1wb3J0IHsgQmFja0ZhY2VTZXJ2aWNlIH0gZnJvbSAnLi9iYWNrZmFjZSc7XHJcbmltcG9ydCB7IGNvbWJMYWJlbENvbHVtbnNJdGVtLCBTZXJ2aWNlRGF0YSwgQ29uZGl0aW9uYWxUZW1wbGF0ZVJ1bm5lciwgZGVmYXVsdENvbHVtbnNJdGVtIH0gZnJvbSAnLi9kYXRhJztcclxuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG5leHBvcnQgY2xhc3MgRWRpdFZpZXcge1xyXG5cdHRpdGxlSW5wdXQgPSB0cnVlO1xyXG5cdGlzQWRkID0gdHJ1ZTtcclxuXHRhZGRPd25lckJ5ID0gT3duZXJCeUVudW0ub3duZXJCeVVzZXI7IC8vIOS7heaWsOWinuaXtueUqOWIsFxyXG5cdHRpdGxlPzogc3RyaW5nO1xyXG5cdHByaXZhdGUgX2N1cnJlbnQ/OiBFbGVtZW50Vmlld0RpZ2VzdDtcclxuXHRSZWFkb25seT86IGJvb2xlYW47XHJcblx0U2VsZWN0ZWRDb2x1bW5zPzogSURpc3BsYXlDb2x1bW5bXTtcclxuXHRtb2RpZnkgPSBmYWxzZTsgLy8gY3VycmVudOaYr+WQpuiiq+S/ruaUuei/h1xyXG5cdGN1cnJlbnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblx0Z2V0IGN1cnJlbnQoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fY3VycmVudDtcclxuXHR9XHJcblx0c2V0IGN1cnJlbnQodmFsOiBFbGVtZW50Vmlld0RpZ2VzdCkge1xyXG5cdFx0Y29uc3QgcHJvY2VzcyA9ICgpID0+IHtcclxuXHRcdFx0dGhpcy5fY3VycmVudCA9IHZhbDtcclxuXHRcdFx0dGhpcy5SZWFkb25seSA9ICF0aGlzLl9jdXJyZW50LmNhbk1vZGlmeSh0aGlzLnN2ci5jdXJyZW50LmRhdGEuVXNlck5hbWUsIHRoaXMuc3ZyLmN1cnJlbnQuZGF0YS5EZXB0LkNvZGUpO1xyXG5cdFx0XHR0aGlzLmN1cnJlbnRDaGFuZ2UuZW1pdCgpO1xyXG5cdFx0fTtcclxuXHRcdGlmICh2YWwgPT09IGNvbWJMYWJlbENvbHVtbnNJdGVtKSB7XHJcblx0XHRcdHRoaXMuc3ZyLmJhY2tmYWNlLmNvbWJvTGFiZWxzVmlldygpLnN1YnNjcmliZShjb2xzID0+IHtcclxuXHRcdFx0XHR0aGlzLlNlbGVjdGVkQ29sdW1ucyA9IGNvbHMubWFwPElEaXNwbGF5Q29sdW1uPihjb2wgPT4gKHtcclxuXHRcdFx0XHRcdE5hbWU6IGNvbCxcclxuXHRcdFx0XHRcdEhpZGRlbjogZmFsc2UsXHJcblx0XHRcdFx0XHRPcmRlcjogT3JkZXIuT3JkZXJOb25lXHJcblx0XHRcdFx0fSkpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0cHJvY2VzcygpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5zdnIuYmFja2ZhY2UuZ2V0Vmlld0NvbHVtbnModmFsKS5zdWJzY3JpYmUoY29scyA9PiB7XHJcblx0XHRcdFx0dGhpcy5TZWxlY3RlZENvbHVtbnMgPSBjb2xzO1xyXG5cdFx0XHRcdHByb2Nlc3MoKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgc3ZyOiBTZXJ2aWNlU2VydmljZSkge31cclxuXHJcblx0ZG9uZSgpIHtcclxuXHRcdGlmICh0aGlzLmlzQWRkKSB7XHJcblx0XHRcdGNvbnN0IHZpZXcgPSB7XHJcblx0XHRcdFx0TmFtZTogdGhpcy50aXRsZSxcclxuXHRcdFx0XHRPd25lckJ5OiB0aGlzLmFkZE93bmVyQnksXHJcblx0XHRcdFx0T3duZXI6XHJcblx0XHRcdFx0XHR0aGlzLmFkZE93bmVyQnkgPT09IE93bmVyQnlFbnVtLm93bmVyQnlEZXB0XHJcblx0XHRcdFx0XHRcdD8gdGhpcy5zdnIuY3VycmVudC5kYXRhLkRlcHQuQ29kZVxyXG5cdFx0XHRcdFx0XHQ6IHRoaXMuc3ZyLmN1cnJlbnQuZGF0YS5Vc2VyTmFtZVxyXG5cdFx0XHR9O1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5zdnIuYmFja2ZhY2UuYWRkVmlldyh2aWV3KS5waXBlKFxyXG5cdFx0XHRcdG1hcCgoKSA9PiB7XHJcblx0XHRcdFx0XHRjb25zdCBkVmlldyA9IEVsZW1lbnRWaWV3RGlnZXN0LmZyb21JbnRlcmZhY2Uodmlldyk7XHJcblx0XHRcdFx0XHR0aGlzLnN2ci5kYXRhLnZpZXdMaXN0LnB1c2goZFZpZXcpO1xyXG5cdFx0XHRcdFx0dGhpcy5jdXJyZW50ID0gZFZpZXc7XHJcblx0XHRcdFx0XHR0aGlzLnRpdGxlSW5wdXQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5zdnIuYmFja2ZhY2VcclxuXHRcdFx0XHQudXBkYXRlVmlld05hbWUoe1xyXG5cdFx0XHRcdFx0T2xkTmFtZTogdGhpcy5jdXJyZW50Lk5hbWUsXHJcblx0XHRcdFx0XHROYW1lOiB0aGlzLnRpdGxlLFxyXG5cdFx0XHRcdFx0T3duZXJCeTogdGhpcy5jdXJyZW50Lk93bmVyQnksXHJcblx0XHRcdFx0XHRPd25lcjogdGhpcy5jdXJyZW50Lk93bmVyXHJcblx0XHRcdFx0fSlcclxuXHRcdFx0XHQucGlwZShcclxuXHRcdFx0XHRcdG1hcCh2ID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5jdXJyZW50Lk5hbWUgPSB0aGlzLnRpdGxlO1xyXG5cdFx0XHRcdFx0XHR0aGlzLnRpdGxlSW5wdXQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJlbW92ZSgpIHtcclxuXHRcdHRoaXMuc3ZyLmJhY2tmYWNlLnJlbW92ZVZpZXcodGhpcy5jdXJyZW50KS5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cdFx0XHRjb25zdCBudW0gPSB0aGlzLnN2ci5kYXRhLnZpZXdMaXN0LmZpbmRJbmRleCh2ID0+IHYgPT09IHRoaXMuY3VycmVudCk7XHJcblx0XHRcdHRoaXMuc3ZyLmRhdGEudmlld0xpc3Quc3BsaWNlKG51bSwgMSk7XHJcblx0XHRcdGlmICh0aGlzLnN2ci5kYXRhLnZpZXdMaXN0Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRpZiAobnVtIDwgdGhpcy5zdnIuZGF0YS52aWV3TGlzdC5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdHRoaXMuY3VycmVudCA9IHRoaXMuc3ZyLmRhdGEudmlld0xpc3RbbnVtXTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dGhpcy5jdXJyZW50ID0gdGhpcy5zdnIuZGF0YS52aWV3TGlzdFt0aGlzLnN2ci5kYXRhLnZpZXdMaXN0Lmxlbmd0aCAtIDFdO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmN1cnJlbnQgPSB0aGlzLnN2ci5kYXRhLmNvbnN0Vmlld0l0ZW1zWzBdO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblx0YWRkKCkge1xyXG5cdFx0dGhpcy50aXRsZSA9ICfmlrDnmoTop4blm74nO1xyXG5cdFx0dGhpcy5pc0FkZCA9IHRydWU7XHJcblx0XHR0aGlzLnRpdGxlSW5wdXQgPSB0cnVlO1xyXG5cdH1cclxuXHRlZGl0KCkge1xyXG5cdFx0dGhpcy50aXRsZSA9IHRoaXMuX2N1cnJlbnQuTmFtZTtcclxuXHRcdHRoaXMuaXNBZGQgPSBmYWxzZTtcclxuXHRcdHRoaXMudGl0bGVJbnB1dCA9IHRydWU7XHJcblx0fVxyXG5cdGNhbmNlbCgpIHtcclxuXHRcdHRoaXMudGl0bGVJbnB1dCA9IGZhbHNlO1xyXG5cdFx0aWYgKCF0aGlzLmN1cnJlbnQpIHtcclxuXHRcdFx0aWYgKHRoaXMuc3ZyLmRhdGEudmlld0xpc3QgJiYgdGhpcy5zdnIuZGF0YS52aWV3TGlzdC5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50ID0gdGhpcy5zdnIuZGF0YS52aWV3TGlzdFswXTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLmN1cnJlbnQgPSB0aGlzLnN2ci5kYXRhLmNvbnN0Vmlld0l0ZW1zWzBdO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHNhdmUoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5zdnIuYmFja2ZhY2VcclxuXHRcdFx0LnVwZGF0ZVZpZXcoe1xyXG5cdFx0XHRcdE5hbWU6IHRoaXMuY3VycmVudC5OYW1lLFxyXG5cdFx0XHRcdE93bmVyQnk6IHRoaXMuY3VycmVudC5Pd25lckJ5LFxyXG5cdFx0XHRcdE93bmVyOiB0aGlzLmN1cnJlbnQuT3duZXIsXHJcblx0XHRcdFx0Q29sdW1uczogdGhpcy5TZWxlY3RlZENvbHVtbnNcclxuXHRcdFx0fSlcclxuXHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0dGFwKCgpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMubW9kaWZ5ID0gZmFsc2U7XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0KTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVmcmVzaERhdGFDb25maWcge1xyXG5cdGtlZXBEaXZpZGU/OiBib29sZWFuO1xyXG5cdGtlZXBSb3dDb3VudD86IGJvb2xlYW47XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuXHRwcml2YXRlIHN1YnNjcmliZTogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHRlbGVtZW50OiBFbGVtZW50O1xyXG5cdGVkaXRWaWV3ID0gbmV3IEVkaXRWaWV3KHRoaXMpO1xyXG5cdHBhcmFtc0NoYW5nZSA9IG5ldyBTdWJqZWN0KCk7IC8vIOWPguaVsOWPkeeUn+WPmOWMlu+8jOS4gOiIrOaYr+WIneWni+WMluaXtuS4gOasoe+8jOWIh+aNouWkhOeQhuWcsOS4gOasoVxyXG5cdC8vIOagh+etvuWumuS5ieeVjOmdoueahOaVsOaNrlxyXG5cdHJlZnJlc2hEYXRhRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFJlZnJlc2hEYXRhQ29uZmlnPigpO1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHVibGljIGRhdGE6IFNlcnZpY2VEYXRhLFxyXG5cdFx0cHJpdmF0ZSBwcmo6IFByb2plY3RTZXJ2aWNlLFxyXG5cdFx0cHVibGljIGJhY2tmYWNlOiBCYWNrRmFjZVNlcnZpY2UsXHJcblx0XHRwcml2YXRlIHRhYnM6IFRhYnNTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBlbGVzOiBFbGVtZW50c1NlcnZpY2UsXHJcblx0XHRwdWJsaWMgY3VycmVudDogQ3VycmVudFNlcnZpY2UsXHJcblx0XHRwcml2YXRlIGVsZXZpZXc6IEVsZVZpZXdCYWNrRmFjZVNlcnZpY2UsXHJcblx0XHRwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhcixcclxuXHRcdHByaXZhdGUgY3VycjogQ3VycmVudFNlcnZpY2VcclxuXHQpIHt9XHJcblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHR0aGlzLnN1YnNjcmliZS5mb3JFYWNoKHYgPT4gdi51bnN1YnNjcmliZSgpKTtcclxuXHR9XHJcblx0aW5pdEJ5Q29uZGl0aW9uKGVsZW1lbnQ6IEVsZW1lbnQsIHRpdGxlOiBzdHJpbmcsIGNvbmRpdGlvbjogc3RyaW5nKSB7XHJcblx0XHR0aGlzLmJhY2tmYWNlLmVsZU5hbWUgPSBlbGVtZW50Lk5hbWU7XHJcblx0XHQvLyDlpoLmnpzmsqHmnInmnaHku7bvvIzliJnnm7TmjqXliJ3lp4vljJZcclxuXHRcdGlmICghdGl0bGUgJiYgIWNvbmRpdGlvbikge1xyXG5cdFx0XHR0aGlzLmluaXQoZWxlbWVudCwgdGhpcy5wcmouYXBpVVJMKGVsZW1lbnQuTmFtZSkpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5iYWNrZmFjZVxyXG5cdFx0XHRcdC5idWlsZFJlY29yZFZpZXdVUkwoe1xyXG5cdFx0XHRcdFx0VGl0bGU6IHRpdGxlLFxyXG5cdFx0XHRcdFx0Q29uZGl0aW9uOiBjb25kaXRpb25cclxuXHRcdFx0XHR9KVxyXG5cdFx0XHRcdC5zdWJzY3JpYmUoc3RyID0+IHtcclxuXHRcdFx0XHRcdHRoaXMuaW5pdChlbGVtZW50LCBzdHIpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRpbml0KGVsZW1lbnQ6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XHJcblx0XHR0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xyXG5cdFx0dGhpcy5iYWNrZmFjZS5lbGVOYW1lID0gZWxlbWVudC5OYW1lO1xyXG5cdFx0dGhpcy5iYWNrZmFjZS51cmwgPSB1cmw7XHJcblx0XHR0aGlzLnN1YnNjcmliZS5wdXNoKFxyXG5cdFx0XHR0aGlzLmN1cnIuY2hhbmdlJC5zdWJzY3JpYmUoKCkgPT4ge1xyXG5cdFx0XHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogZGVwcmVjYXRpb25cclxuXHRcdFx0XHRmb3JrSm9pbihcclxuXHRcdFx0XHRcdHRoaXMuYmFja2ZhY2UuZmV0UGFyYW1DYWNoZSgpLFxyXG5cdFx0XHRcdFx0dGhpcy5lbGV2aWV3LmZldGNoRWxlbWVudEFsbENhdGVnb3JpZXMoZWxlbWVudC5OYW1lKSxcclxuXHRcdFx0XHRcdHRoaXMuYmFja2ZhY2UuZmV0Y2hFbGVtZW50Vmlld0xpc3QoKSxcclxuXHRcdFx0XHRcdHRoaXMuYmFja2ZhY2UuZmV0Y2hBbGxDb2x1bW5zKClcclxuXHRcdFx0XHQpLnN1YnNjcmliZShcclxuXHRcdFx0XHRcdChbcGFyYW0sIGNhdGVnb3JpZXMsIGNvbHVtbnNMaXN0LCBhbGxDb2x1bW5zXSkgPT4ge1xyXG5cdFx0XHRcdFx0XHRpZiAocGFyYW0uUHJvY2Vzc2VzKSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8g5rOo5YaM55u45YWz55qEZWxlbWVudCzlv4XpobvmmK/nrKzkuIDml7bpl7Tms6jlhozvvIzlkI7pnaLkvJrlvJXnlKjliLBcclxuXHRcdFx0XHRcdFx0XHRwYXJhbS5Qcm9jZXNzZXMuZm9yRWFjaCh2ID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZWxlcy5hZGRFbGVtZW50KHsgLi4udi5FbGVtZW50LCBOb3RNZW51OiB0cnVlIH0pO1xyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGF0YS5yb3dQcm9jZXNzZXMgPSB0aGlzLndpdGhEZWZhdWx0SWNvblByb2Nlc3MoXHJcblx0XHRcdFx0XHRcdFx0XHRwYXJhbS5Qcm9jZXNzZXMuZmlsdGVyKG9uZSA9PiBvbmUuQmluZFJlY29yZClcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGF0YS50b29sYmFyUHJvY2Vzc2VzID0gdGhpcy53aXRoRGVmYXVsdEljb25Qcm9jZXNzKFxyXG5cdFx0XHRcdFx0XHRcdFx0cGFyYW0uUHJvY2Vzc2VzLmZpbHRlcihvbmUgPT4gIW9uZS5CaW5kUmVjb3JkKVxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5kYXRhLnJvd1Byb2Nlc3NlcyA9IFtdO1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGF0YS50b29sYmFyUHJvY2Vzc2VzID0gW107XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0dGhpcy5kYXRhLnVuaXF1ZUZpZWxkcyA9IHBhcmFtLlVuaXF1ZUZpZWxkO1xyXG5cdFx0XHRcdFx0XHRpZiAocGFyYW0uQ29uZGl0aW9uYWxUZW1wbGF0