ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
266 lines • 20.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @license
* Copyright Alibaba.com All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
/** keep track https://github.com/angular/material2/issues/5007 **/
import { ConnectionPositionPair, Overlay, OverlayConfig } from '@angular/cdk/overlay';
import { TemplatePortal } from '@angular/cdk/portal';
import { Injectable } from '@angular/core';
import { fromEvent, Subscription } from 'rxjs';
import { filter, take } from 'rxjs/operators';
var NzContextMenuService = /** @class */ (function () {
function NzContextMenuService(overlay) {
this.overlay = overlay;
this.clickOutsideSubscription = Subscription.EMPTY;
this.clickMenuSubscription = Subscription.EMPTY;
this.positionSubscription = Subscription.EMPTY;
}
/**
* @param {?} $event
* @param {?} nzDropdownMenuComponent
* @return {?}
*/
NzContextMenuService.prototype.create = /**
* @param {?} $event
* @param {?} nzDropdownMenuComponent
* @return {?}
*/
function ($event, nzDropdownMenuComponent) {
$event.preventDefault();
/** @type {?} */
var overlayRef = this.createOverlay($event);
if (overlayRef.hasAttached()) {
this.close();
}
this.attachTemplatePortal(overlayRef, nzDropdownMenuComponent);
this.handleClickOutside();
};
/**
* @return {?}
*/
NzContextMenuService.prototype.close = /**
* @return {?}
*/
function () {
this.overlayRef.detach();
this.setOpenState(false);
this.clickOutsideSubscription.unsubscribe();
this.clickMenuSubscription.unsubscribe();
this.positionSubscription.unsubscribe();
};
/**
* @private
* @return {?}
*/
NzContextMenuService.prototype.handleClickOutside = /**
* @private
* @return {?}
*/
function () {
var _this = this;
this.clickOutsideSubscription.unsubscribe();
this.clickOutsideSubscription = fromEvent(document, 'click')
.pipe(filter((/**
* @param {?} event
* @return {?}
*/
function (event) { return !!_this.overlayRef && !_this.overlayRef.overlayElement.contains((/** @type {?} */ (event.target))); })),
// handle firefox contextmenu event
filter((/**
* @param {?} event
* @return {?}
*/
function (event) { return event.button !== 2; })), take(1))
.subscribe((/**
* @return {?}
*/
function () {
_this.close();
}));
};
/**
* @private
* @param {?} overlayRef
* @param {?} nzDropdownMenuComponent
* @return {?}
*/
NzContextMenuService.prototype.attachTemplatePortal = /**
* @private
* @param {?} overlayRef
* @param {?} nzDropdownMenuComponent
* @return {?}
*/
function (overlayRef, nzDropdownMenuComponent) {
var _this = this;
this.nzDropdownMenuComponent = nzDropdownMenuComponent;
nzDropdownMenuComponent.setValue('nzTrigger', 'click');
this.clickMenuSubscription.unsubscribe();
this.clickMenuSubscription = nzDropdownMenuComponent.nzMenuDropdownService.menuItemClick$.subscribe((/**
* @return {?}
*/
function () {
_this.close();
}));
overlayRef.attach(new TemplatePortal(nzDropdownMenuComponent.templateRef, nzDropdownMenuComponent.viewContainerRef));
this.setOpenState(true);
};
/**
* @private
* @param {?} state
* @return {?}
*/
NzContextMenuService.prototype.setOpenState = /**
* @private
* @param {?} state
* @return {?}
*/
function (state) {
this.nzDropdownMenuComponent.setValue('open', state);
};
/**
* @private
* @param {?} $event
* @return {?}
*/
NzContextMenuService.prototype.getOverlayConfig = /**
* @private
* @param {?} $event
* @return {?}
*/
function ($event) {
return new OverlayConfig({
panelClass: 'nz-dropdown-panel',
positionStrategy: this.generatePositionStrategy($event),
scrollStrategy: this.overlay.scrollStrategies.close()
});
};
/**
* @private
* @param {?} $event
* @return {?}
*/
NzContextMenuService.prototype.generatePositionStrategy = /**
* @private
* @param {?} $event
* @return {?}
*/
function ($event) {
return this.overlay
.position()
.flexibleConnectedTo({ x: $event.x, y: $event.y })
.withPositions([
new ConnectionPositionPair({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'top' }),
new ConnectionPositionPair({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'bottom' }),
new ConnectionPositionPair({ originX: 'start', originY: 'top' }, { overlayX: 'end', overlayY: 'bottom' }),
new ConnectionPositionPair({ originX: 'start', originY: 'top' }, { overlayX: 'end', overlayY: 'top' })
]);
};
/**
* @private
* @param {?} position
* @return {?}
*/
NzContextMenuService.prototype.subscribeToPositions = /**
* @private
* @param {?} position
* @return {?}
*/
function (position) {
var _this = this;
this.positionSubscription.unsubscribe();
this.positionSubscription = position.positionChanges.subscribe((/**
* @param {?} change
* @return {?}
*/
function (change) {
// TODO: positionChanges won't trigger if not dispose
_this.nzDropdownMenuComponent.setValue('dropDownPosition', change.connectionPair.overlayY === 'bottom' ? 'top' : 'bottom');
}));
};
/**
* @private
* @param {?} $event
* @return {?}
*/
NzContextMenuService.prototype.createOverlay = /**
* @private
* @param {?} $event
* @return {?}
*/
function ($event) {
/** @type {?} */
var config = this.getOverlayConfig($event);
if (!this.overlayRef) {
this.overlayRef = this.overlay.create(config);
}
else {
this.updatePosition(this.overlayRef, $event);
}
this.subscribeToPositions((/** @type {?} */ (config.positionStrategy)));
return this.overlayRef;
};
/**
* @private
* @param {?} overlayRef
* @param {?} $event
* @return {?}
*/
NzContextMenuService.prototype.updatePosition = /**
* @private
* @param {?} overlayRef
* @param {?} $event
* @return {?}
*/
function (overlayRef, $event) {
overlayRef.updatePositionStrategy(this.generatePositionStrategy($event));
};
NzContextMenuService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NzContextMenuService.ctorParameters = function () { return [
{ type: Overlay }
]; };
return NzContextMenuService;
}());
export { NzContextMenuService };
if (false) {
/**
* @type {?}
* @private
*/
NzContextMenuService.prototype.overlayRef;
/**
* @type {?}
* @private
*/
NzContextMenuService.prototype.nzDropdownMenuComponent;
/**
* @type {?}
* @private
*/
NzContextMenuService.prototype.clickOutsideSubscription;
/**
* @type {?}
* @private
*/
NzContextMenuService.prototype.clickMenuSubscription;
/**
* @type {?}
* @private
*/
NzContextMenuService.prototype.positionSubscription;
/**
* @type {?}
* @private
*/
NzContextMenuService.prototype.overlay;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnotY29udGV4dC1tZW51LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkL2Ryb3Bkb3duLyIsInNvdXJjZXMiOlsibnotY29udGV4dC1tZW51LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBU0EsT0FBTyxFQUNMLHNCQUFzQixFQUV0QixPQUFPLEVBQ1AsYUFBYSxFQUVkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc5QztJQVFFLDhCQUFvQixPQUFnQjtRQUFoQixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBSjVCLDZCQUF3QixHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDOUMsMEJBQXFCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUMzQyx5QkFBb0IsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO0lBRVgsQ0FBQzs7Ozs7O0lBRXhDLHFDQUFNOzs7OztJQUFOLFVBQU8sTUFBa0IsRUFBRSx1QkFBZ0Q7UUFDekUsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDOztZQUNsQixVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDN0MsSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDNUIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Q7UUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQzs7OztJQUVE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SUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQy9DO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDOUM7UUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsbUJBQUEsTUFBTSxDQUFDLGdCQUFnQixFQUFxQyxDQUFDLENBQUM7UUFDeEYsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7Ozs7Ozs7SUFFTyw2Q0FBYzs7Ozs7O0lBQXRCLFVBQXVCLFVBQXNCLEVBQUUsTUFBa0I7UUFDL0QsVUFBVSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7O2dCQXZHRixVQUFVOzs7O2dCQVZULE9BQU87O0lBa0hULDJCQUFDO0NBQUEsQUF4R0QsSUF3R0M7U0F2R1ksb0JBQW9COzs7Ozs7SUFDL0IsMENBQStCOzs7OztJQUMvQix1REFBeUQ7Ozs7O0lBQ3pELHdEQUFzRDs7Ozs7SUFDdEQscURBQW1EOzs7OztJQUNuRCxvREFBa0Q7Ozs7O0lBRXRDLHVDQUF3QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG4vKioga2VlcCB0cmFjayBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9tYXRlcmlhbDIvaXNzdWVzLzUwMDcgKiovXG5pbXBvcnQge1xuICBDb25uZWN0aW9uUG9zaXRpb25QYWlyLFxuICBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXG4gIE92ZXJsYXksXG4gIE92ZXJsYXlDb25maWcsXG4gIE92ZXJsYXlSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBOekRyb3Bkb3duTWVudUNvbXBvbmVudCB9IGZyb20gJy4vbnotZHJvcGRvd24tbWVudS5jb21wb25lbnQnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTnpDb250ZXh0TWVudVNlcnZpY2Uge1xuICBwcml2YXRlIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWY7XG4gIHByaXZhdGUgbnpEcm9wZG93bk1lbnVDb21wb25lbnQ6IE56RHJvcGRvd25NZW51Q29tcG9uZW50O1xuICBwcml2YXRlIGNsaWNrT3V0c2lkZVN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgcHJpdmF0ZSBjbGlja01lbnVTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHByaXZhdGUgcG9zaXRpb25TdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5KSB7fVxuXG4gIGNyZWF0ZSgkZXZlbnQ6IE1vdXNlRXZlbnQsIG56RHJvcGRvd25NZW51Q29tcG9uZW50OiBOekRyb3Bkb3duTWVudUNvbXBvbmVudCk6IHZvaWQge1xuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLmNyZWF0ZU92ZXJsYXkoJGV2ZW50KTtcbiAgICBpZiAob3ZlcmxheVJlZi5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfVxuICAgIHRoaXMuYXR0YWNoVGVtcGxhdGVQb3J0YWwob3ZlcmxheVJlZiwgbnpEcm9wZG93bk1lbnVDb21wb25lbnQpO1xuICAgIHRoaXMuaGFuZGxlQ2xpY2tPdXRzaWRlKCk7XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgdGhpcy5zZXRPcGVuU3RhdGUoZmFsc2UpO1xuICAgIHRoaXMuY2xpY2tPdXRzaWRlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jbGlja01lbnVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnBvc2l0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNsaWNrT3V0c2lkZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrT3V0c2lkZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2xpY2tPdXRzaWRlU3Vic2NyaXB0aW9uID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCAnY2xpY2snKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihldmVudCA9PiAhIXRoaXMub3ZlcmxheVJlZiAmJiAhdGhpcy5vdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpLFxuICAgICAgICAvLyBoYW5kbGUgZmlyZWZveCBjb250ZXh0bWVudSBldmVudFxuICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQuYnV0dG9uICE9PSAyKSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhdHRhY2hUZW1wbGF0ZVBvcnRhbChvdmVybGF5UmVmOiBPdmVybGF5UmVmLCBuekRyb3Bkb3duTWVudUNvbXBvbmVudDogTnpEcm9wZG93bk1lbnVDb21wb25lbnQpOiB2b2lkIHtcbiAgICB0aGlzLm56RHJvcGRvd25NZW51Q29tcG9uZW50ID0gbnpEcm9wZG93bk1lbnVDb21wb25lbnQ7XG4gICAgbnpEcm9wZG93bk1lbnVDb21wb25lbnQuc2V0VmFsdWUoJ256VHJpZ2dlcicsICdjbGljaycpO1xuICAgIHRoaXMuY2xpY2tNZW51U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jbGlja01lbnVTdWJzY3JpcHRpb24gPSBuekRyb3Bkb3duTWVudUNvbXBvbmVudC5uek1lbnVEcm9wZG93blNlcnZpY2UubWVudUl0ZW1DbGljayQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9KTtcbiAgICBvdmVybGF5UmVmLmF0dGFjaChcbiAgICAgIG5ldyBUZW1wbGF0ZVBvcnRhbChuekRyb3Bkb3duTWVudUNvbXBvbmVudC50ZW1wbGF0ZVJlZiwgbnpEcm9wZG93bk1lbnVDb21wb25lbnQudmlld0NvbnRhaW5lclJlZilcbiAgICApO1xuICAgIHRoaXMuc2V0T3BlblN0YXRlKHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRPcGVuU3RhdGUoc3RhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm56RHJvcGRvd25NZW51Q29tcG9uZW50LnNldFZhbHVlKCdvcGVuJywgc3RhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPdmVybGF5Q29uZmlnKCRldmVudDogTW91c2VFdmVudCk6IE92ZXJsYXlDb25maWcge1xuICAgIHJldHVybiBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBwYW5lbENsYXNzOiAnbnotZHJvcGRvd24tcGFuZWwnLFxuICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5nZW5lcmF0ZVBvc2l0aW9uU3RyYXRlZ3koJGV2ZW50KSxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5jbG9zZSgpXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUG9zaXRpb25TdHJhdGVneSgkZXZlbnQ6IE1vdXNlRXZlbnQpOiBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kge1xuICAgIHJldHVybiB0aGlzLm92ZXJsYXlcbiAgICAgIC5wb3NpdGlvbigpXG4gICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh7IHg6ICRldmVudC54LCB5OiAkZXZlbnQueSB9KVxuICAgICAgLndpdGhQb3NpdGlvbnMoW1xuICAgICAgICBuZXcgQ29ubmVjdGlvblBvc2l0aW9uUGFpcih7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnIH0sIHsgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJyB9KSxcbiAgICAgICAgbmV3IENvbm5lY3Rpb25Qb3NpdGlvblBhaXIoeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJyB9LCB7IG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ2JvdHRvbScgfSksXG4gICAgICAgIG5ldyBDb25uZWN0aW9uUG9zaXRpb25QYWlyKHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcgfSwgeyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAnYm90dG9tJyB9KSxcbiAgICAgICAgbmV3IENvbm5lY3Rpb25Qb3NpdGlvblBhaXIoeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJyB9LCB7IG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICd0b3AnIH0pXG4gICAgICBdKTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9Qb3NpdGlvbnMocG9zaXRpb246IEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSk6IHZvaWQge1xuICAgIHRoaXMucG9zaXRpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnBvc2l0aW9uU3Vic2NyaXB0aW9uID0gcG9zaXRpb24ucG9zaXRpb25DaGFuZ2VzLnN1YnNjcmliZShjaGFuZ2UgPT4ge1xuICAgICAgLy8gVE9ETzogcG9zaXRpb25DaGFuZ2VzIHdvbid0IHRyaWdnZXIgaWYgbm90IGRpc3Bvc2VcbiAgICAgIHRoaXMubnpEcm9wZG93bk1lbnVDb21wb25lbnQuc2V0VmFsdWUoXG4gICAgICAgICdkcm9wRG93blBvc2l0aW9uJyxcbiAgICAgICAgY2hhbmdlLmNvbm5lY3Rpb25QYWlyLm92ZXJsYXlZID09PSAnYm90dG9tJyA/ICd0b3AnIDogJ2JvdHRvbSdcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU92ZXJsYXkoJGV2ZW50OiBNb3VzZUV2ZW50KTogT3ZlcmxheVJlZiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRPdmVybGF5Q29uZmlnKCRldmVudCk7XG4gICAgaWYgKCF0aGlzLm92ZXJsYXlSZWYpIHtcbiAgICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoY29uZmlnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbih0aGlzLm92ZXJsYXlSZWYsICRldmVudCk7XG4gICAgfVxuICAgIHRoaXMuc3Vic2NyaWJlVG9Qb3NpdGlvbnMoY29uZmlnLnBvc2l0aW9uU3RyYXRlZ3kgYXMgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5KTtcbiAgICByZXR1cm4gdGhpcy5vdmVybGF5UmVmO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQb3NpdGlvbihvdmVybGF5UmVmOiBPdmVybGF5UmVmLCAkZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBvdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kodGhpcy5nZW5lcmF0ZVBvc2l0aW9uU3RyYXRlZ3koJGV2ZW50KSk7XG4gIH1cbn1cbiJdfQ==