@greg-md/ng-elevator
Version:
Make a container to elevate on the screen while scrolling with Angular.
258 lines (251 loc) • 24.1 kB
JavaScript
import { Component, Input, HostBinding, HostListener, ElementRef, Renderer2, ChangeDetectionStrategy, ViewChildren, Inject, PLATFORM_ID, NgModule } from '@angular/core';
import { isPlatformBrowser, CommonModule } from '@angular/common';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @param {?} element
* @return {?}
*/
function offset(element) {
// Support: IE <=11 only
// Running getBoundingClientRect on a
// disconnected node in IE throws an error
if (!element || !element.getClientRects().length) {
return { top: 0, left: 0 };
}
var /** @type {?} */ docElem, /** @type {?} */ rect, /** @type {?} */ doc;
rect = element.getBoundingClientRect();
// Make sure element is not hidden (display: none)
if (rect.width || rect.height) {
doc = element.ownerDocument;
docElem = doc.documentElement;
return {
top: rect.top + window.pageYOffset - docElem.clientTop,
left: rect.left + window.pageXOffset - docElem.clientLeft
};
}
// Return zeros for disconnected and hidden elements (gh-2310)
return rect;
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ElevatorComponent = /** @class */ (function () {
function ElevatorComponent(elementRef, renderer, platformId) {
this.elementRef = elementRef;
this.renderer = renderer;
this.platformId = platformId;
this.lastPosition = 0;
this.marginTop = 0;
this.marginBottom = 0;
}
/**
* @return {?}
*/
ElevatorComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
this.initImagesLoad();
setTimeout(function () { return _this.reloadPositions(true); });
};
/**
* @return {?}
*/
ElevatorComponent.prototype.windowScroll = /**
* @return {?}
*/
function () {
this.reloadPositions();
};
/**
* @return {?}
*/
ElevatorComponent.prototype.windowResize = /**
* @return {?}
*/
function () {
this.reloadPositions(true);
};
/**
* @return {?}
*/
ElevatorComponent.prototype.initImagesLoad = /**
* @return {?}
*/
function () {
var _this = this;
this.images.forEach(function (img) {
var /** @type {?} */ loadUnload = _this.renderer.listen(img, 'load', function () {
_this.reloadPositions(true);
loadUnload();
});
});
};
/**
* @param {?=} keepPositions
* @return {?}
*/
ElevatorComponent.prototype.reloadPositions = /**
* @param {?=} keepPositions
* @return {?}
*/
function (keepPositions) {
if (keepPositions === void 0) { keepPositions = false; }
if (!isPlatformBrowser(this.platformId)) {
return;
}
this.reloadYPositions(keepPositions);
};
/**
* @param {?=} keepPositions
* @return {?}
*/
ElevatorComponent.prototype.reloadYPositions = /**
* @param {?=} keepPositions
* @return {?}
*/
function (keepPositions) {
if (keepPositions === void 0) { keepPositions = false; }
var /** @type {?} */ styles = getComputedStyle(this.elementRef.nativeElement);
var /** @type {?} */ elevatorMarginTop = parseFloat(styles.marginTop);
var /** @type {?} */ elevatorMarginBottom = parseFloat(styles.marginBottom);
var /** @type {?} */ elevatorHeight = this.elementRef.nativeElement.offsetHeight + elevatorMarginTop + elevatorMarginBottom;
if (elevatorHeight >= this.elementRef.nativeElement.parentNode.clientHeight) {
this.setPosition();
return;
}
var /** @type {?} */ isScrollDown = window.scrollY > this.lastPosition;
this.lastPosition = window.scrollY;
var /** @type {?} */ elevatorDiff = (window.innerHeight - (elevatorHeight + this.marginTop + this.marginBottom));
var /** @type {?} */ hostPosition = this.elementRef.nativeElement.parentNode.getBoundingClientRect();
var /** @type {?} */ hostTop = (hostPosition.top * -1) + this.marginTop;
var /** @type {?} */ hostBottom = (hostPosition.bottom - window.innerHeight) + this.marginBottom;
var /** @type {?} */ elevatorPosition = this.elementRef.nativeElement.getBoundingClientRect();
var /** @type {?} */ elevatorTop = (elevatorPosition.top * -1) + elevatorMarginTop + this.marginTop;
var /** @type {?} */ elevatorBottom = (elevatorPosition.bottom - window.innerHeight) + elevatorMarginBottom + this.marginBottom;
var /** @type {?} */ elevatorWidth = parseFloat(this.elementRef.nativeElement.parentNode.clientWidth)
- parseFloat(styles.marginLeft)
- parseFloat(styles.marginRight);
if (elevatorDiff >= 0 ? hostTop <= 0 : elevatorBottom > 0 && (!this.cssPosition || hostTop <= 0)) {
this.setPosition();
}
else {
if (elevatorDiff >= 0) {
if (hostBottom + elevatorDiff <= 0) {
this.setPosition('absolute', null, 0, elevatorWidth);
}
else {
this.setPosition('fixed', this.marginTop, null, elevatorWidth);
}
}
else {
this.setPosition('absolute', offset(this.elementRef.nativeElement).top - offset(this.elementRef.nativeElement.parentNode).top - elevatorMarginTop, null, elevatorWidth);
if (isScrollDown || keepPositions) {
if (hostBottom <= 0) {
this.setPosition('absolute', null, 0, elevatorWidth);
}
else if (elevatorBottom <= 0) {
this.setPosition('fixed', null, this.marginBottom);
}
}
else {
if (elevatorTop <= 0) {
this.setPosition('fixed', this.marginTop, null, elevatorWidth);
}
}
}
}
};
/**
* @return {?}
*/
ElevatorComponent.prototype.prepareAbsolutePositions = /**
* @return {?}
*/
function () {
var /** @type {?} */ styles = getComputedStyle(this.elementRef.nativeElement);
var /** @type {?} */ elevatorMarginTop = parseFloat(styles.marginTop);
this.setPosition('absolute', offset(this.elementRef.nativeElement).top - offset(this.elementRef.nativeElement.parentNode).top - elevatorMarginTop);
};
/**
* @param {?=} position
* @param {?=} top
* @param {?=} bottom
* @param {?=} width
* @return {?}
*/
ElevatorComponent.prototype.setPosition = /**
* @param {?=} position
* @param {?=} top
* @param {?=} bottom
* @param {?=} width
* @return {?}
*/
function (position, top, bottom, width) {
if (position === void 0) { position = null; }
if (top === void 0) { top = null; }
if (bottom === void 0) { bottom = null; }
if (width === void 0) { width = null; }
this.cssPosition = position;
this.cssTop = top;
this.cssBottom = bottom;
this.cssWidth = width;
};
ElevatorComponent.decorators = [
{ type: Component, args: [{
selector: 'greg-elevator',
template: '<ng-content></ng-content>',
styles: [':host { display: block; }'],
changeDetection: ChangeDetectionStrategy.OnPush,
},] },
];
/** @nocollapse */
ElevatorComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Renderer2 },
{ type: String, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
]; };
ElevatorComponent.propDecorators = {
marginTop: [{ type: Input }],
marginBottom: [{ type: Input }],
cssPosition: [{ type: HostBinding, args: ['style.position',] }],
cssTop: [{ type: HostBinding, args: ['style.top.px',] }],
cssBottom: [{ type: HostBinding, args: ['style.bottom.px',] }],
cssWidth: [{ type: HostBinding, args: ['style.width.px',] }],
images: [{ type: ViewChildren, args: ['img',] }],
windowScroll: [{ type: HostListener, args: ['window:scroll',] }],
windowResize: [{ type: HostListener, args: ['window:resize',] }]
};
return ElevatorComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var ElevatorModule = /** @class */ (function () {
function ElevatorModule() {
}
ElevatorModule.decorators = [
{ type: NgModule, args: [{
imports: [CommonModule],
declarations: [ElevatorComponent],
exports: [ElevatorComponent]
},] },
];
return ElevatorModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export { ElevatorComponent, ElevatorModule };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JlZy1tZC1uZy1lbGV2YXRvci5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQGdyZWctbWQvbmctZWxldmF0b3IvbGliL2VsZXZhdG9yLnV0aWxzLnRzIiwibmc6Ly9AZ3JlZy1tZC9uZy1lbGV2YXRvci9saWIvZWxldmF0b3IuY29tcG9uZW50LnRzIiwibmc6Ly9AZ3JlZy1tZC9uZy1lbGV2YXRvci9saWIvZWxldmF0b3IubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBvZmZzZXQoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgLy8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG4gIC8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGFcbiAgLy8gZGlzY29ubmVjdGVkIG5vZGUgaW4gSUUgdGhyb3dzIGFuIGVycm9yXG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCkge1xuICAgIHJldHVybiB7dG9wOiAwLCBsZWZ0OiAwfTtcbiAgfVxuXG4gIGxldCBkb2NFbGVtOiBIVE1MRWxlbWVudCwgcmVjdDogQ2xpZW50UmVjdCwgZG9jOiBEb2N1bWVudDtcblxuICByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAvLyBNYWtlIHN1cmUgZWxlbWVudCBpcyBub3QgaGlkZGVuIChkaXNwbGF5OiBub25lKVxuICBpZiAocmVjdC53aWR0aCB8fCByZWN0LmhlaWdodCkge1xuICAgIGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudDtcblxuICAgIHJldHVybiB7XG4gICAgICB0b3A6IHJlY3QudG9wICsgd2luZG93LnBhZ2VZT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRUb3AsXG4gICAgICBsZWZ0OiByZWN0LmxlZnQgKyB3aW5kb3cucGFnZVhPZmZzZXQgLSBkb2NFbGVtLmNsaWVudExlZnRcbiAgICB9O1xuICB9XG5cbiAgLy8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoZ2gtMjMxMClcbiAgcmV0dXJuIHJlY3Q7XG59XG4iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBFbGVtZW50UmVmLFxuICBBZnRlclZpZXdJbml0LFxuICBSZW5kZXJlcjIsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBWaWV3Q2hpbGRyZW4sXG4gIFF1ZXJ5TGlzdCxcbiAgSW5qZWN0LFxuICBQTEFURk9STV9JRFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgb2Zmc2V0IH0gZnJvbSAnLi9lbGV2YXRvci51dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dyZWctZWxldmF0b3InLFxuICB0ZW1wbGF0ZTogJzxuZy1jb250ZW50PjwvbmctY29udGVudD4nLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRWxldmF0b3JDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgbGFzdFBvc2l0aW9uID0gMDtcblxuICBASW5wdXQoKSBtYXJnaW5Ub3AgPSAwO1xuICBASW5wdXQoKSBtYXJnaW5Cb3R0b20gPSAwO1xuXG4gIEBIb3N0QmluZGluZygnc3R5bGUucG9zaXRpb24nKSBjc3NQb3NpdGlvbjogc3RyaW5nO1xuXG4gIEBIb3N0QmluZGluZygnc3R5bGUudG9wLnB4JykgY3NzVG9wOiBudW1iZXI7XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5ib3R0b20ucHgnKSBjc3NCb3R0b206IG51bWJlcjtcblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLndpZHRoLnB4JykgY3NzV2lkdGg6IG51bWJlcjtcblxuICBAVmlld0NoaWxkcmVuKCdpbWcnKSBpbWFnZXM6IFF1ZXJ5TGlzdDxhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBzdHJpbmdcbiAgKSB7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5pbml0SW1hZ2VzTG9hZCgpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlbG9hZFBvc2l0aW9ucyh0cnVlKSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJylcbiAgd2luZG93U2Nyb2xsKCkge1xuICAgIHRoaXMucmVsb2FkUG9zaXRpb25zKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgd2luZG93UmVzaXplKCkge1xuICAgIHRoaXMucmVsb2FkUG9zaXRpb25zKHRydWUpO1xuICB9XG5cbiAgaW5pdEltYWdlc0xvYWQoKSB7XG4gICAgdGhpcy5pbWFnZXMuZm9yRWFjaChpbWcgPT4ge1xuICAgICAgY29uc3QgbG9hZFVubG9hZCA9IHRoaXMucmVuZGVyZXIubGlzdGVuKGltZywgJ2xvYWQnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVsb2FkUG9zaXRpb25zKHRydWUpO1xuXG4gICAgICAgIGxvYWRVbmxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmVsb2FkUG9zaXRpb25zKGtlZXBQb3NpdGlvbnMgPSBmYWxzZSkge1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVsb2FkWVBvc2l0aW9ucyhrZWVwUG9zaXRpb25zKTtcbiAgfVxuXG4gIHJlbG9hZFlQb3NpdGlvbnMoa2VlcFBvc2l0aW9ucyA9IGZhbHNlKSB7XG4gICAgY29uc3Qgc3R5bGVzID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG5cbiAgICBjb25zdCBlbGV2YXRvck1hcmdpblRvcCA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpblRvcCk7XG4gICAgY29uc3QgZWxldmF0b3JNYXJnaW5Cb3R0b20gPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5Cb3R0b20pO1xuXG4gICAgY29uc3QgZWxldmF0b3JIZWlnaHQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgKyBlbGV2YXRvck1hcmdpblRvcCArIGVsZXZhdG9yTWFyZ2luQm90dG9tO1xuXG4gICAgaWYgKGVsZXZhdG9ySGVpZ2h0ID49IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudE5vZGUuY2xpZW50SGVpZ2h0KSB7XG4gICAgICB0aGlzLnNldFBvc2l0aW9uKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc1Njcm9sbERvd24gPSB3aW5kb3cuc2Nyb2xsWSA+IHRoaXMubGFzdFBvc2l0aW9uO1xuXG4gICAgdGhpcy5sYXN0UG9zaXRpb24gPSB3aW5kb3cuc2Nyb2xsWTtcblxuICAgIGNvbnN0IGVsZXZhdG9yRGlmZiA9ICh3aW5kb3cuaW5uZXJIZWlnaHQgLSAoZWxldmF0b3JIZWlnaHQgKyB0aGlzLm1hcmdpblRvcCArIHRoaXMubWFyZ2luQm90dG9tKSk7XG5cbiAgICBjb25zdCBob3N0UG9zaXRpb24gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgY29uc3QgaG9zdFRvcCA9IChob3N0UG9zaXRpb24udG9wICogLTEpICsgdGhpcy5tYXJnaW5Ub3A7XG5cbiAgICBjb25zdCBob3N0Qm90dG9tID0gKGhvc3RQb3NpdGlvbi5ib3R0b20gLSB3aW5kb3cuaW5uZXJIZWlnaHQpICsgdGhpcy5tYXJnaW5Cb3R0b207XG5cbiAgICBjb25zdCBlbGV2YXRvclBvc2l0aW9uID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCBlbGV2YXRvclRvcCA9IChlbGV2YXRvclBvc2l0aW9uLnRvcCAqIC0xKSArIGVsZXZhdG9yTWFyZ2luVG9wICsgdGhpcy5tYXJnaW5Ub3A7XG5cbiAgICBjb25zdCBlbGV2YXRvckJvdHRvbSA9IChlbGV2YXRvclBvc2l0aW9uLmJvdHRvbSAtIHdpbmRvdy5pbm5lckhlaWdodCkgKyBlbGV2YXRvck1hcmdpbkJvdHRvbSArIHRoaXMubWFyZ2luQm90dG9tO1xuXG4gICAgY29uc3QgZWxldmF0b3JXaWR0aCA9IHBhcnNlRmxvYXQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50Tm9kZS5jbGllbnRXaWR0aClcbiAgICAgIC0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luTGVmdClcbiAgICAgIC0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luUmlnaHQpO1xuXG4gICAgaWYgKGVsZXZhdG9yRGlmZiA+PSAwID8gaG9zdFRvcCA8PSAwIDogZWxldmF0b3JCb3R0b20gPiAwICYmICghdGhpcy5jc3NQb3NpdGlvbiB8fCBob3N0VG9wIDw9IDApKSB7XG4gICAgICB0aGlzLnNldFBvc2l0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbGV2YXRvckRpZmYgPj0gMCkge1xuICAgICAgICBpZiAoaG9zdEJvdHRvbSArIGVsZXZhdG9yRGlmZiA8PSAwKSB7XG4gICAgICAgICAgdGhpcy5zZXRQb3NpdGlvbignYWJzb2x1dGUnLCBudWxsLCAwLCBlbGV2YXRvcldpZHRoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKCdmaXhlZCcsIHRoaXMubWFyZ2luVG9wLCBudWxsLCBlbGV2YXRvcldpZHRoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihcbiAgICAgICAgICAnYWJzb2x1dGUnLFxuICAgICAgICAgIG9mZnNldCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkudG9wIC0gb2Zmc2V0KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudE5vZGUpLnRvcCAtIGVsZXZhdG9yTWFyZ2luVG9wLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgZWxldmF0b3JXaWR0aFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChpc1Njcm9sbERvd24gfHwga2VlcFBvc2l0aW9ucykge1xuICAgICAgICAgIGlmIChob3N0Qm90dG9tIDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24oJ2Fic29sdXRlJywgbnVsbCwgMCwgZWxldmF0b3JXaWR0aCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChlbGV2YXRvckJvdHRvbSA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKCdmaXhlZCcsIG51bGwsIHRoaXMubWFyZ2luQm90dG9tKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGVsZXZhdG9yVG9wIDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24oJ2ZpeGVkJywgdGhpcy5tYXJnaW5Ub3AsIG51bGwsIGVsZXZhdG9yV2lkdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByZXBhcmVBYnNvbHV0ZVBvc2l0aW9ucygpIHtcbiAgICBjb25zdCBzdHlsZXMgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcblxuICAgIGNvbnN0IGVsZXZhdG9yTWFyZ2luVG9wID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luVG9wKTtcblxuICAgIHRoaXMuc2V0UG9zaXRpb24oXG4gICAgICAnYWJzb2x1dGUnLFxuICAgICAgb2Zmc2V0KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS50b3AgLSBvZmZzZXQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50Tm9kZSkudG9wIC0gZWxldmF0b3JNYXJnaW5Ub3BcbiAgICApO1xuICB9XG5cbiAgc2V0UG9zaXRpb24ocG9zaXRpb246IHN0cmluZyA9IG51bGwsIHRvcDogbnVtYmVyID0gbnVsbCwgYm90dG9tOiBudW1iZXIgPSBudWxsLCB3aWR0aDogbnVtYmVyID0gbnVsbCkge1xuICAgIHRoaXMuY3NzUG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICB0aGlzLmNzc1RvcCA9IHRvcDtcbiAgICB0aGlzLmNzc0JvdHRvbSA9IGJvdHRvbTtcbiAgICB0aGlzLmNzc1dpZHRoID0gd2lkdGg7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBFbGV2YXRvckNvbXBvbmVudCB9IGZyb20gJy4vZWxldmF0b3IuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0VsZXZhdG9yQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW0VsZXZhdG9yQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBFbGV2YXRvck1vZHVsZSB7XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSxnQkFBdUIsT0FBb0I7Ozs7SUFJekMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxNQUFNLEVBQUU7UUFDaEQsT0FB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