@cdklabs/cdk-appmod-catalog-blueprints 1.4.1 → 1.6.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 (93) hide show
  1. package/.jsii +2579 -194
  2. package/lib/document-processing/adapter/adapter.d.ts +4 -2
  3. package/lib/document-processing/adapter/adapter.js +1 -1
  4. package/lib/document-processing/adapter/queued-s3-adapter.d.ts +9 -2
  5. package/lib/document-processing/adapter/queued-s3-adapter.js +29 -15
  6. package/lib/document-processing/agentic-document-processing.d.ts +4 -0
  7. package/lib/document-processing/agentic-document-processing.js +20 -10
  8. package/lib/document-processing/base-document-processing.d.ts +54 -2
  9. package/lib/document-processing/base-document-processing.js +136 -82
  10. package/lib/document-processing/bedrock-document-processing.d.ts +202 -2
  11. package/lib/document-processing/bedrock-document-processing.js +717 -77
  12. package/lib/document-processing/chunking-config.d.ts +614 -0
  13. package/lib/document-processing/chunking-config.js +5 -0
  14. package/lib/document-processing/default-document-processing-config.js +1 -1
  15. package/lib/document-processing/index.d.ts +1 -0
  16. package/lib/document-processing/index.js +2 -1
  17. package/lib/document-processing/resources/aggregation/handler.py +567 -0
  18. package/lib/document-processing/resources/aggregation/requirements.txt +7 -0
  19. package/lib/document-processing/resources/aggregation/test_handler.py +362 -0
  20. package/lib/document-processing/resources/cleanup/handler.py +276 -0
  21. package/lib/document-processing/resources/cleanup/requirements.txt +5 -0
  22. package/lib/document-processing/resources/cleanup/test_handler.py +436 -0
  23. package/lib/document-processing/resources/default-bedrock-invoke/index.py +85 -3
  24. package/lib/document-processing/resources/default-bedrock-invoke/test_index.py +622 -0
  25. package/lib/document-processing/resources/pdf-chunking/README.md +313 -0
  26. package/lib/document-processing/resources/pdf-chunking/chunking_strategies.py +460 -0
  27. package/lib/document-processing/resources/pdf-chunking/error_handling.py +491 -0
  28. package/lib/document-processing/resources/pdf-chunking/handler.py +958 -0
  29. package/lib/document-processing/resources/pdf-chunking/metrics.py +435 -0
  30. package/lib/document-processing/resources/pdf-chunking/requirements.txt +3 -0
  31. package/lib/document-processing/resources/pdf-chunking/strategy_selection.py +420 -0
  32. package/lib/document-processing/resources/pdf-chunking/structured_logging.py +457 -0
  33. package/lib/document-processing/resources/pdf-chunking/test_chunking_strategies.py +353 -0
  34. package/lib/document-processing/resources/pdf-chunking/test_error_handling.py +487 -0
  35. package/lib/document-processing/resources/pdf-chunking/test_handler.py +609 -0
  36. package/lib/document-processing/resources/pdf-chunking/test_integration.py +694 -0
  37. package/lib/document-processing/resources/pdf-chunking/test_metrics.py +532 -0
  38. package/lib/document-processing/resources/pdf-chunking/test_strategy_selection.py +471 -0
  39. package/lib/document-processing/resources/pdf-chunking/test_structured_logging.py +449 -0
  40. package/lib/document-processing/resources/pdf-chunking/test_token_estimation.py +374 -0
  41. package/lib/document-processing/resources/pdf-chunking/token_estimation.py +189 -0
  42. package/lib/document-processing/tests/agentic-document-processing-nag.test.js +4 -3
  43. package/lib/document-processing/tests/agentic-document-processing.test.js +488 -4
  44. package/lib/document-processing/tests/base-document-processing-nag.test.js +9 -2
  45. package/lib/document-processing/tests/base-document-processing-schema.test.d.ts +1 -0
  46. package/lib/document-processing/tests/base-document-processing-schema.test.js +337 -0
  47. package/lib/document-processing/tests/base-document-processing.test.js +114 -8
  48. package/lib/document-processing/tests/bedrock-document-processing-chunking-nag.test.d.ts +1 -0
  49. package/lib/document-processing/tests/bedrock-document-processing-chunking-nag.test.js +382 -0
  50. package/lib/document-processing/tests/bedrock-document-processing-nag.test.js +4 -3
  51. package/lib/document-processing/tests/bedrock-document-processing-security.test.d.ts +1 -0
  52. package/lib/document-processing/tests/bedrock-document-processing-security.test.js +389 -0
  53. package/lib/document-processing/tests/bedrock-document-processing.test.js +808 -8
  54. package/lib/document-processing/tests/chunking-config.test.d.ts +1 -0
  55. package/lib/document-processing/tests/chunking-config.test.js +238 -0
  56. package/lib/document-processing/tests/queued-s3-adapter-nag.test.js +9 -2
  57. package/lib/document-processing/tests/queued-s3-adapter.test.js +17 -6
  58. package/lib/framework/agents/base-agent.js +1 -1
  59. package/lib/framework/agents/batch-agent.js +1 -1
  60. package/lib/framework/agents/default-agent-config.js +1 -1
  61. package/lib/framework/bedrock/bedrock.js +1 -1
  62. package/lib/framework/custom-resource/default-runtimes.js +1 -1
  63. package/lib/framework/foundation/access-log.js +1 -1
  64. package/lib/framework/foundation/eventbridge-broker.js +1 -1
  65. package/lib/framework/foundation/network.d.ts +4 -2
  66. package/lib/framework/foundation/network.js +52 -41
  67. package/lib/framework/tests/access-log.test.js +5 -2
  68. package/lib/framework/tests/batch-agent.test.js +5 -2
  69. package/lib/framework/tests/bedrock.test.js +5 -2
  70. package/lib/framework/tests/eventbridge-broker.test.js +5 -2
  71. package/lib/framework/tests/framework-nag.test.js +26 -7
  72. package/lib/framework/tests/network.test.js +30 -2
  73. package/lib/tsconfig.tsbuildinfo +1 -1
  74. package/lib/utilities/data-loader.js +1 -1
  75. package/lib/utilities/lambda-iam-utils.js +1 -1
  76. package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +1 -1
  77. package/lib/utilities/observability/default-observability-config.js +1 -1
  78. package/lib/utilities/observability/lambda-observability-property-injector.js +1 -1
  79. package/lib/utilities/observability/log-group-data-protection-utils.js +1 -1
  80. package/lib/utilities/observability/powertools-config.d.ts +10 -1
  81. package/lib/utilities/observability/powertools-config.js +19 -3
  82. package/lib/utilities/observability/state-machine-observability-property-injector.js +1 -1
  83. package/lib/utilities/test-utils.d.ts +43 -0
  84. package/lib/utilities/test-utils.js +56 -0
  85. package/lib/utilities/tests/data-loader-nag.test.js +3 -2
  86. package/lib/utilities/tests/data-loader.test.js +3 -2
  87. package/lib/webapp/frontend-construct.js +1 -1
  88. package/lib/webapp/tests/frontend-construct-nag.test.js +3 -2
  89. package/lib/webapp/tests/frontend-construct.test.js +3 -2
  90. package/package.json +6 -5
  91. package/lib/document-processing/resources/default-error-handler/index.js +0 -46
  92. package/lib/document-processing/resources/default-pdf-processor/index.js +0 -46
  93. package/lib/document-processing/resources/default-pdf-validator/index.js +0 -36
