@workflow/cli 5.0.0-beta.46 → 5.0.0-beta.48

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 (49) hide show
  1. package/dist/commands/cancel.d.ts +10 -1
  2. package/dist/commands/cancel.d.ts.map +1 -1
  3. package/dist/commands/cancel.js +20 -7
  4. package/dist/commands/inspect-flag-forwarding.test.d.ts +2 -0
  5. package/dist/commands/inspect-flag-forwarding.test.d.ts.map +1 -0
  6. package/dist/commands/inspect-flag-forwarding.test.js +121 -0
  7. package/dist/commands/inspect-flag-scope.test.d.ts +2 -0
  8. package/dist/commands/inspect-flag-scope.test.d.ts.map +1 -0
  9. package/dist/commands/inspect-flag-scope.test.js +161 -0
  10. package/dist/commands/inspect.d.ts +13 -1
  11. package/dist/commands/inspect.d.ts.map +1 -1
  12. package/dist/commands/inspect.js +70 -10
  13. package/dist/commands/start.d.ts +1 -1
  14. package/dist/commands/web.d.ts +1 -1
  15. package/dist/lib/bulk-cancel.d.ts +15 -2
  16. package/dist/lib/bulk-cancel.d.ts.map +1 -1
  17. package/dist/lib/bulk-cancel.js +49 -18
  18. package/dist/lib/bulk-cancel.test.js +80 -8
  19. package/dist/lib/config/types.d.ts +6 -1
  20. package/dist/lib/config/types.d.ts.map +1 -1
  21. package/dist/lib/config/types.js +1 -1
  22. package/dist/lib/inspect/attribute-filter.d.ts +15 -0
  23. package/dist/lib/inspect/attribute-filter.d.ts.map +1 -0
  24. package/dist/lib/inspect/attribute-filter.js +51 -0
  25. package/dist/lib/inspect/attribute-filter.test.d.ts +2 -0
  26. package/dist/lib/inspect/attribute-filter.test.d.ts.map +1 -0
  27. package/dist/lib/inspect/attribute-filter.test.js +65 -0
  28. package/dist/lib/inspect/errors.d.ts +28 -0
  29. package/dist/lib/inspect/errors.d.ts.map +1 -1
  30. package/dist/lib/inspect/errors.js +59 -1
  31. package/dist/lib/inspect/errors.test.d.ts +2 -0
  32. package/dist/lib/inspect/errors.test.d.ts.map +1 -0
  33. package/dist/lib/inspect/errors.test.js +48 -0
  34. package/dist/lib/inspect/flag-bounds.d.ts +57 -0
  35. package/dist/lib/inspect/flag-bounds.d.ts.map +1 -0
  36. package/dist/lib/inspect/flag-bounds.js +112 -0
  37. package/dist/lib/inspect/flag-bounds.test.d.ts +2 -0
  38. package/dist/lib/inspect/flag-bounds.test.d.ts.map +1 -0
  39. package/dist/lib/inspect/flag-bounds.test.js +126 -0
  40. package/dist/lib/inspect/flags.d.ts +1 -1
  41. package/dist/lib/inspect/flags.d.ts.map +1 -1
  42. package/dist/lib/inspect/flags.js +5 -2
  43. package/dist/lib/inspect/hydration.d.ts.map +1 -1
  44. package/dist/lib/inspect/hydration.js +2 -1
  45. package/dist/lib/inspect/output.d.ts +10 -0
  46. package/dist/lib/inspect/output.d.ts.map +1 -1
  47. package/dist/lib/inspect/output.js +138 -24
  48. package/dist/lib/inspect/output.test.js +223 -2
  49. package/package.json +13 -13
@@ -4,8 +4,9 @@ import { WorkflowRunStatusSchema } from '@workflow/world';
4
4
  import { BaseCommand } from '../base.js';
5
5
  import { LOGGING_CONFIG, logger } from '../lib/config/log.js';
6
6
  import { getObservabilityUpgradeRequiredMessage, isObservabilityUpgradeRequiredError, } from '../lib/inspect/errors.js';
7
+ import { validateInspectFlags } from '../lib/inspect/flag-bounds.js';
7
8
  import { cliFlags, urlFlag } from '../lib/inspect/flags.js';
8
- import { listEvents, listHooks, listRuns, listSleeps, listSteps, listStreamsByRunId, showHook, showRun, showStep, showStream, } from '../lib/inspect/output.js';
9
+ import { listAttributes, listEvents, listHooks, listRuns, listSleeps, listSteps, listStreamsByRunId, showHook, showRun, showStep, showStream, } from '../lib/inspect/output.js';
9
10
  import { setupCliWorld } from '../lib/inspect/setup.js';
10
11
  import { launchWebUI, printDeepLink } from '../lib/inspect/web.js';
