@workflow/cli 5.0.0-beta.4 → 5.0.0-beta.40

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 (108) hide show
  1. package/dist/base.js +1 -1
  2. package/dist/commands/build.js +1 -1
  3. package/dist/commands/cancel.d.ts +1 -0
  4. package/dist/commands/cancel.d.ts.map +1 -1
  5. package/dist/commands/cancel.js +36 -55
  6. package/dist/commands/dev.js +1 -1
  7. package/dist/commands/health.d.ts +1 -3
  8. package/dist/commands/health.d.ts.map +1 -1
  9. package/dist/commands/health.js +26 -50
  10. package/dist/commands/init.js +1 -1
  11. package/dist/commands/inspect.d.ts +4 -0
  12. package/dist/commands/inspect.d.ts.map +1 -1
  13. package/dist/commands/inspect.js +37 -7
  14. package/dist/commands/start.d.ts +1 -0
  15. package/dist/commands/start.d.ts.map +1 -1
  16. package/dist/commands/start.js +8 -3
  17. package/dist/commands/transform.js +1 -1
  18. package/dist/commands/validate.js +1 -1
  19. package/dist/commands/web.d.ts +2 -0
  20. package/dist/commands/web.d.ts.map +1 -1
  21. package/dist/commands/web.js +9 -3
  22. package/dist/lib/bulk-cancel.d.ts +74 -0
  23. package/dist/lib/bulk-cancel.d.ts.map +1 -0
  24. package/dist/lib/bulk-cancel.js +197 -0
  25. package/dist/lib/bulk-cancel.test.d.ts +2 -0
  26. package/dist/lib/bulk-cancel.test.d.ts.map +1 -0
  27. package/dist/lib/bulk-cancel.test.js +366 -0
  28. package/dist/lib/config/log.js +1 -1
  29. package/dist/lib/config/types.d.ts +6 -1
  30. package/dist/lib/config/types.d.ts.map +1 -1
  31. package/dist/lib/config/types.js +1 -1
  32. package/dist/lib/config/workflow-config.d.ts.map +1 -1
  33. package/dist/lib/config/workflow-config.js +2 -2
  34. package/dist/lib/inspect/auth.js +1 -1
  35. package/dist/lib/inspect/env.d.ts +1 -1
  36. package/dist/lib/inspect/env.js +2 -2
  37. package/dist/lib/inspect/errors.d.ts +3 -0
  38. package/dist/lib/inspect/errors.d.ts.map +1 -0
  39. package/dist/lib/inspect/errors.js +27 -0
  40. package/dist/lib/inspect/flags.d.ts +9 -0
  41. package/dist/lib/inspect/flags.d.ts.map +1 -1
  42. package/dist/lib/inspect/flags.js +23 -1
  43. package/dist/lib/inspect/hydration.d.ts +22 -0
  44. package/dist/lib/inspect/hydration.d.ts.map +1 -1
  45. package/dist/lib/inspect/hydration.js +107 -49
  46. package/dist/lib/inspect/hydration.test.d.ts +2 -0
  47. package/dist/lib/inspect/hydration.test.d.ts.map +1 -0
  48. package/dist/lib/inspect/hydration.test.js +23 -0
  49. package/dist/lib/inspect/output.d.ts +2 -2
  50. package/dist/lib/inspect/output.d.ts.map +1 -1
  51. package/dist/lib/inspect/output.js +327 -136
  52. package/dist/lib/inspect/output.test.js +663 -3
  53. package/dist/lib/inspect/pagination.d.ts +10 -1
  54. package/dist/lib/inspect/pagination.d.ts.map +1 -1
  55. package/dist/lib/inspect/pagination.js +20 -4
  56. package/dist/lib/inspect/run.d.ts.map +1 -1
  57. package/dist/lib/inspect/run.js +33 -10
  58. package/dist/lib/inspect/setup.d.ts.map +1 -1
  59. package/dist/lib/inspect/setup.js +42 -6
  60. package/dist/lib/inspect/stream.js +1 -1
  61. package/dist/lib/inspect/terminal-utils.js +1 -1
  62. package/dist/lib/inspect/time-window.d.ts +28 -0
  63. package/dist/lib/inspect/time-window.d.ts.map +1 -0
  64. package/dist/lib/inspect/time-window.js +61 -0
  65. package/dist/lib/inspect/time-window.test.d.ts +2 -0
  66. package/dist/lib/inspect/time-window.test.d.ts.map +1 -0
  67. package/dist/lib/inspect/time-window.test.js +58 -0
  68. package/dist/lib/inspect/vercel-api.d.ts +5 -2
  69. package/dist/lib/inspect/vercel-api.d.ts.map +1 -1
  70. package/dist/lib/inspect/vercel-api.js +12 -37
  71. package/dist/lib/inspect/vercel-api.test.d.ts +2 -0
  72. package/dist/lib/inspect/vercel-api.test.d.ts.map +1 -0
  73. package/dist/lib/inspect/vercel-api.test.js +21 -0
  74. package/dist/lib/inspect/vercel-link.js +1 -1
  75. package/dist/lib/inspect/web.d.ts +24 -0
  76. package/dist/lib/inspect/web.d.ts.map +1 -1
  77. package/dist/lib/inspect/web.js +122 -3
  78. package/dist/lib/update-check.js +1 -1
  79. package/package.json +15 -14
  80. package/dist/base.js.map +0 -1
  81. package/dist/commands/build.js.map +0 -1
  82. package/dist/commands/cancel.js.map +0 -1
  83. package/dist/commands/dev.js.map +0 -1
  84. package/dist/commands/health.js.map +0 -1
  85. package/dist/commands/init.js.map +0 -1
  86. package/dist/commands/inspect.js.map +0 -1
  87. package/dist/commands/start.js.map +0 -1
  88. package/dist/commands/transform.js.map +0 -1
  89. package/dist/commands/validate.js.map +0 -1
  90. package/dist/commands/web.js.map +0 -1
  91. package/dist/lib/config/log.js.map +0 -1
  92. package/dist/lib/config/types.js.map +0 -1
  93. package/dist/lib/config/workflow-config.js.map +0 -1
  94. package/dist/lib/inspect/auth.js.map +0 -1
  95. package/dist/lib/inspect/env.js.map +0 -1
  96. package/dist/lib/inspect/flags.js.map +0 -1
  97. package/dist/lib/inspect/hydration.js.map +0 -1
  98. package/dist/lib/inspect/output.js.map +0 -1
  99. package/dist/lib/inspect/output.test.js.map +0 -1
  100. package/dist/lib/inspect/pagination.js.map +0 -1
  101. package/dist/lib/inspect/run.js.map +0 -1
  102. package/dist/lib/inspect/setup.js.map +0 -1
  103. package/dist/lib/inspect/stream.js.map +0 -1
  104. package/dist/lib/inspect/terminal-utils.js.map +0 -1
  105. package/dist/lib/inspect/vercel-api.js.map +0 -1
  106. package/dist/lib/inspect/vercel-link.js.map +0 -1
  107. package/dist/lib/inspect/web.js.map +0 -1
  108. package/dist/lib/update-check.js.map +0 -1
