UNPKG

ngx-scrollbar-v8

Version:

Custom overlay-scrollbars with native scrolling mechanism.

199 lines 17.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Inject, NgZone, ChangeDetectionStrategy, forwardRef, PLATFORM_ID } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { Directionality } from '@angular/cdk/bidi'; import { fromEvent, animationFrameScheduler } from 'rxjs'; import { mergeMap, pluck, takeUntil, tap } from 'rxjs/operators'; import { NgScrollbar } from './ng-scrollbar'; import { NgScrollbarThumb } from './ng-scrollbar-thumb'; var NgScrollbarX = /** @class */ (function (_super) { tslib_1.__extends(NgScrollbarX, _super); function NgScrollbarX(_document, _parent, _platform, _dir, _zone) { var _this = _super.call(this, _parent, _platform, _zone) || this; _this._document = _document; _this._parent = _parent; _this._dir = _dir; _this._zone = _zone; return _this; } Object.defineProperty(NgScrollbarX.prototype, "thumbSize", { /** * Calculate scrollbar thumbnail size */ get: /** * Calculate scrollbar thumbnail size * @return {?} */ function () { /** @type {?} */ var barClientWidth = this.bar.nativeElement.clientWidth; /** @type {?} */ var viewClientWidth = this._view.clientWidth; /** @type {?} */ var viewScrollWidth = this._view.scrollWidth; this._naturalThumbSize = barClientWidth / viewScrollWidth * barClientWidth; this._scrollMax = viewScrollWidth - viewClientWidth; return this.scrollBoundaries(this._naturalThumbSize, this._scrollMax); }, enumerable: true, configurable: true }); /** * Scrollbar click * @param e Mouse event */ /** * Scrollbar click * @param {?} e Mouse event * @return {?} */ NgScrollbarX.prototype.onScrollbarHolderClick = /** * Scrollbar click * @param {?} e Mouse event * @return {?} */ function (e) { if (e.target === e.currentTarget) { /** @type {?} */ var offsetX = e.offsetX - this._naturalThumbSize * .5; /** @type {?} */ var thumbPositionPercentage = offsetX * 100 / this.bar.nativeElement.clientWidth; /** @type {?} */ var value = thumbPositionPercentage * this._view.scrollWidth / 100; this._parent.scrollTo((/** @type {?} */ ({ left: value, duration: this.scrollToDuration }))).subscribe(); } }; /** * Update scrollbar */ /** * Update scrollbar * @protected * @return {?} */ NgScrollbarX.prototype.updateScrollbar = /** * Update scrollbar * @protected * @return {?} */ function () { var _this = this; this._thumbSize = this.thumb.nativeElement.clientWidth; this._trackMax = this.bar.nativeElement.clientWidth - this._thumbSize; this._currPos = this._view.scrollLeft * this._trackMax / this._scrollMax; this._zone.run((/** * @return {?} */ function () { animationFrameScheduler.schedule((/** * @return {?} */ function () { return _this.updateState({ transform: "translate3d(" + (_this._dir.value === 'rtl' ? _this._currPos - _this._trackMax : _this._currPos) + "px, 0, 0)", width: _this.thumbSize + "px" }); })); })); }; /** * Start horizontal thumb worker */ /** * Start horizontal thumb worker * @protected * @return {?} */ NgScrollbarX.prototype.startThumbEvents = /** * Start horizontal thumb worker * @protected * @return {?} */ function () { var _this = this; /** @type {?} */ var mouseDown$ = fromEvent(this.thumb.nativeElement, 'mousedown'); /** @type {?} */ var mouseMove$ = fromEvent(this._document, 'mousemove'); /** @type {?} */ var mouseUp$ = fromEvent(this._document, 'mouseup').pipe(tap((/** * @return {?} */ function () { return _this._document.onselectstart = null; }))); return mouseDown$.pipe(tap((/** * @return {?} */ function () { _this._document.onselectstart = (/** * @return {?} */ function () { return false; }); // Initialize trackMax for before start dragging _this._trackMax = _this.bar.nativeElement.clientWidth - _this._thumbSize; })), pluck('offsetX'), mergeMap((/** * @param {?} mouseDownOffset * @return {?} */ function (mouseDownOffset) { return mouseMove$.pipe(takeUntil(mouseUp$), pluck('clientX'), tap((/** * @param {?} mouseMoveClient * @return {?} */ function (mouseMoveClient) { /** @type {?} */ var offsetX = mouseMoveClient - _this.bar.nativeElement.getBoundingClientRect().left; /** @type {?} */ var value = _this._scrollMax * (offsetX - mouseDownOffset) / _this._trackMax; if (_this._dir.value === 'rtl') { value = value === 0 ? offsetX - _this._trackMax : value; } _this._parent.scrollable.scrollTo({ left: value }); }))); }))); }; NgScrollbarX.decorators = [ { type: Component, args: [{ selector: 'ng-scrollbar-x', changeDetection: ChangeDetectionStrategy.OnPush, template: "\n <div #bar class=\"ng-scrollbar {{barClass}}\" (mousedown)=\"onScrollbarHolderClick($event)\">\n <div #thumb class=\"ng-scrollbar-thumb {{thumbClass}}\" [ngStyle]=\"scrollbarStyle | async\"></div>\n </div>\n " }] } ]; /** @nocollapse */ NgScrollbarX.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }, { type: NgScrollbar, decorators: [{ type: Inject, args: [forwardRef((/** * @return {?} */ function () { return NgScrollbar; })),] }] }, { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }, { type: Directionality }, { type: NgZone } ]; }; return NgScrollbarX; }(NgScrollbarThumb)); export { NgScrollbarX }; if (false) { /** * @type {?} * @protected */ NgScrollbarX.prototype._document; /** * @type {?} * @protected */ NgScrollbarX.prototype._parent; /** * @type {?} * @protected */ NgScrollbarX.prototype._dir; /** * @type {?} * @protected */ NgScrollbarX.prototype._zone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2Nyb2xsYmFyLXguanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc2Nyb2xsYmFyLyIsInNvdXJjZXMiOlsic2Nyb2xsYmFyL25nLXNjcm9sbGJhci14LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFjLHVCQUF1QixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQ7SUFTa0Msd0NBQWdCO0lBY2hELHNCQUF3QyxTQUFjLEVBQ08sT0FBb0IsRUFDaEQsU0FBaUIsRUFDNUIsSUFBb0IsRUFDcEIsS0FBYTtRQUpuQyxZQUtFLGtCQUFNLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQ2pDO1FBTnVDLGVBQVMsR0FBVCxTQUFTLENBQUs7UUFDTyxhQUFPLEdBQVAsT0FBTyxDQUFhO1FBRTNELFVBQUksR0FBSixJQUFJLENBQWdCO1FBQ3BCLFdBQUssR0FBTCxLQUFLLENBQVE7O0lBRW5DLENBQUM7SUFmRCxzQkFBSSxtQ0FBUztRQUhiOztXQUVHOzs7OztRQUNIOztnQkFDUSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsV0FBVzs7Z0JBQ25ELGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVc7O2dCQUN4QyxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXO1lBQzlDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxjQUFjLEdBQUcsZUFBZSxHQUFHLGNBQWMsQ0FBQztZQUMzRSxJQUFJLENBQUMsVUFBVSxHQUFHLGVBQWUsR0FBRyxlQUFlLENBQUM7WUFDcEQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4RSxDQUFDOzs7T0FBQTtJQVVEOzs7T0FHRzs7Ozs7O0lBQ0gsNkNBQXNCOzs7OztJQUF0QixVQUF1QixDQUFNO1FBQzNCLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsYUFBYSxFQUFFOztnQkFDMUIsT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUU7O2dCQUNqRCx1QkFBdUIsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFdBQVc7O2dCQUM1RSxLQUFLLEdBQUcsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsR0FBRztZQUNwRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxtQkFBQSxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBQyxFQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUMxRjtJQUNILENBQUM7SUFFRDs7T0FFRzs7Ozs7O0lBQ08sc0NBQWU7Ozs7O0lBQXpCO1FBQUEsaUJBWUM7UUFYQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztRQUN2RCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3RFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRzs7O1FBQUM7WUFDYix1QkFBdUIsQ0FBQyxRQUFROzs7WUFBQztnQkFDL0IsT0FBQSxLQUFJLENBQUMsV0FBVyxDQUFDO29CQUNmLFNBQVMsRUFBRSxrQkFBZSxLQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSSxDQUFDLFFBQVEsZUFBVztvQkFDL0csS0FBSyxFQUFLLEtBQUksQ0FBQyxTQUFTLE9BQUk7aUJBQzdCLENBQUM7WUFIRixDQUdFLEVBQ0gsQ0FBQztRQUNKLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHOzs7Ozs7SUFDTyx1Q0FBZ0I7Ozs7O0lBQTFCO1FBQUEsaUJBMEJDOztZQXpCTyxVQUFVLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQzs7WUFDN0QsVUFBVSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQzs7WUFDbkQsUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FDeEQsR0FBRzs7O1FBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLElBQUksRUFBbkMsQ0FBbUMsRUFBQyxDQUMvQztRQUNELE9BQU8sVUFBVSxDQUFDLElBQUksQ0FDcEIsR0FBRzs7O1FBQUM7WUFDRixLQUFJLENBQUMsU0FBUyxDQUFDLGFBQWE7OztZQUFHLGNBQU0sT0FBQSxLQUFLLEVBQUwsQ0FBSyxDQUFBLENBQUM7WUFDM0MsZ0RBQWdEO1lBQ2hELEtBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLEtBQUksQ0FBQyxVQUFVLENBQUM7UUFDeEUsQ0FBQyxFQUFDLEVBQ0YsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUNoQixRQUFROzs7O1FBQUMsVUFBQyxlQUF1QixJQUFLLE9BQUEsVUFBVSxDQUFDLElBQUksQ0FDbkQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUNuQixLQUFLLENBQUMsU0FBUyxDQUFDLEVBQ2hCLEdBQUc7Ozs7UUFBQyxVQUFDLGVBQXVCOztnQkFDcEIsT0FBTyxHQUFHLGVBQWUsR0FBRyxLQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLElBQUk7O2dCQUNqRixLQUFLLEdBQUcsS0FBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsR0FBRyxLQUFJLENBQUMsU0FBUztZQUMxRSxJQUFJLEtBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssRUFBRTtnQkFDN0IsS0FBSyxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxLQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7YUFDeEQ7WUFDRCxLQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztRQUNsRCxDQUFDLEVBQUMsQ0FDSCxFQVhxQyxDQVdyQyxFQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7O2dCQTFGRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFFBQVEsRUFBRSxnT0FJVDtpQkFDRjs7OztnREFlYyxNQUFNLFNBQUMsUUFBUTtnQkExQnJCLFdBQVcsdUJBMkJMLE1BQU0sU0FBQyxVQUFVOzs7d0JBQUMsY0FBTSxPQUFBLFdBQVcsRUFBWCxDQUFXLEVBQUM7Z0JBQ0wsTUFBTSx1QkFBckMsTUFBTSxTQUFDLFdBQVc7Z0JBL0J4QixjQUFjO2dCQUZLLE1BQU07O0lBbUdsQyxtQkFBQztDQUFBLEFBM0ZELENBU2tDLGdCQUFnQixHQWtGakQ7U0FsRlksWUFBWTs7Ozs7O0lBY1gsaUNBQTBDOzs7OztJQUMxQywrQkFBcUU7Ozs7O0lBRXJFLDRCQUE4Qjs7Ozs7SUFDOUIsNkJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE5nWm9uZSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIGZvcndhcmRSZWYsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEaXJlY3Rpb25hbGl0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7IGZyb21FdmVudCwgT2JzZXJ2YWJsZSwgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1lcmdlTWFwLCBwbHVjaywgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBOZ1Njcm9sbGJhciB9IGZyb20gJy4vbmctc2Nyb2xsYmFyJztcbmltcG9ydCB7IE5nU2Nyb2xsYmFyVGh1bWIgfSBmcm9tICcuL25nLXNjcm9sbGJhci10aHVtYic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLXNjcm9sbGJhci14JyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiAjYmFyIGNsYXNzPVwibmctc2Nyb2xsYmFyIHt7YmFyQ2xhc3N9fVwiIChtb3VzZWRvd24pPVwib25TY3JvbGxiYXJIb2xkZXJDbGljaygkZXZlbnQpXCI+XG4gICAgICA8ZGl2ICN0aHVtYiBjbGFzcz1cIm5nLXNjcm9sbGJhci10aHVtYiB7e3RodW1iQ2xhc3N9fVwiIFtuZ1N0eWxlXT1cInNjcm9sbGJhclN0eWxlIHwgYXN5bmNcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBOZ1Njcm9sbGJhclggZXh0ZW5kcyBOZ1Njcm9sbGJhclRodW1iIHtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHNjcm9sbGJhciB0aHVtYm5haWwgc2l6ZVxuICAgKi9cbiAgZ2V0IHRodW1iU2l6ZSgpOiBudW1iZXIge1xuICAgIGNvbnN0IGJhckNsaWVudFdpZHRoID0gdGhpcy5iYXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICBjb25zdCB2aWV3Q2xpZW50V2lkdGggPSB0aGlzLl92aWV3LmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IHZpZXdTY3JvbGxXaWR0aCA9IHRoaXMuX3ZpZXcuc2Nyb2xsV2lkdGg7XG4gICAgdGhpcy5fbmF0dXJhbFRodW1iU2l6ZSA9IGJhckNsaWVudFdpZHRoIC8gdmlld1Njcm9sbFdpZHRoICogYmFyQ2xpZW50V2lkdGg7XG4gICAgdGhpcy5fc2Nyb2xsTWF4ID0gdmlld1Njcm9sbFdpZHRoIC0gdmlld0NsaWVudFdpZHRoO1xuICAgIHJldHVybiB0aGlzLnNjcm9sbEJvdW5kYXJpZXModGhpcy5fbmF0dXJhbFRodW1iU2l6ZSwgdGhpcy5fc2Nyb2xsTWF4KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRE9DVU1FTlQpIHByb3RlY3RlZCBfZG9jdW1lbnQ6IGFueSxcbiAgICAgICAgICAgICAgQEluamVjdChmb3J3YXJkUmVmKCgpID0+IE5nU2Nyb2xsYmFyKSkgcHJvdGVjdGVkIF9wYXJlbnQ6IE5nU2Nyb2xsYmFyLFxuICAgICAgICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBfcGxhdGZvcm06IE9iamVjdCxcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIF9kaXI6IERpcmVjdGlvbmFsaXR5LFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3pvbmU6IE5nWm9uZSkge1xuICAgIHN1cGVyKF9wYXJlbnQsIF9wbGF0Zm9ybSwgX3pvbmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbGJhciBjbGlja1xuICAgKiBAcGFyYW0gZSBNb3VzZSBldmVudFxuICAgKi9cbiAgb25TY3JvbGxiYXJIb2xkZXJDbGljayhlOiBhbnkpIHtcbiAgICBpZiAoZS50YXJnZXQgPT09IGUuY3VycmVudFRhcmdldCkge1xuICAgICAgY29uc3Qgb2Zmc2V0WCA9IGUub2Zmc2V0WCAtIHRoaXMuX25hdHVyYWxUaHVtYlNpemUgKiAuNTtcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb25QZXJjZW50YWdlID0gb2Zmc2V0WCAqIDEwMCAvIHRoaXMuYmFyLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRodW1iUG9zaXRpb25QZXJjZW50YWdlICogdGhpcy5fdmlldy5zY3JvbGxXaWR0aCAvIDEwMDtcbiAgICAgIHRoaXMuX3BhcmVudC5zY3JvbGxUbyh7bGVmdDogdmFsdWUsIGR1cmF0aW9uOiB0aGlzLnNjcm9sbFRvRHVyYXRpb259IGFzIGFueSkuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzY3JvbGxiYXJcbiAgICovXG4gIHByb3RlY3RlZCB1cGRhdGVTY3JvbGxiYXIoKSB7XG4gICAgdGhpcy5fdGh1bWJTaXplID0gdGhpcy50aHVtYi5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIHRoaXMuX3RyYWNrTWF4ID0gdGhpcy5iYXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCAtIHRoaXMuX3RodW1iU2l6ZTtcbiAgICB0aGlzLl9jdXJyUG9zID0gdGhpcy5fdmlldy5zY3JvbGxMZWZ0ICogdGhpcy5fdHJhY2tNYXggLyB0aGlzLl9zY3JvbGxNYXg7XG4gICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIuc2NoZWR1bGUoKCkgPT5cbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHt0aGlzLl9kaXIudmFsdWUgPT09ICdydGwnID8gdGhpcy5fY3VyclBvcyAtIHRoaXMuX3RyYWNrTWF4IDogdGhpcy5fY3VyclBvc31weCwgMCwgMClgLFxuICAgICAgICAgIHdpZHRoOiBgJHt0aGlzLnRodW1iU2l6ZX1weGBcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgaG9yaXpvbnRhbCB0aHVtYiB3b3JrZXJcbiAgICovXG4gIHByb3RlY3RlZCBzdGFydFRodW1iRXZlbnRzKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgbW91c2VEb3duJCA9IGZyb21FdmVudCh0aGlzLnRodW1iLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWRvd24nKTtcbiAgICBjb25zdCBtb3VzZU1vdmUkID0gZnJvbUV2ZW50KHRoaXMuX2RvY3VtZW50LCAnbW91c2Vtb3ZlJyk7XG4gICAgY29uc3QgbW91c2VVcCQgPSBmcm9tRXZlbnQodGhpcy5fZG9jdW1lbnQsICdtb3VzZXVwJykucGlwZShcbiAgICAgIHRhcCgoKSA9PiB0aGlzLl9kb2N1bWVudC5vbnNlbGVjdHN0YXJ0ID0gbnVsbClcbiAgICApO1xuICAgIHJldHVybiBtb3VzZURvd24kLnBpcGUoXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICB0aGlzLl9kb2N1bWVudC5vbnNlbGVjdHN0YXJ0ID0gKCkgPT4gZmFsc2U7XG4gICAgICAgIC8vIEluaXRpYWxpemUgdHJhY2tNYXggZm9yIGJlZm9yZSBzdGFydCBkcmFnZ2luZ1xuICAgICAgICB0aGlzLl90cmFja01heCA9IHRoaXMuYmFyLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggLSB0aGlzLl90aHVtYlNpemU7XG4gICAgICB9KSxcbiAgICAgIHBsdWNrKCdvZmZzZXRYJyksXG4gICAgICBtZXJnZU1hcCgobW91c2VEb3duT2Zmc2V0OiBudW1iZXIpID0+IG1vdXNlTW92ZSQucGlwZShcbiAgICAgICAgdGFrZVVudGlsKG1vdXNlVXAkKSxcbiAgICAgICAgcGx1Y2soJ2NsaWVudFgnKSxcbiAgICAgICAgdGFwKChtb3VzZU1vdmVDbGllbnQ6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IG9mZnNldFggPSBtb3VzZU1vdmVDbGllbnQgLSB0aGlzLmJhci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5fc2Nyb2xsTWF4ICogKG9mZnNldFggLSBtb3VzZURvd25PZmZzZXQpIC8gdGhpcy5fdHJhY2tNYXg7XG4gICAgICAgICAgaWYgKHRoaXMuX2Rpci52YWx1ZSA9PT0gJ3J0bCcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT09IDAgPyBvZmZzZXRYIC0gdGhpcy5fdHJhY2tNYXggOiB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fcGFyZW50LnNjcm9sbGFibGUuc2Nyb2xsVG8oe2xlZnQ6IHZhbHVlfSk7XG4gICAgICAgIH0pXG4gICAgICApKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==