255 lines
40 KiB
JavaScript
255 lines
40 KiB
JavaScript
import { GridsterUtils } from './gridsterUtils.service';
|
|
export class GridsterEmptyCell {
|
|
constructor(gridster) {
|
|
this.gridster = gridster;
|
|
this.emptyCellClickCb = (e) => {
|
|
if (!this.gridster ||
|
|
this.gridster.movingItem ||
|
|
GridsterUtils.checkContentClassForEmptyCellClickEvent(this.gridster, e)) {
|
|
return;
|
|
}
|
|
const item = this.getValidItemFromEvent(e);
|
|
if (!item) {
|
|
return;
|
|
}
|
|
if (this.gridster.options.emptyCellClickCallback) {
|
|
this.gridster.options.emptyCellClickCallback(e, item);
|
|
}
|
|
this.gridster.cdRef.markForCheck();
|
|
};
|
|
this.emptyCellContextMenuCb = (e) => {
|
|
if (this.gridster.movingItem ||
|
|
GridsterUtils.checkContentClassForEmptyCellClickEvent(this.gridster, e)) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
const item = this.getValidItemFromEvent(e);
|
|
if (!item) {
|
|
return;
|
|
}
|
|
if (this.gridster.options.emptyCellContextMenuCallback) {
|
|
this.gridster.options.emptyCellContextMenuCallback(e, item);
|
|
}
|
|
this.gridster.cdRef.markForCheck();
|
|
};
|
|
this.emptyCellDragDrop = (e) => {
|
|
const item = this.getValidItemFromEvent(e);
|
|
if (!item) {
|
|
return;
|
|
}
|
|
if (this.gridster.options.emptyCellDropCallback) {
|
|
this.gridster.options.emptyCellDropCallback(e, item);
|
|
}
|
|
this.gridster.cdRef.markForCheck();
|
|
};
|
|
this.emptyCellDragOver = (e) => {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
const item = this.getValidItemFromEvent(e);
|
|
if (item) {
|
|
if (e.dataTransfer) {
|
|
e.dataTransfer.dropEffect = 'move';
|
|
}
|
|
this.gridster.movingItem = item;
|
|
}
|
|
else {
|
|
if (e.dataTransfer) {
|
|
e.dataTransfer.dropEffect = 'none';
|
|
}
|
|
this.gridster.movingItem = null;
|
|
}
|
|
this.gridster.previewStyle();
|
|
};
|
|
this.emptyCellMouseDown = (e) => {
|
|
if (GridsterUtils.checkContentClassForEmptyCellClickEvent(this.gridster, e)) {
|
|
return;
|
|
}
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
const item = this.getValidItemFromEvent(e);
|
|
const leftMouseButtonCode = 1;
|
|
if (!item ||
|
|
(e.buttons !== leftMouseButtonCode && !(e instanceof TouchEvent))) {
|
|
return;
|
|
}
|
|
this.initialItem = item;
|
|
this.gridster.movingItem = item;
|
|
this.gridster.previewStyle();
|
|
this.gridster.zone.runOutsideAngular(() => {
|
|
this.removeWindowMousemoveListenerFn = this.gridster.renderer.listen('window', 'mousemove', this.emptyCellMouseMove);
|
|
this.removeWindowTouchmoveListenerFn = this.gridster.renderer.listen('window', 'touchmove', this.emptyCellMouseMove);
|
|
});
|
|
this.removeWindowMouseupListenerFn = this.gridster.renderer.listen('window', 'mouseup', this.emptyCellMouseUp);
|
|
this.removeWindowTouchendListenerFn = this.gridster.renderer.listen('window', 'touchend', this.emptyCellMouseUp);
|
|
};
|
|
this.emptyCellMouseMove = (e) => {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
const item = this.getValidItemFromEvent(e, this.initialItem);
|
|
if (!item) {
|
|
return;
|
|
}
|
|
this.gridster.movingItem = item;
|
|
this.gridster.previewStyle();
|
|
};
|
|
this.emptyCellMouseUp = (e) => {
|
|
this.removeWindowMousemoveListenerFn();
|
|
this.removeWindowTouchmoveListenerFn();
|
|
this.removeWindowMouseupListenerFn();
|
|
this.removeWindowTouchendListenerFn();
|
|
const item = this.getValidItemFromEvent(e, this.initialItem);
|
|
if (item) {
|
|
this.gridster.movingItem = item;
|
|
}
|
|
if (this.gridster.options.emptyCellDragCallback &&
|
|
this.gridster.movingItem) {
|
|
this.gridster.options.emptyCellDragCallback(e, this.gridster.movingItem);
|
|
}
|
|
setTimeout(() => {
|
|
this.initialItem = null;
|
|
if (this.gridster) {
|
|
this.gridster.movingItem = null;
|
|
this.gridster.previewStyle();
|
|
}
|
|
});
|
|
this.gridster.cdRef.markForCheck();
|
|
};
|
|
}
|
|
destroy() {
|
|
if (this.gridster.previewStyle) {
|
|
this.gridster.previewStyle();
|
|
}
|
|
this.gridster.movingItem = null;
|
|
this.initialItem = this.gridster = null;
|
|
if (this.removeDocumentDragendListenerFn) {
|
|
this.removeDocumentDragendListenerFn();
|
|
this.removeDocumentDragendListenerFn = null;
|
|
}
|
|
}
|
|
updateOptions() {
|
|
if (this.gridster.$options.enableEmptyCellClick &&
|
|
!this.removeEmptyCellClickListenerFn &&
|
|
this.gridster.options.emptyCellClickCallback) {
|
|
this.removeEmptyCellClickListenerFn = this.gridster.renderer.listen(this.gridster.el, 'click', this.emptyCellClickCb);
|
|
this.removeEmptyCellTouchendListenerFn = this.gridster.renderer.listen(this.gridster.el, 'touchend', this.emptyCellClickCb);
|
|
}
|
|
else if (!this.gridster.$options.enableEmptyCellClick &&
|
|
this.removeEmptyCellClickListenerFn &&
|
|
this.removeEmptyCellTouchendListenerFn) {
|
|
this.removeEmptyCellClickListenerFn();
|
|
this.removeEmptyCellTouchendListenerFn();
|
|
this.removeEmptyCellClickListenerFn = null;
|
|
this.removeEmptyCellTouchendListenerFn = null;
|
|
}
|
|
if (this.gridster.$options.enableEmptyCellContextMenu &&
|
|
!this.removeEmptyCellContextMenuListenerFn &&
|
|
this.gridster.options.emptyCellContextMenuCallback) {
|
|
this.removeEmptyCellContextMenuListenerFn = this.gridster.renderer.listen(this.gridster.el, 'contextmenu', this.emptyCellContextMenuCb);
|
|
}
|
|
else if (!this.gridster.$options.enableEmptyCellContextMenu &&
|
|
this.removeEmptyCellContextMenuListenerFn) {
|
|
this.removeEmptyCellContextMenuListenerFn();
|
|
this.removeEmptyCellContextMenuListenerFn = null;
|
|
}
|
|
if (this.gridster.$options.enableEmptyCellDrop &&
|
|
!this.removeEmptyCellDropListenerFn &&
|
|
this.gridster.options.emptyCellDropCallback) {
|
|
this.removeEmptyCellDropListenerFn = this.gridster.renderer.listen(this.gridster.el, 'drop', this.emptyCellDragDrop);
|
|
this.gridster.zone.runOutsideAngular(() => {
|
|
this.removeEmptyCellDragoverListenerFn = this.gridster.renderer.listen(this.gridster.el, 'dragover', this.emptyCellDragOver);
|
|
});
|
|
this.removeDocumentDragendListenerFn = this.gridster.renderer.listen('document', 'dragend', () => {
|
|
this.gridster.movingItem = null;
|
|
this.gridster.previewStyle();
|
|
});
|
|
}
|
|
else if (!this.gridster.$options.enableEmptyCellDrop &&
|
|
this.removeEmptyCellDropListenerFn &&
|
|
this.removeEmptyCellDragoverListenerFn &&
|
|
this.removeDocumentDragendListenerFn) {
|
|
this.removeEmptyCellDropListenerFn();
|
|
this.removeEmptyCellDragoverListenerFn();
|
|
this.removeDocumentDragendListenerFn();
|
|
this.removeEmptyCellDragoverListenerFn = null;
|
|
this.removeEmptyCellDropListenerFn = null;
|
|
this.removeDocumentDragendListenerFn = null;
|
|
}
|
|
if (this.gridster.$options.enableEmptyCellDrag &&
|
|
!this.removeEmptyCellMousedownListenerFn &&
|
|
this.gridster.options.emptyCellDragCallback) {
|
|
this.removeEmptyCellMousedownListenerFn = this.gridster.renderer.listen(this.gridster.el, 'mousedown', this.emptyCellMouseDown);
|
|
this.removeEmptyCellTouchstartListenerFn = this.gridster.renderer.listen(this.gridster.el, 'touchstart', this.emptyCellMouseDown);
|
|
}
|
|
else if (!this.gridster.$options.enableEmptyCellDrag &&
|
|
this.removeEmptyCellMousedownListenerFn &&
|
|
this.removeEmptyCellTouchstartListenerFn) {
|
|
this.removeEmptyCellMousedownListenerFn();
|
|
this.removeEmptyCellTouchstartListenerFn();
|
|
this.removeEmptyCellMousedownListenerFn = null;
|
|
this.removeEmptyCellTouchstartListenerFn = null;
|
|
}
|
|
}
|
|
getPixelsX(e, rect) {
|
|
const scale = this.gridster.options.scale;
|
|
if (scale) {
|
|
return ((e.clientX - rect.left) / scale +
|
|
this.gridster.el.scrollLeft -
|
|
this.gridster.gridRenderer.getLeftMargin());
|
|
}
|
|
return (e.clientX +
|
|
this.gridster.el.scrollLeft -
|
|
rect.left -
|
|
this.gridster.gridRenderer.getLeftMargin());
|
|
}
|
|
getPixelsY(e, rect) {
|
|
const scale = this.gridster.options.scale;
|
|
if (scale) {
|
|
return ((e.clientY - rect.top) / scale +
|
|
this.gridster.el.scrollTop -
|
|
this.gridster.gridRenderer.getTopMargin());
|
|
}
|
|
return (e.clientY +
|
|
this.gridster.el.scrollTop -
|
|
rect.top -
|
|
this.gridster.gridRenderer.getTopMargin());
|
|
}
|
|
getValidItemFromEvent(e, oldItem) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
GridsterUtils.checkTouchEvent(e);
|
|
const rect = this.gridster.el.getBoundingClientRect();
|
|
const x = this.getPixelsX(e, rect);
|
|
const y = this.getPixelsY(e, rect);
|
|
const item = {
|
|
x: this.gridster.pixelsToPositionX(x, Math.floor, true),
|
|
y: this.gridster.pixelsToPositionY(y, Math.floor, true),
|
|
cols: this.gridster.$options.defaultItemCols,
|
|
rows: this.gridster.$options.defaultItemRows
|
|
};
|
|
if (oldItem) {
|
|
item.cols = Math.min(Math.abs(oldItem.x - item.x) + 1, this.gridster.$options.emptyCellDragMaxCols);
|
|
item.rows = Math.min(Math.abs(oldItem.y - item.y) + 1, this.gridster.$options.emptyCellDragMaxRows);
|
|
if (oldItem.x < item.x) {
|
|
item.x = oldItem.x;
|
|
}
|
|
else if (oldItem.x - item.x >
|
|
this.gridster.$options.emptyCellDragMaxCols - 1) {
|
|
item.x = this.gridster.movingItem ? this.gridster.movingItem.x : 0;
|
|
}
|
|
if (oldItem.y < item.y) {
|
|
item.y = oldItem.y;
|
|
}
|
|
else if (oldItem.y - item.y >
|
|
this.gridster.$options.emptyCellDragMaxRows - 1) {
|
|
item.y = this.gridster.movingItem ? this.gridster.movingItem.y : 0;
|
|
}
|
|
}
|
|
if (!this.gridster.$options.enableOccupiedCellDrop &&
|
|
this.gridster.checkCollision(item)) {
|
|
return;
|
|
}
|
|
return item;
|
|
}
|
|
}
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXJFbXB0eUNlbGwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZ3JpZHN0ZXIyL3NyYy9saWIvZ3JpZHN0ZXJFbXB0eUNlbGwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJeEQsTUFBTSxPQUFPLGlCQUFpQjtJQWU1QixZQUFvQixRQUFvQztRQUFwQyxhQUFRLEdBQVIsUUFBUSxDQUE0QjtRQTBIeEQscUJBQWdCLEdBQUcsQ0FBQyxDQUFhLEVBQVEsRUFBRTtZQUN6QyxJQUNFLENBQUMsSUFBSSxDQUFDLFFBQVE7Z0JBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVO2dCQUN4QixhQUFhLENBQUMsdUNBQXVDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFDdkU7Z0JBQ0EsT0FBTzthQUNSO1lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1QsT0FBTzthQUNSO1lBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRTtnQkFDaEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ3ZEO1lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDckMsQ0FBQyxDQUFDO1FBRUYsMkJBQXNCLEdBQUcsQ0FBQyxDQUFhLEVBQVEsRUFBRTtZQUMvQyxJQUNFLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVTtnQkFDeEIsYUFBYSxDQUFDLHVDQUF1QyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFD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QUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEU7U0FDRjtRQUNELElBQ0UsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0I7WUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQ2xDO1lBQ0EsT0FBTztTQUNSO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHcmlkc3RlclV0aWxzIH0gZnJvbSAnLi9ncmlkc3RlclV0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JpZHN0ZXJDb21wb25lbnRJbnRlcmZhY2UgfSBmcm9tICcuL2dyaWRzdGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBHcmlkc3Rlckl0ZW0gfSBmcm9tICcuL2dyaWRzdGVySXRlbS5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgR3JpZHN0ZXJFbXB0eUNlbGwge1xuICBpbml0aWFsSXRlbTogR3JpZHN0ZXJJdGVtIHwgbnVsbDtcbiAgcmVtb3ZlRW1wdHlDZWxsQ2xpY2tMaXN0ZW5lckZuOiAoKCkgPT4gdm9pZCkgfCBudWxsO1xuICByZW1vdmVFbXB0eUNlbGxUb3VjaGVuZExpc3RlbmVyRm46ICgoKSA9PiB2b2lkKSB8IG51bGw7XG4gIHJlbW92ZUVtcHR5Q2VsbENvbnRleHRNZW51TGlzdGVuZXJGbjogKCgpID0+IHZvaWQpIHwgbnVsbDtcbiAgcmVtb3ZlRW1wdHlDZWxsRHJvcExpc3RlbmVyRm46ICgoKSA9PiB2b2lkKSB8IG51bGw7XG4gIHJlbW92ZUVtcHR5Q2VsbE1vdXNlZG93bkxpc3RlbmVyRm46ICgoKSA9PiB2b2lkKSB8IG51bGw7XG4gIHJlbW92ZUVtcHR5Q2VsbFRvdWNoc3RhcnRMaXN0ZW5lckZuOiAoKCkgPT4gdm9pZCkgfCBudWxsO1xuICByZW1vdmVXaW5kb3dNb3VzZW1vdmVMaXN0ZW5lckZuOiAoKSA9PiB2b2lkO1xuICByZW1vdmVXaW5kb3dUb3VjaG1vdmVMaXN0ZW5lckZuOiAoKSA9PiB2b2lkO1xuICByZW1vdmVXaW5kb3dNb3VzZXVwTGlzdGVuZXJGbjogKCkgPT4gdm9pZDtcbiAgcmVtb3ZlV2luZG93VG91Y2hlbmRMaXN0ZW5lckZuOiAoKSA9PiB2b2lkO1xuICByZW1vdmVFbXB0eUNlbGxEcmFnb3Zlckxpc3RlbmVyRm46ICgoKSA9PiB2b2lkKSB8IG51bGw7XG4gIHJlbW92ZURvY3VtZW50RHJhZ2VuZExpc3RlbmVyRm46ICgoKSA9PiB2b2lkKSB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBncmlkc3RlcjogR3JpZHN0ZXJDb21wb25lbnRJbnRlcmZhY2UpIHt9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ncmlkc3Rlci5wcmV2aWV3U3R5bGUpIHtcbiAgICAgIHRoaXMuZ3JpZHN0ZXIucHJldmlld1N0eWxlKCk7XG4gICAgfVxuICAgIHRoaXMuZ3JpZHN0ZXIubW92aW5nSXRlbSA9IG51bGw7XG4gICAgdGhpcy5pbml0aWFsSXRlbSA9IHRoaXMuZ3JpZHN0ZXIgPSBudWxsITtcbiAgICBpZiAodGhpcy5yZW1vdmVEb2N1bWVudERyYWdlbmRMaXN0ZW5lckZuKSB7XG4gICAgICB0aGlzLnJlbW92ZURvY3VtZW50RHJhZ2VuZExpc3RlbmVyRm4oKTtcbiAgICAgIHRoaXMucmVtb3ZlRG9jdW1lbnREcmFnZW5kTGlzdGVuZXJGbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlT3B0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmVuYWJsZUVtcHR5Q2VsbENsaWNrICYmXG4gICAgICAhdGhpcy5yZW1vdmVFbXB0eUNlbGxDbGlja0xpc3RlbmVyRm4gJiZcbiAgICAgIHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5lbXB0eUNlbGxDbGlja0NhbGxiYWNrXG4gICAgKSB7XG4gICAgICB0aGlzLnJlbW92ZUVtcHR5Q2VsbENsaWNrTGlzdGVuZXJGbiA9IHRoaXMuZ3JpZHN0ZXIucmVuZGVyZXIubGlzdGVuKFxuICAgICAgICB0aGlzLmdyaWRzdGVyLmVsLFxuICAgICAgICAnY2xpY2snLFxuICAgICAgICB0aGlzLmVtcHR5Q2VsbENsaWNrQ2JcbiAgICAgICk7XG4gICAgICB0aGlzLnJlbW92ZUVtcHR5Q2VsbFRvdWNoZW5kTGlzdGVuZXJGbiA9IHRoaXMuZ3JpZHN0ZXIucmVuZGVyZXIubGlzdGVuKFxuICAgICAgICB0aGlzLmdyaWRzdGVyLmVsLFxuICAgICAgICAndG91Y2hlbmQnLFxuICAgICAgICB0aGlzLmVtcHR5Q2VsbENsaWNrQ2JcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICF0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmVuYWJsZUVtcHR5Q2VsbENsaWNrICYmXG4gICAgICB0aGlzLnJlbW92ZUVtcHR5Q2VsbENsaWNrTGlzdGVuZXJGbiAmJlxuICAgICAgdGhpcy5yZW1vdmVFbXB0eUNlbGxUb3VjaGVuZExpc3RlbmVyRm5cbiAgICApIHtcbiAgICAgIHRoaXMucmVtb3ZlRW1wdHlDZWxsQ2xpY2tMaXN0ZW5lckZuKCk7XG4gICAgICB0aGlzLnJlbW92ZUVtcHR5Q2VsbFRvdWNoZW5kTGlzdGVuZXJGbigpO1xuICAgICAgdGhpcy5yZW1vdmVFbXB0eUNlbGxDbGlja0xpc3RlbmVyRm4gPSBudWxsO1xuICAgICAgdGhpcy5yZW1vdmVFbXB0eUNlbGxUb3VjaGVuZExpc3RlbmVyRm4gPSBudWxsO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmVuYWJsZUVtcHR5Q2VsbENvbnRleHRNZW51ICYmXG4gICAgICAhdGhpcy5yZW1vdmVFbXB0eUNlbGxDb250ZXh0TWVudUxpc3RlbmVyRm4gJiZcbiAgICAgIHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5lbXB0eUNlbGxDb250ZXh0TWVudUNhbGxiYWNrXG4gICAgKSB7XG4gICAgICB0aGlzLnJlbW92ZUVtcHR5Q2VsbENvbnRleHRNZW51TGlzdGVuZXJGbiA9IHRoaXMuZ3JpZHN0ZXIucmVuZGVyZXIubGlzdGVuKFxuICAgICAgICB0aGlzLmdyaWRzdGVyLmVsLFxuICAgICAgICAnY29udGV4dG1lbnUnLFxuICAgICAgICB0aGlzLmVtcHR5Q2VsbENvbnRleHRNZW51Q2JcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICF0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmVuYWJsZUVtcHR5Q2VsbENvbnRleHRNZW51ICYmXG4gICAgICB0aGlzLnJlbW92ZUVtcHR5Q2VsbENvbnRleHRNZW51TGlzdGVuZXJGblxuICAgICkge1xuICAgICAgdGhpcy5yZW1vdmVFbXB0eUNlbGxDb250ZXh0TWVudUxpc3RlbmVyRm4oKTtcbiAgICAgIHRoaXMucmVtb3ZlRW1wdHlDZWxsQ29udGV4dE1lbnVMaXN0ZW5lckZuID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5lbmFibGVFbXB0eUNlbGxEcm9wICYmXG4gICAgICAhdGhpcy5yZW1vdmVFbXB0eUNlbGxEcm9wTGlzdGVuZXJGbiAmJlxuICAgICAgdGhpcy5ncmlkc3Rlci5vcHRpb25zLmVtcHR5Q2VsbERyb3BDYWxsYmFja1xuICAgICkge1xuICAgICAgdGhpcy5yZW1vdmVFbXB0eUNlbGxEcm9wTGlzdGVuZXJGbiA9IHRoaXMuZ3JpZHN0ZXIucmVuZGVyZXIubGlzdGVuKFxuICAgICAgICB0aGlzLmdyaWRzdGVyLmVsLFxuICAgICAgICAnZHJvcCcsXG4gICAgICAgIHRoaXMuZW1wdHlDZWxsRHJhZ0Ryb3BcbiAgICAgICk7XG4gICAgICB0aGlzLmdyaWRzdGVyLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUVtcHR5Q2VsbERyYWdvdmVyTGlzdGVuZXJGbiA9IHRoaXMuZ3JpZHN0ZXIucmVuZGVyZXIubGlzdGVuKFxuICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIuZWwsXG4gICAgICAgICAgJ2RyYWdvdmVyJyxcbiAgICAgICAgICB0aGlzLmVtcHR5Q2VsbERyYWdPdmVyXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVtb3ZlRG9jdW1lbnREcmFnZW5kTGlzdGVuZXJGbiA9IHRoaXMuZ3JpZHN0ZXIucmVuZGVyZXIubGlzdGVuKFxuICAgICAgICAnZG9jdW1lbnQnLFxuICAgICAgICAnZHJhZ2VuZCcsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmdyaWRzdGVyLm1vdmluZ0l0ZW0gPSBudWxsO1xuICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIucHJldmlld1N0eWxlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICF0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmVuYWJsZUVtcHR5Q2VsbERyb3AgJiZcbiAgICAgIHRoaXMucmVtb3ZlRW1wdHlDZWxsRHJvcExpc3RlbmVyRm4gJiZcbiAgICAgIHRoaXMucmVtb3ZlRW1wdHlDZWxsRHJhZ292ZXJMaXN0ZW5lckZuICYmXG4gICAgICB0aGlzLnJlbW92ZURvY3VtZW50RHJhZ2VuZExpc3RlbmVyRm5cbiAgICApIHtcbiAgICAgIHRoaXMucmVtb3ZlRW1wdHlDZWxsRHJvcExpc3RlbmVyRm4oKTtcbiAgICAgIHRoaXMucmVtb3ZlRW1wdHlDZWxsRHJhZ292ZXJMaXN0ZW5lckZuKCk7XG4gICAgICB0aGlzLnJlbW92ZURvY3VtZW50RHJhZ2VuZExpc3RlbmVyRm4oKTtcbiAgICAgIHRoaXMucmVtb3ZlRW1wdHlDZWxsRHJhZ292ZXJMaXN0ZW5lckZuID0gbnVsbDtcbiAgICAgIHRoaXMucmVtb3ZlRW1wdHlDZWxsRHJvcExpc3RlbmVyRm4gPSBudWxsO1xuICAgICAgdGhpcy5yZW1vdmVEb2N1bWVudERyYWdlbmRMaXN0ZW5lckZuID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5lbmFibGVFbXB0eUNlbGxEcmFnICYmXG4gICAgICAhdGhpcy5yZW1vdmVFbXB0eUNlbGxNb3VzZWRvd25MaXN0ZW5lckZuICYmXG4gICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZW1wdHlDZWxsRHJhZ0NhbGxiYWNrXG4gICAgKSB7XG4gICAgICB0aGlzLnJlbW92ZUVtcHR5Q2VsbE1vdXNlZG93bkxpc3RlbmVyRm4gPSB0aGlzLmdyaWRzdGVyLnJlbmRlcmVyLmxpc3RlbihcbiAgICAgICAgdGhpcy5ncmlkc3Rlci5lbCxcbiAgICAgICAgJ21vdXNlZG93bicsXG4gICAgICAgIHRoaXMuZW1wdHlDZWxsTW91c2VEb3duXG4gICAgICApO1xuICAgICAgdGhpcy5yZW1vdmVFbXB0eUNlbGxUb3VjaHN0YXJ0TGlzdGVuZXJGbiA9IHRoaXMuZ3JpZHN0ZXIucmVuZGVyZXIubGlzdGVuKFxuICAgICAgICB0aGlzLmdyaWRzdGVyLmVsLFxuICAgICAgICAndG91Y2hzdGFydCcsXG4gICAgICAgIHRoaXMuZW1wdHlDZWxsTW91c2VEb3duXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAhdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5lbmFibGVFbXB0eUNlbGxEcmFnICYmXG4gICAgICB0aGlzLnJlbW92ZUVtcHR5Q2VsbE1vdXNlZG93bkxpc3RlbmVyRm4gJiZcbiAgICAgIHRoaXMucmVtb3ZlRW1wdHlDZWxsVG91Y2hzdGFydExpc3RlbmVyRm5cbiAgICApIHtcbiAgICAgIHRoaXMucmVtb3ZlRW1wdHlDZWxsTW91c2Vkb3duTGlzdGVuZXJGbigpO1xuICAgICAgdGhpcy5yZW1vdmVFbXB0eUNlbGxUb3VjaHN0YXJ0TGlzdGVuZXJGbigpO1xuICAgICAgdGhpcy5yZW1vdmVFbXB0eUNlbGxNb3VzZWRvd25MaXN0ZW5lckZuID0gbnVsbDtcbiAgICAgIHRoaXMucmVtb3ZlRW1wdHlDZWxsVG91Y2hzdGFydExpc3RlbmVyRm4gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGVtcHR5Q2VsbENsaWNrQ2IgPSAoZTogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmdyaWRzdGVyIHx8XG4gICAgICB0aGlzLmdyaWRzdGVyLm1vdmluZ0l0ZW0gfHxcbiAgICAgIEdyaWRzdGVyVXRpbHMuY2hlY2tDb250ZW50Q2xhc3NGb3JFbXB0eUNlbGxDbGlja0V2ZW50KHRoaXMuZ3JpZHN0ZXIsIGUpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldFZhbGlkSXRlbUZyb21FdmVudChlKTtcbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5lbXB0eUNlbGxDbGlja0NhbGxiYWNrKSB7XG4gICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZW1wdHlDZWxsQ2xpY2tDYWxsYmFjayhlLCBpdGVtKTtcbiAgICB9XG4gICAgdGhpcy5ncmlkc3Rlci5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfTtcblxuICBlbXB0eUNlbGxDb250ZXh0TWVudUNiID0gKGU6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmdyaWRzdGVyLm1vdmluZ0l0ZW0gfHxcbiAgICAgIEdyaWRzdGVyVXRpbHMuY2hlY2tDb250ZW50Q2xhc3NGb3JFbXB0eUNlbGxDbGlja0V2ZW50KHRoaXMuZ3JpZHN0ZXIsIGUpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldFZhbGlkSXRlbUZyb21FdmVudChlKTtcbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5lbXB0eUNlbGxDb250ZXh0TWVudUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZW1wdHlDZWxsQ29udGV4dE1lbnVDYWxsYmFjayhlLCBpdGVtKTtcbiAgICB9XG4gICAgdGhpcy5ncmlkc3Rlci5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfTtcblxuICBlbXB0eUNlbGxEcmFnRHJvcCA9IChlOiBEcmFnRXZlbnQpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRWYWxpZEl0ZW1Gcm9tRXZlbnQoZSk7XG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZW1wdHlDZWxsRHJvcENhbGxiYWNrKSB7XG4gICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZW1wdHlDZWxsRHJvcENhbGxiYWNrKGUsIGl0ZW0pO1xuICAgIH1cbiAgICB0aGlzLmdyaWRzdGVyLmNkUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9O1xuXG4gIGVtcHR5Q2VsbERyYWdPdmVyID0gKGU6IERyYWdFdmVudCk6IHZvaWQgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldFZhbGlkSXRlbUZyb21FdmVudChlKTtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgaWYgKGUuZGF0YVRyYW5zZmVyKSB7XG4gICAgICAgIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSc7XG4gICAgICB9XG4gICAgICB0aGlzLmdyaWRzdGVyLm1vdmluZ0l0ZW0gPSBpdGVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZS5kYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdub25lJztcbiAgICAgIH1cbiAgICAgIHRoaXMuZ3JpZHN0ZXIubW92aW5nSXRlbSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuZ3JpZHN0ZXIucHJldmlld1N0eWxlKCk7XG4gIH07XG5cbiAgZW1wdHlDZWxsTW91c2VEb3duID0gKGU6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoXG4gICAgICBHcmlkc3RlclV0aWxzLmNoZWNrQ29udGVudENsYXNzRm9yRW1wdHlDZWxsQ2xpY2tFdmVudCh0aGlzLmdyaWRzdGVyLCBlKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRWYWxpZEl0ZW1Gcm9tRXZlbnQoZSk7XG4gICAgY29uc3QgbGVmdE1vdXNlQnV0dG9uQ29kZSA9IDE7XG4gICAgaWYgKFxuICAgICAgIWl0ZW0gfHxcbiAgICAgIChlLmJ1dHRvbnMgIT09IGxlZnRNb3VzZUJ1dHRvbkNvZGUgJiYgIShlIGluc3RhbmNlb2YgVG91Y2hFdmVudCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbEl0ZW0gPSBpdGVtO1xuICAgIHRoaXMuZ3JpZHN0ZXIubW92aW5nSXRlbSA9IGl0ZW07XG4gICAgdGhpcy5ncmlkc3Rlci5wcmV2aWV3U3R5bGUoKTtcbiAgICB0aGlzLmdyaWRzdGVyLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5yZW1vdmVXaW5kb3dNb3VzZW1vdmVMaXN0ZW5lckZuID0gdGhpcy5ncmlkc3Rlci5yZW5kZXJlci5saXN0ZW4oXG4gICAgICAgICd3aW5kb3cnLFxuICAgICAgICAnbW91c2Vtb3ZlJyxcbiAgICAgICAgdGhpcy5lbXB0eUNlbGxNb3VzZU1vdmVcbiAgICAgICk7XG4gICAgICB0aGlzLnJlbW92ZVdpbmRvd1RvdWNobW92ZUxpc3RlbmVyRm4gPSB0aGlzLmdyaWRzdGVyLnJlbmRlcmVyLmxpc3RlbihcbiAgICAgICAgJ3dpbmRvdycsXG4gICAgICAgICd0b3VjaG1vdmUnLFxuICAgICAgICB0aGlzLmVtcHR5Q2VsbE1vdXNlTW92ZVxuICAgICAgKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlbW92ZVdpbmRvd01vdXNldXBMaXN0ZW5lckZuID0gdGhpcy5ncmlkc3Rlci5yZW5kZXJlci5saXN0ZW4oXG4gICAgICAnd2luZG93JyxcbiAgICAgICdtb3VzZXVwJyxcbiAgICAgIHRoaXMuZW1wdHlDZWxsTW91c2VVcFxuICAgICk7XG4gICAgdGhpcy5yZW1vdmVXaW5kb3dUb3VjaGVuZExpc3RlbmVyRm4gPSB0aGlzLmdyaWRzdGVyLnJlbmRlcmVyLmxpc3RlbihcbiAgICAgICd3aW5kb3cnLFxuICAgICAgJ3RvdWNoZW5kJyxcbiAgICAgIHRoaXMuZW1wdHlDZWxsTW91c2VVcFxuICAgICk7XG4gIH07XG5cbiAgZW1wdHlDZWxsTW91c2VNb3ZlID0gKGU6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRWYWxpZEl0ZW1Gcm9tRXZlbnQoZSwgdGhpcy5pbml0aWFsSXRlbSk7XG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5ncmlkc3Rlci5tb3ZpbmdJdGVtID0gaXRlbTtcbiAgICB0aGlzLmdyaWRzdGVyLnByZXZpZXdTdHlsZSgpO1xuICB9O1xuXG4gIGVtcHR5Q2VsbE1vdXNlVXAgPSAoZTogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgIHRoaXMucmVtb3ZlV2luZG93TW91c2Vtb3ZlTGlzdGVuZXJGbigpO1xuICAgIHRoaXMucmVtb3ZlV2luZG93VG91Y2htb3ZlTGlzdGVuZXJGbigpO1xuICAgIHRoaXMucmVtb3ZlV2luZG93TW91c2V1cExpc3RlbmVyRm4oKTtcbiAgICB0aGlzLnJlbW92ZVdpbmRvd1RvdWNoZW5kTGlzdGVuZXJGbigpO1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldFZhbGlkSXRlbUZyb21FdmVudChlLCB0aGlzLmluaXRpYWxJdGVtKTtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgdGhpcy5ncmlkc3Rlci5tb3ZpbmdJdGVtID0gaXRlbTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5ncmlkc3Rlci5vcHRpb25zLmVtcHR5Q2VsbERyYWdDYWxsYmFjayAmJlxuICAgICAgdGhpcy5ncmlkc3Rlci5tb3ZpbmdJdGVtXG4gICAgKSB7XG4gICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMuZW1wdHlDZWxsRHJhZ0NhbGxiYWNrKGUsIHRoaXMuZ3JpZHN0ZXIubW92aW5nSXRlbSk7XG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5pbml0aWFsSXRlbSA9IG51bGw7XG4gICAgICBpZiAodGhpcy5ncmlkc3Rlcikge1xuICAgICAgICB0aGlzLmdyaWRzdGVyLm1vdmluZ0l0ZW0gPSBudWxsO1xuICAgICAgICB0aGlzLmdyaWRzdGVyLnByZXZpZXdTdHlsZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZ3JpZHN0ZXIuY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gIH07XG5cbiAgZ2V0UGl4ZWxzWChlOiBNb3VzZUV2ZW50LCByZWN0OiBDbGllbnRSZWN0KTogbnVtYmVyIHtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5zY2FsZTtcbiAgICBpZiAoc2NhbGUpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChlLmNsaWVudFggLSByZWN0LmxlZnQpIC8gc2NhbGUgK1xuICAgICAgICB0aGlzLmdyaWRzdGVyLmVsLnNjcm9sbExlZnQgLVxuICAgICAgICB0aGlzLmdyaWRzdGVyLmdyaWRSZW5kZXJlci5nZXRMZWZ0TWFyZ2luKClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBlLmNsaWVudFggK1xuICAgICAgdGhpcy5ncmlkc3Rlci5lbC5zY3JvbGxMZWZ0IC1cbiAgICAgIHJlY3QubGVmdCAtXG4gICAgICB0aGlzLmdyaWRzdGVyLmdyaWRSZW5kZXJlci5nZXRMZWZ0TWFyZ2luKClcbiAgICApO1xuICB9XG5cbiAgZ2V0UGl4ZWxzWShlOiBNb3VzZUV2ZW50LCByZWN0OiBDbGllbnRSZWN0KTogbnVtYmVyIHtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5zY2FsZTtcbiAgICBpZiAoc2NhbGUpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChlLmNsaWVudFkgLSByZWN0LnRvcCkgLyBzY2FsZSArXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuZWwuc2Nyb2xsVG9wIC1cbiAgICAgICAgdGhpcy5ncmlkc3Rlci5ncmlkUmVuZGVyZXIuZ2V0VG9wTWFyZ2luKClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBlLmNsaWVudFkgK1xuICAgICAgdGhpcy5ncmlkc3Rlci5lbC5zY3JvbGxUb3AgLVxuICAgICAgcmVjdC50b3AgLVxuICAgICAgdGhpcy5ncmlkc3Rlci5ncmlkUmVuZGVyZXIuZ2V0VG9wTWFyZ2luKClcbiAgICApO1xuICB9XG5cbiAgZ2V0VmFsaWRJdGVtRnJvbUV2ZW50KFxuICAgIGU6IE1vdXNlRXZlbnQsXG4gICAgb2xkSXRlbT86IEdyaWRzdGVySXRlbSB8IG51bGxcbiAgKTogR3JpZHN0ZXJJdGVtIHwgdW5kZWZpbmVkIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBHcmlkc3RlclV0aWxzLmNoZWNrVG91Y2hFdmVudChlKTtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5ncmlkc3Rlci5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4ID0gdGhpcy5nZXRQaXhlbHNYKGUsIHJlY3QpO1xuICAgIGNvbnN0IHkgPSB0aGlzLmdldFBpeGVsc1koZSwgcmVjdCk7XG4gICAgY29uc3QgaXRlbTogR3JpZHN0ZXJJdGVtID0ge1xuICAgICAgeDogdGhpcy5ncmlkc3Rlci5waXhlbHNUb1Bvc2l0aW9uWCh4LCBNYXRoLmZsb29yLCB0cnVlKSxcbiAgICAgIHk6IHRoaXMuZ3JpZHN0ZXIucGl4ZWxzVG9Qb3NpdGlvblkoeSwgTWF0aC5mbG9vciwgdHJ1ZSksXG4gICAgICBjb2xzOiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmRlZmF1bHRJdGVtQ29scyxcbiAgICAgIHJvd3M6IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZGVmYXVsdEl0ZW1Sb3dzXG4gICAgfTtcbiAgICBpZiAob2xkSXRlbSkge1xuICAgICAgaXRlbS5jb2xzID0gTWF0aC5taW4oXG4gICAgICAgIE1hdGguYWJzKG9sZEl0ZW0ueCAtIGl0ZW0ueCkgKyAxLFxuICAgICAgICB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmVtcHR5Q2VsbERyYWdNYXhDb2xzXG4gICAgICApO1xuICAgICAgaXRlbS5yb3dzID0gTWF0aC5taW4oXG4gICAgICAgIE1hdGguYWJzKG9sZEl0ZW0ueSAtIGl0ZW0ueSkgKyAxLFxuICAgICAgICB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmVtcHR5Q2VsbERyYWdNYXhSb3dzXG4gICAgICApO1xuICAgICAgaWYgKG9sZEl0ZW0ueCA8IGl0ZW0ueCkge1xuICAgICAgICBpdGVtLnggPSBvbGRJdGVtLng7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBvbGRJdGVtLnggLSBpdGVtLnggPlxuICAgICAgICB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmVtcHR5Q2VsbERyYWdNYXhDb2xzIC0gMVxuICAgICAgKSB7XG4gICAgICAgIGl0ZW0ueCA9IHRoaXMuZ3JpZHN0ZXIubW92aW5nSXRlbSA/IHRoaXMuZ3JpZHN0ZXIubW92aW5nSXRlbS54IDogMDtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRJdGVtLnkgPCBpdGVtLnkpIHtcbiAgICAgICAgaXRlbS55ID0gb2xkSXRlbS55O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgb2xkSXRlbS55IC0gaXRlbS55ID5cbiAgICAgICAgdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5lbXB0eUNlbGxEcmFnTWF4Um93cyAtIDFcbiAgICAgICkge1xuICAgICAgICBpdGVtLnkgPSB0aGlzLmdyaWRzdGVyLm1vdmluZ0l0ZW0gPyB0aGlzLmdyaWRzdGVyLm1vdmluZ0l0ZW0ueSA6IDA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgICF0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmVuYWJsZU9jY3VwaWVkQ2VsbERyb3AgJiZcbiAgICAgIHRoaXMuZ3JpZHN0ZXIuY2hlY2tDb2xsaXNpb24oaXRlbSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cbn1cbiJdfQ==
|