@workflow/web-shared 5.0.0-beta.24 → 5.0.0-beta.26

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 (95) hide show
  1. package/README.md +2 -10
  2. package/dist/components/event-list-view.d.ts +30 -0
  3. package/dist/components/event-list-view.d.ts.map +1 -1
  4. package/dist/components/event-list-view.js +27 -12
  5. package/dist/components/index.d.ts +4 -3
  6. package/dist/components/index.d.ts.map +1 -1
  7. package/dist/components/index.js +3 -3
  8. package/dist/components/new-trace-viewer/components/copy-button.js +2 -2
  9. package/dist/components/new-trace-viewer/components/event-list.js +2 -2
  10. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +2 -2
  11. package/dist/components/new-trace-viewer/components/span-markers.js +3 -3
  12. package/dist/components/new-trace-viewer/components/split-pane.js +2 -2
  13. package/dist/components/new-trace-viewer/components/timeline.js +2 -2
  14. package/dist/components/new-trace-viewer/trace-viewer.js +4 -4
  15. package/dist/components/run-trace-view.d.ts +5 -7
  16. package/dist/components/run-trace-view.d.ts.map +1 -1
  17. package/dist/components/run-trace-view.js +3 -3
  18. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  19. package/dist/components/sidebar/attribute-panel.js +3 -5
  20. package/dist/components/sidebar/detail-card.js +2 -2
  21. package/dist/components/sidebar/entity-detail-panel.d.ts +6 -10
  22. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  23. package/dist/components/sidebar/entity-detail-panel.js +8 -60
  24. package/dist/components/sidebar/events-list.d.ts +3 -1
  25. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  26. package/dist/components/sidebar/events-list.js +31 -9
  27. package/dist/components/sidebar/sidebar-data-context.d.ts +5 -6
  28. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -1
  29. package/dist/components/sidebar/sidebar-data-context.js +1 -1
  30. package/dist/components/sidebar/span-detail-merge.d.ts +15 -0
  31. package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -1
  32. package/dist/components/sidebar/span-detail-merge.js +40 -1
  33. package/dist/components/sidebar/use-selected-span-detail.d.ts +16 -0
  34. package/dist/components/sidebar/use-selected-span-detail.d.ts.map +1 -0
  35. package/dist/components/sidebar/use-selected-span-detail.js +93 -0
  36. package/dist/components/ui/alert.js +2 -2
  37. package/dist/components/ui/button.js +2 -2
  38. package/dist/components/ui/card.js +2 -2
  39. package/dist/components/ui/context-card.js +2 -2
  40. package/dist/components/ui/error-card.js +2 -2
  41. package/dist/components/ui/icon-button.js +2 -2
  42. package/dist/components/ui/kbd.js +2 -2
  43. package/dist/components/ui/skeleton.js +2 -2
  44. package/dist/components/ui/tooltip.js +2 -2
  45. package/dist/components/workflow-trace-view.d.ts +6 -7
  46. package/dist/components/workflow-trace-view.d.ts.map +1 -1
  47. package/dist/components/workflow-trace-view.js +3 -6
  48. package/dist/components/workflow-traces/trace-span-construction.d.ts +4 -4
  49. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  50. package/dist/components/workflow-traces/trace-span-construction.js +74 -53
  51. package/dist/lib/cn.d.ts +10 -0
  52. package/dist/lib/cn.d.ts.map +1 -0
  53. package/dist/lib/cn.js +83 -0
  54. package/dist/lib/event-materialization.d.ts +0 -3
  55. package/dist/lib/event-materialization.d.ts.map +1 -1
  56. package/dist/lib/event-materialization.js +28 -27
  57. package/dist/lib/trace-builder.d.ts.map +1 -1
  58. package/dist/lib/trace-builder.js +3 -3
  59. package/dist/lib/utils.d.ts +0 -2
  60. package/dist/lib/utils.d.ts.map +1 -1
  61. package/dist/lib/utils.js +1 -6
  62. package/package.json +3 -3
  63. package/src/components/event-list-view.tsx +76 -13
  64. package/src/components/index.ts +10 -6
  65. package/src/components/new-trace-viewer/components/copy-button.tsx +1 -1
  66. package/src/components/new-trace-viewer/components/event-list.tsx +1 -1
  67. package/src/components/new-trace-viewer/components/middle-truncate/middle-truncate.tsx +1 -1
  68. package/src/components/new-trace-viewer/components/span-markers.tsx +2 -2
  69. package/src/components/new-trace-viewer/components/split-pane.tsx +1 -1
  70. package/src/components/new-trace-viewer/components/timeline.tsx +1 -1
  71. package/src/components/new-trace-viewer/trace-viewer.tsx +6 -6
  72. package/src/components/run-trace-view.tsx +10 -14
  73. package/src/components/sidebar/attribute-panel.tsx +2 -4
  74. package/src/components/sidebar/detail-card.tsx +1 -1
  75. package/src/components/sidebar/entity-detail-panel.tsx +23 -94
  76. package/src/components/sidebar/events-list.tsx +58 -8
  77. package/src/components/sidebar/sidebar-data-context.tsx +6 -7
  78. package/src/components/sidebar/span-detail-merge.ts +69 -0
  79. package/src/components/sidebar/use-selected-span-detail.ts +146 -0
  80. package/src/components/ui/alert.tsx +1 -1
  81. package/src/components/ui/button.tsx +1 -1
  82. package/src/components/ui/card.tsx +1 -1
  83. package/src/components/ui/context-card.tsx +1 -1
  84. package/src/components/ui/error-card.tsx +1 -1
  85. package/src/components/ui/icon-button.tsx +1 -1
  86. package/src/components/ui/kbd.tsx +1 -1
  87. package/src/components/ui/skeleton.tsx +1 -1
  88. package/src/components/ui/tooltip.tsx +1 -1
  89. package/src/components/workflow-trace-view.tsx +11 -21
  90. package/src/components/workflow-traces/trace-span-construction.test.ts +85 -0
  91. package/src/components/workflow-traces/trace-span-construction.ts +113 -89
  92. package/src/lib/cn.ts +93 -0
  93. package/src/lib/event-materialization.ts +56 -76
  94. package/src/lib/trace-builder.ts +2 -1
  95. package/src/lib/utils.ts +0 -6
@@ -23,30 +23,25 @@ const MARKER_EVENT_TYPES = new Set([
23
23
  'wait_completed',
24
24
  'attr_set',
25
25
  ]);
