UNPKG

igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

483 lines • 31.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { animate, state, style, transition, trigger } from '@angular/animations'; import { CommonModule } from '@angular/common'; import { Component, ElementRef, EventEmitter, HostBinding, Input, NgModule, Optional, Output } from '@angular/core'; import { IgxNavigationService } from '../core/navigation'; /** @type {?} */ let NEXT_ID = 0; /** * **Ignite UI for Angular Toast** - * [Documentation](https://www.infragistics.com/products/ignite-ui-angular/angular/components/toast.html) * * The Ignite UI Toast provides information and warning messages that are non-interactive and cannot * be dismissed by the user. Toasts can be displayed at the bottom, middle, or top of the page. * * Example: * ```html * <button (click)="toast.show()">Show notification</button> * <igx-toast #toast * message="Notification displayed" * displayTime="1000"> * </igx-toast> * ``` */ export class IgxToastComponent { /** * @param {?} elementRef * @param {?} navService */ constructor(elementRef, navService) { this.elementRef = elementRef; this.navService = navService; /** * Returns a list of available CSS classes. * ```typescript * let toastClasses = this.toast.CSS_CLASSES; * ``` * \@memberof IgxToastComponent */ this.CSS_CLASSES = { IGX_TOAST_BOTTOM: 'igx-toast--bottom', IGX_TOAST_MIDDLE: 'igx-toast--middle', IGX_TOAST_TOP: 'igx-toast--top' }; /** * Sets/gets the `id` of the toast. * If not set, the `id` will have value `"igx-toast-0"`. * ```html * <igx-toast id = "my-first-toast"></igx-toast> * ``` * ```typescript * let toastId = this.toast.id; * ``` */ this.id = `igx-toast-${NEXT_ID++}`; /** * Emits an event prior the toast is shown. * Provides reference to the `IgxToastComponent` as event argument. * ```html * <igx-toast (onShowing) = "onShowing($event)"></igx-toast> * ``` * \@memberof IgxToastComponent */ this.onShowing = new EventEmitter(); /** * Emits an event when the toast is shown. * Provides reference to the `IgxToastComponent` as event argument. * ```html * <igx-toast (onShown) = "onShown($event)"></igx-toast> * ``` * \@memberof IgxToastComponent */ this.onShown = new EventEmitter(); /** * Emits an event prior the toast is hidden. * Provides reference to the `IgxToastComponent` as event argument. * ```html * <igx-toast (onHiding) = "onHiding($event)"></igx-toast> * ``` * \@memberof IgxToastComponent */ this.onHiding = new EventEmitter(); /** * Emits an event when the toast is hidden. * Provides reference to the `IgxToastComponent` as event argument. * ```html * <igx-toast (onHidden) = "onHidden($event)"></igx-toast> * ``` * \@memberof IgxToastComponent */ this.onHidden = new EventEmitter(); /** * Sets/gets the `role` attribute. * If not set, `role` will have value `"alert"`. * ```html * <igx-toast [role] = "'notify'"></igx-toast> * ``` * ```typescript * let toastRole = this.toast.role; * ``` * \@memberof IgxToastComponent */ this.role = 'alert'; /** * Sets/gets whether the toast will be hidden after the `displayTime` is over. * Default value is `true`. * ```html * <igx-toast [autoHide] = "false"></igx-toast> * ``` * ```typescript * let autoHide = this.toast.autoHide; * ``` * \@memberof IgxToastComponent */ this.autoHide = true; /** * Sets/gets the duration of time span(in milliseconds) which the toast will be visible * after it is being shown. * Default value is `4000`. * ```html * <igx-toast [displayTime] = "2500"></igx-toast> * ``` * ```typescript * let displayTime = this.toast.displayTime; * ``` * \@memberof IgxToastComponent */ this.displayTime = 4000; /** * Enables/Disables the visibility of the toast. * If not set, the `isVisible` attribute will have value `false`. * ```html * <igx-toast [isVisible] = "true"></igx-toast> * ``` * ```typescript * let isVisible = this.toast.isVisible; * ``` * \@memberof IgxToastComponent */ this.isVisible = false; /** * Sets/gets the position of the toast. * If not set, the `position` attribute will have value `IgxToastPosition.Bottom`. * ```html * <igx-toast [position] = "top"></igx-toast> * ``` * ```typescript * let toastPosition = this.toast.position; * ``` * \@memberof IgxToastComponent */ this.position = IgxToastPosition.Bottom; } /** * Gets the nativeElement of the toast. * ```typescript * let nativeElement = this.toast.element; * ``` * \@memberof IgxToastComponent * @return {?} */ get element() { return this.elementRef.nativeElement; } /** * Shows the toast. * If `autoHide` is enabled, the toast will hide after `displayTime` is over. * ```typescript * this.toast.show(); * ``` * \@memberof IgxToastComponent * @return {?} */ show() { clearInterval(this.timeoutId); this.onShowing.emit(this); this.isVisible = true; if (this.autoHide) { this.timeoutId = setTimeout(() => { this.hide(); }, this.displayTime); } this.onShown.emit(this); } /** * Hides the toast. * ```typescript * this.toast.hide(); * ``` * \@memberof IgxToastComponent * @return {?} */ hide() { this.onHiding.emit(this); this.isVisible = false; this.onHidden.emit(this); clearInterval(this.timeoutId); } /** * Wraps \@show() method due \@IToggleView interface implementation. * @hidden * @return {?} */ open() { this.show(); } /** * Wraps \@hide() method due \@IToggleView interface implementation. * @hidden * @return {?} */ close() { this.hide(); } /** * Toggles the visible state of the toast. * ```typescript * this.toast.toggle(); * ``` * \@memberof IgxToastComponent * @return {?} */ toggle() { this.isVisible ? this.close() : this.open(); } /** * Sets/gets the class name of the toast based on the `position` value. * ```typescript * let className = this.toast.mapPositionToClassName(); * ``` * \@memberof IgxToastComponent * @return {?} */ mapPositionToClassName() { if (this.position === IgxToastPosition.Top) { return this.CSS_CLASSES.IGX_TOAST_TOP; } if (this.position === IgxToastPosition.Middle) { return this.CSS_CLASSES.IGX_TOAST_MIDDLE; } if (this.position === IgxToastPosition.Bottom) { return this.CSS_CLASSES.IGX_TOAST_BOTTOM; } } /** * @hidden * @return {?} */ ngOnInit() { if (this.navService && this.id) { this.navService.add(this.id, this); } } /** * @hidden * @return {?} */ ngOnDestroy() { if (this.navService && this.id) { this.navService.remove(this.id); } } } IgxToastComponent.decorators = [ { type: Component, args: [{ animations: [ trigger('animate', [ state('show', style({ opacity: 1 })), transition('* => show', animate('.20s ease')), transition('show => *', animate('.40s ease-out')) ]) ], selector: 'igx-toast', template: "<div [ngClass]=\"mapPositionToClassName()\" *ngIf=\"this.isVisible\" [@animate]=\"'show'\">\n {{ message }}\n</div>\n", styles: [` :host { display: block; } `] }] } ]; /** @nocollapse */ IgxToastComponent.ctorParameters = () => [ { type: ElementRef }, { type: IgxNavigationService, decorators: [{ type: Optional }] } ]; IgxToastComponent.propDecorators = { id: [{ type: HostBinding, args: ['attr.id',] }, { type: Input }], onShowing: [{ type: Output }], onShown: [{ type: Output }], onHiding: [{ type: Output }], onHidden: [{ type: Output }], role: [{ type: Input }], autoHide: [{ type: Input }], displayTime: [{ type: Input }], isVisible: [{ type: Input }], message: [{ type: Input }], position: [{ type: Input }] }; if (false) { /** * Returns a list of available CSS classes. * ```typescript * let toastClasses = this.toast.CSS_CLASSES; * ``` * \@memberof IgxToastComponent * @type {?} */ IgxToastComponent.prototype.CSS_CLASSES; /** * Sets/gets the `id` of the toast. * If not set, the `id` will have value `"igx-toast-0"`. * ```html * <igx-toast id = "my-first-toast"></igx-toast> * ``` * ```typescript * let toastId = this.toast.id; * ``` * @type {?} */ IgxToastComponent.prototype.id; /** * Emits an event prior the toast is shown. * Provides reference to the `IgxToastComponent` as event argument. * ```html * <igx-toast (onShowing) = "onShowing($event)"></igx-toast> * ``` * \@memberof IgxToastComponent * @type {?} */ IgxToastComponent.prototype.onShowing; /** * Emits an event when the toast is shown. * Provides reference to the `IgxToastComponent` as event argument. * ```html * <igx-toast (onShown) = "onShown($event)"></igx-toast> * ``` * \@memberof IgxToastComponent * @type {?} */ IgxToastComponent.prototype.onShown; /** * Emits an event prior the toast is hidden. * Provides reference to the `IgxToastComponent` as event argument. * ```html * <igx-toast (onHiding) = "onHiding($event)"></igx-toast> * ``` * \@memberof IgxToastComponent * @type {?} */ IgxToastComponent.prototype.onHiding; /** * Emits an event when the toast is hidden. * Provides reference to the `IgxToastComponent` as event argument. * ```html * <igx-toast (onHidden) = "onHidden($event)"></igx-toast> * ``` * \@memberof IgxToastComponent * @type {?} */ IgxToastComponent.prototype.onHidden; /** * Sets/gets the `role` attribute. * If not set, `role` will have value `"alert"`. * ```html * <igx-toast [role] = "'notify'"></igx-toast> * ``` * ```typescript * let toastRole = this.toast.role; * ``` * \@memberof IgxToastComponent * @type {?} */ IgxToastComponent.prototype.role; /** * Sets/gets whether the toast will be hidden after the `displayTime` is over. * Default value is `true`. * ```html * <igx-toast [autoHide] = "false"></igx-toast> * ``` * ```typescript * let autoHide = this.toast.autoHide; * ``` * \@memberof IgxToastComponent * @type {?} */ IgxToastComponent.prototype.autoHide; /** * Sets/gets the duration of time span(in milliseconds) which the toast will be visible * after it is being shown. * Default value is `4000`. * ```html * <igx-toast [displayTime] = "2500"></igx-toast> * ``` * ```typescript * let displayTime = this.toast.displayTime; * ``` * \@memberof IgxToastComponent * @type {?} */ IgxToastComponent.prototype.displayTime; /** * Enables/Disables the visibility of the toast. * If not set, the `isVisible` attribute will have value `false`. * ```html * <igx-toast [isVisible] = "true"></igx-toast> * ``` * ```typescript * let isVisible = this.toast.isVisible; * ``` * \@memberof IgxToastComponent * @type {?} */ IgxToastComponent.prototype.isVisible; /** * Sets/gets the message that will be shown by the toast. * ```html * <igx-toast [message] = "Notification"></igx-toast> * ``` * ```typescript * let toastMessage = this.toast.message; * ``` * \@memberof IgxToastComponent * @type {?} */ IgxToastComponent.prototype.message; /** * Sets/gets the position of the toast. * If not set, the `position` attribute will have value `IgxToastPosition.Bottom`. * ```html * <igx-toast [position] = "top"></igx-toast> * ``` * ```typescript * let toastPosition = this.toast.position; * ``` * \@memberof IgxToastComponent * @type {?} */ IgxToastComponent.prototype.position; /** * @hidden * @type {?} * @private */ IgxToastComponent.prototype.timeoutId; /** * @type {?} * @private */ IgxToastComponent.prototype.elementRef; /** * @type {?} * @private */ IgxToastComponent.prototype.navService; } /** @enum {number} */ const IgxToastPosition = { Bottom: 0, Middle: 1, Top: 2, }; export { IgxToastPosition }; IgxToastPosition[IgxToastPosition.Bottom] = 'Bottom'; IgxToastPosition[IgxToastPosition.Middle] = 'Middle'; IgxToastPosition[IgxToastPosition.Top] = 'Top'; /** * @hidden */ export class IgxToastModule { } IgxToastModule.decorators = [ { type: NgModule, args: [{ declarations: [IgxToastComponent], exports: [IgxToastComponent], imports: [CommonModule] },] } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi90b2FzdC90b2FzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUNMLFFBQVEsRUFHUixRQUFRLEVBQ1IsTUFBTSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBZSxNQUFNLG9CQUFvQixDQUFDOztJQUVuRSxPQUFPLEdBQUcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQ2YsTUFBTSxPQUFPLGlCQUFpQjs7Ozs7SUF5SzFCLFlBQ1ksVUFBc0IsRUFDVixVQUFnQztRQUQ1QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ1YsZUFBVSxHQUFWLFVBQVUsQ0FBc0I7Ozs7Ozs7O1FBbkt4QyxnQkFBVyxHQUFHO1lBQzFCLGdCQUFnQixFQUFFLG1CQUFtQjtZQUNyQyxnQkFBZ0IsRUFBRSxtQkFBbUI7WUFDckMsYUFBYSxFQUFFLGdCQUFnQjtTQUNsQyxDQUFDOzs7Ozs7Ozs7OztRQWNLLE9BQUUsR0FBRyxhQUFhLE9BQU8sRUFBRSxFQUFFLENBQUM7Ozs7Ozs7OztRQVc5QixjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7Ozs7Ozs7OztRQVdsRCxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7Ozs7Ozs7OztRQVdoRCxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7Ozs7Ozs7OztRQVdqRCxhQUFRLEdBQUcsSUFBSSxZ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QixDQUFDO2dCQUM1QixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7YUFDMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbnB1dCxcbiAgICBOZ01vZHVsZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElneE5hdmlnYXRpb25TZXJ2aWNlLCBJVG9nZ2xlVmlldyB9IGZyb20gJy4uL2NvcmUvbmF2aWdhdGlvbic7XG5cbmxldCBORVhUX0lEID0gMDtcbi8qKlxuICogKipJZ25pdGUgVUkgZm9yIEFuZ3VsYXIgVG9hc3QqKiAtXG4gKiBbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cuaW5mcmFnaXN0aWNzLmNvbS9wcm9kdWN0cy9pZ25pdGUtdWktYW5ndWxhci9hbmd1bGFyL2NvbXBvbmVudHMvdG9hc3QuaHRtbClcbiAqXG4gKiBUaGUgSWduaXRlIFVJIFRvYXN0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlIG5vbi1pbnRlcmFjdGl2ZSBhbmQgY2Fubm90XG4gKiBiZSBkaXNtaXNzZWQgYnkgdGhlIHVzZXIuIFRvYXN0cyBjYW4gYmUgZGlzcGxheWVkIGF0IHRoZSBib3R0b20sIG1pZGRsZSwgb3IgdG9wIG9mIHRoZSBwYWdlLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBodG1sXG4gKiA8YnV0dG9uIChjbGljayk9XCJ0b2FzdC5zaG93KClcIj5TaG93IG5vdGlmaWNhdGlvbjwvYnV0dG9uPlxuICogPGlneC10b2FzdCAjdG9hc3RcbiAqICAgICAgICAgICBtZXNzYWdlPVwiTm90aWZpY2F0aW9uIGRpc3BsYXllZFwiXG4gKiAgICAgICAgICAgZGlzcGxheVRpbWU9XCIxMDAwXCI+XG4gKiA8L2lneC10b2FzdD5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBhbmltYXRpb25zOiBbXG4gICAgICAgIHRyaWdnZXIoJ2FuaW1hdGUnLCBbXG4gICAgICAgICAgICBzdGF0ZSgnc2hvdycsIHN0eWxlKHtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCcqID0+IHNob3cnLCBhbmltYXRlKCcuMjBzIGVhc2UnKSksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCdzaG93ID0+IConLCBhbmltYXRlKCcuNDBzIGVhc2Utb3V0JykpXG4gICAgICAgIF0pXG4gICAgXSxcbiAgICBzZWxlY3RvcjogJ2lneC10b2FzdCcsXG4gICAgdGVtcGxhdGVVcmw6ICd0b2FzdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVzOiBbYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuICAgIGBdXG59KVxuZXhwb3J0IGNsYXNzIElneFRvYXN0Q29tcG9uZW50IGltcGxlbWVudHMgSVRvZ2dsZVZpZXcsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhdmFpbGFibGUgQ1NTIGNsYXNzZXMuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCB0b2FzdENsYXNzZXMgPSAgdGhpcy50b2FzdC5DU1NfQ0xBU1NFUztcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4VG9hc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgQ1NTX0NMQVNTRVMgPSB7XG4gICAgICAgIElHWF9UT0FTVF9CT1RUT006ICdpZ3gtdG9hc3QtLWJvdHRvbScsXG4gICAgICAgIElHWF9UT0FTVF9NSURETEU6ICdpZ3gtdG9hc3QtLW1pZGRsZScsXG4gICAgICAgIElHWF9UT0FTVF9UT1A6ICdpZ3gtdG9hc3QtLXRvcCdcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgaWRgIG9mIHRoZSB0b2FzdC5cbiAgICAgKiBJZiBub3Qgc2V0LCB0aGUgYGlkYCB3aWxsIGhhdmUgdmFsdWUgYFwiaWd4LXRvYXN0LTBcImAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtdG9hc3QgaWQgPSBcIm15LWZpcnN0LXRvYXN0XCI+PC9pZ3gtdG9hc3Q+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCB0b2FzdElkID0gdGhpcy50b2FzdC5pZDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGlkID0gYGlneC10b2FzdC0ke05FWFRfSUQrK31gO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgcHJpb3IgdGhlIHRvYXN0IGlzIHNob3duLlxuICAgICAqIFByb3ZpZGVzIHJlZmVyZW5jZSB0byB0aGUgYElneFRvYXN0Q29tcG9uZW50YCBhcyBldmVudCBhcmd1bWVudC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10b2FzdCAob25TaG93aW5nKSA9IFwib25TaG93aW5nKCRldmVudClcIj48L2lneC10b2FzdD5cbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4VG9hc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25TaG93aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJZ3hUb2FzdENvbXBvbmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIHRvYXN0IGlzIHNob3duLlxuICAgICAqIFByb3ZpZGVzIHJlZmVyZW5jZSB0byB0aGUgYElneFRvYXN0Q29tcG9uZW50YCBhcyBldmVudCBhcmd1bWVudC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10b2FzdCAob25TaG93bikgPSBcIm9uU2hvd24oJGV2ZW50KVwiPjwvaWd4LXRvYXN0PlxuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hUb2FzdENvbXBvbmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvblNob3duID0gbmV3IEV2ZW50RW1pdHRlcjxJZ3hUb2FzdENvbXBvbmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHByaW9yIHRoZSB0b2FzdCBpcyBoaWRkZW4uXG4gICAgICogUHJvdmlkZXMgcmVmZXJlbmNlIHRvIHRoZSBgSWd4VG9hc3RDb21wb25lbnRgIGFzIGV2ZW50IGFyZ3VtZW50LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRvYXN0IChvbkhpZGluZykgPSBcIm9uSGlkaW5nKCRldmVudClcIj48L2lneC10b2FzdD5cbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4VG9hc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25IaWRpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElneFRvYXN0Q29tcG9uZW50PigpO1xuXG4gICAgLyoqXG4gICAgICogIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIHRvYXN0IGlzIGhpZGRlbi5cbiAgICAgKiAgUHJvdmlkZXMgcmVmZXJlbmNlIHRvIHRoZSBgSWd4VG9hc3RDb21wb25lbnRgIGFzIGV2ZW50IGFyZ3VtZW50LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRvYXN0IChvbkhpZGRlbikgPSBcIm9uSGlkZGVuKCRldmVudClcIj48L2lneC10b2FzdD5cbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4VG9hc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25IaWRkZW4gPSBuZXcgRXZlbnRFbWl0dGVyPElneFRvYXN0Q29tcG9uZW50PigpO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYHJvbGVgIGF0dHJpYnV0ZS5cbiAgICAgKiBJZiBub3Qgc2V0LCBgcm9sZWAgd2lsbCBoYXZlIHZhbHVlIGBcImFsZXJ0XCJgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRvYXN0IFtyb2xlXSA9IFwiJ25vdGlmeSdcIj48L2lneC10b2FzdD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHRvYXN0Um9sZSA9IHRoaXMudG9hc3Qucm9sZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4VG9hc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByb2xlID0gJ2FsZXJ0JztcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgdG9hc3Qgd2lsbCBiZSBoaWRkZW4gYWZ0ZXIgdGhlIGBkaXNwbGF5VGltZWAgaXMgb3Zlci5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC10b2FzdCBbYXV0b0hpZGVdID0gXCJmYWxzZVwiPjwvaWd4LXRvYXN0PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgYXV0b0hpZGUgPSB0aGlzLnRvYXN0LmF1dG9IaWRlO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hUb2FzdENvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGF1dG9IaWRlID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgZHVyYXRpb24gb2YgdGltZSBzcGFuKGluIG1pbGxpc2Vjb25kcykgd2hpY2ggdGhlIHRvYXN0IHdpbGwgYmUgdmlzaWJsZVxuICAgICAqIGFmdGVyIGl0IGlzIGJlaW5nIHNob3duLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYDQwMDBgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRvYXN0IFtkaXNwbGF5VGltZV0gPSBcIjI1MDBcIj48L2lneC10b2FzdD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGRpc3BsYXlUaW1lID0gdGhpcy50b2FzdC5kaXNwbGF5VGltZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4VG9hc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNwbGF5VGltZSA9IDQwMDA7XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzL0Rpc2FibGVzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSB0b2FzdC5cbiAgICAgKiBJZiBub3Qgc2V0LCB0aGUgYGlzVmlzaWJsZWAgYXR0cmlidXRlIHdpbGwgaGF2ZSB2YWx1ZSBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRvYXN0IFtpc1Zpc2libGVdID0gXCJ0cnVlXCI+PC9pZ3gtdG9hc3Q+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc1Zpc2libGUgPSB0aGlzLnRvYXN0LmlzVmlzaWJsZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4VG9hc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpc1Zpc2libGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgc2hvd24gYnkgdGhlIHRvYXN0LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRvYXN0IFttZXNzYWdlXSA9IFwiTm90aWZpY2F0aW9uXCI+PC9pZ3gtdG9hc3Q+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCB0b2FzdE1lc3NhZ2UgPSB0aGlzLnRvYXN0Lm1lc3NhZ2U7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFRvYXN0Q29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgdG9hc3QuXG4gICAgICogSWYgbm90IHNldCwgdGhlIGBwb3NpdGlvbmAgYXR0cmlidXRlIHdpbGwgaGF2ZSB2YWx1ZSBgSWd4VG9hc3RQb3NpdGlvbi5Cb3R0b21gLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LXRvYXN0IFtwb3NpdGlvbl0gPSBcInRvcFwiPjwvaWd4LXRvYXN0PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdG9hc3RQb3NpdGlvbiA9IHRoaXMudG9hc3QucG9zaXRpb247XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneFRvYXN0Q29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcG9zaXRpb246IElneFRvYXN0UG9zaXRpb24gPSBJZ3hUb2FzdFBvc2l0aW9uLkJvdHRvbTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hdGl2ZUVsZW1lbnQgb2YgdGhlIHRvYXN0LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbmF0aXZlRWxlbWVudCA9IHRoaXMudG9hc3QuZWxlbWVudDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4VG9hc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSB0aW1lb3V0SWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIG5hdlNlcnZpY2U6IElneE5hdmlnYXRpb25TZXJ2aWNlKSB7IH1cblxuICAgIC8qKlxuICAgICAqIFNob3dzIHRoZSB0b2FzdC5cbiAgICAgKiBJZiBgYXV0b0hpZGVgIGlzIGVuYWJsZWQsIHRoZSB0b2FzdCB3aWxsIGhpZGUgYWZ0ZXIgYGRpc3BsYXlUaW1lYCBpcyBvdmVyLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLnRvYXN0LnNob3coKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4VG9hc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2hvdygpOiB2b2lkIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVvdXRJZCk7XG4gICAgICAgIHRoaXMub25TaG93aW5nLmVtaXQodGhpcyk7XG4gICAgICAgIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5hdXRvSGlkZSkge1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgIH0sIHRoaXMuZGlzcGxheVRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vblNob3duLmVtaXQodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgdGhlIHRvYXN0LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLnRvYXN0LmhpZGUoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4VG9hc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgaGlkZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkhpZGluZy5lbWl0KHRoaXMpO1xuICAgICAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uSGlkZGVuLmVtaXQodGhpcyk7XG5cbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVvdXRJZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JhcHMgQHNob3coKSBtZXRob2QgZHVlIEBJVG9nZ2xlVmlldyBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24uXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuKCkge1xuICAgICAgICB0aGlzLnNob3coKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXcmFwcyBAaGlkZSgpIG1ldGhvZCBkdWUgQElUb2dnbGVWaWV3IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGNsb3NlKCkge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSB2aXNpYmxlIHN0YXRlIG9mIHRoZSB0b2FzdC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy50b2FzdC50b2dnbGUoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4VG9hc3RDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKCkge1xuICAgICAgICB0aGlzLmlzVmlzaWJsZSA/IHRoaXMuY2xvc2UoKSA6IHRoaXMub3BlbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIHRvYXN0IGJhc2VkIG9uIHRoZSBgcG9zaXRpb25gIHZhbHVlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY2xhc3NOYW1lID0gIHRoaXMudG9hc3QubWFwUG9zaXRpb25Ub0NsYXNzTmFtZSgpO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hUb2FzdENvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBtYXBQb3NpdGlvblRvQ2xhc3NOYW1lKCk6IGFueSB7XG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID09PSBJZ3hUb2FzdFBvc2l0aW9uLlRvcCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ1NTX0NMQVNTRVMuSUdYX1RPQVNUX1RPUDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID09PSBJZ3hUb2FzdFBvc2l0aW9uLk1pZGRsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ1NTX0NMQVNTRVMuSUdYX1RPQVNUX01JRERMRTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID09PSBJZ3hUb2FzdFBvc2l0aW9uLkJvdHRvbSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ1NTX0NMQVNTRVMuSUdYX1RPQVNUX0JPVFRPTTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLm5hdlNlcnZpY2UgJiYgdGhpcy5pZCkge1xuICAgICAgICAgICAgdGhpcy5uYXZTZXJ2aWNlLmFkZCh0aGlzLmlkLCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLm5hdlNlcnZpY2UgJiYgdGhpcy5pZCkge1xuICAgICAgICAgICAgdGhpcy5uYXZTZXJ2aWNlLnJlbW92ZSh0aGlzLmlkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBmb3IgdG9hc3QgcG9zaXRpb25cbiAqIENhbiBiZTpcbiAqIEJvdHRvbVxuICogTWlkZGxlXG4gKiBUb3BcbiAqL1xuZXhwb3J0IGVudW0gSWd4VG9hc3RQb3NpdGlvbiB7XG4gICAgQm90dG9tLFxuICAgIE1pZGRsZSxcbiAgICBUb3Bcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbSWd4VG9hc3RDb21wb25lbnRdLFxuICAgIGV4cG9ydHM6IFtJZ3hUb2FzdENvbXBvbmVudF0sXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4VG9hc3RNb2R1bGUgeyB9XG4iXX0=