UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

381 lines 27.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /* * @license * Copyright Akveo. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ import { Component, Input, HostBinding, ViewChild, ElementRef, ContentChildren, QueryList, } from '@angular/core'; import { convertToBoolProperty } from '../helpers'; import { NbChatMessageComponent } from './chat-message.component'; /* * Conversational UI collection - a set of components for chat-like UI construction. * * Main features: * - different message types support (text, image, file, file group, map, etc) * - drag & drop for images and files with preview * - different UI styles * - custom action buttons (coming soon) * * Here's a complete example build in a bot-like app. Type `help` to be able to receive different message types. * Enjoy the conversation and the beautiful UI. * @stacked-example(Showcase, chat/chat-showcase.component) * * Basic chat configuration and usage: * ```ts * <nb-chat title="Nebular Conversational UI"> * <nb-chat-message *ngFor="let msg of messages" * [type]="msg.type" * [message]="msg.text" * [reply]="msg.reply" * [sender]="msg.user.name" * [date]="msg.date" * [files]="msg.files" * [quote]="msg.quote" * [latitude]="msg.latitude" * [longitude]="msg.longitude" * [avatar]="msg.user.avatar"> * </nb-chat-message> * * <nb-chat-form (send)="sendMessage($event)" [dropFiles]="true"> * </nb-chat-form> * </nb-chat> * ``` * ### Installation * * Import `NbChatModule` to your feature module. * ```ts * @NgModule({ * imports: [ * // ... * NbChatModule, * ], * }) * export class PageModule { } * ``` * * If you need to provide an API key for a `map` message type (which is required by Google Maps) * you may use `NbChatModule.forRoot({ ... })` call if this is a global app configuration * or `NbChatModule.forChild({ ... })` for a feature module configuration: * * ```ts * @NgModule({ * imports: [ * // ... * NbChatModule.forRoot({ messageGoogleMapKey: 'MAP_KEY' }), * ], * }) * export class AppModule { } * * ### Usage * * There are three main components: * ```ts * <nb-chat> * </nb-chat> // chat container * * <nb-chat-form> * </nb-chat-form> // chat form with drag&drop files feature * * <nb-chat-message> * </nb-chat-message> // chat message, available multiple types * ``` * * Two users conversation showcase: * @stacked-example(Conversation, chat/chat-conversation-showcase.component) * * Chat UI is also available in different colors by specifying a `[status]` input: * * @stacked-example(Colored Chat, chat/chat-colors.component) * * Also it is possible to configure sizes through `[size]` input: * * @stacked-example(Chat Sizes, chat/chat-sizes.component) * * @styles * * chat-font-size: * chat-fg: * chat-bg: * chat-border-radius: * chat-fg-text: * chat-height-xxsmall: * chat-height-xsmall: * chat-height-small: * chat-height-medium: * chat-height-large: * chat-height-xlarge: * chat-height-xxlarge: * chat-border: * chat-padding: * chat-shadow: * chat-separator: * chat-active-bg: * chat-disabled-bg: * chat-disabled-fg: * chat-primary-bg: * chat-info-bg: * chat-success-bg: * chat-warning-bg: * chat-danger-bg: */ export class NbChatComponent { constructor() { this.scrollBottom = true; } /** * @return {?} */ get xxsmall() { return this.size === NbChatComponent.SIZE_XXSMALL; } /** * @return {?} */ get xsmall() { return this.size === NbChatComponent.SIZE_XSMALL; } /** * @return {?} */ get small() { return this.size === NbChatComponent.SIZE_SMALL; } /** * @return {?} */ get medium() { return this.size === NbChatComponent.SIZE_MEDIUM; } /** * @return {?} */ get large() { return this.size === NbChatComponent.SIZE_LARGE; } /** * @return {?} */ get xlarge() { return this.size === NbChatComponent.SIZE_XLARGE; } /** * @return {?} */ get xxlarge() { return this.size === NbChatComponent.SIZE_XXLARGE; } /** * @return {?} */ get active() { return this.status === NbChatComponent.STATUS_ACTIVE; } /** * @return {?} */ get disabled() { return this.status === NbChatComponent.STATUS_DISABLED; } /** * @return {?} */ get primary() { return this.status === NbChatComponent.STATUS_PRIMARY; } /** * @return {?} */ get info() { return this.status === NbChatComponent.STATUS_INFO; } /** * @return {?} */ get success() { return this.status === NbChatComponent.STATUS_SUCCESS; } /** * @return {?} */ get warning() { return this.status === NbChatComponent.STATUS_WARNING; } /** * @return {?} */ get danger() { return this.status === NbChatComponent.STATUS_DANGER; } /** * @return {?} */ get hasAccent() { return this.accent; } /* * Chat size, available sizes: * xxsmall, xsmall, small, medium, large, xlarge, xxlarge * @param {string} val */ /** * @private * @param {?} val * @return {?} */ set setSize(val) { this.size = val; } /* * Chat status color (adds specific styles): * active, disabled, primary, info, success, warning, danger * @param {string} val */ /** * @private * @param {?} val * @return {?} */ set setStatus(val) { this.status = val; } /* * Scroll chat to the bottom of the list when a new message arrives * @param {boolean} val */ /** * @private * @param {?} val * @return {?} */ set setScrollBottom(val) { this.scrollBottom = convertToBoolProperty(val); } /** * @return {?} */ ngAfterViewInit() { this.messages.changes .subscribe((messages) => { this.messages = messages; this.updateView(); }); this.updateView(); } /** * @return {?} */ updateView() { if (this.scrollBottom) { this.scrollListBottom(); } } /** * @return {?} */ scrollListBottom() { this.scrollable.nativeElement.scrollTop = this.scrollable.nativeElement.scrollHeight; } } NbChatComponent.SIZE_XXSMALL = 'xxsmall'; NbChatComponent.SIZE_XSMALL = 'xsmall'; NbChatComponent.SIZE_SMALL = 'small'; NbChatComponent.SIZE_MEDIUM = 'medium'; NbChatComponent.SIZE_LARGE = 'large'; NbChatComponent.SIZE_XLARGE = 'xlarge'; NbChatComponent.SIZE_XXLARGE = 'xxlarge'; NbChatComponent.STATUS_ACTIVE = 'active'; NbChatComponent.STATUS_DISABLED = 'disabled'; NbChatComponent.STATUS_PRIMARY = 'primary'; NbChatComponent.STATUS_INFO = 'info'; NbChatComponent.STATUS_SUCCESS = 'success'; NbChatComponent.STATUS_WARNING = 'warning'; NbChatComponent.STATUS_DANGER = 'danger'; NbChatComponent.decorators = [ { type: Component, args: [{ selector: 'nb-chat', template: ` <div class="header">{{ title }}</div> <div class="scrollable" #scrollable> <div class="messages"> <ng-content select="nb-chat-message"></ng-content> <p class="no-messages" *ngIf="!messages?.length">No messages yet.</p> </div> </div> <div class="form"> <ng-content select="nb-chat-form"></ng-content> </div> `, styles: [":host{display:flex;flex-direction:column;position:relative;height:100%}"] }] } ]; NbChatComponent.propDecorators = { title: [{ type: Input }], xxsmall: [{ type: HostBinding, args: ['class.xxsmall-chat',] }], xsmall: [{ type: HostBinding, args: ['class.xsmall-chat',] }], small: [{ type: HostBinding, args: ['class.small-chat',] }], medium: [{ type: HostBinding, args: ['class.medium-chat',] }], large: [{ type: HostBinding, args: ['class.large-chat',] }], xlarge: [{ type: HostBinding, args: ['class.xlarge-chat',] }], xxlarge: [{ type: HostBinding, args: ['class.xxlarge-chat',] }], active: [{ type: HostBinding, args: ['class.active-chat',] }], disabled: [{ type: HostBinding, args: ['class.disabled-chat',] }], primary: [{ type: HostBinding, args: ['class.primary-chat',] }], info: [{ type: HostBinding, args: ['class.info-chat',] }], success: [{ type: HostBinding, args: ['class.success-chat',] }], warning: [{ type: HostBinding, args: ['class.warning-chat',] }], danger: [{ type: HostBinding, args: ['class.danger-chat',] }], hasAccent: [{ type: HostBinding, args: ['class.accent',] }], setSize: [{ type: Input, args: ['size',] }], setStatus: [{ type: Input, args: ['status',] }], setScrollBottom: [{ type: Input, args: ['scrollBottom',] }], scrollable: [{ type: ViewChild, args: ['scrollable',] }], messages: [{ type: ContentChildren, args: [NbChatMessageComponent,] }] }; if (false) { /** @type {?} */ NbChatComponent.SIZE_XXSMALL; /** @type {?} */ NbChatComponent.SIZE_XSMALL; /** @type {?} */ NbChatComponent.SIZE_SMALL; /** @type {?} */ NbChatComponent.SIZE_MEDIUM; /** @type {?} */ NbChatComponent.SIZE_LARGE; /** @type {?} */ NbChatComponent.SIZE_XLARGE; /** @type {?} */ NbChatComponent.SIZE_XXLARGE; /** @type {?} */ NbChatComponent.STATUS_ACTIVE; /** @type {?} */ NbChatComponent.STATUS_DISABLED; /** @type {?} */ NbChatComponent.STATUS_PRIMARY; /** @type {?} */ NbChatComponent.STATUS_INFO; /** @type {?} */ NbChatComponent.STATUS_SUCCESS; /** @type {?} */ NbChatComponent.STATUS_WARNING; /** @type {?} */ NbChatComponent.STATUS_DANGER; /** @type {?} */ NbChatComponent.prototype.size; /** @type {?} */ NbChatComponent.prototype.status; /** @type {?} */ NbChatComponent.prototype.accent; /** @type {?} */ NbChatComponent.prototype.scrollBottom; /** @type {?} */ NbChatComponent.prototype.title; /** @type {?} */ NbChatComponent.prototype.scrollable; /** @type {?} */ NbChatComponent.prototype.messages; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly90aGVtZS1saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9jaGF0L2NoYXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsVUFBVSxFQUNWLGVBQWUsRUFDZixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUlsRSxNQUFNLE9BQU8sZUFBZTtJQWhCNUI7UUFxQ0UsaUJBQVksR0FBWSxJQUFJLENBQUM7SUFrSS9CLENBQUM7Ozs7SUE5SEMsSUFDSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxZQUFZLENBQUM7SUFDcEQsQ0FBQzs7OztJQUVELElBQ0ksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsV0FBVyxDQUFDO0lBQ25ELENBQUM7Ozs7SUFFRCxJQUNJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLFVBQVUsQ0FBQztJQUNsRCxDQUFDOzs7O0lBRUQsSUFDSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxXQUFXLENBQUM7SUFDbkQsQ0FBQzs7OztJQUVELElBQ0ksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsVUFB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b250ZW50IjpbIi8qXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBBa3Zlby4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cclxuICovXHJcblxyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBIb3N0QmluZGluZyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgRWxlbWVudFJlZixcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0LCBBZnRlclZpZXdJbml0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBjb252ZXJ0VG9Cb29sUHJvcGVydHkgfSBmcm9tICcuLi9oZWxwZXJzJztcclxuaW1wb3J0IHsgTmJDaGF0TWVzc2FnZUNvbXBvbmVudCB9IGZyb20gJy4vY2hhdC1tZXNzYWdlLmNvbXBvbmVudCc7XHJcblxyXG4vKlxyXG4gKiBDb252ZXJzYXRpb25hbCBVSSBjb2xsZWN0aW9uIC0gYSBzZXQgb2YgY29tcG9uZW50cyBmb3IgY2hhdC1saWtlIFVJIGNvbnN0cnVjdGlvbi5cclxuICpcclxuICogTWFpbiBmZWF0dXJlczpcclxuICogLSBkaWZmZXJlbnQgbWVzc2FnZSB0eXBlcyBzdXBwb3J0ICh0ZXh0LCBpbWFnZSwgZmlsZSwgZmlsZSBncm91cCwgbWFwLCBldGMpXHJcbiAqIC0gZHJhZyAmIGRyb3AgZm9yIGltYWdlcyBhbmQgZmlsZXMgd2l0aCBwcmV2aWV3XHJcbiAqIC0gZGlmZmVyZW50IFVJIHN0eWxlc1xyXG4gKiAtIGN1c3RvbSBhY3Rpb24gYnV0dG9ucyAoY29taW5nIHNvb24pXHJcbiAqXHJcbiAqIEhlcmUncyBhIGNvbXBsZXRlIGV4YW1wbGUgYnVpbGQgaW4gYSBib3QtbGlrZSBhcHAuIFR5cGUgYGhlbHBgIHRvIGJlIGFibGUgdG8gcmVjZWl2ZSBkaWZmZXJlbnQgbWVzc2FnZSB0eXBlcy5cclxuICogRW5qb3kgdGhlIGNvbnZlcnNhdGlvbiBhbmQgdGhlIGJlYXV0aWZ1bCBVSS5cclxuICogQHN0YWNrZWQtZXhhbXBsZShTaG93Y2FzZSwgY2hhdC9jaGF0LXNob3djYXNlLmNvbXBvbmVudClcclxuICpcclxuICogQmFzaWMgY2hhdCBjb25maWd1cmF0aW9uIGFuZCB1c2FnZTpcclxuICogYGBgdHNcclxuICogPG5iLWNoYXQgdGl0bGU9XCJOZWJ1bGFyIENvbnZlcnNhdGlvbmFsIFVJXCI+XHJcbiAqICAgICAgIDxuYi1jaGF0LW1lc3NhZ2UgKm5nRm9yPVwibGV0IG1zZyBvZiBtZXNzYWdlc1wiXHJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwibXNnLnR5cGVcIlxyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFttZXNzYWdlXT1cIm1zZy50ZXh0XCJcclxuICogICAgICAgICAgICAgICAgICAgICAgICBbcmVwbHldPVwibXNnLnJlcGx5XCJcclxuICogICAgICAgICAgICAgICAgICAgICAgICBbc2VuZGVyXT1cIm1zZy51c2VyLm5hbWVcIlxyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRlXT1cIm1zZy5kYXRlXCJcclxuICogICAgICAgICAgICAgICAgICAgICAgICBbZmlsZXNdPVwibXNnLmZpbGVzXCJcclxuICogICAgICAgICAgICAgICAgICAgICAgICBbcXVvdGVdPVwibXNnLnF1b3RlXCJcclxuICogICAgICAgICAgICAgICAgICAgICAgICBbbGF0aXR1ZGVdPVwibXNnLmxhdGl0dWRlXCJcclxuICogICAgICAgICAgICAgICAgICAgICAgICBbbG9uZ2l0dWRlXT1cIm1zZy5sb25naXR1ZGVcIlxyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFthdmF0YXJdPVwibXNnLnVzZXIuYXZhdGFyXCI+XHJcbiAqICAgPC9uYi1jaGF0LW1lc3NhZ2U+XHJcbiAqXHJcbiAqICAgPG5iLWNoYXQtZm9ybSAoc2VuZCk9XCJzZW5kTWVzc2FnZSgkZXZlbnQpXCIgW2Ryb3BGaWxlc109XCJ0cnVlXCI+XHJcbiAqICAgPC9uYi1jaGF0LWZvcm0+XHJcbiAqIDwvbmItY2hhdD5cclxuICogYGBgXHJcbiAqICMjIyBJbnN0YWxsYXRpb25cclxuICpcclxuICogSW1wb3J0IGBOYkNoYXRNb2R1bGVgIHRvIHlvdXIgZmVhdHVyZSBtb2R1bGUuXHJcbiAqIGBgYHRzXHJcbiAqIEBOZ01vZHVsZSh7XHJcbiAqICAgaW1wb3J0czogW1xyXG4gKiAgIFx0Ly8gLi4uXHJcbiAqICAgICBOYkNoYXRNb2R1bGUsXHJcbiAqICAgXSxcclxuICogfSlcclxuICogZXhwb3J0IGNsYXNzIFBhZ2VNb2R1bGUgeyB9XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBJZiB5b3UgbmVlZCB0byBwcm92aWRlIGFuIEFQSSBrZXkgZm9yIGEgYG1hcGAgbWVzc2FnZSB0eXBlICh3aGljaCBpcyByZXF1aXJlZCBieSBHb29nbGUgTWFwcylcclxuICogeW91IG1heSB1c2UgYE5iQ2hhdE1vZHVsZS5mb3JSb290KHsgLi4uIH0pYCBjYWxsIGlmIHRoaXMgaXMgYSBnbG9iYWwgYXBwIGNvbmZpZ3VyYXRpb25cclxuICogb3IgYE5iQ2hhdE1vZHVsZS5mb3JDaGlsZCh7IC4uLiB9KWAgZm9yIGEgZmVhdHVyZSBtb2R1bGUgY29uZmlndXJhdGlvbjpcclxuICpcclxuICogYGBgdHNcclxuICogQE5nTW9kdWxlKHtcclxuICogICBpbXBvcnRzOiBbXHJcbiAqICAgXHQvLyAuLi5cclxuICogICAgIE5iQ2hhdE1vZHVsZS5mb3JSb290KHsgbWVzc2FnZUdvb2dsZU1hcEtleTogJ01BUF9LRVknIH0pLFxyXG4gKiAgIF0sXHJcbiAqIH0pXHJcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUgeyB9XHJcbiAqXHJcbiAqICMjIyBVc2FnZVxyXG4gKlxyXG4gKiBUaGVyZSBhcmUgdGhyZWUgbWFpbiBjb21wb25lbnRzOlxyXG4gKiBgYGB0c1xyXG4gKiA8bmItY2hhdD5cclxuICogPC9uYi1jaGF0PiAvLyBjaGF0IGNvbnRhaW5lclxyXG4gKlxyXG4gKiA8bmItY2hhdC1mb3JtPlxyXG4gKiA8L25iLWNoYXQtZm9ybT4gLy8gY2hhdCBmb3JtIHdpdGggZHJhZyZkcm9wIGZpbGVzIGZlYXR1cmVcclxuICpcclxuICogPG5iLWNoYXQtbWVzc2FnZT5cclxuICogPC9uYi1jaGF0LW1lc3NhZ2U+IC8vIGNoYXQgbWVzc2FnZSwgYXZhaWxhYmxlIG11bHRpcGxlIHR5cGVzXHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBUd28gdXNlcnMgY29udmVyc2F0aW9uIHNob3djYXNlOlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKENvbnZlcnNhdGlvbiwgY2hhdC9jaGF0LWNvbnZlcnNhdGlvbi1zaG93Y2FzZS5jb21wb25lbnQpXHJcbiAqXHJcbiAqIENoYXQgVUkgaXMgYWxzbyBhdmFpbGFibGUgaW4gZGlmZmVyZW50IGNvbG9ycyBieSBzcGVjaWZ5aW5nIGEgYFtzdGF0dXNdYCBpbnB1dDpcclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShDb2xvcmVkIENoYXQsIGNoYXQvY2hhdC1jb2xvcnMuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBBbHNvIGl0IGlzIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSBzaXplcyB0aHJvdWdoIGBbc2l6ZV1gIGlucHV0OlxyXG4gKlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKENoYXQgU2l6ZXMsIGNoYXQvY2hhdC1zaXplcy5jb21wb25lbnQpXHJcbiAqXHJcbiAqIEBzdHlsZXNcclxuICpcclxuICogY2hhdC1mb250LXNpemU6XHJcbiAqIGNoYXQtZmc6XHJcbiAqIGNoYXQtYmc6XHJcbiAqIGNoYXQtYm9yZGVyLXJhZGl1czpcclxuICogY2hhdC1mZy10ZXh0OlxyXG4gKiBjaGF0LWhlaWdodC14eHNtYWxsOlxyXG4gKiBjaGF0LWhlaWdodC14c21hbGw6XHJcbiAqIGNoYXQtaGVpZ2h0LXNtYWxsOlxyXG4gKiBjaGF0LWhlaWdodC1tZWRpdW06XHJcbiAqIGNoYXQtaGVpZ2h0LWxhcmdlOlxyXG4gKiBjaGF0LWhlaWdodC14bGFyZ2U6XHJcbiAqIGNoYXQtaGVpZ2h0LXh4bGFyZ2U6XHJcbiAqIGNoYXQtYm9yZGVyOlxyXG4gKiBjaGF0LXBhZGRpbmc6XHJcbiAqIGNoYXQtc2hhZG93OlxyXG4gKiBjaGF0LXNlcGFyYXRvcjpcclxuICogY2hhdC1hY3RpdmUtYmc6XHJcbiAqIGNoYXQtZGlzYWJsZWQtYmc6XHJcbiAqIGNoYXQtZGlzYWJsZWQtZmc6XHJcbiAqIGNoYXQtcHJpbWFyeS1iZzpcclxuICogY2hhdC1pbmZvLWJnOlxyXG4gKiBjaGF0LXN1Y2Nlc3MtYmc6XHJcbiAqIGNoYXQtd2FybmluZy1iZzpcclxuICogY2hhdC1kYW5nZXItYmc6XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25iLWNoYXQnLFxyXG4gIHN0eWxlVXJsczogWycuL2NoYXQuY29tcG9uZW50LnNjc3MnXSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPnt7IHRpdGxlIH19PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsYWJsZVwiICNzY3JvbGxhYmxlPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZXNcIj5cclxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJuYi1jaGF0LW1lc3NhZ2VcIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJuby1tZXNzYWdlc1wiICpuZ0lmPVwiIW1lc3NhZ2VzPy5sZW5ndGhcIj5ObyBtZXNzYWdlcyB5ZXQuPC9wPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm1cIj5cclxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibmItY2hhdC1mb3JtXCI+PC9uZy1jb250ZW50PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5iQ2hhdENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xyXG5cclxuICBzdGF0aWMgcmVhZG9ubHkgU0laRV9YWFNNQUxMID0gJ3h4c21hbGwnO1xyXG4gIHN0YXRpYyByZWFkb25seSBTSVpFX1hTTUFMTCA9ICd4c21hbGwnO1xyXG4gIHN0YXRpYyByZWFkb25seSBTSVpFX1NNQUxMID0gJ3NtYWxsJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU0laRV9NRURJVU0gPSAnbWVkaXVtJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU0laRV9MQVJHRSA9ICdsYXJnZSc7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNJWkVfWExBUkdFID0gJ3hsYXJnZSc7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNJWkVfWFhMQVJHRSA9ICd4eGxhcmdlJztcclxuXHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUQVRVU19BQ1RJVkUgPSAnYWN0aXZlJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RBVFVTX0RJU0FCTEVEID0gJ2Rpc2FibGVkJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RBVFVTX1BSSU1BUlkgPSAncHJpbWFyeSc7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUQVRVU19JTkZPID0gJ2luZm8nO1xyXG4gIHN0YXRpYyByZWFkb25seSBTVEFUVVNfU1VDQ0VTUyA9ICdzdWNjZXNzJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RBVFVTX1dBUk5JTkcgPSAnd2FybmluZyc7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUQVRVU19EQU5HRVIgPSAnZGFuZ2VyJztcclxuXHJcbiAgc2l6ZTogc3RyaW5nO1xyXG4gIHN0YXR1czogc3RyaW5nO1xyXG4gIGFjY2VudDogc3RyaW5nO1xyXG4gIHNjcm9sbEJvdHRvbTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MueHhzbWFsbC1jaGF0JylcclxuICBnZXQgeHhzbWFsbCgpIHtcclxuICAgIHJldHVybiB0aGlzLnNpemUgPT09IE5iQ2hhdENvbXBvbmVudC5TSVpFX1hYU01BTEw7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnhzbWFsbC1jaGF0JylcclxuICBnZXQgeHNtYWxsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2l6ZSA9PT0gTmJDaGF0Q29tcG9uZW50LlNJWkVfWFNNQUxMO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zbWFsbC1jaGF0JylcclxuICBnZXQgc21hbGwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaXplID09PSBOYkNoYXRDb21wb25lbnQuU0laRV9TTUFMTDtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MubWVkaXVtLWNoYXQnKVxyXG4gIGdldCBtZWRpdW0oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaXplID09PSBOYkNoYXRDb21wb25lbnQuU0laRV9NRURJVU07XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmxhcmdlLWNoYXQnKVxyXG4gIGdldCBsYXJnZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnNpemUgPT09IE5iQ2hhdENvbXBvbmVudC5TSVpFX0xBUkdFO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy54bGFyZ2UtY2hhdCcpXHJcbiAgZ2V0IHhsYXJnZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnNpemUgPT09IE5iQ2hhdENvbXBvbmVudC5TSVpFX1hMQVJHRTtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MueHhsYXJnZS1jaGF0JylcclxuICBnZXQgeHhsYXJnZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnNpemUgPT09IE5iQ2hhdENvbXBvbmVudC5TSVpFX1hYTEFSR0U7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFjdGl2ZS1jaGF0JylcclxuICBnZXQgYWN0aXZlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBOYkNoYXRDb21wb25lbnQuU1RBVFVTX0FDVElWRTtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZGlzYWJsZWQtY2hhdCcpXHJcbiAgZ2V0IGRpc2FibGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBOYkNoYXRDb21wb25lbnQuU1RBVFVTX0RJU0FCTEVEO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5wcmltYXJ5LWNoYXQnKVxyXG4gIGdldCBwcmltYXJ5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBOYkNoYXRDb21wb25lbnQuU1RBVFVTX1BSSU1BUlk7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmluZm8tY2hhdCcpXHJcbiAgZ2V0IGluZm8oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09IE5iQ2hhdENvbXBvbmVudC5TVEFUVVNfSU5GTztcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3Muc3VjY2Vzcy1jaGF0JylcclxuICBnZXQgc3VjY2VzcygpIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gTmJDaGF0Q29tcG9uZW50LlNUQVRVU19TVUNDRVNTO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy53YXJuaW5nLWNoYXQnKVxyXG4gIGdldCB3YXJuaW5nKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBOYkNoYXRDb21wb25lbnQuU1RBVFVTX1dBUk5JTkc7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRhbmdlci1jaGF0JylcclxuICBnZXQgZGFuZ2VyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBOYkNoYXRDb21wb25lbnQuU1RBVFVTX0RBTkdFUjtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYWNjZW50JylcclxuICBnZXQgaGFzQWNjZW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYWNjZW50O1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBDaGF0IHNpemUsIGF2YWlsYWJsZSBzaXplczpcclxuICAgKiB4eHNtYWxsLCB4c21hbGwsIHNtYWxsLCBtZWRpdW0sIGxhcmdlLCB4bGFyZ2UsIHh4bGFyZ2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsXHJcbiAgICovXHJcbiAgQElucHV0KCdzaXplJylcclxuICBwcml2YXRlIHNldCBzZXRTaXplKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNpemUgPSB2YWw7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENoYXQgc3RhdHVzIGNvbG9yIChhZGRzIHNwZWNpZmljIHN0eWxlcyk6XHJcbiAgICogYWN0aXZlLCBkaXNhYmxlZCwgcHJpbWFyeSwgaW5mbywgc3VjY2Vzcywgd2FybmluZywgZGFuZ2VyXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgnc3RhdHVzJylcclxuICBwcml2YXRlIHNldCBzZXRTdGF0dXModmFsOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc3RhdHVzID0gdmFsO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBTY3JvbGwgY2hhdCB0byB0aGUgYm90dG9tIG9mIHRoZSBsaXN0IHdoZW4gYSBuZXcgbWVzc2FnZSBhcnJpdmVzXHJcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxcclxuICAgKi9cclxuICBASW5wdXQoJ3Njcm9sbEJvdHRvbScpXHJcbiAgcHJpdmF0ZSBzZXQgc2V0U2Nyb2xsQm90dG9tKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5zY3JvbGxCb3R0b20gPSBjb252ZXJ0VG9Cb29sUHJvcGVydHkodmFsKTtcclxuICB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbGFibGUnKSBzY3JvbGxhYmxlOiBFbGVtZW50UmVmO1xyXG4gIEBDb250ZW50Q2hpbGRyZW4oTmJDaGF0TWVzc2FnZUNvbXBvbmVudCkgbWVzc2FnZXM6IFF1ZXJ5TGlzdDxOYkNoYXRNZXNzYWdlQ29tcG9uZW50PjtcclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5tZXNzYWdlcy5jaGFuZ2VzXHJcbiAgICAgIC5zdWJzY3JpYmUoKG1lc3NhZ2VzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlcyA9IG1lc3NhZ2VzO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVZpZXcoKSB7XHJcbiAgICBpZiAodGhpcy5zY3JvbGxCb3R0b20pIHtcclxuICAgICAgdGhpcy5zY3JvbGxMaXN0Qm90dG9tKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzY3JvbGxMaXN0Qm90dG9tKCkge1xyXG4gICAgdGhpcy5zY3JvbGxhYmxlLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxhYmxlLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xyXG4gIH1cclxufVxyXG4iXX0=