aws-cdk 2.177.0 → 2.178.1

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 (42) hide show
  1. package/THIRD_PARTY_LICENSES +5518 -181
  2. package/build-info.json +2 -2
  3. package/db.json.gz +0 -0
  4. package/lib/api/aws-auth/sdk-logger.d.ts +4 -0
  5. package/lib/api/aws-auth/sdk-logger.js +18 -7
  6. package/lib/api/aws-auth/sdk-provider.js +4 -3
  7. package/lib/api/aws-auth/sdk.d.ts +1 -0
  8. package/lib/api/aws-auth/sdk.js +4 -3
  9. package/lib/api/aws-auth/tracing.d.ts +11 -0
  10. package/lib/api/aws-auth/tracing.js +60 -0
  11. package/lib/api/deployments/asset-publishing.js +7 -1
  12. package/lib/cli/cdk-toolkit.d.ts +6 -0
  13. package/lib/cli/cdk-toolkit.js +11 -10
  14. package/lib/cli/cli.js +10 -5
  15. package/lib/cli/parse-command-line-arguments.js +11 -15
  16. package/lib/cli/user-input.d.ts +4 -4
  17. package/lib/cli/user-input.js +1 -1
  18. package/lib/commands/context.js +2 -2
  19. package/lib/index.js +204 -158
  20. package/lib/index_bg.wasm +0 -0
  21. package/lib/init-templates/.init-version.json +1 -1
  22. package/lib/init-templates/.recommended-feature-flags.json +2 -1
  23. package/lib/legacy-exports-source.d.ts +1 -1
  24. package/lib/legacy-exports-source.js +3 -3
  25. package/lib/logging.d.ts +6 -13
  26. package/lib/logging.js +25 -70
  27. package/lib/toolkit/cli-io-host.d.ts +16 -12
  28. package/lib/toolkit/cli-io-host.js +127 -30
  29. package/package.json +10 -10
  30. package/test/_helpers/prompts.d.ts +11 -0
  31. package/test/_helpers/prompts.js +22 -0
  32. package/test/api/aws-auth/sdk-logger.test.js +16 -11
  33. package/test/api/logs/logging.test.js +4 -54
  34. package/test/cli/cdk-toolkit.test.js +7 -7
  35. package/test/cli/cli-arguments.test.js +4 -4
  36. package/test/cli/cli.test.js +2 -2
  37. package/test/cli/user-config.test.js +28 -1
  38. package/test/toolkit/cli-io-host-corked.test.d.ts +1 -0
  39. package/test/toolkit/cli-io-host-corked.test.js +73 -0
  40. package/test/toolkit/cli-io-host.test.js +164 -60
  41. package/lib/util/tracing.d.ts +0 -9
  42. package/lib/util/tracing.js +0 -58
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const chalk = require("chalk");
4
4
  const cli_io_host_1 = require("../../lib/toolkit/cli-io-host");
5
+ const prompts_1 = require("../_helpers/prompts");
5
6
  const ioHost = cli_io_host_1.CliIoHost.instance({
6
7
  logLevel: 'trace',
7
8
  });
@@ -66,17 +67,16 @@ describe('CliIoHost', () => {
66
67
  expect(mockStderr).toHaveBeenCalledWith(chalk.red('error message') + '\n');
67
68
  expect(mockStdout).not.toHaveBeenCalled();
68
69
  });
69
- test('writes to stdout when forceStdout is true', async () => {
70
+ test('writes to stdout for result level', async () => {
70
71
  ioHost.isTTY = true;
71
72
  await ioHost.notify({
72
73
  time: new Date(),
73
- level: 'info',
74
+ level: 'result',
74
75
  action: 'synth',
75
76
  code: 'CDK_TOOLKIT_I0001',
76
- message: 'forced message',
77
- forceStdout: true,
77
+ message: 'result message',
78
78
  });
79
- expect(mockStdout).toHaveBeenCalledWith(chalk.white('forced message') + '\n');
79
+ expect(mockStdout).toHaveBeenCalledWith(chalk.white('result message') + '\n');
80
80
  expect(mockStderr).not.toHaveBeenCalled();
81
81
  });
82
82
  });
@@ -88,46 +88,44 @@ describe('CliIoHost', () => {
88
88
  await ioHost.notify({
89
89
  ...defaultMessage,
90
90
  level: 'debug',
91
- forceStdout: true,
92
91
  });
93
- expect(mockStdout).toHaveBeenCalledWith(`[12:00:00] ${chalk.gray('test message')}\n`);
92
+ expect(mockStderr).toHaveBeenCalledWith(`[12:00:00] ${chalk.gray('test message')}\n`);
94
93
  });
95
94
  test('formats trace messages with timestamp', async () => {
96
95
  await ioHost.notify({
97
96
  ...defaultMessage,
98
97
  level: 'trace',
99
- forceStdout: true,
100
98
  });
101
- expect(mockStdout).toHaveBeenCalledWith(`[12:00:00] ${chalk.gray('test message')}\n`);
99
+ expect(mockStderr).toHaveBeenCalledWith(`[12:00:00] ${chalk.gray('test message')}\n`);
102
100
  });
103
101
  test('applies no styling when TTY is false', async () => {
104
102
  ioHost.isTTY = false;
105
103
  await ioHost.notify({
106
104
  ...defaultMessage,
107
- forceStdout: true,
108
- });
109
- expect(mockStdout).toHaveBeenCalledWith('test message\n');
110
- });
111
- test('applies correct color styles for different message levels', async () => {
112
- const testCases = [
113
- { level: 'error', style: chalk.red },
114
- { level: 'warn', style: chalk.yellow },
115
- { level: 'info', style: chalk.white },
116
- { level: 'debug', style: chalk.gray },
117
- { level: 'trace', style: chalk.gray },
118
- ];
119
- for (const { level, style } of testCases) {
120
- await ioHost.notify({
121
- ...defaultMessage,
122
- level,
123
- forceStdout: true,
124
- });
125
- const expectedOutput = level === 'debug' || level === 'trace'
126
- ? `[12:00:00] ${style('test message')}\n`
127
- : `${style('test message')}\n`;
128
- expect(mockStdout).toHaveBeenCalledWith(expectedOutput);
129
- mockStdout.mockClear();
105
+ });
106
+ expect(mockStderr).toHaveBeenCalledWith('test message\n');
107
+ });
108
+ test.each([
109
+ ['error', 'red', false],
110
+ ['warn', 'yellow', false],
111
+ ['info', 'white', false],
112
+ ['debug', 'gray', true],
113
+ ['trace', 'gray', true],
114
+ ])('outputs %ss in %s color ', async (level, color, shouldAddTime) => {
115
+ // Given
116
+ const style = chalk[color];
117
+ let expectedOutput = `${style('test message')}\n`;
118
+ if (shouldAddTime) {
119
+ expectedOutput = `[12:00:00] ${expectedOutput}`;
130
120
  }
121
+ // When
122
+ await ioHost.notify({
123
+ ...defaultMessage,
124
+ level,
125
+ });
126
+ // Then
127
+ expect(mockStderr).toHaveBeenCalledWith(expectedOutput);
128
+ mockStdout.mockClear();
131
129
  });
