UNPKG

ngx-snotifire

Version:

Demo project at [https://ccpatrut.github.io/ngx-snotifire/](https://ccpatrut.github.io/ngx-snotifire/) Github repo: [https://github.com/ccpatrut/ngx-snotifire](https://github.com/ccpatrut/ngx-snotifire)

129 lines 19.9 kB
import { Component, ViewEncapsulation, } from '@angular/core'; import { Subject, takeUntil } from 'rxjs'; import { SnotifireEventType, SnotificationPositionType } from '../../models'; import * as i0 from "@angular/core"; import * as i1 from "../../services"; import * as i2 from "@angular/common"; import * as i3 from "../toast/toast.component"; import * as i4 from "../../pipes/keys.pipe"; export class NgxSnotifireComponent { constructor(service) { this.service = service; this.unsubscribe$ = new Subject(); /** * Backdrop Opacity */ this.backdrop = -1; /** * How many toasts with backdrop in current queue */ this.withBackdrop = []; } ngAfterViewInit() { } ngOnInit() { this.service.emitter .pipe(takeUntil(this.unsubscribe$)) .subscribe((toasts) => { if (this.service.defaultConfig && this.service.defaultConfig.global && this.service.defaultConfig.global.newOnTop) { this.dockSizeA = this.service.defaultConfig.global.maxOnScreen ? -this.service.defaultConfig.global.maxOnScreen : 6; this.dockSizeB = undefined; this.blockSizeA = this.service.defaultConfig.global.maxAtPosition ? -this.service.defaultConfig.global.maxAtPosition : 4; this.blockSizeB = undefined; this.withBackdrop = toasts.filter((toast) => toast.config && toast.config.backdrop && toast.config.backdrop >= 0); } else { this.dockSizeA = 0; this.dockSizeB = this.service.defaultConfig.global && this.service.defaultConfig.global.maxOnScreen; this.blockSizeA = 0; this.blockSizeB = this.service.defaultConfig.global && this.service.defaultConfig.global.maxAtPosition; this.withBackdrop = toasts .filter((toast) => toast.config && toast.config.backdrop && toast.config.backdrop >= 0) .reverse(); } this.notifications = this.splitToasts(toasts.slice(this.dockSizeA, this.dockSizeB)); this.stateChanged(SnotifireEventType.MOUNTED); }); } /** * Split toasts toasts into different objects * @param toasts notifire-toast[] * @returns SnotifyNotifications */ splitToasts(toasts) { const result = {}; for (const property in SnotificationPositionType) { if (SnotificationPositionType.hasOwnProperty(property)) { result[SnotificationPositionType[property]] = []; } } toasts.forEach((toast) => { if (toast.config.position) { const keyIndex = Object.keys(SnotificationPositionType).indexOf(toast.config.position); const searchedString = Object.values(SnotificationPositionType)[keyIndex]; result[searchedString]?.push(toast); } }); return result; } getNotificationArray(notifications, position) { return notifications[position]; } /** * Changes the backdrop opacity * @param event NotificationEventType */ stateChanged(event) { if (!this.withBackdrop.length) { if (this.backdrop && this.backdrop >= 0) { this.backdrop = -1; } return; } switch (event) { case 'mounted': if (this.backdrop && this.backdrop < 0) { this.backdrop = 0; } break; case 'beforeShow': this.backdrop = this.withBackdrop[this.withBackdrop.length - 1].config?.backdrop; break; case 'beforeHide': if (this.withBackdrop.length === 1) { this.backdrop = 0; } break; case 'hidden': if (this.withBackdrop.length === 1) { this.backdrop = -1; } break; } } ngOnDestroy() { this.unsubscribe$.next(); this.unsubscribe$.complete(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgxSnotifireComponent, deps: [{ token: i1.SnotifireService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", type: NgxSnotifireComponent, selector: "ngx-snotifire", ngImport: i0, template: "<div\n class=\"snotifire-backdrop\"\n *ngIf=\"backdrop && backdrop >= 0\"\n [style.opacity]=\"backdrop\"\n></div>\n\n<div\n *ngFor=\"let position of notifications | keys\"\n class=\"snotify snotify-{{ position }}\"\n>\n <ngx-toast\n *ngFor=\"let notification of getNotificationArray(notifications, position) | slice: blockSizeA:blockSizeB\"\n [toast]=\"notification\"\n (stateChanged)=\"stateChanged($event)\"\n >\n </ngx-toast>\n\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.ToastComponent, selector: "ngx-toast", inputs: ["toast"], outputs: ["stateChanged"] }, { kind: "pipe", type: i2.SlicePipe, name: "slice" }, { kind: "pipe", type: i4.KeysPipe, name: "keys" }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgxSnotifireComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-snotifire', encapsulation: ViewEncapsulation.None, template: "<div\n class=\"snotifire-backdrop\"\n *ngIf=\"backdrop && backdrop >= 0\"\n [style.opacity]=\"backdrop\"\n></div>\n\n<div\n *ngFor=\"let position of notifications | keys\"\n class=\"snotify snotify-{{ position }}\"\n>\n <ngx-toast\n *ngFor=\"let notification of getNotificationArray(notifications, position) | slice: blockSizeA:blockSizeB\"\n [toast]=\"notification\"\n (stateChanged)=\"stateChanged($event)\"\n >\n </ngx-toast>\n\n</div>\n" }] }], ctorParameters: () => [{ type: i1.SnotifireService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNub3RpZmlyZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc25vdGlmaXJlL3NyYy9saWIvY29tcG9uZW50cy9uZ3gtbm90aWZpcmUvbmd4LXNub3RpZmlyZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc25vdGlmaXJlL3NyYy9saWIvY29tcG9uZW50cy9uZ3gtbm90aWZpcmUvbmd4LXNub3RpZmlyZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUdULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sY0FBYyxDQUFDOzs7Ozs7QUFVN0UsTUFBTSxPQUFPLHFCQUFxQjtJQW1DaEMsWUFBcUIsT0FBeUI7UUFBekIsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFsQzdCLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQXlCcEQ7O1dBRUc7UUFDSCxhQUFRLEdBQXVCLENBQUMsQ0FBQyxDQUFDO1FBQ2xDOztXQUVHO1FBQ0gsaUJBQVksR0FBMEIsRUFBRSxDQUFDO0lBRVEsQ0FBQztJQUNsRCxlQUFlLEtBQVUsQ0FBQztJQUUxQixRQUFRO1FBQ04sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPO2FBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2xDLFNBQVMsQ0FBQyxDQUFDLE1BQTZCLEVBQUUsRUFBRTtZQUMzQyxJQUNFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYTtnQkFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTTtn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QUMsUUFBUSxHQUFHLENBQUMsQ0FBQztnQkFDcEIsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsS0FBSyxRQUFRO2dCQUNYLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JCLENBQUM7Z0JBQ0QsTUFBTTtRQUNWLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMvQixDQUFDOzhHQWxLVSxxQkFBcUI7a0dBQXJCLHFCQUFxQixxRENsQmxDLHVlQWtCQTs7MkZEQWEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLGVBQWUsaUJBRVYsaUJBQWlCLENBQUMsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTbm90aWZpcmVFdmVudFR5cGUsIFNub3RpZmljYXRpb25Qb3NpdGlvblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgU25vdGlmaXJlTm90aWZpY2F0aW9ucyB9IGZyb20gJy4uLy4uL21vZGVscy9zbm90aWZpcmUtbm90aWZpY2F0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU25vdGlmaXJlVG9hc3RNb2RlbCB9IGZyb20gJy4uL3RvYXN0L25vdGlmaXJlLXRvYXN0Lm1vZGVsJztcbmltcG9ydCB7IFNub3RpZmlyZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1zbm90aWZpcmUnLFxuICB0ZW1wbGF0ZVVybDogJy4vbmd4LXNub3RpZmlyZS5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIE5neFNub3RpZmlyZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgcHJpdmF0ZSByZWFkb25seSB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAvKipcbiAgICogVG9hc3RzIGFycmF5XG4gICAqL1xuICBub3RpZmljYXRpb25zITogU25vdGlmaXJlTm90aWZpY2F0aW9ucztcbiAgLyoqXG4gICAqIFRvYXN0cyBlbWl0dGVyXG4gICAqL1xuICBlbWl0dGVyITogU3Vic2NyaXB0aW9uO1xuICAvKipcbiAgICogSGVscGVyIGZvciBzbGljZSBwaXBlIChtYXhPblNjcmVlbilcbiAgICovXG4gIGRvY2tTaXplQSE6IG51bWJlcjtcbiAgLyoqXG4gICAqIEhlbHBlciBmb3Igc2xpY2UgcGlwZSAobWF4T25TY3JlZW4pXG4gICAqL1xuICBkb2NrU2l6ZUIhOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBIZWxwZXIgZm9yIHNsaWNlIHBpcGUgKG1heEF0UG9zaXRpb24pXG4gICAqL1xuICBibG9ja1NpemVBITogbnVtYmVyO1xuICAvKipcbiAgICogSGVscGVyIGZvciBzbGljZSBwaXBlIChtYXhBdFBvc2l0aW9uKVxuICAgKi9cbiAgYmxvY2tTaXplQiE6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEJhY2tkcm9wIE9wYWNpdHlcbiAgICovXG4gIGJhY2tkcm9wOiBudW1iZXIgfCB1bmRlZmluZWQgPSAtMTtcbiAgLyoqXG4gICAqIEhvdyBtYW55IHRvYXN0cyB3aXRoIGJhY2tkcm9wIGluIGN1cnJlbnQgcXVldWVcbiAgICovXG4gIHdpdGhCYWNrZHJvcDogU25vdGlmaXJlVG9hc3RNb2RlbFtdID0gW107XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgc2VydmljZTogU25vdGlmaXJlU2VydmljZSkge31cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlcnZpY2UuZW1pdHRlclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSlcbiAgICAgIC5zdWJzY3JpYmUoKHRvYXN0czogU25vdGlmaXJlVG9hc3RNb2RlbFtdKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLnNlcnZpY2UuZGVmYXVsdENvbmZpZyAmJlxuICAgICAgICAgIHRoaXMuc2VydmljZS5kZWZhdWx0Q29uZmlnLmdsb2JhbCAmJlxuICAgICAgICAgIHRoaXMuc2VydmljZS5kZWZhdWx0Q29uZmlnLmdsb2JhbC5uZXdPblRvcFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmRvY2tTaXplQSA9IHRoaXMuc2VydmljZS5kZWZhdWx0Q29uZmlnLmdsb2JhbC5tYXhPblNjcmVlblxuICAgICAgICAgICAgPyAtdGhpcy5zZXJ2aWNlLmRlZmF1bHRDb25maWcuZ2xvYmFsLm1heE9uU2NyZWVuXG4gICAgICAgICAgICA6IDY7XG4gICAgICAgICAgdGhpcy5kb2NrU2l6ZUIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdGhpcy5ibG9ja1NpemVBID0gdGhpcy5zZXJ2aWNlLmRlZmF1bHRDb25maWcuZ2xvYmFsLm1heEF0UG9zaXRpb25cbiAgICAgICAgICAgID8gLXRoaXMuc2VydmljZS5kZWZhdWx0Q29uZmlnLmdsb2JhbC5tYXhBdFBvc2l0aW9uXG4gICAgICAgICAgICA6IDQ7XG4gICAgICAgICAgdGhpcy5ibG9ja1NpemVCID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHRoaXMud2l0aEJhY2tkcm9wID0gdG9hc3RzLmZpbHRlcihcbiAgICAgICAgICAgICh0b2FzdCkgPT5cbiAgICAgICAgICAgICAgdG9hc3QuY29uZmlnICYmXG4gICAgICAgICAgICAgIHRvYXN0LmNvbmZpZy5iYWNrZHJvcCAmJlxuICAgICAgICAgICAgICB0b2FzdC5jb25maWcuYmFja2Ryb3AgPj0gMFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kb2NrU2l6ZUEgPSAwO1xuICAgICAgICAgIHRoaXMuZG9ja1NpemVCID1cbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5kZWZhdWx0Q29uZmlnLmdsb2JhbCAmJlxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmRlZmF1bHRDb25maWcuZ2xvYmFsLm1heE9uU2NyZWVuO1xuICAgICAgICAgIHRoaXMuYmxvY2tTaXplQSA9IDA7XG4gICAgICAgICAgdGhpcy5ibG9ja1NpemVCID1cbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5kZWZhdWx0Q29uZmlnLmdsb2JhbCAmJlxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmRlZmF1bHRDb25maWcuZ2xvYmFsLm1heEF0UG9zaXRpb247XG4gICAgICAgICAgdGhpcy53aXRoQmFja2Ryb3AgPSB0b2FzdHNcbiAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICh0b2FzdCkgPT5cbiAgICAgICAgICAgICAgICB0b2FzdC5jb25maWcgJiZcbiAgICAgICAgICAgICAgICB0b2FzdC5jb25maWcuYmFja2Ryb3AgJiZcbiAgICAgICAgICAgICAgICB0b2FzdC5jb25maWcuYmFja2Ryb3AgPj0gMFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnJldmVyc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPSB0aGlzLnNwbGl0VG9hc3RzKFxuICAgICAgICAgIHRvYXN0cy5zbGljZSh0aGlzLmRvY2tTaXplQSwgdGhpcy5kb2NrU2l6ZUIpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VkKFNub3RpZmlyZUV2ZW50VHlwZS5NT1VOVEVEKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IHRvYXN0cyB0b2FzdHMgaW50byBkaWZmZXJlbnQgb2JqZWN0c1xuICAgKiBAcGFyYW0gdG9hc3RzIG5vdGlmaXJlLXRvYXN0W11cbiAgICogQHJldHVybnMgU25vdGlmeU5vdGlmaWNhdGlvbnNcbiAgICovXG4gIHNwbGl0VG9hc3RzKHRvYXN0czogU25vdGlmaXJlVG9hc3RNb2RlbFtdKTogU25vdGlmaXJlTm90aWZpY2F0aW9ucyB7XG4gICAgY29uc3QgcmVzdWx0OiBTbm90aWZpcmVOb3RpZmljYXRpb25zID0ge307XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIFNub3RpZmljYXRpb25Qb3NpdGlvblR5cGUpIHtcbiAgICAgIGlmIChTbm90aWZpY2F0aW9uUG9zaXRpb25UeXBlLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xuICAgICAgICByZXN1bHRbXG4gICAgICAgICAgU25vdGlmaWNhdGlvblBvc2l0aW9uVHlwZVtcbiAgICAgICAgICAgIHByb3BlcnR5IGFzIGtleW9mIHR5cGVvZiBTbm90aWZpY2F0aW9uUG9zaXRpb25UeXBlXG4gICAgICAgICAgXVxuICAgICAgICBdID0gW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgdG9hc3RzLmZvckVhY2goKHRvYXN0OiBTbm90aWZpcmVUb2FzdE1vZGVsKSA9PiB7XG4gICAgICBpZiAodG9hc3QuY29uZmlnLnBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IGtleUluZGV4ID0gT2JqZWN0LmtleXMoU25vdGlmaWNhdGlvblBvc2l0aW9uVHlwZSkuaW5kZXhPZihcbiAgICAgICAgICB0b2FzdC5jb25maWcucG9zaXRpb25cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc2VhcmNoZWRTdHJpbmcgPSBPYmplY3QudmFsdWVzKFNub3RpZmljYXRpb25Qb3NpdGlvblR5cGUpW1xuICAgICAgICAgIGtleUluZGV4XG4gICAgICAgIF07XG4gICAgICAgIHJlc3VsdFtzZWFyY2hlZFN0cmluZ10/LnB1c2godG9hc3QpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXROb3RpZmljYXRpb25BcnJheShcbiAgICBub3RpZmljYXRpb25zOiBTbm90aWZpcmVOb3RpZmljYXRpb25zLFxuICAgIHBvc2l0aW9uOiBTbm90aWZpY2F0aW9uUG9zaXRpb25UeXBlXG4gICk6IFNub3RpZmlyZVRvYXN0TW9kZWxbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbnNbcG9zaXRpb25dO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIGJhY2tkcm9wIG9wYWNpdHlcbiAgICogQHBhcmFtIGV2ZW50IE5vdGlmaWNhdGlvbkV2ZW50VHlwZVxuICAgKi9cbiAgc3RhdGVDaGFuZ2VkKGV2ZW50OiBTbm90aWZpcmVFdmVudFR5cGUpIHtcbiAgICBpZiAoIXRoaXMud2l0aEJhY2tkcm9wLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuYmFja2Ryb3AgJiYgdGhpcy5iYWNrZHJvcCA+PSAwKSB7XG4gICAgICAgIHRoaXMuYmFja2Ryb3AgPSAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChldmVudCkge1xuICAgICAgY2FzZSAnbW91bnRlZCc6XG4gICAgICAgIGlmICh0aGlzLmJhY2tkcm9wICYmIHRoaXMuYmFja2Ryb3AgPCAwKSB7XG4gICAgICAgICAgdGhpcy5iYWNrZHJvcCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdiZWZvcmVTaG93JzpcbiAgICAgICAgdGhpcy5iYWNrZHJvcCA9XG4gICAgICAgICAgdGhpcy53aXRoQmFja2Ryb3BbdGhpcy53aXRoQmFja2Ryb3AubGVuZ3RoIC0gMV0uY29uZmlnPy5iYWNrZHJvcDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdiZWZvcmVIaWRlJzpcbiAgICAgICAgaWYgKHRoaXMud2l0aEJhY2tkcm9wLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHRoaXMuYmFja2Ryb3AgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaGlkZGVuJzpcbiAgICAgICAgaWYgKHRoaXMud2l0aEJhY2tkcm9wLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHRoaXMuYmFja2Ryb3AgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGRpdlxuICAgIGNsYXNzPVwic25vdGlmaXJlLWJhY2tkcm9wXCJcbiAgICAqbmdJZj1cImJhY2tkcm9wICYmIGJhY2tkcm9wID49IDBcIlxuICAgIFtzdHlsZS5vcGFjaXR5XT1cImJhY2tkcm9wXCJcbj48L2Rpdj5cblxuPGRpdlxuICAgICpuZ0Zvcj1cImxldCBwb3NpdGlvbiBvZiBub3RpZmljYXRpb25zIHwga2V5c1wiXG4gICAgY2xhc3M9XCJzbm90aWZ5IHNub3RpZnkte3sgcG9zaXRpb24gfX1cIlxuPlxuICAgIDxuZ3gtdG9hc3RcbiAgICAgICAgKm5nRm9yPVwibGV0IG5vdGlmaWNhdGlvbiBvZiBnZXROb3RpZmljYXRpb25BcnJheShub3RpZmljYXRpb25zLCBwb3NpdGlvbikgfCBzbGljZTogYmxvY2tTaXplQTpibG9ja1NpemVCXCJcbiAgICAgICAgW3RvYXN0XT1cIm5vdGlmaWNhdGlvblwiXG4gICAgICAgIChzdGF0ZUNoYW5nZWQpPVwic3RhdGVDaGFuZ2VkKCRldmVudClcIlxuICAgID5cbiAgICA8L25neC10b2FzdD5cblxuPC9kaXY+XG4iXX0=