@copilotkitnext/angular 1.52.0-next.8 → 1.52.0

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.
Files changed (73) hide show
  1. package/README.md +225 -432
  2. package/dist/README.md +225 -432
  3. package/dist/fesm2022/copilotkitnext-angular.mjs +312 -161
  4. package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
  5. package/dist/lib/agent.d.ts +20 -20
  6. package/dist/lib/components/chat/copilot-chat-assistant-message.d.ts +46 -46
  7. package/dist/lib/components/chat/copilot-chat-message-view.d.ts +126 -126
  8. package/dist/lib/components/chat/copilot-chat-tool-calls-view.d.ts +23 -23
  9. package/dist/lib/components/chat/copilot-chat-user-message-branch-navigation.d.ts +6 -6
  10. package/dist/lib/components/chat/copilot-chat-user-message.d.ts +6 -6
  11. package/dist/lib/components/chat/copilot-chat-view-scroll-view.d.ts +18 -18
  12. package/dist/lib/components/chat/copilot-chat-view.d.ts +54 -54
  13. package/dist/lib/components/chat/copilot-chat.d.ts +18 -18
  14. package/dist/lib/config.d.ts +1 -0
  15. package/dist/lib/copilotkit.d.ts +6 -1
  16. package/dist/lib/license-watermark.d.ts +1 -0
  17. package/dist/lib/render-tool-calls.d.ts +23 -23
  18. package/dist/styles.css +3 -0
  19. package/package.json +18 -18
  20. package/dist/esm2022/copilotkitnext-angular.mjs +0 -5
  21. package/dist/esm2022/index.mjs +0 -2
  22. package/dist/esm2022/lib/agent-context.mjs +0 -25
  23. package/dist/esm2022/lib/agent.mjs +0 -73
  24. package/dist/esm2022/lib/chat-config.mjs +0 -35
  25. package/dist/esm2022/lib/chat-state.mjs +0 -18
  26. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-buttons.mjs +0 -344
  27. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-renderer.mjs +0 -260
  28. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-toolbar.mjs +0 -22
  29. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.mjs +0 -415
  30. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.types.mjs +0 -2
  31. package/dist/esm2022/lib/components/chat/copilot-chat-audio-recorder.mjs +0 -196
  32. package/dist/esm2022/lib/components/chat/copilot-chat-buttons.mjs +0 -299
  33. package/dist/esm2022/lib/components/chat/copilot-chat-input-defaults.mjs +0 -39
  34. package/dist/esm2022/lib/components/chat/copilot-chat-input.mjs +0 -634
  35. package/dist/esm2022/lib/components/chat/copilot-chat-input.types.mjs +0 -10
  36. package/dist/esm2022/lib/components/chat/copilot-chat-message-view-cursor.mjs +0 -27
  37. package/dist/esm2022/lib/components/chat/copilot-chat-message-view.mjs +0 -269
  38. package/dist/esm2022/lib/components/chat/copilot-chat-message-view.types.mjs +0 -2
  39. package/dist/esm2022/lib/components/chat/copilot-chat-textarea.mjs +0 -139
  40. package/dist/esm2022/lib/components/chat/copilot-chat-tool-calls-view.mjs +0 -36
  41. package/dist/esm2022/lib/components/chat/copilot-chat-toolbar.mjs +0 -20
  42. package/dist/esm2022/lib/components/chat/copilot-chat-tools-menu.mjs +0 -203
  43. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-branch-navigation.mjs +0 -118
  44. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-buttons.mjs +0 -182
  45. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-renderer.mjs +0 -28
  46. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-toolbar.mjs +0 -25
  47. package/dist/esm2022/lib/components/chat/copilot-chat-user-message.mjs +0 -328
  48. package/dist/esm2022/lib/components/chat/copilot-chat-user-message.types.mjs +0 -2
  49. package/dist/esm2022/lib/components/chat/copilot-chat-view-disclaimer.mjs +0 -48
  50. package/dist/esm2022/lib/components/chat/copilot-chat-view-feather.mjs +0 -41
  51. package/dist/esm2022/lib/components/chat/copilot-chat-view-handlers.mjs +0 -19
  52. package/dist/esm2022/lib/components/chat/copilot-chat-view-input-container.mjs +0 -96
  53. package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.mjs +0 -89
  54. package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-view.mjs +0 -456
  55. package/dist/esm2022/lib/components/chat/copilot-chat-view.mjs +0 -404
  56. package/dist/esm2022/lib/components/chat/copilot-chat-view.types.mjs +0 -2
  57. package/dist/esm2022/lib/components/chat/copilot-chat.mjs +0 -165
  58. package/dist/esm2022/lib/config.mjs +0 -9
  59. package/dist/esm2022/lib/copilotkit.mjs +0 -125
  60. package/dist/esm2022/lib/directives/copilotkit-agent-context.mjs +0 -130
  61. package/dist/esm2022/lib/directives/stick-to-bottom.mjs +0 -170
  62. package/dist/esm2022/lib/directives/tooltip.mjs +0 -217
  63. package/dist/esm2022/lib/human-in-the-loop.mjs +0 -19
  64. package/dist/esm2022/lib/render-tool-calls.mjs +0 -167
  65. package/dist/esm2022/lib/resize-observer.mjs +0 -152
  66. package/dist/esm2022/lib/scroll-position.mjs +0 -123
  67. package/dist/esm2022/lib/slots/copilot-slot.mjs +0 -156
  68. package/dist/esm2022/lib/slots/index.mjs +0 -4
  69. package/dist/esm2022/lib/slots/slot.types.mjs +0 -6
  70. package/dist/esm2022/lib/slots/slot.utils.mjs +0 -235
  71. package/dist/esm2022/lib/tools.mjs +0 -31
  72. package/dist/esm2022/lib/utils.mjs +0 -10
  73. package/dist/esm2022/public-api.mjs +0 -48