132
130
  });
133
131
  describe('action handling', () => {
@@ -176,9 +174,8 @@ describe('CliIoHost', () => {
176
174
  action: 'synth',
177
175
  code: 'CDK_TOOLKIT_I0001',
178
176
  message: 'debug message',
179
- forceStdout: true,
180
177
  });
181
- expect(mockStdout).toHaveBeenCalledWith(`[12:34:56] ${chalk.gray('debug message')}\n`);
178
+ expect(mockStderr).toHaveBeenCalledWith(`[12:34:56] ${chalk.gray('debug message')}\n`);
182
179
  });
183
180
  test('excludes timestamp for other levels but includes color', async () => {
184
181
  const testDate = new Date('2024-01-01T12:34:56');
@@ -188,42 +185,149 @@ describe('CliIoHost', () => {
188
185
  action: 'synth',
189
186
  code: 'CDK_TOOLKIT_I0001',
190
187
  message: 'info message',
191
- forceStdout: true,
192
188
  });
193
- expect(mockStdout).toHaveBeenCalledWith(chalk.white('info message') + '\n');
194
- });
195
- });
196
- describe('error handling', () => {
197
- test('rejects on write error', async () => {
198
- jest.spyOn(process.stdout, 'write').mockImplementation((_, callback) => {
199
- if (callback)
200
- callback(new Error('Write failed'));
201
- return true;
202
- });
203
- await expect(ioHost.notify({
204
- time: new Date(),
205
- level: 'info',
206
- action: 'synth',
207
- code: 'CDK_TOOLKIT_I0001',
208
- message: 'test message',
209
- forceStdout: true,
210
- })).rejects.toThrow('Write failed');
189
+ expect(mockStderr).toHaveBeenCalledWith(chalk.white('info message') + '\n');
211
190
  });
212
191
  });
