ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
241 lines (240 loc) • 20.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
export class SwipeAction {
constructor() {
this.prefixCls = 'am-swipe';
this.wrapCls = {};
this._swiping = false;
this._openedLeft = false;
this._openedRight = false;
this.left = [];
this.right = [];
this.autoClose = false;
this.disabled = false;
this.onOpen = new EventEmitter();
this.onClose = new EventEmitter();
this.onCloseSwipe = () => {
if (!(this._openedLeft || this._openedRight)) {
return;
}
this.close();
};
this.onTouchStart = e => {
this._startX = e.changedTouches[0].clientX;
this._swiping = true;
};
}
/**
* @return {?}
*/
setClassMap() {
this.wrapCls = {
[this.prefixCls]: true,
[`${this.prefixCls}-swiping`]: this._swiping
};
}
/**
* @return {?}
*/
close() {
if (this._openedLeft || this._openedRight) {
this.onClose.emit();
}
this.setBtnStyle(0);
this._openedLeft = false;
this._openedRight = false;
}
/**
* @param {?} value
* @return {?}
*/
setBtnStyle(value) {
/** @type {?} */
const limit = value > 0 ? this._btnsLeftWidth : -this._btnsRightWidth;
/** @type {?} */
const contentLeft = this.getContentEasing(value, limit);
this.content.nativeElement.style.left = `${contentLeft}px`;
this.cover.nativeElement.style.display = Math.abs(value) > 0 ? 'block' : 'none';
this.cover.nativeElement.style.left = `${contentLeft}px`;
}
/**
* @param {?} value
* @param {?} limit
* @return {?}
*/
getContentEasing(value, limit) {
return Math.abs(value) - Math.abs(limit) > 0 ? limit : value;
}
/**
* @param {?} e
* @return {?}
*/
onTouchMove(e) {
/** @type {?} */
const deltaX = e.changedTouches[0].clientX - this._startX;
e.preventDefault();
this._needShowRight = deltaX < 0 && this.right.length > 0;
this._needShowLeft = deltaX > 0 && this.left.length > 0;
if (this.leftBtnRef) {
this.leftBtnRef.nativeElement.style.visibility = this._needShowRight ? 'hidden' : 'visible';
}
if (this.rightBtnRef) {
this.rightBtnRef.nativeElement.style.visibility = this._needShowLeft ? 'hidden' : 'visible';
}
this.setBtnStyle(deltaX);
}
/**
* @param {?} e
* @return {?}
*/
onTouchEnd(e) {
/** @type {?} */
const deltaX = e.changedTouches[0].clientX - this._startX;
/** @type {?} */
const needOpenRight = this._needShowRight && Math.abs(deltaX) > this._btnsRightWidth / 2;
/** @type {?} */
const needOpenLeft = this._needShowLeft && Math.abs(deltaX) > this._btnsLeftWidth / 2;
if (needOpenRight) {
this.doOpenRight();
}
else if (needOpenLeft) {
this.doOpenLeft();
}
else {
this.close();
}
this._swiping = false;
this._needShowLeft = false;
this._needShowRight = false;
}
/**
* @return {?}
*/
doOpenLeft() {
this.open(this._btnsLeftWidth, true, false);
}
/**
* @return {?}
*/
doOpenRight() {
this.open(-this._btnsRightWidth, false, true);
}
/**
* @param {?} ev
* @param {?} btn
* @return {?}
*/
onBtnClick(ev, btn) {
/** @type {?} */
const onPress = btn.onPress;
if (onPress) {
onPress(ev);
}
if (this.autoClose) {
this.close();
}
}
/**
* @param {?} value
* @param {?} openedLeft
* @param {?} openedRight
* @return {?}
*/
open(value, openedLeft, openedRight) {
this.onOpen.emit();
this._openedLeft = openedLeft;
this._openedRight = openedRight;
this.setBtnStyle(value);
}
/**
* @return {?}
*/
ngOnInit() {
this.setClassMap();
}
/**
* @return {?}
*/
ngAfterViewInit() {
this._btnsLeftWidth = this.leftBtnRef ? this.leftBtnRef.nativeElement.offsetWidth : 0;
this._btnsRightWidth = this.rightBtnRef ? this.rightBtnRef.nativeElement.offsetWidth : 0;
document.body.addEventListener('touchstart', this.onCloseSwipe, true);
}
/**
* @return {?}
*/
ngOnDestroy() {
document.body.removeEventListener('touchstart', this.onCloseSwipe, true);
}
}
SwipeAction.decorators = [
{ type: Component, args: [{
selector: 'SwipeAction, nzm-swipe-action',
template: "<div *ngIf=\"(left.length != 0 || right.length != 0) && !disabled\" [ngClass]=\"wrapCls\">\n <div class=\"{{prefixCls}}-cover\" #coverRef></div>\n <div *ngIf=\"left && left.length > 0\"\n class=\"{{prefixCls}}-actions {{prefixCls}}-actions-left\"\n #leftBtnRef>\n <div *ngFor=\"let btn of left\"\n class=\"{{prefixCls}}-btn\"\n [ngStyle]=\"btn.style\"\n role=\"button\"\n (click)=\"onBtnClick($event, btn)\">\n <div class=\"{{prefixCls}}-btn-text\">\n {{btn.text || 'Click'}}\n </div>\n </div>\n </div>\n <div *ngIf=\"right && right.length > 0\"\n class=\"{{prefixCls}}-actions {{prefixCls}}-actions-right\"\n #rightBtnRef>\n <div *ngFor=\"let btn of right\"\n class=\"{{prefixCls}}-btn\"\n [ngStyle]=\"btn.style\"\n role=\"button\"\n (click)=\"onBtnClick($event, btn)\"\n >\n <div class=\"{{prefixCls}}-btn-text\">\n {{btn.text || 'Click'}}\n </div>\n </div>\n </div>\n <div class=\"{{prefixCls}}-content\"\n #contentRef\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd($event)\">\n <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n </div>\n</div>\n<div *ngIf=\"!((left.length != 0 || right.length != 0) && !disabled)\"\n class=\"{{prefixCls}}-content\"\n #contentRef>\n <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n</div>\n\n<ng-template #content>\n <ng-content></ng-content>\n</ng-template>\n",
encapsulation: ViewEncapsulation.None
}] }
];
/** @nocollapse */
SwipeAction.ctorParameters = () => [];
SwipeAction.propDecorators = {
leftBtnRef: [{ type: ViewChild, args: ['leftBtnRef',] }],
rightBtnRef: [{ type: ViewChild, args: ['rightBtnRef',] }],
content: [{ type: ViewChild, args: ['contentRef',] }],
cover: [{ type: ViewChild, args: ['coverRef',] }],
left: [{ type: Input }],
right: [{ type: Input }],
autoClose: [{ type: Input }],
disabled: [{ type: Input }],
onOpen: [{ type: Output }],
onClose: [{ type: Output }]
};
if (false) {
/** @type {?} */
SwipeAction.prototype.prefixCls;
/** @type {?} */
SwipeAction.prototype.wrapCls;
/** @type {?} */
SwipeAction.prototype._swiping;
/** @type {?} */
SwipeAction.prototype._openedLeft;
/** @type {?} */
SwipeAction.prototype._openedRight;
/** @type {?} */
SwipeAction.prototype._btnsLeftWidth;
/** @type {?} */
SwipeAction.prototype._btnsRightWidth;
/** @type {?} */
SwipeAction.prototype._needShowLeft;
/** @type {?} */
SwipeAction.prototype._needShowRight;
/** @type {?} */
SwipeAction.prototype._startX;
/** @type {?} */
SwipeAction.prototype.leftBtnRef;
/** @type {?} */
SwipeAction.prototype.rightBtnRef;
/** @type {?} */
SwipeAction.prototype.content;
/** @type {?} */
SwipeAction.prototype.cover;
/** @type {?} */
SwipeAction.prototype.left;
/** @type {?} */
SwipeAction.prototype.right;
/** @type {?} */
SwipeAction.prototype.autoClose;
/** @type {?} */
SwipeAction.prototype.disabled;
/** @type {?} */
SwipeAction.prototype.onOpen;
/** @type {?} */
SwipeAction.prototype.onClose;
/** @type {?} */
SwipeAction.prototype.onCloseSwipe;
/** @type {?} */
SwipeAction.prototype.onTouchStart;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpcGUtYWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsic3dpcGUtYWN0aW9uL3N3aXBlLWFjdGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQVF2QixNQUFNO0lBbUNKO3lCQWxDb0IsVUFBVTt1QkFDWixFQUFFO3dCQUVRLEtBQUs7MkJBQ0YsS0FBSzs0QkFDSixLQUFLO29CQWlCZixFQUFFO3FCQUVELEVBQUU7eUJBRUosS0FBSzt3QkFFTixLQUFLO3NCQUVHLElBQUksWUFBWSxFQUFPO3VCQUV0QixJQUFJLFlBQVksRUFBTzs0QkFXckMsR0FBRyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUM1QyxPQUFPO2FBQ1I7WUFDRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDZDs0QkF1QmMsQ0FBQyxDQUFDLEVBQUU7WUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUMzQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztTQUN0QjtLQXhDZTs7OztJQUVoQixXQUFXO1FBQ1QsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUk7WUFDdEIsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQzdDLENBQUM7S0FDSDs7OztJQVNELEtBQUs7UUFDSCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUks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S0FDekI7Ozs7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0tBQ3BCOzs7O0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEYsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RixRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ3ZFOzs7O0lBRUQsV0FBVztRQUNULFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDMUU7OztZQXZKRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLCtCQUErQjtnQkFDekMsc2lEQUE0QztnQkFDNUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7YUFDdEM7Ozs7O3lCQWNFLFNBQVMsU0FBQyxZQUFZOzBCQUV0QixTQUFTLFNBQUMsYUFBYTtzQkFFdkIsU0FBUyxTQUFDLFlBQVk7b0JBRXRCLFNBQVMsU0FBQyxVQUFVO21CQUdwQixLQUFLO29CQUVMLEtBQUs7d0JBRUwsS0FBSzt1QkFFTCxLQUFLO3FCQUVMLE1BQU07c0JBRU4sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdTd2lwZUFjdGlvbiwgbnptLXN3aXBlLWFjdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zd2lwZS1hY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFN3aXBlQWN0aW9uIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1zd2lwZSc7XG4gIHdyYXBDbHM6IG9iamVjdCA9IHt9O1xuXG4gIHByaXZhdGUgX3N3aXBpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfb3BlbmVkTGVmdDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9vcGVuZWRSaWdodDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9idG5zTGVmdFdpZHRoOiBudW1iZXI7XG4gIHByaXZhdGUgX2J0bnNSaWdodFdpZHRoOiBudW1iZXI7XG4gIHByaXZhdGUgX25lZWRTaG93TGVmdDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfbmVlZFNob3dSaWdodDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfc3RhcnRYOiBudW1iZXI7XG5cbiAgQFZpZXdDaGlsZCgnbGVmdEJ0blJlZicpXG4gIGxlZnRCdG5SZWY7XG4gIEBWaWV3Q2hpbGQoJ3JpZ2h0QnRuUmVmJylcbiAgcmlnaHRCdG5SZWY7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRlbnRSZWYnKVxuICBjb250ZW50O1xuICBAVmlld0NoaWxkKCdjb3ZlclJlZicpXG4gIGNvdmVyO1xuXG4gIEBJbnB1dCgpXG4gIGxlZnQ6IEFycmF5PG9iamVjdD4gPSBbXTtcbiAgQElucHV0KClcbiAgcmlnaHQ6IEFycmF5PG9iamVjdD4gPSBbXTtcbiAgQElucHV0KClcbiAgYXV0b0Nsb3NlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKVxuICBvbk9wZW46IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKVxuICBvbkNsb3NlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBzZXRDbGFzc01hcCgpIHtcbiAgICB0aGlzLndyYXBDbHMgPSB7XG4gICAgICBbdGhpcy5wcmVmaXhDbHNdOiB0cnVlLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1zd2lwaW5nYF06IHRoaXMuX3N3aXBpbmdcbiAgICB9O1xuICB9XG5cbiAgb25DbG9zZVN3aXBlID0gKCkgPT4ge1xuICAgIGlmICghKHRoaXMuX29wZW5lZExlZnQgfHwgdGhpcy5fb3BlbmVkUmlnaHQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2xvc2UoKTtcbiAgfTtcblxuICBjbG9zZSgpIHtcbiAgICBpZiAodGhpcy5fb3BlbmVkTGVmdCB8fCB0aGlzLl9vcGVuZWRSaWdodCkge1xuICAgICAgdGhpcy5vbkNsb3NlLmVtaXQoKTtcbiAgICB9XG4gICAgdGhpcy5zZXRCdG5TdHlsZSgwKTtcbiAgICB0aGlzLl9vcGVuZWRMZWZ0ID0gZmFsc2U7XG4gICAgdGhpcy5fb3BlbmVkUmlnaHQgPSBmYWxzZTtcbiAgfVxuXG4gIHNldEJ0blN0eWxlKHZhbHVlKSB7XG4gICAgY29uc3QgbGltaXQgPSB2YWx1ZSA+IDAgPyB0aGlzLl9idG5zTGVmdFdpZHRoIDogLXRoaXMuX2J0bnNSaWdodFdpZHRoO1xuICAgIGNvbnN0IGNvbnRlbnRMZWZ0ID0gdGhpcy5nZXRDb250ZW50RWFzaW5nKHZhbHVlLCBsaW1pdCk7XG4gICAgdGhpcy5jb250ZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2NvbnRlbnRMZWZ0fXB4YDtcbiAgICB0aGlzLmNvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IE1hdGguYWJzKHZhbHVlKSA+IDAgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgIHRoaXMuY292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7Y29udGVudExlZnR9cHhgO1xuICB9XG5cbiAgZ2V0Q29udGVudEVhc2luZyh2YWx1ZSwgbGltaXQpIHtcbiAgICByZXR1cm4gTWF0aC5hYnModmFsdWUpIC0gTWF0aC5hYnMobGltaXQpID4gMCA/IGxpbWl0IDogdmFsdWU7XG4gIH1cblxuICBvblRvdWNoU3RhcnQgPSBlID0+IHtcbiAgICB0aGlzLl9zdGFydFggPSBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgdGhpcy5fc3dpcGluZyA9IHRydWU7XG4gIH07XG5cbiAgb25Ub3VjaE1vdmUoZSkge1xuICAgIGNvbnN0IGRlbHRhWCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMuX3N0YXJ0WDtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5fbmVlZFNob3dSaWdodCA9IGRlbHRhWCA8IDAgJiYgdGhpcy5yaWdodC5sZW5ndGggPiAwO1xuICAgIHRoaXMuX25lZWRTaG93TGVmdCA9IGRlbHRhWCA+IDAgJiYgdGhpcy5sZWZ0Lmxlbmd0aCA+IDA7XG4gICAgaWYgKHRoaXMubGVmdEJ0blJlZikge1xuICAgICAgdGhpcy5sZWZ0QnRuUmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IHRoaXMuX25lZWRTaG93UmlnaHQgPyAnaGlkZGVuJyA6ICd2aXNpYmxlJztcbiAgICB9XG4gICAgaWYgKHRoaXMucmlnaHRCdG5SZWYpIHtcbiAgICAgIHRoaXMucmlnaHRCdG5SZWYubmF0aXZlRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gdGhpcy5fbmVlZFNob3dMZWZ0ID8gJ2hpZGRlbicgOiAndmlzaWJsZSc7XG4gICAgfVxuICAgIHRoaXMuc2V0QnRuU3R5bGUoZGVsdGFYKTtcbiAgfVxuXG4gIG9uVG91Y2hFbmQoZSkge1xuICAgIGNvbnN0IGRlbHRhWCA9IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMuX3N0YXJ0WDtcblxuICAgIGNvbnN0IG5lZWRPcGVuUmlnaHQgPSB0aGlzLl9uZWVkU2hvd1JpZ2h0ICYmIE1hdGguYWJzKGRlbHRhWCkgPiB0aGlzLl9idG5zUmlnaHRXaWR0aCAvIDI7XG4gICAgY29uc3QgbmVlZE9wZW5MZWZ0ID0gdGhpcy5fbmVlZFNob3dMZWZ0ICYmIE1hdGguYWJzKGRlbHRhWCkgPiB0aGlzLl9idG5zTGVmdFdpZHRoIC8gMjtcblxuICAgIGlmIChuZWVkT3BlblJpZ2h0KSB7XG4gICAgICB0aGlzLmRvT3BlblJpZ2h0KCk7XG4gICAgfSBlbHNlIGlmIChuZWVkT3BlbkxlZnQpIHtcbiAgICAgIHRoaXMuZG9PcGVuTGVmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICAgIHRoaXMuX3N3aXBpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9uZWVkU2hvd0xlZnQgPSBmYWxzZTtcbiAgICB0aGlzLl9uZWVkU2hvd1JpZ2h0ID0gZmFsc2U7XG4gIH1cblxuICBkb09wZW5MZWZ0KCkge1xuICAgIHRoaXMub3Blbih0aGlzLl9idG5zTGVmdFdpZHRoLCB0cnVlLCBmYWxzZSk7XG4gIH1cblxuICBkb09wZW5SaWdodCgpIHtcbiAgICB0aGlzLm9wZW4oLXRoaXMuX2J0bnNSaWdodFdpZHRoLCBmYWxzZSwgdHJ1ZSk7XG4gIH1cblxuICBvbkJ0bkNsaWNrKGV2LCBidG4pIHtcbiAgICBjb25zdCBvblByZXNzID0gYnRuLm9uUHJlc3M7XG4gICAgaWYgKG9uUHJlc3MpIHtcbiAgICAgIG9uUHJlc3MoZXYpO1xuICAgIH1cbiAgICBpZiAodGhpcy5hdXRvQ2xvc2UpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBvcGVuKHZhbHVlLCBvcGVuZWRMZWZ0LCBvcGVuZWRSaWdodCkge1xuICAgIHRoaXMub25PcGVuLmVtaXQoKTtcbiAgICB0aGlzLl9vcGVuZWRMZWZ0ID0gb3BlbmVkTGVmdDtcbiAgICB0aGlzLl9vcGVuZWRSaWdodCA9IG9wZW5lZFJpZ2h0O1xuICAgIHRoaXMuc2V0QnRuU3R5bGUodmFsdWUpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZXRDbGFzc01hcCgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2J0bnNMZWZ0V2lkdGggPSB0aGlzLmxlZnRCdG5SZWYgPyB0aGlzLmxlZnRCdG5SZWYubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCA6IDA7XG4gICAgdGhpcy5fYnRuc1JpZ2h0V2lkdGggPSB0aGlzLnJpZ2h0QnRuUmVmID8gdGhpcy5yaWdodEJ0blJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIDogMDtcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLm9uQ2xvc2VTd2lwZSwgdHJ1ZSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLm9uQ2xvc2VTd2lwZSwgdHJ1ZSk7XG4gIH1cbn1cbiJdfQ==