@copilotkitnext/angular 0.0.9-alpha.3 → 0.0.11

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 (210) hide show
  1. package/dist/esm2022/index.mjs +2 -70
  2. package/dist/esm2022/lib/agent.mjs +73 -0
  3. package/dist/esm2022/lib/chat-config.mjs +35 -0
  4. package/dist/esm2022/lib/chat-state.mjs +18 -0
  5. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-buttons.mjs +344 -0
  6. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-renderer.mjs +260 -0
  7. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-toolbar.mjs +22 -0
  8. package/dist/esm2022/{components/chat/copilot-chat-assistant-message.component.mjs → lib/components/chat/copilot-chat-assistant-message.mjs} +216 -240
  9. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
  10. package/dist/esm2022/lib/components/chat/copilot-chat-audio-recorder.mjs +196 -0
  11. package/dist/esm2022/lib/components/chat/copilot-chat-buttons.mjs +299 -0
  12. package/dist/esm2022/lib/components/chat/copilot-chat-input-defaults.mjs +39 -0
  13. package/dist/esm2022/lib/components/chat/copilot-chat-input.mjs +634 -0
  14. package/dist/esm2022/lib/components/chat/copilot-chat-input.types.mjs +10 -0
  15. package/dist/esm2022/lib/components/chat/copilot-chat-message-view-cursor.mjs +27 -0
  16. package/dist/esm2022/lib/components/chat/copilot-chat-message-view.mjs +268 -0
  17. package/dist/esm2022/lib/components/chat/copilot-chat-message-view.types.mjs +2 -0
  18. package/dist/esm2022/lib/components/chat/copilot-chat-textarea.mjs +139 -0
  19. package/dist/esm2022/lib/components/chat/copilot-chat-tool-calls-view.mjs +36 -0
  20. package/dist/esm2022/lib/components/chat/copilot-chat-toolbar.mjs +20 -0
  21. package/dist/esm2022/lib/components/chat/copilot-chat-tools-menu.mjs +203 -0
  22. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-branch-navigation.mjs +118 -0
  23. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-buttons.mjs +182 -0
  24. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-renderer.mjs +28 -0
  25. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-toolbar.mjs +25 -0
  26. package/dist/esm2022/lib/components/chat/copilot-chat-user-message.mjs +306 -0
  27. package/dist/esm2022/lib/components/chat/copilot-chat-user-message.types.mjs +2 -0
  28. package/dist/esm2022/lib/components/chat/copilot-chat-view-disclaimer.mjs +48 -0
  29. package/dist/esm2022/lib/components/chat/copilot-chat-view-feather.mjs +41 -0
  30. package/dist/esm2022/lib/components/chat/copilot-chat-view-handlers.mjs +19 -0
  31. package/dist/esm2022/lib/components/chat/copilot-chat-view-input-container.mjs +96 -0
  32. package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.mjs +89 -0
  33. package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-view.mjs +456 -0
  34. package/dist/esm2022/lib/components/chat/copilot-chat-view.mjs +404 -0
  35. package/dist/esm2022/lib/components/chat/copilot-chat-view.types.mjs +2 -0
  36. package/dist/esm2022/lib/components/chat/copilot-chat.mjs +167 -0
  37. package/dist/esm2022/lib/config.mjs +9 -0
  38. package/dist/esm2022/lib/copilotkit.mjs +124 -0
  39. package/dist/esm2022/lib/directives/copilotkit-agent-context.mjs +130 -0
  40. package/dist/esm2022/lib/directives/stick-to-bottom.mjs +170 -0
  41. package/dist/esm2022/lib/directives/tooltip.mjs +217 -0
  42. package/dist/esm2022/lib/human-in-the-loop.mjs +19 -0
  43. package/dist/esm2022/lib/render-tool-calls.mjs +131 -0
  44. package/dist/esm2022/lib/resize-observer.mjs +152 -0
  45. package/dist/esm2022/lib/scroll-position.mjs +124 -0
  46. package/dist/esm2022/lib/slots/copilot-slot.mjs +156 -0
  47. package/dist/esm2022/lib/slots/index.mjs +4 -0
  48. package/dist/esm2022/lib/slots/slot.types.mjs +3 -3
  49. package/dist/esm2022/lib/slots/slot.utils.mjs +19 -15
  50. package/dist/esm2022/lib/tools.mjs +31 -0
  51. package/dist/esm2022/lib/utils.mjs +3 -3
  52. package/dist/esm2022/public-api.mjs +47 -0
  53. package/dist/fesm2022/copilotkitnext-angular.mjs +5249 -8271
  54. package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
  55. package/dist/index.d.ts +1 -55
  56. package/dist/lib/agent.d.ts +53 -0
  57. package/dist/{core/chat-configuration/chat-configuration.types.d.ts → lib/chat-config.d.ts} +4 -8
  58. package/dist/lib/chat-state.d.ts +10 -0
  59. package/dist/lib/components/chat/copilot-chat-assistant-message-buttons.d.ts +68 -0
  60. package/dist/lib/components/chat/copilot-chat-assistant-message-renderer.d.ts +26 -0
  61. package/dist/lib/components/chat/copilot-chat-assistant-message-toolbar.d.ts +7 -0
  62. package/dist/lib/components/chat/copilot-chat-assistant-message.d.ts +178 -0
  63. package/dist/{components → lib/components}/chat/copilot-chat-assistant-message.types.d.ts +1 -1
  64. package/dist/{components/chat/copilot-chat-audio-recorder.component.d.ts → lib/components/chat/copilot-chat-audio-recorder.d.ts} +10 -10
  65. package/dist/lib/components/chat/copilot-chat-buttons.d.ts +65 -0
  66. package/dist/lib/components/chat/copilot-chat-input-defaults.d.ts +38 -0
  67. package/dist/lib/components/chat/copilot-chat-input.d.ts +133 -0
  68. package/dist/{components → lib/components}/chat/copilot-chat-input.types.d.ts +11 -11
  69. package/dist/lib/components/chat/copilot-chat-message-view-cursor.d.ts +11 -0
  70. package/dist/{components/chat/copilot-chat-message-view.component.d.ts → lib/components/chat/copilot-chat-message-view.d.ts} +68 -36
  71. package/dist/{components → lib/components}/chat/copilot-chat-message-view.types.d.ts +2 -2
  72. package/dist/lib/components/chat/copilot-chat-textarea.d.ts +41 -0
  73. package/dist/lib/components/chat/copilot-chat-tool-calls-view.d.ts +55 -0
  74. package/dist/lib/components/chat/copilot-chat-toolbar.d.ts +7 -0
  75. package/dist/lib/components/chat/copilot-chat-tools-menu.d.ts +20 -0
  76. package/dist/lib/components/chat/copilot-chat-user-message-branch-navigation.d.ts +20 -0
  77. package/dist/lib/components/chat/copilot-chat-user-message-buttons.d.ts +35 -0
  78. package/dist/lib/components/chat/copilot-chat-user-message-renderer.d.ts +8 -0
  79. package/dist/lib/components/chat/copilot-chat-user-message-toolbar.d.ts +7 -0
  80. package/dist/lib/components/chat/copilot-chat-user-message.d.ts +55 -0
  81. package/dist/{components → lib/components}/chat/copilot-chat-user-message.types.d.ts +2 -2
  82. package/dist/lib/components/chat/copilot-chat-view-disclaimer.d.ts +15 -0
  83. package/dist/{components/chat/copilot-chat-view-feather.component.d.ts → lib/components/chat/copilot-chat-view-feather.d.ts} +6 -6
  84. package/dist/{components/chat/copilot-chat-view-handlers.service.d.ts → lib/components/chat/copilot-chat-view-handlers.d.ts} +3 -3
  85. package/dist/lib/components/chat/copilot-chat-view-input-container.d.ts +23 -0
  86. package/dist/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.d.ts +16 -0
  87. package/dist/lib/components/chat/copilot-chat-view-scroll-view.d.ts +114 -0
  88. package/dist/lib/components/chat/copilot-chat-view.d.ts +239 -0
  89. package/dist/{components → lib/components}/chat/copilot-chat-view.types.d.ts +2 -2
  90. package/dist/lib/components/chat/copilot-chat.d.ts +67 -0
  91. package/dist/lib/config.d.ts +16 -0
  92. package/dist/lib/copilotkit.d.ts +29 -0
  93. package/dist/{directives/copilotkit-agent-context.directive.d.ts → lib/directives/copilotkit-agent-context.d.ts} +5 -5
  94. package/dist/lib/directives/stick-to-bottom.d.ts +62 -0
  95. package/dist/lib/directives/tooltip.d.ts +33 -0
  96. package/dist/lib/human-in-the-loop.d.ts +13 -0
  97. package/dist/lib/render-tool-calls.d.ts +75 -0
  98. package/dist/{services/resize-observer.service.d.ts → lib/resize-observer.d.ts} +2 -2
  99. package/dist/{services/scroll-position.service.d.ts → lib/scroll-position.d.ts} +6 -6
  100. package/dist/lib/slots/copilot-slot.d.ts +34 -0
  101. package/dist/lib/slots/index.d.ts +3 -0
  102. package/dist/lib/slots/slot.types.d.ts +1 -1
  103. package/dist/lib/slots/slot.utils.d.ts +6 -4
  104. package/dist/lib/tools.d.ts +63 -0
  105. package/dist/lib/utils.d.ts +1 -1
  106. package/dist/public-api.d.ts +46 -0
  107. package/dist/styles.css +0 -69
  108. package/package.json +5 -5
  109. package/dist/components/chat/copilot-chat-assistant-message-buttons.component.d.ts +0 -75
  110. package/dist/components/chat/copilot-chat-assistant-message-renderer.component.d.ts +0 -31
  111. package/dist/components/chat/copilot-chat-assistant-message-toolbar.component.d.ts +0 -8
  112. package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +0 -132
  113. package/dist/components/chat/copilot-chat-buttons.component.d.ts +0 -66
  114. package/dist/components/chat/copilot-chat-input-defaults.d.ts +0 -37
  115. package/dist/components/chat/copilot-chat-input.component.d.ts +0 -133
  116. package/dist/components/chat/copilot-chat-message-view-cursor.component.d.ts +0 -15
  117. package/dist/components/chat/copilot-chat-textarea.component.d.ts +0 -45
  118. package/dist/components/chat/copilot-chat-tool-calls-view.component.d.ts +0 -35
  119. package/dist/components/chat/copilot-chat-toolbar.component.d.ts +0 -8
  120. package/dist/components/chat/copilot-chat-tools-menu.component.d.ts +0 -20
  121. package/dist/components/chat/copilot-chat-user-message-branch-navigation.component.d.ts +0 -23
  122. package/dist/components/chat/copilot-chat-user-message-buttons.component.d.ts +0 -39
  123. package/dist/components/chat/copilot-chat-user-message-renderer.component.d.ts +0 -9
  124. package/dist/components/chat/copilot-chat-user-message-toolbar.component.d.ts +0 -8
  125. package/dist/components/chat/copilot-chat-user-message.component.d.ts +0 -55
  126. package/dist/components/chat/copilot-chat-view-disclaimer.component.d.ts +0 -15
  127. package/dist/components/chat/copilot-chat-view-input-container.component.d.ts +0 -23
  128. package/dist/components/chat/copilot-chat-view-scroll-to-bottom-button.component.d.ts +0 -17
  129. package/dist/components/chat/copilot-chat-view-scroll-view.component.d.ts +0 -84
  130. package/dist/components/chat/copilot-chat-view.component.d.ts +0 -205
  131. package/dist/components/chat/copilot-chat.component.d.ts +0 -36
  132. package/dist/components/copilotkit-tool-render.component.d.ts +0 -25
  133. package/dist/core/chat-configuration/chat-configuration.providers.d.ts +0 -54
  134. package/dist/core/chat-configuration/chat-configuration.service.d.ts +0 -75
  135. package/dist/core/copilotkit.providers.d.ts +0 -13
  136. package/dist/core/copilotkit.service.d.ts +0 -119
  137. package/dist/core/copilotkit.types.d.ts +0 -81
  138. package/dist/directives/copilotkit-agent.directive.d.ts +0 -106
  139. package/dist/directives/copilotkit-chat-config.directive.d.ts +0 -84
  140. package/dist/directives/copilotkit-config.directive.d.ts +0 -44
  141. package/dist/directives/copilotkit-frontend-tool.directive.d.ts +0 -25
  142. package/dist/directives/copilotkit-human-in-the-loop.directive.d.ts +0 -124
  143. package/dist/directives/stick-to-bottom.directive.d.ts +0 -62
  144. package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +0 -384
  145. package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +0 -286
  146. package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +0 -27
  147. package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +0 -2
  148. package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +0 -202
  149. package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +0 -321
  150. package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +0 -38
  151. package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +0 -666
  152. package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +0 -10
  153. package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +0 -45
  154. package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +0 -296
  155. package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +0 -2
  156. package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +0 -188
  157. package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +0 -222
  158. package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +0 -25
  159. package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +0 -199
  160. package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +0 -137
  161. package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +0 -207
  162. package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +0 -35
  163. package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +0 -34
  164. package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +0 -341
  165. package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +0 -2
  166. package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +0 -52
  167. package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +0 -55
  168. package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +0 -19
  169. package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +0 -110
  170. package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +0 -93
  171. package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +0 -443
  172. package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +0 -479
  173. package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +0 -2
  174. package/dist/esm2022/components/chat/copilot-chat.component.mjs +0 -220
  175. package/dist/esm2022/components/copilotkit-tool-render.component.mjs +0 -150
  176. package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +0 -65
  177. package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +0 -145
  178. package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +0 -26
  179. package/dist/esm2022/core/copilotkit.providers.mjs +0 -34
  180. package/dist/esm2022/core/copilotkit.service.mjs +0 -411
  181. package/dist/esm2022/core/copilotkit.types.mjs +0 -13
  182. package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +0 -130
  183. package/dist/esm2022/directives/copilotkit-agent.directive.mjs +0 -221
  184. package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +0 -218
  185. package/dist/esm2022/directives/copilotkit-config.directive.mjs +0 -94
  186. package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +0 -128
  187. package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +0 -265
  188. package/dist/esm2022/directives/stick-to-bottom.directive.mjs +0 -181
  189. package/dist/esm2022/lib/directives/tooltip.directive.mjs +0 -211
  190. package/dist/esm2022/lib/slots/copilot-slot.component.mjs +0 -154
  191. package/dist/esm2022/services/resize-observer.service.mjs +0 -152
  192. package/dist/esm2022/services/scroll-position.service.mjs +0 -124
  193. package/dist/esm2022/types/frontend-tool.mjs +0 -2
  194. package/dist/esm2022/types/human-in-the-loop.mjs +0 -2
  195. package/dist/esm2022/utils/agent-context.utils.mjs +0 -114
  196. package/dist/esm2022/utils/agent.utils.mjs +0 -212
  197. package/dist/esm2022/utils/chat-config.utils.mjs +0 -186
  198. package/dist/esm2022/utils/copilotkit.utils.mjs +0 -20
  199. package/dist/esm2022/utils/frontend-tool.utils.mjs +0 -224
  200. package/dist/esm2022/utils/human-in-the-loop.utils.mjs +0 -293
  201. package/dist/lib/directives/tooltip.directive.d.ts +0 -33
  202. package/dist/lib/slots/copilot-slot.component.d.ts +0 -34
  203. package/dist/types/frontend-tool.d.ts +0 -37
  204. package/dist/types/human-in-the-loop.d.ts +0 -44
  205. package/dist/utils/agent-context.utils.d.ts +0 -75
  206. package/dist/utils/agent.utils.d.ts +0 -108
  207. package/dist/utils/chat-config.utils.d.ts +0 -166
  208. package/dist/utils/copilotkit.utils.d.ts +0 -16
  209. package/dist/utils/frontend-tool.utils.d.ts +0 -119
  210. 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