@copilotkitnext/angular 0.0.9-alpha.3 → 0.0.10
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.
- package/dist/esm2022/index.mjs +2 -70
- package/dist/esm2022/lib/agent.mjs +73 -0
- package/dist/esm2022/lib/chat-config.mjs +35 -0
- package/dist/esm2022/lib/chat-state.mjs +18 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-buttons.mjs +344 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-renderer.mjs +260 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-toolbar.mjs +22 -0
- package/dist/esm2022/{components/chat/copilot-chat-assistant-message.component.mjs → lib/components/chat/copilot-chat-assistant-message.mjs} +216 -240
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-audio-recorder.mjs +196 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-buttons.mjs +299 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-input-defaults.mjs +39 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-input.mjs +634 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-input.types.mjs +10 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view-cursor.mjs +27 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view.mjs +268 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-textarea.mjs +139 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-tool-calls-view.mjs +36 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-toolbar.mjs +20 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-tools-menu.mjs +203 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-branch-navigation.mjs +118 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-buttons.mjs +182 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-renderer.mjs +28 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-toolbar.mjs +25 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message.mjs +306 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-disclaimer.mjs +48 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-feather.mjs +41 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-handlers.mjs +19 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-input-container.mjs +96 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.mjs +89 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-view.mjs +456 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view.mjs +404 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat.mjs +167 -0
- package/dist/esm2022/lib/config.mjs +9 -0
- package/dist/esm2022/lib/copilotkit.mjs +124 -0
- package/dist/esm2022/lib/directives/copilotkit-agent-context.mjs +130 -0
- package/dist/esm2022/lib/directives/stick-to-bottom.mjs +170 -0
- package/dist/esm2022/lib/directives/tooltip.mjs +217 -0
- package/dist/esm2022/lib/human-in-the-loop.mjs +19 -0
- package/dist/esm2022/lib/render-tool-calls.mjs +131 -0
- package/dist/esm2022/lib/resize-observer.mjs +152 -0
- package/dist/esm2022/lib/scroll-position.mjs +124 -0
- package/dist/esm2022/lib/slots/copilot-slot.mjs +156 -0
- package/dist/esm2022/lib/slots/index.mjs +4 -0
- package/dist/esm2022/lib/slots/slot.types.mjs +3 -3
- package/dist/esm2022/lib/slots/slot.utils.mjs +19 -15
- package/dist/esm2022/lib/tools.mjs +31 -0
- package/dist/esm2022/lib/utils.mjs +3 -3
- package/dist/esm2022/public-api.mjs +47 -0
- package/dist/fesm2022/copilotkitnext-angular.mjs +5249 -8271
- package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
- package/dist/index.d.ts +1 -55
- package/dist/lib/agent.d.ts +53 -0
- package/dist/{core/chat-configuration/chat-configuration.types.d.ts → lib/chat-config.d.ts} +4 -8
- package/dist/lib/chat-state.d.ts +10 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message-buttons.d.ts +68 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message-renderer.d.ts +26 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message-toolbar.d.ts +7 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message.d.ts +178 -0
- package/dist/{components → lib/components}/chat/copilot-chat-assistant-message.types.d.ts +1 -1
- package/dist/{components/chat/copilot-chat-audio-recorder.component.d.ts → lib/components/chat/copilot-chat-audio-recorder.d.ts} +10 -10
- package/dist/lib/components/chat/copilot-chat-buttons.d.ts +65 -0
- package/dist/lib/components/chat/copilot-chat-input-defaults.d.ts +38 -0
- package/dist/lib/components/chat/copilot-chat-input.d.ts +133 -0
- package/dist/{components → lib/components}/chat/copilot-chat-input.types.d.ts +11 -11
- package/dist/lib/components/chat/copilot-chat-message-view-cursor.d.ts +11 -0
- package/dist/{components/chat/copilot-chat-message-view.component.d.ts → lib/components/chat/copilot-chat-message-view.d.ts} +68 -36
- package/dist/{components → lib/components}/chat/copilot-chat-message-view.types.d.ts +2 -2
- package/dist/lib/components/chat/copilot-chat-textarea.d.ts +41 -0
- package/dist/lib/components/chat/copilot-chat-tool-calls-view.d.ts +55 -0
- package/dist/lib/components/chat/copilot-chat-toolbar.d.ts +7 -0
- package/dist/lib/components/chat/copilot-chat-tools-menu.d.ts +20 -0
- package/dist/lib/components/chat/copilot-chat-user-message-branch-navigation.d.ts +20 -0
- package/dist/lib/components/chat/copilot-chat-user-message-buttons.d.ts +35 -0
- package/dist/lib/components/chat/copilot-chat-user-message-renderer.d.ts +8 -0
- package/dist/lib/components/chat/copilot-chat-user-message-toolbar.d.ts +7 -0
- package/dist/lib/components/chat/copilot-chat-user-message.d.ts +55 -0
- package/dist/{components → lib/components}/chat/copilot-chat-user-message.types.d.ts +2 -2
- package/dist/lib/components/chat/copilot-chat-view-disclaimer.d.ts +15 -0
- package/dist/{components/chat/copilot-chat-view-feather.component.d.ts → lib/components/chat/copilot-chat-view-feather.d.ts} +6 -6
- package/dist/{components/chat/copilot-chat-view-handlers.service.d.ts → lib/components/chat/copilot-chat-view-handlers.d.ts} +3 -3
- package/dist/lib/components/chat/copilot-chat-view-input-container.d.ts +23 -0
- package/dist/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.d.ts +16 -0
- package/dist/lib/components/chat/copilot-chat-view-scroll-view.d.ts +114 -0
- package/dist/lib/components/chat/copilot-chat-view.d.ts +239 -0
- package/dist/{components → lib/components}/chat/copilot-chat-view.types.d.ts +2 -2
- package/dist/lib/components/chat/copilot-chat.d.ts +67 -0
- package/dist/lib/config.d.ts +16 -0
- package/dist/lib/copilotkit.d.ts +29 -0
- package/dist/{directives/copilotkit-agent-context.directive.d.ts → lib/directives/copilotkit-agent-context.d.ts} +5 -5
- package/dist/lib/directives/stick-to-bottom.d.ts +62 -0
- package/dist/lib/directives/tooltip.d.ts +33 -0
- package/dist/lib/human-in-the-loop.d.ts +13 -0
- package/dist/lib/render-tool-calls.d.ts +75 -0
- package/dist/{services/resize-observer.service.d.ts → lib/resize-observer.d.ts} +2 -2
- package/dist/{services/scroll-position.service.d.ts → lib/scroll-position.d.ts} +6 -6
- package/dist/lib/slots/copilot-slot.d.ts +34 -0
- package/dist/lib/slots/index.d.ts +3 -0
- package/dist/lib/slots/slot.types.d.ts +1 -1
- package/dist/lib/slots/slot.utils.d.ts +6 -4
- package/dist/lib/tools.d.ts +63 -0
- package/dist/lib/utils.d.ts +1 -1
- package/dist/public-api.d.ts +46 -0
- package/dist/styles.css +0 -69
- package/package.json +3 -3
- package/dist/components/chat/copilot-chat-assistant-message-buttons.component.d.ts +0 -75
- package/dist/components/chat/copilot-chat-assistant-message-renderer.component.d.ts +0 -31
- package/dist/components/chat/copilot-chat-assistant-message-toolbar.component.d.ts +0 -8
- package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +0 -132
- package/dist/components/chat/copilot-chat-buttons.component.d.ts +0 -66
- package/dist/components/chat/copilot-chat-input-defaults.d.ts +0 -37
- package/dist/components/chat/copilot-chat-input.component.d.ts +0 -133
- package/dist/components/chat/copilot-chat-message-view-cursor.component.d.ts +0 -15
- package/dist/components/chat/copilot-chat-textarea.component.d.ts +0 -45
- package/dist/components/chat/copilot-chat-tool-calls-view.component.d.ts +0 -35
- package/dist/components/chat/copilot-chat-toolbar.component.d.ts +0 -8
- package/dist/components/chat/copilot-chat-tools-menu.component.d.ts +0 -20
- package/dist/components/chat/copilot-chat-user-message-branch-navigation.component.d.ts +0 -23
- package/dist/components/chat/copilot-chat-user-message-buttons.component.d.ts +0 -39
- package/dist/components/chat/copilot-chat-user-message-renderer.component.d.ts +0 -9
- package/dist/components/chat/copilot-chat-user-message-toolbar.component.d.ts +0 -8
- package/dist/components/chat/copilot-chat-user-message.component.d.ts +0 -55
- package/dist/components/chat/copilot-chat-view-disclaimer.component.d.ts +0 -15
- package/dist/components/chat/copilot-chat-view-input-container.component.d.ts +0 -23
- package/dist/components/chat/copilot-chat-view-scroll-to-bottom-button.component.d.ts +0 -17
- package/dist/components/chat/copilot-chat-view-scroll-view.component.d.ts +0 -84
- package/dist/components/chat/copilot-chat-view.component.d.ts +0 -205
- package/dist/components/chat/copilot-chat.component.d.ts +0 -36
- package/dist/components/copilotkit-tool-render.component.d.ts +0 -25
- package/dist/core/chat-configuration/chat-configuration.providers.d.ts +0 -54
- package/dist/core/chat-configuration/chat-configuration.service.d.ts +0 -75
- package/dist/core/copilotkit.providers.d.ts +0 -13
- package/dist/core/copilotkit.service.d.ts +0 -119
- package/dist/core/copilotkit.types.d.ts +0 -81
- package/dist/directives/copilotkit-agent.directive.d.ts +0 -106
- package/dist/directives/copilotkit-chat-config.directive.d.ts +0 -84
- package/dist/directives/copilotkit-config.directive.d.ts +0 -44
- package/dist/directives/copilotkit-frontend-tool.directive.d.ts +0 -25
- package/dist/directives/copilotkit-human-in-the-loop.directive.d.ts +0 -124
- package/dist/directives/stick-to-bottom.directive.d.ts +0 -62
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +0 -384
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +0 -286
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +0 -27
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +0 -202
- package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +0 -321
- package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +0 -38
- package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +0 -666
- package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +0 -10
- package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +0 -45
- package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +0 -296
- package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +0 -188
- package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +0 -222
- package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +0 -25
- package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +0 -199
- package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +0 -137
- package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +0 -207
- package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +0 -35
- package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +0 -34
- package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +0 -341
- package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +0 -52
- package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +0 -55
- package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +0 -19
- package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +0 -110
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +0 -93
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +0 -443
- package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +0 -479
- package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat.component.mjs +0 -220
- package/dist/esm2022/components/copilotkit-tool-render.component.mjs +0 -150
- package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +0 -65
- package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +0 -145
- package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +0 -26
- package/dist/esm2022/core/copilotkit.providers.mjs +0 -34
- package/dist/esm2022/core/copilotkit.service.mjs +0 -411
- package/dist/esm2022/core/copilotkit.types.mjs +0 -13
- package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +0 -130
- package/dist/esm2022/directives/copilotkit-agent.directive.mjs +0 -221
- package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +0 -218
- package/dist/esm2022/directives/copilotkit-config.directive.mjs +0 -94
- package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +0 -128
- package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +0 -265
- package/dist/esm2022/directives/stick-to-bottom.directive.mjs +0 -181
- package/dist/esm2022/lib/directives/tooltip.directive.mjs +0 -211
- package/dist/esm2022/lib/slots/copilot-slot.component.mjs +0 -154
- package/dist/esm2022/services/resize-observer.service.mjs +0 -152
- package/dist/esm2022/services/scroll-position.service.mjs +0 -124
- package/dist/esm2022/types/frontend-tool.mjs +0 -2
- package/dist/esm2022/types/human-in-the-loop.mjs +0 -2
- package/dist/esm2022/utils/agent-context.utils.mjs +0 -114
- package/dist/esm2022/utils/agent.utils.mjs +0 -212
- package/dist/esm2022/utils/chat-config.utils.mjs +0 -186
- package/dist/esm2022/utils/copilotkit.utils.mjs +0 -20
- package/dist/esm2022/utils/frontend-tool.utils.mjs +0 -224
- package/dist/esm2022/utils/human-in-the-loop.utils.mjs +0 -293
- package/dist/lib/directives/tooltip.directive.d.ts +0 -33
- package/dist/lib/slots/copilot-slot.component.d.ts +0 -34
- package/dist/types/frontend-tool.d.ts +0 -37
- package/dist/types/human-in-the-loop.d.ts +0 -44
- package/dist/utils/agent-context.utils.d.ts +0 -75
- package/dist/utils/agent.utils.d.ts +0 -108
- package/dist/utils/chat-config.utils.d.ts +0 -166
- package/dist/utils/copilotkit.utils.d.ts +0 -16
- package/dist/utils/frontend-tool.utils.d.ts +0 -119
- package/dist/utils/human-in-the-loop.utils.d.ts +0 -92
|
@@ -0,0 +1,404 @@
|
|
|
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.13", 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.13", 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.13", 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LXZpZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFHWixTQUFTLEVBQ1QsVUFBVSxFQUNWLHVCQUF1QixFQUV2QixpQkFBaUIsRUFDakIsUUFBUSxFQUNSLE1BQU0sRUFLTixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDNUUsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbEcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFM0UsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFFM0M7Ozs7Ozs7Ozs7OztHQVlHO0FBMERILE1BQU0sT0FBTyxlQUFlO0lBc0toQjtJQUNBO0lBQ0E7SUFyS1YsbUNBQW1DO0lBQ25D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QkFDM0QsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnRFQ7aUJBQ0Y7Z0tBNkMrQixvQkFBb0I7c0JBQWpELFlBQVk7dUJBQUMsY0FBYztnQkFHQSxrQkFBa0I7c0JBQTdDLFlBQVk7dUJBQUMsWUFBWTtnQkFDRCxlQUFlO3NCQUF2QyxZQUFZO3VCQUFDLFNBQVM7Z0JBQ0csZ0JBQWdCO3NCQUF6QyxZQUFZO3VCQUFDLFVBQVU7Z0JBQ08scUJBQXFCO3NCQUFuRCxZQUFZO3VCQUFDLGVBQWU7Z0JBRTdCLHdDQUF3QztzQkFEdkMsWUFBWTt1QkFBQyxrQ0FBa0M7Z0JBRWhCLHNCQUFzQjtzQkFBckQsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBQ0ksd0JBQXdCO3NCQUF6RCxZQUFZO3VCQUFDLGtCQUFrQjtnQkFDQyx1QkFBdUI7c0JBQXZELFlBQVk7dUJBQUMsaUJBQWlCO2dCQUNHLHdCQUF3QjtzQkFBekQsWUFBWTt1QkFBQyxrQkFBa0I7Z0JBY2hDLHFCQUFxQjtzQkFEcEIsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgVGVtcGxhdGVSZWYsXG4gIFR5cGUsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgY29tcHV0ZWQsXG4gIHNpZ25hbCxcbiAgT25Jbml0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IENvcGlsb3RTbG90IH0gZnJvbSBcIi4uLy4uL3Nsb3RzL2NvcGlsb3Qtc2xvdFwiO1xuaW1wb3J0IHsgQ29waWxvdENoYXRWaWV3U2Nyb2xsVmlldyB9IGZyb20gXCIuL2NvcGlsb3QtY2hhdC12aWV3LXNjcm9sbC12aWV3XCI7XG5pbXBvcnQgeyBDb3BpbG90Q2hhdFZpZXdTY3JvbGxUb0JvdHRvbUJ1dHRvbiB9IGZyb20gXCIuL2NvcGlsb3QtY2hhdC12aWV3LXNjcm9sbC10by1ib3R0b20tYnV0dG9uXCI7XG5pbXBvcnQgeyBDb3BpbG90Q2hhdFZpZXdGZWF0aGVyIH0gZnJvbSBcIi4vY29waWxvdC1jaGF0LXZpZXctZmVhdGhlclwiO1xuaW1wb3J0IHsgQ29waWxvdENoYXRWaWV3SW5wdXRDb250YWluZXIgfSBmcm9tIFwiLi9jb3BpbG90LWNoYXQtdmlldy1pbnB1dC1jb250YWluZXJcIjtcbmltcG9ydCB7IENvcGlsb3RDaGF0Vmlld0Rpc2NsYWltZXIgfSBmcm9tIFwiLi9jb3BpbG90LWNoYXQtdmlldy1kaXNjbGFpbWVyXCI7XG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSBcIkBhZy11aS9jbGllbnRcIjtcbmltcG9ydCB7IGNuIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBSZXNpemVPYnNlcnZlclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vcmVzaXplLW9ic2VydmVyXCI7XG5pbXBvcnQgeyBDb3BpbG90Q2hhdFZpZXdIYW5kbGVycyB9IGZyb20gXCIuL2NvcGlsb3QtY2hhdC12aWV3LWhhbmRsZXJzXCI7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG4vKipcbiAqIENvcGlsb3RDaGF0VmlldyBjb21wb25lbnQgLSBBbmd1bGFyIHBvcnQgb2YgdGhlIFJlYWN0IGNvbXBvbmVudC5cbiAqIEEgY29tcGxldGUgY2hhdCBpbnRlcmZhY2Ugd2l0aCBtZXNzYWdlIGZlZWQgYW5kIGlucHV0IGNvbXBvbmVudHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxjb3BpbG90LWNoYXQtdmlld1xuICogICBbbWVzc2FnZXNdPVwibWVzc2FnZXNcIlxuICogICBbYXV0b1Njcm9sbF09XCJ0cnVlXCJcbiAqICAgW21lc3NhZ2VWaWV3UHJvcHNdPVwieyBhc3Npc3RhbnRNZXNzYWdlOiB7IG9uVGh1bWJzVXA6IGhhbmRsZVRodW1ic1VwIH0gfVwiPlxuICogPC9jb3BpbG90LWNoYXQtdmlldz5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6IFwiY29waWxvdC1jaGF0LXZpZXdcIixcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQ29waWxvdFNsb3QsIENvcGlsb3RDaGF0Vmlld1Njcm9sbFZpZXddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJvdmlkZXJzOiBbUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlLCBDb3BpbG90Q2hhdFZpZXdIYW5kbGVyc10sXG4gIHRlbXBsYXRlOiBgXG4gICAgPCEtLSBDdXN0b20gbGF5b3V0IHRlbXBsYXRlIHN1cHBvcnQgKHJlbmRlciBwcm9wIHBhdHRlcm4pIC0tPlxuICAgIEBpZiAoY3VzdG9tTGF5b3V0VGVtcGxhdGUpIHtcbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tTGF5b3V0VGVtcGxhdGVcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwibGF5b3V0Q29udGV4dCgpXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDwhLS0gRGVmYXVsdCBsYXlvdXQgLSBleGFjdCBSZWFjdCBET00gc3RydWN0dXJlIC0tPlxuICAgICAgPGRpdiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzcygpXCI+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+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGNvbnRlbnRQYWRkaW5nQm90dG9tID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5pbnB1dENvbnRhaW5lckhlaWdodCgpICsgMzJcbiAgKTtcblxuICAvLyBDb21wdXRlZCBzaWduYWxzXG4gIHByb3RlY3RlZCBjb21wdXRlZENsYXNzID0gY29tcHV0ZWQoKCkgPT4gY24oXCJyZWxhdGl2ZSBoLWZ1bGxcIikpO1xuXG4gIC8vIFNsb3QgcmVzb2x1dGlvbiBjb21wdXRlZCBzaWduYWxzXG4gIHByb3RlY3RlZCBtZXNzYWdlVmlld1Nsb3QgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLm1lc3NhZ2VWaWV3VGVtcGxhdGUoKSB8fCB0aGlzLm1lc3NhZ2VWaWV3Q29tcG9uZW50KClcbiAgKTtcblxuICBwcm90ZWN0ZWQgc2Nyb2xsVmlld1Nsb3QgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLnNjcm9sbFZpZXdUZW1wbGF0ZSgpIHx8IHRoaXMuc2Nyb2xsVmlld0NvbXBvbmVudCgpXG4gICk7XG5cbiAgcHJvdGVjdGVkIHNjcm9sbFRvQm90dG9tQnV0dG9uU2xvdCA9IGNvbXB1dGVkKFxuICAgICgpID0+XG4gICAgICB0aGlzLnNjcm9sbFRvQm90dG9tQnV0dG9uVGVtcGxhdGUoKSB8fFxuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbUJ1dHRvbkNvbXBvbmVudCgpXG4gICk7XG5cbiAgcHJvdGVjdGVkIGlucHV0U2xvdCA9IGNvbXB1dGVkKFxuICAgICgpID0+IHRoaXMuaW5wdXRUZW1wbGF0ZSgpIHx8IHRoaXMuaW5wdXRDb21wb25lbnQoKVxuICApO1xuXG4gIHByb3RlY3RlZCBpbnB1dENvbnRhaW5lclNsb3QgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLmlucHV0Q29udGFpbmVyVGVtcGxhdGUoKSB8fCB0aGlzLmlucHV0Q29udGFpbmVyQ29tcG9uZW50KClcbiAgKTtcblxuICBwcm90ZWN0ZWQgZmVhdGhlclNsb3QgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLmZlYXRoZXJUZW1wbGF0ZSgpIHx8IHRoaXMuZmVhdGhlckNvbXBvbmVudCgpXG4gICk7XG5cbiAgcHJvdGVjdGVkIGRpc2NsYWltZXJTbG90ID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gdGhpcy5kaXNjbGFpbWVyVGVtcGxhdGUoKSB8fCB0aGlzLmRpc2NsYWltZXJDb21wb25lbnQoKVxuICApO1xuXG4gIC8vIENvbnRleHQgb2JqZWN0cyBmb3Igc2xvdHNcbiAgcHJvdGVjdGVkIHNjcm9sbFZpZXdDb250ZXh0ID0gY29tcHV0ZWQoKCkgPT4gKHtcbiAgICBhdXRvU2Nyb2xsOiB0aGlzLmF1dG9TY3JvbGxTaWduYWwoKSxcbiAgICBzY3JvbGxUb0JvdHRvbUJ1dHRvbjogdGhpcy5zY3JvbGxUb0JvdHRvbUJ1dHRvblNsb3QoKSxcbiAgICBzY3JvbGxUb0JvdHRvbUJ1dHRvbkNsYXNzOiB0aGlzLnNjcm9sbFRvQm90dG9tQnV0dG9uQ2xhc3MoKSxcbiAgICBpbnB1dENvbnRhaW5lckhlaWdodDogdGhpcy5pbnB1dENvbnRhaW5lckhlaWdodCgpLFxuICAgIGlzUmVzaXppbmc6IHRoaXMuaXNSZXNpemluZygpLFxuICAgIG1lc3NhZ2VzOiB0aGlzLm1lc3NhZ2VzVmFsdWUoKSxcbiAgICBtZXNzYWdlVmlldzogdGhpcy5tZXNzYWdlVmlld1Nsb3QoKSxcbiAgICBtZXNzYWdlVmlld0NsYXNzOiB0aGlzLm1lc3NhZ2VWaWV3Q2xhc3MoKSxcbiAgfSkpO1xuXG4gIC8vIFJlbW92ZWQgc2Nyb2xsVmlld1Byb3BzQ29tcHV0ZWQgLSBubyBsb25nZXIgbmVlZGVkXG5cbiAgcHJvdGVjdGVkIGlucHV0Q29udGFpbmVyQ29udGV4dCA9IGNvbXB1dGVkKCgpID0+ICh7XG4gICAgaW5wdXQ6IHRoaXMuaW5wdXRTbG90KCksXG4gICAgZGlzY2xhaW1lcjogdGhpcy5kaXNjbGFpbWVyU2xvdCgpLFxuICAgIGRpc2NsYWltZXJUZXh0OiB0aGlzLmRpc2NsYWltZXJUZXh0U2lnbmFsKCksXG4gICAgZGlzY2xhaW1lckNsYXNzOiB0aGlzLmRpc2NsYWltZXJDbGFzc1NpZ25hbCgpLFxuICAgIGlucHV0Q29udGFpbmVyQ2xhc3M6IHRoaXMuaW5wdXRDb250YWluZXJDbGFzcygpLFxuICB9KSk7XG5cbiAgLy8gUmVtb3ZlZCBpbnB1dENvbnRhaW5lclByb3BzQ29tcHV0ZWQgLSBubyBsb25nZXIgbmVlZGVkXG5cbiAgLy8gTGF5b3V0IGNvbnRleHQgZm9yIGN1c3RvbSB0ZW1wbGF0ZXMgKHJlbmRlciBwcm9wIHBhdHRlcm4pXG4gIHByb3RlY3RlZCBsYXlvdXRDb250ZXh0ID0gY29tcHV0ZWQoKCkgPT4gKHtcbiAgICBtZXNzYWdlVmlldzogdGhpcy5tZXNzYWdlVmlld1Nsb3QoKSxcbiAgICBpbnB1dDogdGhpcy5pbnB1dFNsb3QoKSxcbiAgICBzY3JvbGxWaWV3OiB0aGlzLnNjcm9sbFZpZXdTbG90KCksXG4gICAgc2Nyb2xsVG9Cb3R0b21CdXR0b246IHRoaXMuc2Nyb2xsVG9Cb3R0b21CdXR0b25TbG90KCksXG4gICAgZmVhdGhlcjogdGhpcy5mZWF0aGVyU2xvdCgpLFxuICAgIGlucHV0Q29udGFpbmVyOiB0aGlzLmlucHV0Q29udGFpbmVyU2xvdCgpLFxuICAgIGRpc2NsYWltZXI6IHRoaXMuZGlzY2xhaW1lclNsb3QoKSxcbiAgfSkpO1xuXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHJlc2l6ZVRpbWVvdXRSZWY/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZXNpemVPYnNlcnZlclNlcnZpY2U6IFJlc2l6ZU9ic2VydmVyU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBoYW5kbGVyczogQ29waWxvdENoYXRWaWV3SGFuZGxlcnNcbiAgKSB7XG4gICAgLy8gQ2xlYXIgYW55IHBlbmRpbmcgcmVzaXplIHRpbWVvdXQgd2hlbiB0b2dnbGluZyBpc1Jlc2l6aW5nLCB3aXRob3V0IHNpZ25hbCB3cml0ZXMgaGVyZVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gSW5pdGlhbGl6ZSBoYW5kbGVyIGF2YWlsYWJpbGl0eSBpbiB0aGUgdmlldy1zY29wZWQgc2VydmljZVxuICAgIC8vIE91dHB1dEVtaXR0ZXJSZWYgZG9lc24ndCBleHBvc2UgJ29ic2VydmVkJzsgZGVmYXVsdCB0byB0cnVlIHRvIGVuYWJsZSBVSSBhZmZvcmRhbmNlc1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzQXNzaXN0YW50VGh1bWJzVXBIYW5kbGVyLnNldCh0cnVlKTtcbiAgICB0aGlzLmhhbmRsZXJzLmhhc0Fzc2lzdGFudFRodW1ic0Rvd25IYW5kbGVyLnNldCh0cnVlKTtcbiAgICB0aGlzLmhhbmRsZXJzLmhhc0Fzc2lzdGFudFJlYWRBbG91ZEhhbmRsZXIuc2V0KHRydWUpO1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzQXNzaXN0YW50UmVnZW5lcmF0ZUhhbmRsZXIuc2V0KHRydWUpO1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzVXNlckNvcHlIYW5kbGVyLnNldCh0cnVlKTtcbiAgICB0aGlzLmhhbmRsZXJzLmhhc1VzZXJFZGl0SGFuZGxlci5zZXQodHJ1ZSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAvLyBLZWVwIGhhbmRsZXIgYXZhaWxhYmlsaXR5IGluIHN5bmMgKGFzc3VtZSBhdmFpbGFibGUpXG4gICAgdGhpcy5oYW5kbGVycy5oYXNBc3Npc3RhbnRUaHVtYnNVcEhhbmRsZXIuc2V0KHRydWUpO1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzQXNzaXN0YW50VGh1bWJzRG93bkhhbmRsZXIuc2V0KHRydWUpO1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzQXNzaXN0YW50UmVhZEFsb3VkSGFuZGxlci5zZXQodHJ1ZSk7XG4gICAgdGhpcy5oYW5kbGVycy5oYXNBc3Npc3RhbnRSZWdlbmVyYXRlSGFuZGxlci5zZXQodHJ1ZSk7XG4gICAgdGhpcy5oYW5kbGVycy5oYXNVc2VyQ29weUhhbmRsZXIuc2V0KHRydWUpO1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzVXNlckVkaXRIYW5kbGVyLnNldCh0cnVlKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBEb24ndCBzZXQgYSBkZWZhdWx0IGhlaWdodCAtIG1lYXN1cmUgaXQgZHluYW1pY2FsbHlcblxuICAgIC8vIFNldCB1cCBpbnB1dCBjb250YWluZXIgaGVpZ2h0IG1vbml0b3JpbmdcbiAgICBjb25zdCBtZWFzdXJlQW5kT2JzZXJ2ZSA9ICgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuaW5wdXRDb250YWluZXJTbG90UmVmIHx8XG4gICAgICAgICF0aGlzLmlucHV0Q29udGFpbmVyU2xvdFJlZi5uYXRpdmVFbGVtZW50XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgc2xvdCByZWYgcG9pbnRzIHRvIHRoZSBjb3BpbG90LXNsb3QgZWxlbWVudFxuICAgICAgLy8gV2UgbmVlZCB0byBmaW5kIHRoZSBhY3R1YWwgaW5wdXQgY29udGFpbmVyIGNvbXBvbmVudCBpbnNpZGUgaXRcbiAgICAgIGNvbnN0IHNsb3RFbGVtZW50ID0gdGhpcy5pbnB1dENvbnRhaW5lclNsb3RSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIGNvbnN0IGNvbXBvbmVudEVsZW1lbnQgPSBzbG90RWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBcImNvcGlsb3QtY2hhdC12aWV3LWlucHV0LWNvbnRhaW5lclwiXG4gICAgICApO1xuXG4gICAgICBpZiAoIWNvbXBvbmVudEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBMb29rIGZvciB0aGUgYWJzb2x1dGUgcG9zaXRpb25lZCBkaXYgdGhhdCBjb250YWlucyB0aGUgaW5wdXRcbiAgICAgIGxldCBpbm5lckRpdiA9IGNvbXBvbmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgXCJkaXYuYWJzb2x1dGVcIlxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgLy8gSWYgbm90IGZvdW5kIGJ5IGNsYXNzLCB0cnkgZmlyc3QgY2hpbGRcbiAgICAgIGlmICghaW5uZXJEaXYpIHtcbiAgICAgICAgaW5uZXJEaXYgPSBjb21wb25lbnRFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlubmVyRGl2KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gTWVhc3VyZSB0aGUgYWN0dWFsIGhlaWdodFxuICAgICAgY29uc3QgbWVhc3VyZWRIZWlnaHQgPSBpbm5lckRpdi5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgIGlmIChtZWFzdXJlZEhlaWdodCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFN1Y2Nlc3MhIFNldCB0aGUgaW5pdGlhbCBoZWlnaHRcbiAgICAgIHRoaXMuaW5wdXRDb250YWluZXJIZWlnaHQuc2V0KG1lYXN1cmVkSGVpZ2h0KTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgLy8gQ3JlYXRlIGFuIEVsZW1lbnRSZWYgd3JhcHBlciBmb3IgUmVzaXplT2JzZXJ2ZXJcbiAgICAgIGNvbnN0IGlubmVyRGl2UmVmID0gbmV3IEVsZW1lbnRSZWYoaW5uZXJEaXYpO1xuXG4gICAgICAvLyBTZXQgdXAgUmVzaXplT2JzZXJ2ZXIgdG8gdHJhY2sgY2hhbmdlc1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlclNlcnZpY2VcbiAgICAgICAgLm9ic2VydmVFbGVtZW50KGlubmVyRGl2UmVmLCAwLCAyNTApXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdIZWlnaHQgPSBzdGF0ZS5oZWlnaHQ7XG5cbiAgICAgICAgICBpZiAobmV3SGVpZ2h0ICE9PSB0aGlzLmlucHV0Q29udGFpbmVySGVpZ2h0KCkgJiYgbmV3SGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dENvbnRhaW5lckhlaWdodC5zZXQobmV3SGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuaXNSZXNpemluZy5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgICAgIC8vIENsZWFyIGV4aXN0aW5nIHRpbWVvdXRcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc2l6ZVRpbWVvdXRSZWYpIHtcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZW91dFJlZik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCBpc1Jlc2l6aW5nIHRvIGZhbHNlIGFmdGVyIGEgc2hvcnQgZGVsYXlcbiAgICAgICAgICAgIHRoaXMucmVzaXplVGltZW91dFJlZiA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5pc1Jlc2l6aW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgIHRoaXMucmVzaXplVGltZW91dFJlZiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSwgMjUwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLy8gVHJ5IHRvIG1lYXN1cmUgaW1tZWRpYXRlbHlcbiAgICBpZiAoIW1lYXN1cmVBbmRPYnNlcnZlKCkpIHtcbiAgICAgIC8vIElmIGZhaWxlZCwgcmV0cnkgd2l0aCBpbmNyZWFzaW5nIGRlbGF5c1xuICAgICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICAgIGNvbnN0IG1heEF0dGVtcHRzID0gMTA7XG5cbiAgICAgIGNvbnN0IHJldHJ5ID0gKCkgPT4ge1xuICAgICAgICBhdHRlbXB0cysrO1xuICAgICAgICBpZiAobWVhc3VyZUFuZE9ic2VydmUoKSkge1xuICAgICAgICAgIC8vIFN1Y2Nlc3NmdWxseSBtZWFzdXJlZFxuICAgICAgICB9IGVsc2UgaWYgKGF0dGVtcHRzIDwgbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgICAvLyBFeHBvbmVudGlhbCBiYWNrb2ZmOiA1MG1zLCAxMDBtcywgMjAwbXMsIDQwMG1zLCBldGMuXG4gICAgICAgICAgY29uc3QgZGVsYXkgPSA1MCAqIE1hdGgucG93KDIsIE1hdGgubWluKGF0dGVtcHRzIC0gMSwgNCkpO1xuICAgICAgICAgIHNldFRpbWVvdXQocmV0cnksIGRlbGF5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWlsZWQgdG8gbWVhc3VyZSBhZnRlciBtYXggYXR0ZW1wdHNcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gU3RhcnQgcmV0cnkgd2l0aCBmaXJzdCBkZWxheVxuICAgICAgc2V0VGltZW91dChyZXRyeSwgNTApO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc2l6ZVRpbWVvdXRSZWYpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVvdXRSZWYpO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LXZpZXcudHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdmlldy50eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHlwZSwgVGVtcGxhdGVSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gXCJAYWctdWkvY2xpZW50XCI7XG5cbi8qKlxuICogUHJvcHMgZm9yIENvcGlsb3RDaGF0VmlldyBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3BpbG90Q2hhdFZpZXdQcm9wcyB7XG4gIG1lc3NhZ2VzPzogTWVzc2FnZVtdO1xuICBhdXRvU2Nyb2xsPzogYm9vbGVhbjtcblxuICAvLyBTbG90IGNvbmZpZ3VyYXRpb25zXG4gIG1lc3NhZ2VWaWV3Q29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBtZXNzYWdlVmlld1RlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgbWVzc2FnZVZpZXdDbGFzcz86IHN0cmluZztcblxuICBzY3JvbGxWaWV3Q29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBzY3JvbGxWaWV3VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBzY3JvbGxWaWV3Q2xhc3M/OiBzdHJpbmc7XG5cbiAgc2Nyb2xsVG9Cb3R0b21CdXR0b25Db21wb25lbnQ/OiBUeXBlPGFueT47XG4gIHNjcm9sbFRvQm90dG9tQnV0dG9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBzY3JvbGxUb0JvdHRvbUJ1dHRvbkNsYXNzPzogc3RyaW5nO1xuXG4gIGlucHV0Q29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBpbnB1dFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICBpbnB1dENvbnRhaW5lckNvbXBvbmVudD86IFR5cGU8YW55PjtcbiAgaW5wdXRDb250YWluZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIGlucHV0Q29udGFpbmVyQ2xhc3M/OiBzdHJpbmc7XG5cbiAgZmVhdGhlckNvbXBvbmVudD86IFR5cGU8YW55PjtcbiAgZmVhdGhlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgZmVhdGhlckNsYXNzPzogc3RyaW5nO1xuXG4gIGRpc2NsYWltZXJDb21wb25lbnQ/OiBUeXBlPGFueT47XG4gIGRpc2NsYWltZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIGRpc2NsYWltZXJDbGFzcz86IHN0cmluZztcbiAgZGlzY2xhaW1lclRleHQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udGV4dCBmb3IgY3VzdG9tIGxheW91dCB0ZW1wbGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RDaGF0Vmlld0xheW91dENvbnRleHQge1xuICBtZXNzYWdlVmlldzogYW55O1xuICBpbnB1dDogYW55O1xuICBzY3JvbGxWaWV3OiBhbnk7XG4gIHNjcm9sbFRvQm90dG9tQnV0dG9uOiBhbnk7XG4gIGZlYXRoZXI6IGFueTtcbiAgaW5wdXRDb250YWluZXI6IGFueTtcbiAgZGlzY2xhaW1lcjogYW55O1xufVxuIl19
|