dbweb-common
Version:
用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上
327 lines • 30.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @record
*/
export function ISelector() { }
if (false) {
/** @type {?} */
ISelector.prototype.show;
/** @type {?} */
ISelector.prototype.startX;
/** @type {?} */
ISelector.prototype.startY;
/** @type {?} */
ISelector.prototype.endX;
/** @type {?} */
ISelector.prototype.endY;
}
/**
* @record
*/
export function IPoint() { }
if (false) {
/** @type {?} */
IPoint.prototype.x;
/** @type {?} */
IPoint.prototype.y;
}
/** @type {?} */
export const noneSelector = { show: false, startX: -1, startY: -1, endX: -1, endY: -1 };
/** @type {?} */
export const nonePoint = { x: -1, y: -1 };
export class Selector {
/**
* @param {?} colIndex
* @param {?} rowIndex
* @return {?}
*/
cellSelector(colIndex, rowIndex) {
if (!this.selector.show) {
return false;
}
// 注意有反向选择
/** @type {?} */
const x = Math.max(1, Math.min(this.selector.startX, this.selector.endX));
/** @type {?} */
const x1 = Math.min(this.tabData.nativeElement.rows[0].cells.length - 1, Math.max(this.selector.startX, this.selector.endX));
/** @type {?} */
const y = Math.min(this.selector.startY, this.selector.endY);
/** @type {?} */
const y1 = Math.max(this.selector.startY, this.selector.endY);
return colIndex >= x && colIndex <= x1 && rowIndex >= y && rowIndex <= y1;
}
// 是否左边
/**
* @param {?} col
* @param {?} row
* @return {?}
*/
cellSelectorLeft(col, row) {
if (!this.selector.show) {
return false;
}
/** @type {?} */
const x = Math.min(this.selector.startX, this.selector.endX);
/** @type {?} */
const y = Math.min(this.selector.startY, this.selector.endY);
/** @type {?} */
const y1 = Math.max(this.selector.startY, this.selector.endY);
return col === x && row >= y && row <= y1;
}
// 是否下边
/**
* @param {?} col
* @param {?} row
* @return {?}
*/
cellSelectorBottom(col, row) {
if (!this.selector.show) {
return false;
}
/** @type {?} */
const x = Math.min(this.selector.startX, this.selector.endX);
/** @type {?} */
const x1 = Math.max(this.selector.startX, this.selector.endX);
/** @type {?} */
const y1 = Math.max(this.selector.startY, this.selector.endY);
return col >= x && col <= x1 && row === y1;
}
// 是否右边
/**
* @param {?} col
* @param {?} row
* @return {?}
*/
cellSelectorRight(col, row) {
if (!this.selector.show) {
return false;
}
/** @type {?} */
const x1 = Math.max(this.selector.startX, this.selector.endX);
/** @type {?} */
const y = Math.min(this.selector.startY, this.selector.endY);
/** @type {?} */
const y1 = Math.max(this.selector.startY, this.selector.endY);
return col === x1 && row >= y && row <= y1;
}
// 是否上边
/**
* @param {?} col
* @param {?} row
* @return {?}
*/
cellSelectorTop(col, row) {
if (!this.selector.show) {
return false;
}
/** @type {?} */
const x = Math.min(this.selector.startX, this.selector.endX);
/** @type {?} */
const x1 = Math.max(this.selector.startX, this.selector.endX);
/** @type {?} */
const y = Math.min(this.selector.startY, this.selector.endY);
return row === y && col >= x && col <= x1;
}
/**
* @param {?} event
* @param {?} colIndex
* @param {?} rowIndex
* @return {?}
*/
cellMouseDown(event, colIndex, rowIndex) {
if (event.button !== 0) {
return;
}
this.leftPressed = true;
this.selector.show = true;
this.selector.startX = colIndex;
this.selector.startY = rowIndex;
this.selector.endX = colIndex;
this.selector.endY = rowIndex;
// Add listeners
this.closeMouseDownListern = this.renderer.listen('window', 'mousemove', this.onMouseMove);
this.timer = setInterval((/**
* @return {?}
*/
() => {
if (this.leftPressed) {
this.scrollTable();
}
}), 20);
// event.preventDefault();
// event.stopPropagation();
}
/**
* @param {?} event
* @return {?}
*/
mouseUp(event) {
if (event.button === 0) {
this.leftPressed = false;
if (this.closeMouseDownListern) {
this.closeMouseDownListern();
}
if (this.timer) {
clearInterval(this.timer);
this.timer = null;
}
// event.preventDefault();
// event.stopPropagation();
}
}
/**
* @param {?} event
* @return {?}
*/
cellMouseEnter(event) {
this.current.x = ((/** @type {?} */ (event.target))).cellIndex;
this.current.y = ((/** @type {?} */ (((/** @type {?} */ (event.target))).parentElement))).rowIndex;
}
/**
* @param {?} event
* @return {?}
*/
onMouseMove(event) {
this.x = event.x;
this.y = event.y;
if (this.leftPressed) {
/** @type {?} */
const cell = cellFromPosition(this.tabData.nativeElement, event.x, event.y);
// 需要去掉第一列和最后一列
if (cell.columnIndex === 0) {
cell.columnIndex = 1;
}
if (cell.columnIndex === this.tabData.nativeElement.rows[0].cells.length - 1) {
cell.columnIndex = cell.columnIndex - 1;
}
// 需要去掉第一行
if (cell.rowIndex === 0) {
cell.rowIndex = 1;
}
if (cell) {
this.selector.endX = cell.columnIndex;
this.selector.endY = cell.rowIndex - 1; // 需要去掉标题行
}
this.scrollTable();
}
}
/**
* @return {?}
*/
scrollTable() {
// 元素在文档的位置x,y
const { left: xLeft, top: yTop, right: xRight, bottom: yBottom } = this.elRef.nativeElement.getBoundingClientRect();
// 判断鼠标是否到元素边界
if (this.y <= yTop) {
// 滚动条的位置
this.elRef.nativeElement.scrollTop -= yTop - this.y;
}
else if (this.y >= yBottom - 20) {
this.elRef.nativeElement.scrollTop += this.y - yBottom + 20;
}
if (this.x <= xLeft) {
this.elRef.nativeElement.scrollLeft -= xLeft - this.x;
}
else if (this.x >= xRight) {
this.elRef.nativeElement.scrollLeft += this.x - xRight;
}
}
}
if (false) {
/** @type {?} */
Selector.prototype.renderer;
/** @type {?} */
Selector.prototype.closeMouseDownListern;
/** @type {?} */
Selector.prototype.selector;
/** @type {?} */
Selector.prototype.leftPressed;
/** @type {?} */
Selector.prototype.x;
/** @type {?} */
Selector.prototype.y;
/** @type {?} */
Selector.prototype.current;
/** @type {?} */
Selector.prototype.timer;
/** @type {?} */
Selector.prototype.elRef;
/** @type {?} */
Selector.prototype.tabData;
}
/**
* @record
*/
function CellPosition() { }
if (false) {
/** @type {?} */
CellPosition.prototype.columnIndex;
/** @type {?} */
CellPosition.prototype.rowIndex;
/** @type {?} */
CellPosition.prototype.outter;
}
// 根据鼠标位置,返回一个单元格坐标,总是返回一个坐标,超出可视区域范围的,返回边界上的坐标
/**
* @param {?} ele
* @param {?} ox
* @param {?} oy
* @return {?}
*/
function cellFromPosition(ele, ox, oy) {
if (!ele || ele.rows.length === 0) {
return null;
}
const { left, top, bottom, right } = ele.getBoundingClientRect();
/** @type {?} */
let outter = false;
let [x, y] = [ox, oy];
// 超出可视区域,用边界代替
if (ox < left) {
outter = true;
x = left;
}
else if (ox > right) {
outter = true;
x = right;
}
if (oy < top) {
outter = true;
y = top;
}
else if (oy > bottom) {
outter = true;
y = bottom;
}
/** @type {?} */
let colIndex = ele.rows[0].cells.length - 1;
/** @type {?} */
let rowIndex = ele.rows.length - 1;
/** @type {?} */
let totalLeft = left;
/** @type {?} */
let totalTop = top;
// 表格必定会有一行,先确定列位置
for (let i = 0; i < ele.rows[0].cells.length; i++) {
totalLeft += ele.rows[0].cells[i].offsetWidth;
if (x < totalLeft) {
colIndex = i;
break;
}
}
for (let i = 0; i < ele.rows.length; i++) {
// 不用offsetheight,防止四舍五入引起累计偏差
/** @type {?} */
const rect = ele.rows[i].getBoundingClientRect();
totalTop += rect.height;
if (y < totalTop) {
rowIndex = i;
break;
}
}
return { columnIndex: colIndex, rowIndex: rowIndex, outter: outter };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9kYndlYi1jb21tb24vIiwic291cmNlcyI6WyJsaWIvcmVjb3JkLXZpZXcvdGFibGUvc2VsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBLCtCQU1DOzs7SUFMQSx5QkFBYzs7SUFDZCwyQkFBZTs7SUFDZiwyQkFBZTs7SUFDZix5QkFBYTs7SUFDYix5QkFBYTs7Ozs7QUFFZCw0QkFHQzs7O0lBRkEsbUJBQVU7O0lBQ1YsbUJBQVU7OztBQUVYLE1BQU0sT0FBTyxZQUFZLEdBQWMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRTs7QUFDbEcsTUFBTSxPQUFPLFNBQVMsR0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDakQsTUFBTSxPQUFPLFFBQVE7Ozs7OztJQVdwQixZQUFZLENBQUMsUUFBZ0IsRUFBRSxRQUFnQjtRQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDeEIsT0FBTyxLQUFLLENBQUM7U0FDYjs7O2NBRUssQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Y0FDbkUsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDbkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJ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LEdBQUcsU0FBUyxFQUFFO1lBQ2xCLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDYixNQUFNO1NBQ047S0FDRDtJQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7O2NBRW5DLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixFQUFFO1FBQ2hELFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLFFBQVEsRUFBRTtZQUNqQixRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsTUFBTTtTQUNOO0tBQ0Q7SUFDRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUN0RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRWxlbWVudFJlZiwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElTZWxlY3RvciB7XHJcblx0c2hvdzogYm9vbGVhbjtcclxuXHRzdGFydFg6IG51bWJlcjtcclxuXHRzdGFydFk6IG51bWJlcjtcclxuXHRlbmRYOiBudW1iZXI7XHJcblx0ZW5kWTogbnVtYmVyO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgSVBvaW50IHtcclxuXHR4OiBudW1iZXI7XHJcblx0eTogbnVtYmVyO1xyXG59XHJcbmV4cG9ydCBjb25zdCBub25lU2VsZWN0b3I6IElTZWxlY3RvciA9IHsgc2hvdzogZmFsc2UsIHN0YXJ0WDogLTEsIHN0YXJ0WTogLTEsIGVuZFg6IC0xLCBlbmRZOiAtMSB9O1xyXG5leHBvcnQgY29uc3Qgbm9uZVBvaW50OiBJUG9pbnQgPSB7IHg6IC0xLCB5OiAtMSB9O1xyXG5leHBvcnQgY2xhc3MgU2VsZWN0b3Ige1xyXG5cdHJlbmRlcmVyOiBSZW5kZXJlcjI7XHJcblx0Y2xvc2VNb3VzZURvd25MaXN0ZXJuOiAoKSA9PiB2b2lkO1xyXG5cdHNlbGVjdG9yOiBJU2VsZWN0b3I7XHJcblx0bGVmdFByZXNzZWQ6IGJvb2xlYW47XHJcblx0eDogbnVtYmVyO1xyXG5cdHk6IG51bWJlcjtcclxuXHRjdXJyZW50OiBJUG9pbnQ7XHJcblx0dGltZXI6IE5vZGVKUy5UaW1lcjtcclxuXHRlbFJlZjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblx0dGFiRGF0YTogRWxlbWVudFJlZjxIVE1MVGFibGVFbGVtZW50PjtcclxuXHRjZWxsU2VsZWN0b3IoY29sSW5kZXg6IG51bWJlciwgcm93SW5kZXg6IG51bWJlcikge1xyXG5cdFx0aWYgKCF0aGlzLnNlbGVjdG9yLnNob3cpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0Ly8g5rOo5oSP5pyJ5Y+N5ZCR6YCJ5oupXHJcblx0XHRjb25zdCB4ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4odGhpcy5zZWxlY3Rvci5zdGFydFgsIHRoaXMuc2VsZWN0b3IuZW5kWCkpO1xyXG5cdFx0Y29uc3QgeDEgPSBNYXRoLm1pbihcclxuXHRcdFx0dGhpcy50YWJEYXRhLm5hdGl2ZUVsZW1lbnQucm93c1swXS5jZWxscy5sZW5ndGggLSAxLFxyXG5cdFx0XHRNYXRoLm1heCh0aGlzLnNlbGVjdG9yLnN0YXJ0WCwgdGhpcy5zZWxlY3Rvci5lbmRYKVxyXG5cdFx0KTtcclxuXHRcdGNvbnN0IHkgPSBNYXRoLm1pbih0aGlzLnNlbGVjdG9yLnN0YXJ0WSwgdGhpcy5zZWxlY3Rvci5lbmRZKTtcclxuXHRcdGNvbnN0IHkxID0gTWF0aC5tYXgodGhpcy5zZWxlY3Rvci5zdGFydFksIHRoaXMuc2VsZWN0b3IuZW5kWSk7XHJcblx0XHRyZXR1cm4gY29sSW5kZXggPj0geCAmJiBjb2xJbmRleCA8PSB4MSAmJiByb3dJbmRleCA+PSB5ICYmIHJvd0luZGV4IDw9IHkxO1xyXG5cdH1cclxuXHQvLyDmmK/lkKblt6bovrlcclxuXHRjZWxsU2VsZWN0b3JMZWZ0KGNvbDogbnVtYmVyLCByb3c6IG51bWJlcikge1xyXG5cdFx0aWYgKCF0aGlzLnNlbGVjdG9yLnNob3cpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgeCA9IE1hdGgubWluKHRoaXMuc2VsZWN0b3Iuc3RhcnRYLCB0aGlzLnNlbGVjdG9yLmVuZFgpO1xyXG5cdFx0Y29uc3QgeSA9IE1hdGgubWluKHRoaXMuc2VsZWN0b3Iuc3RhcnRZLCB0aGlzLnNlbGVjdG9yLmVuZFkpO1xyXG5cdFx0Y29uc3QgeTEgPSBNYXRoLm1heCh0aGlzLnNlbGVjdG9yLnN0YXJ0WSwgdGhpcy5zZWxlY3Rvci5lbmRZKTtcclxuXHRcdHJldHVybiBjb2wgPT09IHggJiYgcm93ID49IHkgJiYgcm93IDw9IHkxO1xyXG5cdH1cclxuXHQvLyDmmK/lkKbkuIvovrlcclxuXHRjZWxsU2VsZWN0b3JCb3R0b20oY29sOiBudW1iZXIsIHJvdzogbnVtYmVyKSB7XHJcblx0XHRpZiAoIXRoaXMuc2VsZWN0b3Iuc2hvdykge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRjb25zdCB4ID0gTWF0aC5taW4odGhpcy5zZWxlY3Rvci5zdGFydFgsIHRoaXMuc2VsZWN0b3IuZW5kWCk7XHJcblx0XHRjb25zdCB4MSA9IE1hdGgubWF4KHRoaXMuc2VsZWN0b3Iuc3RhcnRYLCB0aGlzLnNlbGVjdG9yLmVuZFgpO1xyXG5cdFx0Y29uc3QgeTEgPSBNYXRoLm1heCh0aGlzLnNlbGVjdG9yLnN0YXJ0WSwgdGhpcy5zZWxlY3Rvci5lbmRZKTtcclxuXHRcdHJldHVybiBjb2wgPj0geCAmJiBjb2wgPD0geDEgJiYgcm93ID09PSB5MTtcclxuXHR9XHJcblx0Ly8g5piv5ZCm5Y+z6L65XHJcblx0Y2VsbFNlbGVjdG9yUmlnaHQoY29sOiBudW1iZXIsIHJvdzogbnVtYmVyKSB7XHJcblx0XHRpZiAoIXRoaXMuc2VsZWN0b3Iuc2hvdykge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblx0XHRjb25zdCB4MSA9IE1hdGgubWF4KHRoaXMuc2VsZWN0b3Iuc3RhcnRYLCB0aGlzLnNlbGVjdG9yLmVuZFgpO1xyXG5cdFx0Y29uc3QgeSA9IE1hdGgubWluKHRoaXMuc2VsZWN0b3Iuc3RhcnRZLCB0aGlzLnNlbGVjdG9yLmVuZFkpO1xyXG5cdFx0Y29uc3QgeTEgPSBNYXRoLm1heCh0aGlzLnNlbGVjdG9yLnN0YXJ0WSwgdGhpcy5zZWxlY3Rvci5lbmRZKTtcclxuXHRcdHJldHVybiBjb2wgPT09IHgxICYmIHJvdyA+PSB5ICYmIHJvdyA8PSB5MTtcclxuXHR9XHJcblx0Ly8g5piv5ZCm5LiK6L65XHJcblx0Y2VsbFNlbGVjdG9yVG9wKGNvbDogbnVtYmVyLCByb3c6IG51bWJlcikge1xyXG5cdFx0aWYgKCF0aGlzLnNlbGVjdG9yLnNob3cpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0Y29uc3QgeCA9IE1hdGgubWluKHRoaXMuc2VsZWN0b3Iuc3RhcnRYLCB0aGlzLnNlbGVjdG9yLmVuZFgpO1xyXG5cdFx0Y29uc3QgeDEgPSBNYXRoLm1heCh0aGlzLnNlbGVjdG9yLnN0YXJ0WCwgdGhpcy5zZWxlY3Rvci5lbmRYKTtcclxuXHRcdGNvbnN0IHkgPSBNYXRoLm1pbih0aGlzLnNlbGVjdG9yLnN0YXJ0WSwgdGhpcy5zZWxlY3Rvci5lbmRZKTtcclxuXHRcdHJldHVybiByb3cgPT09IHkgJiYgY29sID49IHggJiYgY29sIDw9IHgxO1xyXG5cdH1cclxuXHRjZWxsTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50LCBjb2xJbmRleDogbnVtYmVyLCByb3dJbmRleDogbnVtYmVyKSB7XHJcblx0XHRpZiAoZXZlbnQuYnV0dG9uICE9PSAwKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdHRoaXMubGVmdFByZXNzZWQgPSB0cnVlO1xyXG5cdFx0dGhpcy5zZWxlY3Rvci5zaG93ID0gdHJ1ZTtcclxuXHRcdHRoaXMuc2VsZWN0b3Iuc3RhcnRYID0gY29sSW5kZXg7XHJcblx0XHR0aGlzLnNlbGVjdG9yLnN0YXJ0WSA9IHJvd0luZGV4O1xyXG5cdFx0dGhpcy5zZWxlY3Rvci5lbmRYID0gY29sSW5kZXg7XHJcblx0XHR0aGlzLnNlbGVjdG9yLmVuZFkgPSByb3dJbmRleDtcclxuXHRcdC8vIEFkZCBsaXN0ZW5lcnNcclxuXHRcdHRoaXMuY2xvc2VNb3VzZURvd25MaXN0ZXJuID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcclxuXHRcdHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcblx0XHRcdGlmICh0aGlzLmxlZnRQcmVzc2VkKSB7XHJcblx0XHRcdFx0dGhpcy5zY3JvbGxUYWJsZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9LCAyMCk7XHJcblx0XHQvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0Ly8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0fVxyXG5cdG1vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHRcdGlmIChldmVudC5idXR0b24gPT09IDApIHtcclxuXHRcdFx0dGhpcy5sZWZ0UHJlc3NlZCA9IGZhbHNlO1xyXG5cdFx0XHRpZiAodGhpcy5jbG9zZU1vdXNlRG93bkxpc3Rlcm4pIHtcclxuXHRcdFx0XHR0aGlzLmNsb3NlTW91c2VEb3duTGlzdGVybigpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0aGlzLnRpbWVyKSB7XHJcblx0XHRcdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVyKTtcclxuXHRcdFx0XHR0aGlzLnRpbWVyID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHQvLyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdH1cclxuXHR9XHJcblx0Y2VsbE1vdXNlRW50ZXIoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuXHRcdHRoaXMuY3VycmVudC54ID0gKDxIVE1MVGFibGVDZWxsRWxlbWVudD5ldmVudC50YXJnZXQpLmNlbGxJbmRleDtcclxuXHRcdHRoaXMuY3VycmVudC55ID0gKDxIVE1MVGFibGVSb3dFbGVtZW50Pig8SFRNTFRhYmxlQ2VsbEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KS5wYXJlbnRFbGVtZW50KS5yb3dJbmRleDtcclxuXHR9XHJcblxyXG5cdG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcblx0XHR0aGlzLnggPSBldmVudC54O1xyXG5cdFx0dGhpcy55ID0gZXZlbnQueTtcclxuXHJcblx0XHRpZiAodGhpcy5sZWZ0UHJlc3NlZCkge1xyXG5cdFx0XHRjb25zdCBjZWxsID0gY2VsbEZyb21Qb3NpdGlvbih0aGlzLnRhYkRhdGEubmF0aXZlRWxlbWVudCwgZXZlbnQueCwgZXZlbnQueSk7XHJcblx0XHRcdC8vIOmcgOimgeWOu+aOieesrOS4gOWIl+WSjOacgOWQjuS4gOWIl1xyXG5cdFx0XHRpZiAoY2VsbC5jb2x1bW5JbmRleCA9PT0gMCkge1xyXG5cdFx0XHRcdGNlbGwuY29sdW1uSW5kZXggPSAxO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChjZWxsLmNvbHVtbkluZGV4ID09PSB0aGlzLnRhYkRhdGEubmF0aXZlRWxlbWVudC5yb3dzWzBdLmNlbGxzLmxlbmd0aCAtIDEpIHtcclxuXHRcdFx0XHRjZWxsLmNvbHVtbkluZGV4ID0gY2VsbC5jb2x1bW5JbmRleCAtIDE7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8g6ZyA6KaB5Y675o6J56ys5LiA6KGMXHJcblx0XHRcdGlmIChjZWxsLnJvd0luZGV4ID09PSAwKSB7XHJcblx0XHRcdFx0Y2VsbC5yb3dJbmRleCA9IDE7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGNlbGwpIHtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdG9yLmVuZFggPSBjZWxsLmNvbHVtbkluZGV4O1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0b3IuZW5kWSA9IGNlbGwucm93SW5kZXggLSAxOyAvLyDpnIDopoHljrvmjonmoIfpopjooYxcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLnNjcm9sbFRhYmxlKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdHNjcm9sbFRhYmxlKCkge1xyXG5cdFx0Ly8g5YWD57Sg5Zyo5paH5qGj55qE5L2N572ueCx5XHJcblx0XHRjb25zdCB7XHJcblx0XHRcdGxlZnQ6IHhMZWZ0LFxyXG5cdFx0XHR0b3A6IHlUb3AsXHJcblx0XHRcdHJpZ2h0OiB4UmlnaHQsXHJcblx0XHRcdGJvdHRvbTogeUJvdHRvbVxyXG5cdFx0fSA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHRcdC8vIOWIpOaWrem8oOagh+aYr+WQpuWIsOWFg+e0oOi+ueeVjFxyXG5cdFx0aWYgKHRoaXMueSA8PSB5VG9wKSB7XHJcblx0XHRcdC8vIOa7muWKqOadoeeahOS9jee9rlxyXG5cdFx0XHR0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wIC09IHlUb3AgLSB0aGlzLnk7XHJcblx0XHR9IGVsc2UgaWYgKHRoaXMueSA+PSB5Qm90dG9tIC0gMjApIHtcclxuXHRcdFx0dGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCArPSB0aGlzLnkgLSB5Qm90dG9tICsgMjA7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMueCA8PSB4TGVmdCkge1xyXG5cdFx0XHR0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCAtPSB4TGVmdCAtIHRoaXMueDtcclxuXHRcdH0gZWxzZSBpZiAodGhpcy54ID49IHhSaWdodCkge1xyXG5cdFx0XHR0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCArPSB0aGlzLnggLSB4UmlnaHQ7XHJcblx0XHR9XHJcblx0fVxyXG59XHJcbmludGVyZmFjZSBDZWxsUG9zaXRpb24ge1xyXG5cdGNvbHVtbkluZGV4OiBudW1iZXI7XHJcblx0cm93SW5kZXg6IG51bWJlcjtcclxuXHQvLyDmmK/lkKbotoXlh7rlj6/op4bojIPlm7RcclxuXHRvdXR0ZXI6IGJvb2xlYW47XHJcbn1cclxuLy8g5qC55o2u6byg5qCH5L2N572u77yM6L+U5Zue5LiA5Liq5Y2V5YWD5qC85Z2Q5qCH77yM5oC75piv6L+U5Zue5LiA5Liq5Z2Q5qCH77yM6LaF5Ye65Y+v6KeG5Yy65Z+f6IyD5Zu055qE77yM6L+U5Zue6L6555WM5LiK55qE5Z2Q5qCHXHJcbmZ1bmN0aW9uIGNlbGxGcm9tUG9zaXRpb24oZWxlOiBIVE1MVGFibGVFbGVtZW50LCBveDogbnVtYmVyLCBveTogbnVtYmVyKTogQ2VsbFBvc2l0aW9uIHtcclxuXHRpZiAoIWVsZSB8fCBlbGUucm93cy5sZW5ndGggPT09IDApIHtcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHRjb25zdCB7IGxlZnQsIHRvcCwgYm90dG9tLCByaWdodCB9ID0gZWxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdGxldCBvdXR0ZXIgPSBmYWxzZTtcclxuXHRsZXQgW3gsIHldID0gW294LCBveV07XHJcblx0Ly8g6LaF5Ye65Y+v6KeG5Yy65Z+f77yM55So6L6555WM5Luj5pu/XHJcblx0aWYgKG94IDwgbGVmdCkge1xyXG5cdFx0b3V0dGVyID0gdHJ1ZTtcclxuXHRcdHggPSBsZWZ0O1xyXG5cdH0gZWxzZSBpZiAob3ggPiByaWdodCkge1xyXG5cdFx0b3V0dGVyID0gdHJ1ZTtcclxuXHRcdHggPSByaWdodDtcclxuXHR9XHJcblx0aWYgKG95IDwgdG9wKSB7XHJcblx0XHRvdXR0ZXIgPSB0cnVlO1xyXG5cdFx0eSA9IHRvcDtcclxuXHR9IGVsc2UgaWYgKG95ID4gYm90dG9tKSB7XHJcblx0XHRvdXR0ZXIgPSB0cnVlO1xyXG5cdFx0eSA9IGJvdHRvbTtcclxuXHR9XHJcblx0bGV0IGNvbEluZGV4ID0gZWxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoIC0gMTtcclxuXHRsZXQgcm93SW5kZXggPSBlbGUucm93cy5sZW5ndGggLSAxO1xyXG5cdGxldCB0b3RhbExlZnQgPSBsZWZ0LFxyXG5cdFx0dG90YWxUb3AgPSB0b3A7XHJcblx0Ly8g6KGo5qC85b+F5a6a5Lya5pyJ5LiA6KGMLOWFiOehruWumuWIl+S9jee9rlxyXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgZWxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdHRvdGFsTGVmdCArPSBlbGUucm93c1swXS5jZWxsc1tpXS5vZmZzZXRXaWR0aDtcclxuXHRcdGlmICh4IDwgdG90YWxMZWZ0KSB7XHJcblx0XHRcdGNvbEluZGV4ID0gaTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0fVxyXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgZWxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuXHRcdC8vIOS4jeeUqG9mZnNldGhlaWdodO+8jOmYsuatouWbm+iIjeS6lOWFpeW8lei1t+e0r+iuoeWBj+W3rlxyXG5cdFx0Y29uc3QgcmVjdCA9IGVsZS5yb3dzW2ldLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdFx0dG90YWxUb3AgKz0gcmVjdC5oZWlnaHQ7XHJcblx0XHRpZiAoeSA8IHRvdGFsVG9wKSB7XHJcblx0XHRcdHJvd0luZGV4ID0gaTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiB7IGNvbHVtbkluZGV4OiBjb2xJbmRleCwgcm93SW5kZXg6IHJvd0luZGV4LCBvdXR0ZXI6IG91dHRlciB9O1xyXG59XHJcbiJdfQ==