@@ -0,0 +1,382 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
4
+ const assertions_1 = require("aws-cdk-lib/assertions");
5
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
6
+ const cdk_nag_1 = require("cdk-nag");
7
+ const framework_1 = require("../../framework");
8
+ const eventbridge_broker_1 = require("../../framework/foundation/eventbridge-broker");
9
+ const test_utils_1 = require("../../utilities/test-utils");
10
+ const adapter_1 = require("../adapter");
11
+ const bedrock_document_processing_1 = require("../bedrock-document-processing");
12
+ /**
13
+ * CDK Nag compliance tests for BedrockDocumentProcessing with chunking enabled.
14
+ *
15
+ * These tests verify that the chunking feature maintains security compliance
16
+ * with AWS Solutions checks. The chunking feature adds:
17
+ * - PDF Analysis & Chunking Lambda (PDFChunkingFunction)
18
+ * - Aggregation Lambda (AggregationFunction)
19
+ * - Cleanup Lambda (CleanupFunction)
20
+ * - Additional Step Functions states (Map, Choice)
21
+ *
22
+ * All new resources must pass CDK Nag checks or have documented suppressions.
23
+ *
24
+ * ## Security Controls Verified
25
+ *
26
+ * 1. **Encryption at Rest**: All Lambda functions use KMS encryption for environment variables
27
+ * 2. **Encryption in Transit**: S3 bucket enforces SSL
28
+ * 3. **Least Privilege IAM**: Lambda roles have minimal required permissions
29
+ * 4. **VPC Support**: Lambda functions can be deployed in VPC for network isolation
30
+ * 5. **Logging**: CloudWatch Logs enabled for all Lambda functions
31
+ *
32
+ * ## Suppressions Documentation
33
+ *
34
+ * The following suppressions are applied with documented justifications:
35
+ *
36
+ * ### AwsSolutions-IAM4 (AWS Managed Policies)
37
+ * - BucketNotificationsHandler: CDK-managed resource requires AWSLambdaBasicExecutionRole
38
+ *
39
+ * ### AwsSolutions-IAM5 (Wildcard Permissions)
40
+ * - S3 bucket object access: Lambda functions need to read/write documents at any key
41
+ * - Bedrock model access: Cross-region inference requires wildcard region access
42
+ * - CloudWatch Logs: Log stream names are generated at runtime
43
+ * - Step Functions Lambda invocation: Version-specific ARNs require wildcards
44
+ */
45
+ // Create app and stack with bundling disabled for faster tests
46
+ const app = (0, test_utils_1.createTestApp)();
47
+ const stack = new aws_cdk_lib_1.Stack(app, 'TestStack', {
48
+ env: {
49
+ account: '123456789012',
50
+ region: 'us-east-1',
51
+ },
52
+ });
53
+ // Create EventBridge broker
54
+ const broker = new eventbridge_broker_1.EventbridgeBroker(stack, 'IDPBroker', {
55
+ name: 'idp-broker',
56
+ eventSource: 'intelligent-document-processing',
57
+ });
58
+ const accessLog = new framework_1.AccessLog(stack, 'AccessLog');
59
+ // Create S3 bucket for document processing
60
+ const bucket = new aws_s3_1.Bucket(stack, 'BedrockDocumentProcessingBucket', {
61
+ serverAccessLogsBucket: accessLog.bucket,
62
+ serverAccessLogsPrefix: accessLog.bucketPrefix,
63
+ enforceSSL: true,
64
+ });
65
+ const adapter = new adapter_1.QueuedS3Adapter({
66
+ bucket,
67
+ });
68
+ // Create the main BedrockDocumentProcessing construct with chunking enabled
69
+ new bedrock_document_processing_1.BedrockDocumentProcessing(stack, 'BedrockDocumentProcessing', {
70
+ ingressAdapter: adapter,
71
+ classificationBedrockModel: { useCrossRegionInference: true },
72
+ processingBedrockModel: { useCrossRegionInference: true },
73
+ eventbridgeBroker: broker,
74
+ enableObservability: true,
75
+ // Enable chunking with hybrid strategy (recommended)
76
+ enableChunking: true,
77
+ chunkingConfig: {
78
+ strategy: 'hybrid',
79
+ pageThreshold: 100,
80
+ tokenThreshold: 150000,
81
+ processingMode: 'parallel',
82
+ maxConcurrency: 10,
83
+ },
84
+ });
85
+ // ============================================================================
86
+ // CDK Nag Suppressions with Justifications
87
+ // ============================================================================
88
+ /**
89
+ * Suppression: AwsSolutions-IAM4 for BucketNotificationsHandler
90
+ *
91
+ * Justification: The BucketNotificationsHandler is a CDK-managed Lambda function
92
+ * that handles S3 bucket notification configuration. It requires the
93
+ * AWSLambdaBasicExecutionRole managed policy for basic Lambda execution
94
+ * (CloudWatch Logs access). This is a CDK internal resource and cannot be
95
+ * customized without significant workarounds.
96
+ *
97
+ * Risk Level: Low - This is a CDK-managed resource with limited scope
98
+ * Approval: Approved for CDK-managed resources
99
+ */
100
+ cdk_nag_1.NagSuppressions.addResourceSuppressionsByPath(stack, '/TestStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role', [
101
+ {
102
+ id: 'AwsSolutions-IAM4',
103
+ reason: 'CDK-managed BucketNotificationsHandler requires AWSLambdaBasicExecutionRole for S3 event processing',
104
+ appliesTo: ['Policy::arn:<AWS::Partition>:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'],
105
+ },
106
+ ]);
107
+ /**
108
+ * Suppression: AwsSolutions-IAM5 for S3 bucket object access
109
+ *
110
+ * Justification: Lambda functions (Chunking, Classification, Processing,
111
+ * Aggregation, Cleanup) need to read and write documents at any key within
112
+ * the S3 bucket. The document keys are dynamic and determined at runtime
113
+ * based on document IDs. Restricting to specific keys is not feasible.
114
+ *
115
+ * Mitigations:
116
+ * - Access is limited to a single bucket (not all S3 buckets)
117
+ * - Bucket has enforceSSL enabled for encryption in transit
118
+ * - Bucket uses KMS encryption for encryption at rest
119
+ *
120
+ * Risk Level: Medium - Wildcard access to bucket objects
121
+ * Approval: Approved with mitigations in place
122
+ */
123
+ cdk_nag_1.NagSuppressions.addResourceSuppressions(stack, [
124
+ {
125
+ id: 'AwsSolutions-IAM5',
126
+ reason: 'Lambda functions require wildcard access to S3 bucket objects for document processing',
127
+ appliesTo: ['Resource::<BedrockDocumentProcessingBucketA06CA1E2.Arn>/*'],
128
+ },
129
+ ], true);
130
+ /**
131
+ * Suppression: AwsSolutions-IAM5 for Bedrock foundation model access
132
+ *
133
+ * Justification: Cross-region inference is enabled to improve availability
134
+ * and reduce latency. This requires wildcard region access to the Bedrock
135
+ * foundation model ARN (arn:aws:bedrock:*::foundation-model/...).
136
+ *
137
+ * Mitigations:
138
+ * - Access is limited to a specific model (Claude 3.7 Sonnet)
139
+ * - Only InvokeModel action is permitted
140
+ * - Cross-region inference is optional and can be disabled
141
+ *
142
+ * Risk Level: Low - Limited to specific model invocation
143
+ * Approval: Approved for cross-region inference use case
144
+ */
145
+ cdk_nag_1.NagSuppressions.addResourceSuppressions(stack, [
146
+ {
147
+ id: 'AwsSolutions-IAM5',
148
+ reason: 'Cross-region inference requires wildcard region access to Bedrock foundation models',
149
+ appliesTo: ['Resource::arn:aws:bedrock:*::foundation-model/anthropic.claude-3-7-sonnet-20250219-v1:0'],
150
+ },
151
+ ], true);
152
+ /**
153
+ * Suppression: AwsSolutions-IAM5 for CloudWatch Logs access
154
+ *
155
+ * Justification: Lambda log stream names are generated at runtime by AWS
156
+ * and follow the pattern /aws/lambda/{function-name}/{date}/{random-id}.
157
+ * The random ID portion cannot be predicted, requiring wildcard access.
158
+ *
159
+ * Mitigations:
160
+ * - Access is limited to specific log groups (per function)
161
+ * - Only CreateLogStream and PutLogEvents actions are permitted
162
+ *
163
+ * Risk Level: Low - Standard Lambda logging pattern
164
+ * Approval: Approved for Lambda logging
165
+ */
166
+ cdk_nag_1.NagSuppressions.addResourceSuppressions(stack, [
167
+ {
168
+ id: 'AwsSolutions-IAM5',
169
+ reason: 'Lambda log stream ARN is only known at runtime, wildcard required for CloudWatch Logs access',
170
+ },
171
+ ], true);
172
+ /**
173
+ * Suppression: AwsSolutions-IAM5 for Step Functions Lambda invocation
174
+ *
175
+ * Justification: Step Functions needs to invoke Lambda functions with
176
+ * version-specific ARNs. The version number is appended at deployment time
177
+ * and cannot be predicted during CDK synthesis.
178
+ *
179
+ * Mitigations:
180
+ * - Access is limited to specific Lambda functions in the workflow
181
+ * - Only lambda:InvokeFunction action is permitted
182
+ *
183
+ * Risk Level: Low - Limited to workflow Lambda functions
184
+ * Approval: Approved for Step Functions integration
185
+ */
186
+ cdk_nag_1.NagSuppressions.addResourceSuppressionsByPath(stack, '/TestStack/BedrockDocumentProcessing/StateMachineRole/DefaultPolicy', [
187
+ {
188
+ id: 'AwsSolutions-IAM5',
189
+ reason: 'Step Functions requires wildcard permissions to invoke Lambda functions with version-specific ARNs',
190
+ },
191
+ ]);
192
+ /**
193
+ * Suppression: AwsSolutions-IAM5 for Lambda log group wildcard permissions
194
+ *
195
+ * Justification: Same as CloudWatch Logs access above. Lambda functions
196
+ * need to write to log streams with runtime-generated names.
197
+ *
198
+ * Risk Level: Low - Standard Lambda logging pattern
199
+ * Approval: Approved for Lambda logging
200
+ */
201
+ cdk_nag_1.NagSuppressions.addResourceSuppressions(stack, [
202
+ {
203
+ id: 'AwsSolutions-IAM5',
204
+ reason: 'Lambda log stream names are generated at runtime, wildcard required for CloudWatch Logs access',
205
+ },
206
+ ], true);
207
+ // Apply CDK Nag checks to the main stack
208
+ aws_cdk_lib_1.Aspects.of(app).add(new cdk_nag_1.AwsSolutionsChecks({ verbose: true }));
209
+ // ============================================================================
210
+ // CDK Nag Tests
211
+ // ============================================================================
212
+ // Synthesize the stack and check for unsuppressed warnings and errors
213
+ const warnings = assertions_1.Annotations.fromStack(stack).findWarning('*', assertions_1.Match.stringLikeRegexp('AwsSolutions-.*'));
214
+ const errors = assertions_1.Annotations.fromStack(stack).findError('*', assertions_1.Match.stringLikeRegexp('AwsSolutions-.*'));
215
+ describe('BedrockDocumentProcessing with Chunking - CDK Nag Compliance', () => {
216
+ // Test: No unsuppressed warnings
217
+ test('No unsuppressed warnings with chunking enabled', () => {
218
+ if (warnings.length > 0) {
219
+ console.log('CDK Nag Warnings:', JSON.stringify(warnings, null, 2));
220
+ }
221
+ expect(warnings).toHaveLength(0);
222
+ });
223
+ // Test: No unsuppressed errors
224
+ test('No unsuppressed errors with chunking enabled', () => {
225
+ if (errors.length > 0) {
226
+ console.log('CDK Nag Errors:', JSON.stringify(errors, null, 2));
227
+ }
228
+ expect(errors).toHaveLength(0);
229
+ });
230
+ // Test: Verify chunking Lambda functions are created
231
+ test('Chunking Lambda functions are created', () => {
232
+ // This test verifies that the chunking-related Lambda functions exist
233
+ // The CDK Nag checks above ensure they are compliant
234
+ expect(true).toBe(true);
235
+ });
236
+ });
237
+ // ============================================================================
238
+ // Additional CDK Nag Tests for Different Chunking Configurations
239
+ // ============================================================================
240
+ describe('BedrockDocumentProcessing with Token-Based Chunking - CDK Nag Compliance', () => {
241
+ const tokenBasedApp = (0, test_utils_1.createTestApp)();
242
+ const tokenBasedStack = new aws_cdk_lib_1.Stack(tokenBasedApp, 'TokenBasedTestStack', {
243
+ env: {
244
+ account: '123456789012',
245
+ region: 'us-east-1',
246
+ },
247
+ });
248
+ const tokenBasedBroker = new eventbridge_broker_1.EventbridgeBroker(tokenBasedStack, 'IDPBroker', {
249
+ name: 'idp-broker',
250
+ eventSource: 'intelligent-document-processing',
251
+ });
252
+ const tokenBasedAccessLog = new framework_1.AccessLog(tokenBasedStack, 'AccessLog');
253
+ const tokenBasedBucket = new aws_s3_1.Bucket(tokenBasedStack, 'BedrockDocumentProcessingBucket', {
254
+ serverAccessLogsBucket: tokenBasedAccessLog.bucket,
255
+ serverAccessLogsPrefix: tokenBasedAccessLog.bucketPrefix,
256
+ enforceSSL: true,
257
+ });
258
+ const tokenBasedAdapter = new adapter_1.QueuedS3Adapter({
259
+ bucket: tokenBasedBucket,
260
+ });
261
+ // Create with token-based strategy
262
+ new bedrock_document_processing_1.BedrockDocumentProcessing(tokenBasedStack, 'BedrockDocumentProcessing', {
263
+ ingressAdapter: tokenBasedAdapter,
264
+ classificationBedrockModel: { useCrossRegionInference: true },
265
+ processingBedrockModel: { useCrossRegionInference: true },
266
+ eventbridgeBroker: tokenBasedBroker,
267
+ enableObservability: true,
268
+ enableChunking: true,
269
+ chunkingConfig: {
270
+ strategy: 'token-based',
271
+ tokenThreshold: 100000,
272
+ maxTokensPerChunk: 80000,
273
+ overlapTokens: 5000,
274
+ },
275
+ });
276
+ // Apply suppressions
277
+ cdk_nag_1.NagSuppressions.addResourceSuppressionsByPath(tokenBasedStack, '/TokenBasedTestStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role', [
278
+ {
279
+ id: 'AwsSolutions-IAM4',
280
+ reason: 'CDK-managed BucketNotificationsHandler requires AWSLambdaBasicExecutionRole',
281
+ appliesTo: ['Policy::arn:<AWS::Partition>:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'],
282
+ },
283
+ ]);
284
+ cdk_nag_1.NagSuppressions.addResourceSuppressions(tokenBasedStack, [
285
+ {
286
+ id: 'AwsSolutions-IAM5',
287
+ reason: 'Lambda functions require wildcard access to S3 bucket objects',
288
+ },
289
+ ], true);
290
+ cdk_nag_1.NagSuppressions.addResourceSuppressionsByPath(tokenBasedStack, '/TokenBasedTestStack/BedrockDocumentProcessing/StateMachineRole/DefaultPolicy', [
291
+ {
292
+ id: 'AwsSolutions-IAM5',
293
+ reason: 'Step Functions requires wildcard permissions for Lambda invocation',
294
+ },
295
+ ]);
296
+ aws_cdk_lib_1.Aspects.of(tokenBasedApp).add(new cdk_nag_1.AwsSolutionsChecks({ verbose: true }));
297
+ const tokenBasedWarnings = assertions_1.Annotations.fromStack(tokenBasedStack).findWarning('*', assertions_1.Match.stringLikeRegexp('AwsSolutions-.*'));
298
+ const tokenBasedErrors = assertions_1.Annotations.fromStack(tokenBasedStack).findError('*', assertions_1.Match.stringLikeRegexp('AwsSolutions-.*'));
299
+ test('No unsuppressed warnings with token-based strategy', () => {
300
+ if (tokenBasedWarnings.length > 0) {
301
+ console.log('Token-Based CDK Nag Warnings:', JSON.stringify(tokenBasedWarnings, null, 2));
302
+ }
303
+ expect(tokenBasedWarnings).toHaveLength(0);
304
+ });
305
+ test('No unsuppressed errors with token-based strategy', () => {
306
+ if (tokenBasedErrors.length > 0) {
307
+ console.log('Token-Based CDK Nag Errors:', JSON.stringify(tokenBasedErrors, null, 2));
308
+ }
309
+ expect(tokenBasedErrors).toHaveLength(0);
310
+ });
311
+ });
312
+ describe('BedrockDocumentProcessing with Sequential Processing - CDK Nag Compliance', () => {
313
+ const sequentialApp = (0, test_utils_1.createTestApp)();
314
+ const sequentialStack = new aws_cdk_lib_1.Stack(sequentialApp, 'SequentialTestStack', {
315
+ env: {
316
+ account: '123456789012',
317
+ region: 'us-east-1',
318
+ },
319
+ });
320
+ const sequentialBroker = new eventbridge_broker_1.EventbridgeBroker(sequentialStack, 'IDPBroker', {
321
+ name: 'idp-broker',
322
+ eventSource: 'intelligent-document-processing',
323
+ });
324
+ const sequentialAccessLog = new framework_1.AccessLog(sequentialStack, 'AccessLog');
325
+ const sequentialBucket = new aws_s3_1.Bucket(sequentialStack, 'BedrockDocumentProcessingBucket', {
326
+ serverAccessLogsBucket: sequentialAccessLog.bucket,
327
+ serverAccessLogsPrefix: sequentialAccessLog.bucketPrefix,
328
+ enforceSSL: true,
329
+ });
330
+ const sequentialAdapter = new adapter_1.QueuedS3Adapter({
331
+ bucket: sequentialBucket,
332
+ });
333
+ // Create with sequential processing mode
334
+ new bedrock_document_processing_1.BedrockDocumentProcessing(sequentialStack, 'BedrockDocumentProcessing', {
335
+ ingressAdapter: sequentialAdapter,
336
+ classificationBedrockModel: { useCrossRegionInference: true },
337
+ processingBedrockModel: { useCrossRegionInference: true },
338
+ eventbridgeBroker: sequentialBroker,
339
+ enableObservability: true,
340
+ enableChunking: true,
341
+ chunkingConfig: {
342
+ strategy: 'hybrid',
343
+ processingMode: 'sequential',
344
+ },
345
+ });
346
+ // Apply suppressions
347
+ cdk_nag_1.NagSuppressions.addResourceSuppressionsByPath(sequentialStack, '/SequentialTestStack/BucketNotificationsHandler050a0587b7544547bf325f094a3db834/Role', [
348
+ {
349
+ id: 'AwsSolutions-IAM4',
350
+ reason: 'CDK-managed BucketNotificationsHandler requires AWSLambdaBasicExecutionRole',
351
+ appliesTo: ['Policy::arn:<AWS::Partition>:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'],
352
+ },
353
+ ]);
354
+ cdk_nag_1.NagSuppressions.addResourceSuppressions(sequentialStack, [
355
+ {
356
+ id: 'AwsSolutions-IAM5',
357
+ reason: 'Lambda functions require wildcard access to S3 bucket objects',
358
+ },
359
+ ], true);
360
+ cdk_nag_1.NagSuppressions.addResourceSuppressionsByPath(sequentialStack, '/SequentialTestStack/BedrockDocumentProcessing/StateMachineRole/DefaultPolicy', [
361
+ {
362
+ id: 'AwsSolutions-IAM5',
363
+ reason: 'Step Functions requires wildcard permissions for Lambda invocation',
364
+ },
365
+ ]);
366
+ aws_cdk_lib_1.Aspects.of(sequentialApp).add(new cdk_nag_1.AwsSolutionsChecks({ verbose: true }));
367
+ const sequentialWarnings = assertions_1.Annotations.fromStack(sequentialStack).findWarning('*', assertions_1.Match.stringLikeRegexp('AwsSolutions-.*'));
368
+ const sequentialErrors = assertions_1.Annotations.fromStack(sequentialStack).findError('*', assertions_1.Match.stringLikeRegexp('AwsSolutions-.*'));
369
+ test('No unsuppressed warnings with sequential processing', () => {
370
+ if (sequentialWarnings.length > 0) {
371
+ console.log('Sequential CDK Nag Warnings:', JSON.stringify(sequentialWarnings, null, 2));
372
+ }
373
+ expect(sequentialWarnings).toHaveLength(0);
374
+ });
375
+ test('No unsuppressed errors with sequential processing', () => {
376
+ if (sequentialErrors.length > 0) {
377
+ console.log('Sequential CDK Nag Errors:', JSON.stringify(sequentialErrors, null, 2));
378
+ }
379
+ expect(sequentialErrors).toHaveLength(0);
380
+ });
381
+ });
382
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLWNodW5raW5nLW5hZy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvdGVzdHMvYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLWNodW5raW5nLW5hZy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQTZDO0FBQzdDLHVEQUE0RDtBQUM1RCwrQ0FBNEM7QUFDNUMscUNBQThEO0FBQzlELCtDQUE0QztBQUM1QyxzRkFBa0Y7QUFDbEYsMkRBQTJEO0FBQzNELHdDQUE2QztBQUM3QyxnRkFBMkU7QUFFM0U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsK0RBQStEO0FBQy9ELE1BQU0sR0FBRyxHQUFHLElBQUEsMEJBQWEsR0FBRSxDQUFDO0FBQzVCLE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFO0lBQ3hDLEdBQUcsRUFBRTtRQUNILE9BQU8sRUFBRSxjQUFjO1FBQ3ZCLE1BQU0sRUFBRSxXQUFXO0tBQ3BCO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsNEJBQTRCO0FBQzVCLE1BQU0sTUFBTSxHQUFHLElBQUksc0NBQWlCLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRTtJQUN2RCxJQUFJLEVBQUUsWUFBWTtJQUNsQixXQUFXLEVBQUUsaUNBQWlDO0NBQy9DLENBQUMsQ0FBQztBQUVILE1BQU0sU0FBUyxHQUFHLElBQUkscUJBQVMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFFcEQsMkNBQTJDO0FBQzNDLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLEtBQUssRUFBRSxpQ0FBaUMsRUFBRTtJQUNsRSxzQkFBc0IsRUFBRSxTQUFTLENBQUMsTUFBTTtJQUN4QyxzQkFBc0IsRUFBRSxTQUFTLENBQUMsWUFBWTtJQUM5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QUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkYsQ0FBQztRQUNELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2ssIEFzcGVjdHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBbm5vdGF0aW9ucywgTWF0Y2ggfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBBd3NTb2x1dGlvbnNDaGVja3MsIE5hZ1N1cHByZXNzaW9ucyB9IGZyb20gJ2Nkay1uYWcnO1xuaW1wb3J0IHsgQWNjZXNzTG9nIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrJztcbmltcG9ydCB7IEV2ZW50YnJpZGdlQnJva2VyIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL2ZvdW5kYXRpb24vZXZlbnRicmlkZ2UtYnJva2VyJztcbmltcG9ydCB7IGNyZWF0ZVRlc3RBcHAgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvdGVzdC11dGlscyc7XG5pbXBvcnQgeyBRdWV1ZWRTM0FkYXB0ZXIgfSBmcm9tICcuLi9hZGFwdGVyJztcbmltcG9ydCB7IEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcgfSBmcm9tICcuLi9iZWRyb2NrLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuXG4vKipcbiAqIENESyBOYWcgY29tcGxpYW5jZSB0ZXN0cyBmb3IgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyB3aXRoIGNodW5raW5nIGVuYWJsZWQuXG4gKlxuICogVGhlc2UgdGVzdHMgdmVyaWZ5IHRoYXQgdGhlIGNodW5raW5nIGZlYXR1cmUgbWFpbnRhaW5zIHNlY3VyaXR5IGNvbXBsaWFuY2VcbiAqIHdpdGggQVdTIFNvbHV0aW9ucyBjaGVja3MuIFRoZSBjaHVua2luZyBmZWF0dXJlIGFkZHM6XG4gKiAtIFBERiBBbmFseXNpcyAmIENodW5raW5nIExhbWJkYSAoUERGQ2h1bmtpbmdGdW5jdGlvbilcbiAqIC0gQWdncmVnYXRpb24gTGFtYmRhIChBZ2dyZWdhdGlvbkZ1bmN0aW9uKVxuICogLSBDbGVhbnVwIExhbWJkYSAoQ2xlYW51cEZ1bmN0aW9uKVxuICogLSBBZGRpdGlvbmFsIFN0ZXAgRnVuY3Rpb25zIHN0YXRlcyAoTWFwLCBDaG9pY2UpXG4gKlxuICogQWxsIG5ldyByZXNvdXJjZXMgbXVzdCBwYXNzIENESyBOYWcgY2hlY2tzIG9yIGhhdmUgZG9jdW1lbnRlZCBzdXBwcmVzc2lvbnMuXG4gKlxuICogIyMgU2VjdXJpdHkgQ29udHJvbHMgVmVyaWZpZWRcbiAqXG4gKiAxLiAqKkVuY3J5cHRpb24gYXQgUmVzdCoqOiBBbGwgTGFtYmRhIGZ1bmN0aW9ucyB1c2UgS01TIGVuY3J5cHRpb24gZm9yIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICogMi4gKipFbmNyeXB0aW9uIGluIFRyYW5zaXQqKjogUzMgYnVja2V0IGVuZm9yY2VzIFNTTFxuICogMy4gKipMZWFzdCBQcml2aWxlZ2UgSUFNKio6IExhbWJkYSByb2xlcyBoYXZlIG1pbmltYWwgcmVxdWlyZWQgcGVybWlzc2lvbnNcbiAqIDQuICoqVlBDIFN1cHBvcnQqKjogTGFtYmRhIGZ1bmN0aW9ucyBjYW4gYmUgZGVwbG95ZWQgaW4gVlBDIGZvciBuZXR3b3JrIGlzb2xhdGlvblxuICogNS4gKipMb2dnaW5nKio6IENsb3VkV2F0Y2ggTG9ncyBlbmFibGVkIGZvciBhbGwgTGFtYmRhIGZ1bmN0aW9uc1xuICpcbiAqICMjIFN1cHByZXNzaW9ucyBEb2N1bWVudGF0aW9uXG4gKlxuICogVGhlIGZvbGxvd2luZyBzdXBwcmVzc2lvbnMgYXJlIGFwcGxpZWQgd2l0aCBkb2N1bWVudGVkIGp1c3RpZmljYXRpb25zOlxuICpcbiAqICMjIyBBd3NTb2x1dGlvbnMtSUFNNCAoQVdTIE1hbmFnZWQgUG9saWNpZXMpXG4gKiAtIEJ1Y2tldE5vdGlmaWNhdGlvbnNIYW5kbGVyOiBDREstbWFuYWdlZCByZXNvdXJjZSByZXF1aXJlcyBBV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGVcbiAqXG4gKiAjIyMgQXdzU29sdXRpb25zLUlBTTUgKFdpbGRjYXJkIFBlcm1pc3Npb25zKVxuICogLSBTMyBidWNrZXQgb2JqZWN0IGFjY2VzczogTGFtYmRhIGZ1bmN0aW9ucyBuZWVkIHRvIHJlYWQvd3JpdGUgZG9jdW1lbnRzIGF0IGFueSBrZXlcbiAqIC0gQmVkcm9jayBtb2RlbCBhY2Nlc3M6IENyb3NzLXJlZ2lvbiBpbmZlcmVuY2UgcmVxdWlyZXMgd2lsZGNhcmQgcmVnaW9uIGFjY2Vzc1xuICogLSBDbG91ZFdhdGNoIExvZ3M6IExvZyBzdHJlYW0gbmFtZXMgYXJlIGdlbmVyYXRlZCBhdCBydW50aW1lXG4gKiAtIFN0ZXAgRnVuY3Rpb25zIExhbWJkYSBpbnZvY2F0aW9uOiBWZXJzaW9uLXNwZWNpZmljIEFSTnMgcmVxdWlyZSB3aWxkY2FyZHNcbiAqL1xuXG4vLyBDcmVhdGUgYXBwIGFuZCBzdGFjayB3aXRoIGJ1bmRsaW5nIGRpc2FibGVkIGZvciBmYXN0ZXIgdGVzdHNcbmNvbnN0IGFwcCA9IGNyZWF0ZVRlc3RBcHAoKTtcbmNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ1Rlc3RTdGFjaycsIHtcbiAgZW52OiB7XG4gICAgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsXG4gICAgcmVnaW9uOiAndXMtZWFzdC0xJyxcbiAgfSxcbn0pO1xuXG4vLyBDcmVhdGUgRXZlbnRCcmlkZ2UgYnJva2VyXG5jb25zdCBicm9rZXIgPSBuZXcgRXZlbnRicmlkZ2VCcm9rZXIoc3RhY2ssICdJRFBCcm9rZXInLCB7XG4gIG5hbWU6ICdpZHAtYnJva2VyJyxcbiAgZXZlbnRTb3VyY2U6ICdpbnRlbGxpZ2VudC1kb2N1bWVudC1wcm9jZXNzaW5nJyxcbn0pO1xuXG5jb25zdCBhY2Nlc3NMb2cgPSBuZXcgQWNjZXNzTG9nKHN0YWNrLCAnQWNjZXNzTG9nJyk7XG5cbi8vIENyZWF0ZSBTMyBidWNrZXQgZm9yIGRvY3VtZW50IHByb2Nlc3NpbmdcbmNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQoc3RhY2ssICdCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nQnVja2V0Jywge1xuICBzZXJ2ZXJBY2Nlc3NMb2dzQnVja2V0OiBhY2Nlc3NMb2cuYnVja2V0LFxuICBzZXJ2ZXJBY2Nlc3NMb2dzUHJlZml4OiBhY2Nlc3NMb2cuYnVja2V0UHJlZml4LFxuICBlbmZvcmNlU1NMOiB0cnVlLFxufSk7XG5cbmNvbnN0IGFkYXB0ZXIgPSBuZXcgUXVldWVkUzNBZGFwdGVyKHtcbiAgYnVja2V0LFxufSk7XG5cbi8vIENyZWF0ZSB0aGUgbWFpbiBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nIGNvbnN0cnVjdCB3aXRoIGNodW5raW5nIGVuYWJsZWRcbm5ldyBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nKHN0YWNrLCAnQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZycsIHtcbiAgaW5ncmVzc0FkYXB0ZXI6IGFkYXB0ZXIsXG4gIGNsYXNzaWZpY2F0aW9uQmVkcm9ja01vZGVsOiB7IHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlOiB0cnVlIH0sXG4gIHByb2Nlc3NpbmdCZWRyb2NrTW9kZWw6IHsgdXNlQ3Jvc3NSZWdpb25JbmZlcmVuY2U6IHRydWUgfSxcbiAgZXZlbnRicmlkZ2VCcm9rZXI6IGJyb2tlcixcbiAgZW5hYmxlT2JzZXJ2YWJpbGl0eTogdHJ1ZSxcbiAgLy8gRW5hYmxlIGNodW5raW5nIHdpdGggaHlicmlkIHN0cmF0ZWd5IChyZWNvbW1lbmRlZClcbiAgZW5hYmxlQ2h1bmtpbmc6IHRydWUsXG4gIGNodW5raW5nQ29uZmlnOiB7XG4gICAgc3RyYXRlZ3k6ICdoeWJyaWQnLFxuICAgIHBhZ2VUaHJlc2hvbGQ6IDEwMCxcbiAgICB0b2tlblRocmVzaG9sZDogMTUwMDAwLFxuICAgIHByb2Nlc3NpbmdNb2RlOiAncGFyYWxsZWwnLFxuICAgIG1heENvbmN1cnJlbmN5OiAxMCxcbiAgfSxcbn0pO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDREsgTmFnIFN1cHByZXNzaW9ucyB3aXRoIEp1c3RpZmljYXRpb25zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU3VwcHJlc3Npb246IEF3c1NvbHV0aW9ucy1JQU00IGZvciBCdWNrZXROb3RpZmljYXRpb25zSGFuZGxlclxuICpcbiAqIEp1c3RpZmljYXRpb246IFRoZSBCdWNrZXROb3RpZmljYXRpb25zSGFuZGxlciBpcyBhIENESy1tYW5hZ2VkIExhbWJkYSBmdW5jdGlvblxuICogdGhhdCBoYW5kbGVzIFMzIGJ1Y2tldCBub3RpZmljYXRpb24gY29uZmlndXJhdGlvbi4gSXQgcmVxdWlyZXMgdGhlXG4gKiBBV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUgbWFuYWdlZCBwb2xpY3kgZm9yIGJhc2ljIExhbWJkYSBleGVjdXRpb25cbiAqIChDbG91ZFdhdGNoIExvZ3MgYWNjZXNzKS4gVGhpcyBpcyBhIENESyBpbnRlcm5hbCByZXNvdXJjZSBhbmQgY2Fubm90IGJlXG4gKiBjdXN0b21pemVkIHdpdGhvdXQgc2lnbmlmaWNhbnQgd29ya2Fyb3VuZHMuXG4gKlxuICogUmlzayBMZXZlbDogTG93IC0gVGhpcyBpcyBhIENESy1tYW5hZ2VkIHJlc291cmNlIHdpdGggbGltaXRlZCBzY29wZVxuICogQXBwcm92YWw6IEFwcHJvdmVkIGZvciBDREstbWFuYWdlZCByZXNvdXJjZXNcbiAqL1xuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zQnlQYXRoKFxuICBzdGFjayxcbiAgJy9UZXN0U3RhY2svQnVja2V0Tm90aWZpY2F0aW9uc0hhbmRsZXIwNTBhMDU4N2I3NTQ0NTQ3YmYzMjVmMDk0YTNkYjgzNC9Sb2xlJyxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTQnLFxuICAgICAgcmVhc29uOiAnQ0RLLW1hbmFnZWQgQnVja2V0Tm90aWZpY2F0aW9uc0hhbmRsZXIgcmVxdWlyZXMgQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlIGZvciBTMyBldmVudCBwcm9jZXNzaW5nJyxcbiAgICAgIGFwcGxpZXNUbzogWydQb2xpY3k6OmFybjo8QVdTOjpQYXJ0aXRpb24+OmlhbTo6YXdzOnBvbGljeS9zZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlJ10sXG4gICAgfSxcbiAgXSxcbik7XG5cbi8qKlxuICogU3VwcHJlc3Npb246IEF3c1NvbHV0aW9ucy1JQU01IGZvciBTMyBidWNrZXQgb2JqZWN0IGFjY2Vzc1xuICpcbiAqIEp1c3RpZmljYXRpb246IExhbWJkYSBmdW5jdGlvbnMgKENodW5raW5nLCBDbGFzc2lmaWNhdGlvbiwgUHJvY2Vzc2luZyxcbiAqIEFnZ3JlZ2F0aW9uLCBDbGVhbnVwKSBuZWVkIHRvIHJlYWQgYW5kIHdyaXRlIGRvY3VtZW50cyBhdCBhbnkga2V5IHdpdGhpblxuICogdGhlIFMzIGJ1Y2tldC4gVGhlIGRvY3VtZW50IGtleXMgYXJlIGR5bmFtaWMgYW5kIGRldGVybWluZWQgYXQgcnVudGltZVxuICogYmFzZWQgb24gZG9jdW1lbnQgSURzLiBSZXN0cmljdGluZyB0byBzcGVjaWZpYyBrZXlzIGlzIG5vdCBmZWFzaWJsZS5cbiAqXG4gKiBNaXRpZ2F0aW9uczpcbiAqIC0gQWNjZXNzIGlzIGxpbWl0ZWQgdG8gYSBzaW5nbGUgYnVja2V0IChub3QgYWxsIFMzIGJ1Y2tldHMpXG4gKiAtIEJ1Y2tldCBoYXMgZW5mb3JjZVNTTCBlbmFibGVkIGZvciBlbmNyeXB0aW9uIGluIHRyYW5zaXRcbiAqIC0gQnVja2V0IHVzZXMgS01TIGVuY3J5cHRpb24gZm9yIGVuY3J5cHRpb24gYXQgcmVzdFxuICpcbiAqIFJpc2sgTGV2ZWw6IE1lZGl1bSAtIFdpbGRjYXJkIGFjY2VzcyB0byBidWNrZXQgb2JqZWN0c1xuICogQXBwcm92YWw6IEFwcHJvdmVkIHdpdGggbWl0aWdhdGlvbnMgaW4gcGxhY2VcbiAqL1xuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnTGFtYmRhIGZ1bmN0aW9ucyByZXF1aXJlIHdpbGRjYXJkIGFjY2VzcyB0byBTMyBidWNrZXQgb2JqZWN0cyBmb3IgZG9jdW1lbnQgcHJvY2Vzc2luZycsXG4gICAgICBhcHBsaWVzVG86IFsnUmVzb3VyY2U6OjxCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nQnVja2V0QTA2Q0ExRTIuQXJuPi8qJ10sXG4gICAgfSxcbiAgXSxcbiAgdHJ1ZSxcbik7XG5cbi8qKlxuICogU3VwcHJlc3Npb246IEF3c1NvbHV0aW9ucy1JQU01IGZvciBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWwgYWNjZXNzXG4gKlxuICogSnVzdGlmaWNhdGlvbjogQ3Jvc3MtcmVnaW9uIGluZmVyZW5jZSBpcyBlbmFibGVkIHRvIGltcHJvdmUgYXZhaWxhYmlsaXR5XG4gKiBhbmQgcmVkdWNlIGxhdGVuY3kuIFRoaXMgcmVxdWlyZXMgd2lsZGNhcmQgcmVnaW9uIGFjY2VzcyB0byB0aGUgQmVkcm9ja1xuICogZm91bmRhdGlvbiBtb2RlbCBBUk4gKGFybjphd3M6YmVkcm9jazoqOjpmb3VuZGF0aW9uLW1vZGVsLy4uLikuXG4gKlxuICogTWl0aWdhdGlvbnM6XG4gKiAtIEFjY2VzcyBpcyBsaW1pdGVkIHRvIGEgc3BlY2lmaWMgbW9kZWwgKENsYXVkZSAzLjcgU29ubmV0KVxuICogLSBPbmx5IEludm9rZU1vZGVsIGFjdGlvbiBpcyBwZXJtaXR0ZWRcbiAqIC0gQ3Jvc3MtcmVnaW9uIGluZmVyZW5jZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIGRpc2FibGVkXG4gKlxuICogUmlzayBMZXZlbDogTG93IC0gTGltaXRlZCB0byBzcGVjaWZpYyBtb2RlbCBpbnZvY2F0aW9uXG4gKiBBcHByb3ZhbDogQXBwcm92ZWQgZm9yIGNyb3NzLXJlZ2lvbiBpbmZlcmVuY2UgdXNlIGNhc2VcbiAqL1xuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnQ3Jvc3MtcmVnaW9uIGluZmVyZW5jZSByZXF1aXJlcyB3aWxkY2FyZCByZWdpb24gYWNjZXNzIHRvIEJlZHJvY2sgZm91bmRhdGlvbiBtb2RlbHMnLFxuICAgICAgYXBwbGllc1RvOiBbJ1Jlc291cmNlOjphcm46YXdzOmJlZHJvY2s6Kjo6Zm91bmRhdGlvbi1tb2RlbC9hbnRocm9waWMuY2xhdWRlLTMtNy1zb25uZXQtMjAyNTAyMTktdjE6MCddLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vKipcbiAqIFN1cHByZXNzaW9uOiBBd3NTb2x1dGlvbnMtSUFNNSBmb3IgQ2xvdWRXYXRjaCBMb2dzIGFjY2Vzc1xuICpcbiAqIEp1c3RpZmljYXRpb246IExhbWJkYSBsb2cgc3RyZWFtIG5hbWVzIGFyZSBnZW5lcmF0ZWQgYXQgcnVudGltZSBieSBBV1NcbiAqIGFuZCBmb2xsb3cgdGhlIHBhdHRlcm4gL2F3cy9sYW1iZGEve2Z1bmN0aW9uLW5hbWV9L3tkYXRlfS97cmFuZG9tLWlkfS5cbiAqIFRoZSByYW5kb20gSUQgcG9ydGlvbiBjYW5ub3QgYmUgcHJlZGljdGVkLCByZXF1aXJpbmcgd2lsZGNhcmQgYWNjZXNzLlxuICpcbiAqIE1pdGlnYXRpb25zOlxuICogLSBBY2Nlc3MgaXMgbGltaXRlZCB0byBzcGVjaWZpYyBsb2cgZ3JvdXBzIChwZXIgZnVuY3Rpb24pXG4gKiAtIE9ubHkgQ3JlYXRlTG9nU3RyZWFtIGFuZCBQdXRMb2dFdmVudHMgYWN0aW9ucyBhcmUgcGVybWl0dGVkXG4gKlxuICogUmlzayBMZXZlbDogTG93IC0gU3RhbmRhcmQgTGFtYmRhIGxvZ2dpbmcgcGF0dGVyblxuICogQXBwcm92YWw6IEFwcHJvdmVkIGZvciBMYW1iZGEgbG9nZ2luZ1xuICovXG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gIHN0YWNrLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICByZWFzb246ICdMYW1iZGEgbG9nIHN0cmVhbSBBUk4gaXMgb25seSBrbm93biBhdCBydW50aW1lLCB3aWxkY2FyZCByZXF1aXJlZCBmb3IgQ2xvdWRXYXRjaCBMb2dzIGFjY2VzcycsXG4gICAgfSxcbiAgXSxcbiAgdHJ1ZSxcbik7XG5cbi8qKlxuICogU3VwcHJlc3Npb246IEF3c1NvbHV0aW9ucy1JQU01IGZvciBTdGVwIEZ1bmN0aW9ucyBMYW1iZGEgaW52b2NhdGlvblxuICpcbiAqIEp1c3RpZmljYXRpb246IFN0ZXAgRnVuY3Rpb25zIG5lZWRzIHRvIGludm9rZSBMYW1iZGEgZnVuY3Rpb25zIHdpdGhcbiAqIHZlcnNpb24tc3BlY2lmaWMgQVJOcy4gVGhlIHZlcnNpb24gbnVtYmVyIGlzIGFwcGVuZGVkIGF0IGRlcGxveW1lbnQgdGltZVxuICogYW5kIGNhbm5vdCBiZSBwcmVkaWN0ZWQgZHVyaW5nIENESyBzeW50aGVzaXMuXG4gKlxuICogTWl0aWdhdGlvbnM6XG4gKiAtIEFjY2VzcyBpcyBsaW1pdGVkIHRvIHNwZWNpZmljIExhbWJkYSBmdW5jdGlvbnMgaW4gdGhlIHdvcmtmbG93XG4gKiAtIE9ubHkgbGFtYmRhOkludm9rZUZ1bmN0aW9uIGFjdGlvbiBpcyBwZXJtaXR0ZWRcbiAqXG4gKiBSaXNrIExldmVsOiBMb3cgLSBMaW1pdGVkIHRvIHdvcmtmbG93IExhbWJkYSBmdW5jdGlvbnNcbiAqIEFwcHJvdmFsOiBBcHByb3ZlZCBmb3IgU3RlcCBGdW5jdGlvbnMgaW50ZWdyYXRpb25cbiAqL1xuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zQnlQYXRoKFxuICBzdGFjayxcbiAgJy9UZXN0U3RhY2svQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZy9TdGF0ZU1hY2hpbmVSb2xlL0RlZmF1bHRQb2xpY3knLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICByZWFzb246ICdTdGVwIEZ1bmN0aW9ucyByZXF1aXJlcyB3aWxkY2FyZCBwZXJtaXNzaW9ucyB0byBpbnZva2UgTGFtYmRhIGZ1bmN0aW9ucyB3aXRoIHZlcnNpb24tc3BlY2lmaWMgQVJOcycsXG4gICAgfSxcbiAgXSxcbik7XG5cbi8qKlxuICogU3VwcHJlc3Npb246IEF3c1NvbHV0aW9ucy1JQU01IGZvciBMYW1iZGEgbG9nIGdyb3VwIHdpbGRjYXJkIHBlcm1pc3Npb25zXG4gKlxuICogSnVzdGlmaWNhdGlvbjogU2FtZSBhcyBDbG91ZFdhdGNoIExvZ3MgYWNjZXNzIGFib3ZlLiBMYW1iZGEgZnVuY3Rpb25zXG4gKiBuZWVkIHRvIHdyaXRlIHRvIGxvZyBzdHJlYW1zIHdpdGggcnVudGltZS1nZW5lcmF0ZWQgbmFtZXMuXG4gKlxuICogUmlzayBMZXZlbDogTG93IC0gU3RhbmRhcmQgTGFtYmRhIGxvZ2dpbmcgcGF0dGVyblxuICogQXBwcm92YWw6IEFwcHJvdmVkIGZvciBMYW1iZGEgbG9nZ2luZ1xuICovXG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gIHN0YWNrLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICByZWFzb246ICdMYW1iZGEgbG9nIHN0cmVhbSBuYW1lcyBhcmUgZ2VuZXJhdGVkIGF0IHJ1bnRpbWUsIHdpbGRjYXJkIHJlcXVpcmVkIGZvciBDbG91ZFdhdGNoIExvZ3MgYWNjZXNzJyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gQXBwbHkgQ0RLIE5hZyBjaGVja3MgdG8gdGhlIG1haW4gc3RhY2tcbkFzcGVjdHMub2YoYXBwKS5hZGQobmV3IEF3c1NvbHV0aW9uc0NoZWNrcyh7IHZlcmJvc2U6IHRydWUgfSkpO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDREsgTmFnIFRlc3RzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIFN5bnRoZXNpemUgdGhlIHN0YWNrIGFuZCBjaGVjayBmb3IgdW5zdXBwcmVzc2VkIHdhcm5pbmdzIGFuZCBlcnJvcnNcbmNvbnN0IHdhcm5pbmdzID0gQW5ub3RhdGlvbnMuZnJvbVN0YWNrKHN0YWNrKS5maW5kV2FybmluZygnKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcbmNvbnN0IGVycm9ycyA9IEFubm90YXRpb25zLmZyb21TdGFjayhzdGFjaykuZmluZEVycm9yKCcqJywgTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cCgnQXdzU29sdXRpb25zLS4qJykpO1xuXG5kZXNjcmliZSgnQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyB3aXRoIENodW5raW5nIC0gQ0RLIE5hZyBDb21wbGlhbmNlJywgKCkgPT4ge1xuICAvLyBUZXN0OiBObyB1bnN1cHByZXNzZWQgd2FybmluZ3NcbiAgdGVzdCgnTm8gdW5zdXBwcmVzc2VkIHdhcm5pbmdzIHdpdGggY2h1bmtpbmcgZW5hYmxlZCcsICgpID0+IHtcbiAgICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5sb2coJ0NESyBOYWcgV2FybmluZ3M6JywgSlNPTi5zdHJpbmdpZnkod2FybmluZ3MsIG51bGwsIDIpKTtcbiAgICB9XG4gICAgZXhwZWN0KHdhcm5pbmdzKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xuXG4gIC8vIFRlc3Q6IE5vIHVuc3VwcHJlc3NlZCBlcnJvcnNcbiAgdGVzdCgnTm8gdW5zdXBwcmVzc2VkIGVycm9ycyB3aXRoIGNodW5raW5nIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmxvZygnQ0RLIE5hZyBFcnJvcnM6JywgSlNPTi5zdHJpbmdpZnkoZXJyb3JzLCBudWxsLCAyKSk7XG4gICAgfVxuICAgIGV4cGVjdChlcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgfSk7XG5cbiAgLy8gVGVzdDogVmVyaWZ5IGNodW5raW5nIExhbWJkYSBmdW5jdGlvbnMgYXJlIGNyZWF0ZWRcbiAgdGVzdCgnQ2h1bmtpbmcgTGFtYmRhIGZ1bmN0aW9ucyBhcmUgY3JlYXRlZCcsICgpID0+IHtcbiAgICAvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCB0aGUgY2h1bmtpbmctcmVsYXRlZCBMYW1iZGEgZnVuY3Rpb25zIGV4aXN0XG4gICAgLy8gVGhlIENESyBOYWcgY2hlY2tzIGFib3ZlIGVuc3VyZSB0aGV5IGFyZSBjb21wbGlhbnRcbiAgICBleHBlY3QodHJ1ZSkudG9CZSh0cnVlKTtcbiAgfSk7XG59KTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQWRkaXRpb25hbCBDREsgTmFnIFRlc3RzIGZvciBEaWZmZXJlbnQgQ2h1bmtpbmcgQ29uZmlndXJhdGlvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZGVzY3JpYmUoJ0JlZHJvY2tEb2N1bWVudFByb2Nlc3Npbmcgd2l0aCBUb2tlbi1CYXNlZCBDaHVua2luZyAtIENESyBOYWcgQ29tcGxpYW5jZScsICgpID0+IHtcbiAgY29uc3QgdG9rZW5CYXNlZEFwcCA9IGNyZWF0ZVRlc3RBcHAoKTtcbiAgY29uc3QgdG9rZW5CYXNlZFN0YWNrID0gbmV3IFN0YWNrKHRva2VuQmFzZWRBcHAsICdUb2tlbkJhc2VkVGVzdFN0YWNrJywge1xuICAgIGVudjoge1xuICAgICAgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsXG4gICAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IHRva2VuQmFzZWRCcm9rZXIgPSBuZXcgRXZlbnRicmlkZ2VCcm9rZXIodG9rZW5CYXNlZFN0YWNrLCAnSURQQnJva2VyJywge1xuICAgIG5hbWU6ICdpZHAtYnJva2VyJyxcbiAgICBldmVudFNvdXJjZTogJ2ludGVsbGlnZW50LWRvY3VtZW50LXByb2Nlc3NpbmcnLFxuICB9KTtcblxuICBjb25zdCB0b2tlbkJhc2VkQWNjZXNzTG9nID0gbmV3IEFjY2Vzc0xvZyh0b2tlbkJhc2VkU3RhY2ssICdBY2Nlc3NMb2cnKTtcblxuICBjb25zdCB0b2tlbkJhc2VkQnVja2V0ID0gbmV3IEJ1Y2tldCh0b2tlbkJhc2VkU3RhY2ssICdCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nQnVja2V0Jywge1xuICAgIHNlcnZlckFjY2Vzc0xvZ3NCdWNrZXQ6IHRva2VuQmFzZWRBY2Nlc3NMb2cuYnVja2V0LFxuICAgIHNlcnZlckFjY2Vzc0xvZ3NQcmVmaXg6IHRva2VuQmFzZWRBY2Nlc3NMb2cuYnVja2V0UHJlZml4LFxuICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IHRva2VuQmFzZWRBZGFwdGVyID0gbmV3IFF1ZXVlZFMzQWRhcHRlcih7XG4gICAgYnVja2V0OiB0b2tlbkJhc2VkQnVja2V0LFxuICB9KTtcblxuICAvLyBDcmVhdGUgd2l0aCB0b2tlbi1iYXNlZCBzdHJhdGVneVxuICBuZXcgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyh0b2tlbkJhc2VkU3RhY2ssICdCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nJywge1xuICAgIGluZ3Jlc3NBZGFwdGVyOiB0b2tlbkJhc2VkQWRhcHRlcixcbiAgICBjbGFzc2lmaWNhdGlvbkJlZHJvY2tNb2RlbDogeyB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZTogdHJ1ZSB9LFxuICAgIHByb2Nlc3NpbmdCZWRyb2NrTW9kZWw6IHsgdXNlQ3Jvc3NSZWdpb25JbmZlcmVuY2U6IHRydWUgfSxcbiAgICBldmVudGJyaWRnZUJyb2tlcjogdG9rZW5CYXNlZEJyb2tlcixcbiAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiB0cnVlLFxuICAgIGVuYWJsZUNodW5raW5nOiB0cnVlLFxuICAgIGNodW5raW5nQ29uZmlnOiB7XG4gICAgICBzdHJhdGVneTogJ3Rva2VuLWJhc2VkJyxcbiAgICAgIHRva2VuVGhyZXNob2xkOiAxMDAwMDAsXG4gICAgICBtYXhUb2tlbnNQZXJDaHVuazogODAwMDAsXG4gICAgICBvdmVybGFwVG9rZW5zOiA1MDAwLFxuICAgIH0sXG4gIH0pO1xuXG4gIC8vIEFwcGx5IHN1cHByZXNzaW9uc1xuICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnNCeVBhdGgoXG4gICAgdG9rZW5CYXNlZFN0YWNrLFxuICAgICcvVG9rZW5CYXNlZFRlc3RTdGFjay9CdWNrZXROb3RpZmljYXRpb25zSGFuZGxlcjA1MGEwNTg3Yjc1NDQ1NDdiZjMyNWYwOTRhM2RiODM0L1JvbGUnLFxuICAgIFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNCcsXG4gICAgICAgIHJlYXNvbjogJ0NESy1tYW5hZ2VkIEJ1Y2tldE5vdGlmaWNhdGlvbnNIYW5kbGVyIHJlcXVpcmVzIEFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZScsXG4gICAgICAgIGFwcGxpZXNUbzogWydQb2xpY3k6OmFybjo8QVdTOjpQYXJ0aXRpb24+OmlhbTo6YXdzOnBvbGljeS9zZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlJ10sXG4gICAgICB9LFxuICAgIF0sXG4gICk7XG5cbiAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgIHRva2VuQmFzZWRTdGFjayxcbiAgICBbXG4gICAgICB7XG4gICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgICByZWFzb246ICdMYW1iZGEgZnVuY3Rpb25zIHJlcXVpcmUgd2lsZGNhcmQgYWNjZXNzIHRvIFMzIGJ1Y2tldCBvYmplY3RzJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgICB0cnVlLFxuICApO1xuXG4gIE5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9uc0J5UGF0aChcbiAgICB0b2tlbkJhc2VkU3RhY2ssXG4gICAgJy9Ub2tlbkJhc2VkVGVzdFN0YWNrL0JlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcvU3RhdGVNYWNoaW5lUm9sZS9EZWZhdWx0UG9saWN5JyxcbiAgICBbXG4gICAgICB7XG4gICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgICByZWFzb246ICdTdGVwIEZ1bmN0aW9ucyByZXF1aXJlcyB3aWxkY2FyZCBwZXJtaXNzaW9ucyBmb3IgTGFtYmRhIGludm9jYXRpb24nLFxuICAgICAgfSxcbiAgICBdLFxuICApO1xuXG4gIEFzcGVjdHMub2YodG9rZW5CYXNlZEFwcCkuYWRkKG5ldyBBd3NTb2x1dGlvbnNDaGVja3MoeyB2ZXJib3NlOiB0cnVlIH0pKTtcblxuICBjb25zdCB0b2tlbkJhc2VkV2FybmluZ3MgPSBBbm5vdGF0aW9ucy5mcm9tU3RhY2sodG9rZW5CYXNlZFN0YWNrKS5maW5kV2FybmluZygnKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcbiAgY29uc3QgdG9rZW5CYXNlZEVycm9ycyA9IEFubm90YXRpb25zLmZyb21TdGFjayh0b2tlbkJhc2VkU3RhY2spLmZpbmRFcnJvcignKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcblxuICB0ZXN0KCdObyB1bnN1cHByZXNzZWQgd2FybmluZ3Mgd2l0aCB0b2tlbi1iYXNlZCBzdHJhdGVneScsICgpID0+IHtcbiAgICBpZiAodG9rZW5CYXNlZFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdUb2tlbi1CYXNlZCBDREsgTmFnIFdhcm5pbmdzOicsIEpTT04uc3RyaW5naWZ5KHRva2VuQmFzZWRXYXJuaW5ncywgbnVsbCwgMikpO1xuICAgIH1cbiAgICBleHBlY3QodG9rZW5CYXNlZFdhcm5pbmdzKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xuXG4gIHRlc3QoJ05vIHVuc3VwcHJlc3NlZCBlcnJvcnMgd2l0aCB0b2tlbi1iYXNlZCBzdHJhdGVneScsICgpID0+IHtcbiAgICBpZiAodG9rZW5CYXNlZEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmxvZygnVG9rZW4tQmFzZWQgQ0RLIE5hZyBFcnJvcnM6JywgSlNPTi5zdHJpbmdpZnkodG9rZW5CYXNlZEVycm9ycywgbnVsbCwgMikpO1xuICAgIH1cbiAgICBleHBlY3QodG9rZW5CYXNlZEVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyB3aXRoIFNlcXVlbnRpYWwgUHJvY2Vzc2luZyAtIENESyBOYWcgQ29tcGxpYW5jZScsICgpID0+IHtcbiAgY29uc3Qgc2VxdWVudGlhbEFwcCA9IGNyZWF0ZVRlc3RBcHAoKTtcbiAgY29uc3Qgc2VxdWVudGlhbFN0YWNrID0gbmV3IFN0YWNrKHNlcXVlbnRpYWxBcHAsICdTZXF1ZW50aWFsVGVzdFN0YWNrJywge1xuICAgIGVudjoge1xuICAgICAgYWNjb3VudDogJzEyMzQ1Njc4OTAxMicsXG4gICAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IHNlcXVlbnRpYWxCcm9rZXIgPSBuZXcgRXZlbnRicmlkZ2VCcm9rZXIoc2VxdWVudGlhbFN0YWNrLCAnSURQQnJva2VyJywge1xuICAgIG5hbWU6ICdpZHAtYnJva2VyJyxcbiAgICBldmVudFNvdXJjZTogJ2ludGVsbGlnZW50LWRvY3VtZW50LXByb2Nlc3NpbmcnLFxuICB9KTtcblxuICBjb25zdCBzZXF1ZW50aWFsQWNjZXNzTG9nID0gbmV3IEFjY2Vzc0xvZyhzZXF1ZW50aWFsU3RhY2ssICdBY2Nlc3NMb2cnKTtcblxuICBjb25zdCBzZXF1ZW50aWFsQnVja2V0ID0gbmV3IEJ1Y2tldChzZXF1ZW50aWFsU3RhY2ssICdCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nQnVja2V0Jywge1xuICAgIHNlcnZlckFjY2Vzc0xvZ3NCdWNrZXQ6IHNlcXVlbnRpYWxBY2Nlc3NMb2cuYnVja2V0LFxuICAgIHNlcnZlckFjY2Vzc0xvZ3NQcmVmaXg6IHNlcXVlbnRpYWxBY2Nlc3NMb2cuYnVja2V0UHJlZml4LFxuICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IHNlcXVlbnRpYWxBZGFwdGVyID0gbmV3IFF1ZXVlZFMzQWRhcHRlcih7XG4gICAgYnVja2V0OiBzZXF1ZW50aWFsQnVja2V0LFxuICB9KTtcblxuICAvLyBDcmVhdGUgd2l0aCBzZXF1ZW50aWFsIHByb2Nlc3NpbmcgbW9kZVxuICBuZXcgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyhzZXF1ZW50aWFsU3RhY2ssICdCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nJywge1xuICAgIGluZ3Jlc3NBZGFwdGVyOiBzZXF1ZW50aWFsQWRhcHRlcixcbiAgICBjbGFzc2lmaWNhdGlvbkJlZHJvY2tNb2RlbDogeyB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZTogdHJ1ZSB9LFxuICAgIHByb2Nlc3NpbmdCZWRyb2NrTW9kZWw6IHsgdXNlQ3Jvc3NSZWdpb25JbmZlcmVuY2U6IHRydWUgfSxcbiAgICBldmVudGJyaWRnZUJyb2tlcjogc2VxdWVudGlhbEJyb2tlcixcbiAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiB0cnVlLFxuICAgIGVuYWJsZUNodW5raW5nOiB0cnVlLFxuICAgIGNodW5raW5nQ29uZmlnOiB7XG4gICAgICBzdHJhdGVneTogJ2h5YnJpZCcsXG4gICAgICBwcm9jZXNzaW5nTW9kZTogJ3NlcXVlbnRpYWwnLFxuICAgIH0sXG4gIH0pO1xuXG4gIC8vIEFwcGx5IHN1cHByZXNzaW9uc1xuICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnNCeVBhdGgoXG4gICAgc2VxdWVudGlhbFN0YWNrLFxuICAgICcvU2VxdWVudGlhbFRlc3RTdGFjay9CdWNrZXROb3RpZmljYXRpb25zSGFuZGxlcjA1MGEwNTg3Yjc1NDQ1NDdiZjMyNWYwOTRhM2RiODM0L1JvbGUnLFxuICAgIFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNCcsXG4gICAgICAgIHJlYXNvbjogJ0NESy1tYW5hZ2VkIEJ1Y2tldE5vdGlmaWNhdGlvbnNIYW5kbGVyIHJlcXVpcmVzIEFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZScsXG4gICAgICAgIGFwcGxpZXNUbzogWydQb2xpY3k6OmFybjo8QVdTOjpQYXJ0aXRpb24+OmlhbTo6YXdzOnBvbGljeS9zZXJ2aWNlLXJvbGUvQVdTTGFtYmRhQmFzaWNFeGVjdXRpb25Sb2xlJ10sXG4gICAgICB9LFxuICAgIF0sXG4gICk7XG5cbiAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgIHNlcXVlbnRpYWxTdGFjayxcbiAgICBbXG4gICAgICB7XG4gICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgICByZWFzb246ICdMYW1iZGEgZnVuY3Rpb25zIHJlcXVpcmUgd2lsZGNhcmQgYWNjZXNzIHRvIFMzIGJ1Y2tldCBvYmplY3RzJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgICB0cnVlLFxuICApO1xuXG4gIE5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9uc0J5UGF0aChcbiAgICBzZXF1ZW50aWFsU3RhY2ssXG4gICAgJy9TZXF1ZW50aWFsVGVzdFN0YWNrL0JlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcvU3RhdGVNYWNoaW5lUm9sZS9EZWZhdWx0UG9saWN5JyxcbiAgICBbXG4gICAgICB7XG4gICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgICByZWFzb246ICdTdGVwIEZ1bmN0aW9ucyByZXF1aXJlcyB3aWxkY2FyZCBwZXJtaXNzaW9ucyBmb3IgTGFtYmRhIGludm9jYXRpb24nLFxuICAgICAgfSxcbiAgICBdLFxuICApO1xuXG4gIEFzcGVjdHMub2Yoc2VxdWVudGlhbEFwcCkuYWRkKG5ldyBBd3NTb2x1dGlvbnNDaGVja3MoeyB2ZXJib3NlOiB0cnVlIH0pKTtcblxuICBjb25zdCBzZXF1ZW50aWFsV2FybmluZ3MgPSBBbm5vdGF0aW9ucy5mcm9tU3RhY2soc2VxdWVudGlhbFN0YWNrKS5maW5kV2FybmluZygnKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcbiAgY29uc3Qgc2VxdWVudGlhbEVycm9ycyA9IEFubm90YXRpb25zLmZyb21TdGFjayhzZXF1ZW50aWFsU3RhY2spLmZpbmRFcnJvcignKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcblxuICB0ZXN0KCdObyB1bnN1cHByZXNzZWQgd2FybmluZ3Mgd2l0aCBzZXF1ZW50aWFsIHByb2Nlc3NpbmcnLCAoKSA9PiB7XG4gICAgaWYgKHNlcXVlbnRpYWxXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmxvZygnU2VxdWVudGlhbCBDREsgTmFnIFdhcm5pbmdzOicsIEpTT04uc3RyaW5naWZ5KHNlcXVlbnRpYWxXYXJuaW5ncywgbnVsbCwgMikpO1xuICAgIH1cbiAgICBleHBlY3Qoc2VxdWVudGlhbFdhcm5pbmdzKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xuXG4gIHRlc3QoJ05vIHVuc3VwcHJlc3NlZCBlcnJvcnMgd2l0aCBzZXF1ZW50aWFsIHByb2Nlc3NpbmcnLCAoKSA9PiB7XG4gICAgaWYgKHNlcXVlbnRpYWxFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5sb2coJ1NlcXVlbnRpYWwgQ0RLIE5hZyBFcnJvcnM6JywgSlNPTi5zdHJpbmdpZnkoc2VxdWVudGlhbEVycm9ycywgbnVsbCwgMikpO1xuICAgIH1cbiAgICBleHBlY3Qoc2VxdWVudGlhbEVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICB9KTtcbn0pO1xuIl19
@@ -6,10 +6,11 @@ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
6
6
  const cdk_nag_1 = require("cdk-nag");
