@stratio/egeo
Version:
376 lines • 36.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/st-foreground-notifications/st-foreground-notifications.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/*
* © 2017 Stratio Big Data Inc., Sucursal en España.
*
* This software is licensed under the Apache License, Version 2.0.
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the terms of the License for more details.
*
* SPDX-License-Identifier: Apache-2.0.
*/
import { ChangeDetectorRef, Component, Input, EventEmitter, Output, ElementRef, Renderer2, ChangeDetectionStrategy } from '@angular/core';
import { StatusNotification } from './st-foreground-notifications.model';
/**
* @description {Component} [Foreground notifications]
*
* Foreground notifications are made to let the user know info about a process she is performing in real time.
*
* @example
*
* {html}
*
* ```
* <st-foreground-notifications [notifications]="notifications" [(visible)]="true" [autoCloseTime]="1000"></st-foreground-notifications>
*
* ```
*/
export class StForegroundNotificationsComponent {
/**
* @param {?} cd
* @param {?} elemRef
* @param {?} renderer
*/
constructor(cd, elemRef, renderer) {
this.cd = cd;
this.elemRef = elemRef;
this.renderer = renderer;
/**
* \@Input {StNotificationElement []} [notifications='[]'] Array of notifications
*/
this.notifications = [];
/**
* \@output {clickLinkTemplate} [click] Event emitted when user click in a href link
*/
this.clickLinkTemplate = new EventEmitter();
/**
* \@output {visibleChange} [click] Event emitted when set param visible
*/
this.visibleChange = new EventEmitter();
this.currentNotification = 1;
this.showLinkMore = false;
this.status = 'default';
this._visible = false;
this.listStatusNotifications = [];
}
/**
* \@Input {bollean} [visible=flase] When true the notification is shown
* @param {?} value
* @return {?}
*/
set visible(value) {
if (value !== undefined) {
this._visible = value;
this.visibleChange.emit(this._visible);
}
this.cd.markForCheck();
}
/**
* @return {?}
*/
get visible() {
return this._visible;
}
/**
* @return {?}
*/
ngOnInit() {
if (this.autoCloseTime) {
if (this.notifications.length === 1 && this.notifications[0].status === 'success') {
setTimeout((/**
* @return {?}
*/
() => this.onClose()), this.autoCloseTime);
}
}
this.fillStatusNotifications();
}
/**
* @return {?}
*/
ngAfterViewInit() {
/** @type {?} */
let htmlElement = this.elemRef.nativeElement.querySelector('.foreground-notification__html');
if (htmlElement !== null) {
this.addStyleLinks(htmlElement);
}
if (this.notifications && this.notifications.length > 0) {
this.checkOneLine();
}
this.cd.detectChanges();
}
/**
* @return {?}
*/
ngOnChanges() {
if (this.notifications && this.notifications.length < this.currentNotification) {
this.currentNotification = this.notifications.length;
}
this.listStatusNotifications = [];
this.fillStatusNotifications();
}
/**
* @param {?} htmlElement
* @return {?}
*/
addStyleLinks(htmlElement) {
/** @type {?} */
let links = htmlElement.querySelectorAll('a');
if (links.constructor !== Array) {
links = ((/** @type {?} */ (Object))).values(links);
}
links.forEach((/**
* @param {?} element
* @param {?} index
* @return {?}
*/
(element, index) => {
/** @type {?} */
let nameEventEmitter = (this.notifications[this.getIndexCurrentNotification()]).nameEvents[index];
if (nameEventEmitter) {
element.addEventListener('click', this.onClickLinkHtmlTemplate.bind(this, nameEventEmitter));
this.renderer.setStyle(element, 'text-decoration', 'underline');
this.renderer.setStyle(element, 'cursor', 'pointer');
}
}));
}
/**
* @return {?}
*/
checkOneLine() {
/** @type {?} */
let element = this.elemRef.nativeElement.querySelectorAll('.foreground-notification__content');
/** @type {?} */
let currentIndex = this.getIndexCurrentNotification();
if (this.listStatusNotifications && this.listStatusNotifications.length > 0) {
if (element[currentIndex].offsetHeight > 40) {
this.listStatusNotifications[currentIndex].showMore = !this.listStatusNotifications[currentIndex].completeText;
if (this.listStatusNotifications[currentIndex].showMore) {
this.listStatusNotifications[currentIndex].completeText = false;
this.renderer.addClass(element[currentIndex], 'limit-one-line');
}
}
else {
this.listStatusNotifications[currentIndex].completeText = true;
if (!this.listStatusNotifications[currentIndex].showMore) {
this.removeStyleNotification();
}
}
}
this.checkStatus();
}
/**
* @return {?}
*/
checkStatus() {
this.statusValue = this.getStatus();
this.statusIconValue = this.getStatusIcon();
this.statusNotificationsValue = this.getStatusNotifications();
this.cd.detectChanges();
}
/**
* @return {?}
*/
decrementPage() {
this.currentNotification = this.getIndexCurrentNotification();
setTimeout((/**
* @return {?}
*/
() => {
this.checkOneLine();
this.cd.detectChanges();
}));
this.status = this.notifications[this.getIndexCurrentNotification()].status;
}
/**
* @return {?}
*/
fillStatusNotifications() {
if (this.notifications && this.notifications.length > 0) {
this.status = this.notifications[this.getIndexCurrentNotification()].status;
this.checkStatus();
}
this.notifications.forEach((/**
* @return {?}
*/
() => {
this.listStatusNotifications.push(new StatusNotification(false, false));
}));
}
/**
* @return {?}
*/
getIndexCurrentNotification() {
return this.currentNotification - 1;
}
/**
* @return {?}
*/
getStatus() {
switch (this.status) {
case 'success':
case 'warning':
case 'critical':
case 'running':
return this.status;
default:
return 'default';
}
}
/**
* @return {?}
*/
getStatusIcon() {
switch (this.status) {
case 'success':
return 'icon-circle-check';
case 'warning':
return 'icon-alert';
case 'critical':
return 'icon-info1';
case 'running':
return 'icon-info1';
default:
return 'default';
}
}
/**
* @return {?}
*/
getStatusNotifications() {
return (this.notifications.length > 1) ? 'more-lines' : '';
}
/**
* @return {?}
*/
incrementPage() {
this.currentNotification = this.currentNotification + 1;
setTimeout((/**
* @return {?}
*/
() => {
this.checkOneLine();
this.cd.detectChanges();
}));
this.status = this.notifications[this.getIndexCurrentNotification()].status;
}
/**
* @param {?} event
* @return {?}
*/
onClickLinkHtmlTemplate(event) {
this.clickLinkTemplate.emit(event);
}
/**
* @return {?}
*/
onClose() {
this.visible = false;
this.cd.markForCheck();
}
/**
* @return {?}
*/
removeStyleNotification() {
/** @type {?} */
let element = this.elemRef.nativeElement.querySelectorAll('.foreground-notification__content');
this.renderer.removeClass(element[this.getIndexCurrentNotification()], 'limit-one-line');
this.cd.markForCheck();
}
/**
* @return {?}
*/
showTextComplete() {
/** @type {?} */
let currentIndex = this.getIndexCurrentNotification();
if (this.listStatusNotifications && this.listStatusNotifications.length > 0) {
this.listStatusNotifications[currentIndex].showMore = false;
this.listStatusNotifications[currentIndex].completeText = true;
}
this.removeStyleNotification();
this.cd.markForCheck();
}
}
StForegroundNotificationsComponent.decorators = [
{ type: Component, args: [{
selector: 'st-foreground-notifications',
template: "<!--\n \u00A9 2017 Stratio Big Data Inc., Sucursal en Espa\u00F1a.\n This software is licensed under the Apache License, Version 2.0.\n This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n See the terms of the License for more details.\n SPDX-License-Identifier: Apache-2.0.\n-->\n<div class=\"foreground-notification__component\">\n <div class=\"foreground-notification__pagination\" [ngClass]=\"statusValue\" *ngIf=\"notifications.length > 1\">\n <button class=\"decrement-notification\" [disabled]=\"currentNotification === 1\" (click)=\"decrementPage()\"><i class=\"icon-arrow2_left\"></i></button>\n <span>{{currentNotification}}</span>\n <span>of</span>\n <span>{{notifications.length}}</span>\n <button class=\"increment-notification\" [disabled]=\"currentNotification === notifications.length \" (click)=\"incrementPage()\"><i class=\"icon-arrow2_right\"></i></button>\n </div>\n\n <div *ngIf=\"notifications.length > 0\" class=\"foreground-notification\" [ngClass]=\"[statusValue, statusNotificationsValue]\">\n <div class=\"foreground-notification__container\">\n <i class=\"status\" [ngClass]=\"statusIconValue\"></i>\n <div class=\"foreground-notification__content\" *ngFor=\"let notification of notifications; let index=index\">\n <span class=\"foreground-notification__html\" *ngIf=\"notification.html && index === currentNotification - 1\" [innerHtml]=\"notifications[currentNotification - 1].html\"></span>\n <span *ngIf=\"!notification.html && index === getIndexCurrentNotification()\">\n {{notifications[getIndexCurrentNotification()].text}}\n </span>\n <a class=\"link-more\" *ngIf=\"listStatusNotifications[index] && listStatusNotifications[index].showMore && index === currentNotification - 1\" (click)=\"showTextComplete()\">...More</a>\n </div>\n </div>\n\n <i class=\"close icon-cross\" (click)=\"onClose()\"></i>\n </div>\n</div>\n",
host: {
'[class.visible]': '_visible'
},
changeDetection: ChangeDetectionStrategy.OnPush,
styles: ["@charset \"UTF-8\";:host{display:flex;flex-direction:column;opacity:0;padding-left:15px;padding-right:15px;padding-top:4px;pointer-events:none;transition-duration:1s;transition-property:opacity}:host .foreground-notification{display:flex;font-size:14px;padding:8px 15px;position:relative;text-align:justify;width:auto;align-items:center}:host .foreground-notification .close{cursor:pointer;font-size:18px;flex-direction:row-reverse;margin-left:auto;right:11px;top:11px}:host .foreground-notification .link-more{cursor:pointer;padding-left:10px;padding-right:60px;text-decoration:underline}:host .foreground-notification.critical,:host .foreground-notification.running,:host .foreground-notification.success,:host .foreground-notification.warning{border-radius:4px}:host .foreground-notification.more-lines{border-top-left-radius:0;border-bottom-left-radius:0}:host .foreground-notification__component{display:flex;flex-direction:row;justify-content:center;min-height:40px}:host .foreground-notification__pagination{align-items:center;border-top-left-radius:4px;border-bottom-left-radius:4px;color:#fff;display:flex;font-size:1rem;height:40px;padding:5px}:host .foreground-notification__pagination.critical{background-color:#b2212a}:host .foreground-notification__pagination.success{background-color:#0a885a}:host .foreground-notification__pagination.warning{background-color:#ec7e13}:host .foreground-notification__pagination.running{background-color:#065eb2}:host .foreground-notification__pagination.default{border:0;color:#111;box-shadow:0 1px 4px 1px rgba(124,124,124,.15)}:host .foreground-notification__pagination span:nth-child(2){margin-left:5px}:host .foreground-notification__pagination span:nth-child(3){margin-left:5px;margin-right:5px}:host .foreground-notification__pagination span:nth-child(4){margin-right:5px}:host .foreground-notification__pagination i{cursor:pointer}:host .foreground-notification__container{align-items:flex-start;display:flex;justify-content:center;margin-right:60px;text-align:justify;width:100%}:host .foreground-notification__container i{font-size:18px;margin-right:10px}:host .foreground-notification__pagination.more-lines{margin:0;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}:host .foreground-notification__content{display:flex}:host .foreground-notification__content.limit-one-line span{display:-webkit-box;line-height:16px;max-height:16px;overflow:hidden;padding:4px 0;text-overflow:ellipsis;-webkit-line-clamp:1}:host.visible{opacity:1;pointer-events:all;transition-duration:1s;transition-property:opacity}"]
}] }
];
/** @nocollapse */
StForegroundNotificationsComponent.ctorParameters = () => [
{ type: ChangeDetectorRef },
{ type: ElementRef },
{ type: Renderer2 }
];
StForegroundNotificationsComponent.propDecorators = {
visible: [{ type: Input }],
autoCloseTime: [{ type: Input }],
notifications: [{ type: Input }],
clickLinkTemplate: [{ type: Output }],
visibleChange: [{ type: Output }]
};
if (false) {
/**
* \@Input {autoCloseTime} [autoCloseTime='1000'] Defines the time in milliseconds for autoclose the notification.
* The autoclose only applies if only have one notification and status is success
* @type {?}
*/
StForegroundNotificationsComponent.prototype.autoCloseTime;
/**
* \@Input {StNotificationElement []} [notifications='[]'] Array of notifications
* @type {?}
*/
StForegroundNotificationsComponent.prototype.notifications;
/**
* \@output {clickLinkTemplate} [click] Event emitted when user click in a href link
* @type {?}
*/
StForegroundNotificationsComponent.prototype.clickLinkTemplate;
/**
* \@output {visibleChange} [click] Event emitted when set param visible
* @type {?}
*/
StForegroundNotificationsComponent.prototype.visibleChange;
/** @type {?} */
StForegroundNotificationsComponent.prototype.currentNotification;
/** @type {?} */
StForegroundNotificationsComponent.prototype.statusIconValue;
/** @type {?} */
StForegroundNotificationsComponent.prototype.statusNotificationsValue;
/** @type {?} */
StForegroundNotificationsComponent.prototype.statusValue;
/** @type {?} */
StForegroundNotificationsComponent.prototype.showLinkMore;
/** @type {?} */
StForegroundNotificationsComponent.prototype.status;
/** @type {?} */
StForegroundNotificationsComponent.prototype._visible;
/** @type {?} */
StForegroundNotificationsComponent.prototype.listStatusNotifications;
/**
* @type {?}
* @private
*/
StForegroundNotificationsComponent.prototype.cd;
/**
* @type {?}
* @private
*/
StForegroundNotificationsComponent.prototype.elemRef;
/**
* @type {?}
* @private
*/
StForegroundNotificationsComponent.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtZm9yZWdyb3VuZC1ub3RpZmljYXRpb25zLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHN0cmF0aW8vZWdlby8iLCJzb3VyY2VzIjpbImxpYi9zdC1mb3JlZ3JvdW5kLW5vdGlmaWNhdGlvbnMvc3QtZm9yZWdyb3VuZC1ub3RpZmljYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQVVBLE9BQU8sRUFBaUIsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBVSxTQUFTLEVBQ2xHLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBRSxrQkFBa0IsRUFBeUIsTUFBTSxxQ0FBcUMsQ0FBQztBQVdoRzs7Ozs7Ozs7Ozs7OztHQWFHO0FBR0gsTUFBTSxPQUFPLGtDQUFrQzs7Ozs7O0lBdUM1QyxZQUFvQixFQUFxQixFQUFVLE9BQW1CLEVBQVUsUUFBbUI7UUFBL0UsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVzs7OztRQWxCMUYsa0JBQWEsR0FBNkIsRUFBRSxDQUFDOzs7O1FBRzVDLHNCQUFpQixHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDOzs7O1FBRzFELGtCQUFhLEdBQTBCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFN0Qsd0JBQW1CLEdBQVcsQ0FBQyxDQUFDO1FBSWhDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLFdBQU0sR0FBVyxTQUFTLENBQUM7UUFFM0IsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQiw0QkFBdUIsR0FBOEIsRUFBRSxDQUFDO0lBRXdDLENBQUM7Ozs7OztJQXBDeEcsSUFDSSxPQUFPLENBQUMsS0FBYztRQUN2QixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDdEIs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QUEyQjs7SUFDM0IsMERBQXFDOztJQUNyQyxvREFBa0M7O0lBRWxDLHNEQUFpQzs7SUFDakMscUVBQStEOzs7OztJQUVuRCxnREFBNkI7Ozs7O0lBQUUscURBQTJCOzs7OztJQUFFLHNEQUEyQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiDCqSAyMDE3IFN0cmF0aW8gQmlnIERhdGEgSW5jLiwgU3VjdXJzYWwgZW4gRXNwYcOxYS5cbiAqXG4gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZO1xuICogd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiAqIFNlZSB0aGUgdGVybXMgb2YgdGhlIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMC5cbiAqL1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5wdXQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBFbGVtZW50UmVmLCBPbkluaXQsIFJlbmRlcmVyMixcbiAgIE9uQ2hhbmdlcywgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3RhdHVzTm90aWZpY2F0aW9uLCBTdE5vdGlmaWNhdGlvbkVsZW1lbnQgfSBmcm9tICcuL3N0LWZvcmVncm91bmQtbm90aWZpY2F0aW9ucy5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICAgc2VsZWN0b3I6ICdzdC1mb3JlZ3JvdW5kLW5vdGlmaWNhdGlvbnMnLFxuICAgdGVtcGxhdGVVcmw6ICdzdC1mb3JlZ3JvdW5kLW5vdGlmaWNhdGlvbnMuaHRtbCcsXG4gICBzdHlsZVVybHM6IFsnc3QtZm9yZWdyb3VuZC1ub3RpZmljYXRpb25zLnNjc3MnXSxcbiAgIGhvc3Q6IHtcbiAgICAgICdbY2xhc3MudmlzaWJsZV0nOiAnX3Zpc2libGUnXG4gICB9LFxuICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG4vKipcbiAqIEBkZXNjcmlwdGlvbiB7Q29tcG9uZW50fSBbRm9yZWdyb3VuZCBub3RpZmljYXRpb25zXVxuICpcbiAqIEZvcmVncm91bmQgbm90aWZpY2F0aW9ucyBhcmUgbWFkZSB0byBsZXQgdGhlIHVzZXIga25vdyBpbmZvIGFib3V0IGEgcHJvY2VzcyBzaGUgaXMgcGVyZm9ybWluZyBpbiByZWFsIHRpbWUuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiB7aHRtbH1cbiAqXG4gKiBgYGBcbiAqIDxzdC1mb3JlZ3JvdW5kLW5vdGlmaWNhdGlvbnMgW25vdGlmaWNhdGlvbnNdPVwibm90aWZpY2F0aW9uc1wiIFsodmlzaWJsZSldPVwidHJ1ZVwiIFthdXRvQ2xvc2VUaW1lXT1cIjEwMDBcIj48L3N0LWZvcmVncm91bmQtbm90aWZpY2F0aW9ucz5cbiAqXG4gKiBgYGBcbiAqL1xuXG5cbmV4cG9ydCBjbGFzcyBTdEZvcmVncm91bmROb3RpZmljYXRpb25zQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkluaXQge1xuXG4gICAvKiogQElucHV0IHtib2xsZWFufSBbdmlzaWJsZT1mbGFzZV0gV2hlbiB0cnVlIHRoZSBub3RpZmljYXRpb24gaXMgc2hvd24gKi9cbiAgIEBJbnB1dCgpXG4gICBzZXQgdmlzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRoaXMuX3Zpc2libGUgPSB2YWx1ZTtcbiAgICAgICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KHRoaXMuX3Zpc2libGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgIH1cbiAgIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3Zpc2libGU7XG4gICB9XG5cbiAgIC8qKiBASW5wdXQge2F1dG9DbG9zZVRpbWV9IFthdXRvQ2xvc2VUaW1lPScxMDAwJ10gRGVmaW5lcyB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIGF1dG9jbG9zZSB0aGUgbm90aWZpY2F0aW9uLlxuICAgICogIFRoZSBhdXRvY2xvc2Ugb25seSBhcHBsaWVzIGlmIG9ubHkgaGF2ZSBvbmUgbm90aWZpY2F0aW9uIGFuZCBzdGF0dXMgaXMgc3VjY2Vzc1xuICAgICovXG4gICBASW5wdXQoKSBhdXRvQ2xvc2VUaW1lOiBudW1iZXI7XG5cbiAgIC8qKiBASW5wdXQge1N0Tm90aWZpY2F0aW9uRWxlbWVudCBbXX0gW25vdGlmaWNhdGlvbnM9J1tdJ10gQXJyYXkgb2Ygbm90aWZpY2F0aW9ucyAqL1xuICAgQElucHV0KCkgbm90aWZpY2F0aW9ucz86IFN0Tm90aWZpY2F0aW9uRWxlbWVudFtdID0gW107XG5cbiAgICAvKiogQG91dHB1dCB7Y2xpY2tMaW5rVGVtcGxhdGV9IFtjbGlja10gRXZlbnQgZW1pdHRlZCB3aGVuIHVzZXIgY2xpY2sgaW4gYSBocmVmIGxpbmsgKi9cbiAgIEBPdXRwdXQoKSBjbGlja0xpbmtUZW1wbGF0ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgIC8qKiBAb3V0cHV0IHt2aXNpYmxlQ2hhbmdlfSBbY2xpY2tdIEV2ZW50IGVtaXR0ZWQgd2hlbiBzZXQgcGFyYW0gdmlzaWJsZSAqL1xuICAgQE91dHB1dCgpIHZpc2libGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgcHVibGljIGN1cnJlbnROb3RpZmljYXRpb246IG51bWJlciA9IDE7XG4gICBwdWJsaWMgc3RhdHVzSWNvblZhbHVlOiBzdHJpbmc7XG4gICBwdWJsaWMgc3RhdHVzTm90aWZpY2F0aW9uc1ZhbHVlOiBzdHJpbmc7XG4gICBwdWJsaWMgc3RhdHVzVmFsdWU6IHN0cmluZztcbiAgIHB1YmxpYyBzaG93TGlua01vcmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgIHB1YmxpYyBzdGF0dXM6IHN0cmluZyA9ICdkZWZhdWx0JztcblxuICAgcHVibGljIF92aXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG4gICBwdWJsaWMgbGlzdFN0YXR1c05vdGlmaWNhdGlvbnM6IEFycmF5PFN0YXR1c05vdGlmaWNhdGlvbj4gPSBbXTtcblxuICAgY29uc3RydWN0b3IocHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZWxlbVJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7IH1cblxuICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5hdXRvQ2xvc2VUaW1lKSB7XG4gICAgICAgICBpZiAoIHRoaXMubm90aWZpY2F0aW9ucy5sZW5ndGggPT09IDEgJiYgdGhpcy5ub3RpZmljYXRpb25zWzBdLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMub25DbG9zZSgpLCB0aGlzLmF1dG9DbG9zZVRpbWUpO1xuICAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5maWxsU3RhdHVzTm90aWZpY2F0aW9ucygpO1xuICAgfVxuXG4gICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICBsZXQgaHRtbEVsZW1lbnQgPSB0aGlzLmVsZW1SZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuZm9yZWdyb3VuZC1ub3RpZmljYXRpb25fX2h0bWwnKTtcbiAgICAgIGlmIChodG1sRWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgdGhpcy5hZGRTdHlsZUxpbmtzKGh0bWxFbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGlmICggdGhpcy5ub3RpZmljYXRpb25zICYmIHRoaXMubm90aWZpY2F0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICB0aGlzLmNoZWNrT25lTGluZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgIH1cblxuICAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5ub3RpZmljYXRpb25zICYmIHRoaXMubm90aWZpY2F0aW9ucy5sZW5ndGggPCB0aGlzLmN1cnJlbnROb3RpZmljYXRpb24pIHtcbiAgICAgICAgIHRoaXMuY3VycmVudE5vdGlmaWNhdGlvbiA9IHRoaXMubm90aWZpY2F0aW9ucy5sZW5ndGg7XG4gICAgICB9XG4gICAgICB0aGlzLmxpc3RTdGF0dXNOb3RpZmljYXRpb25zID0gW107XG4gICAgICB0aGlzLmZpbGxTdGF0dXNOb3RpZmljYXRpb25zKCk7XG4gICB9XG5cbiAgIGFkZFN0eWxlTGlua3MoaHRtbEVsZW1lbnQ6IGFueSk6IHZvaWQge1xuICAgICAgbGV0IGxpbmtzID0gaHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYScpO1xuICAgICAgaWYgKGxpbmtzLmNvbnN0cnVjdG9yICE9PSBBcnJheSkge1xuICAgICAgICAgbGlua3MgPSAoPGFueT5PYmplY3QpLnZhbHVlcyhsaW5rcyk7XG4gICAgICB9XG4gICAgICBsaW5rcy5mb3JFYWNoKChlbGVtZW50OiBhbnksIGluZGV4OiBhbnkpID0+IHtcbiAgICAgICAgIGxldCBuYW1lRXZlbnRFbWl0dGVyID0gKHRoaXMubm90aWZpY2F0aW9uc1t0aGlzLmdldEluZGV4Q3VycmVudE5vdGlmaWNhdGlvbigpXSkubmFtZUV2ZW50c1tpbmRleF07XG4gICAgICAgICBpZiAobmFtZUV2ZW50RW1pdHRlcikge1xuICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25DbGlja0xpbmtIdG1sVGVtcGxhdGUuYmluZCh0aGlzLCBuYW1lRXZlbnRFbWl0dGVyKSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQsICd0ZXh0LWRlY29yYXRpb24nLCAndW5kZXJsaW5lJyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQsICdjdXJzb3InLCAncG9pbnRlcicpO1xuICAgICAgICAgfVxuICAgICAgfSk7XG4gICB9XG5cbiAgIGNoZWNrT25lTGluZSgpOiB2b2lkIHtcbiAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5lbGVtUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmZvcmVncm91bmQtbm90aWZpY2F0aW9uX19jb250ZW50Jyk7XG4gICAgICBsZXQgY3VycmVudEluZGV4ID0gdGhpcy5nZXRJbmRleEN1cnJlbnROb3RpZmljYXRpb24oKTtcblxuICAgICAgaWYgKHRoaXMubGlzdFN0YXR1c05vdGlmaWNhdGlvbnMgJiYgdGhpcy5saXN0U3RhdHVzTm90aWZpY2F0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICBpZiAoZWxlbWVudFtjdXJyZW50SW5kZXhdLm9mZnNldEhlaWdodCA+IDQwKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RTdGF0dXNOb3RpZmljYXRpb25zW2N1cnJlbnRJbmRleF0uc2hvd01vcmUgPSAhdGhpcy5saXN0U3RhdHVzTm90aWZpY2F0aW9uc1tjdXJyZW50SW5kZXhdLmNvbXBsZXRlVGV4dDtcblxuICAgICAgICAgICAgaWYgKHRoaXMubGlzdFN0YXR1c05vdGlmaWNhdGlvbnNbY3VycmVudEluZGV4XS5zaG93TW9yZSkge1xuICAgICAgICAgICAgICAgdGhpcy5saXN0U3RhdHVzTm90aWZpY2F0aW9uc1tjdXJyZW50SW5kZXhdLmNvbXBsZXRlVGV4dCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50W2N1cnJlbnRJbmRleF0sICdsaW1pdC1vbmUtbGluZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGlzdFN0YXR1c05vdGlmaWNhdGlvbnNbY3VycmVudEluZGV4XS5jb21wbGV0ZVRleHQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmxpc3RTdGF0dXNOb3RpZmljYXRpb25zW2N1cnJlbnRJbmRleF0uc2hvd01vcmUpIHtcbiAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlU3R5bGVOb3RpZmljYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY2hlY2tTdGF0dXMoKTtcbiAgIH1cblxuICAgY2hlY2tTdGF0dXMoKTogdm9pZCB7XG4gICAgICB0aGlzLnN0YXR1c1ZhbHVlID0gdGhpcy5nZXRTdGF0dXMoKTtcbiAgICAgIHRoaXMuc3RhdHVzSWNvblZhbHVlID0gdGhpcy5nZXRTdGF0dXNJY29uKCk7XG4gICAgICB0aGlzLnN0YXR1c05vdGlmaWNhdGlvbnNWYWx1ZSA9IHRoaXMuZ2V0U3RhdHVzTm90aWZpY2F0aW9ucygpO1xuXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgIH1cblxuICAgZGVjcmVtZW50UGFnZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuY3VycmVudE5vdGlmaWNhdGlvbiA9IHRoaXMuZ2V0SW5kZXhDdXJyZW50Tm90aWZpY2F0aW9uKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgIHRoaXMuY2hlY2tPbmVMaW5lKCk7XG4gICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdGF0dXMgPSB0aGlzLm5vdGlmaWNhdGlvbnNbdGhpcy5nZXRJbmRleEN1cnJlbnROb3RpZmljYXRpb24oKV0uc3RhdHVzO1xuICAgfVxuXG4gICBmaWxsU3RhdHVzTm90aWZpY2F0aW9ucygpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLm5vdGlmaWNhdGlvbnMgJiYgdGhpcy5ub3RpZmljYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgIHRoaXMuc3RhdHVzID0gdGhpcy5ub3RpZmljYXRpb25zW3RoaXMuZ2V0SW5kZXhDdXJyZW50Tm90aWZpY2F0aW9uKCldLnN0YXR1cztcbiAgICAgICAgIHRoaXMuY2hlY2tTdGF0dXMoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5ub3RpZmljYXRpb25zLmZvckVhY2goKCkgPT4ge1xuICAgICAgICAgdGhpcy5saXN0U3RhdHVzTm90aWZpY2F0aW9ucy5wdXNoKG5ldyBTdGF0dXNOb3RpZmljYXRpb24oZmFsc2UsIGZhbHNlKSk7XG4gICAgICB9KTtcbiAgIH1cblxuICAgZ2V0SW5kZXhDdXJyZW50Tm90aWZpY2F0aW9uKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50Tm90aWZpY2F0aW9uIC0gMTtcbiAgIH1cblxuICAgZ2V0U3RhdHVzKCk6IHN0cmluZyB7XG4gICAgICBzd2l0Y2ggKHRoaXMuc3RhdHVzKSB7XG4gICAgICAgICBjYXNlICdzdWNjZXNzJzpcbiAgICAgICAgIGNhc2UgJ3dhcm5pbmcnOlxuICAgICAgICAgY2FzZSAnY3JpdGljYWwnOlxuICAgICAgICAgY2FzZSAncnVubmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXM7XG4gICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuICdkZWZhdWx0JztcbiAgICAgIH1cbiAgIH1cblxuICAgZ2V0U3RhdHVzSWNvbigpOiBzdHJpbmcge1xuICAgICAgc3dpdGNoICh0aGlzLnN0YXR1cykge1xuICAgICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgICAgICByZXR1cm4gJ2ljb24tY2lyY2xlLWNoZWNrJztcbiAgICAgICAgIGNhc2UgJ3dhcm5pbmcnOlxuICAgICAgICAgICAgcmV0dXJuICdpY29uLWFsZXJ0JztcbiAgICAgICAgIGNhc2UgJ2NyaXRpY2FsJzpcbiAgICAgICAgICAgIHJldHVybiAnaWNvbi1pbmZvMSc7XG4gICAgICAgICBjYXNlICdydW5uaW5nJzpcbiAgICAgICAgICAgIHJldHVybiAnaWNvbi1pbmZvMSc7XG4gICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuICdkZWZhdWx0JztcbiAgICAgIH1cbiAgIH1cblxuICAgZ2V0U3RhdHVzTm90aWZpY2F0aW9ucygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICh0aGlzLm5vdGlmaWNhdGlvbnMubGVuZ3RoID4gMSkgPyAnbW9yZS1saW5lcycgOiAnJztcbiAgIH1cblxuICAgaW5jcmVtZW50UGFnZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuY3VycmVudE5vdGlmaWNhdGlvbiA9IHRoaXMuY3VycmVudE5vdGlmaWNhdGlvbiArIDE7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgIHRoaXMuY2hlY2tPbmVMaW5lKCk7XG4gICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zdGF0dXMgPSB0aGlzLm5vdGlmaWNhdGlvbnNbdGhpcy5nZXRJbmRleEN1cnJlbnROb3RpZmljYXRpb24oKV0uc3RhdHVzO1xuICAgfVxuXG4gICBvbkNsaWNrTGlua0h0bWxUZW1wbGF0ZShldmVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgICB0aGlzLmNsaWNrTGlua1RlbXBsYXRlLmVtaXQoZXZlbnQpO1xuICAgfVxuXG4gICBvbkNsb3NlKCk6IHZvaWQge1xuICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgfVxuXG4gICByZW1vdmVTdHlsZU5vdGlmaWNhdGlvbigpOiB2b2lkIHtcbiAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5lbGVtUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmZvcmVncm91bmQtbm90aWZpY2F0aW9uX19jb250ZW50Jyk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnRbdGhpcy5nZXRJbmRleEN1cnJlbnROb3RpZmljYXRpb24oKV0sICdsaW1pdC1vbmUtbGluZScpO1xuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgIH1cblxuICAgc2hvd1RleHRDb21wbGV0ZSgpOiB2b2lkIHtcbiAgICAgIGxldCBjdXJyZW50SW5kZXggPSB0aGlzLmdldEluZGV4Q3VycmVudE5vdGlmaWNhdGlvbigpO1xuICAgICAgaWYgKHRoaXMubGlzdFN0YXR1c05vdGlmaWNhdGlvbnMgJiYgdGhpcy5saXN0U3RhdHVzTm90aWZpY2F0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICB0aGlzLmxpc3RTdGF0dXNOb3RpZmljYXRpb25zW2N1cnJlbnRJbmRleF0uc2hvd01vcmUgPSBmYWxzZTtcbiAgICAgICAgIHRoaXMubGlzdFN0YXR1c05vdGlmaWNhdGlvbnNbY3VycmVudEluZGV4XS5jb21wbGV0ZVRleHQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW1vdmVTdHlsZU5vdGlmaWNhdGlvbigpO1xuICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgIH1cbn1cblxuXG4iXX0=