ngx-dynamic-dashboard
Version:
an dashboard lib for angular 10
125 lines • 21.4 kB
JavaScript
import { Component, Input, ViewChild } from '@angular/core';
import { ConfigurationService } from '../services/configuration.service';
import { MenuEventService } from './menu-service';
import { environment } from '../../environments/environment';
/**a
* Menu component
*
*/
export class MenuComponent {
constructor(_configurationService, _menuEventService) {
this._configurationService = _configurationService;
this._menuEventService = _menuEventService;
this.host = window.location.host;
this.dashboardList = [];
this.selectedBoard = '';
this.placeHolderText = 'Ask the board to do something!';
this.searchList = [];
this.show = false;
this.typeAheadIsInMenu = true;
this.layoutId = 0;
this._menuEventService.unSubscribeAll();
this.setupEventListeners();
this.env = environment;
}
setupEventListeners() {
let gridEventSubscription = this._menuEventService.listenForGridEvents().subscribe((event) => {
const edata = event['data'];
switch (event['name']) {
case 'boardUpdateEvent':
this.updateDashboardMenu(edata);
break;
}
});
this._menuEventService.addSubscriber(gridEventSubscription);
}
ngOnInit() {
this.updateDashboardMenu('');
}
ngAfterViewInit() {
this.stickyMenu = jQuery(this.stickyMenuRef.nativeElement);
this.stickyMenu.sticky();
}
emitBoardChangeLayoutEvent(event) {
this._menuEventService.raiseMenuEvent({ name: 'boardChangeLayoutEvent', data: event });
}
emitBoardSelectEvent(event) {
this.boardSelect(event);
this._menuEventService.raiseMenuEvent({ name: 'boardSelectEvent', data: event });
}
emitBoardCreateEvent(event) {
this._menuEventService.raiseMenuEvent({ name: 'boardCreateEvent', data: event });
this.updateDashboardMenu(event);
}
emitBoardEditEvent(event) {
this._menuEventService.raiseMenuEvent({ name: 'boardEditEvent', data: event });
}
emitBoardDeleteEvent(event) {
this._menuEventService.raiseMenuEvent({ name: 'boardDeleteEvent', data: event });
this.updateDashboardMenu('');
}
emitBoardAddGadgetEvent(event) {
this._menuEventService.raiseMenuEvent({ name: 'boardAddGadgetEvent', data: event });
}
emitBoardAIAddGadgetEvent(event) {
this._menuEventService.raiseMenuEvent({ name: 'boardAIAddGadgetEvent', data: event });
}
updateDashboardMenu(selectedBoard) {
this._configurationService.getBoards().subscribe(data => {
const me = this;
if (data && data instanceof Array && data.length) {
this.dashboardList.length = 0;
// sort boards
data.sort((a, b) => a.boardInstanceId - b.boardInstanceId);
data.forEach(board => {
me.dashboardList.push(board.title);
});
if (selectedBoard === '') {
this.boardSelect(this.dashboardList[0]);
}
else {
this.boardSelect(selectedBoard);
}
}
});
}
boardSelect(selectedBoard) {
this.selectedBoard = selectedBoard;
}
toggleLayoutSideBar() {
this.layoutSideBar = jQuery(this.layoutSideBarRef.nativeElement);
this.layoutSideBar.sidebar('setting', 'transition', 'overlay');
this.layoutSideBar.sidebar('toggle');
this.layoutId = this._configurationService.currentModel.id;
}
toggleNotificationSideBar() {
this.notificationSideBar = jQuery(this.notificationSideBarRef.nativeElement);
this.notificationSideBar.sidebar('setting', 'transition', 'overlay');
this.notificationSideBar.sidebar('toggle');
}
toggleAboutSideBar() {
this.aboutSideBar = jQuery(this.aboutSideBarRef.nativeElement);
this.aboutSideBar.sidebar('setting', 'transition', 'overlay');
this.aboutSideBar.sidebar('toggle');
}
}
MenuComponent.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: 'dashboard-menu',
template: "<div #stickymenu_tag class=\"ui inverted menu sticky\" ng-show=\"show\" style=\"height: 66px !important\">\n\n\n <dashboard-typeahead-input (ArtificialIntelligenceEventEmitter)=\"emitBoardAIAddGadgetEvent($event)\" *ngIf=\"env.menu.aiSearch\" [placeHolderText]=\"placeHolderText\"\n [searchList]=\"searchList\"\n [typeAheadIsInMenu]=\"typeAheadIsInMenu\"\n class=\"item\"\n style=\"width:25%; padding-bottom:0\">\n </dashboard-typeahead-input>\n\n\n <div class=\"ui secondary inverted pointing menu board\">\n <a (click)=\"emitBoardSelectEvent(board)\" *ngFor=\"let board of dashboardList; let i = index\"\n [ngClass]=\"{'active':board == selectedBoard}\"\n class=\"item\">\n {{board}}\n </a>\n </div>\n\n\n <div class=\"right inverted menu\">\n <a (click)=\"toggleNotificationSideBar()\" *ngIf=\"env.menu.notification\"\n class=\"item\">\n <i class=\"large inverted alarm icon\"></i>\n <div class=\"floating ui red label\">\n <span style=\"font-size: 1.2em; font-weight: normal\">4</span>\n </div>\n </a>\n\n\n <a (click)=\"addGadgetModal.showComponentLibraryModal('Add Gadget')\"\n class=\"item\">\n <i class=\"large inverted plus icon\"></i>\n </a>\n\n\n <a (click)=\"toggleLayoutSideBar()\"\n class=\"item\">\n <i class=\"large inverted grid layout icon\"></i>\n </a>\n\n\n <a (click)=\"boardConfigModal.showConfigurationModal('Configuration')\"\n class=\"item\">\n <i class=\"large inverted setting icon\"></i>\n </a>\n\n\n <a (click)=\"toggleAboutSideBar()\"\n class=\"item\">\n <i class=\"large inverted info icon\"></i>\n </a>\n\n </div>\n\n</div>\n<br>\n\n<!-- the modal will emit an event and call the grid component to add the requested cell to the board -->\n<dashboard-add-gadget-modal #addGadgetModal\n (addGadgetEvent)=\"emitBoardAddGadgetEvent($event)\">\n</dashboard-add-gadget-modal>\n\n<dashboard-configuration-modal #boardConfigModal\n (dashboardCreateEvent)=\"emitBoardCreateEvent($event)\"\n (dashboardDeleteEvent)=\"emitBoardDeleteEvent($event)\"\n (dashboardEditEvent)=\"emitBoardEditEvent($event)\"\n [dashboardList]=\"dashboardList\">\n\n\n</dashboard-configuration-modal>\n\n\n<!-- side bar content -->\n<div #notificationSideBar_tag class=\"ui sidebar inverted right vertical menu\">\n <dashboard-notification-modal></dashboard-notification-modal>\n</div>\n\n<!-- side bar content -->\n<div #aboutSideBar_tag class=\"ui sidebar inverted right vertical menu\">\n <dashboard-about-modal></dashboard-about-modal>\n</div>\n\n\n<div #layoutSideBar_tag class=\"ui sidebar inverted right vertical menu\">\n <dashboard-layout-manager-modal (boardLayoutChangeEvent)=\"emitBoardChangeLayoutEvent($event)\"\n [layoutId]=\"layoutId\">\n </dashboard-layout-manager-modal>\n</div>\n\n",
styles: [".ui.secondary.pointing.menu .active.item{border-color:#0f0!important;border-width:medium!important;color:#f9f9f9!important}.ui.secondary.pointing.menu .active.item,.ui.secondary.pointing.menu .item{font-family:Roboto,sans-serif!important;font-size:1.2em;font-weight:500!important}.ui.secondary.pointing.menu .item{color:hsla(0,0%,50.2%,.7)!important}.ui.secondary.pointing.menu{border-bottom:none!important}input{font-family:Roboto,sans-serif!important;font-size:1.1em;font-weight:300!important;outline:none!important;padding:5px}.ui.floating.label{margin:0;top:.5em}.ui.menu .item>.floating.label{padding:.3em .6em}.ui.menu{border-radius:0}.ui.inverted.menu{background-color:#1c2b36}.ui.menu .item>i.icon{margin:0}"]
},] }
];
MenuComponent.ctorParameters = () => [
{ type: ConfigurationService },
{ type: MenuEventService }
];
MenuComponent.propDecorators = {
show: [{ type: Input }],
notificationSideBarRef: [{ type: ViewChild, args: ['notificationSideBar_tag', { static: false },] }],
layoutSideBarRef: [{ type: ViewChild, args: ['layoutSideBar_tag', { static: false },] }],
aboutSideBarRef: [{ type: ViewChild, args: ['aboutSideBar_tag', { static: false },] }],
stickyMenuRef: [{ type: ViewChild, args: ['stickymenu_tag', { static: false },] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL2JlbmxpL3dvcmtzcGFjZXMvbmd4LWR5bmFtaWMtZGFzaGJvYXJkLWZyYW1ld29yay9wcm9qZWN0cy9uZ3gtZHluYW1pYy1kYXNoYm9hcmQvc3JjLyIsInNvdXJjZXMiOlsiZGFzaGJvYXJkL21lbnUvbWVudS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixTQUFTLEVBQWMsS0FBSyxFQUFVLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM3RixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFPM0Q7OztHQUdHO0FBUUgsTUFBTSxPQUFPLGFBQWE7SUEwQnRCLFlBQW9CLHFCQUEyQyxFQUMzQyxpQkFBbUM7UUFEbkMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUFzQjtRQUMzQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBekJ2RCxTQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDNUIsa0JBQWEsR0FBVSxFQUFFLENBQUM7UUFDMUIsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDbkIsb0JBQWUsR0FBRyxnQ0FBZ0MsQ0FBQztRQUNuRCxlQUFVLEdBQWtCLEVBQUUsQ0FBQztRQUkvQixTQUFJLEdBQUcsS0FBSyxDQUFDO1FBWWIsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBRXpCLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFLVCxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFeEMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUM7SUFDM0IsQ0FBQztJ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QUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7OztZQXRKSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFO2dCQUNuQixRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixtdUdBQTBCOzthQUc3Qjs7O1lBbkJPLG9CQUFvQjtZQUNwQixnQkFBZ0I7OzttQkE0Qm5CLEtBQUs7cUNBR0wsU0FBUyxTQUFDLHlCQUF5QixFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQzsrQkFDcEQsU0FBUyxTQUFDLG1CQUFtQixFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQzs4QkFDOUMsU0FBUyxTQUFDLGtCQUFrQixFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQzs0QkFDN0MsU0FBUyxTQUFDLGdCQUFnQixFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb25maWd1cmF0aW9uU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7TWVudUV2ZW50U2VydmljZX0gZnJvbSAnLi9tZW51LXNlcnZpY2UnO1xuaW1wb3J0IHtlbnZpcm9ubWVudH0gZnJvbSAnLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50JztcbmltcG9ydCB7SUV2ZW50fSBmcm9tICcuL0lFdmVudCc7XG5cblxuZGVjbGFyZSB2YXIgalF1ZXJ5OiBhbnk7XG5cblxuLyoqYVxuICogTWVudSBjb21wb25lbnRcbiAqXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIG1vZHVsZUlkOiBtb2R1bGUuaWQsXG4gICAgc2VsZWN0b3I6ICdkYXNoYm9hcmQtbWVudScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3ZpZXcuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc3R5bGVzLmNzcyddLFxuXG59KVxuZXhwb3J0IGNsYXNzIE1lbnVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuXG4gICAgaG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0O1xuICAgIGRhc2hib2FyZExpc3Q6IGFueVtdID0gW107XG4gICAgc2VsZWN0ZWRCb2FyZCA9ICcnO1xuICAgIHBsYWNlSG9sZGVyVGV4dCA9ICdBc2sgdGhlIGJvYXJkIHRvIGRvIHNvbWV0aGluZyEnO1xuICAgIHNlYXJjaExpc3Q6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBlbnY6IGFueTtcblxuICAgIEBJbnB1dCgpXG4gICAgc2hvdyA9IGZhbHNlO1xuXG4gICAgQFZpZXdDaGlsZCgnbm90aWZpY2F0aW9uU2lkZUJhcl90YWcnLCB7c3RhdGljOiBmYWxzZX0pIG5vdGlmaWNhdGlvblNpZGVCYXJSZWY6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnbGF5b3V0U2lkZUJhcl90YWcnLCB7c3RhdGljOiBmYWxzZX0pIGxheW91dFNpZGVCYXJSZWY6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnYWJvdXRTaWRlQmFyX3RhZycsIHtzdGF0aWM6IGZhbHNlfSkgYWJvdXRTaWRlQmFyUmVmOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ3N0aWNreW1lbnVfdGFnJywge3N0YXRpYzogZmFsc2V9KSBzdGlja3lNZW51UmVmOiBFbGVtZW50UmVmO1xuXG4gICAgbm90aWZpY2F0aW9uU2lkZUJhcjogYW55O1xuICAgIGxheW91dFNpZGVCYXI6IGFueTtcbiAgICBhYm91dFNpZGVCYXI6IGFueTtcbiAgICBzdGlja3lNZW51OiBhbnk7XG5cbiAgICB0eXBlQWhlYWRJc0luTWVudSA9IHRydWU7XG5cbiAgICBsYXlvdXRJZCA9IDA7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb25maWd1cmF0aW9uU2VydmljZTogQ29uZmlndXJhdGlvblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfbWVudUV2ZW50U2VydmljZTogTWVudUV2ZW50U2VydmljZSkge1xuXG4gICAgICAgIHRoaXMuX21lbnVFdmVudFNlcnZpY2UudW5TdWJzY3JpYmVBbGwoKTtcblxuICAgICAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnZpcm9ubWVudDtcbiAgICB9XG5cbiAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCkge1xuICAgICAgICBsZXQgZ3JpZEV2ZW50U3Vic2NyaXB0aW9uID0gdGhpcy5fbWVudUV2ZW50U2VydmljZS5saXN0ZW5Gb3JHcmlkRXZlbnRzKCkuc3Vic2NyaWJlKChldmVudDogSUV2ZW50KSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGVkYXRhID0gZXZlbnRbJ2RhdGEnXTtcblxuICAgICAgICAgICAgc3dpdGNoIChldmVudFsnbmFtZSddKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnYm9hcmRVcGRhdGVFdmVudCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGFzaGJvYXJkTWVudShlZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX21lbnVFdmVudFNlcnZpY2UuYWRkU3Vic2NyaWJlcihncmlkRXZlbnRTdWJzY3JpcHRpb24pO1xuXG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGFzaGJvYXJkTWVudSgnJyk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLnN0aWNreU1lbnUgPSBqUXVlcnkodGhpcy5zdGlja3lNZW51UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLnN0aWNreU1lbnUuc3RpY2t5KCk7XG4gICAgfVxuXG4gICAgZW1pdEJvYXJkQ2hhbmdlTGF5b3V0RXZlbnQoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5fbWVudUV2ZW50U2VydmljZS5yYWlzZU1lbnVFdmVudCh7bmFtZTogJ2JvYXJkQ2hhbmdlTGF5b3V0RXZlbnQnLCBkYXRhOiBldmVudH0pO1xuICAgIH1cblxuICAgIGVtaXRCb2FyZFNlbGVjdEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIHRoaXMuYm9hcmRTZWxlY3QoZXZlbnQpO1xuICAgICAgICB0aGlzLl9tZW51RXZlbnRTZXJ2aWNlLnJhaXNlTWVudUV2ZW50KHtuYW1lOiAnYm9hcmRTZWxlY3RFdmVudCcsIGRhdGE6IGV2ZW50fSk7XG4gICAgfVxuXG4gICAgZW1pdEJvYXJkQ3JlYXRlRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5fbWVudUV2ZW50U2VydmljZS5yYWlzZU1lbnVFdmVudCh7bmFtZTogJ2JvYXJkQ3JlYXRlRXZlbnQnLCBkYXRhOiBldmVudH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZURhc2hib2FyZE1lbnUoZXZlbnQpO1xuICAgIH1cblxuICAgIGVtaXRCb2FyZEVkaXRFdmVudChldmVudCkge1xuICAgICAgICB0aGlzLl9tZW51RXZlbnRTZXJ2aWNlLnJhaXNlTWVudUV2ZW50KHtuYW1lOiAnYm9hcmRFZGl0RXZlbnQnLCBkYXRhOiBldmVudH0pO1xuICAgIH1cblxuICAgIGVtaXRCb2FyZERlbGV0ZUV2ZW50KGV2ZW50KSB7XG4gICAgICAgIHRoaXMuX21lbnVFdmVudFNlcnZpY2UucmFpc2VNZW51RXZlbnQoe25hbWU6ICdib2FyZERlbGV0ZUV2ZW50JywgZGF0YTogZXZlbnR9KTtcbiAgICAgICAgdGhpcy51cGRhdGVEYXNoYm9hcmRNZW51KCcnKTtcbiAgICB9XG5cbiAgICBlbWl0Qm9hcmRBZGRHYWRnZXRFdmVudChldmVudCkge1xuICAgICAgICB0aGlzLl9tZW51RXZlbnRTZXJ2aWNlLnJhaXNlTWVudUV2ZW50KHtuYW1lOiAnYm9hcmRBZGRHYWRnZXRFdmVudCcsIGRhdGE6IGV2ZW50fSk7XG4gICAgfVxuXG4gICAgZW1pdEJvYXJkQUlBZGRHYWRnZXRFdmVudChldmVudCkge1xuICAgICAgICB0aGlzLl9tZW51RXZlbnRTZXJ2aWNlLnJhaXNlTWVudUV2ZW50KHtuYW1lOiAnYm9hcmRBSUFkZEdhZGdldEV2ZW50JywgZGF0YTogZXZlbnR9KTtcbiAgICB9XG5cbiAgICB1cGRhdGVEYXNoYm9hcmRNZW51KHNlbGVjdGVkQm9hcmQ6IHN0cmluZykge1xuXG4gICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEJvYXJkcygpLnN1YnNjcmliZShkYXRhID0+IHtcblxuICAgICAgICAgICAgY29uc3QgbWUgPSB0aGlzO1xuICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YSBpbnN0YW5jZW9mIEFycmF5ICYmIGRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmRMaXN0Lmxlbmd0aCA9IDA7XG5cblxuICAgICAgICAgICAgICAgIC8vIHNvcnQgYm9hcmRzXG4gICAgICAgICAgICAgICAgZGF0YS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gYS5ib2FyZEluc3RhbmNlSWQgLSBiLmJvYXJkSW5zdGFuY2VJZCk7XG5cbiAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goYm9hcmQgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIG1lLmRhc2hib2FyZExpc3QucHVzaChib2FyZC50aXRsZSk7XG5cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEJvYXJkID09PSAnJykge1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYm9hcmRTZWxlY3QodGhpcy5kYXNoYm9hcmRMaXN0WzBdKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ib2FyZFNlbGVjdChzZWxlY3RlZEJvYXJkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGJvYXJkU2VsZWN0KHNlbGVjdGVkQm9hcmQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQm9hcmQgPSBzZWxlY3RlZEJvYXJkO1xuICAgIH1cblxuICAgIHRvZ2dsZUxheW91dFNpZGVCYXIoKSB7XG4gICAgICAgIHRoaXMubGF5b3V0U2lkZUJhciA9IGpRdWVyeSh0aGlzLmxheW91dFNpZGVCYXJSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMubGF5b3V0U2lkZUJhci5zaWRlYmFyKCdzZXR0aW5nJywgJ3RyYW5zaXRpb24nLCAnb3ZlcmxheScpO1xuICAgICAgICB0aGlzLmxheW91dFNpZGVCYXIuc2lkZWJhcigndG9nZ2xlJyk7XG4gICAgICAgIHRoaXMubGF5b3V0SWQgPSB0aGlzLl9jb25maWd1cmF0aW9uU2VydmljZS5jdXJyZW50TW9kZWwuaWQ7XG4gICAgfVxuXG4gICAgdG9nZ2xlTm90aWZpY2F0aW9uU2lkZUJhcigpIHtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TaWRlQmFyID0galF1ZXJ5KHRoaXMubm90aWZpY2F0aW9uU2lkZUJhclJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TaWRlQmFyLnNpZGViYXIoJ3NldHRpbmcnLCAndHJhbnNpdGlvbicsICdvdmVybGF5Jyk7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2lkZUJhci5zaWRlYmFyKCd0b2dnbGUnKTtcbiAgICB9XG5cbiAgICB0b2dnbGVBYm91dFNpZGVCYXIoKSB7XG4gICAgICAgIHRoaXMuYWJvdXRTaWRlQmFyID0galF1ZXJ5KHRoaXMuYWJvdXRTaWRlQmFyUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLmFib3V0U2lkZUJhci5zaWRlYmFyKCdzZXR0aW5nJywgJ3RyYW5zaXRpb24nLCAnb3ZlcmxheScpO1xuICAgICAgICB0aGlzLmFib3V0U2lkZUJhci5zaWRlYmFyKCd0b2dnbGUnKTtcbiAgICB9XG59XG4iXX0=