@aws-solutions-constructs/core 2.98.0 → 2.100.0

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 (46) hide show
  1. package/.jsii +423 -19
  2. package/index.d.ts +2 -0
  3. package/index.js +3 -1
  4. package/lib/constructs-feature-flags.d.ts +2 -0
  5. package/lib/constructs-feature-flags.js +12 -6
  6. package/lib/polly-helper.d.ts +50 -0
  7. package/lib/polly-helper.js +138 -0
  8. package/lib/step-function-helper.js +12 -2
  9. package/lib/validation.d.ts +60 -0
  10. package/lib/validation.js +594 -0
  11. package/lib/vpc-helper.d.ts +2 -1
  12. package/lib/vpc-helper.js +7 -1
  13. package/nohoist.sh +6 -1
  14. package/package.json +4 -5
  15. package/test/alb-helper.test.js +14 -14
  16. package/test/apigateway-helper.test.js +4 -4
  17. package/test/bedrock-inference-helper.test.js +2 -2
  18. package/test/cloudfront-distribution-s3-helper.test.js +8 -8
  19. package/test/constructs-feature-flags.test.js +10 -3
  20. package/test/dynamo-table.test.js +4 -4
  21. package/test/elasticsearch-helper.test.js +2 -2
  22. package/test/eventbridge-helper.test.js +2 -2
  23. package/test/fargate-helper.test.js +9 -9
  24. package/test/glue-job-helper.test.js +4 -4
  25. package/test/kendra-helper.test.js +6 -6
  26. package/test/kinesis-streams-helper.test.js +2 -2
  27. package/test/lambda-helper.test.js +5 -5
  28. package/test/opensearch-helper.test.js +2 -2
  29. package/test/override-warning-service.test.js +13 -13
  30. package/test/pipes-helper.test.js +12 -12
  31. package/test/polly-helper.test.d.ts +13 -0
  32. package/test/polly-helper.test.js +495 -0
  33. package/test/s3-bucket.test.js +5 -5
  34. package/test/sagemaker-helper.test.js +7 -7
  35. package/test/secretsmanager-helper.test.js +2 -2
  36. package/test/sns-helper.test.js +7 -7
  37. package/test/sqs-helper.test.js +13 -13
  38. package/test/step-function-helper.test.js +6 -6
  39. package/test/test-helper.d.ts +1 -1
  40. package/test/test-helper.js +1 -1
  41. package/test/utils.test.js +9 -9
  42. package/test/validation.test.d.ts +13 -0
  43. package/test/validation.test.js +218 -0
  44. package/test/vpc-helper.test.js +33 -6
  45. package/test/waf-helper.test.js +2 -2
  46. package/test/websocket-api-helper.test.js +4 -4
