@aws-solutions-constructs/core 2.95.0 → 2.96.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.
@@ -0,0 +1,581 @@
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
+ test('Test deployment with asyncJobs enabled', () => {
20
+ const app = new aws_cdk_lib_1.App();
21
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
22
+ const configuration = defaults.ConfigureTranslateSupport(stack, 'test', { asyncJobs: true });
23
+ expect(configuration.sourceBucket).toBeDefined();
24
+ expect(configuration.sourceBucket?.bucket).toBeDefined();
25
+ expect(configuration.sourceBucket?.bucketInterface).toBeDefined();
26
+ expect(configuration.sourceBucket?.loggingBucket).toBeDefined();
27
+ expect(configuration.destinationBucket).toBeDefined();
28
+ expect(configuration.destinationBucket?.bucket).toBeDefined();
29
+ expect(configuration.destinationBucket?.bucketInterface).toBeDefined();
30
+ expect(configuration.destinationBucket?.loggingBucket).toBeDefined();
31
+ expect(configuration.translateRole).toBeDefined();
32
+ expect(configuration.lambdaIamActionsRequired).toEqual(expect.arrayContaining([
33
+ 'translate:TranslateText',
34
+ 'translate:TranslateDocument',
35
+ 'translate:DescribeTextTranslationJob',
36
+ 'translate:ListTextTranslationJobs',
37
+ 'translate:StartTextTranslationJob',
38
+ 'translate:StopTextTranslationJob'
39
+ ]));
40
+ expect(configuration.lambdaIamActionsRequired).toHaveLength(6);
41
+ const template = assertions_1.Template.fromStack(stack);
42
+ template.resourceCountIs('AWS::S3::Bucket', 4); // 2 main buckets + 2 logging buckets
43
+ // Check translate service permissions
44
+ template.hasResourceProperties('AWS::IAM::Policy', {
45
+ PolicyDocument: {
46
+ Statement: assertions_1.Match.arrayWith([
47
+ assertions_1.Match.objectLike({
48
+ Effect: 'Allow',
49
+ Action: assertions_1.Match.arrayWith([
50
+ "s3:GetObject*",
51
+ "s3:GetBucket*",
52
+ "s3:List*",
53
+ "s3:DeleteObject*",
54
+ "s3:PutObject",
55
+ "s3:PutObjectLegalHold",
56
+ "s3:PutObjectRetention",
57
+ "s3:PutObjectTagging",
58
+ "s3:PutObjectVersionTagging",
59
+ "s3:Abort*"
60
+ ]),
61
+ Resource: [
62
+ {
63
+ "Fn::GetAtt": [
64
+ assertions_1.Match.stringLikeRegexp("testdestinationbucketS3Bucket*."),
65
+ "Arn"
66
+ ]
67
+ },
68
+ {
69
+ "Fn::Join": [
70
+ "",
71
+ [
72
+ {
73
+ "Fn::GetAtt": [
74
+ assertions_1.Match.stringLikeRegexp("testdestinationbucketS3Bucket*."),
75
+ "Arn"
76
+ ]
77
+ },
78
+ "/*"
79
+ ]
80
+ ]
81
+ }
82
+ ]
83
+ }),
84
+ assertions_1.Match.objectLike({
85
+ Effect: 'Allow',
86
+ Action: assertions_1.Match.arrayWith([
87
+ "s3:GetObject*",
88
+ "s3:GetBucket*",
89
+ "s3:List*",
90
+ ]),
91
+ Resource: [
92
+ {
93
+ "Fn::GetAtt": [
94
+ assertions_1.Match.stringLikeRegexp("testsourcebucketS3Bucket.*"),
95
+ "Arn"
96
+ ]
97
+ },
98
+ {
99
+ "Fn::Join": [
100
+ "",
101
+ [
102
+ {
103
+ "Fn::GetAtt": [
104
+ assertions_1.Match.stringLikeRegexp("testsourcebucketS3Bucket.*"),
105
+ "Arn"
106
+ ]
107
+ },
108
+ "/*"
109
+ ]
110
+ ]
111
+ }
112
+ ]
113
+ })
114
+ ])
115
+ },
116
+ Roles: [
117
+ {
118
+ Ref: assertions_1.Match.stringLikeRegexp("testtranslateservicerole.*")
119
+ }
120
+ ]
121
+ });
122
+ template.hasResourceProperties("AWS::IAM::Role", {
123
+ AssumeRolePolicyDocument: {
124
+ Statement: [
125
+ {
126
+ Action: "sts:AssumeRole",
127
+ Effect: "Allow",
128
+ Principal: {
129
+ Service: "translate.amazonaws.com"
130
+ }
131
+ }
132
+ ],
133
+ Version: "2012-10-17"
134
+ }
135
+ });
136
+ // Check that there just 1 policy and Role
137
+ template.resourceCountIs("AWS::IAM::Policy", 1);
138
+ template.resourceCountIs("AWS::IAM::Role", 1);
139
+ });
140
+ test('Test deployment with without asyncJobs enabled', () => {
141
+ const app = new aws_cdk_lib_1.App();
142
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
143
+ const configuration = defaults.ConfigureTranslateSupport(stack, 'test', {});
144
+ expect(configuration.sourceBucket).not.toBeDefined();
145
+ expect(configuration.destinationBucket).not.toBeDefined();
146
+ expect(configuration.translateRole).not.toBeDefined();
147
+ expect(configuration.lambdaIamActionsRequired).toEqual(expect.arrayContaining([
148
+ 'translate:TranslateText',
149
+ 'translate:TranslateDocument',
150
+ ]));
151
+ expect(configuration.lambdaIamActionsRequired).toHaveLength(2);
152
+ });
153
+ test('Test deployment with useSameBucket', () => {
154
+ const app = new aws_cdk_lib_1.App();
155
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
156
+ const configuration = defaults.ConfigureTranslateSupport(stack, 'test', { asyncJobs: true, useSameBucket: true });
157
+ expect(configuration.sourceBucket).toBeDefined();
158
+ expect(configuration.sourceBucket?.bucket).toBeDefined();
159
+ expect(configuration.sourceBucket?.bucketInterface).toBeDefined();
160
+ expect(configuration.sourceBucket?.loggingBucket).toBeDefined();
161
+ expect(configuration.destinationBucket).toBeDefined();
162
+ expect(configuration.destinationBucket?.bucket).toBeDefined();
163
+ expect(configuration.destinationBucket?.bucketInterface).toBeDefined();
164
+ expect(configuration.destinationBucket?.loggingBucket).toBeDefined();
165
+ expect(configuration.translateRole).toBeDefined();
166
+ expect(configuration.lambdaIamActionsRequired).toEqual(expect.arrayContaining([
167
+ 'translate:TranslateText',
168
+ 'translate:TranslateDocument',
169
+ 'translate:DescribeTextTranslationJob',
170
+ 'translate:ListTextTranslationJobs',
171
+ 'translate:StartTextTranslationJob',
172
+ 'translate:StopTextTranslationJob'
173
+ ]));
174
+ expect(configuration.lambdaIamActionsRequired).toHaveLength(6);
175
+ expect(configuration.sourceBucket?.bucket).toBe(configuration.destinationBucket?.bucket);
176
+ expect(configuration.sourceBucket?.bucketInterface).toBe(configuration.destinationBucket?.bucketInterface);
177
+ expect(configuration.sourceBucket?.loggingBucket).toBe(configuration.destinationBucket?.loggingBucket);
178
+ const template = assertions_1.Template.fromStack(stack);
179
+ template.resourceCountIs('AWS::S3::Bucket', 2); // 1 main bucket + 1 logging bucket
180
+ // Check translate service permissions
181
+ template.hasResourceProperties('AWS::IAM::Policy', {
182
+ PolicyDocument: {
183
+ Statement: assertions_1.Match.arrayWith([
184
+ assertions_1.Match.objectLike({
185
+ Effect: 'Allow',
186
+ Action: assertions_1.Match.arrayWith([
187
+ "s3:GetObject*",
188
+ "s3:GetBucket*",
189
+ "s3:List*",
190
+ "s3:DeleteObject*",
191
+ "s3:PutObject",
192
+ "s3:PutObjectLegalHold",
193
+ "s3:PutObjectRetention",
194
+ "s3:PutObjectTagging",
195
+ "s3:PutObjectVersionTagging",
196
+ "s3:Abort*"
197
+ ]),
198
+ Resource: [
199
+ {
200
+ "Fn::GetAtt": [
201
+ assertions_1.Match.stringLikeRegexp("testsourcebucketS3Bucket*."),
202
+ "Arn"
203
+ ]
204
+ },
205
+ {
206
+ "Fn::Join": [
207
+ "",
208
+ [
209
+ {
210
+ "Fn::GetAtt": [
211
+ assertions_1.Match.stringLikeRegexp("testsourcebucketS3Bucket*."),
212
+ "Arn"
213
+ ]
214
+ },
215
+ "/*"
216
+ ]
217
+ ]
218
+ }
219
+ ]
220
+ }),
221
+ assertions_1.Match.objectLike({
222
+ Effect: 'Allow',
223
+ Action: assertions_1.Match.arrayWith([
224
+ "s3:GetObject*",
225
+ "s3:GetBucket*",
226
+ "s3:List*",
227
+ ]),
228
+ Resource: [
229
+ {
230
+ "Fn::GetAtt": [
231
+ assertions_1.Match.stringLikeRegexp("testsourcebucketS3Bucket.*"),
232
+ "Arn"
233
+ ]
234
+ },
235
+ {
236
+ "Fn::Join": [
237
+ "",
238
+ [
239
+ {
240
+ "Fn::GetAtt": [
241
+ assertions_1.Match.stringLikeRegexp("testsourcebucketS3Bucket.*"),
242
+ "Arn"
243
+ ]
244
+ },
245
+ "/*"
246
+ ]
247
+ ]
248
+ }
249
+ ]
250
+ })
251
+ ])
252
+ },
253
+ Roles: [
254
+ {
255
+ Ref: assertions_1.Match.stringLikeRegexp("testtranslateservicerole.*")
256
+ }
257
+ ]
258
+ });
259
+ // Check that there just 1 policy
260
+ template.resourceCountIs("AWS::IAM::Policy", 1);
261
+ });
262
+ test('Test deployment with source, destination and logging bucket Props', () => {
263
+ const app = new aws_cdk_lib_1.App();
264
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
265
+ defaults.ConfigureTranslateSupport(stack, 'test', {
266
+ asyncJobs: true,
267
+ sourceBucketProps: {
268
+ bucketName: "source-bucket"
269
+ },
270
+ sourceLoggingBucketProps: {
271
+ bucketName: "source-logging-bucket"
272
+ },
273
+ destinationBucketProps: {
274
+ bucketName: "destination-bucket"
275
+ },
276
+ destinationLoggingBucketProps: {
277
+ bucketName: "destination-logging-bucket"
278
+ },
279
+ });
280
+ const template = assertions_1.Template.fromStack(stack);
281
+ template.resourceCountIs("AWS::S3::Bucket", 4);
282
+ template.hasResourceProperties("AWS::S3::Bucket", {
283
+ BucketName: "source-bucket",
284
+ LoggingConfiguration: {
285
+ DestinationBucketName: {
286
+ Ref: assertions_1.Match.stringLikeRegexp("testsourcebucketS3LoggingBucket.*")
287
+ }
288
+ },
289
+ });
290
+ template.hasResourceProperties("AWS::S3::Bucket", {
291
+ BucketName: "source-logging-bucket",
292
+ AccessControl: "LogDeliveryWrite"
293
+ });
294
+ template.hasResourceProperties("AWS::S3::Bucket", {
295
+ BucketName: "destination-bucket",
296
+ LoggingConfiguration: {
297
+ DestinationBucketName: {
298
+ Ref: assertions_1.Match.stringLikeRegexp("testdestinationbucketS3LoggingBucket.*")
299
+ }
300
+ },
301
+ });
302
+ template.hasResourceProperties("AWS::S3::Bucket", {
303
+ BucketName: "destination-logging-bucket",
304
+ AccessControl: "LogDeliveryWrite"
305
+ });
306
+ });
307
+ test('Test deployment with existing Source bucket and useSameBucket', () => {
308
+ const app = new aws_cdk_lib_1.App();
309
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
310
+ const existingSourceBucket = defaults.CreateScrapBucket(stack, "scrap", {});
311
+ const configuration = defaults.ConfigureTranslateSupport(stack, 'test', {
312
+ asyncJobs: true,
313
+ existingSourceBucketObj: existingSourceBucket,
314
+ useSameBucket: true,
315
+ });
316
+ expect(configuration.sourceBucket).toBeDefined();
317
+ expect(configuration.sourceBucket?.bucket).not.toBeDefined();
318
+ expect(configuration.sourceBucket?.bucketInterface).toBeDefined();
319
+ expect(configuration.sourceBucket?.loggingBucket).not.toBeDefined();
320
+ expect(configuration.destinationBucket).toBeDefined();
321
+ expect(configuration.destinationBucket?.bucket).not.toBeDefined();
322
+ expect(configuration.destinationBucket?.bucketInterface).toBeDefined();
323
+ expect(configuration.destinationBucket?.loggingBucket).not.toBeDefined();
324
+ expect(configuration.destinationBucket?.bucketInterface).toBe(existingSourceBucket);
325
+ expect(configuration.sourceBucket?.bucketInterface).toBe(existingSourceBucket);
326
+ });
327
+ test('Test deployment with existing Destination bucket', () => {
328
+ const app = new aws_cdk_lib_1.App();
329
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
330
+ const existingDestinationBucket = defaults.CreateScrapBucket(stack, "scrap", {});
331
+ const configuration = defaults.ConfigureTranslateSupport(stack, 'test', {
332
+ asyncJobs: true,
333
+ existingDestinationBucketObj: existingDestinationBucket
334
+ });
335
+ expect(configuration.sourceBucket).toBeDefined();
336
+ expect(configuration.sourceBucket?.bucket).toBeDefined();
337
+ expect(configuration.sourceBucket?.bucketInterface).toBeDefined();
338
+ expect(configuration.sourceBucket?.loggingBucket).toBeDefined();
339
+ expect(configuration.destinationBucket).toBeDefined();
340
+ expect(configuration.destinationBucket?.bucket).not.toBeDefined();
341
+ expect(configuration.destinationBucket?.bucketInterface).toBeDefined();
342
+ expect(configuration.destinationBucket?.loggingBucket).not.toBeDefined();
343
+ expect(configuration.destinationBucket?.bucketInterface).toBe(existingDestinationBucket);
344
+ const template = assertions_1.Template.fromStack(stack);
345
+ template.resourceCountIs('AWS::S3::Bucket', 4); // 2 main buckets + 2 logging buckets
346
+ // Check translate service permissions
347
+ template.hasResourceProperties('AWS::IAM::Policy', {
348
+ PolicyDocument: {
349
+ Statement: assertions_1.Match.arrayWith([
350
+ assertions_1.Match.objectLike({
351
+ Effect: 'Allow',
352
+ Action: assertions_1.Match.arrayWith([
353
+ "s3:GetObject*",
354
+ "s3:GetBucket*",
355
+ "s3:List*",
356
+ "s3:DeleteObject*",
357
+ "s3:PutObject",
358
+ "s3:PutObjectLegalHold",
359
+ "s3:PutObjectRetention",
360
+ "s3:PutObjectTagging",
361
+ "s3:PutObjectVersionTagging",
362
+ "s3:Abort*"
363
+ ])
364
+ })
365
+ ])
366
+ },
367
+ Roles: [
368
+ {
369
+ Ref: assertions_1.Match.stringLikeRegexp("testtranslateservicerole.*")
370
+ }
371
+ ]
372
+ });
373
+ // Check that there just 1 policy
374
+ template.resourceCountIs("AWS::IAM::Policy", 1);
375
+ });
376
+ // =============================================
377
+ // Test CheckTranslateProps()
378
+ // =============================================
379
+ test("CheckTranslateProps with valid asyncJobs true", () => {
380
+ const props = {
381
+ asyncJobs: true,
382
+ sourceBucketProps: {}
383
+ };
384
+ expect(() => {
385
+ defaults.CheckTranslateProps(props);
386
+ }).not.toThrow();
387
+ });
388
+ test("CheckTranslateProps with valid asyncJobs false", () => {
389
+ const props = {
390
+ asyncJobs: false
391
+ };
392
+ expect(() => {
393
+ defaults.CheckTranslateProps(props);
394
+ }).not.toThrow();
395
+ });
396
+ test("CheckTranslateProps throws error when asyncJobs is false and existingSourceBucketObj is provided", () => {
397
+ const stack = new aws_cdk_lib_1.Stack();
398
+ const props = {
399
+ asyncJobs: false,
400
+ existingSourceBucketObj: (0, test_helper_1.CreateScrapBucket)(stack, "testbucket")
401
+ };
402
+ expect(() => {
403
+ defaults.CheckTranslateProps(props);
404
+ }).toThrow('S3 bucket properties can only be provided when asyncJobs is true');
405
+ });
406
+ test("CheckTranslateProps throws error when asyncJobs is false and sourceBucketProps is provided", () => {
407
+ const props = {
408
+ asyncJobs: false,
409
+ sourceBucketProps: {}
410
+ };
411
+ expect(() => {
412
+ defaults.CheckTranslateProps(props);
413
+ }).toThrow('S3 bucket properties can only be provided when asyncJobs is true');
414
+ });
415
+ test("CheckTranslateProps throws error when asyncJobs is false and existingDestinationBucketObj is provided", () => {
416
+ const stack = new aws_cdk_lib_1.Stack();
417
+ const props = {
418
+ asyncJobs: false,
419
+ existingDestinationBucketObj: (0, test_helper_1.CreateScrapBucket)(stack, "testbucket")
420
+ };
421
+ expect(() => {
422
+ defaults.CheckTranslateProps(props);
423
+ }).toThrow('S3 bucket properties can only be provided when asyncJobs is true');
424
+ });
425
+ test("CheckTranslateProps throws error when asyncJobs is false and destinationBucketProps is provided", () => {
426
+ const props = {
427
+ asyncJobs: false,
428
+ destinationBucketProps: {}
429
+ };
430
+ expect(() => {
431
+ defaults.CheckTranslateProps(props);
432
+ }).toThrow('S3 bucket properties can only be provided when asyncJobs is true');
433
+ });
434
+ test("CheckTranslateProps throws error when asyncJobs is false and sourceLoggingBucketProps is provided", () => {
435
+ const props = {
436
+ asyncJobs: false,
437
+ sourceLoggingBucketProps: {}
438
+ };
439
+ expect(() => {
440
+ defaults.CheckTranslateProps(props);
441
+ }).toThrow('S3 bucket properties can only be provided when asyncJobs is true');
442
+ });
443
+ test("CheckTranslateProps throws error when asyncJobs is false and destinationLoggingBucketProps is provided", () => {
444
+ const props = {
445
+ asyncJobs: false,
446
+ destinationLoggingBucketProps: {}
447
+ };
448
+ expect(() => {
449
+ defaults.CheckTranslateProps(props);
450
+ }).toThrow('S3 bucket properties can only be provided when asyncJobs is true');
451
+ });
452
+ test("CheckTranslateProps throws error when asyncJobs is false and logSourceS3AccessLogs is provided", () => {
453
+ const props = {
454
+ asyncJobs: false,
455
+ logSourceS3AccessLogs: true
456
+ };
457
+ expect(() => {
458
+ defaults.CheckTranslateProps(props);
459
+ }).toThrow('S3 bucket properties can only be provided when asyncJobs is true');
460
+ });
461
+ test("CheckTranslateProps throws error when asyncJobs is false and logDestinationS3AccessLogs is provided", () => {
462
+ const props = {
463
+ asyncJobs: false,
464
+ logDestinationS3AccessLogs: true
465
+ };
466
+ expect(() => {
467
+ defaults.CheckTranslateProps(props);
468
+ }).toThrow('S3 bucket properties can only be provided when asyncJobs is true');
469
+ });
470
+ test("CheckTranslateProps throws error when asyncJobs is false and sourceBucketEnvironmentVariableName is provided", () => {
471
+ const props = {
472
+ asyncJobs: false,
473
+ sourceBucketEnvironmentVariableName: 'MY_SOURCE_BUCKET'
474
+ };
475
+ expect(() => {
476
+ defaults.CheckTranslateProps(props);
477
+ }).toThrow('S3 bucket properties can only be provided when asyncJobs is true');
478
+ });
479
+ test("CheckTranslateProps throws error when asyncJobs is false and destinationBucketEnvironmentVariableName is provided", () => {
480
+ const props = {
481
+ asyncJobs: false,
482
+ destinationBucketEnvironmentVariableName: 'MY_DEST_BUCKET'
483
+ };
484
+ expect(() => {
485
+ defaults.CheckTranslateProps(props);
486
+ }).toThrow('S3 bucket properties can only be provided when asyncJobs is true');
487
+ });
488
+ test("CheckTranslateProps throws error when asyncJobs is false and dataAccessRoleArnEnvironmentVariableName is provided", () => {
489
+ const props = {
490
+ asyncJobs: false,
491
+ dataAccessRoleArnEnvironmentVariableName: 'MY_ROLE_NAME'
492
+ };
493
+ expect(() => {
494
+ defaults.CheckTranslateProps(props);
495
+ }).toThrow('S3 bucket properties can only be provided when asyncJobs is true');
496
+ });
497
+ test("CheckTranslateProps throws error when asyncJobs is false and useSameBucket is provided", () => {
498
+ const props = {
499
+ asyncJobs: false,
500
+ useSameBucket: true
501
+ };
502
+ expect(() => {
503
+ defaults.CheckTranslateProps(props);
504
+ }).toThrow('S3 bucket properties can only be provided when asyncJobs is true');
505
+ });
506
+ test("CheckTranslateProps throws error when useSameBucket is true and existingDestinationBucketObj is provided", () => {
507
+ const stack = new aws_cdk_lib_1.Stack();
508
+ const props = {
509
+ asyncJobs: true,
510
+ useSameBucket: true,
511
+ existingDestinationBucketObj: (0, test_helper_1.CreateScrapBucket)(stack, "testbucket")
512
+ };
513
+ expect(() => {
514
+ defaults.CheckTranslateProps(props);
515
+ }).toThrow('Destination bucket properties cannot be provided when useSameBucket is true');
516
+ });
517
+ test("CheckTranslateProps throws error when useSameBucket is true and destinationBucketProps is provided", () => {
518
+ const props = {
519
+ asyncJobs: true,
520
+ useSameBucket: true,
521
+ destinationBucketProps: {}
522
+ };
523
+ expect(() => {
524
+ defaults.CheckTranslateProps(props);
525
+ }).toThrow('Destination bucket properties cannot be provided when useSameBucket is true');
526
+ });
527
+ test("CheckTranslateProps throws error when useSameBucket is true and destinationLoggingBucketProps is provided", () => {
528
+ const props = {
529
+ asyncJobs: true,
530
+ useSameBucket: true,
531
+ destinationLoggingBucketProps: {}
532
+ };
533
+ expect(() => {
534
+ defaults.CheckTranslateProps(props);
535
+ }).toThrow('Destination bucket properties cannot be provided when useSameBucket is true');
536
+ });
537
+ test("CheckTranslateProps throws error when useSameBucket is true and logDestinationS3AccessLogs is provided", () => {
538
+ const props = {
539
+ asyncJobs: true,
540
+ useSameBucket: true,
541
+ logDestinationS3AccessLogs: true
542
+ };
543
+ expect(() => {
544
+ defaults.CheckTranslateProps(props);
545
+ }).toThrow('Destination bucket properties cannot be provided when useSameBucket is true');
546
+ });
547
+ test("CheckTranslateProps with valid useSameBucket true and source bucket props", () => {
548
+ const props = {
549
+ asyncJobs: true,
550
+ useSameBucket: true,
551
+ sourceBucketProps: {}
552
+ };
553
+ expect(() => {
554
+ defaults.CheckTranslateProps(props);
555
+ }).not.toThrow();
556
+ });
557
+ test("CheckTranslateProps calls CheckS3Props() for source bucket", () => {
558
+ const app = new aws_cdk_lib_1.App();
559
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
560
+ const props = {
561
+ asyncJobs: true,
562
+ sourceBucketProps: {},
563
+ existingSourceBucketObj: (0, test_helper_1.CreateScrapBucket)(stack, 'test')
564
+ };
565
+ expect(() => {
566
+ defaults.CheckTranslateProps(props);
567
+ }).toThrow('Error - Either provide bucketProps or existingBucketObj, but not both.\n');
568
+ });
569
+ test("CheckTranslateProps calls CheckS3Props() for destination bucket", () => {
570
+ const app = new aws_cdk_lib_1.App();
571
+ const stack = new aws_cdk_lib_1.Stack(app, "test-stack");
572
+ const props = {
573
+ asyncJobs: true,
574
+ destinationBucketProps: {},
575
+ existingDestinationBucketObj: (0, test_helper_1.CreateScrapBucket)(stack, 'test')
576
+ };
577
+ expect(() => {
578
+ defaults.CheckTranslateProps(props);
579
+ }).toThrow('Error - Either provide bucketProps or existingBucketObj, but not both.\n');
580
+ });
581
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLWhlbHBlci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidHJhbnNsYXRlLWhlbHBlci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7R0FXRzs7QUFFSCxxQ0FBcUM7QUFDckMsK0NBQWtEO0FBQ2xELDZDQUF5QztBQUN6Qyx1REFBeUQ7QUFFekQsSUFBSSxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsRUFBRTtJQUNsRCxNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFHLEVBQUUsQ0FBQztJQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRTNDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFN0YsTUFBTSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNqRCxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN6RCxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsRSxNQUFNLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNoRSxNQUFNLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdEQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM5RCxNQUFNLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZFLE1BQU0sQ0FB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QUFNLENBQUMsR0FBRyxFQUFFO1FBQ1YsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQywwRUFBMEUsQ0FBQyxDQUFDO0FBQ3pGLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLGlFQUFpRSxFQUFFLEdBQUcsRUFBRTtJQUMzRSxNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFHLEVBQUUsQ0FBQztJQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRTNDLE1BQU0sS0FBSyxHQUFHO1FBQ1osU0FBUyxFQUFFLElBQUk7UUFDZixzQkFBc0IsRUFBRSxFQUFFO1FBQzFCLDRCQUE0QixFQUFFLElBQUEsK0JBQWlCLEVBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztLQUMvRCxDQUFDO0lBRUYsTUFBTSxDQUFDLEdBQUcsRUFBRTtRQUNWLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsMEVBQTBFLENBQUMsQ0FBQztBQUN6RixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiAgd2l0aCB0aGUgTGljZW5zZS4gQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBvciBpbiB0aGUgJ2xpY2Vuc2UnIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgZmlsZS4gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFU1xuICogIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG4gKiAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCAqIGFzIGRlZmF1bHRzIGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHsgQ3JlYXRlU2NyYXBCdWNrZXQgfSBmcm9tIFwiLi90ZXN0LWhlbHBlclwiO1xuaW1wb3J0IHsgQXBwLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgTWF0Y2gsIFRlbXBsYXRlIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG5cbnRlc3QoJ1Rlc3QgZGVwbG95bWVudCB3aXRoIGFzeW5jSm9icyBlbmFibGVkJywgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgXCJ0ZXN0LXN0YWNrXCIpO1xuXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBkZWZhdWx0cy5Db25maWd1cmVUcmFuc2xhdGVTdXBwb3J0KHN0YWNrLCAndGVzdCcsIHsgYXN5bmNKb2JzOiB0cnVlIH0pO1xuXG4gIGV4cGVjdChjb25maWd1cmF0aW9uLnNvdXJjZUJ1Y2tldCkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uc291cmNlQnVja2V0Py5idWNrZXQpLnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLnNvdXJjZUJ1Y2tldD8uYnVja2V0SW50ZXJmYWNlKS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5zb3VyY2VCdWNrZXQ/LmxvZ2dpbmdCdWNrZXQpLnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmRlc3RpbmF0aW9uQnVja2V0KS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5kZXN0aW5hdGlvbkJ1Y2tldD8uYnVja2V0KS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5kZXN0aW5hdGlvbkJ1Y2tldD8uYnVja2V0SW50ZXJmYWNlKS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5kZXN0aW5hdGlvbkJ1Y2tldD8ubG9nZ2luZ0J1Y2tldCkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24udHJhbnNsYXRlUm9sZSkudG9CZURlZmluZWQoKTtcblxuICBleHBlY3QoY29uZmlndXJhdGlvbi5sYW1iZGFJYW1BY3Rpb25zUmVxdWlyZWQpLnRvRXF1YWwoZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgJ3RyYW5zbGF0ZTpUcmFuc2xhdGVUZXh0JyxcbiAgICAndHJhbnNsYXRlOlRyYW5zbGF0ZURvY3VtZW50JyxcbiAgICAndHJhbnNsYXRlOkRlc2NyaWJlVGV4dFRyYW5zbGF0aW9uSm9iJyxcbiAgICAndHJhbnNsYXRlOkxpc3RUZXh0VHJhbnNsYXRpb25Kb2JzJyxcbiAgICAndHJhbnNsYXRlOlN0YXJ0VGV4dFRyYW5zbGF0aW9uSm9iJyxcbiAgICAndHJhbnNsYXRlOlN0b3BUZXh0VHJhbnNsYXRpb25Kb2InXG4gIF0pKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24ubGFtYmRhSWFtQWN0aW9uc1JlcXVpcmVkKS50b0hhdmVMZW5ndGgoNik7XG5cbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuXG4gIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpTMzo6QnVja2V0JywgNCk7IC8vIDIgbWFpbiBidWNrZXRzICsgMiBsb2dnaW5nIGJ1Y2tldHNcblxuICAvLyBDaGVjayB0cmFuc2xhdGUgc2VydmljZSBwZXJtaXNzaW9uc1xuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6SUFNOjpQb2xpY3knLCB7XG4gICAgUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgIFN0YXRlbWVudDogTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgIEFjdGlvbjogTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgICAgIFwiczM6R2V0T2JqZWN0KlwiLFxuICAgICAgICAgICAgXCJzMzpHZXRCdWNrZXQqXCIsXG4gICAgICAgICAgICBcInMzOkxpc3QqXCIsXG4gICAgICAgICAgICBcInMzOkRlbGV0ZU9iamVjdCpcIixcbiAgICAgICAgICAgIFwiczM6UHV0T2JqZWN0XCIsXG4gICAgICAgICAgICBcInMzOlB1dE9iamVjdExlZ2FsSG9sZFwiLFxuICAgICAgICAgICAgXCJzMzpQdXRPYmplY3RSZXRlbnRpb25cIixcbiAgICAgICAgICAgIFwiczM6UHV0T2JqZWN0VGFnZ2luZ1wiLFxuICAgICAgICAgICAgXCJzMzpQdXRPYmplY3RWZXJzaW9uVGFnZ2luZ1wiLFxuICAgICAgICAgICAgXCJzMzpBYm9ydCpcIlxuICAgICAgICAgIF0pLFxuICAgICAgICAgIFJlc291cmNlOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwiRm46OkdldEF0dFwiOiBbXG4gICAgICAgICAgICAgICAgTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChcInRlc3RkZXN0aW5hdGlvbmJ1Y2tldFMzQnVja2V0Ki5cIiksXG4gICAgICAgICAgICAgICAgXCJBcm5cIlxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcIkZuOjpKb2luXCI6IFtcbiAgICAgICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJGbjo6R2V0QXR0XCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwidGVzdGRlc3RpbmF0aW9uYnVja2V0UzNCdWNrZXQqLlwiKSxcbiAgICAgICAgICAgICAgICAgICAgICBcIkFyblwiXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBcIi8qXCJcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0pLFxuICAgICAgICBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgQWN0aW9uOiBNYXRjaC5hcnJheVdpdGgoW1xuICAgICAgICAgICAgXCJzMzpHZXRPYmplY3QqXCIsXG4gICAgICAgICAgICBcInMzOkdldEJ1Y2tldCpcIixcbiAgICAgICAgICAgIFwiczM6TGlzdCpcIixcbiAgICAgICAgICBdKSxcbiAgICAgICAgICBSZXNvdXJjZTogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcIkZuOjpHZXRBdHRcIjogW1xuICAgICAgICAgICAgICAgIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoXCJ0ZXN0c291cmNlYnVja2V0UzNCdWNrZXQuKlwiKSxcbiAgICAgICAgICAgICAgICBcIkFyblwiXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwiRm46OkpvaW5cIjogW1xuICAgICAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBcIkZuOjpHZXRBdHRcIjogW1xuICAgICAgICAgICAgICAgICAgICAgIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoXCJ0ZXN0c291cmNlYnVja2V0UzNCdWNrZXQuKlwiKSxcbiAgICAgICAgICAgICAgICAgICAgICBcIkFyblwiXG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBcIi8qXCJcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0pXSlcbiAgICB9LFxuICAgIFJvbGVzOiBbXG4gICAgICB7XG4gICAgICAgIFJlZjogTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChcInRlc3R0cmFuc2xhdGVzZXJ2aWNlcm9sZS4qXCIpXG4gICAgICB9XG4gICAgXVxuICB9KTtcblxuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXCJBV1M6OklBTTo6Um9sZVwiLCB7XG4gICAgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50OiB7XG4gICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIEFjdGlvbjogXCJzdHM6QXNzdW1lUm9sZVwiLFxuICAgICAgICAgIEVmZmVjdDogXCJBbGxvd1wiLFxuICAgICAgICAgIFByaW5jaXBhbDoge1xuICAgICAgICAgICAgU2VydmljZTogXCJ0cmFuc2xhdGUuYW1hem9uYXdzLmNvbVwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgVmVyc2lvbjogXCIyMDEyLTEwLTE3XCJcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENoZWNrIHRoYXQgdGhlcmUganVzdCAxIHBvbGljeSBhbmQgUm9sZVxuICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoXCJBV1M6OklBTTo6UG9saWN5XCIsIDEpO1xuICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoXCJBV1M6OklBTTo6Um9sZVwiLCAxKTtcbn0pO1xuXG50ZXN0KCdUZXN0IGRlcGxveW1lbnQgd2l0aCB3aXRob3V0IGFzeW5jSm9icyBlbmFibGVkJywgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgXCJ0ZXN0LXN0YWNrXCIpO1xuXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBkZWZhdWx0cy5Db25maWd1cmVUcmFuc2xhdGVTdXBwb3J0KHN0YWNrLCAndGVzdCcsIHt9KTtcblxuICBleHBlY3QoY29uZmlndXJhdGlvbi5zb3VyY2VCdWNrZXQpLm5vdC50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5kZXN0aW5hdGlvbkJ1Y2tldCkubm90LnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLnRyYW5zbGF0ZVJvbGUpLm5vdC50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5sYW1iZGFJYW1BY3Rpb25zUmVxdWlyZWQpLnRvRXF1YWwoZXhwZWN0LmFycmF5Q29udGFpbmluZyhbXG4gICAgJ3RyYW5zbGF0ZTpUcmFuc2xhdGVUZXh0JyxcbiAgICAndHJhbnNsYXRlOlRyYW5zbGF0ZURvY3VtZW50JyxcbiAgXSkpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5sYW1iZGFJYW1BY3Rpb25zUmVxdWlyZWQpLnRvSGF2ZUxlbmd0aCgyKTtcblxufSk7XG5cbnRlc3QoJ1Rlc3QgZGVwbG95bWVudCB3aXRoIHVzZVNhbWVCdWNrZXQnLCAoKSA9PiB7XG4gIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCBcInRlc3Qtc3RhY2tcIik7XG5cbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IGRlZmF1bHRzLkNvbmZpZ3VyZVRyYW5zbGF0ZVN1cHBvcnQoc3RhY2ssICd0ZXN0JywgeyBhc3luY0pvYnM6IHRydWUsIHVzZVNhbWVCdWNrZXQ6IHRydWUgfSk7XG5cbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uc291cmNlQnVja2V0KS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5zb3VyY2VCdWNrZXQ/LmJ1Y2tldCkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uc291cmNlQnVja2V0Py5idWNrZXRJbnRlcmZhY2UpLnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLnNvdXJjZUJ1Y2tldD8ubG9nZ2luZ0J1Y2tldCkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uZGVzdGluYXRpb25CdWNrZXQpLnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmRlc3RpbmF0aW9uQnVja2V0Py5idWNrZXQpLnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmRlc3RpbmF0aW9uQnVja2V0Py5idWNrZXRJbnRlcmZhY2UpLnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmRlc3RpbmF0aW9uQnVja2V0Py5sb2dnaW5nQnVja2V0KS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi50cmFuc2xhdGVSb2xlKS50b0JlRGVmaW5lZCgpO1xuXG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmxhbWJkYUlhbUFjdGlvbnNSZXF1aXJlZCkudG9FcXVhbChleHBlY3QuYXJyYXlDb250YWluaW5nKFtcbiAgICAndHJhbnNsYXRlOlRyYW5zbGF0ZVRleHQnLFxuICAgICd0cmFuc2xhdGU6VHJhbnNsYXRlRG9jdW1lbnQnLFxuICAgICd0cmFuc2xhdGU6RGVzY3JpYmVUZXh0VHJhbnNsYXRpb25Kb2InLFxuICAgICd0cmFuc2xhdGU6TGlzdFRleHRUcmFuc2xhdGlvbkpvYnMnLFxuICAgICd0cmFuc2xhdGU6U3RhcnRUZXh0VHJhbnNsYXRpb25Kb2InLFxuICAgICd0cmFuc2xhdGU6U3RvcFRleHRUcmFuc2xhdGlvbkpvYidcbiAgXSkpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5sYW1iZGFJYW1BY3Rpb25zUmVxdWlyZWQpLnRvSGF2ZUxlbmd0aCg2KTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uc291cmNlQnVja2V0Py5idWNrZXQpLnRvQmUoY29uZmlndXJhdGlvbi5kZXN0aW5hdGlvbkJ1Y2tldD8uYnVja2V0KTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uc291cmNlQnVja2V0Py5idWNrZXRJbnRlcmZhY2UpLnRvQmUoY29uZmlndXJhdGlvbi5kZXN0aW5hdGlvbkJ1Y2tldD8uYnVja2V0SW50ZXJmYWNlKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uc291cmNlQnVja2V0Py5sb2dnaW5nQnVja2V0KS50b0JlKGNvbmZpZ3VyYXRpb24uZGVzdGluYXRpb25CdWNrZXQ/LmxvZ2dpbmdCdWNrZXQpO1xuXG4gIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcblxuICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIDIpOyAvLyAxIG1haW4gYnVja2V0ICsgMSBsb2dnaW5nIGJ1Y2tldFxuXG4gIC8vIENoZWNrIHRyYW5zbGF0ZSBzZXJ2aWNlIHBlcm1pc3Npb25zXG4gIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpJQU06OlBvbGljeScsIHtcbiAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgU3RhdGVtZW50OiBNYXRjaC5hcnJheVdpdGgoW1xuICAgICAgICBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgQWN0aW9uOiBNYXRjaC5hcnJheVdpdGgoW1xuICAgICAgICAgICAgXCJzMzpHZXRPYmplY3QqXCIsXG4gICAgICAgICAgICBcInMzOkdldEJ1Y2tldCpcIixcbiAgICAgICAgICAgIFwiczM6TGlzdCpcIixcbiAgICAgICAgICAgIFwiczM6RGVsZXRlT2JqZWN0KlwiLFxuICAgICAgICAgICAgXCJzMzpQdXRPYmplY3RcIixcbiAgICAgICAgICAgIFwiczM6UHV0T2JqZWN0TGVnYWxIb2xkXCIsXG4gICAgICAgICAgICBcInMzOlB1dE9iamVjdFJldGVudGlvblwiLFxuICAgICAgICAgICAgXCJzMzpQdXRPYmplY3RUYWdnaW5nXCIsXG4gICAgICAgICAgICBcInMzOlB1dE9iamVjdFZlcnNpb25UYWdnaW5nXCIsXG4gICAgICAgICAgICBcInMzOkFib3J0KlwiXG4gICAgICAgICAgXSksXG4gICAgICAgICAgUmVzb3VyY2U6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJGbjo6R2V0QXR0XCI6IFtcbiAgICAgICAgICAgICAgICBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwidGVzdHNvdXJjZWJ1Y2tldFMzQnVja2V0Ki5cIiksXG4gICAgICAgICAgICAgICAgXCJBcm5cIlxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcIkZuOjpKb2luXCI6IFtcbiAgICAgICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJGbjo6R2V0QXR0XCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwidGVzdHNvdXJjZWJ1Y2tldFMzQnVja2V0Ki5cIiksXG4gICAgICAgICAgICAgICAgICAgICAgXCJBcm5cIlxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXCIvKlwiXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9KSxcbiAgICAgICAgTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgIEFjdGlvbjogTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgICAgIFwiczM6R2V0T2JqZWN0KlwiLFxuICAgICAgICAgICAgXCJzMzpHZXRCdWNrZXQqXCIsXG4gICAgICAgICAgICBcInMzOkxpc3QqXCIsXG4gICAgICAgICAgXSksXG4gICAgICAgICAgUmVzb3VyY2U6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJGbjo6R2V0QXR0XCI6IFtcbiAgICAgICAgICAgICAgICBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwidGVzdHNvdXJjZWJ1Y2tldFMzQnVja2V0LipcIiksXG4gICAgICAgICAgICAgICAgXCJBcm5cIlxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcIkZuOjpKb2luXCI6IFtcbiAgICAgICAgICAgICAgICBcIlwiLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJGbjo6R2V0QXR0XCI6IFtcbiAgICAgICAgICAgICAgICAgICAgICBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwidGVzdHNvdXJjZWJ1Y2tldFMzQnVja2V0LipcIiksXG4gICAgICAgICAgICAgICAgICAgICAgXCJBcm5cIlxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXCIvKlwiXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9KV0pXG4gICAgfSxcbiAgICBSb2xlczogW1xuICAgICAge1xuICAgICAgICBSZWY6IE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoXCJ0ZXN0dHJhbnNsYXRlc2VydmljZXJvbGUuKlwiKVxuICAgICAgfVxuICAgIF1cbiAgfSk7XG5cbiAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBqdXN0IDEgcG9saWN5XG4gIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcyhcIkFXUzo6SUFNOjpQb2xpY3lcIiwgMSk7XG59KTtcblxudGVzdCgnVGVzdCBkZXBsb3ltZW50IHdpdGggc291cmNlLCBkZXN0aW5hdGlvbiBhbmQgbG9nZ2luZyBidWNrZXQgUHJvcHMnLCAoKSA9PiB7XG4gIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCBcInRlc3Qtc3RhY2tcIik7XG5cbiAgZGVmYXVsdHMuQ29uZmlndXJlVHJhbnNsYXRlU3VwcG9ydChzdGFjaywgJ3Rlc3QnLCB7XG4gICAgYXN5bmNKb2JzOiB0cnVlLFxuICAgIHNvdXJjZUJ1Y2tldFByb3BzOiB7XG4gICAgICBidWNrZXROYW1lOiBcInNvdXJjZS1idWNrZXRcIlxuICAgIH0sXG4gICAgc291cmNlTG9nZ2luZ0J1Y2tldFByb3BzOiB7XG4gICAgICBidWNrZXROYW1lOiBcInNvdXJjZS1sb2dnaW5nLWJ1Y2tldFwiXG4gICAgfSxcbiAgICBkZXN0aW5hdGlvbkJ1Y2tldFByb3BzOiB7XG4gICAgICBidWNrZXROYW1lOiBcImRlc3RpbmF0aW9uLWJ1Y2tldFwiXG4gICAgfSxcbiAgICBkZXN0aW5hdGlvbkxvZ2dpbmdCdWNrZXRQcm9wczoge1xuICAgICAgYnVja2V0TmFtZTogXCJkZXN0aW5hdGlvbi1sb2dnaW5nLWJ1Y2tldFwiXG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuXG4gIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcyhcIkFXUzo6UzM6OkJ1Y2tldFwiLCA0KTtcbiAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKFwiQVdTOjpTMzo6QnVja2V0XCIsIHtcbiAgICBCdWNrZXROYW1lOiBcInNvdXJjZS1idWNrZXRcIixcbiAgICBMb2dnaW5nQ29uZmlndXJhdGlvbjoge1xuICAgICAgRGVzdGluYXRpb25CdWNrZXROYW1lOiB7XG4gICAgICAgIFJlZjogTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChcInRlc3Rzb3VyY2VidWNrZXRTM0xvZ2dpbmdCdWNrZXQuKlwiKVxuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXCJBV1M6OlMzOjpCdWNrZXRcIiwge1xuICAgIEJ1Y2tldE5hbWU6IFwic291cmNlLWxvZ2dpbmctYnVja2V0XCIsXG4gICAgQWNjZXNzQ29udHJvbDogXCJMb2dEZWxpdmVyeVdyaXRlXCJcbiAgfSk7XG4gIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcyhcIkFXUzo6UzM6OkJ1Y2tldFwiLCB7XG4gICAgQnVja2V0TmFtZTogXCJkZXN0aW5hdGlvbi1idWNrZXRcIixcbiAgICBMb2dnaW5nQ29uZmlndXJhdGlvbjoge1xuICAgICAgRGVzdGluYXRpb25CdWNrZXROYW1lOiB7XG4gICAgICAgIFJlZjogTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChcInRlc3RkZXN0aW5hdGlvbmJ1Y2tldFMzTG9nZ2luZ0J1Y2tldC4qXCIpXG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG4gIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcyhcIkFXUzo6UzM6OkJ1Y2tldFwiLCB7XG4gICAgQnVja2V0TmFtZTogXCJkZXN0aW5hdGlvbi1sb2dnaW5nLWJ1Y2tldFwiLFxuICAgIEFjY2Vzc0NvbnRyb2w6IFwiTG9nRGVsaXZlcnlXcml0ZVwiXG4gIH0pO1xufSk7XG5cbnRlc3QoJ1Rlc3QgZGVwbG95bWVudCB3aXRoIGV4aXN0aW5nIFNvdXJjZSBidWNrZXQgYW5kIHVzZVNhbWVCdWNrZXQnLCAoKSA9PiB7XG4gIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCBcInRlc3Qtc3RhY2tcIik7XG5cbiAgY29uc3QgZXhpc3RpbmdTb3VyY2VCdWNrZXQgPSBkZWZhdWx0cy5DcmVhdGVTY3JhcEJ1Y2tldChzdGFjaywgXCJzY3JhcFwiLCB7fSk7XG4gIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBkZWZhdWx0cy5Db25maWd1cmVUcmFuc2xhdGVTdXBwb3J0KHN0YWNrLCAndGVzdCcsIHtcbiAgICBhc3luY0pvYnM6IHRydWUsXG4gICAgZXhpc3RpbmdTb3VyY2VCdWNrZXRPYmo6IGV4aXN0aW5nU291cmNlQnVja2V0LFxuICAgIHVzZVNhbWVCdWNrZXQ6IHRydWUsXG4gIH0pO1xuXG4gIGV4cGVjdChjb25maWd1cmF0aW9uLnNvdXJjZUJ1Y2tldCkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uc291cmNlQnVja2V0Py5idWNrZXQpLm5vdC50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5zb3VyY2VCdWNrZXQ/LmJ1Y2tldEludGVyZmFjZSkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uc291cmNlQnVja2V0Py5sb2dnaW5nQnVja2V0KS5ub3QudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uZGVzdGluYXRpb25CdWNrZXQpLnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmRlc3RpbmF0aW9uQnVja2V0Py5idWNrZXQpLm5vdC50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5kZXN0aW5hdGlvbkJ1Y2tldD8uYnVja2V0SW50ZXJmYWNlKS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5kZXN0aW5hdGlvbkJ1Y2tldD8ubG9nZ2luZ0J1Y2tldCkubm90LnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmRlc3RpbmF0aW9uQnVja2V0Py5idWNrZXRJbnRlcmZhY2UpLnRvQmUoZXhpc3RpbmdTb3VyY2VCdWNrZXQpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5zb3VyY2VCdWNrZXQ/LmJ1Y2tldEludGVyZmFjZSkudG9CZShleGlzdGluZ1NvdXJjZUJ1Y2tldCk7XG59KTtcblxudGVzdCgnVGVzdCBkZXBsb3ltZW50IHdpdGggZXhpc3RpbmcgRGVzdGluYXRpb24gYnVja2V0JywgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgXCJ0ZXN0LXN0YWNrXCIpO1xuXG4gIGNvbnN0IGV4aXN0aW5nRGVzdGluYXRpb25CdWNrZXQgPSBkZWZhdWx0cy5DcmVhdGVTY3JhcEJ1Y2tldChzdGFjaywgXCJzY3JhcFwiLCB7fSk7XG4gIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBkZWZhdWx0cy5Db25maWd1cmVUcmFuc2xhdGVTdXBwb3J0KHN0YWNrLCAndGVzdCcsIHtcbiAgICBhc3luY0pvYnM6IHRydWUsXG4gICAgZXhpc3RpbmdEZXN0aW5hdGlvbkJ1Y2tldE9iajogZXhpc3RpbmdEZXN0aW5hdGlvbkJ1Y2tldFxuICB9KTtcblxuICBleHBlY3QoY29uZmlndXJhdGlvbi5zb3VyY2VCdWNrZXQpLnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLnNvdXJjZUJ1Y2tldD8uYnVja2V0KS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5zb3VyY2VCdWNrZXQ/LmJ1Y2tldEludGVyZmFjZSkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uc291cmNlQnVja2V0Py5sb2dnaW5nQnVja2V0KS50b0JlRGVmaW5lZCgpO1xuICBleHBlY3QoY29uZmlndXJhdGlvbi5kZXN0aW5hdGlvbkJ1Y2tldCkudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uZGVzdGluYXRpb25CdWNrZXQ/LmJ1Y2tldCkubm90LnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmRlc3RpbmF0aW9uQnVja2V0Py5idWNrZXRJbnRlcmZhY2UpLnRvQmVEZWZpbmVkKCk7XG4gIGV4cGVjdChjb25maWd1cmF0aW9uLmRlc3RpbmF0aW9uQnVja2V0Py5sb2dnaW5nQnVja2V0KS5ub3QudG9CZURlZmluZWQoKTtcbiAgZXhwZWN0KGNvbmZpZ3VyYXRpb24uZGVzdGluYXRpb25CdWNrZXQ/LmJ1Y2tldEludGVyZmFjZSkudG9CZShleGlzdGluZ0Rlc3RpbmF0aW9uQnVja2V0KTtcbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuXG4gIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpTMzo6QnVja2V0JywgNCk7IC8vIDIgbWFpbiBidWNrZXRzICsgMiBsb2dnaW5nIGJ1Y2tldHNcblxuICAvLyBDaGVjayB0cmFuc2xhdGUgc2VydmljZSBwZXJtaXNzaW9uc1xuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6SUFNOjpQb2xpY3knLCB7XG4gICAgUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgIFN0YXRlbWVudDogTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgIEFjdGlvbjogTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgICAgIFwiczM6R2V0T2JqZWN0KlwiLFxuICAgICAgICAgICAgXCJzMzpHZXRCdWNrZXQqXCIsXG4gICAgICAgICAgICBcInMzOkxpc3QqXCIsXG4gICAgICAgICAgICBcInMzOkRlbGV0ZU9iamVjdCpcIixcbiAgICAgICAgICAgIFwiczM6UHV0T2JqZWN0XCIsXG4gICAgICAgICAgICBcInMzOlB1dE9iamVjdExlZ2FsSG9sZFwiLFxuICAgICAgICAgICAgXCJzMzpQdXRPYmplY3RSZXRlbnRpb25cIixcbiAgICAgICAgICAgIFwiczM6UHV0T2JqZWN0VGFnZ2luZ1wiLFxuICAgICAgICAgICAgXCJzMzpQdXRPYmplY3RWZXJzaW9uVGFnZ2luZ1wiLFxuICAgICAgICAgICAgXCJzMzpBYm9ydCpcIlxuICAgICAgICAgIF0pXG4gICAgICAgIH0pXG4gICAgICBdKVxuICAgIH0sXG4gICAgUm9sZXM6IFtcbiAgICAgIHtcbiAgICAgICAgUmVmOiBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKFwidGVzdHRyYW5zbGF0ZXNlcnZpY2Vyb2xlLipcIilcbiAgICAgIH1cbiAgICBdXG4gIH0pO1xuXG4gIC8vIENoZWNrIHRoYXQgdGhlcmUganVzdCAxIHBvbGljeVxuICB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoXCJBV1M6OklBTTo6UG9saWN5XCIsIDEpO1xufSk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVGVzdCBDaGVja1RyYW5zbGF0ZVByb3BzKClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxudGVzdChcIkNoZWNrVHJhbnNsYXRlUHJvcHMgd2l0aCB2YWxpZCBhc3luY0pvYnMgdHJ1ZVwiLCAoKSA9PiB7XG4gIGNvbnN0IHByb3BzID0ge1xuICAgIGFzeW5jSm9iczogdHJ1ZSxcbiAgICBzb3VyY2VCdWNrZXRQcm9wczoge31cbiAgfTtcblxuICBleHBlY3QoKCkgPT4ge1xuICAgIGRlZmF1bHRzLkNoZWNrVHJhbnNsYXRlUHJvcHMocHJvcHMpO1xuICB9KS5ub3QudG9UaHJvdygpO1xufSk7XG5cbnRlc3QoXCJDaGVja1RyYW5zbGF0ZVByb3BzIHdpdGggdmFsaWQgYXN5bmNKb2JzIGZhbHNlXCIsICgpID0+IHtcbiAgY29uc3QgcHJvcHMgPSB7XG4gICAgYXN5bmNKb2JzOiBmYWxzZVxuICB9O1xuXG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgZGVmYXVsdHMuQ2hlY2tUcmFuc2xhdGVQcm9wcyhwcm9wcyk7XG4gIH0pLm5vdC50b1Rocm93KCk7XG59KTtcblxudGVzdChcIkNoZWNrVHJhbnNsYXRlUHJvcHMgdGhyb3dzIGVycm9yIHdoZW4gYXN5bmNKb2JzIGlzIGZhbHNlIGFuZCBleGlzdGluZ1NvdXJjZUJ1Y2tldE9iaiBpcyBwcm92aWRlZFwiLCAoKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IHByb3BzID0ge1xuICAgIGFzeW5jSm9iczogZmFsc2UsXG4gICAgZXhpc3RpbmdTb3VyY2VCdWNrZXRPYmo6IENyZWF0ZVNjcmFwQnVja2V0KHN0YWNrLCBcInRlc3RidWNrZXRcIilcbiAgfTtcblxuICBleHBlY3QoKCkgPT4ge1xuICAgIGRlZmF1bHRzLkNoZWNrVHJhbnNsYXRlUHJvcHMocHJvcHMpO1xuICB9KS50b1Rocm93KCdTMyBidWNrZXQgcHJvcGVydGllcyBjYW4gb25seSBiZSBwcm92aWRlZCB3aGVuIGFzeW5jSm9icyBpcyB0cnVlJyk7XG59KTtcblxudGVzdChcIkNoZWNrVHJhbnNsYXRlUHJvcHMgdGhyb3dzIGVycm9yIHdoZW4gYXN5bmNKb2JzIGlzIGZhbHNlIGFuZCBzb3VyY2VCdWNrZXRQcm9wcyBpcyBwcm92aWRlZFwiLCAoKSA9PiB7XG4gIGNvbnN0IHByb3BzID0ge1xuICAgIGFzeW5jSm9iczogZmFsc2UsXG4gICAgc291cmNlQnVja2V0UHJvcHM6IHt9XG4gIH07XG5cbiAgZXhwZWN0KCgpID0+IHtcbiAgICBkZWZhdWx0cy5DaGVja1RyYW5zbGF0ZVByb3BzKHByb3BzKTtcbiAgfSkudG9UaHJvdygnUzMgYnVja2V0IHByb3BlcnRpZXMgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2hlbiBhc3luY0pvYnMgaXMgdHJ1ZScpO1xufSk7XG5cbnRlc3QoXCJDaGVja1RyYW5zbGF0ZVByb3BzIHRocm93cyBlcnJvciB3aGVuIGFzeW5jSm9icyBpcyBmYWxzZSBhbmQgZXhpc3RpbmdEZXN0aW5hdGlvbkJ1Y2tldE9iaiBpcyBwcm92aWRlZFwiLCAoKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IHByb3BzID0ge1xuICAgIGFzeW5jSm9iczogZmFsc2UsXG4gICAgZXhpc3RpbmdEZXN0aW5hdGlvbkJ1Y2tldE9iajogQ3JlYXRlU2NyYXBCdWNrZXQoc3RhY2ssIFwidGVzdGJ1Y2tldFwiKVxuICB9O1xuXG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgZGVmYXVsdHMuQ2hlY2tUcmFuc2xhdGVQcm9wcyhwcm9wcyk7XG4gIH0pLnRvVGhyb3coJ1MzIGJ1Y2tldCBwcm9wZXJ0aWVzIGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdoZW4gYXN5bmNKb2JzIGlzIHRydWUnKTtcbn0pO1xuXG50ZXN0KFwiQ2hlY2tUcmFuc2xhdGVQcm9wcyB0aHJvd3MgZXJyb3Igd2hlbiBhc3luY0pvYnMgaXMgZmFsc2UgYW5kIGRlc3RpbmF0aW9uQnVja2V0UHJvcHMgaXMgcHJvdmlkZWRcIiwgKCkgPT4ge1xuICBjb25zdCBwcm9wcyA9IHtcbiAgICBhc3luY0pvYnM6IGZhbHNlLFxuICAgIGRlc3RpbmF0aW9uQnVja2V0UHJvcHM6IHt9XG4gIH07XG5cbiAgZXhwZWN0KCgpID0+IHtcbiAgICBkZWZhdWx0cy5DaGVja1RyYW5zbGF0ZVByb3BzKHByb3BzKTtcbiAgfSkudG9UaHJvdygnUzMgYnVja2V0IHByb3BlcnRpZXMgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2hlbiBhc3luY0pvYnMgaXMgdHJ1ZScpO1xufSk7XG5cbnRlc3QoXCJDaGVja1RyYW5zbGF0ZVByb3BzIHRocm93cyBlcnJvciB3aGVuIGFzeW5jSm9icyBpcyBmYWxzZSBhbmQgc291cmNlTG9nZ2luZ0J1Y2tldFByb3BzIGlzIHByb3ZpZGVkXCIsICgpID0+IHtcbiAgY29uc3QgcHJvcHMgPSB7XG4gICAgYXN5bmNKb2JzOiBmYWxzZSxcbiAgICBzb3VyY2VMb2dnaW5nQnVja2V0UHJvcHM6IHt9XG4gIH07XG5cbiAgZXhwZWN0KCgpID0+IHtcbiAgICBkZWZhdWx0cy5DaGVja1RyYW5zbGF0ZVByb3BzKHByb3BzKTtcbiAgfSkudG9UaHJvdygnUzMgYnVja2V0IHByb3BlcnRpZXMgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2hlbiBhc3luY0pvYnMgaXMgdHJ1ZScpO1xufSk7XG5cbnRlc3QoXCJDaGVja1RyYW5zbGF0ZVByb3BzIHRocm93cyBlcnJvciB3aGVuIGFzeW5jSm9icyBpcyBmYWxzZSBhbmQgZGVzdGluYXRpb25Mb2dnaW5nQnVja2V0UHJvcHMgaXMgcHJvdmlkZWRcIiwgKCkgPT4ge1xuICBjb25zdCBwcm9wcyA9IHtcbiAgICBhc3luY0pvYnM6IGZhbHNlLFxuICAgIGRlc3RpbmF0aW9uTG9nZ2luZ0J1Y2tldFByb3BzOiB7fVxuICB9O1xuXG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgZGVmYXVsdHMuQ2hlY2tUcmFuc2xhdGVQcm9wcyhwcm9wcyk7XG4gIH0pLnRvVGhyb3coJ1MzIGJ1Y2tldCBwcm9wZXJ0aWVzIGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdoZW4gYXN5bmNKb2JzIGlzIHRydWUnKTtcbn0pO1xuXG50ZXN0KFwiQ2hlY2tUcmFuc2xhdGVQcm9wcyB0aHJvd3MgZXJyb3Igd2hlbiBhc3luY0pvYnMgaXMgZmFsc2UgYW5kIGxvZ1NvdXJjZVMzQWNjZXNzTG9ncyBpcyBwcm92aWRlZFwiLCAoKSA9PiB7XG4gIGNvbnN0IHByb3BzID0ge1xuICAgIGFzeW5jSm9iczogZmFsc2UsXG4gICAgbG9nU291cmNlUzNBY2Nlc3NMb2dzOiB0cnVlXG4gIH07XG5cbiAgZXhwZWN0KCgpID0+IHtcbiAgICBkZWZhdWx0cy5DaGVja1RyYW5zbGF0ZVByb3BzKHByb3BzKTtcbiAgfSkudG9UaHJvdygnUzMgYnVja2V0IHByb3BlcnRpZXMgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2hlbiBhc3luY0pvYnMgaXMgdHJ1ZScpO1xufSk7XG5cbnRlc3QoXCJDaGVja1RyYW5zbGF0ZVByb3BzIHRocm93cyBlcnJvciB3aGVuIGFzeW5jSm9icyBpcyBmYWxzZSBhbmQgbG9nRGVzdGluYXRpb25TM0FjY2Vzc0xvZ3MgaXMgcHJvdmlkZWRcIiwgKCkgPT4ge1xuICBjb25zdCBwcm9wcyA9IHtcbiAgICBhc3luY0pvYnM6IGZhbHNlLFxuICAgIGxvZ0Rlc3RpbmF0aW9uUzNBY2Nlc3NMb2dzOiB0cnVlXG4gIH07XG5cbiAgZXhwZWN0KCgpID0+IHtcbiAgICBkZWZhdWx0cy5DaGVja1RyYW5zbGF0ZVByb3BzKHByb3BzKTtcbiAgfSkudG9UaHJvdygnUzMgYnVja2V0IHByb3BlcnRpZXMgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2hlbiBhc3luY0pvYnMgaXMgdHJ1ZScpO1xufSk7XG5cbnRlc3QoXCJDaGVja1RyYW5zbGF0ZVByb3BzIHRocm93cyBlcnJvciB3aGVuIGFzeW5jSm9icyBpcyBmYWxzZSBhbmQgc291cmNlQnVja2V0RW52aXJvbm1lbnRWYXJpYWJsZU5hbWUgaXMgcHJvdmlkZWRcIiwgKCkgPT4ge1xuICBjb25zdCBwcm9wcyA9IHtcbiAgICBhc3luY0pvYnM6IGZhbHNlLFxuICAgIHNvdXJjZUJ1Y2tldEVudmlyb25tZW50VmFyaWFibGVOYW1lOiAnTVlfU09VUkNFX0JVQ0tFVCdcbiAgfTtcblxuICBleHBlY3QoKCkgPT4ge1xuICAgIGRlZmF1bHRzLkNoZWNrVHJhbnNsYXRlUHJvcHMocHJvcHMpO1xuICB9KS50b1Rocm93KCdTMyBidWNrZXQgcHJvcGVydGllcyBjYW4gb25seSBiZSBwcm92aWRlZCB3aGVuIGFzeW5jSm9icyBpcyB0cnVlJyk7XG59KTtcblxudGVzdChcIkNoZWNrVHJhbnNsYXRlUHJvcHMgdGhyb3dzIGVycm9yIHdoZW4gYXN5bmNKb2JzIGlzIGZhbHNlIGFuZCBkZXN0aW5hdGlvbkJ1Y2tldEVudmlyb25tZW50VmFyaWFibGVOYW1lIGlzIHByb3ZpZGVkXCIsICgpID0+IHtcbiAgY29uc3QgcHJvcHMgPSB7XG4gICAgYXN5bmNKb2JzOiBmYWxzZSxcbiAgICBkZXN0aW5hdGlvbkJ1Y2tldEVudmlyb25tZW50VmFyaWFibGVOYW1lOiAnTVlfREVTVF9CVUNLRVQnXG4gIH07XG5cbiAgZXhwZWN0KCgpID0+IHtcbiAgICBkZWZhdWx0cy5DaGVja1RyYW5zbGF0ZVByb3BzKHByb3BzKTtcbiAgfSkudG9UaHJvdygnUzMgYnVja2V0IHByb3BlcnRpZXMgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2hlbiBhc3luY0pvYnMgaXMgdHJ1ZScpO1xufSk7XG5cbnRlc3QoXCJDaGVja1RyYW5zbGF0ZVByb3BzIHRocm93cyBlcnJvciB3aGVuIGFzeW5jSm9icyBpcyBmYWxzZSBhbmQgZGF0YUFjY2Vzc1JvbGVBcm5FbnZpcm9ubWVudFZhcmlhYmxlTmFtZSBpcyBwcm92aWRlZFwiLCAoKSA9PiB7XG4gIGNvbnN0IHByb3BzID0ge1xuICAgIGFzeW5jSm9iczogZmFsc2UsXG4gICAgZGF0YUFjY2Vzc1JvbGVBcm5FbnZpcm9ubWVudFZhcmlhYmxlTmFtZTogJ01ZX1JPTEVfTkFNRSdcbiAgfTtcblxuICBleHBlY3QoKCkgPT4ge1xuICAgIGRlZmF1bHRzLkNoZWNrVHJhbnNsYXRlUHJvcHMocHJvcHMpO1xuICB9KS50b1Rocm93KCdTMyBidWNrZXQgcHJvcGVydGllcyBjYW4gb25seSBiZSBwcm92aWRlZCB3aGVuIGFzeW5jSm9icyBpcyB0cnVlJyk7XG59KTtcblxudGVzdChcIkNoZWNrVHJhbnNsYXRlUHJvcHMgdGhyb3dzIGVycm9yIHdoZW4gYXN5bmNKb2JzIGlzIGZhbHNlIGFuZCB1c2VTYW1lQnVja2V0IGlzIHByb3ZpZGVkXCIsICgpID0+IHtcbiAgY29uc3QgcHJvcHMgPSB7XG4gICAgYXN5bmNKb2JzOiBmYWxzZSxcbiAgICB1c2VTYW1lQnVja2V0OiB0cnVlXG4gIH07XG5cbiAgZXhwZWN0KCgpID0+IHtcbiAgICBkZWZhdWx0cy5DaGVja1RyYW5zbGF0ZVByb3BzKHByb3BzKTtcbiAgfSkudG9UaHJvdygnUzMgYnVja2V0IHByb3BlcnRpZXMgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2hlbiBhc3luY0pvYnMgaXMgdHJ1ZScpO1xufSk7XG5cbnRlc3QoXCJDaGVja1RyYW5zbGF0ZVByb3BzIHRocm93cyBlcnJvciB3aGVuIHVzZVNhbWVCdWNrZXQgaXMgdHJ1ZSBhbmQgZXhpc3RpbmdEZXN0aW5hdGlvbkJ1Y2tldE9iaiBpcyBwcm92aWRlZFwiLCAoKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKCk7XG4gIGNvbnN0IHByb3BzID0ge1xuICAgIGFzeW5jSm9iczogdHJ1ZSxcbiAgICB1c2VTYW1lQnVja2V0OiB0cnVlLFxuICAgIGV4aXN0aW5nRGVzdGluYXRpb25CdWNrZXRPYmo6IENyZWF0ZVNjcmFwQnVja2V0KHN0YWNrLCBcInRlc3RidWNrZXRcIilcbiAgfTtcblxuICBleHBlY3QoKCkgPT4ge1xuICAgIGRlZmF1bHRzLkNoZWNrVHJhbnNsYXRlUHJvcHMocHJvcHMpO1xuICB9KS50b1Rocm93KCdEZXN0aW5hdGlvbiBidWNrZXQgcHJvcGVydGllcyBjYW5ub3QgYmUgcHJvdmlkZWQgd2hlbiB1c2VTYW1lQnVja2V0IGlzIHRydWUnKTtcbn0pO1xuXG50ZXN0KFwiQ2hlY2tUcmFuc2xhdGVQcm9wcyB0aHJvd3MgZXJyb3Igd2hlbiB1c2VTYW1lQnVja2V0IGlzIHRydWUgYW5kIGRlc3RpbmF0aW9uQnVja2V0UHJvcHMgaXMgcHJvdmlkZWRcIiwgKCkgPT4ge1xuICBjb25zdCBwcm9wcyA9IHtcbiAgICBhc3luY0pvYnM6IHRydWUsXG4gICAgdXNlU2FtZUJ1Y2tldDogdHJ1ZSxcbiAgICBkZXN0aW5hdGlvbkJ1Y2tldFByb3BzOiB7fVxuICB9O1xuXG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgZGVmYXVsdHMuQ2hlY2tUcmFuc2xhdGVQcm9wcyhwcm9wcyk7XG4gIH0pLnRvVGhyb3coJ0Rlc3RpbmF0aW9uIGJ1Y2tldCBwcm9wZXJ0aWVzIGNhbm5vdCBiZSBwcm92aWRlZCB3aGVuIHVzZVNhbWVCdWNrZXQgaXMgdHJ1ZScpO1xufSk7XG5cbnRlc3QoXCJDaGVja1RyYW5zbGF0ZVByb3BzIHRocm93cyBlcnJvciB3aGVuIHVzZVNhbWVCdWNrZXQgaXMgdHJ1ZSBhbmQgZGVzdGluYXRpb25Mb2dnaW5nQnVja2V0UHJvcHMgaXMgcHJvdmlkZWRcIiwgKCkgPT4ge1xuICBjb25zdCBwcm9wcyA9IHtcbiAgICBhc3luY0pvYnM6IHRydWUsXG4gICAgdXNlU2FtZUJ1Y2tldDogdHJ1ZSxcbiAgICBkZXN0aW5hdGlvbkxvZ2dpbmdCdWNrZXRQcm9wczoge31cbiAgfTtcblxuICBleHBlY3QoKCkgPT4ge1xuICAgIGRlZmF1bHRzLkNoZWNrVHJhbnNsYXRlUHJvcHMocHJvcHMpO1xuICB9KS50b1Rocm93KCdEZXN0aW5hdGlvbiBidWNrZXQgcHJvcGVydGllcyBjYW5ub3QgYmUgcHJvdmlkZWQgd2hlbiB1c2VTYW1lQnVja2V0IGlzIHRydWUnKTtcbn0pO1xuXG50ZXN0KFwiQ2hlY2tUcmFuc2xhdGVQcm9wcyB0aHJvd3MgZXJyb3Igd2hlbiB1c2VTYW1lQnVja2V0IGlzIHRydWUgYW5kIGxvZ0Rlc3RpbmF0aW9uUzNBY2Nlc3NMb2dzIGlzIHByb3ZpZGVkXCIsICgpID0+IHtcbiAgY29uc3QgcHJvcHMgPSB7XG4gICAgYXN5bmNKb2JzOiB0cnVlLFxuICAgIHVzZVNhbWVCdWNrZXQ6IHRydWUsXG4gICAgbG9nRGVzdGluYXRpb25TM0FjY2Vzc0xvZ3M6IHRydWVcbiAgfTtcblxuICBleHBlY3QoKCkgPT4ge1xuICAgIGRlZmF1bHRzLkNoZWNrVHJhbnNsYXRlUHJvcHMocHJvcHMpO1xuICB9KS50b1Rocm93KCdEZXN0aW5hdGlvbiBidWNrZXQgcHJvcGVydGllcyBjYW5ub3QgYmUgcHJvdmlkZWQgd2hlbiB1c2VTYW1lQnVja2V0IGlzIHRydWUnKTtcbn0pO1xuXG50ZXN0KFwiQ2hlY2tUcmFuc2xhdGVQcm9wcyB3aXRoIHZhbGlkIHVzZVNhbWVCdWNrZXQgdHJ1ZSBhbmQgc291cmNlIGJ1Y2tldCBwcm9wc1wiLCAoKSA9PiB7XG4gIGNvbnN0IHByb3BzID0ge1xuICAgIGFzeW5jSm9iczogdHJ1ZSxcbiAgICB1c2VTYW1lQnVja2V0OiB0cnVlLFxuICAgIHNvdXJjZUJ1Y2tldFByb3BzOiB7fVxuICB9O1xuXG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgZGVmYXVsdHMuQ2hlY2tUcmFuc2xhdGVQcm9wcyhwcm9wcyk7XG4gIH0pLm5vdC50b1Rocm93KCk7XG59KTtcblxudGVzdChcIkNoZWNrVHJhbnNsYXRlUHJvcHMgY2FsbHMgQ2hlY2tTM1Byb3BzKCkgZm9yIHNvdXJjZSBidWNrZXRcIiwgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgXCJ0ZXN0LXN0YWNrXCIpO1xuXG4gIGNvbnN0IHByb3BzID0ge1xuICAgIGFzeW5jSm9iczogdHJ1ZSxcbiAgICBzb3VyY2VCdWNrZXRQcm9wczoge30sXG4gICAgZXhpc3RpbmdTb3VyY2VCdWNrZXRPYmo6IENyZWF0ZVNjcmFwQnVja2V0KHN0YWNrLCAndGVzdCcpXG4gIH07XG5cbiAgZXhwZWN0KCgpID0+IHtcbiAgICBkZWZhdWx0cy5DaGVja1RyYW5zbGF0ZVByb3BzKHByb3BzKTtcbiAgfSkudG9UaHJvdygnRXJyb3IgLSBFaXRoZXIgcHJvdmlkZSBidWNrZXRQcm9wcyBvciBleGlzdGluZ0J1Y2tldE9iaiwgYnV0IG5vdCBib3RoLlxcbicpO1xufSk7XG5cbnRlc3QoXCJDaGVja1RyYW5zbGF0ZVByb3BzIGNhbGxzIENoZWNrUzNQcm9wcygpIGZvciBkZXN0aW5hdGlvbiBidWNrZXRcIiwgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgXCJ0ZXN0LXN0YWNrXCIpO1xuXG4gIGNvbnN0IHByb3BzID0ge1xuICAgIGFzeW5jSm9iczogdHJ1ZSxcbiAgICBkZXN0aW5hdGlvbkJ1Y2tldFByb3BzOiB7fSxcbiAgICBleGlzdGluZ0Rlc3RpbmF0aW9uQnVja2V0T2JqOiBDcmVhdGVTY3JhcEJ1Y2tldChzdGFjaywgJ3Rlc3QnKVxuICB9O1xuXG4gIGV4cGVjdCgoKSA9PiB7XG4gICAgZGVmYXVsdHMuQ2hlY2tUcmFuc2xhdGVQcm9wcyhwcm9wcyk7XG4gIH0pLnRvVGhyb3coJ0Vycm9yIC0gRWl0aGVyIHByb3ZpZGUgYnVja2V0UHJvcHMgb3IgZXhpc3RpbmdCdWNrZXRPYmosIGJ1dCBub3QgYm90aC5cXG4nKTtcbn0pO1xuIl19