@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
295 lines • 23 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: splitter.service.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
var SplitterService = /** @class */ (function () {
function SplitterService() {
this.paneCount = 0;
}
// 配置pane信息,panes列表,方向,容器大小,方便后续计算使用
// 配置pane信息,panes列表,方向,容器大小,方便后续计算使用
/**
* @param {?} __0
* @return {?}
*/
SplitterService.prototype.configPane =
// 配置pane信息,panes列表,方向,容器大小,方便后续计算使用
/**
* @param {?} __0
* @return {?}
*/
function (_a) {
var panes = _a.panes, orientation = _a.orientation, containerSize = _a.containerSize;
this.panes = panes;
this.panes.forEach((/**
* @param {?} pane
* @param {?} index
* @return {?}
*/
function (pane, index) {
pane.order = index * 2;
pane.orientation = orientation;
}));
this.paneCount = this.panes.length;
this.containerSize = containerSize;
};
// 按下的时候计算pane的size信息
// 按下的时候计算pane的size信息
/**
* @param {?} splitbarIndex
* @return {?}
*/
SplitterService.prototype.dragState =
// 按下的时候计算pane的size信息
/**
* @param {?} splitbarIndex
* @return {?}
*/
function (splitbarIndex) {
/** @type {?} */
var prev = this.getPane(splitbarIndex);
/** @type {?} */
var next = this.getPane(splitbarIndex + 1);
/** @type {?} */
var total = prev.computedSize + next.computedSize;
return {
prev: {
index: splitbarIndex,
initialSize: prev.computedSize,
// 设置有最小值,直接取值,如果没有设置就用两个pane总和减去相邻pane的最大值,都没设置(NAN)在取0
minSize: this.toPixels(prev.minSize) || total - this.toPixels(next.maxSize) || 0,
// 设置有最大值,直接取值,如果没有设置就用两个pane总和减去相邻pane的最小值,都没设置(NAN)在取两个pane总和
maxSize: this.toPixels(prev.maxSize) || total - this.toPixels(next.minSize) || total
},
next: {
index: splitbarIndex + 1,
initialSize: next.computedSize,
minSize: this.toPixels(next.minSize) || total - this.toPixels(prev.maxSize) || 0,
maxSize: this.toPixels(next.maxSize) || total - this.toPixels(prev.minSize) || total
}
};
};
// 设置pane大小
// 设置pane大小
/**
* @param {?} state
* @param {?} distance
* @return {?}
*/
SplitterService.prototype.setSize =
// 设置pane大小
/**
* @param {?} state
* @param {?} distance
* @return {?}
*/
function (state, distance) {
/** @type {?} */
var prev = this.getPane(state.prev.index);
/** @type {?} */
var next = this.getPane(state.next.index);
if (prev.size && next.size) {
// 相邻的两个pane都指定了size,需要同时修改size
this.resize(state.prev, distance);
this.resize(state.next, -distance);
}
else if (next.size) {
// 如果 next pane,指定了size就修改next pane
this.resize(state.next, -distance);
}
else {
// 最后不管pre pane,有没有指定,都修改 pre pane
this.resize(state.prev, distance);
}
};
// 大小限制函数,(max)小于最小值时取最小值, (min)大于最大值时取最大值
// 大小限制函数,(max)小于最小值时取最小值, (min)大于最大值时取最大值
/**
* @param {?} minSize
* @param {?} maxSize
* @param {?} initialSize
* @return {?}
*/
SplitterService.prototype.clamp =
// 大小限制函数,(max)小于最小值时取最小值, (min)大于最大值时取最大值
/**
* @param {?} minSize
* @param {?} maxSize
* @param {?} initialSize
* @return {?}
*/
function (minSize, maxSize, initialSize) {
return Math.min(maxSize, Math.max(minSize, initialSize));
};
// resize pane的大小
// resize pane的大小
/**
* @param {?} paneState
* @param {?} moveSize
* @return {?}
*/
SplitterService.prototype.resize =
// resize pane的大小
/**
* @param {?} paneState
* @param {?} moveSize
* @return {?}
*/
function (paneState, moveSize) {
/** @type {?} */
var pane = this.getPane(paneState.index);
/** @type {?} */
var splitterSize = this.containerSize();
/** @type {?} */
var newSize = this.clamp(paneState.minSize, paneState.maxSize, paneState.initialSize + moveSize);
/** @type {?} */
var size = '';
if (this.isPercent(pane.size)) {
size = (100 * newSize / splitterSize) + '%';
}
else {
size = newSize + 'px';
}
pane.size = size;
pane.sizeChange.emit(size);
};
// 判断pane是否可以调整大小,只要有一边设置了不可调整或者收起,相邻pane调整就失效
// 判断pane是否可以调整大小,只要有一边设置了不可调整或者收起,相邻pane调整就失效
/**
* @param {?} splitBarIndex
* @return {?}
*/
SplitterService.prototype.isResizable =
// 判断pane是否可以调整大小,只要有一边设置了不可调整或者收起,相邻pane调整就失效
/**
* @param {?} splitBarIndex
* @return {?}
*/
function (splitBarIndex) {
/** @type {?} */
var prevPane = this.getPane(splitBarIndex);
/** @type {?} */
var nextPane = this.getPane(splitBarIndex + 1);
/** @type {?} */
var paneCollapsed = prevPane.collapsed || nextPane.collapsed;
return prevPane.resizable && nextPane.resizable && !paneCollapsed;
};
// 判断分割条是否是固定的,只要有一边不能调整, 就是禁用状态固定bar
// 判断分割条是否是固定的,只要有一边不能调整, 就是禁用状态固定bar
/**
* @param {?} splitBarIndex
* @return {?}
*/
SplitterService.prototype.isStaticBar =
// 判断分割条是否是固定的,只要有一边不能调整, 就是禁用状态固定bar
/**
* @param {?} splitBarIndex
* @return {?}
*/
function (splitBarIndex) {
/** @type {?} */
var prevPane = this.getPane(splitBarIndex);
/** @type {?} */
var nextPane = this.getPane(splitBarIndex + 1);
return !(prevPane.resizable && nextPane.resizable);
};
// 获取pane,防止没有初始化的时候调用内部方法取值
// 获取pane,防止没有初始化的时候调用内部方法取值
/**
* @param {?} index
* @return {?}
*/
SplitterService.prototype.getPane =
// 获取pane,防止没有初始化的时候调用内部方法取值
/**
* @param {?} index
* @return {?}
*/
function (index) {
if (!this.panes || index < 0 || index >= this.panes.length) {
throw new Error('no pane can return.');
}
return this.panes[index];
};
// 判断是不是百分比设置宽度
// 判断是不是百分比设置宽度
/**
* @param {?} size
* @return {?}
*/
SplitterService.prototype.isPercent =
// 判断是不是百分比设置宽度
/**
* @param {?} size
* @return {?}
*/
function (size) {
return /%$/.test(size);
};
// 计算时把百分比转换为像素
// 计算时把百分比转换为像素
/**
* @param {?} size
* @return {?}
*/
SplitterService.prototype.toPixels =
// 计算时把百分比转换为像素
/**
* @param {?} size
* @return {?}
*/
function (size) {
// 值不满足转换时,result为NAN,方便计算最小、最大宽度判断
/** @type {?} */
var result = parseFloat(size);
if (this.isPercent(size)) {
result = (this.containerSize() * result / 100);
}
return result;
};
// 切换pane展开,收起
// 切换pane展开,收起
/**
* @param {?} paneIndex
* @param {?} nearPaneIndex
* @return {?}
*/
SplitterService.prototype.togglePane =
// 切换pane展开,收起
/**
* @param {?} paneIndex
* @param {?} nearPaneIndex
* @return {?}
*/
function (paneIndex, nearPaneIndex) {
/** @type {?} */
var pane = this.getPane(paneIndex);
/** @type {?} */
var nearPane = this.getPane(nearPaneIndex);
if (pane.collapsible) {
pane.collapsed = !pane.collapsed;
pane.toggleCollapseClass();
nearPane.toggleNearPaneFlexGrow();
pane.collapsedChange.emit(pane.collapsed);
}
};
SplitterService.decorators = [
{ type: Injectable }
];
return SplitterService;
}());
export { SplitterService };
if (false) {
/** @type {?} */
SplitterService.prototype.panes;
/**
* @type {?}
* @private
*/
SplitterService.prototype.containerSize;
/** @type {?} */
SplitterService.prototype.paneCount;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXR0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL3NwbGl0dGVyLyIsInNvdXJjZXMiOlsic3BsaXR0ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0M7SUFBQTtRQUlFLGNBQVMsR0FBRyxDQUFDLENBQUM7SUEwSGhCLENBQUM7SUF4SEMsb0NBQW9DOzs7Ozs7SUFDcEMsb0NBQVU7Ozs7OztJQUFWLFVBQVcsRUFBbUM7WUFBbEMsZ0JBQUssRUFBRSw0QkFBVyxFQUFFLGdDQUFhO1FBQzNDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTzs7Ozs7UUFBQyxVQUFDLElBQUksRUFBRSxLQUFLO1lBQzdCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUNqQyxDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFDckMsQ0FBQztJQUVELHFCQUFxQjs7Ozs7O0lBQ3JCLG1DQUFTOzs7Ozs7SUFBVCxVQUFVLGFBQWE7O1lBQ2YsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDOztZQUNsQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDOztZQUN0QyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWTtRQUNuRCxPQUFPO1lBQ0gsSUFBSSxFQUFFO2dCQUNGLEtBQUssRUFBRSxhQUFhO2dCQUNwQixXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVk7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OztJQUNmLG1DQUFTOzs7Ozs7SUFBVCxVQUFVLElBQUk7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELGVBQWU7Ozs7OztJQUNmLGtDQUFROzs7Ozs7SUFBUixVQUFTLElBQUk7OztZQUVQLE1BQU0sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4QixNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1NBQ2hEO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELGNBQWM7Ozs7Ozs7SUFDZCxvQ0FBVTs7Ozs7OztJQUFWLFVBQVcsU0FBUyxFQUFFLGFBQWE7O1lBQzNCLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQzs7WUFDOUIsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQzVDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNqQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDN0M7SUFDSCxDQUFDOztnQkE3SEYsVUFBVTs7SUE4SFgsc0JBQUM7Q0FBQSxBQTlIRCxJQThIQztTQTdIWSxlQUFlOzs7SUFDMUIsZ0NBQW9DOzs7OztJQUNwQyx3Q0FBZ0M7O0lBQ2hDLG9DQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTcGxpdHRlclBhbmVDb21wb25lbnQgfSBmcm9tICcuL3NwbGl0dGVyLXBhbmUuY29tcG9uZW50JztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFNwbGl0dGVyU2VydmljZSB7XHJcbiAgcGFuZXM6IEFycmF5PFNwbGl0dGVyUGFuZUNvbXBvbmVudD47XHJcbiAgcHJpdmF0ZSBjb250YWluZXJTaXplOiBGdW5jdGlvbjtcclxuICBwYW5lQ291bnQgPSAwO1xyXG5cclxuICAvLyDphY3nva5wYW5l5L+h5oGv77yMcGFuZXPliJfooajvvIzmlrnlkJHvvIzlrrnlmajlpKflsI/vvIzmlrnkvr/lkI7nu63orqHnrpfkvb/nlKhcclxuICBjb25maWdQYW5lKHtwYW5lcywgb3JpZW50YXRpb24sIGNvbnRhaW5lclNpemV9KSB7XHJcbiAgICB0aGlzLnBhbmVzID0gcGFuZXM7XHJcbiAgICB0aGlzLnBhbmVzLmZvckVhY2goKHBhbmUsIGluZGV4KSA9PiB7XHJcbiAgICAgIHBhbmUub3JkZXIgPSBpbmRleCAqIDI7XHJcbiAgICAgIHBhbmUub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5wYW5lQ291bnQgPSB0aGlzLnBhbmVzLmxlbmd0aDtcclxuICAgIHRoaXMuY29udGFpbmVyU2l6ZSA9IGNvbnRhaW5lclNpemU7XHJcbiAgfVxyXG5cclxuICAvLyDmjInkuIvnmoTml7blgJnorqHnrpdwYW5l55qEc2l6ZeS/oeaBr1xyXG4gIGRyYWdTdGF0ZShzcGxpdGJhckluZGV4KSB7XHJcbiAgICBjb25zdCBwcmV2ID0gdGhpcy5nZXRQYW5lKHNwbGl0YmFySW5kZXgpO1xyXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuZ2V0UGFuZShzcGxpdGJhckluZGV4ICsgMSk7XHJcbiAgICBjb25zdCB0b3RhbCA9IHByZXYuY29tcHV0ZWRTaXplICsgbmV4dC5jb21wdXRlZFNpemU7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHByZXY6IHtcclxuICAgICAgICAgICAgaW5kZXg6IHNwbGl0YmFySW5kZXgsXHJcbiAgICAgICAgICAgIGluaXRpYWxTaXplOiBwcmV2LmNvbXB1dGVkU2l6ZSxcclxuICAgICAgICAgICAgLy8g6K6+572u5pyJ5pyA5bCP5YC877yM55u05o6l5Y+W5YC877yM5aaC5p6c5rKh5pyJ6K6+572u5bCx55So5Lik5LiqcGFuZeaAu+WSjOWHj+WOu+ebuOmCu3BhbmXnmoTmnIDlpKflgLzvvIzpg73msqHorr7nva7vvIhOQU7vvInlnKjlj5YwXHJcbiAgICAgICAgICAgIG1pblNpemU6IHRoaXMudG9QaXhlbHMocHJldi5taW5TaXplKSB8fCB0b3RhbCAtIHRoaXMudG9QaXhlbHMobmV4dC5tYXhTaXplKSB8fCAwLFxyXG4gICAgICAgICAgICAvLyDorr7nva7mnInmnIDlpKflgLzvvIznm7TmjqXlj5blgLzvvIzlpoLmnpzmsqHmnInorr7nva7lsLHnlKjkuKTkuKpwYW5l5oC75ZKM5YeP5Y6755u46YK7cGFuZeeahOacgOWwj+WAvO+8jOmDveayoeiuvue9ru+8iE5BTu+8ieWcqOWPluS4pOS4qnBhbmXmgLvlkoxcclxuICAgICAgICAgICAgbWF4U2l6ZTogdGhpcy50b1BpeGVscyhwcmV2Lm1heFNpemUpIHx8IHRvdGFsIC0gdGhpcy50b1BpeGVscyhuZXh0Lm1pblNpemUpIHx8IHRvdGFsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBuZXh0OiB7XHJcbiAgICAgICAgICAgIGluZGV4OiBzcGxpdGJhckluZGV4ICsgMSxcclxuICAgICAgICAgICAgaW5pdGlhbFNpemU6IG5leHQuY29tcHV0ZWRTaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplOiB0aGlzLnRvUGl4ZWxzKG5leHQubWluU2l6ZSkgfHwgdG90YWwgLSB0aGlzLnRvUGl4ZWxzKHByZXYubWF4U2l6ZSkgfHwgMCxcclxuICAgICAgICAgICAgbWF4U2l6ZTogdGhpcy50b1BpeGVscyhuZXh0Lm1heFNpemUpIHx8IHRvdGFsIC0gdGhpcy50b1BpeGVscyhwcmV2Lm1pblNpemUpIHx8IHRvdGFsXHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIOiuvue9rnBhbmXlpKflsI9cclxuICBzZXRTaXplKHN0YXRlLCBkaXN0YW5jZSkge1xyXG4gICAgY29uc3QgcHJldiA9IHRoaXMuZ2V0UGFuZShzdGF0ZS5wcmV2LmluZGV4KTtcclxuICAgIGNvbnN0IG5leHQgPSB0aGlzLmdldFBhbmUoc3RhdGUubmV4dC5pbmRleCk7XHJcbiAgICBpZiAocHJldi5zaXplICYmIG5leHQuc2l6ZSkge1xyXG4gICAgICAvLyDnm7jpgrvnmoTkuKTkuKpwYW5l6YO95oyH5a6a5LqGc2l6Ze+8jOmcgOimgeWQjOaXtuS/ruaUuXNpemVcclxuICAgICAgdGhpcy5yZXNpemUoc3RhdGUucHJldiwgZGlzdGFuY2UpO1xyXG4gICAgICB0aGlzLnJlc2l6ZShzdGF0ZS5uZXh0LCAtZGlzdGFuY2UpO1xyXG4gICAgfSBlbHNlIGlmIChuZXh0LnNpemUpIHtcclxuICAgICAgLy8g5aaC5p6cIG5leHQgcGFuZe+8jOaMh+WumuS6hnNpemXlsLHkv67mlLluZXh0IHBhbmVcclxuICAgICAgdGhpcy5yZXNpemUoc3RhdGUubmV4dCwgLWRpc3RhbmNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIOacgOWQjuS4jeeuoXByZSBwYW5l77yM5pyJ5rKh5pyJ5oyH5a6a77yM6YO95L+u5pS5IHByZSBwYW5lXHJcbiAgICAgIHRoaXMucmVzaXplKHN0YXRlLnByZXYsIGRpc3RhbmNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOWkp+Wwj+mZkOWItuWHveaVsO+8jO+8iG1heO+8ieWwj+S6juacgOWwj+WAvOaXtuWPluacgOWwj+WAvO+8jCDvvIhtaW7vvInlpKfkuo7mnIDlpKflgLzml7blj5bmnIDlpKflgLxcclxuICBjbGFtcChtaW5TaXplLCBtYXhTaXplLCBpbml0aWFsU2l6ZSkge1xyXG4gICAgcmV0dXJuIE1hdGgubWluKG1heFNpemUsIE1hdGgubWF4KG1pblNpemUsIGluaXRpYWxTaXplKSk7XHJcbiAgfVxyXG5cclxuICAvLyByZXNpemUgcGFuZeeahOWkp+Wwj1xyXG4gIHJlc2l6ZShwYW5lU3RhdGUsIG1vdmVTaXplKSB7XHJcbiAgICAgIGNvbnN0IHBhbmUgPSB0aGlzLmdldFBhbmUocGFuZVN0YXRlLmluZGV4KTtcclxuICAgICAgY29uc3Qgc3BsaXR0ZXJTaXplID0gdGhpcy5jb250YWluZXJTaXplKCk7XHJcbiAgICAgIGNvbnN0IG5ld1NpemUgPSB0aGlzLmNsYW1wKHBhbmVTdGF0ZS5taW5TaXplLCBwYW5lU3RhdGUubWF4U2l6ZSwgcGFuZVN0YXRlLmluaXRpYWxTaXplICsgbW92ZVNpemUpO1xyXG4gICAgICBsZXQgc2l6ZSA9ICcnO1xyXG4gICAgICBpZiAodGhpcy5pc1BlcmNlbnQocGFuZS5zaXplKSkge1xyXG4gICAgICAgICAgc2l6ZSA9ICgxMDAgKiBuZXdTaXplIC8gc3BsaXR0ZXJTaXplKSArICclJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHNpemUgPSBuZXdTaXplICsgJ3B4JztcclxuICAgICAgfVxyXG4gICAgICBwYW5lLnNpemUgPSBzaXplO1xyXG4gICAgICBwYW5lLnNpemVDaGFuZ2UuZW1pdChzaXplKTtcclxuICB9XHJcblxyXG4gIC8vIOWIpOaWrXBhbmXmmK/lkKblj6/ku6XosIPmlbTlpKflsI/vvIzlj6ropoHmnInkuIDovrnorr7nva7kuobkuI3lj6/osIPmlbTmiJbogIXmlLbotbfvvIznm7jpgrtwYW5l6LCD5pW05bCx5aSx5pWIXHJcbiAgaXNSZXNpemFibGUoc3BsaXRCYXJJbmRleCkge1xyXG4gICAgY29uc3QgcHJldlBhbmUgPSB0aGlzLmdldFBhbmUoc3BsaXRCYXJJbmRleCk7XHJcbiAgICBjb25zdCBuZXh0UGFuZSA9IHRoaXMuZ2V0UGFuZShzcGxpdEJhckluZGV4ICsgMSk7XHJcbiAgICBjb25zdCBwYW5lQ29sbGFwc2VkID0gcHJldlBhbmUuY29sbGFwc2VkIHx8IG5leHRQYW5lLmNvbGxhcHNlZDtcclxuICAgIHJldHVybiBwcmV2UGFuZS5yZXNpemFibGUgJiYgbmV4dFBhbmUucmVzaXphYmxlICYmICFwYW5lQ29sbGFwc2VkO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yik5pat5YiG5Ymy5p2h5piv5ZCm5piv5Zu65a6a55qE77yM5Y+q6KaB5pyJ5LiA6L655LiN6IO96LCD5pW0LCDlsLHmmK/npoHnlKjnirbmgIHlm7rlrppiYXJcclxuICBpc1N0YXRpY0JhcihzcGxpdEJhckluZGV4KSB7XHJcbiAgICBjb25zdCBwcmV2UGFuZSA9IHRoaXMuZ2V0UGFuZShzcGxpdEJhckluZGV4KTtcclxuICAgIGNvbnN0IG5leHRQYW5lID0gdGhpcy5nZXRQYW5lKHNwbGl0QmFySW5kZXggKyAxKTtcclxuICAgIHJldHVybiAhKHByZXZQYW5lLnJlc2l6YWJsZSAmJiBuZXh0UGFuZS5yZXNpemFibGUpO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+WcGFuZe+8jOmYsuatouayoeacieWIneWni+WMlueahOaXtuWAmeiwg+eUqOWGhemDqOaWueazleWPluWAvFxyXG4gIGdldFBhbmUoaW5kZXgpIHtcclxuICAgIGlmICghdGhpcy5wYW5lcyB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5wYW5lcy5sZW5ndGgpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBwYW5lIGNhbiByZXR1cm4uJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5wYW5lc1tpbmRleF07XHJcbiAgfVxyXG5cclxuICAvLyDliKTmlq3mmK/kuI3mmK/nmb7liIbmr5Torr7nva7lrr3luqZcclxuICBpc1BlcmNlbnQoc2l6ZSkge1xyXG4gICAgcmV0dXJuIC8lJC8udGVzdChzaXplKTtcclxuICB9XHJcblxyXG4gIC8vIOiuoeeul+aXtuaKiueZvuWIhuavlOi9rOaNouS4uuWDj+e0oFxyXG4gIHRvUGl4ZWxzKHNpemUpIHtcclxuICAgIC8vIOWAvOS4jea7oei2s+i9rOaNouaXtu+8jHJlc3VsdOS4uk5BTu+8jOaWueS+v+iuoeeul+acgOWwj+OAgeacgOWkp+WuveW6puWIpOaWrVxyXG4gICAgbGV0IHJlc3VsdCA9IHBhcnNlRmxvYXQoc2l6ZSk7XHJcbiAgICBpZiAodGhpcy5pc1BlcmNlbnQoc2l6ZSkpIHtcclxuICAgICAgcmVzdWx0ID0gKHRoaXMuY29udGFpbmVyU2l6ZSgpICogcmVzdWx0IC8gMTAwKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLyDliIfmjaJwYW5l5bGV5byA77yM5pS26LW3XHJcbiAgdG9nZ2xlUGFuZShwYW5lSW5kZXgsIG5lYXJQYW5lSW5kZXgpIHtcclxuICAgIGNvbnN0IHBhbmUgPSB0aGlzLmdldFBhbmUocGFuZUluZGV4KTtcclxuICAgIGNvbnN0IG5lYXJQYW5lID0gdGhpcy5nZXRQYW5lKG5lYXJQYW5lSW5kZXgpO1xyXG4gICAgaWYgKHBhbmUuY29sbGFwc2libGUpIHtcclxuICAgICAgICBwYW5lLmNvbGxhcHNlZCA9ICFwYW5lLmNvbGxhcHNlZDtcclxuICAgICAgICBwYW5lLnRvZ2dsZUNvbGxhcHNlQ2xhc3MoKTtcclxuICAgICAgICBuZWFyUGFuZS50b2dnbGVOZWFyUGFuZUZsZXhHcm93KCk7XHJcbiAgICAgICAgcGFuZS5jb2xsYXBzZWRDaGFuZ2UuZW1pdChwYW5lLmNvbGxhcHNlZCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==