sonamu 0.9.8 → 0.9.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/ai/agents/agent.d.ts.map +1 -1
  2. package/dist/ai/agents/agent.js +4 -2
  3. package/dist/ai/providers/rtzr/api.d.ts +1 -1
  4. package/dist/api/decorators.d.ts +0 -1
  5. package/dist/api/decorators.d.ts.map +1 -1
  6. package/dist/api/decorators.js +8 -6
  7. package/dist/api/sonamu.d.ts.map +1 -1
  8. package/dist/api/sonamu.js +123 -12
  9. package/dist/api/websocket-helpers.d.ts +1 -3
  10. package/dist/api/websocket-helpers.d.ts.map +1 -1
  11. package/dist/api/websocket-helpers.js +2 -15
  12. package/dist/stream/index.d.ts +3 -0
  13. package/dist/stream/index.d.ts.map +1 -1
  14. package/dist/stream/index.js +8 -2
  15. package/dist/stream/ws-core.d.ts +1 -0
  16. package/dist/stream/ws-core.d.ts.map +1 -1
  17. package/dist/stream/ws-delivery.d.ts +8 -0
  18. package/dist/stream/ws-delivery.d.ts.map +1 -1
  19. package/dist/stream/ws-delivery.js +160 -14
  20. package/dist/stream/ws-local-connection-store.d.ts +2 -0
  21. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  22. package/dist/stream/ws-local-connection-store.js +21 -1
  23. package/dist/stream/ws-registry.d.ts +6 -2
  24. package/dist/stream/ws-registry.d.ts.map +1 -1
  25. package/dist/stream/ws-registry.js +170 -6
  26. package/dist/stream/ws-telemetry-memory.d.ts +28 -0
  27. package/dist/stream/ws-telemetry-memory.d.ts.map +1 -0
  28. package/dist/stream/ws-telemetry-memory.js +180 -0
  29. package/dist/stream/ws-telemetry-trace.d.ts +12 -0
  30. package/dist/stream/ws-telemetry-trace.d.ts.map +1 -0
  31. package/dist/stream/ws-telemetry-trace.js +41 -0
  32. package/dist/stream/ws-telemetry.d.ts +509 -0
  33. package/dist/stream/ws-telemetry.d.ts.map +1 -0
  34. package/dist/stream/ws-telemetry.js +931 -0
  35. package/dist/stream/ws.d.ts +10 -3
  36. package/dist/stream/ws.d.ts.map +1 -1
  37. package/dist/stream/ws.js +306 -27
  38. package/dist/syncer/file-patterns.js +2 -2
  39. package/dist/syncer/syncer-actions.d.ts +2 -8
  40. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  41. package/dist/syncer/syncer-actions.js +4 -11
  42. package/dist/syncer/syncer.d.ts +1 -1
  43. package/dist/syncer/syncer.d.ts.map +1 -1
  44. package/dist/syncer/syncer.js +8 -6
  45. package/dist/template/template.d.ts +1 -2
  46. package/dist/template/template.d.ts.map +1 -1
  47. package/dist/template/template.js +3 -4
  48. package/dist/template/zod-converter.d.ts +2 -2
  49. package/dist/testing/dev-vitest-manager.d.ts +1 -1
  50. package/dist/testing/dev-vitest-manager.js +2 -2
  51. package/dist/types/types.d.ts +11 -5
  52. package/dist/types/types.d.ts.map +1 -1
  53. package/dist/types/types.js +2 -2
  54. package/dist/utils/class-name.d.ts +6 -0
  55. package/dist/utils/class-name.d.ts.map +1 -0
  56. package/dist/utils/class-name.js +19 -0
  57. package/package.json +2 -2
  58. package/src/ai/agents/agent.ts +2 -1
  59. package/src/api/__tests__/sonamu.websocket.test.ts +84 -10
  60. package/src/api/decorators.ts +6 -6
  61. package/src/api/sonamu.ts +142 -7
  62. package/src/api/websocket-helpers.ts +2 -28
  63. package/src/shared/app.shared.ts.txt +16 -8
  64. package/src/shared/web.shared.ts.txt +8 -7
  65. package/src/skills/sonamu/testing-devrunner.md +1 -1
  66. package/src/stream/__tests__/ws-telemetry.test.ts +821 -0
  67. package/src/stream/__tests__/ws.test.ts +362 -2
  68. package/src/stream/index.ts +3 -0
  69. package/src/stream/ws-core.ts +2 -0
  70. package/src/stream/ws-delivery.ts +161 -19
  71. package/src/stream/ws-local-connection-store.ts +33 -0
  72. package/src/stream/ws-registry.ts +186 -5
  73. package/src/stream/ws-telemetry-memory.ts +246 -0
  74. package/src/stream/ws-telemetry-trace.ts +52 -0
  75. package/src/stream/ws-telemetry.ts +1772 -0
  76. package/src/stream/ws.ts +332 -34
  77. package/src/syncer/file-patterns.ts +3 -3
  78. package/src/syncer/syncer-actions.ts +3 -15
  79. package/src/syncer/syncer.ts +9 -13
  80. package/src/template/__tests__/services.template.websocket.test.ts +2 -0
  81. package/src/template/template.ts +2 -3
  82. package/src/testing/dev-vitest-manager.ts +1 -1
  83. package/src/types/types.ts +10 -3
  84. package/src/utils/class-name.ts +12 -0
@@ -2,11 +2,24 @@ import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
2
  import { WebSocketAudience, init_ws_audience } from "./ws-audience.js";
3
3
  import { WebSocketAudienceResolver, init_ws_audience_resolver } from "./ws-audience-resolver.js";
4
4
  import { NoopWebSocketClusterBus, init_ws_cluster_bus } from "./ws-cluster-bus.js";
5
+ import { NoopWebSocketTelemetryController, init_ws_telemetry } from "./ws-telemetry.js";
5
6
  import { WebSocketDeliveryEngine, init_ws_delivery } from "./ws-delivery.js";
6
7
  import { WebSocketLocalConnectionStore, init_ws_local_connection_store } from "./ws-local-connection-store.js";
7
8
  import { InMemoryWebSocketPresenceStore, init_ws_presence_store } from "./ws-presence-store.js";
8
9
 
9
10
  //#region src/stream/ws-registry.ts
11
+ function getConnectionTelemetryContext(connection) {
12
+ if (!connection || !isTelemetryContextProvider(connection)) {
13
+ return {};
14
+ }
15
+ return connection.getTelemetryContext();
16
+ }
17
+ function formatUserId(userId) {
18
+ return userId === undefined ? undefined : String(userId);
19
+ }
20
+ function isTelemetryContextProvider(connection) {
21
+ return "getTelemetryContext" in connection && typeof connection.getTelemetryContext === "function";
22
+ }
10
23
  var WebSocketRegistry;
