@hxui/angular
Version:
* * *
349 lines • 32.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import { Inject, Injectable, Injector, NgZone, SecurityContext } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { Overlay } from './overlay/overlay';
import { ComponentPortal } from './portal/portal';
import { ToastrInjector, ToastrRef } from './toastr-injector';
import { ToastPackage, TOAST_CONFIG } from './toastr-config';
import * as i0 from "@angular/core";
import * as i1 from "./toastr-config";
import * as i2 from "./overlay/overlay";
import * as i3 from "@angular/platform-browser";
/**
* @record
* @template C
*/
export function ActiveToast() { }
if (false) {
/**
* Your Toast ID. Use this to close it individually
* @type {?}
*/
ActiveToast.prototype.toastId;
/**
* the message of your toast. Stored to prevent duplicates
* @type {?}
*/
ActiveToast.prototype.message;
/**
* a reference to the component see portal.ts
* @type {?}
*/
ActiveToast.prototype.portal;
/**
* a reference to your toast
* @type {?}
*/
ActiveToast.prototype.toastRef;
/**
* triggered when toast is active
* @type {?}
*/
ActiveToast.prototype.onShown;
/**
* triggered when toast is destroyed
* @type {?}
*/
ActiveToast.prototype.onHidden;
/**
* triggered on toast click
* @type {?}
*/
ActiveToast.prototype.onTap;
/**
* available for your use in custom toast
* @type {?}
*/
ActiveToast.prototype.onAction;
}
export class ToastrService {
/**
* @param {?} token
* @param {?} overlay
* @param {?} _injector
* @param {?} sanitizer
* @param {?} ngZone
*/
constructor(token, overlay, _injector, sanitizer, ngZone) {
this.overlay = overlay;
this._injector = _injector;
this.sanitizer = sanitizer;
this.ngZone = ngZone;
this.currentlyActive = 0;
this.toasts = [];
this.index = 0;
this.toastrConfig = Object.assign({}, token.default, token.config);
if (token.config.iconClasses) {
this.toastrConfig.iconClasses = Object.assign({}, token.default.iconClasses, token.config.iconClasses);
}
}
/**
* show toast
* @param {?=} message
* @param {?=} title
* @param {?=} override
* @param {?=} type
* @return {?}
*/
show(message, title, override = {}, type = '') {
return this._preBuildNotification(type, message, title, this.applyConfig(override));
}
/**
* show successful toast
* @param {?=} message
* @param {?=} title
* @param {?=} override
* @return {?}
*/
success(message, title, override = {}) {
/** @type {?} */
const type = this.toastrConfig.iconClasses.success || '';
return this._preBuildNotification(type, message, title, this.applyConfig(override));
}
/**
* show error toast
* @param {?=} message
* @param {?=} title
* @param {?=} override
* @return {?}
*/
error(message, title, override = {}) {
/** @type {?} */
const type = this.toastrConfig.iconClasses.error || '';
return this._preBuildNotification(type, message, title, this.applyConfig(override));
}
/**
* show info toast
* @param {?=} message
* @param {?=} title
* @param {?=} override
* @return {?}
*/
info(message, title, override = {}) {
/** @type {?} */
const type = this.toastrConfig.iconClasses.info || '';
return this._preBuildNotification(type, message, title, this.applyConfig(override));
}
/**
* show warning toast
* @param {?=} message
* @param {?=} title
* @param {?=} override
* @return {?}
*/
warning(message, title, override = {}) {
/** @type {?} */
const type = this.toastrConfig.iconClasses.warning || '';
return this._preBuildNotification(type, message, title, this.applyConfig(override));
}
/**
* Remove all or a single toast by id
* @param {?=} toastId
* @return {?}
*/
clear(toastId) {
// Call every toastRef manualClose function
for (const toast of this.toasts) {
if (toastId !== undefined) {
if (toast.toastId === toastId) {
toast.toastRef.manualClose();
return;
}
}
else {
toast.toastRef.manualClose();
}
}
}
/**
* Remove and destroy a single toast by id
* @param {?} toastId
* @return {?}
*/
remove(toastId) {
/** @type {?} */
const found = this._findToast(toastId);
if (!found) {
return false;
}
found.activeToast.toastRef.close();
this.toasts.splice(found.index, 1);
this.currentlyActive = this.currentlyActive - 1;
if (!this.toastrConfig.maxOpened || !this.toasts.length) {
return false;
}
if (this.currentlyActive < this.toastrConfig.maxOpened &&
this.toasts[this.currentlyActive]) {
/** @type {?} */
const p = this.toasts[this.currentlyActive].toastRef;
if (!p.isInactive()) {
this.currentlyActive = this.currentlyActive + 1;
p.activate();
}
}
return true;
}
/**
* Finds a duplicate toast if one exists
* @param {?} message
* @param {?} resetOnDuplicate
* @return {?}
*/
findDuplicate(message, resetOnDuplicate) {
for (let i = 0; i < this.toasts.length; i++) {
/** @type {?} */
const toast = this.toasts[i];
if (toast.message === message) {
if (resetOnDuplicate && toast.toastRef.componentInstance.resetTimeout) {
toast.toastRef.resetTimeout();
}
return toast;
}
}
return null;
}
/**
* create a clone of global config and apply individual settings
* @param {?=} override
* @return {?}
*/
applyConfig(override = {}) {
return Object.assign({}, this.toastrConfig, override);
}
/**
* Find toast object by id
* @param {?} toastId
* @return {?}
*/
_findToast(toastId) {
for (let i = 0; i < this.toasts.length; i++) {
if (this.toasts[i].toastId === toastId) {
return { index: i, activeToast: this.toasts[i] };
}
}
return null;
}
/**
* Determines the need to run inside angular's zone then builds the toast
* @param {?} toastType
* @param {?} message
* @param {?} title
* @param {?} config
* @return {?}
*/
_preBuildNotification(toastType, message, title, config) {
if (config.onActivateTick) {
return this.ngZone.run(() => this._buildNotification(toastType, message, title, config));
}
return this._buildNotification(toastType, message, title, config);
}
/**
* Creates and attaches toast data to component
* returns the active toast, or in case preventDuplicates is enabled the original/non-duplicate active toast.
* @param {?} toastType
* @param {?} message
* @param {?} title
* @param {?} config
* @return {?}
*/
_buildNotification(toastType, message, title, config) {
if (!config.toastComponent) {
throw new Error('toastComponent required');
}
// max opened and auto dismiss = true
if (message &&
this.toastrConfig.preventDuplicates) {
/** @type {?} */
const duplicate = this.findDuplicate(message, this.toastrConfig.resetTimeoutOnDuplicate);
if (duplicate !== null) {
return duplicate;
}
}
this.previousToastMessage = message;
/** @type {?} */
let keepInactive = false;
if (this.toastrConfig.maxOpened &&
this.currentlyActive >= this.toastrConfig.maxOpened) {
keepInactive = true;
if (this.toastrConfig.autoDismiss) {
this.clear(this.toasts[0].toastId);
}
}
/** @type {?} */
const overlayRef = this.overlay.create(config.position, this.overlayContainer);
this.index = this.index + 1;
/** @type {?} */
let sanitizedMessage = message;
if (message && config.enableHtml) {
sanitizedMessage = this.sanitizer.sanitize(SecurityContext.HTML, message);
}
/** @type {?} */
const toastRef = new ToastrRef(overlayRef);
/** @type {?} */
const toastPackage = new ToastPackage(this.index, config, sanitizedMessage, title, toastType, toastRef);
/** @type {?} */
const toastInjector = new ToastrInjector(toastPackage, this._injector);
/** @type {?} */
const component = new ComponentPortal(config.toastComponent, toastInjector);
/** @type {?} */
const portal = overlayRef.attach(component, this.toastrConfig.newestOnTop);
toastRef.componentInstance = ((/** @type {?} */ (portal)))._component;
/** @type {?} */
const ins = {
toastId: this.index,
message: message || '',
toastRef,
onShown: toastRef.afterActivate(),
onHidden: toastRef.afterClosed(),
onTap: toastPackage.onTap(),
onAction: toastPackage.onAction(),
portal
};
if (!keepInactive) {
setTimeout(() => {
ins.toastRef.activate();
this.currentlyActive = this.currentlyActive + 1;
});
}
this.toasts.push(ins);
return ins;
}
}
ToastrService.decorators = [
{ type: Injectable, args: [{ providedIn: 'root' },] },
];
/** @nocollapse */
ToastrService.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [TOAST_CONFIG,] }] },
{ type: Overlay },
{ type: Injector },
{ type: DomSanitizer },
{ type: NgZone }
];
/** @nocollapse */ ToastrService.ngInjectableDef = i0.defineInjectable({ factory: function ToastrService_Factory() { return new ToastrService(i0.inject(i1.TOAST_CONFIG), i0.inject(i2.Overlay), i0.inject(i0.INJECTOR), i0.inject(i3.DomSanitizer), i0.inject(i0.NgZone)); }, token: ToastrService, providedIn: "root" });
if (false) {
/** @type {?} */
ToastrService.prototype.toastrConfig;
/** @type {?} */
ToastrService.prototype.currentlyActive;
/** @type {?} */
ToastrService.prototype.toasts;
/** @type {?} */
ToastrService.prototype.overlayContainer;
/** @type {?} */
ToastrService.prototype.previousToastMessage;
/** @type {?} */
ToastrService.prototype.index;
/** @type {?} */
ToastrService.prototype.overlay;
/** @type {?} */
ToastrService.prototype._injector;
/** @type {?} */
ToastrService.prototype.sanitizer;
/** @type {?} */
ToastrService.prototype.ngZone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3RyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaHh1aS9hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL3RvYXN0ci90b2FzdHIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUVMLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxFQUNSLE1BQU0sRUFDTixlQUFlLEVBQ2hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQVksTUFBTSwyQkFBMkIsQ0FBQztBQUluRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFOUQsT0FBTyxFQUFrQyxZQUFZLEVBQWUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7OztBQUUxRyxpQ0FpQkM7Ozs7OztJQWZDLDhCQUFnQjs7Ozs7SUFFaEIsOEJBQWdCOzs7OztJQUVoQiw2QkFBd0I7Ozs7O0lBRXhCLCtCQUF1Qjs7Ozs7SUFFdkIsOEJBQXlCOzs7OztJQUV6QiwrQkFBMEI7Ozs7O0lBRTFCLDRCQUF1Qjs7Ozs7SUFFdkIsK0JBQTBCOztBQUk1QixNQUFNLE9BQU8sYUFBYTs7Ozs7Ozs7SUFReEIsWUFDd0IsS0FBa0IsRUFDaEMsT0FBZ0IsRUFDaEIsU0FBbUIsRUFDbkIsU0FBdUIsRUFDdkIsTUFBYztRQUhkLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFYeEIsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFDcEIsV0FBTSxHQUF1QixFQUFFLENBQUM7UUFHeEIsVUFBSyxHQUFHLENBQUMsQ0FBQztRQVNo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QVUsU0FBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7Ozs7NENBVTdCLE1BQU0sU0FBQyxZQUFZO1lBbkNmLE9BQU87WUFSZCxRQUFRO1lBSUQsWUFBWTtZQUhuQixNQUFNOzs7OztJQWtDTixxQ0FBMkI7O0lBQzNCLHdDQUFvQjs7SUFDcEIsK0JBQWdDOztJQUNoQyx5Q0FBMkM7O0lBQzNDLDZDQUF5Qzs7SUFDekMsOEJBQWtCOztJQUloQixnQ0FBd0I7O0lBQ3hCLGtDQUEyQjs7SUFDM0Isa0NBQStCOztJQUMvQiwrQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudFJlZixcclxuICBJbmplY3QsXHJcbiAgSW5qZWN0YWJsZSxcclxuICBJbmplY3RvcixcclxuICBOZ1pvbmUsXHJcbiAgU2VjdXJpdHlDb250ZXh0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuXHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IE92ZXJsYXkgfSBmcm9tICcuL292ZXJsYXkvb3ZlcmxheSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJy4vcG9ydGFsL3BvcnRhbCc7XHJcbmltcG9ydCB7IFRvYXN0ckluamVjdG9yLCBUb2FzdHJSZWYgfSBmcm9tICcuL3RvYXN0ci1pbmplY3Rvcic7XHJcbmltcG9ydCB7IFRvYXN0ckNvbnRhaW5lckRpcmVjdGl2ZSB9IGZyb20gJy4vdG9hc3RyLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEdsb2JhbENvbmZpZywgSW5kaXZpZHVhbENvbmZpZywgVG9hc3RQYWNrYWdlLCBUb2FzdHJUb2tlbiwgVE9BU1RfQ09ORklHIH0gZnJvbSAnLi90b2FzdHItY29uZmlnJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZlVG9hc3Q8Qz4ge1xyXG4gIC8qKiBZb3VyIFRvYXN0IElELiBVc2UgdGhpcyB0byBjbG9zZSBpdCBpbmRpdmlkdWFsbHkgKi9cclxuICB0b2FzdElkOiBudW1iZXI7XHJcbiAgLyoqIHRoZSBtZXNzYWdlIG9mIHlvdXIgdG9hc3QuIFN0b3JlZCB0byBwcmV2ZW50IGR1cGxpY2F0ZXMgKi9cclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgLyoqIGEgcmVmZXJlbmNlIHRvIHRoZSBjb21wb25lbnQgc2VlIHBvcnRhbC50cyAqL1xyXG4gIHBvcnRhbDogQ29tcG9uZW50UmVmPEM+O1xyXG4gIC8qKiBhIHJlZmVyZW5jZSB0byB5b3VyIHRvYXN0ICovXHJcbiAgdG9hc3RSZWY6IFRvYXN0clJlZjxDPjtcclxuICAvKiogdHJpZ2dlcmVkIHdoZW4gdG9hc3QgaXMgYWN0aXZlICovXHJcbiAgb25TaG93bjogT2JzZXJ2YWJsZTxhbnk+O1xyXG4gIC8qKiB0cmlnZ2VyZWQgd2hlbiB0b2FzdCBpcyBkZXN0cm95ZWQgKi9cclxuICBvbkhpZGRlbjogT2JzZXJ2YWJsZTxhbnk+O1xyXG4gIC8qKiB0cmlnZ2VyZWQgb24gdG9hc3QgY2xpY2sgKi9cclxuICBvblRhcDogT2JzZXJ2YWJsZTxhbnk+O1xyXG4gIC8qKiBhdmFpbGFibGUgZm9yIHlvdXIgdXNlIGluIGN1c3RvbSB0b2FzdCAqL1xyXG4gIG9uQWN0aW9uOiBPYnNlcnZhYmxlPGFueT47XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBUb2FzdHJTZXJ2aWNlIHtcclxuICB0b2FzdHJDb25maWc6IEdsb2JhbENvbmZpZztcclxuICBjdXJyZW50bHlBY3RpdmUgPSAwO1xyXG4gIHRvYXN0czogQWN0aXZlVG9hc3Q8YW55PltdID0gW107XHJcbiAgb3ZlcmxheUNvbnRhaW5lcjogVG9hc3RyQ29udGFpbmVyRGlyZWN0aXZlO1xyXG4gIHByZXZpb3VzVG9hc3RNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBpbmRleCA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChUT0FTVF9DT05GSUcpIHRva2VuOiBUb2FzdHJUb2tlbixcclxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcclxuICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvcixcclxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXHJcbiAgKSB7XHJcbiAgICB0aGlzLnRvYXN0ckNvbmZpZyA9IHtcclxuICAgICAgLi4udG9rZW4uZGVmYXVsdCxcclxuICAgICAgLi4udG9rZW4uY29uZmlnLFxyXG4gICAgfTtcclxuICAgIGlmICh0b2tlbi5jb25maWcuaWNvbkNsYXNzZXMpIHtcclxuICAgICAgdGhpcy50b2FzdHJDb25maWcuaWNvbkNsYXNzZXMgPSB7XHJcbiAgICAgICAgLi4udG9rZW4uZGVmYXVsdC5pY29uQ2xhc3NlcyxcclxuICAgICAgICAuLi50b2tlbi5jb25maWcuaWNvbkNsYXNzZXMsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKiBzaG93IHRvYXN0ICovXHJcbiAgc2hvdyhcclxuICAgIG1lc3NhZ2U/OiBzdHJpbmcsXHJcbiAgICB0aXRsZT86IHN0cmluZyxcclxuICAgIG92ZXJyaWRlOiBQYXJ0aWFsPEluZGl2aWR1YWxDb25maWc+ID0ge30sXHJcbiAgICB0eXBlID0gJydcclxuICApIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmVCdWlsZE5vdGlmaWNhdGlvbihcclxuICAgICAgdHlwZSxcclxuICAgICAgbWVzc2FnZSxcclxuICAgICAgdGl0bGUsXHJcbiAgICAgIHRoaXMuYXBwbHlDb25maWcob3ZlcnJpZGUpXHJcbiAgICApO1xyXG4gIH1cclxuICAvKiogc2hvdyBzdWNjZXNzZnVsIHRvYXN0ICovXHJcbiAgc3VjY2VzcyhcclxuICAgIG1lc3NhZ2U/OiBzdHJpbmcsXHJcbiAgICB0aXRsZT86IHN0cmluZyxcclxuICAgIG92ZXJyaWRlOiBQYXJ0aWFsPEluZGl2aWR1YWxDb25maWc+ID0ge31cclxuICApIHtcclxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnRvYXN0ckNvbmZpZy5pY29uQ2xhc3Nlcy5zdWNjZXNzIHx8ICcnO1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZUJ1aWxkTm90aWZpY2F0aW9uKFxyXG4gICAgICB0eXBlLFxyXG4gICAgICBtZXNzYWdlLFxyXG4gICAgICB0aXRsZSxcclxuICAgICAgdGhpcy5hcHBseUNvbmZpZyhvdmVycmlkZSlcclxuICAgICk7XHJcbiAgfVxyXG4gIC8qKiBzaG93IGVycm9yIHRvYXN0ICovXHJcbiAgZXJyb3IoXHJcbiAgICBtZXNzYWdlPzogc3RyaW5nLFxyXG4gICAgdGl0bGU/OiBzdHJpbmcsXHJcbiAgICBvdmVycmlkZTogUGFydGlhbDxJbmRpdmlkdWFsQ29uZmlnPiA9IHt9XHJcbiAgKSB7XHJcbiAgICBjb25zdCB0eXBlID0gdGhpcy50b2FzdHJDb25maWcuaWNvbkNsYXNzZXMuZXJyb3IgfHwgJyc7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJlQnVpbGROb3RpZmljYXRpb24oXHJcbiAgICAgIHR5cGUsXHJcbiAgICAgIG1lc3NhZ2UsXHJcbiAgICAgIHRpdGxlLFxyXG4gICAgICB0aGlzLmFwcGx5Q29uZmlnKG92ZXJyaWRlKVxyXG4gICAgKTtcclxuICB9XHJcbiAgLyoqIHNob3cgaW5mbyB0b2FzdCAqL1xyXG4gIGluZm8oXHJcbiAgICBtZXNzYWdlPzogc3RyaW5nLFxyXG4gICAgdGl0bGU/OiBzdHJpbmcsXHJcbiAgICBvdmVycmlkZTogUGFydGlhbDxJbmRpdmlkdWFsQ29uZmlnPiA9IHt9XHJcbiAgKSB7XHJcbiAgICBjb25zdCB0eXBlID0gdGhpcy50b2FzdHJDb25maWcuaWNvbkNsYXNzZXMuaW5mbyB8fCAnJztcclxuICAgIHJldHVybiB0aGlzLl9wcmVCdWlsZE5vdGlmaWNhdGlvbihcclxuICAgICAgdHlwZSxcclxuICAgICAgbWVzc2FnZSxcclxuICAgICAgdGl0bGUsXHJcbiAgICAgIHRoaXMuYXBwbHlDb25maWcob3ZlcnJpZGUpXHJcbiAgICApO1xyXG4gIH1cclxuICAvKiogc2hvdyB3YXJuaW5nIHRvYXN0ICovXHJcbiAgd2FybmluZyhcclxuICAgIG1lc3NhZ2U/OiBzdHJpbmcsXHJcbiAgICB0aXRsZT86IHN0cmluZyxcclxuICAgIG92ZXJyaWRlOiBQYXJ0aWFsPEluZGl2aWR1YWxDb25maWc+ID0ge31cclxuICApIHtcclxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnRvYXN0ckNvbmZpZy5pY29uQ2xhc3Nlcy53YXJuaW5nIHx8ICcnO1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZUJ1aWxkTm90aWZpY2F0aW9uKFxyXG4gICAgICB0eXBlLFxyXG4gICAgICBtZXNzYWdlLFxyXG4gICAgICB0aXRsZSxcclxuICAgICAgdGhpcy5hcHBseUNvbmZpZyhvdmVycmlkZSlcclxuICAgICk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBhbGwgb3IgYSBzaW5nbGUgdG9hc3QgYnkgaWRcclxuICAgKi9cclxuICBjbGVhcih0b2FzdElkPzogbnVtYmVyKSB7XHJcbiAgICAvLyBDYWxsIGV2ZXJ5IHRvYXN0UmVmIG1hbnVhbENsb3NlIGZ1bmN0aW9uXHJcbiAgICBmb3IgKGNvbnN0IHRvYXN0IG9mIHRoaXMudG9hc3RzKSB7XHJcbiAgICAgIGlmICh0b2FzdElkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAodG9hc3QudG9hc3RJZCA9PT0gdG9hc3RJZCkge1xyXG4gICAgICAgICAgdG9hc3QudG9hc3RSZWYubWFudWFsQ2xvc2UoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdG9hc3QudG9hc3RSZWYubWFudWFsQ2xvc2UoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBSZW1vdmUgYW5kIGRlc3Ryb3kgYSBzaW5nbGUgdG9hc3QgYnkgaWRcclxuICAgKi9cclxuICByZW1vdmUodG9hc3RJZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBmb3VuZCA9IHRoaXMuX2ZpbmRUb2FzdCh0b2FzdElkKTtcclxuICAgIGlmICghZm91bmQpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZm91bmQuYWN0aXZlVG9hc3QudG9hc3RSZWYuY2xvc2UoKTtcclxuICAgIHRoaXMudG9hc3RzLnNwbGljZShmb3VuZC5pbmRleCwgMSk7XHJcbiAgICB0aGlzLmN1cnJlbnRseUFjdGl2ZSA9IHRoaXMuY3VycmVudGx5QWN0aXZlIC0gMTtcclxuICAgIGlmICghdGhpcy50b2FzdHJDb25maWcubWF4T3BlbmVkIHx8ICF0aGlzLnRvYXN0cy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmN1cnJlbnRseUFjdGl2ZSA8IHRoaXMudG9hc3RyQ29uZmlnLm1heE9wZW5lZCAmJlxyXG4gICAgICB0aGlzLnRvYXN0c1t0aGlzLmN1cnJlbnRseUFjdGl2ZV1cclxuICAgICkge1xyXG4gICAgICBjb25zdCBwID0gdGhpcy50b2FzdHNbdGhpcy5jdXJyZW50bHlBY3RpdmVdLnRvYXN0UmVmO1xyXG4gICAgICBpZiAoIXAuaXNJbmFjdGl2ZSgpKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50bHlBY3RpdmUgPSB0aGlzLmN1cnJlbnRseUFjdGl2ZSArIDE7XHJcbiAgICAgICAgcC5hY3RpdmF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbmRzIGEgZHVwbGljYXRlIHRvYXN0IGlmIG9uZSBleGlzdHNcclxuICAgKi9cclxuICBwcml2YXRlIGZpbmREdXBsaWNhdGUobWVzc2FnZTogc3RyaW5nLCByZXNldE9uRHVwbGljYXRlOiBib29sZWFuKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudG9hc3RzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHRvYXN0ID0gdGhpcy50b2FzdHNbaV07XHJcbiAgICAgIGlmICh0b2FzdC5tZXNzYWdlID09PSBtZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKHJlc2V0T25EdXBsaWNhdGUgJiYgdG9hc3QudG9hc3RSZWYuY29tcG9uZW50SW5zdGFuY2UucmVzZXRUaW1lb3V0KSB7XHJcbiAgICAgICAgICB0b2FzdC50b2FzdFJlZi5yZXNldFRpbWVvdXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRvYXN0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKiBjcmVhdGUgYSBjbG9uZSBvZiBnbG9iYWwgY29uZmlnIGFuZCBhcHBseSBpbmRpdmlkdWFsIHNldHRpbmdzICovXHJcbiAgcHJpdmF0ZSBhcHBseUNvbmZpZyhvdmVycmlkZTogUGFydGlhbDxJbmRpdmlkdWFsQ29uZmlnPiA9IHt9KTogR2xvYmFsQ29uZmlnIHtcclxuICAgIHJldHVybiB7IC4uLnRoaXMudG9hc3RyQ29uZmlnLCAuLi5vdmVycmlkZSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmluZCB0b2FzdCBvYmplY3QgYnkgaWRcclxuICAgKi9cclxuICBwcml2YXRlIF9maW5kVG9hc3QoXHJcbiAgICB0b2FzdElkOiBudW1iZXJcclxuICApOiB7IGluZGV4OiBudW1iZXI7IGFjdGl2ZVRvYXN0OiBBY3RpdmVUb2FzdDxhbnk+IH0gfCBudWxsIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50b2FzdHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMudG9hc3RzW2ldLnRvYXN0SWQgPT09IHRvYXN0SWQpIHtcclxuICAgICAgICByZXR1cm4geyBpbmRleDogaSwgYWN0aXZlVG9hc3Q6IHRoaXMudG9hc3RzW2ldIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGV0ZXJtaW5lcyB0aGUgbmVlZCB0byBydW4gaW5zaWRlIGFuZ3VsYXIncyB6b25lIHRoZW4gYnVpbGRzIHRoZSB0b2FzdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3ByZUJ1aWxkTm90aWZpY2F0aW9uKFxyXG4gICAgdG9hc3RUeXBlOiBzdHJpbmcsXHJcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXHJcbiAgICB0aXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxyXG4gICAgY29uZmlnOiBHbG9iYWxDb25maWdcclxuICApOiBBY3RpdmVUb2FzdDxhbnk+IHwgbnVsbCB7XHJcbiAgICBpZiAoY29uZmlnLm9uQWN0aXZhdGVUaWNrKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW4oKCkgPT5cclxuICAgICAgICB0aGlzLl9idWlsZE5vdGlmaWNhdGlvbih0b2FzdFR5cGUsIG1lc3NhZ2UsIHRpdGxlLCBjb25maWcpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fYnVpbGROb3RpZmljYXRpb24odG9hc3RUeXBlLCBtZXNzYWdlLCB0aXRsZSwgY29uZmlnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYW5kIGF0dGFjaGVzIHRvYXN0IGRhdGEgdG8gY29tcG9uZW50XHJcbiAgICogcmV0dXJucyB0aGUgYWN0aXZlIHRvYXN0LCBvciBpbiBjYXNlIHByZXZlbnREdXBsaWNhdGVzIGlzIGVuYWJsZWQgdGhlIG9yaWdpbmFsL25vbi1kdXBsaWNhdGUgYWN0aXZlIHRvYXN0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2J1aWxkTm90aWZpY2F0aW9uKFxyXG4gICAgdG9hc3RUeXBlOiBzdHJpbmcsXHJcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXHJcbiAgICB0aXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxyXG4gICAgY29uZmlnOiBHbG9iYWxDb25maWdcclxuICApOiBBY3RpdmVUb2FzdDxhbnk+IHwgbnVsbCB7XHJcbiAgICBpZiAoIWNvbmZpZy50b2FzdENvbXBvbmVudCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RvYXN0Q29tcG9uZW50IHJlcXVpcmVkJyk7XHJcbiAgICB9XHJcbiAgICAvLyBtYXggb3BlbmVkIGFuZCBhdXRvIGRpc21pc3MgPSB0cnVlXHJcbiAgICBpZiAoXHJcbiAgICAgIG1lc3NhZ2UgJiZcclxuICAgICAgdGhpcy50b2FzdHJDb25maWcucHJldmVudER1cGxpY2F0ZXNcclxuICAgICkge1xyXG4gICAgICBjb25zdCBkdXBsaWNhdGUgPSB0aGlzLmZpbmREdXBsaWNhdGUobWVzc2FnZSwgdGhpcy50b2FzdHJDb25maWcucmVzZXRUaW1lb3V0T25EdXBsaWNhdGUpO1xyXG4gICAgICBpZiAoZHVwbGljYXRlICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIGR1cGxpY2F0ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5wcmV2aW91c1RvYXN0TWVzc2FnZSA9IG1lc3NhZ2U7XHJcbiAgICBsZXQga2VlcEluYWN0aXZlID0gZmFsc2U7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMudG9hc3RyQ29uZmlnLm1heE9wZW5lZCAmJlxyXG4gICAgICB0aGlzLmN1cnJlbnRseUFjdGl2ZSA+PSB0aGlzLnRvYXN0ckNvbmZpZy5tYXhPcGVuZWRcclxuICAgICkge1xyXG4gICAgICBrZWVwSW5hY3RpdmUgPSB0cnVlO1xyXG4gICAgICBpZiAodGhpcy50b2FzdHJDb25maWcuYXV0b0Rpc21pc3MpIHtcclxuICAgICAgICB0aGlzLmNsZWFyKHRoaXMudG9hc3RzWzBdLnRvYXN0SWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShcclxuICAgICAgY29uZmlnLnBvc2l0aW9uLFxyXG4gICAgICB0aGlzLm92ZXJsYXlDb250YWluZXJcclxuICAgICk7XHJcbiAgICB0aGlzLmluZGV4ID0gdGhpcy5pbmRleCArIDE7XHJcbiAgICBsZXQgc2FuaXRpemVkTWVzc2FnZTogc3RyaW5nIHwgU2FmZUh0bWwgfCB1bmRlZmluZWQgfCBudWxsID0gbWVzc2FnZTtcclxuICAgIGlmIChtZXNzYWdlICYmIGNvbmZpZy5lbmFibGVIdG1sKSB7XHJcbiAgICAgIHNhbml0aXplZE1lc3NhZ2UgPSB0aGlzLnNhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuSFRNTCwgbWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0b2FzdFJlZiA9IG5ldyBUb2FzdHJSZWYob3ZlcmxheVJlZik7XHJcbiAgICBjb25zdCB0b2FzdFBhY2thZ2UgPSBuZXcgVG9hc3RQYWNrYWdlKFxyXG4gICAgICB0aGlzLmluZGV4LFxyXG4gICAgICBjb25maWcsXHJcbiAgICAgIHNhbml0aXplZE1lc3NhZ2UsXHJcbiAgICAgIHRpdGxlLFxyXG4gICAgICB0b2FzdFR5cGUsXHJcbiAgICAgIHRvYXN0UmVmXHJcbiAgICApO1xyXG4gICAgY29uc3QgdG9hc3RJbmplY3RvciA9IG5ldyBUb2FzdHJJbmplY3Rvcih0b2FzdFBhY2thZ2UsIHRoaXMuX2luamVjdG9yKTtcclxuICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnRQb3J0YWwoY29uZmlnLnRvYXN0Q29tcG9uZW50LCB0b2FzdEluamVjdG9yKTtcclxuICAgIGNvbnN0IHBvcnRhbCA9IG92ZXJsYXlSZWYuYXR0YWNoKGNvbXBvbmVudCwgdGhpcy50b2FzdHJDb25maWcubmV3ZXN0T25Ub3ApO1xyXG4gICAgdG9hc3RSZWYuY29tcG9uZW50SW5zdGFuY2UgPSAoPGFueT5wb3J0YWwpLl9jb21wb25lbnQ7XHJcbiAgICBjb25zdCBpbnM6IEFjdGl2ZVRvYXN0PGFueT4gPSB7XHJcbiAgICAgIHRvYXN0SWQ6IHRoaXMuaW5kZXgsXHJcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJycsXHJcbiAgICAgIHRvYXN0UmVmLFxyXG4gICAgICBvblNob3duOiB0b2FzdFJlZi5hZnRlckFjdGl2YXRlKCksXHJcbiAgICAgIG9uSGlkZGVuOiB0b2FzdFJlZi5hZnRlckNsb3NlZCgpLFxyXG4gICAgICBvblRhcDogdG9hc3RQYWNrYWdlLm9uVGFwKCksXHJcbiAgICAgIG9uQWN0aW9uOiB0b2FzdFBhY2thZ2Uub25BY3Rpb24oKSxcclxuICAgICAgcG9ydGFsXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICgha2VlcEluYWN0aXZlKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlucy50b2FzdFJlZi5hY3RpdmF0ZSgpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudGx5QWN0aXZlID0gdGhpcy5jdXJyZW50bHlBY3RpdmUgKyAxO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRvYXN0cy5wdXNoKGlucyk7XHJcbiAgICByZXR1cm4gaW5zO1xyXG4gIH1cclxufVxyXG4iXX0=