@@ -0,0 +1,495 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
6
+ * with the License. A copy of the License is located at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
11
+ * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
12
+ * and limitations under the License.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const defaults = require("../index");
16
+ const test_helper_1 = require("./test-helper");
17
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
18
+ const assertions_1 = require("aws-cdk-lib/assertions");
19
+ // =============================================
20
+ // Test ConfigurePollySupport()
21
+ // =============================================
22
+ test('Test deployment with asyncJobs enabled', () => {
23
+ const app = new aws_cdk_lib_1.App();
24
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
25
+ const configuration = defaults.ConfigurePollySupport(stack, 'test', { asyncJobs: true });
26
+ expect(configuration.destinationBucket).toBeDefined();
27
+ expect(configuration.destinationBucket?.bucket).toBeDefined();
28
+ expect(configuration.destinationBucket?.bucketInterface).toBeDefined();
29
+ expect(configuration.destinationBucket?.loggingBucket).toBeDefined();
30
+ expect(configuration.snsNotificationTopic).toBeDefined();
31
+ expect(configuration.notificationTopicEncryptionKey).toBeDefined();
32
+ expect(configuration.lambdaIamActionsRequired).toEqual(expect.arrayContaining([
33
+ 'polly:SynthesizeSpeech',
34
+ 'polly:StartSpeechSynthesisTask',
35
+ 'polly:GetSpeechSynthesisTask',
36
+ 'polly:ListSpeechSynthesisTasks'
37
+ ]));
38
+ expect(configuration.lambdaIamActionsRequired).toHaveLength(4);
39
+ // Check environment variables
40
+ expect(configuration.environmentVariables).toHaveLength(2);
41
+ expect(configuration.environmentVariables[0].defaultName).toBe('OUTPUT_BUCKET_NAME');
42
+ expect(configuration.environmentVariables[0].value).toBe(configuration.destinationBucket.bucketInterface.bucketName);
43
+ expect(configuration.environmentVariables[1].defaultName).toBe('SNS_TOPIC_ARN');
44
+ expect(configuration.environmentVariables[1].value).toBe(configuration.snsNotificationTopic.topicArn);
45
+ const template = assertions_1.Template.fromStack(stack);
46
+ template.resourceCountIs('AWS::S3::Bucket', 2); // 1 main bucket + 1 logging bucket
47
+ template.resourceCountIs('AWS::SNS::Topic', 1); // SNS topic for async job notifications
48
+ });
49
+ test('Test deployment without asyncJobs enabled', () => {
50
+ const app = new aws_cdk_lib_1.App();
51
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
52
+ const configuration = defaults.ConfigurePollySupport(stack, 'test', {});
53
+ expect(configuration.destinationBucket).not.toBeDefined();
54
+ expect(configuration.snsNotificationTopic).not.toBeDefined();
55
+ expect(configuration.notificationTopicEncryptionKey).not.toBeDefined();
56
+ expect(configuration.lambdaIamActionsRequired).toEqual(expect.arrayContaining([
57
+ 'polly:SynthesizeSpeech'
58
+ ]));
59
+ expect(configuration.lambdaIamActionsRequired).toHaveLength(1);
60
+ expect(configuration.environmentVariables).toHaveLength(0);
61
+ const template = assertions_1.Template.fromStack(stack);
62
+ template.resourceCountIs('AWS::SNS::Topic', 0);
63
+ template.resourceCountIs('AWS::S3::Bucket', 0);
64
+ });
65
+ test('Test deployment with asyncJobs false', () => {
66
+ const app = new aws_cdk_lib_1.App();
67
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
68
+ const configuration = defaults.ConfigurePollySupport(stack, 'test', { asyncJobs: false });
69
+ expect(configuration.destinationBucket).not.toBeDefined();
70
+ expect(configuration.snsNotificationTopic).not.toBeDefined();
71
+ expect(configuration.notificationTopicEncryptionKey).not.toBeDefined();
72
+ expect(configuration.lambdaIamActionsRequired).toEqual(expect.arrayContaining([
73
+ 'polly:SynthesizeSpeech'
74
+ ]));
75
+ expect(configuration.lambdaIamActionsRequired).toHaveLength(1);
76
+ expect(configuration.environmentVariables).toHaveLength(0);
77
+ const template = assertions_1.Template.fromStack(stack);
78
+ template.resourceCountIs('AWS::SNS::Topic', 0);
79
+ template.resourceCountIs('AWS::S3::Bucket', 0);
80
+ });
81
+ test('Test deployment with existing bucket', () => {
82
+ const app = new aws_cdk_lib_1.App();
83
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
84
+ const existingBucket = (0, test_helper_1.CreateScrapBucket)(stack, "scrap", {});
85
+ const configuration = defaults.ConfigurePollySupport(stack, 'test', {
86
+ asyncJobs: true,
87
+ existingBucketObj: existingBucket
88
+ });
89
+ expect(configuration.destinationBucket).toBeDefined();
90
+ expect(configuration.destinationBucket?.bucket).not.toBeDefined();
91
+ expect(configuration.destinationBucket?.bucketInterface).toBeDefined();
92
+ expect(configuration.destinationBucket?.loggingBucket).not.toBeDefined();
93
+ expect(configuration.destinationBucket?.bucketInterface).toBe(existingBucket);
94
+ expect(configuration.snsNotificationTopic).toBeDefined();
95
+ const template = assertions_1.Template.fromStack(stack);
96
+ template.resourceCountIs('AWS::S3::Bucket', 2); // existing bucket + 1 new bucket (scrap bucket)
97
+ });
98
+ test('Test deployment with existing topic', () => {
99
+ const app = new aws_cdk_lib_1.App();
100
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
101
+ const existingTopic = defaults.buildTopic(stack, 'existing-topic', {
102
+ topicProps: {
103
+ topicName: 'pre-existing-topic'
104
+ }
105
+ }).topic;
106
+ const configuration = defaults.ConfigurePollySupport(stack, 'test', {
107
+ asyncJobs: true,
108
+ existingTopicObj: existingTopic
109
+ });
110
+ expect(configuration.snsNotificationTopic).toBeDefined();
111
+ expect(configuration.snsNotificationTopic).toBe(existingTopic);
112
+ expect(configuration.destinationBucket).toBeDefined();
113
+ const template = assertions_1.Template.fromStack(stack);
114
+ template.resourceCountIs('AWS::SNS::Topic', 1);
115
+ template.hasResourceProperties('AWS::SNS::Topic', {
116
+ TopicName: 'pre-existing-topic'
117
+ });
118
+ });
119
+ test('Test deployment with custom bucket props', () => {
120
+ const app = new aws_cdk_lib_1.App();
121
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
122
+ defaults.ConfigurePollySupport(stack, 'test', {
123
+ asyncJobs: true,
124
+ bucketProps: {
125
+ bucketName: "custom-polly-bucket"
126
+ },
127
+ loggingBucketProps: {
128
+ bucketName: "custom-logging-bucket"
129
+ }
130
+ });
131
+ const template = assertions_1.Template.fromStack(stack);
132
+ template.resourceCountIs("AWS::S3::Bucket", 2);
133
+ template.hasResourceProperties("AWS::S3::Bucket", {
134
+ BucketName: "custom-polly-bucket",
135
+ LoggingConfiguration: {
136
+ DestinationBucketName: {
137
+ Ref: assertions_1.Match.stringLikeRegexp("testoutputbucketS3LoggingBucket.*")
138
+ }
139
+ }
140
+ });
141
+ template.hasResourceProperties("AWS::S3::Bucket", {
142
+ BucketName: "custom-logging-bucket",
143
+ AccessControl: "LogDeliveryWrite"
144
+ });
145
+ });
146
+ test('Test deployment with custom topic props', () => {
147
+ const app = new aws_cdk_lib_1.App();
148
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
149
+ defaults.ConfigurePollySupport(stack, 'test', {
150
+ asyncJobs: true,
151
+ topicProps: {
152
+ topicName: 'custom-polly-topic',
153
+ displayName: 'Custom Polly Notifications'
154
+ }
155
+ });
156
+ const template = assertions_1.Template.fromStack(stack);
157
+ template.resourceCountIs('AWS::SNS::Topic', 1);
158
+ template.hasResourceProperties('AWS::SNS::Topic', {
159
+ TopicName: 'custom-polly-topic',
160
+ DisplayName: 'Custom Polly Notifications'
161
+ });
162
+ });
163
+ test('Test environment variable generation with default names', () => {
164
+ const app = new aws_cdk_lib_1.App();
165
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
166
+ const configuration = defaults.ConfigurePollySupport(stack, 'test', { asyncJobs: true });
167
+ expect(configuration.environmentVariables).toHaveLength(2);
168
+ const bucketEnvVar = configuration.environmentVariables.find(v => v.defaultName === 'OUTPUT_BUCKET_NAME');
169
+ expect(bucketEnvVar).toBeDefined();
170
+ expect(bucketEnvVar?.clientNameOverride).toBeUndefined();
171
+ expect(bucketEnvVar?.value).toBe(configuration.destinationBucket.bucketInterface.bucketName);
172
+ const topicEnvVar = configuration.environmentVariables.find(v => v.defaultName === 'SNS_TOPIC_ARN');
173
+ expect(topicEnvVar).toBeDefined();
174
+ expect(topicEnvVar?.clientNameOverride).toBeUndefined();
175
+ expect(topicEnvVar?.value).toBe(configuration.snsNotificationTopic.topicArn);
176
+ });
177
+ test('Test environment variable generation with custom names', () => {
178
+ const app = new aws_cdk_lib_1.App();
179
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
180
+ const configuration = defaults.ConfigurePollySupport(stack, 'test', {
181
+ asyncJobs: true,
182
+ bucketEnvironmentVariableName: 'MY_CUSTOM_BUCKET',
183
+ topicEnvironmentVariableName: 'MY_CUSTOM_TOPIC'
184
+ });
185
+ expect(configuration.environmentVariables).toHaveLength(2);
186
+ const bucketEnvVar = configuration.environmentVariables.find(v => v.defaultName === 'OUTPUT_BUCKET_NAME');
187
+ expect(bucketEnvVar).toBeDefined();
188
+ expect(bucketEnvVar?.clientNameOverride).toBe('MY_CUSTOM_BUCKET');
189
+ expect(bucketEnvVar?.value).toBe(configuration.destinationBucket.bucketInterface.bucketName);
190
+ const topicEnvVar = configuration.environmentVariables.find(v => v.defaultName === 'SNS_TOPIC_ARN');
191
+ expect(topicEnvVar).toBeDefined();
192
+ expect(topicEnvVar?.clientNameOverride).toBe('MY_CUSTOM_TOPIC');
193
+ expect(topicEnvVar?.value).toBe(configuration.snsNotificationTopic.topicArn);
194
+ });
195
+ test('Test SNS topic encryption with AWS managed key', () => {
196
+ const app = new aws_cdk_lib_1.App();
197
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
198
+ const configuration = defaults.ConfigurePollySupport(stack, 'test', { asyncJobs: true });
199
+ expect(configuration.snsNotificationTopic).toBeDefined();
200
+ expect(configuration.notificationTopicEncryptionKey).toBeDefined();
201
+ const template = assertions_1.Template.fromStack(stack);
202
+ template.resourceCountIs('AWS::SNS::Topic', 1);
203
+ // Verify SNS topic has encryption enabled with AWS managed key
204
+ template.hasResourceProperties('AWS::SNS::Topic', {
205
+ KmsMasterKeyId: {
206
+ "Fn::Join": [
207
+ "",
208
+ [
209
+ "arn:",
210
+ {
211
+ Ref: "AWS::Partition"
212
+ },
213
+ ":kms:",
214
+ {
215
+ Ref: "AWS::Region"
216
+ },
217
+ ":",
218
+ {
219
+ Ref: "AWS::AccountId"
220
+ },
221
+ ":alias/aws/sns"
222
+ ]
223
+ ]
224
+ }
225
+ });
226
+ });
227
+ test('Test SNS topic encryption with customer managed key', () => {
228
+ const app = new aws_cdk_lib_1.App();
229
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
230
+ const configuration = defaults.ConfigurePollySupport(stack, 'test', {
231
+ asyncJobs: true,
232
+ enableTopicEncryptionWithCustomerManagedKey: true
233
+ });
234
+ expect(configuration.snsNotificationTopic).toBeDefined();
235
+ expect(configuration.notificationTopicEncryptionKey).toBeDefined();
236
+ const template = assertions_1.Template.fromStack(stack);
237
+ template.resourceCountIs('AWS::SNS::Topic', 1);
238
+ template.resourceCountIs('AWS::KMS::Key', 1);
239
+ });
240
+ test('Test SNS topic encryption with custom key props', () => {
241
+ const app = new aws_cdk_lib_1.App();
242
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
243
+ const customKey = defaults.buildEncryptionKey(stack, 'custom-key', {
244
+ description: 'Custom encryption key for Polly SNS topic'
245
+ });
246
+ const configuration = defaults.ConfigurePollySupport(stack, 'test', {
247
+ asyncJobs: true,
248
+ topicEncryptionKey: customKey
249
+ });
250
+ expect(configuration.snsNotificationTopic).toBeDefined();
251
+ expect(configuration.notificationTopicEncryptionKey).toBe(customKey);
252
+ const template = assertions_1.Template.fromStack(stack);
253
+ template.resourceCountIs('AWS::KMS::Key', 1);
254
+ template.hasResourceProperties('AWS::KMS::Key', {
255
+ Description: 'Custom encryption key for Polly SNS topic'
256
+ });
257
+ });
258
+ test('Test IAM action list for synchronous mode', () => {
259
+ const app = new aws_cdk_lib_1.App();
260
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
261
+ const configuration = defaults.ConfigurePollySupport(stack, 'test', {});
262
+ expect(configuration.lambdaIamActionsRequired).toEqual(['polly:SynthesizeSpeech']);
263
+ });
264
+ test('Test IAM action list for asynchronous mode', () => {
265
+ const app = new aws_cdk_lib_1.App();
266
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
267
+ const configuration = defaults.ConfigurePollySupport(stack, 'test', { asyncJobs: true });
268
+ expect(configuration.lambdaIamActionsRequired).toEqual([
269
+ 'polly:SynthesizeSpeech',
270
+ 'polly:StartSpeechSynthesisTask',
271
+ 'polly:GetSpeechSynthesisTask',
272
+ 'polly:ListSpeechSynthesisTasks'
273
+ ]);
274
+ });
275
+ // =============================================
276
+ // Test CheckPollyProps()
277
+ // =============================================
278
+ test("CheckPollyProps with valid asyncJobs true", () => {
279
+ const props = {
280
+ asyncJobs: true,
281
+ bucketProps: {}
282
+ };
283
+ expect(() => {
284
+ defaults.CheckPollyProps(props);
285
+ }).not.toThrow();
286
+ });
287
+ test("CheckPollyProps with valid asyncJobs false", () => {
288
+ const props = {
289
+ asyncJobs: false
290
+ };
291
+ expect(() => {
292
+ defaults.CheckPollyProps(props);
293
+ }).not.toThrow();
294
+ });
295
+ test("CheckPollyProps throws error when asyncJobs is false and existingBucketObj is provided", () => {
296
+ const stack = new aws_cdk_lib_1.Stack();
297
+ const props = {
298
+ asyncJobs: false,
299
+ existingBucketObj: (0, test_helper_1.CreateScrapBucket)(stack, "testbucket")
300
+ };
301
+ expect(() => {
302
+ defaults.CheckPollyProps(props);
303
+ }).toThrow('Error - Bucket properties can only be provided when asyncJobs is true.');
304
+ });
305
+ test("CheckPollyProps throws error when asyncJobs is false and bucketProps is provided", () => {
306
+ const props = {
307
+ asyncJobs: false,
308
+ bucketProps: {}
309
+ };
310
+ expect(() => {
311
+ defaults.CheckPollyProps(props);
312
+ }).toThrow('Error - Bucket properties can only be provided when asyncJobs is true.');
313
+ });
314
+ test("CheckPollyProps throws error when asyncJobs is false and loggingBucketProps is provided", () => {
315
+ const props = {
316
+ asyncJobs: false,
317
+ loggingBucketProps: {}
318
+ };
319
+ expect(() => {
320
+ defaults.CheckPollyProps(props);
321
+ }).toThrow('Error - Bucket properties can only be provided when asyncJobs is true.');
322
+ });
323
+ test("CheckPollyProps throws error when asyncJobs is false and logS3AccessLogs is provided", () => {
324
+ const props = {
325
+ asyncJobs: false,
326
+ logS3AccessLogs: true
327
+ };
328
+ expect(() => {
329
+ defaults.CheckPollyProps(props);
330
+ }).toThrow('Error - Bucket properties can only be provided when asyncJobs is true.');
331
+ });
332
+ test("CheckPollyProps throws error when asyncJobs is false and bucketEnvironmentVariableName is provided", () => {
333
+ const props = {
334
+ asyncJobs: false,
335
+ bucketEnvironmentVariableName: 'MY_BUCKET'
336
+ };
337
+ expect(() => {
338
+ defaults.CheckPollyProps(props);
339
+ }).toThrow('Error - Bucket properties can only be provided when asyncJobs is true.');
340
+ });
341
+ test("CheckPollyProps throws error when asyncJobs is false and existingTopicObj is provided", () => {
342
+ const app = new aws_cdk_lib_1.App();
343
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
344
+ const topic = defaults.buildTopic(stack, 'test-topic', {}).topic;
345
+ const props = {
346
+ asyncJobs: false,
347
+ existingTopicObj: topic
348
+ };
349
+ expect(() => {
350
+ defaults.CheckPollyProps(props);
351
+ }).toThrow('Error - Topic properties can only be provided when asyncJobs is true.');
352
+ });
353
+ test("CheckPollyProps throws error when asyncJobs is false and topicProps is provided", () => {
354
+ const props = {
355
+ asyncJobs: false,
356
+ topicProps: {}
357
+ };
358
+ expect(() => {
359
+ defaults.CheckPollyProps(props);
360
+ }).toThrow('Error - Topic properties can only be provided when asyncJobs is true.');
361
+ });
362
+ test("CheckPollyProps throws error when asyncJobs is false and existingTopicEncryptionKey is provided", () => {
363
+ const app = new aws_cdk_lib_1.App();
364
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
365
+ const key = defaults.buildEncryptionKey(stack, 'test-key');
366
+ const props = {
367
+ asyncJobs: false,
368
+ existingTopicEncryptionKey: key
369
+ };
370
+ expect(() => {
371
+ defaults.CheckPollyProps(props);
372
+ }).toThrow('Error - Topic properties can only be provided when asyncJobs is true.');
373
+ });
374
+ test("CheckPollyProps throws error when asyncJobs is false and topicEncryptionKey is provided", () => {
375
+ const app = new aws_cdk_lib_1.App();
376
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
377
+ const key = defaults.buildEncryptionKey(stack, 'test-key');
378
+ const props = {
379
+ asyncJobs: false,
380
+ topicEncryptionKey: key
381
+ };
382
+ expect(() => {
383
+ defaults.CheckPollyProps(props);
384
+ }).toThrow('Error - Topic properties can only be provided when asyncJobs is true.');
385
+ });
386
+ test("CheckPollyProps throws error when asyncJobs is false and topicEncryptionKeyProps is provided", () => {
387
+ const props = {
388
+ asyncJobs: false,
389
+ topicEncryptionKeyProps: {}
390
+ };
391
+ expect(() => {
392
+ defaults.CheckPollyProps(props);
393
+ }).toThrow('Error - Topic properties can only be provided when asyncJobs is true.');
394
+ });
395
+ test("CheckPollyProps throws error when asyncJobs is false and enableTopicEncryptionWithCustomerManagedKey is provided", () => {
396
+ const props = {
397
+ asyncJobs: false,
398
+ enableTopicEncryptionWithCustomerManagedKey: true
399
+ };
400
+ expect(() => {
401
+ defaults.CheckPollyProps(props);
402
+ }).toThrow('Error - Topic properties can only be provided when asyncJobs is true.');
403
+ });
404
+ test("CheckPollyProps throws error when asyncJobs is false and topicEnvironmentVariableName is provided", () => {
405
+ const props = {
406
+ asyncJobs: false,
407
+ topicEnvironmentVariableName: 'MY_TOPIC'
408
+ };
409
+ expect(() => {
410
+ defaults.CheckPollyProps(props);
411
+ }).toThrow('Error - Topic properties can only be provided when asyncJobs is true.');
412
+ });
413
+ test("CheckPollyProps throws error when asyncJobs is true and both existingBucketObj and bucketProps are provided", () => {
414
+ const stack = new aws_cdk_lib_1.Stack();
415
+ const props = {
416
+ asyncJobs: true,
417
+ existingBucketObj: (0, test_helper_1.CreateScrapBucket)(stack, "testbucket"),
418
+ bucketProps: {}
419
+ };
420
+ expect(() => {
421
+ defaults.CheckPollyProps(props);
422
+ }).toThrow('Error - Either provide bucketProps or existingBucketObj, but not both.');
423
+ });
424
+ test("CheckPollyProps throws error when asyncJobs is true and both existingTopicObj and topicProps are provided", () => {
425
+ const app = new aws_cdk_lib_1.App();
426
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
427
+ const topic = defaults.buildTopic(stack, 'test-topic', {}).topic;
428
+ const props = {
429
+ asyncJobs: true,
430
+ existingTopicObj: topic,
431
+ topicProps: {}
432
+ };
433
+ expect(() => {
434
+ defaults.CheckPollyProps(props);
435
+ }).toThrow('Error - Either provide topicProps or existingTopicObj, but not both.');
436
+ });
437
+ test("CheckPollyProps throws error when topicProps.masterKey and topicEncryptionKey are both provided", () => {
438
+ const app = new aws_cdk_lib_1.App();
439
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
440
+ const key = defaults.buildEncryptionKey(stack, 'test-key');
441
+ const props = {
442
+ asyncJobs: true,
443
+ topicProps: {
444
+ masterKey: key
445
+ },
446
+ topicEncryptionKey: key
447
+ };
448
+ expect(() => {
449
+ defaults.CheckPollyProps(props);
450
+ }).toThrow('Error - Either provide topicProps.masterKey or topicEncryptionKey, but not both.');
451
+ });
452
+ test("CheckPollyProps throws error when topicProps.masterKey and topicEncryptionKeyProps are both provided", () => {
453
+ const app = new aws_cdk_lib_1.App();
454
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
455
+ const key = defaults.buildEncryptionKey(stack, 'test-key');
456
+ const props = {
457
+ asyncJobs: true,
458
+ topicProps: {
459
+ masterKey: key
460
+ },
461
+ topicEncryptionKeyProps: {}
462
+ };
463
+ expect(() => {
464
+ defaults.CheckPollyProps(props);
465
+ }).toThrow('Error - Either provide topicProps.masterKey or topicEncryptionKeyProps, but not both.');
466
+ });
467
+ test("CheckPollyProps throws error when topicEncryptionKey and topicEncryptionKeyProps are both provided", () => {
468
+ const app = new aws_cdk_lib_1.App();
469
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
470
+ const key = defaults.buildEncryptionKey(stack, 'test-key');
471
+ const props = {
472
+ asyncJobs: true,
473
+ topicEncryptionKey: key,
474
+ topicEncryptionKeyProps: {}
475
+ };
476
+ expect(() => {
477
+ defaults.CheckPollyProps(props);
478
+ }).toThrow('Error - Either provide topicEncryptionKey or topicEncryptionKeyProps, but not both.');
479
+ });
480
+ test("CheckPollyProps accepts all valid asyncJobs true properties", () => {
481
+ const props = {
482
+ asyncJobs: true,
483
+ bucketProps: {},
484
+ loggingBucketProps: {},
485
+ logS3AccessLogs: true,
486
+ bucketEnvironmentVariableName: 'MY_BUCKET',
487
+ topicProps: {},
488
+ topicEnvironmentVariableName: 'MY_TOPIC',
489
+ enableTopicEncryptionWithCustomerManagedKey: true
490
+ };
491
+ expect(() => {
492
+ defaults.CheckPollyProps(props);
493
+ }).not.toThrow();
494
+ });
495
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9sbHktaGVscGVyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwb2xseS1oZWxwZXIudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7O0dBV0c7O0FBRUgscUNBQXFDO0FBQ3JDLCtDQUFrRDtBQUNsRCw2Q0FBeUM7QUFDekMsdURBQXlEO0FBRXpELGdEQUFnRDtBQUNoRCwrQkFBK0I7QUFDL0IsZ0RBQWdEO0FBRWhELElBQUksQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLEVBQUU7SUFDbEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBRyxFQUFFLENBQUM7SUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxtQkFBSyxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUUzQyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRXpGLE1BQU0sQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN0RCxNQUFNLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzlELE1BQU0sQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxhQUFhLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyRSxNQUFNLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDekQsTUFBTSxDQUFDLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRW5FLE1BQU0sQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxPQUFPLENBQUMs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QjtRQUNqQyxTQUFTLEVBQUUsSUFBSTtRQUNmLGtCQUFrQixFQUFFLEdBQUc7UUFDdkIsdUJBQXVCLEVBQUUsRUFBRTtLQUM1QixDQUFDO0lBRUYsTUFBTSxDQUFDLEdBQUcsRUFBRTtRQUNWLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHFGQUFxRixDQUFDLENBQUM7QUFDcEcsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsNkRBQTZELEVBQUUsR0FBRyxFQUFFO0lBQ3ZFLE1BQU0sS0FBSyxHQUFHO1FBQ1osU0FBUyxFQUFFLElBQUk7UUFDZixXQUFXLEVBQUUsRUFBRTtRQUNmLGtCQUFrQixFQUFFLEVBQUU7UUFDdEIsZUFBZSxFQUFFLElBQUk7UUFDckIsNkJBQTZCLEVBQUUsV0FBVztRQUMxQyxVQUFVLEVBQUUsRUFBRTtRQUNkLDRCQUE0QixFQUFFLFVBQVU7UUFDeEMsMkNBQTJDLEVBQUUsSUFBSTtLQUNsRCxDQUFDO0lBRUYsTUFBTSxDQUFDLEdBQUcsRUFBRTtRQUNWLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ25CLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIikuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqICB3aXRoIHRoZSBMaWNlbnNlLiBBIGNvcHkgb2YgdGhlIExpY2Vuc2UgaXMgbG9jYXRlZCBhdFxuICpcbiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogIG9yIGluIHRoZSAnbGljZW5zZScgZmlsZSBhY2NvbXBhbnlpbmcgdGhpcyBmaWxlLiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTXG4gKiAgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbiAqICBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0ICogYXMgZGVmYXVsdHMgZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBDcmVhdGVTY3JhcEJ1Y2tldCB9IGZyb20gXCIuL3Rlc3QtaGVscGVyXCI7XG5pbXBvcnQgeyBBcHAsIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBNYXRjaCwgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUZXN0IENvbmZpZ3VyZVBvbGx5U3VwcG9ydCgpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxudGVzdCgnVGVzdCBkZXBsb3ltZW50IHdpdGggYXN5bmNKb2JzIGVuYWJsZWQnLCAoKSA9PiB7XG4gIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCBcInRlc3Qtc3RhY2tcIik7XG5cbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IGRlZmF1bHRzLkNvbmZpZ3VyZVBvbGx5U3VwcG9ydChzdGFjaywgJ3Rlc3QnLCB7IGFzeW5jSm9iczogdHJ1ZSB9KTtcblxuICBleHBlY3QoY29uZmlndXJhdGlvbi5kZXN0aW5hdGlvbkJ1Y2tldCkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uZGVzdGluYXRpb25CdWNrZXQ/LmJ1Y2tldCkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uZGVzdGluYXRpb25CdWNrZXQ/LmJ1Y2tldEludGVyZmFjZSkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uZGVzdGluYXRpb25CdWNrZXQ/LmxvZ2dpbmdCdWNrZXQpLnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLnNuc05vdGlmaWNhdGlvblRvcGljKS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5ub3RpZmljYXRpb25Ub3BpY0VuY3J5cHRpb25LZXkpLnRvQmVEZWZpbmVkKCk7XG5cbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24ubGFtYmRhSWFtQWN0aW9uc1JlcXVpcmVkKS50b0VxdWFsKGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW1xuICAgICdwb2xseTpTeW50aGVzaXplU3BlZWNoJyxcbiAgICAncG9sbHk6U3RhcnRTcGVlY2hTeW50aGVzaXNUYXNrJyxcbiAgICAncG9sbHk6R2V0U3BlZWNoU3ludGhlc2lzVGFzaycsXG4gICAgJ3BvbGx5Okxpc3RTcGVlY2hTeW50aGVzaXNUYXNrcydcbiAgXSkpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5sYW1iZGFJYW1BY3Rpb25zUmVxdWlyZWQpLnRvSGF2ZUxlbmd0aCg0KTtcblxuICAvLyBDaGVjayBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uZW52aXJvbm1lbnRWYXJpYWJsZXMpLnRvSGF2ZUxlbmd0aCgyKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uZW52aXJvbm1lbnRWYXJpYWJsZXNbMF0uZGVmYXVsdE5hbWUpLnRvQmUoJ09VVFBVVF9CVUNLRVRfTkFNRScpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5lbnZpcm9ubWVudFZhcmlhYmxlc1swXS52YWx1ZSkudG9CZShjb25maWd1cmF0aW9uLmRlc3RpbmF0aW9uQnVja2V0IS5idWNrZXRJbnRlcmZhY2UuYnVja2V0TmFtZSk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmVudmlyb25tZW50VmFyaWFibGVzWzFdLmRlZmF1bHROYW1lKS50b0JlKCdTTlNfVE9QSUNfQVJOJyk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmVudmlyb25tZW50VmFyaWFibGVzWzFdLnZhbHVlKS50b0JlKGNvbmZpZ3VyYXRpb24uc25zTm90aWZpY2F0aW9uVG9waWMhLnRvcGljQXJuKTtcblxuICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG5cbiAgdGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OlMzOjpCdWNrZXQnLCAyKTsgLy8gMSBtYWluIGJ1Y2tldCArIDEgbG9nZ2luZyBidWNrZXRcbiAgdGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OlNOUzo6VG9waWMnLCAxKTsgLy8gU05TIHRvcGljIGZvciBhc3luYyBqb2Igbm90aWZpY2F0aW9uc1xufSk7XG5cbnRlc3QoJ1Rlc3QgZGVwbG95bWVudCB3aXRob3V0IGFzeW5jSm9icyBlbmFibGVkJywgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgXCJ0ZXN0LXN0YWNrXCIpO1xuXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBkZWZhdWx0cy5Db25maWd1cmVQb2xseVN1cHBvcnQoc3RhY2ssICd0ZXN0Jywge30pO1xuXG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmRlc3RpbmF0aW9uQnVja2V0KS5ub3QudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uc25zTm90aWZpY2F0aW9uVG9waWMpLm5vdC50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5ub3RpZmljYXRpb25Ub3BpY0VuY3J5cHRpb25LZXkpLm5vdC50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5sYW1iZGFJYW1BY3Rpb25zUmVxdWlyZWQpLnRvRXF1YWwoZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgJ3BvbGx5OlN5bnRoZXNpemVTcGVlY2gnXG4gIF0pKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24ubGFtYmRhSWFtQWN0aW9uc1JlcXVpcmVkKS50b0hhdmVMZW5ndGgoMSk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmVudmlyb25tZW50VmFyaWFibGVzKS50b0hhdmVMZW5ndGgoMCk7XG5cbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuXG4gIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpTTlM6OlRvcGljJywgMCk7XG4gIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpTMzo6QnVja2V0JywgMCk7XG59KTtcblxudGVzdCgnVGVzdCBkZXBsb3ltZW50IHdpdGggYXN5bmNKb2JzIGZhbHNlJywgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgXCJ0ZXN0LXN0YWNrXCIpO1xuXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBkZWZhdWx0cy5Db25maWd1cmVQb2xseVN1cHBvcnQoc3RhY2ssICd0ZXN0JywgeyBhc3luY0pvYnM6IGZhbHNlIH0pO1xuXG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmRlc3RpbmF0aW9uQnVja2V0KS5ub3QudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uc25zTm90aWZpY2F0aW9uVG9waWMpLm5vdC50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5ub3RpZmljYXRpb25Ub3BpY0VuY3J5cHRpb25LZXkpLm5vdC50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5sYW1iZGFJYW1BY3Rpb25zUmVxdWlyZWQpLnRvRXF1YWwoZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgJ3BvbGx5OlN5bnRoZXNpemVTcGVlY2gnXG4gIF0pKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24ubGFtYmRhSWFtQWN0aW9uc1JlcXVpcmVkKS50b0hhdmVMZW5ndGgoMSk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmVudmlyb25tZW50VmFyaWFibGVzKS50b0hhdmVMZW5ndGgoMCk7XG5cbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuXG4gIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpTTlM6OlRvcGljJywgMCk7XG4gIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpTMzo6QnVja2V0JywgMCk7XG59KTtcblxudGVzdCgnVGVzdCBkZXBsb3ltZW50IHdpdGggZXhpc3RpbmcgYnVja2V0JywgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgXCJ0ZXN0LXN0YWNrXCIpO1xuXG4gIGNvbnN0IGV4aXN0aW5nQnVja2V0ID0gQ3JlYXRlU2NyYXBCdWNrZXQoc3RhY2ssIFwic2NyYXBcIiwge30pO1xuICBjb25zdCBjb25maWd1cmF0aW9uID0gZGVmYXVsdHMuQ29uZmlndXJlUG9sbHlTdXBwb3J0KHN0YWNrLCAndGVzdCcsIHtcbiAgICBhc3luY0pvYnM6IHRydWUsXG4gICAgZXhpc3RpbmdCdWNrZXRPYmo6IGV4aXN0aW5nQnVja2V0XG4gIH0pO1xuXG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmRlc3RpbmF0aW9uQnVja2V0KS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5kZXN0aW5hdGlvbkJ1Y2tldD8uYnVja2V0KS5ub3QudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uZGVzdGluYXRpb25CdWNrZXQ/LmJ1Y2tldEludGVyZmFjZSkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uZGVzdGluYXRpb25CdWNrZXQ/LmxvZ2dpbmdCdWNrZXQpLm5vdC50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5kZXN0aW5hdGlvbkJ1Y2tldD8uYnVja2V0SW50ZXJmYWNlKS50b0JlKGV4aXN0aW5nQnVja2V0KTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uc25zTm90aWZpY2F0aW9uVG9waWMpLnRvQmVEZWZpbmVkKCk7XG5cbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuXG4gIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpTMzo6QnVja2V0JywgMik7IC8vIGV4aXN0aW5nIGJ1Y2tldCArIDEgbmV3IGJ1Y2tldCAoc2NyYXAgYnVja2V0KVxufSk7XG5cbnRlc3QoJ1Rlc3QgZGVwbG95bWVudCB3aXRoIGV4aXN0aW5nIHRvcGljJywgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgXCJ0ZXN0LXN0YWNrXCIpO1xuXG4gIGNvbnN0IGV4aXN0aW5nVG9waWMgPSBkZWZhdWx0cy5idWlsZFRvcGljKHN0YWNrLCAnZXhpc3RpbmctdG9waWMnLCB7XG4gICAgdG9waWNQcm9wczoge1xuICAgICAgdG9waWNOYW1lOiAncHJlLWV4aXN0aW5nLXRvcGljJ1xuICAgIH1cbiAgfSkudG9waWM7XG5cbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IGRlZmF1bHRzLkNvbmZpZ3VyZVBvbGx5U3VwcG9ydChzdGFjaywgJ3Rlc3QnLCB7XG4gICAgYXN5bmNKb2JzOiB0cnVlLFxuICAgIGV4aXN0aW5nVG9waWNPYmo6IGV4aXN0aW5nVG9waWNcbiAgfSk7XG5cbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uc25zTm90aWZpY2F0aW9uVG9waWMpLnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLnNuc05vdGlmaWNhdGlvblRvcGljKS50b0JlKGV4aXN0aW5nVG9waWMpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5kZXN0aW5hdGlvbkJ1Y2tldCkudG9CZURlZmluZWQoKTtcblxuICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG5cbiAgdGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OlNOUzo6VG9waWMnLCAxKTtcbiAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlNOUzo6VG9waWMnLCB7XG4gICAgVG9waWNOYW1lOiAncHJlLWV4aXN0aW5nLXRvcGljJ1xuICB9KTtcbn0pO1xuXG50ZXN0KCdUZXN0IGRlcGxveW1lbnQgd2l0aCBjdXN0b20gYnVja2V0IHByb3BzJywgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgXCJ0ZXN0LXN0YWNrXCIpO1xuXG4gIGRlZmF1bHRzLkNvbmZpZ3VyZVBvbGx5U3VwcG9ydChzdGFjaywgJ3Rlc3QnLCB7XG4gICAgYXN5bmNKb2JzOiB0cnVlLFxuICAgIGJ1Y2tldFByb3BzOiB7XG4gICAgICBidWNrZXROYW1lOiBcImN1c3RvbS1wb2xseS1idWNrZXRcIlxuICAgIH0sXG4gICAgbG9nZ2luZ0J1Y2tldFByb3BzOiB7XG4gICAgICBidWNrZXROYW1lOiBcImN1c3RvbS1sb2dnaW5nLWJ1Y2tldFwiXG4gICAgfVxuICB9KTtcblxuICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG5cbiAgdGVtcGxhdGUucmVzb3VyY2VDb3VudElzKFwiQVdTOjpTMzo6QnVja2V0XCIsIDIpO1xuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXCJBV1M6OlMzOjpCdWNrZXRcIiwge1xuICAgIEJ1Y2tldE5hbWU6IFwiY3VzdG9tLXBvbGx5LWJ1Y2tldFwiLFxuICAgIExvZ2dpbmdDb25maWd1cmF0aW9uOiB7XG4gICAgICBEZXN0aW5hdGlvbkJ1Y2tldE5hbWU6IHtcbiAgICAgICAgUmVmOiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwidGVzdG91dHB1dGJ1Y2tldFMzTG9nZ2luZ0J1Y2tldC4qXCIpXG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKFwiQVdTOjpTMzo6QnVja2V0XCIsIHtcbiAgICBCdWNrZXROYW1lOiBcImN1c3RvbS1sb2dnaW5nLWJ1Y2tldFwiLFxuICAgIEFjY2Vzc0NvbnRyb2w6IFwiTG9nRGVsaXZlcnlXcml0ZVwiXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1Rlc3QgZGVwbG95bWVudCB3aXRoIGN1c3RvbSB0b3BpYyBwcm9wcycsICgpID0+IHtcbiAgY29uc3QgYXBwID0gbmV3IEFwcCgpO1xuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhhcHAsIFwidGVzdC1zdGFja1wiKTtcblxuICBkZWZhdWx0cy5Db25maWd1cmVQb2xseVN1cHBvcnQoc3RhY2ssICd0ZXN0Jywge1xuICAgIGFzeW5jSm9iczogdHJ1ZSxcbiAgICB0b3BpY1Byb3BzOiB7XG4gICAgICB0b3BpY05hbWU6ICdjdXN0b20tcG9sbHktdG9waWMnLFxuICAgICAgZGlzcGxheU5hbWU6ICdDdXN0b20gUG9sbHkgTm90aWZpY2F0aW9ucydcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcblxuICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6U05TOjpUb3BpYycsIDEpO1xuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U05TOjpUb3BpYycsIHtcbiAgICBUb3BpY05hbWU6ICdjdXN0b20tcG9sbHktdG9waWMnLFxuICAgIERpc3BsYXlOYW1lOiAnQ3VzdG9tIFBvbGx5IE5vdGlmaWNhdGlvbnMnXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1Rlc3QgZW52aXJvbm1lbnQgdmFyaWFibGUgZ2VuZXJhdGlvbiB3aXRoIGRlZmF1bHQgbmFtZXMnLCAoKSA9PiB7XG4gIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCBcInRlc3Qtc3RhY2tcIik7XG5cbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IGRlZmF1bHRzLkNvbmZpZ3VyZVBvbGx5U3VwcG9ydChzdGFjaywgJ3Rlc3QnLCB7IGFzeW5jSm9iczogdHJ1ZSB9KTtcblxuICBleHBlY3QoY29uZmlndXJhdGlvbi5lbnZpcm9ubWVudFZhcmlhYmxlcykudG9IYXZlTGVuZ3RoKDIpO1xuXG4gIGNvbnN0IGJ1Y2tldEVudlZhciA9IGNvbmZpZ3VyYXRpb24uZW52aXJvbm1lbnRWYXJpYWJsZXMuZmluZCh2ID0+IHYuZGVmYXVsdE5hbWUgPT09ICdPVVRQVVRfQlVDS0VUX05BTUUnKTtcbiAgZXhwZWN0KGJ1Y2tldEVudlZhcikudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGJ1Y2tldEVudlZhcj8uY2xpZW50TmFtZU92ZXJyaWRlKS50b0JlVW5kZWZpbmVkKCk7XG4gIGV4cGVjdChidWNrZXRFbnZWYXI/LnZhbHVlKS50b0JlKGNvbmZpZ3VyYXRpb24uZGVzdGluYXRpb25CdWNrZXQhLmJ1Y2tldEludGVyZmFjZS5idWNrZXROYW1lKTtcblxuICBjb25zdCB0b3BpY0VudlZhciA9IGNvbmZpZ3VyYXRpb24uZW52aXJvbm1lbnRWYXJpYWJsZXMuZmluZCh2ID0+IHYuZGVmYXVsdE5hbWUgPT09ICdTTlNfVE9QSUNfQVJOJyk7XG4gIGV4cGVjdCh0b3BpY0VudlZhcikudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KHRvcGljRW52VmFyPy5jbGllbnROYW1lT3ZlcnJpZGUpLnRvQmVVbmRlZmluZWQoKTtcbiAgZXhwZWN0KHRvcGljRW52VmFyPy52YWx1ZSkudG9CZShjb25maWd1cmF0aW9uLnNuc05vdGlmaWNhdGlvblRvcGljIS50b3BpY0Fybik7XG59KTtcblxudGVzdCgnVGVzdCBlbnZpcm9ubWVudCB2YXJpYWJsZSBnZW5lcmF0aW9uIHdpdGggY3VzdG9tIG5hbWVzJywgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgXCJ0ZXN0LXN0YWNrXCIpO1xuXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBkZWZhdWx0cy5Db25maWd1cmVQb2xseVN1cHBvcnQoc3RhY2ssICd0ZXN0Jywge1xuICAgIGFzeW5jSm9iczogdHJ1ZSxcbiAgICBidWNrZXRFbnZpcm9ubWVudFZhcmlhYmxlTmFtZTogJ01ZX0NVU1RPTV9CVUNLRVQnLFxuICAgIHRvcGljRW52aXJvbm1lbnRWYXJpYWJsZU5hbWU6ICdNWV9DVVNUT01fVE9QSUMnXG4gIH0pO1xuXG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmVudmlyb25tZW50VmFyaWFibGVzKS50b0hhdmVMZW5ndGgoMik7XG5cbiAgY29uc3QgYnVja2V0RW52VmFyID0gY29uZmlndXJhdGlvbi5lbnZpcm9ubWVudFZhcmlhYmxlcy5maW5kKHYgPT4gdi5kZWZhdWx0TmFtZSA9PT0gJ09VVFBVVF9CVUNLRVRfTkFNRScpO1xuICBleHBlY3QoYnVja2V0RW52VmFyKS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoYnVja2V0RW52VmFyPy5jbGllbnROYW1lT3ZlcnJpZGUpLnRvQmUoJ01ZX0NVU1RPTV9CVUNLRVQnKTtcbiAgZXhwZWN0KGJ1Y2tldEVudlZhcj8udmFsdWUpLnRvQmUoY29uZmlndXJhdGlvbi5kZXN0aW5hdGlvbkJ1Y2tldCEuYnVja2V0SW50ZXJmYWNlLmJ1Y2tldE5hbWUpO1xuXG4gIGNvbnN0IHRvcGljRW52VmFyID0gY29uZmlndXJhdGlvbi5lbnZpcm9ubWVudFZhcmlhYmxlcy5maW5kKHYgPT4gdi5kZWZhdWx0TmFtZSA9PT0gJ1NOU19UT1BJQ19BUk4nKTtcbiAgZXhwZWN0KHRvcGljRW52VmFyKS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QodG9waWNFbnZWYXI/LmNsaWVudE5hbWVPdmVycmlkZSkudG9CZSgnTVlfQ1VTVE9NX1RPUElDJyk7XG4gIGV4cGVjdCh0b3BpY0VudlZhcj8udmFsdWUpLnRvQmUoY29uZmlndXJhdGlvbi5zbnNOb3RpZmljYXRpb25Ub3BpYyEudG9waWNBcm4pO1xufSk7XG5cbnRlc3QoJ1Rlc3QgU05TIHRvcGljIGVuY3J5cHRpb24gd2l0aCBBV1MgbWFuYWdlZCBrZXknLCAoKSA9PiB7XG4gIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCBcInRlc3Qtc3RhY2tcIik7XG5cbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IGRlZmF1bHRzLkNvbmZpZ3VyZVBvbGx5U3VwcG9ydChzdGFjaywgJ3Rlc3QnLCB7IGFzeW5jSm9iczogdHJ1ZSB9KTtcblxuICBleHBlY3QoY29uZmlndXJhdGlvbi5zbnNOb3RpZmljYXRpb25Ub3BpYykudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24ubm90aWZpY2F0aW9uVG9waWNFbmNyeXB0aW9uS2V5KS50b0JlRGVmaW5lZCgpO1xuXG4gIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgdGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OlNOUzo6VG9waWMnLCAxKTtcblxuICAvLyBWZXJpZnkgU05TIHRvcGljIGhhcyBlbmNyeXB0aW9uIGVuYWJsZWQgd2l0aCBBV1MgbWFuYWdlZCBrZXlcbiAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlNOUzo6VG9waWMnLCB7XG4gICAgS21zTWFzdGVyS2V5SWQ6IHtcbiAgICAgIFwiRm46OkpvaW5cIjogW1xuICAgICAgICBcIlwiLFxuICAgICAgICBbXG4gICAgICAgICAgXCJhcm46XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgUmVmOiBcIkFXUzo6UGFydGl0aW9uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiOmttczpcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBSZWY6IFwiQVdTOjpSZWdpb25cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCI6XCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgUmVmOiBcIkFXUzo6QWNjb3VudElkXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiOmFsaWFzL2F3cy9zbnNcIlxuICAgICAgICBdXG4gICAgICBdXG4gICAgfVxuICB9KTtcbn0pO1xuXG50ZXN0KCdUZXN0IFNOUyB0b3BpYyBlbmNyeXB0aW9uIHdpdGggY3VzdG9tZXIgbWFuYWdlZCBrZXknLCAoKSA9PiB7XG4gIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCBcInRlc3Qtc3RhY2tcIik7XG5cbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IGRlZmF1bHRzLkNvbmZpZ3VyZVBvbGx5U3VwcG9ydChzdGFjaywgJ3Rlc3QnLCB7XG4gICAgYXN5bmNKb2JzOiB0cnVlLFxuICAgIGVuYWJsZVRvcGljRW5jcnlwdGlvbldpdGhDdXN0b21lck1hbmFnZWRLZXk6IHRydWVcbiAgfSk7XG5cbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uc25zTm90aWZpY2F0aW9uVG9waWMpLnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLm5vdGlmaWNhdGlvblRvcGljRW5jcnlwdGlvbktleSkudG9CZURlZmluZWQoKTtcblxuICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpTTlM6OlRvcGljJywgMSk7XG4gIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpLTVM6OktleScsIDEpO1xufSk7XG5cbnRlc3QoJ1Rlc3QgU05TIHRvcGljIGVuY3J5cHRpb24gd2l0aCBjdXN0b20ga2V5IHByb3BzJywgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgXCJ0ZXN0LXN0YWNrXCIpO1xuXG4gIGNvbnN0IGN1c3RvbUtleSA9IGRlZmF1bHRzLmJ1aWxkRW5jcnlwdGlvbktleShzdGFjaywgJ2N1c3RvbS1rZXknLCB7XG4gICAgZGVzY3JpcHRpb246ICdDdXN0b20gZW5jcnlwdGlvbiBrZXkgZm9yIFBvbGx5IFNOUyB0b3BpYydcbiAgfSk7XG5cbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IGRlZmF1bHRzLkNvbmZpZ3VyZVBvbGx5U3VwcG9ydChzdGFjaywgJ3Rlc3QnLCB7XG4gICAgYXN5bmNKb2JzOiB0cnVlLFxuICAgIHRvcGljRW5jcnlwdGlvbktleTogY3VzdG9tS2V5XG4gIH0pO1xuXG4gIGV4cGVjdChjb25maWd1cmF0aW9uLnNuc05vdGlmaWNhdGlvblRvcGljKS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5ub3RpZmljYXRpb25Ub3BpY0VuY3J5cHRpb25LZXkpLnRvQmUoY3VzdG9tS2V5KTtcblxuICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpLTVM6OktleScsIDEpO1xuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6S01TOjpLZXknLCB7XG4gICAgRGVzY3JpcHRpb246ICdDdXN0b20gZW5jcnlwdGlvbiBrZXkgZm9yIFBvbGx5IFNOUyB0b3BpYydcbiAgfSk7XG59KTtcblxudGVzdCgnVGVzdCBJQU0gYWN0aW9uIGxpc3QgZm9yIHN5bmNocm9ub3VzIG1vZGUnLCAoKSA9PiB7XG4gIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCBcInRlc3Qtc3RhY2tcIik7XG5cbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IGRlZmF1bHRzLkNvbmZpZ3VyZVBvbGx5U3VwcG9ydChzdGFjaywgJ3Rlc3QnLCB7fSk7XG5cbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24ubGFtYmRhSWFtQWN0aW9uc1JlcXVpcmVkKS50b0VxdWFsKFsncG9sbHk6U3ludGhlc2l6ZVNwZWVjaCddKTtcbn0pO1xuXG50ZXN0KCdUZXN0IElBTSBhY3Rpb24gbGlzdCBmb3IgYXN5bmNocm9ub3VzIG1vZGUnLCAoKSA9PiB7XG4gIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCBcInRlc3Qtc3RhY2tcIik7XG5cbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IGRlZmF1bHRzLkNvbmZpZ3VyZVBvbGx5U3VwcG9ydChzdGFjaywgJ3Rlc3QnLCB7IGFzeW5jSm9iczogdHJ1ZSB9KTtcblxuICBleHBlY3QoY29uZmlndXJhdGlvbi5sYW1iZGFJYW1BY3Rpb25zUmVxdWlyZWQpLnRvRXF1YWwoW1xuICAgICdwb2xseTpTeW50aGVzaXplU3BlZWNoJyxcbiAgICAncG9sbHk6U3RhcnRTcGVlY2hTeW50aGVzaXNUYXNrJyxcbiAgICAncG9sbHk6R2V0U3BlZWNoU3ludGhlc2lzVGFzaycsXG4gICAgJ3BvbGx5Okxpc3RTcGVlY2hTeW50aGVzaXNUYXNrcydcbiAgXSk7XG59KTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUZXN0IENoZWNrUG9sbHlQcm9wcygpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxudGVzdChcIkNoZWNrUG9sbHlQcm9wcyB3aXRoIHZhbGlkIGFzeW5jSm9icyB0cnVlXCIsICgpID0+IHtcbiAgY29uc3QgcHJvcHMgPSB7XG4gICAgYXN5bmNKb2JzOiB0cnVlLFxuICAgIGJ1Y2tldFByb3BzOiB7fVxuICB9O1xuXG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgZGVmYXVsdHMuQ2hlY2tQb2xseVByb3BzKHByb3BzKTtcbiAgfSkubm90LnRvVGhyb3coKTtcbn0pO1xuXG50ZXN0KFwiQ2hlY2tQb2xseVByb3BzIHdpdGggdmFsaWQgYXN5bmNKb2JzIGZhbHNlXCIsICgpID0+IHtcbiAgY29uc3QgcHJvcHMgPSB7XG4gICAgYXN5bmNKb2JzOiBmYWxzZVxuICB9O1xuXG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgZGVmYXVsdHMuQ2hlY2tQb2xseVByb3BzKHByb3BzKTtcbiAgfSkubm90LnRvVGhyb3coKTtcbn0pO1xuXG50ZXN0KFwiQ2hlY2tQb2xseVByb3BzIHRocm93cyBlcnJvciB3aGVuIGFzeW5jSm9icyBpcyBmYWxzZSBhbmQgZXhpc3RpbmdCdWNrZXRPYmogaXMgcHJvdmlkZWRcIiwgKCkgPT4ge1xuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjaygpO1xuICBjb25zdCBwcm9wcyA9IHtcbiAgICBhc3luY0pvYnM6IGZhbHNlLFxuICAgIGV4aXN0aW5nQnVja2V0T2JqOiBDcmVhdGVTY3JhcEJ1Y2tldChzdGFjaywgXCJ0ZXN0YnVja2V0XCIpXG4gIH07XG5cbiAgZXhwZWN0KCgpID0+IHtcbiAgICBkZWZhdWx0cy5DaGVja1BvbGx5UHJvcHMocHJvcHMpO1xuICB9KS50b1Rocm93KCdFcnJvciAtIEJ1Y2tldCBwcm9wZXJ0aWVzIGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdoZW4gYXN5bmNKb2JzIGlzIHRydWUuJyk7XG59KTtcblxudGVzdChcIkNoZWNrUG9sbHlQcm9wcyB0aHJvd3MgZXJyb3Igd2hlbiBhc3luY0pvYnMgaXMgZmFsc2UgYW5kIGJ1Y2tldFByb3BzIGlzIHByb3ZpZGVkXCIsICgpID0+IHtcbiAgY29uc3QgcHJvcHMgPSB7XG4gICAgYXN5bmNKb2JzOiBmYWxzZSxcbiAgICBidWNrZXRQcm9wczoge31cbiAgfTtcblxuICBleHBlY3QoKCkgPT4ge1xuICAgIGRlZmF1bHRzLkNoZWNrUG9sbHlQcm9wcyhwcm9wcyk7XG4gIH0pLnRvVGhyb3coJ0Vycm9yIC0gQnVja2V0IHByb3BlcnRpZXMgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2hlbiBhc3luY0pvYnMgaXMgdHJ1ZS4nKTtcbn0pO1xuXG50ZXN0KFwiQ2hlY2tQb2xseVByb3BzIHRocm93cyBlcnJvciB3aGVuIGFzeW5jSm9icyBpcyBmYWxzZSBhbmQgbG9nZ2luZ0J1Y2tldFByb3BzIGlzIHByb3ZpZGVkXCIsICgpID0+IHtcbiAgY29uc3QgcHJvcHMgPSB7XG4gICAgYXN5bmNKb2JzOiBmYWxzZSxcbiAgICBsb2dnaW5nQnVja2V0UHJvcHM6IHt9XG4gIH07XG5cbiAgZXhwZWN0KCgpID0+IHtcbiAgICBkZWZhdWx0cy5DaGVja1BvbGx5UHJvcHMocHJvcHMpO1xuICB9KS50b1Rocm93KCdFcnJvciAtIEJ1Y2tldCBwcm9wZXJ0aWVzIGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdoZW4gYXN5bmNKb2JzIGlzIHRydWUuJyk7XG59KTtcblxudGVzdChcIkNoZWNrUG9sbHlQcm9wcyB0aHJvd3MgZXJyb3Igd2hlbiBhc3luY0pvYnMgaXMgZmFsc2UgYW5kIGxvZ1MzQWNjZXNzTG9ncyBpcyBwcm92aWRlZFwiLCAoKSA9PiB7XG4gIGNvbnN0IHByb3BzID0ge1xuICAgIGFzeW5jSm9iczogZmFsc2UsXG4gICAgbG9nUzNBY2Nlc3NMb2dzOiB0cnVlXG4gIH07XG5cbiAgZXhwZWN0KCgpID0+IHtcbiAgICBkZWZhdWx0cy5DaGVja1BvbGx5UHJvcHMocHJvcHMpO1xuICB9KS50b1Rocm93KCdFcnJvciAtIEJ1Y2tldCBwcm9wZXJ0aWVzIGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdoZW4gYXN5bmNKb2JzIGlzIHRydWUuJyk7XG59KTtcblxudGVzdChcIkNoZWNrUG9sbHlQcm9wcyB0aHJvd3MgZXJyb3Igd2hlbiBhc3luY0pvYnMgaXMgZmFsc2UgYW5kIGJ1Y2tldEVudmlyb25tZW50VmFyaWFibGVOYW1lIGlzIHByb3ZpZGVkXCIsICgpID0+IHtcbiAgY29uc3QgcHJvcHMgPSB7XG4gICAgYXN5bmNKb2JzOiBmYWxzZSxcbiAgICBidWNrZXRFbnZpcm9ubWVudFZhcmlhYmxlTmFtZTogJ01ZX0JVQ0tFVCdcbiAgfTtcblxuICBleHBlY3QoKCkgPT4ge1xuICAgIGRlZmF1bHRzLkNoZWNrUG9sbHlQcm9wcyhwcm9wcyk7XG4gIH0pLnRvVGhyb3coJ0Vycm9yIC0gQnVja2V0IHByb3BlcnRpZXMgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2hlbiBhc3luY0pvYnMgaXMgdHJ1ZS4nKTtcbn0pO1xuXG50ZXN0KFwiQ2hlY2tQb2xseVByb3BzIHRocm93cyBlcnJvciB3aGVuIGFzeW5jSm9icyBpcyBmYWxzZSBhbmQgZXhpc3RpbmdUb3BpY09iaiBpcyBwcm92aWRlZFwiLCAoKSA9PiB7XG4gIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCBcInRlc3Qtc3RhY2tcIik7XG4gIGNvbnN0IHRvcGljID0gZGVmYXVsdHMuYnVpbGRUb3BpYyhzdGFjaywgJ3Rlc3QtdG9waWMnLCB7fSkudG9waWM7XG5cbiAgY29uc3QgcHJvcHMgPSB7XG4gICAgYXN5bmNKb2JzOiBmYWxzZSxcbiAgICBleGlzdGluZ1RvcGljT2JqOiB0b3BpY1xuICB9O1xuXG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgZGVmYXVsdHMuQ2hlY2tQb2xseVByb3BzKHByb3BzKTtcbiAgfSkudG9UaHJvdygnRXJyb3IgLSBUb3BpYyBwcm9wZXJ0aWVzIGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdoZW4gYXN5bmNKb2JzIGlzIHRydWUuJyk7XG59KTtcblxudGVzdChcIkNoZWNrUG9sbHlQcm9wcyB0aHJvd3MgZXJyb3Igd2hlbiBhc3luY0pvYnMgaXMgZmFsc2UgYW5kIHRvcGljUHJvcHMgaXMgcHJvdmlkZWRcIiwgKCkgPT4ge1xuICBjb25zdCBwcm9wcyA9IHtcbiAgICBhc3luY0pvYnM6IGZhbHNlLFxuICAgIHRvcGljUHJvcHM6IHt9XG4gIH07XG5cbiAgZXhwZWN0KCgpID0+IHtcbiAgICBkZWZhdWx0cy5DaGVja1BvbGx5UHJvcHMocHJvcHMpO1xuICB9KS50b1Rocm93KCdFcnJvciAtIFRvcGljIHByb3BlcnRpZXMgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2hlbiBhc3luY0pvYnMgaXMgdHJ1ZS4nKTtcbn0pO1xuXG50ZXN0KFwiQ2hlY2tQb2xseVByb3BzIHRocm93cyBlcnJvciB3aGVuIGFzeW5jSm9icyBpcyBmYWxzZSBhbmQgZXhpc3RpbmdUb3BpY0VuY3J5cHRpb25LZXkgaXMgcHJvdmlkZWRcIiwgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgXCJ0ZXN0LXN0YWNrXCIpO1xuICBjb25zdCBrZXkgPSBkZWZhdWx0cy5idWlsZEVuY3J5cHRpb25LZXkoc3RhY2ssICd0ZXN0LWtleScpO1xuXG4gIGNvbnN0IHByb3BzOiBkZWZhdWx0cy5Qb2xseVByb3BzID0ge1xuICAgIGFzeW5jSm9iczogZmFsc2UsXG4gICAgZXhpc3RpbmdUb3BpY0VuY3J5cHRpb25LZXk6IGtleVxuICB9O1xuXG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgZGVmYXVsdHMuQ2hlY2tQb2xseVByb3BzKHByb3BzKTtcbiAgfSkudG9UaHJvdygnRXJyb3IgLSBUb3BpYyBwcm9wZXJ0aWVzIGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdoZW4gYXN5bmNKb2JzIGlzIHRydWUuJyk7XG59KTtcblxudGVzdChcIkNoZWNrUG9sbHlQcm9wcyB0aHJvd3MgZXJyb3Igd2hlbiBhc3luY0pvYnMgaXMgZmFsc2UgYW5kIHRvcGljRW5jcnlwdGlvbktleSBpcyBwcm92aWRlZFwiLCAoKSA9PiB7XG4gIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCBcInRlc3Qtc3RhY2tcIik7XG4gIGNvbnN0IGtleSA9IGRlZmF1bHRzLmJ1aWxkRW5jcnlwdGlvbktleShzdGFjaywgJ3Rlc3Qta2V5Jyk7XG5cbiAgY29uc3QgcHJvcHM6IGRlZmF1bHRzLlBvbGx5UHJvcHMgPSB7XG4gICAgYXN5bmNKb2JzOiBmYWxzZSxcbiAgICB0b3BpY0VuY3J5cHRpb25LZXk6IGtleVxuICB9O1xuXG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgZGVmYXVsdHMuQ2hlY2tQb2xseVByb3BzKHByb3BzKTtcbiAgfSkudG9UaHJvdygnRXJyb3IgLSBUb3BpYyBwcm9wZXJ0aWVzIGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdoZW4gYXN5bmNKb2JzIGlzIHRydWUuJyk7XG59KTtcblxudGVzdChcIkNoZWNrUG9sbHlQcm9wcyB0aHJvd3MgZXJyb3Igd2hlbiBhc3luY0pvYnMgaXMgZmFsc2UgYW5kIHRvcGljRW5jcnlwdGlvbktleVByb3BzIGlzIHByb3ZpZGVkXCIsICgpID0+IHtcbiAgY29uc3QgcHJvcHM6IGRlZmF1bHRzLlBvbGx5UHJvcHMgPSB7XG4gICAgYXN5bmNKb2JzOiBmYWxzZSxcbiAgICB0b3BpY0VuY3J5cHRpb25LZXlQcm9wczoge31cbiAgfTtcblxuICBleHBlY3QoKCkgPT4ge1xuICAgIGRlZmF1bHRzLkNoZWNrUG9sbHlQcm9wcyhwcm9wcyk7XG4gIH0pLnRvVGhyb3coJ0Vycm9yIC0gVG9waWMgcHJvcGVydGllcyBjYW4gb25seSBiZSBwcm92aWRlZCB3aGVuIGFzeW5jSm9icyBpcyB0cnVlLicpO1xufSk7XG5cbnRlc3QoXCJDaGVja1BvbGx5UHJvcHMgdGhyb3dzIGVycm9yIHdoZW4gYXN5bmNKb2JzIGlzIGZhbHNlIGFuZCBlbmFibGVUb3BpY0VuY3J5cHRpb25XaXRoQ3VzdG9tZXJNYW5hZ2VkS2V5IGlzIHByb3ZpZGVkXCIsICgpID0+IHtcbiAgY29uc3QgcHJvcHMgPSB7XG4gICAgYXN5bmNKb2JzOiBmYWxzZSxcbiAgICBlbmFibGVUb3BpY0VuY3J5cHRpb25XaXRoQ3VzdG9tZXJNYW5hZ2VkS2V5OiB0cnVlXG4gIH07XG5cbiAgZXhwZWN0KCgpID0+IHtcbiAgICBkZWZhdWx0cy5DaGVja1BvbGx5UHJvcHMocHJvcHMpO1xuICB9KS50b1Rocm93KCdFcnJvciAtIFRvcGljIHByb3BlcnRpZXMgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2hlbiBhc3luY0pvYnMgaXMgdHJ1ZS4nKTtcbn0pO1xuXG50ZXN0KFwiQ2hlY2tQb2xseVByb3BzIHRocm93cyBlcnJvciB3aGVuIGFzeW5jSm9icyBpcyBmYWxzZSBhbmQgdG9waWNFbnZpcm9ubWVudFZhcmlhYmxlTmFtZSBpcyBwcm92aWRlZFwiLCAoKSA9PiB7XG4gIGNvbnN0IHByb3BzID0ge1xuICAgIGFzeW5jSm9iczogZmFsc2UsXG4gICAgdG9waWNFbnZpcm9ubWVudFZhcmlhYmxlTmFtZTogJ01ZX1RPUElDJ1xuICB9O1xuXG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgZGVmYXVsdHMuQ2hlY2tQb2xseVByb3BzKHByb3BzKTtcbiAgfSkudG9UaHJvdygnRXJyb3IgLSBUb3BpYyBwcm9wZXJ0aWVzIGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdoZW4gYXN5bmNKb2JzIGlzIHRydWUuJyk7XG59KTtcblxudGVzdChcIkNoZWNrUG9sbHlQcm9wcyB0aHJvd3MgZXJyb3Igd2hlbiBhc3luY0pvYnMgaXMgdHJ1ZSBhbmQgYm90aCBleGlzdGluZ0J1Y2tldE9iaiBhbmQgYnVja2V0UHJvcHMgYXJlIHByb3ZpZGVkXCIsICgpID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgY29uc3QgcHJvcHMgPSB7XG4gICAgYXN5bmNKb2JzOiB0cnVlLFxuICAgIGV4aXN0aW5nQnVja2V0T2JqOiBDcmVhdGVTY3JhcEJ1Y2tldChzdGFjaywgXCJ0ZXN0YnVja2V0XCIpLFxuICAgIGJ1Y2tldFByb3BzOiB7fVxuICB9O1xuXG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgZGVmYXVsdHMuQ2hlY2tQb2xseVByb3BzKHByb3BzKTtcbiAgfSkudG9UaHJvdygnRXJyb3IgLSBFaXRoZXIgcHJvdmlkZSBidWNrZXRQcm9wcyBvciBleGlzdGluZ0J1Y2tldE9iaiwgYnV0IG5vdCBib3RoLicpO1xufSk7XG5cbnRlc3QoXCJDaGVja1BvbGx5UHJvcHMgdGhyb3dzIGVycm9yIHdoZW4gYXN5bmNKb2JzIGlzIHRydWUgYW5kIGJvdGggZXhpc3RpbmdUb3BpY09iaiBhbmQgdG9waWNQcm9wcyBhcmUgcHJvdmlkZWRcIiwgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgXCJ0ZXN0LXN0YWNrXCIpO1xuICBjb25zdCB0b3BpYyA9IGRlZmF1bHRzLmJ1aWxkVG9waWMoc3RhY2ssICd0ZXN0LXRvcGljJywge30pLnRvcGljO1xuXG4gIGNvbnN0IHByb3BzID0ge1xuICAgIGFzeW5jSm9iczogdHJ1ZSxcbiAgICBleGlzdGluZ1RvcGljT2JqOiB0b3BpYyxcbiAgICB0b3BpY1Byb3BzOiB7fVxuICB9O1xuXG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgZGVmYXVsdHMuQ2hlY2tQb2xseVByb3BzKHByb3BzKTtcbiAgfSkudG9UaHJvdygnRXJyb3IgLSBFaXRoZXIgcHJvdmlkZSB0b3BpY1Byb3BzIG9yIGV4aXN0aW5nVG9waWNPYmosIGJ1dCBub3QgYm90aC4nKTtcbn0pO1xuXG50ZXN0KFwiQ2hlY2tQb2xseVByb3BzIHRocm93cyBlcnJvciB3aGVuIHRvcGljUHJvcHMubWFzdGVyS2V5IGFuZCB0b3BpY0VuY3J5cHRpb25LZXkgYXJlIGJvdGggcHJvdmlkZWRcIiwgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgXCJ0ZXN0LXN0YWNrXCIpO1xuICBjb25zdCBrZXkgPSBkZWZhdWx0cy5idWlsZEVuY3J5cHRpb25LZXkoc3RhY2ssICd0ZXN0LWtleScpO1xuXG4gIGNvbnN0IHByb3BzOiBkZWZhdWx0cy5Qb2xseVByb3BzID0ge1xuICAgIGFzeW5jSm9iczogdHJ1ZSxcbiAgICB0b3BpY1Byb3BzOiB7XG4gICAgICBtYXN0ZXJLZXk6IGtleVxuICAgIH0sXG4gICAgdG9waWNFbmNyeXB0aW9uS2V5OiBrZXlcbiAgfTtcblxuICBleHBlY3QoKCkgPT4ge1xuICAgIGRlZmF1bHRzLkNoZWNrUG9sbHlQcm9wcyhwcm9wcyk7XG4gIH0pLnRvVGhyb3coJ0Vycm9yIC0gRWl0aGVyIHByb3ZpZGUgdG9waWNQcm9wcy5tYXN0ZXJLZXkgb3IgdG9waWNFbmNyeXB0aW9uS2V5LCBidXQgbm90IGJvdGguJyk7XG59KTtcblxudGVzdChcIkNoZWNrUG9sbHlQcm9wcyB0aHJvd3MgZXJyb3Igd2hlbiB0b3BpY1Byb3BzLm1hc3RlcktleSBhbmQgdG9waWNFbmNyeXB0aW9uS2V5UHJvcHMgYXJlIGJvdGggcHJvdmlkZWRcIiwgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgXCJ0ZXN0LXN0YWNrXCIpO1xuICBjb25zdCBrZXkgPSBkZWZhdWx0cy5idWlsZEVuY3J5cHRpb25LZXkoc3RhY2ssICd0ZXN0LWtleScpO1xuXG4gIGNvbnN0IHByb3BzOiBkZWZhdWx0cy5Qb2xseVByb3BzID0ge1xuICAgIGFzeW5jSm9iczogdHJ1ZSxcbiAgICB0b3BpY1Byb3BzOiB7XG4gICAgICBtYXN0ZXJLZXk6IGtleVxuICAgIH0sXG4gICAgdG9waWNFbmNyeXB0aW9uS2V5UHJvcHM6IHt9XG4gIH07XG5cbiAgZXhwZWN0KCgpID0+IHtcbiAgICBkZWZhdWx0cy5DaGVja1BvbGx5UHJvcHMocHJvcHMpO1xuICB9KS50b1Rocm93KCdFcnJvciAtIEVpdGhlciBwcm92aWRlIHRvcGljUHJvcHMubWFzdGVyS2V5IG9yIHRvcGljRW5jcnlwdGlvbktleVByb3BzLCBidXQgbm90IGJvdGguJyk7XG59KTtcblxudGVzdChcIkNoZWNrUG9sbHlQcm9wcyB0aHJvd3MgZXJyb3Igd2hlbiB0b3BpY0VuY3J5cHRpb25LZXkgYW5kIHRvcGljRW5jcnlwdGlvbktleVByb3BzIGFyZSBib3RoIHByb3ZpZGVkXCIsICgpID0+IHtcbiAgY29uc3QgYXBwID0gbmV3IEFwcCgpO1xuICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhhcHAsIFwidGVzdC1zdGFja1wiKTtcbiAgY29uc3Qga2V5ID0gZGVmYXVsdHMuYnVpbGRFbmNyeXB0aW9uS2V5KHN0YWNrLCAndGVzdC1rZXknKTtcblxuICBjb25zdCBwcm9wczogZGVmYXVsdHMuUG9sbHlQcm9wcyA9IHtcbiAgICBhc3luY0pvYnM6IHRydWUsXG4gICAgdG9waWNFbmNyeXB0aW9uS2V5OiBrZXksXG4gICAgdG9waWNFbmNyeXB0aW9uS2V5UHJvcHM6IHt9XG4gIH07XG5cbiAgZXhwZWN0KCgpID0+IHtcbiAgICBkZWZhdWx0cy5DaGVja1BvbGx5UHJvcHMocHJvcHMpO1xuICB9KS50b1Rocm93KCdFcnJvciAtIEVpdGhlciBwcm92aWRlIHRvcGljRW5jcnlwdGlvbktleSBvciB0b3BpY0VuY3J5cHRpb25LZXlQcm9wcywgYnV0IG5vdCBib3RoLicpO1xufSk7XG5cbnRlc3QoXCJDaGVja1BvbGx5UHJvcHMgYWNjZXB0cyBhbGwgdmFsaWQgYXN5bmNKb2JzIHRydWUgcHJvcGVydGllc1wiLCAoKSA9PiB7XG4gIGNvbnN0IHByb3BzID0ge1xuICAgIGFzeW5jSm9iczogdHJ1ZSxcbiAgICBidWNrZXRQcm9wczoge30sXG4gICAgbG9nZ2luZ0J1Y2tldFByb3BzOiB7fSxcbiAgICBsb2dTM0FjY2Vzc0xvZ3M6IHRydWUsXG4gICAgYnVja2V0RW52aXJvbm1lbnRWYXJpYWJsZU5hbWU6ICdNWV9CVUNLRVQnLFxuICAgIHRvcGljUHJvcHM6IHt9LFxuICAgIHRvcGljRW52aXJvbm1lbnRWYXJpYWJsZU5hbWU6ICdNWV9UT1BJQycsXG4gICAgZW5hYmxlVG9waWNFbmNyeXB0aW9uV2l0aEN1c3RvbWVyTWFuYWdlZEtleTogdHJ1ZVxuICB9O1xuXG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgZGVmYXVsdHMuQ2hlY2tQb2xseVByb3BzKHByb3BzKTtcbiAgfSkubm90LnRvVGhyb3coKTtcbn0pO1xuIl19