@@ -1,404 +0,0 @@
1
- import { Component, ContentChild, ViewChild, ElementRef, ChangeDetectionStrategy, ViewEncapsulation, computed, signal, input, output, } from "@angular/core";
2
- import { CommonModule } from "@angular/common";
3
- import { CopilotSlot } from "../../slots/copilot-slot";
4
- import { CopilotChatViewScrollView } from "./copilot-chat-view-scroll-view";
5
- import { CopilotChatViewScrollToBottomButton } from "./copilot-chat-view-scroll-to-bottom-button";
6
- import { CopilotChatViewFeather } from "./copilot-chat-view-feather";
7
- import { CopilotChatViewInputContainer } from "./copilot-chat-view-input-container";
8
- import { CopilotChatViewDisclaimer } from "./copilot-chat-view-disclaimer";
9
- import { cn } from "../../utils";
10
- import { ResizeObserverService } from "../../resize-observer";
11
- import { CopilotChatViewHandlers } from "./copilot-chat-view-handlers";
12
- import { Subject } from "rxjs";
13
- import { takeUntil } from "rxjs/operators";
14
- import * as i0 from "@angular/core";
15
- import * as i1 from "../../resize-observer";
16
- import * as i2 from "./copilot-chat-view-handlers";
17
- import * as i3 from "@angular/common";
18
- /**
19
- * CopilotChatView component - Angular port of the React component.
20
- * A complete chat interface with message feed and input components.
21
- *
22
- * @example
23
- * ```html
24
- * <copilot-chat-view
25
- * [messages]="messages"
26
- * [autoScroll]="true"
27
- * [messageViewProps]="{ assistantMessage: { onThumbsUp: handleThumbsUp } }">
28
- * </copilot-chat-view>
29
- * ```
30
- */
31
- export class CopilotChatView {
32
- resizeObserverService;
33
- cdr;
34
- handlers;
35
- // Core inputs matching React props
36
- messages = input([]);
37
- autoScroll = input(true);
38
- showCursor = input(false);
39
- // MessageView slot inputs
40
- messageViewComponent = input(undefined);
41
- messageViewTemplate = input(undefined);
42
- messageViewClass = input(undefined);
43
- // ScrollView slot inputs
44
- scrollViewComponent = input(undefined);
45
- scrollViewTemplate = input(undefined);
46
- scrollViewClass = input(undefined);
47
- // ScrollToBottomButton slot inputs
48
- scrollToBottomButtonComponent = input(undefined);
49
- scrollToBottomButtonTemplate = input(undefined);
50
- scrollToBottomButtonClass = input(undefined);
51
- // Input slot inputs
52
- inputComponent = input(undefined);
53
- inputTemplate = input(undefined);
54
- // InputContainer slot inputs
55
- inputContainerComponent = input(undefined);
56
- inputContainerTemplate = input(undefined);
57
- inputContainerClass = input(undefined);
58
- // Feather slot inputs
59
- featherComponent = input(undefined);
60
- featherTemplate = input(undefined);
61
- featherClass = input(undefined);
62
- // Disclaimer slot inputs
63
- disclaimerComponent = input(undefined);
64
- disclaimerTemplate = input(undefined);
65
- disclaimerClass = input(undefined);
66
- disclaimerText = input(undefined);
67
- // Custom layout template (render prop pattern)
68
- customLayoutTemplate;
69
- // Named template slots for deep customization
70
- sendButtonTemplate;
71
- toolbarTemplate;
72
- textAreaTemplate;
73
- audioRecorderTemplate;
74
- assistantMessageMarkdownRendererTemplate;
75
- thumbsUpButtonTemplate;
76
- thumbsDownButtonTemplate;
77
- readAloudButtonTemplate;
78
- regenerateButtonTemplate;
79
- // Output events for assistant message actions (bubbled from child components)
80
- assistantMessageThumbsUp = output();
81
- assistantMessageThumbsDown = output();
82
- assistantMessageReadAloud = output();
83
- assistantMessageRegenerate = output();
84
- // Output events for user message actions (if applicable)
85
- userMessageCopy = output();
86
- userMessageEdit = output();
87
- // ViewChild references
88
- inputContainerSlotRef;
89
- // Default components for slots
90
- defaultScrollViewComponent = CopilotChatViewScrollView;
91
- defaultScrollToBottomButtonComponent = CopilotChatViewScrollToBottomButton;
92
- defaultInputContainerComponent = CopilotChatViewInputContainer;
93
- defaultFeatherComponent = CopilotChatViewFeather;
94
- defaultDisclaimerComponent = CopilotChatViewDisclaimer;
95
- // Signals for reactive state
96
- messagesValue = computed(() => this.messages());
97
- autoScrollSignal = computed(() => this.autoScroll());
98
- showCursorSignal = computed(() => this.showCursor());
99
- disclaimerTextSignal = computed(() => this.disclaimerText());
100
- disclaimerClassSignal = computed(() => this.disclaimerClass());
101
- inputContainerHeight = signal(0);
102
- isResizing = signal(false);
103
- contentPaddingBottom = computed(() => this.inputContainerHeight() + 32);
104
- // Computed signals
105
- computedClass = computed(() => cn("relative h-full"));
106
- // Slot resolution computed signals
107
- messageViewSlot = computed(() => this.messageViewTemplate() || this.messageViewComponent());
108
- scrollViewSlot = computed(() => this.scrollViewTemplate() || this.scrollViewComponent());
109
- scrollToBottomButtonSlot = computed(() => this.scrollToBottomButtonTemplate() ||
110
- this.scrollToBottomButtonComponent());
111
- inputSlot = computed(() => this.inputTemplate() || this.inputComponent());
112
- inputContainerSlot = computed(() => this.inputContainerTemplate() || this.inputContainerComponent());
113
- featherSlot = computed(() => this.featherTemplate() || this.featherComponent());
114
- disclaimerSlot = computed(() => this.disclaimerTemplate() || this.disclaimerComponent());
115
- // Context objects for slots
116
- scrollViewContext = computed(() => ({
117
- autoScroll: this.autoScrollSignal(),
118
- scrollToBottomButton: this.scrollToBottomButtonSlot(),
119
- scrollToBottomButtonClass: this.scrollToBottomButtonClass(),
120
- inputContainerHeight: this.inputContainerHeight(),
121
- isResizing: this.isResizing(),
122
- messages: this.messagesValue(),
123
- messageView: this.messageViewSlot(),
124
- messageViewClass: this.messageViewClass(),
125
- }));
126
- // Removed scrollViewPropsComputed - no longer needed
127
- inputContainerContext = computed(() => ({
128
- input: this.inputSlot(),
129
- disclaimer: this.disclaimerSlot(),
130
- disclaimerText: this.disclaimerTextSignal(),
131
- disclaimerClass: this.disclaimerClassSignal(),
132
- inputContainerClass: this.inputContainerClass(),
133
- }));
134
- // Removed inputContainerPropsComputed - no longer needed
135
- // Layout context for custom templates (render prop pattern)
136
- layoutContext = computed(() => ({
137
- messageView: this.messageViewSlot(),
138
- input: this.inputSlot(),
139
- scrollView: this.scrollViewSlot(),
140
- scrollToBottomButton: this.scrollToBottomButtonSlot(),
141
- feather: this.featherSlot(),
142
- inputContainer: this.inputContainerSlot(),
143
- disclaimer: this.disclaimerSlot(),
144
- }));
145
- destroy$ = new Subject();
146
- resizeTimeoutRef;
147
- constructor(resizeObserverService, cdr, handlers) {
148
- this.resizeObserverService = resizeObserverService;
149
- this.cdr = cdr;
150
- this.handlers = handlers;
151
- // Clear any pending resize timeout when toggling isResizing, without signal writes here
152
- }
153
- ngOnInit() {
154
- // Initialize handler availability in the view-scoped service
155
- // OutputEmitterRef doesn't expose 'observed'; default to true to enable UI affordances
156
- this.handlers.hasAssistantThumbsUpHandler.set(true);
157
- this.handlers.hasAssistantThumbsDownHandler.set(true);
158
- this.handlers.hasAssistantReadAloudHandler.set(true);
159
- this.handlers.hasAssistantRegenerateHandler.set(true);
160
- this.handlers.hasUserCopyHandler.set(true);
161
- this.handlers.hasUserEditHandler.set(true);
162
- }
163
- ngOnChanges() {
164
- // Keep handler availability in sync (assume available)
165
- this.handlers.hasAssistantThumbsUpHandler.set(true);
166
- this.handlers.hasAssistantThumbsDownHandler.set(true);
167
- this.handlers.hasAssistantReadAloudHandler.set(true);
168
- this.handlers.hasAssistantRegenerateHandler.set(true);
169
- this.handlers.hasUserCopyHandler.set(true);
170
- this.handlers.hasUserEditHandler.set(true);
171
- }
172
- ngAfterViewInit() {
173
- // Don't set a default height - measure it dynamically
174
- // Set up input container height monitoring
175
- const measureAndObserve = () => {
176
- if (!this.inputContainerSlotRef ||
177
- !this.inputContainerSlotRef.nativeElement) {
178
- return false;
179
- }
180
- // The slot ref points to the copilot-slot element
181
- // We need to find the actual input container component inside it
182
- const slotElement = this.inputContainerSlotRef.nativeElement;
183
- const componentElement = slotElement.querySelector("copilot-chat-view-input-container");
184
- if (!componentElement) {
185
- return false;
186
- }
187
- // Look for the absolute positioned div that contains the input
188
- let innerDiv = componentElement.querySelector("div.absolute");
189
- // If not found by class, try first child
190
- if (!innerDiv) {
191
- innerDiv = componentElement.firstElementChild;
192
- }
193
- if (!innerDiv) {
194
- return false;
195
- }
196
- // Measure the actual height
197
- const measuredHeight = innerDiv.offsetHeight;
198
- if (measuredHeight === 0) {
199
- return false;
200
- }
201
- // Success! Set the initial height
202
- this.inputContainerHeight.set(measuredHeight);
203
- this.cdr.detectChanges();
204
- // Create an ElementRef wrapper for ResizeObserver
205
- const innerDivRef = new ElementRef(innerDiv);
206
- // Set up ResizeObserver to track changes
207
- this.resizeObserverService
208
- .observeElement(innerDivRef, 0, 250)
209
- .pipe(takeUntil(this.destroy$))
210
- .subscribe((state) => {
211
- const newHeight = state.height;
212
- if (newHeight !== this.inputContainerHeight() && newHeight > 0) {
213
- this.inputContainerHeight.set(newHeight);
214
- this.isResizing.set(true);
215
- this.cdr.detectChanges();
216
- // Clear existing timeout
217
- if (this.resizeTimeoutRef) {
218
- clearTimeout(this.resizeTimeoutRef);
219
- }
220
- // Set isResizing to false after a short delay
221
- this.resizeTimeoutRef = window.setTimeout(() => {
222
- this.isResizing.set(false);
223
- this.resizeTimeoutRef = undefined;
224
- this.cdr.detectChanges();
225
- }, 250);
226
- }
227
- });
228
- return true;
229
- };
230
- // Try to measure immediately
231
- if (!measureAndObserve()) {
232
- // If failed, retry with increasing delays
233
- let attempts = 0;
234
- const maxAttempts = 10;
235
- const retry = () => {
236
- attempts++;
237
- if (measureAndObserve()) {
238
- // Successfully measured
239
- }
240
- else if (attempts < maxAttempts) {
241
- // Exponential backoff: 50ms, 100ms, 200ms, 400ms, etc.
242
- const delay = 50 * Math.pow(2, Math.min(attempts - 1, 4));
243
- setTimeout(retry, delay);
244
- }
245
- else {
246
- // Failed to measure after max attempts
247
- }
248
- };
249
- // Start retry with first delay
250
- setTimeout(retry, 50);
251
- }
252
- }
253
- ngOnDestroy() {
254
- if (this.resizeTimeoutRef) {
255
- clearTimeout(this.resizeTimeoutRef);
256
- }
257
- this.destroy$.next();
258
- this.destroy$.complete();
259
- }
260
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CopilotChatView, deps: [{ token: i1.ResizeObserverService }, { token: i0.ChangeDetectorRef }, { token: i2.CopilotChatViewHandlers }], target: i0.ɵɵFactoryTarget.Component });
261
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CopilotChatView, isStandalone: true, selector: "copilot-chat-view", inputs: { messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null }, autoScroll: { classPropertyName: "autoScroll", publicName: "autoScroll", isSignal: true, isRequired: false, transformFunction: null }, showCursor: { classPropertyName: "showCursor", publicName: "showCursor", isSignal: true, isRequired: false, transformFunction: null }, messageViewComponent: { classPropertyName: "messageViewComponent", publicName: "messageViewComponent", isSignal: true, isRequired: false, transformFunction: null }, messageViewTemplate: { classPropertyName: "messageViewTemplate", publicName: "messageViewTemplate", isSignal: true, isRequired: false, transformFunction: null }, messageViewClass: { classPropertyName: "messageViewClass", publicName: "messageViewClass", isSignal: true, isRequired: false, transformFunction: null }, scrollViewComponent: { classPropertyName: "scrollViewComponent", publicName: "scrollViewComponent", isSignal: true, isRequired: false, transformFunction: null }, scrollViewTemplate: { classPropertyName: "scrollViewTemplate", publicName: "scrollViewTemplate", isSignal: true, isRequired: false, transformFunction: null }, scrollViewClass: { classPropertyName: "scrollViewClass", publicName: "scrollViewClass", isSignal: true, isRequired: false, transformFunction: null }, scrollToBottomButtonComponent: { classPropertyName: "scrollToBottomButtonComponent", publicName: "scrollToBottomButtonComponent", isSignal: true, isRequired: false, transformFunction: null }, scrollToBottomButtonTemplate: { classPropertyName: "scrollToBottomButtonTemplate", publicName: "scrollToBottomButtonTemplate", isSignal: true, isRequired: false, transformFunction: null }, scrollToBottomButtonClass: { classPropertyName: "scrollToBottomButtonClass", publicName: "scrollToBottomButtonClass", isSignal: true, isRequired: false, transformFunction: null }, inputComponent: { classPropertyName: "inputComponent", publicName: "inputComponent", isSignal: true, isRequired: false, transformFunction: null }, inputTemplate: { classPropertyName: "inputTemplate", publicName: "inputTemplate", isSignal: true, isRequired: false, transformFunction: null }, inputContainerComponent: { classPropertyName: "inputContainerComponent", publicName: "inputContainerComponent", isSignal: true, isRequired: false, transformFunction: null }, inputContainerTemplate: { classPropertyName: "inputContainerTemplate", publicName: "inputContainerTemplate", isSignal: true, isRequired: false, transformFunction: null }, inputContainerClass: { classPropertyName: "inputContainerClass", publicName: "inputContainerClass", isSignal: true, isRequired: false, transformFunction: null }, featherComponent: { classPropertyName: "featherComponent", publicName: "featherComponent", isSignal: true, isRequired: false, transformFunction: null }, featherTemplate: { classPropertyName: "featherTemplate", publicName: "featherTemplate", isSignal: true, isRequired: false, transformFunction: null }, featherClass: { classPropertyName: "featherClass", publicName: "featherClass", isSignal: true, isRequired: false, transformFunction: null }, disclaimerComponent: { classPropertyName: "disclaimerComponent", publicName: "disclaimerComponent", isSignal: true, isRequired: false, transformFunction: null }, disclaimerTemplate: { classPropertyName: "disclaimerTemplate", publicName: "disclaimerTemplate", isSignal: true, isRequired: false, transformFunction: null }, disclaimerClass: { classPropertyName: "disclaimerClass", publicName: "disclaimerClass", isSignal: true, isRequired: false, transformFunction: null }, disclaimerText: { classPropertyName: "disclaimerText", publicName: "disclaimerText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { assistantMessageThumbsUp: "assistantMessageThumbsUp", assistantMessageThumbsDown: "assistantMessageThumbsDown", assistantMessageReadAloud: "assistantMessageReadAloud", assistantMessageRegenerate: "assistantMessageRegenerate", userMessageCopy: "userMessageCopy", userMessageEdit: "userMessageEdit" }, providers: [ResizeObserverService, CopilotChatViewHandlers], queries: [{ propertyName: "customLayoutTemplate", first: true, predicate: ["customLayout"], descendants: true }, { propertyName: "sendButtonTemplate", first: true, predicate: ["sendButton"], descendants: true }, { propertyName: "toolbarTemplate", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "textAreaTemplate", first: true, predicate: ["textArea"], descendants: true }, { propertyName: "audioRecorderTemplate", first: true, predicate: ["audioRecorder"], descendants: true }, { propertyName: "assistantMessageMarkdownRendererTemplate", first: true, predicate: ["assistantMessageMarkdownRenderer"], descendants: true }, { propertyName: "thumbsUpButtonTemplate", first: true, predicate: ["thumbsUpButton"], descendants: true }, { propertyName: "thumbsDownButtonTemplate", first: true, predicate: ["thumbsDownButton"], descendants: true }, { propertyName: "readAloudButtonTemplate", first: true, predicate: ["readAloudButton"], descendants: true }, { propertyName: "regenerateButtonTemplate", first: true, predicate: ["regenerateButton"], descendants: true }], viewQueries: [{ propertyName: "inputContainerSlotRef", first: true, predicate: ["inputContainerSlotRef"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: `
262
- <!-- Custom layout template support (render prop pattern) -->
263
- @if (customLayoutTemplate) {
264
- <ng-container
265
- [ngTemplateOutlet]="customLayoutTemplate"
266
- [ngTemplateOutletContext]="layoutContext()"
267
- ></ng-container>
268
- } @else {
269
- <!-- Default layout - exact React DOM structure -->
270
- <div [class]="computedClass()">
271
- <!-- ScrollView -->
272
- <copilot-chat-view-scroll-view
273
- [autoScroll]="autoScrollSignal()"
274
- [inputContainerHeight]="inputContainerHeight()"
275
- [isResizing]="isResizing()"
276
- [messages]="messagesValue()"
277
- [messageView]="messageViewSlot()"
278
- [messageViewClass]="messageViewClass()"
279
- [scrollToBottomButton]="scrollToBottomButtonSlot()"
280
- [scrollToBottomButtonClass]="scrollToBottomButtonClass()"
281
- [showCursor]="showCursorSignal()"
282
- (assistantMessageThumbsUp)="assistantMessageThumbsUp.emit($event)"
283
- (assistantMessageThumbsDown)="assistantMessageThumbsDown.emit($event)"
284
- (assistantMessageReadAloud)="assistantMessageReadAloud.emit($event)"
285
- (assistantMessageRegenerate)="assistantMessageRegenerate.emit($event)"
286
- (userMessageCopy)="userMessageCopy.emit($event)"
287
- (userMessageEdit)="userMessageEdit.emit($event)"
288
- >
289
- </copilot-chat-view-scroll-view>
290
-
291
- <!-- Feather effect -->
292
- <copilot-slot
293
- [slot]="featherSlot()"
294
- [context]="{ inputClass: featherClass }"
295
- [defaultComponent]="defaultFeatherComponent"
296
- >
297
- </copilot-slot>
298
-
299
- <!-- Input container -->
300
- <copilot-slot
301
- #inputContainerSlotRef
302
- [slot]="inputContainerSlot()"
303
- [context]="inputContainerContext()"
304
- [defaultComponent]="defaultInputContainerComponent"
305
- >
306
- </copilot-slot>
307
- </div>
308
- }
309
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CopilotSlot, selector: "copilot-slot", inputs: ["slot", "context", "defaultComponent", "outputs"] }, { kind: "component", type: CopilotChatViewScrollView, selector: "copilot-chat-view-scroll-view", inputs: ["autoScroll", "inputContainerHeight", "isResizing", "inputClass", "messages", "messageView", "messageViewClass", "showCursor", "scrollToBottomButton", "scrollToBottomButtonClass"], outputs: ["assistantMessageThumbsUp", "assistantMessageThumbsDown", "assistantMessageReadAloud", "assistantMessageRegenerate", "userMessageCopy", "userMessageEdit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
310
- }
311
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CopilotChatView, decorators: [{
312
- type: Component,
313
- args: [{
314
- standalone: true,
315
- selector: "copilot-chat-view",
316
- imports: [CommonModule, CopilotSlot, CopilotChatViewScrollView],
317
- changeDetection: ChangeDetectionStrategy.OnPush,
318
- encapsulation: ViewEncapsulation.None,
319
- providers: [ResizeObserverService, CopilotChatViewHandlers],
320
- template: `
321
- <!-- Custom layout template support (render prop pattern) -->
322
- @if (customLayoutTemplate) {
323
- <ng-container
324
- [ngTemplateOutlet]="customLayoutTemplate"
325
- [ngTemplateOutletContext]="layoutContext()"
326
- ></ng-container>
327
- } @else {
328
- <!-- Default layout - exact React DOM structure -->
329
- <div [class]="computedClass()">
330
- <!-- ScrollView -->
331
- <copilot-chat-view-scroll-view
332
- [autoScroll]="autoScrollSignal()"
333
- [inputContainerHeight]="inputContainerHeight()"
334
- [isResizing]="isResizing()"
335
- [messages]="messagesValue()"
336
- [messageView]="messageViewSlot()"
337
- [messageViewClass]="messageViewClass()"
338
- [scrollToBottomButton]="scrollToBottomButtonSlot()"
339
- [scrollToBottomButtonClass]="scrollToBottomButtonClass()"
340
- [showCursor]="showCursorSignal()"
341
- (assistantMessageThumbsUp)="assistantMessageThumbsUp.emit($event)"
342
- (assistantMessageThumbsDown)="assistantMessageThumbsDown.emit($event)"
343
- (assistantMessageReadAloud)="assistantMessageReadAloud.emit($event)"
344
- (assistantMessageRegenerate)="assistantMessageRegenerate.emit($event)"
345
- (userMessageCopy)="userMessageCopy.emit($event)"
346
- (userMessageEdit)="userMessageEdit.emit($event)"
347
- >
348
- </copilot-chat-view-scroll-view>
349
-
350
- <!-- Feather effect -->
351
- <copilot-slot
352
- [slot]="featherSlot()"
353
- [context]="{ inputClass: featherClass }"
354
- [defaultComponent]="defaultFeatherComponent"
355
- >
356
- </copilot-slot>
357
-
358
- <!-- Input container -->
359
- <copilot-slot
360
- #inputContainerSlotRef
361
- [slot]="inputContainerSlot()"
362
- [context]="inputContainerContext()"
363
- [defaultComponent]="defaultInputContainerComponent"
364
- >
365
- </copilot-slot>
366
- </div>
367
- }
368
- `,
369
- }]
370
- }], ctorParameters: () => [{ type: i1.ResizeObserverService }, { type: i0.ChangeDetectorRef }, { type: i2.CopilotChatViewHandlers }], propDecorators: { customLayoutTemplate: [{
371
- type: ContentChild,
372
- args: ["customLayout"]
373
- }], sendButtonTemplate: [{
374
- type: ContentChild,
375
- args: ["sendButton"]
376
- }], toolbarTemplate: [{
377
- type: ContentChild,
378
- args: ["toolbar"]
379
- }], textAreaTemplate: [{
380
- type: ContentChild,
381
- args: ["textArea"]
382
- }], audioRecorderTemplate: [{
383
- type: ContentChild,
384
- args: ["audioRecorder"]
385
- }], assistantMessageMarkdownRendererTemplate: [{
386
- type: ContentChild,
387
- args: ["assistantMessageMarkdownRenderer"]
388
- }], thumbsUpButtonTemplate: [{
389
- type: ContentChild,
390
- args: ["thumbsUpButton"]
391
- }], thumbsDownButtonTemplate: [{
392
- type: ContentChild,
393
- args: ["thumbsDownButton"]
394
- }], readAloudButtonTemplate: [{
395
- type: ContentChild,
396
- args: ["readAloudButton"]
397
- }], regenerateButtonTemplate: [{
398
- type: ContentChild,
399
- args: ["regenerateButton"]
400
- }], inputContainerSlotRef: [{
401
- type: ViewChild,
402
- args: ["inputContainerSlotRef", { read: ElementRef }]
403
- }] } });
404
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LXZpZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFHWixTQUFTLEVBQ1QsVUFBVSxFQUNWLHVCQUF1QixFQUV2QixpQkFBaUIsRUFDakIsUUFBUSxFQUNSLE1BQU0sRUFLTixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDNUUsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbEcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFM0UsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFFM0M7Ozs7Ozs7Ozs7OztHQVlHO0FBMERILE1BQU0sT0FBTyxlQUFlO0lBc0toQjtJQUNBO0lBQ0E7SUFyS1YsbUNBQW1DO0lBQ25DLFFBQVEsR0FBRyxLQUFLLENBQVksRUFBRSxDQUFDLENBQUM7SUFDaEMsVUFBVSxHQUFHLEtBQUssQ0FBVSxJQUFJLENBQUMsQ0FBQztJQUNsQyxVQUFVLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRW5DLDBCQUEwQjtJQUMxQixvQkFBb0IsR0FBRyxLQUFLLENBQXdCLFNBQVMsQ0FBQyxDQUFDO0lBQy9ELG1CQUFtQixHQUFHLEtBQUssQ0FBK0IsU0FBUyxDQUFDLENBQUM7SUFDckUsZ0JBQWdCLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUV4RCx5QkFBeUI7SUFDekIsbUJBQW1CLEdBQUcsS0FBSyxDQUF3QixTQUFTLENBQUMsQ0FBQztJQUM5RCxrQkFBa0IsR0FBRyxLQUFLLENBQStCLFNBQVMsQ0FBQyxDQUFDO0lBQ3BFLGVBQWUsR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBRXZELG1DQUFtQztJQUNuQyw2QkFBNkIsR0FBRyxLQUFLLENBQXdCLFNBQVMsQ0FBQyxDQUFDO0lBQ3hFLDRCQUE0QixHQUFHLEtBQUssQ0FBK0IsU0FBUyxDQUFDLENBQUM7SUFDOUUseUJBQXlCLEdBQUcsS0FBSyxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUVqRSxvQkFBb0I7SUFDcEIsY0FBYyxHQUFHLEtBQUssQ0FBd0IsU0FBUyxDQUFDLENBQUM7SUFDekQsYUFBYSxHQUFHLEtBQUssQ0FBK0IsU0FBUyxDQUFDLENBQUM7SUFFL0QsNkJBQTZCO0lBQzdCLHVCQUF1QixHQUFHLEtBQUssQ0FBd0IsU0FBUyxDQUFDLENBQUM7SUFDbEUsc0JBQXNCLEdBQUcsS0FBSyxDQUErQixTQUFTLENBQUMsQ0FBQztJQUN4RSxtQkFBbUIsR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBRTNELHNCQUFzQjtJQUN0QixnQkFBZ0IsR0FBRyxLQUFLLENBQXdCLFNBQVMsQ0FBQyxDQUFDO0lBQzNELGVBQWUsR0FBRyxLQUFLLENBQStCLFNBQVMsQ0FBQyxDQUFDO0lBQ2pFLFlBQVksR0FBRyxLQUFLLENBQXFCLFNBQVMsQ0FBQyxDQUFDO0lBRXBELHlCQUF5QjtJQUN6QixtQkFBbUIsR0FBRyxLQUFLLENBQXdCLFNBQVMsQ0FBQyxDQUFDO0lBQzlELGtCQUFrQixHQUFHLEtBQUssQ0FBK0IsU0FBUyxDQUFDLENBQUM7SUFDcEUsZUFBZSxHQUFHLEtBQUssQ0FBcUIsU0FBUyxDQUFDLENBQUM7SUFDdkQsY0FBYyxHQUFHLEtBQUssQ0FBcUIsU0FBUyxDQUFDLENBQUM7SUFFdEQsK0NBQStDO0lBQ2pCLG9CQUFvQixDQUFvQjtJQUV0RSw4Q0FBOEM7SUFDbEIsa0JBQWtCLENBQW9CO0lBQ3pDLGVBQWUsQ0FBb0I7SUFDbEMsZ0JBQWdCLENBQW9CO0lBQy9CLHFCQUFxQixDQUFvQjtJQUV4RSx3Q0FBd0MsQ0FBb0I7SUFDNUIsc0JBQXNCLENBQW9CO0lBQ3hDLHdCQUF3QixDQUFvQjtJQUM3Qyx1QkFBdUIsQ0FBb0I7SUFDMUMsd0JBQXdCLENBQW9CO0lBRTlFLDhFQUE4RTtJQUM5RSx3QkFBd0IsR0FBRyxNQUFNLEVBQXdCLENBQUM7SUFDMUQsMEJBQTBCLEdBQUcsTUFBTSxFQUF3QixDQUFDO0lBQzVELHlCQUF5QixHQUFHLE1BQU0sRUFBd0IsQ0FBQztJQUMzRCwwQkFBMEIsR0FBRyxNQUFNLEVBQXdCLENBQUM7SUFFNUQseURBQXlEO0lBQ3pELGVBQWUsR0FBRyxNQUFNLEVBQXdCLENBQUM7SUFDakQsZUFBZSxHQUFHLE1BQU0sRUFBd0IsQ0FBQztJQUVqRCx1QkFBdUI7SUFFdkIscUJBQXFCLENBQWM7SUFFbkMsK0JBQStCO0lBQ1osMEJBQTBCLEdBQUcseUJBQXlCLENBQUM7SUFDdkQsb0NBQW9DLEdBQ3JELG1DQUFtQyxDQUFDO0lBQ25CLDhCQUE4QixHQUMvQyw2QkFBNkIsQ0FBQztJQUNiLHVCQUF1QixHQUFHLHNCQUFzQixDQUFDO0lBQ2pELDBCQUEwQixHQUFHLHlCQUF5QixDQUFDO0lBRTFFLDZCQUE2QjtJQUNuQixhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNyRCxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDckQsb0JBQW9CLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQzdELHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztJQUMvRCxvQkFBb0IsR0FBRyxNQUFNLENBQVMsQ0FBQyxDQUFDLENBQUM7SUFDekMsVUFBVSxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUNwQyxvQkFBb0IsR0FBRyxRQUFRLENBQ3ZDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsQ0FDdkMsQ0FBQztJQUVGLG1CQUFtQjtJQUNULGFBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUVoRSxtQ0FBbUM7SUFDekIsZUFBZSxHQUFHLFFBQVEsQ0FDbEMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQ2hFLENBQUM7SUFFUSxjQUFjLEdBQUcsUUFBUSxDQUNqQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FDOUQsQ0FBQztJQUVRLHdCQUF3QixHQUFHLFFBQVEsQ0FDM0MsR0FBRyxFQUFFLENBQ0gsSUFBSSxDQUFDLDRCQUE0QixFQUFFO1FBQ25DLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUN2QyxDQUFDO0lBRVEsU0FBUyxHQUFHLFFBQVEsQ0FDNUIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FDcEQsQ0FBQztJQUVRLGtCQUFrQixHQUFHLFFBQVEsQ0FDckMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQ3RFLENBQUM7SUFFUSxXQUFXLEdBQUcsUUFBUSxDQUM5QixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQ3hELENBQUM7SUFFUSxjQUFjLEdBQUcsUUFBUSxDQUNqQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FDOUQsQ0FBQztJQUVGLDRCQUE0QjtJQUNsQixpQkFBaUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1QyxVQUFVLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1FBQ25DLG9CQUFvQixFQUFFLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtRQUNyRCx5QkFBeUIsRUFBRSxJQUFJLENBQUMseUJBQXlCLEVBQUU7UUFDM0Qsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1FBQ2pELFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFO1FBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFO1FBQzlCLFdBQVcsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFO1FBQ25DLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtLQUMxQyxDQUFDLENBQUMsQ0FBQztJQUVKLHFEQUFxRDtJQUUzQyxxQkFBcUIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoRCxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRTtRQUN2QixVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRTtRQUNqQyxjQUFjLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1FBQzNDLGVBQWUsRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUU7UUFDN0MsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFO0tBQ2hELENBQUMsQ0FBQyxDQUFDO0lBRUoseURBQXlEO0lBRXpELDREQUE0RDtJQUNsRCxhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDeEMsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUU7UUFDbkMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUU7UUFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDakMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixFQUFFO1FBQ3JELE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFO1FBQzNCLGNBQWMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7UUFDekMsVUFBVSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUU7S0FDbEMsQ0FBQyxDQUFDLENBQUM7SUFFSSxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUMvQixnQkFBZ0IsQ0FBVTtJQUVsQyxZQUNVLHFCQUE0QyxFQUM1QyxHQUFzQixFQUN0QixRQUFpQztRQUZqQywwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBQzVDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQXlCO1FBRXpDLHdGQUF3RjtJQUMxRixDQUFDO0lBRUQsUUFBUTtRQUNOLDZEQUE2RDtRQUM3RCx1RkFBdUY7UUFDdkYsSUFBSSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELFdBQVc7UUFDVCx1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGVBQWU7UUFDYixzREFBc0Q7UUFFdEQsMkNBQTJDO1FBQzNDLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxFQUFFO1lBQzdCLElBQ0UsQ0FBQyxJQUFJLENBQUMscUJBQXFCO2dCQUMzQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLEVBQ3pDLENBQUM7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsa0RBQWtEO1lBQ2xELGlFQUFpRTtZQUNqRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDO1lBQzdELE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FDaEQsbUNBQW1DLENBQ3BDLENBQUM7WUFFRixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsK0RBQStEO1lBQy9ELElBQUksUUFBUSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FDM0MsY0FBYyxDQUNBLENBQUM7WUFFakIseUNBQXlDO1lBQ3pDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsaUJBQWdDLENBQUM7WUFDL0QsQ0FBQztZQUVELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCw0QkFBNEI7WUFDNUIsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztZQUU3QyxJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsa0NBQWtDO1lBQ2xDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUV6QixrREFBa0Q7WUFDbEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFN0MseUNBQXlDO1lBQ3pDLElBQUksQ0FBQyxxQkFBcUI7aUJBQ3ZCLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQztpQkFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQzlCLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNuQixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUUvQixJQUFJLFNBQVMsS0FBSyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQy9ELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUV6Qix5QkFBeUI7b0JBQ3pCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7d0JBQzFCLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDdEMsQ0FBQztvQkFFRCw4Q0FBOEM7b0JBQzlDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTt3QkFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzNCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7d0JBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQzNCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDVixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFTCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQztRQUVGLDZCQUE2QjtRQUM3QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO1lBQ3pCLDBDQUEwQztZQUMxQyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDakIsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBRXZCLE1BQU0sS0FBSyxHQUFHLEdBQUcsRUFBRTtnQkFDakIsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxpQkFBaUIsRUFBRSxFQUFFLENBQUM7b0JBQ3hCLHdCQUF3QjtnQkFDMUIsQ0FBQztxQkFBTSxJQUFJLFFBQVEsR0FBRyxXQUFXLEVBQUUsQ0FBQztvQkFDbEMsdURBQXVEO29CQUN2RCxNQUFNLEtBQUssR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzFELFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzNCLENBQUM7cUJBQU0sQ0FBQztvQkFDTix1Q0FBdUM7Z0JBQ3pDLENBQUM7WUFDSCxDQUFDLENBQUM7WUFFRiwrQkFBK0I7WUFDL0IsVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFCLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7d0dBaFRVLGVBQWU7NEZBQWYsZUFBZSw4aklBbkRmLENBQUMscUJBQXFCLEVBQUUsdUJBQXVCLENBQUMsb3NDQXdIZixVQUFVLGtEQXZINUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdEVCwyREFwRFMsWUFBWSxzTUFBRSxXQUFXLHFIQUFFLHlCQUF5Qjs7NEZBc0RuRCxlQUFlO2tCQXpEM0IsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSx5QkFBeUIsQ0FBQztvQkFDL0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO29CQUNyQyxTQUFTLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSx1QkFBdUIsQ0FBQztvQkFDM0QsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnRFQ7aUJBQ0Y7Z0tBNkMrQixvQkFBb0I7c0JBQWpELFlBQVk7dUJBQUMsY0FBYztnQkFHQSxrQkFBa0I7c0JBQTdDLFlBQVk7dUJBQUMsWUFBWTtnQkFDRCxlQUFlO3NCQUF2QyxZQUFZO3VCQUFDLFNBQVM7Z0JBQ0csZ0JBQWdCO3NCQUF6QyxZQUFZO3VCQUFDLFVBQVU7Z0JBQ08scUJBQXFCO3NCQUFuRCxZQUFZO3VCQUFDLGVBQWU7Z0JBRTdCLHdDQUF3QztzQkFEdkMsWUFBWTt1QkFBQyxrQ0FBa0M7Z0JBRWhCLHNCQUFzQjtzQkFBckQsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBQ0ksd0JBQXdCO3NCQUF6RCxZQUFZO3VCQUFDLGtCQUFrQjtnQkFDQyx1QkFBdUI7c0JBQXZELFlBQVk7dUJBQUMsaUJBQWlCO2dCQUNHLHdCQUF3QjtzQkFBekQsWUFBWTt1QkFBQyxrQkFBa0I7Z0JBY2hDLHFCQUFxQjtzQkFEcEIsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgVGVtcGxhdGVSZWYsXG4gIFR5cGUsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgY29tcHV0ZWQsXG4gIHNpZ25hbCxcbiAgT25Jbml0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IENvcGlsb3RTbG90IH0gZnJvbSBcIi4uLy4uL3Nsb3RzL2NvcGlsb3Qtc2xvdFwiO1xuaW1wb3J0IHsgQ29waWxvdENoYXRWaWV3U2Nyb2xsVmlldyB9IGZyb20gXCIuL2NvcGlsb3QtY2hhdC12aWV3LXNjcm9sbC12aWV3XCI7XG5pbXBvcnQgeyBDb3BpbG90Q2hhdFZpZXdTY3JvbGxUb0JvdHRvbUJ1dHRvbiB9IGZyb20gXCIuL2NvcGlsb3QtY2hhdC12aWV3LXNjcm9sbC10by1ib3R0b20tYnV0dG9uXCI7XG5pbXBvcnQgeyBDb3BpbG90Q2hhdFZpZXdGZWF0aGVyIH0gZnJvbSBcIi4vY29waWxvdC1jaGF0LXZpZXctZmVhdGhlclwiO1xuaW1wb3J0IHsgQ29waWxvdENoYXRWaWV3SW5wdXRDb250YWluZXIgfSBmcm9tIFwiLi9jb3BpbG90LWNoYXQtdmlldy1pbnB1dC1jb250YWluZXJcIjtcbmltcG9ydCB7IENvcGlsb3RDaGF0Vmlld0Rpc2NsYWltZXIgfSBmcm9tIFwiLi9jb3BpbG90LWNoYXQtdmlldy1kaXNjbGFpbWVyXCI7XG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSBcIkBhZy11aS9jbGllbnRcIjtcbmltcG9ydCB7IGNuIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBSZXNpemVPYnNlcnZlclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vcmVzaXplLW9ic2VydmVyXCI7XG5pbXBvcnQgeyBDb3BpbG90Q2hhdFZpZXdIYW5kbGVycyB9IGZyb20gXCIuL2NvcGlsb3QtY2hhdC12aWV3LWhhbmRsZXJzXCI7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG4vKipcbiAqIENvcGlsb3RDaGF0VmlldyBjb21wb25lbnQgLSBBbmd1bGFyIHBvcnQgb2YgdGhlIFJlYWN0IGNvbXBvbmVudC5cbiAqIEEgY29tcGxldGUgY2hhdCBpbnRlcmZhY2Ugd2l0aCBtZXNzYWdlIGZlZWQgYW5kIGlucHV0IGNvbXBvbmVudHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxjb3BpbG90LWNoYXQtdmlld1xuICogICBbbWVzc2FnZXNdPVwibWVzc2FnZXNcIlxuICogICBbYXV0b1Njcm9sbF09XCJ0cnVlXCJcbiAqICAgW21lc3NhZ2VWaWV3UHJvcHNdPVwieyBhc3Npc3RhbnRNZXNzYWdlOiB7IG9uVGh1bWJzVXA6IGhhbmRsZVRodW1ic1VwIH0gfVwiPlxuICogPC9jb3BpbG90LWNoYXQtdmlldz5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6IFwiY29waWxvdC1jaGF0LXZpZXdcIixcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQ29waWxvdFNsb3QsIENvcGlsb3RDaGF0Vmlld1Njcm9sbFZpZXddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJvdmlkZXJzOiBbUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlLCBDb3BpbG90Q2hhdFZpZXdIYW5kbGVyc10sXG4gIHRlbXBsYXRlOiBgXG4gICAgPCEtLSBDdXN0b20gbGF5b3V0IHRlbXBsYXRlIHN1cHBvcnQgKHJlbmRlciBwcm9wIHBhdHRlcm4pIC0tPlxuICAgIEBpZiAoY3VzdG9tTGF5b3V0VGVtcGxhdGUpIHtcbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tTGF5b3V0VGVtcGxhdGVcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwibGF5b3V0Q29udGV4dCgpXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDwhLS0gRGVmYXVsdCBsYXlvdXQgLSBleGFjdCBSZWFjdCBET00gc3RydWN0dXJlIC0tPlxuICAgICAgPGRpdiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzcygpXCI+XG4gICAgICAgIDwhLS0gU2Nyb2xsVmlldyAtLT5cbiAgICAgICAgPGNvcGlsb3QtY2hhdC12aWV3LXNjcm9sbC12aWV3XG4gICAgICAgICAgW2F1dG9TY3JvbGxdPVwiYXV0b1Njcm9sbFNpZ25hbCgpXCJcbiAgICAgICAgICBbaW5wdXRDb250YWluZXJIZWlnaHRdPVwiaW5wdXRDb250YWluZXJIZWlnaHQoKVwiXG4gICAgICAgICAgW2lzUmVzaXppbmddPVwiaXNSZXNpemluZygpXCJcbiAgICAgICAgICBbbWVzc2FnZXNdPVwibWVzc2FnZXNWYWx1ZSgpXCJcbiAgICAgICAgICBbbWVzc2FnZVZpZXddPVwibWVzc2FnZVZpZXdTbG90KClcIlxuICAgICAgICAgIFttZXNzYWdlVmlld0NsYXNzXT1cIm1lc3NhZ2VWaWV3Q2xhc3MoKVwiXG4gICAgICAgICAgW3Njcm9sbFRvQm90dG9tQnV0dG9uXT1cInNjcm9sbFRvQm90dG9tQnV0dG9uU2xvdCgpXCJcbiAgICAgICAgICBbc2Nyb2xsVG9Cb3R0b21CdXR0b25DbGFzc109XCJzY3JvbGxUb0JvdHRvbUJ1dHRvbkNsYXNzKClcIlxuICAgICAgICAgIFtzaG93Q3Vyc29yXT1cInNob3dDdXJzb3JTaWduYWwoKVwiXG4gICAgICAgICAgKGFzc2lzdGFudE1lc3NhZ2VUaHVtYnNVcCk9XCJhc3Npc3RhbnRNZXNzYWdlVGh1bWJzVXAuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoYXNzaXN0YW50TWVzc2FnZVRodW1ic0Rvd24pPVwiYXNzaXN0YW50TWVzc2FnZVRodW1ic0Rvd24uZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoYXNzaXN0YW50TWVzc2FnZVJlYWRBbG91ZCk9XCJhc3Npc3RhbnRNZXNzYWdlUmVhZEFsb3VkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGFzc2lzdGFudE1lc3NhZ2VSZWdlbmVyYXRlKT1cImFzc2lzdGFudE1lc3NhZ2VSZWdlbmVyYXRlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKHVzZXJNZXNzYWdlQ29weSk9XCJ1c2VyTWVzc2FnZUNvcHkuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAodXNlck1lc3NhZ2VFZGl0KT1cInVzZXJNZXNzYWdlRWRpdC5lbWl0KCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgIDwvY29waWxvdC1jaGF0LXZpZXctc2Nyb2xsLXZpZXc+XG5cbiAgICAgICAgPCEtLSBGZWF0aGVyIGVmZmVjdCAtLT5cbiAgICAgICAgPGNvcGlsb3Qtc2xvdFxuICAgICAgICAgIFtzbG90XT1cImZlYXRoZXJTbG90KClcIlxuICAgICAgICAgIFtjb250ZXh0XT1cInsgaW5wdXRDbGFzczogZmVhdGhlckNsYXNzIH1cIlxuICAgICAgICAgIFtkZWZhdWx0Q29tcG9uZW50XT1cImRlZmF1bHRGZWF0aGVyQ29tcG9uZW50XCJcbiAgICAgICAgPlxuICAgICAgICA8L2NvcGlsb3Qtc2xvdD5cblxuICAgICAgICA8IS0tIElucHV0IGNvbnRhaW5lciAtLT5cbiAgICAgICAgPGNvcGlsb3Qtc2xvdFxuICAgICAgICAgICNpbnB1dENvbnRhaW5lclNsb3RSZWZcbiAgICAgICAgICBbc2xvdF09XCJpbnB1dENvbnRhaW5lclNsb3QoKVwiXG4gICAgICAgICAgW2NvbnRleHRdPVwiaW5wdXRDb250YWluZXJDb250ZXh0KClcIlxuICAgICAgICAgIFtkZWZhdWx0Q29tcG9uZW50XT1cImRlZmF1bHRJbnB1dENvbnRhaW5lckNvbXBvbmVudFwiXG4gICAgICAgID5cbiAgICAgICAgPC9jb3BpbG90LXNsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RDaGF0Vmlld1xuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgLy8gQ29yZSBpbnB1dHMgbWF0Y2hpbmcgUmVhY3QgcHJvcHNcbiAgbWVzc2FnZXMgPSBpbnB1dDxNZXNzYWdlW10+KFtdKTtcbiAgYXV0b1Njcm9sbCA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICBzaG93Q3Vyc29yID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIE1lc3NhZ2VWaWV3IHNsb3QgaW5wdXRzXG4gIG1lc3NhZ2VWaWV3Q29tcG9uZW50ID0gaW5wdXQ8VHlwZTxhbnk+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBtZXNzYWdlVmlld1RlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgbWVzc2FnZVZpZXdDbGFzcyA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAvLyBTY3JvbGxWaWV3IHNsb3QgaW5wdXRzXG4gIHNjcm9sbFZpZXdDb21wb25lbnQgPSBpbnB1dDxUeXBlPGFueT4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHNjcm9sbFZpZXdUZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHNjcm9sbFZpZXdDbGFzcyA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAvLyBTY3JvbGxUb0JvdHRvbUJ1dHRvbiBzbG90IGlucHV0c1xuICBzY3JvbGxUb0JvdHRvbUJ1dHRvbkNvbXBvbmVudCA9IGlucHV0PFR5cGU8YW55PiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgc2Nyb2xsVG9Cb3R0b21CdXR0b25UZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHNjcm9sbFRvQm90dG9tQnV0dG9uQ2xhc3MgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgLy8gSW5wdXQgc2xvdCBpbnB1dHNcbiAgaW5wdXRDb21wb25lbnQgPSBpbnB1dDxUeXBlPGFueT4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGlucHV0VGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxhbnk+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIC8vIElucHV0Q29udGFpbmVyIHNsb3QgaW5wdXRzXG4gIGlucHV0Q29udGFpbmVyQ29tcG9uZW50ID0gaW5wdXQ8VHlwZTxhbnk+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBpbnB1dENvbnRhaW5lclRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgaW5wdXRDb250YWluZXJDbGFzcyA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAvLyBGZWF0aGVyIHNsb3QgaW5wdXRzXG4gIGZlYXRoZXJDb21wb25lbnQgPSBpbnB1dDxUeXBlPGFueT4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGZlYXRoZXJUZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGZlYXRoZXJDbGFzcyA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAvLyBEaXNjbGFpbWVyIHNsb3QgaW5wdXRzXG4gIGRpc2NsYWltZXJDb21wb25lbnQgPSBpbnB1dDxUeXBlPGFueT4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGRpc2NsYWltZXJUZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGRpc2NsYWltZXJDbGFzcyA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgZGlzY2xhaW1lclRleHQgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgLy8gQ3VzdG9tIGxheW91dCB0ZW1wbGF0ZSAocmVuZGVyIHByb3AgcGF0dGVybilcbiAgQENvbnRlbnRDaGlsZChcImN1c3RvbUxheW91dFwiKSBjdXN0b21MYXlvdXRUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLy8gTmFtZWQgdGVtcGxhdGUgc2xvdHMgZm9yIGRlZXAgY3VzdG9taXphdGlvblxuICBAQ29udGVudENoaWxkKFwic2VuZEJ1dHRvblwiKSBzZW5kQnV0dG9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFwidG9vbGJhclwiKSB0b29sYmFyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFwidGV4dEFyZWFcIikgdGV4dEFyZWFUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoXCJhdWRpb1JlY29yZGVyXCIpIGF1ZGlvUmVjb3JkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoXCJhc3Npc3RhbnRNZXNzYWdlTWFya2Rvd25SZW5kZXJlclwiKVxuICBhc3Npc3RhbnRNZXNzYWdlTWFya2Rvd25SZW5kZXJlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChcInRodW1ic1VwQnV0dG9uXCIpIHRodW1ic1VwQnV0dG9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFwidGh1bWJzRG93bkJ1dHRvblwiKSB0aHVtYnNEb3duQnV0dG9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFwicmVhZEFsb3VkQnV0dG9uXCIpIHJlYWRBbG91ZEJ1dHRvblRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChcInJlZ2VuZXJhdGVCdXR0b25cIikgcmVnZW5lcmF0ZUJ1dHRvblRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvLyBPdXRwdXQgZXZlbnRzIGZvciBhc3Npc3RhbnQgbWVzc2FnZSBhY3Rpb25zIChidWJibGVkIGZyb20gY2hpbGQgY29tcG9uZW50cylcbiAgYXNzaXN0YW50TWVzc2FnZVRodW1ic1VwID0gb3V0cHV0PHsgbWVzc2FnZTogTWVzc2FnZSB9PigpO1xuICBhc3Npc3RhbnRNZXNzYWdlVGh1bWJzRG93biA9IG91dHB1dDx7IG1lc3NhZ2U6IE1lc3NhZ2UgfT4oKTtcbiAgYXNzaXN0YW50TWVzc2FnZVJlYWRBbG91ZCA9IG91dHB1dDx7IG1lc3NhZ2U6IE1lc3NhZ2UgfT4oKTtcbiAgYXNzaXN0YW50TWVzc2FnZVJlZ2VuZXJhdGUgPSBvdXRwdXQ8eyBtZXNzYWdlOiBNZXNzYWdlIH0+KCk7XG5cbiAgLy8gT3V0cHV0IGV2ZW50cyBmb3IgdXNlciBtZXNzYWdlIGFjdGlvbnMgKGlmIGFwcGxpY2FibGUpXG4gIHVzZXJNZXNzYWdlQ29weSA9IG91dHB1dDx7IG1lc3NhZ2U6IE1lc3NhZ2UgfT4oKTtcbiAgdXNlck1lc3NhZ2VFZGl0ID0gb3V0cHV0PHsgbWVzc2FnZTogTWVzc2FnZSB9PigpO1xuXG4gIC8vIFZpZXdDaGlsZCByZWZlcmVuY2VzXG4gIEBWaWV3Q2hpbGQoXCJpbnB1dENvbnRhaW5lclNsb3RSZWZcIiwgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIGlucHV0Q29udGFpbmVyU2xvdFJlZj86IEVsZW1lbnRSZWY7XG5cbiAgLy8gRGVmYXVsdCBjb21wb25lbnRzIGZvciBzbG90c1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdFNjcm9sbFZpZXdDb21wb25lbnQgPSBDb3BpbG90Q2hhdFZpZXdTY3JvbGxWaWV3O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdFNjcm9sbFRvQm90dG9tQnV0dG9uQ29tcG9uZW50ID1cbiAgICBDb3BpbG90Q2hhdFZpZXdTY3JvbGxUb0JvdHRvbUJ1dHRvbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlZmF1bHRJbnB1dENvbnRhaW5lckNvbXBvbmVudCA9XG4gICAgQ29waWxvdENoYXRWaWV3SW5wdXRDb250YWluZXI7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0RmVhdGhlckNvbXBvbmVudCA9IENvcGlsb3RDaGF0Vmlld0ZlYXRoZXI7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0RGlzY2xhaW1lckNvbXBvbmVudCA9IENvcGlsb3RDaGF0Vmlld0Rpc2NsYWltZXI7XG5cbiAgLy8gU2lnbmFscyBmb3IgcmVhY3RpdmUgc3RhdGVcbiAgcHJvdGVjdGVkIG1lc3NhZ2VzVmFsdWUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1lc3NhZ2VzKCkpO1xuICBwcm90ZWN0ZWQgYXV0b1Njcm9sbFNpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuYXV0b1Njcm9sbCgpKTtcbiAgcHJvdGVjdGVkIHNob3dDdXJzb3JTaWduYWwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNob3dDdXJzb3IoKSk7XG4gIHByb3RlY3RlZCBkaXNjbGFpbWVyVGV4dFNpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGlzY2xhaW1lclRleHQoKSk7XG4gIHByb3RlY3RlZCBkaXNjbGFpbWVyQ2xhc3NTaWduYWwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRpc2NsYWltZXJDbGFzcygpKTtcbiAgcHJvdGVjdGVkIGlucHV0Q29udGFpbmVySGVpZ2h0ID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByb3RlY3RlZCBpc1Jlc2l6aW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGNvbnRlbnRQYWRkaW5nQm90dG9tID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5pbnB1dENvbnRhaW5lckhlaWdodCgpICsgMzIsXG4gICk7XG5cbiAgLy8gQ29tcHV0ZWQgc2lnbmFsc1xuICBwcm90ZWN0ZWQgY29tcHV0ZWRDbGFzcyA9IGNvbXB1dGVkKCgpID0+IGNuKFwicmVsYXRpdmUgaC1mdWxsXCIpKTtcblxuICAvLyBTbG90IHJlc29sdXRpb24gY29tcHV0ZWQgc2lnbmFsc1xuICBwcm90ZWN0ZWQgbWVzc2FnZVZpZXdTbG90ID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5tZXNzYWdlVmlld1RlbXBsYXRlKCkgfHwgdGhpcy5tZXNzYWdlVmlld0NvbXBvbmVudCgpLFxuICApO1xuXG4gIHByb3RlY3RlZCBzY3JvbGxWaWV3U2xvdCA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuc2Nyb2xsVmlld1RlbXBsYXRlKCkgfHwgdGhpcy5zY3JvbGxWaWV3Q29tcG9uZW50KCksXG4gICk7XG5cbiAgcHJvdGVjdGVkIHNjcm9sbFRvQm90dG9tQnV0dG9uU2xvdCA9IGNvbXB1dGVkKFxuICAgICgpID0+XG4gICAgICB0aGlzLnNjcm9sbFRvQm90dG9tQnV0dG9uVGVtcGxhdGUoKSB8fFxuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbUJ1dHRvbkNvbXBvbmVudCgpLFxuICApO1xuXG4gIHByb3RlY3RlZCBpbnB1dFNsb3QgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLmlucHV0VGVtcGxhdGUoKSB8fCB0aGlzLmlucHV0Q29tcG9uZW50KCksXG4gICk7XG5cbiAgcHJvdGVjdGVkIGlucHV0Q29udGFpbmVyU2xvdCA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuaW5wdXRDb250YWluZXJUZW1wbGF0ZSgpIHx8IHRoaXMuaW5wdXRDb250YWluZXJDb21wb25lbnQoKSxcbiAgKTtcblxuICBwcm90ZWN0ZWQgZmVhdGhlclNsb3QgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLmZlYXRoZXJUZW1wbGF0ZSgpIHx8IHRoaXMuZmVhdGhlckNvbXBvbmVudCgpLFxuICApO1xuXG4gIHByb3RlY3RlZCBkaXNjbGFpbWVyU2xvdCA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuZGlzY2xhaW1lclRlbXBsYXRlKCkgfHwgdGhpcy5kaXNjbGFpbWVyQ29tcG9uZW50KCksXG4gICk7XG5cbiAgLy8gQ29udGV4dCBvYmplY3RzIGZvciBzbG90c1xuICBwcm90ZWN0ZWQgc2Nyb2xsVmlld0NvbnRleHQgPSBjb21wdXRlZCgoKSA9PiAoe1xuICAgIGF1dG9TY3JvbGw6IHRoaXMuYXV0b1Njcm9sbFNpZ25hbCgpLFxuICAgIHNjcm9sbFRvQm90dG9tQnV0dG9uOiB0aGlzLnNjcm9sbFRvQm90dG9tQnV0dG9uU2xvdCgpLFxuICAgIHNjcm9sbFRvQm90dG9tQnV0dG9uQ2xhc3M6IHRoaXMuc2Nyb2xsVG9Cb3R0b21CdXR0b25DbGFzcygpLFxuICAgIGlucHV0Q29udGFpbmVySGVpZ2h0OiB0aGlzLmlucHV0Q29udGFpbmVySGVpZ2h0KCksXG4gICAgaXNSZXNpemluZzogdGhpcy5pc1Jlc2l6aW5nKCksXG4gICAgbWVzc2FnZXM6IHRoaXMubWVzc2FnZXNWYWx1ZSgpLFxuICAgIG1lc3NhZ2VWaWV3OiB0aGlzLm1lc3NhZ2VWaWV3U2xvdCgpLFxuICAgIG1lc3NhZ2VWaWV3Q2xhc3M6IHRoaXMubWVzc2FnZVZpZXdDbGFzcygpLFxuICB9KSk7XG5cbiAgLy8gUmVtb3ZlZCBzY3JvbGxWaWV3UHJvcHNDb21wdXRlZCAtIG5vIGxvbmdlciBuZWVkZWRcblxuICBwcm90ZWN0ZWQgaW5wdXRDb250YWluZXJDb250ZXh0ID0gY29tcHV0ZWQoKCkgPT4gKHtcbiAgICBpbnB1dDogdGhpcy5pbnB1dFNsb3QoKSxcbiAgICBkaXNjbGFpbWVyOiB0aGlzLmRpc2NsYWltZXJTbG90KCksXG4gICAgZGlzY2xhaW1lclRleHQ6IHRoaXMuZGlzY2xhaW1lclRleHRTaWduYWwoKSxcbiAgICBkaXNjbGFpbWVyQ2xhc3M6IHRoaXMuZGlzY2xhaW1lckNsYXNzU2lnbmFsKCksXG4gICAgaW5wdXRDb250YWluZXJDbGFzczogdGhpcy5pbnB1dENvbnRhaW5lckNsYXNzKCksXG4gIH0pKTtcblxuICAvLyBSZW1vdmVkIGlucHV0Q29udGFpbmVyUHJvcHNDb21wdXRlZCAtIG5vIGxvbmdlciBuZWVkZWRcblxuICAvLyBMYXlvdXQgY29udGV4dCBmb3IgY3VzdG9tIHRlbXBsYXRlcyAocmVuZGVyIHByb3AgcGF0dGVybilcbiAgcHJvdGVjdGVkIGxheW91dENvbnRleHQgPSBjb21wdXRlZCgoKSA9PiAoe1xuICAgIG1lc3NhZ2VWaWV3OiB0aGlzLm1lc3NhZ2VWaWV3U2xvdCgpLFxuICAgIGlucHV0OiB0aGlzLmlucHV0U2xvdCgpLFxuICAgIHNjcm9sbFZpZXc6IHRoaXMuc2Nyb2xsVmlld1Nsb3QoKSxcbiAgICBzY3JvbGxUb0JvdHRvbUJ1dHRvbjogdGhpcy5zY3JvbGxUb0JvdHRvbUJ1dHRvblNsb3QoKSxcbiAgICBmZWF0aGVyOiB0aGlzLmZlYXRoZXJTbG90KCksXG4gICAgaW5wdXRDb250YWluZXI6IHRoaXMuaW5wdXRDb250YWluZXJTbG90KCksXG4gICAgZGlzY2xhaW1lcjogdGhpcy5kaXNjbGFpbWVyU2xvdCgpLFxuICB9KSk7XG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVzaXplVGltZW91dFJlZj86IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyU2VydmljZTogUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGhhbmRsZXJzOiBDb3BpbG90Q2hhdFZpZXdIYW5kbGVycyxcbiAgKSB7XG4gICAgLy8gQ2xlYXIgYW55IHBlbmRpbmcgcmVzaXplIHRpbWVvdXQgd2hlbiB0b2dnbGluZyBpc1Jlc2l6aW5nLCB3aXRob3V0IHNpZ25hbCB3cml0ZXMgaGVyZVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gSW5pdGlhbGl6ZSBoYW5kbGVyIGF2YWlsYWJpbGl0eSBpbiB0aGUgdmlldy1zY29wZWQgc2VydmljZVxuICAgIC8vIE91dHB1dEVtaXR0ZXJSZWYgZG9lc24ndCBleHBvc2UgJ29ic2VydmVkJzsgZGVmYXVsdCB0byB0cnVlIHRvIGVuYWJsZSBVSSBhZmZvcmRhbmNlc1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzQXNzaXN0YW50VGh1bWJzVXBIYW5kbGVyLnNldCh0cnVlKTtcbiAgICB0aGlzLmhhbmRsZXJzLmhhc0Fzc2lzdGFudFRodW1ic0Rvd25IYW5kbGVyLnNldCh0cnVlKTtcbiAgICB0aGlzLmhhbmRsZXJzLmhhc0Fzc2lzdGFudFJlYWRBbG91ZEhhbmRsZXIuc2V0KHRydWUpO1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzQXNzaXN0YW50UmVnZW5lcmF0ZUhhbmRsZXIuc2V0KHRydWUpO1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzVXNlckNvcHlIYW5kbGVyLnNldCh0cnVlKTtcbiAgICB0aGlzLmhhbmRsZXJzLmhhc1VzZXJFZGl0SGFuZGxlci5zZXQodHJ1ZSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAvLyBLZWVwIGhhbmRsZXIgYXZhaWxhYmlsaXR5IGluIHN5bmMgKGFzc3VtZSBhdmFpbGFibGUpXG4gICAgdGhpcy5oYW5kbGVycy5oYXNBc3Npc3RhbnRUaHVtYnNVcEhhbmRsZXIuc2V0KHRydWUpO1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzQXNzaXN0YW50VGh1bWJzRG93bkhhbmRsZXIuc2V0KHRydWUpO1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzQXNzaXN0YW50UmVhZEFsb3VkSGFuZGxlci5zZXQodHJ1ZSk7XG4gICAgdGhpcy5oYW5kbGVycy5oYXNBc3Npc3RhbnRSZWdlbmVyYXRlSGFuZGxlci5zZXQodHJ1ZSk7XG4gICAgdGhpcy5oYW5kbGVycy5oYXNVc2VyQ29weUhhbmRsZXIuc2V0KHRydWUpO1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzVXNlckVkaXRIYW5kbGVyLnNldCh0cnVlKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBEb24ndCBzZXQgYSBkZWZhdWx0IGhlaWdodCAtIG1lYXN1cmUgaXQgZHluYW1pY2FsbHlcblxuICAgIC8vIFNldCB1cCBpbnB1dCBjb250YWluZXIgaGVpZ2h0IG1vbml0b3JpbmdcbiAgICBjb25zdCBtZWFzdXJlQW5kT2JzZXJ2ZSA9ICgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuaW5wdXRDb250YWluZXJTbG90UmVmIHx8XG4gICAgICAgICF0aGlzLmlucHV0Q29udGFpbmVyU2xvdFJlZi5uYXRpdmVFbGVtZW50XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgc2xvdCByZWYgcG9pbnRzIHRvIHRoZSBjb3BpbG90LXNsb3QgZWxlbWVudFxuICAgICAgLy8gV2UgbmVlZCB0byBmaW5kIHRoZSBhY3R1YWwgaW5wdXQgY29udGFpbmVyIGNvbXBvbmVudCBpbnNpZGUgaXRcbiAgICAgIGNvbnN0IHNsb3RFbGVtZW50ID0gdGhpcy5pbnB1dENvbnRhaW5lclNsb3RSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIGNvbnN0IGNvbXBvbmVudEVsZW1lbnQgPSBzbG90RWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBcImNvcGlsb3QtY2hhdC12aWV3LWlucHV0LWNvbnRhaW5lclwiLFxuICAgICAgKTtcblxuICAgICAgaWYgKCFjb21wb25lbnRFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9vayBmb3IgdGhlIGFic29sdXRlIHBvc2l0aW9uZWQgZGl2IHRoYXQgY29udGFpbnMgdGhlIGlucHV0XG4gICAgICBsZXQgaW5uZXJEaXYgPSBjb21wb25lbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIFwiZGl2LmFic29sdXRlXCIsXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAvLyBJZiBub3QgZm91bmQgYnkgY2xhc3MsIHRyeSBmaXJzdCBjaGlsZFxuICAgICAgaWYgKCFpbm5lckRpdikge1xuICAgICAgICBpbm5lckRpdiA9IGNvbXBvbmVudEVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghaW5uZXJEaXYpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBNZWFzdXJlIHRoZSBhY3R1YWwgaGVpZ2h0XG4gICAgICBjb25zdCBtZWFzdXJlZEhlaWdodCA9IGlubmVyRGl2Lm9mZnNldEhlaWdodDtcblxuICAgICAgaWYgKG1lYXN1cmVkSGVpZ2h0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gU3VjY2VzcyEgU2V0IHRoZSBpbml0aWFsIGhlaWdodFxuICAgICAgdGhpcy5pbnB1dENvbnRhaW5lckhlaWdodC5zZXQobWVhc3VyZWRIZWlnaHQpO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAvLyBDcmVhdGUgYW4gRWxlbWVudFJlZiB3cmFwcGVyIGZvciBSZXNpemVPYnNlcnZlclxuICAgICAgY29uc3QgaW5uZXJEaXZSZWYgPSBuZXcgRWxlbWVudFJlZihpbm5lckRpdik7XG5cbiAgICAgIC8vIFNldCB1cCBSZXNpemVPYnNlcnZlciB0byB0cmFjayBjaGFuZ2VzXG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyU2VydmljZVxuICAgICAgICAub2JzZXJ2ZUVsZW1lbnQoaW5uZXJEaXZSZWYsIDAsIDI1MClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ld0hlaWdodCA9IHN0YXRlLmhlaWdodDtcblxuICAgICAgICAgIGlmIChuZXdIZWlnaHQgIT09IHRoaXMuaW5wdXRDb250YWluZXJIZWlnaHQoKSAmJiBuZXdIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0Q29udGFpbmVySGVpZ2h0LnNldChuZXdIZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5pc1Jlc2l6aW5nLnNldCh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICAgICAgLy8gQ2xlYXIgZXhpc3RpbmcgdGltZW91dFxuICAgICAgICAgICAgaWYgKHRoaXMucmVzaXplVGltZW91dFJlZikge1xuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lb3V0UmVmKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IGlzUmVzaXppbmcgdG8gZmFsc2UgYWZ0ZXIgYSBzaG9ydCBkZWxheVxuICAgICAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0UmVmID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmlzUmVzaXppbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0UmVmID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9LCAyNTApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICAvLyBUcnkgdG8gbWVhc3VyZSBpbW1lZGlhdGVseVxuICAgIGlmICghbWVhc3VyZUFuZE9ic2VydmUoKSkge1xuICAgICAgLy8gSWYgZmFpbGVkLCByZXRyeSB3aXRoIGluY3JlYXNpbmcgZGVsYXlzXG4gICAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuICAgICAgY29uc3QgbWF4QXR0ZW1wdHMgPSAxMDtcblxuICAgICAgY29uc3QgcmV0cnkgPSAoKSA9PiB7XG4gICAgICAgIGF0dGVtcHRzKys7XG4gICAgICAgIGlmIChtZWFzdXJlQW5kT2JzZXJ2ZSgpKSB7XG4gICAgICAgICAgLy8gU3VjY2Vzc2Z1bGx5IG1lYXN1cmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXR0ZW1wdHMgPCBtYXhBdHRlbXB0cykge1xuICAgICAgICAgIC8vIEV4cG9uZW50aWFsIGJhY2tvZmY6IDUwbXMsIDEwMG1zLCAyMDBtcywgNDAwbXMsIGV0Yy5cbiAgICAgICAgICBjb25zdCBkZWxheSA9IDUwICogTWF0aC5wb3coMiwgTWF0aC5taW4oYXR0ZW1wdHMgLSAxLCA0KSk7XG4gICAgICAgICAgc2V0VGltZW91dChyZXRyeSwgZGVsYXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhaWxlZCB0byBtZWFzdXJlIGFmdGVyIG1heCBhdHRlbXB0c1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBTdGFydCByZXRyeSB3aXRoIGZpcnN0IGRlbGF5XG4gICAgICBzZXRUaW1lb3V0KHJldHJ5LCA1MCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzaXplVGltZW91dFJlZikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZW91dFJlZik7XG4gICAgfVxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIl19
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LXZpZXcudHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdmlldy50eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHlwZSwgVGVtcGxhdGVSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gXCJAYWctdWkvY2xpZW50XCI7XG5cbi8qKlxuICogUHJvcHMgZm9yIENvcGlsb3RDaGF0VmlldyBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3BpbG90Q2hhdFZpZXdQcm9wcyB7XG4gIG1lc3NhZ2VzPzogTWVzc2FnZVtdO1xuICBhdXRvU2Nyb2xsPzogYm9vbGVhbjtcblxuICAvLyBTbG90IGNvbmZpZ3VyYXRpb25zXG4gIG1lc3NhZ2VWaWV3Q29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBtZXNzYWdlVmlld1RlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgbWVzc2FnZVZpZXdDbGFzcz86IHN0cmluZztcblxuICBzY3JvbGxWaWV3Q29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBzY3JvbGxWaWV3VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBzY3JvbGxWaWV3Q2xhc3M/OiBzdHJpbmc7XG5cbiAgc2Nyb2xsVG9Cb3R0b21CdXR0b25Db21wb25lbnQ/OiBUeXBlPGFueT47XG4gIHNjcm9sbFRvQm90dG9tQnV0dG9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBzY3JvbGxUb0JvdHRvbUJ1dHRvbkNsYXNzPzogc3RyaW5nO1xuXG4gIGlucHV0Q29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBpbnB1dFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICBpbnB1dENvbnRhaW5lckNvbXBvbmVudD86IFR5cGU8YW55PjtcbiAgaW5wdXRDb250YWluZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIGlucHV0Q29udGFpbmVyQ2xhc3M/OiBzdHJpbmc7XG5cbiAgZmVhdGhlckNvbXBvbmVudD86IFR5cGU8YW55PjtcbiAgZmVhdGhlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgZmVhdGhlckNsYXNzPzogc3RyaW5nO1xuXG4gIGRpc2NsYWltZXJDb21wb25lbnQ/OiBUeXBlPGFueT47XG4gIGRpc2NsYWltZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIGRpc2NsYWltZXJDbGFzcz86IHN0cmluZztcbiAgZGlzY2xhaW1lclRleHQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udGV4dCBmb3IgY3VzdG9tIGxheW91dCB0ZW1wbGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RDaGF0Vmlld0xheW91dENvbnRleHQge1xuICBtZXNzYWdlVmlldzogYW55O1xuICBpbnB1dDogYW55O1xuICBzY3JvbGxWaWV3OiBhbnk7XG4gIHNjcm9sbFRvQm90dG9tQnV0dG9uOiBhbnk7XG4gIGZlYXRoZXI6IGFueTtcbiAgaW5wdXRDb250YWluZXI6IGFueTtcbiAgZGlzY2xhaW1lcjogYW55O1xufVxuIl19