com.phloxui
Version:
PhloxUI Ng2+ Framework
214 lines (212 loc) • 22 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, HostListener } from '@angular/core';
import { PhloxAppService } from '../../../../service/PhloxAppService.service';
import { NeedFocusService } from '../../../../service/NeedFocusService.service';
import { ObservableManager } from '../../../../service/ObservableManager.service';
import { NotificationManager } from '../../../../service/NotificationManager.service';
import { PhloxAppInfoService } from '../../../../service/PhloxAppInfoService.service';
import { PhloxAppInfo } from '../../../../component/model/PhloxAppInfo';
import { AbstractSideSlidePanel } from '../../../AbstractSideSlidePanel';
const /** @type {?} */ TYPE_NAME = "phx-notifier";
const /** @type {?} */ SUB_TOPIC_NAME = 'phlox-notifier';
export class PhloxNotifier extends AbstractSideSlidePanel {
/**
* @param {?} phloxAppService
* @param {?} observableMgr
* @param {?} needFocusService
* @param {?} notificationManager
* @param {?} phloxAppInfoService
*/
constructor(phloxAppService, observableMgr, needFocusService, notificationManager, phloxAppInfoService) {
super(phloxAppService, observableMgr, needFocusService, PhloxNotifier.SUB_TOPIC_NAME);
this.notificationManager = notificationManager;
if (phloxAppInfoService != null) {
phloxAppInfoService.getAppInfo().then((result) => {
this.phloxAppInfo = result;
});
}
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
}
/**
* @return {?}
*/
isRinging() {
if (this.notificationManager !== null && typeof this.notificationManager !== 'undefined') {
let /** @type {?} */ unReadArray = this.getUnreadNotifications();
if (unReadArray !== null && typeof unReadArray !== 'undefined') {
return unReadArray.length > 0;
}
}
return false;
}
/**
* @return {?}
*/
getUnreadNotifications() {
if (this.notificationManager !== null && typeof this.notificationManager !== 'undefined') {
let /** @type {?} */ unReadArray = this.notificationManager.getUnreadNotifications();
if (unReadArray !== null && typeof unReadArray !== 'undefined') {
return unReadArray;
}
}
return [];
}
/**
* @return {?}
*/
getNotifications() {
let /** @type {?} */ result = [];
if (this.notificationManager !== null && typeof this.notificationManager !== 'undefined') {
let /** @type {?} */ allNotifyArray = this.notificationManager.getNotifications();
let /** @type {?} */ maxNotification = PhloxAppInfo.DEFAULT_MAX_NOTIFICATIONS;
if (this.phloxAppInfo !== null && typeof this.phloxAppInfo !== 'undefined') {
if (this.phloxAppInfo.settings !== null && typeof this.phloxAppInfo.settings !== 'undefined') {
maxNotification = this.phloxAppInfo.settings.MAX_NOTIFICATIONS;
}
}
if (allNotifyArray !== null && typeof allNotifyArray !== 'undefined') {
let /** @type {?} */ overLength = 0;
if (allNotifyArray.length > maxNotification) {
overLength = allNotifyArray.length - maxNotification;
let /** @type {?} */ removeArray = allNotifyArray.slice(0, overLength);
for (let /** @type {?} */ r of removeArray) {
this.notificationManager.clear(r);
}
allNotifyArray = this.notificationManager.getNotifications();
}
for (let /** @type {?} */ n of allNotifyArray) {
result.push(n);
}
}
}
return result;
}
/**
* @param {?} $event
* @param {?} notification
* @return {?}
*/
onNotificationClicked($event, notification) {
if (notification === null || typeof notification === 'undefined') {
return;
}
if (this.notificationManager !== null && typeof this.notificationManager !== 'undefined') {
this.notificationManager.clear(notification);
}
}
/**
* @param {?} event
* @return {?}
*/
onToggle(event) {
super.onToggle(event);
// mark as read
if (this.notificationManager !== null && typeof this.notificationManager !== 'undefined') {
this.notificationManager.markAsReadAll();
}
}
/**
* @param {?} event
* @return {?}
*/
onClick(event) {
event.stopPropagation();
}
}
PhloxNotifier.TYPE_NAME = TYPE_NAME;
PhloxNotifier.SUB_TOPIC_NAME = SUB_TOPIC_NAME;
PhloxNotifier.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: `<div class="phx-notifier" [class.active]="isActive()" (click)="onToggle($event)">
<div class="wrapper">
<div>
<div class="table-wrapper fluid">
<div class="table-row-wrapper">
<div class="table-cell-wrapper middle">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" class="bell" [class.ringing]="isRinging()"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 30 30" style="enable-background: new 0 0 30 30;"
xml:space="preserve">
<g>
<g>
<path
d="M21.951,19.175l-1-1.221v-3.271c0-3.123-2-5.723-5-6.294V7.575c0-0.673-0.827-1.221-1.5-1.221
c-0.673,0-1.5,0.548-1.5,1.221v0.814c-3,0.57-5,3.171-5,6.294v3.271l-1,1.221v0.71h-1v2h17v-2h-1V19.175z M22.779,19.175" />
</g>
</g>
</svg>
</div>
</div>
</div>
</div>
<div>
<div class="table-wrapper fluid">
<div class="table-row-wrapper">
<div class="table-cell-wrapper middle">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" class="bell" [class.ringing]="isRinging()"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 30 30" style="enable-background: new 0 0 30 30;"
xml:space="preserve">
<g>
<g>
</g>
<path
d="M15.147,24.513c1.136,0,2.117-0.628,2.574-1.628h-5.149C13.03,23.885,14.011,24.513,15.147,24.513
L15.147,24.513z M15.147,24.873" />
</g>
</svg>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="phx-notifier-side-panel right" [class.active]="isActive()">
<div class="row" *ngFor="let notify of getNotifications(); let i = index;" (click)="onNotificationClicked($event, notify)">
{{notify.title}} --> click to clear
</div>
</div>
`
},] },
];
/** @nocollapse */
PhloxNotifier.ctorParameters = () => [
{ type: PhloxAppService, },
{ type: ObservableManager, },
{ type: NeedFocusService, },
{ type: NotificationManager, },
{ type: PhloxAppInfoService, },
];
PhloxNotifier.propDecorators = {
"onClick": [{ type: HostListener, args: ['click', ['$event'],] },],
};
function PhloxNotifier_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
PhloxNotifier.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
PhloxNotifier.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
PhloxNotifier.propDecorators;
/** @type {?} */
PhloxNotifier.TYPE_NAME;
/** @type {?} */
PhloxNotifier.SUB_TOPIC_NAME;
/** @type {?} */
PhloxNotifier.prototype.notificationManager;
/** @type {?} */
PhloxNotifier.prototype.phloxAppInfo;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGhsb3hOb3RpZmllci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvcGFnZS9tYWluL21lbnUuaW50ZXJuYWwvUGhsb3hOb3RpZmllci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWlCLFlBQVksRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFHekYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRXRGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUt6RSx1QkFBTSxTQUFTLEdBQVcsY0FBYyxDQUFDO0FBRXpDLHVCQUFNLGNBQWMsR0FBVyxnQkFBZ0IsQ0FBQztBQXlEaEQsTUFBTSxvQkFBcUIsU0FBUSxzQkFBc0I7Ozs7Ozs7O0lBU3ZELFlBQVksZUFBZ0MsRUFBRSxhQUFnQyxFQUFFLGdCQUFrQyxFQUFFLG1CQUF3QyxFQUFFLG1CQUF3QztRQUNwTSxLQUFLLENBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFdEYsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1FBRS9DLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEMsbUJBQW1CLENB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aUI7WUFEakIsZ0JBQWdCO1lBRWhCLG1CQUFtQjtZQUNuQixtQkFBbUI7Ozt3QkFzS3pCLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBQaGxveEFwcCB9IGZyb20gJy4uLy4uLy4uL1BobG94QXBwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQaGxveEFwcFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlL1BobG94QXBwU2VydmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlTWFuYWdlciB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2UvT2JzZXJ2YWJsZU1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZS9Ob3RpZmljYXRpb25NYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGhsb3hBcHBJbmZvU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2UvUGhsb3hBcHBJbmZvU2VydmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4vbW9kZWwvTm90aWZpY2F0aW9uJztcbmltcG9ydCB7IFBobG94QXBwSW5mbyB9IGZyb20gJy4uLy4uLy4uLy4uL2NvbXBvbmVudC9tb2RlbC9QaGxveEFwcEluZm8nO1xuaW1wb3J0IHsgQWJzdHJhY3RTaWRlU2xpZGVQYW5lbCB9IGZyb20gJy4uLy4uLy4uL0Fic3RyYWN0U2lkZVNsaWRlUGFuZWwnO1xuaW1wb3J0IHsgSU5vdGlmaWNhdGlvbk1hbmFnZXIgfSBmcm9tICcuLi8uLi8uLi8uLi9zaGFyZS9JTm90aWZpY2F0aW9uTWFuYWdlcic7XG5cbmRlY2xhcmUgdmFyICQ6IGFueTtcblxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1ub3RpZmllclwiO1xuXG5jb25zdCBTVUJfVE9QSUNfTkFNRTogc3RyaW5nID0gJ3BobG94LW5vdGlmaWVyJztcblxuQENvbXBvbmVudCh7XG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInBoeC1ub3RpZmllclwiIFtjbGFzcy5hY3RpdmVdPVwiaXNBY3RpdmUoKVwiIChjbGljayk9XCJvblRvZ2dsZSgkZXZlbnQpXCI+XG5cdDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG5cdFx0PGRpdj5cblx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS13cmFwcGVyIGZsdWlkXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS1yb3ctd3JhcHBlclwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS1jZWxsLXdyYXBwZXIgbWlkZGxlXCI+XG5cdFx0XHRcdFx0XHQ8c3ZnIHZlcnNpb249XCIxLjFcIiBpZD1cIkxheWVyXzFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgY2xhc3M9XCJiZWxsXCIgW2NsYXNzLnJpbmdpbmddPVwiaXNSaW5naW5nKClcIlxuXHRcdFx0XHRcdFx0XHR4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiXG5cdFx0XHRcdFx0XHRcdHZpZXdCb3g9XCIwIDAgMzAgMzBcIiBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOiBuZXcgMCAwIDMwIDMwO1wiXG5cdFx0XHRcdFx0XHRcdHhtbDpzcGFjZT1cInByZXNlcnZlXCI+XG5cdFx0XHRcdFx0XHRcdFx0PGc+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8Zz5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PHBhdGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkPVwiTTIxLjk1MSwxOS4xNzVsLTEtMS4yMjF2LTMuMjcxYzAtMy4xMjMtMi01LjcyMy01LTYuMjk0VjcuNTc1YzAtMC42NzMtMC44MjctMS4yMjEtMS41LTEuMjIxXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Yy0wLjY3MywwLTEuNSwwLjU0OC0xLjUsMS4yMjF2MC44MTRjLTMsMC41Ny01LDMuMTcxLTUsNi4yOTR2My4yNzFsLTEsMS4yMjF2MC43MWgtMXYyaDE3di0yaC0xVjE5LjE3NXogTTIyLjc3OSwxOS4xNzVcIiAvPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9nPlxuXHRcdFx0XHRcdFx0XHRcdDwvZz5cblx0XHRcdFx0XHRcdFx0PC9zdmc+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdFx0PGRpdj5cblx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS13cmFwcGVyIGZsdWlkXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS1yb3ctd3JhcHBlclwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS1jZWxsLXdyYXBwZXIgbWlkZGxlXCI+XG5cdFx0XHRcdFx0XHQ8c3ZnIHZlcnNpb249XCIxLjFcIiBpZD1cIkxheWVyXzFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgY2xhc3M9XCJiZWxsXCIgW2NsYXNzLnJpbmdpbmddPVwiaXNSaW5naW5nKClcIlxuXHRcdFx0XHRcdFx0XHR4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiXG5cdFx0XHRcdFx0XHRcdHZpZXdCb3g9XCIwIDAgMzAgMzBcIiBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOiBuZXcgMCAwIDMwIDMwO1wiXG5cdFx0XHRcdFx0XHRcdHhtbDpzcGFjZT1cInByZXNlcnZlXCI+XG5cdFx0XHRcdFx0XHRcdFx0PGc+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8Zz5cblxuXHRcdFx0XHRcdFx0XHRcdFx0PC9nPlxuXHRcdFx0XHRcdFx0XHRcdFx0PHBhdGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkPVwiTTE1LjE0NywyNC41MTNjMS4xMzYsMCwyLjExNy0wLjYyOCwyLjU3NC0xLjYyOGgtNS4xNDlDMTMuMDMsMjMuODg1LDE0LjAxMSwyNC41MTMsMTUuMTQ3LDI0LjUxM1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMMTUuMTQ3LDI0LjUxM3ogTTE1LjE0NywyNC44NzNcIiAvPlxuXHRcdFx0XHRcdFx0XHRcdDwvZz5cblx0XHRcdFx0XHRcdFx0PC9zdmc+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwicGh4LW5vdGlmaWVyLXNpZGUtcGFuZWwgcmlnaHRcIiBbY2xhc3MuYWN0aXZlXT1cImlzQWN0aXZlKClcIj5cblx0PGRpdiBjbGFzcz1cInJvd1wiICpuZ0Zvcj1cImxldCBub3RpZnkgb2YgZ2V0Tm90aWZpY2F0aW9ucygpOyBsZXQgaSA9IGluZGV4O1wiIChjbGljayk9XCJvbk5vdGlmaWNhdGlvbkNsaWNrZWQoJGV2ZW50LCBub3RpZnkpXCI+XG5cdFx0e3tub3RpZnkudGl0bGV9fSAtLT4gY2xpY2sgdG8gY2xlYXJcblx0PC9kaXY+XG48L2Rpdj5cbmBcbn0pXG5leHBvcnQgY2xhc3MgUGhsb3hOb3RpZmllciBleHRlbmRzIEFic3RyYWN0U2lkZVNsaWRlUGFuZWwgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTVUJfVE9QSUNfTkFNRTogc3RyaW5nID0gU1VCX1RPUElDX05BTUU7XG5cbiAgcHJpdmF0ZSBub3RpZmljYXRpb25NYW5hZ2VyOiBJTm90aWZpY2F0aW9uTWFuYWdlcjtcbiAgcHJpdmF0ZSBwaGxveEFwcEluZm86IFBobG94QXBwSW5mbztcblxuICBjb25zdHJ1Y3RvcihwaGxveEFwcFNlcnZpY2U6IFBobG94QXBwU2VydmljZSwgb2JzZXJ2YWJsZU1ncjogT2JzZXJ2YWJsZU1hbmFnZXIsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UsIG5vdGlmaWNhdGlvbk1hbmFnZXI6IE5vdGlmaWNhdGlvbk1hbmFnZXIsIHBobG94QXBwSW5mb1NlcnZpY2U6IFBobG94QXBwSW5mb1NlcnZpY2UpIHtcbiAgICBzdXBlcihwaGxveEFwcFNlcnZpY2UsIG9ic2VydmFibGVNZ3IsIG5lZWRGb2N1c1NlcnZpY2UsIFBobG94Tm90aWZpZXIuU1VCX1RPUElDX05BTUUpO1xuXG4gICAgdGhpcy5ub3RpZmljYXRpb25NYW5hZ2VyID0gbm90aWZpY2F0aW9uTWFuYWdlcjtcblxuICAgIGlmIChwaGxveEFwcEluZm9TZXJ2aWNlICE9IG51bGwpIHtcbiAgICAgIHBobG94QXBwSW5mb1NlcnZpY2UuZ2V0QXBwSW5mbygpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICB0aGlzLnBobG94QXBwSW5mbyA9IHJlc3VsdDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICB9XG5cbiAgcHVibGljIGlzUmluZ2luZygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5ub3RpZmljYXRpb25NYW5hZ2VyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgdW5SZWFkQXJyYXkgPSB0aGlzLmdldFVucmVhZE5vdGlmaWNhdGlvbnMoKTtcblxuICAgICAgaWYgKHVuUmVhZEFycmF5ICE9PSBudWxsICYmIHR5cGVvZiB1blJlYWRBcnJheSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHVuUmVhZEFycmF5Lmxlbmd0aCA+IDA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbnJlYWROb3RpZmljYXRpb25zKCk6IE5vdGlmaWNhdGlvbltdIHtcbiAgICBpZiAodGhpcy5ub3RpZmljYXRpb25NYW5hZ2VyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgdW5SZWFkQXJyYXkgPSB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIuZ2V0VW5yZWFkTm90aWZpY2F0aW9ucygpO1xuXG4gICAgICBpZiAodW5SZWFkQXJyYXkgIT09IG51bGwgJiYgdHlwZW9mIHVuUmVhZEFycmF5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdW5SZWFkQXJyYXk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcHVibGljIGdldE5vdGlmaWNhdGlvbnMoKTogTm90aWZpY2F0aW9uW10ge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBpZiAodGhpcy5ub3RpZmljYXRpb25NYW5hZ2VyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgYWxsTm90aWZ5QXJyYXkgPSB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIuZ2V0Tm90aWZpY2F0aW9ucygpO1xuICAgICAgbGV0IG1heE5vdGlmaWNhdGlvbiA9IFBobG94QXBwSW5mby5ERUZBVUxUX01BWF9OT1RJRklDQVRJT05TO1xuICAgICAgaWYgKHRoaXMucGhsb3hBcHBJbmZvICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLnBobG94QXBwSW5mbyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHRoaXMucGhsb3hBcHBJbmZvLnNldHRpbmdzICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBtYXhOb3RpZmljYXRpb24gPSB0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncy5NQVhfTk9USUZJQ0FUSU9OUztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWxsTm90aWZ5QXJyYXkgIT09IG51bGwgJiYgdHlwZW9mIGFsbE5vdGlmeUFycmF5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBsZXQgb3Zlckxlbmd0aCA9IDA7XG4gICAgICAgIGlmIChhbGxOb3RpZnlBcnJheS5sZW5ndGggPiBtYXhOb3RpZmljYXRpb24pIHtcbiAgICAgICAgICBvdmVyTGVuZ3RoID0gYWxsTm90aWZ5QXJyYXkubGVuZ3RoIC0gbWF4Tm90aWZpY2F0aW9uO1xuXG4gICAgICAgICAgbGV0IHJlbW92ZUFycmF5ID0gYWxsTm90aWZ5QXJyYXkuc2xpY2UoMCwgb3Zlckxlbmd0aCk7XG5cbiAgICAgICAgICBmb3IgKGxldCByIG9mIHJlbW92ZUFycmF5KSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIuY2xlYXIocik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFsbE5vdGlmeUFycmF5ID0gdGhpcy5ub3RpZmljYXRpb25NYW5hZ2VyLmdldE5vdGlmaWNhdGlvbnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IG4gb2YgYWxsTm90aWZ5QXJyYXkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgb25Ob3RpZmljYXRpb25DbGlja2VkKCRldmVudDogRXZlbnQsIG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogdm9pZCB7XG4gICAgaWYgKG5vdGlmaWNhdGlvbiA9PT0gbnVsbCB8fCB0eXBlb2Ygbm90aWZpY2F0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5ub3RpZmljYXRpb25NYW5hZ2VyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIuY2xlYXIobm90aWZpY2F0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25Ub2dnbGUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBzdXBlci5vblRvZ2dsZShldmVudCk7XG5cbiAgICAvLyBtYXJrIGFzIHJlYWRcbiAgICBpZiAodGhpcy5ub3RpZmljYXRpb25NYW5hZ2VyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbk1hbmFnZXIubWFya0FzUmVhZEFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxufVxuIl19