theme-lib
Version:
This is a simple example Angular Library published to npm.
263 lines • 24 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Directive, Input, HostListener, ElementRef, EventEmitter, Output, ContentChildren, QueryList, } from '@angular/core';
import { forkJoin, of as observableOf, interval, timer } from 'rxjs';
import { takeWhile, filter, switchMap, map, takeUntil, take } from 'rxjs/operators';
import { convertToBoolProperty } from '../helpers';
import { NbLayoutScrollService } from '../../services/scroll.service';
import { NbLayoutRulerService } from '../../services/ruler.service';
import { NbListItemComponent } from './list.component';
var NbScrollableContainerDimentions = /** @class */ (function () {
function NbScrollableContainerDimentions() {
}
return NbScrollableContainerDimentions;
}());
export { NbScrollableContainerDimentions };
if (false) {
/** @type {?} */
NbScrollableContainerDimentions.prototype.scrollTop;
/** @type {?} */
NbScrollableContainerDimentions.prototype.scrollHeight;
/** @type {?} */
NbScrollableContainerDimentions.prototype.clientHeight;
}
/*
* Infinite List Directive
*
* ```html
* <nb-list nbInfiniteList [threshold]="500" (bottomThreshold)="loadNext()">
* <nb-list-item *ngFor="let item of items"></nb-list-item>
* </nb-list>
* ```
*
* @stacked-example(Simple infinite list, infinite-list/infinite-list-showcase.component)
*
* Directive will notify when list scrolled up or down to given a threshold.
* By default it listen to scroll of list on which applied, but also can be set to listen to window scroll.
*
* @stacked-example(Scroll modes, infinite-list/infinite-list-scroll-modes.component)
*
* To improve UX of infinite lists, it's better to keep current page in url,
* so user able to return to the last viewed page or to share a link to this page.
* `nbListPageTracker` directive will help you to know, what page user currently viewing.
* Just put it on a list, set page size and it will calculate page that currently in viewport.
* You can [open the example](example/infinite-list/infinite-news-list.component)
* in a new tab to check out this feature.
*
* @stacked-example(Infinite list with pager, infinite-list/infinite-news-list.component)
*
* @stacked-example(Infinite list with placeholders at the top, infinite-list/infinite-list-placeholders.component)
*
*/
var NbInfiniteListDirective = /** @class */ (function () {
function NbInfiniteListDirective(elementRef, scrollService, dimensionsService) {
this.elementRef = elementRef;
this.scrollService = scrollService;
this.dimensionsService = dimensionsService;
this.alive = true;
this.windowScroll = false;
/*
* Emits when distance between list bottom and current scroll position is less than threshold.
*/
this.bottomThreshold = new EventEmitter(true);
/*
* Emits when distance between list top and current scroll position is less than threshold.
*/
this.topThreshold = new EventEmitter(true);
}
Object.defineProperty(NbInfiniteListDirective.prototype, "elementScroll", {
get: /**
* @private
* @return {?}
*/
function () {
return !this.windowScroll;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NbInfiniteListDirective.prototype, "listenWindowScroll", {
/*
* By default component observes list scroll position.
* If set to `true`, component will observe position of page scroll instead.
*/
set: /*
* By default component observes list scroll position.
* If set to `true`, component will observe position of page scroll instead.
*/
/**
* @param {?} value
* @return {?}
*/
function (value) {
this.windowScroll = convertToBoolProperty(value);
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NbInfiniteListDirective.prototype.onElementScroll = /**
* @return {?}
*/
function () {
if (this.elementScroll) {
this.checkPosition(this.elementRef.nativeElement);
}
};
/**
* @return {?}
*/
NbInfiniteListDirective.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
this.scrollService.onScroll()
.pipe(takeWhile(function () { return _this.alive; }), filter(function () { return _this.windowScroll; }), switchMap(function () { return _this.getContainerDimensions(); }))
.subscribe(function (dimentions) { return _this.checkPosition(dimentions); });
this.listItems.changes
.pipe(takeWhile(function () { return _this.alive; }),
// For some reason, changes are emitted before list item removed from dom,
// so dimensions will be incorrect.
// Check every 50ms for a second if dom and query are in sync.
// Once they synchronized, we can get proper dimensions.
switchMap(function () { return interval(50).pipe(takeUntil(timer(1000)), filter(function () { return _this.inSyncWithDom(); }), take(1)); }), switchMap(function () { return _this.getContainerDimensions(); }))
.subscribe(function (dimentions) { return _this.checkPosition(dimentions); });
this.getContainerDimensions().subscribe(function (dimentions) { return _this.checkPosition(dimentions); });
};
/**
* @return {?}
*/
NbInfiniteListDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.alive = false;
};
/**
* @param {?} __0
* @return {?}
*/
NbInfiniteListDirective.prototype.checkPosition = /**
* @param {?} __0
* @return {?}
*/
function (_a) {
var scrollHeight = _a.scrollHeight, scrollTop = _a.scrollTop, clientHeight = _a.clientHeight;
/** @type {?} */
var initialCheck = this.lastScrollPosition == null;
/** @type {?} */
var manualCheck = this.lastScrollPosition === scrollTop;
/** @type {?} */
var scrollUp = scrollTop < this.lastScrollPosition;
/** @type {?} */
var scrollDown = scrollTop > this.lastScrollPosition;
/** @type {?} */
var distanceToBottom = scrollHeight - scrollTop - clientHeight;
if ((initialCheck || manualCheck || scrollDown) && distanceToBottom <= this.threshold) {
this.bottomThreshold.emit();
}
if ((initialCheck || scrollUp) && scrollTop <= this.threshold) {
this.topThreshold.emit();
}
this.lastScrollPosition = scrollTop;
};
/**
* @private
* @return {?}
*/
NbInfiniteListDirective.prototype.getContainerDimensions = /**
* @private
* @return {?}
*/
function () {
if (this.elementScroll) {
var _a = this.elementRef.nativeElement, scrollTop = _a.scrollTop, scrollHeight = _a.scrollHeight, clientHeight = _a.clientHeight;
return observableOf({ scrollTop: scrollTop, scrollHeight: scrollHeight, clientHeight: clientHeight });
}
return forkJoin(this.scrollService.getPosition(), this.dimensionsService.getDimensions())
.pipe(map(function (_a) {
var _b = tslib_1.__read(_a, 2), scrollPosition = _b[0], dimensions = _b[1];
return ({
scrollTop: scrollPosition.y,
scrollHeight: dimensions.scrollHeight,
clientHeight: dimensions.clientHeight,
});
}));
};
/**
* @private
* @return {?}
*/
NbInfiniteListDirective.prototype.inSyncWithDom = /**
* @private
* @return {?}
*/
function () {
return this.elementRef.nativeElement.children.length === this.listItems.length;
};
NbInfiniteListDirective.decorators = [
{ type: Directive, args: [{
selector: '[nbInfiniteList]',
},] }
];
/** @nocollapse */
NbInfiniteListDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: NbLayoutScrollService },
{ type: NbLayoutRulerService }
]; };
NbInfiniteListDirective.propDecorators = {
threshold: [{ type: Input }],
listenWindowScroll: [{ type: Input }],
bottomThreshold: [{ type: Output }],
topThreshold: [{ type: Output }],
onElementScroll: [{ type: HostListener, args: ['scroll',] }],
listItems: [{ type: ContentChildren, args: [NbListItemComponent,] }]
};
return NbInfiniteListDirective;
}());
export { NbInfiniteListDirective };
if (false) {
/**
* @type {?}
* @private
*/
NbInfiniteListDirective.prototype.alive;
/**
* @type {?}
* @private
*/
NbInfiniteListDirective.prototype.lastScrollPosition;
/** @type {?} */
NbInfiniteListDirective.prototype.windowScroll;
/** @type {?} */
NbInfiniteListDirective.prototype.threshold;
/** @type {?} */
NbInfiniteListDirective.prototype.bottomThreshold;
/** @type {?} */
NbInfiniteListDirective.prototype.topThreshold;
/** @type {?} */
NbInfiniteListDirective.prototype.listItems;
/**
* @type {?}
* @private
*/
NbInfiniteListDirective.prototype.elementRef;
/**
* @type {?}
* @private
*/
NbInfiniteListDirective.prototype.scrollService;
/**
* @type {?}
* @private
*/
NbInfiniteListDirective.prototype.dimensionsService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5maW5pdGUtbGlzdC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aGVtZS1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9saXN0L2luZmluaXRlLWxpc3QuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUdOLGVBQWUsRUFDZixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFjLFFBQVEsRUFBRSxFQUFFLElBQUksWUFBWSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXZEO0lBQUE7SUFJQSxDQUFDO0lBQUQsc0NBQUM7QUFBRCxDQUFDLEFBSkQsSUFJQzs7OztJQUhDLG9EQUFrQjs7SUFDbEIsdURBQXFCOztJQUNyQix1REFBcUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQStCdkI7SUFpREUsaUNBQ1UsVUFBc0IsRUFDdEIsYUFBb0MsRUFDcEMsaUJBQXVDO1FBRnZDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQXVCO1FBQ3BDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBc0I7UUEvQ3pDLFVB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Q0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNqRixDQUFDOztnQkExSEYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7aUJBQzdCOzs7O2dCQW5EQyxVQUFVO2dCQVdILHFCQUFxQjtnQkFDckIsb0JBQW9COzs7NEJBcUQxQixLQUFLO3FDQU9MLEtBQUs7a0NBUUwsTUFBTTsrQkFNTixNQUFNO2tDQUdOLFlBQVksU0FBQyxRQUFROzRCQU9yQixlQUFlLFNBQUMsbUJBQW1COztJQTRFdEMsOEJBQUM7Q0FBQSxBQTNIRCxJQTJIQztTQXhIWSx1QkFBdUI7Ozs7OztJQUVsQyx3Q0FBcUI7Ozs7O0lBQ3JCLHFEQUEyQjs7SUFDM0IsK0NBQXFCOztJQVNyQiw0Q0FDa0I7O0lBY2xCLGtEQUN5Qzs7SUFLekMsK0NBQ3NDOztJQVN0Qyw0Q0FBZ0Y7Ozs7O0lBRzlFLDZDQUE4Qjs7Ozs7SUFDOUIsZ0RBQTRDOzs7OztJQUM1QyxvREFBK0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIERpcmVjdGl2ZSxcclxuICBJbnB1dCxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT3V0cHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBRdWVyeUxpc3QsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIGZvcmtKb2luLCBvZiBhcyBvYnNlcnZhYmxlT2YsIGludGVydmFsLCB0aW1lciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlV2hpbGUsIGZpbHRlciwgc3dpdGNoTWFwLCBtYXAsIHRha2VVbnRpbCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgY29udmVydFRvQm9vbFByb3BlcnR5IH0gZnJvbSAnLi4vaGVscGVycyc7XHJcbmltcG9ydCB7IE5iTGF5b3V0U2Nyb2xsU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Njcm9sbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmJMYXlvdXRSdWxlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ydWxlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmJMaXN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4vbGlzdC5jb21wb25lbnQnO1xyXG5cclxuZXhwb3J0IGNsYXNzIE5iU2Nyb2xsYWJsZUNvbnRhaW5lckRpbWVudGlvbnMge1xyXG4gIHNjcm9sbFRvcDogbnVtYmVyO1xyXG4gIHNjcm9sbEhlaWdodDogbnVtYmVyO1xyXG4gIGNsaWVudEhlaWdodDogbnVtYmVyO1xyXG59XHJcblxyXG4vKlxyXG4gKiBJbmZpbml0ZSBMaXN0IERpcmVjdGl2ZVxyXG4gKlxyXG4gKiBgYGBodG1sXHJcbiAqICA8bmItbGlzdCBuYkluZmluaXRlTGlzdCBbdGhyZXNob2xkXT1cIjUwMFwiIChib3R0b21UaHJlc2hvbGQpPVwibG9hZE5leHQoKVwiPlxyXG4gKiAgICA8bmItbGlzdC1pdGVtICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zXCI+PC9uYi1saXN0LWl0ZW0+XHJcbiAqICA8L25iLWxpc3Q+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFNpbXBsZSBpbmZpbml0ZSBsaXN0LCBpbmZpbml0ZS1saXN0L2luZmluaXRlLWxpc3Qtc2hvd2Nhc2UuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBEaXJlY3RpdmUgd2lsbCBub3RpZnkgd2hlbiBsaXN0IHNjcm9sbGVkIHVwIG9yIGRvd24gdG8gZ2l2ZW4gYSB0aHJlc2hvbGQuXHJcbiAqIEJ5IGRlZmF1bHQgaXQgbGlzdGVuIHRvIHNjcm9sbCBvZiBsaXN0IG9uIHdoaWNoIGFwcGxpZWQsIGJ1dCBhbHNvIGNhbiBiZSBzZXQgdG8gbGlzdGVuIHRvIHdpbmRvdyBzY3JvbGwuXHJcbiAqXHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoU2Nyb2xsIG1vZGVzLCBpbmZpbml0ZS1saXN0L2luZmluaXRlLWxpc3Qtc2Nyb2xsLW1vZGVzLmNvbXBvbmVudClcclxuICpcclxuICogVG8gaW1wcm92ZSBVWCBvZiBpbmZpbml0ZSBsaXN0cywgaXQncyBiZXR0ZXIgdG8ga2VlcCBjdXJyZW50IHBhZ2UgaW4gdXJsLFxyXG4gKiBzbyB1c2VyIGFibGUgdG8gcmV0dXJuIHRvIHRoZSBsYXN0IHZpZXdlZCBwYWdlIG9yIHRvIHNoYXJlIGEgbGluayB0byB0aGlzIHBhZ2UuXHJcbiAqIGBuYkxpc3RQYWdlVHJhY2tlcmAgZGlyZWN0aXZlIHdpbGwgaGVscCB5b3UgdG8ga25vdywgd2hhdCBwYWdlIHVzZXIgY3VycmVudGx5IHZpZXdpbmcuXHJcbiAqIEp1c3QgcHV0IGl0IG9uIGEgbGlzdCwgc2V0IHBhZ2Ugc2l6ZSBhbmQgaXQgd2lsbCBjYWxjdWxhdGUgcGFnZSB0aGF0IGN1cnJlbnRseSBpbiB2aWV3cG9ydC5cclxuICogWW91IGNhbiBbb3BlbiB0aGUgZXhhbXBsZV0oZXhhbXBsZS9pbmZpbml0ZS1saXN0L2luZmluaXRlLW5ld3MtbGlzdC5jb21wb25lbnQpXHJcbiAqIGluIGEgbmV3IHRhYiB0byBjaGVjayBvdXQgdGhpcyBmZWF0dXJlLlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKEluZmluaXRlIGxpc3Qgd2l0aCBwYWdlciwgaW5maW5pdGUtbGlzdC9pbmZpbml0ZS1uZXdzLWxpc3QuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKEluZmluaXRlIGxpc3Qgd2l0aCBwbGFjZWhvbGRlcnMgYXQgdGhlIHRvcCwgaW5maW5pdGUtbGlzdC9pbmZpbml0ZS1saXN0LXBsYWNlaG9sZGVycy5jb21wb25lbnQpXHJcbiAqXHJcbiAqL1xyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tuYkluZmluaXRlTGlzdF0nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmJJbmZpbml0ZUxpc3REaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICBwcml2YXRlIGFsaXZlID0gdHJ1ZTtcclxuICBwcml2YXRlIGxhc3RTY3JvbGxQb3NpdGlvbjtcclxuICB3aW5kb3dTY3JvbGwgPSBmYWxzZTtcclxuICBwcml2YXRlIGdldCBlbGVtZW50U2Nyb2xsKCkge1xyXG4gICAgcmV0dXJuICF0aGlzLndpbmRvd1Njcm9sbDtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogVGhyZXNob2xkIGFmdGVyIHdoaWNoIGV2ZW50IGxvYWQgbW9yZSBldmVudCB3aWxsIGJlIGVtaXRlZC5cclxuICAgKiBJbiBwaXhlbHMuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICB0aHJlc2hvbGQ6IG51bWJlcjtcclxuXHJcbiAgLypcclxuICAgKiBCeSBkZWZhdWx0IGNvbXBvbmVudCBvYnNlcnZlcyBsaXN0IHNjcm9sbCBwb3NpdGlvbi5cclxuICAgKiBJZiBzZXQgdG8gYHRydWVgLCBjb21wb25lbnQgd2lsbCBvYnNlcnZlIHBvc2l0aW9uIG9mIHBhZ2Ugc2Nyb2xsIGluc3RlYWQuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgbGlzdGVuV2luZG93U2Nyb2xsKHZhbHVlKSB7XHJcbiAgICB0aGlzLndpbmRvd1Njcm9sbCA9IGNvbnZlcnRUb0Jvb2xQcm9wZXJ0eSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIEVtaXRzIHdoZW4gZGlzdGFuY2UgYmV0d2VlbiBsaXN0IGJvdHRvbSBhbmQgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gaXMgbGVzcyB0aGFuIHRocmVzaG9sZC5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBib3R0b21UaHJlc2hvbGQgPSBuZXcgRXZlbnRFbWl0dGVyKHRydWUpO1xyXG5cclxuICAvKlxyXG4gICAqIEVtaXRzIHdoZW4gZGlzdGFuY2UgYmV0d2VlbiBsaXN0IHRvcCBhbmQgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gaXMgbGVzcyB0aGFuIHRocmVzaG9sZC5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICB0b3BUaHJlc2hvbGQgPSBuZXcgRXZlbnRFbWl0dGVyKHRydWUpO1xyXG5cclxuICBASG9zdExpc3RlbmVyKCdzY3JvbGwnKVxyXG4gIG9uRWxlbWVudFNjcm9sbCgpIHtcclxuICAgIGlmICh0aGlzLmVsZW1lbnRTY3JvbGwpIHtcclxuICAgICAgdGhpcy5jaGVja1Bvc2l0aW9uKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBDb250ZW50Q2hpbGRyZW4oTmJMaXN0SXRlbUNvbXBvbmVudCkgbGlzdEl0ZW1zOiBRdWVyeUxpc3Q8TmJMaXN0SXRlbUNvbXBvbmVudD47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSBzY3JvbGxTZXJ2aWNlOiBOYkxheW91dFNjcm9sbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpbWVuc2lvbnNTZXJ2aWNlOiBOYkxheW91dFJ1bGVyU2VydmljZSxcclxuICApIHt9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuc2Nyb2xsU2VydmljZS5vblNjcm9sbCgpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB0aGlzLmFsaXZlKSxcclxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy53aW5kb3dTY3JvbGwpLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmdldENvbnRhaW5lckRpbWVuc2lvbnMoKSksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShkaW1lbnRpb25zID0+IHRoaXMuY2hlY2tQb3NpdGlvbihkaW1lbnRpb25zKSk7XHJcblxyXG4gICAgdGhpcy5saXN0SXRlbXMuY2hhbmdlc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4gdGhpcy5hbGl2ZSksXHJcbiAgICAgICAgLy8gRm9yIHNvbWUgcmVhc29uLCBjaGFuZ2VzIGFyZSBlbWl0dGVkIGJlZm9yZSBsaXN0IGl0ZW0gcmVtb3ZlZCBmcm9tIGRvbSxcclxuICAgICAgICAvLyBzbyBkaW1lbnNpb25zIHdpbGwgYmUgaW5jb3JyZWN0LlxyXG4gICAgICAgIC8vIENoZWNrIGV2ZXJ5IDUwbXMgZm9yIGEgc2Vjb25kIGlmIGRvbSBhbmQgcXVlcnkgYXJlIGluIHN5bmMuXHJcbiAgICAgICAgLy8gT25jZSB0aGV5IHN5bmNocm9uaXplZCwgd2UgY2FuIGdldCBwcm9wZXIgZGltZW5zaW9ucy5cclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gaW50ZXJ2YWwoNTApLnBpcGUoXHJcbiAgICAgICAgICB0YWtlVW50aWwodGltZXIoMTAwMCkpLFxyXG4gICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuaW5TeW5jV2l0aERvbSgpKSxcclxuICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgKSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZ2V0Q29udGFpbmVyRGltZW5zaW9ucygpKSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKGRpbWVudGlvbnMgPT4gdGhpcy5jaGVja1Bvc2l0aW9uKGRpbWVudGlvbnMpKTtcclxuXHJcbiAgICAgIHRoaXMuZ2V0Q29udGFpbmVyRGltZW5zaW9ucygpLnN1YnNjcmliZShkaW1lbnRpb25zID0+IHRoaXMuY2hlY2tQb3NpdGlvbihkaW1lbnRpb25zKSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuYWxpdmUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGNoZWNrUG9zaXRpb24oeyBzY3JvbGxIZWlnaHQsIHNjcm9sbFRvcCwgY2xpZW50SGVpZ2h0IH06IE5iU2Nyb2xsYWJsZUNvbnRhaW5lckRpbWVudGlvbnMpIHtcclxuICAgIGNvbnN0IGluaXRpYWxDaGVjayA9IHRoaXMubGFzdFNjcm9sbFBvc2l0aW9uID09IG51bGw7XHJcbiAgICBjb25zdCBtYW51YWxDaGVjayA9IHRoaXMubGFzdFNjcm9sbFBvc2l0aW9uID09PSBzY3JvbGxUb3A7XHJcbiAgICBjb25zdCBzY3JvbGxVcCA9IHNjcm9sbFRvcCA8IHRoaXMubGFzdFNjcm9sbFBvc2l0aW9uO1xyXG4gICAgY29uc3Qgc2Nyb2xsRG93biA9IHNjcm9sbFRvcCA+IHRoaXMubGFzdFNjcm9sbFBvc2l0aW9uO1xyXG4gICAgY29uc3QgZGlzdGFuY2VUb0JvdHRvbSA9IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCAtIGNsaWVudEhlaWdodDtcclxuXHJcbiAgICBpZiAoKGluaXRpYWxDaGVjayB8fCAgbWFudWFsQ2hlY2sgfHwgc2Nyb2xsRG93bikgJiYgZGlzdGFuY2VUb0JvdHRvbSA8PSB0aGlzLnRocmVzaG9sZCkge1xyXG4gICAgICB0aGlzLmJvdHRvbVRocmVzaG9sZC5lbWl0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAoKGluaXRpYWxDaGVjayB8fCBzY3JvbGxVcCkgJiYgc2Nyb2xsVG9wIDw9IHRoaXMudGhyZXNob2xkKSB7XHJcbiAgICAgIHRoaXMudG9wVGhyZXNob2xkLmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxhc3RTY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFRvcDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q29udGFpbmVyRGltZW5zaW9ucygpOiBPYnNlcnZhYmxlPE5iU2Nyb2xsYWJsZUNvbnRhaW5lckRpbWVudGlvbnM+IHtcclxuICAgIGlmICh0aGlzLmVsZW1lbnRTY3JvbGwpIHtcclxuICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgICAgcmV0dXJuIG9ic2VydmFibGVPZih7IHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcmtKb2luKHRoaXMuc2Nyb2xsU2VydmljZS5nZXRQb3NpdGlvbigpLCB0aGlzLmRpbWVuc2lvbnNTZXJ2aWNlLmdldERpbWVuc2lvbnMoKSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKFtzY3JvbGxQb3NpdGlvbiwgZGltZW5zaW9uc10pID0+ICh7XHJcbiAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsUG9zaXRpb24ueSxcclxuICAgICAgICAgICAgc2Nyb2xsSGVpZ2h0OiBkaW1lbnNpb25zLnNjcm9sbEhlaWdodCxcclxuICAgICAgICAgICAgY2xpZW50SGVpZ2h0OiBkaW1lbnNpb25zLmNsaWVudEhlaWdodCxcclxuICAgICAgICAgIH0pKSxcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5TeW5jV2l0aERvbSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPT09IHRoaXMubGlzdEl0ZW1zLmxlbmd0aDtcclxuICB9XHJcbn1cclxuIl19