@mavogel/mvc-projen 0.0.24 → 0.0.26

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.
package/README.md CHANGED
@@ -29,7 +29,7 @@ mkdir my-new-construct && cd my-new-construct
29
29
  # 2. set up the project using the projen new command
30
30
  npx projen new \
31
31
  --from @mavogel/mvc-projen@~0 \
32
- --cdkVersion=2.177.0 \
32
+ --cdkVersion=2.261.0 \
33
33
  --package-manager=npm
34
34
  ```
35
35
 
@@ -1,11 +1,27 @@
1
+ import { Stack, Validations } from 'aws-cdk-lib';
1
2
  import { PolicyStatement } from 'aws-cdk-lib/aws-iam';
2
- import { Function } from 'aws-cdk-lib/aws-lambda';
3
+ import { CfnFunction, Function } from 'aws-cdk-lib/aws-lambda';
3
4
  import { CustomResource, Duration, IResource } from 'aws-cdk-lib/core';
4
5
  import { Provider } from 'aws-cdk-lib/custom-resources';
5
- import { NagSuppressions } from 'cdk-nag';
6
6
  import { Construct } from 'constructs';
7
7
  import { CrdExampleFunction } from './crd-example-function';
8
8
 
9
+ // The AWSLambdaBasicExecutionRole ARN pattern is the same for every Lambda
10
+ // function using the default execution role, regardless of the consumer's
11
+ // own construct IDs -- safe to acknowledge literally.
12
+ const AWS_LAMBDA_BASIC_EXECUTION_ROLE_IAM4 =
13
+ 'AwsSolutions-IAM4[Policy::arn:<AWS::Partition>:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole]';
14
+
15
+ // cdk-nag v3's granular IAM4/IAM5 finding ids embed an ARN, which contains
16
+ // its own "::" sequences. Validations.of().acknowledge() rejects any id with
17
+ // more than one "::" (see aws-cdk-lib's Validations.qualifyId), so it can
18
+ // never acknowledge these ARN-based findings. Write the same metadata entry
19
+ // it writes internally, using the public ACKNOWLEDGED_RULES_METADATA_KEY,
20
+ // bypassing only the over-strict id validation.
21
+ function acknowledgeGranularFinding(construct: Construct, id: string, reason: string): void {
22
+ construct.node.addMetadata(Validations.ACKNOWLEDGED_RULES_METADATA_KEY, { [id]: reason });
23
+ }
24
+
9
25
  export interface Secret {
10
26
  username: string;
11
27
  password: string;
@@ -62,21 +78,15 @@ class CustomResourceCrdExample extends CrdExample {
62
78
  memorySize: 128,
63
79
  },
64
80
  );
65
- NagSuppressions.addResourceSuppressions(
66
- [onEvent],
67
- [
68
- {
69
- id: 'AwsSolutions-IAM4',
70
- reason:
71
- 'For this event handler we do not need to restrict managed policies',
72
- },
73
- {
74
- id: 'AwsSolutions-L1',
75
- reason: 'For this lambda the latest runtime is not needed',
76
- },
77
- ],
78
- true,
81
+ acknowledgeGranularFinding(
82
+ onEvent,
83
+ AWS_LAMBDA_BASIC_EXECUTION_ROLE_IAM4,
84
+ 'For this event handler we do not need to restrict managed policies',
79
85
  );
86
+ Validations.of(onEvent).acknowledge({
87
+ id: 'AwsSolutions-L1',
88
+ reason: 'For this lambda the latest runtime is not needed',
89
+ });
80
90
 
81
91
  onEvent.addToRolePolicy(
82
92
  new PolicyStatement({
@@ -88,25 +98,26 @@ class CustomResourceCrdExample extends CrdExample {
88
98
  const provider = new Provider(scope, 'SecretRetrieveProvider', {
89
99
  onEventHandler: onEvent,
90
100
  });
91
- NagSuppressions.addResourceSuppressions(
92
- [provider],
93
- [
94
- {
95
- id: 'AwsSolutions-IAM4',
96
- reason:
97
- 'For this provider we do not need to restrict managed policies',
98
- },
99
- {
100
- id: 'AwsSolutions-IAM5',
101
- reason: 'For this provider wildcards are fine',
102
- },
103
- {
104
- id: 'AwsSolutions-L1',
105
- reason: 'For this provider the latest runtime is not needed',
106
- },
107
- ],
108
- true,
101
+ acknowledgeGranularFinding(
102
+ provider,
103
+ AWS_LAMBDA_BASIC_EXECUTION_ROLE_IAM4,
104
+ 'For this provider we do not need to restrict managed policies',
105
+ );
106
+ // cdk-nag v3 requires the exact granular finding id (no prefix/bulk
107
+ // suppression) -- resolve onEvent's CloudFormation logical id at
108
+ // synth time instead of hardcoding it, since it depends on whatever
109
+ // construct id the consumer gives their Placeholder-like construct.
110
+ const onEventLogicalId = Stack.of(onEvent).getLogicalId(
111
+ onEvent.node.defaultChild as CfnFunction,
109
112
  );
113
+ Validations.of(provider).acknowledge({
114
+ id: `AwsSolutions-IAM5[Resource::<${onEventLogicalId}.Arn>:*]`,
115
+ reason: 'For this provider wildcards are fine',
116
+ });
117
+ Validations.of(provider).acknowledge({
118
+ id: 'AwsSolutions-L1',
119
+ reason: 'For this provider the latest runtime is not needed',
120
+ });
110
121
 
111
122
  const resource = new CustomResource(
112
123
  scope,
@@ -1,6 +1,5 @@
1
- import { Aspects, CfnOutput, IAspect, Tags } from 'aws-cdk-lib';
1
+ import { Aspects, CfnOutput, IAspect, Tags, Validations } from 'aws-cdk-lib';
2
2
  import * as ec2 from 'aws-cdk-lib/aws-ec2';
3
- import { NagSuppressions } from 'cdk-nag';
4
3
  import { Construct, IConstruct } from 'constructs';
5
4
  import { CrdExample } from './crd-example/crd-example';
6
5
 
@@ -56,16 +55,10 @@ export class Placeholder extends Construct {
56
55
  enableDnsHostnames: true,
57
56
  enableDnsSupport: true,
58
57
  });
59
- NagSuppressions.addResourceSuppressions(
60
- [vpc],
61
- [
62
- {
63
- id: 'AwsSolutions-VPC7',
64
- reason: 'For this tmp vpc we do not need flow logs',
65
- },
66
- ],
67
- true,
68
- );
58
+ Validations.of(vpc).acknowledge({
59
+ id: 'AwsSolutions-VPC7',
60
+ reason: 'For this tmp vpc we do not need flow logs',
61
+ });
69
62
 
70
63
  // crd example
71
64
  // Have a custom resource to pass the secret data on? -> yes because not resolvable on compile time
@@ -1,5 +1,6 @@
1
- import { App, Aspects, Stack } from 'aws-cdk-lib';
2
- import { Annotations, Match } from 'aws-cdk-lib/assertions';
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { App, Stack, Validations } from 'aws-cdk-lib';
3
4
  import { AwsSolutionsChecks } from 'cdk-nag';
4
5
  import { Placeholder } from '../src';
5
6
 
@@ -10,7 +11,7 @@ describe('placeholder-nag-AwsSolutions-Pack', () => {
10
11
  // do not modify the state of the application
11
12
  beforeAll(() => {
12
13
  // GIVEN
13
- app = new App();
14
+ app = new App({ context: { '@aws-cdk/core:validationReportJson': true } });
14
15
  stack = new Stack(app, 'testStack', {
15
16
  env: {
16
17
  region: 'us-east-1',
@@ -21,31 +22,22 @@ describe('placeholder-nag-AwsSolutions-Pack', () => {
21
22
  new Placeholder(stack, 'Placeholder', {
22
23
  placeholder: 'placeholder',
23
24
  });
24
- // suppressCommonNags(stack);
25
25
 
26
26
  // WHEN
27
- Aspects.of(stack).add(new AwsSolutionsChecks({ verbose: true }));
27
+ Validations.of(app).addPlugins(new AwsSolutionsChecks(app, { verbose: true }));
28
28
  });
29
29
 
30
30
  // THEN
31
- test('No unsuppressed Warnings', () => {
32
- const warnings = Annotations.fromStack(stack).findWarning(
33
- '*',
34
- Match.stringLikeRegexp('AwsSolutions-.*'),
35
- );
36
- expect(warnings).toHaveLength(0);
37
- });
38
-
39
- test('No unsuppressed Errors', () => {
40
- const errors = Annotations.fromStack(stack).findError(
41
- '*',
42
- Match.stringLikeRegexp('AwsSolutions-.*'),
43
- );
44
- if (errors.length > 0) {
45
- for (const error of errors) {
46
- console.log(`id: '${error.id}': ${error.entry.data}`);
47
- }
48
- }
49
- expect(errors).toHaveLength(0);
31
+ // cdk-nag v3 reports violations via a policy-validation-report.json in the
32
+ // cloud assembly rather than throwing on app.synth() -- read it directly.
33
+ test('produces no unacknowledged AwsSolutions violations', () => {
34
+ const assembly = app.synth();
35
+ const reportPath = path.join(assembly.directory, 'policy-validation-report.json');
36
+ const violations = fs.existsSync(reportPath)
37
+ ? JSON.parse(fs.readFileSync(reportPath, 'utf-8')).pluginReports.flatMap(
38
+ (report: { violations?: unknown[] }) => report.violations ?? [],
39
+ )
40
+ : [];
41
+ expect(violations).toHaveLength(0);
50
42
  });
51
43
  });
@@ -1,35 +1,72 @@
1
1
  "use strict";
2
- var _a;
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
3
35
  Object.defineProperty(exports, "__esModule", { value: true });
4
36
  exports.MvcCdkConstructLibrary = void 0;
5
37
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
- const fs = require("fs");
7
- const path = require("path");
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
8
40
  const projen_1 = require("projen");
9
41
  const awscdk_1 = require("projen/lib/awscdk");
10
42
  const github_1 = require("projen/lib/github");
11
43
  // Set the minimum node version for AWS CDK and the GitHub actions workflow
12
44
  const nodeVersion = '24.x';
13
45
  const lambdaNodeVersion = awscdk_1.LambdaRuntime.NODEJS_24_X;
14
- // The last CDK version for which @aws-cdk/integ-runner was published.
15
- // integ-runner uses plain versions (no -alpha.0 suffix) and stopped publishing after this version.
46
+ // The last @aws-cdk/integ-runner version verified against npm (checked 2026-07-21).
47
+ // integ-runner uses plain versions (no -alpha.0 suffix) and has historically lagged
48
+ // or stopped tracking aws-cdk-lib's version for stretches of time.
16
49
  // @aws-cdk/integ-tests-alpha and awslint continue to publish and track CDK versions.
17
- const LAST_INTEG_RUNNER_VERSION = '2.197.12';
50
+ // SHORTCUT: hardcoded cap requires manual re-verification -- run
51
+ // `npm view @aws-cdk/integ-runner versions --json` and bump this if aws-cdk-lib
52
+ // has released newer versions than this one.
53
+ const LAST_INTEG_RUNNER_VERSION = '2.203.0';
18
54
  /**
19
55
  * TypeScript library
20
56
  *
21
57
  * @pjid mvc-awscdk-construct
22
58
  */
23
59
  class MvcCdkConstructLibrary extends awscdk_1.AwsCdkConstructLibrary {
60
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@mavogel/mvc-projen.MvcCdkConstructLibrary", version: "0.0.26" };
24
61
  constructor(options) {
25
62
  const baseAssetsDirectory = options.baseAssetsDirectory ?? `${process.cwd()}/node_modules/@mavogel/mvc-projen/assets`;
26
63
  const integTestRegions = options.integTestRegions ?? ['eu-west-1', 'eu-west-2'];
27
64
  super({
28
65
  authorOrganization: true,
29
66
  copyrightOwner: 'MV Consulting GmbH',
30
- copyrightPeriod: '2025',
31
67
  license: 'Apache-2.0',
32
- jsiiVersion: '~5.9.0',
68
+ jsiiVersion: '~6.0.0',
69
+ typescriptVersion: '^6.0.2',
33
70
  minNodeVersion: nodeVersion,
34
71
  workflowNodeVersion: nodeVersion,
35
72
  stability: 'experimental',
@@ -153,7 +190,7 @@ The following steps get you started:
153
190
 
154
191
  1. Create a new \`awscdk-app\` via
155
192
  \`\`\`bash
156
- npx projen new awscdk-app-ts --cdkVersion=2.177.0 --package-manager=npm
193
+ npx projen new awscdk-app-ts --cdkVersion=2.261.0 --package-manager=npm
157
194
  \`\`\`
158
195
  3. Add \`@mavogel/${options.name}\` as a dependency to your project in the \`.projenrc.ts\` file
159
196
  4. Run \`npx projen\` to install it
@@ -233,7 +270,9 @@ add tools or links which inspired you
233
270
  for (const file of filesPatternToGitignore) {
234
271
  this.gitignore.exclude(file);
235
272
  }
236
- this.addDeps('cdk-nag@^2.37.55');
273
+ this.addDeps(
274
+ // cdk-nag v3 requires aws-cdk-lib >= 2.257.0 (see cdk-nag MIGRATION.md)
275
+ 'cdk-nag@^3.0.1');
237
276
  // Cap integ-runner at LAST_INTEG_RUNNER_VERSION since it stopped publishing after that version.
238
277
  // integ-runner uses plain versions (no -alpha.0 suffix).
239
278
  // integ-tests-alpha and awslint only publish at minor versions (e.g. 2.197.0-alpha.0, not 2.197.4-alpha.0).
@@ -301,9 +340,9 @@ add tools or links which inspired you
301
340
  }
302
341
  }
303
342
  exports.MvcCdkConstructLibrary = MvcCdkConstructLibrary;
304
- _a = JSII_RTTI_SYMBOL_1;
305
- MvcCdkConstructLibrary[_a] = { fqn: "@mavogel/mvc-projen.MvcCdkConstructLibrary", version: "0.0.24" };
306
343
  class SampleCode extends projen_1.Component {
344
+ library;
345
+ options;
307
346
  constructor(library, options) {
308
347
  super(library);
309
348
  this.library = library;
@@ -369,4 +408,4 @@ class SampleCode extends projen_1.Component {
369
408
  fs.writeFileSync(path.join(examplesdir, 'main.ts'), fs.readFileSync(`${this.options.baseAssetsDirectory}/cdk-construct/examples_simple_main.ts`).toString());
370
409
  }
371
410
  }
372
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNvbnN0cnVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0cy9jZGstY29uc3RydWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUU3QixtQ0FBc0Y7QUFDdEYsOENBQXlHO0FBQ3pHLDhDQUErRDtBQUcvRCwyRUFBMkU7QUFDM0UsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDO0FBQzNCLE1BQU0saUJBQWlCLEdBQUcsc0JBQWEsQ0FBQyxXQUFXLENBQUM7QUFFcEQsc0VBQXNFO0FBQ3RFLG1HQUFtRztBQUNuRyxxRkFBcUY7QUFDckYsTUFBTSx5QkFBeUIsR0FBRyxVQUFVLENBQUM7QUFxQjdDOzs7O0dBSUc7QUFDSCxNQUFhLHNCQUF1QixTQUFRLCtCQUFzQjtJQUVoRSxZQUFZLE9BQXNDO1FBQ2hELE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSwwQ0FBMEMsQ0FBQztRQUN0SCxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUVoRixLQUFLLENBQUM7WUFDSixrQkFBa0IsRUFBRSxJQUFJO1lBQ3hCLGNBQWMsRUFBRSxvQkFBb0I7WUFDcEMsZUFBZSxFQUFFLE1BQU07WUFDdkIsT0FBTyxFQUFFLFlBQVk7WUFDckIsV0FBVyxFQUFFLFFBQVE7WUFDckIsY0FBYyxFQUFFLFdBQVc7WUFDM0IsbUJBQW1CLEVBQUUsV0FBVztZQUNoQyxTQUFTLEVBQUUsY0FBYztZQUN6QixZQUFZLEVBQUUsSUFBSTtZQUNsQixjQUFjLEVBQUUsbUJBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHO1lBQ2pELFNBQVMsRUFBRSxtQkFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNO1lBQ3RDLGFBQWEsRUFBRTtnQkFDYixPQUFPLEVB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Q0FBQyxDQUFDO1FBQzVELElBQ0UsRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7WUFDMUIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsRUFDaEUsQ0FBQztZQUNELE9BQU87UUFDVCxDQUFDO1FBQ0QsRUFBRSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvQyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQix3Q0FBd0MsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDL0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHsgQ29tcG9uZW50LCBqYXZhc2NyaXB0LCBSZWxlYXNhYmxlQ29tbWl0cywgVGV4dEZpbGUsIFlhbWxGaWxlIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IEF3c0Nka0NvbnN0cnVjdExpYnJhcnksIEF3c0Nka0NvbnN0cnVjdExpYnJhcnlPcHRpb25zLCBMYW1iZGFSdW50aW1lIH0gZnJvbSAncHJvamVuL2xpYi9hd3NjZGsnO1xuaW1wb3J0IHsgRGVwZW5kYWJvdFNjaGVkdWxlSW50ZXJ2YWwgfSBmcm9tICdwcm9qZW4vbGliL2dpdGh1Yic7XG5pbXBvcnQgeyBKb2JTdGVwIH0gZnJvbSAncHJvamVuL2xpYi9naXRodWIvd29ya2Zsb3dzLW1vZGVsJztcblxuLy8gU2V0IHRoZSBtaW5pbXVtIG5vZGUgdmVyc2lvbiBmb3IgQVdTIENESyBhbmQgdGhlIEdpdEh1YiBhY3Rpb25zIHdvcmtmbG93XG5jb25zdCBub2RlVmVyc2lvbiA9ICcyNC54JztcbmNvbnN0IGxhbWJkYU5vZGVWZXJzaW9uID0gTGFtYmRhUnVudGltZS5OT0RFSlNfMjRfWDtcblxuLy8gVGhlIGxhc3QgQ0RLIHZlcnNpb24gZm9yIHdoaWNoIEBhd3MtY2RrL2ludGVnLXJ1bm5lciB3YXMgcHVibGlzaGVkLlxuLy8gaW50ZWctcnVubmVyIHVzZXMgcGxhaW4gdmVyc2lvbnMgKG5vIC1hbHBoYS4wIHN1ZmZpeCkgYW5kIHN0b3BwZWQgcHVibGlzaGluZyBhZnRlciB0aGlzIHZlcnNpb24uXG4vLyBAYXdzLWNkay9pbnRlZy10ZXN0cy1hbHBoYSBhbmQgYXdzbGludCBjb250aW51ZSB0byBwdWJsaXNoIGFuZCB0cmFjayBDREsgdmVyc2lvbnMuXG5jb25zdCBMQVNUX0lOVEVHX1JVTk5FUl9WRVJTSU9OID0gJzIuMTk3LjEyJztcblxuLyoqXG4gKiBUaGUgb3B0aW9ucyBmb3IgdGhlIGNvbnN0cnVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE12Y0Nka0NvbnN0cnVjdExpYnJhcnlPcHRpb25zIGV4dGVuZHMgQXdzQ2RrQ29uc3RydWN0TGlicmFyeU9wdGlvbnMge1xuICAvKipcbiAgICogQmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBhc3NldHNcbiAgICpcbiAgICogQGRlZmF1bHQgJHtwcm9jZXNzLmN3ZCgpfS9ub2RlX21vZHVsZXMvbXZjLXByb2plbi9hc3NldHNcbiAgICovXG4gIHJlYWRvbmx5IGJhc2VBc3NldHNEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb25zIHRvIHJ1biB0aGUgaW50ZWcgdGVzdHMgaW5cbiAgICpcbiAgICogQGRlZmF1bHQgZXUtd2VzdC0xIGFuZCBldS13ZXN0LTJcbiAgICovXG4gIHJlYWRvbmx5IGludGVnVGVzdFJlZ2lvbnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUeXBlU2NyaXB0IGxpYnJhcnlcbiAqXG4gKiBAcGppZCBtdmMtYXdzY2RrLWNvbnN0cnVjdFxuICovXG5leHBvcnQgY2xhc3MgTXZjQ2RrQ29uc3RydWN0TGlicmFyeSBleHRlbmRzIEF3c0Nka0NvbnN0cnVjdExpYnJhcnkge1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE12Y0Nka0NvbnN0cnVjdExpYnJhcnlPcHRpb25zKSB7XG4gICAgY29uc3QgYmFzZUFzc2V0c0RpcmVjdG9yeSA9IG9wdGlvbnMuYmFzZUFzc2V0c0RpcmVjdG9yeSA/PyBgJHtwcm9jZXNzLmN3ZCgpfS9ub2RlX21vZHVsZXMvQG1hdm9nZWwvbXZjLXByb2plbi9hc3NldHNgO1xuICAgIGNvbnN0IGludGVnVGVzdFJlZ2lvbnMgPSBvcHRpb25zLmludGVnVGVzdFJlZ2lvbnMgPz8gWydldS13ZXN0LTEnLCAnZXUtd2VzdC0yJ107XG5cbiAgICBzdXBlcih7XG4gICAgICBhdXRob3JPcmdhbml6YXRpb246IHRydWUsXG4gICAgICBjb3B5cmlnaHRPd25lcjogJ01WIENvbnN1bHRpbmcgR21iSCcsXG4gICAgICBjb3B5cmlnaHRQZXJpb2Q6ICcyMDI1JyxcbiAgICAgIGxpY2Vuc2U6ICdBcGFjaGUtMi4wJyxcbiAgICAgIGpzaWlWZXJzaW9uOiAnfjUuOS4wJyxcbiAgICAgIG1pbk5vZGVWZXJzaW9uOiBub2RlVmVyc2lvbixcbiAgICAgIHdvcmtmbG93Tm9kZVZlcnNpb246IG5vZGVWZXJzaW9uLFxuICAgICAgc3RhYmlsaXR5OiAnZXhwZXJpbWVudGFsJyxcbiAgICAgIHJlbGVhc2VUb05wbTogdHJ1ZSxcbiAgICAgIHBhY2thZ2VNYW5hZ2VyOiBqYXZhc2NyaXB0Lk5vZGVQYWNrYWdlTWFuYWdlci5OUE0sXG4gICAgICBucG1BY2Nlc3M6IGphdmFzY3JpcHQuTnBtQWNjZXNzLlBVQkxJQyxcbiAgICAgIGxhbWJkYU9wdGlvbnM6IHtcbiAgICAgICAgcnVudGltZTogbGFtYmRhTm9kZVZlcnNpb24sXG4gICAgICAgIGF3c1Nka0Nvbm5lY3Rpb25SZXVzZTogZmFsc2UsIC8vIGRvZXNuJ3QgZXhpc3QgaW4gQVdTIFNESyBKUyB2M1xuICAgICAgfSxcbiAgICAgIGF1dG9BcHByb3ZlT3B0aW9uczoge1xuICAgICAgICBhbGxvd2VkVXNlcm5hbWVzOiBbXG4gICAgICAgICAgJ2RlcGVuZGFib3QnLFxuICAgICAgICAgICdkZXBlbmRhYm90W2JvdF0nLFxuICAgICAgICAgICdnaXRodWItYm90JyxcbiAgICAgICAgICAnZ2l0aHViLWFjdGlvbnNbYm90XScsXG4gICAgICAgICAgJ212Yy1ib3QnLFxuICAgICAgICBdLFxuICAgICAgICAvLyBUaGUgbmFtZSBvZiB0aGUgc2VjcmV0IHRoYXQgaGFzIHRoZSBHaXRIdWIgUEFUIGZvciBhdXRvLWFwcHJvdmluZyBQUnMgd2l0aCBwZXJtaXNzaW9ucyByZXBvLCB3b3JrZmxvdywgd3JpdGU6cGFja2FnZXNcbiAgICAgICAgLy8gR2VuZXJhdGUgYSBuZXcgUEFUIChodHRwczovL2dpdGh1Yi5jb20vc2V0dGluZ3MvdG9rZW5zL25ldykgYW5kIGFkZCBpdCB0byB5b3VyIHJlcG8ncyBzZWNyZXRzXG4gICAgICAgIC8vIE5PVEU6IGNvbWVzIGZyb20gTVYtQ29uc3VsdGluZyBPcmdcbiAgICAgICAgc2VjcmV0OiAnUFJPSkVOX0dJVEhVQl9UT0tFTicsXG4gICAgICB9LFxuICAgICAgZGVwZW5kYWJvdDogdHJ1ZSxcbiAgICAgIGRlcGVuZGFib3RPcHRpb25zOiB7XG4gICAgICAgIHNjaGVkdWxlSW50ZXJ2YWw6IERlcGVuZGFib3RTY2hlZHVsZUludGVydmFsLldFRUtMWSxcbiAgICAgICAgbGFiZWxzOiBbJ2RlcGVuZGVuY2llcycsICdhdXRvLWFwcHJvdmUnXSxcbiAgICAgICAgZ3JvdXBzOiB7XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgcGF0dGVybnM6IFsnKiddLFxuICAgICAgICAgICAgZXhjbHVkZVBhdHRlcm5zOiBbJ2F3cy1jZGsqJywgJ3Byb2plbiddLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGlnbm9yZTogW3sgZGVwZW5kZW5jeU5hbWU6ICdhd3MtY2RrLWxpYicgfSwgeyBkZXBlbmRlbmN5TmFtZTogJ2F3cy1jZGsnIH1dLFxuICAgICAgfSxcbiAgICAgIC8vIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvamVuL3Byb2plbi9kaXNjdXNzaW9ucy80MDQwI2Rpc2N1c3Npb25jb21tZW50LTExOTA1NjI4XG4gICAgICByZWxlYXNhYmxlQ29tbWl0czogUmVsZWFzYWJsZUNvbW1pdHMub2ZUeXBlKFtcbiAgICAgICAgJ2ZlYXQnLFxuICAgICAgICAnZml4JyxcbiAgICAgICAgJ2Nob3JlJyxcbiAgICAgICAgJ3JlZmFjdG9yJyxcbiAgICAgICAgJ3BlcmYnLFxuICAgICAgXSksXG4gICAgICBnaXRodWJPcHRpb25zOiB7XG4gICAgICAgIHB1bGxSZXF1ZXN0TGludE9wdGlvbnM6IHtcbiAgICAgICAgICBzZW1hbnRpY1RpdGxlT3B0aW9uczoge1xuICAgICAgICAgICAgLy8gc2VlIGNvbW1pdCB0eXBlcyBoZXJlOiBodHRwczovL3d3dy5jb252ZW50aW9uYWxjb21taXRzLm9yZy9lbi92MS4wLjAvI3N1bW1hcnlcbiAgICAgICAgICAgIHR5cGVzOiBbXG4gICAgICAgICAgICAgICdmZWF0JyxcbiAgICAgICAgICAgICAgJ2ZpeCcsXG4gICAgICAgICAgICAgICdjaG9yZScsXG4gICAgICAgICAgICAgICdyZWZhY3RvcicsXG4gICAgICAgICAgICAgICdwZXJmJyxcbiAgICAgICAgICAgICAgJ2RvY3MnLFxuICAgICAgICAgICAgICAnc3R5bGUnLFxuICAgICAgICAgICAgICAndGVzdCcsXG4gICAgICAgICAgICAgICdidWlsZCcsXG4gICAgICAgICAgICAgICdjaScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdmVyc2lvbnJjT3B0aW9uczoge1xuICAgICAgICB0eXBlczogW1xuICAgICAgICAgIHsgdHlwZTogJ2ZlYXQnLCBzZWN0aW9uOiAnRmVhdHVyZXMnIH0sXG4gICAgICAgICAgeyB0eXBlOiAnZml4Jywgc2VjdGlvbjogJ0J1ZyBGaXhlcycgfSxcbiAgICAgICAgICB7IHR5cGU6ICdjaG9yZScsIHNlY3Rpb246ICdDaG9yZXMnIH0sXG4gICAgICAgICAgeyB0eXBlOiAnZG9jcycsIHNlY3Rpb246ICdEb2NzJyB9LFxuICAgICAgICAgIHsgdHlwZTogJ3N0eWxlJywgaGlkZGVuOiB0cnVlIH0sXG4gICAgICAgICAgeyB0eXBlOiAncmVmYWN0b3InLCBoaWRkZW46IHRydWUgfSxcbiAgICAgICAgICB7IHR5cGU6ICdwZXJmJywgc2VjdGlvbjogJ1BlcmZvcm1hbmNlJyB9LFxuICAgICAgICAgIHsgdHlwZTogJ3Rlc3QnLCBoaWRkZW46IHRydWUgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBlc2xpbnRPcHRpb25zOiB7XG4gICAgICAgIHByZXR0aWVyOiBmYWxzZSxcbiAgICAgICAgZGlyczogWydzcmMnXSxcbiAgICAgICAgaWdub3JlUGF0dGVybnM6IFsnKiovKi1mdW5jdGlvbi50cycsICdleGFtcGxlcy8nXSxcbiAgICAgIH0sXG4gICAgICAvLyBleHBlcmltZW50YWxJbnRlZ1J1bm5lcjogdHJ1ZSxcbiAgICAgIC8vIG1hbnVhbCBpbnRlZyB0ZXN0IHNldHVwXG4gICAgICB0c2NvbmZpZ0Rldjoge1xuICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICB0eXBlczogWydub2RlJywgJ2plc3QnXSxcbiAgICAgICAgfSxcbiAgICAgICAgaW5jbHVkZTogWydpbnRlZy10ZXN0cy8qKi8qLnRzJ10sXG4gICAgICB9LFxuICAgICAgcHVsbFJlcXVlc3RUZW1wbGF0ZUNvbnRlbnRzOiBbZnMucmVhZEZpbGVTeW5jKGAke2Jhc2VBc3NldHNEaXJlY3Rvcnl9L2NvbW1vbi9naXRodWJfcHVsbF9yZXF1ZXN0Lm1kYCkudG9TdHJpbmcoKV0sXG4gICAgICAvLyBOT1RFOiBpc3N1ZSB0ZW1wbGF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Byb2plbi9wcm9qZW4vcHVsbC8zNjQ4XG4gICAgICAvLyBpc3N1ZVRlbXBsYXRlczoge31cbiAgICAgIHJlYWRtZToge1xuICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgIGBcbiFbU291cmNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9zdGFycy9NVi1Db25zdWx0aW5nLyR7b3B0aW9ucy5uYW1lfT9sb2dvPWdpdGh1YiZsYWJlbD1HaXRIdWIlMjBTdGFycylcblshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly9naXRodWIuY29tL01WLUNvbnN1bHRpbmcvJHtvcHRpb25zLm5hbWV9L2FjdGlvbnMvd29ya2Zsb3dzL2J1aWxkLnltbC9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vTVYtQ29uc3VsdGluZy8ke29wdGlvbnMubmFtZX0vYWN0aW9ucy93b3JrZmxvd3MvYnVpbGQueW1sKVxuWyFbRVNMaW50IENvZGUgRm9ybWF0dGluZ10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9jb2RlX3N0eWxlLWVzbGludC1icmlnaHRncmVlbi5zdmcpXShodHRwczovL2VzbGludC5vcmcpXG5bIVtMYXRlc3QgcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9naXRodWIvcmVsZWFzZS9NVi1Db25zdWx0aW5nLyR7b3B0aW9ucy5uYW1lfS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vTVYtQ29uc3VsdGluZy8ke29wdGlvbnMubmFtZX0vcmVsZWFzZXMpXG4hW0dpdEh1Yl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9naXRodWIvbGljZW5zZS9NVi1Db25zdWx0aW5nLyR7b3B0aW9ucy5uYW1lfSlcblshW25wbV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9ucG0vZHQvQG1hdm9nZWwvJHtvcHRpb25zLm5hbWV9P2xhYmVsPW5wbSZjb2xvcj1vcmFuZ2UpXShodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9AbWF2b2dlbC8ke29wdGlvbnMubmFtZX0pXG5bIVt0eXBlc2NyaXB0XShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL2pzaWktdHlwZXNjcmlwdC1ibHVldmlvbGV0LnN2ZyldKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0BtYXZvZ2VsLyR7b3B0aW9ucy5uYW1lfSlcbiAgICAgICAgICBgLFxuICAgICAgICAgIGAjICR7b3B0aW9ucy5uYW1lfWAsXG4gICAgICAgICAgJ015IGF3ZXNvbWUgZGVzY3JpcHRpb24uLi4nLFxuICAgICAgICAgIGBcbiMjIFRhYmxlIG9mIENvbnRlbnRzXG5cbi0gW0ZlYXR1cmVzXSgjZmVhdHVyZXMpXG4tIFtVc2FnZV0oI3VzYWdlKVxuLSBbU29sdXRpb24gRGVzaWduXSgjc29sdXRpb24tZGVzaWduKVxuLSBbSW5zcGlyYXRpb25dKCNpbnNwaXJhdGlvbilcblxuIyMgRmVhdHVyZXNcblxuLSDimqEgKipRdWljayBTZXR1cCoqOiBUQkRcbi0g8J+TjyAqKkJlc3QgUHJhY3RpY2UgU2V0dXAqKjogVEJEXG4tIPCfpLnigI3imYLvuI8gKipQcmUtaW5zdGFsbGVkIHBhY2thZ2VzKio6IFRCRFxuLSDwn4+X77iPICoqRXh0ZW5zaWJpbGl0eSoqOiBUQkRcblxuIyMgVXNhZ2VcblRoZSBmb2xsb3dpbmcgc3RlcHMgZ2V0IHlvdSBzdGFydGVkOlxuXG4xLiBDcmVhdGUgYSBuZXcgXFxgYXdzY2RrLWFwcFxcYCB2aWFcblxcYFxcYFxcYGJhc2hcbm5weCBwcm9qZW4gbmV3IGF3c2Nkay1hcHAtdHMgLS1jZGtWZXJzaW9uPTIuMTc3LjAgLS1wYWNrYWdlLW1hbmFnZXI9bnBtXG5cXGBcXGBcXGBcbjMuIEFkZCBcXGBAbWF2b2dlbC8ke29wdGlvbnMubmFtZX1cXGAgYXMgYSBkZXBlbmRlbmN5IHRvIHlvdXIgcHJvamVjdCBpbiB0aGUgXFxgLnByb2plbnJjLnRzXFxgIGZpbGVcbjQuIFJ1biBcXGBucHggcHJvamVuXFxgIHRvIGluc3RhbGwgaXRcbjUuIEFkZCB0aGUgZm9sbG93aW5nIHRvIHRoZSBcXGBzcmMvbWFpbi50c1xcYCBmaWxlOlxuXFxgXFxgXFxgdHNcbmltcG9ydCB7IEFwcCwgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IFBsYWNlaG9sZGVyIH0gZnJvbSAnQG1hdm9nZWwvJHtvcHRpb25zLm5hbWV9JztcblxuZXhwb3J0IGNsYXNzIE15U3RhY2sgZXh0ZW5kcyBTdGFjayB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTdGFja1Byb3BzID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIG5ldyBQbGFjZWhvbGRlcih0aGlzLCAncGxhY2Vob2xkZXInLCB7XG4gICAgICAvLyBhbmQgbW9yZS4uLiDwn5KhXG4gICAgfSk7XG4gIH1cbn1cblxuY29uc3QgZW52ID0ge1xuICBhY2NvdW50OiAnMTIzNDU2Nzg5OTEyJyxcbiAgcmVnaW9uOiAnZXUtY2VudHJhbC0xJyxcbn07XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbm5ldyBNeVN0YWNrKGFwcCwgJ3BsYWNlaG9sZGVyJywgeyBlbnYgfSk7XG5hcHAuc3ludGgoKTtcblxcYFxcYFxcYFxuXG5hbmQgZGVwbG95IGl0XG5cXGBcXGBcXGBiYXNoXG5ucHggcHJvamVuIGJ1aWxkXG5ucHggcHJvamVuIGRlcGxveVxuXFxgXFxgXFxgXG5cbndpdGggdGhlIG91dHB1dFxuXFxgXFxgXFxgY29uc29sZVxuVEJEXG5cXGBcXGBcXGBcblxuU2VlIHRoZSBbZXhhbXBsZXNdKC4vZXhhbXBsZXMpIGZvbGRlciBmb3IgbW9yZSBpbnNwaXJhdGlvbi5cblxuIyMgU29sdXRpb24gRGVzaWduXG5cbjxkZXRhaWxzPlxuICA8c3VtbWFyeT4uLi4gaWYgeW91J3JlIGN1cmlvdXMgYWJvdXQgY2xpY2sgaGVyZSBmb3IgdGhlIGRldGFpbHM8L3N1bW1hcnk+XG5cbiFbcGxhY2Vob2xkZXJdKGRvY3MvaW1nL3BsYWNlaG9sZGVyLmRyYXdpby1taW4ucG5nKVxuXG48L2RldGFpbHM+XG5cbiMjIEluc3BpcmF0aW9uXG5cbmFkZCB0b29scyBvciBsaW5rcyB3aGljaCBpbnNwaXJlZCB5b3VcbiAgICAgICAgICBgLFxuICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhgJHtiYXNlQXNzZXRzRGlyZWN0b3J5fS9jb21tb24vZ2l0aHViX3JlYWRtZV9jdGEubWRgKS50b1N0cmluZygpLFxuICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgfSxcbiAgICAgIC8vIE5PVEU6IGtlZXAgYWxsIHRoZSBwYXNzZWQgaW4gb3B0aW9ucyB3aGljaCBjYW4gb3ZlcnJpZGUgdGhlIGV4aXN0aW5nIG9uZXMhXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuXG4gICAgLy8gVHlwZVNjcmlwdCA2IG5vIGxvbmdlciBhdXRvLWRpc2NvdmVycyBAdHlwZXMvKiBwYWNrYWdlc1xuICAgIHRoaXMudHNjb25maWdEZXYuZmlsZS5hZGRPdmVycmlkZSgnY29tcGlsZXJPcHRpb25zLnR5cGVzJywgWydub2RlJywgJ2plc3QnXSk7XG4gICAgdGhpcy50c2NvbmZpZz8uZmlsZS5hZGRPdmVycmlkZSgnY29tcGlsZXJPcHRpb25zLnR5cGVzJywgWydub2RlJ10pO1xuXG4gICAgLy8gcHJvamVuJ3MgQXV0b01lcmdlIGNvbXBvbmVudCBoYXJkY29kZXMgYGRlbGV0ZV9oZWFkX2JyYW5jaDoge31gIGluIHRoZVxuICAgIC8vIG1lcmdpZnkgcnVsZSB3aXRoIG5vIG9wdGlvbiB0byBkaXNhYmxlIGl0LiBTdHJpcCBpdCBzbyBNZXJnaWZ5IGRvZXMgbm90XG4gICAgLy8gZGVsZXRlIGhlYWQgYnJhbmNoZXMgb24gbWVyZ2UgKHJlbm92YXRlL2RlcGVuZGFib3QgbWFuYWdlIHRoZWlyIG93bikuXG4gICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9NVi1Db25zdWx0aW5nL2Nkay12c2NvZGUtc2VydmVyL3B1bGwvMTEyXG4gICAgdGhpcy50cnlGaW5kT2JqZWN0RmlsZSgnLm1lcmdpZnkueW1sJyk/LmFkZERlbGV0aW9uT3ZlcnJpZGUoXG4gICAgICAncHVsbF9yZXF1ZXN0X3J1bGVzLjAuYWN0aW9ucy5kZWxldGVfaGVhZF9icmFuY2gnLFxuICAgICk7XG5cbiAgICAvLyBnaXRpZ25vcmVcbiAgICBjb25zdCBmaWxlc1BhdHRlcm5Ub0dpdGlnbm9yZSA9IFtcbiAgICAgICd0bXAnLFxuICAgICAgJy5jb2RlZ3B0JyxcbiAgICBdO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlc1BhdHRlcm5Ub0dpdGlnbm9yZSkge1xuICAgICAgdGhpcy5naXRpZ25vcmUuZXhjbHVkZShmaWxlKTtcbiAgICB9XG4gICAgdGhpcy5hZGREZXBzKFxuICAgICAgJ2Nkay1uYWdAXjIuMzcuNTUnLFxuICAgICk7XG4gICAgLy8gQ2FwIGludGVnLXJ1bm5lciBhdCBMQVNUX0lOVEVHX1JVTk5FUl9WRVJTSU9OIHNpbmNlIGl0IHN0b3BwZWQgcHVibGlzaGluZyBhZnRlciB0aGF0IHZlcnNpb24uXG4gICAgLy8gaW50ZWctcnVubmVyIHVzZXMgcGxhaW4gdmVyc2lvbnMgKG5vIC1hbHBoYS4wIHN1ZmZpeCkuXG4gICAgLy8gaW50ZWctdGVzdHMtYWxwaGEgYW5kIGF3c2xpbnQgb25seSBwdWJsaXNoIGF0IG1pbm9yIHZlcnNpb25zIChlLmcuIDIuMTk3LjAtYWxwaGEuMCwgbm90IDIuMTk3LjQtYWxwaGEuMCkuXG4gICAgY29uc3QgcmF3Q2RrVmVyc2lvbiA9IHRoaXMuY2RrVmVyc2lvbi5yZXBsYWNlKC9bXFxefl0vLCAnJyk7XG4gICAgY29uc3QgaW50ZWdSdW5uZXJWZXJzaW9uID0gcmF3Q2RrVmVyc2lvbi5sb2NhbGVDb21wYXJlKExBU1RfSU5URUdfUlVOTkVSX1ZFUlNJT04sIHVuZGVmaW5lZCwgeyBudW1lcmljOiB0cnVlLCBzZW5zaXRpdml0eTogJ2Jhc2UnIH0pID4gMFxuICAgICAgPyBMQVNUX0lOVEVHX1JVTk5FUl9WRVJTSU9OXG4gICAgICA6IHJhd0Nka1ZlcnNpb247XG4gICAgLy8gQWxwaGEgcGFja2FnZXMgb25seSBwdWJsaXNoIGF0IC4wIHBhdGNoIHZlcnNpb25zIOKAlCBub3JtYWxpemUgdG8gbWlub3IgdmVyc2lvblxuICAgIGNvbnN0IFttYWpvciwgbWlub3JdID0gcmF3Q2RrVmVyc2lvbi5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGFscGhhVmVyc2lvbiA9IGAke21ham9yfS4ke21pbm9yfS4wYDtcbiAgICB0aGlzLmFkZERldkRlcHMoXG4gICAgICBgQGF3cy1jZGsvaW50ZWctcnVubmVyQCR7aW50ZWdSdW5uZXJWZXJzaW9ufWAsXG4gICAgICBgQGF3cy1jZGsvaW50ZWctdGVzdHMtYWxwaGFAJHthbHBoYVZlcnNpb259LWFscGhhLjBgLFxuICAgICAgJ0Bjb21taXRsaW50L2NsaUBeMjAuMS4wJyxcbiAgICAgICdAY29tbWl0bGludC9jb25maWctY29udmVudGlvbmFsQF4yMC4wLjAnLFxuICAgICAgYGF3c2xpbnRAJHthbHBoYVZlcnNpb259LWFscGhhLjBgLFxuICAgICAgJ2h1c2t5QF45LjEuNycsXG4gICAgKTtcblxuICAgIHRoaXMucGFja2FnZS5zZXRTY3JpcHQoJ3ByZXBhcmUnLCAnaHVza3knKTtcbiAgICBuZXcgVGV4dEZpbGUodGhpcywgJy5jb21taXRsaW50cmMuanMnLCB7XG4gICAgICBsaW5lczogW1xuICAgICAgICAnbW9kdWxlLmV4cG9ydHMgPSB7IGV4dGVuZHM6IFtcXCdAY29tbWl0bGludC9jb25maWctY29udmVudGlvbmFsXFwnXSB9OycsXG4gICAgICBdLFxuICAgICAgbWFya2VyOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5wYWNrYWdlLnNldFNjcmlwdCgnYXdzbGludCcsICdhd3NsaW50Jyk7XG4gICAgLy8gLmdpdGh1Yi93b3JrZmxvd3MvYnVpbGQueW1sXG4gICAgY29uc3QgYnVpbGRXb3JrZmxvdyA9IHRoaXMuZ2l0aHViPy50cnlGaW5kV29ya2Zsb3coJ2J1aWxkJyk7XG4gICAgaWYgKCFidWlsZFdvcmtmbG93KSByZXR1cm47XG4gICAgY29uc3QgYnVpbGRKb2IgPSBidWlsZFdvcmtmbG93LmdldEpvYignYnVpbGQnKTtcbiAgICBpZiAoIWJ1aWxkSm9iIHx8ICEoJ3N0ZXBzJyBpbiBidWlsZEpvYikpIHJldHVybjtcbiAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IHdoeSB3cm9uZyB0eXBlc1xuICAgIGNvbnN0IGdldEJ1aWxkU3RlcHMgPSBidWlsZEpvYi5zdGVwcyBhcyB1bmtub3duIGFzICgpID0+IEpvYlN0ZXBbXTtcbiAgICBjb25zdCBidWlsZEpvYlN0ZXBzID0gZ2V0QnVpbGRTdGVwcygpO1xuICAgIGJ1aWxkV29ya2Zsb3cudXBkYXRlSm9iKCdidWlsZCcsIHtcbiAgICAgIC4uLmJ1aWxkSm9iLFxuICAgICAgc3RlcHM6IFtcbiAgICAgICAgLi4uYnVpbGRKb2JTdGVwcy5zbGljZSgwLCA0KSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdSdW4gYXdzbGludCcsXG4gICAgICAgICAgcnVuOiAnbnBtIHJ1biBhd3NsaW50JyxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uYnVpbGRKb2JTdGVwcy5zbGljZSg0KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhY2thZ2Uuc2V0U2NyaXB0KFxuICAgICAgJ2ludGVnLXRlc3QnLFxuICAgICAgYGludGVnLXJ1bm5lciAtLWRpcmVjdG9yeSAuL2ludGVnLXRlc3RzICR7aW50ZWdUZXN0UmVnaW9ucz8ubWFwKHJlZ2lvbiA9PiBgLS1wYXJhbGxlbC1yZWdpb25zICR7cmVnaW9ufWApLmpvaW4oJyAnKX0gLS11cGRhdGUtb24tZmFpbGVkYCxcbiAgICApO1xuXG4gICAgbmV3IFRleHRGaWxlKHRoaXMsICcuZ2l0aHViL0lTU1VFX1RFTVBMQVRFL2J1Z19yZXBvcnQubWQnLCB7XG4gICAgICBsaW5lczogW2ZzLnJlYWRGaWxlU3luYyhgJHtiYXNlQXNzZXRzRGlyZWN0b3J5fS9jb21tb24vZ2l0aHViX2J1Z19yZXBvcnQubWRgKS50b1N0cmluZygpXSxcbiAgICB9KTtcblxuICAgIG5ldyBUZXh0RmlsZSh0aGlzLCAnLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9mZWF0dXJlX3JlcXVlc3QubWQnLCB7XG4gICAgICBsaW5lczogW2ZzLnJlYWRGaWxlU3luYyhgJHtiYXNlQXNzZXRzRGlyZWN0b3J5fS9jb21tb24vZ2l0aHViX2ZlYXR1cmVfcmVxdWVzdC5tZGApLnRvU3RyaW5nKCldLFxuICAgIH0pO1xuXG4gICAgbmV3IFlhbWxGaWxlKHRoaXMsICcuZ2l0aHViL0ZVTkRJTkcueWFtbCcsIHtcbiAgICAgIG9iajoge1xuICAgICAgICBnaXRodWI6ICdtYXZvZ2VsJyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBuZXcgVGV4dEZpbGUodGhpcywgJ0NPTlRSSUJVVElORy5tZCcsIHtcbiAgICAgIGxpbmVzOiBbZnMucmVhZEZpbGVTeW5jKGAke2Jhc2VBc3NldHNEaXJlY3Rvcnl9L2NvbW1vbi9jb250cmlidXRpbmcubWRgKS50b1N0cmluZygpXSxcbiAgICB9KTtcblxuICAgIG5ldyBUZXh0RmlsZSh0aGlzLCAnLnByZXR0aWVycmMnLCB7XG4gICAgICBsaW5lczogW2ZzLnJlYWRGaWxlU3luYyhgJHtiYXNlQXNzZXRzRGlyZWN0b3J5fS9jb21tb24vcHJldHRpZXJyY2ApLnRvU3RyaW5nKCldLFxuICAgIH0pO1xuXG4gICAgLy8gd3JpdGUgc2FtcGxlIGNvZGUgdG8gbWFpbi50cyAmIHRvIG1haW4udGVzdC50c1xuICAgIGlmIChvcHRpb25zLnNhbXBsZUNvZGUgPz8gdHJ1ZSkge1xuICAgICAgbmV3IFNhbXBsZUNvZGUodGhpcywge1xuICAgICAgICBiYXNlQXNzZXRzRGlyZWN0b3J5LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmludGVyZmFjZSBTYW1wbGVDb2RlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGJhc2VBc3NldHNEaXJlY3Rvcnk/OiBzdHJpbmc7XG59XG5cbmNsYXNzIFNhbXBsZUNvZGUgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGxpYnJhcnk6IEF3c0Nka0NvbnN0cnVjdExpYnJhcnk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogU2FtcGxlQ29kZU9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbGlicmFyeTogQXdzQ2RrQ29uc3RydWN0TGlicmFyeSxcbiAgICBvcHRpb25zOiBTYW1wbGVDb2RlT3B0aW9ucyxcbiAgKSB7XG4gICAgc3VwZXIobGlicmFyeSk7XG4gICAgdGhpcy5saWJyYXJ5ID0gbGlicmFyeTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgcHVibGljIHN5bnRoZXNpemUoKSB7XG4gICAgY29uc3Qgb3V0ZGlyID0gdGhpcy5wcm9qZWN0Lm91dGRpcjtcbiAgICBjb25zdCBzcmNkaXIgPSBwYXRoLmpvaW4ob3V0ZGlyLCB0aGlzLmxpYnJhcnkuc3JjZGlyKTtcbiAgICBpZiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHNyY2RpcikgJiZcbiAgICAgIGZzLnJlYWRkaXJTeW5jKHNyY2RpcikuZmlsdGVyKCh4KSA9PiB4LmVuZHNXaXRoKCcudHMnKSkgJiZcbiAgICAgICFmcy5yZWFkRmlsZVN5bmMoYCR7c3JjZGlyfS9pbmRleC50c2ApLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ2V4cG9ydCBjbGFzcyBIZWxsbycpIC8vIE5vdGU6IGZyb20gcGFyZW50XG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnMubWtkaXJTeW5jKHNyY2RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oc3JjZGlyLCAnaW5kZXgudHMnKSwgZnMucmVhZEZpbGVTeW5jKGAke3RoaXMub3B0aW9ucy5iYXNlQXNzZXRzRGlyZWN0b3J5fS9jZGstY29uc3RydWN0L3NyY19pbmRleC50c2ApLnRvU3RyaW5nKCkpO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHNyY2RpciwgJ3BsYWNlaG9sZGVyLnRzJyksIGZzLnJlYWRGaWxlU3luYyhgJHt0aGlzLm9wdGlvbnMuYmFzZUFzc2V0c0RpcmVjdG9yeX0vY2RrLWNvbnN0cnVjdC9zcmNfcGxhY2Vob2xkZXIudHNgKS50b1N0cmluZygpKTtcbiAgICAvLyBjcmQgd2l0aCBsYW1iZGEgZ2VuZXJhdGlvblxuICAgIGZzLm1rZGlyU3luYyhgJHtzcmNkaXJ9L2NyZC1leGFtcGxlYCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oYCR7c3JjZGlyfS9jcmQtZXhhbXBsZWAsICdjcmQtZXhhbXBsZS50cycpLCBmcy5yZWFkRmlsZVN5bmMoYCR7dGhpcy5vcHRpb25zLmJhc2VBc3NldHNEaXJlY3Rvcnl9L2Nkay1jb25zdHJ1Y3Qvc3JjX2NyZC1leGFtcGxlLnRzYCkudG9TdHJpbmcoKSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oYCR7c3JjZGlyfS9jcmQtZXhhbXBsZWAsICdjcmQtZXhhbXBsZS5sYW1iZGEudHMnKSwgZnMucmVhZEZpbGVTeW5jKGAke3RoaXMub3B0aW9ucy5iYXNlQXNzZXRzRGlyZWN0b3J5fS9jZGstY29uc3RydWN0L3NyY19jcmQtZXhhbXBsZS5sYW1iZGEudHNgKS50b1N0cmluZygpKTtcblxuXG4gICAgY29uc3QgdGVzdGRpciA9IHBhdGguam9pbihvdXRkaXIsIHRoaXMubGlicmFyeS50ZXN0ZGlyKTtcbiAgICBpZiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHRlc3RkaXIpICYmXG4gICAgICBmcy5yZWFkZGlyU3luYyh0ZXN0ZGlyKS5maWx0ZXIoKHgpID0+IHguZW5kc1dpdGgoJy50cycpKSAmJlxuICAgICAgIWZzLmV4aXN0c1N5bmMoYCR7dGVzdGRpcn0vaGVsbG8udGVzdC50c2ApIC8vIE5vdGU6IGZyb20gcGFyZW50XG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIHJlbW92ZSAke3Rlc3RkaXJ9L2hlbGxvLnRlc3QudHMgZmlsZS4gT24gdGhlIG90aGVyIGhhbmQsIHdlIG92ZXJyaWRlIGluZGV4LnRzXG4gICAgZnMudW5saW5rU3luYyhgJHt0ZXN0ZGlyfS9oZWxsby50ZXN0LnRzYCk7XG4gICAgZnMubWtkaXJTeW5jKHRlc3RkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHRlc3RkaXIsICdpbmRleC50ZXN0LnRzJyksIGZzLnJlYWRGaWxlU3luYyhgJHt0aGlzLm9wdGlvbnMuYmFzZUFzc2V0c0RpcmVjdG9yeX0vY2RrLWNvbnN0cnVjdC90ZXN0X2luZGV4LnRlc3QudHNgKS50b1N0cmluZygpKTtcbiAgICAvLyBsYW1iZGEgdGVzdHMgd2l0aCBqZXN0IHN0dWJzXG4gICAgZnMubWtkaXJTeW5jKGAke3Rlc3RkaXJ9L2NyZC1leGFtcGxlYCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oYCR7dGVzdGRpcn0vY3JkLWV4YW1wbGVgLCAnY3JkLWV4YW1wbGUudGVzdC50cycpLCBmcy5yZWFkRmlsZVN5bmMoYCR7dGhpcy5vcHRpb25zLmJhc2VBc3NldHNEaXJlY3Rvcnl9L2Nkay1jb25zdHJ1Y3QvdGVzdF9jcmQtZXhhbXBsZS50ZXN0LnRzYCkudG9TdHJpbmcoKSk7XG5cblxuICAgIGNvbnN0IGludGVnVGVzdGRpciA9IHBhdGguam9pbihvdXRkaXIsICdpbnRlZy10ZXN0cycpO1xuICAgIGlmIChcbiAgICAgIGZzLmV4aXN0c1N5bmMoaW50ZWdUZXN0ZGlyKSAmJlxuICAgICAgZnMucmVhZGRpclN5bmMoaW50ZWdUZXN0ZGlyKS5maWx0ZXIoKHgpID0+IHguZW5kc1dpdGgoJy50cycpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmcy5ta2RpclN5bmMoaW50ZWdUZXN0ZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihpbnRlZ1Rlc3RkaXIsICdpbnRlZy5wbGFjZWhvbGRlci50cycpLCBmcy5yZWFkRmlsZVN5bmMoYCR7dGhpcy5vcHRpb25zLmJhc2VBc3NldHNEaXJlY3Rvcnl9L2Nkay1jb25zdHJ1Y3QvaW50ZWdfaW50ZWcucGxhY2Vob2xkZXIudHNgKS50b1N0cmluZygpKTtcblxuICAgIGNvbnN0IGludGVnVGVzdEZ1bmN0aW9uc2RpciA9IHBhdGguam9pbihpbnRlZ1Rlc3RkaXIsICdmdW5jdGlvbnMnKTtcbiAgICBpZiAoXG4gICAgICBmcy5leGlzdHNTeW5jKGludGVnVGVzdEZ1bmN0aW9uc2RpcikgJiZcbiAgICAgIGZzLnJlYWRkaXJTeW5jKGludGVnVGVzdEZ1bmN0aW9uc2RpcikuZmlsdGVyKCh4KSA9PiB4LmVuZHNXaXRoKCcudHMnKSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZnMubWtkaXJTeW5jKGludGVnVGVzdEZ1bmN0aW9uc2RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oaW50ZWdUZXN0RnVuY3Rpb25zZGlyLCAndGVzdC1oYW5kbGVyLnRzJyksIGZzLnJlYWRGaWxlU3luYyhgJHt0aGlzLm9wdGlvbnMuYmFzZUFzc2V0c0RpcmVjdG9yeX0vY2RrLWNvbnN0cnVjdC9pbnRlZ190ZXN0LWhhbmRsZXIudHNgKS50b1N0cmluZygpKTtcblxuICAgIGNvbnN0IGRvY3NkaXIgPSBwYXRoLmpvaW4ob3V0ZGlyLCAnZG9jcycpO1xuICAgIGlmIChcbiAgICAgIGZzLmV4aXN0c1N5bmMoZG9jc2RpcikgJiZcbiAgICAgIGZzLnJlYWRkaXJTeW5jKGRvY3NkaXIpLmZpbHRlcigoeCkgPT4geC5lbmRzV2l0aCgnLmRyYXdpbycpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmcy5ta2RpclN5bmMoZG9jc2RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oZG9jc2RpciwgJ3BsYWNlaG9sZGVyLmRyYXdpbycpLCBmcy5yZWFkRmlsZVN5bmMoYCR7dGhpcy5vcHRpb25zLmJhc2VBc3NldHNEaXJlY3Rvcnl9L2NvbW1vbi9kb2NzX3BsYWNlaG9sZGVyLmRyYXdpb2ApLnRvU3RyaW5nKCkpO1xuXG4gICAgY29uc3QgZXhhbXBsZXNkaXIgPSBwYXRoLmpvaW4ob3V0ZGlyLCAnZXhhbXBsZXMnLCAnc2ltcGxlJyk7XG4gICAgaWYgKFxuICAgICAgZnMuZXhpc3RzU3luYyhleGFtcGxlc2RpcikgJiZcbiAgICAgIGZzLnJlYWRkaXJTeW5jKGV4YW1wbGVzZGlyKS5maWx0ZXIoKHgpID0+IHguZW5kc1dpdGgoJy5kcmF3aW8nKSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZnMubWtkaXJTeW5jKGV4YW1wbGVzZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihleGFtcGxlc2RpciwgJ21haW4udHMnKSwgZnMucmVhZEZpbGVTeW5jKGAke3RoaXMub3B0aW9ucy5iYXNlQXNzZXRzRGlyZWN0b3J5fS9jZGstY29uc3RydWN0L2V4YW1wbGVzX3NpbXBsZV9tYWluLnRzYCkudG9TdHJpbmcoKSk7XG4gIH1cbn0iXX0=
411
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNvbnN0cnVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0cy9jZGstY29uc3RydWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBRTdCLG1DQUFzRjtBQUN0Riw4Q0FBeUc7QUFDekcsOENBQStEO0FBRy9ELDJFQUEyRTtBQUMzRSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUM7QUFDM0IsTUFBTSxpQkFBaUIsR0FBRyxzQkFBYSxDQUFDLFdBQVcsQ0FBQztBQUVwRCxvRkFBb0Y7QUFDcEYsb0ZBQW9GO0FBQ3BGLG1FQUFtRTtBQUNuRSxxRkFBcUY7QUFDckYsaUVBQWlFO0FBQ2pFLGdGQUFnRjtBQUNoRiw2Q0FBNkM7QUFDN0MsTUFBTSx5QkFBeUIsR0FBRyxTQUFTLENBQUM7QUFxQjVDOzs7O0dBSUc7QUFDSCxNQUFhLHNCQUF1QixTQUFRLCtCQUFzQjs7SUFFaEUsWUFBWSxPQUFzQztRQUNoRCxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsMENBQTBDLENBQUM7UUFDdEgsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFaEYsS0FBSyxDQUFDO1lBQ0osa0JBQWtCLEVBQUUsSUFBSTtZQUN4QixjQUFjLEVBQUUsb0JBQW9CO1lBQ3BDLE9BQU8sRUFBRSxZQUFZO1lBQ3JCLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLGlCQUFpQixFQUFFLFFBQVE7WUFDM0IsY0FBYyxFQUFFLFdBQVc7WUFDM0IsbUJBQW1CLEVBQUUsV0FBVztZQUNoQyxTQUFTLEVBQUUsY0FBYztZQUN6QixZQUFZLEVBQUUsSUFBSTtZQUNsQixjQUFjLEVBQUUsbUJBQVUsQ0FBQyxr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LElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLGlDQUFpQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUU3SixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUQsSUFDRSxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztZQUMxQixFQUFFLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUNoRSxDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFDRCxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLHdDQUF3QyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMvSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIGphdmFzY3JpcHQsIFJlbGVhc2FibGVDb21taXRzLCBUZXh0RmlsZSwgWWFtbEZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgQXdzQ2RrQ29uc3RydWN0TGlicmFyeSwgQXdzQ2RrQ29uc3RydWN0TGlicmFyeU9wdGlvbnMsIExhbWJkYVJ1bnRpbWUgfSBmcm9tICdwcm9qZW4vbGliL2F3c2Nkayc7XG5pbXBvcnQgeyBEZXBlbmRhYm90U2NoZWR1bGVJbnRlcnZhbCB9IGZyb20gJ3Byb2plbi9saWIvZ2l0aHViJztcbmltcG9ydCB7IEpvYlN0ZXAgfSBmcm9tICdwcm9qZW4vbGliL2dpdGh1Yi93b3JrZmxvd3MtbW9kZWwnO1xuXG4vLyBTZXQgdGhlIG1pbmltdW0gbm9kZSB2ZXJzaW9uIGZvciBBV1MgQ0RLIGFuZCB0aGUgR2l0SHViIGFjdGlvbnMgd29ya2Zsb3dcbmNvbnN0IG5vZGVWZXJzaW9uID0gJzI0LngnO1xuY29uc3QgbGFtYmRhTm9kZVZlcnNpb24gPSBMYW1iZGFSdW50aW1lLk5PREVKU18yNF9YO1xuXG4vLyBUaGUgbGFzdCBAYXdzLWNkay9pbnRlZy1ydW5uZXIgdmVyc2lvbiB2ZXJpZmllZCBhZ2FpbnN0IG5wbSAoY2hlY2tlZCAyMDI2LTA3LTIxKS5cbi8vIGludGVnLXJ1bm5lciB1c2VzIHBsYWluIHZlcnNpb25zIChubyAtYWxwaGEuMCBzdWZmaXgpIGFuZCBoYXMgaGlzdG9yaWNhbGx5IGxhZ2dlZFxuLy8gb3Igc3RvcHBlZCB0cmFja2luZyBhd3MtY2RrLWxpYidzIHZlcnNpb24gZm9yIHN0cmV0Y2hlcyBvZiB0aW1lLlxuLy8gQGF3cy1jZGsvaW50ZWctdGVzdHMtYWxwaGEgYW5kIGF3c2xpbnQgY29udGludWUgdG8gcHVibGlzaCBhbmQgdHJhY2sgQ0RLIHZlcnNpb25zLlxuLy8gU0hPUlRDVVQ6IGhhcmRjb2RlZCBjYXAgcmVxdWlyZXMgbWFudWFsIHJlLXZlcmlmaWNhdGlvbiAtLSBydW5cbi8vIGBucG0gdmlldyBAYXdzLWNkay9pbnRlZy1ydW5uZXIgdmVyc2lvbnMgLS1qc29uYCBhbmQgYnVtcCB0aGlzIGlmIGF3cy1jZGstbGliXG4vLyBoYXMgcmVsZWFzZWQgbmV3ZXIgdmVyc2lvbnMgdGhhbiB0aGlzIG9uZS5cbmNvbnN0IExBU1RfSU5URUdfUlVOTkVSX1ZFUlNJT04gPSAnMi4yMDMuMCc7XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIHRoZSBjb25zdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdmNDZGtDb25zdHJ1Y3RMaWJyYXJ5T3B0aW9ucyBleHRlbmRzIEF3c0Nka0NvbnN0cnVjdExpYnJhcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIEJhc2UgZGlyZWN0b3J5IGZvciB0aGUgYXNzZXRzXG4gICAqXG4gICAqIEBkZWZhdWx0ICR7cHJvY2Vzcy5jd2QoKX0vbm9kZV9tb2R1bGVzL212Yy1wcm9qZW4vYXNzZXRzXG4gICAqL1xuICByZWFkb25seSBiYXNlQXNzZXRzRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9ucyB0byBydW4gdGhlIGludGVnIHRlc3RzIGluXG4gICAqXG4gICAqIEBkZWZhdWx0IGV1LXdlc3QtMSBhbmQgZXUtd2VzdC0yXG4gICAqL1xuICByZWFkb25seSBpbnRlZ1Rlc3RSZWdpb25zPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogVHlwZVNjcmlwdCBsaWJyYXJ5XG4gKlxuICogQHBqaWQgbXZjLWF3c2Nkay1jb25zdHJ1Y3RcbiAqL1xuZXhwb3J0IGNsYXNzIE12Y0Nka0NvbnN0cnVjdExpYnJhcnkgZXh0ZW5kcyBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5IHtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNdmNDZGtDb25zdHJ1Y3RMaWJyYXJ5T3B0aW9ucykge1xuICAgIGNvbnN0IGJhc2VBc3NldHNEaXJlY3RvcnkgPSBvcHRpb25zLmJhc2VBc3NldHNEaXJlY3RvcnkgPz8gYCR7cHJvY2Vzcy5jd2QoKX0vbm9kZV9tb2R1bGVzL0BtYXZvZ2VsL212Yy1wcm9qZW4vYXNzZXRzYDtcbiAgICBjb25zdCBpbnRlZ1Rlc3RSZWdpb25zID0gb3B0aW9ucy5pbnRlZ1Rlc3RSZWdpb25zID8/IFsnZXUtd2VzdC0xJywgJ2V1LXdlc3QtMiddO1xuXG4gICAgc3VwZXIoe1xuICAgICAgYXV0aG9yT3JnYW5pemF0aW9uOiB0cnVlLFxuICAgICAgY29weXJpZ2h0T3duZXI6ICdNViBDb25zdWx0aW5nIEdtYkgnLFxuICAgICAgbGljZW5zZTogJ0FwYWNoZS0yLjAnLFxuICAgICAganNpaVZlcnNpb246ICd+Ni4wLjAnLFxuICAgICAgdHlwZXNjcmlwdFZlcnNpb246ICdeNi4wLjInLFxuICAgICAgbWluTm9kZVZlcnNpb246IG5vZGVWZXJzaW9uLFxuICAgICAgd29ya2Zsb3dOb2RlVmVyc2lvbjogbm9kZVZlcnNpb24sXG4gICAgICBzdGFiaWxpdHk6ICdleHBlcmltZW50YWwnLFxuICAgICAgcmVsZWFzZVRvTnBtOiB0cnVlLFxuICAgICAgcGFja2FnZU1hbmFnZXI6IGphdmFzY3JpcHQuTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTSxcbiAgICAgIG5wbUFjY2VzczogamF2YXNjcmlwdC5OcG1BY2Nlc3MuUFVCTElDLFxuICAgICAgbGFtYmRhT3B0aW9uczoge1xuICAgICAgICBydW50aW1lOiBsYW1iZGFOb2RlVmVyc2lvbixcbiAgICAgICAgYXdzU2RrQ29ubmVjdGlvblJldXNlOiBmYWxzZSwgLy8gZG9lc24ndCBleGlzdCBpbiBBV1MgU0RLIEpTIHYzXG4gICAgICB9LFxuICAgICAgYXV0b0FwcHJvdmVPcHRpb25zOiB7XG4gICAgICAgIGFsbG93ZWRVc2VybmFtZXM6IFtcbiAgICAgICAgICAnZGVwZW5kYWJvdCcsXG4gICAgICAgICAgJ2RlcGVuZGFib3RbYm90XScsXG4gICAgICAgICAgJ2dpdGh1Yi1ib3QnLFxuICAgICAgICAgICdnaXRodWItYWN0aW9uc1tib3RdJyxcbiAgICAgICAgICAnbXZjLWJvdCcsXG4gICAgICAgIF0sXG4gICAgICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBzZWNyZXQgdGhhdCBoYXMgdGhlIEdpdEh1YiBQQVQgZm9yIGF1dG8tYXBwcm92aW5nIFBScyB3aXRoIHBlcm1pc3Npb25zIHJlcG8sIHdvcmtmbG93LCB3cml0ZTpwYWNrYWdlc1xuICAgICAgICAvLyBHZW5lcmF0ZSBhIG5ldyBQQVQgKGh0dHBzOi8vZ2l0aHViLmNvbS9zZXR0aW5ncy90b2tlbnMvbmV3KSBhbmQgYWRkIGl0IHRvIHlvdXIgcmVwbydzIHNlY3JldHNcbiAgICAgICAgLy8gTk9URTogY29tZXMgZnJvbSBNVi1Db25zdWx0aW5nIE9yZ1xuICAgICAgICBzZWNyZXQ6ICdQUk9KRU5fR0lUSFVCX1RPS0VOJyxcbiAgICAgIH0sXG4gICAgICBkZXBlbmRhYm90OiB0cnVlLFxuICAgICAgZGVwZW5kYWJvdE9wdGlvbnM6IHtcbiAgICAgICAgc2NoZWR1bGVJbnRlcnZhbDogRGVwZW5kYWJvdFNjaGVkdWxlSW50ZXJ2YWwuV0VFS0xZLFxuICAgICAgICBsYWJlbHM6IFsnZGVwZW5kZW5jaWVzJywgJ2F1dG8tYXBwcm92ZSddLFxuICAgICAgICBncm91cHM6IHtcbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBwYXR0ZXJuczogWycqJ10sXG4gICAgICAgICAgICBleGNsdWRlUGF0dGVybnM6IFsnYXdzLWNkayonLCAncHJvamVuJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgaWdub3JlOiBbeyBkZXBlbmRlbmN5TmFtZTogJ2F3cy1jZGstbGliJyB9LCB7IGRlcGVuZGVuY3lOYW1lOiAnYXdzLWNkaycgfV0sXG4gICAgICB9LFxuICAgICAgLy8gLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9qZW4vcHJvamVuL2Rpc2N1c3Npb25zLzQwNDAjZGlzY3Vzc2lvbmNvbW1lbnQtMTE5MDU2MjhcbiAgICAgIHJlbGVhc2FibGVDb21taXRzOiBSZWxlYXNhYmxlQ29tbWl0cy5vZlR5cGUoW1xuICAgICAgICAnZmVhdCcsXG4gICAgICAgICdmaXgnLFxuICAgICAgICAnY2hvcmUnLFxuICAgICAgICAncmVmYWN0b3InLFxuICAgICAgICAncGVyZicsXG4gICAgICBdKSxcbiAgICAgIGdpdGh1Yk9wdGlvbnM6IHtcbiAgICAgICAgcHVsbFJlcXVlc3RMaW50T3B0aW9uczoge1xuICAgICAgICAgIHNlbWFudGljVGl0bGVPcHRpb25zOiB7XG4gICAgICAgICAgICAvLyBzZWUgY29tbWl0IHR5cGVzIGhlcmU6IGh0dHBzOi8vd3d3LmNvbnZlbnRpb25hbGNvbW1pdHMub3JnL2VuL3YxLjAuMC8jc3VtbWFyeVxuICAgICAgICAgICAgdHlwZXM6IFtcbiAgICAgICAgICAgICAgJ2ZlYXQnLFxuICAgICAgICAgICAgICAnZml4JyxcbiAgICAgICAgICAgICAgJ2Nob3JlJyxcbiAgICAgICAgICAgICAgJ3JlZmFjdG9yJyxcbiAgICAgICAgICAgICAgJ3BlcmYnLFxuICAgICAgICAgICAgICAnZG9jcycsXG4gICAgICAgICAgICAgICdzdHlsZScsXG4gICAgICAgICAgICAgICd0ZXN0JyxcbiAgICAgICAgICAgICAgJ2J1aWxkJyxcbiAgICAgICAgICAgICAgJ2NpJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB2ZXJzaW9ucmNPcHRpb25zOiB7XG4gICAgICAgIHR5cGVzOiBbXG4gICAgICAgICAgeyB0eXBlOiAnZmVhdCcsIHNlY3Rpb246ICdGZWF0dXJlcycgfSxcbiAgICAgICAgICB7IHR5cGU6ICdmaXgnLCBzZWN0aW9uOiAnQnVnIEZpeGVzJyB9LFxuICAgICAgICAgIHsgdHlwZTogJ2Nob3JlJywgc2VjdGlvbjogJ0Nob3JlcycgfSxcbiAgICAgICAgICB7IHR5cGU6ICdkb2NzJywgc2VjdGlvbjogJ0RvY3MnIH0sXG4gICAgICAgICAgeyB0eXBlOiAnc3R5bGUnLCBoaWRkZW46IHRydWUgfSxcbiAgICAgICAgICB7IHR5cGU6ICdyZWZhY3RvcicsIGhpZGRlbjogdHJ1ZSB9LFxuICAgICAgICAgIHsgdHlwZTogJ3BlcmYnLCBzZWN0aW9uOiAnUGVyZm9ybWFuY2UnIH0sXG4gICAgICAgICAgeyB0eXBlOiAndGVzdCcsIGhpZGRlbjogdHJ1ZSB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIGVzbGludE9wdGlvbnM6IHtcbiAgICAgICAgcHJldHRpZXI6IGZhbHNlLFxuICAgICAgICBkaXJzOiBbJ3NyYyddLFxuICAgICAgICBpZ25vcmVQYXR0ZXJuczogWycqKi8qLWZ1bmN0aW9uLnRzJywgJ2V4YW1wbGVzLyddLFxuICAgICAgfSxcbiAgICAgIC8vIGV4cGVyaW1lbnRhbEludGVnUnVubmVyOiB0cnVlLFxuICAgICAgLy8gbWFudWFsIGludGVnIHRlc3Qgc2V0dXBcbiAgICAgIHRzY29uZmlnRGV2OiB7XG4gICAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICAgIHR5cGVzOiBbJ25vZGUnLCAnamVzdCddLFxuICAgICAgICB9LFxuICAgICAgICBpbmNsdWRlOiBbJ2ludGVnLXRlc3RzLyoqLyoudHMnXSxcbiAgICAgIH0sXG4gICAgICBwdWxsUmVxdWVzdFRlbXBsYXRlQ29udGVudHM6IFtmcy5yZWFkRmlsZVN5bmMoYCR7YmFzZUFzc2V0c0RpcmVjdG9yeX0vY29tbW9uL2dpdGh1Yl9wdWxsX3JlcXVlc3QubWRgKS50b1N0cmluZygpXSxcbiAgICAgIC8vIE5PVEU6IGlzc3VlIHRlbXBsYXRlcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvamVuL3Byb2plbi9wdWxsLzM2NDhcbiAgICAgIC8vIGlzc3VlVGVtcGxhdGVzOiB7fVxuICAgICAgcmVhZG1lOiB7XG4gICAgICAgIGNvbnRlbnRzOiBbXG4gICAgICAgICAgYFxuIVtTb3VyY2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vZ2l0aHViL3N0YXJzL01WLUNvbnN1bHRpbmcvJHtvcHRpb25zLm5hbWV9P2xvZ289Z2l0aHViJmxhYmVsPUdpdEh1YiUyMFN0YXJzKVxuWyFbQnVpbGQgU3RhdHVzXShodHRwczovL2dpdGh1Yi5jb20vTVYtQ29uc3VsdGluZy8ke29wdGlvbnMubmFtZX0vYWN0aW9ucy93b3JrZmxvd3MvYnVpbGQueW1sL2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9NVi1Db25zdWx0aW5nLyR7b3B0aW9ucy5uYW1lfS9hY3Rpb25zL3dvcmtmbG93cy9idWlsZC55bWwpXG5bIVtFU0xpbnQgQ29kZSBGb3JtYXR0aW5nXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL2NvZGVfc3R5bGUtZXNsaW50LWJyaWdodGdyZWVuLnN2ZyldKGh0dHBzOi8vZXNsaW50Lm9yZylcblshW0xhdGVzdCByZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9yZWxlYXNlL01WLUNvbnN1bHRpbmcvJHtvcHRpb25zLm5hbWV9LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9NVi1Db25zdWx0aW5nLyR7b3B0aW9ucy5uYW1lfS9yZWxlYXNlcylcbiFbR2l0SHViXShodHRwczovL2ltZy5zaGllbGRzLmlvL2dpdGh1Yi9saWNlbnNlL01WLUNvbnN1bHRpbmcvJHtvcHRpb25zLm5hbWV9KVxuWyFbbnBtXShodHRwczovL2ltZy5zaGllbGRzLmlvL25wbS9kdC9AbWF2b2dlbC8ke29wdGlvbnMubmFtZX0/bGFiZWw9bnBtJmNvbG9yPW9yYW5nZSldKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0BtYXZvZ2VsLyR7b3B0aW9ucy5uYW1lfSlcblshW3R5cGVzY3JpcHRdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvanNpaS10eXBlc2NyaXB0LWJsdWV2aW9sZXQuc3ZnKV0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvQG1hdm9nZWwvJHtvcHRpb25zLm5hbWV9KVxuICAgICAgICAgIGAsXG4gICAgICAgICAgYCMgJHtvcHRpb25zLm5hbWV9YCxcbiAgICAgICAgICAnTXkgYXdlc29tZSBkZXNjcmlwdGlvbi4uLicsXG4gICAgICAgICAgYFxuIyMgVGFibGUgb2YgQ29udGVudHNcblxuLSBbRmVhdHVyZXNdKCNmZWF0dXJlcylcbi0gW1VzYWdlXSgjdXNhZ2UpXG4tIFtTb2x1dGlvbiBEZXNpZ25dKCNzb2x1dGlvbi1kZXNpZ24pXG4tIFtJbnNwaXJhdGlvbl0oI2luc3BpcmF0aW9uKVxuXG4jIyBGZWF0dXJlc1xuXG4tIOKaoSAqKlF1aWNrIFNldHVwKio6IFRCRFxuLSDwn5OPICoqQmVzdCBQcmFjdGljZSBTZXR1cCoqOiBUQkRcbi0g8J+kueKAjeKZgu+4jyAqKlByZS1pbnN0YWxsZWQgcGFja2FnZXMqKjogVEJEXG4tIPCfj5fvuI8gKipFeHRlbnNpYmlsaXR5Kio6IFRCRFxuXG4jIyBVc2FnZVxuVGhlIGZvbGxvd2luZyBzdGVwcyBnZXQgeW91IHN0YXJ0ZWQ6XG5cbjEuIENyZWF0ZSBhIG5ldyBcXGBhd3NjZGstYXBwXFxgIHZpYVxuXFxgXFxgXFxgYmFzaFxubnB4IHByb2plbiBuZXcgYXdzY2RrLWFwcC10cyAtLWNka1ZlcnNpb249Mi4yNjEuMCAtLXBhY2thZ2UtbWFuYWdlcj1ucG1cblxcYFxcYFxcYFxuMy4gQWRkIFxcYEBtYXZvZ2VsLyR7b3B0aW9ucy5uYW1lfVxcYCBhcyBhIGRlcGVuZGVuY3kgdG8geW91ciBwcm9qZWN0IGluIHRoZSBcXGAucHJvamVucmMudHNcXGAgZmlsZVxuNC4gUnVuIFxcYG5weCBwcm9qZW5cXGAgdG8gaW5zdGFsbCBpdFxuNS4gQWRkIHRoZSBmb2xsb3dpbmcgdG8gdGhlIFxcYHNyYy9tYWluLnRzXFxgIGZpbGU6XG5cXGBcXGBcXGB0c1xuaW1wb3J0IHsgQXBwLCBTdGFjaywgU3RhY2tQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgUGxhY2Vob2xkZXIgfSBmcm9tICdAbWF2b2dlbC8ke29wdGlvbnMubmFtZX0nO1xuXG5leHBvcnQgY2xhc3MgTXlTdGFjayBleHRlbmRzIFN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFN0YWNrUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgbmV3IFBsYWNlaG9sZGVyKHRoaXMsICdwbGFjZWhvbGRlcicsIHtcbiAgICAgIC8vIGFuZCBtb3JlLi4uIPCfkqFcbiAgICB9KTtcbiAgfVxufVxuXG5jb25zdCBlbnYgPSB7XG4gIGFjY291bnQ6ICcxMjM0NTY3ODk5MTInLFxuICByZWdpb246ICdldS1jZW50cmFsLTEnLFxufTtcblxuY29uc3QgYXBwID0gbmV3IEFwcCgpO1xubmV3IE15U3RhY2soYXBwLCAncGxhY2Vob2xkZXInLCB7IGVudiB9KTtcbmFwcC5zeW50aCgpO1xuXFxgXFxgXFxgXG5cbmFuZCBkZXBsb3kgaXRcblxcYFxcYFxcYGJhc2hcbm5weCBwcm9qZW4gYnVpbGRcbm5weCBwcm9qZW4gZGVwbG95XG5cXGBcXGBcXGBcblxud2l0aCB0aGUgb3V0cHV0XG5cXGBcXGBcXGBjb25zb2xlXG5UQkRcblxcYFxcYFxcYFxuXG5TZWUgdGhlIFtleGFtcGxlc10oLi9leGFtcGxlcykgZm9sZGVyIGZvciBtb3JlIGluc3BpcmF0aW9uLlxuXG4jIyBTb2x1dGlvbiBEZXNpZ25cblxuPGRldGFpbHM+XG4gIDxzdW1tYXJ5Pi4uLiBpZiB5b3UncmUgY3VyaW91cyBhYm91dCBjbGljayBoZXJlIGZvciB0aGUgZGV0YWlsczwvc3VtbWFyeT5cblxuIVtwbGFjZWhvbGRlcl0oZG9jcy9pbWcvcGxhY2Vob2xkZXIuZHJhd2lvLW1pbi5wbmcpXG5cbjwvZGV0YWlscz5cblxuIyMgSW5zcGlyYXRpb25cblxuYWRkIHRvb2xzIG9yIGxpbmtzIHdoaWNoIGluc3BpcmVkIHlvdVxuICAgICAgICAgIGAsXG4gICAgICAgICAgZnMucmVhZEZpbGVTeW5jKGAke2Jhc2VBc3NldHNEaXJlY3Rvcnl9L2NvbW1vbi9naXRodWJfcmVhZG1lX2N0YS5tZGApLnRvU3RyaW5nKCksXG4gICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICB9LFxuICAgICAgLy8gTk9URToga2VlcCBhbGwgdGhlIHBhc3NlZCBpbiBvcHRpb25zIHdoaWNoIGNhbiBvdmVycmlkZSB0aGUgZXhpc3Rpbmcgb25lcyFcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICAvLyBUeXBlU2NyaXB0IDYgbm8gbG9uZ2VyIGF1dG8tZGlzY292ZXJzIEB0eXBlcy8qIHBhY2thZ2VzXG4gICAgdGhpcy50c2NvbmZpZ0Rldi5maWxlLmFkZE92ZXJyaWRlKCdjb21waWxlck9wdGlvbnMudHlwZXMnLCBbJ25vZGUnLCAnamVzdCddKTtcbiAgICB0aGlzLnRzY29uZmlnPy5maWxlLmFkZE92ZXJyaWRlKCdjb21waWxlck9wdGlvbnMudHlwZXMnLCBbJ25vZGUnXSk7XG5cbiAgICAvLyBwcm9qZW4ncyBBdXRvTWVyZ2UgY29tcG9uZW50IGhhcmRjb2RlcyBgZGVsZXRlX2hlYWRfYnJhbmNoOiB7fWAgaW4gdGhlXG4gICAgLy8gbWVyZ2lmeSBydWxlIHdpdGggbm8gb3B0aW9uIHRvIGRpc2FibGUgaXQuIFN0cmlwIGl0IHNvIE1lcmdpZnkgZG9lcyBub3RcbiAgICAvLyBkZWxldGUgaGVhZCBicmFuY2hlcyBvbiBtZXJnZSAocmVub3ZhdGUvZGVwZW5kYWJvdCBtYW5hZ2UgdGhlaXIgb3duKS5cbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL01WLUNvbnN1bHRpbmcvY2RrLXZzY29kZS1zZXJ2ZXIvcHVsbC8xMTJcbiAgICB0aGlzLnRyeUZpbmRPYmplY3RGaWxlKCcubWVyZ2lmeS55bWwnKT8uYWRkRGVsZXRpb25PdmVycmlkZShcbiAgICAgICdwdWxsX3JlcXVlc3RfcnVsZXMuMC5hY3Rpb25zLmRlbGV0ZV9oZWFkX2JyYW5jaCcsXG4gICAgKTtcblxuICAgIC8vIGdpdGlnbm9yZVxuICAgIGNvbnN0IGZpbGVzUGF0dGVyblRvR2l0aWdub3JlID0gW1xuICAgICAgJ3RtcCcsXG4gICAgICAnLmNvZGVncHQnLFxuICAgIF07XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzUGF0dGVyblRvR2l0aWdub3JlKSB7XG4gICAgICB0aGlzLmdpdGlnbm9yZS5leGNsdWRlKGZpbGUpO1xuICAgIH1cbiAgICB0aGlzLmFkZERlcHMoXG4gICAgICAvLyBjZGstbmFnIHYzIHJlcXVpcmVzIGF3cy1jZGstbGliID49IDIuMjU3LjAgKHNlZSBjZGstbmFnIE1JR1JBVElPTi5tZClcbiAgICAgICdjZGstbmFnQF4zLjAuMScsXG4gICAgKTtcbiAgICAvLyBDYXAgaW50ZWctcnVubmVyIGF0IExBU1RfSU5URUdfUlVOTkVSX1ZFUlNJT04gc2luY2UgaXQgc3RvcHBlZCBwdWJsaXNoaW5nIGFmdGVyIHRoYXQgdmVyc2lvbi5cbiAgICAvLyBpbnRlZy1ydW5uZXIgdXNlcyBwbGFpbiB2ZXJzaW9ucyAobm8gLWFscGhhLjAgc3VmZml4KS5cbiAgICAvLyBpbnRlZy10ZXN0cy1hbHBoYSBhbmQgYXdzbGludCBvbmx5IHB1Ymxpc2ggYXQgbWlub3IgdmVyc2lvbnMgKGUuZy4gMi4xOTcuMC1hbHBoYS4wLCBub3QgMi4xOTcuNC1hbHBoYS4wKS5cbiAgICBjb25zdCByYXdDZGtWZXJzaW9uID0gdGhpcy5jZGtWZXJzaW9uLnJlcGxhY2UoL1tcXF5+XS8sICcnKTtcbiAgICBjb25zdCBpbnRlZ1J1bm5lclZlcnNpb24gPSByYXdDZGtWZXJzaW9uLmxvY2FsZUNvbXBhcmUoTEFTVF9JTlRFR19SVU5ORVJfVkVSU0lPTiwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUsIHNlbnNpdGl2aXR5OiAnYmFzZScgfSkgPiAwXG4gICAgICA/IExBU1RfSU5URUdfUlVOTkVSX1ZFUlNJT05cbiAgICAgIDogcmF3Q2RrVmVyc2lvbjtcbiAgICAvLyBBbHBoYSBwYWNrYWdlcyBvbmx5IHB1Ymxpc2ggYXQgLjAgcGF0Y2ggdmVyc2lvbnMg4oCUIG5vcm1hbGl6ZSB0byBtaW5vciB2ZXJzaW9uXG4gICAgY29uc3QgW21ham9yLCBtaW5vcl0gPSByYXdDZGtWZXJzaW9uLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgYWxwaGFWZXJzaW9uID0gYCR7bWFqb3J9LiR7bWlub3J9LjBgO1xuICAgIHRoaXMuYWRkRGV2RGVwcyhcbiAgICAgIGBAYXdzLWNkay9pbnRlZy1ydW5uZXJAJHtpbnRlZ1J1bm5lclZlcnNpb259YCxcbiAgICAgIGBAYXdzLWNkay9pbnRlZy10ZXN0cy1hbHBoYUAke2FscGhhVmVyc2lvbn0tYWxwaGEuMGAsXG4gICAgICAnQGNvbW1pdGxpbnQvY2xpQF4yMC4xLjAnLFxuICAgICAgJ0Bjb21taXRsaW50L2NvbmZpZy1jb252ZW50aW9uYWxAXjIwLjAuMCcsXG4gICAgICBgYXdzbGludEAke2FscGhhVmVyc2lvbn0tYWxwaGEuMGAsXG4gICAgICAnaHVza3lAXjkuMS43JyxcbiAgICApO1xuXG4gICAgdGhpcy5wYWNrYWdlLnNldFNjcmlwdCgncHJlcGFyZScsICdodXNreScpO1xuICAgIG5ldyBUZXh0RmlsZSh0aGlzLCAnLmNvbW1pdGxpbnRyYy5qcycsIHtcbiAgICAgIGxpbmVzOiBbXG4gICAgICAgICdtb2R1bGUuZXhwb3J0cyA9IHsgZXh0ZW5kczogW1xcJ0Bjb21taXRsaW50L2NvbmZpZy1jb252ZW50aW9uYWxcXCddIH07JyxcbiAgICAgIF0sXG4gICAgICBtYXJrZXI6IHRydWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnBhY2thZ2Uuc2V0U2NyaXB0KCdhd3NsaW50JywgJ2F3c2xpbnQnKTtcbiAgICAvLyAuZ2l0aHViL3dvcmtmbG93cy9idWlsZC55bWxcbiAgICBjb25zdCBidWlsZFdvcmtmbG93ID0gdGhpcy5naXRodWI/LnRyeUZpbmRXb3JrZmxvdygnYnVpbGQnKTtcbiAgICBpZiAoIWJ1aWxkV29ya2Zsb3cpIHJldHVybjtcbiAgICBjb25zdCBidWlsZEpvYiA9IGJ1aWxkV29ya2Zsb3cuZ2V0Sm9iKCdidWlsZCcpO1xuICAgIGlmICghYnVpbGRKb2IgfHwgISgnc3RlcHMnIGluIGJ1aWxkSm9iKSkgcmV0dXJuO1xuICAgIC8vIFRPRE86IGZpZ3VyZSBvdXQgd2h5IHdyb25nIHR5cGVzXG4gICAgY29uc3QgZ2V0QnVpbGRTdGVwcyA9IGJ1aWxkSm9iLnN0ZXBzIGFzIHVua25vd24gYXMgKCkgPT4gSm9iU3RlcFtdO1xuICAgIGNvbnN0IGJ1aWxkSm9iU3RlcHMgPSBnZXRCdWlsZFN0ZXBzKCk7XG4gICAgYnVpbGRXb3JrZmxvdy51cGRhdGVKb2IoJ2J1aWxkJywge1xuICAgICAgLi4uYnVpbGRKb2IsXG4gICAgICBzdGVwczogW1xuICAgICAgICAuLi5idWlsZEpvYlN0ZXBzLnNsaWNlKDAsIDQpLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ1J1biBhd3NsaW50JyxcbiAgICAgICAgICBydW46ICducG0gcnVuIGF3c2xpbnQnLFxuICAgICAgICB9LFxuICAgICAgICAuLi5idWlsZEpvYlN0ZXBzLnNsaWNlKDQpLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIHRoaXMucGFja2FnZS5zZXRTY3JpcHQoXG4gICAgICAnaW50ZWctdGVzdCcsXG4gICAgICBgaW50ZWctcnVubmVyIC0tZGlyZWN0b3J5IC4vaW50ZWctdGVzdHMgJHtpbnRlZ1Rlc3RSZWdpb25zPy5tYXAocmVnaW9uID0+IGAtLXBhcmFsbGVsLXJlZ2lvbnMgJHtyZWdpb259YCkuam9pbignICcpfSAtLXVwZGF0ZS1vbi1mYWlsZWRgLFxuICAgICk7XG5cbiAgICBuZXcgVGV4dEZpbGUodGhpcywgJy5naXRodWIvSVNTVUVfVEVNUExBVEUvYnVnX3JlcG9ydC5tZCcsIHtcbiAgICAgIGxpbmVzOiBbZnMucmVhZEZpbGVTeW5jKGAke2Jhc2VBc3NldHNEaXJlY3Rvcnl9L2NvbW1vbi9naXRodWJfYnVnX3JlcG9ydC5tZGApLnRvU3RyaW5nKCldLFxuICAgIH0pO1xuXG4gICAgbmV3IFRleHRGaWxlKHRoaXMsICcuZ2l0aHViL0lTU1VFX1RFTVBMQVRFL2ZlYXR1cmVfcmVxdWVzdC5tZCcsIHtcbiAgICAgIGxpbmVzOiBbZnMucmVhZEZpbGVTeW5jKGAke2Jhc2VBc3NldHNEaXJlY3Rvcnl9L2NvbW1vbi9naXRodWJfZmVhdHVyZV9yZXF1ZXN0Lm1kYCkudG9TdHJpbmcoKV0sXG4gICAgfSk7XG5cbiAgICBuZXcgWWFtbEZpbGUodGhpcywgJy5naXRodWIvRlVORElORy55YW1sJywge1xuICAgICAgb2JqOiB7XG4gICAgICAgIGdpdGh1YjogJ21hdm9nZWwnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIG5ldyBUZXh0RmlsZSh0aGlzLCAnQ09OVFJJQlVUSU5HLm1kJywge1xuICAgICAgbGluZXM6IFtmcy5yZWFkRmlsZVN5bmMoYCR7YmFzZUFzc2V0c0RpcmVjdG9yeX0vY29tbW9uL2NvbnRyaWJ1dGluZy5tZGApLnRvU3RyaW5nKCldLFxuICAgIH0pO1xuXG4gICAgbmV3IFRleHRGaWxlKHRoaXMsICcucHJldHRpZXJyYycsIHtcbiAgICAgIGxpbmVzOiBbZnMucmVhZEZpbGVTeW5jKGAke2Jhc2VBc3NldHNEaXJlY3Rvcnl9L2NvbW1vbi9wcmV0dGllcnJjYCkudG9TdHJpbmcoKV0sXG4gICAgfSk7XG5cbiAgICAvLyB3cml0ZSBzYW1wbGUgY29kZSB0byBtYWluLnRzICYgdG8gbWFpbi50ZXN0LnRzXG4gICAgaWYgKG9wdGlvbnMuc2FtcGxlQ29kZSA/PyB0cnVlKSB7XG4gICAgICBuZXcgU2FtcGxlQ29kZSh0aGlzLCB7XG4gICAgICAgIGJhc2VBc3NldHNEaXJlY3RvcnksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIFNhbXBsZUNvZGVPcHRpb25zIHtcbiAgcmVhZG9ubHkgYmFzZUFzc2V0c0RpcmVjdG9yeT86IHN0cmluZztcbn1cblxuY2xhc3MgU2FtcGxlQ29kZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlicmFyeTogQXdzQ2RrQ29uc3RydWN0TGlicmFyeTtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBTYW1wbGVDb2RlT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBsaWJyYXJ5OiBBd3NDZGtDb25zdHJ1Y3RMaWJyYXJ5LFxuICAgIG9wdGlvbnM6IFNhbXBsZUNvZGVPcHRpb25zLFxuICApIHtcbiAgICBzdXBlcihsaWJyYXJ5KTtcbiAgICB0aGlzLmxpYnJhcnkgPSBsaWJyYXJ5O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICBwdWJsaWMgc3ludGhlc2l6ZSgpIHtcbiAgICBjb25zdCBvdXRkaXIgPSB0aGlzLnByb2plY3Qub3V0ZGlyO1xuICAgIGNvbnN0IHNyY2RpciA9IHBhdGguam9pbihvdXRkaXIsIHRoaXMubGlicmFyeS5zcmNkaXIpO1xuICAgIGlmIChcbiAgICAgIGZzLmV4aXN0c1N5bmMoc3JjZGlyKSAmJlxuICAgICAgZnMucmVhZGRpclN5bmMoc3JjZGlyKS5maWx0ZXIoKHgpID0+IHguZW5kc1dpdGgoJy50cycpKSAmJlxuICAgICAgIWZzLnJlYWRGaWxlU3luYyhgJHtzcmNkaXJ9L2luZGV4LnRzYCkudG9TdHJpbmcoKS5pbmNsdWRlcygnZXhwb3J0IGNsYXNzIEhlbGxvJykgLy8gTm90ZTogZnJvbSBwYXJlbnRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmcy5ta2RpclN5bmMoc3JjZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihzcmNkaXIsICdpbmRleC50cycpLCBmcy5yZWFkRmlsZVN5bmMoYCR7dGhpcy5vcHRpb25zLmJhc2VBc3NldHNEaXJlY3Rvcnl9L2Nkay1jb25zdHJ1Y3Qvc3JjX2luZGV4LnRzYCkudG9TdHJpbmcoKSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oc3JjZGlyLCAncGxhY2Vob2xkZXIudHMnKSwgZnMucmVhZEZpbGVTeW5jKGAke3RoaXMub3B0aW9ucy5iYXNlQXNzZXRzRGlyZWN0b3J5fS9jZGstY29uc3RydWN0L3NyY19wbGFjZWhvbGRlci50c2ApLnRvU3RyaW5nKCkpO1xuICAgIC8vIGNyZCB3aXRoIGxhbWJkYSBnZW5lcmF0aW9uXG4gICAgZnMubWtkaXJTeW5jKGAke3NyY2Rpcn0vY3JkLWV4YW1wbGVgLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihgJHtzcmNkaXJ9L2NyZC1leGFtcGxlYCwgJ2NyZC1leGFtcGxlLnRzJyksIGZzLnJlYWRGaWxlU3luYyhgJHt0aGlzLm9wdGlvbnMuYmFzZUFzc2V0c0RpcmVjdG9yeX0vY2RrLWNvbnN0cnVjdC9zcmNfY3JkLWV4YW1wbGUudHNgKS50b1N0cmluZygpKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihgJHtzcmNkaXJ9L2NyZC1leGFtcGxlYCwgJ2NyZC1leGFtcGxlLmxhbWJkYS50cycpLCBmcy5yZWFkRmlsZVN5bmMoYCR7dGhpcy5vcHRpb25zLmJhc2VBc3NldHNEaXJlY3Rvcnl9L2Nkay1jb25zdHJ1Y3Qvc3JjX2NyZC1leGFtcGxlLmxhbWJkYS50c2ApLnRvU3RyaW5nKCkpO1xuXG5cbiAgICBjb25zdCB0ZXN0ZGlyID0gcGF0aC5qb2luKG91dGRpciwgdGhpcy5saWJyYXJ5LnRlc3RkaXIpO1xuICAgIGlmIChcbiAgICAgIGZzLmV4aXN0c1N5bmModGVzdGRpcikgJiZcbiAgICAgIGZzLnJlYWRkaXJTeW5jKHRlc3RkaXIpLmZpbHRlcigoeCkgPT4geC5lbmRzV2l0aCgnLnRzJykpICYmXG4gICAgICAhZnMuZXhpc3RzU3luYyhgJHt0ZXN0ZGlyfS9oZWxsby50ZXN0LnRzYCkgLy8gTm90ZTogZnJvbSBwYXJlbnRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gcmVtb3ZlICR7dGVzdGRpcn0vaGVsbG8udGVzdC50cyBmaWxlLiBPbiB0aGUgb3RoZXIgaGFuZCwgd2Ugb3ZlcnJpZGUgaW5kZXgudHNcbiAgICBmcy51bmxpbmtTeW5jKGAke3Rlc3RkaXJ9L2hlbGxvLnRlc3QudHNgKTtcbiAgICBmcy5ta2RpclN5bmModGVzdGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4odGVzdGRpciwgJ2luZGV4LnRlc3QudHMnKSwgZnMucmVhZEZpbGVTeW5jKGAke3RoaXMub3B0aW9ucy5iYXNlQXNzZXRzRGlyZWN0b3J5fS9jZGstY29uc3RydWN0L3Rlc3RfaW5kZXgudGVzdC50c2ApLnRvU3RyaW5nKCkpO1xuICAgIC8vIGxhbWJkYSB0ZXN0cyB3aXRoIGplc3Qgc3R1YnNcbiAgICBmcy5ta2RpclN5bmMoYCR7dGVzdGRpcn0vY3JkLWV4YW1wbGVgLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihgJHt0ZXN0ZGlyfS9jcmQtZXhhbXBsZWAsICdjcmQtZXhhbXBsZS50ZXN0LnRzJyksIGZzLnJlYWRGaWxlU3luYyhgJHt0aGlzLm9wdGlvbnMuYmFzZUFzc2V0c0RpcmVjdG9yeX0vY2RrLWNvbnN0cnVjdC90ZXN0X2NyZC1leGFtcGxlLnRlc3QudHNgKS50b1N0cmluZygpKTtcblxuXG4gICAgY29uc3QgaW50ZWdUZXN0ZGlyID0gcGF0aC5qb2luKG91dGRpciwgJ2ludGVnLXRlc3RzJyk7XG4gICAgaWYgKFxuICAgICAgZnMuZXhpc3RzU3luYyhpbnRlZ1Rlc3RkaXIpICYmXG4gICAgICBmcy5yZWFkZGlyU3luYyhpbnRlZ1Rlc3RkaXIpLmZpbHRlcigoeCkgPT4geC5lbmRzV2l0aCgnLnRzJykpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZzLm1rZGlyU3luYyhpbnRlZ1Rlc3RkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKGludGVnVGVzdGRpciwgJ2ludGVnLnBsYWNlaG9sZGVyLnRzJyksIGZzLnJlYWRGaWxlU3luYyhgJHt0aGlzLm9wdGlvbnMuYmFzZUFzc2V0c0RpcmVjdG9yeX0vY2RrLWNvbnN0cnVjdC9pbnRlZ19pbnRlZy5wbGFjZWhvbGRlci50c2ApLnRvU3RyaW5nKCkpO1xuXG4gICAgY29uc3QgaW50ZWdUZXN0RnVuY3Rpb25zZGlyID0gcGF0aC5qb2luKGludGVnVGVzdGRpciwgJ2Z1bmN0aW9ucycpO1xuICAgIGlmIChcbiAgICAgIGZzLmV4aXN0c1N5bmMoaW50ZWdUZXN0RnVuY3Rpb25zZGlyKSAmJlxuICAgICAgZnMucmVhZGRpclN5bmMoaW50ZWdUZXN0RnVuY3Rpb25zZGlyKS5maWx0ZXIoKHgpID0+IHguZW5kc1dpdGgoJy50cycpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmcy5ta2RpclN5bmMoaW50ZWdUZXN0RnVuY3Rpb25zZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihpbnRlZ1Rlc3RGdW5jdGlvbnNkaXIsICd0ZXN0LWhhbmRsZXIudHMnKSwgZnMucmVhZEZpbGVTeW5jKGAke3RoaXMub3B0aW9ucy5iYXNlQXNzZXRzRGlyZWN0b3J5fS9jZGstY29uc3RydWN0L2ludGVnX3Rlc3QtaGFuZGxlci50c2ApLnRvU3RyaW5nKCkpO1xuXG4gICAgY29uc3QgZG9jc2RpciA9IHBhdGguam9pbihvdXRkaXIsICdkb2NzJyk7XG4gICAgaWYgKFxuICAgICAgZnMuZXhpc3RzU3luYyhkb2NzZGlyKSAmJlxuICAgICAgZnMucmVhZGRpclN5bmMoZG9jc2RpcikuZmlsdGVyKCh4KSA9PiB4LmVuZHNXaXRoKCcuZHJhd2lvJykpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZzLm1rZGlyU3luYyhkb2NzZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihkb2NzZGlyLCAncGxhY2Vob2xkZXIuZHJhd2lvJyksIGZzLnJlYWRGaWxlU3luYyhgJHt0aGlzLm9wdGlvbnMuYmFzZUFzc2V0c0RpcmVjdG9yeX0vY29tbW9uL2RvY3NfcGxhY2Vob2xkZXIuZHJhd2lvYCkudG9TdHJpbmcoKSk7XG5cbiAgICBjb25zdCBleGFtcGxlc2RpciA9IHBhdGguam9pbihvdXRkaXIsICdleGFtcGxlcycsICdzaW1wbGUnKTtcbiAgICBpZiAoXG4gICAgICBmcy5leGlzdHNTeW5jKGV4YW1wbGVzZGlyKSAmJlxuICAgICAgZnMucmVhZGRpclN5bmMoZXhhbXBsZXNkaXIpLmZpbHRlcigoeCkgPT4geC5lbmRzV2l0aCgnLmRyYXdpbycpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmcy5ta2RpclN5bmMoZXhhbXBsZXNkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKGV4YW1wbGVzZGlyLCAnbWFpbi50cycpLCBmcy5yZWFkRmlsZVN5bmMoYCR7dGhpcy5vcHRpb25zLmJhc2VBc3NldHNEaXJlY3Rvcnl9L2Nkay1jb25zdHJ1Y3QvZXhhbXBsZXNfc2ltcGxlX21haW4udHNgKS50b1N0cmluZygpKTtcbiAgfVxufSJdfQ==
@@ -13,7 +13,7 @@ import (
13
13
  projen "github.com/projen/projen-go/projen/jsii"
14
14
  )
15
15
 
16
- //go:embed mavogel-mvc-projen-0.0.23.tgz
16
+ //go:embed mavogel-mvc-projen-0.0.25.tgz
17
17
  var tarball []byte
18
18
 
19
19
  // Initialize loads the necessary packages in the @jsii/kernel to support the enclosing module.
@@ -24,5 +24,5 @@ func Initialize() {
24
24
  projen.Initialize()
25
25
 
26
26
  // Load this library into the kernel
27
- _jsii_.Load("@mavogel/mvc-projen", "0.0.23", tarball)
27
+ _jsii_.Load("@mavogel/mvc-projen", "0.0.25", tarball)
28
28
  }
@@ -1 +1 @@
1
- 0.0.23
1
+ 0.0.25