@ngx-kit/core
Version:
ngx-kit - core module
347 lines • 28.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { ElementRef, Injectable } from '@angular/core';
import { HammerGestureConfig } from '@angular/platform-browser';
import { BehaviorSubject } from 'rxjs';
import { KitHammerProvider } from '../kit-hammer/kit-hammer-provider';
import { KitHammerTypes } from '../kit-hammer/meta';
import { KitPlatformService } from '../kit-platform/kit-platform.service';
/**
* Scroll area helpers.
* Should be provided on component.
*/
var KitScrollService = /** @class */ (function () {
function KitScrollService(platform, elRef, hammerProvider) {
this.platform = platform;
this.elRef = elRef;
this.hammerProvider = hammerProvider;
this._state = new BehaviorSubject({
nativeScrollbarWidth: 0,
dragging: false,
vBar: {
active: false,
size: 0,
position: 0,
},
hBar: {
active: false,
size: 0,
position: 0,
},
});
this._state.next(tslib_1.__assign({}, this.state, { nativeScrollbarWidth: this.platform.getScrollbarWidth() }));
}
Object.defineProperty(KitScrollService.prototype, "state", {
get: /**
* @return {?}
*/
function () {
return this._state.value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(KitScrollService.prototype, "stateChanges", {
get: /**
* @return {?}
*/
function () {
return this._state.asObservable();
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
KitScrollService.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.mutationObserver) {
this.mutationObserver.disconnect();
}
};
/**
* @param {?} refs
* @return {?}
*/
KitScrollService.prototype.registerRefs = /**
* @param {?} refs
* @return {?}
*/
function (refs) {
this.refs = refs;
if (this.hammerProvider.hammer) {
this.initVListeners();
this.initHListeners();
this.initMutationObserver();
}
};
/**
* @return {?}
*/
KitScrollService.prototype.update = /**
* @return {?}
*/
function () {
this.updateVBar();
this.updateHBar();
};
/**
* @return {?}
*/
KitScrollService.prototype.updateVBar = /**
* @return {?}
*/
function () {
/** @type {?} */
var state = this.calcBar(this.refs.vWrapper.scrollHeight - this.state.nativeScrollbarWidth, this.elRef.nativeElement.offsetHeight, this.refs.vBarWrapper.offsetHeight, this.refs.vWrapper.scrollTop);
this._state.next(tslib_1.__assign({}, this.state, { vBar: state }));
};
/**
* @return {?}
*/
KitScrollService.prototype.updateHBar = /**
* @return {?}
*/
function () {
/** @type {?} */
var state = this.calcBar(this.refs.hWrapper.scrollWidth, this.elRef.nativeElement.offsetWidth, this.refs.hBarWrapper.offsetWidth, this.refs.hWrapper.scrollLeft);
this._state.next(tslib_1.__assign({}, this.state, { hBar: state }));
};
/**
* @private
* @param {?} contentSize
* @param {?} hostSize
* @param {?} barWrapperSize
* @param {?} scrollPosition
* @return {?}
*/
KitScrollService.prototype.calcBar = /**
* @private
* @param {?} contentSize
* @param {?} hostSize
* @param {?} barWrapperSize
* @param {?} scrollPosition
* @return {?}
*/
function (contentSize, hostSize, barWrapperSize, scrollPosition) {
if (contentSize > hostSize) {
/** @type {?} */
var size = Math.round(Math.max((hostSize / contentSize) * barWrapperSize, 30));
return {
active: true,
size: size,
position: Math.round((barWrapperSize - size) * (scrollPosition / (contentSize - hostSize))),
};
}
else {
return {
active: false,
size: 0,
position: 0,
};
}
};
/**
* @private
* @return {?}
*/
KitScrollService.prototype.initVListeners = /**
* @private
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var vBarHammerConfig = new HammerGestureConfig();
vBarHammerConfig.overrides = {
pan: {
direction: KitHammerTypes.DIRECTION_VERTICAL,
threshold: 1,
},
};
/** @type {?} */
var vBarHammer = vBarHammerConfig.buildHammer(this.refs.vBar);
/** @type {?} */
var scrollStart = null;
// Pan
vBarHammer.on('pan', (/**
* @param {?} event
* @return {?}
*/
function (event) {
// Start
if (scrollStart === null) {
scrollStart = _this.refs.vWrapper.scrollTop;
_this._state.next(tslib_1.__assign({}, _this.state, { dragging: true }));
}
// Calc
/** @type {?} */
var contentHeight = _this.refs.hWrapper.scrollHeight;
/** @type {?} */
var hostHeight = _this.elRef.nativeElement.offsetHeight;
/** @type {?} */
var coef = contentHeight / hostHeight;
if (scrollStart !== null) {
_this.refs.vWrapper.scrollTop = Math.round(scrollStart + event.deltaY * coef);
}
// Final
if (event.isFinal) {
scrollStart = null;
_this._state.next(tslib_1.__assign({}, _this.state, { dragging: false }));
}
}));
// Tap
/** @type {?} */
var vBarWrapperHammer = vBarHammerConfig.buildHammer(this.refs.vBarWrapper);
vBarWrapperHammer.on('tap', (/**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.target === _this.refs.vBarWrapper) {
/** @type {?} */
var pos = _this.hammerProvider.calcRelatedPosition(_this.refs.vBarWrapper, event.center);
// Calc
_this.refs.vWrapper.scrollTop += pos.y > _this.state.vBar.position ? 200 : -200;
}
}));
};
/**
* @private
* @return {?}
*/
KitScrollService.prototype.initHListeners = /**
* @private
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var hBarHammerConfig = new HammerGestureConfig();
hBarHammerConfig.overrides = {
pan: {
direction: KitHammerTypes.DIRECTION_HORIZONTAL,
threshold: 1,
},
};
/** @type {?} */
var hBarHammer = hBarHammerConfig.buildHammer(this.refs.hBar);
/** @type {?} */
var scrollStart = null;
// Pan
hBarHammer.on('pan', (/**
* @param {?} event
* @return {?}
*/
function (event) {
// Start
if (scrollStart === null) {
scrollStart = _this.refs.hWrapper.scrollLeft;
_this._state.next(tslib_1.__assign({}, _this.state, { dragging: true }));
}
// Calc
/** @type {?} */
var contentWidth = _this.refs.hWrapper.scrollWidth;
/** @type {?} */
var hostWidth = _this.elRef.nativeElement.offsetWidth;
/** @type {?} */
var coef = contentWidth / hostWidth;
if (scrollStart !== null) {
_this.refs.hWrapper.scrollLeft = Math.round(scrollStart + event.deltaX * coef);
}
// Final
if (event.isFinal) {
scrollStart = null;
_this._state.next(tslib_1.__assign({}, _this.state, { dragging: false }));
}
}));
// Tap
/** @type {?} */
var hBarWrapperHammer = hBarHammerConfig.buildHammer(this.refs.hBarWrapper);
hBarWrapperHammer.on('tap', (/**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.target === _this.refs.hBarWrapper) {
/** @type {?} */
var pos = _this.hammerProvider.calcRelatedPosition(_this.refs.hBarWrapper, event.center);
// Calc
_this.refs.hWrapper.scrollLeft += pos.x > _this.state.hBar.position ? 200 : -200;
}
}));
};
/**
* @private
* @return {?}
*/
KitScrollService.prototype.initMutationObserver = /**
* @private
* @return {?}
*/
function () {
var _this = this;
this.mutationObserver = new MutationObserver((/**
* @param {?} mutations
* @return {?}
*/
function (mutations) {
if (mutations.length > 0) {
_this.update();
}
}));
this.mutationObserver.observe(this.refs.hWrapper, {
attributes: true,
childList: true,
characterData: true,
subtree: true,
});
};
KitScrollService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
KitScrollService.ctorParameters = function () { return [
{ type: KitPlatformService },
{ type: ElementRef },
{ type: KitHammerProvider }
]; };
return KitScrollService;
}());
export { KitScrollService };
if (false) {
/** @type {?} */
KitScrollService.prototype.refs;
/**
* @type {?}
* @private
*/
KitScrollService.prototype._state;
/**
* @type {?}
* @private
*/
KitScrollService.prototype.mutationObserver;
/**
* @type {?}
* @private
*/
KitScrollService.prototype.platform;
/**
* @type {?}
* @private
*/
KitScrollService.prototype.elRef;
/**
* @type {?}
* @private
*/
KitScrollService.prototype.hammerProvider;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2l0LXNjcm9sbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5neC1raXQvY29yZS8iLCJzb3VyY2VzIjpbInNyYy9raXQtc2Nyb2xsL2tpdC1zY3JvbGwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7OztBQU8xRTtJQXFCRSwwQkFDVSxRQUE0QixFQUM1QixLQUFpQixFQUNqQixjQUFzQztRQUZ0QyxhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUM1QixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ2pCLG1CQUFjLEdBQWQsY0FBYyxDQUF3QjtRQXBCeEMsV0FBTSxHQUFHLElBQUksZUFBZSxDQUFpQjtZQUNuRCxvQkFBb0IsRUFBRSxDQUFDO1lBQ3ZCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsSUFBSSxFQUFFO2dCQUNKLE1BQU0sRUFBRSxLQUFLO2dCQUNiLElBQUksRUFBRSxDQUFDO2dCQUNQLFFBQVEsRUFBRSxDQUFDO2FBQ1o7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsSUFBSSxFQUFFLENBQUM7Z0JBQ1AsUUFBUSxFQUFFLENBQUM7YUFDWjtTQUNGLENBQUMsQ0FBQztRQVNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxzQkFDWCxJQUFJLENBQUMsS0FBSyxJQUNiLG9CQUFvQixFQUFFLElBQUksQ0FBQyxRQUFR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QUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUN4RixPQUFPO2dCQUNQLEtBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQzthQUNoRjtRQUNILENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFFTywrQ0FBb0I7Ozs7SUFBNUI7UUFBQSxpQkFZQztRQVhDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQjs7OztRQUFDLFVBQUEsU0FBUztZQUNwRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QixLQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDZjtRQUNILENBQUMsRUFBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNoRCxVQUFVLEVBQUUsSUFBSTtZQUNoQixTQUFTLEVBQUUsSUFBSTtZQUNmLGFBQWEsRUFBRSxJQUFJO1lBQ25CLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Z0JBak5GLFVBQVU7Ozs7Z0JBUEYsa0JBQWtCO2dCQUxsQixVQUFVO2dCQUdWLGlCQUFpQjs7SUEyTjFCLHVCQUFDO0NBQUEsQUFsTkQsSUFrTkM7U0FqTlksZ0JBQWdCOzs7SUFDM0IsZ0NBQW9COzs7OztJQUVwQixrQ0FhRzs7Ozs7SUFFSCw0Q0FBMkM7Ozs7O0lBR3pDLG9DQUFvQzs7Ozs7SUFDcEMsaUNBQXlCOzs7OztJQUN6QiwwQ0FBOEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSGFtbWVyR2VzdHVyZUNvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgS2l0SGFtbWVyUHJvdmlkZXIgfSBmcm9tICcuLi9raXQtaGFtbWVyL2tpdC1oYW1tZXItcHJvdmlkZXInO1xyXG5pbXBvcnQgeyBLaXRIYW1tZXJUeXBlcyB9IGZyb20gJy4uL2tpdC1oYW1tZXIvbWV0YSc7XHJcbmltcG9ydCB7IEtpdFBsYXRmb3JtU2VydmljZSB9IGZyb20gJy4uL2tpdC1wbGF0Zm9ybS9raXQtcGxhdGZvcm0uc2VydmljZSc7XHJcbmltcG9ydCB7IEtpdFNjcm9sbFJlZnMsIEtpdFNjcm9sbFN0YXRlIH0gZnJvbSAnLi9tZXRhJztcclxuXHJcbi8qKlxyXG4gKiBTY3JvbGwgYXJlYSBoZWxwZXJzLlxyXG4gKiBTaG91bGQgYmUgcHJvdmlkZWQgb24gY29tcG9uZW50LlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgS2l0U2Nyb2xsU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgcmVmczogS2l0U2Nyb2xsUmVmcztcclxuXHJcbiAgcHJpdmF0ZSBfc3RhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEtpdFNjcm9sbFN0YXRlPih7XHJcbiAgICBuYXRpdmVTY3JvbGxiYXJXaWR0aDogMCxcclxuICAgIGRyYWdnaW5nOiBmYWxzZSxcclxuICAgIHZCYXI6IHtcclxuICAgICAgYWN0aXZlOiBmYWxzZSxcclxuICAgICAgc2l6ZTogMCxcclxuICAgICAgcG9zaXRpb246IDAsXHJcbiAgICB9LFxyXG4gICAgaEJhcjoge1xyXG4gICAgICBhY3RpdmU6IGZhbHNlLFxyXG4gICAgICBzaXplOiAwLFxyXG4gICAgICBwb3NpdGlvbjogMCxcclxuICAgIH0sXHJcbiAgfSk7XHJcblxyXG4gIHByaXZhdGUgbXV0YXRpb25PYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHBsYXRmb3JtOiBLaXRQbGF0Zm9ybVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSBoYW1tZXJQcm92aWRlcjogS2l0SGFtbWVyUHJvdmlkZXI8YW55PixcclxuICApIHtcclxuICAgIHRoaXMuX3N0YXRlLm5leHQoe1xyXG4gICAgICAuLi50aGlzLnN0YXRlLFxyXG4gICAgICBuYXRpdmVTY3JvbGxiYXJXaWR0aDogdGhpcy5wbGF0Zm9ybS5nZXRTY3JvbGxiYXJXaWR0aCgpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RhdGUoKTogS2l0U2Nyb2xsU3RhdGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN0YXRlQ2hhbmdlcygpOiBPYnNlcnZhYmxlPEtpdFNjcm9sbFN0YXRlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLm11dGF0aW9uT2JzZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyUmVmcyhyZWZzOiBLaXRTY3JvbGxSZWZzKSB7XHJcbiAgICB0aGlzLnJlZnMgPSByZWZzO1xyXG4gICAgaWYgKHRoaXMuaGFtbWVyUHJvdmlkZXIuaGFtbWVyKSB7XHJcbiAgICAgIHRoaXMuaW5pdFZMaXN0ZW5lcnMoKTtcclxuICAgICAgdGhpcy5pbml0SExpc3RlbmVycygpO1xyXG4gICAgICB0aGlzLmluaXRNdXRhdGlvbk9ic2VydmVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGUoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZVZCYXIoKTtcclxuICAgIHRoaXMudXBkYXRlSEJhcigpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVkJhcigpIHtcclxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5jYWxjQmFyKFxyXG4gICAgICB0aGlzLnJlZnMudldyYXBwZXIuc2Nyb2xsSGVpZ2h0IC0gdGhpcy5zdGF0ZS5uYXRpdmVTY3JvbGxiYXJXaWR0aCxcclxuICAgICAgdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCxcclxuICAgICAgdGhpcy5yZWZzLnZCYXJXcmFwcGVyLm9mZnNldEhlaWdodCxcclxuICAgICAgdGhpcy5yZWZzLnZXcmFwcGVyLnNjcm9sbFRvcCxcclxuICAgICk7XHJcbiAgICB0aGlzLl9zdGF0ZS5uZXh0KHtcclxuICAgICAgLi4udGhpcy5zdGF0ZSxcclxuICAgICAgdkJhcjogc3RhdGUsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUhCYXIoKSB7XHJcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuY2FsY0JhcihcclxuICAgICAgdGhpcy5yZWZzLmhXcmFwcGVyLnNjcm9sbFdpZHRoLFxyXG4gICAgICB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgsXHJcbiAgICAgIHRoaXMucmVmcy5oQmFyV3JhcHBlci5vZmZzZXRXaWR0aCxcclxuICAgICAgdGhpcy5yZWZzLmhXcmFwcGVyLnNjcm9sbExlZnQsXHJcbiAgICApO1xyXG4gICAgdGhpcy5fc3RhdGUubmV4dCh7XHJcbiAgICAgIC4uLnRoaXMuc3RhdGUsXHJcbiAgICAgIGhCYXI6IHN0YXRlLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGNCYXIoY29udGVudFNpemU6IG51bWJlciwgaG9zdFNpemU6IG51bWJlciwgYmFyV3JhcHBlclNpemU6IG51bWJlciwgc2Nyb2xsUG9zaXRpb246IG51bWJlcikge1xyXG4gICAgaWYgKGNvbnRlbnRTaXplID4gaG9zdFNpemUpIHtcclxuICAgICAgY29uc3Qgc2l6ZSA9IE1hdGgucm91bmQoTWF0aC5tYXgoKGhvc3RTaXplIC8gY29udGVudFNpemUpICogYmFyV3JhcHBlclNpemUsIDMwKSk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgYWN0aXZlOiB0cnVlLFxyXG4gICAgICAgIHNpemUsXHJcbiAgICAgICAgcG9zaXRpb246IE1hdGgucm91bmQoKGJhcldyYXBwZXJTaXplIC0gc2l6ZSkgKiAoc2Nyb2xsUG9zaXRpb24gLyAoY29udGVudFNpemUgLSBob3N0U2l6ZSkpKSxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgYWN0aXZlOiBmYWxzZSxcclxuICAgICAgICBzaXplOiAwLFxyXG4gICAgICAgIHBvc2l0aW9uOiAwLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Vkxpc3RlbmVycygpIHtcclxuICAgIGNvbnN0IHZCYXJIYW1tZXJDb25maWcgPSBuZXcgSGFtbWVyR2VzdHVyZUNvbmZpZygpO1xyXG4gICAgdkJhckhhbW1lckNvbmZpZy5vdmVycmlkZXMgPSB7XHJcbiAgICAgIHBhbjoge1xyXG4gICAgICAgIGRpcmVjdGlvbjogS2l0SGFtbWVyVHlwZXMuRElSRUNUSU9OX1ZFUlRJQ0FMLFxyXG4gICAgICAgIHRocmVzaG9sZDogMSxcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgICBjb25zdCB2QmFySGFtbWVyID0gdkJhckhhbW1lckNvbmZpZy5idWlsZEhhbW1lcih0aGlzLnJlZnMudkJhcik7XHJcbiAgICBsZXQgc2Nyb2xsU3RhcnQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgLy8gUGFuXHJcbiAgICB2QmFySGFtbWVyLm9uKCdwYW4nLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAvLyBTdGFydFxyXG4gICAgICBpZiAoc2Nyb2xsU3RhcnQgPT09IG51bGwpIHtcclxuICAgICAgICBzY3JvbGxTdGFydCA9IHRoaXMucmVmcy52V3JhcHBlci5zY3JvbGxUb3A7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUubmV4dCh7XHJcbiAgICAgICAgICAuLi50aGlzLnN0YXRlLFxyXG4gICAgICAgICAgZHJhZ2dpbmc6IHRydWUsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gQ2FsY1xyXG4gICAgICBjb25zdCBjb250ZW50SGVpZ2h0ID0gdGhpcy5yZWZzLmhXcmFwcGVyLnNjcm9sbEhlaWdodDtcclxuICAgICAgY29uc3QgaG9zdEhlaWdodCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgIGNvbnN0IGNvZWYgPSBjb250ZW50SGVpZ2h0IC8gaG9zdEhlaWdodDtcclxuICAgICAgaWYgKHNjcm9sbFN0YXJ0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5yZWZzLnZXcmFwcGVyLnNjcm9sbFRvcCA9IE1hdGgucm91bmQoc2Nyb2xsU3RhcnQgKyBldmVudC5kZWx0YVkgKiBjb2VmKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBGaW5hbFxyXG4gICAgICBpZiAoZXZlbnQuaXNGaW5hbCkge1xyXG4gICAgICAgIHNjcm9sbFN0YXJ0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zdGF0ZS5uZXh0KHtcclxuICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXHJcbiAgICAgICAgICBkcmFnZ2luZzogZmFsc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gVGFwXHJcbiAgICBjb25zdCB2QmFyV3JhcHBlckhhbW1lciA9IHZCYXJIYW1tZXJDb25maWcuYnVpbGRIYW1tZXIodGhpcy5yZWZzLnZCYXJXcmFwcGVyKTtcclxuICAgIHZCYXJXcmFwcGVySGFtbWVyLm9uKCd0YXAnLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLnJlZnMudkJhcldyYXBwZXIpIHtcclxuICAgICAgICBjb25zdCBwb3MgPSB0aGlzLmhhbW1lclByb3ZpZGVyLmNhbGNSZWxhdGVkUG9zaXRpb24odGhpcy5yZWZzLnZCYXJXcmFwcGVyLCBldmVudC5jZW50ZXIpO1xyXG4gICAgICAgIC8vIENhbGNcclxuICAgICAgICB0aGlzLnJlZnMudldyYXBwZXIuc2Nyb2xsVG9wICs9IHBvcy55ID4gdGhpcy5zdGF0ZS52QmFyLnBvc2l0aW9uID8gMjAwIDogLTIwMDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRITGlzdGVuZXJzKCkge1xyXG4gICAgY29uc3QgaEJhckhhbW1lckNvbmZpZyA9IG5ldyBIYW1tZXJHZXN0dXJlQ29uZmlnKCk7XHJcbiAgICBoQmFySGFtbWVyQ29uZmlnLm92ZXJyaWRlcyA9IHtcclxuICAgICAgcGFuOiB7XHJcbiAgICAgICAgZGlyZWN0aW9uOiBLaXRIYW1tZXJUeXBlcy5ESVJFQ1RJT05fSE9SSVpPTlRBTCxcclxuICAgICAgICB0aHJlc2hvbGQ6IDEsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgY29uc3QgaEJhckhhbW1lciA9IGhCYXJIYW1tZXJDb25maWcuYnVpbGRIYW1tZXIodGhpcy5yZWZzLmhCYXIpO1xyXG4gICAgbGV0IHNjcm9sbFN0YXJ0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIC8vIFBhblxyXG4gICAgaEJhckhhbW1lci5vbigncGFuJywgKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgLy8gU3RhcnRcclxuICAgICAgaWYgKHNjcm9sbFN0YXJ0ID09PSBudWxsKSB7XHJcbiAgICAgICAgc2Nyb2xsU3RhcnQgPSB0aGlzLnJlZnMuaFdyYXBwZXIuc2Nyb2xsTGVmdDtcclxuICAgICAgICB0aGlzLl9zdGF0ZS5uZXh0KHtcclxuICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXHJcbiAgICAgICAgICBkcmFnZ2luZzogdHJ1ZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICAvLyBDYWxjXHJcbiAgICAgIGNvbnN0IGNvbnRlbnRXaWR0aCA9IHRoaXMucmVmcy5oV3JhcHBlci5zY3JvbGxXaWR0aDtcclxuICAgICAgY29uc3QgaG9zdFdpZHRoID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICBjb25zdCBjb2VmID0gY29udGVudFdpZHRoIC8gaG9zdFdpZHRoO1xyXG4gICAgICBpZiAoc2Nyb2xsU3RhcnQgIT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLnJlZnMuaFdyYXBwZXIuc2Nyb2xsTGVmdCA9IE1hdGgucm91bmQoc2Nyb2xsU3RhcnQgKyBldmVudC5kZWx0YVggKiBjb2VmKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBGaW5hbFxyXG4gICAgICBpZiAoZXZlbnQuaXNGaW5hbCkge1xyXG4gICAgICAgIHNjcm9sbFN0YXJ0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zdGF0ZS5uZXh0KHtcclxuICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXHJcbiAgICAgICAgICBkcmFnZ2luZzogZmFsc2UsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLy8gVGFwXHJcbiAgICBjb25zdCBoQmFyV3JhcHBlckhhbW1lciA9IGhCYXJIYW1tZXJDb25maWcuYnVpbGRIYW1tZXIodGhpcy5yZWZzLmhCYXJXcmFwcGVyKTtcclxuICAgIGhCYXJXcmFwcGVySGFtbWVyLm9uKCd0YXAnLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLnJlZnMuaEJhcldyYXBwZXIpIHtcclxuICAgICAgICBjb25zdCBwb3MgPSB0aGlzLmhhbW1lclByb3ZpZGVyLmNhbGNSZWxhdGVkUG9zaXRpb24odGhpcy5yZWZzLmhCYXJXcmFwcGVyLCBldmVudC5jZW50ZXIpO1xyXG4gICAgICAgIC8vIENhbGNcclxuICAgICAgICB0aGlzLnJlZnMuaFdyYXBwZXIuc2Nyb2xsTGVmdCArPSBwb3MueCA+IHRoaXMuc3RhdGUuaEJhci5wb3NpdGlvbiA/IDIwMCA6IC0yMDA7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0TXV0YXRpb25PYnNlcnZlcigpIHtcclxuICAgIHRoaXMubXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7XHJcbiAgICAgIGlmIChtdXRhdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy5yZWZzLmhXcmFwcGVyLCB7XHJcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXHJcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcclxuICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcclxuICAgICAgc3VidHJlZTogdHJ1ZSxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=