ng-devui
Version:
DevUI components based on Angular
134 lines • 19.7 kB
JavaScript
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import * as i0 from "@angular/core";
export class SplitterService {
constructor() {
this.paneCount = 0;
this.paneChangeSubject = new Subject();
}
// 配置pane信息,panes列表,方向,容器大小,方便后续计算使用
configPane({ panes, orientation, containerSize }) {
this.panes = panes;
this.panes.forEach((pane, index) => {
pane.order = index * 2;
pane.orientation = orientation;
});
this.paneCount = this.panes.length;
this.containerSize = containerSize;
}
// 按下的时候计算pane的size信息
dragState(splitbarIndex) {
const prev = this.getPane(splitbarIndex);
const next = this.getPane(splitbarIndex + 1);
const 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大小
setSize(state, distance) {
const prev = this.getPane(state.prev.index);
const 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)大于最大值时取最大值
clamp(minSize, maxSize, initialSize) {
return Math.min(maxSize, Math.max(minSize, initialSize));
}
// resize pane的大小
resize(paneState, moveSize) {
const pane = this.getPane(paneState.index);
const splitterSize = this.containerSize();
const newSize = this.clamp(paneState.minSize, paneState.maxSize, paneState.initialSize + moveSize);
let size = '';
if (this.isPercent(pane.size)) {
size = (100 * newSize) / splitterSize + '%';
}
else {
size = newSize + 'px';
}
pane.size = size;
pane.sizeChange.emit(size);
}
// 判断pane是否可以调整大小,只要有一边设置了不可调整或者收起,相邻pane调整就失效
isResizable(splitBarIndex) {
const prevPane = this.getPane(splitBarIndex);
const nextPane = this.getPane(splitBarIndex + 1);
const paneCollapsed = prevPane.collapsed || nextPane.collapsed;
return prevPane.resizable && nextPane.resizable && !paneCollapsed;
}
// 判断分割条是否是固定的,只要有一边不能调整, 就是禁用状态固定bar
isStaticBar(splitBarIndex) {
const prevPane = this.getPane(splitBarIndex);
const nextPane = this.getPane(splitBarIndex + 1);
return !(prevPane.resizable && nextPane.resizable);
}
// 获取pane,防止没有初始化的时候调用内部方法取值
getPane(index) {
if (!this.panes || index < 0 || index >= this.panes.length) {
throw new Error('no pane can return.');
}
return this.panes[index];
}
getBar(index) {
if (!this.bars || index < 0 || index >= this.bars.length) {
return;
}
return this.bars[index];
}
// 判断是不是百分比设置宽度
isPercent(size) {
return /%$/.test(size);
}
// 计算时把百分比转换为像素
toPixels(size) {
// 值不满足转换时,result为NAN,方便计算最小、最大宽度判断
let result = parseFloat(size);
if (this.isPercent(size)) {
result = (this.containerSize() * result) / 100;
}
return result;
}
// 切换pane展开,收起
togglePane(paneIndex, nearPaneIndex, lockStatus) {
const pane = this.getPane(paneIndex);
const nearPane = this.getPane(nearPaneIndex);
if (pane.collapsible) {
pane._collapsed = lockStatus ? pane._collapsed : !pane._collapsed;
pane.toggleCollapseClass();
nearPane.toggleNearPaneFlexGrow(pane._collapsed);
pane.collapsedChange.emit(pane._collapsed);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SplitterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SplitterService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SplitterService, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXR0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RldnVpL3NwbGl0dGVyL3NwbGl0dGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUsvQixNQUFNLE9BQU8sZUFBZTtJQUQ1QjtRQUtFLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxzQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0tBZ0luQztJQS9IQyxvQ0FBb0M7SUFDcEMsVUFBVSxDQUFDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUU7UUFDOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztJQUNyQyxDQUFDO0lBRUQscUJBQXFCO0lBQ3JCLFNBQVMsQ0FBQyxhQUFhO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3BELE9BQU87WUFDTCxJQUFJLEVBQUU7Z0JBQ0osS0FBSyxFQUFFLGFBQWE7Z0JBQ3BCLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDOUIsd0RBQXdEO2dCQUN4RCxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2hGLCtEQUErRDtnQkFDL0QsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLO2FBQ3JGO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLEtBQUssRUFBRSxhQUFhLEdBQUcsQ0FBQztnQkFDeEIsV0FBVyxFQUFFLElBQUksQ0FBQyxZQUFZO2dCQUM5QixPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2hGLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSzthQUNyRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVztJQUNYLE9BQU8sQ0FBQyxLQUFLLEVBQUUsUUFBUTtRQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0IsK0JBQStCO1lBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsbUNBQW1DO1lBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7YUFBTSxDQUFDO1lBQ04sa0NBQWtDO1lBQ2xDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwQyxDQUFDO0lBQ0gsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsaUJBQWlCO0lBQ2pCLE1BQU0sQ0FBQyxTQUFTLEVBQUUsUUFBUTtRQUN4QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDMUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsQ0FBQztRQUNuRyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDOUIsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLFlBQVksR0FBRyxHQUFHLENBQUM7UUFDOUMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQztRQUN4QixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELDhDQUE4QztJQUM5QyxXQUFXLENBQUMsYUFBYTtRQUN2QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxTQUFTLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUMvRCxPQUFPLFFBQVEsQ0FBQyxTQUFTLElBQUksUUFBUSxDQUFDLFNBQVMsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUNwRSxDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLFdBQVcsQ0FBQyxhQUFhO1FBQ3ZCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDakQsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELDRCQUE0QjtJQUM1QixPQUFPLENBQUMsS0FBSztRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLO1FBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN6RCxPQUFPO1FBQ1QsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsZUFBZTtJQUNmLFNBQVMsQ0FBQyxJQUFJO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxlQUFlO0lBQ2YsUUFBUSxDQUFDLElBQUk7UUFDWCxtQ0FBbUM7UUFDbkMsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDakQsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxjQUFjO0lBQ2QsVUFBVSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsVUFBVztRQUM5QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0MsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNsRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixRQUFRLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQzsrR0FwSVUsZUFBZTttSEFBZixlQUFlOzs0RkFBZixlQUFlO2tCQUQzQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNwbGl0dGVyQmFyQ29tcG9uZW50IH0gZnJvbSAnLi9zcGxpdHRlci1iYXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU3BsaXR0ZXJQYW5lQ29tcG9uZW50IH0gZnJvbSAnLi9zcGxpdHRlci1wYW5lLmNvbXBvbmVudCc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBTcGxpdHRlclNlcnZpY2Uge1xyXG4gIHBhbmVzOiBTcGxpdHRlclBhbmVDb21wb25lbnRbXTtcclxuICBiYXJzOiBTcGxpdHRlckJhckNvbXBvbmVudFtdO1xyXG4gIHByaXZhdGUgY29udGFpbmVyU2l6ZTogRnVuY3Rpb247XHJcbiAgcGFuZUNvdW50ID0gMDtcclxuICBwYW5lQ2hhbmdlU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgLy8g6YWN572ucGFuZeS/oeaBr++8jHBhbmVz5YiX6KGo77yM5pa55ZCR77yM5a655Zmo5aSn5bCP77yM5pa55L6/5ZCO57ut6K6h566X5L2/55SoXHJcbiAgY29uZmlnUGFuZSh7IHBhbmVzLCBvcmllbnRhdGlvbiwgY29udGFpbmVyU2l6ZSB9KSB7XHJcbiAgICB0aGlzLnBhbmVzID0gcGFuZXM7XHJcbiAgICB0aGlzLnBhbmVzLmZvckVhY2goKHBhbmUsIGluZGV4KSA9PiB7XHJcbiAgICAgIHBhbmUub3JkZXIgPSBpbmRleCAqIDI7XHJcbiAgICAgIHBhbmUub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5wYW5lQ291bnQgPSB0aGlzLnBhbmVzLmxlbmd0aDtcclxuICAgIHRoaXMuY29udGFpbmVyU2l6ZSA9IGNvbnRhaW5lclNpemU7XHJcbiAgfVxyXG5cclxuICAvLyDmjInkuIvnmoTml7blgJnorqHnrpdwYW5l55qEc2l6ZeS/oeaBr1xyXG4gIGRyYWdTdGF0ZShzcGxpdGJhckluZGV4KSB7XHJcbiAgICBjb25zdCBwcmV2ID0gdGhpcy5nZXRQYW5lKHNwbGl0YmFySW5kZXgpO1xyXG4gICAgY29uc3QgbmV4dCA9IHRoaXMuZ2V0UGFuZShzcGxpdGJhckluZGV4ICsgMSk7XHJcbiAgICBjb25zdCB0b3RhbCA9IHByZXYuY29tcHV0ZWRTaXplICsgbmV4dC5jb21wdXRlZFNpemU7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwcmV2OiB7XHJcbiAgICAgICAgaW5kZXg6IHNwbGl0YmFySW5kZXgsXHJcbiAgICAgICAgaW5pdGlhbFNpemU6IHByZXYuY29tcHV0ZWRTaXplLFxyXG4gICAgICAgIC8vIOiuvue9ruacieacgOWwj+WAvO+8jOebtOaOpeWPluWAvO+8jOWmguaenOayoeacieiuvue9ruWwseeUqOS4pOS4qnBhbmXmgLvlkozlh4/ljrvnm7jpgrtwYW5l55qE5pyA5aSn5YC877yM6YO95rKh6K6+572u77yITkFO77yJ5Zyo5Y+WMFxyXG4gICAgICAgIG1pblNpemU6IHRoaXMudG9QaXhlbHMocHJldi5taW5TaXplKSB8fCB0b3RhbCAtIHRoaXMudG9QaXhlbHMobmV4dC5tYXhTaXplKSB8fCAwLFxyXG4gICAgICAgIC8vIOiuvue9ruacieacgOWkp+WAvO+8jOebtOaOpeWPluWAvO+8jOWmguaenOayoeacieiuvue9ruWwseeUqOS4pOS4qnBhbmXmgLvlkozlh4/ljrvnm7jpgrtwYW5l55qE5pyA5bCP5YC877yM6YO95rKh6K6+572u77yITkFO77yJ5Zyo5Y+W5Lik5LiqcGFuZeaAu+WSjFxyXG4gICAgICAgIG1heFNpemU6IHRoaXMudG9QaXhlbHMocHJldi5tYXhTaXplKSB8fCB0b3RhbCAtIHRoaXMudG9QaXhlbHMobmV4dC5taW5TaXplKSB8fCB0b3RhbCxcclxuICAgICAgfSxcclxuICAgICAgbmV4dDoge1xyXG4gICAgICAgIGluZGV4OiBzcGxpdGJhckluZGV4ICsgMSxcclxuICAgICAgICBpbml0aWFsU2l6ZTogbmV4dC5jb21wdXRlZFNpemUsXHJcbiAgICAgICAgbWluU2l6ZTogdGhpcy50b1BpeGVscyhuZXh0Lm1pblNpemUpIHx8IHRvdGFsIC0gdGhpcy50b1BpeGVscyhwcmV2Lm1heFNpemUpIHx8IDAsXHJcbiAgICAgICAgbWF4U2l6ZTogdGhpcy50b1BpeGVscyhuZXh0Lm1heFNpemUpIHx8IHRvdGFsIC0gdGhpcy50b1BpeGVscyhwcmV2Lm1pblNpemUpIHx8IHRvdGFsLFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIOiuvue9rnBhbmXlpKflsI9cclxuICBzZXRTaXplKHN0YXRlLCBkaXN0YW5jZSkge1xyXG4gICAgY29uc3QgcHJldiA9IHRoaXMuZ2V0UGFuZShzdGF0ZS5wcmV2LmluZGV4KTtcclxuICAgIGNvbnN0IG5leHQgPSB0aGlzLmdldFBhbmUoc3RhdGUubmV4dC5pbmRleCk7XHJcbiAgICBpZiAocHJldi5zaXplICYmIG5leHQuc2l6ZSkge1xyXG4gICAgICAvLyDnm7jpgrvnmoTkuKTkuKpwYW5l6YO95oyH5a6a5LqGc2l6Ze+8jOmcgOimgeWQjOaXtuS/ruaUuXNpemVcclxuICAgICAgdGhpcy5yZXNpemUoc3RhdGUucHJldiwgZGlzdGFuY2UpO1xyXG4gICAgICB0aGlzLnJlc2l6ZShzdGF0ZS5uZXh0LCAtZGlzdGFuY2UpO1xyXG4gICAgfSBlbHNlIGlmIChuZXh0LnNpemUpIHtcclxuICAgICAgLy8g5aaC5p6cIG5leHQgcGFuZe+8jOaMh+WumuS6hnNpemXlsLHkv67mlLluZXh0IHBhbmVcclxuICAgICAgdGhpcy5yZXNpemUoc3RhdGUubmV4dCwgLWRpc3RhbmNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIOacgOWQjuS4jeeuoXByZSBwYW5l77yM5pyJ5rKh5pyJ5oyH5a6a77yM6YO95L+u5pS5IHByZSBwYW5lXHJcbiAgICAgIHRoaXMucmVzaXplKHN0YXRlLnByZXYsIGRpc3RhbmNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOWkp+Wwj+mZkOWItuWHveaVsO+8jO+8iG1heO+8ieWwj+S6juacgOWwj+WAvOaXtuWPluacgOWwj+WAvO+8jCDvvIhtaW7vvInlpKfkuo7mnIDlpKflgLzml7blj5bmnIDlpKflgLxcclxuICBjbGFtcChtaW5TaXplLCBtYXhTaXplLCBpbml0aWFsU2l6ZSkge1xyXG4gICAgcmV0dXJuIE1hdGgubWluKG1heFNpemUsIE1hdGgubWF4KG1pblNpemUsIGluaXRpYWxTaXplKSk7XHJcbiAgfVxyXG5cclxuICAvLyByZXNpemUgcGFuZeeahOWkp+Wwj1xyXG4gIHJlc2l6ZShwYW5lU3RhdGUsIG1vdmVTaXplKSB7XHJcbiAgICBjb25zdCBwYW5lID0gdGhpcy5nZXRQYW5lKHBhbmVTdGF0ZS5pbmRleCk7XHJcbiAgICBjb25zdCBzcGxpdHRlclNpemUgPSB0aGlzLmNvbnRhaW5lclNpemUoKTtcclxuICAgIGNvbnN0IG5ld1NpemUgPSB0aGlzLmNsYW1wKHBhbmVTdGF0ZS5taW5TaXplLCBwYW5lU3RhdGUubWF4U2l6ZSwgcGFuZVN0YXRlLmluaXRpYWxTaXplICsgbW92ZVNpemUpO1xyXG4gICAgbGV0IHNpemUgPSAnJztcclxuICAgIGlmICh0aGlzLmlzUGVyY2VudChwYW5lLnNpemUpKSB7XHJcbiAgICAgIHNpemUgPSAoMTAwICogbmV3U2l6ZSkgLyBzcGxpdHRlclNpemUgKyAnJSc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzaXplID0gbmV3U2l6ZSArICdweCc7XHJcbiAgICB9XHJcbiAgICBwYW5lLnNpemUgPSBzaXplO1xyXG4gICAgcGFuZS5zaXplQ2hhbmdlLmVtaXQoc2l6ZSk7XHJcbiAgfVxyXG5cclxuICAvLyDliKTmlq1wYW5l5piv5ZCm5Y+v5Lul6LCD5pW05aSn5bCP77yM5Y+q6KaB5pyJ5LiA6L656K6+572u5LqG5LiN5Y+v6LCD5pW05oiW6ICF5pS26LW377yM55u46YK7cGFuZeiwg+aVtOWwseWkseaViFxyXG4gIGlzUmVzaXphYmxlKHNwbGl0QmFySW5kZXgpIHtcclxuICAgIGNvbnN0IHByZXZQYW5lID0gdGhpcy5nZXRQYW5lKHNwbGl0QmFySW5kZXgpO1xyXG4gICAgY29uc3QgbmV4dFBhbmUgPSB0aGlzLmdldFBhbmUoc3BsaXRCYXJJbmRleCArIDEpO1xyXG4gICAgY29uc3QgcGFuZUNvbGxhcHNlZCA9IHByZXZQYW5lLmNvbGxhcHNlZCB8fCBuZXh0UGFuZS5jb2xsYXBzZWQ7XHJcbiAgICByZXR1cm4gcHJldlBhbmUucmVzaXphYmxlICYmIG5leHRQYW5lLnJlc2l6YWJsZSAmJiAhcGFuZUNvbGxhcHNlZDtcclxuICB9XHJcblxyXG4gIC8vIOWIpOaWreWIhuWJsuadoeaYr+WQpuaYr+WbuuWumueahO+8jOWPquimgeacieS4gOi+ueS4jeiDveiwg+aVtCwg5bCx5piv56aB55So54q25oCB5Zu65a6aYmFyXHJcbiAgaXNTdGF0aWNCYXIoc3BsaXRCYXJJbmRleCkge1xyXG4gICAgY29uc3QgcHJldlBhbmUgPSB0aGlzLmdldFBhbmUoc3BsaXRCYXJJbmRleCk7XHJcbiAgICBjb25zdCBuZXh0UGFuZSA9IHRoaXMuZ2V0UGFuZShzcGxpdEJhckluZGV4ICsgMSk7XHJcbiAgICByZXR1cm4gIShwcmV2UGFuZS5yZXNpemFibGUgJiYgbmV4dFBhbmUucmVzaXphYmxlKTtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPlnBhbmXvvIzpmLLmraLmsqHmnInliJ3lp4vljJbnmoTml7blgJnosIPnlKjlhoXpg6jmlrnms5Xlj5blgLxcclxuICBnZXRQYW5lKGluZGV4KSB7XHJcbiAgICBpZiAoIXRoaXMucGFuZXMgfHwgaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucGFuZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm8gcGFuZSBjYW4gcmV0dXJuLicpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMucGFuZXNbaW5kZXhdO1xyXG4gIH1cclxuXHJcbiAgZ2V0QmFyKGluZGV4KSB7XHJcbiAgICBpZiAoIXRoaXMuYmFycyB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5iYXJzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5iYXJzW2luZGV4XTtcclxuICB9XHJcblxyXG4gIC8vIOWIpOaWreaYr+S4jeaYr+eZvuWIhuavlOiuvue9ruWuveW6plxyXG4gIGlzUGVyY2VudChzaXplKSB7XHJcbiAgICByZXR1cm4gLyUkLy50ZXN0KHNpemUpO1xyXG4gIH1cclxuXHJcbiAgLy8g6K6h566X5pe25oqK55m+5YiG5q+U6L2s5o2i5Li65YOP57SgXHJcbiAgdG9QaXhlbHMoc2l6ZSkge1xyXG4gICAgLy8g5YC85LiN5ruh6Laz6L2s5o2i5pe277yMcmVzdWx05Li6TkFO77yM5pa55L6/6K6h566X5pyA5bCP44CB5pyA5aSn5a695bqm5Yik5patXHJcbiAgICBsZXQgcmVzdWx0ID0gcGFyc2VGbG9hdChzaXplKTtcclxuICAgIGlmICh0aGlzLmlzUGVyY2VudChzaXplKSkge1xyXG4gICAgICByZXN1bHQgPSAodGhpcy5jb250YWluZXJTaXplKCkgKiByZXN1bHQpIC8gMTAwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vIOWIh+aNonBhbmXlsZXlvIDvvIzmlLbotbdcclxuICB0b2dnbGVQYW5lKHBhbmVJbmRleCwgbmVhclBhbmVJbmRleCwgbG9ja1N0YXR1cz8pIHtcclxuICAgIGNvbnN0IHBhbmUgPSB0aGlzLmdldFBhbmUocGFuZUluZGV4KTtcclxuICAgIGNvbnN0IG5lYXJQYW5lID0gdGhpcy5nZXRQYW5lKG5lYXJQYW5lSW5kZXgpO1xyXG4gICAgaWYgKHBhbmUuY29sbGFwc2libGUpIHtcclxuICAgICAgcGFuZS5fY29sbGFwc2VkID0gbG9ja1N0YXR1cyA/IHBhbmUuX2NvbGxhcHNlZCA6ICFwYW5lLl9jb2xsYXBzZWQ7XHJcbiAgICAgIHBhbmUudG9nZ2xlQ29sbGFwc2VDbGFzcygpO1xyXG4gICAgICBuZWFyUGFuZS50b2dnbGVOZWFyUGFuZUZsZXhHcm93KHBhbmUuX2NvbGxhcHNlZCk7XHJcbiAgICAgIHBhbmUuY29sbGFwc2VkQ2hhbmdlLmVtaXQocGFuZS5fY29sbGFwc2VkKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19