@ctrl/ngx-rightclick
Version:
GitHub Buttons for Angular. Star, Like, Follow and more
210 lines • 23.2 kB
JavaScript
import { Overlay, ScrollStrategyOptions, } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';
import { ElementRef, Injectable, Injector } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { filter, take } from 'rxjs/operators';
import { MenuInjector } from './context-menu-injector';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/overlay";
export class ContextMenuService {
constructor(overlay, scrollStrategy, injector) {
this.overlay = overlay;
this.scrollStrategy = scrollStrategy;
this.injector = injector;
this.menus = [];
this.id = 0;
}
/**
*
* @param $event triggering event
* @param menuComponent the component to be shown
* @param submenu is a menu within a menu
* @param level if submenu, what level
*/
show($event, menuComponent, context, menuClose, menuAction, submenu = false, level) {
let target;
if (!submenu) {
this.closeAll();
target = {
getBoundingClientRect: () => ({
bottom: $event.clientY,
height: 0,
left: $event.clientX,
right: $event.clientX,
top: $event.clientY,
width: 0,
}),
};
}
else {
// close other submenus
this.closeAll(undefined, level);
target = $event.target;
}
const el = new ElementRef(target);
const positionStrategy = this.overlay
.position()
.flexibleConnectedTo(el)
.withFlexibleDimensions(false);
if (!submenu) {
positionStrategy.withPositions([
{
originX: 'start',
originY: 'bottom',
overlayX: 'start',
overlayY: 'top',
},
{
originX: 'start',
originY: 'top',
overlayX: 'start',
overlayY: 'bottom',
},
{
originX: 'end',
originY: 'top',
overlayX: 'start',
overlayY: 'top',
},
{
originX: 'start',
originY: 'top',
overlayX: 'end',
overlayY: 'top',
},
{
originX: 'end',
originY: 'center',
overlayX: 'start',
overlayY: 'center',
},
{
originX: 'start',
originY: 'center',
overlayX: 'end',
overlayY: 'center',
},
]);
}
else {
positionStrategy.withPositions([
{
originX: 'end',
originY: 'top',
overlayX: 'start',
overlayY: 'top',
},
{
originX: 'start',
originY: 'top',
overlayX: 'end',
overlayY: 'top',
},
{
originX: 'end',
originY: 'bottom',
overlayX: 'start',
overlayY: 'bottom',
},
{
originX: 'start',
originY: 'bottom',
overlayX: 'end',
overlayY: 'bottom',
},
]);
}
const t = {
submenu,
id: this.id++,
isMenuHovered: new BehaviorSubject(false),
isTriggerHovered: new BehaviorSubject(false),
};
const menuInjector = new MenuInjector(t, this.injector, context);
const componentPortal = new ComponentPortal(menuComponent, undefined, menuInjector);
const overlayRef = this.overlay.create({
positionStrategy,
panelClass: 'ngx-contextmenu',
scrollStrategy: this.scrollStrategy.close(),
});
const component = overlayRef.attach(componentPortal);
const res = Object.assign(Object.assign({ overlayRef, component }, t), { menuClose, menuAction });
this.menus.push(res);
return res;
}
getCurrentLevel() {
return this.menus.length;
}
closeAll(context, idx = 0) {
for (let index = idx; index < this.menus.length; index++) {
const menu = this.menus[index];
this.destroyMenu(menu, context);
}
this.menus.splice(idx, this.menus.length);
}
destroyMenu(menu, context) {
menu.component.instance._state = 'exit';
if (menu.component.instance.lazy) {
menu.component.instance._animationDone
.pipe(filter((event) => event.toState === 'exit'), take(1))
.subscribe(() => {
menu.overlayRef.detach();
menu.overlayRef.dispose();
});
}
else {
menu.overlayRef.detach();
menu.overlayRef.dispose();
}
if (context) {
menu.menuAction.next(context);
}
menu.menuClose.next();
}
close(menu, menuIndex, context) {
this.destroyMenu(menu, context);
this.menus.splice(menuIndex, 1);
}
checkOutsideClick($event) {
for (const m of this.menus) {
const clickedInside = m.component.location.nativeElement.contains($event.target);
if (clickedInside) {
$event.preventDefault();
$event.stopPropagation();
return;
}
}
this.closeAll();
}
closeSubMenu(id) {
const menuIndex = this.menus.findIndex(n => n.id === id);
if (menuIndex === -1 || menuIndex !== this.menus.length - 1) {
return;
}
// make sure we can close the current menu
const menu = this.menus[menuIndex];
if (menu.isMenuHovered.getValue() || menu.isTriggerHovered.getValue()) {
return;
}
// close all menus up if possible
for (let index = this.menus.length - 1; index >= 1; index--) {
const m = this.menus[index];
if (!m.isMenuHovered.getValue() && !m.isTriggerHovered.getValue()) {
this.close(m, index);
}
else {
return;
}
}
}
}
ContextMenuService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ContextMenuService_Factory() { return new ContextMenuService(i0.ɵɵinject(i1.Overlay), i0.ɵɵinject(i1.ScrollStrategyOptions), i0.ɵɵinject(i0.INJECTOR)); }, token: ContextMenuService, providedIn: "root" });
ContextMenuService.decorators = [
{ type: Injectable, args: [{ providedIn: 'root' },] }
];
ContextMenuService.ctorParameters = () => [
{ type: Overlay },
{ type: ScrollStrategyOptions },
{ type: Injector }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2NvbnRleHQtbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxPQUFPLEVBRVAscUJBQXFCLEdBQ3RCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7O0FBZ0J2RCxNQUFNLE9BQU8sa0JBQWtCO0lBSTdCLFlBQ1UsT0FBZ0IsRUFDaEIsY0FBcUMsRUFDckMsUUFBa0I7UUFGbEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixtQkFBYyxHQUFkLGNBQWMsQ0FBdUI7UUFDckMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQU41QixVQUFLLEdBQXdCLEVBQUUsQ0FBQztRQUNoQyxPQUFFLEdBQUcsQ0FBQyxDQUFDO0lBTUosQ0FBQztJQUVKOzs7Ozs7T0FNRztJQUNILElBQUksQ0FDRixNQUFrQixFQUNsQixhQUFrQixFQUNsQixPQUFZLEVBQ1osU0FBNEIsRUFDNUIsVUFBNkIsRUFDN0IsT0FBTyxHQUFHLEtBQUssRUFDZixLQUFjO1FBRWQsSUFBSSxNQUFXLENBQUM7UUFDaEIsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLEdBQUc7Z0JBQ1AscUJBQXFCLEVBQUUsR0FBZSxFQUFFLENBQUMsQ0FBQztvQkFDeEMsTUFBTSxF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QUNSO1NBQ0Y7SUFDSCxDQUFDOzs7O1lBL01GLFVBQVUsU0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OztZQXpCaEMsT0FBTztZQUVQLHFCQUFxQjtZQUdVLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBPdmVybGF5LFxuICBPdmVybGF5UmVmLFxuICBTY3JvbGxTdHJhdGVneU9wdGlvbnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgRWxlbWVudFJlZiwgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTWVudUluamVjdG9yIH0gZnJvbSAnLi9jb250ZXh0LW1lbnUtaW5qZWN0b3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2ZUNvbnRleHRNZW51U3ViIHtcbiAgaWQ6IG51bWJlcjtcbiAgaXNUcmlnZ2VySG92ZXJlZDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuICBpc01lbnVIb3ZlcmVkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG4gIHN1Ym1lbnU6IGJvb2xlYW47XG59XG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2ZUNvbnRleHRNZW51IGV4dGVuZHMgQWN0aXZlQ29udGV4dE1lbnVTdWIge1xuICBvdmVybGF5UmVmOiBPdmVybGF5UmVmO1xuICBjb21wb25lbnQ6IGFueTtcbiAgbWVudUNsb3NlOiBFdmVudEVtaXR0ZXI8dm9pZD47XG4gIG1lbnVBY3Rpb246IEV2ZW50RW1pdHRlcjxhbnk+O1xufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIENvbnRleHRNZW51U2VydmljZSB7XG4gIG1lbnVzOiBBY3RpdmVDb250ZXh0TWVudVtdID0gW107XG4gIGlkID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSBzY3JvbGxTdHJhdGVneTogU2Nyb2xsU3RyYXRlZ3lPcHRpb25zLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICApIHt9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSAkZXZlbnQgdHJpZ2dlcmluZyBldmVudFxuICAgKiBAcGFyYW0gbWVudUNvbXBvbmVudCB0aGUgY29tcG9uZW50IHRvIGJlIHNob3duXG4gICAqIEBwYXJhbSBzdWJtZW51IGlzIGEgbWVudSB3aXRoaW4gYSBtZW51XG4gICAqIEBwYXJhbSBsZXZlbCBpZiBzdWJtZW51LCB3aGF0IGxldmVsXG4gICAqL1xuICBzaG93KFxuICAgICRldmVudDogTW91c2VFdmVudCxcbiAgICBtZW51Q29tcG9uZW50OiBhbnksXG4gICAgY29udGV4dDogYW55LFxuICAgIG1lbnVDbG9zZTogRXZlbnRFbWl0dGVyPGFueT4sXG4gICAgbWVudUFjdGlvbjogRXZlbnRFbWl0dGVyPGFueT4sXG4gICAgc3VibWVudSA9IGZhbHNlLFxuICAgIGxldmVsPzogbnVtYmVyLFxuICApOiBBY3RpdmVDb250ZXh0TWVudSB7XG4gICAgbGV0IHRhcmdldDogYW55O1xuICAgIGlmICghc3VibWVudSkge1xuICAgICAgdGhpcy5jbG9zZUFsbCgpO1xuICAgICAgdGFyZ2V0ID0ge1xuICAgICAgICBnZXRCb3VuZGluZ0NsaWVudFJlY3Q6ICgpOiBDbGllbnRSZWN0ID0+ICh7XG4gICAgICAgICAgYm90dG9tOiAkZXZlbnQuY2xpZW50WSxcbiAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgbGVmdDogJGV2ZW50LmNsaWVudFgsXG4gICAgICAgICAgcmlnaHQ6ICRldmVudC5jbGllbnRYLFxuICAgICAgICAgIHRvcDogJGV2ZW50LmNsaWVudFksXG4gICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY2xvc2Ugb3RoZXIgc3VibWVudXNcbiAgICAgIHRoaXMuY2xvc2VBbGwodW5kZWZpbmVkLCBsZXZlbCk7XG4gICAgICB0YXJnZXQgPSAkZXZlbnQudGFyZ2V0O1xuICAgIH1cbiAgICBjb25zdCBlbCA9IG5ldyBFbGVtZW50UmVmKHRhcmdldCk7XG4gICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheVxuICAgICAgLnBvc2l0aW9uKClcbiAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKGVsKVxuICAgICAgLndpdGhGbGV4aWJsZURpbWVuc2lvbnMoZmFsc2UpO1xuXG4gICAgaWYgKCFzdWJtZW51KSB7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LndpdGhQb3NpdGlvbnMoW1xuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgIG9yaWdpblk6ICdjZW50ZXInLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsXG4gICAgICAgICAgb3JpZ2luWTogJ2NlbnRlcicsXG4gICAgICAgICAgb3ZlcmxheVg6ICdlbmQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAnY2VudGVyJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LndpdGhQb3NpdGlvbnMoW1xuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXG4gICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXG4gICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXG4gICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfVxuICAgIGNvbnN0IHQ6IEFjdGl2ZUNvbnRleHRNZW51U3ViID0ge1xuICAgICAgc3VibWVudSxcbiAgICAgIGlkOiB0aGlzLmlkKyssXG4gICAgICBpc01lbnVIb3ZlcmVkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICAgIGlzVHJpZ2dlckhvdmVyZWQ6IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpLFxuICAgIH07XG4gICAgY29uc3QgbWVudUluamVjdG9yID0gbmV3IE1lbnVJbmplY3Rvcih0LCB0aGlzLmluamVjdG9yLCBjb250ZXh0KTtcbiAgICBjb25zdCBjb21wb25lbnRQb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKFxuICAgICAgbWVudUNvbXBvbmVudCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIG1lbnVJbmplY3RvcixcbiAgICApO1xuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKHtcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3ksXG4gICAgICBwYW5lbENsYXNzOiAnbmd4LWNvbnRleHRtZW51JyxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLnNjcm9sbFN0cmF0ZWd5LmNsb3NlKCksXG4gICAgfSk7XG4gICAgY29uc3QgY29tcG9uZW50ID0gb3ZlcmxheVJlZi5hdHRhY2g8YW55Pihjb21wb25lbnRQb3J0YWwpO1xuICAgIGNvbnN0IHJlcyA9IHsgb3ZlcmxheVJlZiwgY29tcG9uZW50LCAuLi50LCBtZW51Q2xvc2UsIG1lbnVBY3Rpb24gfTtcbiAgICB0aGlzLm1lbnVzLnB1c2gocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIGdldEN1cnJlbnRMZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5tZW51cy5sZW5ndGg7XG4gIH1cbiAgY2xvc2VBbGwoY29udGV4dD86IGFueSwgaWR4ID0gMCkge1xuICAgIGZvciAobGV0IGluZGV4ID0gaWR4OyBpbmRleCA8IHRoaXMubWVudXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBtZW51ID0gdGhpcy5tZW51c1tpbmRleF07XG4gICAgICB0aGlzLmRlc3Ryb3lNZW51KG1lbnUsIGNvbnRleHQpO1xuICAgIH1cbiAgICB0aGlzLm1lbnVzLnNwbGljZShpZHgsIHRoaXMubWVudXMubGVuZ3RoKTtcbiAgfVxuICBkZXN0cm95TWVudShtZW51OiBBY3RpdmVDb250ZXh0TWVudSwgY29udGV4dD86IGFueSkge1xuICAgIG1lbnUuY29tcG9uZW50Lmluc3RhbmNlLl9zdGF0ZSA9ICdleGl0JztcbiAgICBpZiAobWVudS5jb21wb25lbnQuaW5zdGFuY2UubGF6eSkge1xuICAgICAgbWVudS5jb21wb25lbnQuaW5zdGFuY2UuX2FuaW1hdGlvbkRvbmVcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChldmVudDogYW55KSA9PiBldmVudC50b1N0YXRlID09PSAnZXhpdCcpLFxuICAgICAgICAgIHRha2UoMSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgbWVudS5vdmVybGF5UmVmLmRldGFjaCgpO1xuICAgICAgICAgIG1lbnUub3ZlcmxheVJlZi5kaXNwb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZW51Lm92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICBtZW51Lm92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgIH1cbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgbWVudS5tZW51QWN0aW9uLm5leHQoY29udGV4dCk7XG4gICAgfVxuICAgIG1lbnUubWVudUNsb3NlLm5leHQoKTtcbiAgfVxuICBjbG9zZShtZW51OiBBY3RpdmVDb250ZXh0TWVudSwgbWVudUluZGV4OiBudW1iZXIsIGNvbnRleHQ/OiBhbnkpIHtcbiAgICB0aGlzLmRlc3Ryb3lNZW51KG1lbnUsIGNvbnRleHQpO1xuICAgIHRoaXMubWVudXMuc3BsaWNlKG1lbnVJbmRleCwgMSk7XG4gIH1cbiAgY2hlY2tPdXRzaWRlQ2xpY2soJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgZm9yIChjb25zdCBtIG9mIHRoaXMubWVudXMpIHtcbiAgICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSBtLmNvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKFxuICAgICAgICAkZXZlbnQudGFyZ2V0LFxuICAgICAgKTtcbiAgICAgIGlmIChjbGlja2VkSW5zaWRlKSB7XG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbG9zZUFsbCgpO1xuICB9XG4gIGNsb3NlU3ViTWVudShpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbWVudUluZGV4ID0gdGhpcy5tZW51cy5maW5kSW5kZXgobiA9PiBuLmlkID09PSBpZCk7XG4gICAgaWYgKG1lbnVJbmRleCA9PT0gLTEgfHwgbWVudUluZGV4ICE9PSB0aGlzLm1lbnVzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gbWFrZSBzdXJlIHdlIGNhbiBjbG9zZSB0aGUgY3VycmVudCBtZW51XG4gICAgY29uc3QgbWVudSA9IHRoaXMubWVudXNbbWVudUluZGV4XTtcbiAgICBpZiAobWVudS5pc01lbnVIb3ZlcmVkLmdldFZhbHVlKCkgfHwgbWVudS5pc1RyaWdnZXJIb3ZlcmVkLmdldFZhbHVlKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gY2xvc2UgYWxsIG1lbnVzIHVwIGlmIHBvc3NpYmxlXG4gICAgZm9yIChsZXQgaW5kZXggPSB0aGlzLm1lbnVzLmxlbmd0aCAtIDE7IGluZGV4ID49IDE7IGluZGV4LS0pIHtcbiAgICAgIGNvbnN0IG0gPSB0aGlzLm1lbnVzW2luZGV4XTtcbiAgICAgIGlmICghbS5pc01lbnVIb3ZlcmVkLmdldFZhbHVlKCkgJiYgIW0uaXNUcmlnZ2VySG92ZXJlZC5nZXRWYWx1ZSgpKSB7XG4gICAgICAgIHRoaXMuY2xvc2UobSwgaW5kZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19