213
192
  describe('requestResponse', () => {
214
- test('logs messages and returns default', async () => {
193
+ beforeEach(() => {
215
194
  ioHost.isTTY = true;
216
- const response = await ioHost.requestResponse({
195
+ ioHost.isCI = false;
196
+ });
197
+ test('fail if concurrency is > 1', async () => {
198
+ await expect(() => ioHost.requestResponse({
217
199
  time: new Date(),
218
200
  level: 'info',
219
201
  action: 'synth',
220
202
  code: 'CDK_TOOLKIT_I0001',
221
- message: 'test message',
222
- defaultResponse: 'default response',
203
+ message: 'Continue?',
204
+ defaultResponse: true,
205
+ data: {
206
+ concurrency: 3,
207
+ },
208
+ })).rejects.toThrow('but concurrency is greater than 1');
209
+ });
210
+ describe('boolean', () => {
211
+ test('respond "yes" to a confirmation prompt', async () => {
212
+ (0, prompts_1.sendResponse)('y');
213
+ const response = await ioHost.requestResponse({
214
+ time: new Date(),
215
+ level: 'info',
216
+ action: 'synth',
217
+ code: 'CDK_TOOLKIT_I0001',
218
+ message: 'Continue?',
219
+ defaultResponse: true,
220
+ });
221
+ expect(mockStdout).toHaveBeenCalledWith(chalk.cyan('Continue?') + ' (y/n) ');
222
+ expect(response).toBe(true);
223
+ });
224
+ test('respond "no" to a confirmation prompt', async () => {
225
+ (0, prompts_1.sendResponse)('n');
226
+ await expect(() => ioHost.requestResponse({
227
+ time: new Date(),
228
+ level: 'info',
229
+ action: 'synth',
230
+ code: 'CDK_TOOLKIT_I0001',
231
+ message: 'Continue?',
232
+ defaultResponse: true,
233
+ })).rejects.toThrow('Aborted by user');
234
+ expect(mockStdout).toHaveBeenCalledWith(chalk.cyan('Continue?') + ' (y/n) ');
235
+ });
236
+ });
237
+ describe('string', () => {
238
+ test.each([
239
+ ['bear', 'bear'],
240
+ ['giraffe', 'giraffe'],
241
+ // simulate the enter key
242
+ ['\x0A', 'cat'],
243
+ ])('receives %p and returns %p', async (input, expectedResponse) => {
244
+ (0, prompts_1.sendResponse)(input);
245
+ const response = await ioHost.requestResponse({
246
+ time: new Date(),
247
+ level: 'info',
248
+ action: 'synth',
249
+ code: 'CDK_TOOLKIT_I0001',
250
+ message: 'Favorite animal',
251
+ defaultResponse: 'cat',
252
+ });
253
+ expect(mockStdout).toHaveBeenCalledWith(chalk.cyan('Favorite animal') + ' (cat) ');
254
+ expect(response).toBe(expectedResponse);
255
+ });
256
+ });
257
+ describe('number', () => {
258
+ test.each([
259
+ ['3', 3],
260
+ // simulate the enter key
261
+ ['\x0A', 1],
262
+ ])('receives %p and return %p', async (input, expectedResponse) => {
263
+ (0, prompts_1.sendResponse)(input);
264
+ const response = await ioHost.requestResponse({
265
+ time: new Date(),
266
+ level: 'info',
267
+ action: 'synth',
268
+ code: 'CDK_TOOLKIT_I0001',
269
+ message: 'How many would you like?',
270
+ defaultResponse: 1,
271
+ });
272
+ expect(mockStdout).toHaveBeenCalledWith(chalk.cyan('How many would you like?') + ' (1) ');
273
+ expect(response).toBe(expectedResponse);
274
+ });
275
+ });
276
+ describe('non-promptable data', () => {
277
+ test('logs messages and returns default unchanged', async () => {
278
+ const response = await ioHost.requestResponse({
279
+ time: new Date(),
280
+ level: 'info',
281
+ action: 'synth',
282
+ code: 'CDK_TOOLKIT_I0001',
283
+ message: 'test message',
284
+ defaultResponse: [1, 2, 3],
285
+ });
286
+ expect(mockStderr).toHaveBeenCalledWith(chalk.white('test message') + '\n');
287
+ expect(response).toEqual([1, 2, 3]);
288
+ });
289
+ });
290
+ describe('non TTY environment', () => {
291
+ beforeEach(() => {
292
+ ioHost.isTTY = false;
293
+ ioHost.isCI = false;
294
+ });
295
+ test('fail for all prompts', async () => {
296
+ await expect(() => ioHost.requestResponse({
297
+ time: new Date(),
298
+ level: 'info',
299
+ action: 'synth',
300
+ code: 'CDK_TOOLKIT_I0001',
301
+ message: 'Continue?',
302
+ defaultResponse: true,
303
+ })).rejects.toThrow('User input is needed');
304
+ });
305
+ test('fail with specific motivation', async () => {
306
+ await expect(() => ioHost.requestResponse({
307
+ time: new Date(),
308
+ level: 'info',
309
+ action: 'synth',
310
+ code: 'CDK_TOOLKIT_I0001',
311
+ message: 'Continue?',
312
+ defaultResponse: true,
313
+ data: {
314
+ motivation: 'Bananas are yellow',
315
+ },
316
+ })).rejects.toThrow('Bananas are yellow');
317
+ });
318
+ test('returns the default for non-promptable requests', async () => {
319
+ const response = await ioHost.requestResponse({
320
+ time: new Date(),
321
+ level: 'info',
322
+ action: 'synth',
323
+ code: 'CDK_TOOLKIT_I0001',
324
+ message: 'test message',
325
+ defaultResponse: [1, 2, 3],
326
+ });
327
+ expect(mockStderr).toHaveBeenCalledWith('test message\n');
328
+ expect(response).toEqual([1, 2, 3]);
223
329
  });
224
- expect(mockStderr).toHaveBeenCalledWith(chalk.white('test message') + '\n');
225
- expect(response).toBe('default response');
226
330
  });
227
331
  });
228
332
  });
229
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWlvLWhvc3QudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNsaS1pby1ob3N0LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQkFBK0I7QUFDL0IsK0RBQXFFO0FBRXJFLE1BQU0sTUFBTSxHQUFHLHVCQUFTLENBQUMsUUFBUSxDQUFDO0lBQ2hDLFFBQVEsRUFBRSxPQUFPO0NBQ2xCLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO0lBQ3pCLElBQUksVUFBcUIsQ0FBQztJQUMxQixJQUFJLFVBQXFCLENBQUM7SUFDMUIsSUFBSSxjQUFrQyxDQUFDO0lBRXZDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZCLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFFdkIsd0JBQXdCO1FBQ3hCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDO1FBRS9CLGNBQWMsR0FBRztZQUNmLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztZQUNyQyxLQUFLLEVBQUUsTUFBTTtZQUNiLE1BQU0sRUFBRSxPQUFPO1lBQ2YsSUFBSSxFQUFFLG1CQUFtQjtZQUN6QixPQUFPLEVBQUUsY0FBYztTQUN4QixDQUFDO1FBRUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsR0FBUSxFQUFFLFFBQWMsRUFBRSxFQUFRLEVBQUUsRUFBRTtZQUM1RixVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDM0IsTUFB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RSxHQUFHLEVBQUU7UUFDL0IsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ25ELE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLGVBQWUsQ0FBQztnQkFDNUMsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUNoQixLQUFLLEVBQUUsTUFBTTtnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixJQUFJLEVBQUUsbUJBQW1CO2dCQUN6QixPQUFPLEVBQUUsY0FBYztnQkFDdkIsZUFBZSxFQUFFLGtCQUFrQjthQUNwQyxDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUM1RSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgQ2xpSW9Ib3N0LCBJb01lc3NhZ2UgfSBmcm9tICcuLi8uLi9saWIvdG9vbGtpdC9jbGktaW8taG9zdCc7XG5cbmNvbnN0IGlvSG9zdCA9IENsaUlvSG9zdC5pbnN0YW5jZSh7XG4gIGxvZ0xldmVsOiAndHJhY2UnLFxufSk7XG5cbmRlc2NyaWJlKCdDbGlJb0hvc3QnLCAoKSA9PiB7XG4gIGxldCBtb2NrU3Rkb3V0OiBqZXN0Lk1vY2s7XG4gIGxldCBtb2NrU3RkZXJyOiBqZXN0Lk1vY2s7XG4gIGxldCBkZWZhdWx0TWVzc2FnZTogSW9NZXNzYWdlPHVua25vd24+O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG1vY2tTdGRvdXQgPSBqZXN0LmZuKCk7XG4gICAgbW9ja1N0ZGVyciA9IGplc3QuZm4oKTtcblxuICAgIC8vIFJlc2V0IHNpbmdsZXRvbiBzdGF0ZVxuICAgIGlvSG9zdC5pc1RUWSA9IHByb2Nlc3Muc3Rkb3V0LmlzVFRZID8/IGZhbHNlO1xuICAgIGlvSG9zdC5pc0NJID0gZmFsc2U7XG4gICAgaW9Ib3N0LmN1cnJlbnRBY3Rpb24gPSAnc3ludGgnO1xuXG4gICAgZGVmYXVsdE1lc3NhZ2UgPSB7XG4gICAgICB0aW1lOiBuZXcgRGF0ZSgnMjAyNC0wMS0wMVQxMjowMDowMCcpLFxuICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICBtZXNzYWdlOiAndGVzdCBtZXNzYWdlJyxcbiAgICB9O1xuXG4gICAgamVzdC5zcHlPbihwcm9jZXNzLnN0ZG91dCwgJ3dyaXRlJykubW9ja0ltcGxlbWVudGF0aW9uKChzdHI6IGFueSwgZW5jb2Rpbmc/OiBhbnksIGNiPzogYW55KSA9PiB7XG4gICAgICBtb2NrU3Rkb3V0KHN0ci50b1N0cmluZygpKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nID8gZW5jb2RpbmcgOiBjYjtcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgamVzdC5zcHlPbihwcm9jZXNzLnN0ZGVyciwgJ3dyaXRlJykubW9ja0ltcGxlbWVudGF0aW9uKChzdHI6IGFueSwgZW5jb2Rpbmc/OiBhbnksIGNiPzogYW55KSA9PiB7XG4gICAgICBtb2NrU3RkZXJyKHN0ci50b1N0cmluZygpKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nID8gZW5jb2RpbmcgOiBjYjtcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIGplc3QucmVzdG9yZUFsbE1vY2tzKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdHJlYW0gc2VsZWN0aW9uJywgKCkgPT4ge1xuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRlcnIgYnkgZGVmYXVsdCBmb3Igbm9uLWVycm9yIG1lc3NhZ2VzIGluIG5vbi1DSSBtb2RlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgIG1lc3NhZ2U6ICd0ZXN0IG1lc3NhZ2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay53aGl0ZSgndGVzdCBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZG91dCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRlcnIgZm9yIGVycm9yIGxldmVsIHdpdGggcmVkIGNvbG9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfRTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnZXJyb3IgbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLnJlZCgnZXJyb3IgbWVzc2FnZScpICsgJ1xcbicpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd3cml0ZXMgdG8gc3Rkb3V0IHdoZW4gZm9yY2VTdGRvdXQgaXMgdHJ1ZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGlvSG9zdC5pc1RUWSA9IHRydWU7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnZm9yY2VkIG1lc3NhZ2UnLFxuICAgICAgICBmb3JjZVN0ZG91dDogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobW9ja1N0ZG91dCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoY2hhbGsud2hpdGUoJ2ZvcmNlZCBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ21lc3NhZ2UgZm9ybWF0dGluZycsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGlvSG9zdC5pc1RUWSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdmb3JtYXRzIGRlYnVnIG1lc3NhZ2VzIHdpdGggdGltZXN0YW1wJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIC4uLmRlZmF1bHRNZXNzYWdlLFxuICAgICAgICBsZXZlbDogJ2RlYnVnJyxcbiAgICAgICAgZm9yY2VTdGRvdXQ6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGBbMTI6MDA6MDBdICR7Y2hhbGsuZ3JheSgndGVzdCBtZXNzYWdlJyl9XFxuYCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdmb3JtYXRzIHRyYWNlIG1lc3NhZ2VzIHdpdGggdGltZXN0YW1wJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIC4uLmRlZmF1bHRNZXNzYWdlLFxuICAgICAgICBsZXZlbDogJ3RyYWNlJyxcbiAgICAgICAgZm9yY2VTdGRvdXQ6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGBbMTI6MDA6MDBdICR7Y2hhbGsuZ3JheSgndGVzdCBtZXNzYWdlJyl9XFxuYCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdhcHBsaWVzIG5vIHN0eWxpbmcgd2hlbiBUVFkgaXMgZmFsc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBpb0hvc3QuaXNUVFkgPSBmYWxzZTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICAuLi5kZWZhdWx0TWVzc2FnZSxcbiAgICAgICAgZm9yY2VTdGRvdXQ6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCd0ZXN0IG1lc3NhZ2VcXG4nKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2FwcGxpZXMgY29ycmVjdCBjb2xvciBzdHlsZXMgZm9yIGRpZmZlcmVudCBtZXNzYWdlIGxldmVscycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3RDYXNlcyA9IFtcbiAgICAgICAgeyBsZXZlbDogJ2Vycm9yJyBhcyBjb25zdCwgc3R5bGU6IGNoYWxrLnJlZCB9LFxuICAgICAgICB7IGxldmVsOiAnd2FybicgYXMgY29uc3QsIHN0eWxlOiBjaGFsay55ZWxsb3cgfSxcbiAgICAgICAgeyBsZXZlbDogJ2luZm8nIGFzIGNvbnN0LCBzdHlsZTogY2hhbGsud2hpdGUgfSxcbiAgICAgICAgeyBsZXZlbDogJ2RlYnVnJyBhcyBjb25zdCwgc3R5bGU6IGNoYWxrLmdyYXkgfSxcbiAgICAgICAgeyBsZXZlbDogJ3RyYWNlJyBhcyBjb25zdCwgc3R5bGU6IGNoYWxrLmdyYXkgfSxcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgeyBsZXZlbCwgc3R5bGUgfSBvZiB0ZXN0Q2FzZXMpIHtcbiAgICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgICAgLi4uZGVmYXVsdE1lc3NhZ2UsXG4gICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgZm9yY2VTdGRvdXQ6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkT3V0cHV0ID0gbGV2ZWwgPT09ICdkZWJ1ZycgfHwgbGV2ZWwgPT09ICd0cmFjZSdcbiAgICAgICAgICA/IGBbMTI6MDA6MDBdICR7c3R5bGUoJ3Rlc3QgbWVzc2FnZScpfVxcbmBcbiAgICAgICAgICA6IGAke3N0eWxlKCd0ZXN0IG1lc3NhZ2UnKX1cXG5gO1xuXG4gICAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3RlZE91dHB1dCk7XG4gICAgICAgIG1vY2tTdGRvdXQubW9ja0NsZWFyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhY3Rpb24gaGFuZGxpbmcnLCAoKSA9PiB7XG4gICAgdGVzdCgnc2V0cyBhbmQgZ2V0cyBjdXJyZW50IGFjdGlvbicsICgpID0+IHtcbiAgICAgIGlvSG9zdC5jdXJyZW50QWN0aW9uID0gJ2RlcGxveSc7XG4gICAgICBleHBlY3QoaW9Ib3N0LmN1cnJlbnRBY3Rpb24pLnRvQmUoJ2RlcGxveScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ0kgbW9kZSBiZWhhdmlvcicsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGlvSG9zdC5pc1RUWSA9IHRydWU7XG4gICAgICBpb0hvc3QuaXNDSSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd3cml0ZXMgdG8gc3Rkb3V0IGluIENJIG1vZGUgd2hlbiBsZXZlbCBpcyBub3QgZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfVzAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnY2kgbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLndoaXRlKCdjaSBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRlcnIgZm9yIGVycm9yIGxldmVsIGluIENJIG1vZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0UwMDAxJyxcbiAgICAgICAgbWVzc2FnZTogJ2NpIGVycm9yIG1lc3NhZ2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay5yZWQoJ2NpIGVycm9yIG1lc3NhZ2UnKSArICdcXG4nKTtcbiAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndGltZXN0YW1wIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGVzIHRpbWVzdGFtcCBmb3IgREVCVUcgbGV2ZWwgd2l0aCBncmF5IGNvbG9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGUgPSBuZXcgRGF0ZSgnMjAyNC0wMS0wMVQxMjozNDo1NicpO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIHRpbWU6IHRlc3REYXRlLFxuICAgICAgICBsZXZlbDogJ2RlYnVnJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnZGVidWcgbWVzc2FnZScsXG4gICAgICAgIGZvcmNlU3Rkb3V0OiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChgWzEyOjM0OjU2XSAke2NoYWxrLmdyYXkoJ2RlYnVnIG1lc3NhZ2UnKX1cXG5gKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2V4Y2x1ZGVzIHRpbWVzdGFtcCBmb3Igb3RoZXIgbGV2ZWxzIGJ1dCBpbmNsdWRlcyBjb2xvcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3REYXRlID0gbmV3IERhdGUoJzIwMjQtMDEtMDFUMTI6MzQ6NTYnKTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICB0aW1lOiB0ZXN0RGF0ZSxcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnaW5mbyBtZXNzYWdlJyxcbiAgICAgICAgZm9yY2VTdGRvdXQ6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLndoaXRlKCdpbmZvIG1lc3NhZ2UnKSArICdcXG4nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Vycm9yIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgIHRlc3QoJ3JlamVjdHMgb24gd3JpdGUgZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICBqZXN0LnNweU9uKHByb2Nlc3Muc3Rkb3V0LCAnd3JpdGUnKS5tb2NrSW1wbGVtZW50YXRpb24oKF86IGFueSwgY2FsbGJhY2s6IGFueSkgPT4ge1xuICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKG5ldyBFcnJvcignV3JpdGUgZmFpbGVkJykpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBleHBlY3QoaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0kwMDAxJyxcbiAgICAgICAgbWVzc2FnZTogJ3Rlc3QgbWVzc2FnZScsXG4gICAgICAgIGZvcmNlU3Rkb3V0OiB0cnVlLFxuICAgICAgfSkpLnJlamVjdHMudG9UaHJvdygnV3JpdGUgZmFpbGVkJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZXF1ZXN0UmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgdGVzdCgnbG9ncyBtZXNzYWdlcyBhbmQgcmV0dXJucyBkZWZhdWx0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaW9Ib3N0LnJlcXVlc3RSZXNwb25zZSh7XG4gICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0kwMDAxJyxcbiAgICAgICAgbWVzc2FnZTogJ3Rlc3QgbWVzc2FnZScsXG4gICAgICAgIGRlZmF1bHRSZXNwb25zZTogJ2RlZmF1bHQgcmVzcG9uc2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay53aGl0ZSgndGVzdCBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgICBleHBlY3QocmVzcG9uc2UpLnRvQmUoJ2RlZmF1bHQgcmVzcG9uc2UnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
333
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWlvLWhvc3QudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNsaS1pby1ob3N0LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQkFBK0I7QUFDL0IsK0RBQXFGO0FBQ3JGLGlEQUFtRDtBQUVuRCxNQUFNLE1BQU0sR0FBRyx1QkFBUyxDQUFDLFFBQVEsQ0FBQztJQUNoQyxRQUFRLEVBQUUsT0FBTztDQUNsQixDQUFDLENBQUM7QUFFSCxRQUFRLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtJQUN6QixJQUFJLFVBQXFCLENBQUM7SUFDMUIsSUFBSSxVQUFxQixDQUFDO0lBQzFCLElBQUksY0FBa0MsQ0FBQztJQUV2QyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN2QixVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBRXZCLHdCQUF3QjtRQUN4QixNQUFNLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztRQUM3QyxNQUFNLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNwQixNQUFNLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztRQUUvQixjQUFjLEdBQUc7WUFDZixJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUM7WUFDckMsS0FBSyxFQUFFLE1BQU07WUFDYixNQUFNLEVBQUUsT0FBTztZQUNmLElBQUksRUFBRSxtQkFBbUI7WUFDekIsT0FBTyxFQUFFLGNBQWM7U0FDeEIsQ0FBQztRQUVGLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQVEsRUFBRSxRQUFjLEVBQUUsRUFBUSxFQUFFLEVBQUU7WUFDNUYsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxD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M0IsQ0FBQyxDQUFDO2dCQUVILE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMxRCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgQ2xpSW9Ib3N0LCBJb01lc3NhZ2UsIElvTWVzc2FnZUxldmVsIH0gZnJvbSAnLi4vLi4vbGliL3Rvb2xraXQvY2xpLWlvLWhvc3QnO1xuaW1wb3J0IHsgc2VuZFJlc3BvbnNlIH0gZnJvbSAnLi4vX2hlbHBlcnMvcHJvbXB0cyc7XG5cbmNvbnN0IGlvSG9zdCA9IENsaUlvSG9zdC5pbnN0YW5jZSh7XG4gIGxvZ0xldmVsOiAndHJhY2UnLFxufSk7XG5cbmRlc2NyaWJlKCdDbGlJb0hvc3QnLCAoKSA9PiB7XG4gIGxldCBtb2NrU3Rkb3V0OiBqZXN0Lk1vY2s7XG4gIGxldCBtb2NrU3RkZXJyOiBqZXN0Lk1vY2s7XG4gIGxldCBkZWZhdWx0TWVzc2FnZTogSW9NZXNzYWdlPHVua25vd24+O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG1vY2tTdGRvdXQgPSBqZXN0LmZuKCk7XG4gICAgbW9ja1N0ZGVyciA9IGplc3QuZm4oKTtcblxuICAgIC8vIFJlc2V0IHNpbmdsZXRvbiBzdGF0ZVxuICAgIGlvSG9zdC5pc1RUWSA9IHByb2Nlc3Muc3Rkb3V0LmlzVFRZID8/IGZhbHNlO1xuICAgIGlvSG9zdC5pc0NJID0gZmFsc2U7XG4gICAgaW9Ib3N0LmN1cnJlbnRBY3Rpb24gPSAnc3ludGgnO1xuXG4gICAgZGVmYXVsdE1lc3NhZ2UgPSB7XG4gICAgICB0aW1lOiBuZXcgRGF0ZSgnMjAyNC0wMS0wMVQxMjowMDowMCcpLFxuICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICBtZXNzYWdlOiAndGVzdCBtZXNzYWdlJyxcbiAgICB9O1xuXG4gICAgamVzdC5zcHlPbihwcm9jZXNzLnN0ZG91dCwgJ3dyaXRlJykubW9ja0ltcGxlbWVudGF0aW9uKChzdHI6IGFueSwgZW5jb2Rpbmc/OiBhbnksIGNiPzogYW55KSA9PiB7XG4gICAgICBtb2NrU3Rkb3V0KHN0ci50b1N0cmluZygpKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nID8gZW5jb2RpbmcgOiBjYjtcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgamVzdC5zcHlPbihwcm9jZXNzLnN0ZGVyciwgJ3dyaXRlJykubW9ja0ltcGxlbWVudGF0aW9uKChzdHI6IGFueSwgZW5jb2Rpbmc/OiBhbnksIGNiPzogYW55KSA9PiB7XG4gICAgICBtb2NrU3RkZXJyKHN0ci50b1N0cmluZygpKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nID8gZW5jb2RpbmcgOiBjYjtcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIGplc3QucmVzdG9yZUFsbE1vY2tzKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdHJlYW0gc2VsZWN0aW9uJywgKCkgPT4ge1xuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRlcnIgYnkgZGVmYXVsdCBmb3Igbm9uLWVycm9yIG1lc3NhZ2VzIGluIG5vbi1DSSBtb2RlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgIG1lc3NhZ2U6ICd0ZXN0IG1lc3NhZ2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay53aGl0ZSgndGVzdCBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZG91dCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRlcnIgZm9yIGVycm9yIGxldmVsIHdpdGggcmVkIGNvbG9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfRTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnZXJyb3IgbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLnJlZCgnZXJyb3IgbWVzc2FnZScpICsgJ1xcbicpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd3cml0ZXMgdG8gc3Rkb3V0IGZvciByZXN1bHQgbGV2ZWwnLCBhc3luYyAoKSA9PiB7XG4gICAgICBpb0hvc3QuaXNUVFkgPSB0cnVlO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgIGxldmVsOiAncmVzdWx0JyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAncmVzdWx0IG1lc3NhZ2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay53aGl0ZSgncmVzdWx0IG1lc3NhZ2UnKSArICdcXG4nKTtcbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbWVzc2FnZSBmb3JtYXR0aW5nJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2Zvcm1hdHMgZGVidWcgbWVzc2FnZXMgd2l0aCB0aW1lc3RhbXAnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgLi4uZGVmYXVsdE1lc3NhZ2UsXG4gICAgICAgIGxldmVsOiAnZGVidWcnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChgWzEyOjAwOjAwXSAke2NoYWxrLmdyYXkoJ3Rlc3QgbWVzc2FnZScpfVxcbmApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnZm9ybWF0cyB0cmFjZSBtZXNzYWdlcyB3aXRoIHRpbWVzdGFtcCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICAuLi5kZWZhdWx0TWVzc2FnZSxcbiAgICAgICAgbGV2ZWw6ICd0cmFjZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGBbMTI6MDA6MDBdICR7Y2hhbGsuZ3JheSgndGVzdCBtZXNzYWdlJyl9XFxuYCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdhcHBsaWVzIG5vIHN0eWxpbmcgd2hlbiBUVFkgaXMgZmFsc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBpb0hvc3QuaXNUVFkgPSBmYWxzZTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICAuLi5kZWZhdWx0TWVzc2FnZSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3Rlc3QgbWVzc2FnZVxcbicpO1xuICAgIH0pO1xuXG4gICAgdGVzdC5lYWNoKFtcbiAgICAgIFsnZXJyb3InLCAncmVkJywgZmFsc2VdLFxuICAgICAgWyd3YXJuJywgJ3llbGxvdycsIGZhbHNlXSxcbiAgICAgIFsnaW5mbycsICd3aGl0ZScsIGZhbHNlXSxcbiAgICAgIFsnZGVidWcnLCAnZ3JheScsIHRydWVdLFxuICAgICAgWyd0cmFjZScsICdncmF5JywgdHJ1ZV0sXG4gICAgXSBhcyBBcnJheTxbSW9NZXNzYWdlTGV2ZWwsIHR5cGVvZiBjaGFsay5Gb3JlZ3JvdW5kQ29sb3IsIGJvb2xlYW5dPikoJ291dHB1dHMgJXNzIGluICVzIGNvbG9yICcsIGFzeW5jIChsZXZlbCwgY29sb3IsIHNob3VsZEFkZFRpbWUpID0+IHtcbiAgICAgIC8vIEdpdmVuXG4gICAgICBjb25zdCBzdHlsZSA9IGNoYWxrW2NvbG9yXTtcbiAgICAgIGxldCBleHBlY3RlZE91dHB1dCA9IGAke3N0eWxlKCd0ZXN0IG1lc3NhZ2UnKX1cXG5gO1xuICAgICAgaWYgKHNob3VsZEFkZFRpbWUpIHtcbiAgICAgICAgZXhwZWN0ZWRPdXRwdXQgPSBgWzEyOjAwOjAwXSAke2V4cGVjdGVkT3V0cHV0fWA7XG4gICAgICB9XG5cbiAgICAgIC8vIFdoZW5cbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICAuLi5kZWZhdWx0TWVzc2FnZSxcbiAgICAgICAgbGV2ZWwsXG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdGVkT3V0cHV0KTtcbiAgICAgIG1vY2tTdGRvdXQubW9ja0NsZWFyKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhY3Rpb24gaGFuZGxpbmcnLCAoKSA9PiB7XG4gICAgdGVzdCgnc2V0cyBhbmQgZ2V0cyBjdXJyZW50IGFjdGlvbicsICgpID0+IHtcbiAgICAgIGlvSG9zdC5jdXJyZW50QWN0aW9uID0gJ2RlcGxveSc7XG4gICAgICBleHBlY3QoaW9Ib3N0LmN1cnJlbnRBY3Rpb24pLnRvQmUoJ2RlcGxveScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ0kgbW9kZSBiZWhhdmlvcicsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGlvSG9zdC5pc1RUWSA9IHRydWU7XG4gICAgICBpb0hvc3QuaXNDSSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd3cml0ZXMgdG8gc3Rkb3V0IGluIENJIG1vZGUgd2hlbiBsZXZlbCBpcyBub3QgZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfVzAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnY2kgbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLndoaXRlKCdjaSBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRlcnIgZm9yIGVycm9yIGxldmVsIGluIENJIG1vZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0UwMDAxJyxcbiAgICAgICAgbWVzc2FnZTogJ2NpIGVycm9yIG1lc3NhZ2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay5yZWQoJ2NpIGVycm9yIG1lc3NhZ2UnKSArICdcXG4nKTtcbiAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndGltZXN0YW1wIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGVzIHRpbWVzdGFtcCBmb3IgREVCVUcgbGV2ZWwgd2l0aCBncmF5IGNvbG9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGUgPSBuZXcgRGF0ZSgnMjAyNC0wMS0wMVQxMjozNDo1NicpO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIHRpbWU6IHRlc3REYXRlLFxuICAgICAgICBsZXZlbDogJ2RlYnVnJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnZGVidWcgbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGBbMTI6MzQ6NTZdICR7Y2hhbGsuZ3JheSgnZGVidWcgbWVzc2FnZScpfVxcbmApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnZXhjbHVkZXMgdGltZXN0YW1wIGZvciBvdGhlciBsZXZlbHMgYnV0IGluY2x1ZGVzIGNvbG9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGUgPSBuZXcgRGF0ZSgnMjAyNC0wMS0wMVQxMjozNDo1NicpO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIHRpbWU6IHRlc3REYXRlLFxuICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgIG1lc3NhZ2U6ICdpbmZvIG1lc3NhZ2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay53aGl0ZSgnaW5mbyBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZXF1ZXN0UmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBpb0hvc3QuaXNUVFkgPSB0cnVlO1xuICAgICAgaW9Ib3N0LmlzQ0kgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2ZhaWwgaWYgY29uY3VycmVuY3kgaXMgPiAxJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgZXhwZWN0KCgpID0+IGlvSG9zdC5yZXF1ZXN0UmVzcG9uc2Uoe1xuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgIG1lc3NhZ2U6ICdDb250aW51ZT8nLFxuICAgICAgICBkZWZhdWx0UmVzcG9uc2U6IHRydWUsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBjb25jdXJyZW5jeTogMyxcbiAgICAgICAgfSxcbiAgICAgIH0pKS5yZWplY3RzLnRvVGhyb3coJ2J1dCBjb25jdXJyZW5jeSBpcyBncmVhdGVyIHRoYW4gMScpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2Jvb2xlYW4nLCAoKSA9PiB7XG4gICAgICB0ZXN0KCdyZXNwb25kIFwieWVzXCIgdG8gYSBjb25maXJtYXRpb24gcHJvbXB0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZW5kUmVzcG9uc2UoJ3knKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvbnRpbnVlPycsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QobW9ja1N0ZG91dCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoY2hhbGsuY3lhbignQ29udGludWU/JykgKyAnICh5L24pICcpO1xuICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvQmUodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgdGVzdCgncmVzcG9uZCBcIm5vXCIgdG8gYSBjb25maXJtYXRpb24gcHJvbXB0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZW5kUmVzcG9uc2UoJ24nKTtcbiAgICAgICAgYXdhaXQgZXhwZWN0KCgpID0+IGlvSG9zdC5yZXF1ZXN0UmVzcG9uc2Uoe1xuICAgICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0kwMDAxJyxcbiAgICAgICAgICBtZXNzYWdlOiAnQ29udGludWU/JyxcbiAgICAgICAgICBkZWZhdWx0UmVzcG9uc2U6IHRydWUsXG4gICAgICAgIH0pKS5yZWplY3RzLnRvVGhyb3coJ0Fib3J0ZWQgYnkgdXNlcicpO1xuXG4gICAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay5jeWFuKCdDb250aW51ZT8nKSArICcgKHkvbikgJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzdHJpbmcnLCAoKSA9PiB7XG4gICAgICB0ZXN0LmVhY2goW1xuICAgICAgICBbJ2JlYXInLCAnYmVhciddLFxuICAgICAgICBbJ2dpcmFmZmUnLCAnZ2lyYWZmZSddLFxuICAgICAgICAvLyBzaW11bGF0ZSB0aGUgZW50ZXIga2V5XG4gICAgICAgIFsnXFx4MEEnLCAnY2F0J10sXG4gICAgICBdKSgncmVjZWl2ZXMgJXAgYW5kIHJldHVybnMgJXAnLCBhc3luYyAoaW5wdXQsIGV4cGVjdGVkUmVzcG9uc2UpID0+IHtcbiAgICAgICAgc2VuZFJlc3BvbnNlKGlucHV0KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ0Zhdm9yaXRlIGFuaW1hbCcsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiAnY2F0JyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLmN5YW4oJ0Zhdm9yaXRlIGFuaW1hbCcpICsgJyAoY2F0KSAnKTtcbiAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50b0JlKGV4cGVjdGVkUmVzcG9uc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbnVtYmVyJywgKCkgPT4ge1xuICAgICAgdGVzdC5lYWNoKFtcbiAgICAgICAgWyczJywgM10sXG4gICAgICAgIC8vIHNpbXVsYXRlIHRoZSBlbnRlciBrZXlcbiAgICAgICAgWydcXHgwQScsIDFdLFxuICAgICAgXSkoJ3JlY2VpdmVzICVwIGFuZCByZXR1cm4gJXAnLCBhc3luYyAoaW5wdXQsIGV4cGVjdGVkUmVzcG9uc2UpID0+IHtcbiAgICAgICAgc2VuZFJlc3BvbnNlKGlucHV0KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ0hvdyBtYW55IHdvdWxkIHlvdSBsaWtlPycsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiAxLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QobW9ja1N0ZG91dCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoY2hhbGsuY3lhbignSG93IG1hbnkgd291bGQgeW91IGxpa2U/JykgKyAnICgxKSAnKTtcbiAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50b0JlKGV4cGVjdGVkUmVzcG9uc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbm9uLXByb21wdGFibGUgZGF0YScsICgpID0+IHtcbiAgICAgIHRlc3QoJ2xvZ3MgbWVzc2FnZXMgYW5kIHJldHVybnMgZGVmYXVsdCB1bmNoYW5nZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaW9Ib3N0LnJlcXVlc3RSZXNwb25zZSh7XG4gICAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICAgIG1lc3NhZ2U6ICd0ZXN0IG1lc3NhZ2UnLFxuICAgICAgICAgIGRlZmF1bHRSZXNwb25zZTogWzEsIDIsIDNdLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoY2hhbGsud2hpdGUoJ3Rlc3QgbWVzc2FnZScpICsgJ1xcbicpO1xuICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvRXF1YWwoWzEsIDIsIDNdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ25vbiBUVFkgZW52aXJvbm1lbnQnLCAoKSA9PiB7XG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgaW9Ib3N0LmlzVFRZID0gZmFsc2U7XG4gICAgICAgIGlvSG9zdC5pc0NJID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgdGVzdCgnZmFpbCBmb3IgYWxsIHByb21wdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGV4cGVjdCgoKSA9PiBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvbnRpbnVlPycsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICB9KSkucmVqZWN0cy50b1Rocm93KCdVc2VyIGlucHV0IGlzIG5lZWRlZCcpO1xuICAgICAgfSk7XG5cbiAgICAgIHRlc3QoJ2ZhaWwgd2l0aCBzcGVjaWZpYyBtb3RpdmF0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBleHBlY3QoKCkgPT4gaW9Ib3N0LnJlcXVlc3RSZXNwb25zZSh7XG4gICAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdDb250aW51ZT8nLFxuICAgICAgICAgIGRlZmF1bHRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBtb3RpdmF0aW9uOiAnQmFuYW5hcyBhcmUgeWVsbG93JyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSkucmVqZWN0cy50b1Rocm93KCdCYW5hbmFzIGFyZSB5ZWxsb3cnKTtcbiAgICAgIH0pO1xuXG4gICAgICB0ZXN0KCdyZXR1cm5zIHRoZSBkZWZhdWx0IGZvciBub24tcHJvbXB0YWJsZSByZXF1ZXN0cycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ3Rlc3QgbWVzc2FnZScsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiBbMSwgMiwgM10sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgndGVzdCBtZXNzYWdlXFxuJyk7XG4gICAgICAgIGV4cGVjdChyZXNwb25zZSkudG9FcXVhbChbMSwgMiwgM10pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -1,9 +0,0 @@
1
- export declare function enableTracing(enabled: boolean): void;
2
- /**
3
- * Method decorator to trace a single static or member method, any time it's called
4
- */
5
- export declare function traceCall(receiver: object, _propertyKey: string, descriptor: PropertyDescriptor, parentClassName?: string): PropertyDescriptor;
6
- /**
7
- * Class decorator, enable tracing for all methods on this class
8
- */
9
- export declare function traceMethods(constructor: Function): void;
@@ -1,58 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.enableTracing = enableTracing;
4
- exports.traceCall = traceCall;
5
- exports.traceMethods = traceMethods;
6
- const logging_1 = require("../logging");
7
- let ENABLED = false;
8
- let INDENT = 0;
9
- function enableTracing(enabled) {
10
- ENABLED = enabled;
11
- }
12
- /**
13
- * Method decorator to trace a single static or member method, any time it's called
14
- */
15
- function traceCall(receiver, _propertyKey, descriptor, parentClassName) {
16
- const fn = descriptor.value;
17
- const className = typeof receiver === 'function' ? receiver.name : parentClassName;
18
- descriptor.value = function (...args) {
19
- if (!ENABLED) {
20
- return fn.apply(this, args);
21
- }
22
- (0, logging_1.debug)(`[trace] ${' '.repeat(INDENT)}${className || this.constructor.name || '(anonymous)'}#${fn.name}()`);
23
- INDENT += 2;
24
- const ret = fn.apply(this, args);
25
- if (ret instanceof Promise) {
26
- return ret.finally(() => {
27
- INDENT -= 2;
28
- });
29
- }
30
- else {
31
- INDENT -= 2;
32
- return ret;
33
- }
34
- };
35
- return descriptor;
36
- }
37
- /**
38
- * Class decorator, enable tracing for all methods on this class
39
- */
40
- function traceMethods(constructor) {
41
- // Statics
42
- for (const [name, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(constructor))) {
43
- if (typeof descriptor.value !== 'function') {
44
- continue;
45
- }
46
- const newDescriptor = traceCall(constructor, name, descriptor, constructor.name) ?? descriptor;
47
- Object.defineProperty(constructor, name, newDescriptor);
48
- }
49
- // Instancne members
50
- for (const [name, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(constructor.prototype))) {
51
- if (typeof descriptor.value !== 'function') {
52
- continue;
53
- }
54
- const newDescriptor = traceCall(constructor.prototype, name, descriptor, constructor.name) ?? descriptor;
55
- Object.defineProperty(constructor.prototype, name, newDescriptor);
56
- }
57
- }
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRyYWNpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSxzQ0FFQztBQUtELDhCQXFCQztBQUtELG9DQWNDO0FBcERELHdDQUFtQztBQUVuQyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7QUFDcEIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBRWYsU0FBZ0IsYUFBYSxDQUFDLE9BQWdCO0lBQzVDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDcEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLFFBQWdCLEVBQUUsWUFBb0IsRUFBRSxVQUE4QixFQUFFLGVBQXdCO0lBQ3hILE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDNUIsTUFBTSxTQUFTLEdBQUcsT0FBTyxRQUFRLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7SUFFbkYsVUFBVSxDQUFDLEtBQUssR0FBRyxVQUFVLEdBQUcsSUFBVztRQUN6QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUU5QyxJQUFBLGVBQUssRUFBQyxXQUFXLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLGFBQWEsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUMxRyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBRVosTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxHQUFHLFlBQVksT0FBTyxFQUFFLENBQUM7WUFDM0IsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDdEIsTUFBTSxJQUFJLENBQUMsQ0FBQztZQUNkLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksQ0FBQyxDQUFDO1lBQ1osT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLFdBQXFCO0lBQ2hELFVBQVU7SUFDVixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQy9GLElBQUksT0FBTyxVQUFVLENBQUMsS0FBSyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQUMsU0FBUztRQUFDLENBQUM7UUFDekQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUM7UUFDL0YsTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxvQkFBb0I7SUFDcEIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekcsSUFBSSxPQUFPLFVBQVUsQ0FBQyxLQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7WUFBQyxTQUFTO1FBQUMsQ0FBQztRQUN6RCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUM7UUFDekcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNwRSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlYnVnIH0gZnJvbSAnLi4vbG9nZ2luZyc7XG5cbmxldCBFTkFCTEVEID0gZmFsc2U7XG5sZXQgSU5ERU5UID0gMDtcblxuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZVRyYWNpbmcoZW5hYmxlZDogYm9vbGVhbikge1xuICBFTkFCTEVEID0gZW5hYmxlZDtcbn1cblxuLyoqXG4gKiBNZXRob2QgZGVjb3JhdG9yIHRvIHRyYWNlIGEgc2luZ2xlIHN0YXRpYyBvciBtZW1iZXIgbWV0aG9kLCBhbnkgdGltZSBpdCdzIGNhbGxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhY2VDYWxsKHJlY2VpdmVyOiBvYmplY3QsIF9wcm9wZXJ0eUtleTogc3RyaW5nLCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IsIHBhcmVudENsYXNzTmFtZT86IHN0cmluZykge1xuICBjb25zdCBmbiA9IGRlc2NyaXB0b3IudmFsdWU7XG4gIGNvbnN0IGNsYXNzTmFtZSA9IHR5cGVvZiByZWNlaXZlciA9PT0gJ2Z1bmN0aW9uJyA/IHJlY2VpdmVyLm5hbWUgOiBwYXJlbnRDbGFzc05hbWU7XG5cbiAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgIGlmICghRU5BQkxFRCkgeyByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncyk7IH1cblxuICAgIGRlYnVnKGBbdHJhY2VdICR7JyAnLnJlcGVhdChJTkRFTlQpfSR7Y2xhc3NOYW1lIHx8IHRoaXMuY29uc3RydWN0b3IubmFtZSB8fCAnKGFub255bW91cyknfSMke2ZuLm5hbWV9KClgKTtcbiAgICBJTkRFTlQgKz0gMjtcblxuICAgIGNvbnN0IHJldCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIGlmIChyZXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICByZXR1cm4gcmV0LmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBJTkRFTlQgLT0gMjtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBJTkRFTlQgLT0gMjtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICB9O1xuICByZXR1cm4gZGVzY3JpcHRvcjtcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWNvcmF0b3IsIGVuYWJsZSB0cmFjaW5nIGZvciBhbGwgbWV0aG9kcyBvbiB0aGlzIGNsYXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFjZU1ldGhvZHMoY29uc3RydWN0b3I6IEZ1bmN0aW9uKSB7XG4gIC8vIFN0YXRpY3NcbiAgZm9yIChjb25zdCBbbmFtZSwgZGVzY3JpcHRvcl0gb2YgT2JqZWN0LmVudHJpZXMoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY29uc3RydWN0b3IpKSkge1xuICAgIGlmICh0eXBlb2YgZGVzY3JpcHRvci52YWx1ZSAhPT0gJ2Z1bmN0aW9uJykgeyBjb250aW51ZTsgfVxuICAgIGNvbnN0IG5ld0Rlc2NyaXB0b3IgPSB0cmFjZUNhbGwoY29uc3RydWN0b3IsIG5hbWUsIGRlc2NyaXB0b3IsIGNvbnN0cnVjdG9yLm5hbWUpID8/IGRlc2NyaXB0b3I7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnN0cnVjdG9yLCBuYW1lLCBuZXdEZXNjcmlwdG9yKTtcbiAgfVxuXG4gIC8vIEluc3RhbmNuZSBtZW1iZXJzXG4gIGZvciAoY29uc3QgW25hbWUsIGRlc2NyaXB0b3JdIG9mIE9iamVjdC5lbnRyaWVzKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNvbnN0cnVjdG9yLnByb3RvdHlwZSkpKSB7XG4gICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7IGNvbnRpbnVlOyB9XG4gICAgY29uc3QgbmV3RGVzY3JpcHRvciA9IHRyYWNlQ2FsbChjb25zdHJ1Y3Rvci5wcm90b3R5cGUsIG5hbWUsIGRlc2NyaXB0b3IsIGNvbnN0cnVjdG9yLm5hbWUpID8/IGRlc2NyaXB0b3I7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnN0cnVjdG9yLnByb3RvdHlwZSwgbmFtZSwgbmV3RGVzY3JpcHRvcik7XG4gIH1cbn1cbiJdfQ==