11
24
  var init_ws_registry = __esmMin((() => {
12
25
  init_ws_audience();
@@ -15,6 +28,7 @@ var init_ws_registry = __esmMin((() => {
15
28
  init_ws_delivery();
16
29
  init_ws_local_connection_store();
17
30
  init_ws_presence_store();
31
+ init_ws_telemetry();
18
32
  WebSocketRegistry = class {
19
33
  nodeId;
20
34
  localConnections = new WebSocketLocalConnectionStore();
@@ -22,10 +36,12 @@ var init_ws_registry = __esmMin((() => {
22
36
  clusterBus;
23
37
  audienceResolver;
24
38
  deliveryEngine;
25
- constructor(options = {}) {
26
- this.nodeId = options.nodeId ?? "local";
39
+ telemetryController;
40
+ constructor(options) {
41
+ this.nodeId = options.nodeId;
27
42
  this.presenceStore = options.presenceStore ?? new InMemoryWebSocketPresenceStore();
28
43
  this.clusterBus = options.clusterBus ?? new NoopWebSocketClusterBus();
44
+ this.telemetryController = options.telemetryController ?? new NoopWebSocketTelemetryController();
29
45
  this.audienceResolver = new WebSocketAudienceResolver({
30
46
  nodeId: this.nodeId,
31
47
  presenceStore: this.presenceStore
@@ -34,39 +50,187 @@ var init_ws_registry = __esmMin((() => {
34
50
  nodeId: this.nodeId,
35
51
  localConnections: this.localConnections,
36
52
  audienceResolver: this.audienceResolver,
37
- clusterBus: this.clusterBus
53
+ clusterBus: this.clusterBus,
54
+ telemetryController: this.telemetryController
38
55
  });
56
+ this.telemetryController.registerMetricSource({ collect: (_now) => {
57
+ const stats = this.presenceStore.getStats();
58
+ const localSnapshot = this.localConnections.getTelemetrySnapshot();
59
+ return {
60
+ activeConnections: stats.totalConnections,
61
+ activeConnectionsByNamespace: stats.byNamespace,
62
+ roomCount: stats.totalRooms,
63
+ pendingInboundMessages: localSnapshot.pendingInboundMessages,
64
+ pendingOutboundMessages: localSnapshot.pendingOutboundMessages,
65
+ socketBufferedBytes: localSnapshot.socketBufferedBytes
66
+ };
67
+ } });
39
68
  }
40
69
  register(connection, active = true) {
41
70
  this.localConnections.register(connection);
42
- return this.presenceStore.register({
71
+ const meta = this.presenceStore.register({
43
72
  sessionId: connection.id,
44
73
  nodeId: this.nodeId,
45
74
  namespace: connection.namespace,
46
75
  active
47
76
  });
77
+ this.telemetryController.emit({
78
+ name: "ws.connection.registered",
79
+ level: "info",
80
+ connectionId: connection.id,
81
+ namespace: connection.namespace,
82
+ userId: connection.userId,
83
+ ...getConnectionTelemetryContext(connection)
84
+ });
85
+ this.telemetryController.recordMetric({
86
+ name: "sonamu.ws.connections",
87
+ kind: "counter",
88
+ value: 1,
89
+ unit: "1",
90
+ tags: {
91
+ outcome: "registered",
92
+ namespace: connection.namespace
93
+ },
94
+ userId: connection.userId
95
+ });
96
+ return meta;
48
97
  }
49
98
  activate(connectionId) {
99
+ if (!this.presenceStore.getConnection(connectionId)) {
100
+ this.emitMutationSkipped(connectionId, { operation: "activate" });
101
+ return;
102
+ }
50
103
  this.presenceStore.activate(connectionId);
104
+ const connection = this.localConnections.getConnection(connectionId);
105
+ this.telemetryController.emit({
106
+ name: "ws.connection.activated",
107
+ level: "info",
108
+ connectionId,
109
+ userId: connection?.userId,
110
+ ...getConnectionTelemetryContext(connection)
111
+ });
51
112
  }
52
113
  unregister(connectionId) {
53
- this.presenceStore.unregister(connectionId);
114
+ const connection = this.localConnections.getConnection(connectionId);
115
+ const telemetryContext = getConnectionTelemetryContext(connection);
116
+ const userId = connection?.userId ?? formatUserId(this.presenceStore.getConnection(connectionId)?.userId);
117
+ const meta = this.presenceStore.unregister(connectionId);
54
118
  this.localConnections.unregister(connectionId);
119
+ this.telemetryController.emit({
120
+ name: "ws.connection.unregistered",
121
+ level: "debug",
122
+ connectionId,
123
+ namespace: meta?.namespace,
124
+ userId,
125
+ ...telemetryContext
126
+ });
127
+ if (meta) {
128
+ this.telemetryController.recordMetric({
129
+ name: "sonamu.ws.connections",
130
+ kind: "counter",
131
+ value: 1,
132
+ unit: "1",
133
+ tags: {
134
+ outcome: "unregistered",
135
+ namespace: meta.namespace
136
+ },
137
+ userId
138
+ });
139
+ }
55
140
  }
56
141
  touch(connectionId) {
57
142
  this.presenceStore.touch(connectionId);
58
143
  }
59
144
  setUserId(connectionId, userId) {
145
+ if (!this.presenceStore.getConnection(connectionId)) {
146
+ this.emitMutationSkipped(connectionId, {
147
+ operation: "setUserId",
148
+ userId
149
+ });
150
+ return;
151
+ }
60
152
  this.presenceStore.setUserId(connectionId, userId);
153
+ const meta = this.presenceStore.getConnection(connectionId);
154
+ this.telemetryController.emit({
155
+ name: "ws.user.bound",
156
+ level: "debug",
157
+ connectionId,
158
+ namespace: meta?.namespace,
159
+ userId: String(userId),
160
+ detail: { userId },
161
+ ...getConnectionTelemetryContext(this.localConnections.getConnection(connectionId))
162
+ });
61
163
  }
62
164
  clearUserId(connectionId) {
165
+ const meta = this.presenceStore.getConnection(connectionId);
166
+ if (!meta) {
167
+ this.emitMutationSkipped(connectionId, { operation: "clearUserId" });
168
+ return;
169
+ }
170
+ const userId = meta.userId;
63
171
  this.presenceStore.clearUserId(connectionId);
172
+ this.telemetryController.emit({
173
+ name: "ws.user.cleared",
174
+ level: "debug",
175
+ connectionId,
176
+ namespace: meta.namespace,
177
+ userId: formatUserId(userId),
178
+ detail: userId !== undefined ? { userId } : undefined,
179
+ ...getConnectionTelemetryContext(this.localConnections.getConnection(connectionId))
180
+ });
64
181
  }
65
182
  join(connectionId, roomId) {
183
+ if (!this.presenceStore.getConnection(connectionId)) {
184
+ this.emitMutationSkipped(connectionId, {
185
+ operation: "join",
186
+ roomId
187
+ });
188
+ return;
189
+ }
66
190
  this.presenceStore.join(connectionId, roomId);
191
+ const meta = this.presenceStore.getConnection(connectionId);
192
+ const connection = this.localConnections.getConnection(connectionId);
193
+ this.telemetryController.emit({
194
+ name: "ws.room.joined",
195
+ level: "debug",
196
+ connectionId,
197
+ namespace: meta?.namespace,
198
+ userId: connection?.userId ?? formatUserId(meta?.userId),
199
+ detail: { roomId },
200
+ ...getConnectionTelemetryContext(connection)
201
+ });
67
202
  }
68
203
  leave(connectionId, roomId) {
204
+ const meta = this.presenceStore.getConnection(connectionId);
205
+ if (!meta) {
206
+ this.emitMutationSkipped(connectionId, {
207
+ operation: "leave",
208
+ roomId
209
+ });
210
+ return;
211
+ }
69
212
  this.presenceStore.leave(connectionId, roomId);
213
+ const connection = this.localConnections.getConnection(connectionId);
214
+ this.telemetryController.emit({
215
+ name: "ws.room.left",
216
+ level: "debug",
217
+ connectionId,
218
+ namespace: meta.namespace,
219
+ userId: connection?.userId ?? formatUserId(meta.userId),
220
+ detail: { roomId },
221
+ ...getConnectionTelemetryContext(connection)
222
+ });
223
+ }
224
+ emitMutationSkipped(connectionId, detail) {
225
+ this.telemetryController.emit({
226
+ name: "ws.registry.mutation.skipped",
227
+ level: "debug",
228
+ connectionId,
229
+ detail: {
230
+ ...detail,
231
+ reason: "connectionMissing"
232
+ }
233
+ });
70
234
  }
71
235
  broadcast(event, data, namespace) {
72
236
  this.publishToAudience(WebSocketAudience.all(namespace), event, data);
@@ -105,4 +269,4 @@ var init_ws_registry = __esmMin((() => {
105
269
  //#endregion
106
270
  init_ws_registry();
107
271
  export { WebSocketRegistry, init_ws_registry };
108
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtcmVnaXN0cnkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy1yZWdpc3RyeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXZWJTb2NrZXRBdWRpZW5jZSwgdHlwZSBXZWJTb2NrZXRBdWRpZW5jZSBhcyBXZWJTb2NrZXRBdWRpZW5jZVNwZWMgfSBmcm9tIFwiLi93cy1hdWRpZW5jZVwiO1xuaW1wb3J0IHsgV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlciB9IGZyb20gXCIuL3dzLWF1ZGllbmNlLXJlc29sdmVyXCI7XG5pbXBvcnQgeyBOb29wV2ViU29ja2V0Q2x1c3RlckJ1cywgdHlwZSBXZWJTb2NrZXRDbHVzdGVyQnVzIH0gZnJvbSBcIi4vd3MtY2x1c3Rlci1idXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24sXG4gIHR5cGUgV2ViU29ja2V0UmVnaXN0cnlTdGF0cyxcbiAgdHlwZSBXZWJTb2NrZXRSb29tSWQsXG4gIHR5cGUgV2ViU29ja2V0VXNlcklkLFxufSBmcm9tIFwiLi93cy1jb3JlXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXREZWxpdmVyeUVuZ2luZSB9IGZyb20gXCIuL3dzLWRlbGl2ZXJ5XCI7XG5pbXBvcnQgeyBXZWJTb2NrZXRMb2NhbENvbm5lY3Rpb25TdG9yZSB9IGZyb20gXCIuL3dzLWxvY2FsLWNvbm5lY3Rpb24tc3RvcmVcIjtcbmltcG9ydCB7XG4gIEluTWVtb3J5V2ViU29ja2V0UHJlc2VuY2VTdG9yZSxcbiAgdHlwZSBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlLFxuICB0eXBlIFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZSxcbn0gZnJvbSBcIi4vd3MtcHJlc2VuY2Utc3RvcmVcIjtcblxuZXhwb3J0IHR5cGUge1xuICBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0UmVnaXN0cnlTdGF0cyxcbiAgV2ViU29ja2V0Um9vbUlkLFxuICBXZWJTb2NrZXRVc2VySWQsXG59O1xuZXhwb3J0IHR5cGUgV2ViU29ja2V0Q29ubmVjdGlvbk1ldGEgPSBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2U7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFJlZ2lzdHJ5T3B0aW9ucyA9IHtcbiAgbm9kZUlkPzogc3RyaW5nO1xuICBwcmVzZW5jZVN0b3JlPzogV2ViU29ja2V0UHJlc2VuY2VTdG9yZTtcbiAgY2x1c3RlckJ1cz86IFdlYlNvY2tldENsdXN0ZXJCdXM7XG59O1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0UmVnaXN0cnkge1xuICByZWFkb25seSBub2RlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbG9jYWxDb25uZWN0aW9ucyA9IG5ldyBXZWJTb2NrZXRMb2NhbENvbm5lY3Rpb25TdG9yZSgpO1xuICByZWFkb25seSBwcmVzZW5jZVN0b3JlOiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICByZWFkb25seSBjbHVzdGVyQnVzOiBXZWJTb2NrZXRDbHVzdGVyQnVzO1xuICByZWFkb25seSBhdWRpZW5jZVJlc29sdmVyOiBXZWJTb2NrZXRBdWRpZW5jZVJlc29sdmVyO1xuICByZWFkb25seSBkZWxpdmVyeUVuZ2luZTogV2ViU29ja2V0RGVsaXZlcnlFbmdpbmU7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogV2ViU29ja2V0UmVnaXN0cnlPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLm5vZGVJZCA9IG9wdGlvbnMubm9kZUlkID8/IFwibG9jYWxcIjtcbiAgICB0aGlzLnByZXNlbmNlU3RvcmUgPSBvcHRpb25zLnByZXNlbmNlU3RvcmUgPz8gbmV3IEluTWVtb3J5V2ViU29ja2V0UHJlc2VuY2VTdG9yZSgpO1xuICAgIHRoaXMuY2x1c3RlckJ1cyA9IG9wdGlvbnMuY2x1c3RlckJ1cyA/PyBuZXcgTm9vcFdlYlNvY2tldENsdXN0ZXJCdXMoKTtcbiAgICB0aGlzLmF1ZGllbmNlUmVzb2x2ZXIgPSBuZXcgV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlcih7XG4gICAgICBub2RlSWQ6IHRoaXMubm9kZUlkLFxuICAgICAgcHJlc2VuY2VTdG9yZTogdGhpcy5wcmVzZW5jZVN0b3JlLFxuICAgIH0pO1xuICAgIHRoaXMuZGVsaXZlcnlFbmdpbmUgPSBuZXcgV2ViU29ja2V0RGVsaXZlcnlFbmdpbmUoe1xuICAgICAgbm9kZUlkOiB0aGlzLm5vZGVJZCxcbiAgICAgIGxvY2FsQ29ubmVjdGlvbnM6IHRoaXMubG9jYWxDb25uZWN0aW9ucyxcbiAgICAgIGF1ZGllbmNlUmVzb2x2ZXI6IHRoaXMuYXVkaWVuY2VSZXNvbHZlcixcbiAgICAgIGNsdXN0ZXJCdXM6IHRoaXMuY2x1c3RlckJ1cyxcbiAgICB9KTtcbiAgfVxuXG4gIHJlZ2lzdGVyKFxuICAgIGNvbm5lY3Rpb246IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uLFxuICAgIGFjdGl2ZTogYm9vbGVhbiA9IHRydWUsXG4gICk6IFdlYlNvY2tldENvbm5lY3Rpb25NZXRhIHtcbiAgICB0aGlzLmxvY2FsQ29ubmVjdGlvbnMucmVnaXN0ZXIoY29ubmVjdGlvbik7XG4gICAgcmV0dXJuIHRoaXMucHJlc2VuY2VTdG9yZS5yZWdpc3Rlcih7XG4gICAgICBzZXNzaW9uSWQ6IGNvbm5lY3Rpb24uaWQsXG4gICAgICBub2RlSWQ6IHRoaXMubm9kZUlkLFxuICAgICAgbmFtZXNwYWNlOiBjb25uZWN0aW9uLm5hbWVzcGFjZSxcbiAgICAgIGFjdGl2ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFjdGl2YXRlKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlLmFjdGl2YXRlKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICB1bnJlZ2lzdGVyKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlLnVucmVnaXN0ZXIoY29ubmVjdGlvbklkKTtcbiAgICB0aGlzLmxvY2FsQ29ubmVjdGlvbnMudW5yZWdpc3Rlcihjb25uZWN0aW9uSWQpO1xuICB9XG5cbiAgdG91Y2goY29ubmVjdGlvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnByZXNlbmNlU3RvcmUudG91Y2goY29ubmVjdGlvbklkKTtcbiAgfVxuXG4gIHNldFVzZXJJZChjb25uZWN0aW9uSWQ6IHN0cmluZywgdXNlcklkOiBXZWJTb2NrZXRVc2VySWQpOiB2b2lkIHtcbiAgICB0aGlzLnByZXNlbmNlU3RvcmUuc2V0VXNlcklkKGNvbm5lY3Rpb25JZCwgdXNlcklkKTtcbiAgfVxuXG4gIGNsZWFyVXNlcklkKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlLmNsZWFyVXNlcklkKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBqb2luKGNvbm5lY3Rpb25JZDogc3RyaW5nLCByb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQge1xuICAgIHRoaXMucHJlc2VuY2VTdG9yZS5qb2luKGNvbm5lY3Rpb25JZCwgcm9vbUlkKTtcbiAgfVxuXG4gIGxlYXZlKGNvbm5lY3Rpb25JZDogc3RyaW5nLCByb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQge1xuICAgIHRoaXMucHJlc2VuY2VTdG9yZS5sZWF2ZShjb25uZWN0aW9uSWQsIHJvb21JZCk7XG4gIH1cblxuICBicm9hZGNhc3QoZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS5hbGwobmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvUm9vbShyb29tSWQ6IFdlYlNvY2tldFJvb21JZCwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS5yb29tKHJvb21JZCwgbmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvVXNlcih1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS51c2VyKHVzZXJJZCwgbmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvQXVkaWVuY2UoYXVkaWVuY2U6IFdlYlNvY2tldEF1ZGllbmNlU3BlYywgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuZGVsaXZlcnlFbmdpbmUucHVibGlzaFRvQXVkaWVuY2UoYXVkaWVuY2UsIGV2ZW50LCBkYXRhKTtcbiAgfVxuXG4gIGdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkOiBzdHJpbmcpOiBXZWJTb2NrZXRDb25uZWN0aW9uTWV0YSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2VuY2VTdG9yZS5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBnZXRDb25uZWN0aW9uQ291bnQobmFtZXNwYWNlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcmVzZW5jZVN0b3JlLmdldENvbm5lY3Rpb25Db3VudChuYW1lc3BhY2UpO1xuICB9XG5cbiAgZ2V0Um9vbU1lbWJlcnMocm9vbUlkOiBXZWJTb2NrZXRSb29tSWQsIG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldENvbm5lY3Rpb25NZXRhW10ge1xuICAgIHJldHVybiB0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Um9vbU1lbWJlcnMocm9vbUlkLCBuYW1lc3BhY2UpO1xuICB9XG5cbiAgZ2V0U3RhdHMoKTogV2ViU29ja2V0UmVnaXN0cnlTdGF0cyB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2VuY2VTdG9yZS5nZXRTdGF0cygpO1xuICB9XG5cbiAgY2xvc2VBbGwoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbENvbm5lY3Rpb25zLmNsb3NlQWxsKGNvZGUsIHJlYXNvbik7XG4gIH1cblxuICBhc3luYyBzaHV0ZG93bihjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsb3NlQWxsKGNvZGUsIHJlYXNvbik7XG4gICAgYXdhaXQgdGhpcy5kZWxpdmVyeUVuZ2luZS5zaHV0ZG93bigpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O21CQUFtRzs0QkFDaEM7c0JBQ2tCO21CQU83QjtpQ0FDb0I7eUJBSy9DO0NBZ0JoQixvQkFBYixNQUErQjtFQUM3QixBQUFTO0VBQ1QsQUFBUyxtQkFBbUIsSUFBSSwrQkFBK0I7RUFDL0QsQUFBUztFQUNULEFBQVM7RUFDVCxBQUFTO0VBQ1QsQUFBUztFQUVULFlBQVksVUFBb0MsRUFBRSxFQUFFO0FBQ2xELFFBQUssU0FBUyxRQUFRLFVBQVU7QUFDaEMsUUFBSyxnQkFBZ0IsUUFBUSxpQkFBaUIsSUFBSSxnQ0FBZ0M7QUFDbEYsUUFBSyxhQUFhLFFBQVEsY0FBYyxJQUFJLHlCQUF5QjtBQUNyRSxRQUFLLG1CQUFtQixJQUFJLDBCQUEwQjtJQUNwRCxRQUFRLEtBQUs7SUFDYixlQUFlLEtBQUs7SUFDckIsQ0FBQztBQUNGLFFBQUssaUJBQWlCLElBQUksd0JBQXdCO0lBQ2hELFFBQVEsS0FBSztJQUNiLGtCQUFrQixLQUFLO0lBQ3ZCLGtCQUFrQixLQUFLO0lBQ3ZCLFlBQVksS0FBSztJQUNsQixDQUFDOztFQUdKLFNBQ0UsWUFDQSxTQUFrQixNQUNPO0FBQ3pCLFFBQUssaUJBQWlCLFNBQVMsV0FBVztBQUMxQyxVQUFPLEtBQUssY0FBYyxTQUFTO0lBQ2pDLFdBQVcsV0FBVztJQUN0QixRQUFRLEtBQUs7SUFDYixXQUFXLFdBQVc7SUFDdEI7SUFDRCxDQUFDOztFQUdKLFNBQVMsY0FBNEI7QUFDbkMsUUFBSyxjQUFjLFNBQVMsYUFBYTs7RUFHM0MsV0FBVyxjQUE0QjtBQUNyQyxRQUFLLGNBQWMsV0FBVyxhQUFhO0FBQzNDLFFBQUssaUJBQWlCLFdBQVcsYUFBYTs7RUFHaEQsTUFBTSxjQUE0QjtBQUNoQyxRQUFLLGNBQWMsTUFBTSxhQUFhOztFQUd4QyxVQUFVLGNBQXNCLFFBQStCO0FBQzdELFFBQUssY0FBYyxVQUFVLGNBQWMsT0FBTzs7RUFHcEQsWUFBWSxjQUE0QjtBQUN0QyxRQUFLLGNBQWMsWUFBWSxhQUFhOztFQUc5QyxLQUFLLGNBQXNCLFFBQStCO0FBQ3hELFFBQUssY0FBYyxLQUFLLGNBQWMsT0FBTzs7RUFHL0MsTUFBTSxjQUFzQixRQUErQjtBQUN6RCxRQUFLLGNBQWMsTUFBTSxjQUFjLE9BQU87O0VBR2hELFVBQVUsT0FBZSxNQUFlLFdBQTBCO0FBQ2hFLFFBQUssa0JBQWtCLGtCQUFrQixJQUFJLFVBQVUsRUFBRSxPQUFPLEtBQUs7O0VBR3ZFLGNBQWMsUUFBeUIsT0FBZSxNQUFlLFdBQTBCO0FBQzdGLFFBQUssa0JBQWtCLGtCQUFrQixLQUFLLFFBQVEsVUFBVSxFQUFFLE9BQU8sS0FBSzs7RUFHaEYsY0FBYyxRQUF5QixPQUFlLE1BQWUsV0FBMEI7QUFDN0YsUUFBSyxrQkFBa0Isa0JBQWtCLEtBQUssUUFBUSxVQUFVLEVBQUUsT0FBTyxLQUFLOztFQUdoRixrQkFBa0IsVUFBaUMsT0FBZSxNQUFxQjtBQUNyRixRQUFLLGVBQWUsa0JBQWtCLFVBQVUsT0FBTyxLQUFLOztFQUc5RCxjQUFjLGNBQTJEO0FBQ3ZFLFVBQU8sS0FBSyxjQUFjLGNBQWMsYUFBYTs7RUFHdkQsbUJBQW1CLFdBQTRCO0FBQzdDLFVBQU8sS0FBSyxjQUFjLG1CQUFtQixVQUFVOztFQUd6RCxlQUFlLFFBQXlCLFdBQStDO0FBQ3JGLFVBQU8sS0FBSyxjQUFjLGVBQWUsUUFBUSxVQUFVOztFQUc3RCxXQUFtQztBQUNqQyxVQUFPLEtBQUssY0FBYyxVQUFVOztFQUd0QyxTQUFTLE1BQWUsUUFBdUI7QUFDN0MsUUFBSyxpQkFBaUIsU0FBUyxNQUFNLE9BQU87O0VBRzlDLE1BQU0sU0FBUyxNQUFlLFFBQWdDO0FBQzVELFFBQUssU0FBUyxNQUFNLE9BQU87QUFDM0IsU0FBTSxLQUFLLGVBQWUsVUFBVSJ9
272
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtcmVnaXN0cnkuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy1yZWdpc3RyeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXZWJTb2NrZXRBdWRpZW5jZSwgdHlwZSBXZWJTb2NrZXRBdWRpZW5jZSBhcyBXZWJTb2NrZXRBdWRpZW5jZVNwZWMgfSBmcm9tIFwiLi93cy1hdWRpZW5jZVwiO1xuaW1wb3J0IHsgV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlciB9IGZyb20gXCIuL3dzLWF1ZGllbmNlLXJlc29sdmVyXCI7XG5pbXBvcnQgeyBOb29wV2ViU29ja2V0Q2x1c3RlckJ1cywgdHlwZSBXZWJTb2NrZXRDbHVzdGVyQnVzIH0gZnJvbSBcIi4vd3MtY2x1c3Rlci1idXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24sXG4gIHR5cGUgV2ViU29ja2V0UmVnaXN0cnlTdGF0cyxcbiAgdHlwZSBXZWJTb2NrZXRSb29tSWQsXG4gIHR5cGUgV2ViU29ja2V0VXNlcklkLFxufSBmcm9tIFwiLi93cy1jb3JlXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXREZWxpdmVyeUVuZ2luZSB9IGZyb20gXCIuL3dzLWRlbGl2ZXJ5XCI7XG5pbXBvcnQgeyBXZWJTb2NrZXRMb2NhbENvbm5lY3Rpb25TdG9yZSB9IGZyb20gXCIuL3dzLWxvY2FsLWNvbm5lY3Rpb24tc3RvcmVcIjtcbmltcG9ydCB7XG4gIEluTWVtb3J5V2ViU29ja2V0UHJlc2VuY2VTdG9yZSxcbiAgdHlwZSBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlLFxuICB0eXBlIFdlYlNvY2tldFNlc3Npb25QcmVzZW5jZSxcbn0gZnJvbSBcIi4vd3MtcHJlc2VuY2Utc3RvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyLFxuICBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCxcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyLFxufSBmcm9tIFwiLi93cy10ZWxlbWV0cnlcIjtcblxuZXhwb3J0IHR5cGUge1xuICBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0UmVnaXN0cnlTdGF0cyxcbiAgV2ViU29ja2V0Um9vbUlkLFxuICBXZWJTb2NrZXRVc2VySWQsXG59O1xuZXhwb3J0IHR5cGUgV2ViU29ja2V0Q29ubmVjdGlvbk1ldGEgPSBXZWJTb2NrZXRTZXNzaW9uUHJlc2VuY2U7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFJlZ2lzdHJ5T3B0aW9ucyA9IHtcbiAgLy8g67aE7IKwIO2ZmOqyveyXkOyEnCDrhbjrk5wg6rCEIOudvOyasO2MhSDsi53rs4TsnpDroZwg7JOw7J2066+A66GcIOuwmOuTnOyLnCDtmLjstpwg7LihKFdlYlNvY2tldFJ1bnRpbWUp7JeQ7IScIOqysOygle2VtCDrhJjquLTri6RcbiAgbm9kZUlkOiBzdHJpbmc7XG4gIHByZXNlbmNlU3RvcmU/OiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICBjbHVzdGVyQnVzPzogV2ViU29ja2V0Q2x1c3RlckJ1cztcbiAgdGVsZW1ldHJ5Q29udHJvbGxlcj86IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG59O1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0UmVnaXN0cnkge1xuICByZWFkb25seSBub2RlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbG9jYWxDb25uZWN0aW9ucyA9IG5ldyBXZWJTb2NrZXRMb2NhbENvbm5lY3Rpb25TdG9yZSgpO1xuICByZWFkb25seSBwcmVzZW5jZVN0b3JlOiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICByZWFkb25seSBjbHVzdGVyQnVzOiBXZWJTb2NrZXRDbHVzdGVyQnVzO1xuICByZWFkb25seSBhdWRpZW5jZVJlc29sdmVyOiBXZWJTb2NrZXRBdWRpZW5jZVJlc29sdmVyO1xuICByZWFkb25seSBkZWxpdmVyeUVuZ2luZTogV2ViU29ja2V0RGVsaXZlcnlFbmdpbmU7XG4gIHJlYWRvbmx5IHRlbGVtZXRyeUNvbnRyb2xsZXI6IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogV2ViU29ja2V0UmVnaXN0cnlPcHRpb25zKSB7XG4gICAgdGhpcy5ub2RlSWQgPSBvcHRpb25zLm5vZGVJZDtcbiAgICB0aGlzLnByZXNlbmNlU3RvcmUgPSBvcHRpb25zLnByZXNlbmNlU3RvcmUgPz8gbmV3IEluTWVtb3J5V2ViU29ja2V0UHJlc2VuY2VTdG9yZSgpO1xuICAgIHRoaXMuY2x1c3RlckJ1cyA9IG9wdGlvbnMuY2x1c3RlckJ1cyA/PyBuZXcgTm9vcFdlYlNvY2tldENsdXN0ZXJCdXMoKTtcbiAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIgPVxuICAgICAgb3B0aW9ucy50ZWxlbWV0cnlDb250cm9sbGVyID8/IG5ldyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcigpO1xuICAgIHRoaXMuYXVkaWVuY2VSZXNvbHZlciA9IG5ldyBXZWJTb2NrZXRBdWRpZW5jZVJlc29sdmVyKHtcbiAgICAgIG5vZGVJZDogdGhpcy5ub2RlSWQsXG4gICAgICBwcmVzZW5jZVN0b3JlOiB0aGlzLnByZXNlbmNlU3RvcmUsXG4gICAgfSk7XG4gICAgdGhpcy5kZWxpdmVyeUVuZ2luZSA9IG5ldyBXZWJTb2NrZXREZWxpdmVyeUVuZ2luZSh7XG4gICAgICBub2RlSWQ6IHRoaXMubm9kZUlkLFxuICAgICAgbG9jYWxDb25uZWN0aW9uczogdGhpcy5sb2NhbENvbm5lY3Rpb25zLFxuICAgICAgYXVkaWVuY2VSZXNvbHZlcjogdGhpcy5hdWRpZW5jZVJlc29sdmVyLFxuICAgICAgY2x1c3RlckJ1czogdGhpcy5jbHVzdGVyQnVzLFxuICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcjogdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLFxuICAgIH0pO1xuXG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLnJlZ2lzdGVyTWV0cmljU291cmNlKHtcbiAgICAgIGNvbGxlY3Q6IChfbm93KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gdGhpcy5wcmVzZW5jZVN0b3JlLmdldFN0YXRzKCk7XG4gICAgICAgIGNvbnN0IGxvY2FsU25hcHNob3QgPSB0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0VGVsZW1ldHJ5U25hcHNob3QoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhY3RpdmVDb25uZWN0aW9uczogc3RhdHMudG90YWxDb25uZWN0aW9ucyxcbiAgICAgICAgICBhY3RpdmVDb25uZWN0aW9uc0J5TmFtZXNwYWNlOiBzdGF0cy5ieU5hbWVzcGFjZSxcbiAgICAgICAgICByb29tQ291bnQ6IHN0YXRzLnRvdGFsUm9vbXMsXG4gICAgICAgICAgcGVuZGluZ0luYm91bmRNZXNzYWdlczogbG9jYWxTbmFwc2hvdC5wZW5kaW5nSW5ib3VuZE1lc3NhZ2VzLFxuICAgICAgICAgIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiBsb2NhbFNuYXBzaG90LnBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzLFxuICAgICAgICAgIHNvY2tldEJ1ZmZlcmVkQnl0ZXM6IGxvY2FsU25hcHNob3Quc29ja2V0QnVmZmVyZWRCeXRlcyxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICByZWdpc3RlcihcbiAgICBjb25uZWN0aW9uOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbixcbiAgICBhY3RpdmU6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBXZWJTb2NrZXRDb25uZWN0aW9uTWV0YSB7XG4gICAgdGhpcy5sb2NhbENvbm5lY3Rpb25zLnJlZ2lzdGVyKGNvbm5lY3Rpb24pO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnByZXNlbmNlU3RvcmUucmVnaXN0ZXIoe1xuICAgICAgc2Vzc2lvbklkOiBjb25uZWN0aW9uLmlkLFxuICAgICAgbm9kZUlkOiB0aGlzLm5vZGVJZCxcbiAgICAgIG5hbWVzcGFjZTogY29ubmVjdGlvbi5uYW1lc3BhY2UsXG4gICAgICBhY3RpdmUsXG4gICAgfSk7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnJlZ2lzdGVyZWRcIixcbiAgICAgIGxldmVsOiBcImluZm9cIixcbiAgICAgIGNvbm5lY3Rpb25JZDogY29ubmVjdGlvbi5pZCxcbiAgICAgIG5hbWVzcGFjZTogY29ubmVjdGlvbi5uYW1lc3BhY2UsXG4gICAgICB1c2VySWQ6IGNvbm5lY3Rpb24udXNlcklkLFxuICAgICAgLi4uZ2V0Q29ubmVjdGlvblRlbGVtZXRyeUNvbnRleHQoY29ubmVjdGlvbiksXG4gICAgfSk7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLnJlY29yZE1ldHJpYyh7XG4gICAgICBuYW1lOiBcInNvbmFtdS53cy5jb25uZWN0aW9uc1wiLFxuICAgICAga2luZDogXCJjb3VudGVyXCIsXG4gICAgICB2YWx1ZTogMSxcbiAgICAgIHVuaXQ6IFwiMVwiLFxuICAgICAgdGFnczogeyBvdXRjb21lOiBcInJlZ2lzdGVyZWRcIiwgbmFtZXNwYWNlOiBjb25uZWN0aW9uLm5hbWVzcGFjZSB9LFxuICAgICAgdXNlcklkOiBjb25uZWN0aW9uLnVzZXJJZCxcbiAgICB9KTtcbiAgICByZXR1cm4gbWV0YTtcbiAgfVxuXG4gIGFjdGl2YXRlKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLmVtaXRNdXRhdGlvblNraXBwZWQoY29ubmVjdGlvbklkLCB7IG9wZXJhdGlvbjogXCJhY3RpdmF0ZVwiIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJlc2VuY2VTdG9yZS5hY3RpdmF0ZShjb25uZWN0aW9uSWQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MuY29ubmVjdGlvbi5hY3RpdmF0ZWRcIixcbiAgICAgIGxldmVsOiBcImluZm9cIixcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIHVzZXJJZDogY29ubmVjdGlvbj8udXNlcklkLFxuICAgICAgLi4uZ2V0Q29ubmVjdGlvblRlbGVtZXRyeUNvbnRleHQoY29ubmVjdGlvbiksXG4gICAgfSk7XG4gIH1cblxuICB1bnJlZ2lzdGVyKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMubG9jYWxDb25uZWN0aW9ucy5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk7XG4gICAgY29uc3QgdGVsZW1ldHJ5Q29udGV4dCA9IGdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KGNvbm5lY3Rpb24pO1xuICAgIGNvbnN0IHVzZXJJZCA9XG4gICAgICBjb25uZWN0aW9uPy51c2VySWQgPz8gZm9ybWF0VXNlcklkKHRoaXMucHJlc2VuY2VTdG9yZS5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk/LnVzZXJJZCk7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMucHJlc2VuY2VTdG9yZS51bnJlZ2lzdGVyKGNvbm5lY3Rpb25JZCk7XG4gICAgdGhpcy5sb2NhbENvbm5lY3Rpb25zLnVucmVnaXN0ZXIoY29ubmVjdGlvbklkKTtcbiAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICBuYW1lOiBcIndzLmNvbm5lY3Rpb24udW5yZWdpc3RlcmVkXCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgbmFtZXNwYWNlOiBtZXRhPy5uYW1lc3BhY2UsXG4gICAgICB1c2VySWQsXG4gICAgICAuLi50ZWxlbWV0cnlDb250ZXh0LFxuICAgIH0pO1xuICAgIGlmIChtZXRhKSB7XG4gICAgICB0aGlzLnRlbGVtZXRyeUNvbnRyb2xsZXIucmVjb3JkTWV0cmljKHtcbiAgICAgICAgbmFtZTogXCJzb25hbXUud3MuY29ubmVjdGlvbnNcIixcbiAgICAgICAga2luZDogXCJjb3VudGVyXCIsXG4gICAgICAgIHZhbHVlOiAxLFxuICAgICAgICB1bml0OiBcIjFcIixcbiAgICAgICAgdGFnczogeyBvdXRjb21lOiBcInVucmVnaXN0ZXJlZFwiLCBuYW1lc3BhY2U6IG1ldGEubmFtZXNwYWNlIH0sXG4gICAgICAgIHVzZXJJZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRvdWNoKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlLnRvdWNoKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBzZXRVc2VySWQoY29ubmVjdGlvbklkOiBzdHJpbmcsIHVzZXJJZDogV2ViU29ja2V0VXNlcklkKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpKSB7XG4gICAgICB0aGlzLmVtaXRNdXRhdGlvblNraXBwZWQoY29ubmVjdGlvbklkLCB7IG9wZXJhdGlvbjogXCJzZXRVc2VySWRcIiwgdXNlcklkIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJlc2VuY2VTdG9yZS5zZXRVc2VySWQoY29ubmVjdGlvbklkLCB1c2VySWQpO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MudXNlci5ib3VuZFwiLFxuICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIG5hbWVzcGFjZTogbWV0YT8ubmFtZXNwYWNlLFxuICAgICAgdXNlcklkOiBTdHJpbmcodXNlcklkKSxcbiAgICAgIGRldGFpbDogeyB1c2VySWQgfSxcbiAgICAgIC4uLmdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KHRoaXMubG9jYWxDb25uZWN0aW9ucy5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCkpLFxuICAgIH0pO1xuICB9XG5cbiAgY2xlYXJVc2VySWQoY29ubmVjdGlvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5wcmVzZW5jZVN0b3JlLmdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHRoaXMuZW1pdE11dGF0aW9uU2tpcHBlZChjb25uZWN0aW9uSWQsIHsgb3BlcmF0aW9uOiBcImNsZWFyVXNlcklkXCIgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcklkID0gbWV0YS51c2VySWQ7XG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlLmNsZWFyVXNlcklkKGNvbm5lY3Rpb25JZCk7XG4gICAgdGhpcy50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgbmFtZTogXCJ3cy51c2VyLmNsZWFyZWRcIixcbiAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICBjb25uZWN0aW9uSWQsXG4gICAgICBuYW1lc3BhY2U6IG1ldGEubmFtZXNwYWNlLFxuICAgICAgdXNlcklkOiBmb3JtYXRVc2VySWQodXNlcklkKSxcbiAgICAgIGRldGFpbDogdXNlcklkICE9PSB1bmRlZmluZWQgPyB7IHVzZXJJZCB9IDogdW5kZWZpbmVkLFxuICAgICAgLi4uZ2V0Q29ubmVjdGlvblRlbGVtZXRyeUNvbnRleHQodGhpcy5sb2NhbENvbm5lY3Rpb25zLmdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkKSksXG4gICAgfSk7XG4gIH1cblxuICBqb2luKGNvbm5lY3Rpb25JZDogc3RyaW5nLCByb29tSWQ6IFdlYlNvY2tldFJvb21JZCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wcmVzZW5jZVN0b3JlLmdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkKSkge1xuICAgICAgdGhpcy5lbWl0TXV0YXRpb25Ta2lwcGVkKGNvbm5lY3Rpb25JZCwgeyBvcGVyYXRpb246IFwiam9pblwiLCByb29tSWQgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wcmVzZW5jZVN0b3JlLmpvaW4oY29ubmVjdGlvbklkLCByb29tSWQpO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3Mucm9vbS5qb2luZWRcIixcbiAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICBjb25uZWN0aW9uSWQsXG4gICAgICBuYW1lc3BhY2U6IG1ldGE/Lm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogY29ubmVjdGlvbj8udXNlcklkID8/IGZvcm1hdFVzZXJJZChtZXRhPy51c2VySWQpLFxuICAgICAgZGV0YWlsOiB7IHJvb21JZCB9LFxuICAgICAgLi4uZ2V0Q29ubmVjdGlvblRlbGVtZXRyeUNvbnRleHQoY29ubmVjdGlvbiksXG4gICAgfSk7XG4gIH1cblxuICBsZWF2ZShjb25uZWN0aW9uSWQ6IHN0cmluZywgcm9vbUlkOiBXZWJTb2NrZXRSb29tSWQpOiB2b2lkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5wcmVzZW5jZVN0b3JlLmdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkKTtcbiAgICBpZiAoIW1ldGEpIHtcbiAgICAgIHRoaXMuZW1pdE11dGF0aW9uU2tpcHBlZChjb25uZWN0aW9uSWQsIHsgb3BlcmF0aW9uOiBcImxlYXZlXCIsIHJvb21JZCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByZXNlbmNlU3RvcmUubGVhdmUoY29ubmVjdGlvbklkLCByb29tSWQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbihjb25uZWN0aW9uSWQpO1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3Mucm9vbS5sZWZ0XCIsXG4gICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgbmFtZXNwYWNlOiBtZXRhLm5hbWVzcGFjZSxcbiAgICAgIHVzZXJJZDogY29ubmVjdGlvbj8udXNlcklkID8/IGZvcm1hdFVzZXJJZChtZXRhLnVzZXJJZCksXG4gICAgICBkZXRhaWw6IHsgcm9vbUlkIH0sXG4gICAgICAuLi5nZXRDb25uZWN0aW9uVGVsZW1ldHJ5Q29udGV4dChjb25uZWN0aW9uKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdE11dGF0aW9uU2tpcHBlZChcbiAgICBjb25uZWN0aW9uSWQ6IHN0cmluZyxcbiAgICBkZXRhaWw6IHtcbiAgICAgIG9wZXJhdGlvbjogXCJhY3RpdmF0ZVwiIHwgXCJzZXRVc2VySWRcIiB8IFwiY2xlYXJVc2VySWRcIiB8IFwiam9pblwiIHwgXCJsZWF2ZVwiO1xuICAgICAgcm9vbUlkPzogV2ViU29ja2V0Um9vbUlkO1xuICAgICAgdXNlcklkPzogV2ViU29ja2V0VXNlcklkO1xuICAgIH0sXG4gICk6IHZvaWQge1xuICAgIHRoaXMudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgIG5hbWU6IFwid3MucmVnaXN0cnkubXV0YXRpb24uc2tpcHBlZFwiLFxuICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIGRldGFpbDogeyAuLi5kZXRhaWwsIHJlYXNvbjogXCJjb25uZWN0aW9uTWlzc2luZ1wiIH0sXG4gICAgfSk7XG4gIH1cblxuICBicm9hZGNhc3QoZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS5hbGwobmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvUm9vbShyb29tSWQ6IFdlYlNvY2tldFJvb21JZCwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS5yb29tKHJvb21JZCwgbmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvVXNlcih1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wdWJsaXNoVG9BdWRpZW5jZShXZWJTb2NrZXRBdWRpZW5jZS51c2VyKHVzZXJJZCwgbmFtZXNwYWNlKSwgZXZlbnQsIGRhdGEpO1xuICB9XG5cbiAgcHVibGlzaFRvQXVkaWVuY2UoYXVkaWVuY2U6IFdlYlNvY2tldEF1ZGllbmNlU3BlYywgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuZGVsaXZlcnlFbmdpbmUucHVibGlzaFRvQXVkaWVuY2UoYXVkaWVuY2UsIGV2ZW50LCBkYXRhKTtcbiAgfVxuXG4gIGdldENvbm5lY3Rpb24oY29ubmVjdGlvbklkOiBzdHJpbmcpOiBXZWJTb2NrZXRDb25uZWN0aW9uTWV0YSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2VuY2VTdG9yZS5nZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBnZXRDb25uZWN0aW9uQ291bnQobmFtZXNwYWNlPzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcmVzZW5jZVN0b3JlLmdldENvbm5lY3Rpb25Db3VudChuYW1lc3BhY2UpO1xuICB9XG5cbiAgZ2V0Um9vbU1lbWJlcnMocm9vbUlkOiBXZWJTb2NrZXRSb29tSWQsIG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldENvbm5lY3Rpb25NZXRhW10ge1xuICAgIHJldHVybiB0aGlzLnByZXNlbmNlU3RvcmUuZ2V0Um9vbU1lbWJlcnMocm9vbUlkLCBuYW1lc3BhY2UpO1xuICB9XG5cbiAgZ2V0U3RhdHMoKTogV2ViU29ja2V0UmVnaXN0cnlTdGF0cyB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2VuY2VTdG9yZS5nZXRTdGF0cygpO1xuICB9XG5cbiAgY2xvc2VBbGwoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbENvbm5lY3Rpb25zLmNsb3NlQWxsKGNvZGUsIHJlYXNvbik7XG4gIH1cblxuICBhc3luYyBzaHV0ZG93bihjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsb3NlQWxsKGNvZGUsIHJlYXNvbik7XG4gICAgYXdhaXQgdGhpcy5kZWxpdmVyeUVuZ2luZS5zaHV0ZG93bigpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldENvbm5lY3Rpb25UZWxlbWV0cnlDb250ZXh0KFxuICBjb25uZWN0aW9uOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbiB8IHVuZGVmaW5lZCxcbik6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0IHtcbiAgaWYgKCFjb25uZWN0aW9uIHx8ICFpc1RlbGVtZXRyeUNvbnRleHRQcm92aWRlcihjb25uZWN0aW9uKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHJldHVybiBjb25uZWN0aW9uLmdldFRlbGVtZXRyeUNvbnRleHQoKTtcbn1cblxuLy8gdGVsZW1ldHJ5IHJlY29yZOydmCB1c2VySWTripQgc3RyaW5nIOygleq3nO2ZlCDigJQgcHJlc2VuY2Ugc3RvcmXripQgbnVtYmVyIHwgc3RyaW5nIOq3uOuMgOuhnCDrs7TqtIDtlahcbmZ1bmN0aW9uIGZvcm1hdFVzZXJJZCh1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB1c2VySWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFN0cmluZyh1c2VySWQpO1xufVxuXG5mdW5jdGlvbiBpc1RlbGVtZXRyeUNvbnRleHRQcm92aWRlcihcbiAgY29ubmVjdGlvbjogTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24sXG4pOiBjb25uZWN0aW9uIGlzIE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uICYgVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyIHtcbiAgcmV0dXJuIChcbiAgICBcImdldFRlbGVtZXRyeUNvbnRleHRcIiBpbiBjb25uZWN0aW9uICYmIHR5cGVvZiBjb25uZWN0aW9uLmdldFRlbGVtZXRyeUNvbnRleHQgPT09IFwiZnVuY3Rpb25cIlxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBeVNBLFNBQVMsOEJBQ1AsWUFDcUM7QUFDckMsS0FBSSxDQUFDLGNBQWMsQ0FBQywyQkFBMkIsV0FBVyxFQUFFO0FBQzFELFNBQU8sRUFBRTs7QUFHWCxRQUFPLFdBQVcscUJBQXFCOztBQUl6QyxTQUFTLGFBQWEsUUFBeUQ7QUFDN0UsUUFBTyxXQUFXLFlBQVksWUFBWSxPQUFPLE9BQU87O0FBRzFELFNBQVMsMkJBQ1AsWUFDcUU7QUFDckUsUUFDRSx5QkFBeUIsY0FBYyxPQUFPLFdBQVcsd0JBQXdCOzs7O21CQTVUYzs0QkFDaEM7c0JBQ2tCO21CQU83QjtpQ0FDb0I7eUJBSy9DO29CQU1MO0NBa0JYLG9CQUFiLE1BQStCO0VBQzdCLEFBQVM7RUFDVCxBQUFTLG1CQUFtQixJQUFJLCtCQUErQjtFQUMvRCxBQUFTO0VBQ1QsQUFBUztFQUNULEFBQVM7RUFDVCxBQUFTO0VBQ1QsQUFBUztFQUVULFlBQVksU0FBbUM7QUFDN0MsUUFBSyxTQUFTLFFBQVE7QUFDdEIsUUFBSyxnQkFBZ0IsUUFBUSxpQkFBaUIsSUFBSSxnQ0FBZ0M7QUFDbEYsUUFBSyxhQUFhLFFBQVEsY0FBYyxJQUFJLHlCQUF5QjtBQUNyRSxRQUFLLHNCQUNILFFBQVEsdUJBQXVCLElBQUksa0NBQWtDO0FBQ3ZFLFFBQUssbUJBQW1CLElBQUksMEJBQTBCO0lBQ3BELFFBQVEsS0FBSztJQUNiLGVBQWUsS0FBSztJQUNyQixDQUFDO0FBQ0YsUUFBSyxpQkFBaUIsSUFBSSx3QkFBd0I7SUFDaEQsUUFBUSxLQUFLO0lBQ2Isa0JBQWtCLEtBQUs7SUFDdkIsa0JBQWtCLEtBQUs7SUFDdkIsWUFBWSxLQUFLO0lBQ2pCLHFCQUFxQixLQUFLO0lBQzNCLENBQUM7QUFFRixRQUFLLG9CQUFvQixxQkFBcUIsRUFDNUMsVUFBVSxTQUFTO0lBQ2pCLE1BQU0sUUFBUSxLQUFLLGNBQWMsVUFBVTtJQUMzQyxNQUFNLGdCQUFnQixLQUFLLGlCQUFpQixzQkFBc0I7QUFDbEUsV0FBTztLQUNMLG1CQUFtQixNQUFNO0tBQ3pCLDhCQUE4QixNQUFNO0tBQ3BDLFdBQVcsTUFBTTtLQUNqQix3QkFBd0IsY0FBYztLQUN0Qyx5QkFBeUIsY0FBYztLQUN2QyxxQkFBcUIsY0FBYztLQUNwQztNQUVKLENBQUM7O0VBR0osU0FDRSxZQUNBLFNBQWtCLE1BQ087QUFDekIsUUFBSyxpQkFBaUIsU0FBUyxXQUFXO0dBQzFDLE1BQU0sT0FBTyxLQUFLLGNBQWMsU0FBUztJQUN2QyxXQUFXLFdBQVc7SUFDdEIsUUFBUSxLQUFLO0lBQ2IsV0FBVyxXQUFXO0lBQ3RCO0lBQ0QsQ0FBQztBQUNGLFFBQUssb0JBQW9CLEtBQUs7SUFDNUIsTUFBTTtJQUNOLE9BQU87SUFDUCxjQUFjLFdBQVc7SUFDekIsV0FBVyxXQUFXO0lBQ3RCLFFBQVEsV0FBVztJQUNuQixHQUFHLDhCQUE4QixXQUFXO0lBQzdDLENBQUM7QUFDRixRQUFLLG9CQUFvQixhQUFhO0lBQ3BDLE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0tBQUUsU0FBUztLQUFjLFdBQVcsV0FBVztLQUFXO0lBQ2hFLFFBQVEsV0FBVztJQUNwQixDQUFDO0FBQ0YsVUFBTzs7RUFHVCxTQUFTLGNBQTRCO0FBQ25DLE9BQUksQ0FBQyxLQUFLLGNBQWMsY0FBYyxhQUFhLEVBQUU7QUFDbkQsU0FBSyxvQkFBb0IsY0FBYyxFQUFFLFdBQVcsWUFBWSxDQUFDO0FBQ2pFOztBQUdGLFFBQUssY0FBYyxTQUFTLGFBQWE7R0FDekMsTUFBTSxhQUFhLEtBQUssaUJBQWlCLGNBQWMsYUFBYTtBQUNwRSxRQUFLLG9CQUFvQixLQUFLO0lBQzVCLE1BQU07SUFDTixPQUFPO0lBQ1A7SUFDQSxRQUFRLFlBQVk7SUFDcEIsR0FBRyw4QkFBOEIsV0FBVztJQUM3QyxDQUFDOztFQUdKLFdBQVcsY0FBNEI7R0FDckMsTUFBTSxhQUFhLEtBQUssaUJBQWlCLGNBQWMsYUFBYTtHQUNwRSxNQUFNLG1CQUFtQiw4QkFBOEIsV0FBVztHQUNsRSxNQUFNLFNBQ0osWUFBWSxVQUFVLGFBQWEsS0FBSyxjQUFjLGNBQWMsYUFBYSxFQUFFLE9BQU87R0FDNUYsTUFBTSxPQUFPLEtBQUssY0FBYyxXQUFXLGFBQWE7QUFDeEQsUUFBSyxpQkFBaUIsV0FBVyxhQUFhO0FBQzlDLFFBQUssb0JBQW9CLEtBQUs7SUFDNUIsTUFBTTtJQUNOLE9BQU87SUFDUDtJQUNBLFdBQVcsTUFBTTtJQUNqQjtJQUNBLEdBQUc7SUFDSixDQUFDO0FBQ0YsT0FBSSxNQUFNO0FBQ1IsU0FBSyxvQkFBb0IsYUFBYTtLQUNwQyxNQUFNO0tBQ04sTUFBTTtLQUNOLE9BQU87S0FDUCxNQUFNO0tBQ04sTUFBTTtNQUFFLFNBQVM7TUFBZ0IsV0FBVyxLQUFLO01BQVc7S0FDNUQ7S0FDRCxDQUFDOzs7RUFJTixNQUFNLGNBQTRCO0FBQ2hDLFFBQUssY0FBYyxNQUFNLGFBQWE7O0VBR3hDLFVBQVUsY0FBc0IsUUFBK0I7QUFDN0QsT0FBSSxDQUFDLEtBQUssY0FBYyxjQUFjLGFBQWEsRUFBRTtBQUNuRCxTQUFLLG9CQUFvQixjQUFjO0tBQUUsV0FBVztLQUFhO0tBQVEsQ0FBQztBQUMxRTs7QUFHRixRQUFLLGNBQWMsVUFBVSxjQUFjLE9BQU87R0FDbEQsTUFBTSxPQUFPLEtBQUssY0FBYyxjQUFjLGFBQWE7QUFDM0QsUUFBSyxvQkFBb0IsS0FBSztJQUM1QixNQUFNO0lBQ04sT0FBTztJQUNQO0lBQ0EsV0FBVyxNQUFNO0lBQ2pCLFFBQVEsT0FBTyxPQUFPO0lBQ3RCLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLEdBQUcsOEJBQThCLEtBQUssaUJBQWlCLGNBQWMsYUFBYSxDQUFDO0lBQ3BGLENBQUM7O0VBR0osWUFBWSxjQUE0QjtHQUN0QyxNQUFNLE9BQU8sS0FBSyxjQUFjLGNBQWMsYUFBYTtBQUMzRCxPQUFJLENBQUMsTUFBTTtBQUNULFNBQUssb0JBQW9CLGNBQWMsRUFBRSxXQUFXLGVBQWUsQ0FBQztBQUNwRTs7R0FHRixNQUFNLFNBQVMsS0FBSztBQUNwQixRQUFLLGNBQWMsWUFBWSxhQUFhO0FBQzVDLFFBQUssb0JBQW9CLEtBQUs7SUFDNUIsTUFBTTtJQUNOLE9BQU87SUFDUDtJQUNBLFdBQVcsS0FBSztJQUNoQixRQUFRLGFBQWEsT0FBTztJQUM1QixRQUFRLFdBQVcsWUFBWSxFQUFFLFFBQVEsR0FBRztJQUM1QyxHQUFHLDhCQUE4QixLQUFLLGlCQUFpQixjQUFjLGFBQWEsQ0FBQztJQUNwRixDQUFDOztFQUdKLEtBQUssY0FBc0IsUUFBK0I7QUFDeEQsT0FBSSxDQUFDLEtBQUssY0FBYyxjQUFjLGFBQWEsRUFBRTtBQUNuRCxTQUFLLG9CQUFvQixjQUFjO0tBQUUsV0FBVztLQUFRO0tBQVEsQ0FBQztBQUNyRTs7QUFHRixRQUFLLGNBQWMsS0FBSyxjQUFjLE9BQU87R0FDN0MsTUFBTSxPQUFPLEtBQUssY0FBYyxjQUFjLGFBQWE7R0FDM0QsTUFBTSxhQUFhLEtBQUssaUJBQWlCLGNBQWMsYUFBYTtBQUNwRSxRQUFLLG9CQUFvQixLQUFLO0lBQzVCLE1BQU07SUFDTixPQUFPO0lBQ1A7SUFDQSxXQUFXLE1BQU07SUFDakIsUUFBUSxZQUFZLFVBQVUsYUFBYSxNQUFNLE9BQU87SUFDeEQsUUFBUSxFQUFFLFFBQVE7SUFDbEIsR0FBRyw4QkFBOEIsV0FBVztJQUM3QyxDQUFDOztFQUdKLE1BQU0sY0FBc0IsUUFBK0I7R0FDekQsTUFBTSxPQUFPLEtBQUssY0FBYyxjQUFjLGFBQWE7QUFDM0QsT0FBSSxDQUFDLE1BQU07QUFDVCxTQUFLLG9CQUFvQixjQUFjO0tBQUUsV0FBVztLQUFTO0tBQVEsQ0FBQztBQUN0RTs7QUFHRixRQUFLLGNBQWMsTUFBTSxjQUFjLE9BQU87R0FDOUMsTUFBTSxhQUFhLEtBQUssaUJBQWlCLGNBQWMsYUFBYTtBQUNwRSxRQUFLLG9CQUFvQixLQUFLO0lBQzVCLE1BQU07SUFDTixPQUFPO0lBQ1A7SUFDQSxXQUFXLEtBQUs7SUFDaEIsUUFBUSxZQUFZLFVBQVUsYUFBYSxLQUFLLE9BQU87SUFDdkQsUUFBUSxFQUFFLFFBQVE7SUFDbEIsR0FBRyw4QkFBOEIsV0FBVztJQUM3QyxDQUFDOztFQUdKLEFBQVEsb0JBQ04sY0FDQSxRQUtNO0FBQ04sUUFBSyxvQkFBb0IsS0FBSztJQUM1QixNQUFNO0lBQ04sT0FBTztJQUNQO0lBQ0EsUUFBUTtLQUFFLEdBQUc7S0FBUSxRQUFRO0tBQXFCO0lBQ25ELENBQUM7O0VBR0osVUFBVSxPQUFlLE1BQWUsV0FBMEI7QUFDaEUsUUFBSyxrQkFBa0Isa0JBQWtCLElBQUksVUFBVSxFQUFFLE9BQU8sS0FBSzs7RUFHdkUsY0FBYyxRQUF5QixPQUFlLE1BQWUsV0FBMEI7QUFDN0YsUUFBSyxrQkFBa0Isa0JBQWtCLEtBQUssUUFBUSxVQUFVLEVBQUUsT0FBTyxLQUFLOztFQUdoRixjQUFjLFFBQXlCLE9BQWUsTUFBZSxXQUEwQjtBQUM3RixRQUFLLGtCQUFrQixrQkFBa0IsS0FBSyxRQUFRLFVBQVUsRUFBRSxPQUFPLEtBQUs7O0VBR2hGLGtCQUFrQixVQUFpQyxPQUFlLE1BQXFCO0FBQ3JGLFFBQUssZUFBZSxrQkFBa0IsVUFBVSxPQUFPLEtBQUs7O0VBRzlELGNBQWMsY0FBMkQ7QUFDdkUsVUFBTyxLQUFLLGNBQWMsY0FBYyxhQUFhOztFQUd2RCxtQkFBbUIsV0FBNEI7QUFDN0MsVUFBTyxLQUFLLGNBQWMsbUJBQW1CLFVBQVU7O0VBR3pELGVBQWUsUUFBeUIsV0FBK0M7QUFDckYsVUFBTyxLQUFLLGNBQWMsZUFBZSxRQUFRLFVBQVU7O0VBRzdELFdBQW1DO0FBQ2pDLFVBQU8sS0FBSyxjQUFjLFVBQVU7O0VBR3RDLFNBQVMsTUFBZSxRQUF1QjtBQUM3QyxRQUFLLGlCQUFpQixTQUFTLE1BQU0sT0FBTzs7RUFHOUMsTUFBTSxTQUFTLE1BQWUsUUFBZ0M7QUFDNUQsUUFBSyxTQUFTLE1BQU0sT0FBTztBQUMzQixTQUFNLEtBQUssZUFBZSxVQUFVIn0=
@@ -0,0 +1,28 @@
1
+ import { type WebSocketTelemetryEventQueryFilter, type WebSocketTelemetryEventRecord, type WebSocketTelemetryEventSink, type WebSocketTelemetryEventStore, type WebSocketTelemetryMetricQueryFilter, type WebSocketTelemetryMetricRecord, type WebSocketTelemetryMetricSink, type WebSocketTelemetryMetricStore, type WebSocketTelemetrySpanQueryFilter, type WebSocketTelemetrySpanRecord, type WebSocketTelemetrySpanSink, type WebSocketTelemetrySpanStore } from "./ws-telemetry";
2
+ type InMemoryStoreOptions = {
3
+ maxRecords?: number;
4
+ maxBytes?: number;
5
+ };
6
+ export declare class InMemoryEventStore implements WebSocketTelemetryEventStore {
7
+ readonly sink: WebSocketTelemetryEventSink;
8
+ private readonly buffer;
9
+ constructor(options?: InMemoryStoreOptions);
10
+ query(filter: WebSocketTelemetryEventQueryFilter): WebSocketTelemetryEventRecord[];
11
+ clear(): void;
12
+ }
13
+ export declare class InMemoryMetricStore implements WebSocketTelemetryMetricStore {
14
+ readonly sink: WebSocketTelemetryMetricSink;
15
+ private readonly buffer;
16
+ constructor(options?: InMemoryStoreOptions);
17
+ query(filter: WebSocketTelemetryMetricQueryFilter): WebSocketTelemetryMetricRecord[];
18
+ clear(): void;
19
+ }
20
+ export declare class InMemorySpanStore implements WebSocketTelemetrySpanStore {
21
+ readonly sink: WebSocketTelemetrySpanSink;
22
+ private readonly buffer;
23
+ constructor(options?: InMemoryStoreOptions);
24
+ query(filter: WebSocketTelemetrySpanQueryFilter): WebSocketTelemetrySpanRecord[];
25
+ clear(): void;
26
+ }
27
+ export {};
28
+ //# sourceMappingURL=ws-telemetry-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-telemetry-memory.d.ts","sourceRoot":"","sources":["../../src/stream/ws-telemetry-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kCAAkC,EACvC,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,mCAAmC,EACxC,KAAK,8BAA8B,EACnC,KAAK,4BAA4B,EACjC,KAAK,6BAA6B,EAClC,KAAK,iCAAiC,EACtC,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EACjC,MAAM,gBAAgB,CAAC;AAExB,KAAK,oBAAoB,GAAG;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAuHF,qBAAa,kBAAmB,YAAW,4BAA4B;IACrE,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAE3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoD;gBAE/D,OAAO,GAAE,oBAAyB;IAa9C,KAAK,CAAC,MAAM,EAAE,kCAAkC,GAAG,6BAA6B,EAAE;IAclF,KAAK,IAAI,IAAI;CAGd;AAED,qBAAa,mBAAoB,YAAW,6BAA6B;IACvE,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAC;IAE5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqD;gBAEhE,OAAO,GAAE,oBAAyB;IAa9C,KAAK,CAAC,MAAM,EAAE,mCAAmC,GAAG,8BAA8B,EAAE;IAcpF,KAAK,IAAI,IAAI;CAGd;AAED,qBAAa,iBAAkB,YAAW,2BAA2B;IACnE,QAAQ,CAAC,IAAI,EAAE,0BAA0B,CAAC;IAE1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmD;gBAE9D,OAAO,GAAE,oBAAyB;IAU9C,KAAK,CAAC,MAAM,EAAE,iCAAiC,GAAG,4BAA4B,EAAE;IAgBhF,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,180 @@
1
+ import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
+
3
+ //#region src/stream/ws-telemetry-memory.ts
4
+ function applyTimeWindow(record, since, until) {
5
+ if (since !== undefined && record.timestamp < since) return false;
6
+ if (until !== undefined && record.timestamp > until) return false;
7
+ return true;
8
+ }
9
+ function estimateEventBytes(record) {
10
+ let size = 200;
11
+ if (record.payloadPreview !== undefined) {
12
+ try {
13
+ size += Buffer.byteLength(JSON.stringify(record.payloadPreview), "utf-8");
14
+ } catch {
15
+ size += 100;
16
+ }
17
+ }
18
+ if (record.detail) {
19
+ try {
20
+ size += Buffer.byteLength(JSON.stringify(record.detail), "utf-8");
21
+ } catch {
22
+ size += 100;
23
+ }
24
+ }
25
+ return size;
26
+ }
27
+ function estimateMetricBytes(_record) {
28
+ return 200;
29
+ }
30
+ function estimateSpanBytes(_record) {
31
+ return 200;
32
+ }
33
+ var DEFAULT_MAX_RECORDS, DEFAULT_MAX_BYTES, InMemoryRingBuffer, InMemoryEventStore, InMemoryMetricStore, InMemorySpanStore;
34
+ var init_ws_telemetry_memory = __esmMin((() => {
35
+ DEFAULT_MAX_RECORDS = 1e4;
36
+ DEFAULT_MAX_BYTES = 10 * 1024 * 1024;
37
+ InMemoryRingBuffer = class {
38
+ slots;
39
+ slotBytes;
40
+ capacity;
41
+ maxBytes;
42
+ estimateBytes;
43
+ head = 0;
44
+ count = 0;
45
+ currentBytes = 0;
46
+ constructor(options, estimateBytes) {
47
+ this.capacity = options.maxRecords ?? DEFAULT_MAX_RECORDS;
48
+ this.maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
49
+ this.estimateBytes = estimateBytes;
50
+ this.slots = new Array(this.capacity);
51
+ this.slotBytes = new Array(this.capacity).fill(0);
52
+ }
53
+ push(record) {
54
+ if (this.capacity <= 0) return;
55
+ const recordSize = this.estimateBytes(record);
56
+ if (recordSize > this.maxBytes) return;
57
+ if (this.count === this.capacity) {
58
+ this.currentBytes -= this.slotBytes[this.head];
59
+ this.slots[this.head] = record;
60
+ this.slotBytes[this.head] = recordSize;
61
+ this.currentBytes += recordSize;
62
+ this.head = (this.head + 1) % this.capacity;
63
+ } else {
64
+ const tail = (this.head + this.count) % this.capacity;
65
+ this.slots[tail] = record;
66
+ this.slotBytes[tail] = recordSize;
67
+ this.currentBytes += recordSize;
68
+ this.count += 1;
69
+ }
70
+ while (this.currentBytes > this.maxBytes && this.count > 1) {
71
+ this.currentBytes -= this.slotBytes[this.head];
72
+ this.slots[this.head] = undefined;
73
+ this.slotBytes[this.head] = 0;
74
+ this.head = (this.head + 1) % this.capacity;
75
+ this.count -= 1;
76
+ }
77
+ }
78
+ filter(predicate, limit) {
79
+ const matched = [];
80
+ for (let i = 0; i < this.count; i++) {
81
+ const record = this.slots[(this.head + i) % this.capacity];
82
+ if (record !== undefined && predicate(record)) matched.push(record);
83
+ }
84
+ if (limit !== undefined && limit > 0 && matched.length > limit) {
85
+ return matched.slice(-limit);
86
+ }
87
+ return matched;
88
+ }
89
+ clear() {
90
+ for (let i = 0; i < this.capacity; i++) {
91
+ this.slots[i] = undefined;
92
+ this.slotBytes[i] = 0;
93
+ }
94
+ this.head = 0;
95
+ this.count = 0;
96
+ this.currentBytes = 0;
97
+ }
98
+ };
99
+ InMemoryEventStore = class {
100
+ sink;
101
+ buffer;
102
+ constructor(options = {}) {
103
+ this.buffer = new InMemoryRingBuffer(options, estimateEventBytes);
104
+ this.sink = { emit: (record) => {
105
+ this.buffer.push(record);
106
+ } };
107
+ }
108
+ query(filter) {
109
+ return this.buffer.filter((record) => {
110
+ if (filter.name !== undefined && record.name !== filter.name) return false;
111
+ if (filter.level !== undefined && record.level !== filter.level) return false;
112
+ if (filter.connectionId !== undefined && record.connectionId !== filter.connectionId) return false;
113
+ if (filter.userId !== undefined && record.userId !== filter.userId) return false;
114
+ if (filter.namespace !== undefined && record.namespace !== filter.namespace) return false;
115
+ if (filter.traceId !== undefined && record.traceId !== filter.traceId) return false;
116
+ if (!applyTimeWindow(record, filter.since, filter.until)) return false;
117
+ return true;
118
+ }, filter.limit);
119
+ }
120
+ clear() {
121
+ this.buffer.clear();
122
+ }
123
+ };
124
+ InMemoryMetricStore = class {
125
+ sink;
126
+ buffer;
127
+ constructor(options = {}) {
128
+ this.buffer = new InMemoryRingBuffer(options, estimateMetricBytes);
129
+ this.sink = { emit: (record) => {
130
+ this.buffer.push(record);
131
+ } };
132
+ }
133
+ query(filter) {
134
+ return this.buffer.filter((record) => {
135
+ if (filter.name !== undefined && record.name !== filter.name) return false;
136
+ if (filter.kind !== undefined && record.kind !== filter.kind) return false;
137
+ if (filter.connectionId !== undefined && record.connectionId !== filter.connectionId) return false;
138
+ if (filter.userId !== undefined && record.userId !== filter.userId) return false;
139
+ if (filter.namespace !== undefined && record.namespace !== filter.namespace) return false;
140
+ if (filter.traceId !== undefined && record.traceId !== filter.traceId) return false;
141
+ if (!applyTimeWindow(record, filter.since, filter.until)) return false;
142
+ return true;
143
+ }, filter.limit);
144
+ }
145
+ clear() {
146
+ this.buffer.clear();
147
+ }
148
+ };
149
+ InMemorySpanStore = class {
150
+ sink;
151
+ buffer;
152
+ constructor(options = {}) {
153
+ this.buffer = new InMemoryRingBuffer(options, estimateSpanBytes);
154
+ this.sink = { emit: (record) => {
155
+ this.buffer.push(record);
156
+ } };
157
+ }
158
+ query(filter) {
159
+ return this.buffer.filter((record) => {
160
+ if (filter.operationName !== undefined && record.operationName !== filter.operationName) return false;
161
+ if (filter.kind !== undefined && record.kind !== filter.kind) return false;
162
+ if (filter.status !== undefined && record.status !== filter.status) return false;
163
+ if (filter.connectionId !== undefined && record.connectionId !== filter.connectionId) return false;
164
+ if (filter.userId !== undefined && record.userId !== filter.userId) return false;
165
+ if (filter.namespace !== undefined && record.namespace !== filter.namespace) return false;
166
+ if (filter.traceId !== undefined && record.traceId !== filter.traceId) return false;
167
+ if (!applyTimeWindow(record, filter.since, filter.until)) return false;
168
+ return true;
169
+ }, filter.limit);
170
+ }
171
+ clear() {
172
+ this.buffer.clear();
173
+ }
174
+ };
175
+ }));
176
+
177
+ //#endregion
178
+ init_ws_telemetry_memory();
179
+ export { InMemoryEventStore, InMemoryMetricStore, InMemorySpanStore, init_ws_telemetry_memory };
180
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGVsZW1ldHJ5LW1lbW9yeS5qcyIsIm5hbWVzIjpbIm1hdGNoZWQ6IFRSZWNvcmRbXSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlYW0vd3MtdGVsZW1ldHJ5LW1lbW9yeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UXVlcnlGaWx0ZXIsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTaW5rLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUXVlcnlGaWx0ZXIsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NpbmssXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU3RvcmUsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblF1ZXJ5RmlsdGVyLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQsXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblNpbmssXG4gIHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlLFxufSBmcm9tIFwiLi93cy10ZWxlbWV0cnlcIjtcblxudHlwZSBJbk1lbW9yeVN0b3JlT3B0aW9ucyA9IHtcbiAgbWF4UmVjb3Jkcz86IG51bWJlcjtcbiAgbWF4Qnl0ZXM/OiBudW1iZXI7XG59O1xuXG5jb25zdCBERUZBVUxUX01BWF9SRUNPUkRTID0gMTBfMDAwO1xuY29uc3QgREVGQVVMVF9NQVhfQllURVMgPSAxMCAqIDEwMjQgKiAxMDI0OyAvLyAxMCBNaUJcblxudHlwZSBFc3RpbWF0ZUJ5dGVzPFRSZWNvcmQ+ID0gKHJlY29yZDogVFJlY29yZCkgPT4gbnVtYmVyO1xuXG4vLyDri6jsnbwgRklGTyByaW5nIGJ1ZmZlci4gY3JpdGljYWwvbm9uLWNyaXRpY2FsIOyasOyEoOyInOychOuKlCDrkZDsp4Ag7JWK64qU64ukIOKAlFxuLy8g7J2466mU66qo66asIHN0b3Jl64qUIO2cmOuwnOyEsSDrlJTrsoTquYUg7Jqp64+E7J2066+A66GcIGNyaXRpY2FsIOuztOyhtOydtCDtlYTsmpTtlZjrqbRcbi8vIOuzhOuPhOydmCDsmIHsho0gc2lua+ulvCDrk7HroZ3tlbTshJwg7LKY66as7ZWc64ukLlxuY2xhc3MgSW5NZW1vcnlSaW5nQnVmZmVyPFRSZWNvcmQgZXh0ZW5kcyB7IHRpbWVzdGFtcDogbnVtYmVyIH0+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBzbG90czogQXJyYXk8VFJlY29yZCB8IHVuZGVmaW5lZD47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2xvdEJ5dGVzOiBudW1iZXJbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBjYXBhY2l0eTogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heEJ5dGVzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXN0aW1hdGVCeXRlczogRXN0aW1hdGVCeXRlczxUUmVjb3JkPjtcbiAgcHJpdmF0ZSBoZWFkID0gMDtcbiAgcHJpdmF0ZSBjb3VudCA9IDA7XG4gIHByaXZhdGUgY3VycmVudEJ5dGVzID0gMDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJbk1lbW9yeVN0b3JlT3B0aW9ucywgZXN0aW1hdGVCeXRlczogRXN0aW1hdGVCeXRlczxUUmVjb3JkPikge1xuICAgIHRoaXMuY2FwYWNpdHkgPSBvcHRpb25zLm1heFJlY29yZHMgPz8gREVGQVVMVF9NQVhfUkVDT1JEUztcbiAgICB0aGlzLm1heEJ5dGVzID0gb3B0aW9ucy5tYXhCeXRlcyA/PyBERUZBVUxUX01BWF9CWVRFUztcbiAgICB0aGlzLmVzdGltYXRlQnl0ZXMgPSBlc3RpbWF0ZUJ5dGVzO1xuICAgIHRoaXMuc2xvdHMgPSBuZXcgQXJyYXkodGhpcy5jYXBhY2l0eSk7XG4gICAgdGhpcy5zbG90Qnl0ZXMgPSBuZXcgQXJyYXkodGhpcy5jYXBhY2l0eSkuZmlsbCgwKTtcbiAgfVxuXG4gIHB1c2gocmVjb3JkOiBUUmVjb3JkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2FwYWNpdHkgPD0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjb3JkU2l6ZSA9IHRoaXMuZXN0aW1hdGVCeXRlcyhyZWNvcmQpO1xuICAgIC8vIOuLqOydvCByZWNvcmTqsIAgbWF4Qnl0ZXPrpbwg64SY7Jy866m0IOuwm+yVhOuTpOydtOyngCDslYrripTri6QuXG4gICAgaWYgKHJlY29yZFNpemUgPiB0aGlzLm1heEJ5dGVzKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5jb3VudCA9PT0gdGhpcy5jYXBhY2l0eSkge1xuICAgICAgLy8g6rCA7J6lIOyYpOuemOuQnCDsiqzroa/snYQg642u7Ja07JO064ukLlxuICAgICAgdGhpcy5jdXJyZW50Qnl0ZXMgLT0gdGhpcy5zbG90Qnl0ZXNbdGhpcy5oZWFkXTtcbiAgICAgIHRoaXMuc2xvdHNbdGhpcy5oZWFkXSA9IHJlY29yZDtcbiAgICAgIHRoaXMuc2xvdEJ5dGVzW3RoaXMuaGVhZF0gPSByZWNvcmRTaXplO1xuICAgICAgdGhpcy5jdXJyZW50Qnl0ZXMgKz0gcmVjb3JkU2l6ZTtcbiAgICAgIHRoaXMuaGVhZCA9ICh0aGlzLmhlYWQgKyAxKSAlIHRoaXMuY2FwYWNpdHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhaWwgPSAodGhpcy5oZWFkICsgdGhpcy5jb3VudCkgJSB0aGlzLmNhcGFjaXR5O1xuICAgICAgdGhpcy5zbG90c1t0YWlsXSA9IHJlY29yZDtcbiAgICAgIHRoaXMuc2xvdEJ5dGVzW3RhaWxdID0gcmVjb3JkU2l6ZTtcbiAgICAgIHRoaXMuY3VycmVudEJ5dGVzICs9IHJlY29yZFNpemU7XG4gICAgICB0aGlzLmNvdW50ICs9IDE7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRoaXMuY3VycmVudEJ5dGVzID4gdGhpcy5tYXhCeXRlcyAmJiB0aGlzLmNvdW50ID4gMSkge1xuICAgICAgdGhpcy5jdXJyZW50Qnl0ZXMgLT0gdGhpcy5zbG90Qnl0ZXNbdGhpcy5oZWFkXTtcbiAgICAgIHRoaXMuc2xvdHNbdGhpcy5oZWFkXSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuc2xvdEJ5dGVzW3RoaXMuaGVhZF0gPSAwO1xuICAgICAgdGhpcy5oZWFkID0gKHRoaXMuaGVhZCArIDEpICUgdGhpcy5jYXBhY2l0eTtcbiAgICAgIHRoaXMuY291bnQgLT0gMTtcbiAgICB9XG4gIH1cblxuICBmaWx0ZXIocHJlZGljYXRlOiAocmVjb3JkOiBUUmVjb3JkKSA9PiBib29sZWFuLCBsaW1pdD86IG51bWJlcik6IFRSZWNvcmRbXSB7XG4gICAgY29uc3QgbWF0Y2hlZDogVFJlY29yZFtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuc2xvdHNbKHRoaXMuaGVhZCArIGkpICUgdGhpcy5jYXBhY2l0eV07XG4gICAgICBpZiAocmVjb3JkICE9PSB1bmRlZmluZWQgJiYgcHJlZGljYXRlKHJlY29yZCkpIG1hdGNoZWQucHVzaChyZWNvcmQpO1xuICAgIH1cbiAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCA+IDAgJiYgbWF0Y2hlZC5sZW5ndGggPiBsaW1pdCkge1xuICAgICAgcmV0dXJuIG1hdGNoZWQuc2xpY2UoLWxpbWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZWQ7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2FwYWNpdHk7IGkrKykge1xuICAgICAgdGhpcy5zbG90c1tpXSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuc2xvdEJ5dGVzW2ldID0gMDtcbiAgICB9XG4gICAgdGhpcy5oZWFkID0gMDtcbiAgICB0aGlzLmNvdW50ID0gMDtcbiAgICB0aGlzLmN1cnJlbnRCeXRlcyA9IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlUaW1lV2luZG93PFRSZWNvcmQgZXh0ZW5kcyB7IHRpbWVzdGFtcDogbnVtYmVyIH0+KFxuICByZWNvcmQ6IFRSZWNvcmQsXG4gIHNpbmNlOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIHVudGlsOiBudW1iZXIgfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgaWYgKHNpbmNlICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLnRpbWVzdGFtcCA8IHNpbmNlKSByZXR1cm4gZmFsc2U7XG4gIGlmICh1bnRpbCAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC50aW1lc3RhbXAgPiB1bnRpbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZXN0aW1hdGVFdmVudEJ5dGVzKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQpOiBudW1iZXIge1xuICBsZXQgc2l6ZSA9IDIwMDtcbiAgaWYgKHJlY29yZC5wYXlsb2FkUHJldmlldyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHNpemUgKz0gQnVmZmVyLmJ5dGVMZW5ndGgoSlNPTi5zdHJpbmdpZnkocmVjb3JkLnBheWxvYWRQcmV2aWV3KSwgXCJ1dGYtOFwiKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHNpemUgKz0gMTAwO1xuICAgIH1cbiAgfVxuICBpZiAocmVjb3JkLmRldGFpbCkge1xuICAgIHRyeSB7XG4gICAgICBzaXplICs9IEJ1ZmZlci5ieXRlTGVuZ3RoKEpTT04uc3RyaW5naWZ5KHJlY29yZC5kZXRhaWwpLCBcInV0Zi04XCIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgc2l6ZSArPSAxMDA7XG4gICAgfVxuICB9XG4gIHJldHVybiBzaXplO1xufVxuXG5mdW5jdGlvbiBlc3RpbWF0ZU1ldHJpY0J5dGVzKF9yZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCk6IG51bWJlciB7XG4gIHJldHVybiAyMDA7XG59XG5cbmZ1bmN0aW9uIGVzdGltYXRlU3BhbkJ5dGVzKF9yZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQpOiBudW1iZXIge1xuICByZXR1cm4gMjAwO1xufVxuXG5leHBvcnQgY2xhc3MgSW5NZW1vcnlFdmVudFN0b3JlIGltcGxlbWVudHMgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTdG9yZSB7XG4gIHJlYWRvbmx5IHNpbms6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U2luaztcblxuICBwcml2YXRlIHJlYWRvbmx5IGJ1ZmZlcjogSW5NZW1vcnlSaW5nQnVmZmVyPFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkPjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJbk1lbW9yeVN0b3JlT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5idWZmZXIgPSBuZXcgSW5NZW1vcnlSaW5nQnVmZmVyPFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkPihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBlc3RpbWF0ZUV2ZW50Qnl0ZXMsXG4gICAgKTtcblxuICAgIHRoaXMuc2luayA9IHtcbiAgICAgIGVtaXQ6IChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuYnVmZmVyLnB1c2gocmVjb3JkKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHF1ZXJ5KGZpbHRlcjogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRRdWVyeUZpbHRlcik6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkW10ge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5maWx0ZXIoKHJlY29yZCkgPT4ge1xuICAgICAgaWYgKGZpbHRlci5uYW1lICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLm5hbWUgIT09IGZpbHRlci5uYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLmxldmVsICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLmxldmVsICE9PSBmaWx0ZXIubGV2ZWwpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChmaWx0ZXIuY29ubmVjdGlvbklkICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLmNvbm5lY3Rpb25JZCAhPT0gZmlsdGVyLmNvbm5lY3Rpb25JZClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGZpbHRlci51c2VySWQgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQudXNlcklkICE9PSBmaWx0ZXIudXNlcklkKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLm5hbWVzcGFjZSAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC5uYW1lc3BhY2UgIT09IGZpbHRlci5uYW1lc3BhY2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChmaWx0ZXIudHJhY2VJZCAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC50cmFjZUlkICE9PSBmaWx0ZXIudHJhY2VJZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCFhcHBseVRpbWVXaW5kb3cocmVjb3JkLCBmaWx0ZXIuc2luY2UsIGZpbHRlci51bnRpbCkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sIGZpbHRlci5saW1pdCk7XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlci5jbGVhcigpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbk1lbW9yeU1ldHJpY1N0b3JlIGltcGxlbWVudHMgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU3RvcmUge1xuICByZWFkb25seSBzaW5rOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTaW5rO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYnVmZmVyOiBJbk1lbW9yeVJpbmdCdWZmZXI8V2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkPjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJbk1lbW9yeVN0b3JlT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5idWZmZXIgPSBuZXcgSW5NZW1vcnlSaW5nQnVmZmVyPFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZD4oXG4gICAgICBvcHRpb25zLFxuICAgICAgZXN0aW1hdGVNZXRyaWNCeXRlcyxcbiAgICApO1xuXG4gICAgdGhpcy5zaW5rID0ge1xuICAgICAgZW1pdDogKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuYnVmZmVyLnB1c2gocmVjb3JkKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHF1ZXJ5KGZpbHRlcjogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUXVlcnlGaWx0ZXIpOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmRbXSB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyLmZpbHRlcigocmVjb3JkKSA9PiB7XG4gICAgICBpZiAoZmlsdGVyLm5hbWUgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQubmFtZSAhPT0gZmlsdGVyLm5hbWUpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChmaWx0ZXIua2luZCAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC5raW5kICE9PSBmaWx0ZXIua2luZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGZpbHRlci5jb25uZWN0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQuY29ubmVjdGlvbklkICE9PSBmaWx0ZXIuY29ubmVjdGlvbklkKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLnVzZXJJZCAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC51c2VySWQgIT09IGZpbHRlci51c2VySWQpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChmaWx0ZXIubmFtZXNwYWNlICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLm5hbWVzcGFjZSAhPT0gZmlsdGVyLm5hbWVzcGFjZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGZpbHRlci50cmFjZUlkICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLnRyYWNlSWQgIT09IGZpbHRlci50cmFjZUlkKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIWFwcGx5VGltZVdpbmRvdyhyZWNvcmQsIGZpbHRlci5zaW5jZSwgZmlsdGVyLnVudGlsKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSwgZmlsdGVyLmxpbWl0KTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyLmNsZWFyKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluTWVtb3J5U3BhblN0b3JlIGltcGxlbWVudHMgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHtcbiAgcmVhZG9ubHkgc2luazogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblNpbms7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBidWZmZXI6IEluTWVtb3J5UmluZ0J1ZmZlcjxXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkPjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJbk1lbW9yeVN0b3JlT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5idWZmZXIgPSBuZXcgSW5NZW1vcnlSaW5nQnVmZmVyPFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQ+KG9wdGlvbnMsIGVzdGltYXRlU3BhbkJ5dGVzKTtcblxuICAgIHRoaXMuc2luayA9IHtcbiAgICAgIGVtaXQ6IChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5idWZmZXIucHVzaChyZWNvcmQpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcXVlcnkoZmlsdGVyOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUXVlcnlGaWx0ZXIpOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkW10ge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5maWx0ZXIoKHJlY29yZCkgPT4ge1xuICAgICAgaWYgKGZpbHRlci5vcGVyYXRpb25OYW1lICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLm9wZXJhdGlvbk5hbWUgIT09IGZpbHRlci5vcGVyYXRpb25OYW1lKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLmtpbmQgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQua2luZCAhPT0gZmlsdGVyLmtpbmQpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChmaWx0ZXIuc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLnN0YXR1cyAhPT0gZmlsdGVyLnN0YXR1cykgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGZpbHRlci5jb25uZWN0aW9uSWQgIT09IHVuZGVmaW5lZCAmJiByZWNvcmQuY29ubmVjdGlvbklkICE9PSBmaWx0ZXIuY29ubmVjdGlvbklkKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoZmlsdGVyLnVzZXJJZCAhPT0gdW5kZWZpbmVkICYmIHJlY29yZC51c2VySWQgIT09IGZpbHRlci51c2VySWQpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChmaWx0ZXIubmFtZXNwYWNlICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLm5hbWVzcGFjZSAhPT0gZmlsdGVyLm5hbWVzcGFjZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGZpbHRlci50cmFjZUlkICE9PSB1bmRlZmluZWQgJiYgcmVjb3JkLnRyYWNlSWQgIT09IGZpbHRlci50cmFjZUlkKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIWFwcGx5VGltZVdpbmRvdyhyZWNvcmQsIGZpbHRlci5zaW5jZSwgZmlsdGVyLnVudGlsKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSwgZmlsdGVyLmxpbWl0KTtcbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyLmNsZWFyKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBb0dBLFNBQVMsZ0JBQ1AsUUFDQSxPQUNBLE9BQ1M7QUFDVCxLQUFJLFVBQVUsYUFB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
@@ -0,0 +1,12 @@
1
+ export type ParsedTraceParent = {
2
+ version: string;
3
+ traceId: string;
4
+ parentId: string;
5
+ traceFlags: number;
6
+ sampled: boolean;
7
+ };
8
+ export declare function parseTraceParent(header: string): ParsedTraceParent | null;
9
+ export declare function generateTraceId(): string;
10
+ export declare function generateSpanId(): string;
11
+ export declare function formatTraceParent(traceId: string, spanId: string, sampled: boolean): string;
12
+ //# sourceMappingURL=ws-telemetry-trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-telemetry-trace.d.ts","sourceRoot":"","sources":["../../src/stream/ws-telemetry-trace.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAQF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAsBzE;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAG3F"}
@@ -0,0 +1,41 @@
1
+ import { __esmMin } from "../_virtual/rolldown_runtime.js";
2
+ import { randomBytes } from "node:crypto";
3
+
4
+ //#region src/stream/ws-telemetry-trace.ts
5
+ function parseTraceParent(header) {
6
+ const trimmed = header.trim().toLowerCase();
7
+ const match = TRACEPARENT_REGEX.exec(trimmed);
8
+ if (!match) return null;
9
+ const [, version, traceId, parentId, flagsHex] = match;
10
+ if (version === "ff") return null;
11
+ if (traceId === ALL_ZERO_TRACE_ID || parentId === ALL_ZERO_SPAN_ID) return null;
12
+ const traceFlags = parseInt(flagsHex, 16);
13
+ return {
14
+ version,
15
+ traceId,
16
+ parentId,
17
+ traceFlags,
18
+ sampled: (traceFlags & 1) === 1
19
+ };
20
+ }
21
+ function generateTraceId() {
22
+ return randomBytes(16).toString("hex");
23
+ }
24
+ function generateSpanId() {
25
+ return randomBytes(8).toString("hex");
26
+ }
27
+ function formatTraceParent(traceId, spanId, sampled) {
28
+ const flags = sampled ? "01" : "00";
29
+ return `00-${traceId}-${spanId}-${flags}`;
30
+ }
31
+ var TRACEPARENT_REGEX, ALL_ZERO_TRACE_ID, ALL_ZERO_SPAN_ID;
32
+ var init_ws_telemetry_trace = __esmMin((() => {
33
+ TRACEPARENT_REGEX = /^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/;
34
+ ALL_ZERO_TRACE_ID = "00000000000000000000000000000000";
35
+ ALL_ZERO_SPAN_ID = "0000000000000000";
36
+ }));
37
+
38
+ //#endregion
39
+ init_ws_telemetry_trace();
40
+ export { formatTraceParent, generateSpanId, generateTraceId, init_ws_telemetry_trace, parseTraceParent };
41
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGVsZW1ldHJ5LXRyYWNlLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlYW0vd3MtdGVsZW1ldHJ5LXRyYWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmV4cG9ydCB0eXBlIFBhcnNlZFRyYWNlUGFyZW50ID0ge1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIHRyYWNlSWQ6IHN0cmluZztcbiAgcGFyZW50SWQ6IHN0cmluZztcbiAgdHJhY2VGbGFnczogbnVtYmVyO1xuICBzYW1wbGVkOiBib29sZWFuO1xufTtcblxuLy8gdHJhY2VwYXJlbnQg7Y+s66e3OiAwMC08MzIgaGV4IHRyYWNlSWQ+LTwxNiBoZXggc3BhbklkPi08MiBoZXggZmxhZ3M+XG4vLyDsmIjsi5w6IDAwLTRiZjkyZjM1NzdiMTZkOGEyZTNlMjRmZjAyZTZjOTk4LTAwZjA2N2FhMGJhOTAyYjctMDFcbmNvbnN0IFRSQUNFUEFSRU5UX1JFR0VYID0gL14oWzAtOWEtZl17Mn0pLShbMC05YS1mXXszMn0pLShbMC05YS1mXXsxNn0pLShbMC05YS1mXXsyfSkkLztcbmNvbnN0IEFMTF9aRVJPX1RSQUNFX0lEID0gXCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiO1xuY29uc3QgQUxMX1pFUk9fU1BBTl9JRCA9IFwiMDAwMDAwMDAwMDAwMDAwMFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUcmFjZVBhcmVudChoZWFkZXI6IHN0cmluZyk6IFBhcnNlZFRyYWNlUGFyZW50IHwgbnVsbCB7XG4gIGNvbnN0IHRyaW1tZWQgPSBoZWFkZXIudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG1hdGNoID0gVFJBQ0VQQVJFTlRfUkVHRVguZXhlYyh0cmltbWVkKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgWywgdmVyc2lvbiwgdHJhY2VJZCwgcGFyZW50SWQsIGZsYWdzSGV4XSA9IG1hdGNoO1xuXG4gIC8vIGZm64qUIFczQyBUcmFjZSBDb250ZXh0IOyKpO2OmeyXkOyEnCBpbnZhbGlkIHZlcnNpb24gbWFya2Vy66GcIOyYiOyVveuQmOyWtCDsnojsnYxcbiAgaWYgKHZlcnNpb24gPT09IFwiZmZcIikgcmV0dXJuIG51bGw7XG5cbiAgLy8gVzNDIOyKpO2OmeyXkCDrlLDrnbwg66qo65GQIDDsnbggdHJhY2UgaWQgLyBzcGFuIGlk64qUIOycoO2aqO2VmOyngCDslYrsnYxcbiAgaWYgKHRyYWNlSWQgPT09IEFMTF9aRVJPX1RSQUNFX0lEIHx8IHBhcmVudElkID09PSBBTExfWkVST19TUEFOX0lEKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCB0cmFjZUZsYWdzID0gcGFyc2VJbnQoZmxhZ3NIZXgsIDE2KTtcblxuICByZXR1cm4ge1xuICAgIHZlcnNpb24sXG4gICAgdHJhY2VJZCxcbiAgICBwYXJlbnRJZCxcbiAgICB0cmFjZUZsYWdzLFxuICAgIHNhbXBsZWQ6ICh0cmFjZUZsYWdzICYgMHgwMSkgPT09IDEsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVRyYWNlSWQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJhbmRvbUJ5dGVzKDE2KS50b1N0cmluZyhcImhleFwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU3BhbklkKCk6IHN0cmluZyB7XG4gIHJldHVybiByYW5kb21CeXRlcyg4KS50b1N0cmluZyhcImhleFwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRyYWNlUGFyZW50KHRyYWNlSWQ6IHN0cmluZywgc3BhbklkOiBzdHJpbmcsIHNhbXBsZWQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBmbGFncyA9IHNhbXBsZWQgPyBcIjAxXCIgOiBcIjAwXCI7XG4gIHJldHVybiBgMDAtJHt0cmFjZUlkfS0ke3NwYW5JZH0tJHtmbGFnc31gO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBZ0JBLFNBQWdCLGlCQUFpQixRQUEwQztDQUN6RSxNQUFNLFVBQVUsT0FBTyxNQUFNLENBQUMsYUFBYTtDQUMzQyxNQUFNLFFBQVEsa0JBQWtCLEtBQUssUUFBUTtBQUM3QyxLQUFJLENBQUMsTUFBTyxRQUFPO0NBRW5CLE1BQU0sR0FBRyxTQUFTLFNBQVMsVUFBVSxZQUFZO0FBR2pELEtBQUksWUFBWSxLQUFNLFFBQU87QUFHN0IsS0FBSSxZQUFZLHFCQUFxQixhQUFhLGlCQUFrQixRQUFPO0NBRTNFLE1BQU0sYUFBYSxTQUFTLFVBQVUsR0FBRztBQUV6QyxRQUFPO0VBQ0w7RUFDQTtFQUNBO0VBQ0E7RUFDQSxVQUFVLGFBQWEsT0FBVTtFQUNsQzs7QUFHSCxTQUFnQixrQkFBMEI7QUFDeEMsUUFBTyxZQUFZLEdBQUcsQ0FBQyxTQUFTLE1BQU07O0FBR3hDLFNBQWdCLGlCQUF5QjtBQUN2QyxRQUFPLFlBQVksRUFBRSxDQUFDLFNBQVMsTUFBTTs7QUFHdkMsU0FBZ0Isa0JBQWtCLFNBQWlCLFFBQWdCLFNBQTBCO0NBQzNGLE1BQU0sUUFBUSxVQUFVLE9BQU87QUFDL0IsUUFBTyxNQUFNLFFBQVEsR0FBRyxPQUFPLEdBQUc7Ozs7Q0F0QzlCLG9CQUFvQjtDQUNwQixvQkFBb0I7Q0FDcEIsbUJBQW1CIn0=