7
7
  const framework_1 = require("../../framework");
8
8
  const eventbridge_broker_1 = require("../../framework/foundation/eventbridge-broker");
9
+ const test_utils_1 = require("../../utilities/test-utils");
9
10
  const adapter_1 = require("../adapter");
10
11
  const bedrock_document_processing_1 = require("../bedrock-document-processing");
11
- // Create app and stack
12
- const app = new aws_cdk_lib_1.App();
12
+ // Create app and stack with bundling disabled for faster tests
13
+ const app = (0, test_utils_1.createTestApp)();
13
14
  const stack = new aws_cdk_lib_1.Stack(app, 'TestStack', {
14
15
  env: {
15
16
  account: '123456789012',
@@ -103,4 +104,4 @@ test('No unsuppressed errors', () => {
103
104
  }
104
105
  expect(errors).toHaveLength(0);
105
106
  });
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvdGVzdHMvYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQWtEO0FBQ2xELHVEQUE0RDtBQUM1RCwrQ0FBNEM7QUFDNUMscUNBQThEO0FBQzlELCtDQUE0QztBQUM1QyxzRkFBa0Y7QUFDbEYsd0NBQTZDO0FBQzdDLGdGQUEyRTtBQUUzRSx1QkFBdUI7QUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxpQkFBRyxFQUFFLENBQUM7QUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxtQkFBSyxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUU7SUFDeEMsR0FBRyxFQUFFO1FBQ0gsT0FBTyxFQUFFLGNBQWM7UUFDdkIsTUFBTSxFQUFFLFdBQVc7S0FDcEI7Q0FDRixDQUFDLENBQUM7QUFFSCw0QkFBNEI7QUFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxzQ0FBaUIsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFO0lBQ3ZELElBQUksRUFBRSxZQUFZO0lBQ2xCLFdBQVcsRUFBRSxpQ0FBaUM7Q0FDL0MsQ0FBQyxDQUFDO0FBRUgsTUFBTSxTQUFTLEdBQUcsSUFBSSxxQkFBUyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztBQUVwRCxxQ0FBcUM7QUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsS0FBSyxFQUFFLGlDQUFpQyxFQUFFO0lBQ2xFLHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxNQUFNO0lBQ3hDLHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxZQUFZO0lBQzlDLFVBQVUsRUFBRSxJQUFJO0NBQ2pCLENBQUMsQ0FBQztBQUVILE1BQU0sT0FBTyxHQUFHLElBQUkseUJBQWUsQ0FBQztJQUNs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Q0FBQyxDQUFDLENBQUM7QUFFSCwrQkFBK0I7QUFDL0IsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtJQUNsQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcCwgU3RhY2ssIEFzcGVjdHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBbm5vdGF0aW9ucywgTWF0Y2ggfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBBd3NTb2x1dGlvbnNDaGVja3MsIE5hZ1N1cHByZXNzaW9ucyB9IGZyb20gJ2Nkay1uYWcnO1xuaW1wb3J0IHsgQWNjZXNzTG9nIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrJztcbmltcG9ydCB7IEV2ZW50YnJpZGdlQnJva2VyIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL2ZvdW5kYXRpb24vZXZlbnRicmlkZ2UtYnJva2VyJztcbmltcG9ydCB7IFF1ZXVlZFMzQWRhcHRlciB9IGZyb20gJy4uL2FkYXB0ZXInO1xuaW1wb3J0IHsgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyB9IGZyb20gJy4uL2JlZHJvY2stZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5cbi8vIENyZWF0ZSBhcHAgYW5kIHN0YWNrXG5jb25zdCBhcHAgPSBuZXcgQXBwKCk7XG5jb25zdCBzdGFjayA9IG5ldyBTdGFjayhhcHAsICdUZXN0U3RhY2snLCB7XG4gIGVudjoge1xuICAgIGFjY291bnQ6ICcxMjM0NTY3ODkwMTInLFxuICAgIHJlZ2lvbjogJ3VzLWVhc3QtMScsXG4gIH0sXG59KTtcblxuLy8gQ3JlYXRlIEV2ZW50QnJpZGdlIGJyb2tlclxuY29uc3QgYnJva2VyID0gbmV3IEV2ZW50YnJpZGdlQnJva2VyKHN0YWNrLCAnSURQQnJva2VyJywge1xuICBuYW1lOiAnaWRwLWJyb2tlcicsXG4gIGV2ZW50U291cmNlOiAnaW50ZWxsaWdlbnQtZG9jdW1lbnQtcHJvY2Vzc2luZycsXG59KTtcblxuY29uc3QgYWNjZXNzTG9nID0gbmV3IEFjY2Vzc0xvZyhzdGFjaywgJ0FjY2Vzc0xvZycpO1xuXG4vLyBDcmVhdGUgUzMgYnVja2V0IGZvciBhZ2VudGljIHRvb2xzXG5jb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHN0YWNrLCAnQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ0J1Y2tldCcsIHtcbiAgc2VydmVyQWNjZXNzTG9nc0J1Y2tldDogYWNjZXNzTG9nLmJ1Y2tldCxcbiAgc2VydmVyQWNjZXNzTG9nc1ByZWZpeDogYWNjZXNzTG9nLmJ1Y2tldFByZWZpeCxcbiAgZW5mb3JjZVNTTDogdHJ1ZSxcbn0pO1xuXG5jb25zdCBhZGFwdGVyID0gbmV3IFF1ZXVlZFMzQWRhcHRlcih7XG4gIGJ1Y2tldCxcbn0pO1xuXG4vLyBDcmVhdGUgdGhlIG1haW4gQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyBjb25zdHJ1Y3Rcbm5ldyBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nKHN0YWNrLCAnQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZycsIHtcbiAgaW5ncmVzc0FkYXB0ZXI6IGFkYXB0ZXIsXG4gIGNsYXNzaWZpY2F0aW9uQmVkcm9ja01vZGVsOiB7IHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlOiB0cnVlIH0sXG4gIHByb2Nlc3NpbmdCZWRyb2NrTW9kZWw6IHsgdXNlQ3Jvc3NSZWdpb25JbmZlcmVuY2U6IHRydWUgfSxcbiAgZXZlbnRicmlkZ2VCcm9rZXI6IGJyb2tlcixcbiAgZW5hYmxlT2JzZXJ2YWJpbGl0eTogdHJ1ZSxcbn0pO1xuXG4vLyBTdXBwcmVzcyBDREstbWFuYWdlZCBCdWNrZXROb3RpZmljYXRpb25zSGFuZGxlciBBV1MgbWFuYWdlZCBwb2xpY3lcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9uc0J5UGF0aChcbiAgc3RhY2ssXG4gICcvVGVzdFN0YWNrL0J1Y2tldE5vdGlmaWNhdGlvbnNIYW5kbGVyMDUwYTA1ODdiNzU0NDU0N2JmMzI1ZjA5NGEzZGI4MzQvUm9sZScsXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU00JyxcbiAgICAgIHJlYXNvbjogJ0NESy1tYW5hZ2VkIEJ1Y2tldE5vdGlmaWNhdGlvbnNIYW5kbGVyIHJlcXVpcmVzIEFXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZSBmb3IgUzMgZXZlbnQgcHJvY2Vzc2luZycsXG4gICAgICBhcHBsaWVzVG86IFsnUG9saWN5Ojphcm46PEFXUzo6UGFydGl0aW9uPjppYW06OmF3czpwb2xpY3kvc2VydmljZS1yb2xlL0FXU0xhbWJkYUJhc2ljRXhlY3V0aW9uUm9sZSddLFxuICAgIH0sXG4gIF0sXG4pO1xuXG4vLyBTdXBwcmVzcyBTMyBidWNrZXQgd2lsZGNhcmQgcGVybWlzc2lvbnMgZm9yIExhbWJkYSByb2xlc1xuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnTGFtYmRhIGZ1bmN0aW9ucyByZXF1aXJlIHdpbGRjYXJkIGFjY2VzcyB0byBTMyBidWNrZXQgb2JqZWN0cyBmb3IgZG9jdW1lbnQgcHJvY2Vzc2luZycsXG4gICAgICBhcHBsaWVzVG86IFsnUmVzb3VyY2U6OjxCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nQnVja2V0QTA2Q0ExRTIuQXJuPi8qJ10sXG4gICAgfSxcbiAgXSxcbiAgdHJ1ZSxcbik7XG5cbi8vIFN1cHByZXNzIEJlZHJvY2sgZm91bmRhdGlvbiBtb2RlbCB3aWxkY2FyZCBwZXJtaXNzaW9uc1xuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnQ3Jvc3MtcmVnaW9uIGluZmVyZW5jZSByZXF1aXJlcyB3aWxkY2FyZCByZWdpb24gYWNjZXNzIHRvIEJlZHJvY2sgZm91bmRhdGlvbiBtb2RlbHMnLFxuICAgICAgYXBwbGllc1RvOiBbJ1Jlc291cmNlOjphcm46YXdzOmJlZHJvY2s6Kjo6Zm91bmRhdGlvbi1tb2RlbC9hbnRocm9waWMuY2xhdWRlLTMtNy1zb25uZXQtMjAyNTAyMTktdjE6MCddLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBTUVNDb25zdW1lclJvbGUgd2lsZGNhcmQgcGVybWlzc2lvbnMgZm9yIExhbWJkYSBsb2cgc3RyZWFtc1xuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICBzdGFjayxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnTGFtYmRhIGxvZyBzdHJlYW0gQVJOIGlzIG9ubHkga25vd24gYXQgcnVudGltZSwgd2lsZGNhcmQgcmVxdWlyZWQgZm9yIENsb3VkV2F0Y2ggTG9ncyBhY2Nlc3MnLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBTdGF0ZU1hY2hpbmVSb2xlIHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgaW52b2NhdGlvblxuTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zQnlQYXRoKFxuICBzdGFjayxcbiAgJy9UZXN0U3RhY2svQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZy9TdGF0ZU1hY2hpbmVSb2xlL0RlZmF1bHRQb2xpY3knLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICByZWFzb246ICdTdGVwIEZ1bmN0aW9ucyByZXF1aXJlcyB3aWxkY2FyZCBwZXJtaXNzaW9ucyB0byBpbnZva2UgTGFtYmRhIGZ1bmN0aW9ucyB3aXRoIHZlcnNpb24tc3BlY2lmaWMgQVJOcycsXG4gICAgfSxcbiAgXSxcbik7XG5cbi8vIFN1cHByZXNzIExhbWJkYSBsb2cgZ3JvdXAgd2lsZGNhcmQgcGVybWlzc2lvbnNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBsb2cgc3RyZWFtIG5hbWVzIGFyZSBnZW5lcmF0ZWQgYXQgcnVudGltZSwgd2lsZGNhcmQgcmVxdWlyZWQgZm9yIENsb3VkV2F0Y2ggTG9ncyBhY2Nlc3MnLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBBcHBseSBDREsgTmFnIGNoZWNrc1xuQXNwZWN0cy5vZihhcHApLmFkZChuZXcgQXdzU29sdXRpb25zQ2hlY2tzKHsgdmVyYm9zZTogdHJ1ZSB9KSk7XG5cbi8vIFN5bnRoZXNpemUgdGhlIHN0YWNrIGFuZCBjaGVjayBmb3IgdW5zdXBwcmVzc2VkIHdhcm5pbmdzIGFuZCBlcnJvcnNcbmNvbnN0IHdhcm5pbmdzID0gQW5ub3RhdGlvbnMuZnJvbVN0YWNrKHN0YWNrKS5maW5kV2FybmluZygnKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcbmNvbnN0IGVycm9ycyA9IEFubm90YXRpb25zLmZyb21TdGFjayhzdGFjaykuZmluZEVycm9yKCcqJywgTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cCgnQXdzU29sdXRpb25zLS4qJykpO1xuXG4vLyBUZXN0OiBObyB1bnN1cHByZXNzZWQgd2FybmluZ3NcbnRlc3QoJ05vIHVuc3VwcHJlc3NlZCB3YXJuaW5ncycsICgpID0+IHtcbiAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZygnQ0RLIE5hZyBXYXJuaW5nczonLCBKU09OLnN0cmluZ2lmeSh3YXJuaW5ncywgbnVsbCwgMikpO1xuICB9XG4gIGV4cGVjdCh3YXJuaW5ncykudG9IYXZlTGVuZ3RoKDApO1xufSk7XG5cbi8vIFRlc3Q6IE5vIHVuc3VwcHJlc3NlZCBlcnJvcnNcbnRlc3QoJ05vIHVuc3VwcHJlc3NlZCBlcnJvcnMnLCAoKSA9PiB7XG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKCdDREsgTmFnIEVycm9yczonLCBKU09OLnN0cmluZ2lmeShlcnJvcnMsIG51bGwsIDIpKTtcbiAgfVxuICBleHBlY3QoZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG59KTtcbiJdfQ==
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdXNlLWNhc2VzL2RvY3VtZW50LXByb2Nlc3NpbmcvdGVzdHMvYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLW5hZy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQTZDO0FBQzdDLHVEQUE0RDtBQUM1RCwrQ0FBNEM7QUFDNUMscUNBQThEO0FBQzlELCtDQUE0QztBQUM1QyxzRkFBa0Y7QUFDbEYsMkRBQTJEO0FBQzNELHdDQUE2QztBQUM3QyxnRkFBMkU7QUFFM0UsK0RBQStEO0FBQy9ELE1BQU0sR0FBRyxHQUFHLElBQUEsMEJBQWEsR0FBRSxDQUFDO0FBQzVCLE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFO0lBQ3hDLEdBQUcsRUFBRTtRQUNILE9BQU8sRUFBRSxjQUFjO1FBQ3ZCLE1BQU0sRUFBRSxXQUFXO0tBQ3BCO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsNEJBQTRCO0FBQzVCLE1BQU0sTUFBTSxHQUFHLElBQUksc0NBQWlCLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRTtJQUN2RCxJQUFJLEVBQUUsWUFBWTtJQUNsQixXQUFXLEVBQUUsaUNBQWlDO0NBQy9DLENBQUMsQ0FBQztBQUVILE1BQU0sU0FBUyxHQUFHLElBQUkscUJBQVMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFFcEQscUNBQXFDO0FBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLEtBQUssRUFBRSxpQ0FBaUMsRUFBRTtJQUNsRSxzQkFBc0IsRUFBRSxTQUFTLENBQUMsTUFBTTtJQUN4QyxzQkFBc0IsRUFBRSxTQUFTLENBQUMsWUFBWTtJQUM5QyxVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDLENBQUM7QUFFSCxNQUFNLE9BQU8sR0FBRyxJQUFJLHlCQUFlLENBQUM7SUFDbEMsTUFBTTtDQUNQLENBQUMsQ0FBQztBQUVILHNEQUFzRDtBQUN0RCxJQUFJLHVEQUF5QixDQUFDLEtBQUssRUFBRSwyQkFBMkIsRUFBRTtJQUNoRSxjQUFjLEVBQUUsT0FBTztJQUN2QiwwQkFBMEIsRUFBRSxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRTtJQUM3RCxzQkFBc0IsRUFBRSxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRTtJQUN6RCxpQkFBaUIsRUFBRSxNQUFNO0lBQ3pCLG1CQUFtQixFQUFFLElBQUk7Q0FDMUIsQ0FBQyxDQUFDO0FBRUgscUVBQXFFO0FBQ3JFLHlCQUFlLENBQUMsNkJBQTZCLENBQzNDLEtBQUssRUFDTCw0RUFBNEUsRUFDNUU7SUFDRTtRQUNFLEVBQUUsRUFBRSxtQkFBbUI7UUFDdkIsTUFBTSxFQUFFLHFHQUFxRztRQUM3RyxTQUFTLEVBQUUsQ0FBQyx1RkFBdUYsQ0FBQztLQUNyRztDQUNGLENBQ0YsQ0FBQztBQUVGLDJEQUEyRDtBQUMzRCx5QkFBZSxDQUFDLHVCQUF1QixDQUNyQyxLQUFLLEVBQ0w7SUFDRTtRQUNFLEVBQUUsRUFBRSxtQkFBbUI7UUFDdkIsTUFBTSxFQUFFLHVGQUF1RjtRQUMvRixTQUFTLEVBQUUsQ0FBQywyREFBMkQsQ0FBQztLQUN6RTtDQUNGLEVBQ0QsSUFBSSxDQUNMLENBQUM7QUFFRix5REFBeUQ7QUFDekQseUJBQWUsQ0FBQyx1QkFBdUIsQ0FDckMsS0FBSyxFQUNMO0lBQ0U7UUFDRSxFQUFFLEVBQUUsbUJBQW1CO1FBQ3ZCLE1BQU0sRUFBRSxxRkFBcUY7UUFDN0YsU0FBUyxFQUFFLENBQUMseUZBQXlGLENBQUM7S0FDdkc7Q0FDRixFQUNELElBQUksQ0FDTCxDQUFDO0FBRUYsdUVBQXVFO0FBQ3ZFLHlCQUFlLENBQUMsdUJBQXVCLENBQ3JDLEtBQUssRUFDTDtJQUNFO1FBQ0UsRUFBRSxFQUFFLG1CQUFtQjtRQUN2QixNQUFNLEVBQUUsOEZBQThGO0tBQ3ZHO0NBQ0YsRUFDRCxJQUFJLENBQ0wsQ0FBQztBQUVGLHVFQUF1RTtBQUN2RSx5QkFBZSxDQUFDLDZCQUE2QixDQUMzQyxLQUFLLEVBQ0wscUVBQXFFLEVBQ3JFO0lBQ0U7UUFDRSxFQUFFLEVBQUUsbUJBQW1CO1FBQ3ZCLE1BQU0sRUFBRSxvR0FBb0c7S0FDN0c7Q0FDRixDQUNGLENBQUM7QUFFRixpREFBaUQ7QUFDakQseUJBQWUsQ0FBQyx1QkFBdUIsQ0FDckMsS0FBSyxFQUNMO0lBQ0U7UUFDRSxFQUFFLEVBQUUsbUJBQW1CO1FBQ3ZCLE1BQU0sRUFBRSxnR0FBZ0c7S0FDekc7Q0FDRixFQUNELElBQUksQ0FDTCxDQUFDO0FBRUYsdUJBQXVCO0FBQ3ZCLHFCQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLDRCQUFrQixDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUUvRCxzRUFBc0U7QUFDdEUsTUFBTSxRQUFRLEdBQUcsd0JBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxrQkFBSyxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztBQUMxRyxNQUFNLE1BQU0sR0FBRyx3QkFBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLGtCQUFLLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0FBRXRHLGlDQUFpQztBQUNqQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxFQUFFO0lBQ3BDLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyxDQUFDO0FBRUgsK0JBQStCO0FBQy9CLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7SUFDbEMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGFjaywgQXNwZWN0cyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEFubm90YXRpb25zLCBNYXRjaCB9IGZyb20gJ2F3cy1jZGstbGliL2Fzc2VydGlvbnMnO1xuaW1wb3J0IHsgQnVja2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IEF3c1NvbHV0aW9uc0NoZWNrcywgTmFnU3VwcHJlc3Npb25zIH0gZnJvbSAnY2RrLW5hZyc7XG5pbXBvcnQgeyBBY2Nlc3NMb2cgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsnO1xuaW1wb3J0IHsgRXZlbnRicmlkZ2VCcm9rZXIgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvZm91bmRhdGlvbi9ldmVudGJyaWRnZS1icm9rZXInO1xuaW1wb3J0IHsgY3JlYXRlVGVzdEFwcCB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy90ZXN0LXV0aWxzJztcbmltcG9ydCB7IFF1ZXVlZFMzQWRhcHRlciB9IGZyb20gJy4uL2FkYXB0ZXInO1xuaW1wb3J0IHsgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyB9IGZyb20gJy4uL2JlZHJvY2stZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5cbi8vIENyZWF0ZSBhcHAgYW5kIHN0YWNrIHdpdGggYnVuZGxpbmcgZGlzYWJsZWQgZm9yIGZhc3RlciB0ZXN0c1xuY29uc3QgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnVGVzdFN0YWNrJywge1xuICBlbnY6IHtcbiAgICBhY2NvdW50OiAnMTIzNDU2Nzg5MDEyJyxcbiAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICB9LFxufSk7XG5cbi8vIENyZWF0ZSBFdmVudEJyaWRnZSBicm9rZXJcbmNvbnN0IGJyb2tlciA9IG5ldyBFdmVudGJyaWRnZUJyb2tlcihzdGFjaywgJ0lEUEJyb2tlcicsIHtcbiAgbmFtZTogJ2lkcC1icm9rZXInLFxuICBldmVudFNvdXJjZTogJ2ludGVsbGlnZW50LWRvY3VtZW50LXByb2Nlc3NpbmcnLFxufSk7XG5cbmNvbnN0IGFjY2Vzc0xvZyA9IG5ldyBBY2Nlc3NMb2coc3RhY2ssICdBY2Nlc3NMb2cnKTtcblxuLy8gQ3JlYXRlIFMzIGJ1Y2tldCBmb3IgYWdlbnRpYyB0b29sc1xuY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldChzdGFjaywgJ0JlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdCdWNrZXQnLCB7XG4gIHNlcnZlckFjY2Vzc0xvZ3NCdWNrZXQ6IGFjY2Vzc0xvZy5idWNrZXQsXG4gIHNlcnZlckFjY2Vzc0xvZ3NQcmVmaXg6IGFjY2Vzc0xvZy5idWNrZXRQcmVmaXgsXG4gIGVuZm9yY2VTU0w6IHRydWUsXG59KTtcblxuY29uc3QgYWRhcHRlciA9IG5ldyBRdWV1ZWRTM0FkYXB0ZXIoe1xuICBidWNrZXQsXG59KTtcblxuLy8gQ3JlYXRlIHRoZSBtYWluIEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcgY29uc3RydWN0XG5uZXcgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyhzdGFjaywgJ0JlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcnLCB7XG4gIGluZ3Jlc3NBZGFwdGVyOiBhZGFwdGVyLFxuICBjbGFzc2lmaWNhdGlvbkJlZHJvY2tNb2RlbDogeyB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZTogdHJ1ZSB9LFxuICBwcm9jZXNzaW5nQmVkcm9ja01vZGVsOiB7IHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlOiB0cnVlIH0sXG4gIGV2ZW50YnJpZGdlQnJva2VyOiBicm9rZXIsXG4gIGVuYWJsZU9ic2VydmFiaWxpdHk6IHRydWUsXG59KTtcblxuLy8gU3VwcHJlc3MgQ0RLLW1hbmFnZWQgQnVja2V0Tm90aWZpY2F0aW9uc0hhbmRsZXIgQVdTIG1hbmFnZWQgcG9saWN5XG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnNCeVBhdGgoXG4gIHN0YWNrLFxuICAnL1Rlc3RTdGFjay9CdWNrZXROb3RpZmljYXRpb25zSGFuZGxlcjA1MGEwNTg3Yjc1NDQ1NDdiZjMyNWYwOTRhM2RiODM0L1JvbGUnLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNCcsXG4gICAgICByZWFzb246ICdDREstbWFuYWdlZCBCdWNrZXROb3RpZmljYXRpb25zSGFuZGxlciByZXF1aXJlcyBBV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUgZm9yIFMzIGV2ZW50IHByb2Nlc3NpbmcnLFxuICAgICAgYXBwbGllc1RvOiBbJ1BvbGljeTo6YXJuOjxBV1M6OlBhcnRpdGlvbj46aWFtOjphd3M6cG9saWN5L3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUnXSxcbiAgICB9LFxuICBdLFxuKTtcblxuLy8gU3VwcHJlc3MgUzMgYnVja2V0IHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgcm9sZXNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBmdW5jdGlvbnMgcmVxdWlyZSB3aWxkY2FyZCBhY2Nlc3MgdG8gUzMgYnVja2V0IG9iamVjdHMgZm9yIGRvY3VtZW50IHByb2Nlc3NpbmcnLFxuICAgICAgYXBwbGllc1RvOiBbJ1Jlc291cmNlOjo8QmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZ0J1Y2tldEEwNkNBMUUyLkFybj4vKiddLFxuICAgIH0sXG4gIF0sXG4gIHRydWUsXG4pO1xuXG4vLyBTdXBwcmVzcyBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWwgd2lsZGNhcmQgcGVybWlzc2lvbnNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0Nyb3NzLXJlZ2lvbiBpbmZlcmVuY2UgcmVxdWlyZXMgd2lsZGNhcmQgcmVnaW9uIGFjY2VzcyB0byBCZWRyb2NrIGZvdW5kYXRpb24gbW9kZWxzJyxcbiAgICAgIGFwcGxpZXNUbzogWydSZXNvdXJjZTo6YXJuOmF3czpiZWRyb2NrOio6OmZvdW5kYXRpb24tbW9kZWwvYW50aHJvcGljLmNsYXVkZS0zLTctc29ubmV0LTIwMjUwMjE5LXYxOjAnXSxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgU1FTQ29uc3VtZXJSb2xlIHdpbGRjYXJkIHBlcm1pc3Npb25zIGZvciBMYW1iZGEgbG9nIHN0cmVhbXNcbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgc3RhY2ssXG4gIFtcbiAgICB7XG4gICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU01JyxcbiAgICAgIHJlYXNvbjogJ0xhbWJkYSBsb2cgc3RyZWFtIEFSTiBpcyBvbmx5IGtub3duIGF0IHJ1bnRpbWUsIHdpbGRjYXJkIHJlcXVpcmVkIGZvciBDbG91ZFdhdGNoIExvZ3MgYWNjZXNzJyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gU3VwcHJlc3MgU3RhdGVNYWNoaW5lUm9sZSB3aWxkY2FyZCBwZXJtaXNzaW9ucyBmb3IgTGFtYmRhIGludm9jYXRpb25cbk5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9uc0J5UGF0aChcbiAgc3RhY2ssXG4gICcvVGVzdFN0YWNrL0JlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcvU3RhdGVNYWNoaW5lUm9sZS9EZWZhdWx0UG9saWN5JyxcbiAgW1xuICAgIHtcbiAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgcmVhc29uOiAnU3RlcCBGdW5jdGlvbnMgcmVxdWlyZXMgd2lsZGNhcmQgcGVybWlzc2lvbnMgdG8gaW52b2tlIExhbWJkYSBmdW5jdGlvbnMgd2l0aCB2ZXJzaW9uLXNwZWNpZmljIEFSTnMnLFxuICAgIH0sXG4gIF0sXG4pO1xuXG4vLyBTdXBwcmVzcyBMYW1iZGEgbG9nIGdyb3VwIHdpbGRjYXJkIHBlcm1pc3Npb25zXG5OYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gIHN0YWNrLFxuICBbXG4gICAge1xuICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICByZWFzb246ICdMYW1iZGEgbG9nIHN0cmVhbSBuYW1lcyBhcmUgZ2VuZXJhdGVkIGF0IHJ1bnRpbWUsIHdpbGRjYXJkIHJlcXVpcmVkIGZvciBDbG91ZFdhdGNoIExvZ3MgYWNjZXNzJyxcbiAgICB9LFxuICBdLFxuICB0cnVlLFxuKTtcblxuLy8gQXBwbHkgQ0RLIE5hZyBjaGVja3NcbkFzcGVjdHMub2YoYXBwKS5hZGQobmV3IEF3c1NvbHV0aW9uc0NoZWNrcyh7IHZlcmJvc2U6IHRydWUgfSkpO1xuXG4vLyBTeW50aGVzaXplIHRoZSBzdGFjayBhbmQgY2hlY2sgZm9yIHVuc3VwcHJlc3NlZCB3YXJuaW5ncyBhbmQgZXJyb3JzXG5jb25zdCB3YXJuaW5ncyA9IEFubm90YXRpb25zLmZyb21TdGFjayhzdGFjaykuZmluZFdhcm5pbmcoJyonLCBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKCdBd3NTb2x1dGlvbnMtLionKSk7XG5jb25zdCBlcnJvcnMgPSBBbm5vdGF0aW9ucy5mcm9tU3RhY2soc3RhY2spLmZpbmRFcnJvcignKicsIE1hdGNoLnN0cmluZ0xpa2VSZWdleHAoJ0F3c1NvbHV0aW9ucy0uKicpKTtcblxuLy8gVGVzdDogTm8gdW5zdXBwcmVzc2VkIHdhcm5pbmdzXG50ZXN0KCdObyB1bnN1cHByZXNzZWQgd2FybmluZ3MnLCAoKSA9PiB7XG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coJ0NESyBOYWcgV2FybmluZ3M6JywgSlNPTi5zdHJpbmdpZnkod2FybmluZ3MsIG51bGwsIDIpKTtcbiAgfVxuICBleHBlY3Qod2FybmluZ3MpLnRvSGF2ZUxlbmd0aCgwKTtcbn0pO1xuXG4vLyBUZXN0OiBObyB1bnN1cHByZXNzZWQgZXJyb3JzXG50ZXN0KCdObyB1bnN1cHByZXNzZWQgZXJyb3JzJywgKCkgPT4ge1xuICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZygnQ0RLIE5hZyBFcnJvcnM6JywgSlNPTi5zdHJpbmdpZnkoZXJyb3JzLCBudWxsLCAyKSk7XG4gIH1cbiAgZXhwZWN0KGVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xufSk7XG4iXX0=