projecte_ionic/node_modules/@ionic/angular/esm5/directives/virtual-scroll/virtual-scroll.js
2022-02-09 18:30:03 +01:00

117 lines
No EOL
20 KiB
JavaScript
Executable file

import * as tslib_1 from "tslib";
import { ChangeDetectionStrategy, Component, ContentChild, ElementRef, EmbeddedViewRef, IterableDiffer, IterableDiffers, NgZone, SimpleChanges, TrackByFunction } from '@angular/core';
import { ProxyCmp } from '../proxies-utils';
import { VirtualFooter } from './virtual-footer';
import { VirtualHeader } from './virtual-header';
import { VirtualItem } from './virtual-item';
var IonVirtualScroll = /** @class */ (function () {
function IonVirtualScroll(z, iterableDiffers, elementRef) {
this.z = z;
this.iterableDiffers = iterableDiffers;
this.refMap = new WeakMap();
this.el = elementRef.nativeElement;
this.el.nodeRender = this.nodeRender.bind(this);
}
IonVirtualScroll.prototype.ngOnChanges = function (changes) {
if (this.trackBy && 'items' in changes) {
// React on virtualScroll changes only once all inputs have been initialized
var value = changes['items'].currentValue;
if (this.differ === undefined && value != null) {
try {
this.differ = this.iterableDiffers.find(value).create(this.trackBy);
}
catch (e) {
throw new Error("Cannot find a differ supporting object '" + value + "'. VirtualScroll only supports binding to Iterables such as Arrays.");
}
}
}
};
IonVirtualScroll.prototype.ngDoCheck = function () {
// and if there actually are changes
var changes = this.differ !== undefined && this.items ? this.differ.diff(this.items) : null;
if (changes === null) {
return;
}
// TODO: optimize
this.checkRange(0);
};
IonVirtualScroll.prototype.nodeRender = function (el, cell, index) {
var _this = this;
return this.z.run(function () {
var node;
if (!el) {
node = _this.itmTmp.viewContainer.createEmbeddedView(_this.getComponent(cell.type), { $implicit: cell.value, index: index }, index);
el = getElement(node);
_this.refMap.set(el, node);
}
else {
node = _this.refMap.get(el);
var ctx = node.context;
ctx.$implicit = cell.value;
ctx.index = cell.index;
}
// run sync change detections
node.detectChanges();
return el;
});
};
IonVirtualScroll.prototype.getComponent = function (type) {
switch (type) {
case 'item': return this.itmTmp.templateRef;
case 'header': return this.hdrTmp.templateRef;
case 'footer': return this.ftrTmp.templateRef;
}
throw new Error('template for virtual item was not provided');
};
IonVirtualScroll.ctorParameters = function () { return [
{ type: NgZone },
{ type: IterableDiffers },
{ type: ElementRef }
]; };
tslib_1.__decorate([
ContentChild(VirtualItem, { static: false })
], IonVirtualScroll.prototype, "itmTmp", void 0);
tslib_1.__decorate([
ContentChild(VirtualHeader, { static: false })
], IonVirtualScroll.prototype, "hdrTmp", void 0);
tslib_1.__decorate([
ContentChild(VirtualFooter, { static: false })
], IonVirtualScroll.prototype, "ftrTmp", void 0);
IonVirtualScroll = tslib_1.__decorate([
ProxyCmp({
inputs: ['approxItemHeight', 'approxHeaderHeight', 'approxFooterHeight', 'headerFn', 'footerFn', 'items', 'itemHeight', 'headerHeight', 'footerHeight'],
methods: ['checkEnd', 'checkRange', 'positionForItem']
}),
Component({
selector: 'ion-virtual-scroll',
template: '<ng-content></ng-content>',
changeDetection: ChangeDetectionStrategy.OnPush,
inputs: [
'approxItemHeight',
'approxHeaderHeight',
'approxFooterHeight',
'headerFn',
'footerFn',
'items',
'itemHeight',
'headerHeight',
'footerHeight',
'trackBy'
]
})
], IonVirtualScroll);
return IonVirtualScroll;
}());
export { IonVirtualScroll };
var getElement = function (view) {
var rootNodes = view.rootNodes;
for (var i = 0; i < rootNodes.length; i++) {
if (rootNodes[i].nodeType === 1) {
return rootNodes[i];
}
}
throw new Error('virtual element was not created');
};
var ɵ0 = getElement;
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC1zY3JvbGwuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaW9uaWMvYW5ndWxhci8iLCJzb3VyY2VzIjpbImRpcmVjdGl2ZXMvdmlydHVhbC1zY3JvbGwvdmlydHVhbC1zY3JvbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd2TCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFnSTdDO0lBVUUsMEJBQ1UsQ0FBUyxFQUNULGVBQWdDLEVBQ3hDLFVBQXNCO1FBRmQsTUFBQyxHQUFELENBQUMsQ0FBUTtRQUNULG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQVJsQyxXQUFNLEdBQUcsSUFBSSxPQUFPLEVBQWdELENBQUM7UUFXM0UsSUFBSSxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsYUFBNEMsQ0FBQztRQUNsRSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsc0NBQVcsR0FBWCxVQUFZLE9BQXNCO1FBQ2hDLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLElBQUksT0FBTyxFQUFFO1lBQ3RDLDRFQUE0RTtZQUM1RSxJQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDO1lBQzVDLElBQUksSUFBSSxD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YW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgRWxlbWVudFJlZiwgRW1iZWRkZWRWaWV3UmVmLCBJdGVyYWJsZURpZmZlciwgSXRlcmFibGVEaWZmZXJzLCBOZ1pvbmUsIFNpbXBsZUNoYW5nZXMsIFRyYWNrQnlGdW5jdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2VsbCwgQ2VsbFR5cGUsIEZvb3RlckhlaWdodEZuLCBIZWFkZXJGbiwgSGVhZGVySGVpZ2h0Rm4sIEl0ZW1IZWlnaHRGbiB9IGZyb20gJ0Bpb25pYy9jb3JlJztcblxuaW1wb3J0IHsgUHJveHlDbXAgfSBmcm9tICcuLi9wcm94aWVzLXV0aWxzJztcblxuaW1wb3J0IHsgVmlydHVhbEZvb3RlciB9IGZyb20gJy4vdmlydHVhbC1mb290ZXInO1xuaW1wb3J0IHsgVmlydHVhbEhlYWRlciB9IGZyb20gJy4vdmlydHVhbC1oZWFkZXInO1xuaW1wb3J0IHsgVmlydHVhbEl0ZW0gfSBmcm9tICcuL3ZpcnR1YWwtaXRlbSc7XG5pbXBvcnQgeyBWaXJ0dWFsQ29udGV4dCB9IGZyb20gJy4vdmlydHVhbC11dGlscyc7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJb25WaXJ0dWFsU2Nyb2xsIHtcbiAgLyoqXG4gICAqIEl0IGlzIGltcG9ydGFudCB0byBwcm92aWRlIHRoaXNcbiAgICogaWYgdmlydHVhbCBpdGVtIGhlaWdodCB3aWxsIGJlIHNpZ25pZmljYW50bHkgbGFyZ2VyIHRoYW4gdGhlIGRlZmF1bHRcbiAgICogVGhlIGFwcHJveGltYXRlIGhlaWdodCBvZiBlYWNoIHZpcnR1YWwgaXRlbSB0ZW1wbGF0ZSdzIGNlbGwuXG4gICAqIFRoaXMgZGltZW5zaW9uIGlzIHVzZWQgdG8gaGVscCBkZXRlcm1pbmUgaG93IG1hbnkgY2VsbHMgc2hvdWxkXG4gICAqIGJlIGNyZWF0ZWQgd2hlbiBpbml0aWFsaXplZCwgYW5kIHRvIGhlbHAgY2FsY3VsYXRlIHRoZSBoZWlnaHQgb2ZcbiAgICogdGhlIHNjcm9sbGFibGUgYXJlYS4gVGhpcyBoZWlnaHQgdmFsdWUgY2FuIG9ubHkgdXNlIGBweGAgdW5pdHMuXG4gICAqIE5vdGUgdGhhdCB0aGUgYWN0dWFsIHJlbmRlcmVkIHNpemUgb2YgZWFjaCBjZWxsIGNvbWVzIGZyb20gdGhlXG4gICAqIGFwcCdzIENTUywgd2hlcmVhcyB0aGlzIGFwcHJveGltYXRpb24gaXMgdXNlZCB0byBoZWxwIGNhbGN1bGF0ZVxuICAgKiBpbml0aWFsIGRpbWVuc2lvbnMgYmVmb3JlIHRoZSBpdGVtIGhhcyBiZWVuIHJlbmRlcmVkLlxuICAgKi9cbiAgYXBwcm94SXRlbUhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgYXBwcm94aW1hdGUgaGVpZ2h0IG9mIGVhY2ggaGVhZGVyIHRlbXBsYXRlJ3MgY2VsbC5cbiAgICogVGhpcyBkaW1lbnNpb24gaXMgdXNlZCB0byBoZWxwIGRldGVybWluZSBob3cgbWFueSBjZWxscyBzaG91bGRcbiAgICogYmUgY3JlYXRlZCB3aGVuIGluaXRpYWxpemVkLCBhbmQgdG8gaGVscCBjYWxjdWxhdGUgdGhlIGhlaWdodCBvZlxuICAgKiB0aGUgc2Nyb2xsYWJsZSBhcmVhLiBUaGlzIGhlaWdodCB2YWx1ZSBjYW4gb25seSB1c2UgYHB4YCB1bml0cy5cbiAgICogTm90ZSB0aGF0IHRoZSBhY3R1YWwgcmVuZGVyZWQgc2l6ZSBvZiBlYWNoIGNlbGwgY29tZXMgZnJvbSB0aGVcbiAgICogYXBwJ3MgQ1NTLCB3aGVyZWFzIHRoaXMgYXBwcm94aW1hdGlvbiBpcyB1c2VkIHRvIGhlbHAgY2FsY3VsYXRlXG4gICAqIGluaXRpYWwgZGltZW5zaW9ucyBiZWZvcmUgdGhlIGl0ZW0gaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAqL1xuICBhcHByb3hIZWFkZXJIZWlnaHQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGFwcHJveGltYXRlIHdpZHRoIG9mIGVhY2ggZm9vdGVyIHRlbXBsYXRlJ3MgY2VsbC5cbiAgICogVGhpcyBkaW1lbnNpb24gaXMgdXNlZCB0byBoZWxwIGRldGVybWluZSBob3cgbWFueSBjZWxscyBzaG91bGRcbiAgICogYmUgY3JlYXRlZCB3aGVuIGluaXRpYWxpemVkLCBhbmQgdG8gaGVscCBjYWxjdWxhdGUgdGhlIGhlaWdodCBvZlxuICAgKiB0aGUgc2Nyb2xsYWJsZSBhcmVhLiBUaGlzIGhlaWdodCB2YWx1ZSBjYW4gb25seSB1c2UgYHB4YCB1bml0cy5cbiAgICogTm90ZSB0aGF0IHRoZSBhY3R1YWwgcmVuZGVyZWQgc2l6ZSBvZiBlYWNoIGNlbGwgY29tZXMgZnJvbSB0aGVcbiAgICogYXBwJ3MgQ1NTLCB3aGVyZWFzIHRoaXMgYXBwcm94aW1hdGlvbiBpcyB1c2VkIHRvIGhlbHAgY2FsY3VsYXRlXG4gICAqIGluaXRpYWwgZGltZW5zaW9ucyBiZWZvcmUgdGhlIGl0ZW0gaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAqL1xuICBhcHByb3hGb290ZXJIZWlnaHQ6IG51bWJlcjtcblxuICAvKipcbiAgICogU2VjdGlvbiBoZWFkZXJzIGFuZCB0aGUgZGF0YSB1c2VkIHdpdGhpbiBpdHMgZ2l2ZW5cbiAgICogdGVtcGxhdGUgY2FuIGJlIGR5bmFtaWNhbGx5IGNyZWF0ZWQgYnkgcGFzc2luZyBhIGZ1bmN0aW9uIHRvIGBoZWFkZXJGbmAuXG4gICAqIEZvciBleGFtcGxlLCBhIGxhcmdlIGxpc3Qgb2YgY29udGFjdHMgdXN1YWxseSBoYXMgZGl2aWRlcnMgYmV0d2VlbiBlYWNoXG4gICAqIGxldHRlciBpbiB0aGUgYWxwaGFiZXQuIEFwcCdzIGNhbiBwcm92aWRlIHRoZWlyIG93biBjdXN0b20gYGhlYWRlckZuYFxuICAgKiB3aGljaCBpcyBjYWxsZWQgd2l0aCBlYWNoIHJlY29yZCB3aXRoaW4gdGhlIGRhdGFzZXQuIFRoZSBsb2dpYyB3aXRoaW5cbiAgICogdGhlIGhlYWRlciBmdW5jdGlvbiBjYW4gZGVjaWRlIGlmIHRoZSBoZWFkZXIgdGVtcGxhdGUgc2hvdWxkIGJlIHVzZWQsXG4gICAqIGFuZCB3aGF0IGRhdGEgdG8gZ2l2ZSB0byB0aGUgaGVhZGVyIHRlbXBsYXRlLiBUaGUgZnVuY3Rpb24gbXVzdCByZXR1cm5cbiAgICogYG51bGxgIGlmIGEgaGVhZGVyIGNlbGwgc2hvdWxkbid0IGJlIGNyZWF0ZWQuXG4gICAqL1xuICBoZWFkZXJGbj86IEhlYWRlckZuO1xuXG4gIC8qKlxuICAgKiBTZWN0aW9uIGZvb3RlcnMgYW5kIHRoZSBkYXRhIHVzZWQgd2l0aGluIGl0cyBnaXZlblxuICAgKiB0ZW1wbGF0ZSBjYW4gYmUgZHluYW1pY2FsbHkgY3JlYXRlZCBieSBwYXNzaW5nIGEgZnVuY3Rpb24gdG8gYGZvb3RlckZuYC5cbiAgICogVGhlIGxvZ2ljIHdpdGhpbiB0aGUgZm9vdGVyIGZ1bmN0aW9uIGNhbiBkZWNpZGUgaWYgdGhlIGZvb3RlciB0ZW1wbGF0ZVxuICAgKiBzaG91bGQgYmUgdXNlZCwgYW5kIHdoYXQgZGF0YSB0byBnaXZlIHRvIHRoZSBmb290ZXIgdGVtcGxhdGUuIFRoZSBmdW5jdGlvblxuICAgKiBtdXN0IHJldHVybiBgbnVsbGAgaWYgYSBmb290ZXIgY2VsbCBzaG91bGRuJ3QgYmUgY3JlYXRlZC5cbiAgICovXG4gIGZvb3RlckZuPzogSGVhZGVyRm47XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIHRoYXQgYnVpbGRzIHRoZSB0ZW1wbGF0ZXMgd2l0aGluIHRoZSB2aXJ0dWFsIHNjcm9sbC5cbiAgICogSXQncyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHdoZW4gdGhpcyBkYXRhIGhhcyBjaGFuZ2VkLCB0aGVuIHRoZVxuICAgKiBlbnRpcmUgdmlydHVhbCBzY3JvbGwgaXMgcmVzZXQsIHdoaWNoIGlzIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24gYW5kXG4gICAqIHNob3VsZCBiZSBhdm9pZGVkIGlmIHBvc3NpYmxlLlxuICAgKi9cbiAgaXRlbXM/OiBhbnlbXSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgbWFwcyBlYWNoIGl0ZW0gd2l0aGluIHRoZWlyIGhlaWdodC5cbiAgICogV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCBoZWF2eSBvcHRpbWl6YXRpb25zIGFuZCBmYXN0IHBhdGggY2FuIGJlIHRha2VkIGJ5XG4gICAqIGBpb24tdmlydHVhbC1zY3JvbGxgIGxlYWRpbmcgdG8gbWFzc2l2ZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHNraXAgYWxsIERPTSByZWFkcywgd2hpY2ggY2FuIGJlIERvaW5nIHNvIGxlYWRzXG4gICAqIHRvIG1hc3NpdmUgcGVyZm9ybWFuY2VcbiAgICovXG4gIGl0ZW1IZWlnaHQ/OiBJdGVtSGVpZ2h0Rm47XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgbWFwcyBlYWNoIGl0ZW0gaGVhZGVyIHdpdGhpbiB0aGVpciBoZWlnaHQuXG4gICAqL1xuICBoZWFkZXJIZWlnaHQ/OiBIZWFkZXJIZWlnaHRGbjtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBtYXBzIGVhY2ggaXRlbSBmb290ZXIgd2l0aGluIHRoZWlyIGhlaWdodC5cbiAgICovXG4gIGZvb3RlckhlaWdodD86IEZvb3RlckhlaWdodEZuO1xuXG4gIC8qKlxuICAgKiBTYW1lIGFzIGBuZ0ZvclRyYWNrQnlgIHdoaWNoIGNhbiBiZSB1c2VkIG9uIGBuZ0ZvcmAuXG4gICAqL1xuICB0cmFja0J5OiBUcmFja0J5RnVuY3Rpb248YW55PjtcblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgbWFya3MgdGhlIHRhaWwgdGhlIGl0ZW1zIGFycmF5IGFzIGRpcnR5LCBzbyB0aGV5IGNhbiBiZSByZS1yZW5kZXJlZC4gIEl0J3MgZXF1aXZhbGVudCB0byBjYWxsaW5nOiAgYGBganMgICAgKiB2aXJ0dWFsU2Nyb2xsLmNoZWNrUmFuZ2UobGFzdEl0ZW1MZW4sIGl0ZW1zLmxlbmd0aCAtIGxhc3RJdGVtTGVuKTsgICAgKiBgYGBcbiAgICovXG4gICdjaGVja0VuZCc6ICgpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBtYXJrcyBhIHN1YnNldCBvZiBpdGVtcyBhcyBkaXJ0eSwgc28gdGhleSBjYW4gYmUgcmUtcmVuZGVyZWQuIEl0ZW1zIHNob3VsZCBiZSBtYXJrZWQgYXMgZGlydHkgYW55IHRpbWUgdGhlIGNvbnRlbnQgb3IgdGhlaXIgc3R5bGUgY2hhbmdlcy4gIFRoZSBzdWJzZXQgb2YgaXRlbXMgdG8gYmUgdXBkYXRlZCBjYW4gYXJlIHNwZWNpZmluZyBieSBhbiBvZmZzZXQgYW5kIGEgbGVuZ3RoLlxuICAgKi9cbiAgJ2NoZWNrUmFuZ2UnOiAob2Zmc2V0OiBudW1iZXIsIGxlbj86IG51bWJlcikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSB2aXJ0dWFsIGl0ZW0gYXQgdGhlIGdpdmVuIGluZGV4LlxuICAgKi9cbiAgJ3Bvc2l0aW9uRm9ySXRlbSc6IChpbmRleDogbnVtYmVyKSA9PiBQcm9taXNlPG51bWJlcj47XG59XG5cbkBQcm94eUNtcCh7XG4gIGlucHV0czogWydhcHByb3hJdGVtSGVpZ2h0JywgJ2FwcHJveEhlYWRlckhlaWdodCcsICdhcHByb3hGb290ZXJIZWlnaHQnLCAnaGVhZGVyRm4nLCAnZm9vdGVyRm4nLCAnaXRlbXMnLCAnaXRlbUhlaWdodCcsICdoZWFkZXJIZWlnaHQnLCAnZm9vdGVySGVpZ2h0J10sXG4gIG1ldGhvZHM6IFsnY2hlY2tFbmQnLCAnY2hlY2tSYW5nZScsICdwb3NpdGlvbkZvckl0ZW0nXVxufSlcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2lvbi12aXJ0dWFsLXNjcm9sbCcsXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PicsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbnB1dHM6IFtcbiAgICAnYXBwcm94SXRlbUhlaWdodCcsXG4gICAgJ2FwcHJveEhlYWRlckhlaWdodCcsXG4gICAgJ2FwcHJveEZvb3RlckhlaWdodCcsXG4gICAgJ2hlYWRlckZuJyxcbiAgICAnZm9vdGVyRm4nLFxuICAgICdpdGVtcycsXG4gICAgJ2l0ZW1IZWlnaHQnLFxuICAgICdoZWFkZXJIZWlnaHQnLFxuICAgICdmb290ZXJIZWlnaHQnLFxuICAgICd0cmFja0J5J1xuICBdXG59KVxuZXhwb3J0IGNsYXNzIElvblZpcnR1YWxTY3JvbGwge1xuXG4gIHByaXZhdGUgZGlmZmVyPzogSXRlcmFibGVEaWZmZXI8YW55PjtcbiAgcHJpdmF0ZSBlbDogSFRNTElvblZpcnR1YWxTY3JvbGxFbGVtZW50O1xuICBwcml2YXRlIHJlZk1hcCA9IG5ldyBXZWFrTWFwPEhUTUxFbGVtZW50LCBFbWJlZGRlZFZpZXdSZWY8VmlydHVhbENvbnRleHQ+PigpO1xuXG4gIEBDb250ZW50Q2hpbGQoVmlydHVhbEl0ZW0sIHsgc3RhdGljOiBmYWxzZSB9KSBpdG1UbXAhOiBWaXJ0dWFsSXRlbTtcbiAgQENvbnRlbnRDaGlsZChWaXJ0dWFsSGVhZGVyLCB7IHN0YXRpYzogZmFsc2UgfSkgaGRyVG1wITogVmlydHVhbEhlYWRlcjtcbiAgQENvbnRlbnRDaGlsZChWaXJ0dWFsRm9vdGVyLCB7IHN0YXRpYzogZmFsc2UgfSkgZnRyVG1wITogVmlydHVhbEZvb3RlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHo6IE5nWm9uZSxcbiAgICBwcml2YXRlIGl0ZXJhYmxlRGlmZmVyczogSXRlcmFibGVEaWZmZXJzLFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICkge1xuICAgIHRoaXMuZWwgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTElvblZpcnR1YWxTY3JvbGxFbGVtZW50O1xuICAgIHRoaXMuZWwubm9kZVJlbmRlciA9IHRoaXMubm9kZVJlbmRlci5iaW5kKHRoaXMpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRyYWNrQnkgJiYgJ2l0ZW1zJyBpbiBjaGFuZ2VzKSB7XG4gICAgICAvLyBSZWFjdCBvbiB2aXJ0dWFsU2Nyb2xsIGNoYW5nZXMgb25seSBvbmNlIGFsbCBpbnB1dHMgaGF2ZSBiZWVuIGluaXRpYWxpemVkXG4gICAgICBjb25zdCB2YWx1ZSA9IGNoYW5nZXNbJ2l0ZW1zJ10uY3VycmVudFZhbHVlO1xuICAgICAgaWYgKHRoaXMuZGlmZmVyID09PSB1bmRlZmluZWQgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuZGlmZmVyID0gdGhpcy5pdGVyYWJsZURpZmZlcnMuZmluZCh2YWx1ZSkuY3JlYXRlKHRoaXMudHJhY2tCeSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGZpbmQgYSBkaWZmZXIgc3VwcG9ydGluZyBvYmplY3QgJyR7dmFsdWV9Jy4gVmlydHVhbFNjcm9sbCBvbmx5IHN1cHBvcnRzIGJpbmRpbmcgdG8gSXRlcmFibGVzIHN1Y2ggYXMgQXJyYXlzLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCkge1xuICAgIC8vIGFuZCBpZiB0aGVyZSBhY3R1YWxseSBhcmUgY2hhbmdlc1xuICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLmRpZmZlciAhPT0gdW5kZWZpbmVkICYmIHRoaXMuaXRlbXMgPyB0aGlzLmRpZmZlci5kaWZmKHRoaXMuaXRlbXMpIDogbnVsbDtcbiAgICBpZiAoY2hhbmdlcyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUT0RPOiBvcHRpbWl6ZVxuICAgIHRoaXMuY2hlY2tSYW5nZSgwKTtcbiAgfVxuXG4gIHByaXZhdGUgbm9kZVJlbmRlcihlbDogSFRNTEVsZW1lbnQgfCBudWxsLCBjZWxsOiBDZWxsLCBpbmRleDogbnVtYmVyKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLnoucnVuKCgpID0+IHtcbiAgICAgIGxldCBub2RlOiBFbWJlZGRlZFZpZXdSZWY8VmlydHVhbENvbnRleHQ+O1xuICAgICAgaWYgKCFlbCkge1xuICAgICAgICBub2RlID0gdGhpcy5pdG1UbXAudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcoXG4gICAgICAgICAgdGhpcy5nZXRDb21wb25lbnQoY2VsbC50eXBlKSxcbiAgICAgICAgICB7ICRpbXBsaWNpdDogY2VsbC52YWx1ZSwgaW5kZXggfSxcbiAgICAgICAgICBpbmRleFxuICAgICAgICApO1xuICAgICAgICBlbCA9IGdldEVsZW1lbnQobm9kZSk7XG4gICAgICAgIHRoaXMucmVmTWFwLnNldChlbCwgbm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlID0gdGhpcy5yZWZNYXAuZ2V0KGVsKSE7XG4gICAgICAgIGNvbnN0IGN0eCA9IG5vZGUuY29udGV4dDtcbiAgICAgICAgY3R4LiRpbXBsaWNpdCA9IGNlbGwudmFsdWU7XG4gICAgICAgIGN0eC5pbmRleCA9IGNlbGwuaW5kZXg7XG4gICAgICB9XG4gICAgICAvLyBydW4gc3luYyBjaGFuZ2UgZGV0ZWN0aW9uc1xuICAgICAgbm9kZS5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICByZXR1cm4gZWw7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbXBvbmVudCh0eXBlOiBDZWxsVHlwZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnaXRlbSc6IHJldHVybiB0aGlzLml0bVRtcC50ZW1wbGF0ZVJlZjtcbiAgICAgIGNhc2UgJ2hlYWRlcic6IHJldHVybiB0aGlzLmhkclRtcC50ZW1wbGF0ZVJlZjtcbiAgICAgIGNhc2UgJ2Zvb3Rlcic6IHJldHVybiB0aGlzLmZ0clRtcC50ZW1wbGF0ZVJlZjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0ZW1wbGF0ZSBmb3IgdmlydHVhbCBpdGVtIHdhcyBub3QgcHJvdmlkZWQnKTtcbiAgfVxufVxuXG5jb25zdCBnZXRFbGVtZW50ID0gKHZpZXc6IEVtYmVkZGVkVmlld1JlZjxWaXJ0dWFsQ29udGV4dD4pOiBIVE1MRWxlbWVudCA9PiB7XG4gIGNvbnN0IHJvb3ROb2RlcyA9IHZpZXcucm9vdE5vZGVzO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJvb3ROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyb290Tm9kZXNbaV0ubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgIHJldHVybiByb290Tm9kZXNbaV07XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcigndmlydHVhbCBlbGVtZW50IHdhcyBub3QgY3JlYXRlZCcpO1xufTtcbiJdfQ==