11
12
  export default class Inspect extends BaseCommand {
@@ -13,7 +14,8 @@ export default class Inspect extends BaseCommand {
13
14
  static aliases = ['i'];
14
15
  static examples = [
15
16
  '$ workflow inspect runs',
16
- '$ workflow inspect runs',
17
+ '$ workflow inspect attributes',
18
+ '$ workflow inspect runs --attribute tenant=acme --status failed',
17
19
  '$ workflow inspect events --step=step_01K5WAJZ8W367CV2RFKDSDNWB8',
18
20
  '$ workflow inspect hooks',
19
21
  '$ workflow inspect hook hook_01K5WAJZ8W367CV2RFKDSDNWB8',
@@ -39,7 +41,7 @@ export default class Inspect extends BaseCommand {
39
41
  }
40
42
  static args = {
41
43
  resource: Args.string({
42
- description: 'what to inspect: run(s) | step(s) | stream(s) | event(s) | hook(s) | sleep(s)',
44
+ description: 'what to inspect: run(s) | step(s) | stream(s) | event(s) | hook(s) | sleep(s) | attribute(s)',
43
45
  required: true,
44
46
  options: [
45
47
  'r',
@@ -61,6 +63,10 @@ export default class Inspect extends BaseCommand {
61
63
  'web',
62
64
  'sleep',
63
65
  'sleeps',
66
+ 'a',
67
+ 'attr',
68
+ 'attribute',
69
+ 'attributes',
64
70
  ],
65
71
  }),
66
72
  id: Args.string({
@@ -95,8 +101,16 @@ export default class Inspect extends BaseCommand {
95
101
  helpLabel: '--hookId',
96
102
  helpValue: 'HOOK_ID',
97
103
  }),
104
+ attribute: Flags.string({
105
+ description: 'filter runs by attribute, as key=value; repeatable up to 8 times',
106
+ required: false,
107
+ multiple: true,
108
+ helpGroup: 'Filtering',
109
+ helpLabel: '--attribute',
110
+ helpValue: 'KEY=VALUE',
111
+ }),
98
112
  workflowName: Flags.string({
99
- description: 'workflow name to filter by (only for runs)',
113
+ description: 'workflow name to filter by (runs and attributes)',
100
114
  required: false,
101
115
  char: 'n',
102
116
  aliases: ['workflow'],
@@ -111,14 +125,14 @@ export default class Inspect extends BaseCommand {
111
125
  helpLabel: '--status',
112
126
  }),
113
127
  since: Flags.string({
114
- description: 'list runs active since a relative duration (30m, 12h, 7d, 2w) or timestamp; defaults to the backend window (only for runs)',
128
+ description: 'list items active since a relative duration (30m, 12h, 7d, 2w) or timestamp; defaults to the backend window (runs and attributes)',
115
129
  required: false,
116
130
  helpGroup: 'Filtering',
117
131
  helpLabel: '--since',
118
132
  helpValue: 'DURATION|TIMESTAMP',
119
133
  }),
120
134
  until: Flags.string({
121
- description: 'end of the --since listing window, as a relative duration or timestamp; defaults to now (only for runs)',
135
+ description: 'end of the --since listing window, as a relative duration or timestamp; defaults to now (runs and attributes)',
122
136
  required: false,
123
137
  helpGroup: 'Filtering',
124
138
  helpLabel: '--until',
@@ -147,11 +161,30 @@ export default class Inspect extends BaseCommand {
147
161
  const { args, flags } = await this.parse(Inspect);
148
162
  const resource = normalizeResource(args.resource);
149
163
  if (!resource) {
150
- this.logError(`Unknown resource "${args.resource}": must be one of: run(s), step(s), stream(s), event(s), hook(s), sleep(s)`);
164
+ this.logError(`Unknown resource "${args.resource}": must be one of: run(s), step(s), stream(s), event(s), hook(s), sleep(s), attribute(s)`);
151
165
  process.exitCode = 1;
152
166
  return;
153
167
  }
154
168
  const id = args.id;
169
+ // Bounds and `--attribute` parsing, both before any backend setup: a
170
+ // mistyped flag should name itself rather than surface as a rejected
171
+ // argument from the read path, and a malformed pair used to cost a
172
+ // full auth and project lookup before failing.
173
+ const bounded = validateInspectFlags({
174
+ resource,
175
+ hasId: id !== undefined,
176
+ limit: flags.limit,
177
+ runId: flags.runId,
178
+ attribute: flags.attribute,
179
+ opensWebUi: Boolean(flags.url) || Boolean(flags.web) || resource === 'web',
180
+ withData: flags.withData,
181
+ });
182
+ if ('error' in bounded) {
183
+ this.logError(bounded.error);
184
+ process.exitCode = 1;
185
+ return;
186
+ }
187
+ const { attributes } = bounded;
155
188
  // Print-only deep link: resolve config and emit the URL, no browser/server.
156
189
  if (flags.url) {
157
190
  const actualResource = resource === 'web' ? 'run' : resource;
@@ -172,7 +205,7 @@ export default class Inspect extends BaseCommand {
172
205
  throw new Error('Failed to connect to backend. Check your configuration.');
173
206
  }
174
207
  // Convert flags to InspectCLIOptions with proper typing
175
- const options = toInspectOptions(flags);
208
+ const options = toInspectOptions(flags, attributes);
176
209
  if (resource === 'run') {
177
210
  if (id) {
178
211
  await showRun(world, id, options);
@@ -232,6 +265,17 @@ export default class Inspect extends BaseCommand {
232
265
  await listSleeps(world, options);
233
266
  return;
234
267
  }
268
+ if (resource === 'attribute') {
269
+ if (id) {
270
+ // No per-key listing exists: the analytics namespace exposes the
271
+ // distinct keys, not the values recorded under one.
272
+ this.logError('inspect attribute does not take an ID. Usage: `workflow inspect attributes`');
273
+ process.exitCode = 1;
274
+ return;
275
+ }
276
+ await listAttributes(world, options);
277
+ return;
278
+ }
235
279
  this.logError(`Unknown resource: ${resource}. Usage: ${Inspect.examples.join('\n')}`);
236
280
  process.exitCode = 1;
237
281
  return;
@@ -242,15 +286,29 @@ export default class Inspect extends BaseCommand {
242
286
  }
243
287
  }
244
288
  }
245
- function toInspectOptions(flags) {
289
+ /**
290
+ * Project parsed flags onto the options the listings read.
291
+ *
292
+ * Every filtering flag must be copied through: a flag missing here parses,
293
+ * clears validation, and is then dropped silently, which reads as a
294
+ * successful unfiltered answer. `inspect-flag-forwarding.test.ts` pins the
295
+ * mapping, and checks it through `Inspect.run` as well as directly: a listing's
296
+ * own unit tests pass options in, so they cannot see a drop that happens here.
297
+ */
298
+ export function toInspectOptions(flags, attributes) {
246
299
  return {
247
300
  json: flags.json,
248
301
  runId: flags.runId,
249
302
  stepId: flags.stepId,
303
+ // Omitted here until now, so `--hookId` parsed, passed every check, and
304
+ // was dropped before any listing saw it: `inspect events --hookId` sent
305
+ // no correlationId and returned the run's whole event list.
306
+ hookId: flags.hookId,
250
307
  cursor: flags.cursor,
251
308
  sort: flags.sort,
252
309
  limit: flags.limit,
253
310
  workflowName: flags.workflowName,
311
+ attributes,
254
312
  status: flags.status
255
313
  ? WorkflowRunStatusSchema.parse(flags.status)
256
314
  : undefined,
@@ -266,6 +324,8 @@ function normalizeResource(value) {
266
324
  if (!value)
267
325
  return undefined;
268
326
  const v = value.toLowerCase();
327
+ if (v.startsWith('a'))
328
+ return 'attribute';
269
329
  if (v.startsWith('r'))
270
330
  return 'run';
271
331
  if (v.startsWith('e'))
@@ -282,4 +342,4 @@ function normalizeResource(value) {
282
342
  return 'web';
283
343
  return undefined;
284
344
  }
285
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9pbnNwZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5RCxPQUFPLEVBQ0wsc0NBQXNDLEVBQ3RDLG1DQUFtQyxHQUNwQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUNMLFVBQVUsRUFDVixTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLFFBQVEsRUFDUixPQUFPLEVBQ1AsUUFBUSxFQUNSLFVBQVUsR0FDWCxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRW5FLE1BQU0sQ0FBQyxPQUFPLE9BQU8sT0FBUSxTQUFRLFdBQVc7SUFDOUMsTUFBTSxDQUFDLFdBQVcsR0FBRyx5Q0FBeUMsQ0FBQztJQUUvRCxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFdkIsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQix5QkFBeUI7UUFDekIseUJBQXlCO1FBQ3pCLGtFQUFrRTtRQUNsRSwwQkFBMEI7UUFD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T0FBTyxLQUFLLENBQUM7SUFDcEMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ3RDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUN6QyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDdkMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3JDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUNyQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDcEMsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyZ3MsIEZsYWdzIH0gZnJvbSAnQG9jbGlmL2NvcmUnO1xuaW1wb3J0IHsgVkVSQ0VMXzQwM19FUlJPUl9NRVNTQUdFIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBXb3JrZmxvd1J1blN0YXR1c1NjaGVtYSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBCYXNlQ29tbWFuZCB9IGZyb20gJy4uL2Jhc2UuanMnO1xuaW1wb3J0IHsgTE9HR0lOR19DT05GSUcsIGxvZ2dlciB9IGZyb20gJy4uL2xpYi9jb25maWcvbG9nLmpzJztcbmltcG9ydCB0eXBlIHsgSW5zcGVjdENMSU9wdGlvbnMgfSBmcm9tICcuLi9saWIvY29uZmlnL3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIGdldE9ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRNZXNzYWdlLFxuICBpc09ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRFcnJvcixcbn0gZnJvbSAnLi4vbGliL2luc3BlY3QvZXJyb3JzLmpzJztcbmltcG9ydCB7IGNsaUZsYWdzLCB1cmxGbGFnIH0gZnJvbSAnLi4vbGliL2luc3BlY3QvZmxhZ3MuanMnO1xuaW1wb3J0IHtcbiAgbGlzdEV2ZW50cyxcbiAgbGlzdEhvb2tzLFxuICBsaXN0UnVucyxcbiAgbGlzdFNsZWVwcyxcbiAgbGlzdFN0ZXBzLFxuICBsaXN0U3RyZWFtc0J5UnVuSWQsXG4gIHNob3dIb29rLFxuICBzaG93UnVuLFxuICBzaG93U3RlcCxcbiAgc2hvd1N0cmVhbSxcbn0gZnJvbSAnLi4vbGliL2luc3BlY3Qvb3V0cHV0LmpzJztcbmltcG9ydCB7IHNldHVwQ2xpV29ybGQgfSBmcm9tICcuLi9saWIvaW5zcGVjdC9zZXR1cC5qcyc7XG5pbXBvcnQgeyBsYXVuY2hXZWJVSSwgcHJpbnREZWVwTGluayB9IGZyb20gJy4uL2xpYi9pbnNwZWN0L3dlYi5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEluc3BlY3QgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9ICdJbnNwZWN0IHJ1bnMsIHN0ZXBzLCBzdHJlYW1zLCBvciBldmVudHMnO1xuXG4gIHN0YXRpYyBhbGlhc2VzID0gWydpJ107XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgICckIHdvcmtmbG93IGluc3BlY3QgcnVucycsXG4gICAgJyQgd29ya2Zsb3cgaW5zcGVjdCBydW5zJyxcbiAgICAnJCB3b3JrZmxvdyBpbnNwZWN0IGV2ZW50cyAtLXN0ZXA9c3RlcF8wMUs1V0FKWjhXMzY3Q1YyUkZLRFNETldCOCcsXG4gICAgJyQgd29ya2Zsb3cgaW5zcGVjdCBob29rcycsXG4gICAgJyQgd29ya2Zsb3cgaW5zcGVjdCBob29rIGhvb2tfMDFLNVdBSlo4VzM2N0NWMlJGS0RTRE5XQjgnLFxuICAgICckIHdvcmtmbG93IGluc3BlY3Qgc2xlZXBzIC0tcnVuSWQ9cnVuXzAxSzVXQUpaOFczNjdDVjJSRktEU0ROV0I4JyxcbiAgXTtcblxuICBhc3luYyBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIDQwMyBlcnJvciBmcm9tIHRoZSBWZXJjZWwgYmFja2VuZFxuICAgIGlmIChpc09ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRFcnJvcihlcnJvcikpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihnZXRPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkTWVzc2FnZSgpKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yPy5zdGF0dXMgPT09IDQwMykge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IFZFUkNFTF80MDNfRVJST1JfTUVTU0FHRTtcbiAgICAgIGxvZ2dlci5lcnJvcihtZXNzYWdlKTtcbiAgICB9IGVsc2UgaWYgKExPR0dJTkdfQ09ORklHLlZFUkJPU0VfTU9ERSkge1xuICAgICAgbG9nZ2VyLmVycm9yKGVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3I/Lm1lc3NhZ2UgfHwgU3RyaW5nKGVycm9yKSB8fCAnVW5rbm93biBlcnJvcic7XG4gICAgICBsb2dnZXIuZXJyb3IoYEVycm9yOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgcmVzb3VyY2U6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnd2hhdCB0byBpbnNwZWN0OiBydW4ocykgfCBzdGVwKHMpIHwgc3RyZWFtKHMpIHwgZXZlbnQocykgfCBob29rKHMpIHwgc2xlZXAocyknLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICdyJyxcbiAgICAgICAgJ3J1bicsXG4gICAgICAgICdydW5zJyxcbiAgICAgICAgJ3MnLFxuICAgICAgICAnc3RlcCcsXG4gICAgICAgICdzdGVwcycsXG4gICAgICAgICdlJyxcbiAgICAgICAgJ2V2ZW50JyxcbiAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgICdzdCcsXG4gICAgICAgICdzdHJlYW0nLFxuICAgICAgICAnc3RyZWFtcycsXG4gICAgICAgICdoJyxcbiAgICAgICAgJ2hvb2snLFxuICAgICAgICAnaG9va3MnLFxuICAgICAgICAndycsXG4gICAgICAgICd3ZWInLFxuICAgICAgICAnc2xlZXAnLFxuICAgICAgICAnc2xlZXBzJyxcbiAgICAgIF0sXG4gICAgfSksXG4gICAgaWQ6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnSUQgb2YgdGhlIHJlc291cmNlIGlmIGluc3BlY3RpbmcgYSBzcGVjaWZpYyBpdGVtJyxcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICB9KSxcbiAgfSBhcyBjb25zdDtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgcnVuSWQ6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1J1biBJRCB0byBmaWx0ZXIgYnkgKHJlcXVpcmVkIGZvciBzdGVwcywgc2xlZXBzLCBhbmQgZXZlbnRzLiBPcHRpb25hbCBmb3IgaG9va3MuKScsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBjaGFyOiAncicsXG4gICAgICBhbGlhc2VzOiBbJ3J1biddLFxuICAgICAgaGVscEdyb3VwOiAnRmlsdGVyaW5nJyxcbiAgICAgIGhlbHBMYWJlbDogJy1yLCAtLXJ1bklkJyxcbiAgICAgIGhlbHBWYWx1ZTogJ1JVTl9JRCcsXG4gICAgfSksXG4gICAgc3RlcElkOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246ICdzdGVwIElEIHRvIGZpbHRlciBieSAob25seSBmb3IgZXZlbnRzKScsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBjaGFyOiAncycsXG4gICAgICBhbGlhc2VzOiBbJ3N0ZXAnXSxcbiAgICAgIGhlbHBHcm91cDogJ0ZpbHRlcmluZycsXG4gICAgICBoZWxwTGFiZWw6ICctcywgLS1zdGVwSWQnLFxuICAgICAgaGVscFZhbHVlOiAnU1RFUF9JRCcsXG4gICAgfSksXG4gICAgaG9va0lkOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246ICdob29rIElEIHRvIGZpbHRlciBieSAob25seSBmb3IgZXZlbnRzKScsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBhbGlhc2VzOiBbJ2hvb2snXSxcbiAgICAgIGhlbHBHcm91cDogJ0ZpbHRlcmluZycsXG4gICAgICBoZWxwTGFiZWw6ICctLWhvb2tJZCcsXG4gICAgICBoZWxwVmFsdWU6ICdIT09LX0lEJyxcbiAgICB9KSxcbiAgICB3b3JrZmxvd05hbWU6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogJ3dvcmtmbG93IG5hbWUgdG8gZmlsdGVyIGJ5IChvbmx5IGZvciBydW5zKScsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBjaGFyOiAnbicsXG4gICAgICBhbGlhc2VzOiBbJ3dvcmtmbG93J10sXG4gICAgICBoZWxwR3JvdXA6ICdGaWx0ZXJpbmcnLFxuICAgICAgaGVscExhYmVsOiAnLW4sIC0td29ya2Zsb3dOYW1lJyxcbiAgICB9KSxcbiAgICBzdGF0dXM6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogJ2ZpbHRlciBydW5zIGJ5IHN0YXR1cyAob25seSBmb3IgcnVucyknLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgb3B0aW9uczogWy4uLldvcmtmbG93UnVuU3RhdHVzU2NoZW1hLm9wdGlvbnNdLFxuICAgICAgaGVscEdyb3VwOiAnRmlsdGVyaW5nJyxcbiAgICAgIGhlbHBMYWJlbDogJy0tc3RhdHVzJyxcbiAgICB9KSxcbiAgICBzaW5jZTogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnbGlzdCBydW5zIGFjdGl2ZSBzaW5jZSBhIHJlbGF0aXZlIGR1cmF0aW9uICgzMG0sIDEyaCwgN2QsIDJ3KSBvciB0aW1lc3RhbXA7IGRlZmF1bHRzIHRvIHRoZSBiYWNrZW5kIHdpbmRvdyAob25seSBmb3IgcnVucyknLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgaGVscEdyb3VwOiAnRmlsdGVyaW5nJyxcbiAgICAgIGhlbHBMYWJlbDogJy0tc2luY2UnLFxuICAgICAgaGVscFZhbHVlOiAnRFVSQVRJT058VElNRVNUQU1QJyxcbiAgICB9KSxcbiAgICB1bnRpbDogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnZW5kIG9mIHRoZSAtLXNpbmNlIGxpc3Rpbmcgd2luZG93LCBhcyBhIHJlbGF0aXZlIGR1cmF0aW9uIG9yIHRpbWVzdGFtcDsgZGVmYXVsdHMgdG8gbm93IChvbmx5IGZvciBydW5zKScsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBoZWxwR3JvdXA6ICdGaWx0ZXJpbmcnLFxuICAgICAgaGVscExhYmVsOiAnLS11bnRpbCcsXG4gICAgICBoZWxwVmFsdWU6ICdEVVJBVElPTnxUSU1FU1RBTVAnLFxuICAgIH0pLFxuICAgIHdpdGhEYXRhOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnaW5jbHVkZSBmdWxsIGlucHV0L291dHB1dCBkYXRhIGluIGxpc3Qgdmlld3MgKGRlcHJlY2F0ZWQgZm9yIGxpc3Qgdmlld3Mg4oCUIHVzZSBgaW5zcGVjdCA8cmVzb3VyY2U+IDxpZD5gIHRvIHZpZXcgcGF5bG9hZHMpJyxcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIGNoYXI6ICdkJyxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgaGVscEdyb3VwOiAnRGlzcGxheScsXG4gICAgICBoZWxwTGFiZWw6ICctZCwgLS13aXRoRGF0YScsXG4gICAgfSksXG4gICAgZGVjcnlwdDogRmxhZ3MuYm9vbGVhbih7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ2RlY3J5cHQgZW5jcnlwdGVkIHZhbHVlcyAodHJpZ2dlcnMgYXVkaXQtbG9nZ2VkIGtleSByZXRyaWV2YWwpJyxcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgaGVscEdyb3VwOiAnRGlzcGxheScsXG4gICAgICBoZWxwTGFiZWw6ICctLWRlY3J5cHQnLFxuICAgIH0pLFxuICAgIC4uLmNsaUZsYWdzLFxuICAgIC4uLnVybEZsYWcsXG4gIH0gYXMgY29uc3Q7XG5cbiAgcHVibGljIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBhcmdzLCBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShJbnNwZWN0KTtcblxuICAgICAgY29uc3QgcmVzb3VyY2UgPSBub3JtYWxpemVSZXNvdXJjZShhcmdzLnJlc291cmNlKTtcbiAgICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgICAgdGhpcy5sb2dFcnJvcihcbiAgICAgICAgICBgVW5rbm93biByZXNvdXJjZSBcIiR7YXJncy5yZXNvdXJjZX1cIjogbXVzdCBiZSBvbmUgb2Y6IHJ1bihzKSwgc3RlcChzKSwgc3RyZWFtKHMpLCBldmVudChzKSwgaG9vayhzKSwgc2xlZXAocylgXG4gICAgICAgICk7XG4gICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlkID0gYXJncy5pZDtcblxuICAgICAgLy8gUHJpbnQtb25seSBkZWVwIGxpbms6IHJlc29sdmUgY29uZmlnIGFuZCBlbWl0IHRoZSBVUkwsIG5vIGJyb3dzZXIvc2VydmVyLlxuICAgICAgaWYgKGZsYWdzLnVybCkge1xuICAgICAgICBjb25zdCBhY3R1YWxSZXNvdXJjZSA9IHJlc291cmNlID09PSAnd2ViJyA/ICdydW4nIDogcmVzb3VyY2U7XG4gICAgICAgIGF3YWl0IHByaW50RGVlcExpbmsoYWN0dWFsUmVzb3VyY2UsIGlkLCBmbGFncywgdGhpcy5jb25maWcudmVyc2lvbik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIHdlYiBtb2RlLCBhbGxvdyBjb25maWcgZXJyb3JzIHNvIHdlIGNhbiBvcGVuIHRoZSB3ZWIgVUkgZm9yIGNvbmZpZ3VyYXRpb25cbiAgICAgIGNvbnN0IGlzV2ViTW9kZSA9IGZsYWdzLndlYiB8fCByZXNvdXJjZSA9PT0gJ3dlYic7XG4gICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHNldHVwQ2xpV29ybGQoZmxhZ3MsIHRoaXMuY29uZmlnLnZlcnNpb24sIGlzV2ViTW9kZSk7XG5cbiAgICAgIC8vIEhhbmRsZSB3ZWIgVUkgbW9kZVxuICAgICAgaWYgKGlzV2ViTW9kZSkge1xuICAgICAgICBjb25zdCBhY3R1YWxSZXNvdXJjZSA9IHJlc291cmNlID09PSAnd2ViJyA/ICdydW4nIDogcmVzb3VyY2U7XG4gICAgICAgIGF3YWl0IGxhdW5jaFdlYlVJKGFjdHVhbFJlc291cmNlLCBpZCwgZmxhZ3MsIHRoaXMuY29uZmlnLnZlcnNpb24pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBub24td2ViIGNvbW1hbmRzLCB3ZSBuZWVkIGEgdmFsaWQgd29ybGRcbiAgICAgIGlmICghd29ybGQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdGYWlsZWQgdG8gY29ubmVjdCB0byBiYWNrZW5kLiBDaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24uJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDb252ZXJ0IGZsYWdzIHRvIEluc3BlY3RDTElPcHRpb25zIHdpdGggcHJvcGVyIHR5cGluZ1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRvSW5zcGVjdE9wdGlvbnMoZmxhZ3MpO1xuXG4gICAgICBpZiAocmVzb3VyY2UgPT09ICdydW4nKSB7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgIGF3YWl0IHNob3dSdW4od29ybGQsIGlkLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBsaXN0UnVucyh3b3JsZCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzb3VyY2UgPT09ICdzdGVwJykge1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICBhd2FpdCBzaG93U3RlcCh3b3JsZCwgaWQsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGxpc3RTdGVwcyh3b3JsZCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzb3VyY2UgPT09ICdzdHJlYW0nKSB7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgIGF3YWl0IHNob3dTdHJlYW0od29ybGQsIGlkLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBsaXN0U3RyZWFtc0J5UnVuSWQod29ybGQsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc291cmNlID09PSAnZXZlbnQnKSB7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgIHRoaXMubG9nRXJyb3IoXG4gICAgICAgICAgICAnRXZlbnQtSUQgaXMgbm90IHN1cHBvcnRlZCBmb3IgZXZlbnRzLiBGaWx0ZXIgYnkgcnVuLWlkIG9yIHN0ZXAtaWQgaW5zdGVhZC4gVXNhZ2U6IGB3b3JrZmxvdyBpbnNwZWN0IGV2ZW50cyAtLXJ1bklkPTxpZD5gJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGxpc3RFdmVudHMod29ybGQsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvdXJjZSA9PT0gJ2hvb2snKSB7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgIGF3YWl0IHNob3dIb29rKHdvcmxkLCBpZCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgbGlzdEhvb2tzKHdvcmxkLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvdXJjZSA9PT0gJ3NsZWVwJykge1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICB0aGlzLmxvZ0Vycm9yKFxuICAgICAgICAgICAgJ1NsZWVwLUlEIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHNsZWVwcy4gRmlsdGVyIGJ5IHJ1bi1pZCBpbnN0ZWFkLiBVc2FnZTogYHdvcmtmbG93IGluc3BlY3Qgc2xlZXBzIC0tcnVuSWQ9PGlkPmAnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmbGFncy5ydW5JZCkge1xuICAgICAgICAgIHRoaXMubG9nRXJyb3IoXG4gICAgICAgICAgICAncnVuLWlkIGlzIHJlcXVpcmVkIGZvciBsaXN0aW5nIHNsZWVwcy4gVXNhZ2U6IGB3b3JrZmxvdyBpbnNwZWN0IHNsZWVwcyAtLXJ1bklkPTxpZD5gJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGxpc3RTbGVlcHMod29ybGQsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nRXJyb3IoXG4gICAgICAgIGBVbmtub3duIHJlc291cmNlOiAke3Jlc291cmNlfS4gVXNhZ2U6ICR7SW5zcGVjdC5leGFtcGxlcy5qb2luKCdcXG4nKX1gXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIExldCB0aGUgY2F0Y2ggaGFuZGxlciBkZWFsIHdpdGggaXQsIGJ1dCBlbnN1cmUgd2UgZXhpdFxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHRvSW5zcGVjdE9wdGlvbnMoZmxhZ3M6IGFueSk6IEluc3BlY3RDTElPcHRpb25zIHtcbiAgcmV0dXJuIHtcbiAgICBqc29uOiBmbGFncy5qc29uLFxuICAgIHJ1bklkOiBmbGFncy5ydW5JZCxcbiAgICBzdGVwSWQ6IGZsYWdzLnN0ZXBJZCxcbiAgICBjdXJzb3I6IGZsYWdzLmN1cnNvcixcbiAgICBzb3J0OiBmbGFncy5zb3J0IGFzICdhc2MnIHwgJ2Rlc2MnIHwgdW5kZWZpbmVkLFxuICAgIGxpbWl0OiBmbGFncy5saW1pdCxcbiAgICB3b3JrZmxvd05hbWU6IGZsYWdzLndvcmtmbG93TmFtZSxcbiAgICBzdGF0dXM6IGZsYWdzLnN0YXR1c1xuICAgICAgPyBXb3JrZmxvd1J1blN0YXR1c1NjaGVtYS5wYXJzZShmbGFncy5zdGF0dXMpXG4gICAgICA6IHVuZGVmaW5lZCxcbiAgICBzaW5jZTogZmxhZ3Muc2luY2UsXG4gICAgdW50aWw6IGZsYWdzLnVudGlsLFxuICAgIHdpdGhEYXRhOiBmbGFncy53aXRoRGF0YSxcbiAgICBkZWNyeXB0OiBmbGFncy5kZWNyeXB0LFxuICAgIGJhY2tlbmQ6IGZsYWdzLmJhY2tlbmQsXG4gICAgaW50ZXJhY3RpdmU6IGZsYWdzLmludGVyYWN0aXZlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXNvdXJjZShcbiAgdmFsdWU/OiBzdHJpbmdcbik6ICdydW4nIHwgJ3N0ZXAnIHwgJ3N0cmVhbScgfCAnZXZlbnQnIHwgJ2hvb2snIHwgJ3dlYicgfCAnc2xlZXAnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdiA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh2LnN0YXJ0c1dpdGgoJ3InKSkgcmV0dXJuICdydW4nO1xuICBpZiAodi5zdGFydHNXaXRoKCdlJykpIHJldHVybiAnZXZlbnQnO1xuICBpZiAodi5zdGFydHNXaXRoKCdzdHInKSkgcmV0dXJuICdzdHJlYW0nO1xuICBpZiAodi5zdGFydHNXaXRoKCdzbCcpKSByZXR1cm4gJ3NsZWVwJztcbiAgaWYgKHYuc3RhcnRzV2l0aCgncycpKSByZXR1cm4gJ3N0ZXAnO1xuICBpZiAodi5zdGFydHNXaXRoKCdoJykpIHJldHVybiAnaG9vayc7XG4gIGlmICh2LnN0YXJ0c1dpdGgoJ3cnKSkgcmV0dXJuICd3ZWInO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19
345
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9pbnNwZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5RCxPQUFPLEVBQ0wsc0NBQXNDLEVBQ3RDLG1DQUFtQyxHQUNwQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUNMLGNBQWMsRUFDZCxVQUFVLEVBQ1YsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsU0FBUyxFQUNULGtCQUFrQixFQUNsQixRQUFRLEVBQ1IsT0FBTyxFQUNQLFFBQVEsRUFDUixVQUFVLEdBQ1gsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRSxNQUFNLENBQUMsT0FBTyxPQUFPLE9BQVEsU0FBUSxXQUFXO0lBQzlDLE1BQU0sQ0FBQyxXQUFXLEdBQUcseUNBQXlDLENBQUM7SUFFL0QsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXZCLE1BQU0sQ0FBQyxRQUFRLEdBQUc7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QUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7UUFDbEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO1FBQ3hCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztRQUN0QixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87UUFDdEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO0tBQy9CLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FDeEIsS0FBYztJQVdkLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzlCLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUMxQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDcEMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ3RDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUN6QyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDdkMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3JDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUNyQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDcEMsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyZ3MsIEZsYWdzIH0gZnJvbSAnQG9jbGlmL2NvcmUnO1xuaW1wb3J0IHsgVkVSQ0VMXzQwM19FUlJPUl9NRVNTQUdFIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBXb3JrZmxvd1J1blN0YXR1c1NjaGVtYSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBCYXNlQ29tbWFuZCB9IGZyb20gJy4uL2Jhc2UuanMnO1xuaW1wb3J0IHsgTE9HR0lOR19DT05GSUcsIGxvZ2dlciB9IGZyb20gJy4uL2xpYi9jb25maWcvbG9nLmpzJztcbmltcG9ydCB0eXBlIHsgSW5zcGVjdENMSU9wdGlvbnMgfSBmcm9tICcuLi9saWIvY29uZmlnL3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIGdldE9ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRNZXNzYWdlLFxuICBpc09ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRFcnJvcixcbn0gZnJvbSAnLi4vbGliL2luc3BlY3QvZXJyb3JzLmpzJztcbmltcG9ydCB7IHZhbGlkYXRlSW5zcGVjdEZsYWdzIH0gZnJvbSAnLi4vbGliL2luc3BlY3QvZmxhZy1ib3VuZHMuanMnO1xuaW1wb3J0IHsgY2xpRmxhZ3MsIHVybEZsYWcgfSBmcm9tICcuLi9saWIvaW5zcGVjdC9mbGFncy5qcyc7XG5pbXBvcnQge1xuICBsaXN0QXR0cmlidXRlcyxcbiAgbGlzdEV2ZW50cyxcbiAgbGlzdEhvb2tzLFxuICBsaXN0UnVucyxcbiAgbGlzdFNsZWVwcyxcbiAgbGlzdFN0ZXBzLFxuICBsaXN0U3RyZWFtc0J5UnVuSWQsXG4gIHNob3dIb29rLFxuICBzaG93UnVuLFxuICBzaG93U3RlcCxcbiAgc2hvd1N0cmVhbSxcbn0gZnJvbSAnLi4vbGliL2luc3BlY3Qvb3V0cHV0LmpzJztcbmltcG9ydCB7IHNldHVwQ2xpV29ybGQgfSBmcm9tICcuLi9saWIvaW5zcGVjdC9zZXR1cC5qcyc7XG5pbXBvcnQgeyBsYXVuY2hXZWJVSSwgcHJpbnREZWVwTGluayB9IGZyb20gJy4uL2xpYi9pbnNwZWN0L3dlYi5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEluc3BlY3QgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9ICdJbnNwZWN0IHJ1bnMsIHN0ZXBzLCBzdHJlYW1zLCBvciBldmVudHMnO1xuXG4gIHN0YXRpYyBhbGlhc2VzID0gWydpJ107XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgICckIHdvcmtmbG93IGluc3BlY3QgcnVucycsXG4gICAgJyQgd29ya2Zsb3cgaW5zcGVjdCBhdHRyaWJ1dGVzJyxcbiAgICAnJCB3b3JrZmxvdyBpbnNwZWN0IHJ1bnMgLS1hdHRyaWJ1dGUgdGVuYW50PWFjbWUgLS1zdGF0dXMgZmFpbGVkJyxcbiAgICAnJCB3b3JrZmxvdyBpbnNwZWN0IGV2ZW50cyAtLXN0ZXA9c3RlcF8wMUs1V0FKWjhXMzY3Q1YyUkZLRFNETldCOCcsXG4gICAgJyQgd29ya2Zsb3cgaW5zcGVjdCBob29rcycsXG4gICAgJyQgd29ya2Zsb3cgaW5zcGVjdCBob29rIGhvb2tfMDFLNVdBSlo4VzM2N0NWMlJGS0RTRE5XQjgnLFxuICAgICckIHdvcmtmbG93IGluc3BlY3Qgc2xlZXBzIC0tcnVuSWQ9cnVuXzAxSzVXQUpaOFczNjdDVjJSRktEU0ROV0I4JyxcbiAgXTtcblxuICBhc3luYyBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIDQwMyBlcnJvciBmcm9tIHRoZSBWZXJjZWwgYmFja2VuZFxuICAgIGlmIChpc09ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRFcnJvcihlcnJvcikpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihnZXRPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkTWVzc2FnZSgpKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yPy5zdGF0dXMgPT09IDQwMykge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IFZFUkNFTF80MDNfRVJST1JfTUVTU0FHRTtcbiAgICAgIGxvZ2dlci5lcnJvcihtZXNzYWdlKTtcbiAgICB9IGVsc2UgaWYgKExPR0dJTkdfQ09ORklHLlZFUkJPU0VfTU9ERSkge1xuICAgICAgbG9nZ2VyLmVycm9yKGVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3I/Lm1lc3NhZ2UgfHwgU3RyaW5nKGVycm9yKSB8fCAnVW5rbm93biBlcnJvcic7XG4gICAgICBsb2dnZXIuZXJyb3IoYEVycm9yOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgcmVzb3VyY2U6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnd2hhdCB0byBpbnNwZWN0OiBydW4ocykgfCBzdGVwKHMpIHwgc3RyZWFtKHMpIHwgZXZlbnQocykgfCBob29rKHMpIHwgc2xlZXAocykgfCBhdHRyaWJ1dGUocyknLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICdyJyxcbiAgICAgICAgJ3J1bicsXG4gICAgICAgICdydW5zJyxcbiAgICAgICAgJ3MnLFxuICAgICAgICAnc3RlcCcsXG4gICAgICAgICdzdGVwcycsXG4gICAgICAgICdlJyxcbiAgICAgICAgJ2V2ZW50JyxcbiAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgICdzdCcsXG4gICAgICAgICdzdHJlYW0nLFxuICAgICAgICAnc3RyZWFtcycsXG4gICAgICAgICdoJyxcbiAgICAgICAgJ2hvb2snLFxuICAgICAgICAnaG9va3MnLFxuICAgICAgICAndycsXG4gICAgICAgICd3ZWInLFxuICAgICAgICAnc2xlZXAnLFxuICAgICAgICAnc2xlZXBzJyxcbiAgICAgICAgJ2EnLFxuICAgICAgICAnYXR0cicsXG4gICAgICAgICdhdHRyaWJ1dGUnLFxuICAgICAgICAnYXR0cmlidXRlcycsXG4gICAgICBdLFxuICAgIH0pLFxuICAgIGlkOiBBcmdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogJ0lEIG9mIHRoZSByZXNvdXJjZSBpZiBpbnNwZWN0aW5nIGEgc3BlY2lmaWMgaXRlbScsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgfSksXG4gIH0gYXMgY29uc3Q7XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIHJ1bklkOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdSdW4gSUQgdG8gZmlsdGVyIGJ5IChyZXF1aXJlZCBmb3Igc3RlcHMsIHNsZWVwcywgYW5kIGV2ZW50cy4gT3B0aW9uYWwgZm9yIGhvb2tzLiknLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgY2hhcjogJ3InLFxuICAgICAgYWxpYXNlczogWydydW4nXSxcbiAgICAgIGhlbHBHcm91cDogJ0ZpbHRlcmluZycsXG4gICAgICBoZWxwTGFiZWw6ICctciwgLS1ydW5JZCcsXG4gICAgICBoZWxwVmFsdWU6ICdSVU5fSUQnLFxuICAgIH0pLFxuICAgIHN0ZXBJZDogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnc3RlcCBJRCB0byBmaWx0ZXIgYnkgKG9ubHkgZm9yIGV2ZW50cyknLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgY2hhcjogJ3MnLFxuICAgICAgYWxpYXNlczogWydzdGVwJ10sXG4gICAgICBoZWxwR3JvdXA6ICdGaWx0ZXJpbmcnLFxuICAgICAgaGVscExhYmVsOiAnLXMsIC0tc3RlcElkJyxcbiAgICAgIGhlbHBWYWx1ZTogJ1NURVBfSUQnLFxuICAgIH0pLFxuICAgIGhvb2tJZDogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnaG9vayBJRCB0byBmaWx0ZXIgYnkgKG9ubHkgZm9yIGV2ZW50cyknLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgYWxpYXNlczogWydob29rJ10sXG4gICAgICBoZWxwR3JvdXA6ICdGaWx0ZXJpbmcnLFxuICAgICAgaGVscExhYmVsOiAnLS1ob29rSWQnLFxuICAgICAgaGVscFZhbHVlOiAnSE9PS19JRCcsXG4gICAgfSksXG4gICAgYXR0cmlidXRlOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdmaWx0ZXIgcnVucyBieSBhdHRyaWJ1dGUsIGFzIGtleT12YWx1ZTsgcmVwZWF0YWJsZSB1cCB0byA4IHRpbWVzJyxcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgaGVscEdyb3VwOiAnRmlsdGVyaW5nJyxcbiAgICAgIGhlbHBMYWJlbDogJy0tYXR0cmlidXRlJyxcbiAgICAgIGhlbHBWYWx1ZTogJ0tFWT1WQUxVRScsXG4gICAgfSksXG4gICAgd29ya2Zsb3dOYW1lOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246ICd3b3JrZmxvdyBuYW1lIHRvIGZpbHRlciBieSAocnVucyBhbmQgYXR0cmlidXRlcyknLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgY2hhcjogJ24nLFxuICAgICAgYWxpYXNlczogWyd3b3JrZmxvdyddLFxuICAgICAgaGVscEdyb3VwOiAnRmlsdGVyaW5nJyxcbiAgICAgIGhlbHBMYWJlbDogJy1uLCAtLXdvcmtmbG93TmFtZScsXG4gICAgfSksXG4gICAgc3RhdHVzOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246ICdmaWx0ZXIgcnVucyBieSBzdGF0dXMgKG9ubHkgZm9yIHJ1bnMpJyxcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IFsuLi5Xb3JrZmxvd1J1blN0YXR1c1NjaGVtYS5vcHRpb25zXSxcbiAgICAgIGhlbHBHcm91cDogJ0ZpbHRlcmluZycsXG4gICAgICBoZWxwTGFiZWw6ICctLXN0YXR1cycsXG4gICAgfSksXG4gICAgc2luY2U6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ2xpc3QgaXRlbXMgYWN0aXZlIHNpbmNlIGEgcmVsYXRpdmUgZHVyYXRpb24gKDMwbSwgMTJoLCA3ZCwgMncpIG9yIHRpbWVzdGFtcDsgZGVmYXVsdHMgdG8gdGhlIGJhY2tlbmQgd2luZG93IChydW5zIGFuZCBhdHRyaWJ1dGVzKScsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBoZWxwR3JvdXA6ICdGaWx0ZXJpbmcnLFxuICAgICAgaGVscExhYmVsOiAnLS1zaW5jZScsXG4gICAgICBoZWxwVmFsdWU6ICdEVVJBVElPTnxUSU1FU1RBTVAnLFxuICAgIH0pLFxuICAgIHVudGlsOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdlbmQgb2YgdGhlIC0tc2luY2UgbGlzdGluZyB3aW5kb3csIGFzIGEgcmVsYXRpdmUgZHVyYXRpb24gb3IgdGltZXN0YW1wOyBkZWZhdWx0cyB0byBub3cgKHJ1bnMgYW5kIGF0dHJpYnV0ZXMpJyxcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIGhlbHBHcm91cDogJ0ZpbHRlcmluZycsXG4gICAgICBoZWxwTGFiZWw6ICctLXVudGlsJyxcbiAgICAgIGhlbHBWYWx1ZTogJ0RVUkFUSU9OfFRJTUVTVEFNUCcsXG4gICAgfSksXG4gICAgd2l0aERhdGE6IEZsYWdzLmJvb2xlYW4oe1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdpbmNsdWRlIGZ1bGwgaW5wdXQvb3V0cHV0IGRhdGEgaW4gbGlzdCB2aWV3cyAoZGVwcmVjYXRlZCBmb3IgbGlzdCB2aWV3cyDigJQgdXNlIGBpbnNwZWN0IDxyZXNvdXJjZT4gPGlkPmAgdG8gdmlldyBwYXlsb2FkcyknLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgY2hhcjogJ2QnLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBoZWxwR3JvdXA6ICdEaXNwbGF5JyxcbiAgICAgIGhlbHBMYWJlbDogJy1kLCAtLXdpdGhEYXRhJyxcbiAgICB9KSxcbiAgICBkZWNyeXB0OiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnZGVjcnlwdCBlbmNyeXB0ZWQgdmFsdWVzICh0cmlnZ2VycyBhdWRpdC1sb2dnZWQga2V5IHJldHJpZXZhbCknLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICBoZWxwR3JvdXA6ICdEaXNwbGF5JyxcbiAgICAgIGhlbHBMYWJlbDogJy0tZGVjcnlwdCcsXG4gICAgfSksXG4gICAgLi4uY2xpRmxhZ3MsXG4gICAgLi4udXJsRmxhZyxcbiAgfSBhcyBjb25zdDtcblxuICBwdWJsaWMgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFyZ3MsIGZsYWdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKEluc3BlY3QpO1xuXG4gICAgICBjb25zdCByZXNvdXJjZSA9IG5vcm1hbGl6ZVJlc291cmNlKGFyZ3MucmVzb3VyY2UpO1xuICAgICAgaWYgKCFyZXNvdXJjZSkge1xuICAgICAgICB0aGlzLmxvZ0Vycm9yKFxuICAgICAgICAgIGBVbmtub3duIHJlc291cmNlIFwiJHthcmdzLnJlc291cmNlfVwiOiBtdXN0IGJlIG9uZSBvZjogcnVuKHMpLCBzdGVwKHMpLCBzdHJlYW0ocyksIGV2ZW50KHMpLCBob29rKHMpLCBzbGVlcChzKSwgYXR0cmlidXRlKHMpYFxuICAgICAgICApO1xuICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpZCA9IGFyZ3MuaWQ7XG5cbiAgICAgIC8vIEJvdW5kcyBhbmQgYC0tYXR0cmlidXRlYCBwYXJzaW5nLCBib3RoIGJlZm9yZSBhbnkgYmFja2VuZCBzZXR1cDogYVxuICAgICAgLy8gbWlzdHlwZWQgZmxhZyBzaG91bGQgbmFtZSBpdHNlbGYgcmF0aGVyIHRoYW4gc3VyZmFjZSBhcyBhIHJlamVjdGVkXG4gICAgICAvLyBhcmd1bWVudCBmcm9tIHRoZSByZWFkIHBhdGgsIGFuZCBhIG1hbGZvcm1lZCBwYWlyIHVzZWQgdG8gY29zdCBhXG4gICAgICAvLyBmdWxsIGF1dGggYW5kIHByb2plY3QgbG9va3VwIGJlZm9yZSBmYWlsaW5nLlxuICAgICAgY29uc3QgYm91bmRlZCA9IHZhbGlkYXRlSW5zcGVjdEZsYWdzKHtcbiAgICAgICAgcmVzb3VyY2UsXG4gICAgICAgIGhhc0lkOiBpZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICBsaW1pdDogZmxhZ3MubGltaXQsXG4gICAgICAgIHJ1bklkOiBmbGFncy5ydW5JZCxcbiAgICAgICAgYXR0cmlidXRlOiBmbGFncy5hdHRyaWJ1dGUsXG4gICAgICAgIG9wZW5zV2ViVWk6XG4gICAgICAgICAgQm9vbGVhbihmbGFncy51cmwpIHx8IEJvb2xlYW4oZmxhZ3Mud2ViKSB8fCByZXNvdXJjZSA9PT0gJ3dlYicsXG4gICAgICAgIHdpdGhEYXRhOiBmbGFncy53aXRoRGF0YSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCdlcnJvcicgaW4gYm91bmRlZCkge1xuICAgICAgICB0aGlzLmxvZ0Vycm9yKGJvdW5kZWQuZXJyb3IpO1xuICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBhdHRyaWJ1dGVzIH0gPSBib3VuZGVkO1xuXG4gICAgICAvLyBQcmludC1vbmx5IGRlZXAgbGluazogcmVzb2x2ZSBjb25maWcgYW5kIGVtaXQgdGhlIFVSTCwgbm8gYnJvd3Nlci9zZXJ2ZXIuXG4gICAgICBpZiAoZmxhZ3MudXJsKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbFJlc291cmNlID0gcmVzb3VyY2UgPT09ICd3ZWInID8gJ3J1bicgOiByZXNvdXJjZTtcbiAgICAgICAgYXdhaXQgcHJpbnREZWVwTGluayhhY3R1YWxSZXNvdXJjZSwgaWQsIGZsYWdzLCB0aGlzLmNvbmZpZy52ZXJzaW9uKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3Igd2ViIG1vZGUsIGFsbG93IGNvbmZpZyBlcnJvcnMgc28gd2UgY2FuIG9wZW4gdGhlIHdlYiBVSSBmb3IgY29uZmlndXJhdGlvblxuICAgICAgY29uc3QgaXNXZWJNb2RlID0gZmxhZ3Mud2ViIHx8IHJlc291cmNlID09PSAnd2ViJztcbiAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgc2V0dXBDbGlXb3JsZChmbGFncywgdGhpcy5jb25maWcudmVyc2lvbiwgaXNXZWJNb2RlKTtcblxuICAgICAgLy8gSGFuZGxlIHdlYiBVSSBtb2RlXG4gICAgICBpZiAoaXNXZWJNb2RlKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbFJlc291cmNlID0gcmVzb3VyY2UgPT09ICd3ZWInID8gJ3J1bicgOiByZXNvdXJjZTtcbiAgICAgICAgYXdhaXQgbGF1bmNoV2ViVUkoYWN0dWFsUmVzb3VyY2UsIGlkLCBmbGFncywgdGhpcy5jb25maWcudmVyc2lvbik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIG5vbi13ZWIgY29tbWFuZHMsIHdlIG5lZWQgYSB2YWxpZCB3b3JsZFxuICAgICAgaWYgKCF3b3JsZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0ZhaWxlZCB0byBjb25uZWN0IHRvIGJhY2tlbmQuIENoZWNrIHlvdXIgY29uZmlndXJhdGlvbi4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgZmxhZ3MgdG8gSW5zcGVjdENMSU9wdGlvbnMgd2l0aCBwcm9wZXIgdHlwaW5nXG4gICAgICBjb25zdCBvcHRpb25zID0gdG9JbnNwZWN0T3B0aW9ucyhmbGFncywgYXR0cmlidXRlcyk7XG5cbiAgICAgIGlmIChyZXNvdXJjZSA9PT0gJ3J1bicpIHtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgYXdhaXQgc2hvd1J1bih3b3JsZCwgaWQsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGxpc3RSdW5zKHdvcmxkLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvdXJjZSA9PT0gJ3N0ZXAnKSB7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgIGF3YWl0IHNob3dTdGVwKHdvcmxkLCBpZCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgbGlzdFN0ZXBzKHdvcmxkLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNvdXJjZSA9PT0gJ3N0cmVhbScpIHtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgYXdhaXQgc2hvd1N0cmVhbSh3b3JsZCwgaWQsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGxpc3RTdHJlYW1zQnlSdW5JZCh3b3JsZCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzb3VyY2UgPT09ICdldmVudCcpIHtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcihcbiAgICAgICAgICAgICdFdmVudC1JRCBpcyBub3Qgc3VwcG9ydGVkIGZvciBldmVudHMuIEZpbHRlciBieSBydW4taWQgb3Igc3RlcC1pZCBpbnN0ZWFkLiBVc2FnZTogYHdvcmtmbG93IGluc3BlY3QgZXZlbnRzIC0tcnVuSWQ9PGlkPmAnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgbGlzdEV2ZW50cyh3b3JsZCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc291cmNlID09PSAnaG9vaycpIHtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgYXdhaXQgc2hvd0hvb2sod29ybGQsIGlkLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBsaXN0SG9va3Mod29ybGQsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc291cmNlID09PSAnc2xlZXAnKSB7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgIHRoaXMubG9nRXJyb3IoXG4gICAgICAgICAgICAnU2xlZXAtSUQgaXMgbm90IHN1cHBvcnRlZCBmb3Igc2xlZXBzLiBGaWx0ZXIgYnkgcnVuLWlkIGluc3RlYWQuIFVzYWdlOiBgd29ya2Zsb3cgaW5zcGVjdCBzbGVlcHMgLS1ydW5JZD08aWQ+YCdcbiAgICAgICAgICApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZsYWdzLnJ1bklkKSB7XG4gICAgICAgICAgdGhpcy5sb2dFcnJvcihcbiAgICAgICAgICAgICdydW4taWQgaXMgcmVxdWlyZWQgZm9yIGxpc3Rpbmcgc2xlZXBzLiBVc2FnZTogYHdvcmtmbG93IGluc3BlY3Qgc2xlZXBzIC0tcnVuSWQ9PGlkPmAnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgbGlzdFNsZWVwcyh3b3JsZCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc291cmNlID09PSAnYXR0cmlidXRlJykge1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAvLyBObyBwZXIta2V5IGxpc3RpbmcgZXhpc3RzOiB0aGUgYW5hbHl0aWNzIG5hbWVzcGFjZSBleHBvc2VzIHRoZVxuICAgICAgICAgIC8vIGRpc3RpbmN0IGtleXMsIG5vdCB0aGUgdmFsdWVzIHJlY29yZGVkIHVuZGVyIG9uZS5cbiAgICAgICAgICB0aGlzLmxvZ0Vycm9yKFxuICAgICAgICAgICAgJ2luc3BlY3QgYXR0cmlidXRlIGRvZXMgbm90IHRha2UgYW4gSUQuIFVzYWdlOiBgd29ya2Zsb3cgaW5zcGVjdCBhdHRyaWJ1dGVzYCdcbiAgICAgICAgICApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBsaXN0QXR0cmlidXRlcyh3b3JsZCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2dFcnJvcihcbiAgICAgICAgYFVua25vd24gcmVzb3VyY2U6ICR7cmVzb3VyY2V9LiBVc2FnZTogJHtJbnNwZWN0LmV4YW1wbGVzLmpvaW4oJ1xcbicpfWBcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTGV0IHRoZSBjYXRjaCBoYW5kbGVyIGRlYWwgd2l0aCBpdCwgYnV0IGVuc3VyZSB3ZSBleGl0XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9qZWN0IHBhcnNlZCBmbGFncyBvbnRvIHRoZSBvcHRpb25zIHRoZSBsaXN0aW5ncyByZWFkLlxuICpcbiAqIEV2ZXJ5IGZpbHRlcmluZyBmbGFnIG11c3QgYmUgY29waWVkIHRocm91Z2g6IGEgZmxhZyBtaXNzaW5nIGhlcmUgcGFyc2VzLFxuICogY2xlYXJzIHZhbGlkYXRpb24sIGFuZCBpcyB0aGVuIGRyb3BwZWQgc2lsZW50bHksIHdoaWNoIHJlYWRzIGFzIGFcbiAqIHN1Y2Nlc3NmdWwgdW5maWx0ZXJlZCBhbnN3ZXIuIGBpbnNwZWN0LWZsYWctZm9yd2FyZGluZy50ZXN0LnRzYCBwaW5zIHRoZVxuICogbWFwcGluZywgYW5kIGNoZWNrcyBpdCB0aHJvdWdoIGBJbnNwZWN0LnJ1bmAgYXMgd2VsbCBhcyBkaXJlY3RseTogYSBsaXN0aW5nJ3NcbiAqIG93biB1bml0IHRlc3RzIHBhc3Mgb3B0aW9ucyBpbiwgc28gdGhleSBjYW5ub3Qgc2VlIGEgZHJvcCB0aGF0IGhhcHBlbnMgaGVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSW5zcGVjdE9wdGlvbnMoXG4gIGZsYWdzOiBhbnksXG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWRcbik6IEluc3BlY3RDTElPcHRpb25zIHtcbiAgcmV0dXJuIHtcbiAgICBqc29uOiBmbGFncy5qc29uLFxuICAgIHJ1bklkOiBmbGFncy5ydW5JZCxcbiAgICBzdGVwSWQ6IGZsYWdzLnN0ZXBJZCxcbiAgICAvLyBPbWl0dGVkIGhlcmUgdW50aWwgbm93LCBzbyBgLS1ob29rSWRgIHBhcnNlZCwgcGFzc2VkIGV2ZXJ5IGNoZWNrLCBhbmRcbiAgICAvLyB3YXMgZHJvcHBlZCBiZWZvcmUgYW55IGxpc3Rpbmcgc2F3IGl0OiBgaW5zcGVjdCBldmVudHMgLS1ob29rSWRgIHNlbnRcbiAgICAvLyBubyBjb3JyZWxhdGlvbklkIGFuZCByZXR1cm5lZCB0aGUgcnVuJ3Mgd2hvbGUgZXZlbnQgbGlzdC5cbiAgICBob29rSWQ6IGZsYWdzLmhvb2tJZCxcbiAgICBjdXJzb3I6IGZsYWdzLmN1cnNvcixcbiAgICBzb3J0OiBmbGFncy5zb3J0IGFzICdhc2MnIHwgJ2Rlc2MnIHwgdW5kZWZpbmVkLFxuICAgIGxpbWl0OiBmbGFncy5saW1pdCxcbiAgICB3b3JrZmxvd05hbWU6IGZsYWdzLndvcmtmbG93TmFtZSxcbiAgICBhdHRyaWJ1dGVzLFxuICAgIHN0YXR1czogZmxhZ3Muc3RhdHVzXG4gICAgICA/IFdvcmtmbG93UnVuU3RhdHVzU2NoZW1hLnBhcnNlKGZsYWdzLnN0YXR1cylcbiAgICAgIDogdW5kZWZpbmVkLFxuICAgIHNpbmNlOiBmbGFncy5zaW5jZSxcbiAgICB1bnRpbDogZmxhZ3MudW50aWwsXG4gICAgd2l0aERhdGE6IGZsYWdzLndpdGhEYXRhLFxuICAgIGRlY3J5cHQ6IGZsYWdzLmRlY3J5cHQsXG4gICAgYmFja2VuZDogZmxhZ3MuYmFja2VuZCxcbiAgICBpbnRlcmFjdGl2ZTogZmxhZ3MuaW50ZXJhY3RpdmUsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlc291cmNlKFxuICB2YWx1ZT86IHN0cmluZ1xuKTpcbiAgfCAncnVuJ1xuICB8ICdzdGVwJ1xuICB8ICdzdHJlYW0nXG4gIHwgJ2V2ZW50J1xuICB8ICdob29rJ1xuICB8ICd3ZWInXG4gIHwgJ3NsZWVwJ1xuICB8ICdhdHRyaWJ1dGUnXG4gIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdiA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh2LnN0YXJ0c1dpdGgoJ2EnKSkgcmV0dXJuICdhdHRyaWJ1dGUnO1xuICBpZiAodi5zdGFydHNXaXRoKCdyJykpIHJldHVybiAncnVuJztcbiAgaWYgKHYuc3RhcnRzV2l0aCgnZScpKSByZXR1cm4gJ2V2ZW50JztcbiAgaWYgKHYuc3RhcnRzV2l0aCgnc3RyJykpIHJldHVybiAnc3RyZWFtJztcbiAgaWYgKHYuc3RhcnRzV2l0aCgnc2wnKSkgcmV0dXJuICdzbGVlcCc7XG4gIGlmICh2LnN0YXJ0c1dpdGgoJ3MnKSkgcmV0dXJuICdzdGVwJztcbiAgaWYgKHYuc3RhcnRzV2l0aCgnaCcpKSByZXR1cm4gJ2hvb2snO1xuICBpZiAodi5zdGFydHNXaXRoKCd3JykpIHJldHVybiAnd2ViJztcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
@@ -22,7 +22,7 @@ export default class Start extends BaseCommand {
22
22
  noBrowser: import("@oclif/core/interfaces").BooleanFlag<boolean>;
23
23
  localUi: import("@oclif/core/interfaces").BooleanFlag<boolean>;
24
24
  standalone: import("@oclif/core/interfaces").BooleanFlag<boolean>;
25
- sort: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
25
+ sort: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
26
26
  limit: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
27
27
  interactive: import("@oclif/core/interfaces").BooleanFlag<boolean>;
28
28
  };
@@ -22,7 +22,7 @@ export default class Web extends BaseCommand {
22
22
  readonly noBrowser: import("@oclif/core/interfaces").BooleanFlag<boolean>;
23
23
  readonly localUi: import("@oclif/core/interfaces").BooleanFlag<boolean>;
24
24
  readonly standalone: import("@oclif/core/interfaces").BooleanFlag<boolean>;
25
- readonly sort: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
25
+ readonly sort: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
26
26
  readonly limit: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
27
27
  readonly interactive: import("@oclif/core/interfaces").BooleanFlag<boolean>;
28
28
  };
@@ -1,6 +1,18 @@
1
1
  import type { BulkCancelWorkflowRunsResult, WorkflowRunStatus, World } from '@workflow/world';
2
2
  export declare const BULK_CANCEL_MIN_LIMIT = 1;
3
- export declare const BULK_CANCEL_MAX_LIMIT = 500;
3
+ /**
4
+ * Upper bound on `--limit`.
5
+ *
6
+ * 100 is what both read paths accept: the analytics runs listing caps there
7
+ * and rejects more locally, and the storage listing it falls back to caps
8
+ * there server-side. This advertised 500 and no backend ever served it, so
9
+ * `--limit 200` failed however the command was routed.
10
+ *
11
+ * The bound is per status, and an unpinned `--status` fans out across
12
+ * {@link CANCELLABLE_STATUSES}, so a batch can still exceed it before the
13
+ * merged list is truncated to `limit`.
14
+ */
15
+ export declare const BULK_CANCEL_MAX_LIMIT = 100;
4
16
  export declare const CLI_CANCEL_REASON = "Cancelled via Workflow CLI";
5
17
  /**
6
18
  * Statuses a run can still be cancelled from. When the caller doesn't pin a
@@ -24,7 +36,8 @@ export interface CancelLogger {
24
36
  }
25
37
  /**
26
38
  * Validate the `--limit` flag. Returns an error message when invalid, or
27
- * `undefined` when the value is an integer within [1, 500].
39
+ * `undefined` when the value is an integer within
40
+ * [{@link BULK_CANCEL_MIN_LIMIT}, {@link BULK_CANCEL_MAX_LIMIT}].
28
41
  */
29
42
  export declare function validateBulkCancelLimit(limit: number): string | undefined;
30
43
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"bulk-cancel.d.ts","sourceRoot":"","sources":["../../src/lib/bulk-cancel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,4BAA4B,EAC5B,iBAAiB,EACjB,KAAK,EACN,MAAM,iBAAiB,CAAC;AAKzB,eAAO,MAAM,qBAAqB,IAAI,CAAC;AACvC,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,iBAAiB,+BAA+B,CAAC;AAE9D;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,iCAGgB,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,QAED,CAAC;AAE9B,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASzE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,4BAA4B,GACnC,MAAM,CAUR;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,4BAA4B,GACnC,MAAM,EAAE,CAkBV;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,4BAA4B,CAAC;CACvC;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAuI5B"}
1
+ {"version":3,"file":"bulk-cancel.d.ts","sourceRoot":"","sources":["../../src/lib/bulk-cancel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,4BAA4B,EAC5B,iBAAiB,EACjB,KAAK,EACN,MAAM,iBAAiB,CAAC;AAKzB,eAAO,MAAM,qBAAqB,IAAI,CAAC;AACvC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,iBAAiB,+BAA+B,CAAC;AAE9D;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,iCAGgB,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,QAEoB,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASzE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,4BAA4B,GACnC,MAAM,CAUR;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,4BAA4B,GACnC,MAAM,EAAE,CAkBV;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,4BAA4B,CAAC;CACvC;AA0BD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAuI5B"}
@@ -4,7 +4,19 @@ import chalk from 'chalk';
4
4
  import Table from 'easy-table';
5
5
  import { planWindowStartFromResponse } from './inspect/time-window.js';
6
6
  export const BULK_CANCEL_MIN_LIMIT = 1;
7
- export const BULK_CANCEL_MAX_LIMIT = 500;
7
+ /**
8
+ * Upper bound on `--limit`.
9
+ *
10
+ * 100 is what both read paths accept: the analytics runs listing caps there
11
+ * and rejects more locally, and the storage listing it falls back to caps
12
+ * there server-side. This advertised 500 and no backend ever served it, so
13
+ * `--limit 200` failed however the command was routed.
14
+ *
15
+ * The bound is per status, and an unpinned `--status` fans out across
16
+ * {@link CANCELLABLE_STATUSES}, so a batch can still exceed it before the
17
+ * merged list is truncated to `limit`.
18
+ */
19
+ export const BULK_CANCEL_MAX_LIMIT = 100;
8
20
  export const CLI_CANCEL_REASON = 'Cancelled via Workflow CLI';
9
21
  /**
10
22
  * Statuses a run can still be cancelled from. When the caller doesn't pin a
@@ -24,10 +36,11 @@ export const CANCELLABLE_STATUSES = [
24
36
  * jobs), so the user re-runs to cancel the next batch.
25
37
  */
26
38
  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.';
39
+ `or use --limit up to ${BULK_CANCEL_MAX_LIMIT}.`;
28
40
  /**
29
41
  * Validate the `--limit` flag. Returns an error message when invalid, or
30
- * `undefined` when the value is an integer within [1, 500].
42
+ * `undefined` when the value is an integer within
43
+ * [{@link BULK_CANCEL_MIN_LIMIT}, {@link BULK_CANCEL_MAX_LIMIT}].
31
44
  */
32
45
  export function validateBulkCancelLimit(limit) {
33
46
  if (!Number.isInteger(limit) ||
@@ -76,6 +89,25 @@ export function bulkCancelFailureLines(result) {
76
89
  }
77
90
  return lines;
78
91
  }
92
+ /**
93
+ * Resolve the plan's observability window from a one-row probe listing.
94
+ *
95
+ * Returns the `startTime`/`endTime` pair to bound subsequent listings with,
96
+ * or `undefined` when the backend reports no window (nothing to widen to).
97
+ * The probe needs a status because the list API takes one, but the window it
98
+ * reads back is plan-wide, so any status will do.
99
+ */
100
+ async function resolvePlanWindow(analytics, probeStatus, workflowName) {
101
+ const probe = await analytics.runs.list({
102
+ status: probeStatus,
103
+ workflowName,
104
+ pagination: { limit: 1 },
105
+ });
106
+ const startTime = planWindowStartFromResponse(probe);
107
+ return startTime
108
+ ? { startTime, endTime: new Date().toISOString() }
109
+ : undefined;
110
+ }
79
111
  /**
80
112
  * Fetch matching runs (up to `limit`), confirm, and cancel them in a single
81
113
  * bulk operation. Prints a table of what will be cancelled, rerun guidance
@@ -98,6 +130,18 @@ export async function performBulkCancel(params) {
98
130
  const targetStatuses = status
99
131
  ? [status]
100
132
  : [...CANCELLABLE_STATUSES];
133
+ // The analytics backend defaults its listing to a recent window (trailing
134
+ // 24h on the Vercel backend), but bulk cancel must match across the plan's
135
+ // whole observability window: a run can sleep or wait on a hook for days
136
+ // without emitting recent events. Probe once for the window bounds, then
137
+ // match across them.
138
+ //
139
+ // The window is a property of the plan, not of a run's status, so the probe
140
+ // is hoisted above the per-status fan-out. Running it inside meant a
141
+ // four-status cancel issued four identical probes.
142
+ const listingWindow = analytics
143
+ ? await resolvePlanWindow(analytics, targetStatuses[0], workflowName)
144
+ : undefined;
101
145
  const fetchPage = async (pageStatus) => {
102
146
  if (!analytics) {
103
147
  return world.runs.list({
@@ -107,23 +151,10 @@ export async function performBulkCancel(params) {
107
151
  resolveData: 'none',
108
152
  });
109
153
  }
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
154
  return analytics.runs.list({
122
155
  status: pageStatus,
123
156
  workflowName,
124
- ...(windowStart
125
- ? { startTime: windowStart, endTime: new Date().toISOString() }
126
- : {}),
157
+ ...(listingWindow ?? {}),
127
158
  pagination: { limit },
128
159
  });
129
160
  };
@@ -194,4 +225,4 @@ export async function performBulkCancel(params) {
194
225
  // genuine failure is a nonzero exit.
195
226
  return { exitCode: result.summary.failed > 0 ? 1 : 0, result };
196
227
  }
197
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay1jYW5jZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2J1bGstY2FuY2VsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQU0vRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUN2QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFDekMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsNEJBQTRCLENBQUM7QUFFOUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLFNBQVM7SUFDVCxTQUFTO0NBQ3NDLENBQUM7QUFFbEQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUM1QixnRkFBZ0Y7SUFDaEYsMkJBQTJCLENBQUM7QUFROUI7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEtBQWE7SUFDbkQsSUFDRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQ3hCLEtBQUssR0FBRyxxQkFBcUI7UUFDN0IsS0FBSyxHQUFHLHFCQUFxQixFQUM3QixDQUFDO1FBQ0QsT0FBTyxzQ0FBc0MscUJBQXFCLFFBQVEscUJBQXFCLEdBQUcsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxNQUFvQztJQUVwQyxNQUFNLEVBQUUsT0FB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SCxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLG9EQUFvRDtJQUNwRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FDN0IsS0FBSyxFQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQ2pDLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLENBQ3BDLENBQUM7SUFFRixLQUFLLE1BQU0sSUFBSSxJQUFJLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbEQsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUVuRCx5RUFBeUU7SUFDekUscUNBQXFDO0lBQ3JDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2FuY2VsUnVucyB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuaW1wb3J0IHsgcGFyc2VXb3JrZmxvd05hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHQsXG4gIFdvcmtmbG93UnVuU3RhdHVzLFxuICBXb3JsZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgVGFibGUgZnJvbSAnZWFzeS10YWJsZSc7XG5pbXBvcnQgeyBwbGFuV2luZG93U3RhcnRGcm9tUmVzcG9uc2UgfSBmcm9tICcuL2luc3BlY3QvdGltZS13aW5kb3cuanMnO1xuXG5leHBvcnQgY29uc3QgQlVMS19DQU5DRUxfTUlOX0xJTUlUID0gMTtcbmV4cG9ydCBjb25zdCBCVUxLX0NBTkNFTF9NQVhfTElNSVQgPSA1MDA7XG5leHBvcnQgY29uc3QgQ0xJX0NBTkNFTF9SRUFTT04gPSAnQ2FuY2VsbGVkIHZpYSBXb3JrZmxvdyBDTEknO1xuXG4vKipcbiAqIFN0YXR1c2VzIGEgcnVuIGNhbiBzdGlsbCBiZSBjYW5jZWxsZWQgZnJvbS4gV2hlbiB0aGUgY2FsbGVyIGRvZXNuJ3QgcGluIGFcbiAqIGAtLXN0YXR1c2AsIGJ1bGsgY2FuY2VsIHJlc3RyaWN0cyBtYXRjaGluZyB0byB0aGVzZSBzbyB0ZXJtaW5hbCBydW5zXG4gKiAoaW5jbHVkaW5nIHRoZSBvbmVzIGEgcHJpb3IgYmF0Y2gganVzdCBjYW5jZWxsZWQpIGRvbid0IGNyb3dkIG91dCByZWFjaGFibGVcbiAqIGFjdGl2ZSBydW5zLiBPdGhlcndpc2UsIGxpc3RpbmcgZXZlcnkgc3RhdHVzIHJldHVybnMgdGhlIHNhbWUgbmV3ZXN0XG4gKiB0ZXJtaW5hbCBwYWdlIG9uIGVhY2ggcmVydW4gYW5kIG9sZGVyIGFjdGl2ZSBydW5zIGFyZSBuZXZlciByZWFjaGVkLiBUaGVcbiAqIGxpc3QgQVBJIGZpbHRlcnMgYnkgYSBzaW5nbGUgc3RhdHVzLCBzbyB3ZSBmYW4gb3V0IGFjcm9zcyB0aGVzZSBhbmQgbWVyZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBDQU5DRUxMQUJMRV9TVEFUVVNFUyA9IFtcbiAgJ3BlbmRpbmcnLFxuICAncnVubmluZycsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSBXb3JrZmxvd1J1blN0YXR1c1tdO1xuXG4vKipcbiAqIEd1aWRhbmNlIHByaW50ZWQgd2hlbiBtb3JlIHJ1bnMgbWF0Y2ggdGhlIGZpbHRlcnMgdGhhbiB3ZXJlIGZldGNoZWQuIEJ1bGtcbiAqIGNhbmNlbCBpcyBkZWxpYmVyYXRlbHkgc2luZ2xlLWJhdGNoIGFuZCB1c2VyLXBhY2VkIChubyBjdXJzb3JzIG9yIGFzeW5jXG4gKiBqb2JzKSwgc28gdGhlIHVzZXIgcmUtcnVucyB0byBjYW5jZWwgdGhlIG5leHQgYmF0Y2guXG4gKi9cbmV4cG9ydCBjb25zdCBIQVNfTU9SRV9HVUlEQU5DRSA9XG4gICdNb3JlIHJ1bnMgbWF0Y2ggdGhlc2UgZmlsdGVycy4gUmUtcnVuIHRoaXMgY29tbWFuZCB0byBjYW5jZWwgdGhlIG5leHQgYmF0Y2gsXFxuJyArXG4gICdvciB1c2UgLS1saW1pdCB1cCB0byA1MDAuJztcblxuZXhwb3J0IGludGVyZmFjZSBDYW5jZWxMb2dnZXIge1xuICBsb2cobWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbiAgd2FybihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoZSBgLS1saW1pdGAgZmxhZy4gUmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIHdoZW4gaW52YWxpZCwgb3JcbiAqIGB1bmRlZmluZWRgIHdoZW4gdGhlIHZhbHVlIGlzIGFuIGludGVnZXIgd2l0aGluIFsxLCA1MDBdLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQobGltaXQ6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChcbiAgICAhTnVtYmVyLmlzSW50ZWdlcihsaW1pdCkgfHxcbiAgICBsaW1pdCA8IEJVTEtfQ0FOQ0VMX01JTl9MSU1JVCB8fFxuICAgIGxpbWl0ID4gQlVMS19DQU5DRUxfTUFYX0xJTUlUXG4gICkge1xuICAgIHJldHVybiBgLS1saW1pdCBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAke0JVTEtfQ0FOQ0VMX01JTl9MSU1JVH0gYW5kICR7QlVMS19DQU5DRUxfTUFYX0xJTUlUfS5gO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGNvbXBhY3QgbXVsdGktbGluZSBcIkRvbmU6XCIgc3VtbWFyeSBibG9jay4gTGlzdHMgZXZlcnkgb3V0Y29tZVxuICogY2F0ZWdvcnkgc28gdGhlIGNvdW50cyBhZGQgdXAgdG8gdGhlIG51bWJlciBvZiBydW5zIHJlcXVlc3RlZDsgaW5kaXZpZHVhbFxuICogYG5vdF9mb3VuZGAsIGBub3RfY2FuY2VsbGFibGVgLCBhbmQgYGZhaWxlZGAgcnVucyBhcmUgYWRkaXRpb25hbGx5IHN1cmZhY2VkXG4gKiBwZXItcnVuIHZpYSB7QGxpbmsgYnVsa0NhbmNlbEZhaWx1cmVMaW5lc30uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCdWxrQ2FuY2VsU3VtbWFyeShcbiAgcmVzdWx0OiBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVzdWx0XG4pOiBzdHJpbmcge1xuICBjb25zdCB7IHN1bW1hcnkgfSA9IHJlc3VsdDtcbiAgcmV0dXJuIFtcbiAgICAnRG9uZTonLFxuICAgIGAgICR7c3VtbWFyeS5jYW5jZWxsZWR9IGNhbmNlbGxlZGAsXG4gICAgYCAgJHtzdW1tYXJ5LmFscmVhZHlDYW5jZWxsZWR9IGFscmVhZHkgY2FuY2VsbGVkYCxcbiAgICBgICAke3N1bW1hcnkubm90Q2FuY2VsbGFibGV9IG5vdCBjYW5jZWxsYWJsZWAsXG4gICAgYCAgJHtzdW1tYXJ5Lm5vdEZvdW5kfSBub3QgZm91bmRgLFxuICAgIGAgICR7c3VtbWFyeS5mYWlsZWR9IGZhaWxlZGAsXG4gIF0uam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogUGVyLXJ1biBsaW5lcyBmb3Igb3V0Y29tZXMgd29ydGggY2FsbGluZyBvdXQgaW5kaXZpZHVhbGx5OiBgbm90X2ZvdW5kYCxcbiAqIGBub3RfY2FuY2VsbGFibGVgLCBhbmQgYGZhaWxlZGAuIENhbmNlbGxlZCBhbmQgYWxyZWFkeS1jYW5jZWxsZWQgcnVucyBhcmVcbiAqIGxlZnQgdG8gdGhlIHN1bW1hcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWxrQ2FuY2VsRmFpbHVyZUxpbmVzKFxuICByZXN1bHQ6IEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHRcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgciBvZiByZXN1bHQucmVzdWx0cykge1xuICAgIHN3aXRjaCAoci5vdXRjb21lKSB7XG4gICAgICBjYXNlICdub3RfZm91bmQnOlxuICAgICAgICBsaW5lcy5wdXNoKGAgIOKclyAke3IucnVuSWR9OiBub3QgZm91bmRgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdub3RfY2FuY2VsbGFibGUnOlxuICAgICAgICBsaW5lcy5wdXNoKGAgIOKclyAke3IucnVuSWR9OiBub3QgY2FuY2VsbGFibGUgKCR7ci5zdGF0dXN9KWApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZhaWxlZCc6XG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYCAg4pyXICR7ci5ydW5JZH06IGZhaWxlZCAoJHtyLmNvZGV9JHtyLnJldHJ5YWJsZSA/ICcsIHJldHJ5YWJsZScgOiAnJ30pYFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1bGtDYW5jZWxQYXJhbXMge1xuICB3b3JsZDogV29ybGQ7XG4gIHN0YXR1cz86IFdvcmtmbG93UnVuU3RhdHVzO1xuICB3b3JrZmxvd05hbWU/OiBzdHJpbmc7XG4gIC8qKiBNYXggcnVucyB0byBmZXRjaCBhbmQgY2FuY2VsIGluIHRoaXMgYmF0Y2ggKGFscmVhZHkgdmFsaWRhdGVkKS4gKi9cbiAgbGltaXQ6IG51bWJlcjtcbiAgLyoqIFdoZW4gdHJ1ZSwgc2tpcCB0aGUgaW50ZXJhY3RpdmUgY29uZmlybWF0aW9uIHByb21wdC4gKi9cbiAgY29uZmlybTogYm9vbGVhbjtcbiAgbG9nZ2VyOiBDYW5jZWxMb2dnZXI7XG4gIC8qKlxuICAgKiBDb25maXJtYXRpb24gcHJvbXB0LiBPbWl0dGVkIGluIG5vbi1pbnRlcmFjdGl2ZSBjb250ZXh0cyAoYW5kIHRlc3RzKSxcbiAgICogaW4gd2hpY2ggY2FzZSBhbiB1bmNvbmZpcm1lZCBydW4gYWJvcnRzLlxuICAgKi9cbiAgcHJvbXB0Q29uZmlybT86IChtZXNzYWdlOiBzdHJpbmcpID0+IFByb21pc2U8Ym9vbGVhbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVsa0NhbmNlbE91dGNvbWUge1xuICAvKiogUHJvY2VzcyBleGl0IGNvZGU6IDEgd2hlbiBhbnkgcnVuIGZhaWxlZCwgb3RoZXJ3aXNlIDAuICovXG4gIGV4aXRDb2RlOiBudW1iZXI7XG4gIC8qKiBUaGUgc3RydWN0dXJlZCByZXN1bHQsIG9yIHVuZGVmaW5lZCB3aGVuIG5vdGhpbmcgbWF0Y2hlZCAvIGFib3J0ZWQuICovXG4gIHJlc3VsdD86IEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHQ7XG59XG5cbi8qKlxuICogRmV0Y2ggbWF0Y2hpbmcgcnVucyAodXAgdG8gYGxpbWl0YCksIGNvbmZpcm0sIGFuZCBjYW5jZWwgdGhlbSBpbiBhIHNpbmdsZVxuICogYnVsayBvcGVyYXRpb24uIFByaW50cyBhIHRhYmxlIG9mIHdoYXQgd2lsbCBiZSBjYW5jZWxsZWQsIHJlcnVuIGd1aWRhbmNlXG4gKiB3aGVuIG1vcmUgcnVucyBtYXRjaCB0aGFuIHdlcmUgZmV0Y2hlZCwgYSBjb21wYWN0IHN1bW1hcnksIGFuZCBwZXItcnVuXG4gKiBsaW5lcyBmb3Igc3VyZmFjZWQgZmFpbHVyZXMuXG4gKlxuICogRG9lcyBub3QgdHJhdmVyc2UgcGFnZXM6IGV4YWN0bHkgb25lIHBhZ2Ugb2YgYXQgbW9zdCBgbGltaXRgIHJ1bnMgaXNcbiAqIGNhbmNlbGxlZCBwZXIgaW52b2NhdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1CdWxrQ2FuY2VsKFxuICBwYXJhbXM6IEJ1bGtDYW5jZWxQYXJhbXNcbik6IFByb21pc2U8QnVsa0NhbmNlbE91dGNvbWU+IHtcbiAgY29uc3QgeyB3b3JsZCwgc3RhdHVzLCB3b3JrZmxvd05hbWUsIGxpbWl0LCBjb25maXJtLCBsb2dnZXIsIHByb21wdENvbmZpcm0gfSA9XG4gICAgcGFyYW1zO1xuXG4gIC8vIEZldGNoIG1hdGNoaW5nIHJ1bnMuIE9ubHkgbWV0YWRhdGEgaXMgbmVlZGVkIHRvIGRpc3BsYXkgYW5kIGNhbmNlbCwgc29cbiAgLy8gcHJlZmVyIHRoZSBhbmFseXRpY3MgcmVhZCBwYXRoIHdoZW4gdGhlIGJhY2tlbmQgcHJvdmlkZXMgb25lLlxuICAvL1xuICAvLyBXaGVuIHRoZSBjYWxsZXIgcGlucyBhIHN0YXR1cywgbWF0Y2ggZXhhY3RseSB0aGF0LiBPdGhlcndpc2UgcmVzdHJpY3QgdG9cbiAgLy8gdGhlIGNhbmNlbGxhYmxlIHN0YXR1c2VzIHNvIHJlcnVubmluZyBtYWtlcyBwcm9ncmVzcyBpbnN0ZWFkIG9mIHJldHVybmluZ1xuICAvLyB0aGUgc2FtZSB0ZXJtaW5hbCBwYWdlIGZvcmV2ZXIuIFRoZSBsaXN0IEFQSSB0YWtlcyBhIHNpbmdsZSBzdGF0dXMsIHNvXG4gIC8vIGZhbiBvdXQgYWNyb3NzIHRoZSB0YXJnZXQgc3RhdHVzZXMgYW5kIG1lcmdlIHRoZSBwYWdlcyBiZWxvdy5cbiAgY29uc3QgYW5hbHl0aWNzID0gd29ybGQuYW5hbHl0aWNzO1xuICBjb25zdCB0YXJnZXRTdGF0dXNlczogV29ya2Zsb3dSdW5TdGF0dXNbXSA9IHN0YXR1c1xuICAgID8gW3N0YXR1c11cbiAgICA6IFsuLi5DQU5DRUxMQUJMRV9TVEFUVVNFU107XG5cbiAgY29uc3QgZmV0Y2hQYWdlID0gYXN5bmMgKHBhZ2VTdGF0dXM6IFdvcmtmbG93UnVuU3RhdHVzKSA9PiB7XG4gICAgaWYgKCFhbmFseXRpY3MpIHtcbiAgICAgIHJldHVybiB3b3JsZC5ydW5zLmxpc3Qoe1xuICAgICAgICBzdGF0dXM6IHBhZ2VTdGF0dXMsXG4gICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgcGFnaW5hdGlvbjogeyBsaW1pdCB9LFxuICAgICAgICByZXNvbHZlRGF0YTogJ25vbmUnLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFRoZSBhbmFseXRpY3MgYmFja2VuZCBkZWZhdWx0cyBpdHMgbGlzdGluZyB0byBhIHJlY2VudCB3aW5kb3dcbiAgICAvLyAodHJhaWxpbmcgMjRoIG9uIHRoZSBWZXJjZWwgYmFja2VuZCksIGJ1dCBidWxrIGNhbmNlbCBtdXN0IG1hdGNoXG4gICAgLy8gYWNyb3NzIHRoZSBwbGFuJ3Mgd2hvbGUgb2JzZXJ2YWJpbGl0eSB3aW5kb3c6IGEgcnVuIGNhbiBzbGVlcCBvclxuICAgIC8vIHdhaXQgb24gYSBob29rIGZvciBkYXlzIHdpdGhvdXQgZW1pdHRpbmcgcmVjZW50IGV2ZW50cy4gUHJvYmUgZm9yXG4gICAgLy8gdGhlIHBsYW4gd2luZG93IGJvdW5kcyBmaXJzdCwgdGhlbiBtYXRjaCBhY3Jvc3MgdGhlbS5cbiAgICBjb25zdCBwcm9iZSA9IGF3YWl0IGFuYWx5dGljcy5ydW5zLmxpc3Qoe1xuICAgICAgc3RhdHVzOiBwYWdlU3RhdHVzLFxuICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgcGFnaW5hdGlvbjogeyBsaW1pdDogMSB9LFxuICAgIH0pO1xuICAgIGNvbnN0IHdpbmRvd1N0YXJ0ID0gcGxhbldpbmRvd1N0YXJ0RnJvbVJlc3BvbnNlKHByb2JlKTtcbiAgICByZXR1cm4gYW5hbHl0aWNzLnJ1bnMubGlzdCh7XG4gICAgICBzdGF0dXM6IHBhZ2VTdGF0dXMsXG4gICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAuLi4od2luZG93U3RhcnRcbiAgICAgICAgPyB7IHN0YXJ0VGltZTogd2luZG93U3RhcnQsIGVuZFRpbWU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9XG4gICAgICAgIDoge30pLFxuICAgICAgcGFnaW5hdGlvbjogeyBsaW1pdCB9LFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHBhZ2VzID0gYXdhaXQgUHJvbWlzZS5hbGwodGFyZ2V0U3RhdHVzZXMubWFwKGZldGNoUGFnZSkpO1xuXG4gIC8vIE1lcmdlIHRoZSBwZXItc3RhdHVzIHBhZ2VzIHJvdW5kLXJvYmluIHNvIGEgZnVsbCBwYWdlIG9mIHJ1bm5pbmcgcnVuc1xuICAvLyBjYW5ub3QgY3Jvd2QgcGVuZGluZyBydW5zICh3aGljaCBkbyBub3QgaGF2ZSBhIHN0YXJ0ZWRBdCB0aW1lc3RhbXApIG91dFxuICAvLyBvZiBldmVyeSBiYXRjaC4gUHJlc2VydmUgZWFjaCBwYWdlJ3MgYmFja2VuZCBvcmRlciBhbmQgZGVkdXBlIGJ5IHJ1bklkIGluXG4gIC8vIGNhc2UgYSBydW4gY2hhbmdlcyBzdGF0dXMgd2hpbGUgdGhlIHBhZ2VzIGFyZSBmZXRjaGVkLlxuICBjb25zdCBwcm9qZWN0ZWRQYWdlcyA9IHBhZ2VzLm1hcCgocGFnZSkgPT5cbiAgICBwYWdlLmRhdGEubWFwKChydW4pID0+ICh7XG4gICAgICBydW5JZDogcnVuLnJ1bklkLFxuICAgICAgd29ya2Zsb3dOYW1lOiBydW4ud29ya2Zsb3dOYW1lLFxuICAgICAgc3RhdHVzOiBydW4uc3RhdHVzLFxuICAgICAgc3RhcnRlZEF0OiBydW4uc3RhcnRlZEF0LFxuICAgIH0pKVxuICApO1xuICBjb25zdCBtZXJnZWQ6ICh0eXBlb2YgcHJvamVjdGVkUGFnZXMpW251bWJlcl1bbnVtYmVyXVtdID0gW107XG4gIGNvbnN0IHNlZW5SdW5JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbWF4UGFnZUxlbmd0aCA9IE1hdGgubWF4KFxuICAgIDAsXG4gICAgLi4ucHJvamVjdGVkUGFnZXMubWFwKChwYWdlKSA9PiBwYWdlLmxlbmd0aClcbiAgKTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG1heFBhZ2VMZW5ndGg7IGluZGV4KyspIHtcbiAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcHJvamVjdGVkUGFnZXMpIHtcbiAgICAgIGNvbnN0IHJ1biA9IHBhZ2VbaW5kZXhdO1xuICAgICAgaWYgKHJ1biAmJiAhc2VlblJ1bklkcy5oYXMocnVuLnJ1bklkKSkge1xuICAgICAgICBzZWVuUnVuSWRzLmFkZChydW4ucnVuSWQpO1xuICAgICAgICBtZXJnZWQucHVzaChydW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBydW5zID0ge1xuICAgIGRhdGE6IG1lcmdlZC5zbGljZSgwLCBsaW1pdCksXG4gICAgaGFzTW9yZTogcGFnZXMuc29tZSgocGFnZSkgPT4gcGFnZS5oYXNNb3JlKSB8fCBtZXJnZWQubGVuZ3RoID4gbGltaXQsXG4gIH07XG5cbiAgaWYgKHJ1bnMuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIud2FybignTm8gbWF0Y2hpbmcgcnVucyBmb3VuZC4nKTtcbiAgICByZXR1cm4geyBleGl0Q29kZTogMCB9O1xuICB9XG5cbiAgLy8gRGlzcGxheSB3aGF0IHdpbGwgYmUgY2FuY2VsbGVkLlxuICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZSgpO1xuICBmb3IgKGNvbnN0IHJ1biBvZiBydW5zLmRhdGEpIHtcbiAgICBjb25zdCBzaG9ydE5hbWUgPVxuICAgICAgcGFyc2VXb3JrZmxvd05hbWUocnVuLndvcmtmbG93TmFtZSk/LnNob3J0TmFtZSB8fCBydW4ud29ya2Zsb3dOYW1lO1xuICAgIHRhYmxlLmNlbGwoJ3J1bklkJywgcnVuLnJ1bklkKTtcbiAgICB0YWJsZS5jZWxsKCd3b3JrZmxvdycsIGNoYWxrLmJsdWVCcmlnaHQoc2hvcnROYW1lKSk7XG4gICAgdGFibGUuY2VsbCgnc3RhdHVzJywgcnVuLnN0YXR1cyk7XG4gICAgdGFibGUuY2VsbChcbiAgICAgICdzdGFydGVkQXQnLFxuICAgICAgcnVuLnN0YXJ0ZWRBdCA/IG5ldyBEYXRlKHJ1bi5zdGFydGVkQXQpLnRvSVNPU3RyaW5nKCkgOiAnLSdcbiAgICApO1xuICAgIHRhYmxlLm5ld1JvdygpO1xuICB9XG4gIGxvZ2dlci5sb2coYFxcbkZvdW5kICR7Y2hhbGsuYm9sZChydW5zLmRhdGEubGVuZ3RoKX0gcnVucyB0byBjYW5jZWw6XFxuYCk7XG4gIGxvZ2dlci5sb2codGFibGUudG9TdHJpbmcoKSk7XG5cbiAgaWYgKHJ1bnMuaGFzTW9yZSkge1xuICAgIGxvZ2dlci53YXJuKEhBU19NT1JFX0dVSURBTkNFKTtcbiAgfVxuXG4gIC8vIENvbmZpcm0gdW5sZXNzIC0tY29uZmlybS8teS5cbiAgaWYgKCFjb25maXJtKSB7XG4gICAgY29uc3QgY29uZmlybWVkID0gcHJvbXB0Q29uZmlybVxuICAgICAgPyBhd2FpdCBwcm9tcHRDb25maXJtKFxuICAgICAgICAgIGBDYW5jZWwgJHtydW5zLmRhdGEubGVuZ3RofSBydW4ke3J1bnMuZGF0YS5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ30/YFxuICAgICAgICApXG4gICAgICA6IGZhbHNlO1xuICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICBsb2dnZXIubG9nKCdBYm9ydGVkLicpO1xuICAgICAgcmV0dXJuIHsgZXhpdENvZGU6IDAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBPbmUgYnVsayBvcGVyYXRpb246IGEgc2luZ2xlIGJhY2tlbmQgcmVxdWVzdCBvbiBWZXJjZWwsIG9yIGJvdW5kZWRcbiAgLy8gZmFsbGJhY2sgY29uY3VycmVuY3kgb24gbG9jYWwgLyBjb21tdW5pdHkgd29ybGRzLlxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjYW5jZWxSdW5zKFxuICAgIHdvcmxkLFxuICAgIHJ1bnMuZGF0YS5tYXAoKHJ1bikgPT4gcnVuLnJ1bklkKSxcbiAgICB7IGNhbmNlbFJlYXNvbjogQ0xJX0NBTkNFTF9SRUFTT04gfVxuICApO1xuXG4gIGZvciAoY29uc3QgbGluZSBvZiBidWxrQ2FuY2VsRmFpbHVyZUxpbmVzKHJlc3VsdCkpIHtcbiAgICBsb2dnZXIud2FybihsaW5lKTtcbiAgfVxuICBsb2dnZXIubG9nKGBcXG4ke2Zvcm1hdEJ1bGtDYW5jZWxTdW1tYXJ5KHJlc3VsdCl9YCk7XG5cbiAgLy8gQWxyZWFkeS1jYW5jZWxsZWQgYW5kIHRlcm1pbmFsIHJ1bnMgYXJlIHZhbGlkIHBhcnRpYWwgb3V0Y29tZXM7IG9ubHkgYVxuICAvLyBnZW51aW5lIGZhaWx1cmUgaXMgYSBub256ZXJvIGV4aXQuXG4gIHJldHVybiB7IGV4aXRDb2RlOiByZXN1bHQuc3VtbWFyeS5mYWlsZWQgPiAwID8gMSA6IDAsIHJlc3VsdCB9O1xufVxuIl19
228
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay1jYW5jZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2J1bGstY2FuY2VsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQU0vRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUN2Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztBQUN6QyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyw0QkFBNEIsQ0FBQztBQUU5RDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUc7SUFDbEMsU0FBUztJQUNULFNBQVM7Q0FDc0MsQ0FBQztBQUVsRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQzVCLGdGQUFnRjtJQUNoRix3QkFBd0IscUJBQXFCLEdBQUcsQ0FBQztBQVFuRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEtBQWE7SUFDbkQsSUFDRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQ3hCLEtBQUssR0FBRyxxQkFBcUI7UUFDN0IsS0FBSyxHQUFHLHFCQUFxQixFQUM3QixDQUFDO1FBQ0QsT0FBTyxzQ0FBc0MscUJBQXFCLFFBQVEscUJBQXFCLEdBQUcsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1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a2Zsb3cvY29yZS9ydW50aW1lJztcbmltcG9ydCB7IHBhcnNlV29ya2Zsb3dOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHR5cGUge1xuICBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVzdWx0LFxuICBXb3JrZmxvd1J1blN0YXR1cyxcbiAgV29ybGQsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IFRhYmxlIGZyb20gJ2Vhc3ktdGFibGUnO1xuaW1wb3J0IHsgcGxhbldpbmRvd1N0YXJ0RnJvbVJlc3BvbnNlIH0gZnJvbSAnLi9pbnNwZWN0L3RpbWUtd2luZG93LmpzJztcblxuZXhwb3J0IGNvbnN0IEJVTEtfQ0FOQ0VMX01JTl9MSU1JVCA9IDE7XG4vKipcbiAqIFVwcGVyIGJvdW5kIG9uIGAtLWxpbWl0YC5cbiAqXG4gKiAxMDAgaXMgd2hhdCBib3RoIHJlYWQgcGF0aHMgYWNjZXB0OiB0aGUgYW5hbHl0aWNzIHJ1bnMgbGlzdGluZyBjYXBzIHRoZXJlXG4gKiBhbmQgcmVqZWN0cyBtb3JlIGxvY2FsbHksIGFuZCB0aGUgc3RvcmFnZSBsaXN0aW5nIGl0IGZhbGxzIGJhY2sgdG8gY2Fwc1xuICogdGhlcmUgc2VydmVyLXNpZGUuIFRoaXMgYWR2ZXJ0aXNlZCA1MDAgYW5kIG5vIGJhY2tlbmQgZXZlciBzZXJ2ZWQgaXQsIHNvXG4gKiBgLS1saW1pdCAyMDBgIGZhaWxlZCBob3dldmVyIHRoZSBjb21tYW5kIHdhcyByb3V0ZWQuXG4gKlxuICogVGhlIGJvdW5kIGlzIHBlciBzdGF0dXMsIGFuZCBhbiB1bnBpbm5lZCBgLS1zdGF0dXNgIGZhbnMgb3V0IGFjcm9zc1xuICoge0BsaW5rIENBTkNFTExBQkxFX1NUQVRVU0VTfSwgc28gYSBiYXRjaCBjYW4gc3RpbGwgZXhjZWVkIGl0IGJlZm9yZSB0aGVcbiAqIG1lcmdlZCBsaXN0IGlzIHRydW5jYXRlZCB0byBgbGltaXRgLlxuICovXG5leHBvcnQgY29uc3QgQlVMS19DQU5DRUxfTUFYX0xJTUlUID0gMTAwO1xuZXhwb3J0IGNvbnN0IENMSV9DQU5DRUxfUkVBU09OID0gJ0NhbmNlbGxlZCB2aWEgV29ya2Zsb3cgQ0xJJztcblxuLyoqXG4gKiBTdGF0dXNlcyBhIHJ1biBjYW4gc3RpbGwgYmUgY2FuY2VsbGVkIGZyb20uIFdoZW4gdGhlIGNhbGxlciBkb2Vzbid0IHBpbiBhXG4gKiBgLS1zdGF0dXNgLCBidWxrIGNhbmNlbCByZXN0cmljdHMgbWF0Y2hpbmcgdG8gdGhlc2Ugc28gdGVybWluYWwgcnVuc1xuICogKGluY2x1ZGluZyB0aGUgb25lcyBhIHByaW9yIGJhdGNoIGp1c3QgY2FuY2VsbGVkKSBkb24ndCBjcm93ZCBvdXQgcmVhY2hhYmxlXG4gKiBhY3RpdmUgcnVucy4gT3RoZXJ3aXNlLCBsaXN0aW5nIGV2ZXJ5IHN0YXR1cyByZXR1cm5zIHRoZSBzYW1lIG5ld2VzdFxuICogdGVybWluYWwgcGFnZSBvbiBlYWNoIHJlcnVuIGFuZCBvbGRlciBhY3RpdmUgcnVucyBhcmUgbmV2ZXIgcmVhY2hlZC4gVGhlXG4gKiBsaXN0IEFQSSBmaWx0ZXJzIGJ5IGEgc2luZ2xlIHN0YXR1cywgc28gd2UgZmFuIG91dCBhY3Jvc3MgdGhlc2UgYW5kIG1lcmdlLlxuICovXG5leHBvcnQgY29uc3QgQ0FOQ0VMTEFCTEVfU1RBVFVTRVMgPSBbXG4gICdwZW5kaW5nJyxcbiAgJ3J1bm5pbmcnLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgV29ya2Zsb3dSdW5TdGF0dXNbXTtcblxuLyoqXG4gKiBHdWlkYW5jZSBwcmludGVkIHdoZW4gbW9yZSBydW5zIG1hdGNoIHRoZSBmaWx0ZXJzIHRoYW4gd2VyZSBmZXRjaGVkLiBCdWxrXG4gKiBjYW5jZWwgaXMgZGVsaWJlcmF0ZWx5IHNpbmdsZS1iYXRjaCBhbmQgdXNlci1wYWNlZCAobm8gY3Vyc29ycyBvciBhc3luY1xuICogam9icyksIHNvIHRoZSB1c2VyIHJlLXJ1bnMgdG8gY2FuY2VsIHRoZSBuZXh0IGJhdGNoLlxuICovXG5leHBvcnQgY29uc3QgSEFTX01PUkVfR1VJREFOQ0UgPVxuICAnTW9yZSBydW5zIG1hdGNoIHRoZXNlIGZpbHRlcnMuIFJlLXJ1biB0aGlzIGNvbW1hbmQgdG8gY2FuY2VsIHRoZSBuZXh0IGJhdGNoLFxcbicgK1xuICBgb3IgdXNlIC0tbGltaXQgdXAgdG8gJHtCVUxLX0NBTkNFTF9NQVhfTElNSVR9LmA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FuY2VsTG9nZ2VyIHtcbiAgbG9nKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gIHdhcm4obWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGUgYC0tbGltaXRgIGZsYWcuIFJldHVybnMgYW4gZXJyb3IgbWVzc2FnZSB3aGVuIGludmFsaWQsIG9yXG4gKiBgdW5kZWZpbmVkYCB3aGVuIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyIHdpdGhpblxuICogW3tAbGluayBCVUxLX0NBTkNFTF9NSU5fTElNSVR9LCB7QGxpbmsgQlVMS19DQU5DRUxfTUFYX0xJTUlUfV0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdChsaW1pdDogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKFxuICAgICFOdW1iZXIuaXNJbnRlZ2VyKGxpbWl0KSB8fFxuICAgIGxpbWl0IDwgQlVMS19DQU5DRUxfTUlOX0xJTUlUIHx8XG4gICAgbGltaXQgPiBCVUxLX0NBTkNFTF9NQVhfTElNSVRcbiAgKSB7XG4gICAgcmV0dXJuIGAtLWxpbWl0IG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuICR7QlVMS19DQU5DRUxfTUlOX0xJTUlUfSBhbmQgJHtCVUxLX0NBTkNFTF9NQVhfTElNSVR9LmA7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgY29tcGFjdCBtdWx0aS1saW5lIFwiRG9uZTpcIiBzdW1tYXJ5IGJsb2NrLiBMaXN0cyBldmVyeSBvdXRjb21lXG4gKiBjYXRlZ29yeSBzbyB0aGUgY291bnRzIGFkZCB1cCB0byB0aGUgbnVtYmVyIG9mIHJ1bnMgcmVxdWVzdGVkOyBpbmRpdmlkdWFsXG4gKiBgbm90X2ZvdW5kYCwgYG5vdF9jYW5jZWxsYWJsZWAsIGFuZCBgZmFpbGVkYCBydW5zIGFyZSBhZGRpdGlvbmFsbHkgc3VyZmFjZWRcbiAqIHBlci1ydW4gdmlhIHtAbGluayBidWxrQ2FuY2VsRmFpbHVyZUxpbmVzfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEJ1bGtDYW5jZWxTdW1tYXJ5KFxuICByZXN1bHQ6IEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHRcbik6IHN0cmluZyB7XG4gIGNvbnN0IHsgc3VtbWFyeSB9ID0gcmVzdWx0O1xuICByZXR1cm4gW1xuICAgICdEb25lOicsXG4gICAgYCAgJHtzdW1tYXJ5LmNhbmNlbGxlZH0gY2FuY2VsbGVkYCxcbiAgICBgICAke3N1bW1hcnkuYWxyZWFkeUNhbmNlbGxlZH0gYWxyZWFkeSBjYW5jZWxsZWRgLFxuICAgIGAgICR7c3VtbWFyeS5ub3RDYW5jZWxsYWJsZX0gbm90IGNhbmNlbGxhYmxlYCxcbiAgICBgICAke3N1bW1hcnkubm90Rm91bmR9IG5vdCBmb3VuZGAsXG4gICAgYCAgJHtzdW1tYXJ5LmZhaWxlZH0gZmFpbGVkYCxcbiAgXS5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBQZXItcnVuIGxpbmVzIGZvciBvdXRjb21lcyB3b3J0aCBjYWxsaW5nIG91dCBpbmRpdmlkdWFsbHk6IGBub3RfZm91bmRgLFxuICogYG5vdF9jYW5jZWxsYWJsZWAsIGFuZCBgZmFpbGVkYC4gQ2FuY2VsbGVkIGFuZCBhbHJlYWR5LWNhbmNlbGxlZCBydW5zIGFyZVxuICogbGVmdCB0byB0aGUgc3VtbWFyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1bGtDYW5jZWxGYWlsdXJlTGluZXMoXG4gIHJlc3VsdDogQnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByIG9mIHJlc3VsdC5yZXN1bHRzKSB7XG4gICAgc3dpdGNoIChyLm91dGNvbWUpIHtcbiAgICAgIGNhc2UgJ25vdF9mb3VuZCc6XG4gICAgICAgIGxpbmVzLnB1c2goYCAg4pyXICR7ci5ydW5JZH06IG5vdCBmb3VuZGApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25vdF9jYW5jZWxsYWJsZSc6XG4gICAgICAgIGxpbmVzLnB1c2goYCAg4pyXICR7ci5ydW5JZH06IG5vdCBjYW5jZWxsYWJsZSAoJHtyLnN0YXR1c30pYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZmFpbGVkJzpcbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgICDinJcgJHtyLnJ1bklkfTogZmFpbGVkICgke3IuY29kZX0ke3IucmV0cnlhYmxlID8gJywgcmV0cnlhYmxlJyA6ICcnfSlgXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGluZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVsa0NhbmNlbFBhcmFtcyB7XG4gIHdvcmxkOiBXb3JsZDtcbiAgc3RhdHVzPzogV29ya2Zsb3dSdW5TdGF0dXM7XG4gIHdvcmtmbG93TmFtZT86IHN0cmluZztcbiAgLyoqIE1heCBydW5zIHRvIGZldGNoIGFuZCBjYW5jZWwgaW4gdGhpcyBiYXRjaCAoYWxyZWFkeSB2YWxpZGF0ZWQpLiAqL1xuICBsaW1pdDogbnVtYmVyO1xuICAvKiogV2hlbiB0cnVlLCBza2lwIHRoZSBpbnRlcmFjdGl2ZSBjb25maXJtYXRpb24gcHJvbXB0LiAqL1xuICBjb25maXJtOiBib29sZWFuO1xuICBsb2dnZXI6IENhbmNlbExvZ2dlcjtcbiAgLyoqXG4gICAqIENvbmZpcm1hdGlvbiBwcm9tcHQuIE9taXR0ZWQgaW4gbm9uLWludGVyYWN0aXZlIGNvbnRleHRzIChhbmQgdGVzdHMpLFxuICAgKiBpbiB3aGljaCBjYXNlIGFuIHVuY29uZmlybWVkIHJ1biBhYm9ydHMuXG4gICAqL1xuICBwcm9tcHRDb25maXJtPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWxrQ2FuY2VsT3V0Y29tZSB7XG4gIC8qKiBQcm9jZXNzIGV4aXQgY29kZTogMSB3aGVuIGFueSBydW4gZmFpbGVkLCBvdGhlcndpc2UgMC4gKi9cbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgLyoqIFRoZSBzdHJ1Y3R1cmVkIHJlc3VsdCwgb3IgdW5kZWZpbmVkIHdoZW4gbm90aGluZyBtYXRjaGVkIC8gYWJvcnRlZC4gKi9cbiAgcmVzdWx0PzogQnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBwbGFuJ3Mgb2JzZXJ2YWJpbGl0eSB3aW5kb3cgZnJvbSBhIG9uZS1yb3cgcHJvYmUgbGlzdGluZy5cbiAqXG4gKiBSZXR1cm5zIHRoZSBgc3RhcnRUaW1lYC9gZW5kVGltZWAgcGFpciB0byBib3VuZCBzdWJzZXF1ZW50IGxpc3RpbmdzIHdpdGgsXG4gKiBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBiYWNrZW5kIHJlcG9ydHMgbm8gd2luZG93IChub3RoaW5nIHRvIHdpZGVuIHRvKS5cbiAqIFRoZSBwcm9iZSBuZWVkcyBhIHN0YXR1cyBiZWNhdXNlIHRoZSBsaXN0IEFQSSB0YWtlcyBvbmUsIGJ1dCB0aGUgd2luZG93IGl0XG4gKiByZWFkcyBiYWNrIGlzIHBsYW4td2lkZSwgc28gYW55IHN0YXR1cyB3aWxsIGRvLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUGxhbldpbmRvdyhcbiAgYW5hbHl0aWNzOiBOb25OdWxsYWJsZTxXb3JsZFsnYW5hbHl0aWNzJ10+LFxuICBwcm9iZVN0YXR1czogV29ya2Zsb3dSdW5TdGF0dXMsXG4gIHdvcmtmbG93TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPHsgc3RhcnRUaW1lOiBzdHJpbmc7IGVuZFRpbWU6IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHByb2JlID0gYXdhaXQgYW5hbHl0aWNzLnJ1bnMubGlzdCh7XG4gICAgc3RhdHVzOiBwcm9iZVN0YXR1cyxcbiAgICB3b3JrZmxvd05hbWUsXG4gICAgcGFnaW5hdGlvbjogeyBsaW1pdDogMSB9LFxuICB9KTtcbiAgY29uc3Qgc3RhcnRUaW1lID0gcGxhbldpbmRvd1N0YXJ0RnJvbVJlc3BvbnNlKHByb2JlKTtcbiAgcmV0dXJuIHN0YXJ0VGltZVxuICAgID8geyBzdGFydFRpbWUsIGVuZFRpbWU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9XG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRmV0Y2ggbWF0Y2hpbmcgcnVucyAodXAgdG8gYGxpbWl0YCksIGNvbmZpcm0sIGFuZCBjYW5jZWwgdGhlbSBpbiBhIHNpbmdsZVxuICogYnVsayBvcGVyYXRpb24uIFByaW50cyBhIHRhYmxlIG9mIHdoYXQgd2lsbCBiZSBjYW5jZWxsZWQsIHJlcnVuIGd1aWRhbmNlXG4gKiB3aGVuIG1vcmUgcnVucyBtYXRjaCB0aGFuIHdlcmUgZmV0Y2hlZCwgYSBjb21wYWN0IHN1bW1hcnksIGFuZCBwZXItcnVuXG4gKiBsaW5lcyBmb3Igc3VyZmFjZWQgZmFpbHVyZXMuXG4gKlxuICogRG9lcyBub3QgdHJhdmVyc2UgcGFnZXM6IGV4YWN0bHkgb25lIHBhZ2Ugb2YgYXQgbW9zdCBgbGltaXRgIHJ1bnMgaXNcbiAqIGNhbmNlbGxlZCBwZXIgaW52b2NhdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1CdWxrQ2FuY2VsKFxuICBwYXJhbXM6IEJ1bGtDYW5jZWxQYXJhbXNcbik6IFByb21pc2U8QnVsa0NhbmNlbE91dGNvbWU+IHtcbiAgY29uc3QgeyB3b3JsZCwgc3RhdHVzLCB3b3JrZmxvd05hbWUsIGxpbWl0LCBjb25maXJtLCBsb2dnZXIsIHByb21wdENvbmZpcm0gfSA9XG4gICAgcGFyYW1zO1xuXG4gIC8vIEZldGNoIG1hdGNoaW5nIHJ1bnMuIE9ubHkgbWV0YWRhdGEgaXMgbmVlZGVkIHRvIGRpc3BsYXkgYW5kIGNhbmNlbCwgc29cbiAgLy8gcHJlZmVyIHRoZSBhbmFseXRpY3MgcmVhZCBwYXRoIHdoZW4gdGhlIGJhY2tlbmQgcHJvdmlkZXMgb25lLlxuICAvL1xuICAvLyBXaGVuIHRoZSBjYWxsZXIgcGlucyBhIHN0YXR1cywgbWF0Y2ggZXhhY3RseSB0aGF0LiBPdGhlcndpc2UgcmVzdHJpY3QgdG9cbiAgLy8gdGhlIGNhbmNlbGxhYmxlIHN0YXR1c2VzIHNvIHJlcnVubmluZyBtYWtlcyBwcm9ncmVzcyBpbnN0ZWFkIG9mIHJldHVybmluZ1xuICAvLyB0aGUgc2FtZSB0ZXJtaW5hbCBwYWdlIGZvcmV2ZXIuIFRoZSBsaXN0IEFQSSB0YWtlcyBhIHNpbmdsZSBzdGF0dXMsIHNvXG4gIC8vIGZhbiBvdXQgYWNyb3NzIHRoZSB0YXJnZXQgc3RhdHVzZXMgYW5kIG1lcmdlIHRoZSBwYWdlcyBiZWxvdy5cbiAgY29uc3QgYW5hbHl0aWNzID0gd29ybGQuYW5hbHl0aWNzO1xuICBjb25zdCB0YXJnZXRTdGF0dXNlczogV29ya2Zsb3dSdW5TdGF0dXNbXSA9IHN0YXR1c1xuICAgID8gW3N0YXR1c11cbiAgICA6IFsuLi5DQU5DRUxMQUJMRV9TVEFUVVNFU107XG5cbiAgLy8gVGhlIGFuYWx5dGljcyBiYWNrZW5kIGRlZmF1bHRzIGl0cyBsaXN0aW5nIHRvIGEgcmVjZW50IHdpbmRvdyAodHJhaWxpbmdcbiAgLy8gMjRoIG9uIHRoZSBWZXJjZWwgYmFja2VuZCksIGJ1dCBidWxrIGNhbmNlbCBtdXN0IG1hdGNoIGFjcm9zcyB0aGUgcGxhbidzXG4gIC8vIHdob2xlIG9ic2VydmFiaWxpdHkgd2luZG93OiBhIHJ1biBjYW4gc2xlZXAgb3Igd2FpdCBvbiBhIGhvb2sgZm9yIGRheXNcbiAgLy8gd2l0aG91dCBlbWl0dGluZyByZWNlbnQgZXZlbnRzLiBQcm9iZSBvbmNlIGZvciB0aGUgd2luZG93IGJvdW5kcywgdGhlblxuICAvLyBtYXRjaCBhY3Jvc3MgdGhlbS5cbiAgLy9cbiAgLy8gVGhlIHdpbmRvdyBpcyBhIHByb3BlcnR5IG9mIHRoZSBwbGFuLCBub3Qgb2YgYSBydW4ncyBzdGF0dXMsIHNvIHRoZSBwcm9iZVxuICAvLyBpcyBob2lzdGVkIGFib3ZlIHRoZSBwZXItc3RhdHVzIGZhbi1vdXQuIFJ1bm5pbmcgaXQgaW5zaWRlIG1lYW50IGFcbiAgLy8gZm91ci1zdGF0dXMgY2FuY2VsIGlzc3VlZCBmb3VyIGlkZW50aWNhbCBwcm9iZXMuXG4gIGNvbnN0IGxpc3RpbmdXaW5kb3cgPSBhbmFseXRpY3NcbiAgICA/IGF3YWl0IHJlc29sdmVQbGFuV2luZG93KGFuYWx5dGljcywgdGFyZ2V0U3RhdHVzZXNbMF0sIHdvcmtmbG93TmFtZSlcbiAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBmZXRjaFBhZ2UgPSBhc3luYyAocGFnZVN0YXR1czogV29ya2Zsb3dSdW5TdGF0dXMpID0+IHtcbiAgICBpZiAoIWFuYWx5dGljcykge1xuICAgICAgcmV0dXJuIHdvcmxkLnJ1bnMubGlzdCh7XG4gICAgICAgIHN0YXR1czogcGFnZVN0YXR1cyxcbiAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICBwYWdpbmF0aW9uOiB7IGxpbWl0IH0sXG4gICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFuYWx5dGljcy5ydW5zLmxpc3Qoe1xuICAgICAgc3RhdHVzOiBwYWdlU3RhdHVzLFxuICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgLi4uKGxpc3RpbmdXaW5kb3cgPz8ge30pLFxuICAgICAgcGFnaW5hdGlvbjogeyBsaW1pdCB9LFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHBhZ2VzID0gYXdhaXQgUHJvbWlzZS5hbGwodGFyZ2V0U3RhdHVzZXMubWFwKGZldGNoUGFnZSkpO1xuXG4gIC8vIE1lcmdlIHRoZSBwZXItc3RhdHVzIHBhZ2VzIHJvdW5kLXJvYmluIHNvIGEgZnVsbCBwYWdlIG9mIHJ1bm5pbmcgcnVuc1xuICAvLyBjYW5ub3QgY3Jvd2QgcGVuZGluZyBydW5zICh3aGljaCBkbyBub3QgaGF2ZSBhIHN0YXJ0ZWRBdCB0aW1lc3RhbXApIG91dFxuICAvLyBvZiBldmVyeSBiYXRjaC4gUHJlc2VydmUgZWFjaCBwYWdlJ3MgYmFja2VuZCBvcmRlciBhbmQgZGVkdXBlIGJ5IHJ1bklkIGluXG4gIC8vIGNhc2UgYSBydW4gY2hhbmdlcyBzdGF0dXMgd2hpbGUgdGhlIHBhZ2VzIGFyZSBmZXRjaGVkLlxuICBjb25zdCBwcm9qZWN0ZWRQYWdlcyA9IHBhZ2VzLm1hcCgocGFnZSkgPT5cbiAgICBwYWdlLmRhdGEubWFwKChydW4pID0+ICh7XG4gICAgICBydW5JZDogcnVuLnJ1bklkLFxuICAgICAgd29ya2Zsb3dOYW1lOiBydW4ud29ya2Zsb3dOYW1lLFxuICAgICAgc3RhdHVzOiBydW4uc3RhdHVzLFxuICAgICAgc3RhcnRlZEF0OiBydW4uc3RhcnRlZEF0LFxuICAgIH0pKVxuICApO1xuICBjb25zdCBtZXJnZWQ6ICh0eXBlb2YgcHJvamVjdGVkUGFnZXMpW251bWJlcl1bbnVtYmVyXVtdID0gW107XG4gIGNvbnN0IHNlZW5SdW5JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbWF4UGFnZUxlbmd0aCA9IE1hdGgubWF4KFxuICAgIDAsXG4gICAgLi4ucHJvamVjdGVkUGFnZXMubWFwKChwYWdlKSA9PiBwYWdlLmxlbmd0aClcbiAgKTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG1heFBhZ2VMZW5ndGg7IGluZGV4KyspIHtcbiAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcHJvamVjdGVkUGFnZXMpIHtcbiAgICAgIGNvbnN0IHJ1biA9IHBhZ2VbaW5kZXhdO1xuICAgICAgaWYgKHJ1biAmJiAhc2VlblJ1bklkcy5oYXMocnVuLnJ1bklkKSkge1xuICAgICAgICBzZWVuUnVuSWRzLmFkZChydW4ucnVuSWQpO1xuICAgICAgICBtZXJnZWQucHVzaChydW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBydW5zID0ge1xuICAgIGRhdGE6IG1lcmdlZC5zbGljZSgwLCBsaW1pdCksXG4gICAgaGFzTW9yZTogcGFnZXMuc29tZSgocGFnZSkgPT4gcGFnZS5oYXNNb3JlKSB8fCBtZXJnZWQubGVuZ3RoID4gbGltaXQsXG4gIH07XG5cbiAgaWYgKHJ1bnMuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIud2FybignTm8gbWF0Y2hpbmcgcnVucyBmb3VuZC4nKTtcbiAgICByZXR1cm4geyBleGl0Q29kZTogMCB9O1xuICB9XG5cbiAgLy8gRGlzcGxheSB3aGF0IHdpbGwgYmUgY2FuY2VsbGVkLlxuICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZSgpO1xuICBmb3IgKGNvbnN0IHJ1biBvZiBydW5zLmRhdGEpIHtcbiAgICBjb25zdCBzaG9ydE5hbWUgPVxuICAgICAgcGFyc2VXb3JrZmxvd05hbWUocnVuLndvcmtmbG93TmFtZSk/LnNob3J0TmFtZSB8fCBydW4ud29ya2Zsb3dOYW1lO1xuICAgIHRhYmxlLmNlbGwoJ3J1bklkJywgcnVuLnJ1bklkKTtcbiAgICB0YWJsZS5jZWxsKCd3b3JrZmxvdycsIGNoYWxrLmJsdWVCcmlnaHQoc2hvcnROYW1lKSk7XG4gICAgdGFibGUuY2VsbCgnc3RhdHVzJywgcnVuLnN0YXR1cyk7XG4gICAgdGFibGUuY2VsbChcbiAgICAgICdzdGFydGVkQXQnLFxuICAgICAgcnVuLnN0YXJ0ZWRBdCA/IG5ldyBEYXRlKHJ1bi5zdGFydGVkQXQpLnRvSVNPU3RyaW5nKCkgOiAnLSdcbiAgICApO1xuICAgIHRhYmxlLm5ld1JvdygpO1xuICB9XG4gIGxvZ2dlci5sb2coYFxcbkZvdW5kICR7Y2hhbGsuYm9sZChydW5zLmRhdGEubGVuZ3RoKX0gcnVucyB0byBjYW5jZWw6XFxuYCk7XG4gIGxvZ2dlci5sb2codGFibGUudG9TdHJpbmcoKSk7XG5cbiAgaWYgKHJ1bnMuaGFzTW9yZSkge1xuICAgIGxvZ2dlci53YXJuKEhBU19NT1JFX0dVSURBTkNFKTtcbiAgfVxuXG4gIC8vIENvbmZpcm0gdW5sZXNzIC0tY29uZmlybS8teS5cbiAgaWYgKCFjb25maXJtKSB7XG4gICAgY29uc3QgY29uZmlybWVkID0gcHJvbXB0Q29uZmlybVxuICAgICAgPyBhd2FpdCBwcm9tcHRDb25maXJtKFxuICAgICAgICAgIGBDYW5jZWwgJHtydW5zLmRhdGEubGVuZ3RofSBydW4ke3J1bnMuZGF0YS5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ30/YFxuICAgICAgICApXG4gICAgICA6IGZhbHNlO1xuICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICBsb2dnZXIubG9nKCdBYm9ydGVkLicpO1xuICAgICAgcmV0dXJuIHsgZXhpdENvZGU6IDAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBPbmUgYnVsayBvcGVyYXRpb246IGEgc2luZ2xlIGJhY2tlbmQgcmVxdWVzdCBvbiBWZXJjZWwsIG9yIGJvdW5kZWRcbiAgLy8gZmFsbGJhY2sgY29uY3VycmVuY3kgb24gbG9jYWwgLyBjb21tdW5pdHkgd29ybGRzLlxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjYW5jZWxSdW5zKFxuICAgIHdvcmxkLFxuICAgIHJ1bnMuZGF0YS5tYXAoKHJ1bikgPT4gcnVuLnJ1bklkKSxcbiAgICB7IGNhbmNlbFJlYXNvbjogQ0xJX0NBTkNFTF9SRUFTT04gfVxuICApO1xuXG4gIGZvciAoY29uc3QgbGluZSBvZiBidWxrQ2FuY2VsRmFpbHVyZUxpbmVzKHJlc3VsdCkpIHtcbiAgICBsb2dnZXIud2FybihsaW5lKTtcbiAgfVxuICBsb2dnZXIubG9nKGBcXG4ke2Zvcm1hdEJ1bGtDYW5jZWxTdW1tYXJ5KHJlc3VsdCl9YCk7XG5cbiAgLy8gQWxyZWFkeS1jYW5jZWxsZWQgYW5kIHRlcm1pbmFsIHJ1bnMgYXJlIHZhbGlkIHBhcnRpYWwgb3V0Y29tZXM7IG9ubHkgYVxuICAvLyBnZW51aW5lIGZhaWx1cmUgaXMgYSBub256ZXJvIGV4aXQuXG4gIHJldHVybiB7IGV4aXRDb2RlOiByZXN1bHQuc3VtbWFyeS5mYWlsZWQgPiAwID8gMSA6IDAsIHJlc3VsdCB9O1xufVxuIl19