@copilotkitnext/angular 0.0.2 → 0.0.4

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 (168) hide show
  1. package/README.md +3 -3
  2. package/dist/README.md +3 -3
  3. package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +10 -10
  4. package/dist/components/chat/copilot-chat-message-view.component.d.ts +42 -42
  5. package/dist/components/chat/copilot-chat-view.component.d.ts +14 -14
  6. package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +384 -0
  7. package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +286 -0
  8. package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +27 -0
  9. package/dist/esm2022/components/chat/copilot-chat-assistant-message.component.mjs +433 -0
  10. package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
  11. package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +202 -0
  12. package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +321 -0
  13. package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +38 -0
  14. package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +666 -0
  15. package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +10 -0
  16. package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +45 -0
  17. package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +296 -0
  18. package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +2 -0
  19. package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +188 -0
  20. package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +216 -0
  21. package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +25 -0
  22. package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +199 -0
  23. package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +137 -0
  24. package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +207 -0
  25. package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +35 -0
  26. package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +34 -0
  27. package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +341 -0
  28. package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +2 -0
  29. package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +52 -0
  30. package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +55 -0
  31. package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +19 -0
  32. package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +110 -0
  33. package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +93 -0
  34. package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +443 -0
  35. package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +479 -0
  36. package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +2 -0
  37. package/dist/esm2022/components/chat/copilot-chat.component.mjs +214 -0
  38. package/dist/esm2022/components/copilotkit-tool-render.component.mjs +153 -0
  39. package/dist/esm2022/copilotkitnext-angular.mjs +5 -0
  40. package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +65 -0
  41. package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +145 -0
  42. package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +26 -0
  43. package/dist/esm2022/core/copilotkit.providers.mjs +34 -0
  44. package/dist/esm2022/core/copilotkit.service.mjs +430 -0
  45. package/dist/esm2022/core/copilotkit.types.mjs +12 -0
  46. package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +130 -0
  47. package/dist/esm2022/directives/copilotkit-agent.directive.mjs +217 -0
  48. package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +218 -0
  49. package/dist/esm2022/directives/copilotkit-config.directive.mjs +94 -0
  50. package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +130 -0
  51. package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +266 -0
  52. package/dist/esm2022/directives/stick-to-bottom.directive.mjs +181 -0
  53. package/dist/esm2022/index.mjs +70 -0
  54. package/dist/esm2022/lib/directives/tooltip.directive.mjs +211 -0
  55. package/dist/esm2022/lib/slots/copilot-slot.component.mjs +144 -0
  56. package/dist/esm2022/lib/slots/slot.types.mjs +6 -0
  57. package/dist/esm2022/lib/slots/slot.utils.mjs +222 -0
  58. package/dist/esm2022/lib/utils.mjs +10 -0
  59. package/dist/esm2022/services/resize-observer.service.mjs +152 -0
  60. package/dist/esm2022/services/scroll-position.service.mjs +124 -0
  61. package/dist/esm2022/types/frontend-tool.mjs +2 -0
  62. package/dist/esm2022/types/human-in-the-loop.mjs +2 -0
  63. package/dist/esm2022/utils/agent-context.utils.mjs +114 -0
  64. package/dist/esm2022/utils/agent.utils.mjs +204 -0
  65. package/dist/esm2022/utils/chat-config.utils.mjs +186 -0
  66. package/dist/esm2022/utils/copilotkit.utils.mjs +20 -0
  67. package/dist/esm2022/utils/frontend-tool.utils.mjs +228 -0
  68. package/dist/esm2022/utils/human-in-the-loop.utils.mjs +296 -0
  69. package/dist/fesm2022/copilotkitnext-angular.mjs +163 -164
  70. package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
  71. package/package.json +21 -18
  72. package/vitest.config.mts +32 -21
  73. package/.turbo/turbo-build.log +0 -38
  74. package/.turbo/turbo-check-types.log +0 -0
  75. package/.turbo/turbo-test.log +0 -71
  76. package/ng-package.json +0 -19
  77. package/src/components/chat/__tests__/copilot-chat-assistant-message.component.spec.ts +0 -282
  78. package/src/components/chat/__tests__/copilot-chat-input.component.spec.ts +0 -419
  79. package/src/components/chat/__tests__/copilot-chat-message-view.component.spec.ts +0 -372
  80. package/src/components/chat/__tests__/copilot-chat-user-message.component.spec.ts +0 -249
  81. package/src/components/chat/copilot-chat-assistant-message-buttons.component.ts +0 -292
  82. package/src/components/chat/copilot-chat-assistant-message-renderer.component.ts +0 -472
  83. package/src/components/chat/copilot-chat-assistant-message-toolbar.component.ts +0 -29
  84. package/src/components/chat/copilot-chat-assistant-message.component.ts +0 -463
  85. package/src/components/chat/copilot-chat-assistant-message.types.ts +0 -50
  86. package/src/components/chat/copilot-chat-audio-recorder.component.ts +0 -241
  87. package/src/components/chat/copilot-chat-buttons.component.ts +0 -308
  88. package/src/components/chat/copilot-chat-buttons.component.ts.bak +0 -471
  89. package/src/components/chat/copilot-chat-input-defaults.ts +0 -47
  90. package/src/components/chat/copilot-chat-input.component.ts +0 -512
  91. package/src/components/chat/copilot-chat-input.types.ts +0 -148
  92. package/src/components/chat/copilot-chat-message-view-cursor.component.ts +0 -51
  93. package/src/components/chat/copilot-chat-message-view.component.ts +0 -233
  94. package/src/components/chat/copilot-chat-message-view.types.ts +0 -39
  95. package/src/components/chat/copilot-chat-textarea.component.ts +0 -220
  96. package/src/components/chat/copilot-chat-tool-calls-view.component.ts +0 -261
  97. package/src/components/chat/copilot-chat-toolbar.component.ts +0 -35
  98. package/src/components/chat/copilot-chat-tools-menu.component.ts +0 -185
  99. package/src/components/chat/copilot-chat-user-message-branch-navigation.component.ts +0 -121
  100. package/src/components/chat/copilot-chat-user-message-buttons.component.ts +0 -170
  101. package/src/components/chat/copilot-chat-user-message-renderer.component.ts +0 -37
  102. package/src/components/chat/copilot-chat-user-message-toolbar.component.ts +0 -37
  103. package/src/components/chat/copilot-chat-user-message.component.ts +0 -247
  104. package/src/components/chat/copilot-chat-user-message.types.ts +0 -42
  105. package/src/components/chat/copilot-chat-view-disclaimer.component.ts +0 -51
  106. package/src/components/chat/copilot-chat-view-feather.component.ts +0 -47
  107. package/src/components/chat/copilot-chat-view-handlers.service.ts +0 -14
  108. package/src/components/chat/copilot-chat-view-input-container.component.ts +0 -87
  109. package/src/components/chat/copilot-chat-view-scroll-to-bottom-button.component.ts +0 -79
  110. package/src/components/chat/copilot-chat-view-scroll-view.component.ts +0 -322
  111. package/src/components/chat/copilot-chat-view.component.ts +0 -420
  112. package/src/components/chat/copilot-chat-view.types.ts +0 -52
  113. package/src/components/chat/copilot-chat.component.ts +0 -232
  114. package/src/components/copilotkit-tool-render.component.ts +0 -169
  115. package/src/core/__tests__/copilotkit.service.spec.ts +0 -1051
  116. package/src/core/__tests__/copilotkit.service.wildcard.spec.ts +0 -316
  117. package/src/core/chat-configuration/__tests__/chat-configuration.service.spec.ts +0 -287
  118. package/src/core/chat-configuration/chat-configuration.providers.ts +0 -71
  119. package/src/core/chat-configuration/chat-configuration.service.ts +0 -162
  120. package/src/core/chat-configuration/chat-configuration.types.ts +0 -57
  121. package/src/core/copilotkit.providers.ts +0 -59
  122. package/src/core/copilotkit.service.ts +0 -542
  123. package/src/core/copilotkit.types.ts +0 -132
  124. package/src/directives/__tests__/copilotkit-agent-context.directive.spec.ts +0 -384
  125. package/src/directives/__tests__/copilotkit-agent.directive.spec.ts +0 -253
  126. package/src/directives/__tests__/copilotkit-chat-config.directive.spec.ts +0 -385
  127. package/src/directives/__tests__/copilotkit-config.directive.spec.ts +0 -69
  128. package/src/directives/__tests__/copilotkit-frontend-tool-simple.directive.spec.ts +0 -60
  129. package/src/directives/__tests__/copilotkit-frontend-tool.directive.spec.ts +0 -108
  130. package/src/directives/__tests__/copilotkit-human-in-the-loop.directive.spec.ts +0 -452
  131. package/src/directives/copilotkit-agent-context.directive.ts +0 -138
  132. package/src/directives/copilotkit-agent.directive.ts +0 -225
  133. package/src/directives/copilotkit-chat-config.directive.ts +0 -241
  134. package/src/directives/copilotkit-config.directive.ts +0 -81
  135. package/src/directives/copilotkit-frontend-tool.directive.ts +0 -145
  136. package/src/directives/copilotkit-human-in-the-loop.directive.ts +0 -281
  137. package/src/directives/stick-to-bottom.directive.ts +0 -204
  138. package/src/index.ts +0 -105
  139. package/src/lib/directives/tooltip.directive.ts +0 -292
  140. package/src/lib/slots/__tests__/slot.utils.spec.ts +0 -377
  141. package/src/lib/slots/copilot-slot.component.ts +0 -135
  142. package/src/lib/slots/index.ts +0 -3
  143. package/src/lib/slots/slot.types.ts +0 -64
  144. package/src/lib/slots/slot.utils.ts +0 -289
  145. package/src/lib/utils.ts +0 -10
  146. package/src/public-api.ts +0 -1
  147. package/src/services/resize-observer.service.ts +0 -181
  148. package/src/services/scroll-position.service.ts +0 -169
  149. package/src/styles/globals.css +0 -266
  150. package/src/styles/index.css +0 -3
  151. package/src/test-setup.ts +0 -15
  152. package/src/testing/index.ts +0 -3
  153. package/src/testing/testing.utils.ts +0 -248
  154. package/src/types/frontend-tool.ts +0 -44
  155. package/src/types/human-in-the-loop.ts +0 -52
  156. package/src/utils/__tests__/agent.utils.spec.ts +0 -234
  157. package/src/utils/__tests__/chat-config.utils.spec.ts +0 -306
  158. package/src/utils/__tests__/frontend-tool-inject.spec.ts +0 -350
  159. package/src/utils/__tests__/frontend-tool-integration.spec.ts +0 -199
  160. package/src/utils/__tests__/frontend-tool.utils.spec.ts +0 -272
  161. package/src/utils/__tests__/human-in-the-loop.utils.spec.ts +0 -365
  162. package/src/utils/agent-context.utils.ts +0 -133
  163. package/src/utils/agent.utils.ts +0 -239
  164. package/src/utils/chat-config.utils.ts +0 -221
  165. package/src/utils/copilotkit.utils.ts +0 -20
  166. package/src/utils/frontend-tool.utils.ts +0 -266
  167. package/src/utils/human-in-the-loop.utils.ts +0 -359
  168. package/tsconfig.spec.json +0 -12