@@ -0,0 +1,197 @@
1
+ import { cancelRuns } from '@workflow/core/runtime';
2
+ import { parseWorkflowName } from '@workflow/utils/parse-name';
3
+ import chalk from 'chalk';
4
+ import Table from 'easy-table';
5
+ import { planWindowStartFromResponse } from './inspect/time-window.js';
6
+ export const BULK_CANCEL_MIN_LIMIT = 1;
7
+ export const BULK_CANCEL_MAX_LIMIT = 500;
8
+ export const CLI_CANCEL_REASON = 'Cancelled via Workflow CLI';
9
+ /**
10
+ * Statuses a run can still be cancelled from. When the caller doesn't pin a
11
+ * `--status`, bulk cancel restricts matching to these so terminal runs
12
+ * (including the ones a prior batch just cancelled) don't crowd out reachable
13
+ * active runs. Otherwise, listing every status returns the same newest
14
+ * terminal page on each rerun and older active runs are never reached. The
15
+ * list API filters by a single status, so we fan out across these and merge.
16
+ */
17
+ export const CANCELLABLE_STATUSES = [
18
+ 'pending',
19
+ 'running',
20
+ ];
21
+ /**
22
+ * Guidance printed when more runs match the filters than were fetched. Bulk
23
+ * cancel is deliberately single-batch and user-paced — no cursors or async
24
+ * jobs — so the user re-runs to cancel the next batch.
25
+ */
26
+ export const HAS_MORE_GUIDANCE = 'More runs match these filters. Re-run this command to cancel the next batch,\n' +
27
+ 'or use --limit up to 500.';
28
+ /**
29
+ * Validate the `--limit` flag. Returns an error message when invalid, or
30
+ * `undefined` when the value is an integer within [1, 500].
31
+ */
32
+ export function validateBulkCancelLimit(limit) {
33
+ if (!Number.isInteger(limit) ||
34
+ limit < BULK_CANCEL_MIN_LIMIT ||
35
+ limit > BULK_CANCEL_MAX_LIMIT) {
36
+ return `--limit must be an integer between ${BULK_CANCEL_MIN_LIMIT} and ${BULK_CANCEL_MAX_LIMIT}.`;
37
+ }
38
+ return undefined;
39
+ }
40
+ /**
41
+ * Build the compact multi-line "Done:" summary block. Lists every outcome
42
+ * category so the counts add up to the number of runs requested; individual
43
+ * `not_found`, `not_cancellable`, and `failed` runs are additionally surfaced
44
+ * per-run via {@link bulkCancelFailureLines}.
45
+ */
46
+ export function formatBulkCancelSummary(result) {
47
+ const { summary } = result;
48
+ return [
49
+ 'Done:',
50
+ ` ${summary.cancelled} cancelled`,
51
+ ` ${summary.alreadyCancelled} already cancelled`,
52
+ ` ${summary.notCancellable} not cancellable`,
53
+ ` ${summary.notFound} not found`,
54
+ ` ${summary.failed} failed`,
55
+ ].join('\n');
56
+ }
57
+ /**
58
+ * Per-run lines for outcomes worth calling out individually: `not_found`,
59
+ * `not_cancellable`, and `failed`. Cancelled and already-cancelled runs are
60
+ * left to the summary.
61
+ */
62
+ export function bulkCancelFailureLines(result) {
63
+ const lines = [];
64
+ for (const r of result.results) {
65
+ switch (r.outcome) {
66
+ case 'not_found':
67
+ lines.push(` ✗ ${r.runId}: not found`);
68
+ break;
69
+ case 'not_cancellable':
70
+ lines.push(` ✗ ${r.runId}: not cancellable (${r.status})`);
71
+ break;
72
+ case 'failed':
73
+ lines.push(` ✗ ${r.runId}: failed (${r.code}${r.retryable ? ', retryable' : ''})`);
74
+ break;
75
+ }
76
+ }
77
+ return lines;
78
+ }
79
+ /**
80
+ * Fetch matching runs (up to `limit`), confirm, and cancel them in a single
81
+ * bulk operation. Prints a table of what will be cancelled, rerun guidance
82
+ * when more runs match than were fetched, a compact summary, and per-run
83
+ * lines for surfaced failures.
84
+ *
85
+ * Does not traverse pages: exactly one page of at most `limit` runs is
86
+ * cancelled per invocation.
87
+ */
88
+ export async function performBulkCancel(params) {
89
+ const { world, status, workflowName, limit, confirm, logger, promptConfirm } = params;
90
+ // Fetch matching runs. Only metadata is needed to display and cancel, so
91
+ // prefer the analytics read path when the backend provides one.
92
+ //
93
+ // When the caller pins a status, match exactly that. Otherwise restrict to
94
+ // the cancellable statuses so rerunning makes progress instead of returning
95
+ // the same terminal page forever. The list API takes a single status, so
96
+ // fan out across the target statuses and merge the pages below.
97
+ const analytics = world.analytics;
98
+ const targetStatuses = status
99
+ ? [status]
100
+ : [...CANCELLABLE_STATUSES];
101
+ const fetchPage = async (pageStatus) => {
102
+ if (!analytics) {
103
+ return world.runs.list({
104
+ status: pageStatus,
105
+ workflowName,
106
+ pagination: { limit },
107
+ resolveData: 'none',
108
+ });
109
+ }
110
+ // The analytics backend defaults its listing to a recent window
111
+ // (trailing 24h on the Vercel backend), but bulk cancel must match
112
+ // across the plan's whole observability window — a run can sleep or
113
+ // wait on a hook for days without emitting recent events. Probe for
114
+ // the plan window bounds first, then match across them.
115
+ const probe = await analytics.runs.list({
116
+ status: pageStatus,
117
+ workflowName,
118
+ pagination: { limit: 1 },
119
+ });
120
+ const windowStart = planWindowStartFromResponse(probe);
121
+ return analytics.runs.list({
122
+ status: pageStatus,
123
+ workflowName,
124
+ ...(windowStart
125
+ ? { startTime: windowStart, endTime: new Date().toISOString() }
126
+ : {}),
127
+ pagination: { limit },
128
+ });
129
+ };
130
+ const pages = await Promise.all(targetStatuses.map(fetchPage));
131
+ // Merge the per-status pages round-robin so a full page of running runs
132
+ // cannot crowd pending runs (which do not have a startedAt timestamp) out
133
+ // of every batch. Preserve each page's backend order and dedupe by runId in
134
+ // case a run changes status while the pages are fetched.
135
+ const projectedPages = pages.map((page) => page.data.map((run) => ({
136
+ runId: run.runId,
137
+ workflowName: run.workflowName,
138
+ status: run.status,
139
+ startedAt: run.startedAt,
140
+ })));
141
+ const merged = [];
142
+ const seenRunIds = new Set();
143
+ const maxPageLength = Math.max(0, ...projectedPages.map((page) => page.length));
144
+ for (let index = 0; index < maxPageLength; index++) {
145
+ for (const page of projectedPages) {
146
+ const run = page[index];
147
+ if (run && !seenRunIds.has(run.runId)) {
148
+ seenRunIds.add(run.runId);
149
+ merged.push(run);
150
+ }
151
+ }
152
+ }
153
+ const runs = {
154
+ data: merged.slice(0, limit),
155
+ hasMore: pages.some((page) => page.hasMore) || merged.length > limit,
156
+ };
157
+ if (runs.data.length === 0) {
158
+ logger.warn('No matching runs found.');
159
+ return { exitCode: 0 };
160
+ }
161
+ // Display what will be cancelled.
162
+ const table = new Table();
163
+ for (const run of runs.data) {
164
+ const shortName = parseWorkflowName(run.workflowName)?.shortName || run.workflowName;
165
+ table.cell('runId', run.runId);
166
+ table.cell('workflow', chalk.blueBright(shortName));
167
+ table.cell('status', run.status);
168
+ table.cell('startedAt', run.startedAt ? new Date(run.startedAt).toISOString() : '-');
169
+ table.newRow();
170
+ }
171
+ logger.log(`\nFound ${chalk.bold(runs.data.length)} runs to cancel:\n`);
172
+ logger.log(table.toString());
173
+ if (runs.hasMore) {
174
+ logger.warn(HAS_MORE_GUIDANCE);
175
+ }
176
+ // Confirm unless --confirm/-y.
177
+ if (!confirm) {
178
+ const confirmed = promptConfirm
179
+ ? await promptConfirm(`Cancel ${runs.data.length} run${runs.data.length === 1 ? '' : 's'}?`)
180
+ : false;
181
+ if (!confirmed) {
182
+ logger.log('Aborted.');
183
+ return { exitCode: 0 };
184
+ }
185
+ }
186
+ // One bulk operation: a single backend request on Vercel, or bounded
187
+ // fallback concurrency on local / community worlds.
188
+ const result = await cancelRuns(world, runs.data.map((run) => run.runId), { cancelReason: CLI_CANCEL_REASON });
189
+ for (const line of bulkCancelFailureLines(result)) {
190
+ logger.warn(line);
191
+ }
192
+ logger.log(`\n${formatBulkCancelSummary(result)}`);
193
+ // Already-cancelled and terminal runs are valid partial outcomes; only a
194
+ // genuine failure is a nonzero exit.
195
+ return { exitCode: result.summary.failed > 0 ? 1 : 0, result };
196
+ }
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay1jYW5jZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2J1bGstY2FuY2VsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQU0vRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUN2QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFDekMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsNEJBQTRCLENBQUM7QUFFOUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLFNBQVM7SUFDVCxTQUFTO0NBQ3NDLENBQUM7QUFFbEQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUM1QixnRkFBZ0Y7SUFDaEYsMkJBQTJCLENBQUM7QUFROUI7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEtBQWE7SUFDbkQsSUFDRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQ3hCLEtBQUssR0FBRyxxQkFBcUI7UUFDN0IsS0FBSyxHQUFHLHFCQUFxQixFQUM3QixDQUFDO1FBQ0QsT0FBTyxzQ0FBc0MscUJBQXFCLFFBQVEscUJBQXFCLEdBQUcsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxNQUFvQztJQUVwQyxNQUFNLEVBQUUsT0FB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SCxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLG9EQUFvRDtJQUNwRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FDN0IsS0FBSyxFQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQ2pDLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLENBQ3BDLENBQUM7SUFFRixLQUFLLE1BQU0sSUFBSSxJQUFJLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbEQsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUVuRCx5RUFBeUU7SUFDekUscUNBQXFDO0lBQ3JDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2FuY2VsUnVucyB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuaW1wb3J0IHsgcGFyc2VXb3JrZmxvd05hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHQsXG4gIFdvcmtmbG93UnVuU3RhdHVzLFxuICBXb3JsZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgVGFibGUgZnJvbSAnZWFzeS10YWJsZSc7XG5pbXBvcnQgeyBwbGFuV2luZG93U3RhcnRGcm9tUmVzcG9uc2UgfSBmcm9tICcuL2luc3BlY3QvdGltZS13aW5kb3cuanMnO1xuXG5leHBvcnQgY29uc3QgQlVMS19DQU5DRUxfTUlOX0xJTUlUID0gMTtcbmV4cG9ydCBjb25zdCBCVUxLX0NBTkNFTF9NQVhfTElNSVQgPSA1MDA7XG5leHBvcnQgY29uc3QgQ0xJX0NBTkNFTF9SRUFTT04gPSAnQ2FuY2VsbGVkIHZpYSBXb3JrZmxvdyBDTEknO1xuXG4vKipcbiAqIFN0YXR1c2VzIGEgcnVuIGNhbiBzdGlsbCBiZSBjYW5jZWxsZWQgZnJvbS4gV2hlbiB0aGUgY2FsbGVyIGRvZXNuJ3QgcGluIGFcbiAqIGAtLXN0YXR1c2AsIGJ1bGsgY2FuY2VsIHJlc3RyaWN0cyBtYXRjaGluZyB0byB0aGVzZSBzbyB0ZXJtaW5hbCBydW5zXG4gKiAoaW5jbHVkaW5nIHRoZSBvbmVzIGEgcHJpb3IgYmF0Y2gganVzdCBjYW5jZWxsZWQpIGRvbid0IGNyb3dkIG91dCByZWFjaGFibGVcbiAqIGFjdGl2ZSBydW5zLiBPdGhlcndpc2UsIGxpc3RpbmcgZXZlcnkgc3RhdHVzIHJldHVybnMgdGhlIHNhbWUgbmV3ZXN0XG4gKiB0ZXJtaW5hbCBwYWdlIG9uIGVhY2ggcmVydW4gYW5kIG9sZGVyIGFjdGl2ZSBydW5zIGFyZSBuZXZlciByZWFjaGVkLiBUaGVcbiAqIGxpc3QgQVBJIGZpbHRlcnMgYnkgYSBzaW5nbGUgc3RhdHVzLCBzbyB3ZSBmYW4gb3V0IGFjcm9zcyB0aGVzZSBhbmQgbWVyZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBDQU5DRUxMQUJMRV9TVEFUVVNFUyA9IFtcbiAgJ3BlbmRpbmcnLFxuICAncnVubmluZycsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSBXb3JrZmxvd1J1blN0YXR1c1tdO1xuXG4vKipcbiAqIEd1aWRhbmNlIHByaW50ZWQgd2hlbiBtb3JlIHJ1bnMgbWF0Y2ggdGhlIGZpbHRlcnMgdGhhbiB3ZXJlIGZldGNoZWQuIEJ1bGtcbiAqIGNhbmNlbCBpcyBkZWxpYmVyYXRlbHkgc2luZ2xlLWJhdGNoIGFuZCB1c2VyLXBhY2VkIOKAlCBubyBjdXJzb3JzIG9yIGFzeW5jXG4gKiBqb2JzIOKAlCBzbyB0aGUgdXNlciByZS1ydW5zIHRvIGNhbmNlbCB0aGUgbmV4dCBiYXRjaC5cbiAqL1xuZXhwb3J0IGNvbnN0IEhBU19NT1JFX0dVSURBTkNFID1cbiAgJ01vcmUgcnVucyBtYXRjaCB0aGVzZSBmaWx0ZXJzLiBSZS1ydW4gdGhpcyBjb21tYW5kIHRvIGNhbmNlbCB0aGUgbmV4dCBiYXRjaCxcXG4nICtcbiAgJ29yIHVzZSAtLWxpbWl0IHVwIHRvIDUwMC4nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbExvZ2dlciB7XG4gIGxvZyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuICB3YXJuKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhlIGAtLWxpbWl0YCBmbGFnLiBSZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiBpbnZhbGlkLCBvclxuICogYHVuZGVmaW5lZGAgd2hlbiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciB3aXRoaW4gWzEsIDUwMF0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdChsaW1pdDogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKFxuICAgICFOdW1iZXIuaXNJbnRlZ2VyKGxpbWl0KSB8fFxuICAgIGxpbWl0IDwgQlVMS19DQU5DRUxfTUlOX0xJTUlUIHx8XG4gICAgbGltaXQgPiBCVUxLX0NBTkNFTF9NQVhfTElNSVRcbiAgKSB7XG4gICAgcmV0dXJuIGAtLWxpbWl0IG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuICR7QlVMS19DQU5DRUxfTUlOX0xJTUlUfSBhbmQgJHtCVUxLX0NBTkNFTF9NQVhfTElNSVR9LmA7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgY29tcGFjdCBtdWx0aS1saW5lIFwiRG9uZTpcIiBzdW1tYXJ5IGJsb2NrLiBMaXN0cyBldmVyeSBvdXRjb21lXG4gKiBjYXRlZ29yeSBzbyB0aGUgY291bnRzIGFkZCB1cCB0byB0aGUgbnVtYmVyIG9mIHJ1bnMgcmVxdWVzdGVkOyBpbmRpdmlkdWFsXG4gKiBgbm90X2ZvdW5kYCwgYG5vdF9jYW5jZWxsYWJsZWAsIGFuZCBgZmFpbGVkYCBydW5zIGFyZSBhZGRpdGlvbmFsbHkgc3VyZmFjZWRcbiAqIHBlci1ydW4gdmlhIHtAbGluayBidWxrQ2FuY2VsRmFpbHVyZUxpbmVzfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEJ1bGtDYW5jZWxTdW1tYXJ5KFxuICByZXN1bHQ6IEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHRcbik6IHN0cmluZyB7XG4gIGNvbnN0IHsgc3VtbWFyeSB9ID0gcmVzdWx0O1xuICByZXR1cm4gW1xuICAgICdEb25lOicsXG4gICAgYCAgJHtzdW1tYXJ5LmNhbmNlbGxlZH0gY2FuY2VsbGVkYCxcbiAgICBgICAke3N1bW1hcnkuYWxyZWFkeUNhbmNlbGxlZH0gYWxyZWFkeSBjYW5jZWxsZWRgLFxuICAgIGAgICR7c3VtbWFyeS5ub3RDYW5jZWxsYWJsZX0gbm90IGNhbmNlbGxhYmxlYCxcbiAgICBgICAke3N1bW1hcnkubm90Rm91bmR9IG5vdCBmb3VuZGAsXG4gICAgYCAgJHtzdW1tYXJ5LmZhaWxlZH0gZmFpbGVkYCxcbiAgXS5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBQZXItcnVuIGxpbmVzIGZvciBvdXRjb21lcyB3b3J0aCBjYWxsaW5nIG91dCBpbmRpdmlkdWFsbHk6IGBub3RfZm91bmRgLFxuICogYG5vdF9jYW5jZWxsYWJsZWAsIGFuZCBgZmFpbGVkYC4gQ2FuY2VsbGVkIGFuZCBhbHJlYWR5LWNhbmNlbGxlZCBydW5zIGFyZVxuICogbGVmdCB0byB0aGUgc3VtbWFyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1bGtDYW5jZWxGYWlsdXJlTGluZXMoXG4gIHJlc3VsdDogQnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByIG9mIHJlc3VsdC5yZXN1bHRzKSB7XG4gICAgc3dpdGNoIChyLm91dGNvbWUpIHtcbiAgICAgIGNhc2UgJ25vdF9mb3VuZCc6XG4gICAgICAgIGxpbmVzLnB1c2goYCAg4pyXICR7ci5ydW5JZH06IG5vdCBmb3VuZGApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25vdF9jYW5jZWxsYWJsZSc6XG4gICAgICAgIGxpbmVzLnB1c2goYCAg4pyXICR7ci5ydW5JZH06IG5vdCBjYW5jZWxsYWJsZSAoJHtyLnN0YXR1c30pYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZmFpbGVkJzpcbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgICDinJcgJHtyLnJ1bklkfTogZmFpbGVkICgke3IuY29kZX0ke3IucmV0cnlhYmxlID8gJywgcmV0cnlhYmxlJyA6ICcnfSlgXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGluZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVsa0NhbmNlbFBhcmFtcyB7XG4gIHdvcmxkOiBXb3JsZDtcbiAgc3RhdHVzPzogV29ya2Zsb3dSdW5TdGF0dXM7XG4gIHdvcmtmbG93TmFtZT86IHN0cmluZztcbiAgLyoqIE1heCBydW5zIHRvIGZldGNoIGFuZCBjYW5jZWwgaW4gdGhpcyBiYXRjaCAoYWxyZWFkeSB2YWxpZGF0ZWQpLiAqL1xuICBsaW1pdDogbnVtYmVyO1xuICAvKiogV2hlbiB0cnVlLCBza2lwIHRoZSBpbnRlcmFjdGl2ZSBjb25maXJtYXRpb24gcHJvbXB0LiAqL1xuICBjb25maXJtOiBib29sZWFuO1xuICBsb2dnZXI6IENhbmNlbExvZ2dlcjtcbiAgLyoqXG4gICAqIENvbmZpcm1hdGlvbiBwcm9tcHQuIE9taXR0ZWQgaW4gbm9uLWludGVyYWN0aXZlIGNvbnRleHRzIChhbmQgdGVzdHMpLFxuICAgKiBpbiB3aGljaCBjYXNlIGFuIHVuY29uZmlybWVkIHJ1biBhYm9ydHMuXG4gICAqL1xuICBwcm9tcHRDb25maXJtPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWxrQ2FuY2VsT3V0Y29tZSB7XG4gIC8qKiBQcm9jZXNzIGV4aXQgY29kZTogMSB3aGVuIGFueSBydW4gZmFpbGVkLCBvdGhlcndpc2UgMC4gKi9cbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgLyoqIFRoZSBzdHJ1Y3R1cmVkIHJlc3VsdCwgb3IgdW5kZWZpbmVkIHdoZW4gbm90aGluZyBtYXRjaGVkIC8gYWJvcnRlZC4gKi9cbiAgcmVzdWx0PzogQnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBGZXRjaCBtYXRjaGluZyBydW5zICh1cCB0byBgbGltaXRgKSwgY29uZmlybSwgYW5kIGNhbmNlbCB0aGVtIGluIGEgc2luZ2xlXG4gKiBidWxrIG9wZXJhdGlvbi4gUHJpbnRzIGEgdGFibGUgb2Ygd2hhdCB3aWxsIGJlIGNhbmNlbGxlZCwgcmVydW4gZ3VpZGFuY2VcbiAqIHdoZW4gbW9yZSBydW5zIG1hdGNoIHRoYW4gd2VyZSBmZXRjaGVkLCBhIGNvbXBhY3Qgc3VtbWFyeSwgYW5kIHBlci1ydW5cbiAqIGxpbmVzIGZvciBzdXJmYWNlZCBmYWlsdXJlcy5cbiAqXG4gKiBEb2VzIG5vdCB0cmF2ZXJzZSBwYWdlczogZXhhY3RseSBvbmUgcGFnZSBvZiBhdCBtb3N0IGBsaW1pdGAgcnVucyBpc1xuICogY2FuY2VsbGVkIHBlciBpbnZvY2F0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGVyZm9ybUJ1bGtDYW5jZWwoXG4gIHBhcmFtczogQnVsa0NhbmNlbFBhcmFtc1xuKTogUHJvbWlzZTxCdWxrQ2FuY2VsT3V0Y29tZT4ge1xuICBjb25zdCB7IHdvcmxkLCBzdGF0dXMsIHdvcmtmbG93TmFtZSwgbGltaXQsIGNvbmZpcm0sIGxvZ2dlciwgcHJvbXB0Q29uZmlybSB9ID1cbiAgICBwYXJhbXM7XG5cbiAgLy8gRmV0Y2ggbWF0Y2hpbmcgcnVucy4gT25seSBtZXRhZGF0YSBpcyBuZWVkZWQgdG8gZGlzcGxheSBhbmQgY2FuY2VsLCBzb1xuICAvLyBwcmVmZXIgdGhlIGFuYWx5dGljcyByZWFkIHBhdGggd2hlbiB0aGUgYmFja2VuZCBwcm92aWRlcyBvbmUuXG4gIC8vXG4gIC8vIFdoZW4gdGhlIGNhbGxlciBwaW5zIGEgc3RhdHVzLCBtYXRjaCBleGFjdGx5IHRoYXQuIE90aGVyd2lzZSByZXN0cmljdCB0b1xuICAvLyB0aGUgY2FuY2VsbGFibGUgc3RhdHVzZXMgc28gcmVydW5uaW5nIG1ha2VzIHByb2dyZXNzIGluc3RlYWQgb2YgcmV0dXJuaW5nXG4gIC8vIHRoZSBzYW1lIHRlcm1pbmFsIHBhZ2UgZm9yZXZlci4gVGhlIGxpc3QgQVBJIHRha2VzIGEgc2luZ2xlIHN0YXR1cywgc29cbiAgLy8gZmFuIG91dCBhY3Jvc3MgdGhlIHRhcmdldCBzdGF0dXNlcyBhbmQgbWVyZ2UgdGhlIHBhZ2VzIGJlbG93LlxuICBjb25zdCBhbmFseXRpY3MgPSB3b3JsZC5hbmFseXRpY3M7XG4gIGNvbnN0IHRhcmdldFN0YXR1c2VzOiBXb3JrZmxvd1J1blN0YXR1c1tdID0gc3RhdHVzXG4gICAgPyBbc3RhdHVzXVxuICAgIDogWy4uLkNBTkNFTExBQkxFX1NUQVRVU0VTXTtcblxuICBjb25zdCBmZXRjaFBhZ2UgPSBhc3luYyAocGFnZVN0YXR1czogV29ya2Zsb3dSdW5TdGF0dXMpID0+IHtcbiAgICBpZiAoIWFuYWx5dGljcykge1xuICAgICAgcmV0dXJuIHdvcmxkLnJ1bnMubGlzdCh7XG4gICAgICAgIHN0YXR1czogcGFnZVN0YXR1cyxcbiAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICBwYWdpbmF0aW9uOiB7IGxpbWl0IH0sXG4gICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gVGhlIGFuYWx5dGljcyBiYWNrZW5kIGRlZmF1bHRzIGl0cyBsaXN0aW5nIHRvIGEgcmVjZW50IHdpbmRvd1xuICAgIC8vICh0cmFpbGluZyAyNGggb24gdGhlIFZlcmNlbCBiYWNrZW5kKSwgYnV0IGJ1bGsgY2FuY2VsIG11c3QgbWF0Y2hcbiAgICAvLyBhY3Jvc3MgdGhlIHBsYW4ncyB3aG9sZSBvYnNlcnZhYmlsaXR5IHdpbmRvdyDigJQgYSBydW4gY2FuIHNsZWVwIG9yXG4gICAgLy8gd2FpdCBvbiBhIGhvb2sgZm9yIGRheXMgd2l0aG91dCBlbWl0dGluZyByZWNlbnQgZXZlbnRzLiBQcm9iZSBmb3JcbiAgICAvLyB0aGUgcGxhbiB3aW5kb3cgYm91bmRzIGZpcnN0LCB0aGVuIG1hdGNoIGFjcm9zcyB0aGVtLlxuICAgIGNvbnN0IHByb2JlID0gYXdhaXQgYW5hbHl0aWNzLnJ1bnMubGlzdCh7XG4gICAgICBzdGF0dXM6IHBhZ2VTdGF0dXMsXG4gICAgICB3b3JrZmxvd05hbWUsXG4gICAgICBwYWdpbmF0aW9uOiB7IGxpbWl0OiAxIH0sXG4gICAgfSk7XG4gICAgY29uc3Qgd2luZG93U3RhcnQgPSBwbGFuV2luZG93U3RhcnRGcm9tUmVzcG9uc2UocHJvYmUpO1xuICAgIHJldHVybiBhbmFseXRpY3MucnVucy5saXN0KHtcbiAgICAgIHN0YXR1czogcGFnZVN0YXR1cyxcbiAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgIC4uLih3aW5kb3dTdGFydFxuICAgICAgICA/IHsgc3RhcnRUaW1lOiB3aW5kb3dTdGFydCwgZW5kVGltZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH1cbiAgICAgICAgOiB7fSksXG4gICAgICBwYWdpbmF0aW9uOiB7IGxpbWl0IH0sXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcGFnZXMgPSBhd2FpdCBQcm9taXNlLmFsbCh0YXJnZXRTdGF0dXNlcy5tYXAoZmV0Y2hQYWdlKSk7XG5cbiAgLy8gTWVyZ2UgdGhlIHBlci1zdGF0dXMgcGFnZXMgcm91bmQtcm9iaW4gc28gYSBmdWxsIHBhZ2Ugb2YgcnVubmluZyBydW5zXG4gIC8vIGNhbm5vdCBjcm93ZCBwZW5kaW5nIHJ1bnMgKHdoaWNoIGRvIG5vdCBoYXZlIGEgc3RhcnRlZEF0IHRpbWVzdGFtcCkgb3V0XG4gIC8vIG9mIGV2ZXJ5IGJhdGNoLiBQcmVzZXJ2ZSBlYWNoIHBhZ2UncyBiYWNrZW5kIG9yZGVyIGFuZCBkZWR1cGUgYnkgcnVuSWQgaW5cbiAgLy8gY2FzZSBhIHJ1biBjaGFuZ2VzIHN0YXR1cyB3aGlsZSB0aGUgcGFnZXMgYXJlIGZldGNoZWQuXG4gIGNvbnN0IHByb2plY3RlZFBhZ2VzID0gcGFnZXMubWFwKChwYWdlKSA9PlxuICAgIHBhZ2UuZGF0YS5tYXAoKHJ1bikgPT4gKHtcbiAgICAgIHJ1bklkOiBydW4ucnVuSWQsXG4gICAgICB3b3JrZmxvd05hbWU6IHJ1bi53b3JrZmxvd05hbWUsXG4gICAgICBzdGF0dXM6IHJ1bi5zdGF0dXMsXG4gICAgICBzdGFydGVkQXQ6IHJ1bi5zdGFydGVkQXQsXG4gICAgfSkpXG4gICk7XG4gIGNvbnN0IG1lcmdlZDogKHR5cGVvZiBwcm9qZWN0ZWRQYWdlcylbbnVtYmVyXVtudW1iZXJdW10gPSBbXTtcbiAgY29uc3Qgc2VlblJ1bklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBtYXhQYWdlTGVuZ3RoID0gTWF0aC5tYXgoXG4gICAgMCxcbiAgICAuLi5wcm9qZWN0ZWRQYWdlcy5tYXAoKHBhZ2UpID0+IHBhZ2UubGVuZ3RoKVxuICApO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbWF4UGFnZUxlbmd0aDsgaW5kZXgrKykge1xuICAgIGZvciAoY29uc3QgcGFnZSBvZiBwcm9qZWN0ZWRQYWdlcykge1xuICAgICAgY29uc3QgcnVuID0gcGFnZVtpbmRleF07XG4gICAgICBpZiAocnVuICYmICFzZWVuUnVuSWRzLmhhcyhydW4ucnVuSWQpKSB7XG4gICAgICAgIHNlZW5SdW5JZHMuYWRkKHJ1bi5ydW5JZCk7XG4gICAgICAgIG1lcmdlZC5wdXNoKHJ1bik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHJ1bnMgPSB7XG4gICAgZGF0YTogbWVyZ2VkLnNsaWNlKDAsIGxpbWl0KSxcbiAgICBoYXNNb3JlOiBwYWdlcy5zb21lKChwYWdlKSA9PiBwYWdlLmhhc01vcmUpIHx8IG1lcmdlZC5sZW5ndGggPiBsaW1pdCxcbiAgfTtcblxuICBpZiAocnVucy5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZ2dlci53YXJuKCdObyBtYXRjaGluZyBydW5zIGZvdW5kLicpO1xuICAgIHJldHVybiB7IGV4aXRDb2RlOiAwIH07XG4gIH1cblxuICAvLyBEaXNwbGF5IHdoYXQgd2lsbCBiZSBjYW5jZWxsZWQuXG4gIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlKCk7XG4gIGZvciAoY29uc3QgcnVuIG9mIHJ1bnMuZGF0YSkge1xuICAgIGNvbnN0IHNob3J0TmFtZSA9XG4gICAgICBwYXJzZVdvcmtmbG93TmFtZShydW4ud29ya2Zsb3dOYW1lKT8uc2hvcnROYW1lIHx8IHJ1bi53b3JrZmxvd05hbWU7XG4gICAgdGFibGUuY2VsbCgncnVuSWQnLCBydW4ucnVuSWQpO1xuICAgIHRhYmxlLmNlbGwoJ3dvcmtmbG93JywgY2hhbGsuYmx1ZUJyaWdodChzaG9ydE5hbWUpKTtcbiAgICB0YWJsZS5jZWxsKCdzdGF0dXMnLCBydW4uc3RhdHVzKTtcbiAgICB0YWJsZS5jZWxsKFxuICAgICAgJ3N0YXJ0ZWRBdCcsXG4gICAgICBydW4uc3RhcnRlZEF0ID8gbmV3IERhdGUocnVuLnN0YXJ0ZWRBdCkudG9JU09TdHJpbmcoKSA6ICctJ1xuICAgICk7XG4gICAgdGFibGUubmV3Um93KCk7XG4gIH1cbiAgbG9nZ2VyLmxvZyhgXFxuRm91bmQgJHtjaGFsay5ib2xkKHJ1bnMuZGF0YS5sZW5ndGgpfSBydW5zIHRvIGNhbmNlbDpcXG5gKTtcbiAgbG9nZ2VyLmxvZyh0YWJsZS50b1N0cmluZygpKTtcblxuICBpZiAocnVucy5oYXNNb3JlKSB7XG4gICAgbG9nZ2VyLndhcm4oSEFTX01PUkVfR1VJREFOQ0UpO1xuICB9XG5cbiAgLy8gQ29uZmlybSB1bmxlc3MgLS1jb25maXJtLy15LlxuICBpZiAoIWNvbmZpcm0pIHtcbiAgICBjb25zdCBjb25maXJtZWQgPSBwcm9tcHRDb25maXJtXG4gICAgICA/IGF3YWl0IHByb21wdENvbmZpcm0oXG4gICAgICAgICAgYENhbmNlbCAke3J1bnMuZGF0YS5sZW5ndGh9IHJ1biR7cnVucy5kYXRhLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfT9gXG4gICAgICAgIClcbiAgICAgIDogZmFsc2U7XG4gICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgIGxvZ2dlci5sb2coJ0Fib3J0ZWQuJyk7XG4gICAgICByZXR1cm4geyBleGl0Q29kZTogMCB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIE9uZSBidWxrIG9wZXJhdGlvbjogYSBzaW5nbGUgYmFja2VuZCByZXF1ZXN0IG9uIFZlcmNlbCwgb3IgYm91bmRlZFxuICAvLyBmYWxsYmFjayBjb25jdXJyZW5jeSBvbiBsb2NhbCAvIGNvbW11bml0eSB3b3JsZHMuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhbmNlbFJ1bnMoXG4gICAgd29ybGQsXG4gICAgcnVucy5kYXRhLm1hcCgocnVuKSA9PiBydW4ucnVuSWQpLFxuICAgIHsgY2FuY2VsUmVhc29uOiBDTElfQ0FOQ0VMX1JFQVNPTiB9XG4gICk7XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGJ1bGtDYW5jZWxGYWlsdXJlTGluZXMocmVzdWx0KSkge1xuICAgIGxvZ2dlci53YXJuKGxpbmUpO1xuICB9XG4gIGxvZ2dlci5sb2coYFxcbiR7Zm9ybWF0QnVsa0NhbmNlbFN1bW1hcnkocmVzdWx0KX1gKTtcblxuICAvLyBBbHJlYWR5LWNhbmNlbGxlZCBhbmQgdGVybWluYWwgcnVucyBhcmUgdmFsaWQgcGFydGlhbCBvdXRjb21lczsgb25seSBhXG4gIC8vIGdlbnVpbmUgZmFpbHVyZSBpcyBhIG5vbnplcm8gZXhpdC5cbiAgcmV0dXJuIHsgZXhpdENvZGU6IHJlc3VsdC5zdW1tYXJ5LmZhaWxlZCA+IDAgPyAxIDogMCwgcmVzdWx0IH07XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bulk-cancel.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-cancel.test.d.ts","sourceRoot":"","sources":["../../src/lib/bulk-cancel.test.ts"],"names":[],"mappings":""}