@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.
- package/dist/base.js +1 -1
- package/dist/commands/build.js +1 -1
- package/dist/commands/cancel.d.ts +1 -0
- package/dist/commands/cancel.d.ts.map +1 -1
- package/dist/commands/cancel.js +36 -55
- package/dist/commands/dev.js +1 -1
- package/dist/commands/health.d.ts +1 -3
- package/dist/commands/health.d.ts.map +1 -1
- package/dist/commands/health.js +26 -50
- package/dist/commands/init.js +1 -1
- package/dist/commands/inspect.d.ts +4 -0
- package/dist/commands/inspect.d.ts.map +1 -1
- package/dist/commands/inspect.js +37 -7
- package/dist/commands/start.d.ts +1 -0
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +8 -3
- package/dist/commands/transform.js +1 -1
- package/dist/commands/validate.js +1 -1
- package/dist/commands/web.d.ts +2 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +9 -3
- package/dist/lib/bulk-cancel.d.ts +74 -0
- package/dist/lib/bulk-cancel.d.ts.map +1 -0
- package/dist/lib/bulk-cancel.js +197 -0
- package/dist/lib/bulk-cancel.test.d.ts +2 -0
- package/dist/lib/bulk-cancel.test.d.ts.map +1 -0
- package/dist/lib/bulk-cancel.test.js +366 -0
- package/dist/lib/config/log.js +1 -1
- package/dist/lib/config/types.d.ts +6 -1
- package/dist/lib/config/types.d.ts.map +1 -1
- package/dist/lib/config/types.js +1 -1
- package/dist/lib/config/workflow-config.d.ts.map +1 -1
- package/dist/lib/config/workflow-config.js +2 -2
- package/dist/lib/inspect/auth.js +1 -1
- package/dist/lib/inspect/env.d.ts +1 -1
- package/dist/lib/inspect/env.js +2 -2
- package/dist/lib/inspect/errors.d.ts +3 -0
- package/dist/lib/inspect/errors.d.ts.map +1 -0
- package/dist/lib/inspect/errors.js +27 -0
- package/dist/lib/inspect/flags.d.ts +9 -0
- package/dist/lib/inspect/flags.d.ts.map +1 -1
- package/dist/lib/inspect/flags.js +23 -1
- package/dist/lib/inspect/hydration.d.ts +22 -0
- package/dist/lib/inspect/hydration.d.ts.map +1 -1
- package/dist/lib/inspect/hydration.js +107 -49
- package/dist/lib/inspect/hydration.test.d.ts +2 -0
- package/dist/lib/inspect/hydration.test.d.ts.map +1 -0
- package/dist/lib/inspect/hydration.test.js +23 -0
- package/dist/lib/inspect/output.d.ts +2 -2
- package/dist/lib/inspect/output.d.ts.map +1 -1
- package/dist/lib/inspect/output.js +327 -136
- package/dist/lib/inspect/output.test.js +663 -3
- package/dist/lib/inspect/pagination.d.ts +10 -1
- package/dist/lib/inspect/pagination.d.ts.map +1 -1
- package/dist/lib/inspect/pagination.js +20 -4
- package/dist/lib/inspect/run.d.ts.map +1 -1
- package/dist/lib/inspect/run.js +33 -10
- package/dist/lib/inspect/setup.d.ts.map +1 -1
- package/dist/lib/inspect/setup.js +42 -6
- package/dist/lib/inspect/stream.js +1 -1
- package/dist/lib/inspect/terminal-utils.js +1 -1
- package/dist/lib/inspect/time-window.d.ts +28 -0
- package/dist/lib/inspect/time-window.d.ts.map +1 -0
- package/dist/lib/inspect/time-window.js +61 -0
- package/dist/lib/inspect/time-window.test.d.ts +2 -0
- package/dist/lib/inspect/time-window.test.d.ts.map +1 -0
- package/dist/lib/inspect/time-window.test.js +58 -0
- package/dist/lib/inspect/vercel-api.d.ts +5 -2
- package/dist/lib/inspect/vercel-api.d.ts.map +1 -1
- package/dist/lib/inspect/vercel-api.js +12 -37
- package/dist/lib/inspect/vercel-api.test.d.ts +2 -0
- package/dist/lib/inspect/vercel-api.test.d.ts.map +1 -0
- package/dist/lib/inspect/vercel-api.test.js +21 -0
- package/dist/lib/inspect/vercel-link.js +1 -1
- package/dist/lib/inspect/web.d.ts +24 -0
- package/dist/lib/inspect/web.d.ts.map +1 -1
- package/dist/lib/inspect/web.js +122 -3
- package/dist/lib/update-check.js +1 -1
- package/package.json +15 -14
- package/dist/base.js.map +0 -1
- package/dist/commands/build.js.map +0 -1
- package/dist/commands/cancel.js.map +0 -1
- package/dist/commands/dev.js.map +0 -1
- package/dist/commands/health.js.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/inspect.js.map +0 -1
- package/dist/commands/start.js.map +0 -1
- package/dist/commands/transform.js.map +0 -1
- package/dist/commands/validate.js.map +0 -1
- package/dist/commands/web.js.map +0 -1
- package/dist/lib/config/log.js.map +0 -1
- package/dist/lib/config/types.js.map +0 -1
- package/dist/lib/config/workflow-config.js.map +0 -1
- package/dist/lib/inspect/auth.js.map +0 -1
- package/dist/lib/inspect/env.js.map +0 -1
- package/dist/lib/inspect/flags.js.map +0 -1
- package/dist/lib/inspect/hydration.js.map +0 -1
- package/dist/lib/inspect/output.js.map +0 -1
- package/dist/lib/inspect/output.test.js.map +0 -1
- package/dist/lib/inspect/pagination.js.map +0 -1
- package/dist/lib/inspect/run.js.map +0 -1
- package/dist/lib/inspect/setup.js.map +0 -1
- package/dist/lib/inspect/stream.js.map +0 -1
- package/dist/lib/inspect/terminal-utils.js.map +0 -1
- package/dist/lib/inspect/vercel-api.js.map +0 -1
- package/dist/lib/inspect/vercel-link.js.map +0 -1
- package/dist/lib/inspect/web.js.map +0 -1
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-cancel.test.d.ts","sourceRoot":"","sources":["../../src/lib/bulk-cancel.test.ts"],"names":[],"mappings":""}
|