UNPKG

dbweb-common

Version:

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

353 lines 39.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, Renderer2, ViewChild } from '@angular/core'; import { MatMenuTrigger } from '@angular/material/menu'; import { MatTable } from '@angular/material/table'; import { ClipboardService } from 'ngx-clipboard'; import { ServiceService } from '../service/service.service'; import { ContextMenu } from './contex-menu'; import { Header } from './header'; import { nonePoint, noneSelector, Selector } from './selector'; export class TableComponent { /** * @param {?} svr * @param {?} _clipboardService * @param {?} elRef * @param {?} renderer */ constructor(svr, _clipboardService, elRef, renderer) { this.svr = svr; this._clipboardService = _clipboardService; this.elRef = elRef; this.renderer = renderer; this.hostClass = 'content mat-elevation-z1'; this.dataSource = []; // 跟随数据行的处理列表,初始值为空数组,防止出现不能访问.length的错误 this._processes = []; this.sortChange = new EventEmitter(); this.processClick = new EventEmitter(); this._tableColumns = []; // 处理按钮是否是展开的 this.processExpand = true; this.displayColumnNames = []; this.fixStartColumns = [ { index: 0, Name: '_select', Type: '', sticky: true, stickyEnd: false, showToolbar: false }, { index: 1, Name: '_序号', Type: 'STR', sticky: true, stickyEnd: false, showToolbar: false } ]; this.fixEndColumns = []; this.contextMenuPosition = { x: '0px', y: '0px' }; // 要用复制的方式,否则会修改掉nonePoint this.current = Object.assign({}, nonePoint); // 选择用到的属性、函数 this.selector = Object.assign({}, noneSelector); this.cellSelector = Selector.prototype.cellSelector; this.cellSelectorLeft = Selector.prototype.cellSelectorLeft; this.cellSelectorBottom = Selector.prototype.cellSelectorBottom; this.cellSelectorRight = Selector.prototype.cellSelectorRight; this.cellSelectorTop = Selector.prototype.cellSelectorTop; this.cellMouseDown = Selector.prototype.cellMouseDown; this.cellMouseEnter = Selector.prototype.cellMouseEnter; this.mouseUp = Selector.prototype.mouseUp; this.onMouseMove = Selector.prototype.onMouseMove.bind(this); this.scrollTable = Selector.prototype.scrollTable; this.openContextMenu = ContextMenu.prototype.openContextMenu; this.onSelCopyClick = ContextMenu.prototype.onSelCopyClick; this.onSelLineMenuClick = ContextMenu.prototype.onSelLineMenuClick; this.onSelCancelLineMenuClick = ContextMenu.prototype.onSelCancelLineMenuClick; this.onSelAllMenuClick = ContextMenu.prototype.onSelAllMenuClick; // 列头功能 this.headerMouseenter = Header.prototype.headerMouseenter; this.headerMouseleave = Header.prototype.headerMouseleave; this.lockButtonClick = Header.prototype.lockButtonClick; this.stickyColumnRight = Header.prototype.stickyColumnRight; this.syncColumn = Header.prototype.syncColumn; this.unlockButtonClick = Header.prototype.unlockButtonClick; this.toLeftButtonClick = Header.prototype.toLeftButtonClick; this.toRightButtonClick = Header.prototype.toRightButtonClick; this.scrollLeft = 0; this.scrollTop = 0; } /** * @param {?} val * @return {?} */ set processes(val) { if (val.length > 0) { if (this.fixEndColumns.length === 0) { this.fixEndColumns.push({ index: -1, Name: '_操作', Type: '', sticky: false, stickyEnd: true, showToolbar: false }); } } else { this.fixEndColumns.splice(0); } this._processes = val; } /** * @return {?} */ get processes() { return this._processes; } // keepSequence是否保留列的顺序 /** * @param {?} val * @param {?} dispCols * @param {?} keepSequence * @return {?} */ setDataSource(val, dispCols, keepSequence) { // 要复制,不能赋值,否则会修改掉noneSelector的值 Object.assign(this.selector, noneSelector); this.dataSource = val; this.displayColumns = dispCols; if (!keepSequence) { // 清除之前的列顺序定义 this.columns = []; } // 同步列信息 this.syncColumn(); // 一定要延后更新,否则没有效果 setTimeout((/** * @return {?} */ () => { this.updateTableHasScrollbar(); }), 20); } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ ngAfterViewInit() { // 不使用setTimeout会引起错误 setTimeout((/** * @return {?} */ () => { this.tableHasScrollbar = this.elRef.nativeElement.scrollWidth > this.elRef.nativeElement.clientWidth; }), 100); } /** * @param {?} event * @return {?} */ onResize(event) { this.updateTableHasScrollbar(); } /** * @private * @return {?} */ updateTableHasScrollbar() { this.tableHasScrollbar = this.elRef.nativeElement.scrollWidth > this.elRef.nativeElement.clientWidth; } /** * @return {?} */ onDetach() { this.scrollLeft = this.elRef.nativeElement.scrollLeft; this.scrollTop = this.elRef.nativeElement.scrollTop; } /** * @param {?} ref * @param {?} activatedRoute * @return {?} */ onAttach(ref, activatedRoute) { this.elRef.nativeElement.scrollLeft = this.scrollLeft; this.elRef.nativeElement.scrollTop = this.scrollTop; } /** * Selects all rows if they are not all selected; otherwise clear selection. * @return {?} */ masterToggle() { this.isPageSelected() ? this.svr.data.tableRowSelection.deselect(...this.dataSource.map((/** * @param {?} row * @return {?} */ row => row.Key))) : this.svr.data.tableRowSelection.select(...this.dataSource.map((/** * @param {?} row * @return {?} */ row => row.Key))); } /** * Whether the number of selected elements matches the total number of rows. * @return {?} */ isPageSelected() { return this.dataSource.find((/** * @param {?} v * @return {?} */ v => !this.svr.data.tableRowSelection.isSelected(v.Key))) === undefined; } /** * @param {?} i * @param {?} col * @return {?} */ trackByName(i, col) { return col.Name; } } TableComponent.decorators = [ { type: Component, args: [{ selector: 'common-table', template: "<div\r\n\tstyle=\"position: fixed\"\r\n\t[style.left]=\"contextMenuPosition.x\"\r\n\t[style.top]=\"contextMenuPosition.y\"\r\n\t[matMenuTriggerFor]=\"contextMenu\"\r\n></div>\r\n<mat-menu #contextMenu=\"matMenu\">\r\n\t<button mat-menu-item (click)=\"onSelCopyClick(true)\"><mat-icon svgIcon=\"content_copy\"></mat-icon>\u590D\u5236</button>\r\n\t<button mat-menu-item (click)=\"onSelCopyClick(false)\"><mat-icon></mat-icon>\u590D\u5236(\u65E0\u6807\u9898)</button>\r\n\t<!-- <mat-divider></mat-divider> -->\r\n\t<button mat-menu-item (click)=\"onSelLineMenuClick($event)\">\r\n\t\t<mat-icon svgIcon=\"single_chosen\"></mat-icon>\u9009\u4E2D\u884C\r\n\t</button>\r\n\t<button mat-menu-item (click)=\"onSelCancelLineMenuClick()\">\r\n\t\t<mat-icon svgIcon=\"cancel_chosen\"></mat-icon>\u53D6\u6D88\u9009\u4E2D\r\n\t</button>\r\n\t<button mat-menu-item (click)=\"onSelAllMenuClick()\"><mat-icon svgIcon=\"return_chosen\"></mat-icon>\u5168\u9009</button>\r\n</mat-menu>\r\n<table\r\n\tmat-table\r\n\t[dataSource]=\"dataSource\"\r\n\tmatSort\r\n\tmatSortStart=\"desc\"\r\n\t(matSortChange)=\"sortChange.emit($event)\"\r\n\t#tabData\r\n>\r\n\t<ng-container matColumnDef=\"_select\" sticky>\r\n\t\t<th mat-header-cell *matHeaderCellDef>\r\n\t\t\t<!--labelPosition=\"before\" \u4E00\u5B9A\u8981\u8FD9\u6837\u8BBE\u7F6E\uFF0C\u5426\u5219\u4F1A\u51FA\u73B0\u7A7A\u9699-->\r\n\t\t\t<mat-checkbox\r\n\t\t\t\t(change)=\"$event ? masterToggle() : null\"\r\n\t\t\t\t[checked]=\"svr.data.tableRowSelection.hasValue() && isPageSelected()\"\r\n\t\t\t\t[indeterminate]=\"svr.data.tableRowSelection.hasValue() && !isPageSelected()\"\r\n\t\t\t\tlabelPosition=\"before\"\r\n\t\t\t>\r\n\t\t\t</mat-checkbox>\r\n\t\t</th>\r\n\t\t<td\r\n\t\t\tmat-cell\r\n\t\t\t*matCellDef=\"let row; let rowIndex = index\"\r\n\t\t\t[ngClass]=\"{ 'current-row': current.y === rowIndex + 1 }\"\r\n\t\t>\r\n\t\t\t<mat-checkbox\r\n\t\t\t\t(click)=\"$event.stopPropagation()\"\r\n\t\t\t\t(change)=\"$event ? svr.data.tableRowSelection.toggle(row.Key) : null\"\r\n\t\t\t\t[checked]=\"svr.data.tableRowSelection.isSelected(row.Key)\"\r\n\t\t\t\tlabelPosition=\"before\"\r\n\t\t\t>\r\n\t\t\t</mat-checkbox>\r\n\t\t</td>\r\n\t</ng-container>\r\n\t<ng-container matColumnDef=\"_\u5E8F\u53F7\" sticky>\r\n\t\t<th\r\n\t\t\tmat-header-cell\r\n\t\t\t*matHeaderCellDef\r\n\t\t\tclass=\"number-cell\"\r\n\t\t\t[ngClass]=\"{\r\n\t\t\t\t'current-col': current.x === 1,\r\n\t\t\t\t'sticky-right': tableHasScrollbar && stickyColumnRight(1)\r\n\t\t\t}\"\r\n\t\t>\r\n\t\t\t\u5E8F\u53F7\r\n\t\t</th>\r\n\t\t<td\r\n\t\t\tmat-cell\r\n\t\t\t*matCellDef=\"let row; let rowIndex = index\"\r\n\t\t\tclass=\"number-cell\"\r\n\t\t\t(contextmenu)=\"openContextMenu($event, 1, rowIndex)\"\r\n\t\t\t[ngClass]=\"{\r\n\t\t\t\tselector: cellSelector(1, rowIndex),\r\n\t\t\t\t'sel-left': cellSelectorLeft(1, rowIndex),\r\n\t\t\t\t'sel-bottom': cellSelectorBottom(1, rowIndex),\r\n\t\t\t\t'sel-right': cellSelectorRight(1, rowIndex),\r\n\t\t\t\t'sel-top': cellSelectorTop(1, rowIndex),\r\n\t\t\t\t'current-row': current.y === rowIndex + 1,\r\n\t\t\t\t'sticky-right': tableHasScrollbar && stickyColumnRight(1)\r\n\t\t\t}\"\r\n\t\t\t(mousedown)=\"cellMouseDown($event, 1, rowIndex)\"\r\n\t\t>\r\n\t\t\t{{ row.RowNum }}\r\n\t\t</td>\r\n\t</ng-container>\r\n\t<ng-container *ngFor=\"let col of columns; trackBy: trackByName\" matColumnDef=\"{{ col.Name }}\" [sticky]=\"col.sticky\">\r\n\t\t<th\r\n\t\t\tmat-header-cell\r\n\t\t\t[arrowPosition]=\"col.Type !== 'INT' && col.Type !== 'FLOAT' ? 'after' : 'before'\"\r\n\t\t\t*matHeaderCellDef\r\n\t\t\tmat-sort-header\r\n\t\t\t[ngClass]=\"{\r\n\t\t\t\t'current-col': current.x === col.index + 2,\r\n\t\t\t\t'sticky-right': tableHasScrollbar && stickyColumnRight(col.index + 2),\r\n\t\t\t\t'number-cell': col.Type === 'INT' || col.Type === 'FLOAT'\r\n\t\t\t}\"\r\n\t\t\t(mouseenter)=\"headerMouseenter(col, $event)\"\r\n\t\t\t(mouseleave)=\"headerMouseleave(col)\"\r\n\t\t>\r\n\t\t\t<div *ngIf=\"col.showToolbar\" class=\"col-toolbar\">\r\n\t\t\t\t<mat-icon\r\n\t\t\t\t\tmatRipple\r\n\t\t\t\t\tmatRippleRadius=\"8\"\r\n\t\t\t\t\tmatRippleCentered=\"true\"\r\n\t\t\t\t\tmatTooltip=\"\u9501\u5B9A\u5217\u5230\u5DE6\u8FB9\"\r\n\t\t\t\t\t*ngIf=\"!col.sticky\"\r\n\t\t\t\t\tsvgIcon=\"lock\"\r\n\t\t\t\t\t(click)=\"lockButtonClick($event, col)\"\r\n\t\t\t\t></mat-icon>\r\n\t\t\t\t<mat-icon\r\n\t\t\t\t\tmatRipple\r\n\t\t\t\t\tmatRippleRadius=\"8\"\r\n\t\t\t\t\tmatRippleCentered=\"true\"\r\n\t\t\t\t\tmatTooltip=\"\u79FB\u9664\u9501\u5B9A\"\r\n\t\t\t\t\t*ngIf=\"col.sticky\"\r\n\t\t\t\t\tsvgIcon=\"lock_open\"\r\n\t\t\t\t\t(click)=\"unlockButtonClick($event, col)\"\r\n\t\t\t\t></mat-icon>\r\n\t\t\t\t<mat-icon\r\n\t\t\t\t\tmatRipple\r\n\t\t\t\t\tmatRippleRadius=\"8\"\r\n\t\t\t\t\tmatRippleCentered=\"true\"\r\n\t\t\t\t\tmatTooltip=\"\u5DE6\u79FB\"\r\n\t\t\t\t\t*ngIf=\"col.sticky && col.index > 0\"\r\n\t\t\t\t\tsvgIcon=\"arrow_back\"\r\n\t\t\t\t\t(click)=\"toLeftButtonClick($event, col)\"\r\n\t\t\t\t></mat-icon>\r\n\t\t\t\t<mat-icon\r\n\t\t\t\t\tmatRipple\r\n\t\t\t\t\tmatRippleRadius=\"8\"\r\n\t\t\t\t\tmatRippleCentered=\"true\"\r\n\t\t\t\t\tmatTooltip=\"\u53F3\u79FB\"\r\n\t\t\t\t\t*ngIf=\"col.sticky && !stickyColumnRight(col.index + 2)\"\r\n\t\t\t\t\tsvgIcon=\"arrow_forward\"\r\n\t\t\t\t\t(click)=\"toRightButtonClick($event, col)\"\r\n\t\t\t\t></mat-icon>\r\n\t\t\t</div>\r\n\t\t\t{{ col.Name }}\r\n\t\t</th>\r\n\t\t<td\r\n\t\t\tmat-cell\r\n\t\t\t*matCellDef=\"let row; let rowIndex = index\"\r\n\t\t\t(contextmenu)=\"openContextMenu($event, col.index + 2, rowIndex)\"\r\n\t\t\t[ngClass]=\"{\r\n\t\t\t\tselector: cellSelector(col.index + 2, rowIndex),\r\n\t\t\t\t'sel-left': cellSelectorLeft(col.index + 2, rowIndex),\r\n\t\t\t\t'sel-bottom': cellSelectorBottom(col.index + 2, rowIndex),\r\n\t\t\t\t'sel-right': cellSelectorRight(col.index + 2, rowIndex),\r\n\t\t\t\t'sel-top': cellSelectorTop(col.index + 2, rowIndex),\r\n\t\t\t\t'current-row': current.y === rowIndex + 1,\r\n\t\t\t\t'sticky-right': tableHasScrollbar && stickyColumnRight(col.index + 2),\r\n\t\t\t\t'number-cell': col.Type === 'INT' || col.Type === 'FLOAT'\r\n\t\t\t}\"\r\n\t\t\t(mouseenter)=\"cellMouseEnter($event)\"\r\n\t\t\t(mousedown)=\"cellMouseDown($event, col.index + 2, rowIndex)\"\r\n\t\t>\r\n\t\t\t<span class=\"line-breaker\" *ngIf=\"col.Type === 'DATE'\">\r\n\t\t\t\t{{ row.Data[col.Name] | date: 'yyyy-MM-dd hh:mm:ss' }}\r\n\t\t\t</span>\r\n\t\t\t<span class=\"line-breaker\" *ngIf=\"col.Type !== 'DATE'\">\r\n\t\t\t\t{{ row.Data[col.Name] }}\r\n\t\t\t</span>\r\n\t\t</td>\r\n\t</ng-container>\r\n\r\n\t<ng-container matColumnDef=\"_\u64CD\u4F5C\" stickyEnd *ngIf=\"processes.length > 0\">\r\n\t\t<th mat-header-cell *matHeaderCellDef [ngClass]=\"{ 'sticky-left': tableHasScrollbar }\" class=\"col-\u64CD\u4F5C\">\r\n\t\t\t<span>\r\n\t\t\t\t<span *ngIf=\"processExpand\">\u64CD\u4F5C</span\r\n\t\t\t\t><button mat-icon-button (click)=\"processExpand = !processExpand\">\r\n\t\t\t\t\t<mat-icon\r\n\t\t\t\t\t\t[matTooltip]=\"processExpand ? '\u6536\u7F29' : '\u5C55\u5F00'\"\r\n\t\t\t\t\t\t[svgIcon]=\"processExpand ? 'first_page' : 'last_page'\"\r\n\t\t\t\t\t></mat-icon>\r\n\t\t\t\t</button>\r\n\t\t\t</span>\r\n\t\t</th>\r\n\t\t<td\r\n\t\t\tmat-cell\r\n\t\t\tclass=\"cell-\u64CD\u4F5C\"\r\n\t\t\t*matCellDef=\"let row; let rowIndex = index\"\r\n\t\t\t[ngClass]=\"{ 'current-row': current.y === rowIndex + 1, 'sticky-left': tableHasScrollbar }\"\r\n\t\t>\r\n\t\t\t<common-process\r\n\t\t\t\t[processes]=\"processes\"\r\n\t\t\t\t[processStatus]=\"row.Processes\"\r\n\t\t\t\t[buttonShowNum]=\"processExpand ? 3 : 0\"\r\n\t\t\t\t(processClick)=\"processClick.emit({ pro: $event, row: row })\"\r\n\t\t\t></common-process>\r\n\t\t</td>\r\n\t</ng-container>\r\n\r\n\t<tr mat-header-row *matHeaderRowDef=\"displayColumnNames; sticky: true\" class=\"table-header\"></tr>\r\n\t<tr mat-row *matRowDef=\"let myRowData; let rowIndex = index; columns: displayColumnNames\"></tr>\r\n</table>\r\n", styles: ["@charset \"UTF-8\";.content{height:100%;width:100%;overflow:auto;flex-grow:1}.line-breaker{white-space:pre}table{margin-bottom:24px;white-space:nowrap}table .col-toolbar{position:absolute;border-radius:2px;left:0;top:0;height:18px;background-color:rgba(0,0,0,.4)}table .col-toolbar .common-icon-button,table .col-toolbar .mat-icon{color:#fff;padding-top:2px;width:16px;height:16px}table .number-cell{text-align:right}table .mat-cell{font-size:14px;line-height:20px;min-height:auto;padding-left:8px;padding-right:16px;cursor:default}table .mat-row{height:40px}table .mat-row.mat-table-sticky:last{border-right:1px solid #e0e0e0!important}table .table-header{padding-right:0!important;padding-left:0!important;height:40px}table .table-header ::ng-deep .number-cell .mat-sort-header-container{justify-content:flex-end}table .table-header .col-\u64CD\u4F5C{padding-right:0!important;padding-left:0!important}table .table-header .col-\u64CD\u4F5C span{display:flex;justify-content:center;align-items:center}table .table-header .col-\u64CD\u4F5C span button{margin-bottom:3px}table .table-header .mat-header-cell{font-size:14px;line-height:20px;min-height:auto;padding-left:8px;padding-right:16px}table .cell-\u64CD\u4F5C{padding:0;text-align:center}"] }] } ]; /** @nocollapse */ TableComponent.ctorParameters = () => [ { type: ServiceService }, { type: ClipboardService }, { type: ElementRef }, { type: Renderer2 } ]; TableComponent.propDecorators = { hostClass: [{ type: HostBinding, args: ['class',] }], processes: [{ type: Input }], sortChange: [{ type: Output }], processClick: [{ type: Output }], tabData: [{ type: ViewChild, args: ['tabData', { read: ElementRef, static: true },] }], tabDataOrg: [{ type: ViewChild, args: ['tabData', { static: true },] }], contextMenu: [{ type: ViewChild, args: [MatMenuTrigger, { static: true },] }], mouseUp: [{ type: HostListener, args: ['window:mouseup', ['$event'],] }], onResize: [{ type: HostListener, args: ['window:resize', ['$event'],] }] }; if (false) { /** @type {?} */ TableComponent.prototype.hostClass; /** @type {?} */ TableComponent.prototype.displayColumns; /** @type {?} */ TableComponent.prototype.dataSource; /** * @type {?} * @private */ TableComponent.prototype._processes; /** @type {?} */ TableComponent.prototype.sortChange; /** @type {?} */ TableComponent.prototype.processClick; /** @type {?} */ TableComponent.prototype._tableColumns; /** @type {?} */ TableComponent.prototype.tabData; /** @type {?} */ TableComponent.prototype.tabDataOrg; /** @type {?} */ TableComponent.prototype.contextMenu; /** @type {?} */ TableComponent.prototype.columns; /** @type {?} */ TableComponent.prototype.processExpand; /** @type {?} */ TableComponent.prototype.displayColumnNames; /** @type {?} */ TableComponent.prototype.timer; /** @type {?} */ TableComponent.prototype.leftPressed; /** @type {?} */ TableComponent.prototype.x; /** @type {?} */ TableComponent.prototype.y; /** @type {?} */ TableComponent.prototype.fixStartColumns; /** @type {?} */ TableComponent.prototype.fixEndColumns; /** @type {?} */ TableComponent.prototype.contextMenuPosition; /** @type {?} */ TableComponent.prototype.current; /** @type {?} */ TableComponent.prototype.selector; /** @type {?} */ TableComponent.prototype.cellSelector; /** @type {?} */ TableComponent.prototype.cellSelectorLeft; /** @type {?} */ TableComponent.prototype.cellSelectorBottom; /** @type {?} */ TableComponent.prototype.cellSelectorRight; /** @type {?} */ TableComponent.prototype.cellSelectorTop; /** @type {?} */ TableComponent.prototype.cellMouseDown; /** @type {?} */ TableComponent.prototype.cellMouseEnter; /** @type {?} */ TableComponent.prototype.mouseUp; /** @type {?} */ TableComponent.prototype.closeMouseDownListern; /** @type {?} */ TableComponent.prototype.onMouseMove; /** @type {?} */ TableComponent.prototype.scrollTable; /** @type {?} */ TableComponent.prototype.openContextMenu; /** @type {?} */ TableComponent.prototype.onSelCopyClick; /** @type {?} */ TableComponent.prototype.onSelLineMenuClick; /** @type {?} */ TableComponent.prototype.onSelCancelLineMenuClick; /** @type {?} */ TableComponent.prototype.onSelAllMenuClick; /** @type {?} */ TableComponent.prototype.headerMouseenter; /** @type {?} */ TableComponent.prototype.headerMouseleave; /** @type {?} */ TableComponent.prototype.lockButtonClick; /** @type {?} */ TableComponent.prototype.stickyColumnRight; /** @type {?} */ TableComponent.prototype.syncColumn; /** @type {?} */ TableComponent.prototype.unlockButtonClick; /** @type {?} */ TableComponent.prototype.toLeftButtonClick; /** @type {?} */ TableComponent.prototype.toRightButtonClick; /** @type {?} */ TableComponent.prototype.tableHasScrollbar; /** @type {?} */ TableComponent.prototype.headerToolbarShowTimer; /** * @type {?} * @private */ TableComponent.prototype.scrollLeft; /** * @type {?} * @private */ TableComponent.prototype.scrollTop; /** @type {?} */ TableComponent.prototype.svr; /** @type {?} */ TableComponent.prototype._clipboardService; /** @type {?} */ TableComponent.prototype.elRef; /** @type {?} */ TableComponent.prototype.renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGJ3ZWItY29tbW9uLyIsInNvdXJjZXMiOlsibGliL3JlY29yZC12aWV3L3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUVOLFNBQVMsRUFFVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHbkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBRSxjQUFjLEVBQXFCLE1BQU0sNEJBQTRCLENBQUM7QUFDL0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBVSxTQUFTLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQVF2RSxNQUFNLE9BQU8sY0FBYzs7Ozs7OztJQTJGMUIsWUFDUSxHQUFtQixFQUNuQixpQkFBbUMsRUFDbkMsS0FBaUIsRUFDakIsUUFBbUI7UUFIbkIsUUFBRyxHQUFILEdBQUcsQ0FBZ0I7UUFDbkIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQUNuQyxVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ2pCLGFBQVEsR0FBUixRQUFRLENBQVc7UUE5RkwsY0FBUyxHQUFHLDBCQUEwQixDQUFDO1FBRzdELGVBQVUsR0FBaUIsRUFBRSxDQUFDOztRQUd0QixlQUFVLEdBQXlCLEVBQUUsQ0FBQztRQXFCcEMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFR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OztJQXhIekMsbUNBQTZEOztJQUU3RCx3Q0FBa0M7O0lBQ2xDLG9DQUE4Qjs7Ozs7SUFHOUIsb0NBQThDOztJQXFCOUMsb0NBQWdEOztJQUNoRCxzQ0FBMEY7O0lBQzFGLHVDQUFzQzs7SUFDdEMsaUNBQ3NDOztJQUN0QyxvQ0FDaUM7O0lBQ2pDLHFDQUF5RTs7SUFFekUsaUNBQTJCOztJQUUzQix1Q0FBcUI7O0lBRXJCLDRDQUFrQzs7SUFFbEMsK0JBQW9COztJQUNwQixxQ0FBcUI7O0lBQ3JCLDJCQUFVOztJQUNWLDJCQUFVOztJQUNWLHlDQUdFOztJQUNGLHVDQUErQzs7SUFFL0MsNkNBQTZDOztJQUU3QyxpQ0FBbUM7O0lBRW5DLGtDQUF3Qzs7SUFDeEMsc0NBQStDOztJQUMvQywwQ0FBdUQ7O0lBQ3ZELDRDQUEyRDs7SUFDM0QsMkNBQXlEOztJQUN6RCx5Q0FBcUQ7O0lBQ3JELHVDQUFpRDs7SUFDakQsd0NBQW1EOztJQUVuRCxpQ0FDcUM7O0lBQ3JDLCtDQUFrQzs7SUFDbEMscUNBQXdEOztJQUN4RCxxQ0FBNkM7O0lBQzdDLHlDQUF3RDs7SUFDeEQsd0NBQXNEOztJQUN0RCw0Q0FBOEQ7O0lBQzlELGtEQUEwRTs7SUFDMUUsMkNBQTREOztJQUU1RCwwQ0FBcUQ7O0lBQ3JELDBDQUFxRDs7SUFDckQseUNBQW1EOztJQUNuRCwyQ0FBdUQ7O0lBQ3ZELG9DQUF5Qzs7SUFDekMsMkNBQXVEOztJQUN2RCwyQ0FBdUQ7O0lBQ3ZELDRDQUF5RDs7SUFFekQsMkNBQTJCOztJQUMzQixnREFBcUM7Ozs7O0lBRXJDLG9DQUF1Qjs7Ozs7SUFDdkIsbUNBQXNCOztJQUVyQiw2QkFBMEI7O0lBQzFCLDJDQUEwQzs7SUFDMUMsK0JBQXdCOztJQUN4QixrQ0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG5cdEFmdGVyVmlld0luaXQsXHJcblx0Q29tcG9uZW50LFxyXG5cdENvbXBvbmVudFJlZixcclxuXHRFbGVtZW50UmVmLFxyXG5cdEV2ZW50RW1pdHRlcixcclxuXHRIb3N0QmluZGluZyxcclxuXHRIb3N0TGlzdGVuZXIsXHJcblx0SW5wdXQsXHJcblx0T25Jbml0LFxyXG5cdE91dHB1dCxcclxuXHRSZW5kZXJlcjIsXHJcblx0Vmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdE1lbnVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XHJcbmltcG9ydCB7IFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcclxuaW1wb3J0IHsgTWF0VGFibGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgUm91dGVyT3V0bGV0RXZlbnQgfSBmcm9tICdkYndlYi1jb3JlJztcclxuaW1wb3J0IHsgQ2xpcGJvYXJkU2VydmljZSB9IGZyb20gJ25neC1jbGlwYm9hcmQnO1xyXG5pbXBvcnQgeyBJUmVjb3JkVmlld1Byb2Nlc3MsIElSZW5kZXJSb3cgfSBmcm9tICcuLi9tb2RlbC9tb2RlbCc7XHJcbmltcG9ydCB7IFNlcnZpY2VTZXJ2aWNlLCBSZWZyZXNoRGF0YUNvbmZpZyB9IGZyb20gJy4uL3NlcnZpY2Uvc2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29udGV4dE1lbnUgfSBmcm9tICcuL2NvbnRleC1tZW51JztcclxuaW1wb3J0IHsgSGVhZGVyIH0gZnJvbSAnLi9oZWFkZXInO1xyXG5pbXBvcnQgeyBJUG9pbnQsIG5vbmVQb2ludCwgbm9uZVNlbGVjdG9yLCBTZWxlY3RvciB9IGZyb20gJy4vc2VsZWN0b3InO1xyXG5pbXBvcnQgeyBUYWJsZUNvbHVtblR5cGUgfSBmcm9tICcuLi9tb2RlbC9tb2RlbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ2NvbW1vbi10YWJsZScsXHJcblx0dGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgU2VsZWN0b3IsIENvbnRleHRNZW51LCBIZWFkZXIsIFJvdXRlck91dGxldEV2ZW50IHtcclxuXHRASG9zdEJpbmRpbmcoJ2NsYXNzJykgaG9zdENsYXNzID0gJ2NvbnRlbnQgbWF0LWVsZXZhdGlvbi16MSc7XHJcblx0Ly8g5Lyg5YWl55qE5pWw5o2u5Lit55qE5pi+56S65YiXXHJcblx0ZGlzcGxheUNvbHVtbnM6IFRhYmxlQ29sdW1uVHlwZVtdO1xyXG5cdGRhdGFTb3VyY2U6IElSZW5kZXJSb3dbXSA9IFtdO1xyXG5cclxuXHQvLyDot5/pmo/mlbDmja7ooYznmoTlpITnkIbliJfooags5Yid5aeL5YC85Li656m65pWw57uE77yM6Ziy5q2i5Ye6546w5LiN6IO96K6/6ZeuLmxlbmd0aOeahOmUmeivr1xyXG5cdHByaXZhdGUgX3Byb2Nlc3NlczogSVJlY29yZFZpZXdQcm9jZXNzW10gPSBbXTtcclxuXHRASW5wdXQoKSBzZXQgcHJvY2Vzc2VzKHZhbDogSVJlY29yZFZpZXdQcm9jZXNzW10pIHtcclxuXHRcdGlmICh2YWwubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRpZiAodGhpcy5maXhFbmRDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xyXG5cdFx0XHRcdHRoaXMuZml4RW5kQ29sdW1ucy5wdXNoKHtcclxuXHRcdFx0XHRcdGluZGV4OiAtMSxcclxuXHRcdFx0XHRcdE5hbWU6ICdf5pON5L2cJyxcclxuXHRcdFx0XHRcdFR5cGU6ICcnLFxyXG5cdFx0XHRcdFx0c3RpY2t5OiBmYWxzZSxcclxuXHRcdFx0XHRcdHN0aWNreUVuZDogdHJ1ZSxcclxuXHRcdFx0XHRcdHNob3dUb29sYmFyOiBmYWxzZVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmZpeEVuZENvbHVtbnMuc3BsaWNlKDApO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5fcHJvY2Vzc2VzID0gdmFsO1xyXG5cdH1cclxuXHRnZXQgcHJvY2Vzc2VzKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX3Byb2Nlc3NlcztcclxuXHR9XHJcblx0QE91dHB1dCgpIHNvcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnQ+KCk7XHJcblx0QE91dHB1dCgpIHByb2Nlc3NDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBwcm86IElSZWNvcmRWaWV3UHJvY2Vzczsgcm93OiBJUmVuZGVyUm93IH0+KCk7XHJcblx0X3RhYmxlQ29sdW1uczogVGFibGVDb2x1bW5UeXBlW10gPSBbXTtcclxuXHRAVmlld0NoaWxkKCd0YWJEYXRhJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcclxuXHR0YWJEYXRhOiBFbGVtZW50UmVmPEhUTUxUYWJsZUVsZW1lbnQ+O1xyXG5cdEBWaWV3Q2hpbGQoJ3RhYkRhdGEnLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG5cdHRhYkRhdGFPcmc6IE1hdFRhYmxlPElSZW5kZXJSb3c+O1xyXG5cdEBWaWV3Q2hpbGQoTWF0TWVudVRyaWdnZXIsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRleHRNZW51OiBNYXRNZW51VHJpZ2dlcjtcclxuXHQvLyDlvZPliY3lhoXpg6jnmoTliJfvvIzlj6/og73mmK/nlKjmiLfosIPmlbTov4fliJfnmoTpobrluo9cclxuXHRjb2x1bW5zOiBUYWJsZUNvbHVtblR5cGVbXTtcclxuXHQvLyDlpITnkIbmjInpkq7mmK/lkKbmmK/lsZXlvIDnmoRcclxuXHRwcm9jZXNzRXhwYW5kID0gdHJ1ZTtcclxuXHJcblx0ZGlzcGxheUNvbHVtbk5hbWVzOiBzdHJpbmdbXSA9IFtdO1xyXG5cdC8vIOWumuaXtuWZqFxyXG5cdHRpbWVyOiBOb2RlSlMuVGltZXI7XHJcblx0bGVmdFByZXNzZWQ6IGJvb2xlYW47XHJcblx0eDogbnVtYmVyO1xyXG5cdHk6IG51bWJlcjtcclxuXHRyZWFkb25seSBmaXhTdGFydENvbHVtbnM6IFRhYmxlQ29sdW1uVHlwZVtdID0gW1xyXG5cdFx0eyBpbmRleDogMCwgTmFtZTogJ19zZWxlY3QnLCBUeXBlOiAnJywgc3RpY2t5OiB0cnVlLCBzdGlja3lFbmQ6IGZhbHNlLCBzaG93VG9vbGJhcjogZmFsc2UgfSxcclxuXHRcdHsgaW5kZXg6IDEsIE5hbWU6ICdf5bqP5Y+3JywgVHlwZTogJ1NUUicsIHN0aWNreTogdHJ1ZSwgc3RpY2t5RW5kOiBmYWxzZSwgc2hvd1Rvb2xiYXI6IGZhbHNlIH1cclxuXHRdO1xyXG5cdHJlYWRvbmx5IGZpeEVuZENvbHVtbnM6IFRhYmxlQ29sdW1uVHlwZVtdID0gW107XHJcblxyXG5cdGNvbnRleHRNZW51UG9zaXRpb24gPSB7IHg6ICcwcHgnLCB5OiAnMHB4JyB9O1xyXG5cdC8vIOimgeeUqOWkjeWItueahOaWueW8j++8jOWQpuWImeS8muS/ruaUueaOiW5vbmVQb2ludFxyXG5cdGN1cnJlbnQ6IElQb2ludCA9IHsgLi4ubm9uZVBvaW50IH07XHJcblx0Ly8g6YCJ5oup55So5Yiw55qE5bGe5oCn44CB5Ye95pWwXHJcblx0cmVhZG9ubHkgc2VsZWN0b3IgPSB7IC4uLm5vbmVTZWxlY3RvciB9O1xyXG5cdGNlbGxTZWxlY3RvciA9IFNlbGVjdG9yLnByb3RvdHlwZS5jZWxsU2VsZWN0b3I7XHJcblx0Y2VsbFNlbGVjdG9yTGVmdCA9IFNlbGVjdG9yLnByb3RvdHlwZS5jZWxsU2VsZWN0b3JMZWZ0O1xyXG5cdGNlbGxTZWxlY3RvckJvdHRvbSA9IFNlbGVjdG9yLnByb3RvdHlwZS5jZWxsU2VsZWN0b3JCb3R0b207XHJcblx0Y2VsbFNlbGVjdG9yUmlnaHQgPSBTZWxlY3Rvci5wcm90b3R5cGUuY2VsbFNlbGVjdG9yUmlnaHQ7XHJcblx0Y2VsbFNlbGVjdG9yVG9wID0gU2VsZWN0b3IucHJvdG90eXBlLmNlbGxTZWxlY3RvclRvcDtcclxuXHRjZWxsTW91c2VEb3duID0gU2VsZWN0b3IucHJvdG90eXBlLmNlbGxNb3VzZURvd247XHJcblx0Y2VsbE1vdXNlRW50ZXIgPSBTZWxlY3Rvci5wcm90b3R5cGUuY2VsbE1vdXNlRW50ZXI7XHJcblxyXG5cdEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzptb3VzZXVwJywgWyckZXZlbnQnXSlcclxuXHRtb3VzZVVwID0gU2VsZWN0b3IucHJvdG90eXBlLm1vdXNlVXA7XHJcblx0Y2xvc2VNb3VzZURvd25MaXN0ZXJuOiAoKSA9PiB2b2lkO1xyXG5cdG9uTW91c2VNb3ZlID0gU2VsZWN0b3IucHJvdG90eXBlLm9uTW91c2VNb3ZlLmJpbmQodGhpcyk7XHJcblx0c2Nyb2xsVGFibGUgPSBTZWxlY3Rvci5wcm90b3R5cGUuc2Nyb2xsVGFibGU7XHJcblx0b3BlbkNvbnRleHRNZW51ID0gQ29udGV4dE1lbnUucHJvdG90eXBlLm9wZW5Db250ZXh0TWVudTtcclxuXHRvblNlbENvcHlDbGljayA9IENvbnRleHRNZW51LnByb3RvdHlwZS5vblNlbENvcHlDbGljaztcclxuXHRvblNlbExpbmVNZW51Q2xpY2sgPSBDb250ZXh0TWVudS5wcm90b3R5cGUub25TZWxMaW5lTWVudUNsaWNrO1xyXG5cdG9uU2VsQ2FuY2VsTGluZU1lbnVDbGljayA9IENvbnRleHRNZW51LnByb3RvdHlwZS5vblNlbENhbmNlbExpbmVNZW51Q2xpY2s7XHJcblx0b25TZWxBbGxNZW51Q2xpY2sgPSBDb250ZXh0TWVudS5wcm90b3R5cGUub25TZWxBbGxNZW51Q2xpY2s7XHJcblx0Ly8g5YiX5aS05Yqf6IO9XHJcblx0aGVhZGVyTW91c2VlbnRlciA9IEhlYWRlci5wcm90b3R5cGUuaGVhZGVyTW91c2VlbnRlcjtcclxuXHRoZWFkZXJNb3VzZWxlYXZlID0gSGVhZGVyLnByb3RvdHlwZS5oZWFkZXJNb3VzZWxlYXZlO1xyXG5cdGxvY2tCdXR0b25DbGljayA9IEhlYWRlci5wcm90b3R5cGUubG9ja0J1dHRvbkNsaWNrO1xyXG5cdHN0aWNreUNvbHVtblJpZ2h0ID0gSGVhZGVyLnByb3RvdHlwZS5zdGlja3lDb2x1bW5SaWdodDtcclxuXHRzeW5jQ29sdW1uID0gSGVhZGVyLnByb3RvdHlwZS5zeW5jQ29sdW1uO1xyXG5cdHVubG9ja0J1dHRvbkNsaWNrID0gSGVhZGVyLnByb3RvdHlwZS51bmxvY2tCdXR0b25DbGljaztcclxuXHR0b0xlZnRCdXR0b25DbGljayA9IEhlYWRlci5wcm90b3R5cGUudG9MZWZ0QnV0dG9uQ2xpY2s7XHJcblx0dG9SaWdodEJ1dHRvbkNsaWNrID0gSGVhZGVyLnByb3RvdHlwZS50b1JpZ2h0QnV0dG9uQ2xpY2s7XHJcblxyXG5cdHRhYmxlSGFzU2Nyb2xsYmFyOiBib29sZWFuO1xyXG5cdGhlYWRlclRvb2xiYXJTaG93VGltZXI6IE5vZGVKUy5UaW1lcjtcclxuXHJcblx0cHJpdmF0ZSBzY3JvbGxMZWZ0ID0gMDtcclxuXHRwcml2YXRlIHNjcm9sbFRvcCA9IDA7XHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwdWJsaWMgc3ZyOiBTZXJ2aWNlU2VydmljZSxcclxuXHRcdHB1YmxpYyBfY2xpcGJvYXJkU2VydmljZTogQ2xpcGJvYXJkU2VydmljZSxcclxuXHRcdHB1YmxpYyBlbFJlZjogRWxlbWVudFJlZixcclxuXHRcdHB1YmxpYyByZW5kZXJlcjogUmVuZGVyZXIyXHJcblx0KSB7fVxyXG5cdC8vICBrZWVwU2VxdWVuY2XmmK/lkKbkv53nlZnliJfnmoTpobrluo9cclxuXHRzZXREYXRhU291cmNlKHZhbDogSVJlbmRlclJvd1tdLCBkaXNwQ29sczogVGFibGVDb2x1bW5UeXBlW10sIGtlZXBTZXF1ZW5jZTogYm9vbGVhbikge1xyXG5cdFx0Ly8g6KaB5aSN5Yi277yM5LiN6IO96LWL5YC877yM5ZCm5YiZ5Lya5L+u5pS55o6Jbm9uZVNlbGVjdG9y55qE5YC8XHJcblx0XHRPYmplY3QuYXNzaWduKHRoaXMuc2VsZWN0b3IsIG5vbmVTZWxlY3Rvcik7XHJcblx0XHR0aGlzLmRhdGFTb3VyY2UgPSB2YWw7XHJcblx0XHR0aGlzLmRpc3BsYXlDb2x1bW5zID0gZGlzcENvbHM7XHJcblx0XHRpZiAoIWtlZXBTZXF1ZW5jZSkge1xyXG5cdFx0XHQvLyDmuIXpmaTkuYvliY3nmoTliJfpobrluo/lrprkuYlcclxuXHRcdFx0dGhpcy5jb2x1bW5zID0gW107XHJcblx0XHR9XHJcblx0XHQvLyDlkIzmraXliJfkv6Hmga9cclxuXHRcdHRoaXMuc3luY0NvbHVtbigpO1xyXG5cdFx0Ly8g5LiA5a6a6KaB5bu25ZCO5pu05paw77yM5ZCm5YiZ5rKh5pyJ5pWI5p6cXHJcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcclxuXHRcdFx0dGhpcy51cGRhdGVUYWJsZUhhc1Njcm9sbGJhcigpO1xyXG5cdFx0fSwgMjApO1xyXG5cdH1cclxuXHRuZ09uSW5pdCgpIHt9XHJcblx0bmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG5cdFx0Ly8g5LiN5L2/55Soc2V0VGltZW91dOS8muW8lei1t+mUmeivr1xyXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdHRoaXMudGFibGVIYXNTY3JvbGxiYXIgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGggPiB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XHJcblx0XHR9LCAxMDApO1xyXG5cdH1cclxuXHRASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuXHRvblJlc2l6ZShldmVudDogVUlFdmVudCkge1xyXG5cdFx0dGhpcy51cGRhdGVUYWJsZUhhc1Njcm9sbGJhcigpO1xyXG5cdH1cclxuXHRwcml2YXRlIHVwZGF0ZVRhYmxlSGFzU2Nyb2xsYmFyKCkge1xyXG5cdFx0dGhpcy50YWJsZUhhc1Njcm9sbGJhciA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aCA+IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcclxuXHR9XHJcblx0b25EZXRhY2goKTogdm9pZCB7XHJcblx0XHR0aGlzLnNjcm9sbExlZnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcclxuXHRcdHRoaXMuc2Nyb2xsVG9wID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcDtcclxuXHR9XHJcblx0b25BdHRhY2gocmVmOiBDb21wb25lbnRSZWY8YW55PiwgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlKTogdm9pZCB7XHJcblx0XHR0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsTGVmdDtcclxuXHRcdHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSB0aGlzLnNjcm9sbFRvcDtcclxuXHR9XHJcblx0LyoqIFNlbGVjdHMgYWxsIHJvd3MgaWYgdGhleSBhcmUgbm90IGFsbCBzZWxlY3RlZDsgb3RoZXJ3aXNlIGNsZWFyIHNlbGVjdGlvbi4gKi9cclxuXHRtYXN0ZXJUb2dnbGUoKSB7XHJcblx0XHR0aGlzLmlzUGFnZVNlbGVjdGVkKClcclxuXHRcdFx0PyB0aGlzLnN2ci5kYXRhLnRhYmxlUm93U2VsZWN0aW9uLmRlc2VsZWN0KC4uLnRoaXMuZGF0YVNvdXJjZS5tYXAocm93ID0+IHJvdy5LZXkpKVxyXG5cdFx0XHQ6IHRoaXMuc3ZyLmRhdGEudGFibGVSb3dTZWxlY3Rpb24uc2VsZWN0KC4uLnRoaXMuZGF0YVNvdXJjZS5tYXAocm93ID0+IHJvdy5LZXkpKTtcclxuXHR9XHJcblx0LyoqIFdoZXRoZXIgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbGVtZW50cyBtYXRjaGVzIHRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cy4gKi9cclxuXHRpc1BhZ2VTZWxlY3RlZCgpIHtcclxuXHRcdHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZmluZCh2ID0+ICF0aGlzLnN2ci5kYXRhLnRhYmxlUm93U2VsZWN0aW9uLmlzU2VsZWN0ZWQodi5LZXkpKSA9PT0gdW5kZWZpbmVkO1xyXG5cdH1cclxuXHR0cmFja0J5TmFtZShpOiBudW1iZXIsIGNvbDogVGFibGVDb2x1bW5UeXBlKSB7XHJcblx0XHRyZXR1cm4gY29sLk5hbWU7XHJcblx0fVxyXG59XHJcbiJdfQ==