@datarailsshared/datarailsshared 1.5.574 → 1.5.578

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,380 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, ViewChild, } from '@angular/core';
2
+ import { DomSanitizer } from '@angular/platform-browser';
3
+ import { IMAGE_TYPES } from '../../models/chat';
4
+ import { trigger, state, style, transition, animate, query, animateChild } from '@angular/animations';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/platform-browser";
7
+ import * as i2 from "@angular/forms";
8
+ import * as i3 from "@angular/common";
9
+ import * as i4 from "../../dr-inputs/button/button.component";
10
+ import * as i5 from "../../directives/click-outside/click-outside.directive";
11
+ import * as i6 from "../dr-dot-flashing/dr-dot-flashing.component";
12
+ const _c0 = ["textAreaElement"];
13
+ function DrChatFormWithHistoryComponent_div_2_div_1_Template(rf, ctx) { if (rf & 1) {
14
+ const _r11 = i0.ɵɵgetCurrentView();
15
+ i0.ɵɵelementStart(0, "div", 18);
16
+ i0.ɵɵelement(1, "i", 19);
17
+ i0.ɵɵelementStart(2, "div", 20);
18
+ i0.ɵɵtext(3);
19
+ i0.ɵɵelementEnd();
20
+ i0.ɵɵelementStart(4, "i", 21);
21
+ i0.ɵɵlistener("click", function DrChatFormWithHistoryComponent_div_2_div_1_Template_i_click_4_listener() { const restoredCtx = i0.ɵɵrestoreView(_r11); const file_r9 = restoredCtx.$implicit; const ctx_r10 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r10.removeFile(file_r9)); });
22
+ i0.ɵɵelementEnd()();
23
+ } if (rf & 2) {
24
+ const file_r9 = ctx.$implicit;
25
+ i0.ɵɵadvance(3);
26
+ i0.ɵɵtextInterpolate(file_r9.name);
27
+ } }
28
+ function DrChatFormWithHistoryComponent_div_2_Template(rf, ctx) { if (rf & 1) {
29
+ i0.ɵɵelementStart(0, "div", 16);
30
+ i0.ɵɵtemplate(1, DrChatFormWithHistoryComponent_div_2_div_1_Template, 5, 1, "div", 17);
31
+ i0.ɵɵelementEnd();
32
+ } if (rf & 2) {
33
+ const ctx_r0 = i0.ɵɵnextContext();
34
+ i0.ɵɵadvance(1);
35
+ i0.ɵɵproperty("ngForOf", ctx_r0.droppedFiles);
36
+ } }
37
+ function DrChatFormWithHistoryComponent_i_13_Template(rf, ctx) { if (rf & 1) {
38
+ const _r13 = i0.ɵɵgetCurrentView();
39
+ i0.ɵɵelementStart(0, "i", 22);
40
+ i0.ɵɵlistener("click", function DrChatFormWithHistoryComponent_i_13_Template_i_click_0_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r12 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r12.sendMessage($event)); });
41
+ i0.ɵɵelementEnd();
42
+ } if (rf & 2) {
43
+ const ctx_r3 = i0.ɵɵnextContext();
44
+ const _r1 = i0.ɵɵreference(5);
45
+ i0.ɵɵstyleMap(ctx_r3.getSendButtonPosition(_r1));
46
+ } }
47
+ function DrChatFormWithHistoryComponent_i_14_Template(rf, ctx) { if (rf & 1) {
48
+ const _r15 = i0.ɵɵgetCurrentView();
49
+ i0.ɵɵelementStart(0, "i", 23);
50
+ i0.ɵɵlistener("click", function DrChatFormWithHistoryComponent_i_14_Template_i_click_0_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r14 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r14.sendMessage($event)); });
51
+ i0.ɵɵelementEnd();
52
+ } }
53
+ function DrChatFormWithHistoryComponent_dr_dot_flashing_15_Template(rf, ctx) { if (rf & 1) {
54
+ i0.ɵɵelement(0, "dr-dot-flashing", 24);
55
+ } }
56
+ function DrChatFormWithHistoryComponent_dr_button_16_Template(rf, ctx) { if (rf & 1) {
57
+ const _r17 = i0.ɵɵgetCurrentView();
58
+ i0.ɵɵelementStart(0, "dr-button", 25);
59
+ i0.ɵɵlistener("click", function DrChatFormWithHistoryComponent_dr_button_16_Template_dr_button_click_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r16 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r16.abortMessage()); });
60
+ i0.ɵɵtext(1, "Stop generating");
61
+ i0.ɵɵelementEnd();
62
+ } }
63
+ function DrChatFormWithHistoryComponent_ng_container_17_Template(rf, ctx) { if (rf & 1) {
64
+ const _r19 = i0.ɵɵgetCurrentView();
65
+ i0.ɵɵelementContainerStart(0);
66
+ i0.ɵɵelementStart(1, "div", 26);
67
+ i0.ɵɵlistener("clickOutside", function DrChatFormWithHistoryComponent_ng_container_17_Template_div_clickOutside_1_listener() { i0.ɵɵrestoreView(_r19); const ctx_r18 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r18.closeHistory()); });
68
+ i0.ɵɵprojection(2);
69
+ i0.ɵɵelementEnd();
70
+ i0.ɵɵelementContainerEnd();
71
+ } if (rf & 2) {
72
+ const ctx_r7 = i0.ɵɵnextContext();
73
+ i0.ɵɵadvance(1);
74
+ i0.ɵɵproperty("@dropdownAnimation", ctx_r7.isShowedHistory ? "visible" : "hidden")("exclude", ".dr-icon-history");
75
+ } }
76
+ const _c1 = function (a0) { return { height: a0 }; };
77
+ const _c2 = function (a0, a1) { return { value: a0, params: a1 }; };
78
+ const _c3 = function (a0, a1, a2) { return { "message-row__input--focused": a0, "message-row__input--filled": a1, "showed-dropdown": a2 }; };
79
+ const _c4 = ["*"];
80
+ export class DrChatFormWithHistoryComponent {
81
+ constructor(cdr, domSanitizer) {
82
+ this.cdr = cdr;
83
+ this.domSanitizer = domSanitizer;
84
+ this._textareaInitialHeight = true;
85
+ this.inputFocus = false;
86
+ this.inputHover = false;
87
+ this.droppedFiles = [];
88
+ this.isShowedHistory = false;
89
+ this.isChatMode = false;
90
+ /**
91
+ * Predefined message text
92
+ *
93
+ * @type {string}
94
+ */
95
+ this.message = '';
96
+ /**
97
+ * Message placeholder text
98
+ *
99
+ * @type {string}
100
+ */
101
+ this.messagePlaceholder = 'Type a message';
102
+ /**
103
+ * Show send button
104
+ *
105
+ * @type {boolean}
106
+ */
107
+ this.dropFiles = false;
108
+ /**
109
+ * File drop placeholder text
110
+ *
111
+ * @type {string}
112
+ */
113
+ this.dropFilePlaceholder = 'Drop file to send';
114
+ /**
115
+ * Parameter to check is send message function available
116
+ *
117
+ * @type {boolean}
118
+ */
119
+ this.waitForReply = false;
120
+ /**
121
+ * Parameter to check is send message function available
122
+ *
123
+ * @type {boolean}
124
+ */
125
+ this.showDisabledButtonInsteadOfDotFlashing = false;
126
+ /**
127
+ *
128
+ * @type {EventEmitter<{ message: string, files: File[] }>}
129
+ */
130
+ this.send = new EventEmitter();
131
+ this.abort = new EventEmitter();
132
+ /**
133
+ * Emits when message input value has been changed
134
+ *
135
+ * @type {EventEmitter<string>}
136
+ */
137
+ this.inputChange = new EventEmitter();
138
+ this.fileOver = false;
139
+ }
140
+ onDrop(event) {
141
+ if (this.dropFiles) {
142
+ event.preventDefault();
143
+ event.stopPropagation();
144
+ this.fileOver = false;
145
+ if (event.dataTransfer?.files) {
146
+ for (const file of event.dataTransfer.files) {
147
+ const res = file;
148
+ if (IMAGE_TYPES.includes(file.type)) {
149
+ const fr = new FileReader();
150
+ fr.onload = (e) => {
151
+ res.src = e.target.result;
152
+ res.urlStyle = this.domSanitizer.bypassSecurityTrustStyle(`url(${res.src})`);
153
+ this.cdr.detectChanges();
154
+ };
155
+ fr.readAsDataURL(file);
156
+ }
157
+ this.droppedFiles.push(res);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ removeFile(file) {
163
+ const index = this.droppedFiles.indexOf(file);
164
+ if (index >= 0) {
165
+ this.droppedFiles.splice(index, 1);
166
+ }
167
+ }
168
+ onDragOver(event) {
169
+ event.preventDefault();
170
+ event.stopPropagation();
171
+ if (this.dropFiles) {
172
+ this.fileOver = true;
173
+ }
174
+ }
175
+ onDragLeave(event) {
176
+ event.preventDefault();
177
+ event.stopPropagation();
178
+ if (this.dropFiles) {
179
+ this.fileOver = false;
180
+ }
181
+ }
182
+ sendMessage($event) {
183
+ if (!$event || !$event.shiftKey) {
184
+ $event && $event.preventDefault();
185
+ if (this.waitForReply) {
186
+ return;
187
+ }
188
+ if (this.droppedFiles.length || String(this.message).trim().length) {
189
+ this._textareaInitialHeight = true;
190
+ this.send.emit({ message: this.message, files: this.droppedFiles });
191
+ this.message = '';
192
+ this.droppedFiles = [];
193
+ this.cdr.markForCheck();
194
+ }
195
+ }
196
+ }
197
+ abortMessage() {
198
+ this.abort.emit();
199
+ }
200
+ onModelChange(value) {
201
+ this._textareaInitialHeight = false;
202
+ this.inputChange.emit(value);
203
+ }
204
+ getTextAreaHeight(textAreaElement) {
205
+ if (this._textareaInitialHeight) {
206
+ textAreaElement.style.height = '48px';
207
+ }
208
+ else {
209
+ textAreaElement.style.height = 'auto';
210
+ textAreaElement.style.height = textAreaElement.scrollHeight + 'px';
211
+ }
212
+ return `${textAreaElement.style.height}`;
213
+ }
214
+ getSendButtonPosition(textAreaElement) {
215
+ return `top: calc(${this.getTextAreaHeight(textAreaElement)} - var(--send-button-offset));`;
216
+ }
217
+ showHistory() {
218
+ this.isShowedHistory = !this.isShowedHistory;
219
+ }
220
+ closeHistory() {
221
+ this.isShowedHistory = false;
222
+ this.cdr.markForCheck();
223
+ }
224
+ onFileSelected(event) {
225
+ const input = event.target;
226
+ }
227
+ /** @nocollapse */ static { this.ɵfac = function DrChatFormWithHistoryComponent_Factory(t) { return new (t || DrChatFormWithHistoryComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.DomSanitizer)); }; }
228
+ /** @nocollapse */ static { this.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: DrChatFormWithHistoryComponent, selectors: [["dr-chat-form-with-history"]], viewQuery: function DrChatFormWithHistoryComponent_Query(rf, ctx) { if (rf & 1) {
229
+ i0.ɵɵviewQuery(_c0, 5);
230
+ } if (rf & 2) {
231
+ let _t;
232
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.textAreaElementRef = _t.first);
233
+ } }, hostVars: 2, hostBindings: function DrChatFormWithHistoryComponent_HostBindings(rf, ctx) { if (rf & 1) {
234
+ i0.ɵɵlistener("drop", function DrChatFormWithHistoryComponent_drop_HostBindingHandler($event) { return ctx.onDrop($event); })("dragover", function DrChatFormWithHistoryComponent_dragover_HostBindingHandler($event) { return ctx.onDragOver($event); })("dragleave", function DrChatFormWithHistoryComponent_dragleave_HostBindingHandler($event) { return ctx.onDragLeave($event); });
235
+ } if (rf & 2) {
236
+ i0.ɵɵclassProp("file-over", ctx.fileOver);
237
+ } }, inputs: { isChatMode: "isChatMode", message: "message", messagePlaceholder: "messagePlaceholder", dropFiles: "dropFiles", dropFilePlaceholder: "dropFilePlaceholder", waitForReply: "waitForReply", showDisabledButtonInsteadOfDotFlashing: "showDisabledButtonInsteadOfDotFlashing" }, outputs: { send: "send", abort: "abort", inputChange: "inputChange" }, ngContentSelectors: _c4, decls: 18, vars: 23, consts: [[1, "message-row"], [1, "message-row__input", 3, "ngClass"], ["class", "dropped-files", 4, "ngIf"], [1, "message-row__input-textarea-wrap"], ["type", "text", 3, "ngModel", "rows", "placeholder", "focus", "blur", "mouseenter", "mouseleave", "ngModelChange", "keydown.enter"], ["textAreaElement", ""], [1, "message-input-tmp"], ["type", "file", "hidden", "", "multiple", "", 3, "change"], ["fileInput", ""], [1, "dr-icon-history", 3, "click"], [1, "dr-icon-attachment", 3, "click"], ["class", "dr-icon-send-arrow-up send-button", 3, "style", "click", 4, "ngIf"], ["class", "dr-icon-send-arrow-up send-button-disabled", 3, "click", 4, "ngIf"], ["class", "wait-reply-dot-flashing", 4, "ngIf"], ["theme", "ghost", "class", "abort-button", 3, "click", 4, "ngIf"], [4, "ngIf"], [1, "dropped-files"], ["class", "dropped-files__item", 4, "ngFor", "ngForOf"], [1, "dropped-files__item"], [1, "dr-icon-file"], [1, "dropped-files__item-name"], [1, "dr-icon-noty-error", "dropped-files__item-remove", 3, "click"], [1, "dr-icon-send-arrow-up", "send-button", 3, "click"], [1, "dr-icon-send-arrow-up", "send-button-disabled", 3, "click"], [1, "wait-reply-dot-flashing"], ["theme", "ghost", 1, "abort-button", 3, "click"], [1, "history-dropdown", 3, "exclude", "clickOutside"]], template: function DrChatFormWithHistoryComponent_Template(rf, ctx) { if (rf & 1) {
238
+ const _r20 = i0.ɵɵgetCurrentView();
239
+ i0.ɵɵprojectionDef();
240
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
241
+ i0.ɵɵtemplate(2, DrChatFormWithHistoryComponent_div_2_Template, 2, 1, "div", 2);
242
+ i0.ɵɵelementStart(3, "div", 3)(4, "textarea", 4, 5);
243
+ i0.ɵɵlistener("focus", function DrChatFormWithHistoryComponent_Template_textarea_focus_4_listener() { return ctx.inputFocus = true; })("blur", function DrChatFormWithHistoryComponent_Template_textarea_blur_4_listener() { return ctx.inputFocus = false; })("mouseenter", function DrChatFormWithHistoryComponent_Template_textarea_mouseenter_4_listener() { return ctx.inputHover = true; })("mouseleave", function DrChatFormWithHistoryComponent_Template_textarea_mouseleave_4_listener() { return ctx.inputHover = false; })("ngModelChange", function DrChatFormWithHistoryComponent_Template_textarea_ngModelChange_4_listener($event) { return ctx.message = $event; })("ngModelChange", function DrChatFormWithHistoryComponent_Template_textarea_ngModelChange_4_listener($event) { return ctx.onModelChange($event); })("keydown.enter", function DrChatFormWithHistoryComponent_Template_textarea_keydown_enter_4_listener($event) { return ctx.sendMessage($event); });
244
+ i0.ɵɵtext(6, " ");
245
+ i0.ɵɵelementEnd();
246
+ i0.ɵɵelementStart(7, "div", 6);
247
+ i0.ɵɵtext(8);
248
+ i0.ɵɵelementEnd();
249
+ i0.ɵɵelementStart(9, "input", 7, 8);
250
+ i0.ɵɵlistener("change", function DrChatFormWithHistoryComponent_Template_input_change_9_listener($event) { return ctx.onFileSelected($event); });
251
+ i0.ɵɵelementEnd();
252
+ i0.ɵɵelementStart(11, "i", 9);
253
+ i0.ɵɵlistener("click", function DrChatFormWithHistoryComponent_Template_i_click_11_listener() { return ctx.showHistory(); });
254
+ i0.ɵɵelementEnd();
255
+ i0.ɵɵelementStart(12, "i", 10);
256
+ i0.ɵɵlistener("click", function DrChatFormWithHistoryComponent_Template_i_click_12_listener() { i0.ɵɵrestoreView(_r20); const _r2 = i0.ɵɵreference(10); return i0.ɵɵresetView(_r2.click()); });
257
+ i0.ɵɵelementEnd();
258
+ i0.ɵɵtemplate(13, DrChatFormWithHistoryComponent_i_13_Template, 1, 2, "i", 11);
259
+ i0.ɵɵtemplate(14, DrChatFormWithHistoryComponent_i_14_Template, 1, 0, "i", 12);
260
+ i0.ɵɵtemplate(15, DrChatFormWithHistoryComponent_dr_dot_flashing_15_Template, 1, 0, "dr-dot-flashing", 13);
261
+ i0.ɵɵtemplate(16, DrChatFormWithHistoryComponent_dr_button_16_Template, 2, 0, "dr-button", 14);
262
+ i0.ɵɵelementEnd();
263
+ i0.ɵɵtemplate(17, DrChatFormWithHistoryComponent_ng_container_17_Template, 3, 2, "ng-container", 15);
264
+ i0.ɵɵelementEnd()();
265
+ } if (rf & 2) {
266
+ const _r1 = i0.ɵɵreference(5);
267
+ i0.ɵɵadvance(1);
268
+ i0.ɵɵproperty("@containerHeightAnimation", i0.ɵɵpureFunction2(16, _c2, ctx.showHistory ? "expanded" : "collapsed", i0.ɵɵpureFunction1(14, _c1, ctx.getTextAreaHeight(_r1))))("ngClass", i0.ɵɵpureFunction3(19, _c3, ctx.inputFocus, !!(ctx.message == null ? null : ctx.message.length), ctx.isShowedHistory));
269
+ i0.ɵɵadvance(1);
270
+ i0.ɵɵproperty("ngIf", ctx.droppedFiles == null ? null : ctx.droppedFiles.length);
271
+ i0.ɵɵadvance(2);
272
+ i0.ɵɵstyleMap(ctx.getTextAreaHeight(_r1));
273
+ i0.ɵɵpropertyInterpolate("placeholder", ctx.fileOver ? ctx.dropFilePlaceholder : ctx.messagePlaceholder);
274
+ i0.ɵɵproperty("ngModel", ctx.message)("rows", 1);
275
+ i0.ɵɵadvance(4);
276
+ i0.ɵɵtextInterpolate(_r1.value);
277
+ i0.ɵɵadvance(5);
278
+ i0.ɵɵproperty("ngIf", !ctx.waitForReply);
279
+ i0.ɵɵadvance(1);
280
+ i0.ɵɵproperty("ngIf", ctx.waitForReply && ctx.showDisabledButtonInsteadOfDotFlashing);
281
+ i0.ɵɵadvance(1);
282
+ i0.ɵɵproperty("ngIf", ctx.waitForReply && !ctx.showDisabledButtonInsteadOfDotFlashing);
283
+ i0.ɵɵadvance(1);
284
+ i0.ɵɵproperty("ngIf", ctx.waitForReply);
285
+ i0.ɵɵadvance(1);
286
+ i0.ɵɵproperty("ngIf", !ctx.isChatMode);
287
+ } }, dependencies: [i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel, i3.NgClass, i3.NgForOf, i3.NgIf, i4.DrButtonComponent, i5.ClickOutsideDirective, i6.DrDotFlashingComponent], styles: ["[_nghost-%COMP%]{--send-button-offset: 42px;display:flex;flex-direction:column;align-items:center;padding:0 16px}[_nghost-%COMP%] .message-row[_ngcontent-%COMP%]{display:flex;justify-content:center;width:100%;padding:0 0 21px;max-width:956px}[_nghost-%COMP%] .message-row__input[_ngcontent-%COMP%]{flex-direction:column;background-color:#fff;position:relative;display:flex;align-items:center;flex-grow:1;height:auto;overflow:visible;min-width:265px;border-radius:24px;border:1.5px solid transparent;box-shadow:0 2px 16px -10px #603cff29;transition:.35s ease}[_nghost-%COMP%] .message-row__input[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%], [_nghost-%COMP%] .message-row__input[_ngcontent-%COMP%] .send-button-disabled[_ngcontent-%COMP%]{width:32px;height:32px;display:flex;align-items:center;justify-content:center;position:absolute;top:2.5px;right:8px;cursor:pointer;font-size:24px;border-radius:100px;background:#f0f1f4;color:#aeabac;transition:.15s ease-in-out}[_nghost-%COMP%] .message-row__input[_ngcontent-%COMP%] .dr-icon-history[_ngcontent-%COMP%], [_nghost-%COMP%] .message-row__input[_ngcontent-%COMP%] .dr-icon-attachment[_ngcontent-%COMP%]{display:flex;align-items:center;position:absolute;cursor:pointer;width:32px;height:48px;left:16px;top:-1px}[_nghost-%COMP%] .message-row__input[_ngcontent-%COMP%] .dr-icon-attachment[_ngcontent-%COMP%]{left:52px}[_nghost-%COMP%] .message-row__input[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%]{color:#fff;background:linear-gradient(266deg,#6969ff 25.2%,#4eb7df 90.24%) border-box;opacity:.5}[_nghost-%COMP%] .message-row__input--focused[_ngcontent-%COMP%]{box-shadow:8px 8px 16px #6969ff40,-4px -4px 8px #40b6e340,8px 8px 60px #00000040;height:auto!important;background:#fff}[_nghost-%COMP%] .message-row__input--filled[_ngcontent-%COMP%]{box-shadow:8px 8px 16px #6969ff40,-4px -4px 8px #40b6e340,8px 8px 60px #00000040;background:#fff}[_nghost-%COMP%] .message-row__input--filled[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%]{opacity:1}[_nghost-%COMP%] .message-row__input[_ngcontent-%COMP%] .message-input-tmp[_ngcontent-%COMP%]{display:none}[_nghost-%COMP%] .message-row__input.showed-dropdown[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%]{opacity:.5}[_nghost-%COMP%] .message-row__input[_ngcontent-%COMP%]:before{content:\"\";position:absolute;inset:-3px;background:linear-gradient(266deg,#6969ff 25.2%,#4eb7df 90.24%);border-radius:25px;z-index:-1}[_nghost-%COMP%] .message-row__input[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%], [_nghost-%COMP%] .message-row__input[_ngcontent-%COMP%] .message-input-tmp[_ngcontent-%COMP%]{font-size:14px;color:#333;width:100%;outline:none;min-height:48px;line-height:19px;flex-grow:1;resize:none;padding:13px 55px 13px 88px;margin:auto;border:none;border-radius:22.5px}[_nghost-%COMP%] .message-row__input[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]:focus, [_nghost-%COMP%] .message-row__input[_ngcontent-%COMP%] .message-input-tmp[_ngcontent-%COMP%]:focus{border:none}[_nghost-%COMP%] .message-row__input[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]::placeholder, [_nghost-%COMP%] .message-row__input[_ngcontent-%COMP%] .message-input-tmp[_ngcontent-%COMP%]::placeholder{color:#9ea1aa}[_nghost-%COMP%] .message-row__input-textarea-wrap[_ngcontent-%COMP%]{display:flex;width:100%;position:relative}[_nghost-%COMP%] .history-dropdown[_ngcontent-%COMP%]{width:100%;max-height:220px;overflow-y:auto;padding:12px 16px 0}[_nghost-%COMP%] .showed-dropdown[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{visibility:hidden;position:absolute}[_nghost-%COMP%] .showed-dropdown[_ngcontent-%COMP%] .message-input-tmp[_ngcontent-%COMP%]{display:block;margin-left:inherit;white-space:nowrap;font-family:monospace;overflow:hidden;text-overflow:ellipsis}[_nghost-%COMP%] .showed-dropdown[_ngcontent-%COMP%] .send-button[_ngcontent-%COMP%]{top:2.5px!important}[_nghost-%COMP%] .dropped-files[_ngcontent-%COMP%]{display:flex;flex-direction:row;margin-bottom:.5rem;flex-wrap:wrap;gap:8px;padding-left:16px}[_nghost-%COMP%] .dropped-files__item[_ngcontent-%COMP%]{max-width:183px;display:flex;flex-direction:row;gap:4px;justify-content:space-between;align-items:center;margin-top:16px;padding:4px 8px;border:1px solid rgb(223,224,227);box-sizing:border-box;border-radius:8px}[_nghost-%COMP%] .dropped-files__item-name[_ngcontent-%COMP%]{font-family:Poppins,sans-serif;font-size:12px;line-height:20px;font-weight:500;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[_nghost-%COMP%] .dropped-files__item-remove[_ngcontent-%COMP%]{cursor:pointer}"], data: { animation: [
288
+ trigger('containerHeightAnimation', [
289
+ state('collapsed', style({ height: '{{height}}' }), { params: { height: '48px' } }),
290
+ state('expanded', style({
291
+ height: '*',
292
+ })),
293
+ transition('collapsed => expanded', [animate('300ms ease-in-out')]),
294
+ transition('expanded => collapsed', [query('@dropdownAnimation', animateChild()), animate('300ms ease-in-out')]),
295
+ ]),
296
+ trigger('dropdownAnimation', [
297
+ state('hidden', style({
298
+ opacity: 0,
299
+ transform: 'translateY(-30px)',
300
+ display: 'none',
301
+ })),
302
+ state('visible', style({
303
+ opacity: 1,
304
+ transform: 'translateY(0)',
305
+ display: 'block',
306
+ })),
307
+ transition('hidden => visible', [style({ display: 'block' }), animate('300ms ease-in-out')]),
308
+ transition('visible => hidden', [
309
+ animate('300ms ease-in-out', style({ opacity: 0, transform: 'translateY(-30px)' })),
310
+ style({ display: 'none' }),
311
+ ]),
312
+ ]),
313
+ ] }, changeDetection: 0 }); }
314
+ }
315
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DrChatFormWithHistoryComponent, [{
316
+ type: Component,
317
+ args: [{ selector: 'dr-chat-form-with-history', changeDetection: ChangeDetectionStrategy.OnPush, animations: [
318
+ trigger('containerHeightAnimation', [
319
+ state('collapsed', style({ height: '{{height}}' }), { params: { height: '48px' } }),
320
+ state('expanded', style({
321
+ height: '*',
322
+ })),
323
+ transition('collapsed => expanded', [animate('300ms ease-in-out')]),
324
+ transition('expanded => collapsed', [query('@dropdownAnimation', animateChild()), animate('300ms ease-in-out')]),
325
+ ]),
326
+ trigger('dropdownAnimation', [
327
+ state('hidden', style({
328
+ opacity: 0,
329
+ transform: 'translateY(-30px)',
330
+ display: 'none',
331
+ })),
332
+ state('visible', style({
333
+ opacity: 1,
334
+ transform: 'translateY(0)',
335
+ display: 'block',
336
+ })),
337
+ transition('hidden => visible', [style({ display: 'block' }), animate('300ms ease-in-out')]),
338
+ transition('visible => hidden', [
339
+ animate('300ms ease-in-out', style({ opacity: 0, transform: 'translateY(-30px)' })),
340
+ style({ display: 'none' }),
341
+ ]),
342
+ ]),
343
+ ], template: "<div class=\"message-row\">\n <div\n [@containerHeightAnimation]=\"{\n value: showHistory ? 'expanded' : 'collapsed',\n params: { height: getTextAreaHeight(textAreaElement) },\n }\"\n class=\"message-row__input\"\n [ngClass]=\"{\n 'message-row__input--focused': inputFocus,\n 'message-row__input--filled': !!message?.length,\n 'showed-dropdown': isShowedHistory,\n }\">\n <div class=\"dropped-files\" *ngIf=\"droppedFiles?.length\">\n <div class=\"dropped-files__item\" *ngFor=\"let file of droppedFiles\">\n <i class=\"dr-icon-file\"></i>\n <div class=\"dropped-files__item-name\">{{ file.name }}</div>\n <i class=\"dr-icon-noty-error dropped-files__item-remove\" (click)=\"removeFile(file)\"></i>\n </div>\n </div>\n\n <div class=\"message-row__input-textarea-wrap\">\n <textarea\n #textAreaElement\n (focus)=\"inputFocus = true\"\n (blur)=\"inputFocus = false\"\n (mouseenter)=\"inputHover = true\"\n (mouseleave)=\"inputHover = false\"\n [(ngModel)]=\"message\"\n [rows]=\"1\"\n [style]=\"getTextAreaHeight(textAreaElement)\"\n (ngModelChange)=\"onModelChange($event)\"\n type=\"text\"\n placeholder=\"{{ fileOver ? dropFilePlaceholder : messagePlaceholder }}\"\n (keydown.enter)=\"sendMessage($event)\">\n </textarea>\n\n <div class=\"message-input-tmp\">{{ textAreaElement.value }}</div>\n\n <input #fileInput type=\"file\" hidden multiple (change)=\"onFileSelected($event)\" />\n <i (click)=\"showHistory()\" class=\"dr-icon-history\"></i>\n <i (click)=\"fileInput.click()\" class=\"dr-icon-attachment\"></i>\n\n <i\n *ngIf=\"!waitForReply\"\n [style]=\"getSendButtonPosition(textAreaElement)\"\n (click)=\"sendMessage($event)\"\n class=\"dr-icon-send-arrow-up send-button\"></i>\n <i\n *ngIf=\"waitForReply && showDisabledButtonInsteadOfDotFlashing\"\n (click)=\"sendMessage($event)\"\n class=\"dr-icon-send-arrow-up send-button-disabled\"></i>\n\n <dr-dot-flashing\n *ngIf=\"waitForReply && !showDisabledButtonInsteadOfDotFlashing\"\n class=\"wait-reply-dot-flashing\"></dr-dot-flashing>\n <dr-button *ngIf=\"waitForReply\" (click)=\"abortMessage()\" theme=\"ghost\" class=\"abort-button\"\n >Stop generating</dr-button\n >\n </div>\n\n <ng-container *ngIf=\"!isChatMode\">\n <div\n [@dropdownAnimation]=\"isShowedHistory ? 'visible' : 'hidden'\"\n class=\"history-dropdown\"\n [exclude]=\"'.dr-icon-history'\"\n (clickOutside)=\"closeHistory()\">\n <ng-content></ng-content>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [":host{--send-button-offset: 42px;display:flex;flex-direction:column;align-items:center;padding:0 16px}:host .message-row{display:flex;justify-content:center;width:100%;padding:0 0 21px;max-width:956px}:host .message-row__input{flex-direction:column;background-color:#fff;position:relative;display:flex;align-items:center;flex-grow:1;height:auto;overflow:visible;min-width:265px;border-radius:24px;border:1.5px solid transparent;box-shadow:0 2px 16px -10px #603cff29;transition:.35s ease}:host .message-row__input .send-button,:host .message-row__input .send-button-disabled{width:32px;height:32px;display:flex;align-items:center;justify-content:center;position:absolute;top:2.5px;right:8px;cursor:pointer;font-size:24px;border-radius:100px;background:#f0f1f4;color:#aeabac;transition:.15s ease-in-out}:host .message-row__input .dr-icon-history,:host .message-row__input .dr-icon-attachment{display:flex;align-items:center;position:absolute;cursor:pointer;width:32px;height:48px;left:16px;top:-1px}:host .message-row__input .dr-icon-attachment{left:52px}:host .message-row__input .send-button{color:#fff;background:linear-gradient(266deg,#6969ff 25.2%,#4eb7df 90.24%) border-box;opacity:.5}:host .message-row__input--focused{box-shadow:8px 8px 16px #6969ff40,-4px -4px 8px #40b6e340,8px 8px 60px #00000040;height:auto!important;background:#fff}:host .message-row__input--filled{box-shadow:8px 8px 16px #6969ff40,-4px -4px 8px #40b6e340,8px 8px 60px #00000040;background:#fff}:host .message-row__input--filled .send-button{opacity:1}:host .message-row__input .message-input-tmp{display:none}:host .message-row__input.showed-dropdown .send-button{opacity:.5}:host .message-row__input:before{content:\"\";position:absolute;inset:-3px;background:linear-gradient(266deg,#6969ff 25.2%,#4eb7df 90.24%);border-radius:25px;z-index:-1}:host .message-row__input textarea,:host .message-row__input .message-input-tmp{font-size:14px;color:#333;width:100%;outline:none;min-height:48px;line-height:19px;flex-grow:1;resize:none;padding:13px 55px 13px 88px;margin:auto;border:none;border-radius:22.5px}:host .message-row__input textarea:focus,:host .message-row__input .message-input-tmp:focus{border:none}:host .message-row__input textarea::placeholder,:host .message-row__input .message-input-tmp::placeholder{color:#9ea1aa}:host .message-row__input-textarea-wrap{display:flex;width:100%;position:relative}:host .history-dropdown{width:100%;max-height:220px;overflow-y:auto;padding:12px 16px 0}:host .showed-dropdown textarea{visibility:hidden;position:absolute}:host .showed-dropdown .message-input-tmp{display:block;margin-left:inherit;white-space:nowrap;font-family:monospace;overflow:hidden;text-overflow:ellipsis}:host .showed-dropdown .send-button{top:2.5px!important}:host .dropped-files{display:flex;flex-direction:row;margin-bottom:.5rem;flex-wrap:wrap;gap:8px;padding-left:16px}:host .dropped-files__item{max-width:183px;display:flex;flex-direction:row;gap:4px;justify-content:space-between;align-items:center;margin-top:16px;padding:4px 8px;border:1px solid rgb(223,224,227);box-sizing:border-box;border-radius:8px}:host .dropped-files__item-name{font-family:Poppins,sans-serif;font-size:12px;line-height:20px;font-weight:500;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host .dropped-files__item-remove{cursor:pointer}\n"] }]
344
+ }], function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.DomSanitizer }]; }, { textAreaElementRef: [{
345
+ type: ViewChild,
346
+ args: ['textAreaElement']
347
+ }], isChatMode: [{
348
+ type: Input
349
+ }], message: [{
350
+ type: Input
351
+ }], messagePlaceholder: [{
352
+ type: Input
353
+ }], dropFiles: [{
354
+ type: Input
355
+ }], dropFilePlaceholder: [{
356
+ type: Input
357
+ }], waitForReply: [{
358
+ type: Input
359
+ }], showDisabledButtonInsteadOfDotFlashing: [{
360
+ type: Input
361
+ }], send: [{
362
+ type: Output
363
+ }], abort: [{
364
+ type: Output
365
+ }], inputChange: [{
366
+ type: Output
367
+ }], fileOver: [{
368
+ type: HostBinding,
369
+ args: ['class.file-over']
370
+ }], onDrop: [{
371
+ type: HostListener,
372
+ args: ['drop', ['$event']]
373
+ }], onDragOver: [{
374
+ type: HostListener,
375
+ args: ['dragover', ['$event']]
376
+ }], onDragLeave: [{
377
+ type: HostListener,
378
+ args: ['dragleave', ['$event']]
379
+ }] }); })();
380
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1mb3JtLXdpdGgtaGlzdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhcmFpbHNzaGFyZWQvc3JjL2xpYi9kci1jaGF0L2RyLWNoYXQtZm9ybS13aXRoLWhpc3RvcnkvY2hhdC1mb3JtLXdpdGgtaGlzdG9yeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhcmFpbHNzaGFyZWQvc3JjL2xpYi9kci1jaGF0L2RyLWNoYXQtZm9ybS13aXRoLWhpc3RvcnkvY2hhdC1mb3JtLXdpdGgtaGlzdG9yeS4uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7SUNEMUYsK0JBQW1FO0lBQy9ELHdCQUE0QjtJQUM1QiwrQkFBc0M7SUFBQSxZQUFlO0lBQUEsaUJBQU07SUFDM0QsNkJBQW9GO0lBQTNCLDBPQUFTLGVBQUEsMkJBQWdCLENBQUEsSUFBQztJQUFDLGlCQUFJLEVBQUE7OztJQURsRCxlQUFlO0lBQWYsa0NBQWU7OztJQUg3RCwrQkFBd0Q7SUFDcEQsc0ZBSU07SUFDVixpQkFBTTs7O0lBTGdELGVBQWU7SUFBZiw2Q0FB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QUFFLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7d0JBQzVGLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRTs0QkFDNUIsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQzs0QkFDbkYsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO3lCQUM3QixDQUFDO3FCQUNMLENBQUM7aUJBQ0w7K0ZBRzZCLGtCQUFrQjtrQkFBL0MsU0FBUzttQkFBQyxpQkFBaUI7WUFRbkIsVUFBVTtrQkFBbEIsS0FBSztZQU9HLE9BQU87a0JBQWYsS0FBSztZQU9HLGtCQUFrQjtrQkFBMUIsS0FBSztZQU9HLFNBQVM7a0JBQWpCLEtBQUs7WUFPRyxtQkFBbUI7a0JBQTNCLEtBQUs7WUFPRyxZQUFZO2tCQUFwQixLQUFLO1lBT0csc0NBQXNDO2tCQUE5QyxLQUFLO1lBTUksSUFBSTtrQkFBYixNQUFNO1lBQ0csS0FBSztrQkFBZCxNQUFNO1lBUUcsV0FBVztrQkFBcEIsTUFBTTtZQUV5QixRQUFRO2tCQUF2QyxXQUFXO21CQUFDLGlCQUFpQjtZQVE5QixNQUFNO2tCQURMLFlBQVk7bUJBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBbUNoQyxVQUFVO2tCQURULFlBQVk7bUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBVXBDLFdBQVc7a0JBRFYsWUFBWTttQkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IElNQUdFX1RZUEVTIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NoYXQnO1xuaW1wb3J0IHsgdHJpZ2dlciwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCBhbmltYXRlLCBxdWVyeSwgYW5pbWF0ZUNoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZHItY2hhdC1mb3JtLXdpdGgtaGlzdG9yeScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NoYXQtZm9ybS13aXRoLWhpc3RvcnkuLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jaGF0LWZvcm0td2l0aC1oaXN0b3J5Li5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGFuaW1hdGlvbnM6IFtcbiAgICAgICAgdHJpZ2dlcignY29udGFpbmVySGVpZ2h0QW5pbWF0aW9uJywgW1xuICAgICAgICAgICAgc3RhdGUoJ2NvbGxhcHNlZCcsIHN0eWxlKHsgaGVpZ2h0OiAne3toZWlnaHR9fScgfSksIHsgcGFyYW1zOiB7IGhlaWdodDogJzQ4cHgnIH0gfSksXG4gICAgICAgICAgICBzdGF0ZShcbiAgICAgICAgICAgICAgICAnZXhwYW5kZWQnLFxuICAgICAgICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnKicsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdHJhbnNpdGlvbignY29sbGFwc2VkID0+IGV4cGFuZGVkJywgW2FuaW1hdGUoJzMwMG1zIGVhc2UtaW4tb3V0JyldKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJ2V4cGFuZGVkID0+IGNvbGxhcHNlZCcsIFtxdWVyeSgnQGRyb3Bkb3duQW5pbWF0aW9uJywgYW5pbWF0ZUNoaWxkKCkpLCBhbmltYXRlKCczMDBtcyBlYXNlLWluLW91dCcpXSksXG4gICAgICAgIF0pLFxuICAgICAgICB0cmlnZ2VyKCdkcm9wZG93bkFuaW1hdGlvbicsIFtcbiAgICAgICAgICAgIHN0YXRlKFxuICAgICAgICAgICAgICAgICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMzBweCknLFxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiAnbm9uZScsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgc3RhdGUoXG4gICAgICAgICAgICAgICAgJ3Zpc2libGUnLFxuICAgICAgICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwKScsXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBbc3R5bGUoeyBkaXNwbGF5OiAnYmxvY2snIH0pLCBhbmltYXRlKCczMDBtcyBlYXNlLWluLW91dCcpXSksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCd2aXNpYmxlID0+IGhpZGRlbicsIFtcbiAgICAgICAgICAgICAgICBhbmltYXRlKCczMDBtcyBlYXNlLWluLW91dCcsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMzBweCknIH0pKSxcbiAgICAgICAgICAgICAgICBzdHlsZSh7IGRpc3BsYXk6ICdub25lJyB9KSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICBdKSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEckNoYXRGb3JtV2l0aEhpc3RvcnlDb21wb25lbnQge1xuICAgIEBWaWV3Q2hpbGQoJ3RleHRBcmVhRWxlbWVudCcpIHRleHRBcmVhRWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgICBfdGV4dGFyZWFJbml0aWFsSGVpZ2h0ID0gdHJ1ZTtcbiAgICBpbnB1dEZvY3VzID0gZmFsc2U7XG4gICAgaW5wdXRIb3ZlciA9IGZhbHNlO1xuXG4gICAgZHJvcHBlZEZpbGVzOiBhbnlbXSA9IFtdO1xuICAgIGlzU2hvd2VkSGlzdG9yeSA9IGZhbHNlO1xuXG4gICAgQElucHV0KCkgaXNDaGF0TW9kZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogUHJlZGVmaW5lZCBtZXNzYWdlIHRleHRcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgQElucHV0KCkgbWVzc2FnZSA9ICcnO1xuXG4gICAgLyoqXG4gICAgICogTWVzc2FnZSBwbGFjZWhvbGRlciB0ZXh0XG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIEBJbnB1dCgpIG1lc3NhZ2VQbGFjZWhvbGRlciA9ICdUeXBlIGEgbWVzc2FnZSc7XG5cbiAgICAvKipcbiAgICAgKiBTaG93IHNlbmQgYnV0dG9uXG4gICAgICpcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBASW5wdXQoKSBkcm9wRmlsZXMgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEZpbGUgZHJvcCBwbGFjZWhvbGRlciB0ZXh0XG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGRyb3BGaWxlUGxhY2Vob2xkZXIgPSAnRHJvcCBmaWxlIHRvIHNlbmQnO1xuXG4gICAgLyoqXG4gICAgICogUGFyYW1ldGVyIHRvIGNoZWNrIGlzIHNlbmQgbWVzc2FnZSBmdW5jdGlvbiBhdmFpbGFibGVcbiAgICAgKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHdhaXRGb3JSZXBseSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogUGFyYW1ldGVyIHRvIGNoZWNrIGlzIHNlbmQgbWVzc2FnZSBmdW5jdGlvbiBhdmFpbGFibGVcbiAgICAgKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNob3dEaXNhYmxlZEJ1dHRvbkluc3RlYWRPZkRvdEZsYXNoaW5nID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEB0eXBlIHtFdmVudEVtaXR0ZXI8eyBtZXNzYWdlOiBzdHJpbmcsIGZpbGVzOiBGaWxlW10gfT59XG4gICAgICovXG4gICAgQE91dHB1dCgpIHNlbmQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbWVzc2FnZTogc3RyaW5nOyBmaWxlczogRmlsZVtdIH0+KCk7XG4gICAgQE91dHB1dCgpIGFib3J0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyB3aGVuIG1lc3NhZ2UgaW5wdXQgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZFxuICAgICAqXG4gICAgICogQHR5cGUge0V2ZW50RW1pdHRlcjxzdHJpbmc+fVxuICAgICAqL1xuXG4gICAgQE91dHB1dCgpIGlucHV0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZpbGUtb3ZlcicpIGZpbGVPdmVyID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByb3RlY3RlZCBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICApIHt9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkcm9wJywgWyckZXZlbnQnXSlcbiAgICBvbkRyb3AoZXZlbnQ6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5kcm9wRmlsZXMpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICAgICAgdGhpcy5maWxlT3ZlciA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGZpbGU7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKElNQUdFX1RZUEVTLmluY2x1ZGVzKGZpbGUudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc3JjID0gZS50YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy51cmxTdHlsZSA9IHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShgdXJsKCR7cmVzLnNyY30pYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZnIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3BwZWRGaWxlcy5wdXNoKHJlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlRmlsZShmaWxlKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5kcm9wcGVkRmlsZXMuaW5kZXhPZihmaWxlKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuZHJvcHBlZEZpbGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkcmFnb3ZlcicsIFsnJGV2ZW50J10pXG4gICAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5kcm9wRmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZU92ZXIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZHJhZ2xlYXZlJywgWyckZXZlbnQnXSlcbiAgICBvbkRyYWdMZWF2ZShldmVudDogRHJhZ0V2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5kcm9wRmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZU92ZXIgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlbmRNZXNzYWdlKCRldmVudCkge1xuICAgICAgICBpZiAoISRldmVudCB8fCAhJGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAkZXZlbnQgJiYgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy53YWl0Rm9yUmVwbHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRyb3BwZWRGaWxlcy5sZW5ndGggfHwgU3RyaW5nKHRoaXMubWVzc2FnZSkudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RleHRhcmVhSW5pdGlhbEhlaWdodCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kLmVtaXQoeyBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsIGZpbGVzOiB0aGlzLmRyb3BwZWRGaWxlcyB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3BwZWRGaWxlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWJvcnRNZXNzYWdlKCkge1xuICAgICAgICB0aGlzLmFib3J0LmVtaXQoKTtcbiAgICB9XG5cbiAgICBvbk1vZGVsQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdGV4dGFyZWFJbml0aWFsSGVpZ2h0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5wdXRDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0VGV4dEFyZWFIZWlnaHQodGV4dEFyZWFFbGVtZW50OiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgICAgIGlmICh0aGlzLl90ZXh0YXJlYUluaXRpYWxIZWlnaHQpIHtcbiAgICAgICAgICAgIHRleHRBcmVhRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnNDhweCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0QXJlYUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgICAgICAgICAgdGV4dEFyZWFFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRleHRBcmVhRWxlbWVudC5zY3JvbGxIZWlnaHQgKyAncHgnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke3RleHRBcmVhRWxlbWVudC5zdHlsZS5oZWlnaHR9YDtcbiAgICB9XG5cbiAgICBnZXRTZW5kQnV0dG9uUG9zaXRpb24odGV4dEFyZWFFbGVtZW50OiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBgdG9wOiBjYWxjKCR7dGhpcy5nZXRUZXh0QXJlYUhlaWdodCh0ZXh0QXJlYUVsZW1lbnQpfSAtIHZhcigtLXNlbmQtYnV0dG9uLW9mZnNldCkpO2A7XG4gICAgfVxuXG4gICAgc2hvd0hpc3RvcnkoKSB7XG4gICAgICAgIHRoaXMuaXNTaG93ZWRIaXN0b3J5ID0gIXRoaXMuaXNTaG93ZWRIaXN0b3J5O1xuICAgIH1cblxuICAgIGNsb3NlSGlzdG9yeSgpIHtcbiAgICAgICAgdGhpcy5pc1Nob3dlZEhpc3RvcnkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm1lc3NhZ2Utcm93XCI+XG4gICAgPGRpdlxuICAgICAgICBbQGNvbnRhaW5lckhlaWdodEFuaW1hdGlvbl09XCJ7XG4gICAgICAgICAgICB2YWx1ZTogc2hvd0hpc3RvcnkgPyAnZXhwYW5kZWQnIDogJ2NvbGxhcHNlZCcsXG4gICAgICAgICAgICBwYXJhbXM6IHsgaGVpZ2h0OiBnZXRUZXh0QXJlYUhlaWdodCh0ZXh0QXJlYUVsZW1lbnQpIH0sXG4gICAgICAgIH1cIlxuICAgICAgICBjbGFzcz1cIm1lc3NhZ2Utcm93X19pbnB1dFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICdtZXNzYWdlLXJvd19faW5wdXQtLWZvY3VzZWQnOiBpbnB1dEZvY3VzLFxuICAgICAgICAgICAgJ21lc3NhZ2Utcm93X19pbnB1dC0tZmlsbGVkJzogISFtZXNzYWdlPy5sZW5ndGgsXG4gICAgICAgICAgICAnc2hvd2VkLWRyb3Bkb3duJzogaXNTaG93ZWRIaXN0b3J5LFxuICAgICAgICB9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wcGVkLWZpbGVzXCIgKm5nSWY9XCJkcm9wcGVkRmlsZXM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3BwZWQtZmlsZXNfX2l0ZW1cIiAqbmdGb3I9XCJsZXQgZmlsZSBvZiBkcm9wcGVkRmlsZXNcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImRyLWljb24tZmlsZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcHBlZC1maWxlc19faXRlbS1uYW1lXCI+e3sgZmlsZS5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJkci1pY29uLW5vdHktZXJyb3IgZHJvcHBlZC1maWxlc19faXRlbS1yZW1vdmVcIiAoY2xpY2spPVwicmVtb3ZlRmlsZShmaWxlKVwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZS1yb3dfX2lucHV0LXRleHRhcmVhLXdyYXBcIj5cbiAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICN0ZXh0QXJlYUVsZW1lbnRcbiAgICAgICAgICAgICAgICAoZm9jdXMpPVwiaW5wdXRGb2N1cyA9IHRydWVcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cImlucHV0Rm9jdXMgPSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiaW5wdXRIb3ZlciA9IHRydWVcIlxuICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImlucHV0SG92ZXIgPSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbcm93c109XCIxXCJcbiAgICAgICAgICAgICAgICBbc3R5bGVdPVwiZ2V0VGV4dEFyZWFIZWlnaHQodGV4dEFyZWFFbGVtZW50KVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Nb2RlbENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyBmaWxlT3ZlciA/IGRyb3BGaWxlUGxhY2Vob2xkZXIgOiBtZXNzYWdlUGxhY2Vob2xkZXIgfX1cIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNlbmRNZXNzYWdlKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvdGV4dGFyZWE+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlLWlucHV0LXRtcFwiPnt7IHRleHRBcmVhRWxlbWVudC52YWx1ZSB9fTwvZGl2PlxuXG4gICAgICAgICAgICA8aW5wdXQgI2ZpbGVJbnB1dCB0eXBlPVwiZmlsZVwiIGhpZGRlbiBtdWx0aXBsZSAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudClcIiAvPlxuICAgICAgICAgICAgPGkgKGNsaWNrKT1cInNob3dIaXN0b3J5KClcIiBjbGFzcz1cImRyLWljb24taGlzdG9yeVwiPjwvaT5cbiAgICAgICAgICAgIDxpIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiIGNsYXNzPVwiZHItaWNvbi1hdHRhY2htZW50XCI+PC9pPlxuXG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIXdhaXRGb3JSZXBseVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlXT1cImdldFNlbmRCdXR0b25Qb3NpdGlvbih0ZXh0QXJlYUVsZW1lbnQpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VuZE1lc3NhZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkci1pY29uLXNlbmQtYXJyb3ctdXAgc2VuZC1idXR0b25cIj48L2k+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICpuZ0lmPVwid2FpdEZvclJlcGx5ICYmIHNob3dEaXNhYmxlZEJ1dHRvbkluc3RlYWRPZkRvdEZsYXNoaW5nXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VuZE1lc3NhZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkci1pY29uLXNlbmQtYXJyb3ctdXAgc2VuZC1idXR0b24tZGlzYWJsZWRcIj48L2k+XG5cbiAgICAgICAgICAgIDxkci1kb3QtZmxhc2hpbmdcbiAgICAgICAgICAgICAgICAqbmdJZj1cIndhaXRGb3JSZXBseSAmJiAhc2hvd0Rpc2FibGVkQnV0dG9uSW5zdGVhZE9mRG90Rmxhc2hpbmdcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwid2FpdC1yZXBseS1kb3QtZmxhc2hpbmdcIj48L2RyLWRvdC1mbGFzaGluZz5cbiAgICAgICAgICAgIDxkci1idXR0b24gKm5nSWY9XCJ3YWl0Rm9yUmVwbHlcIiAoY2xpY2spPVwiYWJvcnRNZXNzYWdlKClcIiB0aGVtZT1cImdob3N0XCIgY2xhc3M9XCJhYm9ydC1idXR0b25cIlxuICAgICAgICAgICAgICAgID5TdG9wIGdlbmVyYXRpbmc8L2RyLWJ1dHRvblxuICAgICAgICAgICAgPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQ2hhdE1vZGVcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBbQGRyb3Bkb3duQW5pbWF0aW9uXT1cImlzU2hvd2VkSGlzdG9yeSA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImhpc3RvcnktZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgIFtleGNsdWRlXT1cIicuZHItaWNvbi1oaXN0b3J5J1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrT3V0c2lkZSk9XCJjbG9zZUhpc3RvcnkoKVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19