@ashishpandeyone/cdk-lambda-web-function 0.1.5 → 0.1.6
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/.jsii +288 -16
- package/.jsii.tabl.json +1 -1
- package/API.md +593 -0
- package/README.md +40 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/nodejs-web-function.js +1 -1
- package/lib/web-function-deployment.js +1 -1
- package/lib/web-function-endpoint.d.ts +8 -1
- package/lib/web-function-endpoint.js +15 -6
- package/lib/web-function-grants.js +1 -1
- package/lib/web-function-origin.d.ts +66 -0
- package/lib/web-function-origin.js +201 -0
- package/lib/web-function-revision.js +1 -1
- package/lib/web-function.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -191,6 +191,45 @@ fn.addPermission('Cdn', {
|
|
|
191
191
|
- **Scope AWS services to your resource.** Lambda accepts a service principal with no condition, which would let that service call the endpoint on behalf of any account. The construct warns unless you give `sourceArn` or `sourceAccount` (or an `aws:SourceArn`, `aws:SourceAccount`, `aws:SourceOrgID` or `aws:SourceOrgPaths` condition).
|
|
192
192
|
- Lambda copies the policy to every region the function's endpoints serve from. The copy is eventually consistent, and in tests changes applied in every region within seconds.
|
|
193
193
|
|
|
194
|
+
### CloudFront
|
|
195
|
+
|
|
196
|
+
Put a CloudFront distribution (`aws-cdk-lib/aws-cloudfront`) in front of an `AWS_IAM` endpoint to serve the public with a custom domain, caching and AWS WAF. Viewers don't sign anything, and only your distribution may call the endpoint:
|
|
197
|
+
|
|
198
|
+
```ts
|
|
199
|
+
new cloudfront.Distribution(this, 'Cdn', {
|
|
200
|
+
defaultBehavior: {
|
|
201
|
+
origin: WebFunctionOrigin.withOriginAccessControl(fn.endpoint),
|
|
202
|
+
viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
|
|
203
|
+
allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL,
|
|
204
|
+
cachePolicy: cloudfront.CachePolicy.CACHING_DISABLED,
|
|
205
|
+
originRequestPolicy: cloudfront.OriginRequestPolicy.ALL_VIEWER_EXCEPT_HOST_HEADER,
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
`withOriginAccessControl` adds:
|
|
211
|
+
- an origin access control (origin type `lambda`, signing behavior `always-amz-auth`, the only one CloudFront accepts for Web Function origins), one per stack and signing protocol: SigV4 for a regional domain, SigV4a for a `MULTI_REGION` endpoint's global domain;
|
|
212
|
+
- a statement in the function's resource policy that allows `cloudfront.amazonaws.com` to call this endpoint on behalf of this distribution only (`aws:SourceArn`).
|
|
213
|
+
|
|
214
|
+
Some things to know:
|
|
215
|
+
- **Forward everything except `Host`.** The endpoint answers 404 when `Host` is the distribution's domain, so use `ALL_VIEWER_EXCEPT_HOST_HEADER` (not `ALL_VIEWER`), or a policy of your own without `Host`.
|
|
216
|
+
- **Your application can still authenticate viewers.** CloudFront signs in its own headers and passes the viewer's `Authorization` header (a JWT, for example) through unchanged, but only when `Authorization` is in the cache policy. CloudFront drops it from `GET` and `HEAD` requests otherwise:
|
|
217
|
+
|
|
218
|
+
```ts
|
|
219
|
+
const forwardAuthorization = new cloudfront.CachePolicy(this, 'ForwardAuthorization', {
|
|
220
|
+
headerBehavior: cloudfront.CacheHeaderBehavior.allowList('Authorization'),
|
|
221
|
+
minTtl: Duration.seconds(0),
|
|
222
|
+
defaultTtl: Duration.seconds(0),
|
|
223
|
+
maxTtl: Duration.seconds(1), // a cache key with headers needs caching enabled; 0/0/1 keeps it off in practice
|
|
224
|
+
});
|
|
225
|
+
```
|
|
226
|
+
- Request bodies work without clients sending `x-amz-content-sha256`: CloudFront signs `POST`, `PUT` and `PATCH` requests with an unsigned payload.
|
|
227
|
+
- A `PER_REGION` endpoint's origin calls one region: the home region, or the one you pass as `region`. Use one origin per region, for example in an origin group.
|
|
228
|
+
- A `MULTI_REGION` endpoint can't include opt-in regions (such as `me-central-1`), because CloudFront can't sign for them. The construct fails synthesis.
|
|
229
|
+
- The distribution must be in the function's stack. Lambda@Edge origin-request and origin-response triggers aren't supported on behaviors with this origin.
|
|
230
|
+
- The endpoint stays reachable at its own domain for signed requests your policies allow. Until a new distribution finishes deploying, requests through it can get a transient 403.
|
|
231
|
+
- `new WebFunctionOrigin(endpoint)` is for a public (`NONE`) endpoint, for example behind AWS WAF. Lambda doesn't authenticate those requests, so the endpoint's own domain stays public too.
|
|
232
|
+
|
|
194
233
|
### Functions defined elsewhere
|
|
195
234
|
|
|
196
235
|
Import a Web Function defined in another stack or app to grant access to it, read its metrics, or reference its revisions:
|
|
@@ -421,7 +460,7 @@ new WebFunction(this, 'Api', {
|
|
|
421
460
|
|
|
422
461
|
## Limitations
|
|
423
462
|
|
|
424
|
-
- Not yet supported: VPC access (network connectors), KMS encryption,
|
|
463
|
+
- Not yet supported: VPC access (network connectors), KMS encryption, and tracing.
|
|
425
464
|
- **Hotswap skips Web Functions without a warning.** `cdk deploy --hotswap` and `cdk watch`, which hotswaps by default, report `(no changes)` for a code or configuration change and the endpoint keeps serving the old revision. Use `cdk watch --hotswap-fallback` (or `cdk deploy --hotswap-fallback`): it deploys Web Function changes through CloudFormation, in about 40 seconds for a home-region endpoint.
|
|
426
465
|
- Fixed limits: 512 MB of code (unzipped) and 32 KB of environment variables per revision, 512 MB of `/tmp` per execution environment, and 128 KiB of headers per request.
|
|
427
466
|
- Quotas: 10 endpoints and about 50 revisions per function (Lambda cleans up older revisions automatically), and 10,000 requests per second per endpoint. Per account and region: 100,000 requests per second and 2,000 Arm64 vCPUs (each execution environment uses 2). The account quotas are adjustable, and new accounts start lower. See [Lambda quotas](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html).
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -17,8 +17,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./enums"), exports);
|
|
18
18
|
__exportStar(require("./web-function"), exports);
|
|
19
19
|
__exportStar(require("./web-function-endpoint"), exports);
|
|
20
|
+
__exportStar(require("./web-function-origin"), exports);
|
|
20
21
|
__exportStar(require("./web-function-grants"), exports);
|
|
21
22
|
__exportStar(require("./nodejs-web-function"), exports);
|
|
22
23
|
__exportStar(require("./web-function-revision"), exports);
|
|
23
24
|
__exportStar(require("./web-function-deployment"), exports);
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDBDQUF3QjtBQUN4QixpREFBK0I7QUFDL0IsMERBQXdDO0FBQ3hDLHdEQUFzQztBQUN0Qyx3REFBc0M7QUFDdEMsd0RBQXNDO0FBQ3RDLDBEQUF3QztBQUN4Qyw0REFBMEMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vd2ViLWZ1bmN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vd2ViLWZ1bmN0aW9uLWVuZHBvaW50JztcbmV4cG9ydCAqIGZyb20gJy4vd2ViLWZ1bmN0aW9uLW9yaWdpbic7XG5leHBvcnQgKiBmcm9tICcuL3dlYi1mdW5jdGlvbi1ncmFudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9ub2RlanMtd2ViLWZ1bmN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vd2ViLWZ1bmN0aW9uLXJldmlzaW9uJztcbmV4cG9ydCAqIGZyb20gJy4vd2ViLWZ1bmN0aW9uLWRlcGxveW1lbnQnO1xuIl19
|
|
@@ -49,7 +49,7 @@ const web_function_1 = require("./web-function");
|
|
|
49
49
|
* bundle, and `NODE_OPTIONS=--enable-source-maps` when source maps are on.
|
|
50
50
|
*/
|
|
51
51
|
class NodejsWebFunction extends web_function_1.WebFunction {
|
|
52
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.NodejsWebFunction", version: "0.1.
|
|
52
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.NodejsWebFunction", version: "0.1.6" };
|
|
53
53
|
constructor(scope, id, props) {
|
|
54
54
|
const runtime = props.runtime ?? lambda.Runtime.NODEJS_24_X;
|
|
55
55
|
const entry = (0, bundling_1.resolveEntry)(props.entry);
|
|
@@ -11,7 +11,7 @@ const MAX_STEPS = 20;
|
|
|
11
11
|
* How an endpoint moves its traffic to a new revision.
|
|
12
12
|
*/
|
|
13
13
|
class WebFunctionDeployment {
|
|
14
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionDeployment", version: "0.1.
|
|
14
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionDeployment", version: "0.1.6" };
|
|
15
15
|
/**
|
|
16
16
|
* All traffic moves to the new revision at once, as soon as it's ready (the default).
|
|
17
17
|
*/
|
|
@@ -152,13 +152,14 @@ export declare class WebFunctionEndpoint extends Construct {
|
|
|
152
152
|
readonly url: string;
|
|
153
153
|
/** Grants on this endpoint (e.g. `grants.invoke(principal)`). */
|
|
154
154
|
readonly grants: WebFunctionGrants;
|
|
155
|
+
/** The function this endpoint belongs to. */
|
|
156
|
+
readonly webFunction: IWebFunction;
|
|
155
157
|
/**
|
|
156
158
|
* The alarms this endpoint created for its deployment's `rollbackOn`, one per threshold in every region it serves from
|
|
157
159
|
* (the home region's first). Empty without `rollbackOn`.
|
|
158
160
|
*/
|
|
159
161
|
readonly rollbackAlarms: cloudwatch.IAlarm[];
|
|
160
162
|
private readonly homeRegion;
|
|
161
|
-
private readonly webFunction;
|
|
162
163
|
private readonly resource;
|
|
163
164
|
private weights;
|
|
164
165
|
private routed;
|
|
@@ -171,6 +172,12 @@ export declare class WebFunctionEndpoint extends Construct {
|
|
|
171
172
|
* @param region one of `regions`
|
|
172
173
|
*/
|
|
173
174
|
regionalUrl(region: string): string;
|
|
175
|
+
/**
|
|
176
|
+
* The domain name of this endpoint in one region. Only for `PER_REGION` endpoints.
|
|
177
|
+
*
|
|
178
|
+
* @param region one of `regions`
|
|
179
|
+
*/
|
|
180
|
+
regionalDomainName(region: string): string;
|
|
174
181
|
/**
|
|
175
182
|
* Routes the endpoint to `revision` instead of the function's current revision, optionally sharing
|
|
176
183
|
* traffic with one more revision (`additionalRevisions`, which gets its weight; `revision` gets the rest).
|
|
@@ -53,7 +53,7 @@ const web_function_grants_1 = require("./web-function-grants");
|
|
|
53
53
|
* Endpoints are created only through `WebFunction`, which owns their log groups in every region, so the constructor is private.
|
|
54
54
|
*/
|
|
55
55
|
class WebFunctionEndpoint extends constructs_1.Construct {
|
|
56
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint", version: "0.1.
|
|
56
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint", version: "0.1.6" };
|
|
57
57
|
/**
|
|
58
58
|
* Creates an endpoint of a Web Function. Used by `WebFunction`.
|
|
59
59
|
*
|
|
@@ -82,13 +82,14 @@ class WebFunctionEndpoint extends constructs_1.Construct {
|
|
|
82
82
|
url;
|
|
83
83
|
/** Grants on this endpoint (e.g. `grants.invoke(principal)`). */
|
|
84
84
|
grants;
|
|
85
|
+
/** The function this endpoint belongs to. */
|
|
86
|
+
webFunction;
|
|
85
87
|
/**
|
|
86
88
|
* The alarms this endpoint created for its deployment's `rollbackOn`, one per threshold in every region it serves from
|
|
87
89
|
* (the home region's first). Empty without `rollbackOn`.
|
|
88
90
|
*/
|
|
89
91
|
rollbackAlarms = [];
|
|
90
92
|
homeRegion;
|
|
91
|
-
webFunction;
|
|
92
93
|
resource;
|
|
93
94
|
weights;
|
|
94
95
|
routed = false;
|
|
@@ -175,14 +176,22 @@ class WebFunctionEndpoint extends constructs_1.Construct {
|
|
|
175
176
|
* @param region one of `regions`
|
|
176
177
|
*/
|
|
177
178
|
regionalUrl(region) {
|
|
179
|
+
return `https://${this.regionalDomainName(region)}`;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The domain name of this endpoint in one region. Only for `PER_REGION` endpoints.
|
|
183
|
+
*
|
|
184
|
+
* @param region one of `regions`
|
|
185
|
+
*/
|
|
186
|
+
regionalDomainName(region) {
|
|
178
187
|
if (this.endpointType !== enums_1.WebFunctionEndpointType.PER_REGION) {
|
|
179
|
-
throw new Error(`${this.node.path}:
|
|
188
|
+
throw new Error(`${this.node.path}: regional URLs and domain names are only available for PER_REGION endpoints (this one is ${this.endpointType}); use url or domainName`);
|
|
180
189
|
}
|
|
181
190
|
if (!this.regions.includes(region)) {
|
|
182
191
|
throw new Error(`${this.node.path}: region ${region} is not one of the endpoint's regions (${this.regions.join(', ')})`);
|
|
183
192
|
}
|
|
184
193
|
if (region === this.homeRegion) {
|
|
185
|
-
return this.
|
|
194
|
+
return this.domainName;
|
|
186
195
|
}
|
|
187
196
|
this.lookup ??= new endpoint_lookup_1.EndpointLookup(this, 'Lookup', {
|
|
188
197
|
functionName: this.webFunction.webFunctionName,
|
|
@@ -190,7 +199,7 @@ class WebFunctionEndpoint extends constructs_1.Construct {
|
|
|
190
199
|
endpointName: this.endpointName,
|
|
191
200
|
endpointArn: this.endpointArn,
|
|
192
201
|
});
|
|
193
|
-
return
|
|
202
|
+
return this.lookup.regionalDomain(region);
|
|
194
203
|
}
|
|
195
204
|
/**
|
|
196
205
|
* Routes the endpoint to `revision` instead of the function's current revision, optionally sharing
|
|
@@ -435,4 +444,4 @@ function defaultEndpointName(prefix, seed, endpointType, extraRegions) {
|
|
|
435
444
|
const hash = (0, node_crypto_1.createHash)('sha256').update([...(seed !== undefined ? [seed] : []), endpointType, ...extraRegions].join(',')).digest('hex').slice(0, 8);
|
|
436
445
|
return `${prefix}-${hash}`;
|
|
437
446
|
}
|
|
438
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWVuZHBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi1lbmRwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXlDO0FBQ3pDLDZDQUErRTtBQUMvRSx1RUFBeUQ7QUFFekQsK0RBQWlEO0FBQ2pELDJDQUF1QztBQUN2QyxtQ0FBdUU7QUFDdkUsK0RBQTJEO0FBQzNELCtDQUcyQjtBQUMzQiw2REFBNEU7QUFFNUUsMkRBQXVEO0FBQ3ZELHFEQUFxRjtBQUdyRiwrREFBMEQ7QUFxSTFEOzs7O0dBSUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLHNCQUFTOztJQUNoRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUNqRixPQUFPLElBQUksbUJBQW1CLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsMkJBQTJCO0lBQ1gsWUFBWSxDQUFTO0lBRXJDLDBCQUEwQjtJQUNWLFdBQVcsQ0FBUztJQUVwQyw4Q0FBOEM7SUFDOUIsWUFBWSxDQUEwQjtJQUV0RCxxREFBcUQ7SUFDckMsUUFBUSxDQUFzQjtJQUU5QywyR0FBMkc7SUFDM0YsT0FBTyxDQUFXO0lBRWxDOztPQUVHO0lBQ2EsVUFBVSxDQUFTO0lBRW5DOztPQUVHO0lBQ2EsR0FBRyxDQUFTO0lBRTVCLGlFQUFpRTtJQUNqRCxNQUFNLENBQW9CO0lBRTFDOzs7T0FHRztJQUNhLGNBQWMsR0FBd0IsRUFBRSxDQUFDO0lBRXhDLFVBQVUsQ0FBUztJQUNuQixXQUFXLENBQWU7SUFDMUIsUUFBUSxDQUFnQztJQUNqRCxPQUFPLENBQXlEO0lBQ2hFLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDTixPQUFPLENBQVU7SUFDMUIsTUFBTSxDQUFrQjtJ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QyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNySixPQUFPLEdBQUcsTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgQW5ub3RhdGlvbnMsIER1cmF0aW9uLCBTdGFjaywgVG9rZW4sIFZhbGlkYXRpb25zIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgY2xvdWR3YXRjaCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uQXV0aFR5cGUsIFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi9lbnVtcyc7XG5pbXBvcnQgeyBFbmRwb2ludExvb2t1cCB9IGZyb20gJy4vcHJpdmF0ZS9lbmRwb2ludC1sb29rdXAnO1xuaW1wb3J0IHtcbiAgQ0xJRU5UX0VSUk9SUywgREVGQVVMVF9QRVJJT0QsIFJFUVVFU1RTLCBTRVJWRVJfRVJST1JTLCBVU0FHRV9OQU1FU1BBQ0UsIFdFQl9OQU1FU1BBQ0UsXG4gIGVuZHBvaW50RGltZW5zaW9ucywgcmF0ZUFsYXJtUXVlcmllcywgcmF0ZUV4cHJlc3Npb24sXG59IGZyb20gJy4vcHJpdmF0ZS9tZXRyaWNzJztcbmltcG9ydCB7IEFMQVJNX05BTUVfUFJFRklYLCBSZWdpb25hbEFsYXJtIH0gZnJvbSAnLi9wcml2YXRlL3JlZ2lvbmFsLWFsYXJtJztcbmltcG9ydCB0eXBlIHsgUmVzb2x2ZWRSb2xsYmFja09wdGlvbnMgfSBmcm9tICcuL3ByaXZhdGUvcm9sbGJhY2snO1xuaW1wb3J0IHsgVHJhZmZpY1NoaWZ0IH0gZnJvbSAnLi9wcml2YXRlL3RyYWZmaWMtc2hpZnQnO1xuaW1wb3J0IHsgQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSwgYXNzZXJ0UmVzb3VyY2VOYW1lIH0gZnJvbSAnLi9wcml2YXRlL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHR5cGUgeyBJV2ViRnVuY3Rpb24gfSBmcm9tICcuL3dlYi1mdW5jdGlvbic7XG5pbXBvcnQgdHlwZSB7IFdlYkZ1bmN0aW9uRGVwbG95bWVudCB9IGZyb20gJy4vd2ViLWZ1bmN0aW9uLWRlcGxveW1lbnQnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25HcmFudHMgfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1ncmFudHMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViRnVuY3Rpb25SZXZpc2lvbiB9IGZyb20gJy4vd2ViLWZ1bmN0aW9uLXJldmlzaW9uJztcblxuLyoqXG4gKiBBIHJldmlzaW9uIGFuZCB0aGUgc2hhcmUgb2YgYW4gZW5kcG9pbnQncyB0cmFmZmljIGl0IHJlY2VpdmVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uUmV2aXNpb25XZWlnaHQge1xuICAvKiogVGhlIHJldmlzaW9uLiAqL1xuICByZWFkb25seSByZXZpc2lvbjogSVdlYkZ1bmN0aW9uUmV2aXNpb247XG5cbiAgLyoqXG4gICAqIFRoZSByZXZpc2lvbidzIHNoYXJlIG9mIHRoZSBlbmRwb2ludCdzIHRyYWZmaWMsIGFzIGEgZnJhY3Rpb24gKGxpa2UgYGxhbWJkYS5BbGlhc2AgYGFkZGl0aW9uYWxWZXJzaW9uc2ApLlxuICAgKiBNdXN0IGJlIGEgd2hvbGUgcGVyY2VudGFnZSBmcm9tIDAuMDEgdG8gMC45OS5cbiAgICovXG4gIHJlYWRvbmx5IHdlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGEgV2ViIEZ1bmN0aW9uJ3MgZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnMge1xuICAvKipcbiAgICogV2hlcmUgdGhlIGVuZHBvaW50IHNlcnZlcyB0cmFmZmljIGZyb20uXG4gICAqXG4gICAqIEBkZWZhdWx0IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLkhPTUVfUkVHSU9OXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludFR5cGU/OiBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZTtcblxuICAvKipcbiAgICogUmVnaW9ucyB0byBzZXJ2ZSBmcm9tIGluIGFkZGl0aW9uIHRvIHRoZSBob21lIHJlZ2lvbiAodGhlIHN0YWNrJ3MgcmVnaW9uKS5cbiAgICogUmVxdWlyZWQgKGF0IGxlYXN0IG9uZSkgZm9yIGBNVUxUSV9SRUdJT05gIGFuZCBgUEVSX1JFR0lPTmA7IG11c3QgYmUgZW1wdHkgZm9yIGBIT01FX1JFR0lPTmAuXG4gICAqXG4gICAqIENoYW5naW5nIHRoaXMgY3JlYXRlcyBhIG5ldyBlbmRwb2ludCB3aXRoIGEgbmV3IFVSTC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBleHRyYSByZWdpb25zXG4gICAqL1xuICByZWFkb25seSByZWdpb25zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBlbmRwb2ludCdzIG5hbWUsIHNob3duIGluIGxvZ3MgKGBlbmRwb2ludE5hbWVgKSBhbmQgaW4gdGhlIGBsYW1iZGEtd2ViLWVuZHBvaW50LW5hbWVgIGhlYWRlci5cbiAgICogTmFtZXMgYXJlIHVuaXF1ZSBwZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgdGhlIG5hbWUgZW5kcyBpbiBhIGhhc2ggb2YgdGhlIGVuZHBvaW50IHR5cGUgYW5kIHJlZ2lvbnMsIHNvIGNoYW5naW5nIGVpdGhlciBkZXBsb3lzXG4gICAqIGEgbmV3IGVuZHBvaW50IGNsZWFubHkuIFdoZW4gc2V0LCBjaGFuZ2luZyB0aGUgZW5kcG9pbnQgdHlwZSBvciByZWdpb25zIGFsc28gcmVxdWlyZXMgYSBuZXcgbmFtZTpcbiAgICogdHdvIGVuZHBvaW50cyBvZiBvbmUgZnVuY3Rpb24gY2FuJ3Qgc2hhcmUgYSBuYW1lLCBhbmQgQ2xvdWRGb3JtYXRpb24gY3JlYXRlcyB0aGUgcmVwbGFjZW1lbnRcbiAgICogYmVmb3JlIGRlbGV0aW5nIHRoZSBvbGQgb25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGBkZWZhdWx0LTxoYXNoPmAgZm9yIHRoZSBmdW5jdGlvbidzIGRlZmF1bHQgZW5kcG9pbnQsIGA8aWQ+LTxoYXNoPmAgZm9yIGVuZHBvaW50cyBhZGRlZCB3aXRoIGBhZGRFbmRwb2ludGBcbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9zdCByZXF1ZXN0cyBwZXIgc2Vjb25kIHRoZSBlbmRwb2ludCBhY2NlcHRzOyBleGNlc3MgcmVxdWVzdHMgZ2V0IEhUVFAgNDI5LlxuICAgKiBBbGxvd2VkOiAwIChibG9ja3MgYWxsIHRyYWZmaWMpLCAxMDDigJMxLDAwMCBpbiBzdGVwcyBvZiAxMDAsIG9yIDIsMDAw4oCTMTAsMDAwIGluIHN0ZXBzIG9mIDEsMDAwLlxuICAgKlxuICAgKiBFbmZvcmNlZCBzZXBhcmF0ZWx5IGluIGVhY2ggcmVnaW9uIHRoZSBlbmRwb2ludCBzZXJ2ZXMgZnJvbSwgc28gYSBtdWx0aS1yZWdpb24gZW5kcG9pbnRcbiAgICogY2FuIGFjY2VwdCB0aGlzIG1hbnkgcmVxdWVzdHMgcGVyIHNlY29uZCBpbiBldmVyeSByZWdpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbGltaXQgYmV5b25kIHRoZSBzZXJ2aWNlIHF1b3RhIG9mIDEwLDAwMCByZXF1ZXN0cyBwZXIgc2Vjb25kIHBlciBlbmRwb2ludCAocGVyIHJlZ2lvbilcbiAgICovXG4gIHJlYWRvbmx5IHJhdGVMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1vc3QgZXhlY3V0aW9uIGVudmlyb25tZW50cyB0aGUgZW5kcG9pbnQgbWF5IHVzZSAoMuKAkzEwLDAwMCkuIEVhY2ggb25lIHVzZXMgMiB2Q1BVcyBvZiB0aGUgYWNjb3VudCdzIHF1b3RhLlxuICAgKlxuICAgKiBFbmZvcmNlZCBzZXBhcmF0ZWx5IGluIGVhY2ggcmVnaW9uIHRoZSBlbmRwb2ludCBzZXJ2ZXMgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzY2FsZXMgd2l0aGluIHRoZSBhY2NvdW50J3MgdkNQVSBxdW90YVxuICAgKi9cbiAgcmVhZG9ubHkgbWF4RW52aXJvbm1lbnRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGVuZHBvaW50IG1vdmVzIGl0cyB0cmFmZmljIHRvIGEgbmV3IHJldmlzaW9uOiBhbGwgYXQgb25jZSwgb3IgaW4gc3RlcHNcbiAgICogKGBXZWJGdW5jdGlvbkRlcGxveW1lbnQuY2FuYXJ5KClgIG9yIGBsaW5lYXIoKWApIHRoYXQgd2F0Y2ggQ2xvdWRXYXRjaCBhbGFybXMgYW5kIG1vdmVcbiAgICogdGhlIHRyYWZmaWMgYmFjayB3aGVuIG9uZSBnb2VzIGludG8gQUxBUk0uXG4gICAqXG4gICAqIEEgZGVwbG95bWVudCBpbiBzdGVwcyBjYW4ndCBiZSBjb21iaW5lZCB3aXRoIGByZXZpc2lvbmAsIGBhZGRpdGlvbmFsUmV2aXNpb25zYCBvciBgcm91dGVUcmFmZmljKClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBXZWJGdW5jdGlvbkRlcGxveW1lbnQuYWxsQXRPbmNlKClcbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnQ/OiBXZWJGdW5jdGlvbkRlcGxveW1lbnQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYFdlYkZ1bmN0aW9uLmFkZEVuZHBvaW50YC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyBleHRlbmRzIFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEhvdyBjYWxsZXJzIG9mIHRoaXMgZW5kcG9pbnQgYXJlIGF1dGhlbnRpY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBhdXRoVHlwZTogV2ViRnVuY3Rpb25BdXRoVHlwZTtcblxuICAvKipcbiAgICogVGhlIHJldmlzaW9uIHRoZSBlbmRwb2ludCBzZXJ2ZXMsIGUuZy4gYW4gZWFybGllciBvbmUgZnJvbSBgV2ViRnVuY3Rpb25SZXZpc2lvbi5mcm9tUmV2aXNpb25BdHRyaWJ1dGVzYFxuICAgKiB0byBrZWVwIHRoaXMgZW5kcG9pbnQgb24gaXQgd2hpbGUgb3RoZXJzIG1vdmUgb24uIFNhbWUgYXMgY2FsbGluZyBgcm91dGVUcmFmZmljYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgZnVuY3Rpb24ncyBjdXJyZW50IHJldmlzaW9uIChgY3VycmVudFJldmlzaW9uYClcbiAgICovXG4gIHJlYWRvbmx5IHJldmlzaW9uPzogSVdlYkZ1bmN0aW9uUmV2aXNpb247XG5cbiAgLyoqXG4gICAqIEEgc2Vjb25kIHJldmlzaW9uIGFuZCBpdHMgc2hhcmUgb2YgdGhlIGVuZHBvaW50J3MgdHJhZmZpYzsgYHJldmlzaW9uYCBnZXRzIHRoZSByZXN0LlxuICAgKiBBbiBlbmRwb2ludCByb3V0ZXMgdG8gYXQgbW9zdCB0d28gcmV2aXNpb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFsbCB0cmFmZmljIGdvZXMgdG8gYHJldmlzaW9uYFxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbFJldmlzaW9ucz86IFdlYkZ1bmN0aW9uUmV2aXNpb25XZWlnaHRbXTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbDogaG93IGBXZWJGdW5jdGlvbmAgY3JlYXRlcyBpdHMgZW5kcG9pbnRzLiBOb3QgcGFydCBvZiB0aGUgcHVibGljIEFQSS5cbiAqL1xuaW50ZXJmYWNlIFdlYkZ1bmN0aW9uRW5kcG9pbnRQcm9wcyBleHRlbmRzIEFkZFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zIHtcbiAgLyoqIFRoZSBmdW5jdGlvbiB0aGF0IG93bnMgdGhlIGVuZHBvaW50LiAqL1xuICByZWFkb25seSB3ZWJGdW5jdGlvbjogSVdlYkZ1bmN0aW9uO1xuXG4gIC8qKiBUaGUgZnVuY3Rpb24ncyBjdXJyZW50IHJldmlzaW9uLCBzZXJ2ZWQgdW5sZXNzIGByZXZpc2lvbmAgaXMgZ2l2ZW4uICovXG4gIHJlYWRvbmx5IGN1cnJlbnRSZXZpc2lvbjogSVdlYkZ1bmN0aW9uUmV2aXNpb247XG5cbiAgLyoqIFByZWZpeCBvZiB0aGUgZ2VuZXJhdGVkIGVuZHBvaW50IG5hbWUuICovXG4gIHJlYWRvbmx5IG5hbWVQcmVmaXg6IHN0cmluZztcblxuICAvKiogRXh0cmEgaW5wdXQgdG8gdGhlIGdlbmVyYXRlZCBuYW1lJ3MgaGFzaCAodGhlIGNvbnN0cnVjdCBJRCBvZiBhbiBhZGRlZCBlbmRwb2ludCkuICovXG4gIHJlYWRvbmx5IG5hbWVTZWVkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuIEhUVFBTIGVuZHBvaW50IG9mIGEgV2ViIEZ1bmN0aW9uOiBgZm4uZW5kcG9pbnRgICh0aGUgZGVmYXVsdCBvbmUpIG9yIHRoZSByZXN1bHQgb2YgYGZuLmFkZEVuZHBvaW50KClgLlxuICpcbiAqIEVuZHBvaW50cyBhcmUgY3JlYXRlZCBvbmx5IHRocm91Z2ggYFdlYkZ1bmN0aW9uYCwgd2hpY2ggb3ducyB0aGVpciBsb2cgZ3JvdXBzIGluIGV2ZXJ5IHJlZ2lvbiwgc28gdGhlIGNvbnN0cnVjdG9yIGlzIHByaXZhdGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJGdW5jdGlvbkVuZHBvaW50IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gZW5kcG9pbnQgb2YgYSBXZWIgRnVuY3Rpb24uIFVzZWQgYnkgYFdlYkZ1bmN0aW9uYC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIF9jcmVhdGUoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdlYkZ1bmN0aW9uRW5kcG9pbnRQcm9wcyk6IFdlYkZ1bmN0aW9uRW5kcG9pbnQge1xuICAgIHJldHVybiBuZXcgV2ViRnVuY3Rpb25FbmRwb2ludChzY29wZSwgaWQsIHByb3BzKTtcbiAgfVxuXG4gIC8qKiBUaGUgZW5kcG9pbnQncyBuYW1lLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnROYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBlbmRwb2ludCdzIEFSTi4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50QXJuOiBzdHJpbmc7XG5cbiAgLyoqIFdoZXJlIHRoZSBlbmRwb2ludCBzZXJ2ZXMgdHJhZmZpYyBmcm9tLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnRUeXBlOiBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZTtcblxuICAvKiogSG93IGNhbGxlcnMgb2YgdGhlIGVuZHBvaW50IGFyZSBhdXRoZW50aWNhdGVkLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXV0aFR5cGU6IFdlYkZ1bmN0aW9uQXV0aFR5cGU7XG5cbiAgLyoqIEV2ZXJ5IHJlZ2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzIGZyb206IHRoZSBob21lIHJlZ2lvbiBmaXJzdCwgdGhlbiB0aGUgb3RoZXJzIGluIGFscGhhYmV0aWNhbCBvcmRlci4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlZ2lvbnM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZW5kcG9pbnQncyBkb21haW4gbmFtZTogdGhlIGdsb2JhbCBkb21haW4gZm9yIGBNVUxUSV9SRUdJT05gLCBvdGhlcndpc2UgdGhlIGhvbWUgcmVnaW9uJ3MuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZG9tYWluTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZW5kcG9pbnQncyBVUkw6IHRoZSBnbG9iYWwgVVJMIGZvciBgTVVMVElfUkVHSU9OYCwgb3RoZXJ3aXNlIHRoZSBob21lIHJlZ2lvbidzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuXG4gIC8qKiBHcmFudHMgb24gdGhpcyBlbmRwb2ludCAoZS5nLiBgZ3JhbnRzLmludm9rZShwcmluY2lwYWwpYCkuICovXG4gIHB1YmxpYyByZWFkb25seSBncmFudHM6IFdlYkZ1bmN0aW9uR3JhbnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgYWxhcm1zIHRoaXMgZW5kcG9pbnQgY3JlYXRlZCBmb3IgaXRzIGRlcGxveW1lbnQncyBgcm9sbGJhY2tPbmAsIG9uZSBwZXIgdGhyZXNob2xkIGluIGV2ZXJ5IHJlZ2lvbiBpdCBzZXJ2ZXMgZnJvbVxuICAgKiAodGhlIGhvbWUgcmVnaW9uJ3MgZmlyc3QpLiBFbXB0eSB3aXRob3V0IGByb2xsYmFja09uYC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb2xsYmFja0FsYXJtczogY2xvdWR3YXRjaC5JQWxhcm1bXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaG9tZVJlZ2lvbjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHdlYkZ1bmN0aW9uOiBJV2ViRnVuY3Rpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2U6IGxhbWJkYS5DZm5XZWJGdW5jdGlvbkVuZHBvaW50O1xuICBwcml2YXRlIHdlaWdodHM6IGxhbWJkYS5DZm5XZWJGdW5jdGlvbkVuZHBvaW50LlJldmlzaW9uV2VpZ2h0UHJvcGVydHlbXTtcbiAgcHJpdmF0ZSByb3V0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBncmFkdWFsOiBib29sZWFuO1xuICBwcml2YXRlIGxvb2t1cD86IEVuZHBvaW50TG9va3VwO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdlYkZ1bmN0aW9uRW5kcG9pbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBob21lUmVnaW9uID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuICAgIGNvbnN0IGVuZHBvaW50VHlwZSA9IHByb3BzLmVuZHBvaW50VHlwZSA/PyBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTjtcbiAgICBjb25zdCBleHRyYVJlZ2lvbnMgPSBub3JtYWxpc2VSZWdpb25zKHRoaXMsIGVuZHBvaW50VHlwZSwgaG9tZVJlZ2lvbiwgcHJvcHMucmVnaW9ucyA/PyBbXSk7XG4gICAgdmFsaWRhdGVSYXRlTGltaXQodGhpcywgcHJvcHMucmF0ZUxpbWl0KTtcbiAgICB2YWxpZGF0ZU1heEVudmlyb25tZW50cyh0aGlzLCBwcm9wcy5tYXhFbnZpcm9ubWVudHMpO1xuXG4gICAgaWYgKHByb3BzLmVuZHBvaW50TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhc3NlcnRSZXNvdXJjZU5hbWUodGhpcywgJ2VuZHBvaW50TmFtZScsIHByb3BzLmVuZHBvaW50TmFtZSk7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoJ0BjZGstbGFtYmRhLXdlYjpleHBsaWNpdEVuZHBvaW50TmFtZScsXG4gICAgICAgIGBlbmRwb2ludE5hbWUgJyR7cHJvcHMuZW5kcG9pbnROYW1lfScgaXMgc2V0IGV4cGxpY2l0bHk6IGNoYW5naW5nIGVuZHBvaW50VHlwZSBvciByZWdpb25zIGxhdGVyIGFsc28gcmVxdWlyZXMgYSBuZXcgZW5kcG9pbnROYW1lLCBvdGhlcndpc2UgdGhlIGRlcGxveW1lbnQgZmFpbHMgd2l0aCBcImFscmVhZHkgZXhpc3RzXCIgKHRoZSBzdGFjayByb2xscyBiYWNrIHNhZmVseSkuIE9taXQgZW5kcG9pbnROYW1lIHRvIGdldCBhIG5hbWUgdGhhdCBjaGFuZ2VzIGF1dG9tYXRpY2FsbHkuYCk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5hdXRoVHlwZSA9PT0gV2ViRnVuY3Rpb25BdXRoVHlwZS5OT05FKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoJ0BjZGstbGFtYmRhLXdlYjphdXRoVHlwZU5vbmUnLFxuICAgICAgICAnYXV0aFR5cGUgTk9ORSBtYWtlcyB0aGUgZW5kcG9pbnQgcHVibGljOiBMYW1iZGEgZG9lcyBubyBhdXRoZW50aWNhdGlvbiwgc28geW91ciBhcHBsaWNhdGlvbiBtdXN0IGF1dGhlbnRpY2F0ZSByZXF1ZXN0cyBpdHNlbGYuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5lbmRwb2ludFR5cGUgPSBlbmRwb2ludFR5cGU7XG4gICAgdGhpcy5hdXRoVHlwZSA9IHByb3BzLmF1dGhUeXBlO1xuICAgIHRoaXMuZW5kcG9pbnROYW1lID0gcHJvcHMuZW5kcG9pbnROYW1lID8/IGRlZmF1bHRFbmRwb2ludE5hbWUocHJvcHMubmFtZVByZWZpeCwgcHJvcHMubmFtZVNlZWQsIGVuZHBvaW50VHlwZSwgZXh0cmFSZWdpb25zKTtcbiAgICB0aGlzLnJlZ2lvbnMgPSBbaG9tZVJlZ2lvbiwgLi4uZXh0cmFSZWdpb25zXTtcbiAgICB0aGlzLmhvbWVSZWdpb24gPSBob21lUmVnaW9uO1xuICAgIHRoaXMud2ViRnVuY3Rpb24gPSBwcm9wcy53ZWJGdW5jdGlvbjtcbiAgICB0aGlzLndlaWdodHMgPSBbeyByZXZpc2lvbklkOiBwcm9wcy5jdXJyZW50UmV2aXNpb24ucmV2aXNpb25JZCwgd2VpZ2h0OiAxMDAgfV07XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IG5ldyBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25FbmRwb2ludCh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IHByb3BzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uQXJuLFxuICAgICAgZW5kcG9pbnROYW1lOiB0aGlzLmVuZHBvaW50TmFtZSxcbiAgICAgIGVuZHBvaW50VHlwZSxcbiAgICAgIGF1dGhUeXBlOiBwcm9wcy5hdXRoVHlwZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHJlZ2lvbnM6IGV4dHJhUmVnaW9ucy5sZW5ndGggPiAwID8gZXh0cmFSZWdpb25zIDogdW5kZWZpbmVkLFxuICAgICAgcmV2aXNpb25XZWlnaHRzOiB0aGlzLndlaWdodHMsXG4gICAgICB0aHJvdHRsZUNvbmZpZzogcHJvcHMucmF0ZUxpbWl0ICE9PSB1bmRlZmluZWQgPyB7IHJhdGVMaW1pdDogcHJvcHMucmF0ZUxpbWl0IH0gOiB1bmRlZmluZWQsXG4gICAgICBzY2FsaW5nQ29uZmlnOiBwcm9wcy5tYXhFbnZpcm9ubWVudHMgIT09IHVuZGVmaW5lZCA/IHsgbWF4RW52aXJvbm1lbnRzOiBwcm9wcy5tYXhFbnZpcm9ubWVudHMgfSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICBWYWxpZGF0aW9ucy5vZihyZXNvdXJjZSkuYWNrbm93bGVkZ2UoQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSk7XG4gICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlO1xuXG4gICAgdGhpcy5ncmFkdWFsID0gcHJvcHMuZGVwbG95bWVudD8uX2dyYWR1YWwgPz8gZmFsc2U7XG4gICAgaWYgKHByb3BzLmRlcGxveW1lbnQ/Ll9ncmFkdWFsKSB7XG4gICAgICBpZiAocHJvcHMucmV2aXNpb24gIT09IHVuZGVmaW5lZCB8fCBwcm9wcy5hZGRpdGlvbmFsUmV2aXNpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogYW4gZW5kcG9pbnQgd2l0aCBhICR7cHJvcHMuZGVwbG95bWVudC5fa2luZH0gZGVwbG95bWVudCBhbHdheXMgbW92ZXMgdG8gdGhlIGN1cnJlbnQgcmV2aXNpb247IGl0IGNhbid0IGFsc28gc2V0IHJldmlzaW9uIG9yIGFkZGl0aW9uYWxSZXZpc2lvbnNgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJvbGxiYWNrQWxhcm1Bcm5zID0gcHJvcHMuZGVwbG95bWVudC5fcm9sbGJhY2tPbiA/IHRoaXMuY3JlYXRlUm9sbGJhY2tBbGFybXMocHJvcHMuZGVwbG95bWVudC5fcm9sbGJhY2tPbikgOiBbXTtcbiAgICAgIGNvbnN0IHdhaXRTZWNvbmRzID0gcHJvcHMuZGVwbG95bWVudC5fd2FpdFNlY29uZHM7XG4gICAgICBjb25zdCByb2xsYmFjayA9IHByb3BzLmRlcGxveW1lbnQuX3JvbGxiYWNrT247XG4gICAgICBpZiAocm9sbGJhY2sgJiYgd2FpdFNlY29uZHMgPCByb2xsYmFjay5wZXJpb2QudG9TZWNvbmRzKCkgKiByb2xsYmFjay5ldmFsdWF0aW9uUGVyaW9kcyArIDEyMCkge1xuICAgICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoJ0BjZGstbGFtYmRhLXdlYjpyb2xsYmFja1Nsb3dlclRoYW5TdGVwJyxcbiAgICAgICAgICBgcm9sbGJhY2tPbiBuZWVkcyAke3JvbGxiYWNrLmV2YWx1YXRpb25QZXJpb2RzfSBwZXJpb2Qocykgb2YgJHtyb2xsYmFjay5wZXJpb2QudG9IdW1hblN0cmluZygpfSBwbHVzIGFib3V0IDIgbWludXRlcyBvZiBDbG91ZFdhdGNoIGRlbGF5IHRvIGZpcmUsIGxvbmdlciB0aGFuIGVhY2ggJHtwcm9wcy5kZXBsb3ltZW50Ll9raW5kfSBzdGVwICgke0R1cmF0aW9uLnNlY29uZHMod2FpdFNlY29uZHMpLnRvSHVtYW5TdHJpbmcoKX0pOiBhIGJhZCByZXZpc2lvbiBjYW4gcmVhY2ggdGhlIG5leHQgc3RlcCBiZWZvcmUgaXRzIGFsYXJtIGZpcmVzLmApO1xuICAgICAgfVxuICAgICAgLy8gTW92ZXMgdGhlIHRyYWZmaWMgaW4gc3RlcHMgYmVmb3JlIENsb3VkRm9ybWF0aW9uIHdyaXRlcyB0aGUgZW5kcG9pbnQsIHdoaWNoIHRoZW4gZmluZHMgaXQgYWxyZWFkeSBkb25lLlxuICAgICAgY29uc3Qgc2hpZnQgPSBuZXcgVHJhZmZpY1NoaWZ0KHRoaXMsICdEZXBsb3ltZW50Jywge1xuICAgICAgICBmdW5jdGlvbk5hbWU6IHByb3BzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uTmFtZSxcbiAgICAgICAgZnVuY3Rpb25Bcm46IHByb3BzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uQXJuLFxuICAgICAgICBlbmRwb2ludE5hbWU6IHRoaXMuZW5kcG9pbnROYW1lLFxuICAgICAgICByZXZpc2lvbklkOiBwcm9wcy5jdXJyZW50UmV2aXNpb24ucmV2aXNpb25JZCxcbiAgICAgICAgZGVwbG95bWVudDogcHJvcHMuZGVwbG95bWVudCxcbiAgICAgICAgYWxhcm1Bcm5zOiByb2xsYmFja0FsYXJtQXJucyxcbiAgICAgICAgZW5kcG9pbnRDb25maWc6IHtcbiAgICAgICAgICBlbmRwb2ludFR5cGUsXG4gICAgICAgICAgYXV0aFR5cGU6IHByb3BzLmF1dGhUeXBlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICByZWdpb25zOiBleHRyYVJlZ2lvbnMsXG4gICAgICAgICAgcmF0ZUxpbWl0OiBwcm9wcy5yYXRlTGltaXQsXG4gICAgICAgICAgbWF4RW52aXJvbm1lbnRzOiBwcm9wcy5tYXhFbnZpcm9ubWVudHMsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShzaGlmdCk7XG4gICAgICAvLyBBbGFybXMgaW4gb3RoZXIgcmVnaW9ucyBhcmUgb25seSByZWZlcmVuY2VkIGJ5IEFSTi5cbiAgICAgIGZvciAoY29uc3QgYWxhcm0gb2YgdGhpcy5ub2RlLmZpbmRBbGwoKS5maWx0ZXIoKGMpID0+IGMgaW5zdGFuY2VvZiBSZWdpb25hbEFsYXJtKSkgc2hpZnQubm9kZS5hZGREZXBlbmRlbmN5KGFsYXJtKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLnJldmlzaW9uICE9PSB1bmRlZmluZWQgfHwgcHJvcHMuYWRkaXRpb25hbFJldmlzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJvdXRlVHJhZmZpYyhwcm9wcy5yZXZpc2lvbiA/PyBwcm9wcy5jdXJyZW50UmV2aXNpb24sIHByb3BzLmFkZGl0aW9uYWxSZXZpc2lvbnMpO1xuICAgIH1cblxuICAgIHRoaXMuZW5kcG9pbnRBcm4gPSByZXNvdXJjZS5hdHRyRW5kcG9pbnRBcm47XG4gICAgdGhpcy5kb21haW5OYW1lID0gcmVzb3VyY2UuYXR0ckRvbWFpbk5hbWU7XG4gICAgdGhpcy51cmwgPSBgaHR0cHM6Ly8ke3Jlc291cmNlLmF0dHJEb21haW5OYW1lfWA7XG4gICAgdGhpcy5ncmFudHMgPSBXZWJGdW5jdGlvbkdyYW50cy5fZm9yRW5kcG9pbnQodGhpcywgcHJvcHMud2ViRnVuY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBVUkwgb2YgdGhpcyBlbmRwb2ludCBpbiBvbmUgcmVnaW9uLiBPbmx5IGZvciBgUEVSX1JFR0lPTmAgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAcGFyYW0gcmVnaW9uIG9uZSBvZiBgcmVnaW9uc2BcbiAgICovXG4gIHB1YmxpYyByZWdpb25hbFVybChyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZW5kcG9pbnRUeXBlICE9PSBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5QRVJfUkVHSU9OKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiByZWdpb25hbFVybCgpIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBQRVJfUkVHSU9OIGVuZHBvaW50cyAodGhpcyBvbmUgaXMgJHt0aGlzLmVuZHBvaW50VHlwZX0pOyB1c2UgdXJsYCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5yZWdpb25zLmluY2x1ZGVzKHJlZ2lvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHJlZ2lvbiAke3JlZ2lvbn0gaXMgbm90IG9uZSBvZiB0aGUgZW5kcG9pbnQncyByZWdpb25zICgke3RoaXMucmVnaW9ucy5qb2luKCcsICcpfSlgKTtcbiAgICB9XG4gICAgaWYgKHJlZ2lvbiA9PT0gdGhpcy5ob21lUmVnaW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy51cmw7XG4gICAgfVxuICAgIHRoaXMubG9va3VwID8/PSBuZXcgRW5kcG9pbnRMb29rdXAodGhpcywgJ0xvb2t1cCcsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogdGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbk5hbWUsXG4gICAgICBmdW5jdGlvbkFybjogdGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbkFybixcbiAgICAgIGVuZHBvaW50TmFtZTogdGhpcy5lbmRwb2ludE5hbWUsXG4gICAgICBlbmRwb2ludEFybjogdGhpcy5lbmRwb2ludEFybixcbiAgICB9KTtcbiAgICByZXR1cm4gYGh0dHBzOi8vJHt0aGlzLmxvb2t1cC5yZWdpb25hbERvbWFpbihyZWdpb24pfWA7XG4gIH1cblxuICAvKipcbiAgICogUm91dGVzIHRoZSBlbmRwb2ludCB0byBgcmV2aXNpb25gIGluc3RlYWQgb2YgdGhlIGZ1bmN0aW9uJ3MgY3VycmVudCByZXZpc2lvbiwgb3B0aW9uYWxseSBzaGFyaW5nXG4gICAqIHRyYWZmaWMgd2l0aCBvbmUgbW9yZSByZXZpc2lvbiAoYGFkZGl0aW9uYWxSZXZpc2lvbnNgLCB3aGljaCBnZXRzIGl0cyB3ZWlnaHQ7IGByZXZpc2lvbmAgZ2V0cyB0aGUgcmVzdCkuXG4gICAqXG4gICAqIFVzZSBpdCB0byBrZWVwIGFuIGVuZHBvaW50IG9uIGFuIGVhcmxpZXIgcmV2aXNpb24gKGBXZWJGdW5jdGlvblJldmlzaW9uLmZyb21SZXZpc2lvbkF0dHJpYnV0ZXNgKSxcbiAgICogb3IgdG8gc2VuZCBwYXJ0IG9mIHRoZSB0cmFmZmljIHRvIHRoZSBjdXJyZW50IHJldmlzaW9uOlxuICAgKiBgZm4uZW5kcG9pbnQucm91dGVUcmFmZmljKHByZXZpb3VzLCBbeyByZXZpc2lvbjogZm4uY3VycmVudFJldmlzaW9uLCB3ZWlnaHQ6IDAuMSB9XSlgLlxuICAgKiBDYW4gYmUgY2FsbGVkIG9uY2UgcGVyIGVuZHBvaW50LCBhbmQgbm90IG9uIG9uZSBjcmVhdGVkIHdpdGggYHJldmlzaW9uYCBvciBgYWRkaXRpb25hbFJldmlzaW9uc2AuXG4gICAqL1xuICBwdWJsaWMgcm91dGVUcmFmZmljKHJldmlzaW9uOiBJV2ViRnVuY3Rpb25SZXZpc2lvbiwgYWRkaXRpb25hbFJldmlzaW9ucz86IFdlYkZ1bmN0aW9uUmV2aXNpb25XZWlnaHRbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdyYWR1YWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHRoZSBlbmRwb2ludCBoYXMgYSBkZXBsb3ltZW50IGluIHN0ZXBzLCB3aGljaCBhbHdheXMgbW92ZXMgaXQgdG8gdGhlIGN1cnJlbnQgcmV2aXNpb247IHJvdXRlVHJhZmZpYygpIGNhbid0IGJlIHVzZWQgd2l0aCBpdGApO1xuICAgIH1cbiAgICBpZiAodGhpcy5yb3V0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHRoZSBlbmRwb2ludCdzIHJldmlzaW9ucyBhcmUgYWxyZWFkeSBzZXQgKHJldmlzaW9uLCBhZGRpdGlvbmFsUmV2aXNpb25zIG9yIHJvdXRlVHJhZmZpYylgKTtcbiAgICB9XG4gICAgdGhpcy53ZWlnaHRzID0gcmV2aXNpb25XZWlnaHRzKHRoaXMsIHRoaXMud2ViRnVuY3Rpb24sIHJldmlzaW9uLCBhZGRpdGlvbmFsUmV2aXNpb25zID8/IFtdKTtcbiAgICB0aGlzLnJlc291cmNlLnJldmlzaW9uV2VpZ2h0cyA9IHRoaXMud2VpZ2h0cztcbiAgICB0aGlzLnJvdXRlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIElEcyBvZiB0aGUgcmV2aXNpb25zIHRoaXMgZW5kcG9pbnQgcm91dGVzIHRvLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfcmV2aXNpb25JZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLndlaWdodHMubWFwKCh3KSA9PiB3LnJldmlzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbWV0cmljIG9mIHRoaXMgZW5kcG9pbnQgaW4gYEFXUy9MYW1iZGEvV2ViYCAoZGltZW5zaW9ucyBgRnVuY3Rpb25OYW1lYCBhbmQgYEVuZHBvaW50TmFtZWApLlxuICAgKlxuICAgKiBNZXRyaWNzIGFyZSBwdWJsaXNoZWQgaW4gdGhlIHJlZ2lvbiB0aGF0IHNlcnZlZCB0aGUgcmVxdWVzdDogcGFzcyBgcmVnaW9uYCBmb3Igb25lIG9mIHRoZSBlbmRwb2ludCdzXG4gICAqIG90aGVyIHJlZ2lvbnMuIEFuIGFsYXJtIGNhbiBvbmx5IHVzZSBtZXRyaWNzIGZyb20gaXRzIG93biBzdGFjaydzIHJlZ2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciAxIG1pbnV0ZSwgaW4gdGhlIGhvbWUgcmVnaW9uXG4gICAqL1xuICBwdWJsaWMgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgcHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICBuYW1lc3BhY2U6IFdFQl9OQU1FU1BBQ0UsXG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgZGltZW5zaW9uc01hcDogZW5kcG9pbnREaW1lbnNpb25zKHRoaXMubWV0cmljSWRzKCkpLFxuICAgICAgc3RhdGlzdGljOiBjbG91ZHdhdGNoLlN0YXRzLlNVTSxcbiAgICAgIHBlcmlvZDogREVGQVVMVF9QRVJJT0QsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXF1ZXN0cyB0aGUgZW5kcG9pbnQgc2VydmVkIChgRXhlY3V0ZWRSZXF1ZXN0c2ApLiBUaGVyZSdzIG5vIHNlcGFyYXRlIGNvdW50IG9mIHN1Y2Nlc3NmdWwgKDJYWCkgcmVzcG9uc2VzLiAqL1xuICBwdWJsaWMgbWV0cmljUmVxdWVzdHMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFJFUVVFU1RTLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgYW5zd2VyZWQgd2l0aCBhIDRYWCBzdGF0dXMgKGBIVFRQUmVzcG9uc2VTdGF0dXNDbGFzczRYWGApLCBpbmNsdWRpbmcgNDI5cyBmcm9tIGByYXRlTGltaXRgIGFuZCBgbWF4RW52aXJvbm1lbnRzYC5cbiAgICogVGhlIG1ldHJpYyBvbmx5IGV4aXN0cyBvbmNlIGl0J3Mgbm9uLXplcm8sIHNvIGFsYXJtcyBzaG91bGQgdHJlYXQgbWlzc2luZyBkYXRhIGFzIG5vdCBicmVhY2hpbmcuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljQ2xpZW50RXJyb3JzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhDTElFTlRfRVJST1JTLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgYW5zd2VyZWQgd2l0aCBhIDVYWCBzdGF0dXMgKGBIVFRQUmVzcG9uc2VTdGF0dXNDbGFzczVYWGApLiBJbmNsdWRlcyB0aGUgcGxhdGZvcm0ncyA1MDNzIHdoaWxlIHRoZSBlbmRwb2ludFxuICAgKiBzY2FsZXMgdXAgZm9yIGEgc3VkZGVuIGJ1cnN0LCBub3Qgb25seSB5b3VyIGFwcGxpY2F0aW9uJ3MgZXJyb3JzLiBUaGUgbWV0cmljIG9ubHkgZXhpc3RzIG9uY2UgaXQncyBub24temVyby5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNTZXJ2ZXJFcnJvcnMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFNFUlZFUl9FUlJPUlMsIHByb3BzKTtcbiAgfVxuXG4gIC8qKiBUaGUgcGVyY2VudGFnZSBvZiByZXF1ZXN0cyBhbnN3ZXJlZCB3aXRoIGEgNFhYIHN0YXR1cyAobWF0aCBleHByZXNzaW9uOyBwZXJpb2RzIHdpdGggbm8gNFhYIGNvdW50IGFzIDApLiAqL1xuICBwdWJsaWMgbWV0cmljQ2xpZW50RXJyb3JSYXRlKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NYXRoRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIHRoaXMucmF0ZShDTElFTlRfRVJST1JTLCAnQ2xpZW50IGVycm9yIHJhdGUgKCUpJywgcHJvcHMpO1xuICB9XG5cbiAgLyoqIFRoZSBwZXJjZW50YWdlIG9mIHJlcXVlc3RzIGFuc3dlcmVkIHdpdGggYSA1WFggc3RhdHVzIChtYXRoIGV4cHJlc3Npb247IHBlcmlvZHMgd2l0aCBubyA1WFggY291bnQgYXMgMCkuICovXG4gIHB1YmxpYyBtZXRyaWNTZXJ2ZXJFcnJvclJhdGUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1hdGhFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gdGhpcy5yYXRlKFNFUlZFUl9FUlJPUlMsICdTZXJ2ZXIgZXJyb3IgcmF0ZSAoJSknLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0aW9uIGVudmlyb25tZW50cyBzZXJ2aW5nIHRoZSBlbmRwb2ludCAoYEVuZHBvaW50QWN0aXZlRW52aXJvbm1lbnRzYCksIHRvIGNvbXBhcmUgd2l0aCBgbWF4RW52aXJvbm1lbnRzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBtYXhpbXVtIG92ZXIgMSBtaW51dGUsIGluIHRoZSBob21lIHJlZ2lvblxuICAgKi9cbiAgcHVibGljIG1ldHJpY0FjdGl2ZUVudmlyb25tZW50cyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy51c2FnZU1ldHJpYygnRW5kcG9pbnRBY3RpdmVFbnZpcm9ubWVudHMnLCBjbG91ZHdhdGNoLlN0YXRzLk1BWElNVU0sIHByb3BzKTtcbiAgfVxuXG4gIC8qKiBSZXF1ZXN0cyByZWplY3RlZCB3aXRoIDQyOSBiZWNhdXNlIHRoZSBlbmRwb2ludCByZWFjaGVkIGl0cyBgcmF0ZUxpbWl0YCAoYEVuZHBvaW50UmVxdWVzdFRocm90dGxlc2ApLiAqL1xuICBwdWJsaWMgbWV0cmljUmVxdWVzdFRocm90dGxlcyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy51c2FnZU1ldHJpYygnRW5kcG9pbnRSZXF1ZXN0VGhyb3R0bGVzJywgY2xvdWR3YXRjaC5TdGF0cy5TVU0sIHByb3BzKTtcbiAgfVxuXG4gIC8qKiBSZXF1ZXN0cyByZWplY3RlZCB3aXRoIDQyOSBiZWNhdXNlIHRoZSBlbmRwb2ludCByZWFjaGVkIGBtYXhFbnZpcm9ubWVudHNgIChgRW5kcG9pbnRBY3RpdmVFbnZpcm9ubWVudFRocm90dGxlc2ApLiAqL1xuICBwdWJsaWMgbWV0cmljRW52aXJvbm1lbnRUaHJvdHRsZXMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMudXNhZ2VNZXRyaWMoJ0VuZHBvaW50QWN0aXZlRW52aXJvbm1lbnRUaHJvdHRsZXMnLCBjbG91ZHdhdGNoLlN0YXRzLlNVTSwgcHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBgZ3JhbnRlZWAgdG8gY2FsbCB0aGlzIGVuZHBvaW50LiBTaG9ydGN1dCBmb3IgYGdyYW50cy5pbnZva2UoZ3JhbnRlZSlgLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICovXG4gIHB1YmxpYyBncmFudEludm9rZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnRzLmludm9rZShncmFudGVlKTtcbiAgfVxuXG4gIHByaXZhdGUgbWV0cmljSWRzKCkge1xuICAgIHJldHVybiB7IGZ1bmN0aW9uTmFtZTogdGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbk5hbWUsIGVuZHBvaW50TmFtZTogdGhpcy5lbmRwb2ludE5hbWUgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmF0ZShlcnJvck1ldHJpYzogc3RyaW5nLCBsYWJlbDogc3RyaW5nLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWF0aEV4cHJlc3Npb24ge1xuICAgIGNvbnN0IHBlcmlvZCA9IHByb3BzPy5wZXJpb2QgPz8gREVGQVVMVF9QRVJJT0Q7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgcGVyaW9kLCByZWdpb246IHByb3BzPy5yZWdpb24sIGFjY291bnQ6IHByb3BzPy5hY2NvdW50IH07XG4gICAgcmV0dXJuIG5ldyBjbG91ZHdhdGNoLk1hdGhFeHByZXNzaW9uKHtcbiAgICAgIGV4cHJlc3Npb246IHJhdGVFeHByZXNzaW9uKDEpLFxuICAgICAgdXNpbmdNZXRyaWNzOiB7IHJlcXVlc3RzOiB0aGlzLm1ldHJpYyhSRVFVRVNUUywgb3B0aW9ucyksIGVycm9yczogdGhpcy5tZXRyaWMoZXJyb3JNZXRyaWMsIG9wdGlvbnMpIH0sXG4gICAgICBwZXJpb2QsXG4gICAgICBsYWJlbDogcHJvcHM/LmxhYmVsID8/IGxhYmVsLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1c2FnZU1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHN0YXRpc3RpYzogc3RyaW5nLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIG5hbWVzcGFjZTogVVNBR0VfTkFNRVNQQUNFLFxuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHsgLi4uZW5kcG9pbnREaW1lbnNpb25zKHRoaXMubWV0cmljSWRzKCkpLCBFeGVjdXRpb25SZWdpb246IHByb3BzPy5yZWdpb24gPz8gdGhpcy5ob21lUmVnaW9uIH0sXG4gICAgICBzdGF0aXN0aWMsXG4gICAgICBwZXJpb2Q6IERFRkFVTFRfUEVSSU9ELFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogT25lIGFsYXJtIHBlciB0aHJlc2hvbGQgaW4gZXZlcnkgc2VydmluZyByZWdpb246IGEgQ2xvdWRGb3JtYXRpb24gYWxhcm0gYXQgaG9tZSwgYSBjdXN0b20gcmVzb3VyY2UgZWxzZXdoZXJlLiBSZXR1cm5zIHRoZWlyIEFSTnMuICovXG4gIHByaXZhdGUgY3JlYXRlUm9sbGJhY2tBbGFybXMocm9sbGJhY2s6IFJlc29sdmVkUm9sbGJhY2tPcHRpb25zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHRocmVzaG9sZHMgPSBbXG4gICAgICB7IGtleTogJ1NlcnZlckVycm9ycycsIHNob3J0OiAnNXh4JywgbWV0cmljOiBTRVJWRVJfRVJST1JTLCBzdGF0dXM6ICc1WFgnLCB0aHJlc2hvbGQ6IHJvbGxiYWNrLnNlcnZlckVycm9yUmF0ZSB9LFxuICAgICAgeyBrZXk6ICdDbGllbnRFcnJvcnMnLCBzaG9ydDogJzR4eCcsIG1ldHJpYzogQ0xJRU5UX0VSUk9SUywgc3RhdHVzOiAnNFhYJywgdGhyZXNob2xkOiByb2xsYmFjay5jbGllbnRFcnJvclJhdGUgfSxcbiAgICBdO1xuICAgIGNvbnN0IGFybnM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCB0IG9mIHRocmVzaG9sZHMpIHtcbiAgICAgIGlmICh0LnRocmVzaG9sZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3QgcmVnaW9uIG9mIHRoaXMucmVnaW9ucykge1xuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGBSb2xscyBiYWNrIGRlcGxveW1lbnRzIG9mIGVuZHBvaW50ICR7dGhpcy5lbmRwb2ludE5hbWV9IG9mICR7dGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbk5hbWV9IHdoZW4gbW9yZSB0aGFuIGBcbiAgICAgICAgICArIGAke3QudGhyZXNob2xkfSUgb2YgaXRzIHJlcXVlc3RzIGluICR7cmVnaW9ufSBnZXQgYSAke3Quc3RhdHVzfSByZXNwb25zZSAoJHtyb2xsYmFjay5ldmFsdWF0aW9uUGVyaW9kc30geCAke3JvbGxiYWNrLnBlcmlvZC50b0h1bWFuU3RyaW5nKCl9LCBgXG4gICAgICAgICAgKyBgcGVyaW9kcyB3aXRoIGZld2VyIHRoYW4gJHtyb2xsYmFjay5taW5pbXVtUmVxdWVzdHN9IHJlcXVlc3RzIGlnbm9yZWQpLmA7XG4gICAgICAgIGlmIChyZWdpb24gPT09IHRoaXMuaG9tZVJlZ2lvbikge1xuICAgICAgICAgIGNvbnN0IGFsYXJtID0gbmV3IGNsb3Vkd2F0Y2guQWxhcm0odGhpcywgYFJvbGxiYWNrJHt0LmtleX1gLCB7XG4gICAgICAgICAgICBtZXRyaWM6IG5ldyBjbG91ZHdhdGNoLk1hdGhFeHByZXNzaW9uKHtcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogcmF0ZUV4cHJlc3Npb24ocm9sbGJhY2subWluaW11bVJlcXVlc3RzKSxcbiAgICAgICAgICAgICAgdXNpbmdNZXRyaWNzOiB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdHM6IHRoaXMubWV0cmljKFJFUVVFU1RTLCB7IHBlcmlvZDogcm9sbGJhY2sucGVyaW9kIH0pLFxuICAgICAgICAgICAgICAgIGVycm9yczogdGhpcy5tZXRyaWModC5tZXRyaWMsIHsgcGVyaW9kOiByb2xsYmFjay5wZXJpb2QgfSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHBlcmlvZDogcm9sbGJhY2sucGVyaW9kLFxuICAgICAgICAgICAgICBsYWJlbDogYCR7dC5zdGF0dXN9IHJhdGUgKCUpYCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGhyZXNob2xkOiB0LnRocmVzaG9sZCxcbiAgICAgICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiByb2xsYmFjay5ldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX1RIUkVTSE9MRCxcbiAgICAgICAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IGNsb3Vkd2F0Y2guVHJlYXRNaXNzaW5nRGF0YS5OT1RfQlJFQUNISU5HLFxuICAgICAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5yb2xsYmFja0FsYXJtcy5wdXNoKGFsYXJtKTtcbiAgICAgICAgICBhcm5zLnB1c2goYWxhcm0uYWxhcm1Bcm4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGFsYXJtID0gbmV3IFJlZ2lvbmFsQWxhcm0odGhpcywgYFJvbGxiYWNrJHt0LmtleX0tJHtyZWdpb259YCwge1xuICAgICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgICAgYWxhcm1OYW1lOiBgJHtBTEFSTV9OQU1FX1BSRUZJWH0ke3RoaXMud2ViRnVuY3Rpb24ud2ViRnVuY3Rpb25OYW1lfS0ke3RoaXMuZW5kcG9pbnROYW1lfS0ke3Quc2hvcnR9LXJhdGVgLFxuICAgICAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBtZXRyaWNzOiByYXRlQWxhcm1RdWVyaWVzKHRoaXMubWV0cmljSWRzKCksIHQubWV0cmljLCByb2xsYmFjay5wZXJpb2QsIHJvbGxiYWNrLm1pbmltdW1SZXF1ZXN0cyksXG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHQudGhyZXNob2xkLFxuICAgICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IHJvbGxiYWNrLmV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5yb2xsYmFja0FsYXJtcy5wdXNoKGNsb3Vkd2F0Y2guQWxhcm0uZnJvbUFsYXJtQXJuKHRoaXMsIGBSb2xsYmFjayR7dC5rZXl9LSR7cmVnaW9ufS1SZWZgLCBhbGFybS5hbGFybUFybikpO1xuICAgICAgICAgIGFybnMucHVzaChhbGFybS5hbGFybUFybik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFybnM7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXNlUmVnaW9ucyhzY29wZTogQ29uc3RydWN0LCBlbmRwb2ludFR5cGU6IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLCBob21lUmVnaW9uOiBzdHJpbmcsIHJlZ2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBleHRyYSA9IFsuLi5uZXcgU2V0KHJlZ2lvbnMpXS5maWx0ZXIoKHIpID0+IHIgIT09IGhvbWVSZWdpb24pLnNvcnQoKTtcbiAgZm9yIChjb25zdCByIG9mIHJlZ2lvbnMpIHtcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogcmVnaW9ucyBtdXN0IGJlIGxpdGVyYWwgcmVnaW9uIG5hbWVzLCBnb3QgYSB0b2tlbmApO1xuICAgIH1cbiAgICBpZiAoIS9eW2Etel17Mn0oLVthLXpdKykrLVxcZCQvLnRlc3QocikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiAnJHtyfScgaXMgbm90IGEgdmFsaWQgcmVnaW9uIG5hbWVgKTtcbiAgICB9XG4gIH1cbiAgaWYgKGVuZHBvaW50VHlwZSA9PT0gV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuSE9NRV9SRUdJT04gJiYgZXh0cmEubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiBhIEhPTUVfUkVHSU9OIGVuZHBvaW50IHNlcnZlcyBvbmx5IHRoZSBob21lIHJlZ2lvbiAoJHtob21lUmVnaW9ufSk7IHVzZSBNVUxUSV9SRUdJT04gb3IgUEVSX1JFR0lPTiB0byBhZGQgJHtleHRyYS5qb2luKCcsICcpfWApO1xuICB9XG4gIGlmIChlbmRwb2ludFR5cGUgIT09IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLkhPTUVfUkVHSU9OKSB7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChob21lUmVnaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06ICR7ZW5kcG9pbnRUeXBlfSBlbmRwb2ludHMgbmVlZCBhIHN0YWNrIHdpdGggYW4gZXhwbGljaXQgcmVnaW9uIChlbnYucmVnaW9uKWApO1xuICAgIH1cbiAgICBpZiAoZXh0cmEubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogYSAke2VuZHBvaW50VHlwZX0gZW5kcG9pbnQgbmVlZHMgYXQgbGVhc3Qgb25lIHJlZ2lvbiBiZXNpZGVzIHRoZSBob21lIHJlZ2lvbiAoJHtob21lUmVnaW9ufSlgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4dHJhO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJhdGVMaW1pdChzY29wZTogQ29uc3RydWN0LCByYXRlTGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAocmF0ZUxpbWl0ID09PSB1bmRlZmluZWQgfHwgVG9rZW4uaXNVbnJlc29sdmVkKHJhdGVMaW1pdCkpIHJldHVybjtcbiAgY29uc3QgYWxsb3dlZCA9IHJhdGVMaW1pdCA9PT0gMFxuICAgIHx8IChyYXRlTGltaXQgPj0gMTAwICYmIHJhdGVMaW1pdCA8PSAxMDAwICYmIHJhdGVMaW1pdCAlIDEwMCA9PT0gMClcbiAgICB8fCAocmF0ZUxpbWl0ID49IDIwMDAgJiYgcmF0ZUxpbWl0IDw9IDEwMDAwICYmIHJhdGVMaW1pdCAlIDEwMDAgPT09IDApO1xuICBpZiAoIWFsbG93ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogcmF0ZUxpbWl0IG11c3QgYmUgMCwgMTAwLTEsMDAwIGluIHN0ZXBzIG9mIDEwMCwgb3IgMiwwMDAtMTAsMDAwIGluIHN0ZXBzIG9mIDEsMDAwLCBnb3QgJHtyYXRlTGltaXR9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVNYXhFbnZpcm9ubWVudHMoc2NvcGU6IENvbnN0cnVjdCwgbWF4RW52aXJvbm1lbnRzOiBudW1iZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKG1heEVudmlyb25tZW50cyA9PT0gdW5kZWZpbmVkIHx8IFRva2VuLmlzVW5yZXNvbHZlZChtYXhFbnZpcm9ubWVudHMpKSByZXR1cm47XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihtYXhFbnZpcm9ubWVudHMpIHx8IG1heEVudmlyb25tZW50cyA8IDIgfHwgbWF4RW52aXJvbm1lbnRzID4gMTAwMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogbWF4RW52aXJvbm1lbnRzIG11c3QgYmUgYW4gaW50ZWdlciBmcm9tIDIgdG8gMTAsMDAwLCBnb3QgJHttYXhFbnZpcm9ubWVudHN9YCk7XG4gIH1cbn1cblxuLyoqIGBwcmltYXJ5YCBnZXRzIHdoYXQgYGFkZGl0aW9uYWxgIGxlYXZlczsgd2VpZ2h0cyBhcmUgd2hvbGUgcGVyY2VudGFnZXMgc3VtbWluZyB0byAxMDAuICovXG5mdW5jdGlvbiByZXZpc2lvbldlaWdodHMoXG4gIHNjb3BlOiBDb25zdHJ1Y3QsXG4gIHdlYkZ1bmN0aW9uOiBJV2ViRnVuY3Rpb24sXG4gIHByaW1hcnk6IElXZWJGdW5jdGlvblJldmlzaW9uLFxuICBhZGRpdGlvbmFsOiBXZWJGdW5jdGlvblJldmlzaW9uV2VpZ2h0W10sXG4pOiBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25FbmRwb2ludC5SZXZpc2lvbldlaWdodFByb3BlcnR5W10ge1xuICBmb3IgKGNvbnN0IHIgb2YgW3ByaW1hcnksIC4uLmFkZGl0aW9uYWwubWFwKChhKSA9PiBhLnJldmlzaW9uKV0pIHtcbiAgICBpZiAoci53ZWJGdW5jdGlvbiAhPT0gd2ViRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiByZXZpc2lvbiAke3IucmV2aXNpb25JZH0gYmVsb25ncyB0byBhbm90aGVyIGZ1bmN0aW9uYCk7XG4gICAgfVxuICB9XG4gIGlmIChhZGRpdGlvbmFsLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbeyByZXZpc2lvbklkOiBwcmltYXJ5LnJldmlzaW9uSWQsIHdlaWdodDogMTAwIH1dO1xuICB9XG4gIGlmIChhZGRpdGlvbmFsLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogYW4gZW5kcG9pbnQgcm91dGVzIHRvIGF0IG1vc3QgdHdvIHJldmlzaW9ucywgc28gYWRkaXRpb25hbFJldmlzaW9ucyB0YWtlcyBvbmVgKTtcbiAgfVxuICBjb25zdCBbeyByZXZpc2lvbiwgd2VpZ2h0IH1dID0gYWRkaXRpb25hbDtcbiAgY29uc3QgcGVyY2VudCA9IE1hdGgucm91bmQod2VpZ2h0ICogMTAwKTtcbiAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZCh3ZWlnaHQpIHx8IE1hdGguYWJzKHdlaWdodCAqIDEwMCAtIHBlcmNlbnQpID4gMWUtOSB8fCBwZXJjZW50IDwgMSB8fCBwZXJjZW50ID4gOTkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogYW4gYWRkaXRpb25hbCByZXZpc2lvbidzIHdlaWdodCBtdXN0IGJlIGEgd2hvbGUgcGVyY2VudGFnZSBmcm9tIDAuMDEgdG8gMC45OSwgZ290ICR7d2VpZ2h0fWApO1xuICB9XG4gIGlmIChyZXZpc2lvbiA9PT0gcHJpbWFyeSB8fCAoIVRva2VuLmlzVW5yZXNvbHZlZChyZXZpc2lvbi5yZXZpc2lvbklkKSAmJiByZXZpc2lvbi5yZXZpc2lvbklkID09PSBwcmltYXJ5LnJldmlzaW9uSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IHRoZSBhZGRpdGlvbmFsIHJldmlzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBlbmRwb2ludCdzIHJldmlzaW9uYCk7XG4gIH1cbiAgcmV0dXJuIFt7IHJldmlzaW9uSWQ6IHByaW1hcnkucmV2aXNpb25JZCwgd2VpZ2h0OiAxMDAgLSBwZXJjZW50IH0sIHsgcmV2aXNpb25JZDogcmV2aXNpb24ucmV2aXNpb25JZCwgd2VpZ2h0OiBwZXJjZW50IH1dO1xufVxuXG4vKipcbiAqIGA8cHJlZml4Pi08aGFzaD5gLCB3aXRoIHRoZSBoYXNoIGNvdmVyaW5nIHRoZSBlbmRwb2ludCB0eXBlIGFuZCByZWdpb25zOiBhIHR5cGUgb3IgcmVnaW9uIGNoYW5nZSBwcm9kdWNlc1xuICogYSBuZXcgbmFtZSwgc28gdGhlIHJlcGxhY2VtZW50IGRvZXNuJ3QgY29sbGlkZSB3aXRoIHRoZSBlbmRwb2ludCBpdCByZXBsYWNlcy5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEVuZHBvaW50TmFtZShwcmVmaXg6IHN0cmluZywgc2VlZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBlbmRwb2ludFR5cGU6IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLCBleHRyYVJlZ2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShbLi4uKHNlZWQgIT09IHVuZGVmaW5lZCA/IFtzZWVkXSA6IFtdKSwgZW5kcG9pbnRUeXBlLCAuLi5leHRyYVJlZ2lvbnNdLmpvaW4oJywnKSkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCA4KTtcbiAgcmV0dXJuIGAke3ByZWZpeH0tJHtoYXNofWA7XG59XG4iXX0=
|
|
447
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWVuZHBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi1lbmRwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXlDO0FBQ3pDLDZDQUErRTtBQUMvRSx1RUFBeUQ7QUFFekQsK0RBQWlEO0FBQ2pELDJDQUF1QztBQUN2QyxtQ0FBdUU7QUFDdkUsK0RBQTJEO0FBQzNELCtDQUcyQjtBQUMzQiw2REFBNEU7QUFFNUUsMkRBQXVEO0FBQ3ZELHFEQUFxRjtBQUdyRiwrREFBMEQ7QUFxSTFEOzs7O0dBSUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLHNCQUFTOztJQUNoRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUNqRixPQUFPLElBQUksbUJBQW1CLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsMkJBQTJCO0lBQ1gsWUFBWSxDQUFTO0lBRXJDLDBCQUEwQjtJQUNWLFdBQVcsQ0FBUztJQUVwQyw4Q0FBOEM7SUFDOUIsWUFBWSxDQUEwQjtJQUV0RCxxREFBcUQ7SUFDckMsUUFBUSxDQUFzQjtJQUU5QywyR0FBMkc7SUFDM0YsT0FBTyxDQUFXO0lBRWxDOztPQUVHO0lBQ2EsVUFBVSxDQUFTO0lBRW5DOztPQUVHO0lBQ2EsR0FBRyxDQUFTO0lBRTVCLGlFQUFpRTtJQUNqRCxNQUFNLENBQW9CO0lBRTFDLDZDQUE2QztJQUM3QixXQUFXLENBQWU7SUFFMUM7OztPQUdHO0lBQ2EsY0FBYyxHQUF3QixFQUFFLENBQUM7SUFFeEMsVUFBVSxDQUFTO0lBQ25CLFFBQVEsQ0FBZ0M7SUFDakQsT0FBTyxDQUF5RDtJQUNoRSxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ04sT0FBTyxDQUFVO0lBQzFC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LENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckosT0FBTyxHQUFHLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IEFubm90YXRpb25zLCBEdXJhdGlvbiwgU3RhY2ssIFRva2VuLCBWYWxpZGF0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkF1dGhUeXBlLCBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZSB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHsgRW5kcG9pbnRMb29rdXAgfSBmcm9tICcuL3ByaXZhdGUvZW5kcG9pbnQtbG9va3VwJztcbmltcG9ydCB7XG4gIENMSUVOVF9FUlJPUlMsIERFRkFVTFRfUEVSSU9ELCBSRVFVRVNUUywgU0VSVkVSX0VSUk9SUywgVVNBR0VfTkFNRVNQQUNFLCBXRUJfTkFNRVNQQUNFLFxuICBlbmRwb2ludERpbWVuc2lvbnMsIHJhdGVBbGFybVF1ZXJpZXMsIHJhdGVFeHByZXNzaW9uLFxufSBmcm9tICcuL3ByaXZhdGUvbWV0cmljcyc7XG5pbXBvcnQgeyBBTEFSTV9OQU1FX1BSRUZJWCwgUmVnaW9uYWxBbGFybSB9IGZyb20gJy4vcHJpdmF0ZS9yZWdpb25hbC1hbGFybSc7XG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkUm9sbGJhY2tPcHRpb25zIH0gZnJvbSAnLi9wcml2YXRlL3JvbGxiYWNrJztcbmltcG9ydCB7IFRyYWZmaWNTaGlmdCB9IGZyb20gJy4vcHJpdmF0ZS90cmFmZmljLXNoaWZ0JztcbmltcG9ydCB7IENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUsIGFzc2VydFJlc291cmNlTmFtZSB9IGZyb20gJy4vcHJpdmF0ZS92YWxpZGF0aW9uJztcbmltcG9ydCB0eXBlIHsgSVdlYkZ1bmN0aW9uIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBXZWJGdW5jdGlvbkRlcGxveW1lbnQgfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1kZXBsb3ltZW50JztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uR3JhbnRzIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZ3JhbnRzJztcbmltcG9ydCB0eXBlIHsgSVdlYkZ1bmN0aW9uUmV2aXNpb24gfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1yZXZpc2lvbic7XG5cbi8qKlxuICogQSByZXZpc2lvbiBhbmQgdGhlIHNoYXJlIG9mIGFuIGVuZHBvaW50J3MgdHJhZmZpYyBpdCByZWNlaXZlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvblJldmlzaW9uV2VpZ2h0IHtcbiAgLyoqIFRoZSByZXZpc2lvbi4gKi9cbiAgcmVhZG9ubHkgcmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgcmV2aXNpb24ncyBzaGFyZSBvZiB0aGUgZW5kcG9pbnQncyB0cmFmZmljLCBhcyBhIGZyYWN0aW9uIChsaWtlIGBsYW1iZGEuQWxpYXNgIGBhZGRpdGlvbmFsVmVyc2lvbnNgKS5cbiAgICogTXVzdCBiZSBhIHdob2xlIHBlcmNlbnRhZ2UgZnJvbSAwLjAxIHRvIDAuOTkuXG4gICAqL1xuICByZWFkb25seSB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhIFdlYiBGdW5jdGlvbidzIGVuZHBvaW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBlbmRwb2ludCBzZXJ2ZXMgdHJhZmZpYyBmcm9tLlxuICAgKlxuICAgKiBAZGVmYXVsdCBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnRUeXBlPzogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGU7XG5cbiAgLyoqXG4gICAqIFJlZ2lvbnMgdG8gc2VydmUgZnJvbSBpbiBhZGRpdGlvbiB0byB0aGUgaG9tZSByZWdpb24gKHRoZSBzdGFjaydzIHJlZ2lvbikuXG4gICAqIFJlcXVpcmVkIChhdCBsZWFzdCBvbmUpIGZvciBgTVVMVElfUkVHSU9OYCBhbmQgYFBFUl9SRUdJT05gOyBtdXN0IGJlIGVtcHR5IGZvciBgSE9NRV9SRUdJT05gLlxuICAgKlxuICAgKiBDaGFuZ2luZyB0aGlzIGNyZWF0ZXMgYSBuZXcgZW5kcG9pbnQgd2l0aCBhIG5ldyBVUkwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZXh0cmEgcmVnaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9ucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZW5kcG9pbnQncyBuYW1lLCBzaG93biBpbiBsb2dzIChgZW5kcG9pbnROYW1lYCkgYW5kIGluIHRoZSBgbGFtYmRhLXdlYi1lbmRwb2ludC1uYW1lYCBoZWFkZXIuXG4gICAqIE5hbWVzIGFyZSB1bmlxdWUgcGVyIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIHRoZSBuYW1lIGVuZHMgaW4gYSBoYXNoIG9mIHRoZSBlbmRwb2ludCB0eXBlIGFuZCByZWdpb25zLCBzbyBjaGFuZ2luZyBlaXRoZXIgZGVwbG95c1xuICAgKiBhIG5ldyBlbmRwb2ludCBjbGVhbmx5LiBXaGVuIHNldCwgY2hhbmdpbmcgdGhlIGVuZHBvaW50IHR5cGUgb3IgcmVnaW9ucyBhbHNvIHJlcXVpcmVzIGEgbmV3IG5hbWU6XG4gICAqIHR3byBlbmRwb2ludHMgb2Ygb25lIGZ1bmN0aW9uIGNhbid0IHNoYXJlIGEgbmFtZSwgYW5kIENsb3VkRm9ybWF0aW9uIGNyZWF0ZXMgdGhlIHJlcGxhY2VtZW50XG4gICAqIGJlZm9yZSBkZWxldGluZyB0aGUgb2xkIG9uZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgZGVmYXVsdC08aGFzaD5gIGZvciB0aGUgZnVuY3Rpb24ncyBkZWZhdWx0IGVuZHBvaW50LCBgPGlkPi08aGFzaD5gIGZvciBlbmRwb2ludHMgYWRkZWQgd2l0aCBgYWRkRW5kcG9pbnRgXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vc3QgcmVxdWVzdHMgcGVyIHNlY29uZCB0aGUgZW5kcG9pbnQgYWNjZXB0czsgZXhjZXNzIHJlcXVlc3RzIGdldCBIVFRQIDQyOS5cbiAgICogQWxsb3dlZDogMCAoYmxvY2tzIGFsbCB0cmFmZmljKSwgMTAw4oCTMSwwMDAgaW4gc3RlcHMgb2YgMTAwLCBvciAyLDAwMOKAkzEwLDAwMCBpbiBzdGVwcyBvZiAxLDAwMC5cbiAgICpcbiAgICogRW5mb3JjZWQgc2VwYXJhdGVseSBpbiBlYWNoIHJlZ2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzIGZyb20sIHNvIGEgbXVsdGktcmVnaW9uIGVuZHBvaW50XG4gICAqIGNhbiBhY2NlcHQgdGhpcyBtYW55IHJlcXVlc3RzIHBlciBzZWNvbmQgaW4gZXZlcnkgcmVnaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGxpbWl0IGJleW9uZCB0aGUgc2VydmljZSBxdW90YSBvZiAxMCwwMDAgcmVxdWVzdHMgcGVyIHNlY29uZCBwZXIgZW5kcG9pbnQgKHBlciByZWdpb24pXG4gICAqL1xuICByZWFkb25seSByYXRlTGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtb3N0IGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdGhlIGVuZHBvaW50IG1heSB1c2UgKDLigJMxMCwwMDApLiBFYWNoIG9uZSB1c2VzIDIgdkNQVXMgb2YgdGhlIGFjY291bnQncyBxdW90YS5cbiAgICpcbiAgICogRW5mb3JjZWQgc2VwYXJhdGVseSBpbiBlYWNoIHJlZ2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzIGZyb20uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc2NhbGVzIHdpdGhpbiB0aGUgYWNjb3VudCdzIHZDUFUgcXVvdGFcbiAgICovXG4gIHJlYWRvbmx5IG1heEVudmlyb25tZW50cz86IG51bWJlcjtcblxuICAvKipcbiAgICogSG93IHRoZSBlbmRwb2ludCBtb3ZlcyBpdHMgdHJhZmZpYyB0byBhIG5ldyByZXZpc2lvbjogYWxsIGF0IG9uY2UsIG9yIGluIHN0ZXBzXG4gICAqIChgV2ViRnVuY3Rpb25EZXBsb3ltZW50LmNhbmFyeSgpYCBvciBgbGluZWFyKClgKSB0aGF0IHdhdGNoIENsb3VkV2F0Y2ggYWxhcm1zIGFuZCBtb3ZlXG4gICAqIHRoZSB0cmFmZmljIGJhY2sgd2hlbiBvbmUgZ29lcyBpbnRvIEFMQVJNLlxuICAgKlxuICAgKiBBIGRlcGxveW1lbnQgaW4gc3RlcHMgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCBgcmV2aXNpb25gLCBgYWRkaXRpb25hbFJldmlzaW9uc2Agb3IgYHJvdXRlVHJhZmZpYygpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgV2ViRnVuY3Rpb25EZXBsb3ltZW50LmFsbEF0T25jZSgpXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50PzogV2ViRnVuY3Rpb25EZXBsb3ltZW50O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBXZWJGdW5jdGlvbi5hZGRFbmRwb2ludGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnMgZXh0ZW5kcyBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgY2FsbGVycyBvZiB0aGlzIGVuZHBvaW50IGFyZSBhdXRoZW50aWNhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aFR5cGU6IFdlYkZ1bmN0aW9uQXV0aFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSByZXZpc2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzLCBlLmcuIGFuIGVhcmxpZXIgb25lIGZyb20gYFdlYkZ1bmN0aW9uUmV2aXNpb24uZnJvbVJldmlzaW9uQXR0cmlidXRlc2BcbiAgICogdG8ga2VlcCB0aGlzIGVuZHBvaW50IG9uIGl0IHdoaWxlIG90aGVycyBtb3ZlIG9uLiBTYW1lIGFzIGNhbGxpbmcgYHJvdXRlVHJhZmZpY2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGZ1bmN0aW9uJ3MgY3VycmVudCByZXZpc2lvbiAoYGN1cnJlbnRSZXZpc2lvbmApXG4gICAqL1xuICByZWFkb25seSByZXZpc2lvbj86IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKlxuICAgKiBBIHNlY29uZCByZXZpc2lvbiBhbmQgaXRzIHNoYXJlIG9mIHRoZSBlbmRwb2ludCdzIHRyYWZmaWM7IGByZXZpc2lvbmAgZ2V0cyB0aGUgcmVzdC5cbiAgICogQW4gZW5kcG9pbnQgcm91dGVzIHRvIGF0IG1vc3QgdHdvIHJldmlzaW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbGwgdHJhZmZpYyBnb2VzIHRvIGByZXZpc2lvbmBcbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxSZXZpc2lvbnM/OiBXZWJGdW5jdGlvblJldmlzaW9uV2VpZ2h0W107XG59XG5cbi8qKlxuICogSW50ZXJuYWw6IGhvdyBgV2ViRnVuY3Rpb25gIGNyZWF0ZXMgaXRzIGVuZHBvaW50cy4gTm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuXG4gKi9cbmludGVyZmFjZSBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMgZXh0ZW5kcyBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKiBUaGUgZnVuY3Rpb24gdGhhdCBvd25zIHRoZSBlbmRwb2ludC4gKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb246IElXZWJGdW5jdGlvbjtcblxuICAvKiogVGhlIGZ1bmN0aW9uJ3MgY3VycmVudCByZXZpc2lvbiwgc2VydmVkIHVubGVzcyBgcmV2aXNpb25gIGlzIGdpdmVuLiAqL1xuICByZWFkb25seSBjdXJyZW50UmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKiBQcmVmaXggb2YgdGhlIGdlbmVyYXRlZCBlbmRwb2ludCBuYW1lLiAqL1xuICByZWFkb25seSBuYW1lUHJlZml4OiBzdHJpbmc7XG5cbiAgLyoqIEV4dHJhIGlucHV0IHRvIHRoZSBnZW5lcmF0ZWQgbmFtZSdzIGhhc2ggKHRoZSBjb25zdHJ1Y3QgSUQgb2YgYW4gYWRkZWQgZW5kcG9pbnQpLiAqL1xuICByZWFkb25seSBuYW1lU2VlZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBIVFRQUyBlbmRwb2ludCBvZiBhIFdlYiBGdW5jdGlvbjogYGZuLmVuZHBvaW50YCAodGhlIGRlZmF1bHQgb25lKSBvciB0aGUgcmVzdWx0IG9mIGBmbi5hZGRFbmRwb2ludCgpYC5cbiAqXG4gKiBFbmRwb2ludHMgYXJlIGNyZWF0ZWQgb25seSB0aHJvdWdoIGBXZWJGdW5jdGlvbmAsIHdoaWNoIG93bnMgdGhlaXIgbG9nIGdyb3VwcyBpbiBldmVyeSByZWdpb24sIHNvIHRoZSBjb25zdHJ1Y3RvciBpcyBwcml2YXRlLlxuICovXG5leHBvcnQgY2xhc3MgV2ViRnVuY3Rpb25FbmRwb2ludCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVuZHBvaW50IG9mIGEgV2ViIEZ1bmN0aW9uLiBVc2VkIGJ5IGBXZWJGdW5jdGlvbmAuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfY3JlYXRlKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMpOiBXZWJGdW5jdGlvbkVuZHBvaW50IHtcbiAgICByZXR1cm4gbmV3IFdlYkZ1bmN0aW9uRW5kcG9pbnQoc2NvcGUsIGlkLCBwcm9wcyk7XG4gIH1cblxuICAvKiogVGhlIGVuZHBvaW50J3MgbmFtZS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50TmFtZTogc3RyaW5nO1xuXG4gIC8qKiBUaGUgZW5kcG9pbnQncyBBUk4uICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludEFybjogc3RyaW5nO1xuXG4gIC8qKiBXaGVyZSB0aGUgZW5kcG9pbnQgc2VydmVzIHRyYWZmaWMgZnJvbS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50VHlwZTogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGU7XG5cbiAgLyoqIEhvdyBjYWxsZXJzIG9mIHRoZSBlbmRwb2ludCBhcmUgYXV0aGVudGljYXRlZC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGF1dGhUeXBlOiBXZWJGdW5jdGlvbkF1dGhUeXBlO1xuXG4gIC8qKiBFdmVyeSByZWdpb24gdGhlIGVuZHBvaW50IHNlcnZlcyBmcm9tOiB0aGUgaG9tZSByZWdpb24gZmlyc3QsIHRoZW4gdGhlIG90aGVycyBpbiBhbHBoYWJldGljYWwgb3JkZXIuICovXG4gIHB1YmxpYyByZWFkb25seSByZWdpb25zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgZG9tYWluIG5hbWU6IHRoZSBnbG9iYWwgZG9tYWluIGZvciBgTVVMVElfUkVHSU9OYCwgb3RoZXJ3aXNlIHRoZSBob21lIHJlZ2lvbidzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgVVJMOiB0aGUgZ2xvYmFsIFVSTCBmb3IgYE1VTFRJX1JFR0lPTmAsIG90aGVyd2lzZSB0aGUgaG9tZSByZWdpb24ncy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKiogR3JhbnRzIG9uIHRoaXMgZW5kcG9pbnQgKGUuZy4gYGdyYW50cy5pbnZva2UocHJpbmNpcGFsKWApLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRzOiBXZWJGdW5jdGlvbkdyYW50cztcblxuICAvKiogVGhlIGZ1bmN0aW9uIHRoaXMgZW5kcG9pbnQgYmVsb25ncyB0by4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHdlYkZ1bmN0aW9uOiBJV2ViRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSBhbGFybXMgdGhpcyBlbmRwb2ludCBjcmVhdGVkIGZvciBpdHMgZGVwbG95bWVudCdzIGByb2xsYmFja09uYCwgb25lIHBlciB0aHJlc2hvbGQgaW4gZXZlcnkgcmVnaW9uIGl0IHNlcnZlcyBmcm9tXG4gICAqICh0aGUgaG9tZSByZWdpb24ncyBmaXJzdCkuIEVtcHR5IHdpdGhvdXQgYHJvbGxiYWNrT25gLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvbGxiYWNrQWxhcm1zOiBjbG91ZHdhdGNoLklBbGFybVtdID0gW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBob21lUmVnaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2U6IGxhbWJkYS5DZm5XZWJGdW5jdGlvbkVuZHBvaW50O1xuICBwcml2YXRlIHdlaWdodHM6IGxhbWJkYS5DZm5XZWJGdW5jdGlvbkVuZHBvaW50LlJldmlzaW9uV2VpZ2h0UHJvcGVydHlbXTtcbiAgcHJpdmF0ZSByb3V0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBncmFkdWFsOiBib29sZWFuO1xuICBwcml2YXRlIGxvb2t1cD86IEVuZHBvaW50TG9va3VwO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdlYkZ1bmN0aW9uRW5kcG9pbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBob21lUmVnaW9uID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuICAgIGNvbnN0IGVuZHBvaW50VHlwZSA9IHByb3BzLmVuZHBvaW50VHlwZSA/PyBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTjtcbiAgICBjb25zdCBleHRyYVJlZ2lvbnMgPSBub3JtYWxpc2VSZWdpb25zKHRoaXMsIGVuZHBvaW50VHlwZSwgaG9tZVJlZ2lvbiwgcHJvcHMucmVnaW9ucyA/PyBbXSk7XG4gICAgdmFsaWRhdGVSYXRlTGltaXQodGhpcywgcHJvcHMucmF0ZUxpbWl0KTtcbiAgICB2YWxpZGF0ZU1heEVudmlyb25tZW50cyh0aGlzLCBwcm9wcy5tYXhFbnZpcm9ubWVudHMpO1xuXG4gICAgaWYgKHByb3BzLmVuZHBvaW50TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhc3NlcnRSZXNvdXJjZU5hbWUodGhpcywgJ2VuZHBvaW50TmFtZScsIHByb3BzLmVuZHBvaW50TmFtZSk7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoJ0BjZGstbGFtYmRhLXdlYjpleHBsaWNpdEVuZHBvaW50TmFtZScsXG4gICAgICAgIGBlbmRwb2ludE5hbWUgJyR7cHJvcHMuZW5kcG9pbnROYW1lfScgaXMgc2V0IGV4cGxpY2l0bHk6IGNoYW5naW5nIGVuZHBvaW50VHlwZSBvciByZWdpb25zIGxhdGVyIGFsc28gcmVxdWlyZXMgYSBuZXcgZW5kcG9pbnROYW1lLCBvdGhlcndpc2UgdGhlIGRlcGxveW1lbnQgZmFpbHMgd2l0aCBcImFscmVhZHkgZXhpc3RzXCIgKHRoZSBzdGFjayByb2xscyBiYWNrIHNhZmVseSkuIE9taXQgZW5kcG9pbnROYW1lIHRvIGdldCBhIG5hbWUgdGhhdCBjaGFuZ2VzIGF1dG9tYXRpY2FsbHkuYCk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5hdXRoVHlwZSA9PT0gV2ViRnVuY3Rpb25BdXRoVHlwZS5OT05FKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoJ0BjZGstbGFtYmRhLXdlYjphdXRoVHlwZU5vbmUnLFxuICAgICAgICAnYXV0aFR5cGUgTk9ORSBtYWtlcyB0aGUgZW5kcG9pbnQgcHVibGljOiBMYW1iZGEgZG9lcyBubyBhdXRoZW50aWNhdGlvbiwgc28geW91ciBhcHBsaWNhdGlvbiBtdXN0IGF1dGhlbnRpY2F0ZSByZXF1ZXN0cyBpdHNlbGYuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5lbmRwb2ludFR5cGUgPSBlbmRwb2ludFR5cGU7XG4gICAgdGhpcy5hdXRoVHlwZSA9IHByb3BzLmF1dGhUeXBlO1xuICAgIHRoaXMuZW5kcG9pbnROYW1lID0gcHJvcHMuZW5kcG9pbnROYW1lID8/IGRlZmF1bHRFbmRwb2ludE5hbWUocHJvcHMubmFtZVByZWZpeCwgcHJvcHMubmFtZVNlZWQsIGVuZHBvaW50VHlwZSwgZXh0cmFSZWdpb25zKTtcbiAgICB0aGlzLnJlZ2lvbnMgPSBbaG9tZVJlZ2lvbiwgLi4uZXh0cmFSZWdpb25zXTtcbiAgICB0aGlzLmhvbWVSZWdpb24gPSBob21lUmVnaW9uO1xuICAgIHRoaXMud2ViRnVuY3Rpb24gPSBwcm9wcy53ZWJGdW5jdGlvbjtcbiAgICB0aGlzLndlaWdodHMgPSBbeyByZXZpc2lvbklkOiBwcm9wcy5jdXJyZW50UmV2aXNpb24ucmV2aXNpb25JZCwgd2VpZ2h0OiAxMDAgfV07XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IG5ldyBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25FbmRwb2ludCh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IHByb3BzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uQXJuLFxuICAgICAgZW5kcG9pbnROYW1lOiB0aGlzLmVuZHBvaW50TmFtZSxcbiAgICAgIGVuZHBvaW50VHlwZSxcbiAgICAgIGF1dGhUeXBlOiBwcm9wcy5hdXRoVHlwZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIHJlZ2lvbnM6IGV4dHJhUmVnaW9ucy5sZW5ndGggPiAwID8gZXh0cmFSZWdpb25zIDogdW5kZWZpbmVkLFxuICAgICAgcmV2aXNpb25XZWlnaHRzOiB0aGlzLndlaWdodHMsXG4gICAgICB0aHJvdHRsZUNvbmZpZzogcHJvcHMucmF0ZUxpbWl0ICE9PSB1bmRlZmluZWQgPyB7IHJhdGVMaW1pdDogcHJvcHMucmF0ZUxpbWl0IH0gOiB1bmRlZmluZWQsXG4gICAgICBzY2FsaW5nQ29uZmlnOiBwcm9wcy5tYXhFbnZpcm9ubWVudHMgIT09IHVuZGVmaW5lZCA/IHsgbWF4RW52aXJvbm1lbnRzOiBwcm9wcy5tYXhFbnZpcm9ubWVudHMgfSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICBWYWxpZGF0aW9ucy5vZihyZXNvdXJjZSkuYWNrbm93bGVkZ2UoQ0ZOX1ZBTElEQVRFX1VOS05PV05fVFlQRSk7XG4gICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlO1xuXG4gICAgdGhpcy5ncmFkdWFsID0gcHJvcHMuZGVwbG95bWVudD8uX2dyYWR1YWwgPz8gZmFsc2U7XG4gICAgaWYgKHByb3BzLmRlcGxveW1lbnQ/Ll9ncmFkdWFsKSB7XG4gICAgICBpZiAocHJvcHMucmV2aXNpb24gIT09IHVuZGVmaW5lZCB8fCBwcm9wcy5hZGRpdGlvbmFsUmV2aXNpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogYW4gZW5kcG9pbnQgd2l0aCBhICR7cHJvcHMuZGVwbG95bWVudC5fa2luZH0gZGVwbG95bWVudCBhbHdheXMgbW92ZXMgdG8gdGhlIGN1cnJlbnQgcmV2aXNpb247IGl0IGNhbid0IGFsc28gc2V0IHJldmlzaW9uIG9yIGFkZGl0aW9uYWxSZXZpc2lvbnNgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJvbGxiYWNrQWxhcm1Bcm5zID0gcHJvcHMuZGVwbG95bWVudC5fcm9sbGJhY2tPbiA/IHRoaXMuY3JlYXRlUm9sbGJhY2tBbGFybXMocHJvcHMuZGVwbG95bWVudC5fcm9sbGJhY2tPbikgOiBbXTtcbiAgICAgIGNvbnN0IHdhaXRTZWNvbmRzID0gcHJvcHMuZGVwbG95bWVudC5fd2FpdFNlY29uZHM7XG4gICAgICBjb25zdCByb2xsYmFjayA9IHByb3BzLmRlcGxveW1lbnQuX3JvbGxiYWNrT247XG4gICAgICBpZiAocm9sbGJhY2sgJiYgd2FpdFNlY29uZHMgPCByb2xsYmFjay5wZXJpb2QudG9TZWNvbmRzKCkgKiByb2xsYmFjay5ldmFsdWF0aW9uUGVyaW9kcyArIDEyMCkge1xuICAgICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoJ0BjZGstbGFtYmRhLXdlYjpyb2xsYmFja1Nsb3dlclRoYW5TdGVwJyxcbiAgICAgICAgICBgcm9sbGJhY2tPbiBuZWVkcyAke3JvbGxiYWNrLmV2YWx1YXRpb25QZXJpb2RzfSBwZXJpb2Qocykgb2YgJHtyb2xsYmFjay5wZXJpb2QudG9IdW1hblN0cmluZygpfSBwbHVzIGFib3V0IDIgbWludXRlcyBvZiBDbG91ZFdhdGNoIGRlbGF5IHRvIGZpcmUsIGxvbmdlciB0aGFuIGVhY2ggJHtwcm9wcy5kZXBsb3ltZW50Ll9raW5kfSBzdGVwICgke0R1cmF0aW9uLnNlY29uZHMod2FpdFNlY29uZHMpLnRvSHVtYW5TdHJpbmcoKX0pOiBhIGJhZCByZXZpc2lvbiBjYW4gcmVhY2ggdGhlIG5leHQgc3RlcCBiZWZvcmUgaXRzIGFsYXJtIGZpcmVzLmApO1xuICAgICAgfVxuICAgICAgLy8gTW92ZXMgdGhlIHRyYWZmaWMgaW4gc3RlcHMgYmVmb3JlIENsb3VkRm9ybWF0aW9uIHdyaXRlcyB0aGUgZW5kcG9pbnQsIHdoaWNoIHRoZW4gZmluZHMgaXQgYWxyZWFkeSBkb25lLlxuICAgICAgY29uc3Qgc2hpZnQgPSBuZXcgVHJhZmZpY1NoaWZ0KHRoaXMsICdEZXBsb3ltZW50Jywge1xuICAgICAgICBmdW5jdGlvbk5hbWU6IHByb3BzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uTmFtZSxcbiAgICAgICAgZnVuY3Rpb25Bcm46IHByb3BzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uQXJuLFxuICAgICAgICBlbmRwb2ludE5hbWU6IHRoaXMuZW5kcG9pbnROYW1lLFxuICAgICAgICByZXZpc2lvbklkOiBwcm9wcy5jdXJyZW50UmV2aXNpb24ucmV2aXNpb25JZCxcbiAgICAgICAgZGVwbG95bWVudDogcHJvcHMuZGVwbG95bWVudCxcbiAgICAgICAgYWxhcm1Bcm5zOiByb2xsYmFja0FsYXJtQXJucyxcbiAgICAgICAgZW5kcG9pbnRDb25maWc6IHtcbiAgICAgICAgICBlbmRwb2ludFR5cGUsXG4gICAgICAgICAgYXV0aFR5cGU6IHByb3BzLmF1dGhUeXBlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICByZWdpb25zOiBleHRyYVJlZ2lvbnMsXG4gICAgICAgICAgcmF0ZUxpbWl0OiBwcm9wcy5yYXRlTGltaXQsXG4gICAgICAgICAgbWF4RW52aXJvbm1lbnRzOiBwcm9wcy5tYXhFbnZpcm9ubWVudHMsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHJlc291cmNlLm5vZGUuYWRkRGVwZW5kZW5jeShzaGlmdCk7XG4gICAgICAvLyBBbGFybXMgaW4gb3RoZXIgcmVnaW9ucyBhcmUgb25seSByZWZlcmVuY2VkIGJ5IEFSTi5cbiAgICAgIGZvciAoY29uc3QgYWxhcm0gb2YgdGhpcy5ub2RlLmZpbmRBbGwoKS5maWx0ZXIoKGMpID0+IGMgaW5zdGFuY2VvZiBSZWdpb25hbEFsYXJtKSkgc2hpZnQubm9kZS5hZGREZXBlbmRlbmN5KGFsYXJtKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLnJldmlzaW9uICE9PSB1bmRlZmluZWQgfHwgcHJvcHMuYWRkaXRpb25hbFJldmlzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJvdXRlVHJhZmZpYyhwcm9wcy5yZXZpc2lvbiA/PyBwcm9wcy5jdXJyZW50UmV2aXNpb24sIHByb3BzLmFkZGl0aW9uYWxSZXZpc2lvbnMpO1xuICAgIH1cblxuICAgIHRoaXMuZW5kcG9pbnRBcm4gPSByZXNvdXJjZS5hdHRyRW5kcG9pbnRBcm47XG4gICAgdGhpcy5kb21haW5OYW1lID0gcmVzb3VyY2UuYXR0ckRvbWFpbk5hbWU7XG4gICAgdGhpcy51cmwgPSBgaHR0cHM6Ly8ke3Jlc291cmNlLmF0dHJEb21haW5OYW1lfWA7XG4gICAgdGhpcy5ncmFudHMgPSBXZWJGdW5jdGlvbkdyYW50cy5fZm9yRW5kcG9pbnQodGhpcywgcHJvcHMud2ViRnVuY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBVUkwgb2YgdGhpcyBlbmRwb2ludCBpbiBvbmUgcmVnaW9uLiBPbmx5IGZvciBgUEVSX1JFR0lPTmAgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAcGFyYW0gcmVnaW9uIG9uZSBvZiBgcmVnaW9uc2BcbiAgICovXG4gIHB1YmxpYyByZWdpb25hbFVybChyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBodHRwczovLyR7dGhpcy5yZWdpb25hbERvbWFpbk5hbWUocmVnaW9uKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkb21haW4gbmFtZSBvZiB0aGlzIGVuZHBvaW50IGluIG9uZSByZWdpb24uIE9ubHkgZm9yIGBQRVJfUkVHSU9OYCBlbmRwb2ludHMuXG4gICAqXG4gICAqIEBwYXJhbSByZWdpb24gb25lIG9mIGByZWdpb25zYFxuICAgKi9cbiAgcHVibGljIHJlZ2lvbmFsRG9tYWluTmFtZShyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZW5kcG9pbnRUeXBlICE9PSBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5QRVJfUkVHSU9OKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5ub2RlLnBhdGh9OiByZWdpb25hbCBVUkxzIGFuZCBkb21haW4gbmFtZXMgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciBQRVJfUkVHSU9OIGVuZHBvaW50cyAodGhpcyBvbmUgaXMgJHt0aGlzLmVuZHBvaW50VHlwZX0pOyB1c2UgdXJsIG9yIGRvbWFpbk5hbWVgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnJlZ2lvbnMuaW5jbHVkZXMocmVnaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogcmVnaW9uICR7cmVnaW9ufSBpcyBub3Qgb25lIG9mIHRoZSBlbmRwb2ludCdzIHJlZ2lvbnMgKCR7dGhpcy5yZWdpb25zLmpvaW4oJywgJyl9KWApO1xuICAgIH1cbiAgICBpZiAocmVnaW9uID09PSB0aGlzLmhvbWVSZWdpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLmRvbWFpbk5hbWU7XG4gICAgfVxuICAgIHRoaXMubG9va3VwID8/PSBuZXcgRW5kcG9pbnRMb29rdXAodGhpcywgJ0xvb2t1cCcsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogdGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbk5hbWUsXG4gICAgICBmdW5jdGlvbkFybjogdGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbkFybixcbiAgICAgIGVuZHBvaW50TmFtZTogdGhpcy5lbmRwb2ludE5hbWUsXG4gICAgICBlbmRwb2ludEFybjogdGhpcy5lbmRwb2ludEFybixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5sb29rdXAucmVnaW9uYWxEb21haW4ocmVnaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3V0ZXMgdGhlIGVuZHBvaW50IHRvIGByZXZpc2lvbmAgaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24ncyBjdXJyZW50IHJldmlzaW9uLCBvcHRpb25hbGx5IHNoYXJpbmdcbiAgICogdHJhZmZpYyB3aXRoIG9uZSBtb3JlIHJldmlzaW9uIChgYWRkaXRpb25hbFJldmlzaW9uc2AsIHdoaWNoIGdldHMgaXRzIHdlaWdodDsgYHJldmlzaW9uYCBnZXRzIHRoZSByZXN0KS5cbiAgICpcbiAgICogVXNlIGl0IHRvIGtlZXAgYW4gZW5kcG9pbnQgb24gYW4gZWFybGllciByZXZpc2lvbiAoYFdlYkZ1bmN0aW9uUmV2aXNpb24uZnJvbVJldmlzaW9uQXR0cmlidXRlc2ApLFxuICAgKiBvciB0byBzZW5kIHBhcnQgb2YgdGhlIHRyYWZmaWMgdG8gdGhlIGN1cnJlbnQgcmV2aXNpb246XG4gICAqIGBmbi5lbmRwb2ludC5yb3V0ZVRyYWZmaWMocHJldmlvdXMsIFt7IHJldmlzaW9uOiBmbi5jdXJyZW50UmV2aXNpb24sIHdlaWdodDogMC4xIH1dKWAuXG4gICAqIENhbiBiZSBjYWxsZWQgb25jZSBwZXIgZW5kcG9pbnQsIGFuZCBub3Qgb24gb25lIGNyZWF0ZWQgd2l0aCBgcmV2aXNpb25gIG9yIGBhZGRpdGlvbmFsUmV2aXNpb25zYC5cbiAgICovXG4gIHB1YmxpYyByb3V0ZVRyYWZmaWMocmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uLCBhZGRpdGlvbmFsUmV2aXNpb25zPzogV2ViRnVuY3Rpb25SZXZpc2lvbldlaWdodFtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ3JhZHVhbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogdGhlIGVuZHBvaW50IGhhcyBhIGRlcGxveW1lbnQgaW4gc3RlcHMsIHdoaWNoIGFsd2F5cyBtb3ZlcyBpdCB0byB0aGUgY3VycmVudCByZXZpc2lvbjsgcm91dGVUcmFmZmljKCkgY2FuJ3QgYmUgdXNlZCB3aXRoIGl0YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJvdXRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogdGhlIGVuZHBvaW50J3MgcmV2aXNpb25zIGFyZSBhbHJlYWR5IHNldCAocmV2aXNpb24sIGFkZGl0aW9uYWxSZXZpc2lvbnMgb3Igcm91dGVUcmFmZmljKWApO1xuICAgIH1cbiAgICB0aGlzLndlaWdodHMgPSByZXZpc2lvbldlaWdodHModGhpcywgdGhpcy53ZWJGdW5jdGlvbiwgcmV2aXNpb24sIGFkZGl0aW9uYWxSZXZpc2lvbnMgPz8gW10pO1xuICAgIHRoaXMucmVzb3VyY2UucmV2aXNpb25XZWlnaHRzID0gdGhpcy53ZWlnaHRzO1xuICAgIHRoaXMucm91dGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgSURzIG9mIHRoZSByZXZpc2lvbnMgdGhpcyBlbmRwb2ludCByb3V0ZXMgdG8uXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9yZXZpc2lvbklkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMud2VpZ2h0cy5tYXAoKHcpID0+IHcucmV2aXNpb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogQSBtZXRyaWMgb2YgdGhpcyBlbmRwb2ludCBpbiBgQVdTL0xhbWJkYS9XZWJgIChkaW1lbnNpb25zIGBGdW5jdGlvbk5hbWVgIGFuZCBgRW5kcG9pbnROYW1lYCkuXG4gICAqXG4gICAqIE1ldHJpY3MgYXJlIHB1Ymxpc2hlZCBpbiB0aGUgcmVnaW9uIHRoYXQgc2VydmVkIHRoZSByZXF1ZXN0OiBwYXNzIGByZWdpb25gIGZvciBvbmUgb2YgdGhlIGVuZHBvaW50J3NcbiAgICogb3RoZXIgcmVnaW9ucy4gQW4gYWxhcm0gY2FuIG9ubHkgdXNlIG1ldHJpY3MgZnJvbSBpdHMgb3duIHN0YWNrJ3MgcmVnaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDEgbWludXRlLCBpbiB0aGUgaG9tZSByZWdpb25cbiAgICovXG4gIHB1YmxpYyBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIG5hbWVzcGFjZTogV0VCX05BTUVTUEFDRSxcbiAgICAgIG1ldHJpY05hbWUsXG4gICAgICBkaW1lbnNpb25zTWFwOiBlbmRwb2ludERpbWVuc2lvbnModGhpcy5tZXRyaWNJZHMoKSksXG4gICAgICBzdGF0aXN0aWM6IGNsb3Vkd2F0Y2guU3RhdHMuU1VNLFxuICAgICAgcGVyaW9kOiBERUZBVUxUX1BFUklPRCxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlcXVlc3RzIHRoZSBlbmRwb2ludCBzZXJ2ZWQgKGBFeGVjdXRlZFJlcXVlc3RzYCkuIFRoZXJlJ3Mgbm8gc2VwYXJhdGUgY291bnQgb2Ygc3VjY2Vzc2Z1bCAoMlhYKSByZXNwb25zZXMuICovXG4gIHB1YmxpYyBtZXRyaWNSZXF1ZXN0cyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoUkVRVUVTVFMsIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBhbnN3ZXJlZCB3aXRoIGEgNFhYIHN0YXR1cyAoYEhUVFBSZXNwb25zZVN0YXR1c0NsYXNzNFhYYCksIGluY2x1ZGluZyA0MjlzIGZyb20gYHJhdGVMaW1pdGAgYW5kIGBtYXhFbnZpcm9ubWVudHNgLlxuICAgKiBUaGUgbWV0cmljIG9ubHkgZXhpc3RzIG9uY2UgaXQncyBub24temVybywgc28gYWxhcm1zIHNob3VsZCB0cmVhdCBtaXNzaW5nIGRhdGEgYXMgbm90IGJyZWFjaGluZy5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNDbGllbnRFcnJvcnMocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKENMSUVOVF9FUlJPUlMsIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBhbnN3ZXJlZCB3aXRoIGEgNVhYIHN0YXR1cyAoYEhUVFBSZXNwb25zZVN0YXR1c0NsYXNzNVhYYCkuIEluY2x1ZGVzIHRoZSBwbGF0Zm9ybSdzIDUwM3Mgd2hpbGUgdGhlIGVuZHBvaW50XG4gICAqIHNjYWxlcyB1cCBmb3IgYSBzdWRkZW4gYnVyc3QsIG5vdCBvbmx5IHlvdXIgYXBwbGljYXRpb24ncyBlcnJvcnMuIFRoZSBtZXRyaWMgb25seSBleGlzdHMgb25jZSBpdCdzIG5vbi16ZXJvLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY1NlcnZlckVycm9ycyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoU0VSVkVSX0VSUk9SUywgcHJvcHMpO1xuICB9XG5cbiAgLyoqIFRoZSBwZXJjZW50YWdlIG9mIHJlcXVlc3RzIGFuc3dlcmVkIHdpdGggYSA0WFggc3RhdHVzIChtYXRoIGV4cHJlc3Npb247IHBlcmlvZHMgd2l0aCBubyA0WFggY291bnQgYXMgMCkuICovXG4gIHB1YmxpYyBtZXRyaWNDbGllbnRFcnJvclJhdGUocHJvcHM/OiBjbG91ZHdhdGNoLk1ldHJpY09wdGlvbnMpOiBjbG91ZHdhdGNoLk1hdGhFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gdGhpcy5yYXRlKENMSUVOVF9FUlJPUlMsICdDbGllbnQgZXJyb3IgcmF0ZSAoJSknLCBwcm9wcyk7XG4gIH1cblxuICAvKiogVGhlIHBlcmNlbnRhZ2Ugb2YgcmVxdWVzdHMgYW5zd2VyZWQgd2l0aCBhIDVYWCBzdGF0dXMgKG1hdGggZXhwcmVzc2lvbjsgcGVyaW9kcyB3aXRoIG5vIDVYWCBjb3VudCBhcyAwKS4gKi9cbiAgcHVibGljIG1ldHJpY1NlcnZlckVycm9yUmF0ZShwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWF0aEV4cHJlc3Npb24ge1xuICAgIHJldHVybiB0aGlzLnJhdGUoU0VSVkVSX0VSUk9SUywgJ1NlcnZlciBlcnJvciByYXRlICglKScsIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRpb24gZW52aXJvbm1lbnRzIHNlcnZpbmcgdGhlIGVuZHBvaW50IChgRW5kcG9pbnRBY3RpdmVFbnZpcm9ubWVudHNgKSwgdG8gY29tcGFyZSB3aXRoIGBtYXhFbnZpcm9ubWVudHNgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG1heGltdW0gb3ZlciAxIG1pbnV0ZSwgaW4gdGhlIGhvbWUgcmVnaW9uXG4gICAqL1xuICBwdWJsaWMgbWV0cmljQWN0aXZlRW52aXJvbm1lbnRzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLnVzYWdlTWV0cmljKCdFbmRwb2ludEFjdGl2ZUVudmlyb25tZW50cycsIGNsb3Vkd2F0Y2guU3RhdHMuTUFYSU1VTSwgcHJvcHMpO1xuICB9XG5cbiAgLyoqIFJlcXVlc3RzIHJlamVjdGVkIHdpdGggNDI5IGJlY2F1c2UgdGhlIGVuZHBvaW50IHJlYWNoZWQgaXRzIGByYXRlTGltaXRgIChgRW5kcG9pbnRSZXF1ZXN0VGhyb3R0bGVzYCkuICovXG4gIHB1YmxpYyBtZXRyaWNSZXF1ZXN0VGhyb3R0bGVzKHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiB0aGlzLnVzYWdlTWV0cmljKCdFbmRwb2ludFJlcXVlc3RUaHJvdHRsZXMnLCBjbG91ZHdhdGNoLlN0YXRzLlNVTSwgcHJvcHMpO1xuICB9XG5cbiAgLyoqIFJlcXVlc3RzIHJlamVjdGVkIHdpdGggNDI5IGJlY2F1c2UgdGhlIGVuZHBvaW50IHJlYWNoZWQgYG1heEVudmlyb25tZW50c2AgKGBFbmRwb2ludEFjdGl2ZUVudmlyb25tZW50VGhyb3R0bGVzYCkuICovXG4gIHB1YmxpYyBtZXRyaWNFbnZpcm9ubWVudFRocm90dGxlcyhwcm9wcz86IGNsb3Vkd2F0Y2guTWV0cmljT3B0aW9ucyk6IGNsb3Vkd2F0Y2guTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy51c2FnZU1ldHJpYygnRW5kcG9pbnRBY3RpdmVFbnZpcm9ubWVudFRocm90dGxlcycsIGNsb3Vkd2F0Y2guU3RhdHMuU1VNLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGBncmFudGVlYCB0byBjYWxsIHRoaXMgZW5kcG9pbnQuIFNob3J0Y3V0IGZvciBgZ3JhbnRzLmludm9rZShncmFudGVlKWAuXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6bm8tZ3JhbnRzXVxuICAgKi9cbiAgcHVibGljIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5ncmFudHMuaW52b2tlKGdyYW50ZWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXRyaWNJZHMoKSB7XG4gICAgcmV0dXJuIHsgZnVuY3Rpb25OYW1lOiB0aGlzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uTmFtZSwgZW5kcG9pbnROYW1lOiB0aGlzLmVuZHBvaW50TmFtZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSByYXRlKGVycm9yTWV0cmljOiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcsIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NYXRoRXhwcmVzc2lvbiB7XG4gICAgY29uc3QgcGVyaW9kID0gcHJvcHM/LnBlcmlvZCA/PyBERUZBVUxUX1BFUklPRDtcbiAgICBjb25zdCBvcHRpb25zID0geyBwZXJpb2QsIHJlZ2lvbjogcHJvcHM/LnJlZ2lvbiwgYWNjb3VudDogcHJvcHM/LmFjY291bnQgfTtcbiAgICByZXR1cm4gbmV3IGNsb3Vkd2F0Y2guTWF0aEV4cHJlc3Npb24oe1xuICAgICAgZXhwcmVzc2lvbjogcmF0ZUV4cHJlc3Npb24oMSksXG4gICAgICB1c2luZ01ldHJpY3M6IHsgcmVxdWVzdHM6IHRoaXMubWV0cmljKFJFUVVFU1RTLCBvcHRpb25zKSwgZXJyb3JzOiB0aGlzLm1ldHJpYyhlcnJvck1ldHJpYywgb3B0aW9ucykgfSxcbiAgICAgIHBlcmlvZCxcbiAgICAgIGxhYmVsOiBwcm9wcz8ubGFiZWwgPz8gbGFiZWwsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVzYWdlTWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgc3RhdGlzdGljOiBzdHJpbmcsIHByb3BzPzogY2xvdWR3YXRjaC5NZXRyaWNPcHRpb25zKTogY2xvdWR3YXRjaC5NZXRyaWMge1xuICAgIHJldHVybiBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgbmFtZXNwYWNlOiBVU0FHRV9OQU1FU1BBQ0UsXG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgZGltZW5zaW9uc01hcDogeyAuLi5lbmRwb2ludERpbWVuc2lvbnModGhpcy5tZXRyaWNJZHMoKSksIEV4ZWN1dGlvblJlZ2lvbjogcHJvcHM/LnJlZ2lvbiA/PyB0aGlzLmhvbWVSZWdpb24gfSxcbiAgICAgIHN0YXRpc3RpYyxcbiAgICAgIHBlcmlvZDogREVGQVVMVF9QRVJJT0QsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBPbmUgYWxhcm0gcGVyIHRocmVzaG9sZCBpbiBldmVyeSBzZXJ2aW5nIHJlZ2lvbjogYSBDbG91ZEZvcm1hdGlvbiBhbGFybSBhdCBob21lLCBhIGN1c3RvbSByZXNvdXJjZSBlbHNld2hlcmUuIFJldHVybnMgdGhlaXIgQVJOcy4gKi9cbiAgcHJpdmF0ZSBjcmVhdGVSb2xsYmFja0FsYXJtcyhyb2xsYmFjazogUmVzb2x2ZWRSb2xsYmFja09wdGlvbnMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdGhyZXNob2xkcyA9IFtcbiAgICAgIHsga2V5OiAnU2VydmVyRXJyb3JzJywgc2hvcnQ6ICc1eHgnLCBtZXRyaWM6IFNFUlZFUl9FUlJPUlMsIHN0YXR1czogJzVYWCcsIHRocmVzaG9sZDogcm9sbGJhY2suc2VydmVyRXJyb3JSYXRlIH0sXG4gICAgICB7IGtleTogJ0NsaWVudEVycm9ycycsIHNob3J0OiAnNHh4JywgbWV0cmljOiBDTElFTlRfRVJST1JTLCBzdGF0dXM6ICc0WFgnLCB0aHJlc2hvbGQ6IHJvbGxiYWNrLmNsaWVudEVycm9yUmF0ZSB9LFxuICAgIF07XG4gICAgY29uc3QgYXJuczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhyZXNob2xkcykge1xuICAgICAgaWYgKHQudGhyZXNob2xkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgZm9yIChjb25zdCByZWdpb24gb2YgdGhpcy5yZWdpb25zKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYFJvbGxzIGJhY2sgZGVwbG95bWVudHMgb2YgZW5kcG9pbnQgJHt0aGlzLmVuZHBvaW50TmFtZX0gb2YgJHt0aGlzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uTmFtZX0gd2hlbiBtb3JlIHRoYW4gYFxuICAgICAgICAgICsgYCR7dC50aHJlc2hvbGR9JSBvZiBpdHMgcmVxdWVzdHMgaW4gJHtyZWdpb259IGdldCBhICR7dC5zdGF0dXN9IHJlc3BvbnNlICgke3JvbGxiYWNrLmV2YWx1YXRpb25QZXJpb2RzfSB4ICR7cm9sbGJhY2sucGVyaW9kLnRvSHVtYW5TdHJpbmcoKX0sIGBcbiAgICAgICAgICArIGBwZXJpb2RzIHdpdGggZmV3ZXIgdGhhbiAke3JvbGxiYWNrLm1pbmltdW1SZXF1ZXN0c30gcmVxdWVzdHMgaWdub3JlZCkuYDtcbiAgICAgICAgaWYgKHJlZ2lvbiA9PT0gdGhpcy5ob21lUmVnaW9uKSB7XG4gICAgICAgICAgY29uc3QgYWxhcm0gPSBuZXcgY2xvdWR3YXRjaC5BbGFybSh0aGlzLCBgUm9sbGJhY2ske3Qua2V5fWAsIHtcbiAgICAgICAgICAgIG1ldHJpYzogbmV3IGNsb3Vkd2F0Y2guTWF0aEV4cHJlc3Npb24oe1xuICAgICAgICAgICAgICBleHByZXNzaW9uOiByYXRlRXhwcmVzc2lvbihyb2xsYmFjay5taW5pbXVtUmVxdWVzdHMpLFxuICAgICAgICAgICAgICB1c2luZ01ldHJpY3M6IHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0czogdGhpcy5tZXRyaWMoUkVRVUVTVFMsIHsgcGVyaW9kOiByb2xsYmFjay5wZXJpb2QgfSksXG4gICAgICAgICAgICAgICAgZXJyb3JzOiB0aGlzLm1ldHJpYyh0Lm1ldHJpYywgeyBwZXJpb2Q6IHJvbGxiYWNrLnBlcmlvZCB9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGVyaW9kOiByb2xsYmFjay5wZXJpb2QsXG4gICAgICAgICAgICAgIGxhYmVsOiBgJHt0LnN0YXR1c30gcmF0ZSAoJSlgLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHQudGhyZXNob2xkLFxuICAgICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IHJvbGxiYWNrLmV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fVEhSRVNIT0xELFxuICAgICAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gICAgICAgICAgICBhbGFybURlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnJvbGxiYWNrQWxhcm1zLnB1c2goYWxhcm0pO1xuICAgICAgICAgIGFybnMucHVzaChhbGFybS5hbGFybUFybik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgYWxhcm0gPSBuZXcgUmVnaW9uYWxBbGFybSh0aGlzLCBgUm9sbGJhY2ske3Qua2V5fS0ke3JlZ2lvbn1gLCB7XG4gICAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgICBhbGFybU5hbWU6IGAke0FMQVJNX05BTUVfUFJFRklYfSR7dGhpcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbk5hbWV9LSR7dGhpcy5lbmRwb2ludE5hbWV9LSR7dC5zaG9ydH0tcmF0ZWAsXG4gICAgICAgICAgICBhbGFybURlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgIG1ldHJpY3M6IHJhdGVBbGFybVF1ZXJpZXModGhpcy5tZXRyaWNJZHMoKSwgdC5tZXRyaWMsIHJvbGxiYWNrLnBlcmlvZCwgcm9sbGJhY2subWluaW11bVJlcXVlc3RzKSxcbiAgICAgICAgICAgIHRocmVzaG9sZDogdC50aHJlc2hvbGQsXG4gICAgICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogcm9sbGJhY2suZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9USFJFU0hPTEQsXG4gICAgICAgICAgICB0cmVhdE1pc3NpbmdEYXRhOiBjbG91ZHdhdGNoLlRyZWF0TWlzc2luZ0RhdGEuTk9UX0JSRUFDSElORyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnJvbGxiYWNrQWxhcm1zLnB1c2goY2xvdWR3YXRjaC5BbGFybS5mcm9tQWxhcm1Bcm4odGhpcywgYFJvbGxiYWNrJHt0LmtleX0tJHtyZWdpb259LVJlZmAsIGFsYXJtLmFsYXJtQXJuKSk7XG4gICAgICAgICAgYXJucy5wdXNoKGFsYXJtLmFsYXJtQXJuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJucztcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpc2VSZWdpb25zKHNjb3BlOiBDb25zdHJ1Y3QsIGVuZHBvaW50VHlwZTogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUsIGhvbWVSZWdpb246IHN0cmluZywgcmVnaW9uczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGV4dHJhID0gWy4uLm5ldyBTZXQocmVnaW9ucyldLmZpbHRlcigocikgPT4gciAhPT0gaG9tZVJlZ2lvbikuc29ydCgpO1xuICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykge1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQocikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiByZWdpb25zIG11c3QgYmUgbGl0ZXJhbCByZWdpb24gbmFtZXMsIGdvdCBhIHRva2VuYCk7XG4gICAgfVxuICAgIGlmICghL15bYS16XXsyfSgtW2Etel0rKSstXFxkJC8udGVzdChyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06ICcke3J9JyBpcyBub3QgYSB2YWxpZCByZWdpb24gbmFtZWApO1xuICAgIH1cbiAgfVxuICBpZiAoZW5kcG9pbnRUeXBlID09PSBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTiAmJiBleHRyYS5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IGEgSE9NRV9SRUdJT04gZW5kcG9pbnQgc2VydmVzIG9ubHkgdGhlIGhvbWUgcmVnaW9uICgke2hvbWVSZWdpb259KTsgdXNlIE1VTFRJX1JFR0lPTiBvciBQRVJfUkVHSU9OIHRvIGFkZCAke2V4dHJhLmpvaW4oJywgJyl9YCk7XG4gIH1cbiAgaWYgKGVuZHBvaW50VHlwZSAhPT0gV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuSE9NRV9SRUdJT04pIHtcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKGhvbWVSZWdpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogJHtlbmRwb2ludFR5cGV9IGVuZHBvaW50cyBuZWVkIGEgc3RhY2sgd2l0aCBhbiBleHBsaWNpdCByZWdpb24gKGVudi5yZWdpb24pYCk7XG4gICAgfVxuICAgIGlmIChleHRyYS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiBhICR7ZW5kcG9pbnRUeXBlfSBlbmRwb2ludCBuZWVkcyBhdCBsZWFzdCBvbmUgcmVnaW9uIGJlc2lkZXMgdGhlIGhvbWUgcmVnaW9uICgke2hvbWVSZWdpb259KWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXh0cmE7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUmF0ZUxpbWl0KHNjb3BlOiBDb25zdHJ1Y3QsIHJhdGVMaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmIChyYXRlTGltaXQgPT09IHVuZGVmaW5lZCB8fCBUb2tlbi5pc1VucmVzb2x2ZWQocmF0ZUxpbWl0KSkgcmV0dXJuO1xuICBjb25zdCBhbGxvd2VkID0gcmF0ZUxpbWl0ID09PSAwXG4gICAgfHwgKHJhdGVMaW1pdCA+PSAxMDAgJiYgcmF0ZUxpbWl0IDw9IDEwMDAgJiYgcmF0ZUxpbWl0ICUgMTAwID09PSAwKVxuICAgIHx8IChyYXRlTGltaXQgPj0gMjAwMCAmJiByYXRlTGltaXQgPD0gMTAwMDAgJiYgcmF0ZUxpbWl0ICUgMTAwMCA9PT0gMCk7XG4gIGlmICghYWxsb3dlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiByYXRlTGltaXQgbXVzdCBiZSAwLCAxMDAtMSwwMDAgaW4gc3RlcHMgb2YgMTAwLCBvciAyLDAwMC0xMCwwMDAgaW4gc3RlcHMgb2YgMSwwMDAsIGdvdCAke3JhdGVMaW1pdH1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU1heEVudmlyb25tZW50cyhzY29wZTogQ29uc3RydWN0LCBtYXhFbnZpcm9ubWVudHM6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAobWF4RW52aXJvbm1lbnRzID09PSB1bmRlZmluZWQgfHwgVG9rZW4uaXNVbnJlc29sdmVkKG1heEVudmlyb25tZW50cykpIHJldHVybjtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heEVudmlyb25tZW50cykgfHwgbWF4RW52aXJvbm1lbnRzIDwgMiB8fCBtYXhFbnZpcm9ubWVudHMgPiAxMDAwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiBtYXhFbnZpcm9ubWVudHMgbXVzdCBiZSBhbiBpbnRlZ2VyIGZyb20gMiB0byAxMCwwMDAsIGdvdCAke21heEVudmlyb25tZW50c31gKTtcbiAgfVxufVxuXG4vKiogYHByaW1hcnlgIGdldHMgd2hhdCBgYWRkaXRpb25hbGAgbGVhdmVzOyB3ZWlnaHRzIGFyZSB3aG9sZSBwZXJjZW50YWdlcyBzdW1taW5nIHRvIDEwMC4gKi9cbmZ1bmN0aW9uIHJldmlzaW9uV2VpZ2h0cyhcbiAgc2NvcGU6IENvbnN0cnVjdCxcbiAgd2ViRnVuY3Rpb246IElXZWJGdW5jdGlvbixcbiAgcHJpbWFyeTogSVdlYkZ1bmN0aW9uUmV2aXNpb24sXG4gIGFkZGl0aW9uYWw6IFdlYkZ1bmN0aW9uUmV2aXNpb25XZWlnaHRbXSxcbik6IGxhbWJkYS5DZm5XZWJGdW5jdGlvbkVuZHBvaW50LlJldmlzaW9uV2VpZ2h0UHJvcGVydHlbXSB7XG4gIGZvciAoY29uc3QgciBvZiBbcHJpbWFyeSwgLi4uYWRkaXRpb25hbC5tYXAoKGEpID0+IGEucmV2aXNpb24pXSkge1xuICAgIGlmIChyLndlYkZ1bmN0aW9uICE9PSB3ZWJGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IHJldmlzaW9uICR7ci5yZXZpc2lvbklkfSBiZWxvbmdzIHRvIGFub3RoZXIgZnVuY3Rpb25gKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFkZGl0aW9uYWwubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFt7IHJldmlzaW9uSWQ6IHByaW1hcnkucmV2aXNpb25JZCwgd2VpZ2h0OiAxMDAgfV07XG4gIH1cbiAgaWYgKGFkZGl0aW9uYWwubGVuZ3RoID4gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiBhbiBlbmRwb2ludCByb3V0ZXMgdG8gYXQgbW9zdCB0d28gcmV2aXNpb25zLCBzbyBhZGRpdGlvbmFsUmV2aXNpb25zIHRha2VzIG9uZWApO1xuICB9XG4gIGNvbnN0IFt7IHJldmlzaW9uLCB3ZWlnaHQgfV0gPSBhZGRpdGlvbmFsO1xuICBjb25zdCBwZXJjZW50ID0gTWF0aC5yb3VuZCh3ZWlnaHQgKiAxMDApO1xuICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKHdlaWdodCkgfHwgTWF0aC5hYnMod2VpZ2h0ICogMTAwIC0gcGVyY2VudCkgPiAxZS05IHx8IHBlcmNlbnQgPCAxIHx8IHBlcmNlbnQgPiA5OSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiBhbiBhZGRpdGlvbmFsIHJldmlzaW9uJ3Mgd2VpZ2h0IG11c3QgYmUgYSB3aG9sZSBwZXJjZW50YWdlIGZyb20gMC4wMSB0byAwLjk5LCBnb3QgJHt3ZWlnaHR9YCk7XG4gIH1cbiAgaWYgKHJldmlzaW9uID09PSBwcmltYXJ5IHx8ICghVG9rZW4uaXNVbnJlc29sdmVkKHJldmlzaW9uLnJldmlzaW9uSWQpICYmIHJldmlzaW9uLnJldmlzaW9uSWQgPT09IHByaW1hcnkucmV2aXNpb25JZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogdGhlIGFkZGl0aW9uYWwgcmV2aXNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGVuZHBvaW50J3MgcmV2aXNpb25gKTtcbiAgfVxuICByZXR1cm4gW3sgcmV2aXNpb25JZDogcHJpbWFyeS5yZXZpc2lvbklkLCB3ZWlnaHQ6IDEwMCAtIHBlcmNlbnQgfSwgeyByZXZpc2lvbklkOiByZXZpc2lvbi5yZXZpc2lvbklkLCB3ZWlnaHQ6IHBlcmNlbnQgfV07XG59XG5cbi8qKlxuICogYDxwcmVmaXg+LTxoYXNoPmAsIHdpdGggdGhlIGhhc2ggY292ZXJpbmcgdGhlIGVuZHBvaW50IHR5cGUgYW5kIHJlZ2lvbnM6IGEgdHlwZSBvciByZWdpb24gY2hhbmdlIHByb2R1Y2VzXG4gKiBhIG5ldyBuYW1lLCBzbyB0aGUgcmVwbGFjZW1lbnQgZG9lc24ndCBjb2xsaWRlIHdpdGggdGhlIGVuZHBvaW50IGl0IHJlcGxhY2VzLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0RW5kcG9pbnROYW1lKHByZWZpeDogc3RyaW5nLCBzZWVkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGVuZHBvaW50VHlwZTogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUsIGV4dHJhUmVnaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKFsuLi4oc2VlZCAhPT0gdW5kZWZpbmVkID8gW3NlZWRdIDogW10pLCBlbmRwb2ludFR5cGUsIC4uLmV4dHJhUmVnaW9uc10uam9pbignLCcpKS5kaWdlc3QoJ2hleCcpLnNsaWNlKDAsIDgpO1xuICByZXR1cm4gYCR7cHJlZml4fS0ke2hhc2h9YDtcbn1cbiJdfQ==
|
|
@@ -42,7 +42,7 @@ const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
|
42
42
|
class WebFunctionGrants {
|
|
43
43
|
endpointArns;
|
|
44
44
|
webFunction;
|
|
45
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionGrants", version: "0.1.
|
|
45
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionGrants", version: "0.1.6" };
|
|
46
46
|
/**
|
|
47
47
|
* @internal
|
|
48
48
|
*/
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Duration } from 'aws-cdk-lib';
|
|
2
|
+
import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
|
|
3
|
+
import type { WebFunctionEndpoint } from './web-function-endpoint';
|
|
4
|
+
/**
|
|
5
|
+
* Properties for a Web Function endpoint origin.
|
|
6
|
+
*/
|
|
7
|
+
export interface WebFunctionOriginProps extends cloudfront.OriginProps {
|
|
8
|
+
/**
|
|
9
|
+
* For a `PER_REGION` endpoint: the region whose URL CloudFront calls. Only one region per origin; use an origin
|
|
10
|
+
* group or one origin per behavior for more.
|
|
11
|
+
*
|
|
12
|
+
* @default - the endpoint's home region
|
|
13
|
+
*/
|
|
14
|
+
readonly region?: string;
|
|
15
|
+
/**
|
|
16
|
+
* How long CloudFront waits for a response from the origin. Above 120 seconds needs a CloudFront quota increase.
|
|
17
|
+
*
|
|
18
|
+
* @default Duration.seconds(30)
|
|
19
|
+
*/
|
|
20
|
+
readonly readTimeout?: Duration;
|
|
21
|
+
/**
|
|
22
|
+
* How long CloudFront keeps its connection to the origin open.
|
|
23
|
+
*
|
|
24
|
+
* @default Duration.seconds(5)
|
|
25
|
+
*/
|
|
26
|
+
readonly keepaliveTimeout?: Duration;
|
|
27
|
+
/**
|
|
28
|
+
* Which IP protocol CloudFront uses to connect to the origin.
|
|
29
|
+
*
|
|
30
|
+
* @default OriginIpAddressType.IPV4
|
|
31
|
+
*/
|
|
32
|
+
readonly ipAddressType?: cloudfront.OriginIpAddressType;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Properties for a Web Function endpoint origin with origin access control.
|
|
36
|
+
*/
|
|
37
|
+
export interface WebFunctionOriginWithOacProps extends WebFunctionOriginProps {
|
|
38
|
+
/**
|
|
39
|
+
* The origin access control. It must have origin type `lambda`, signing behavior `always-amz-auth`, and signing
|
|
40
|
+
* protocol `sigv4` (a regional endpoint) or `sigv4a` (a `MULTI_REGION` endpoint's global domain). Checked at
|
|
41
|
+
* synthesis when it's defined in this app (CDK's `FunctionUrlOriginAccessControl` signs with `always`, which
|
|
42
|
+
* CloudFront rejects for Web Function origins).
|
|
43
|
+
*
|
|
44
|
+
* @default - one is created per stack and signing protocol
|
|
45
|
+
*/
|
|
46
|
+
readonly originAccessControl?: cloudfront.IOriginAccessControlRef;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* A CloudFront origin for a Web Function endpoint.
|
|
50
|
+
*
|
|
51
|
+
* Use `WebFunctionOrigin.withOriginAccessControl(endpoint)` for an `AWS_IAM` endpoint: CloudFront signs every request,
|
|
52
|
+
* and only your distribution may call the endpoint. `new WebFunctionOrigin(endpoint)` is for a public (`NONE`) endpoint.
|
|
53
|
+
*/
|
|
54
|
+
export declare class WebFunctionOrigin extends cloudfront.OriginBase {
|
|
55
|
+
/**
|
|
56
|
+
* An origin for an `AWS_IAM` endpoint, with origin access control: CloudFront signs every request to the endpoint
|
|
57
|
+
* (`always-amz-auth`, which keeps the viewer's `Authorization` header for your application), and the function's
|
|
58
|
+
* resource policy allows `cloudfront.amazonaws.com` to call this endpoint on behalf of this distribution only.
|
|
59
|
+
*
|
|
60
|
+
* The distribution must be in the function's stack.
|
|
61
|
+
*/
|
|
62
|
+
static withOriginAccessControl(endpoint: WebFunctionEndpoint, props?: WebFunctionOriginWithOacProps): cloudfront.IOrigin;
|
|
63
|
+
private readonly props;
|
|
64
|
+
constructor(endpoint: WebFunctionEndpoint, props?: WebFunctionOriginProps);
|
|
65
|
+
protected renderCustomOriginConfig(): cloudfront.CfnDistribution.CustomOriginConfigProperty | undefined;
|
|
66
|
+
}
|