26
- const findEventByType = (events, eventTypes) => {
27
- for (const eventType of eventTypes) {
28
- const event = events.find((e) => e.eventType === eventType);
29
- if (event)
30
- return event;
31
- }
32
- return undefined;
33
- };
34
- const withOccurredAt = (entity, occurredAt) => {
35
- if (!occurredAt || entity.occurredAt != null) {
36
- return entity;
37
- }
38
- return { ...entity, occurredAt };
26
+ export const getEventTimestamp = (event) => {
27
+ const value = event?.occurredAt ?? event?.createdAt;
28
+ if (!value)
29
+ return undefined;
30
+ const date = value instanceof Date ? value : new Date(value);
31
+ return Number.isNaN(date.getTime()) ? undefined : date;
39
32
  };
40
33
  /**
41
34
  * Convert workflow events to span events
42
35
  * Only includes events that should be displayed as markers
43
36
  */
44
- export function convertEventsToSpanEvents(events, filterTypes = true) {
37
+ export function convertEventsToSpanEvents(events, filterTypes = true, options = {}) {
45
38
  return events
46
39
  .filter((event) => filterTypes ? MARKER_EVENT_TYPES.has(event.eventType) : true)
47
40
  .map((event) => ({
48
41
  name: event.eventType,
49
- timestamp: dateToOtelTime(event.createdAt),
42
+ timestamp: dateToOtelTime(options.preferOccurredAt
43
+ ? (getEventTimestamp(event) ?? event.createdAt)
44
+ : event.createdAt),
50
45
  attributes: {
51
46
  eventId: event.eventId,
52
47
  correlationId: event.correlationId,
@@ -62,15 +57,15 @@ export const waitEventsToWaitEntity = (events) => {
62
57
  return null;
63
58
  }
64
59
  const completedEvent = events.find((event) => event.eventType === 'wait_completed');
65
- return withOccurredAt({
60
+ return {
66
61
  waitId: startEvent.correlationId,
67
62
  runId: startEvent.runId,
68
- createdAt: startEvent.createdAt,
63
+ createdAt: getEventTimestamp(startEvent) ?? startEvent.createdAt,
69
64
  resumeAt: startEvent.eventData?.resumeAt
70
65
  ? new Date(startEvent.eventData.resumeAt)
71
66
  : undefined,
72
- completedAt: completedEvent?.createdAt,
73
- }, startEvent.occurredAt);
67
+ completedAt: getEventTimestamp(completedEvent),
68
+ };
74
69
  };
75
70
  /**
76
71
  * Converts a workflow Wait to an OpenTelemetry Span
@@ -136,16 +131,16 @@ export const stepEventsToStepEntity = (events) => {
136
131
  status = 'running';
137
132
  attempt += 1;
138
133
  if (!startedAt)
139
- startedAt = e.createdAt;
134
+ startedAt = getEventTimestamp(e) ?? e.createdAt;
140
135
  completedAt = undefined;
141
136
  break;
142
137
  case 'step_completed':
143
138
  status = 'completed';
144
- completedAt = e.createdAt;
139
+ completedAt = getEventTimestamp(e) ?? e.createdAt;
145
140
  break;
146
141
  case 'step_failed':
147
142
  status = 'failed';
148
- completedAt = e.createdAt;
143
+ completedAt = getEventTimestamp(e) ?? e.createdAt;
149
144
  break;
150
145
  case 'step_retrying':
151
146
  status = 'pending';
@@ -157,19 +152,20 @@ export const stepEventsToStepEntity = (events) => {
157
152
  if (attempt === 0)
158
153
  attempt = 1;
159
154
  const lastEvent = events[events.length - 1];
160
- const occurrenceEvent = findEventByType(events, ['step_created', 'step_started']) ?? anchorEvent;
161
- return withOccurredAt({
155
+ return {
162
156
  stepId: anchorEvent.correlationId ?? '',
163
157
  runId: anchorEvent.runId,
164
158
  stepName: createdEvent?.eventData?.stepName ?? '',
165
159
  status,
166
160
  attempt,
167
- createdAt: anchorEvent.createdAt,
168
- updatedAt: lastEvent?.createdAt ?? anchorEvent.createdAt,
161
+ createdAt: getEventTimestamp(anchorEvent) ?? anchorEvent.createdAt,
162
+ updatedAt: getEventTimestamp(lastEvent) ??
163
+ lastEvent?.createdAt ??
164
+ anchorEvent.createdAt,
169
165
  startedAt,
170
166
  completedAt,
171
167
  specVersion: anchorEvent.specVersion,
172
- }, occurrenceEvent.occurredAt);
168
+ };
173
169
  };
174
170
  /**
175
171
  * Converts step events to an OpenTelemetry Span
@@ -185,21 +181,31 @@ export function stepToSpan(stepEvents, maxEndTime) {
185
181
  data: step,
186
182
  };
187
183
  const resource = 'step';
188
- const endTime = new Date(step.completedAt ?? maxEndTime);
189
184
  // Include ALL correlated events on the span so the sidebar detail view
190
185
  // can display them. The timeline uses the `showVerticalLine` flag to
191
186
  // determine which events appear as markers.
192
- const events = convertEventsToSpanEvents(stepEvents, false);
193
- // Use createdAt as span start time, with activeStartTime for when execution began
194
- // This allows visualization of the "queued" period before execution
195
- const spanStartTime = new Date(step.createdAt);
187
+ const events = convertEventsToSpanEvents(stepEvents, false, {
188
+ preferOccurredAt: true,
189
+ });
190
+ // Use the event occurrence timestamp for step spans when it is available,
191
+ // falling back to the ingest timestamp used by older event streams.
192
+ const spanStartEvent = stepEvents.find((event) => event.eventType === 'step_created') ??
193
+ stepEvents[0];
194
+ const spanStartTime = getEventTimestamp(spanStartEvent) ?? new Date(step.createdAt);
196
195
  let activeStartTime = step.startedAt ? new Date(step.startedAt) : undefined;
197
196
  const firstStartEvent = stepEvents.find((event) => event.eventType === 'step_started');
198
197
  if (firstStartEvent) {
199
- // `step.startedAt` is the server-side creation timestamp, and `event.createdAt` is
200
- // the client-side creation timestamp. For now, to align the event marker with the
201
- // line we show for step.startedAt, we overwrite here to always use client-side time.
202
- activeStartTime = new Date(firstStartEvent.createdAt);
198
+ activeStartTime =
199
+ getEventTimestamp(firstStartEvent) ?? new Date(firstStartEvent.createdAt);
200
+ }
201
+ let endTime = new Date(maxEndTime);
202
+ if (step.completedAt) {
203
+ const completedEvent = stepEvents
204
+ .slice()
205
+ .reverse()
206
+ .find((event) => event.eventType === 'step_completed' ||
207
+ event.eventType === 'step_failed');
208
+ endTime = getEventTimestamp(completedEvent) ?? new Date(step.completedAt);
203
209
  }
204
210
  return {
205
211
  spanId: String(step.stepId),
@@ -229,15 +235,15 @@ export const hookEventsToHookEntity = (events) => {
229
235
  const receivedEvents = events.filter((event) => event.eventType === 'hook_received');
230
236
  const disposedEvents = events.filter((event) => event.eventType === 'hook_disposed');
231
237
  const lastReceivedEvent = receivedEvents.at(-1);
232
- return withOccurredAt({
238
+ return {
233
239
  hookId: createdEvent.correlationId,
234
240
  runId: createdEvent.runId,
235
241
  token: createdEvent.eventData?.token,
236
- createdAt: createdEvent.createdAt,
242
+ createdAt: getEventTimestamp(createdEvent) ?? createdEvent.createdAt,
237
243
  receivedCount: receivedEvents.length,
238
- lastReceivedAt: lastReceivedEvent?.createdAt || undefined,
239
- disposedAt: disposedEvents.at(-1)?.createdAt || undefined,
240
- }, createdEvent.occurredAt);
244
+ lastReceivedAt: getEventTimestamp(lastReceivedEvent),
245
+ disposedAt: getEventTimestamp(disposedEvents.at(-1)),
246
+ };
241
247
  };
242
248
  /**
243
249
  * Converts a workflow Hook to an OpenTelemetry Span
@@ -274,23 +280,38 @@ export function hookToSpan(hookEvents, maxEndTime) {
274
280
  */
275
281
  export function runToSpan(run, runEvents, nowTime) {
276
282
  const now = nowTime ?? new Date();
283
+ // Prefer the event occurrence timestamp when available so the root span
284
+ // lines up with child spans that already use event occurrence time.
285
+ const runCreatedEvent = runEvents.find((event) => event.eventType === 'run_created');
286
+ const runStartedEvent = runEvents.find((event) => event.eventType === 'run_started');
287
+ const terminalEvent = runEvents
288
+ .slice()
289
+ .reverse()
290
+ .find((event) => event.eventType === 'run_completed' ||
291
+ event.eventType === 'run_failed' ||
292
+ event.eventType === 'run_cancelled');
293
+ const spanStartTime = getEventTimestamp(runCreatedEvent) ?? new Date(run.createdAt);
294
+ const activeStartTime = getEventTimestamp(runStartedEvent) ??
295
+ (run.startedAt ? new Date(run.startedAt) : undefined);
296
+ const completedAt = getEventTimestamp(terminalEvent) ?? run.completedAt ?? undefined;
297
+ const endTime = completedAt ?? now;
277
298
  // Only embed identification fields — not the full object with
278
- // input/output/error which may contain non-cloneable types.
299
+ // input/output/error which may contain non-cloneable types. Lifecycle
300
+ // timestamps are event-derived so detail rows align with the span timeline.
279
301
  const { input: _i, output: _o, error: _e, ...runIdentity } = run;
280
- const occurrenceEvent = findEventByType(runEvents, [
281
- 'run_created',
282
- 'run_started',
283
- ]);
284
302
  const attributes = {
285
303
  resource: 'run',
286
- data: withOccurredAt(runIdentity, occurrenceEvent?.occurredAt),
304
+ data: {
305
+ ...runIdentity,
306
+ createdAt: spanStartTime,
307
+ startedAt: activeStartTime,
308
+ completedAt,
309
+ },
287
310
  };
288
- // Use createdAt as span start time, with activeStartTime for when execution began
289
- const spanStartTime = new Date(run.createdAt);
290
- const activeStartTime = run.startedAt ? new Date(run.startedAt) : undefined;
291
- const endTime = run.completedAt ?? now;
292
311
  // Convert run-level events to span events
293
- const events = convertEventsToSpanEvents(runEvents, false);
312
+ const events = convertEventsToSpanEvents(runEvents, false, {
313
+ preferOccurredAt: true,
314
+ });
294
315
  return {
295
316
  spanId: String(run.runId),
296
317
  name: String(parseWorkflowName(run.workflowName)?.shortName ?? '?'),
@@ -311,4 +332,4 @@ export function runToSpan(run, runEvents, nowTime) {
311
332
  : undefined,
312
333
  };
313
334
  }
314
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2Utc3Bhbi1jb25zdHJ1Y3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy93b3JrZmxvdy10cmFjZXMvdHJhY2Utc3Bhbi1jb25zdHJ1Y3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHOUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXZFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLElBQUksRUFBRSwwQkFBMEI7SUFDaEMsT0FBTyxFQUFFLE9BQU87Q0FDakIsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBNEIsSUFBSSxHQUFHLENBQUM7SUFDMUQsY0FBYztJQUNkLGVBQWU7SUFDZixlQUFlO0lBQ2YsY0FBYztJQUNkLGVBQWU7SUFDZixhQUFhO0lBQ2IsWUFBWTtJQUNaLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIsVUFBVTtDQUNYLENBQUMsQ0FBQztBQUVILE1BQU0sZUFBZSxHQUFHLENBQ3RCLE1BQWUsRUFDZixVQUFnQyxFQUNiLEVBQUU7SUFDckIsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNuQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQzVELElBQUksS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFFRixNQUFNLGNBQWMsR0FBRyxDQUNyQixNQUFTLEVB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QUFJLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxTQUFTLElBQUksR0FBRyxDQUFDO1FBQ25FLElBQUksRUFBRSxDQUFDLEVBQUUscUJBQXFCO1FBQzlCLFFBQVEsRUFBRSxLQUFLO1FBQ2YsT0FBTyxFQUFFLGdCQUFnQjtRQUN6QixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFO1FBQ25CLFVBQVUsRUFBRSxDQUFDO1FBQ2IsVUFBVTtRQUNWLEtBQUssRUFBRSxFQUFFO1FBQ1QsTUFBTTtRQUNOLFNBQVMsRUFBRSxjQUFjLENBQUMsYUFBYSxDQUFDO1FBQ3hDLE9BQU8sRUFBRSxjQUFjLENBQUMsT0FBTyxDQUFDO1FBQ2hDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDO1FBQ25ELDBGQUEwRjtRQUMxRixlQUFlLEVBQ2IsZUFBZSxJQUFJLGVBQWUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFO1lBQ3BFLENBQUMsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxTQUFTO0tBQ2hCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGdW5jdGlvbnMgZm9yIGNvbnN0cnVjdGluZyBPcGVuVGVsZW1ldHJ5IHNwYW5zIGZyb20gd29ya2Zsb3cgZW50aXRpZXNcbiAqL1xuXG5pbXBvcnQgeyBwYXJzZVN0ZXBOYW1lLCBwYXJzZVdvcmtmbG93TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB0eXBlIHsgRXZlbnQsIFdvcmtmbG93UnVuIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgU3BhbiwgU3BhbkV2ZW50IH0gZnJvbSAnLi4vdHJhY2Utdmlld2VyL3R5cGVzJztcbmltcG9ydCB7IHNob3VsZFNob3dWZXJ0aWNhbExpbmUgfSBmcm9tICcuL2V2ZW50LWNvbG9ycyc7XG5pbXBvcnQgeyBjYWxjdWxhdGVEdXJhdGlvbiwgZGF0ZVRvT3RlbFRpbWUgfSBmcm9tICcuL3RyYWNlLXRpbWUtdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgV09SS0ZMT1dfTElCUkFSWSA9IHtcbiAgbmFtZTogJ3dvcmtmbG93LWRldmVsb3BtZW50LWtpdCcsXG4gIHZlcnNpb246ICc0LjAuMCcsXG59O1xuXG4vKipcbiAqIEV2ZW50IHR5cGVzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBhcyB2aXN1YWwgbWFya2VycyBpbiB0aGUgdHJhY2Ugdmlld2VyXG4gKi9cbmNvbnN0IE1BUktFUl9FVkVOVF9UWVBFUzogU2V0PEV2ZW50WydldmVudFR5cGUnXT4gPSBuZXcgU2V0KFtcbiAgJ2hvb2tfY3JlYXRlZCcsXG4gICdob29rX3JlY2VpdmVkJyxcbiAgJ2hvb2tfZGlzcG9zZWQnLFxuICAnc3RlcF9zdGFydGVkJyxcbiAgJ3N0ZXBfcmV0cnlpbmcnLFxuICAnc3RlcF9mYWlsZWQnLFxuICAncnVuX2ZhaWxlZCcsXG4gICd3YWl0X2NyZWF0ZWQnLFxuICAnd2FpdF9jb21wbGV0ZWQnLFxuICAnYXR0cl9zZXQnLFxuXSk7XG5cbmNvbnN0IGZpbmRFdmVudEJ5VHlwZSA9IChcbiAgZXZlbnRzOiBFdmVudFtdLFxuICBldmVudFR5cGVzOiBFdmVudFsnZXZlbnRUeXBlJ11bXVxuKTogRXZlbnQgfCB1bmRlZmluZWQgPT4ge1xuICBmb3IgKGNvbnN0IGV2ZW50VHlwZSBvZiBldmVudFR5cGVzKSB7XG4gICAgY29uc3QgZXZlbnQgPSBldmVudHMuZmluZCgoZSkgPT4gZS5ldmVudFR5cGUgPT09IGV2ZW50VHlwZSk7XG4gICAgaWYgKGV2ZW50KSByZXR1cm4gZXZlbnQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IHdpdGhPY2N1cnJlZEF0ID0gPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBlbnRpdHk6IFQsXG4gIG9jY3VycmVkQXQ6IEV2ZW50WydvY2N1cnJlZEF0J10gfCB1bmRlZmluZWRcbik6IFQgJiB7IG9jY3VycmVkQXQ/OiBEYXRlIH0gPT4ge1xuICBpZiAoIW9jY3VycmVkQXQgfHwgKGVudGl0eSBhcyB7IG9jY3VycmVkQXQ/OiB1bmtub3duIH0pLm9jY3VycmVkQXQgIT0gbnVsbCkge1xuICAgIHJldHVybiBlbnRpdHk7XG4gIH1cbiAgcmV0dXJuIHsgLi4uZW50aXR5LCBvY2N1cnJlZEF0IH07XG59O1xuXG4vKipcbiAqIENvbnZlcnQgd29ya2Zsb3cgZXZlbnRzIHRvIHNwYW4gZXZlbnRzXG4gKiBPbmx5IGluY2x1ZGVzIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgYXMgbWFya2Vyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEV2ZW50c1RvU3BhbkV2ZW50cyhcbiAgZXZlbnRzOiBFdmVudFtdLFxuICBmaWx0ZXJUeXBlcyA9IHRydWVcbik6IFNwYW5FdmVudFtdIHtcbiAgcmV0dXJuIGV2ZW50c1xuICAgIC5maWx0ZXIoKGV2ZW50KSA9PlxuICAgICAgZmlsdGVyVHlwZXMgPyBNQVJLRVJfRVZFTlRfVFlQRVMuaGFzKGV2ZW50LmV2ZW50VHlwZSkgOiB0cnVlXG4gICAgKVxuICAgIC5tYXAoKGV2ZW50KSA9PiAoe1xuICAgICAgbmFtZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgdGltZXN0YW1wOiBkYXRlVG9PdGVsVGltZShldmVudC5jcmVhdGVkQXQpLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBldmVudElkOiBldmVudC5ldmVudElkLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBldmVudC5jb3JyZWxhdGlvbklkLFxuICAgICAgICBldmVudERhdGE6ICdldmVudERhdGEnIGluIGV2ZW50ID8gZXZlbnQuZXZlbnREYXRhIDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIC8vIENvbnRyb2wgd2hldGhlciB0byBzaG93IHZlcnRpY2FsIGxpbmUgaW4gdGltZWxpbmVcbiAgICAgIHNob3dWZXJ0aWNhbExpbmU6IHNob3VsZFNob3dWZXJ0aWNhbExpbmUoZXZlbnQuZXZlbnRUeXBlKSxcbiAgICB9KSk7XG59XG5cbmV4cG9ydCBjb25zdCB3YWl0RXZlbnRzVG9XYWl0RW50aXR5ID0gKFxuICBldmVudHM6IEV2ZW50W11cbik6IHtcbiAgd2FpdElkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgb2NjdXJyZWRBdD86IERhdGU7XG4gIHJlc3VtZUF0PzogRGF0ZTtcbiAgY29tcGxldGVkQXQ/OiBEYXRlO1xufSB8IG51bGwgPT4ge1xuICBjb25zdCBzdGFydEV2ZW50ID0gZXZlbnRzLmZpbmQoKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnKTtcbiAgaWYgKCFzdGFydEV2ZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgY29tcGxldGVkRXZlbnQgPSBldmVudHMuZmluZChcbiAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJ1xuICApO1xuICByZXR1cm4gd2l0aE9jY3VycmVkQXQoXG4gICAge1xuICAgICAgd2FpdElkOiBzdGFydEV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICBydW5JZDogc3RhcnRFdmVudC5ydW5JZCxcbiAgICAgIGNyZWF0ZWRBdDogc3RhcnRFdmVudC5jcmVhdGVkQXQsXG4gICAgICByZXN1bWVBdDogc3RhcnRFdmVudC5ldmVudERhdGE/LnJlc3VtZUF0XG4gICAgICAgID8gbmV3IERhdGUoc3RhcnRFdmVudC5ldmVudERhdGEucmVzdW1lQXQpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgY29tcGxldGVkQXQ6IGNvbXBsZXRlZEV2ZW50Py5jcmVhdGVkQXQsXG4gICAgfSxcbiAgICBzdGFydEV2ZW50Lm9jY3VycmVkQXRcbiAgKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSB3b3JrZmxvdyBXYWl0IHRvIGFuIE9wZW5UZWxlbWV0cnkgU3BhblxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FpdFRvU3BhbihcbiAgZXZlbnRzOiBFdmVudFtdLFxuICBtYXhFbmRUaW1lOiBEYXRlLFxuICBmYWxsYmFja0VuZFRpbWUgPSBtYXhFbmRUaW1lXG4pOiBTcGFuIHwgbnVsbCB7XG4gIGNvbnN0IHdhaXQgPSB3YWl0RXZlbnRzVG9XYWl0RW50aXR5KGV2ZW50cyk7XG4gIGlmICghd2FpdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHN0YXJ0VGltZSA9IHdhaXQuY3JlYXRlZEF0O1xuICBjb25zdCBzdGFydE1zID0gc3RhcnRUaW1lLmdldFRpbWUoKTtcbiAgbGV0IGVuZFRpbWUgPSB3YWl0LmNvbXBsZXRlZEF0O1xuICBpZiAoIWVuZFRpbWUpIHtcbiAgICBjb25zdCBmYWxsYmFja0NhcCA9XG4gICAgICB3YWl0LnJlc3VtZUF0ICYmIHdhaXQucmVzdW1lQXQuZ2V0VGltZSgpIDwgZmFsbGJhY2tFbmRUaW1lLmdldFRpbWUoKVxuICAgICAgICA/IHdhaXQucmVzdW1lQXRcbiAgICAgICAgOiBmYWxsYmFja0VuZFRpbWU7XG4gICAgZW5kVGltZSA9XG4gICAgICBtYXhFbmRUaW1lLmdldFRpbWUoKSA+IHN0YXJ0TXMgJiZcbiAgICAgIG1heEVuZFRpbWUuZ2V0VGltZSgpIDwgZmFsbGJhY2tDYXAuZ2V0VGltZSgpXG4gICAgICAgID8gbWF4RW5kVGltZVxuICAgICAgICA6IGZhbGxiYWNrQ2FwO1xuICB9XG4gIGNvbnN0IHN0YXJ0ID0gZGF0ZVRvT3RlbFRpbWUoc3RhcnRUaW1lKTtcbiAgY29uc3QgZW5kID0gZGF0ZVRvT3RlbFRpbWUoZW5kVGltZSk7XG4gIGNvbnN0IGR1cmF0aW9uID0gY2FsY3VsYXRlRHVyYXRpb24oc3RhcnRUaW1lLCBlbmRUaW1lKTtcbiAgY29uc3Qgc3BhbkV2ZW50cyA9IGNvbnZlcnRFdmVudHNUb1NwYW5FdmVudHMoZXZlbnRzLCBmYWxzZSk7XG4gIHJldHVybiB7XG4gICAgc3BhbklkOiB3YWl0LndhaXRJZCxcbiAgICBuYW1lOiAnc2xlZXAnLFxuICAgIGtpbmQ6IDEsIC8vIElOVEVSTkFMIHNwYW4ga2luZFxuICAgIHJlc291cmNlOiAnc2xlZXAnLFxuICAgIGxpYnJhcnk6IFdPUktGTE9XX0xJQlJBUlksXG4gICAgc3RhdHVzOiB7IGNvZGU6IDAgfSxcbiAgICB0cmFjZUZsYWdzOiAxLFxuICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgIHJlc291cmNlOiAnc2xlZXAnIGFzIGNvbnN0LFxuICAgICAgZGF0YTogd2FpdCwgLy8gd2FpdCBpcyBhIHBsYWluIG9iamVjdCBidWlsdCBmcm9tIGV2ZW50cywgbm8gbm9uLWNsb25lYWJsZSB0eXBlc1xuICAgIH0sXG4gICAgbGlua3M6IFtdLFxuICAgIGV2ZW50czogc3BhbkV2ZW50cyxcbiAgICBkdXJhdGlvbixcbiAgICBzdGFydFRpbWU6IHN0YXJ0LFxuICAgIGVuZFRpbWU6IGVuZCxcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IHN0ZXBFdmVudHNUb1N0ZXBFbnRpdHkgPSAoXG4gIGV2ZW50czogRXZlbnRbXVxuKToge1xuICBzdGVwSWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgc3RlcE5hbWU6IHN0cmluZztcbiAgc3RhdHVzOiAncGVuZGluZycgfCAncnVubmluZycgfCAnY29tcGxldGVkJyB8ICdmYWlsZWQnIHwgJ2NhbmNlbGxlZCc7XG4gIGF0dGVtcHQ6IG51bWJlcjtcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICB1cGRhdGVkQXQ6IERhdGU7XG4gIG9jY3VycmVkQXQ/OiBEYXRlO1xuICBzdGFydGVkQXQ/OiBEYXRlO1xuICBjb21wbGV0ZWRBdD86IERhdGU7XG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xufSB8IG51bGwgPT4ge1xuICBjb25zdCBjcmVhdGVkRXZlbnQgPSBldmVudHMuZmluZChcbiAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCdcbiAgKTtcblxuICAvLyBWMSBydW5zIGRvbid0IGVtaXQgc3RlcF9jcmVhdGVkIGV2ZW50cy4gRmFsbCBiYWNrIHRvIHRoZSBlYXJsaWVzdCBldmVudFxuICAvLyBpbiB0aGUgZ3JvdXAgc28gd2UgY2FuIHN0aWxsIGJ1aWxkIGEgc3RlcCBzcGFuLlxuICBjb25zdCBhbmNob3JFdmVudCA9IGNyZWF0ZWRFdmVudCA/PyBldmVudHNbMF07XG4gIGlmICghYW5jaG9yRXZlbnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFdhbGsgZXZlbnRzIGluIG9yZGVyIHRvIGRlcml2ZSBzdGF0dXMsIGF0dGVtcHQgY291bnQsIGFuZCB0aW1lc3RhbXBzLlxuICAvLyBIYW5kbGVzIGJvdGggc3RlcF9yZXRyeWluZyBhbmQgY29uc2VjdXRpdmUgc3RlcF9zdGFydGVkIGFzIHJldHJ5IHNpZ25hbHMuXG4gIGxldCBzdGF0dXM6ICdwZW5kaW5nJyB8ICdydW5uaW5nJyB8ICdjb21wbGV0ZWQnIHwgJ2ZhaWxlZCcgfCAnY2FuY2VsbGVkJyA9XG4gICAgJ3BlbmRpbmcnO1xuICBsZXQgYXR0ZW1wdCA9IDA7XG4gIGxldCBzdGFydGVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gIGxldCBjb21wbGV0ZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB7XG4gICAgc3dpdGNoIChlLmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSAnc3RlcF9zdGFydGVkJzpcbiAgICAgICAgc3RhdHVzID0gJ3J1bm5pbmcnO1xuICAgICAgICBhdHRlbXB0ICs9IDE7XG4gICAgICAgIGlmICghc3RhcnRlZEF0KSBzdGFydGVkQXQgPSBlLmNyZWF0ZWRBdDtcbiAgICAgICAgY29tcGxldGVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RlcF9jb21wbGV0ZWQnOlxuICAgICAgICBzdGF0dXMgPSAnY29tcGxldGVkJztcbiAgICAgICAgY29tcGxldGVkQXQgPSBlLmNyZWF0ZWRBdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdGVwX2ZhaWxlZCc6XG4gICAgICAgIHN0YXR1cyA9ICdmYWlsZWQnO1xuICAgICAgICBjb21wbGV0ZWRBdCA9IGUuY3JlYXRlZEF0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N0ZXBfcmV0cnlpbmcnOlxuICAgICAgICBzdGF0dXMgPSAncGVuZGluZyc7XG4gICAgICAgIGNvbXBsZXRlZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBFbnN1cmUgYXQgbGVhc3QgYXR0ZW1wdCAxIGlmIHdlIG5ldmVyIHNhdyBzdGVwX3N0YXJ0ZWRcbiAgaWYgKGF0dGVtcHQgPT09IDApIGF0dGVtcHQgPSAxO1xuXG4gIGNvbnN0IGxhc3RFdmVudCA9IGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV07XG4gIGNvbnN0IG9jY3VycmVuY2VFdmVudCA9XG4gICAgZmluZEV2ZW50QnlUeXBlKGV2ZW50cywgWydzdGVwX2NyZWF0ZWQnLCAnc3RlcF9zdGFydGVkJ10pID8/IGFuY2hvckV2ZW50O1xuXG4gIHJldHVybiB3aXRoT2NjdXJyZWRBdChcbiAgICB7XG4gICAgICBzdGVwSWQ6IGFuY2hvckV2ZW50LmNvcnJlbGF0aW9uSWQgPz8gJycsXG4gICAgICBydW5JZDogYW5jaG9yRXZlbnQucnVuSWQsXG4gICAgICBzdGVwTmFtZTogY3JlYXRlZEV2ZW50Py5ldmVudERhdGE/LnN0ZXBOYW1lID8/ICcnLFxuICAgICAgc3RhdHVzLFxuICAgICAgYXR0ZW1wdCxcbiAgICAgIGNyZWF0ZWRBdDogYW5jaG9yRXZlbnQuY3JlYXRlZEF0LFxuICAgICAgdXBkYXRlZEF0OiBsYXN0RXZlbnQ/LmNyZWF0ZWRBdCA/PyBhbmNob3JFdmVudC5jcmVhdGVkQXQsXG4gICAgICBzdGFydGVkQXQsXG4gICAgICBjb21wbGV0ZWRBdCxcbiAgICAgIHNwZWNWZXJzaW9uOiBhbmNob3JFdmVudC5zcGVjVmVyc2lvbixcbiAgICB9LFxuICAgIG9jY3VycmVuY2VFdmVudC5vY2N1cnJlZEF0XG4gICk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIHN0ZXAgZXZlbnRzIHRvIGFuIE9wZW5UZWxlbWV0cnkgU3BhblxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RlcFRvU3BhbihzdGVwRXZlbnRzOiBFdmVudFtdLCBtYXhFbmRUaW1lOiBEYXRlKTogU3BhbiB8IG51bGwge1xuICBjb25zdCBzdGVwID0gc3RlcEV2ZW50c1RvU3RlcEVudGl0eShzdGVwRXZlbnRzKTtcbiAgaWYgKCFzdGVwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgcGFyc2VkTmFtZSA9IHBhcnNlU3RlcE5hbWUoU3RyaW5nKHN0ZXAuc3RlcE5hbWUpKTtcblxuICBjb25zdCBhdHRyaWJ1dGVzID0ge1xuICAgIHJlc291cmNlOiAnc3RlcCcgYXMgY29uc3QsXG4gICAgZGF0YTogc3RlcCxcbiAgfTtcblxuICBjb25zdCByZXNvdXJjZSA9ICdzdGVwJztcbiAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKHN0ZXAuY29tcGxldGVkQXQgPz8gbWF4RW5kVGltZSk7XG5cbiAgLy8gSW5jbHVkZSBBTEwgY29ycmVsYXRlZCBldmVudHMgb24gdGhlIHNwYW4gc28gdGhlIHNpZGViYXIgZGV0YWlsIHZpZXdcbiAgLy8gY2FuIGRpc3BsYXkgdGhlbS4gVGhlIHRpbWVsaW5lIHVzZXMgdGhlIGBzaG93VmVydGljYWxMaW5lYCBmbGFnIHRvXG4gIC8vIGRldGVybWluZSB3aGljaCBldmVudHMgYXBwZWFyIGFzIG1hcmtlcnMuXG4gIGNvbnN0IGV2ZW50cyA9IGNvbnZlcnRFdmVudHNUb1NwYW5FdmVudHMoc3RlcEV2ZW50cywgZmFsc2UpO1xuXG4gIC8vIFVzZSBjcmVhdGVkQXQgYXMgc3BhbiBzdGFydCB0aW1lLCB3aXRoIGFjdGl2ZVN0YXJ0VGltZSBmb3Igd2hlbiBleGVjdXRpb24gYmVnYW5cbiAgLy8gVGhpcyBhbGxvd3MgdmlzdWFsaXphdGlvbiBvZiB0aGUgXCJxdWV1ZWRcIiBwZXJpb2QgYmVmb3JlIGV4ZWN1dGlvblxuICBjb25zdCBzcGFuU3RhcnRUaW1lID0gbmV3IERhdGUoc3RlcC5jcmVhdGVkQXQpO1xuICBsZXQgYWN0aXZlU3RhcnRUaW1lID0gc3RlcC5zdGFydGVkQXQgPyBuZXcgRGF0ZShzdGVwLnN0YXJ0ZWRBdCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpcnN0U3RhcnRFdmVudCA9IHN0ZXBFdmVudHMuZmluZChcbiAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfc3RhcnRlZCdcbiAgKTtcbiAgaWYgKGZpcnN0U3RhcnRFdmVudCkge1xuICAgIC8vIGBzdGVwLnN0YXJ0ZWRBdGAgaXMgdGhlIHNlcnZlci1zaWRlIGNyZWF0aW9uIHRpbWVzdGFtcCwgYW5kIGBldmVudC5jcmVhdGVkQXRgIGlzXG4gICAgLy8gdGhlIGNsaWVudC1zaWRlIGNyZWF0aW9uIHRpbWVzdGFtcC4gRm9yIG5vdywgdG8gYWxpZ24gdGhlIGV2ZW50IG1hcmtlciB3aXRoIHRoZVxuICAgIC8vIGxpbmUgd2Ugc2hvdyBmb3Igc3RlcC5zdGFydGVkQXQsIHdlIG92ZXJ3cml0ZSBoZXJlIHRvIGFsd2F5cyB1c2UgY2xpZW50LXNpZGUgdGltZS5cbiAgICBhY3RpdmVTdGFydFRpbWUgPSBuZXcgRGF0ZShmaXJzdFN0YXJ0RXZlbnQuY3JlYXRlZEF0KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3BhbklkOiBTdHJpbmcoc3RlcC5zdGVwSWQpLFxuICAgIG5hbWU6IHBhcnNlZE5hbWU/LnNob3J0TmFtZSA/PyBTdHJpbmcoc3RlcC5zdGVwTmFtZSksXG4gICAga2luZDogMSwgLy8gSU5URVJOQUwgc3BhbiBraW5kXG4gICAgcmVzb3VyY2UsXG4gICAgbGlicmFyeTogV09SS0ZMT1dfTElCUkFSWSxcbiAgICBzdGF0dXM6IHsgY29kZTogMCB9LFxuICAgIHRyYWNlRmxhZ3M6IDEsXG4gICAgYXR0cmlidXRlcyxcbiAgICBsaW5rczogW10sXG4gICAgZXZlbnRzLFxuICAgIHN0YXJ0VGltZTogZGF0ZVRvT3RlbFRpbWUoc3BhblN0YXJ0VGltZSksXG4gICAgZW5kVGltZTogZGF0ZVRvT3RlbFRpbWUoZW5kVGltZSksXG4gICAgZHVyYXRpb246IGNhbGN1bGF0ZUR1cmF0aW9uKHNwYW5TdGFydFRpbWUsIGVuZFRpbWUpLFxuICAgIC8vIE9ubHkgc2V0IGFjdGl2ZVN0YXJ0VGltZSBpZiBpdCBkaWZmZXJzIGZyb20gc3RhcnRUaW1lIChpLmUuLCB0aGVyZSB3YXMgYSBxdWV1ZWQgcGVyaW9kKVxuICAgIGFjdGl2ZVN0YXJ0VGltZTpcbiAgICAgIGFjdGl2ZVN0YXJ0VGltZSAmJiBhY3RpdmVTdGFydFRpbWUuZ2V0VGltZSgpID4gc3BhblN0YXJ0VGltZS5nZXRUaW1lKClcbiAgICAgICAgPyBkYXRlVG9PdGVsVGltZShhY3RpdmVTdGFydFRpbWUpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgaG9va0V2ZW50c1RvSG9va0VudGl0eSA9IChcbiAgZXZlbnRzOiBFdmVudFtdXG4pOiB7XG4gIGhvb2tJZDogc3RyaW5nO1xuICBydW5JZDogc3RyaW5nO1xuICB0b2tlbj86IHN0cmluZztcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICBvY2N1cnJlZEF0PzogRGF0ZTtcbiAgcmVjZWl2ZWRDb3VudDogbnVtYmVyO1xuICBsYXN0UmVjZWl2ZWRBdD86IERhdGU7XG4gIGRpc3Bvc2VkQXQ/OiBEYXRlO1xufSB8IG51bGwgPT4ge1xuICBjb25zdCBjcmVhdGVkRXZlbnQgPSBldmVudHMuZmluZChcbiAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCdcbiAgKTtcbiAgaWYgKCFjcmVhdGVkRXZlbnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCByZWNlaXZlZEV2ZW50cyA9IGV2ZW50cy5maWx0ZXIoXG4gICAgKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJ1xuICApO1xuICBjb25zdCBkaXNwb3NlZEV2ZW50cyA9IGV2ZW50cy5maWx0ZXIoXG4gICAgKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICdob29rX2Rpc3Bvc2VkJ1xuICApO1xuICBjb25zdCBsYXN0UmVjZWl2ZWRFdmVudCA9IHJlY2VpdmVkRXZlbnRzLmF0KC0xKTtcbiAgcmV0dXJuIHdpdGhPY2N1cnJlZEF0KFxuICAgIHtcbiAgICAgIGhvb2tJZDogY3JlYXRlZEV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICBydW5JZDogY3JlYXRlZEV2ZW50LnJ1bklkLFxuICAgICAgdG9rZW46IGNyZWF0ZWRFdmVudC5ldmVudERhdGE/LnRva2VuLFxuICAgICAgY3JlYXRlZEF0OiBjcmVhdGVkRXZlbnQuY3JlYXRlZEF0LFxuICAgICAgcmVjZWl2ZWRDb3VudDogcmVjZWl2ZWRFdmVudHMubGVuZ3RoLFxuICAgICAgbGFzdFJlY2VpdmVkQXQ6IGxhc3RSZWNlaXZlZEV2ZW50Py5jcmVhdGVkQXQgfHwgdW5kZWZpbmVkLFxuICAgICAgZGlzcG9zZWRBdDogZGlzcG9zZWRFdmVudHMuYXQoLTEpPy5jcmVhdGVkQXQgfHwgdW5kZWZpbmVkLFxuICAgIH0sXG4gICAgY3JlYXRlZEV2ZW50Lm9jY3VycmVkQXRcbiAgKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSB3b3JrZmxvdyBIb29rIHRvIGFuIE9wZW5UZWxlbWV0cnkgU3BhblxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9va1RvU3Bhbihob29rRXZlbnRzOiBFdmVudFtdLCBtYXhFbmRUaW1lOiBEYXRlKTogU3BhbiB8IG51bGwge1xuICBjb25zdCBob29rID0gaG9va0V2ZW50c1RvSG9va0VudGl0eShob29rRXZlbnRzKTtcbiAgaWYgKCFob29rKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBDb252ZXJ0IGhvb2stcmVsYXRlZCBldmVudHMgdG8gc3BhbiBldmVudHNcbiAgY29uc3QgZXZlbnRzID0gY29udmVydEV2ZW50c1RvU3BhbkV2ZW50cyhob29rRXZlbnRzLCBmYWxzZSk7XG5cbiAgY29uc3QgZW5kVGltZSA9IGhvb2suZGlzcG9zZWRBdCB8fCBtYXhFbmRUaW1lO1xuXG4gIHJldHVybiB7XG4gICAgc3BhbklkOiBTdHJpbmcoaG9vay5ob29rSWQpLFxuICAgIG5hbWU6IGhvb2sudG9rZW4gPz8gU3RyaW5nKGhvb2suaG9va0lkKSxcbiAgICBraW5kOiAxLCAvLyBJTlRFUk5BTCBzcGFuIGtpbmRcbiAgICByZXNvdXJjZTogJ2hvb2snLFxuICAgIGxpYnJhcnk6IFdPUktGTE9XX0xJQlJBUlksXG4gICAgc3RhdHVzOiB7IGNvZGU6IDEgfSxcbiAgICB0cmFjZUZsYWdzOiAxLFxuICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgIHJlc291cmNlOiAnaG9vaycgYXMgY29uc3QsXG4gICAgICBkYXRhOiBob29rLFxuICAgIH0sXG4gICAgbGlua3M6IFtdLFxuICAgIGV2ZW50cyxcbiAgICBzdGFydFRpbWU6IGRhdGVUb090ZWxUaW1lKGhvb2suY3JlYXRlZEF0KSxcbiAgICBlbmRUaW1lOiBkYXRlVG9PdGVsVGltZShlbmRUaW1lKSxcbiAgICBkdXJhdGlvbjogY2FsY3VsYXRlRHVyYXRpb24oaG9vay5jcmVhdGVkQXQsIGVuZFRpbWUpLFxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByb290IHNwYW4gZm9yIHRoZSB3b3JrZmxvdyBydW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blRvU3BhbihcbiAgcnVuOiBXb3JrZmxvd1J1bixcbiAgcnVuRXZlbnRzOiBFdmVudFtdLFxuICBub3dUaW1lPzogRGF0ZVxuKTogU3BhbiB7XG4gIGNvbnN0IG5vdyA9IG5vd1RpbWUgPz8gbmV3IERhdGUoKTtcblxuICAvLyBPbmx5IGVtYmVkIGlkZW50aWZpY2F0aW9uIGZpZWxkcyDigJQgbm90IHRoZSBmdWxsIG9iamVjdCB3aXRoXG4gIC8vIGlucHV0L291dHB1dC9lcnJvciB3aGljaCBtYXkgY29udGFpbiBub24tY2xvbmVhYmxlIHR5cGVzLlxuICBjb25zdCB7IGlucHV0OiBfaSwgb3V0cHV0OiBfbywgZXJyb3I6IF9lLCAuLi5ydW5JZGVudGl0eSB9ID0gcnVuO1xuICBjb25zdCBvY2N1cnJlbmNlRXZlbnQgPSBmaW5kRXZlbnRCeVR5cGUocnVuRXZlbnRzLCBbXG4gICAgJ3J1bl9jcmVhdGVkJyxcbiAgICAncnVuX3N0YXJ0ZWQnLFxuICBdKTtcbiAgY29uc3QgYXR0cmlidXRlcyA9IHtcbiAgICByZXNvdXJjZTogJ3J1bicgYXMgY29uc3QsXG4gICAgZGF0YTogd2l0aE9jY3VycmVkQXQocnVuSWRlbnRpdHksIG9jY3VycmVuY2VFdmVudD8ub2NjdXJyZWRBdCksXG4gIH07XG5cbiAgLy8gVXNlIGNyZWF0ZWRBdCBhcyBzcGFuIHN0YXJ0IHRpbWUsIHdpdGggYWN0aXZlU3RhcnRUaW1lIGZvciB3aGVuIGV4ZWN1dGlvbiBiZWdhblxuICBjb25zdCBzcGFuU3RhcnRUaW1lID0gbmV3IERhdGUocnVuLmNyZWF0ZWRBdCk7XG4gIGNvbnN0IGFjdGl2ZVN0YXJ0VGltZSA9IHJ1bi5zdGFydGVkQXQgPyBuZXcgRGF0ZShydW4uc3RhcnRlZEF0KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZW5kVGltZSA9IHJ1bi5jb21wbGV0ZWRBdCA/PyBub3c7XG5cbiAgLy8gQ29udmVydCBydW4tbGV2ZWwgZXZlbnRzIHRvIHNwYW4gZXZlbnRzXG4gIGNvbnN0IGV2ZW50cyA9IGNvbnZlcnRFdmVudHNUb1NwYW5FdmVudHMocnVuRXZlbnRzLCBmYWxzZSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzcGFuSWQ6IFN0cmluZyhydW4ucnVuSWQpLFxuICAgIG5hbWU6IFN0cmluZyhwYXJzZVdvcmtmbG93TmFtZShydW4ud29ya2Zsb3dOYW1lKT8uc2hvcnROYW1lID8/ICc/JyksXG4gICAga2luZDogMSwgLy8gSU5URVJOQUwgc3BhbiBraW5kXG4gICAgcmVzb3VyY2U6ICdydW4nLFxuICAgIGxpYnJhcnk6IFdPUktGTE9XX0xJQlJBUlksXG4gICAgc3RhdHVzOiB7IGNvZGU6IDAgfSxcbiAgICB0cmFjZUZsYWdzOiAxLFxuICAgIGF0dHJpYnV0ZXMsXG4gICAgbGlua3M6IFtdLFxuICAgIGV2ZW50cyxcbiAgICBzdGFydFRpbWU6IGRhdGVUb090ZWxUaW1lKHNwYW5TdGFydFRpbWUpLFxuICAgIGVuZFRpbWU6IGRhdGVUb090ZWxUaW1lKGVuZFRpbWUpLFxuICAgIGR1cmF0aW9uOiBjYWxjdWxhdGVEdXJhdGlvbihzcGFuU3RhcnRUaW1lLCBlbmRUaW1lKSxcbiAgICAvLyBPbmx5IHNldCBhY3RpdmVTdGFydFRpbWUgaWYgaXQgZGlmZmVycyBmcm9tIHN0YXJ0VGltZSAoaS5lLiwgdGhlcmUgd2FzIGEgcXVldWVkIHBlcmlvZClcbiAgICBhY3RpdmVTdGFydFRpbWU6XG4gICAgICBhY3RpdmVTdGFydFRpbWUgJiYgYWN0aXZlU3RhcnRUaW1lLmdldFRpbWUoKSA+IHNwYW5TdGFydFRpbWUuZ2V0VGltZSgpXG4gICAgICAgID8gZGF0ZVRvT3RlbFRpbWUoYWN0aXZlU3RhcnRUaW1lKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cbiJdfQ==
335
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2Utc3Bhbi1jb25zdHJ1Y3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy93b3JrZmxvdy10cmFjZXMvdHJhY2Utc3Bhbi1jb25zdHJ1Y3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHOUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXZFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLElBQUksRUFBRSwwQkFBMEI7SUFDaEMsT0FBTyxFQUFFLE9BQU87Q0FDakIsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBNEIsSUFBSSxHQUFHLENBQUM7SUFDMUQsY0FBYztJQUNkLGVBQWU7SUFDZixlQUFlO0lBQ2YsY0FBYztJQUNkLGVBQWU7SUFDZixhQUFhO0lBQ2IsWUFBWTtJQUNaLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIsVUFBVTtDQUNYLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQy9CLEtBQXdCLEVBQ04sRUFBRTtJQUNwQixNQUFNLEtBQUssR0FBRyxLQUFLLEVBQUUsVUFBVSxJQUFJLEtBQUssRUFBRSxTQUFTLENBQUM7SUFDcEQsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUU3QixNQUFNLElBQUksR0FBRyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENB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QUN6RCxnQkFBZ0IsRUFBRSxJQUFJO0tBQ3ZCLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDekIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsU0FBUyxJQUFJLEdBQUcsQ0FBQztRQUNuRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLHFCQUFxQjtRQUM5QixRQUFRLEVBQUUsS0FBSztRQUNmLE9BQU8sRUFBRSxnQkFBZ0I7UUFDekIsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRTtRQUNuQixVQUFVLEVBQUUsQ0FBQztRQUNiLFVBQVU7UUFDVixLQUFLLEVBQUUsRUFBRTtRQUNULE1BQU07UUFDTixTQUFTLEVBQUUsY0FBYyxDQUFDLGFBQWEsQ0FBQztRQUN4QyxPQUFPLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQztRQUNoQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQztRQUNuRCwwRkFBMEY7UUFDMUYsZUFBZSxFQUNiLGVBQWUsSUFBSSxlQUFlLENBQUMsT0FBTyxFQUFFLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRTtZQUNwRSxDQUFDLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQztZQUNqQyxDQUFDLENBQUMsU0FBUztLQUNoQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRnVuY3Rpb25zIGZvciBjb25zdHJ1Y3RpbmcgT3BlblRlbGVtZXRyeSBzcGFucyBmcm9tIHdvcmtmbG93IGVudGl0aWVzXG4gKi9cblxuaW1wb3J0IHsgcGFyc2VTdGVwTmFtZSwgcGFyc2VXb3JrZmxvd05hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IFNwYW4sIFNwYW5FdmVudCB9IGZyb20gJy4uL3RyYWNlLXZpZXdlci90eXBlcyc7XG5pbXBvcnQgeyBzaG91bGRTaG93VmVydGljYWxMaW5lIH0gZnJvbSAnLi9ldmVudC1jb2xvcnMnO1xuaW1wb3J0IHsgY2FsY3VsYXRlRHVyYXRpb24sIGRhdGVUb090ZWxUaW1lIH0gZnJvbSAnLi90cmFjZS10aW1lLXV0aWxzJztcblxuZXhwb3J0IGNvbnN0IFdPUktGTE9XX0xJQlJBUlkgPSB7XG4gIG5hbWU6ICd3b3JrZmxvdy1kZXZlbG9wbWVudC1raXQnLFxuICB2ZXJzaW9uOiAnNC4wLjAnLFxufTtcblxuLyoqXG4gKiBFdmVudCB0eXBlcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgYXMgdmlzdWFsIG1hcmtlcnMgaW4gdGhlIHRyYWNlIHZpZXdlclxuICovXG5jb25zdCBNQVJLRVJfRVZFTlRfVFlQRVM6IFNldDxFdmVudFsnZXZlbnRUeXBlJ10+ID0gbmV3IFNldChbXG4gICdob29rX2NyZWF0ZWQnLFxuICAnaG9va19yZWNlaXZlZCcsXG4gICdob29rX2Rpc3Bvc2VkJyxcbiAgJ3N0ZXBfc3RhcnRlZCcsXG4gICdzdGVwX3JldHJ5aW5nJyxcbiAgJ3N0ZXBfZmFpbGVkJyxcbiAgJ3J1bl9mYWlsZWQnLFxuICAnd2FpdF9jcmVhdGVkJyxcbiAgJ3dhaXRfY29tcGxldGVkJyxcbiAgJ2F0dHJfc2V0Jyxcbl0pO1xuXG5leHBvcnQgY29uc3QgZ2V0RXZlbnRUaW1lc3RhbXAgPSAoXG4gIGV2ZW50OiBFdmVudCB8IHVuZGVmaW5lZFxuKTogRGF0ZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHZhbHVlID0gZXZlbnQ/Lm9jY3VycmVkQXQgPz8gZXZlbnQ/LmNyZWF0ZWRBdDtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBkYXRlID0gdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gdmFsdWUgOiBuZXcgRGF0ZSh2YWx1ZSk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gdW5kZWZpbmVkIDogZGF0ZTtcbn07XG5cbi8qKlxuICogQ29udmVydCB3b3JrZmxvdyBldmVudHMgdG8gc3BhbiBldmVudHNcbiAqIE9ubHkgaW5jbHVkZXMgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBhcyBtYXJrZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RXZlbnRzVG9TcGFuRXZlbnRzKFxuICBldmVudHM6IEV2ZW50W10sXG4gIGZpbHRlclR5cGVzID0gdHJ1ZSxcbiAgb3B0aW9uczogeyBwcmVmZXJPY2N1cnJlZEF0PzogYm9vbGVhbiB9ID0ge31cbik6IFNwYW5FdmVudFtdIHtcbiAgcmV0dXJuIGV2ZW50c1xuICAgIC5maWx0ZXIoKGV2ZW50KSA9PlxuICAgICAgZmlsdGVyVHlwZXMgPyBNQVJLRVJfRVZFTlRfVFlQRVMuaGFzKGV2ZW50LmV2ZW50VHlwZSkgOiB0cnVlXG4gICAgKVxuICAgIC5tYXAoKGV2ZW50KSA9PiAoe1xuICAgICAgbmFtZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgdGltZXN0YW1wOiBkYXRlVG9PdGVsVGltZShcbiAgICAgICAgb3B0aW9ucy5wcmVmZXJPY2N1cnJlZEF0XG4gICAgICAgICAgPyAoZ2V0RXZlbnRUaW1lc3RhbXAoZXZlbnQpID8/IGV2ZW50LmNyZWF0ZWRBdClcbiAgICAgICAgICA6IGV2ZW50LmNyZWF0ZWRBdFxuICAgICAgKSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCxcbiAgICAgICAgY29ycmVsYXRpb25JZDogZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgICAgZXZlbnREYXRhOiAnZXZlbnREYXRhJyBpbiBldmVudCA/IGV2ZW50LmV2ZW50RGF0YSA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgICAvLyBDb250cm9sIHdoZXRoZXIgdG8gc2hvdyB2ZXJ0aWNhbCBsaW5lIGluIHRpbWVsaW5lXG4gICAgICBzaG93VmVydGljYWxMaW5lOiBzaG91bGRTaG93VmVydGljYWxMaW5lKGV2ZW50LmV2ZW50VHlwZSksXG4gICAgfSkpO1xufVxuXG5leHBvcnQgY29uc3Qgd2FpdEV2ZW50c1RvV2FpdEVudGl0eSA9IChcbiAgZXZlbnRzOiBFdmVudFtdXG4pOiB7XG4gIHdhaXRJZDogc3RyaW5nO1xuICBydW5JZDogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHJlc3VtZUF0PzogRGF0ZTtcbiAgY29tcGxldGVkQXQ/OiBEYXRlO1xufSB8IG51bGwgPT4ge1xuICBjb25zdCBzdGFydEV2ZW50ID0gZXZlbnRzLmZpbmQoKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnKTtcbiAgaWYgKCFzdGFydEV2ZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgY29tcGxldGVkRXZlbnQgPSBldmVudHMuZmluZChcbiAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJ1xuICApO1xuICByZXR1cm4ge1xuICAgIHdhaXRJZDogc3RhcnRFdmVudC5jb3JyZWxhdGlvbklkLFxuICAgIHJ1bklkOiBzdGFydEV2ZW50LnJ1bklkLFxuICAgIGNyZWF0ZWRBdDogZ2V0RXZlbnRUaW1lc3RhbXAoc3RhcnRFdmVudCkgPz8gc3RhcnRFdmVudC5jcmVhdGVkQXQsXG4gICAgcmVzdW1lQXQ6IHN0YXJ0RXZlbnQuZXZlbnREYXRhPy5yZXN1bWVBdFxuICAgICAgPyBuZXcgRGF0ZShzdGFydEV2ZW50LmV2ZW50RGF0YS5yZXN1bWVBdClcbiAgICAgIDogdW5kZWZpbmVkLFxuICAgIGNvbXBsZXRlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChjb21wbGV0ZWRFdmVudCksXG4gIH07XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgd29ya2Zsb3cgV2FpdCB0byBhbiBPcGVuVGVsZW1ldHJ5IFNwYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhaXRUb1NwYW4oXG4gIGV2ZW50czogRXZlbnRbXSxcbiAgbWF4RW5kVGltZTogRGF0ZSxcbiAgZmFsbGJhY2tFbmRUaW1lID0gbWF4RW5kVGltZVxuKTogU3BhbiB8IG51bGwge1xuICBjb25zdCB3YWl0ID0gd2FpdEV2ZW50c1RvV2FpdEVudGl0eShldmVudHMpO1xuICBpZiAoIXdhaXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBzdGFydFRpbWUgPSB3YWl0LmNyZWF0ZWRBdDtcbiAgY29uc3Qgc3RhcnRNcyA9IHN0YXJ0VGltZS5nZXRUaW1lKCk7XG4gIGxldCBlbmRUaW1lID0gd2FpdC5jb21wbGV0ZWRBdDtcbiAgaWYgKCFlbmRUaW1lKSB7XG4gICAgY29uc3QgZmFsbGJhY2tDYXAgPVxuICAgICAgd2FpdC5yZXN1bWVBdCAmJiB3YWl0LnJlc3VtZUF0LmdldFRpbWUoKSA8IGZhbGxiYWNrRW5kVGltZS5nZXRUaW1lKClcbiAgICAgICAgPyB3YWl0LnJlc3VtZUF0XG4gICAgICAgIDogZmFsbGJhY2tFbmRUaW1lO1xuICAgIGVuZFRpbWUgPVxuICAgICAgbWF4RW5kVGltZS5nZXRUaW1lKCkgPiBzdGFydE1zICYmXG4gICAgICBtYXhFbmRUaW1lLmdldFRpbWUoKSA8IGZhbGxiYWNrQ2FwLmdldFRpbWUoKVxuICAgICAgICA/IG1heEVuZFRpbWVcbiAgICAgICAgOiBmYWxsYmFja0NhcDtcbiAgfVxuICBjb25zdCBzdGFydCA9IGRhdGVUb090ZWxUaW1lKHN0YXJ0VGltZSk7XG4gIGNvbnN0IGVuZCA9IGRhdGVUb090ZWxUaW1lKGVuZFRpbWUpO1xuICBjb25zdCBkdXJhdGlvbiA9IGNhbGN1bGF0ZUR1cmF0aW9uKHN0YXJ0VGltZSwgZW5kVGltZSk7XG4gIGNvbnN0IHNwYW5FdmVudHMgPSBjb252ZXJ0RXZlbnRzVG9TcGFuRXZlbnRzKGV2ZW50cywgZmFsc2UpO1xuICByZXR1cm4ge1xuICAgIHNwYW5JZDogd2FpdC53YWl0SWQsXG4gICAgbmFtZTogJ3NsZWVwJyxcbiAgICBraW5kOiAxLCAvLyBJTlRFUk5BTCBzcGFuIGtpbmRcbiAgICByZXNvdXJjZTogJ3NsZWVwJyxcbiAgICBsaWJyYXJ5OiBXT1JLRkxPV19MSUJSQVJZLFxuICAgIHN0YXR1czogeyBjb2RlOiAwIH0sXG4gICAgdHJhY2VGbGFnczogMSxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICByZXNvdXJjZTogJ3NsZWVwJyBhcyBjb25zdCxcbiAgICAgIGRhdGE6IHdhaXQsIC8vIHdhaXQgaXMgYSBwbGFpbiBvYmplY3QgYnVpbHQgZnJvbSBldmVudHMsIG5vIG5vbi1jbG9uZWFibGUgdHlwZXNcbiAgICB9LFxuICAgIGxpbmtzOiBbXSxcbiAgICBldmVudHM6IHNwYW5FdmVudHMsXG4gICAgZHVyYXRpb24sXG4gICAgc3RhcnRUaW1lOiBzdGFydCxcbiAgICBlbmRUaW1lOiBlbmQsXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBzdGVwRXZlbnRzVG9TdGVwRW50aXR5ID0gKFxuICBldmVudHM6IEV2ZW50W11cbik6IHtcbiAgc3RlcElkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHN0ZXBOYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogJ3BlbmRpbmcnIHwgJ3J1bm5pbmcnIHwgJ2NvbXBsZXRlZCcgfCAnZmFpbGVkJyB8ICdjYW5jZWxsZWQnO1xuICBhdHRlbXB0OiBudW1iZXI7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgdXBkYXRlZEF0OiBEYXRlO1xuICBzdGFydGVkQXQ/OiBEYXRlO1xuICBjb21wbGV0ZWRBdD86IERhdGU7XG4gIHNwZWNWZXJzaW9uPzogbnVtYmVyO1xufSB8IG51bGwgPT4ge1xuICBjb25zdCBjcmVhdGVkRXZlbnQgPSBldmVudHMuZmluZChcbiAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCdcbiAgKTtcblxuICAvLyBWMSBydW5zIGRvbid0IGVtaXQgc3RlcF9jcmVhdGVkIGV2ZW50cy4gRmFsbCBiYWNrIHRvIHRoZSBlYXJsaWVzdCBldmVudFxuICAvLyBpbiB0aGUgZ3JvdXAgc28gd2UgY2FuIHN0aWxsIGJ1aWxkIGEgc3RlcCBzcGFuLlxuICBjb25zdCBhbmNob3JFdmVudCA9IGNyZWF0ZWRFdmVudCA/PyBldmVudHNbMF07XG4gIGlmICghYW5jaG9yRXZlbnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFdhbGsgZXZlbnRzIGluIG9yZGVyIHRvIGRlcml2ZSBzdGF0dXMsIGF0dGVtcHQgY291bnQsIGFuZCB0aW1lc3RhbXBzLlxuICAvLyBIYW5kbGVzIGJvdGggc3RlcF9yZXRyeWluZyBhbmQgY29uc2VjdXRpdmUgc3RlcF9zdGFydGVkIGFzIHJldHJ5IHNpZ25hbHMuXG4gIGxldCBzdGF0dXM6ICdwZW5kaW5nJyB8ICdydW5uaW5nJyB8ICdjb21wbGV0ZWQnIHwgJ2ZhaWxlZCcgfCAnY2FuY2VsbGVkJyA9XG4gICAgJ3BlbmRpbmcnO1xuICBsZXQgYXR0ZW1wdCA9IDA7XG4gIGxldCBzdGFydGVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG4gIGxldCBjb21wbGV0ZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB7XG4gICAgc3dpdGNoIChlLmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSAnc3RlcF9zdGFydGVkJzpcbiAgICAgICAgc3RhdHVzID0gJ3J1bm5pbmcnO1xuICAgICAgICBhdHRlbXB0ICs9IDE7XG4gICAgICAgIGlmICghc3RhcnRlZEF0KSBzdGFydGVkQXQgPSBnZXRFdmVudFRpbWVzdGFtcChlKSA/PyBlLmNyZWF0ZWRBdDtcbiAgICAgICAgY29tcGxldGVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RlcF9jb21wbGV0ZWQnOlxuICAgICAgICBzdGF0dXMgPSAnY29tcGxldGVkJztcbiAgICAgICAgY29tcGxldGVkQXQgPSBnZXRFdmVudFRpbWVzdGFtcChlKSA/PyBlLmNyZWF0ZWRBdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdGVwX2ZhaWxlZCc6XG4gICAgICAgIHN0YXR1cyA9ICdmYWlsZWQnO1xuICAgICAgICBjb21wbGV0ZWRBdCA9IGdldEV2ZW50VGltZXN0YW1wKGUpID8/IGUuY3JlYXRlZEF0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N0ZXBfcmV0cnlpbmcnOlxuICAgICAgICBzdGF0dXMgPSAncGVuZGluZyc7XG4gICAgICAgIGNvbXBsZXRlZEF0ID0gdW5kZWZpbmVkO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBFbnN1cmUgYXQgbGVhc3QgYXR0ZW1wdCAxIGlmIHdlIG5ldmVyIHNhdyBzdGVwX3N0YXJ0ZWRcbiAgaWYgKGF0dGVtcHQgPT09IDApIGF0dGVtcHQgPSAxO1xuXG4gIGNvbnN0IGxhc3RFdmVudCA9IGV2ZW50c1tldmVudHMubGVuZ3RoIC0gMV07XG5cbiAgcmV0dXJuIHtcbiAgICBzdGVwSWQ6IGFuY2hvckV2ZW50LmNvcnJlbGF0aW9uSWQgPz8gJycsXG4gICAgcnVuSWQ6IGFuY2hvckV2ZW50LnJ1bklkLFxuICAgIHN0ZXBOYW1lOiBjcmVhdGVkRXZlbnQ/LmV2ZW50RGF0YT8uc3RlcE5hbWUgPz8gJycsXG4gICAgc3RhdHVzLFxuICAgIGF0dGVtcHQsXG4gICAgY3JlYXRlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChhbmNob3JFdmVudCkgPz8gYW5jaG9yRXZlbnQuY3JlYXRlZEF0LFxuICAgIHVwZGF0ZWRBdDpcbiAgICAgIGdldEV2ZW50VGltZXN0YW1wKGxhc3RFdmVudCkgPz9cbiAgICAgIGxhc3RFdmVudD8uY3JlYXRlZEF0ID8/XG4gICAgICBhbmNob3JFdmVudC5jcmVhdGVkQXQsXG4gICAgc3RhcnRlZEF0LFxuICAgIGNvbXBsZXRlZEF0LFxuICAgIHNwZWNWZXJzaW9uOiBhbmNob3JFdmVudC5zcGVjVmVyc2lvbixcbiAgfTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgc3RlcCBldmVudHMgdG8gYW4gT3BlblRlbGVtZXRyeSBTcGFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwVG9TcGFuKHN0ZXBFdmVudHM6IEV2ZW50W10sIG1heEVuZFRpbWU6IERhdGUpOiBTcGFuIHwgbnVsbCB7XG4gIGNvbnN0IHN0ZXAgPSBzdGVwRXZlbnRzVG9TdGVwRW50aXR5KHN0ZXBFdmVudHMpO1xuICBpZiAoIXN0ZXApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VTdGVwTmFtZShTdHJpbmcoc3RlcC5zdGVwTmFtZSkpO1xuXG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSB7XG4gICAgcmVzb3VyY2U6ICdzdGVwJyBhcyBjb25zdCxcbiAgICBkYXRhOiBzdGVwLFxuICB9O1xuXG4gIGNvbnN0IHJlc291cmNlID0gJ3N0ZXAnO1xuXG4gIC8vIEluY2x1ZGUgQUxMIGNvcnJlbGF0ZWQgZXZlbnRzIG9uIHRoZSBzcGFuIHNvIHRoZSBzaWRlYmFyIGRldGFpbCB2aWV3XG4gIC8vIGNhbiBkaXNwbGF5IHRoZW0uIFRoZSB0aW1lbGluZSB1c2VzIHRoZSBgc2hvd1ZlcnRpY2FsTGluZWAgZmxhZyB0b1xuICAvLyBkZXRlcm1pbmUgd2hpY2ggZXZlbnRzIGFwcGVhciBhcyBtYXJrZXJzLlxuICBjb25zdCBldmVudHMgPSBjb252ZXJ0RXZlbnRzVG9TcGFuRXZlbnRzKHN0ZXBFdmVudHMsIGZhbHNlLCB7XG4gICAgcHJlZmVyT2NjdXJyZWRBdDogdHJ1ZSxcbiAgfSk7XG5cbiAgLy8gVXNlIHRoZSBldmVudCBvY2N1cnJlbmNlIHRpbWVzdGFtcCBmb3Igc3RlcCBzcGFucyB3aGVuIGl0IGlzIGF2YWlsYWJsZSxcbiAgLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBpbmdlc3QgdGltZXN0YW1wIHVzZWQgYnkgb2xkZXIgZXZlbnQgc3RyZWFtcy5cbiAgY29uc3Qgc3BhblN0YXJ0RXZlbnQgPVxuICAgIHN0ZXBFdmVudHMuZmluZCgoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3N0ZXBfY3JlYXRlZCcpID8/XG4gICAgc3RlcEV2ZW50c1swXTtcbiAgY29uc3Qgc3BhblN0YXJ0VGltZSA9XG4gICAgZ2V0RXZlbnRUaW1lc3RhbXAoc3BhblN0YXJ0RXZlbnQpID8/IG5ldyBEYXRlKHN0ZXAuY3JlYXRlZEF0KTtcbiAgbGV0IGFjdGl2ZVN0YXJ0VGltZSA9IHN0ZXAuc3RhcnRlZEF0ID8gbmV3IERhdGUoc3RlcC5zdGFydGVkQXQpIDogdW5kZWZpbmVkO1xuICBjb25zdCBmaXJzdFN0YXJ0RXZlbnQgPSBzdGVwRXZlbnRzLmZpbmQoXG4gICAgKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX3N0YXJ0ZWQnXG4gICk7XG4gIGlmIChmaXJzdFN0YXJ0RXZlbnQpIHtcbiAgICBhY3RpdmVTdGFydFRpbWUgPVxuICAgICAgZ2V0RXZlbnRUaW1lc3RhbXAoZmlyc3RTdGFydEV2ZW50KSA/PyBuZXcgRGF0ZShmaXJzdFN0YXJ0RXZlbnQuY3JlYXRlZEF0KTtcbiAgfVxuXG4gIGxldCBlbmRUaW1lID0gbmV3IERhdGUobWF4RW5kVGltZSk7XG4gIGlmIChzdGVwLmNvbXBsZXRlZEF0KSB7XG4gICAgY29uc3QgY29tcGxldGVkRXZlbnQgPSBzdGVwRXZlbnRzXG4gICAgICAuc2xpY2UoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmZpbmQoXG4gICAgICAgIChldmVudCkgPT5cbiAgICAgICAgICBldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX2NvbXBsZXRlZCcgfHxcbiAgICAgICAgICBldmVudC5ldmVudFR5cGUgPT09ICdzdGVwX2ZhaWxlZCdcbiAgICAgICk7XG4gICAgZW5kVGltZSA9IGdldEV2ZW50VGltZXN0YW1wKGNvbXBsZXRlZEV2ZW50KSA/PyBuZXcgRGF0ZShzdGVwLmNvbXBsZXRlZEF0KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3BhbklkOiBTdHJpbmcoc3RlcC5zdGVwSWQpLFxuICAgIG5hbWU6IHBhcnNlZE5hbWU/LnNob3J0TmFtZSA/PyBTdHJpbmcoc3RlcC5zdGVwTmFtZSksXG4gICAga2luZDogMSwgLy8gSU5URVJOQUwgc3BhbiBraW5kXG4gICAgcmVzb3VyY2UsXG4gICAgbGlicmFyeTogV09SS0ZMT1dfTElCUkFSWSxcbiAgICBzdGF0dXM6IHsgY29kZTogMCB9LFxuICAgIHRyYWNlRmxhZ3M6IDEsXG4gICAgYXR0cmlidXRlcyxcbiAgICBsaW5rczogW10sXG4gICAgZXZlbnRzLFxuICAgIHN0YXJ0VGltZTogZGF0ZVRvT3RlbFRpbWUoc3BhblN0YXJ0VGltZSksXG4gICAgZW5kVGltZTogZGF0ZVRvT3RlbFRpbWUoZW5kVGltZSksXG4gICAgZHVyYXRpb246IGNhbGN1bGF0ZUR1cmF0aW9uKHNwYW5TdGFydFRpbWUsIGVuZFRpbWUpLFxuICAgIC8vIE9ubHkgc2V0IGFjdGl2ZVN0YXJ0VGltZSBpZiBpdCBkaWZmZXJzIGZyb20gc3RhcnRUaW1lIChpLmUuLCB0aGVyZSB3YXMgYSBxdWV1ZWQgcGVyaW9kKVxuICAgIGFjdGl2ZVN0YXJ0VGltZTpcbiAgICAgIGFjdGl2ZVN0YXJ0VGltZSAmJiBhY3RpdmVTdGFydFRpbWUuZ2V0VGltZSgpID4gc3BhblN0YXJ0VGltZS5nZXRUaW1lKClcbiAgICAgICAgPyBkYXRlVG9PdGVsVGltZShhY3RpdmVTdGFydFRpbWUpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgaG9va0V2ZW50c1RvSG9va0VudGl0eSA9IChcbiAgZXZlbnRzOiBFdmVudFtdXG4pOiB7XG4gIGhvb2tJZDogc3RyaW5nO1xuICBydW5JZDogc3RyaW5nO1xuICB0b2tlbj86IHN0cmluZztcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICByZWNlaXZlZENvdW50OiBudW1iZXI7XG4gIGxhc3RSZWNlaXZlZEF0PzogRGF0ZTtcbiAgZGlzcG9zZWRBdD86IERhdGU7XG59IHwgbnVsbCA9PiB7XG4gIGNvbnN0IGNyZWF0ZWRFdmVudCA9IGV2ZW50cy5maW5kKFxuICAgIChldmVudCkgPT4gZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJ1xuICApO1xuICBpZiAoIWNyZWF0ZWRFdmVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHJlY2VpdmVkRXZlbnRzID0gZXZlbnRzLmZpbHRlcihcbiAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnXG4gICk7XG4gIGNvbnN0IGRpc3Bvc2VkRXZlbnRzID0gZXZlbnRzLmZpbHRlcihcbiAgICAoZXZlbnQpID0+IGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnXG4gICk7XG4gIGNvbnN0IGxhc3RSZWNlaXZlZEV2ZW50ID0gcmVjZWl2ZWRFdmVudHMuYXQoLTEpO1xuICByZXR1cm4ge1xuICAgIGhvb2tJZDogY3JlYXRlZEV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgcnVuSWQ6IGNyZWF0ZWRFdmVudC5ydW5JZCxcbiAgICB0b2tlbjogY3JlYXRlZEV2ZW50LmV2ZW50RGF0YT8udG9rZW4sXG4gICAgY3JlYXRlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChjcmVhdGVkRXZlbnQpID8/IGNyZWF0ZWRFdmVudC5jcmVhdGVkQXQsXG4gICAgcmVjZWl2ZWRDb3VudDogcmVjZWl2ZWRFdmVudHMubGVuZ3RoLFxuICAgIGxhc3RSZWNlaXZlZEF0OiBnZXRFdmVudFRpbWVzdGFtcChsYXN0UmVjZWl2ZWRFdmVudCksXG4gICAgZGlzcG9zZWRBdDogZ2V0RXZlbnRUaW1lc3RhbXAoZGlzcG9zZWRFdmVudHMuYXQoLTEpKSxcbiAgfTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSB3b3JrZmxvdyBIb29rIHRvIGFuIE9wZW5UZWxlbWV0cnkgU3BhblxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9va1RvU3Bhbihob29rRXZlbnRzOiBFdmVudFtdLCBtYXhFbmRUaW1lOiBEYXRlKTogU3BhbiB8IG51bGwge1xuICBjb25zdCBob29rID0gaG9va0V2ZW50c1RvSG9va0VudGl0eShob29rRXZlbnRzKTtcbiAgaWYgKCFob29rKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBDb252ZXJ0IGhvb2stcmVsYXRlZCBldmVudHMgdG8gc3BhbiBldmVudHNcbiAgY29uc3QgZXZlbnRzID0gY29udmVydEV2ZW50c1RvU3BhbkV2ZW50cyhob29rRXZlbnRzLCBmYWxzZSk7XG5cbiAgY29uc3QgZW5kVGltZSA9IGhvb2suZGlzcG9zZWRBdCB8fCBtYXhFbmRUaW1lO1xuXG4gIHJldHVybiB7XG4gICAgc3BhbklkOiBTdHJpbmcoaG9vay5ob29rSWQpLFxuICAgIG5hbWU6IGhvb2sudG9rZW4gPz8gU3RyaW5nKGhvb2suaG9va0lkKSxcbiAgICBraW5kOiAxLCAvLyBJTlRFUk5BTCBzcGFuIGtpbmRcbiAgICByZXNvdXJjZTogJ2hvb2snLFxuICAgIGxpYnJhcnk6IFdPUktGTE9XX0xJQlJBUlksXG4gICAgc3RhdHVzOiB7IGNvZGU6IDEgfSxcbiAgICB0cmFjZUZsYWdzOiAxLFxuICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgIHJlc291cmNlOiAnaG9vaycgYXMgY29uc3QsXG4gICAgICBkYXRhOiBob29rLFxuICAgIH0sXG4gICAgbGlua3M6IFtdLFxuICAgIGV2ZW50cyxcbiAgICBzdGFydFRpbWU6IGRhdGVUb090ZWxUaW1lKGhvb2suY3JlYXRlZEF0KSxcbiAgICBlbmRUaW1lOiBkYXRlVG9PdGVsVGltZShlbmRUaW1lKSxcbiAgICBkdXJhdGlvbjogY2FsY3VsYXRlRHVyYXRpb24oaG9vay5jcmVhdGVkQXQsIGVuZFRpbWUpLFxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByb290IHNwYW4gZm9yIHRoZSB3b3JrZmxvdyBydW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blRvU3BhbihcbiAgcnVuOiBXb3JrZmxvd1J1bixcbiAgcnVuRXZlbnRzOiBFdmVudFtdLFxuICBub3dUaW1lPzogRGF0ZVxuKTogU3BhbiB7XG4gIGNvbnN0IG5vdyA9IG5vd1RpbWUgPz8gbmV3IERhdGUoKTtcblxuICAvLyBQcmVmZXIgdGhlIGV2ZW50IG9jY3VycmVuY2UgdGltZXN0YW1wIHdoZW4gYXZhaWxhYmxlIHNvIHRoZSByb290IHNwYW5cbiAgLy8gbGluZXMgdXAgd2l0aCBjaGlsZCBzcGFucyB0aGF0IGFscmVhZHkgdXNlIGV2ZW50IG9jY3VycmVuY2UgdGltZS5cbiAgY29uc3QgcnVuQ3JlYXRlZEV2ZW50ID0gcnVuRXZlbnRzLmZpbmQoXG4gICAgKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCdcbiAgKTtcbiAgY29uc3QgcnVuU3RhcnRlZEV2ZW50ID0gcnVuRXZlbnRzLmZpbmQoXG4gICAgKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCdcbiAgKTtcbiAgY29uc3QgdGVybWluYWxFdmVudCA9IHJ1bkV2ZW50c1xuICAgIC5zbGljZSgpXG4gICAgLnJldmVyc2UoKVxuICAgIC5maW5kKFxuICAgICAgKGV2ZW50KSA9PlxuICAgICAgICBldmVudC5ldmVudFR5cGUgPT09ICdydW5fY29tcGxldGVkJyB8fFxuICAgICAgICBldmVudC5ldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJyB8fFxuICAgICAgICBldmVudC5ldmVudFR5cGUgPT09ICdydW5fY2FuY2VsbGVkJ1xuICAgICk7XG4gIGNvbnN0IHNwYW5TdGFydFRpbWUgPVxuICAgIGdldEV2ZW50VGltZXN0YW1wKHJ1bkNyZWF0ZWRFdmVudCkgPz8gbmV3IERhdGUocnVuLmNyZWF0ZWRBdCk7XG4gIGNvbnN0IGFjdGl2ZVN0YXJ0VGltZSA9XG4gICAgZ2V0RXZlbnRUaW1lc3RhbXAocnVuU3RhcnRlZEV2ZW50KSA/P1xuICAgIChydW4uc3RhcnRlZEF0ID8gbmV3IERhdGUocnVuLnN0YXJ0ZWRBdCkgOiB1bmRlZmluZWQpO1xuICBjb25zdCBjb21wbGV0ZWRBdCA9XG4gICAgZ2V0RXZlbnRUaW1lc3RhbXAodGVybWluYWxFdmVudCkgPz8gcnVuLmNvbXBsZXRlZEF0ID8/IHVuZGVmaW5lZDtcbiAgY29uc3QgZW5kVGltZSA9IGNvbXBsZXRlZEF0ID8/IG5vdztcblxuICAvLyBPbmx5IGVtYmVkIGlkZW50aWZpY2F0aW9uIGZpZWxkcyDigJQgbm90IHRoZSBmdWxsIG9iamVjdCB3aXRoXG4gIC8vIGlucHV0L291dHB1dC9lcnJvciB3aGljaCBtYXkgY29udGFpbiBub24tY2xvbmVhYmxlIHR5cGVzLiBMaWZlY3ljbGVcbiAgLy8gdGltZXN0YW1wcyBhcmUgZXZlbnQtZGVyaXZlZCBzbyBkZXRhaWwgcm93cyBhbGlnbiB3aXRoIHRoZSBzcGFuIHRpbWVsaW5lLlxuICBjb25zdCB7IGlucHV0OiBfaSwgb3V0cHV0OiBfbywgZXJyb3I6IF9lLCAuLi5ydW5JZGVudGl0eSB9ID0gcnVuO1xuICBjb25zdCBhdHRyaWJ1dGVzID0ge1xuICAgIHJlc291cmNlOiAncnVuJyBhcyBjb25zdCxcbiAgICBkYXRhOiB7XG4gICAgICAuLi5ydW5JZGVudGl0eSxcbiAgICAgIGNyZWF0ZWRBdDogc3BhblN0YXJ0VGltZSxcbiAgICAgIHN0YXJ0ZWRBdDogYWN0aXZlU3RhcnRUaW1lLFxuICAgICAgY29tcGxldGVkQXQsXG4gICAgfSxcbiAgfTtcblxuICAvLyBDb252ZXJ0IHJ1bi1sZXZlbCBldmVudHMgdG8gc3BhbiBldmVudHNcbiAgY29uc3QgZXZlbnRzID0gY29udmVydEV2ZW50c1RvU3BhbkV2ZW50cyhydW5FdmVudHMsIGZhbHNlLCB7XG4gICAgcHJlZmVyT2NjdXJyZWRBdDogdHJ1ZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzcGFuSWQ6IFN0cmluZyhydW4ucnVuSWQpLFxuICAgIG5hbWU6IFN0cmluZyhwYXJzZVdvcmtmbG93TmFtZShydW4ud29ya2Zsb3dOYW1lKT8uc2hvcnROYW1lID8/ICc/JyksXG4gICAga2luZDogMSwgLy8gSU5URVJOQUwgc3BhbiBraW5kXG4gICAgcmVzb3VyY2U6ICdydW4nLFxuICAgIGxpYnJhcnk6IFdPUktGTE9XX0xJQlJBUlksXG4gICAgc3RhdHVzOiB7IGNvZGU6IDAgfSxcbiAgICB0cmFjZUZsYWdzOiAxLFxuICAgIGF0dHJpYnV0ZXMsXG4gICAgbGlua3M6IFtdLFxuICAgIGV2ZW50cyxcbiAgICBzdGFydFRpbWU6IGRhdGVUb090ZWxUaW1lKHNwYW5TdGFydFRpbWUpLFxuICAgIGVuZFRpbWU6IGRhdGVUb090ZWxUaW1lKGVuZFRpbWUpLFxuICAgIGR1cmF0aW9uOiBjYWxjdWxhdGVEdXJhdGlvbihzcGFuU3RhcnRUaW1lLCBlbmRUaW1lKSxcbiAgICAvLyBPbmx5IHNldCBhY3RpdmVTdGFydFRpbWUgaWYgaXQgZGlmZmVycyBmcm9tIHN0YXJ0VGltZSAoaS5lLiwgdGhlcmUgd2FzIGEgcXVldWVkIHBlcmlvZClcbiAgICBhY3RpdmVTdGFydFRpbWU6XG4gICAgICBhY3RpdmVTdGFydFRpbWUgJiYgYWN0aXZlU3RhcnRUaW1lLmdldFRpbWUoKSA+IHNwYW5TdGFydFRpbWUuZ2V0VGltZSgpXG4gICAgICAgID8gZGF0ZVRvT3RlbFRpbWUoYWN0aXZlU3RhcnRUaW1lKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import { type ClassValue } from 'clsx';
2
+ /**
3
+ * Merges Tailwind class names and resolves any conflicts using `clsx` with `tailwind-merge`.
4
+ *
5
+ * @param inputs - An array of class names to merge.
6
+ * @returns A string of merged and optimized class names.
7
+ */
8
+ declare function cn(...classes: ClassValue[]): string;
9
+ export { cn };
10
+ //# sourceMappingURL=cn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cn.d.ts","sourceRoot":"","sources":["../../src/lib/cn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAC;AAkF7C;;;;;GAKG;AACH,iBAAS,EAAE,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,UAEnC;AAED,OAAO,EAAE,EAAE,EAAE,CAAC"}
package/dist/lib/cn.js ADDED
@@ -0,0 +1,83 @@
1
+ import { clsx } from 'clsx';
2
+ import { extendTailwindMerge } from 'tailwind-merge';
3
+ const twMergeConfig = {
4
+ extend: {
5
+ classGroups: {
6
+ 'text-heading': [
7
+ {
8
+ 'text-heading': [
9
+ '72',
10
+ '64',
11
+ '56',
12
+ '48',
13
+ '40',
14
+ '32',
15
+ '24',
16
+ '20',
17
+ '16',
18
+ '14',
19
+ ],
20
+ },
21
+ ],
22
+ 'text-button': [
23
+ {
24
+ 'text-button': ['16', '14', '12'],
25
+ },
26
+ ],
27
+ 'text-label': [
28
+ {
29
+ 'text-label': [
30
+ '20',
31
+ '18',
32
+ '16',
33
+ '14',
34
+ '14-mono',
35
+ '13',
36
+ '13-mono',
37
+ '12',
38
+ '12-mono',
39
+ ],
40
+ },
41
+ ],
42
+ 'text-copy': [
43
+ {
44
+ 'text-copy': ['24', '20', '18', '16', '14', '13', '13-mono'],
45
+ },
46
+ ],
47
+ material: [
48
+ {
49
+ material: [
50
+ 'base',
51
+ 'small',
52
+ 'medium',
53
+ 'large',
54
+ 'tooltip',
55
+ 'menu',
56
+ 'modal',
57
+ 'fullscreen',
58
+ ],
59
+ },
60
+ ],
61
+ },
62
+ // Make each category conflict with itself, so e.g. text-heading-32 overrides text-heading-24
63
+ conflictingClassGroups: {
64
+ 'text-heading': ['text-heading'],
65
+ 'text-button': ['text-button'],
66
+ 'text-label': ['text-label'],
67
+ 'text-copy': ['text-copy'],
68
+ material: ['material'],
69
+ },
70
+ },
71
+ };
72
+ const customTwMerge = extendTailwindMerge(twMergeConfig);
73
+ /**
74
+ * Merges Tailwind class names and resolves any conflicts using `clsx` with `tailwind-merge`.
75
+ *
76
+ * @param inputs - An array of class names to merge.
77
+ * @returns A string of merged and optimized class names.
78
+ */
79
+ function cn(...classes) {
80
+ return customTwMerge(clsx(...classes));
81
+ }
82
+ export { cn };
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2NuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUIsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJELE1BQU0sYUFBYSxHQUFHO0lBQ3BCLE1BQU0sRUFBRTtRQUNOLFdBQVcsRUFBRTtZQUNYLGNBQWMsRUFBRTtnQkFDZDtvQkFDRSxjQUFjLEVBQUU7d0JBQ2QsSUFBSTt3QkFDSixJQUFJO3dCQUNKLElBQUk7d0JBQ0osSUFBSTt3QkFDSixJQUFJO3dCQUNKLElBQUk7d0JBQ0osSUFBSTt3QkFDSixJQUFJO3dCQUNKLElBQUk7d0JBQ0osSUFBSTtxQkFDTDtpQkFDRjthQUNGO1lBQ0QsYUFBYSxFQUFFO2dCQUNiO29CQUNFLGFBQWEsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO2lCQUNsQzthQUNGO1lBQ0QsWUFBWSxFQUFFO2dCQUNaO29CQUNFLFlBQVksRUFBRTt3QkFDWixJQUFJO3dCQUNKLElBQUk7d0JBQ0osSUFBSTt3QkFDSixJQUFJO3dCQUNKLFNBQVM7d0JBQ1QsSUFBSTt3QkFDSixTQUFTO3dCQUNULElBQUk7d0JBQ0osU0FBUztxQkFDVjtpQkFDRjthQUNGO1lBQ0QsV0FBVyxFQUFFO2dCQUNYO29CQUNFLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQztpQkFDN0Q7YUFDRjtZQUNELFFBQVEsRUFBRTtnQkFDUjtvQkFDRSxRQUFRLEVBQUU7d0JBQ1IsTUFBTTt3QkFDTixPQUFPO3dCQUNQLFFBQVE7d0JBQ1IsT0FBTzt3QkFDUCxTQUFTO3dCQUNULE1BQU07d0JBQ04sT0FBTzt3QkFDUCxZQUFZO3FCQUNiO2lCQUNGO2FBQ0Y7U0FDRjtRQUNELDZGQUE2RjtRQUM3RixzQkFBc0IsRUFBRTtZQUN0QixjQUFjLEVBQUUsQ0FBQyxjQUFjLENBQUM7WUFDaEMsYUFBYSxFQUFFLENBQUMsYUFBYSxDQUFDO1lBQzlCLFlBQVksRUFBRSxDQUFDLFlBQVksQ0FBQztZQUM1QixXQUFXLEVBQUUsQ0FBQyxXQUFXLENBQUM7WUFDMUIsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDO1NBQ3ZCO0tBQ0Y7Q0FDTyxDQUFDO0FBU1gsTUFBTSxhQUFhLEdBQUcsbUJBQW1CLENBQXNCLGFBQWEsQ0FBQyxDQUFDO0FBRTlFOzs7OztHQUtHO0FBQ0gsU0FBUyxFQUFFLENBQUMsR0FBRyxPQUFxQjtJQUNsQyxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIENsYXNzVmFsdWUsIGNsc3ggfSBmcm9tICdjbHN4JztcbmltcG9ydCB7IGV4dGVuZFRhaWx3aW5kTWVyZ2UgfSBmcm9tICd0YWlsd2luZC1tZXJnZSc7XG5cbmNvbnN0IHR3TWVyZ2VDb25maWcgPSB7XG4gIGV4dGVuZDoge1xuICAgIGNsYXNzR3JvdXBzOiB7XG4gICAgICAndGV4dC1oZWFkaW5nJzogW1xuICAgICAgICB7XG4gICAgICAgICAgJ3RleHQtaGVhZGluZyc6IFtcbiAgICAgICAgICAgICc3MicsXG4gICAgICAgICAgICAnNjQnLFxuICAgICAgICAgICAgJzU2JyxcbiAgICAgICAgICAgICc0OCcsXG4gICAgICAgICAgICAnNDAnLFxuICAgICAgICAgICAgJzMyJyxcbiAgICAgICAgICAgICcyNCcsXG4gICAgICAgICAgICAnMjAnLFxuICAgICAgICAgICAgJzE2JyxcbiAgICAgICAgICAgICcxNCcsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICAndGV4dC1idXR0b24nOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAndGV4dC1idXR0b24nOiBbJzE2JywgJzE0JywgJzEyJ10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgJ3RleHQtbGFiZWwnOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAndGV4dC1sYWJlbCc6IFtcbiAgICAgICAgICAgICcyMCcsXG4gICAgICAgICAgICAnMTgnLFxuICAgICAgICAgICAgJzE2JyxcbiAgICAgICAgICAgICcxNCcsXG4gICAgICAgICAgICAnMTQtbW9ubycsXG4gICAgICAgICAgICAnMTMnLFxuICAgICAgICAgICAgJzEzLW1vbm8nLFxuICAgICAgICAgICAgJzEyJyxcbiAgICAgICAgICAgICcxMi1tb25vJyxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgICd0ZXh0LWNvcHknOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAndGV4dC1jb3B5JzogWycyNCcsICcyMCcsICcxOCcsICcxNicsICcxNCcsICcxMycsICcxMy1tb25vJ10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgbWF0ZXJpYWw6IFtcbiAgICAgICAge1xuICAgICAgICAgIG1hdGVyaWFsOiBbXG4gICAgICAgICAgICAnYmFzZScsXG4gICAgICAgICAgICAnc21hbGwnLFxuICAgICAgICAgICAgJ21lZGl1bScsXG4gICAgICAgICAgICAnbGFyZ2UnLFxuICAgICAgICAgICAgJ3Rvb2x0aXAnLFxuICAgICAgICAgICAgJ21lbnUnLFxuICAgICAgICAgICAgJ21vZGFsJyxcbiAgICAgICAgICAgICdmdWxsc2NyZWVuJyxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIC8vIE1ha2UgZWFjaCBjYXRlZ29yeSBjb25mbGljdCB3aXRoIGl0c2VsZiwgc28gZS5nLiB0ZXh0LWhlYWRpbmctMzIgb3ZlcnJpZGVzIHRleHQtaGVhZGluZy0yNFxuICAgIGNvbmZsaWN0aW5nQ2xhc3NHcm91cHM6IHtcbiAgICAgICd0ZXh0LWhlYWRpbmcnOiBbJ3RleHQtaGVhZGluZyddLFxuICAgICAgJ3RleHQtYnV0dG9uJzogWyd0ZXh0LWJ1dHRvbiddLFxuICAgICAgJ3RleHQtbGFiZWwnOiBbJ3RleHQtbGFiZWwnXSxcbiAgICAgICd0ZXh0LWNvcHknOiBbJ3RleHQtY29weSddLFxuICAgICAgbWF0ZXJpYWw6IFsnbWF0ZXJpYWwnXSxcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBDdXN0b21DbGFzc0dyb3VwSWRzID1cbiAgfCAndGV4dC1oZWFkaW5nJ1xuICB8ICd0ZXh0LWJ1dHRvbidcbiAgfCAndGV4dC1sYWJlbCdcbiAgfCAndGV4dC1jb3B5J1xuICB8ICdtYXRlcmlhbCc7XG5cbmNvbnN0IGN1c3RvbVR3TWVyZ2UgPSBleHRlbmRUYWlsd2luZE1lcmdlPEN1c3RvbUNsYXNzR3JvdXBJZHM+KHR3TWVyZ2VDb25maWcpO1xuXG4vKipcbiAqIE1lcmdlcyBUYWlsd2luZCBjbGFzcyBuYW1lcyBhbmQgcmVzb2x2ZXMgYW55IGNvbmZsaWN0cyB1c2luZyBgY2xzeGAgd2l0aCBgdGFpbHdpbmQtbWVyZ2VgLlxuICpcbiAqIEBwYXJhbSBpbnB1dHMgLSBBbiBhcnJheSBvZiBjbGFzcyBuYW1lcyB0byBtZXJnZS5cbiAqIEByZXR1cm5zIEEgc3RyaW5nIG9mIG1lcmdlZCBhbmQgb3B0aW1pemVkIGNsYXNzIG5hbWVzLlxuICovXG5mdW5jdGlvbiBjbiguLi5jbGFzc2VzOiBDbGFzc1ZhbHVlW10pIHtcbiAgcmV0dXJuIGN1c3RvbVR3TWVyZ2UoY2xzeCguLi5jbGFzc2VzKSk7XG59XG5cbmV4cG9ydCB7IGNuIH07XG4iXX0=
@@ -17,7 +17,6 @@ export interface MaterializedStep {
17
17
  status: StepStatus;
18
18
  attempt: number;
19
19
  createdAt: Date;
20
- occurredAt?: Date;
21
20
  startedAt?: Date;
22
21
  completedAt?: Date;
23
22
  updatedAt: Date;
@@ -29,7 +28,6 @@ export interface MaterializedHook {
29
28
  runId: string;
30
29
  token?: string;
31
30
  createdAt: Date;
32
- occurredAt?: Date;
33
31
  receivedCount: number;
34
32
  lastReceivedAt?: Date;
35
33
  disposedAt?: Date;
@@ -41,7 +39,6 @@ export interface MaterializedWait {
41
39
  runId: string;
42
40
  status: 'waiting' | 'completed';
43
41
  createdAt: Date;
44
- occurredAt?: Date;
45
42
  resumeAt?: Date;
46
43
  completedAt?: Date;
47
44
  /** All events for this wait, in insertion order */
@@ -1 +1 @@
1
- {"version":3,"file":"event-materialization.d.ts","sourceRoot":"","sources":["../../src/lib/event-materialization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAMzD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAuCD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,EAAE,CAgEpE;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,EAAE,CAmCpE;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,EAAE,CA8BpE;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,oBAAoB,CAMpE"}
1
+ {"version":3,"file":"event-materialization.d.ts","sourceRoot":"","sources":["../../src/lib/event-materialization.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAMzD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,mDAAmD;IACnD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAqCD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,EAAE,CA2DpE;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,EAAE,CA8BpE;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,EAAE,CAyBpE;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,oBAAoB,CAMpE"}