UNPKG

@true-directive/grid

Version:

Angular Data Grid from Yopsilon.

436 lines 57.5 kB
import * as tslib_1 from "tslib"; /** * Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company. * @link https://truedirective.com/ * @license MIT */ import { Component, Input, Output, ViewChild, ViewChildren, Renderer2, EventEmitter, QueryList, ElementRef, Inject } from '@angular/core'; // Теперь наше import { GridPart } from '@true-directive/base'; import { UIAction, UIActionType } from '@true-directive/base'; import { Column } from '@true-directive/base'; import { ColumnBand } from '@true-directive/base'; import { GridLayout } from '@true-directive/base'; import { BaseComponent } from './base.component'; import { ScrollerComponent } from './scroller.component'; import { GridStateService } from './grid-state.service'; import { GridHeaderCellComponent } from './grid-header-cell.component'; import { GridHeaderBandComponent } from './grid-header-band.component'; let GridHeaderComponent = class GridHeaderComponent extends BaseComponent { constructor(state, elementRef, renderer) { super(); this.state = state; this.elementRef = elementRef; this.renderer = renderer; this.resizeColumn = new EventEmitter(); this.toggleCheckColumn = new EventEmitter(); this._scrollerClientRect = null; this._touches = false; this._markerVisible = false; } resizeInProcess(value) { if (!this.gridHeaderTable) { return; } if (value) { this.gridHeaderTable.nativeElement.classList.add('true-resize-in-process'); } else { this.gridHeaderTable.nativeElement.classList.remove('true-resize-in-process'); } } dragInProcess(value) { if (!this.gridHeaderTable) { return; } if (value) { this.gridHeaderTable.nativeElement.classList.add('true-drag-in-process'); } else { this.gridHeaderTable.nativeElement.classList.remove('true-drag-in-process'); } } trackCol(i, c) { return c; } // get isAutoScroll() { if (this.scroller) { return this.scroller.isAutoScroll; } return false; } resizeMouseUp(e) { } toggleCheck(e, col) { this.toggleCheckColumn.emit(col); } headerCellMouseDown(e, col) { if (e.button != 0) { return; } const rr = e.target.getBoundingClientRect(); const xx = Math.round(e.clientX); if (xx < rr.left + rr.width / 2) { // На самом деле это не перетаскивание, а изменение ширины предыдущей колонки.. this.resizeMouseDownPrev(e, col); return; } if (xx > rr.left + rr.width / 2) { // На самом деле это не перетаскивание, а изменение ширины.. this.resizeMouseDown(e, col); return; } } captionTouchMove(e, col) { // e.stopPropagation(); const touches = e.changedTouches; if (touches.length === 1 && this.uiAction.target === col) { const xx = touches[0].clientX; const yy = touches[0].clientY; if (this.checkReordering(xx, yy)) { // Перемещение только инициализировано return; } if (this.uiAction.action === UIActionType.REORDER_COLUMN) { this.proceedReordering(xx, yy); } } } captionTouchEnd(e) { this.removeTouchMoveListeners(); if (this.scroller) { this.scroller.stopAutoScroll(); } if (!this.uiAction) { return; } if (this.uiAction && this.uiAction.action === UIActionType.REORDER_COLUMN) { this.stopReordering(); } e.stopPropagation(); if (e.cancelable) { e.preventDefault(); } } captionStartDrag(e, col) { if (col.isCheckbox) { return; } let xx; let yy; if (e.touches) { if (!e.changedTouches || e.changedTouches.length !== 1) { return; } xx = e.changedTouches[0].clientX; yy = e.changedTouches[0].clientY; this.removeTouchMoveListeners(); this.touchMoveListenFunc = this.renderer.listen(event.target, 'touchmove', (e) => { this.captionTouchMove(e, col); }); this.touchEndListenFunc = this.renderer.listen(event.target, 'touchend', (e) => { this.captionTouchEnd(e); }); this.touchCancelListenFunc = this.renderer.listen(event.target, 'touchcancel', (e) => { this.captionTouchEnd(e); }); } else { // Mouse event this.addDocumentMouseListeners(); if (e.button != 0) { return; } xx = e.clientX; yy = e.clientY; } let rr = e.target.parentElement.getBoundingClientRect(); this.uiAction = new UIAction(UIActionType.CLICK, col, xx, yy); this.uiAction.targetOffsetX = rr.left - xx; this.uiAction.targetOffsetY = rr.top - yy; e.stopPropagation(); } captionSort(e, col) { if (e.touches) { if (!e.changedTouches || e.changedTouches.length !== 1) { return; } } else { if (e.button != 0) { return; } } if (!this.uiAction) { return; } if (e.defaultPrevented) { return; } if (this.uiAction.target === col && this.uiAction.action === UIActionType.CLICK) { if (!col.isCheckbox && col.allowSorting) { this.state.sortByColumn(col, e.shiftKey); e.stopPropagation(); e.preventDefault(); } this.uiAction = null; } } resizeMouseDown(e, col) { if (col.canResize) { this.initResizing(e, col); } e.stopPropagation(); } resizeMouseDownPrev(e, col) { let realCol = null; const ii = this.layout.columns.indexOf(col); if (ii > 0) { realCol = this.layout.columns[ii - 1]; this.initResizing(e, realCol); } e.stopPropagation(); } showHeaderBtn(fieldName) { if (!this.columnElements) { return; } this.columnElements.forEach(el => { if (el.column.fieldName === fieldName) { el.setState('btn-visible'); } }); } hideHeaderBtns() { if (!this.columnElements) { return; } this.columnElements.forEach(el => el.removeState('btn-visible')); } get renderedColumns() { const renderedColumns = []; this.columnElements.forEach(el => { renderedColumns.push({ boundingRect: el.elementRef.nativeElement.getBoundingClientRect(), item: el.column }); }); return renderedColumns; } get renderedBands() { const renderedBands = []; this.bandElements.forEach(el => { renderedBands.push({ boundingRect: el.elementRef.nativeElement.getBoundingClientRect(), item: el.band }); }); return renderedBands; } /** * Проверка позиции при перетаскивании заголовка колонки или бэнда * @param mouseAction Позиция мыши * @param show Показывать ли маркер * @return [description] */ canDrop(mouseAction, show) { //Здесь нужен прямоугольник родителя.. if (!this._scrollerClientRect) this._scrollerClientRect = this.scroller.clientRect; let r0 = this._scrollerClientRect; let hasL = false; // имеется более левая составляющая заголовка let hasR = false; // имеется более правая составляющая if (this.layout.place === GridPart.CENTER) { r0 = this.scroller.headerRect; hasL = this.state.showFixedLeft; hasR = this.state.showFixedRight; } if (this.layout.place === GridPart.LEFT) { r0 = this.scroller.headerRectLeft; hasL = false; hasR = true; } if (this.layout.place === GridPart.RIGHT) { r0 = this.scroller.headerRectRight; hasL = true; hasR = false; } const tg = mouseAction.target; const isColumn = tg instanceof Column; const isBand = tg instanceof ColumnBand; let renderedItems; if (isColumn) { renderedItems = this.renderedColumns; } else { renderedItems = this.renderedBands; } return this.layout.canDrop(mouseAction, renderedItems, r0, hasL, hasR, this.state.columnCollection); } autoScrollX(dx) { if (this.uiAction) { this.uiAction.x -= dx; } } // Начинаем изменение ширины колонки initResizing(e, col) { if (this.state && !this.state.settings.columnResize) { return; } if (col.columnResize === false) { return; } this.addDocumentMouseListeners(); this.uiAction = new UIAction(UIActionType.RESIZE_COLUMN, col, e.clientX, e.clientY); } startResizing() { this.uiAction.initialized = true; this.scroller.startAutoScroll(); this.resizeColumn.emit({ action: 'start', ui: this.uiAction }); } initReordering(x, y) { this.uiAction.action = UIActionType.REORDER_COLUMN; let ww = this.uiAction.target.headerWidth; if (this.uiAction.target instanceof ColumnBand) { ww = 0; this.uiAction.target.columns.forEach(c => ww += c.displayedWidth); } if (ww > 300) { if (this.uiAction.targetOffsetX < -250) this.uiAction.targetOffsetX = -150; ww = 300; } this.uiAction.targetWidth = ww; this.uiAction.initialized = true; this.uiAction.move(x, y); this.state.dragDrop.drag(this.uiAction); } proceedReordering(xx, yy) { this.uiAction.move(xx, yy); this.state.dragDrop.drag(this.uiAction); } stopReordering() { setTimeout(() => { this.state.dragDrop.drop(this.uiAction); this.uiAction = null; }); } stopActions() { if (this.uiAction && this.uiAction.action === UIActionType.REORDER_COLUMN) { this.stopReordering(); } } /** * Проверка необходимости инициализации перестановки колонки * @param xx [description] * @param yy [description] * @return True, если перестановка колонки инициализирована. False - если * инициализация не нужна. */ checkReordering(xx, yy) { if (this.uiAction.action === UIActionType.CLICK && this.state.settings.columnReorder) { if (Math.abs(xx - this.uiAction.x) > 6 || Math.abs(yy - this.uiAction.y) > 6) { if (this.uiAction.target instanceof Column && this.uiAction.target.canReorder) { this.initReordering(xx, yy); return true; } if (this.uiAction.target instanceof ColumnBand && this.state.settings.bandReorder) { this.initReordering(xx, yy); return true; } } } return false; } documentMouseMove(e) { super.documentMouseMove(e); if (!this.uiAction) { // если что-то началось.. return; } const xx = e.clientX; const yy = e.clientY; if (this.checkReordering(xx, yy)) { return; } if (this.uiAction.action === UIActionType.REORDER_COLUMN) { this.proceedReordering(xx, yy); } if (!this.uiAction.initialized && this.uiAction.action === UIActionType.RESIZE_COLUMN && this.state.settings.columnResize) { this.startResizing(); return; } if (this.uiAction.action === UIActionType.RESIZE_COLUMN) { this.uiAction.move(xx, yy); this.resizeColumn.emit({ action: '', ui: this.uiAction }); } } documentMouseUp(e) { super.documentMouseUp(e); if (this.scroller) { this.scroller.stopAutoScroll(); } let xx = e.clientX; let yy = e.clientY; if (this.uiAction && this.uiAction.action === UIActionType.REORDER_COLUMN) { this.stopReordering(); e.stopPropagation(); e.preventDefault(); } if (this.uiAction && this.uiAction.action === UIActionType.RESIZE_COLUMN) { let x0 = this.uiAction.x0; let x1 = xx; let newWidth = this.uiAction.target.width + x1 - x0; if (newWidth < this.state.settings.minColumnWidthOnResize) { newWidth = this.state.settings.minColumnWidthOnResize; } this.state.resizeColumn(this.uiAction.target, newWidth); setTimeout(() => { this.resizeColumn.emit({ action: 'end', ui: this.uiAction }); this.scroller.fixScroll(); // Прокрутка может встать в неудобное положение. Чиним. this.uiAction = null; }); e.stopPropagation(); e.preventDefault(); } } }; tslib_1.__decorate([ Input('layout'), tslib_1.__metadata("design:type", GridLayout) ], GridHeaderComponent.prototype, "layout", void 0); tslib_1.__decorate([ Input('scroller'), tslib_1.__metadata("design:type", ScrollerComponent) ], GridHeaderComponent.prototype, "scroller", void 0); tslib_1.__decorate([ Output('resizeColumn'), tslib_1.__metadata("design:type", Object) ], GridHeaderComponent.prototype, "resizeColumn", void 0); tslib_1.__decorate([ Output('toggleCheckColumn'), tslib_1.__metadata("design:type", Object) ], GridHeaderComponent.prototype, "toggleCheckColumn", void 0); tslib_1.__decorate([ ViewChild('gridHeaderTable', { static: true }), tslib_1.__metadata("design:type", Object) ], GridHeaderComponent.prototype, "gridHeaderTable", void 0); tslib_1.__decorate([ ViewChild('dropMarker', { static: true }), tslib_1.__metadata("design:type", Object) ], GridHeaderComponent.prototype, "dropMarker", void 0); tslib_1.__decorate([ ViewChildren('headerCell', { read: GridHeaderCellComponent }), tslib_1.__metadata("design:type", QueryList) ], GridHeaderComponent.prototype, "columnElements", void 0); tslib_1.__decorate([ ViewChildren('headerBand', { read: GridHeaderBandComponent }), tslib_1.__metadata("design:type", QueryList) ], GridHeaderComponent.prototype, "bandElements", void 0); GridHeaderComponent = tslib_1.__decorate([ Component({ selector: 'true-grid-header', template: "<div #gridHeaderTable class=\"true-grid-header\"\r\n [ngClass]=\"state.settings.appearance.getHeaderClass()\">\r\n <table [style.width]=\"layout.headerWidth\">\r\n <colgroup>\r\n <col *ngFor=\"let c of layout.columns\" [style.width]=\"layout.displayedHeaderWidth(c)\" /> <!--layout.columnHeaderWidth(c)-->\r\n <col *ngIf=\"layout.isCenter\" class=\"true-grid-re\" [style.width]=\"state.st.hdWidth\" />\r\n </colgroup>\r\n <thead>\r\n <tr\r\n *ngIf=\"layout.bands.length > 0 && state.settings.showBands\"\r\n [style.height.px]=\"state.settings.rowHeight\">\r\n <td *ngFor=\"let b of layout.bands\"\r\n [attr.colspan]=\"b.columns.length\"\r\n class=\"band\">\r\n <true-grid-header-band\r\n [band]=\"b\"\r\n (bandTouchstart)=\"captionStartDrag($event, b)\"\r\n (mousedown)=\"captionStartDrag($event, b)\"\r\n #headerBand>\r\n </true-grid-header-band>\r\n </td>\r\n <td *ngIf=\"layout.isCenter\" style=\"border:0;\"></td>\r\n </tr>\r\n <tr>\r\n <td *ngFor=\"let c of layout.columns; trackBy: trackCol;\"\r\n [ngClass]=\"state.settings.headerCellClass(c)\"\r\n [style.height.px]=\"state.settings.rowHeight\"\r\n (mousedown)=\"headerCellMouseDown($event, c)\">\r\n <true-grid-header-cell #headerCell\r\n [column]=\"c\"\r\n (toggleCheckColumn)=\"toggleCheck($event, c)\"\r\n (captionTouchStart)=\"captionStartDrag($event, c)\"\r\n (captionMouseDown)=\"captionStartDrag($event, c)\"\r\n (captionMouseUp)=\"captionSort($event, c)\">\r\n </true-grid-header-cell>\r\n </td>\r\n <td *ngIf=\"layout.isCenter\" class=\"true-tt\" style=\"border:0;\"></td>\r\n </tr>\r\n </thead>\r\n </table>\r\n</div>\r\n", styles: [".true-grid-drag-item>table,.true-grid-header>table{box-sizing:border-box;table-layout:fixed;border-spacing:0;border-collapse:collapse;outline:0}td.true-column-resizable{cursor:ew-resize}td:not(.true-column-resizable){cursor:default}td:not(.true-column-resizable)+td.true-column-resizable{padding-left:0!important}::ng-deep .true-grid-header td:not(.true-column-resizable):not(.true-column-nobtn):not(.true-header-cell__checkbox){padding-right:0!important}::ng-deep .true-grid-header td:not(.true-column-resizable):not(.true-column-nobtn):not(.true-header-cell__checkbox) .true-header-cell{padding-right:0!important}"] }), tslib_1.__param(0, Inject('gridState')), tslib_1.__metadata("design:paramtypes", [GridStateService, ElementRef, Renderer2]) ], GridHeaderComponent); export { GridHeaderComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1oZWFkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRydWUtZGlyZWN0aXZlL2dyaWQvIiwic291cmNlcyI6WyJzcmMvZ3JpZC1oZWFkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztFQUlFO0FBQ0YsT0FBTyxFQUFZLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQzNELFNBQVMsRUFDVCxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUUsY0FBYztBQUNkLE9BQU8sRUFBYyxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTlELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQU92RSxJQUFhLG1CQUFtQixHQUFoQyxNQUFhLG1CQUFvQixTQUFRLGFBQWE7SUEwZHBELFlBQzhCLEtBQXVCLEVBQzNDLFVBQXNCLEVBQ3RCLFFBQW1CO1FBRXpCLEtBQUssRUFBRSxDQUFDO1FBSmtCLFVBQUssR0FBTCxLQUFLLENBQWtCO1FBQzND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MDE5IEFsZWtzZXkgTWVsbmlrb3YsIFRydWUgRGlyZWN0aXZlIENvbXBhbnkuXHJcbiAqIEBsaW5rIGh0dHBzOi8vdHJ1ZWRpcmVjdGl2ZS5jb20vXHJcbiAqIEBsaWNlbnNlIE1JVFxyXG4qL1xyXG5pbXBvcnQgeyBOZ01vZHVsZSwgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiwgT25EZXN0cm95LFxyXG4gICAgICAgICBSZW5kZXJlcjIsXHJcbiAgICAgICAgIEV2ZW50RW1pdHRlciwgUXVlcnlMaXN0LCBFbGVtZW50UmVmLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8vINCi0LXQv9C10YDRjCDQvdCw0YjQtVxyXG5pbXBvcnQgeyBDb2x1bW5UeXBlLCBHcmlkUGFydCB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgVUlBY3Rpb24sIFVJQWN0aW9uVHlwZSB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuXHJcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuaW1wb3J0IHsgQ29sdW1uQmFuZCB9IGZyb20gJ0B0cnVlLWRpcmVjdGl2ZS9iYXNlJztcclxuXHJcbiBpbXBvcnQgeyBHcmlkTGF5b3V0IH0gZnJvbSAnQHRydWUtZGlyZWN0aXZlL2Jhc2UnO1xyXG5cclxuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCB9IGZyb20gJy4vYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTY3JvbGxlckNvbXBvbmVudCB9IGZyb20gJy4vc2Nyb2xsZXIuY29tcG9uZW50JztcclxuXHJcbmltcG9ydCB7IEdyaWRTdGF0ZVNlcnZpY2UgfSBmcm9tICcuL2dyaWQtc3RhdGUuc2VydmljZSc7XHJcblxyXG5pbXBvcnQgeyBHcmlkSGVhZGVyQ2VsbENvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC1oZWFkZXItY2VsbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBHcmlkSGVhZGVyQmFuZENvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC1oZWFkZXItYmFuZC5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0cnVlLWdyaWQtaGVhZGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZ3JpZC1oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3N0eWxlcy9ncmlkLWhlYWRlci5iZWhhdmlvci5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEdyaWRIZWFkZXJDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcclxuXHJcbiAgQElucHV0KCdsYXlvdXQnKVxyXG4gIGxheW91dDogR3JpZExheW91dDtcclxuXHJcbiAgQElucHV0KCdzY3JvbGxlcicpXHJcbiAgc2Nyb2xsZXI6IFNjcm9sbGVyQ29tcG9uZW50O1xyXG5cclxuICBAT3V0cHV0KCdyZXNpemVDb2x1bW4nKVxyXG4gIHJlc2l6ZUNvbHVtbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBhY3Rpb246IHN0cmluZywgdWk6IFVJQWN0aW9uIH0+KCk7XHJcblxyXG4gIEBPdXRwdXQoJ3RvZ2dsZUNoZWNrQ29sdW1uJylcclxuICB0b2dnbGVDaGVja0NvbHVtbiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uPigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdncmlkSGVhZGVyVGFibGUnLCB7c3RhdGljOiB0cnVlfSlcclxuICBncmlkSGVhZGVyVGFibGU6IGFueTtcclxuXHJcbiAgLy8g0JzQsNGA0LrQtdGALCDRg9C60LDQt9GL0LLQsNGO0YnQuNC5INC90L7QstGD0Y4g0L/QvtC30LjRhtC40Y4g0L/QtdGA0LXRgtCw0YHQutC40LLQsNC10LzQvtCz0L4g0YHRgtC+0LvQsdGG0LBcclxuICBAVmlld0NoaWxkKCdkcm9wTWFya2VyJywge3N0YXRpYzogdHJ1ZX0pXHJcbiAgZHJvcE1hcmtlcjogYW55OyAgLy8g0J/QvtC60LAg0L3QtSDQuNGB0L/QvtC70YzQt9GD0LXRgtGB0Y8sINGCLtC6LiDQvNGLINC90LAg0LvQtdGC0YMg0L/QtdGA0LXRgdGC0LDQstC70Y/QtdC8INC60L7Qu9C+0L3QutGDINC/0YDQuCDQtNCy0LjQttC10L3QuNC4XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oJ2hlYWRlckNlbGwnLCB7cmVhZDogR3JpZEhlYWRlckNlbGxDb21wb25lbnR9KSBjb2x1bW5FbGVtZW50czogUXVlcnlMaXN0PEdyaWRIZWFkZXJDZWxsQ29tcG9uZW50PjtcclxuICBAVmlld0NoaWxkcmVuKCdoZWFkZXJCYW5kJywge3JlYWQ6IEdyaWRIZWFkZXJCYW5kQ29tcG9uZW50fSkgYmFuZEVsZW1lbnRzOiBRdWVyeUxpc3Q8R3JpZEhlYWRlckJhbmRDb21wb25lbnQ+O1xyXG5cclxuICBwcml2YXRlIF9zY3JvbGxlckNsaWVudFJlY3Q6IGFueSA9IG51bGw7XHJcblxyXG4gIF90b3VjaGVzID0gZmFsc2U7XHJcbiAgX21hcmtlclZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIHJlc2l6ZUluUHJvY2Vzcyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKCF0aGlzLmdyaWRIZWFkZXJUYWJsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZ3JpZEhlYWRlclRhYmxlLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndHJ1ZS1yZXNpemUtaW4tcHJvY2VzcycpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ncmlkSGVhZGVyVGFibGUubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd0cnVlLXJlc2l6ZS1pbi1wcm9jZXNzJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZHJhZ0luUHJvY2Vzcyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKCF0aGlzLmdyaWRIZWFkZXJUYWJsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZ3JpZEhlYWRlclRhYmxlLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndHJ1ZS1kcmFnLWluLXByb2Nlc3MnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZ3JpZEhlYWRlclRhYmxlLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndHJ1ZS1kcmFnLWluLXByb2Nlc3MnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0cmFja0NvbChpOiBudW1iZXIsIGM6IENvbHVtbikge1xyXG4gICAgcmV0dXJuIGM7XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIGdldCBpc0F1dG9TY3JvbGwoKSB7XHJcbiAgICBpZiAodGhpcy5zY3JvbGxlcikge1xyXG4gICAgICByZXR1cm4gdGhpcy5zY3JvbGxlci5pc0F1dG9TY3JvbGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICByZXNpemVNb3VzZVVwKGU6IGFueSkgeyB9XHJcblxyXG4gIHRvZ2dsZUNoZWNrKGU6IGFueSwgY29sOiBDb2x1bW4pIHtcclxuICAgIHRoaXMudG9nZ2xlQ2hlY2tDb2x1bW4uZW1pdChjb2wpO1xyXG4gIH1cclxuXHJcbiAgaGVhZGVyQ2VsbE1vdXNlRG93bihlOiBhbnksIGNvbDogQ29sdW1uKSB7XHJcbiAgICBpZiAoZS5idXR0b24gIT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcnIgPSBlLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHh4ID0gTWF0aC5yb3VuZChlLmNsaWVudFgpO1xyXG5cclxuICAgIGlmICh4eCA8IHJyLmxlZnQgKyByci53aWR0aCAvIDIpIHtcclxuICAgICAgLy8g0J3QsCDRgdCw0LzQvtC8INC00LXQu9C1INGN0YLQviDQvdC1INC/0LXRgNC10YLQsNGB0LrQuNCy0LDQvdC40LUsINCwINC40LfQvNC10L3QtdC90LjQtSDRiNC40YDQuNC90Ysg0L/RgNC10LTRi9C00YPRidC10Lkg0LrQvtC70L7QvdC60LguLlxyXG4gICAgICB0aGlzLnJlc2l6ZU1vdXNlRG93blByZXYoZSwgY29sKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh4eCA+IHJyLmxlZnQgKyByci53aWR0aCAvIDIpIHtcclxuICAgICAgLy8g0J3QsCDRgdCw0LzQvtC8INC00LXQu9C1INGN0YLQviDQvdC1INC/0LXRgNC10YLQsNGB0LrQuNCy0LDQvdC40LUsINCwINC40LfQvNC10L3QtdC90LjQtSDRiNC40YDQuNC90YsuLlxyXG4gICAgICB0aGlzLnJlc2l6ZU1vdXNlRG93bihlLCBjb2wpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYXB0aW9uVG91Y2hNb3ZlKGU6IGFueSwgY29sOiBDb2x1bW4pIHtcclxuICAgIC8vXHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIGNvbnN0IHRvdWNoZXMgPSBlLmNoYW5nZWRUb3VjaGVzO1xyXG4gICAgaWYgKHRvdWNoZXMubGVuZ3RoID09PSAxICYmIHRoaXMudWlBY3Rpb24udGFyZ2V0ID09PSBjb2wpIHtcclxuXHJcbiAgICAgIGNvbnN0IHh4ID0gdG91Y2hlc1swXS5jbGllbnRYO1xyXG4gICAgICBjb25zdCB5eSA9IHRvdWNoZXNbMF0uY2xpZW50WTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmNoZWNrUmVvcmRlcmluZyh4eCwgeXkpKSB7XHJcbiAgICAgICAgLy8g0J/QtdGA0LXQvNC10YnQtdC90LjQtSDRgtC+0LvRjNC60L4g0LjQvdC40YbQuNCw0LvQuNC30LjRgNC+0LLQsNC90L5cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnVpQWN0aW9uLmFjdGlvbiA9PT0gVUlBY3Rpb25UeXBlLlJFT1JERVJfQ09MVU1OKSB7XHJcbiAgICAgICAgdGhpcy5wcm9jZWVkUmVvcmRlcmluZyh4eCwgeXkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYXB0aW9uVG91Y2hFbmQoZTogYW55KSB7XHJcblxyXG4gICAgdGhpcy5yZW1vdmVUb3VjaE1vdmVMaXN0ZW5lcnMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5zY3JvbGxlcikge1xyXG4gICAgICB0aGlzLnNjcm9sbGVyLnN0b3BBdXRvU2Nyb2xsKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnVpQWN0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy51aUFjdGlvbiAmJiB0aGlzLnVpQWN0aW9uLmFjdGlvbiA9PT0gVUlBY3Rpb25UeXBlLlJFT1JERVJfQ09MVU1OKSB7XHJcbiAgICAgIHRoaXMuc3RvcFJlb3JkZXJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKGUuY2FuY2VsYWJsZSkge1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYXB0aW9uU3RhcnREcmFnKGU6IGFueSwgY29sOiBDb2x1bW4pIHtcclxuXHJcbiAgICBpZiAoY29sLmlzQ2hlY2tib3gpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB4eDogbnVtYmVyO1xyXG4gICAgbGV0IHl5OiBudW1iZXI7XHJcblxyXG4gICAgaWYgKGUudG91Y2hlcykge1xyXG4gICAgICBpZiAoIWUuY2hhbmdlZFRvdWNoZXMgfHwgZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggIT09IDEpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHh4ID0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYO1xyXG4gICAgICB5eSA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WTtcclxuXHJcbiAgICAgIHRoaXMucmVtb3ZlVG91Y2hNb3ZlTGlzdGVuZXJzKCk7XHJcbiAgICAgIHRoaXMudG91Y2hNb3ZlTGlzdGVuRnVuYyA9IHRoaXMucmVuZGVyZXIubGlzdGVuKGV2ZW50LnRhcmdldCwgJ3RvdWNobW92ZScsIChlOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmNhcHRpb25Ub3VjaE1vdmUoZSwgY29sKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudG91Y2hFbmRMaXN0ZW5GdW5jID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oZXZlbnQudGFyZ2V0LCAndG91Y2hlbmQnLCAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5jYXB0aW9uVG91Y2hFbmQoZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnRvdWNoQ2FuY2VsTGlzdGVuRnVuYyA9IHRoaXMucmVuZGVyZXIubGlzdGVuKGV2ZW50LnRhcmdldCwgJ3RvdWNoY2FuY2VsJywgKGU6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2FwdGlvblRvdWNoRW5kKGUpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBNb3VzZSBldmVudFxyXG4gICAgICB0aGlzLmFkZERvY3VtZW50TW91c2VMaXN0ZW5lcnMoKTtcclxuICAgICAgaWYgKGUuYnV0dG9uICE9IDApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHh4ID0gZS5jbGllbnRYO1xyXG4gICAgICB5eSA9IGUuY2xpZW50WTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcnIgPSBlLnRhcmdldC5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgIHRoaXMudWlBY3Rpb24gPSBuZXcgVUlBY3Rpb24oVUlBY3Rpb25UeXBlLkNMSUNLLCBjb2wsIHh4LCB5eSk7XHJcbiAgICB0aGlzLnVpQWN0aW9uLnRhcmdldE9mZnNldFggPSByci5sZWZ0IC0geHg7XHJcbiAgICB0aGlzLnVpQWN0aW9uLnRhcmdldE9mZnNldFkgPSByci50b3AgLSB5eTtcclxuXHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgY2FwdGlvblNvcnQoZTogYW55LCBjb2w6IENvbHVtbikge1xyXG5cclxuICAgIGlmIChlLnRvdWNoZXMpIHtcclxuICAgICAgaWYgKCFlLmNoYW5nZWRUb3VjaGVzIHx8IGUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoICE9PSAxKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoZS5idXR0b24gIT0gMCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy51aUFjdGlvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUuZGVmYXVsdFByZXZlbnRlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudWlBY3Rpb24udGFyZ2V0ID09PSBjb2wgJiYgdGhpcy51aUFjdGlvbi5hY3Rpb24gPT09IFVJQWN0aW9uVHlwZS5DTElDSykge1xyXG4gICAgICBpZiAoIWNvbC5pc0NoZWNrYm94ICYmIGNvbC5hbGxvd1NvcnRpbmcpIHtcclxuICAgICAgICB0aGlzLnN0YXRlLnNvcnRCeUNvbHVtbihjb2wsIGUuc2hpZnRLZXkpO1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudWlBY3Rpb24gPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzaXplTW91c2VEb3duKGU6IGFueSwgY29sOiBDb2x1bW4pIHtcclxuICAgIGlmIChjb2wuY2FuUmVzaXplKSB7XHJcbiAgICAgIHRoaXMuaW5pdFJlc2l6aW5nKGUsIGNvbCk7XHJcbiAgICB9XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgcmVzaXplTW91c2VEb3duUHJldihlOiBhbnksIGNvbDogQ29sdW1uKSB7XHJcbiAgICBsZXQgcmVhbENvbCA9IG51bGw7XHJcbiAgICBjb25zdCBpaSA9IHRoaXMubGF5b3V0LmNvbHVtbnMuaW5kZXhPZihjb2wpO1xyXG5cclxuICAgIGlmIChpaSA+IDApIHtcclxuICAgICAgcmVhbENvbCA9IHRoaXMubGF5b3V0LmNvbHVtbnNbaWkgLSAxXTtcclxuICAgICAgdGhpcy5pbml0UmVzaXppbmcoZSwgcmVhbENvbCk7XHJcbiAgICB9XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dIZWFkZXJCdG4oZmllbGROYW1lOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5jb2x1bW5FbGVtZW50cykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb2x1bW5FbGVtZW50cy5mb3JFYWNoKGVsID0+IHtcclxuICAgICAgaWYgKGVsLmNvbHVtbi5maWVsZE5hbWUgPT09IGZpZWxkTmFtZSkge1xyXG4gICAgICAgIGVsLnNldFN0YXRlKCdidG4tdmlzaWJsZScpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoaWRlSGVhZGVyQnRucygpIHtcclxuICAgIGlmICghdGhpcy5jb2x1bW5FbGVtZW50cykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbHVtbkVsZW1lbnRzLmZvckVhY2goZWwgPT4gZWwucmVtb3ZlU3RhdGUoJ2J0bi12aXNpYmxlJykpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgcmVuZGVyZWRDb2x1bW5zKCk6IGFueVtdIHtcclxuICAgIGNvbnN0IHJlbmRlcmVkQ29sdW1uczogYW55W10gPSBbXTtcclxuICAgIHRoaXMuY29sdW1uRWxlbWVudHMuZm9yRWFjaChlbCA9PiB7XHJcbiAgICAgIHJlbmRlcmVkQ29sdW1ucy5wdXNoKHsgYm91bmRpbmdSZWN0OiBlbC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW06IGVsLmNvbHVtbiB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlbmRlcmVkQ29sdW1ucztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IHJlbmRlcmVkQmFuZHMoKTogYW55W10ge1xyXG4gICAgY29uc3QgcmVuZGVyZWRCYW5kczogYW55W10gPSBbXTtcclxuICAgIHRoaXMuYmFuZEVsZW1lbnRzLmZvckVhY2goZWwgPT4ge1xyXG4gICAgICByZW5kZXJlZEJhbmRzLnB1c2goeyBib3VuZGluZ1JlY3Q6IGVsLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbTogZWwuYmFuZCB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlbmRlcmVkQmFuZHM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDQn9GA0L7QstC10YDQutCwINC/0L7Qt9C40YbQuNC4INC/0YDQuCDQv9C10YDQtdGC0LDRgdC60LjQstCw0L3QuNC4INC30LDQs9C+0LvQvtCy0LrQsCDQutC+0LvQvtC90LrQuCDQuNC70Lgg0LHRjdC90LTQsFxyXG4gICAqIEBwYXJhbSAgbW91c2VBY3Rpb24g0J/QvtC30LjRhtC40Y8g0LzRi9GI0LhcclxuICAgKiBAcGFyYW0gIHNob3cgICAgICAgINCf0L7QutCw0LfRi9Cy0LDRgtGMINC70Lgg0LzQsNGA0LrQtdGAXHJcbiAgICogQHJldHVybiAgICAgICAgICAgICBbZGVzY3JpcHRpb25dXHJcbiAgICovXHJcbiAgcHVibGljIGNhbkRyb3AobW91c2VBY3Rpb246IFVJQWN0aW9uLCBzaG93OiBib29sZWFuKTogeyBpbkNvbHVtbnM6IGJvb2xlYW4sIGl0ZW06IGFueSwgcG9zOiBzdHJpbmcsICB9IHtcclxuXHJcbiAgICAvL9CX0LTQtdGB0Ywg0L3Rg9C20LXQvSDQv9GA0Y/QvNC+0YPQs9C+0LvRjNC90LjQuiDRgNC+0LTQuNGC0LXQu9GPLi5cclxuICAgIGlmICghdGhpcy5fc2Nyb2xsZXJDbGllbnRSZWN0KVxyXG4gICAgICB0aGlzLl9zY3JvbGxlckNsaWVudFJlY3QgPSB0aGlzLnNjcm9sbGVyLmNsaWVudFJlY3Q7XHJcblxyXG4gICAgbGV0IHIwID0gdGhpcy5fc2Nyb2xsZXJDbGllbnRSZWN0O1xyXG5cclxuICAgIGxldCBoYXNMOiBib29sZWFuID0gZmFsc2U7IC8vINC40LzQtdC10YLRgdGPINCx0L7Qu9C10LUg0LvQtdCy0LDRjyDRgdC+0YHRgtCw0LLQu9GP0Y7RidCw0Y8g0LfQsNCz0L7Qu9C+0LLQutCwXHJcbiAgICBsZXQgaGFzUjogYm9vbGVhbiA9IGZhbHNlOyAvLyDQuNC80LXQtdGC0YHRjyDQsdC+0LvQtdC1INC/0YDQsNCy0LDRjyDRgdC+0YHRgtCw0LLQu9GP0Y7RidCw0Y9cclxuXHJcbiAgICBpZiAodGhpcy5sYXlvdXQucGxhY2UgPT09IEdyaWRQYXJ0LkNFTlRFUikge1xyXG4gICAgICByMCA9IHRoaXMuc2Nyb2xsZXIuaGVhZGVyUmVjdDtcclxuICAgICAgaGFzTCA9IHRoaXMuc3RhdGUuc2hvd0ZpeGVkTGVmdDtcclxuICAgICAgaGFzUiA9IHRoaXMuc3RhdGUuc2hvd0ZpeGVkUmlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubGF5b3V0LnBsYWNlID09PSBHcmlkUGFydC5MRUZUKSB7XHJcbiAgICAgIHIwID0gdGhpcy5zY3JvbGxlci5oZWFkZXJSZWN0TGVmdDtcclxuICAgICAgaGFzTCA9IGZhbHNlO1xyXG4gICAgICBoYXNSID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5sYXlvdXQucGxhY2UgPT09IEdyaWRQYXJ0LlJJR0hUKSB7XHJcbiAgICAgIHIwID0gdGhpcy5zY3JvbGxlci5oZWFkZXJSZWN0UmlnaHQ7XHJcbiAgICAgIGhhc0wgPSB0cnVlO1xyXG4gICAgICBoYXNSID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGcgPSBtb3VzZUFjdGlvbi50YXJnZXQ7XHJcblxyXG4gICAgY29uc3QgaXNDb2x1bW4gPSB0ZyBpbnN0YW5jZW9mIENvbHVtbjtcclxuICAgIGNvbnN0IGlzQmFuZCA9IHRnIGluc3RhbmNlb2YgQ29sdW1uQmFuZDtcclxuICAgIGxldCByZW5kZXJlZEl0ZW1zOiBhbnlbXTtcclxuXHJcbiAgICBpZiAoaXNDb2x1bW4pIHtcclxuICAgICAgcmVuZGVyZWRJdGVtcyA9IHRoaXMucmVuZGVyZWRDb2x1bW5zO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVuZGVyZWRJdGVtcyA9IHRoaXMucmVuZGVyZWRCYW5kcztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5sYXlvdXQuY2