@@ -0,0 +1,430 @@
1
+ import { Injectable, Inject, signal, computed, effect, untracked, } from "@angular/core";
2
+ import { toObservable } from "@angular/core/rxjs-interop";
3
+ import { COPILOTKIT_RUNTIME_URL, COPILOTKIT_HEADERS, COPILOTKIT_PROPERTIES, COPILOTKIT_AGENTS, COPILOTKIT_RENDER_TOOL_CALLS, COPILOTKIT_FRONTEND_TOOLS, COPILOTKIT_HUMAN_IN_THE_LOOP, } from "./copilotkit.types";
4
+ import { CopilotKitCore, } from "@copilotkitnext/core";
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Angular service for managing CopilotKit state and interactions.
8
+ * Provides reactive state management using Angular signals and observables.
9
+ */
10
+ export class CopilotKitService {
11
+ // Initial values for stability tracking
12
+ initialFrontendTools;
13
+ initialHumanInTheLoop;
14
+ initialRenderToolCalls;
15
+ // Core instance - created once
16
+ copilotkit;
17
+ // State signals
18
+ _renderToolCalls;
19
+ _currentRenderToolCalls;
20
+ _runtimeUrl;
21
+ _headers;
22
+ _properties;
23
+ _agents;
24
+ _frontendTools;
25
+ _humanInTheLoop;
26
+ // Runtime state change notification signal
27
+ _runtimeStateVersion;
28
+ // Computed signals for processed values
29
+ _allTools;
30
+ _allRenderToolCalls;
31
+ // Public readonly signals - will be initialized in constructor
32
+ renderToolCalls;
33
+ currentRenderToolCalls;
34
+ runtimeUrl;
35
+ headers;
36
+ properties;
37
+ agents;
38
+ frontendTools;
39
+ humanInTheLoop;
40
+ runtimeStateVersion;
41
+ // Observable APIs for RxJS users - will be initialized in constructor
42
+ renderToolCalls$;
43
+ currentRenderToolCalls$;
44
+ runtimeUrl$;
45
+ headers$;
46
+ properties$;
47
+ agents$;
48
+ frontendTools$;
49
+ humanInTheLoop$;
50
+ // Context value as computed signal - will be initialized in constructor
51
+ context;
52
+ context$;
53
+ constructor(runtimeUrl, headers, properties, agents, renderToolCalls, frontendTools, humanInTheLoop) {
54
+ // Store initial values for stability checking
55
+ this.initialFrontendTools = frontendTools;
56
+ this.initialHumanInTheLoop = humanInTheLoop;
57
+ this.initialRenderToolCalls = renderToolCalls;
58
+ // Process tools and humanInTheLoop
59
+ const { allTools, allRenderToolCalls } = this.processTools(frontendTools, humanInTheLoop, renderToolCalls);
60
+ // Initialize core instance with processed tools
61
+ this.copilotkit = new CopilotKitCore({
62
+ runtimeUrl: undefined, // Prevent server-side fetching
63
+ headers,
64
+ properties,
65
+ agents,
66
+ tools: allTools,
67
+ });
68
+ // Initialize state signals
69
+ this._renderToolCalls =
70
+ signal(allRenderToolCalls);
71
+ this._currentRenderToolCalls =
72
+ signal(allRenderToolCalls);
73
+ this._runtimeUrl = signal(runtimeUrl);
74
+ this._headers = signal(headers);
75
+ this._properties = signal(properties);
76
+ this._agents = signal(agents);
77
+ this._frontendTools = signal(frontendTools);
78
+ this._humanInTheLoop = signal(humanInTheLoop);
79
+ this._runtimeStateVersion = signal(0);
80
+ // Initialize computed signals for processed values
81
+ this._allTools = computed(() => {
82
+ const tools = {};
83
+ // Add frontend tools
84
+ this._frontendTools().forEach((tool) => {
85
+ tools[tool.name] = tool;
86
+ });
87
+ // Process human-in-the-loop tools
88
+ this._humanInTheLoop().forEach((tool) => {
89
+ const frontendTool = {
90
+ name: tool.name,
91
+ description: tool.description,
92
+ parameters: tool.parameters,
93
+ followUp: tool.followUp,
94
+ handler: async (args) => {
95
+ console.warn(`Human-in-the-loop tool '${tool.name}' called but no interactive handler is set up.`);
96
+ return undefined;
97
+ },
98
+ };
99
+ tools[tool.name] = frontendTool;
100
+ });
101
+ return tools;
102
+ });
103
+ this._allRenderToolCalls = computed(() => {
104
+ const combined = [...this._renderToolCalls()];
105
+ // Add render components from frontend tools
106
+ this._frontendTools().forEach((tool) => {
107
+ if (tool.render && tool.parameters) {
108
+ combined.push({
109
+ name: tool.name,
110
+ args: tool.parameters,
111
+ render: tool.render,
112
+ ...(tool.agentId && { agentId: tool.agentId }),
113
+ });
114
+ }
115
+ });
116
+ // Add render components from human-in-the-loop tools
117
+ this._humanInTheLoop().forEach((tool) => {
118
+ if (tool.render && tool.parameters) {
119
+ combined.push({
120
+ name: tool.name,
121
+ args: tool.parameters,
122
+ render: tool.render,
123
+ ...(tool.agentId && { agentId: tool.agentId }),
124
+ });
125
+ }
126
+ });
127
+ return combined;
128
+ });
129
+ // Initialize public readonly signals
130
+ this.renderToolCalls = this._allRenderToolCalls;
131
+ this.currentRenderToolCalls = this._currentRenderToolCalls.asReadonly();
132
+ this.runtimeUrl = this._runtimeUrl.asReadonly();
133
+ this.headers = this._headers.asReadonly();
134
+ this.properties = this._properties.asReadonly();
135
+ this.agents = this._agents.asReadonly();
136
+ this.frontendTools = this._frontendTools.asReadonly();
137
+ this.humanInTheLoop = this._humanInTheLoop.asReadonly();
138
+ this.runtimeStateVersion = this._runtimeStateVersion.asReadonly();
139
+ // Initialize Observable APIs
140
+ this.renderToolCalls$ = toObservable(this.renderToolCalls);
141
+ this.currentRenderToolCalls$ = toObservable(this.currentRenderToolCalls);
142
+ this.runtimeUrl$ = toObservable(this.runtimeUrl);
143
+ this.headers$ = toObservable(this.headers);
144
+ this.properties$ = toObservable(this.properties);
145
+ this.agents$ = toObservable(this.agents);
146
+ this.frontendTools$ = toObservable(this.frontendTools);
147
+ this.humanInTheLoop$ = toObservable(this.humanInTheLoop);
148
+ // Initialize context value as computed signal
149
+ this.context = computed(() => {
150
+ // Touch the runtime state version to ensure this computed updates
151
+ // when runtime events occur (loaded/error)
152
+ this.runtimeStateVersion();
153
+ return {
154
+ copilotkit: this.copilotkit,
155
+ renderToolCalls: this.renderToolCalls(),
156
+ currentRenderToolCalls: this.currentRenderToolCalls(),
157
+ setCurrentRenderToolCalls: (v) => this.setCurrentRenderToolCalls(v),
158
+ };
159
+ });
160
+ this.context$ = toObservable(this.context);
161
+ // Effects must be created in injection context (constructor)
162
+ this.setupRuntimeSyncEffects();
163
+ this.setupStabilityWarnings();
164
+ this.setupEventSubscription();
165
+ }
166
+ /**
167
+ * Process frontend tools and human-in-the-loop tools
168
+ */
169
+ processTools(frontendTools, humanInTheLoop, renderToolCalls) {
170
+ const allTools = {};
171
+ const allRenderToolCalls = [...renderToolCalls];
172
+ // Add frontend tools
173
+ frontendTools.forEach((tool) => {
174
+ allTools[tool.name] = tool;
175
+ // Add render component if provided
176
+ if (tool.render && tool.parameters) {
177
+ allRenderToolCalls.push({
178
+ name: tool.name,
179
+ args: tool.parameters,
180
+ render: tool.render,
181
+ ...(tool.agentId && { agentId: tool.agentId }),
182
+ });
183
+ }
184
+ });
185
+ // Process human-in-the-loop tools
186
+ humanInTheLoop.forEach((tool) => {
187
+ // Create a frontend tool with placeholder handler
188
+ const frontendTool = {
189
+ name: tool.name,
190
+ description: tool.description,
191
+ parameters: tool.parameters,
192
+ followUp: tool.followUp,
193
+ ...(tool.agentId && { agentId: tool.agentId }),
194
+ handler: async (args) => {
195
+ // Placeholder handler - actual implementation will be handled by the render component
196
+ console.warn(`Human-in-the-loop tool '${tool.name}' called but no interactive handler is set up.`);
197
+ return undefined;
198
+ },
199
+ };
200
+ allTools[tool.name] = frontendTool;
201
+ // Add the render component
202
+ if (tool.render && tool.parameters) {
203
+ allRenderToolCalls.push({
204
+ name: tool.name,
205
+ args: tool.parameters,
206
+ render: tool.render,
207
+ ...(tool.agentId && { agentId: tool.agentId }),
208
+ });
209
+ }
210
+ });
211
+ return { allTools, allRenderToolCalls };
212
+ }
213
+ /**
214
+ * Setup stability warning effects
215
+ */
216
+ setupStabilityWarnings() {
217
+ // Warn if frontendTools changes
218
+ effect(() => {
219
+ const current = this._frontendTools();
220
+ if (current !== this.initialFrontendTools &&
221
+ this.initialFrontendTools.length > 0) {
222
+ untracked(() => {
223
+ console.error("frontendTools must be a stable array. To add/remove tools dynamically, use dynamic tool registration.");
224
+ });
225
+ }
226
+ });
227
+ // Warn if humanInTheLoop changes
228
+ effect(() => {
229
+ const current = this._humanInTheLoop();
230
+ if (current !== this.initialHumanInTheLoop &&
231
+ this.initialHumanInTheLoop.length > 0) {
232
+ untracked(() => {
233
+ console.error("humanInTheLoop must be a stable array. To add/remove human-in-the-loop tools dynamically, use dynamic tool registration.");
234
+ });
235
+ }
236
+ });
237
+ // Warn if renderToolCalls changes
238
+ effect(() => {
239
+ const current = this._renderToolCalls();
240
+ if (current !== this.initialRenderToolCalls &&
241
+ this.initialRenderToolCalls.length > 0) {
242
+ untracked(() => {
243
+ console.error("renderToolCalls must be a stable object. To add/remove tools dynamically, use dynamic tool registration.");
244
+ });
245
+ }
246
+ });
247
+ }
248
+ /**
249
+ * Setup effects to sync runtime configuration with CopilotKitCore
250
+ */
251
+ setupRuntimeSyncEffects() {
252
+ // Sync runtime URL
253
+ effect(() => {
254
+ const url = this.runtimeUrl();
255
+ untracked(() => this.copilotkit.setRuntimeUrl(url));
256
+ });
257
+ // Sync headers
258
+ effect(() => {
259
+ const headers = this.headers();
260
+ untracked(() => this.copilotkit.setHeaders(headers));
261
+ });
262
+ // Sync properties
263
+ effect(() => {
264
+ const properties = this.properties();
265
+ untracked(() => this.copilotkit.setProperties(properties));
266
+ });
267
+ // Sync agents
268
+ effect(() => {
269
+ const agents = this.agents();
270
+ untracked(() => this.copilotkit.setAgents(agents));
271
+ });
272
+ // Sync tools - computed from frontend tools and human-in-the-loop
273
+ effect(() => {
274
+ const tools = this._allTools();
275
+ // Update copilotkit.tools directly since there's no setTools method
276
+ untracked(() => {
277
+ this.copilotkit.tools = tools;
278
+ });
279
+ });
280
+ }
281
+ /**
282
+ * Subscribe to CopilotKit runtime events
283
+ */
284
+ setupEventSubscription() {
285
+ const unsubscribe = this.copilotkit.subscribe({
286
+ onRuntimeLoaded: () => {
287
+ // Increment version to notify all consumers that runtime state has changed
288
+ // This triggers re-evaluation of computed signals that depend on runtime state
289
+ this.notifyRuntimeStateChange();
290
+ },
291
+ onRuntimeLoadError: () => {
292
+ // Increment version to notify all consumers that runtime state has changed
293
+ // This triggers re-evaluation of computed signals that depend on runtime state
294
+ this.notifyRuntimeStateChange();
295
+ },
296
+ });
297
+ // Root service lives for app lifetime; unsubscribe not needed.
298
+ }
299
+ /**
300
+ * Notify consumers that the runtime state has changed.
301
+ * This is similar to React's forceUpdate - it triggers change detection
302
+ * for any computed signals or effects that depend on runtime state.
303
+ */
304
+ notifyRuntimeStateChange() {
305
+ this._runtimeStateVersion.update((version) => version + 1);
306
+ }
307
+ // Public mutation methods
308
+ /**
309
+ * Update the runtime URL
310
+ */
311
+ setRuntimeUrl(url) {
312
+ this._runtimeUrl.set(url);
313
+ }
314
+ /**
315
+ * Update request headers
316
+ */
317
+ setHeaders(headers) {
318
+ this._headers.set(headers);
319
+ }
320
+ /**
321
+ * Update runtime properties
322
+ */
323
+ setProperties(properties) {
324
+ this._properties.set(properties);
325
+ }
326
+ /**
327
+ * Update agents configuration
328
+ */
329
+ setAgents(agents) {
330
+ this._agents.set(agents);
331
+ }
332
+ /**
333
+ * Get an agent by ID
334
+ * @param agentId - The agent ID to retrieve
335
+ * @returns The agent or undefined if not found
336
+ */
337
+ getAgent(agentId) {
338
+ return this.copilotkit.getAgent(agentId);
339
+ }
340
+ /**
341
+ * Update render tool calls (warns if object reference changes)
342
+ */
343
+ setRenderToolCalls(renderToolCalls) {
344
+ if (renderToolCalls !== this.initialRenderToolCalls) {
345
+ console.error("renderToolCalls must be a stable object. To add/remove tools dynamically, use dynamic tool registration.");
346
+ }
347
+ this._renderToolCalls.set(renderToolCalls);
348
+ }
349
+ /**
350
+ * Update frontend tools array
351
+ */
352
+ setFrontendTools(frontendTools) {
353
+ if (frontendTools !== this.initialFrontendTools) {
354
+ console.error("frontendTools must be a stable array. To add/remove tools dynamically, use dynamic tool registration.");
355
+ }
356
+ this._frontendTools.set(frontendTools);
357
+ }
358
+ /**
359
+ * Update human-in-the-loop array
360
+ */
361
+ setHumanInTheLoop(humanInTheLoop) {
362
+ if (humanInTheLoop !== this.initialHumanInTheLoop) {
363
+ console.error("humanInTheLoop must be a stable array. To add/remove human-in-the-loop tools dynamically, use dynamic tool registration.");
364
+ }
365
+ this._humanInTheLoop.set(humanInTheLoop);
366
+ }
367
+ /**
368
+ * Update current render tool calls
369
+ */
370
+ setCurrentRenderToolCalls(renderToolCalls) {
371
+ this._currentRenderToolCalls.set(renderToolCalls);
372
+ }
373
+ /**
374
+ * Register a tool render
375
+ */
376
+ registerToolRender(name, render) {
377
+ const current = this._currentRenderToolCalls();
378
+ if (current.find((r) => r.name === name)) {
379
+ console.warn(`Tool render for '${name}' is being overwritten`);
380
+ }
381
+ this._currentRenderToolCalls.set([
382
+ ...current.filter((r) => r.name !== name),
383
+ render,
384
+ ]);
385
+ }
386
+ /**
387
+ * Unregister a tool render
388
+ */
389
+ unregisterToolRender(name) {
390
+ const current = this._currentRenderToolCalls();
391
+ const filtered = current.filter((r) => r.name !== name);
392
+ if (filtered.length !== current.length) {
393
+ this._currentRenderToolCalls.set(filtered);
394
+ }
395
+ }
396
+ /**
397
+ * Get a specific tool render
398
+ */
399
+ getToolRender(name) {
400
+ return this._currentRenderToolCalls().find((r) => r.name === name);
401
+ }
402
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitService, deps: [{ token: COPILOTKIT_RUNTIME_URL }, { token: COPILOTKIT_HEADERS }, { token: COPILOTKIT_PROPERTIES }, { token: COPILOTKIT_AGENTS }, { token: COPILOTKIT_RENDER_TOOL_CALLS }, { token: COPILOTKIT_FRONTEND_TOOLS }, { token: COPILOTKIT_HUMAN_IN_THE_LOOP }], target: i0.ɵɵFactoryTarget.Injectable });
403
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitService, providedIn: "root" });
404
+ }
405
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotKitService, decorators: [{
406
+ type: Injectable,
407
+ args: [{ providedIn: "root" }]
408
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
409
+ type: Inject,
410
+ args: [COPILOTKIT_RUNTIME_URL]
411
+ }] }, { type: undefined, decorators: [{
412
+ type: Inject,
413
+ args: [COPILOTKIT_HEADERS]
414
+ }] }, { type: undefined, decorators: [{
415
+ type: Inject,
416
+ args: [COPILOTKIT_PROPERTIES]
417
+ }] }, { type: undefined, decorators: [{
418
+ type: Inject,
419
+ args: [COPILOTKIT_AGENTS]
420
+ }] }, { type: undefined, decorators: [{
421
+ type: Inject,
422
+ args: [COPILOTKIT_RENDER_TOOL_CALLS]
423
+ }] }, { type: undefined, decorators: [{
424
+ type: Inject,
425
+ args: [COPILOTKIT_FRONTEND_TOOLS]
426
+ }] }, { type: undefined, decorators: [{
427
+ type: Inject,
428
+ args: [COPILOTKIT_HUMAN_IN_THE_LOOP]
429
+ }] }] });
430
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdGtpdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvY29waWxvdGtpdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQiw0QkFBNEIsRUFDNUIseUJBQXlCLEVBQ3pCLDRCQUE0QixHQUs3QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCxjQUFjLEdBR2YsTUFBTSxzQkFBc0IsQ0FBQzs7QUFHOUI7OztHQUdHO0FBRUgsTUFBTSxPQUFPLGlCQUFpQjtJQUM1Qix3Q0FBd0M7SUFDdkIsb0JBQW9CLENBQTZCO0lBQ2pELHFCQUFxQixDQUErQjtJQUNwRCxzQkFBc0IsQ0FBNEI7SUFFbkUsK0JBQStCO0lBQ3RCLFVBQVUsQ0FBaUI7SUFFcEMsZ0JBQWdCO0lBQ0MsZ0JBQWdCLENBRS9CO0lBQ2UsdUJBQXVCLENBRXRDO0lBQ2UsV0FBVyxDQUFnRDtJQUMzRCxRQUFRLENBQW9EO0lBQzVELFdBQVcsQ0FFMUI7SUFDZSxPQUFPLENBRXRCO0lBQ2UsY0FBYyxDQUU3QjtJQUNlLGVBQWUsQ0FFOUI7SUFFRiwyQ0FBMkM7SUFDMUIsb0JBQW9CLENBQW9DO0lBRXpFLHdDQUF3QztJQUN2QixTQUFTLENBRXhCO0lBQ2UsbUJBQW1CLENBRWxDO0lBRUYsK0RBQStEO0lBQ3RELGVBQWUsQ0FBTTtJQUNyQixzQkFBc0IsQ0FBTTtJQUM1QixVQUFVLENBQU07SUFDaEIsT0FBTyxDQUFNO0lBQ2IsVUFBVSxDQUFNO0lBQ2hCLE1B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QUM7UUFDL0MsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxJQUFZO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQ3JFLENBQUM7d0dBMWZVLGlCQUFpQixrQkFvRWxCLHNCQUFzQixhQUN0QixrQkFBa0IsYUFDbEIscUJBQXFCLGFBQ3JCLGlCQUFpQixhQUNqQiw0QkFBNEIsYUFFNUIseUJBQXlCLGFBRXpCLDRCQUE0Qjs0R0E1RTNCLGlCQUFpQixjQURKLE1BQU07OzRGQUNuQixpQkFBaUI7a0JBRDdCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFxRTdCLE1BQU07MkJBQUMsc0JBQXNCOzswQkFDN0IsTUFBTTsyQkFBQyxrQkFBa0I7OzBCQUN6QixNQUFNOzJCQUFDLHFCQUFxQjs7MEJBQzVCLE1BQU07MkJBQUMsaUJBQWlCOzswQkFDeEIsTUFBTTsyQkFBQyw0QkFBNEI7OzBCQUVuQyxNQUFNOzJCQUFDLHlCQUF5Qjs7MEJBRWhDLE1BQU07MkJBQUMsNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0LFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIHVudHJhY2tlZCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcFwiO1xuaW1wb3J0IHtcbiAgQ09QSUxPVEtJVF9SVU5USU1FX1VSTCxcbiAgQ09QSUxPVEtJVF9IRUFERVJTLFxuICBDT1BJTE9US0lUX1BST1BFUlRJRVMsXG4gIENPUElMT1RLSVRfQUdFTlRTLFxuICBDT1BJTE9US0lUX1JFTkRFUl9UT09MX0NBTExTLFxuICBDT1BJTE9US0lUX0ZST05URU5EX1RPT0xTLFxuICBDT1BJTE9US0lUX0hVTUFOX0lOX1RIRV9MT09QLFxuICBDb3BpbG90S2l0Q29udGV4dFZhbHVlLFxuICBUb29sQ2FsbFJlbmRlcixcbiAgQW5ndWxhckZyb250ZW5kVG9vbCxcbiAgQW5ndWxhckh1bWFuSW5UaGVMb29wLFxufSBmcm9tIFwiLi9jb3BpbG90a2l0LnR5cGVzXCI7XG5pbXBvcnQge1xuICBDb3BpbG90S2l0Q29yZSxcbiAgQ29waWxvdEtpdENvcmVDb25maWcsXG4gIEZyb250ZW5kVG9vbCxcbn0gZnJvbSBcIkBjb3BpbG90a2l0bmV4dC9jb3JlXCI7XG5pbXBvcnQgeyBBYnN0cmFjdEFnZW50IH0gZnJvbSBcIkBhZy11aS9jbGllbnRcIjtcblxuLyoqXG4gKiBBbmd1bGFyIHNlcnZpY2UgZm9yIG1hbmFnaW5nIENvcGlsb3RLaXQgc3RhdGUgYW5kIGludGVyYWN0aW9ucy5cbiAqIFByb3ZpZGVzIHJlYWN0aXZlIHN0YXRlIG1hbmFnZW1lbnQgdXNpbmcgQW5ndWxhciBzaWduYWxzIGFuZCBvYnNlcnZhYmxlcy5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiBcInJvb3RcIiB9KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RLaXRTZXJ2aWNlIHtcbiAgLy8gSW5pdGlhbCB2YWx1ZXMgZm9yIHN0YWJpbGl0eSB0cmFja2luZ1xuICBwcml2YXRlIHJlYWRvbmx5IGluaXRpYWxGcm9udGVuZFRvb2xzOiBBbmd1bGFyRnJvbnRlbmRUb29sPGFueT5bXTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbml0aWFsSHVtYW5JblRoZUxvb3A6IEFuZ3VsYXJIdW1hbkluVGhlTG9vcDxhbnk+W107XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5pdGlhbFJlbmRlclRvb2xDYWxsczogVG9vbENhbGxSZW5kZXI8dW5rbm93bj5bXTtcblxuICAvLyBDb3JlIGluc3RhbmNlIC0gY3JlYXRlZCBvbmNlXG4gIHJlYWRvbmx5IGNvcGlsb3RraXQ6IENvcGlsb3RLaXRDb3JlO1xuXG4gIC8vIFN0YXRlIHNpZ25hbHNcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyVG9vbENhbGxzOiBSZXR1cm5UeXBlPFxuICAgIHR5cGVvZiBzaWduYWw8VG9vbENhbGxSZW5kZXI8dW5rbm93bj5bXT5cbiAgPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfY3VycmVudFJlbmRlclRvb2xDYWxsczogUmV0dXJuVHlwZTxcbiAgICB0eXBlb2Ygc2lnbmFsPFRvb2xDYWxsUmVuZGVyPHVua25vd24+W10+XG4gID47XG4gIHByaXZhdGUgcmVhZG9ubHkgX3J1bnRpbWVVcmw6IFJldHVyblR5cGU8dHlwZW9mIHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBfaGVhZGVyczogUmV0dXJuVHlwZTx0eXBlb2Ygc2lnbmFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvcGVydGllczogUmV0dXJuVHlwZTxcbiAgICB0eXBlb2Ygc2lnbmFsPFJlY29yZDxzdHJpbmcsIHVua25vd24+PlxuICA+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZ2VudHM6IFJldHVyblR5cGU8XG4gICAgdHlwZW9mIHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBBYnN0cmFjdEFnZW50Pj5cbiAgPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfZnJvbnRlbmRUb29sczogUmV0dXJuVHlwZTxcbiAgICB0eXBlb2Ygc2lnbmFsPEFuZ3VsYXJGcm9udGVuZFRvb2w8YW55PltdPlxuICA+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9odW1hbkluVGhlTG9vcDogUmV0dXJuVHlwZTxcbiAgICB0eXBlb2Ygc2lnbmFsPEFuZ3VsYXJIdW1hbkluVGhlTG9vcDxhbnk+W10+XG4gID47XG5cbiAgLy8gUnVudGltZSBzdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHNpZ25hbFxuICBwcml2YXRlIHJlYWRvbmx5IF9ydW50aW1lU3RhdGVWZXJzaW9uOiBSZXR1cm5UeXBlPHR5cGVvZiBzaWduYWw8bnVtYmVyPj47XG5cbiAgLy8gQ29tcHV0ZWQgc2lnbmFscyBmb3IgcHJvY2Vzc2VkIHZhbHVlc1xuICBwcml2YXRlIHJlYWRvbmx5IF9hbGxUb29sczogUmV0dXJuVHlwZTxcbiAgICB0eXBlb2YgY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgRnJvbnRlbmRUb29sPGFueT4+PlxuICA+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9hbGxSZW5kZXJUb29sQ2FsbHM6IFJldHVyblR5cGU8XG4gICAgdHlwZW9mIGNvbXB1dGVkPFRvb2xDYWxsUmVuZGVyPHVua25vd24+W10+XG4gID47XG5cbiAgLy8gUHVibGljIHJlYWRvbmx5IHNpZ25hbHMgLSB3aWxsIGJlIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yXG4gIHJlYWRvbmx5IHJlbmRlclRvb2xDYWxsczogYW55O1xuICByZWFkb25seSBjdXJyZW50UmVuZGVyVG9vbENhbGxzOiBhbnk7XG4gIHJlYWRvbmx5IHJ1bnRpbWVVcmw6IGFueTtcbiAgcmVhZG9ubHkgaGVhZGVyczogYW55O1xuICByZWFkb25seSBwcm9wZXJ0aWVzOiBhbnk7XG4gIHJlYWRvbmx5IGFnZW50czogYW55O1xuICByZWFkb25seSBmcm9udGVuZFRvb2xzOiBhbnk7XG4gIHJlYWRvbmx5IGh1bWFuSW5UaGVMb29wOiBhbnk7XG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGF0ZVZlcnNpb246IGFueTtcblxuICAvLyBPYnNlcnZhYmxlIEFQSXMgZm9yIFJ4SlMgdXNlcnMgLSB3aWxsIGJlIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yXG4gIHJlYWRvbmx5IHJlbmRlclRvb2xDYWxscyQ6IGFueTtcbiAgcmVhZG9ubHkgY3VycmVudFJlbmRlclRvb2xDYWxscyQ6IGFueTtcbiAgcmVhZG9ubHkgcnVudGltZVVybCQ6IGFueTtcbiAgcmVhZG9ubHkgaGVhZGVycyQ6IGFueTtcbiAgcmVhZG9ubHkgcHJvcGVydGllcyQ6IGFueTtcbiAgcmVhZG9ubHkgYWdlbnRzJDogYW55O1xuICByZWFkb25seSBmcm9udGVuZFRvb2xzJDogYW55O1xuICByZWFkb25seSBodW1hbkluVGhlTG9vcCQ6IGFueTtcblxuICAvLyBDb250ZXh0IHZhbHVlIGFzIGNvbXB1dGVkIHNpZ25hbCAtIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3JcbiAgcmVhZG9ubHkgY29udGV4dDogYW55O1xuICByZWFkb25seSBjb250ZXh0JDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoQ09QSUxPVEtJVF9SVU5USU1FX1VSTCkgcnVudGltZVVybDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIEBJbmplY3QoQ09QSUxPVEtJVF9IRUFERVJTKSBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIEBJbmplY3QoQ09QSUxPVEtJVF9QUk9QRVJUSUVTKSBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBASW5qZWN0KENPUElMT1RLSVRfQUdFTlRTKSBhZ2VudHM6IFJlY29yZDxzdHJpbmcsIEFic3RyYWN0QWdlbnQ+LFxuICAgIEBJbmplY3QoQ09QSUxPVEtJVF9SRU5ERVJfVE9PTF9DQUxMUylcbiAgICByZW5kZXJUb29sQ2FsbHM6IFRvb2xDYWxsUmVuZGVyPHVua25vd24+W10sXG4gICAgQEluamVjdChDT1BJTE9US0lUX0ZST05URU5EX1RPT0xTKVxuICAgIGZyb250ZW5kVG9vbHM6IEFuZ3VsYXJGcm9udGVuZFRvb2w8YW55PltdLFxuICAgIEBJbmplY3QoQ09QSUxPVEtJVF9IVU1BTl9JTl9USEVfTE9PUClcbiAgICBodW1hbkluVGhlTG9vcDogQW5ndWxhckh1bWFuSW5UaGVMb29wPGFueT5bXVxuICApIHtcbiAgICAvLyBTdG9yZSBpbml0aWFsIHZhbHVlcyBmb3Igc3RhYmlsaXR5IGNoZWNraW5nXG4gICAgdGhpcy5pbml0aWFsRnJvbnRlbmRUb29scyA9IGZyb250ZW5kVG9vbHM7XG4gICAgdGhpcy5pbml0aWFsSHVtYW5JblRoZUxvb3AgPSBodW1hbkluVGhlTG9vcDtcbiAgICB0aGlzLmluaXRpYWxSZW5kZXJUb29sQ2FsbHMgPSByZW5kZXJUb29sQ2FsbHM7XG5cbiAgICAvLyBQcm9jZXNzIHRvb2xzIGFuZCBodW1hbkluVGhlTG9vcFxuICAgIGNvbnN0IHsgYWxsVG9vbHMsIGFsbFJlbmRlclRvb2xDYWxscyB9ID0gdGhpcy5wcm9jZXNzVG9vbHMoXG4gICAgICBmcm9udGVuZFRvb2xzLFxuICAgICAgaHVtYW5JblRoZUxvb3AsXG4gICAgICByZW5kZXJUb29sQ2FsbHNcbiAgICApO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBjb3JlIGluc3RhbmNlIHdpdGggcHJvY2Vzc2VkIHRvb2xzXG4gICAgdGhpcy5jb3BpbG90a2l0ID0gbmV3IENvcGlsb3RLaXRDb3JlKHtcbiAgICAgIHJ1bnRpbWVVcmw6IHVuZGVmaW5lZCwgLy8gUHJldmVudCBzZXJ2ZXItc2lkZSBmZXRjaGluZ1xuICAgICAgaGVhZGVycyxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICBhZ2VudHMsXG4gICAgICB0b29sczogYWxsVG9vbHMsXG4gICAgfSBhcyBDb3BpbG90S2l0Q29yZUNvbmZpZyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHN0YXRlIHNpZ25hbHNcbiAgICB0aGlzLl9yZW5kZXJUb29sQ2FsbHMgPVxuICAgICAgc2lnbmFsPFRvb2xDYWxsUmVuZGVyPHVua25vd24+W10+KGFsbFJlbmRlclRvb2xDYWxscyk7XG4gICAgdGhpcy5fY3VycmVudFJlbmRlclRvb2xDYWxscyA9XG4gICAgICBzaWduYWw8VG9vbENhbGxSZW5kZXI8dW5rbm93bj5bXT4oYWxsUmVuZGVyVG9vbENhbGxzKTtcbiAgICB0aGlzLl9ydW50aW1lVXJsID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4ocnVudGltZVVybCk7XG4gICAgdGhpcy5faGVhZGVycyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PihoZWFkZXJzKTtcbiAgICB0aGlzLl9wcm9wZXJ0aWVzID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pihwcm9wZXJ0aWVzKTtcbiAgICB0aGlzLl9hZ2VudHMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgQWJzdHJhY3RBZ2VudD4+KGFnZW50cyk7XG4gICAgdGhpcy5fZnJvbnRlbmRUb29scyA9IHNpZ25hbDxBbmd1bGFyRnJvbnRlbmRUb29sPGFueT5bXT4oZnJvbnRlbmRUb29scyk7XG4gICAgdGhpcy5faHVtYW5JblRoZUxvb3AgPSBzaWduYWw8QW5ndWxhckh1bWFuSW5UaGVMb29wPGFueT5bXT4oaHVtYW5JblRoZUxvb3ApO1xuICAgIHRoaXMuX3J1bnRpbWVTdGF0ZVZlcnNpb24gPSBzaWduYWw8bnVtYmVyPigwKTtcblxuICAgIC8vIEluaXRpYWxpemUgY29tcHV0ZWQgc2lnbmFscyBmb3IgcHJvY2Vzc2VkIHZhbHVlc1xuICAgIHRoaXMuX2FsbFRvb2xzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgdG9vbHM6IFJlY29yZDxzdHJpbmcsIEZyb250ZW5kVG9vbDxhbnk+PiA9IHt9O1xuXG4gICAgICAvLyBBZGQgZnJvbnRlbmQgdG9vbHNcbiAgICAgIHRoaXMuX2Zyb250ZW5kVG9vbHMoKS5mb3JFYWNoKCh0b29sKSA9PiB7XG4gICAgICAgIHRvb2xzW3Rvb2wubmFtZV0gPSB0b29sIGFzIEZyb250ZW5kVG9vbDxhbnk+O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFByb2Nlc3MgaHVtYW4taW4tdGhlLWxvb3AgdG9vbHNcbiAgICAgIHRoaXMuX2h1bWFuSW5UaGVMb29wKCkuZm9yRWFjaCgodG9vbCkgPT4ge1xuICAgICAgICBjb25zdCBmcm9udGVuZFRvb2w6IEZyb250ZW5kVG9vbDxhbnk+ID0ge1xuICAgICAgICAgIG5hbWU6IHRvb2wubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdG9vbC5kZXNjcmlwdGlvbixcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB0b29sLnBhcmFtZXRlcnMsXG4gICAgICAgICAgZm9sbG93VXA6IHRvb2wuZm9sbG93VXAsXG4gICAgICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICBgSHVtYW4taW4tdGhlLWxvb3AgdG9vbCAnJHt0b29sLm5hbWV9JyBjYWxsZWQgYnV0IG5vIGludGVyYWN0aXZlIGhhbmRsZXIgaXMgc2V0IHVwLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHRvb2xzW3Rvb2wubmFtZV0gPSBmcm9udGVuZFRvb2w7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRvb2xzO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fYWxsUmVuZGVyVG9vbENhbGxzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgY29tYmluZWQ6IFRvb2xDYWxsUmVuZGVyPHVua25vd24+W10gPSBbLi4udGhpcy5fcmVuZGVyVG9vbENhbGxzKCldO1xuXG4gICAgICAvLyBBZGQgcmVuZGVyIGNvbXBvbmVudHMgZnJvbSBmcm9udGVuZCB0b29sc1xuICAgICAgdGhpcy5fZnJvbnRlbmRUb29scygpLmZvckVhY2goKHRvb2wpID0+IHtcbiAgICAgICAgaWYgKHRvb2wucmVuZGVyICYmIHRvb2wucGFyYW1ldGVycykge1xuICAgICAgICAgIGNvbWJpbmVkLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogdG9vbC5uYW1lLFxuICAgICAgICAgICAgYXJnczogdG9vbC5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgcmVuZGVyOiB0b29sLnJlbmRlcixcbiAgICAgICAgICAgIC4uLih0b29sLmFnZW50SWQgJiYgeyBhZ2VudElkOiB0b29sLmFnZW50SWQgfSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgcmVuZGVyIGNvbXBvbmVudHMgZnJvbSBodW1hbi1pbi10aGUtbG9vcCB0b29sc1xuICAgICAgdGhpcy5faHVtYW5JblRoZUxvb3AoKS5mb3JFYWNoKCh0b29sKSA9PiB7XG4gICAgICAgIGlmICh0b29sLnJlbmRlciAmJiB0b29sLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICBjb21iaW5lZC5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6IHRvb2wubmFtZSxcbiAgICAgICAgICAgIGFyZ3M6IHRvb2wucGFyYW1ldGVycyxcbiAgICAgICAgICAgIHJlbmRlcjogdG9vbC5yZW5kZXIsXG4gICAgICAgICAgICAuLi4odG9vbC5hZ2VudElkICYmIHsgYWdlbnRJZDogdG9vbC5hZ2VudElkIH0pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNvbWJpbmVkO1xuICAgIH0pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBwdWJsaWMgcmVhZG9ubHkgc2lnbmFsc1xuICAgIHRoaXMucmVuZGVyVG9vbENhbGxzID0gdGhpcy5fYWxsUmVuZGVyVG9vbENhbGxzO1xuICAgIHRoaXMuY3VycmVudFJlbmRlclRvb2xDYWxscyA9IHRoaXMuX2N1cnJlbnRSZW5kZXJUb29sQ2FsbHMuYXNSZWFkb25seSgpO1xuICAgIHRoaXMucnVudGltZVVybCA9IHRoaXMuX3J1bnRpbWVVcmwuYXNSZWFkb25seSgpO1xuICAgIHRoaXMuaGVhZGVycyA9IHRoaXMuX2hlYWRlcnMuYXNSZWFkb25seSgpO1xuICAgIHRoaXMucHJvcGVydGllcyA9IHRoaXMuX3Byb3BlcnRpZXMuYXNSZWFkb25seSgpO1xuICAgIHRoaXMuYWdlbnRzID0gdGhpcy5fYWdlbnRzLmFzUmVhZG9ubHkoKTtcbiAgICB0aGlzLmZyb250ZW5kVG9vbHMgPSB0aGlzLl9mcm9udGVuZFRvb2xzLmFzUmVhZG9ubHkoKTtcbiAgICB0aGlzLmh1bWFuSW5UaGVMb29wID0gdGhpcy5faHVtYW5JblRoZUxvb3AuYXNSZWFkb25seSgpO1xuICAgIHRoaXMucnVudGltZVN0YXRlVmVyc2lvbiA9IHRoaXMuX3J1bnRpbWVTdGF0ZVZlcnNpb24uYXNSZWFkb25seSgpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBPYnNlcnZhYmxlIEFQSXNcbiAgICB0aGlzLnJlbmRlclRvb2xDYWxscyQgPSB0b09ic2VydmFibGUodGhpcy5yZW5kZXJUb29sQ2FsbHMpO1xuICAgIHRoaXMuY3VycmVudFJlbmRlclRvb2xDYWxscyQgPSB0b09ic2VydmFibGUodGhpcy5jdXJyZW50UmVuZGVyVG9vbENhbGxzKTtcbiAgICB0aGlzLnJ1bnRpbWVVcmwkID0gdG9PYnNlcnZhYmxlKHRoaXMucnVudGltZVVybCk7XG4gICAgdGhpcy5oZWFkZXJzJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLmhlYWRlcnMpO1xuICAgIHRoaXMucHJvcGVydGllcyQgPSB0b09ic2VydmFibGUodGhpcy5wcm9wZXJ0aWVzKTtcbiAgICB0aGlzLmFnZW50cyQgPSB0b09ic2VydmFibGUodGhpcy5hZ2VudHMpO1xuICAgIHRoaXMuZnJvbnRlbmRUb29scyQgPSB0b09ic2VydmFibGUodGhpcy5mcm9udGVuZFRvb2xzKTtcbiAgICB0aGlzLmh1bWFuSW5UaGVMb29wJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLmh1bWFuSW5UaGVMb29wKTtcblxuICAgIC8vIEluaXRpYWxpemUgY29udGV4dCB2YWx1ZSBhcyBjb21wdXRlZCBzaWduYWxcbiAgICB0aGlzLmNvbnRleHQgPSBjb21wdXRlZDxDb3BpbG90S2l0Q29udGV4dFZhbHVlPigoKSA9PiB7XG4gICAgICAvLyBUb3VjaCB0aGUgcnVudGltZSBzdGF0ZSB2ZXJzaW9uIHRvIGVuc3VyZSB0aGlzIGNvbXB1dGVkIHVwZGF0ZXNcbiAgICAgIC8vIHdoZW4gcnVudGltZSBldmVudHMgb2NjdXIgKGxvYWRlZC9lcnJvcilcbiAgICAgIHRoaXMucnVudGltZVN0YXRlVmVyc2lvbigpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb3BpbG90a2l0OiB0aGlzLmNvcGlsb3RraXQsXG4gICAgICAgIHJlbmRlclRvb2xDYWxsczogdGhpcy5yZW5kZXJUb29sQ2FsbHMoKSxcbiAgICAgICAgY3VycmVudFJlbmRlclRvb2xDYWxsczogdGhpcy5jdXJyZW50UmVuZGVyVG9vbENhbGxzKCksXG4gICAgICAgIHNldEN1cnJlbnRSZW5kZXJUb29sQ2FsbHM6ICh2KSA9PiB0aGlzLnNldEN1cnJlbnRSZW5kZXJUb29sQ2FsbHModiksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgdGhpcy5jb250ZXh0JCA9IHRvT2JzZXJ2YWJsZSh0aGlzLmNvbnRleHQpO1xuXG4gICAgLy8gRWZmZWN0cyBtdXN0IGJlIGNyZWF0ZWQgaW4gaW5qZWN0aW9uIGNvbnRleHQgKGNvbnN0cnVjdG9yKVxuICAgIHRoaXMuc2V0dXBSdW50aW1lU3luY0VmZmVjdHMoKTtcbiAgICB0aGlzLnNldHVwU3RhYmlsaXR5V2FybmluZ3MoKTtcbiAgICB0aGlzLnNldHVwRXZlbnRTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGZyb250ZW5kIHRvb2xzIGFuZCBodW1hbi1pbi10aGUtbG9vcCB0b29sc1xuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzVG9vbHMoXG4gICAgZnJvbnRlbmRUb29sczogQW5ndWxhckZyb250ZW5kVG9vbDxhbnk+W10sXG4gICAgaHVtYW5JblRoZUxvb3A6IEFuZ3VsYXJIdW1hbkluVGhlTG9vcDxhbnk+W10sXG4gICAgcmVuZGVyVG9vbENhbGxzOiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPltdXG4gICk6IHtcbiAgICBhbGxUb29sczogUmVjb3JkPHN0cmluZywgRnJvbnRlbmRUb29sPGFueT4+O1xuICAgIGFsbFJlbmRlclRvb2xDYWxsczogVG9vbENhbGxSZW5kZXI8dW5rbm93bj5bXTtcbiAgfSB7XG4gICAgY29uc3QgYWxsVG9vbHM6IFJlY29yZDxzdHJpbmcsIEZyb250ZW5kVG9vbDxhbnk+PiA9IHt9O1xuICAgIGNvbnN0IGFsbFJlbmRlclRvb2xDYWxsczogVG9vbENhbGxSZW5kZXI8dW5rbm93bj5bXSA9IFsuLi5yZW5kZXJUb29sQ2FsbHNdO1xuXG4gICAgLy8gQWRkIGZyb250ZW5kIHRvb2xzXG4gICAgZnJvbnRlbmRUb29scy5mb3JFYWNoKCh0b29sKSA9PiB7XG4gICAgICBhbGxUb29sc1t0b29sLm5hbWVdID0gdG9vbCBhcyBGcm9udGVuZFRvb2w8YW55PjtcblxuICAgICAgLy8gQWRkIHJlbmRlciBjb21wb25lbnQgaWYgcHJvdmlkZWRcbiAgICAgIGlmICh0b29sLnJlbmRlciAmJiB0b29sLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgYWxsUmVuZGVyVG9vbENhbGxzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IHRvb2wubmFtZSxcbiAgICAgICAgICBhcmdzOiB0b29sLnBhcmFtZXRlcnMsXG4gICAgICAgICAgcmVuZGVyOiB0b29sLnJlbmRlcixcbiAgICAgICAgICAuLi4odG9vbC5hZ2VudElkICYmIHsgYWdlbnRJZDogdG9vbC5hZ2VudElkIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFByb2Nlc3MgaHVtYW4taW4tdGhlLWxvb3AgdG9vbHNcbiAgICBodW1hbkluVGhlTG9vcC5mb3JFYWNoKCh0b29sKSA9PiB7XG4gICAgICAvLyBDcmVhdGUgYSBmcm9udGVuZCB0b29sIHdpdGggcGxhY2Vob2xkZXIgaGFuZGxlclxuICAgICAgY29uc3QgZnJvbnRlbmRUb29sOiBGcm9udGVuZFRvb2w8YW55PiA9IHtcbiAgICAgICAgbmFtZTogdG9vbC5uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogdG9vbC5kZXNjcmlwdGlvbixcbiAgICAgICAgcGFyYW1ldGVyczogdG9vbC5wYXJhbWV0ZXJzLFxuICAgICAgICBmb2xsb3dVcDogdG9vbC5mb2xsb3dVcCxcbiAgICAgICAgLi4uKHRvb2wuYWdlbnRJZCAmJiB7IGFnZW50SWQ6IHRvb2wuYWdlbnRJZCB9KSxcbiAgICAgICAgaGFuZGxlcjogYXN5bmMgKGFyZ3M6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIFBsYWNlaG9sZGVyIGhhbmRsZXIgLSBhY3R1YWwgaW1wbGVtZW50YXRpb24gd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSByZW5kZXIgY29tcG9uZW50XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYEh1bWFuLWluLXRoZS1sb29wIHRvb2wgJyR7dG9vbC5uYW1lfScgY2FsbGVkIGJ1dCBubyBpbnRlcmFjdGl2ZSBoYW5kbGVyIGlzIHNldCB1cC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGFsbFRvb2xzW3Rvb2wubmFtZV0gPSBmcm9udGVuZFRvb2w7XG5cbiAgICAgIC8vIEFkZCB0aGUgcmVuZGVyIGNvbXBvbmVudFxuICAgICAgaWYgKHRvb2wucmVuZGVyICYmIHRvb2wucGFyYW1ldGVycykge1xuICAgICAgICBhbGxSZW5kZXJUb29sQ2FsbHMucHVzaCh7XG4gICAgICAgICAgbmFtZTogdG9vbC5uYW1lLFxuICAgICAgICAgIGFyZ3M6IHRvb2wucGFyYW1ldGVycyxcbiAgICAgICAgICByZW5kZXI6IHRvb2wucmVuZGVyLFxuICAgICAgICAgIC4uLih0b29sLmFnZW50SWQgJiYgeyBhZ2VudElkOiB0b29sLmFnZW50SWQgfSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgYWxsVG9vbHMsIGFsbFJlbmRlclRvb2xDYWxscyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIHN0YWJpbGl0eSB3YXJuaW5nIGVmZmVjdHNcbiAgICovXG4gIHByaXZhdGUgc2V0dXBTdGFiaWxpdHlXYXJuaW5ncygpOiB2b2lkIHtcbiAgICAvLyBXYXJuIGlmIGZyb250ZW5kVG9vbHMgY2hhbmdlc1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fZnJvbnRlbmRUb29scygpO1xuICAgICAgaWYgKFxuICAgICAgICBjdXJyZW50ICE9PSB0aGlzLmluaXRpYWxGcm9udGVuZFRvb2xzICYmXG4gICAgICAgIHRoaXMuaW5pdGlhbEZyb250ZW5kVG9vbHMubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiZnJvbnRlbmRUb29scyBtdXN0IGJlIGEgc3RhYmxlIGFycmF5LiBUbyBhZGQvcmVtb3ZlIHRvb2xzIGR5bmFtaWNhbGx5LCB1c2UgZHluYW1pYyB0b29sIHJlZ2lzdHJhdGlvbi5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gV2FybiBpZiBodW1hbkluVGhlTG9vcCBjaGFuZ2VzXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9odW1hbkluVGhlTG9vcCgpO1xuICAgICAgaWYgKFxuICAgICAgICBjdXJyZW50ICE9PSB0aGlzLmluaXRpYWxIdW1hbkluVGhlTG9vcCAmJlxuICAgICAgICB0aGlzLmluaXRpYWxIdW1hbkluVGhlTG9vcC5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJodW1hbkluVGhlTG9vcCBtdXN0IGJlIGEgc3RhYmxlIGFycmF5LiBUbyBhZGQvcmVtb3ZlIGh1bWFuLWluLXRoZS1sb29wIHRvb2xzIGR5bmFtaWNhbGx5LCB1c2UgZHluYW1pYyB0b29sIHJlZ2lzdHJhdGlvbi5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gV2FybiBpZiByZW5kZXJUb29sQ2FsbHMgY2hhbmdlc1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fcmVuZGVyVG9vbENhbGxzKCk7XG4gICAgICBpZiAoXG4gICAgICAgIGN1cnJlbnQgIT09IHRoaXMuaW5pdGlhbFJlbmRlclRvb2xDYWxscyAmJlxuICAgICAgICB0aGlzLmluaXRpYWxSZW5kZXJUb29sQ2FsbHMubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwicmVuZGVyVG9vbENhbGxzIG11c3QgYmUgYSBzdGFibGUgb2JqZWN0LiBUbyBhZGQvcmVtb3ZlIHRvb2xzIGR5bmFtaWNhbGx5LCB1c2UgZHluYW1pYyB0b29sIHJlZ2lzdHJhdGlvbi5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIGVmZmVjdHMgdG8gc3luYyBydW50aW1lIGNvbmZpZ3VyYXRpb24gd2l0aCBDb3BpbG90S2l0Q29yZVxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cFJ1bnRpbWVTeW5jRWZmZWN0cygpOiB2b2lkIHtcbiAgICAvLyBTeW5jIHJ1bnRpbWUgVVJMXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHVybCA9IHRoaXMucnVudGltZVVybCgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuY29waWxvdGtpdC5zZXRSdW50aW1lVXJsKHVybCkpO1xuICAgIH0pO1xuXG4gICAgLy8gU3luYyBoZWFkZXJzXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLmhlYWRlcnMoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmNvcGlsb3RraXQuc2V0SGVhZGVycyhoZWFkZXJzKSk7XG4gICAgfSk7XG5cbiAgICAvLyBTeW5jIHByb3BlcnRpZXNcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHRoaXMucHJvcGVydGllcygpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuY29waWxvdGtpdC5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpKTtcbiAgICB9KTtcblxuICAgIC8vIFN5bmMgYWdlbnRzXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGFnZW50cyA9IHRoaXMuYWdlbnRzKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5jb3BpbG90a2l0LnNldEFnZW50cyhhZ2VudHMpKTtcbiAgICB9KTtcblxuICAgIC8vIFN5bmMgdG9vbHMgLSBjb21wdXRlZCBmcm9tIGZyb250ZW5kIHRvb2xzIGFuZCBodW1hbi1pbi10aGUtbG9vcFxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCB0b29scyA9IHRoaXMuX2FsbFRvb2xzKCk7XG4gICAgICAvLyBVcGRhdGUgY29waWxvdGtpdC50b29scyBkaXJlY3RseSBzaW5jZSB0aGVyZSdzIG5vIHNldFRvb2xzIG1ldGhvZFxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb3BpbG90a2l0LnRvb2xzID0gdG9vbHM7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gQ29waWxvdEtpdCBydW50aW1lIGV2ZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cEV2ZW50U3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gdGhpcy5jb3BpbG90a2l0LnN1YnNjcmliZSh7XG4gICAgICBvblJ1bnRpbWVMb2FkZWQ6ICgpID0+IHtcbiAgICAgICAgLy8gSW5jcmVtZW50IHZlcnNpb24gdG8gbm90aWZ5IGFsbCBjb25zdW1lcnMgdGhhdCBydW50aW1lIHN0YXRlIGhhcyBjaGFuZ2VkXG4gICAgICAgIC8vIFRoaXMgdHJpZ2dlcnMgcmUtZXZhbHVhdGlvbiBvZiBjb21wdXRlZCBzaWduYWxzIHRoYXQgZGVwZW5kIG9uIHJ1bnRpbWUgc3RhdGVcbiAgICAgICAgdGhpcy5ub3RpZnlSdW50aW1lU3RhdGVDaGFuZ2UoKTtcbiAgICAgIH0sXG4gICAgICBvblJ1bnRpbWVMb2FkRXJyb3I6ICgpID0+IHtcbiAgICAgICAgLy8gSW5jcmVtZW50IHZlcnNpb24gdG8gbm90aWZ5IGFsbCBjb25zdW1lcnMgdGhhdCBydW50aW1lIHN0YXRlIGhhcyBjaGFuZ2VkXG4gICAgICAgIC8vIFRoaXMgdHJpZ2dlcnMgcmUtZXZhbHVhdGlvbiBvZiBjb21wdXRlZCBzaWduYWxzIHRoYXQgZGVwZW5kIG9uIHJ1bnRpbWUgc3RhdGVcbiAgICAgICAgdGhpcy5ub3RpZnlSdW50aW1lU3RhdGVDaGFuZ2UoKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBSb290IHNlcnZpY2UgbGl2ZXMgZm9yIGFwcCBsaWZldGltZTsgdW5zdWJzY3JpYmUgbm90IG5lZWRlZC5cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZnkgY29uc3VtZXJzIHRoYXQgdGhlIHJ1bnRpbWUgc3RhdGUgaGFzIGNoYW5nZWQuXG4gICAqIFRoaXMgaXMgc2ltaWxhciB0byBSZWFjdCdzIGZvcmNlVXBkYXRlIC0gaXQgdHJpZ2dlcnMgY2hhbmdlIGRldGVjdGlvblxuICAgKiBmb3IgYW55IGNvbXB1dGVkIHNpZ25hbHMgb3IgZWZmZWN0cyB0aGF0IGRlcGVuZCBvbiBydW50aW1lIHN0YXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBub3RpZnlSdW50aW1lU3RhdGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5fcnVudGltZVN0YXRlVmVyc2lvbi51cGRhdGUoKHZlcnNpb24pID0+IHZlcnNpb24gKyAxKTtcbiAgfVxuXG4gIC8vIFB1YmxpYyBtdXRhdGlvbiBtZXRob2RzXG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgcnVudGltZSBVUkxcbiAgICovXG4gIHNldFJ1bnRpbWVVcmwodXJsPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fcnVudGltZVVybC5zZXQodXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgcmVxdWVzdCBoZWFkZXJzXG4gICAqL1xuICBzZXRIZWFkZXJzKGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLl9oZWFkZXJzLnNldChoZWFkZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgcnVudGltZSBwcm9wZXJ0aWVzXG4gICAqL1xuICBzZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgdGhpcy5fcHJvcGVydGllcy5zZXQocHJvcGVydGllcyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGFnZW50cyBjb25maWd1cmF0aW9uXG4gICAqL1xuICBzZXRBZ2VudHMoYWdlbnRzOiBSZWNvcmQ8c3RyaW5nLCBBYnN0cmFjdEFnZW50Pik6IHZvaWQge1xuICAgIHRoaXMuX2FnZW50cy5zZXQoYWdlbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYWdlbnQgYnkgSURcbiAgICogQHBhcmFtIGFnZW50SWQgLSBUaGUgYWdlbnQgSUQgdG8gcmV0cmlldmVcbiAgICogQHJldHVybnMgVGhlIGFnZW50IG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICovXG4gIGdldEFnZW50KGFnZW50SWQ6IHN0cmluZyk6IEFic3RyYWN0QWdlbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvcGlsb3RraXQuZ2V0QWdlbnQoYWdlbnRJZCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHJlbmRlciB0b29sIGNhbGxzICh3YXJucyBpZiBvYmplY3QgcmVmZXJlbmNlIGNoYW5nZXMpXG4gICAqL1xuICBzZXRSZW5kZXJUb29sQ2FsbHMocmVuZGVyVG9vbENhbGxzOiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPltdKTogdm9pZCB7XG4gICAgaWYgKHJlbmRlclRvb2xDYWxscyAhPT0gdGhpcy5pbml0aWFsUmVuZGVyVG9vbENhbGxzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBcInJlbmRlclRvb2xDYWxscyBtdXN0IGJlIGEgc3RhYmxlIG9iamVjdC4gVG8gYWRkL3JlbW92ZSB0b29scyBkeW5hbWljYWxseSwgdXNlIGR5bmFtaWMgdG9vbCByZWdpc3RyYXRpb24uXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuX3JlbmRlclRvb2xDYWxscy5zZXQocmVuZGVyVG9vbENhbGxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZnJvbnRlbmQgdG9vbHMgYXJyYXlcbiAgICovXG4gIHNldEZyb250ZW5kVG9vbHMoZnJvbnRlbmRUb29sczogQW5ndWxhckZyb250ZW5kVG9vbDxhbnk+W10pOiB2b2lkIHtcbiAgICBpZiAoZnJvbnRlbmRUb29scyAhPT0gdGhpcy5pbml0aWFsRnJvbnRlbmRUb29scykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgXCJmcm9udGVuZFRvb2xzIG11c3QgYmUgYSBzdGFibGUgYXJyYXkuIFRvIGFkZC9yZW1vdmUgdG9vbHMgZHluYW1pY2FsbHksIHVzZSBkeW5hbWljIHRvb2wgcmVnaXN0cmF0aW9uLlwiXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9mcm9udGVuZFRvb2xzLnNldChmcm9udGVuZFRvb2xzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgaHVtYW4taW4tdGhlLWxvb3AgYXJyYXlcbiAgICovXG4gIHNldEh1bWFuSW5UaGVMb29wKGh1bWFuSW5UaGVMb29wOiBBbmd1bGFySHVtYW5JblRoZUxvb3A8YW55PltdKTogdm9pZCB7XG4gICAgaWYgKGh1bWFuSW5UaGVMb29wICE9PSB0aGlzLmluaXRpYWxIdW1hbkluVGhlTG9vcCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgXCJodW1hbkluVGhlTG9vcCBtdXN0IGJlIGEgc3RhYmxlIGFycmF5LiBUbyBhZGQvcmVtb3ZlIGh1bWFuLWluLXRoZS1sb29wIHRvb2xzIGR5bmFtaWNhbGx5LCB1c2UgZHluYW1pYyB0b29sIHJlZ2lzdHJhdGlvbi5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5faHVtYW5JblRoZUxvb3Auc2V0KGh1bWFuSW5UaGVMb29wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY3VycmVudCByZW5kZXIgdG9vbCBjYWxsc1xuICAgKi9cbiAgc2V0Q3VycmVudFJlbmRlclRvb2xDYWxscyhyZW5kZXJUb29sQ2FsbHM6IFRvb2xDYWxsUmVuZGVyPHVua25vd24+W10pOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50UmVuZGVyVG9vbENhbGxzLnNldChyZW5kZXJUb29sQ2FsbHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgdG9vbCByZW5kZXJcbiAgICovXG4gIHJlZ2lzdGVyVG9vbFJlbmRlcihuYW1lOiBzdHJpbmcsIHJlbmRlcjogVG9vbENhbGxSZW5kZXI8dW5rbm93bj4pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fY3VycmVudFJlbmRlclRvb2xDYWxscygpO1xuICAgIGlmIChjdXJyZW50LmZpbmQoKHIpID0+IHIubmFtZSA9PT0gbmFtZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgVG9vbCByZW5kZXIgZm9yICcke25hbWV9JyBpcyBiZWluZyBvdmVyd3JpdHRlbmApO1xuICAgIH1cbiAgICB0aGlzLl9jdXJyZW50UmVuZGVyVG9vbENhbGxzLnNldChbXG4gICAgICAuLi5jdXJyZW50LmZpbHRlcigocikgPT4gci5uYW1lICE9PSBuYW1lKSxcbiAgICAgIHJlbmRlcixcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVyIGEgdG9vbCByZW5kZXJcbiAgICovXG4gIHVucmVnaXN0ZXJUb29sUmVuZGVyKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9jdXJyZW50UmVuZGVyVG9vbENhbGxzKCk7XG4gICAgY29uc3QgZmlsdGVyZWQgPSBjdXJyZW50LmZpbHRlcigocikgPT4gci5uYW1lICE9PSBuYW1lKTtcbiAgICBpZiAoZmlsdGVyZWQubGVuZ3RoICE9PSBjdXJyZW50Lmxlbmd0aCkge1xuICAgICAgdGhpcy5fY3VycmVudFJlbmRlclRvb2xDYWxscy5zZXQoZmlsdGVyZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzcGVjaWZpYyB0b29sIHJlbmRlclxuICAgKi9cbiAgZ2V0VG9vbFJlbmRlcihuYW1lOiBzdHJpbmcpOiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRSZW5kZXJUb29sQ2FsbHMoKS5maW5kKChyKSA9PiByLm5hbWUgPT09IG5hbWUpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,12 @@
1
+ import { InjectionToken } from "@angular/core";
2
+ // Re-export ToolCallStatus from core
3
+ export { ToolCallStatus } from "@copilotkitnext/core";
4
+ // Injection tokens for dependency injection
5
+ export const COPILOTKIT_RUNTIME_URL = new InjectionToken("COPILOTKIT_RUNTIME_URL");
6
+ export const COPILOTKIT_HEADERS = new InjectionToken("COPILOTKIT_HEADERS", { factory: () => ({}) });
7
+ export const COPILOTKIT_PROPERTIES = new InjectionToken("COPILOTKIT_PROPERTIES", { factory: () => ({}) });
8
+ export const COPILOTKIT_AGENTS = new InjectionToken("COPILOTKIT_AGENTS", { factory: () => ({}) });
9
+ export const COPILOTKIT_RENDER_TOOL_CALLS = new InjectionToken("COPILOTKIT_RENDER_TOOL_CALLS", { factory: () => [] });
10
+ export const COPILOTKIT_FRONTEND_TOOLS = new InjectionToken("COPILOTKIT_FRONTEND_TOOLS", { factory: () => [] });
11
+ export const COPILOTKIT_HUMAN_IN_THE_LOOP = new InjectionToken("COPILOTKIT_HUMAN_IN_THE_LOOP", { factory: () => [] });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdGtpdC50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL2NvcGlsb3RraXQudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBNkIsTUFBTSxlQUFlLENBQUM7QUFrQjFFLHFDQUFxQztBQUNyQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUF3RHRELDRDQUE0QztBQUM1QyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FDdEQsd0JBQXdCLENBQ3pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLGNBQWMsQ0FDbEQsb0JBQW9CLEVBQ3BCLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FDeEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksY0FBYyxDQUVyRCx1QkFBdUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUVwRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLGNBQWMsQ0FFakQsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFaEQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxjQUFjLENBRTVELDhCQUE4QixFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxjQUFjLENBRXpELDJCQUEyQixFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxjQUFjLENBRTVELDhCQUE4QixFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiwgVGVtcGxhdGVSZWYsIFR5cGUsIFNpZ25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IENvcGlsb3RLaXRDb3JlLCBUb29sQ2FsbFN0YXR1cyB9IGZyb20gXCJAY29waWxvdGtpdG5leHQvY29yZVwiO1xuaW1wb3J0IHsgQWJzdHJhY3RBZ2VudCB9IGZyb20gXCJAYWctdWkvY2xpZW50XCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IEFuZ3VsYXJGcm9udGVuZFRvb2wgfSBmcm9tIFwiLi4vdHlwZXMvZnJvbnRlbmQtdG9vbFwiO1xuaW1wb3J0IHR5cGUgeyBBbmd1bGFySHVtYW5JblRoZUxvb3AgfSBmcm9tIFwiLi4vdHlwZXMvaHVtYW4taW4tdGhlLWxvb3BcIjtcblxuLy8gUmUtZXhwb3J0IGNvbW1vbmx5IHVzZWQgdHlwZXNcbmV4cG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gXCJAYWctdWkvY2xpZW50XCI7XG5cbi8vIFJlLWV4cG9ydCB0b29sIHR5cGVzIGZyb20gdGhlaXIgb3duIGZpbGVzXG5leHBvcnQgdHlwZSB7IEFuZ3VsYXJGcm9udGVuZFRvb2wgfSBmcm9tIFwiLi4vdHlwZXMvZnJvbnRlbmQtdG9vbFwiO1xuZXhwb3J0IHR5cGUge1xuICBBbmd1bGFySHVtYW5JblRoZUxvb3AsXG4gIEh1bWFuSW5UaGVMb29wUHJvcHMsXG59IGZyb20gXCIuLi90eXBlcy9odW1hbi1pbi10aGUtbG9vcFwiO1xuXG4vLyBSZS1leHBvcnQgVG9vbENhbGxTdGF0dXMgZnJvbSBjb3JlXG5leHBvcnQgeyBUb29sQ2FsbFN0YXR1cyB9IGZyb20gXCJAY29waWxvdGtpdG5leHQvY29yZVwiO1xuXG4vLyBQcm9wcyBwYXNzZWQgdG8gdG9vbCByZW5kZXIgY29tcG9uZW50cyAtIGRpc2NyaW1pbmF0ZWQgdW5pb24gbWF0Y2hpbmcgUmVhY3RcbmV4cG9ydCB0eXBlIFRvb2xDYWxsUHJvcHM8VCA9IHVua25vd24+ID1cbiAgfCB7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgYXJnczogUGFydGlhbDxUPjtcbiAgICAgIHN0YXR1czogVG9vbENhbGxTdGF0dXMuSW5Qcm9ncmVzcztcbiAgICAgIHJlc3VsdDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfCB7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgYXJnczogVDtcbiAgICAgIHN0YXR1czogVG9vbENhbGxTdGF0dXMuRXhlY3V0aW5nO1xuICAgICAgcmVzdWx0OiB1bmRlZmluZWQ7XG4gICAgfVxuICB8IHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICBhcmdzOiBUO1xuICAgICAgc3RhdHVzOiBUb29sQ2FsbFN0YXR1cy5Db21wbGV0ZTtcbiAgICAgIHJlc3VsdDogc3RyaW5nO1xuICAgIH07XG5cbi8vIEFuZ3VsYXItc3BlY2lmaWMgdG9vbCBjYWxsIHJlbmRlciBkZWZpbml0aW9uIHdpdGggcHJvcGVyIHR5cGluZ1xuZXhwb3J0IGludGVyZmFjZSBBbmd1bGFyVG9vbENhbGxSZW5kZXI8VCA9IHVua25vd24+IHtcbiAgbmFtZTogc3RyaW5nO1xuICBhcmdzOiB6LlpvZFNjaGVtYTxUPjtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGFnZW50IElEIHRvIGNvbnN0cmFpbiB0aGlzIHRvb2wgcmVuZGVyIHRvIGEgc3BlY2lmaWMgYWdlbnQuXG4gICAqIElmIHNwZWNpZmllZCwgdGhpcyByZW5kZXIgd2lsbCBvbmx5IGJlIHVzZWQgZm9yIHRoZSBzcGVjaWZpZWQgYWdlbnQuXG4gICAqL1xuICBhZ2VudElkPzogc3RyaW5nO1xuICByZW5kZXI6IFR5cGU8YW55PiB8IFRlbXBsYXRlUmVmPFRvb2xDYWxsUHJvcHM8VD4+O1xufVxuXG4vLyBUeXBlIGFsaWFzIGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUgVG9vbENhbGxSZW5kZXI8VCA9IHVua25vd24+ID0gQW5ndWxhclRvb2xDYWxsUmVuZGVyPFQ+O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RLaXRDb250ZXh0VmFsdWUge1xuICBjb3BpbG90a2l0OiBDb3BpbG90S2l0Q29yZTtcbiAgcmVuZGVyVG9vbENhbGxzOiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPltdO1xuICBjdXJyZW50UmVuZGVyVG9vbENhbGxzOiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPltdO1xuICBzZXRDdXJyZW50UmVuZGVyVG9vbENhbGxzOiAodjogVG9vbENhbGxSZW5kZXI8dW5rbm93bj5bXSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb3BpbG90S2l0UnVudGltZUlucHV0cyB7XG4gIHJ1bnRpbWVVcmw/OiBzdHJpbmc7XG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGFnZW50cz86IFJlY29yZDxzdHJpbmcsIEFic3RyYWN0QWdlbnQ+O1xuICByZW5kZXJUb29sQ2FsbHM/OiBUb29sQ2FsbFJlbmRlcjx1bmtub3duPltdO1xufVxuXG4vLyBJbmplY3Rpb24gdG9rZW5zIGZvciBkZXBlbmRlbmN5IGluamVjdGlvblxuZXhwb3J0IGNvbnN0IENPUElMT1RLSVRfUlVOVElNRV9VUkwgPSBuZXcgSW5qZWN0aW9uVG9rZW48c3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgXCJDT1BJTE9US0lUX1JVTlRJTUVfVVJMXCJcbik7XG5cbmV4cG9ydCBjb25zdCBDT1BJTE9US0lUX0hFQURFUlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oXG4gIFwiQ09QSUxPVEtJVF9IRUFERVJTXCIsXG4gIHsgZmFjdG9yeTogKCkgPT4gKHt9KSB9XG4pO1xuXG5leHBvcnQgY29uc3QgQ09QSUxPVEtJVF9QUk9QRVJUSUVTID0gbmV3IEluamVjdGlvblRva2VuPFxuICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuPihcIkNPUElMT1RLSVRfUFJPUEVSVElFU1wiLCB7IGZhY3Rvcnk6ICgpID0+ICh7fSkgfSk7XG5cbmV4cG9ydCBjb25zdCBDT1BJTE9US0lUX0FHRU5UUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxcbiAgUmVjb3JkPHN0cmluZywgQWJzdHJhY3RBZ2VudD5cbj4oXCJDT1BJTE9US0lUX0FHRU5UU1wiLCB7IGZhY3Rvcnk6ICgpID0+ICh7fSkgfSk7XG5cbmV4cG9ydCBjb25zdCBDT1BJTE9US0lUX1JFTkRFUl9UT09MX0NBTExTID0gbmV3IEluamVjdGlvblRva2VuPFxuICBUb29sQ2FsbFJlbmRlcjx1bmtub3duPltdXG4+KFwiQ09QSUxPVEtJVF9SRU5ERVJfVE9PTF9DQUxMU1wiLCB7IGZhY3Rvcnk6ICgpID0+IFtdIH0pO1xuXG5leHBvcnQgY29uc3QgQ09QSUxPVEtJVF9GUk9OVEVORF9UT09MUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxcbiAgQW5ndWxhckZyb250ZW5kVG9vbDxhbnk+W11cbj4oXCJDT1BJTE9US0lUX0ZST05URU5EX1RPT0xTXCIsIHsgZmFjdG9yeTogKCkgPT4gW10gfSk7XG5cbmV4cG9ydCBjb25zdCBDT1BJTE9US0lUX0hVTUFOX0lOX1RIRV9MT09QID0gbmV3IEluamVjdGlvblRva2VuPFxuICBBbmd1bGFySHVtYW5JblRoZUxvb3A8YW55PltdXG4+KFwiQ09QSUxPVEtJVF9IVU1BTl9JTl9USEVfTE9PUFwiLCB7IGZhY3Rvcnk6ICgpID0+IFtdIH0pO1xuXG4vLyBBZ2VudC1yZWxhdGVkIHR5cGVzXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2UgfSBmcm9tIFwiQGFnLXVpL2NsaWVudFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50V2F0Y2hSZXN1bHQge1xuICBhZ2VudDogU2lnbmFsPEFic3RyYWN0QWdlbnQgfCB1bmRlZmluZWQ+O1xuICBtZXNzYWdlczogU2lnbmFsPE1lc3NhZ2VbXT47XG4gIGlzUnVubmluZzogU2lnbmFsPGJvb2xlYW4+O1xuICBhZ2VudCQ6IE9ic2VydmFibGU8QWJzdHJhY3RBZ2VudCB8IHVuZGVmaW5lZD47XG4gIG1lc3NhZ2VzJDogT2JzZXJ2YWJsZTxNZXNzYWdlW10+O1xuICBpc1J1bm5pbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICB1bnN1YnNjcmliZTogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZ2VudFN1YnNjcmlwdGlvbkNhbGxiYWNrcyB7XG4gIG9uTWVzc2FnZXNDaGFuZ2VkPzogKHBhcmFtczogYW55KSA9PiB2b2lkO1xuICBvblN0YXRlQ2hhbmdlZD86IChwYXJhbXM6IGFueSkgPT4gdm9pZDtcbiAgb25SdW5Jbml0aWFsaXplZD86IChwYXJhbXM6IGFueSkgPT4gdm9pZDtcbiAgb25SdW5GaW5hbGl6ZWQ/OiAocGFyYW1zOiBhbnkpID0+IHZvaWQ7XG4gIG9uUnVuRmFpbGVkPzogKHBhcmFtczogYW55KSA9PiB2b2lkO1xufVxuXG4vLyBIdW1hbi1pbi10aGUtbG9vcCBzdGF0ZSByZXN1bHRcbmV4cG9ydCBpbnRlcmZhY2UgSHVtYW5JblRoZUxvb3BTdGF0ZSB7XG4gIHN0YXR1czogU2lnbmFsPFRvb2xDYWxsU3RhdHVzPjtcbiAgdG9vbElkOiBzdHJpbmc7XG4gIGRlc3Ryb3k6ICgpID0+IHZvaWQ7XG59XG4iXX0=