@liflig/cdk 3.2.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api-gateway/authorizer-lambdas/basic-auth-authorizer.d.ts +19 -1
- package/lib/api-gateway/authorizer-lambdas/basic-auth-authorizer.js +47 -17
- package/lib/api-gateway/authorizer-lambdas/cognito-user-pool-authorizer.d.ts +7 -6
- package/lib/api-gateway/authorizer-lambdas/cognito-user-pool-authorizer.js +3 -3
- package/lib/api-gateway/authorizer-lambdas/cognito-user-pool-or-basic-auth-authorizer.d.ts +17 -8
- package/lib/api-gateway/authorizer-lambdas/cognito-user-pool-or-basic-auth-authorizer.js +47 -21
- package/lib/api-gateway/http-api-gateway.d.ts +7 -7
- package/lib/api-gateway/http-api-gateway.js +5 -6
- package/package.json +1 -1
|
@@ -10,9 +10,27 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import type { APIGatewayRequestAuthorizerEventV2, APIGatewaySimpleAuthorizerResult } from "aws-lambda";
|
|
12
12
|
import { SecretsManager } from "@aws-sdk/client-secrets-manager";
|
|
13
|
-
|
|
13
|
+
type AuthorizerResult = APIGatewaySimpleAuthorizerResult & {
|
|
14
|
+
/**
|
|
15
|
+
* Returning a context object from our authorizer allows our API Gateway to access these variables
|
|
16
|
+
* via `${context.authorizer.<property>}`.
|
|
17
|
+
* https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-parameter-mapping.html
|
|
18
|
+
*/
|
|
19
|
+
context?: {
|
|
20
|
+
/**
|
|
21
|
+
* If the request's credentials are verified, we return the username that was used in this
|
|
22
|
+
* context variable (named `authorizer.username`). We use this to include the requesting user in
|
|
23
|
+
* the API Gateway access logs (see `defaultAccessLogFormat` in our `ApiGateway` construct). You
|
|
24
|
+
* can also use this when mapping parameters to the backend integration (see
|
|
25
|
+
* `AlbIntegrationProps.mapParameters` on the `ApiGateway` construct).
|
|
26
|
+
*/
|
|
27
|
+
username: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
export declare const handler: (event: APIGatewayRequestAuthorizerEventV2) => Promise<AuthorizerResult>;
|
|
14
31
|
/** For overriding dependency creation in tests. */
|
|
15
32
|
export declare const dependencies: {
|
|
16
33
|
createSecretsManager: () => SecretsManager;
|
|
17
34
|
};
|
|
18
35
|
export declare function clearCache(): void;
|
|
36
|
+
export {};
|
|
@@ -14,37 +14,42 @@ export const handler = async (event) => {
|
|
|
14
14
|
if (!authHeader || !authHeader.startsWith("Basic ")) {
|
|
15
15
|
return { isAuthorized: false };
|
|
16
16
|
}
|
|
17
|
-
const
|
|
18
|
-
for (const
|
|
19
|
-
if (authHeader ===
|
|
20
|
-
return {
|
|
17
|
+
const expectedCredentials = await getExpectedBasicAuthCredentials();
|
|
18
|
+
for (const expected of expectedCredentials) {
|
|
19
|
+
if (authHeader === expected.basicAuthHeader) {
|
|
20
|
+
return {
|
|
21
|
+
isAuthorized: true,
|
|
22
|
+
context: {
|
|
23
|
+
username: expected.username,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
21
26
|
}
|
|
22
27
|
}
|
|
23
28
|
return { isAuthorized: false };
|
|
24
29
|
};
|
|
25
30
|
/** Cache this value, so that subsequent lambda invocations don't have to refetch. */
|
|
26
|
-
let
|
|
31
|
+
let cachedBasicAuthCredentials = undefined;
|
|
27
32
|
/**
|
|
28
|
-
* Returns an array
|
|
29
|
-
*
|
|
33
|
+
* Returns an array, to support credential secrets with multiple values (see
|
|
34
|
+
* `BasicAuthAuthorizerProps` on the `ApiGateway` construct for more on this).
|
|
30
35
|
*/
|
|
31
|
-
async function
|
|
32
|
-
if (
|
|
36
|
+
async function getExpectedBasicAuthCredentials() {
|
|
37
|
+
if (cachedBasicAuthCredentials === undefined) {
|
|
33
38
|
const secretName = process.env["CREDENTIALS_SECRET_NAME"];
|
|
34
39
|
if (!secretName) {
|
|
35
40
|
console.error("CREDENTIALS_SECRET_NAME env variable is not defined");
|
|
36
41
|
throw new Error();
|
|
37
42
|
}
|
|
38
|
-
|
|
43
|
+
cachedBasicAuthCredentials = await getBasicAuthCredentialsSecret(secretName);
|
|
39
44
|
}
|
|
40
|
-
return
|
|
45
|
+
return cachedBasicAuthCredentials;
|
|
41
46
|
}
|
|
42
|
-
async function
|
|
47
|
+
async function getBasicAuthCredentialsSecret(secretName) {
|
|
43
48
|
const secret = await getSecretValue(secretName);
|
|
44
49
|
if (isSingleUsernameAndPassword(secret)) {
|
|
45
50
|
const header = "Basic " +
|
|
46
51
|
Buffer.from(`${secret.username}:${secret.password}`).toString("base64");
|
|
47
|
-
return [header];
|
|
52
|
+
return [{ basicAuthHeader: header, username: secret.username }];
|
|
48
53
|
}
|
|
49
54
|
// See `BasicAuthAuthorizerProps` on the `ApiGateway` construct for an explanation of the formats
|
|
50
55
|
// we parse here
|
|
@@ -58,7 +63,7 @@ async function getSecretAsBasicAuthHeaders(secretName) {
|
|
|
58
63
|
throw new Error();
|
|
59
64
|
}
|
|
60
65
|
if (isStringArray(credentialsArray)) {
|
|
61
|
-
return credentialsArray.map(
|
|
66
|
+
return credentialsArray.map(parseEncodedBasicAuthCredentials);
|
|
62
67
|
}
|
|
63
68
|
}
|
|
64
69
|
console.error(`Basic auth credentials secret did not follow any expected format (secret name: '${secretName}')`);
|
|
@@ -79,7 +84,7 @@ async function getSecretValue(secretName) {
|
|
|
79
84
|
return JSON.parse(secret.SecretString);
|
|
80
85
|
}
|
|
81
86
|
catch (e) {
|
|
82
|
-
console.error(`Failed to parse secret '${secretName}' as JSON
|
|
87
|
+
console.error(`Failed to parse secret '${secretName}' as JSON:`, e);
|
|
83
88
|
throw new Error();
|
|
84
89
|
}
|
|
85
90
|
}
|
|
@@ -108,7 +113,32 @@ function isStringArray(value) {
|
|
|
108
113
|
}
|
|
109
114
|
return true;
|
|
110
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* We want to return the requesting username as a context variable in
|
|
118
|
+
* {@link AuthorizerResult.context}, for API Gateway access logs and parameter mapping. So if the
|
|
119
|
+
* basic auth credentials secret is stored as pre-encoded base64 strings, we need to parse them to
|
|
120
|
+
* get the username.
|
|
121
|
+
*/
|
|
122
|
+
function parseEncodedBasicAuthCredentials(encodedCredentials) {
|
|
123
|
+
let decodedCredentials;
|
|
124
|
+
try {
|
|
125
|
+
decodedCredentials = Buffer.from(encodedCredentials, "base64").toString();
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
console.error("Basic auth credentials secret could not be decoded as base64:", e);
|
|
129
|
+
throw new Error();
|
|
130
|
+
}
|
|
131
|
+
const usernameAndPassword = decodedCredentials.split(":", 2);
|
|
132
|
+
if (usernameAndPassword.length !== 2) {
|
|
133
|
+
console.error("Basic auth credentials secret could not be decoded as 'username:password'");
|
|
134
|
+
throw new Error();
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
basicAuthHeader: `Basic ${encodedCredentials}`,
|
|
138
|
+
username: usernameAndPassword[0],
|
|
139
|
+
};
|
|
140
|
+
}
|
|
111
141
|
export function clearCache() {
|
|
112
|
-
|
|
142
|
+
cachedBasicAuthCredentials = undefined;
|
|
113
143
|
}
|
|
114
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWMtYXV0aC1hdXRob3JpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS1nYXRld2F5L2F1dGhvcml6ZXItbGFtYmRhcy9iYXNpYy1hdXRoLWF1dGhvcml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBTUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBRWhFLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQzFCLEtBQXlDLEVBQ0UsRUFBRTtJQUM3QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQTtJQUMvQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUE7SUFDaEMsQ0FBQztJQUVELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSwyQkFBMkIsRUFBRSxDQUFBO0lBRS9ELEtBQUssTUFBTSxjQUFjLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUNqRCxJQUFJLFVBQVUsS0FBSyxjQUFjLEVBQUUsQ0FBQztZQUNsQyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFBO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQTtBQUNoQyxDQUFDLENBQUE7QUFFRCxxRkFBcUY7QUFDckYsSUFBSSxzQkFBc0IsR0FBeUIsU0FBUyxDQUFBO0FBRTVEOzs7R0FHRztBQUNILEtBQUssVUFBVSwyQkFBMkI7SUFDeEMsSUFBSSxzQkFBc0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN6QyxNQUFNLFVBQVUsR0FDZCxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUE7UUFDeEMsSUFBSSxDQUFDLFVBQVUs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O1FBQ2xDLFVBQVUsSUFBSSxLQUFLO1FBQ25CLE9BQU8sS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQ25DLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxnQ0FBZ0MsQ0FDdkMsS0FBYztJQUVkLE9BQU8sQ0FDTCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLEtBQUssS0FBSyxJQUFJO1FBQ2QsYUFBYSxJQUFJLEtBQUs7UUFDdEIsT0FBTyxLQUFLLENBQUMsV0FBVyxLQUFLLFFBQVEsQ0FDdEMsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsS0FBSyxNQUFNLE9BQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM1QixJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sS0FBSyxDQUFBO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVTtJQUN4QixzQkFBc0IsR0FBRyxTQUFTLENBQUE7QUFDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBsYW1iZGEgdmVyaWZpZXMgYXV0aG9yaXphdGlvbiBoZWFkZXIgYWdhaW5zdCBzdGF0aWMgYmFzaWMgYXV0aCBjcmVkZW50aWFscyBzYXZlZCBpbiBTZWNyZXRcbiAqIE1hbmFnZXIuXG4gKlxuICogRXhwZWN0cyB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIC0gQ1JFREVOVElBTFNfU0VDUkVUX05BTUVcbiAqICAgLSBTZWNyZXQgdmFsdWUgc2hvdWxkIGZvbGxvdyB0aGlzIGZvcm1hdDogYHtcInVzZXJuYW1lXCI6XCI8dXNlcm5hbWU+XCIsXCJwYXNzd29yZFwiOlwiPHBhc3N3b3JkPlwifWAuXG4gKiAgICAgQSBkaWZmZXJlbnQgZm9ybWF0IHdpdGggYW4gYXJyYXkgb2YgcHJlLWVuY29kZWQgY3JlZGVudGlhbHMgaXMgYWxzbyBzdXBwb3J0ZWQgLSBzZWUgZG9jcyBmb3JcbiAqICAgICB0aGUgYEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBUElHYXRld2F5UmVxdWVzdEF1dGhvcml6ZXJFdmVudFYyLFxuICBBUElHYXRld2F5U2ltcGxlQXV0aG9yaXplclJlc3VsdCxcbn0gZnJvbSBcImF3cy1sYW1iZGFcIlxuaW1wb3J0IHsgU2VjcmV0c01hbmFnZXIgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlclwiXG5cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gYXN5bmMgKFxuICBldmVudDogQVBJR2F0ZXdheVJlcXVlc3RBdXRob3JpemVyRXZlbnRWMixcbik6IFByb21pc2U8QVBJR2F0ZXdheVNpbXBsZUF1dGhvcml6ZXJSZXN1bHQ+ID0+IHtcbiAgY29uc3QgYXV0aEhlYWRlciA9IGV2ZW50LmhlYWRlcnM/LmF1dGhvcml6YXRpb25cbiAgaWYgKCFhdXRoSGVhZGVyIHx8ICFhdXRoSGVhZGVyLnN0YXJ0c1dpdGgoXCJCYXNpYyBcIikpIHtcbiAgICByZXR1cm4geyBpc0F1dGhvcml6ZWQ6IGZhbHNlIH1cbiAgfVxuXG4gIGNvbnN0IGV4cGVjdGVkQXV0aEhlYWRlcnMgPSBhd2FpdCBnZXRFeHBlY3RlZEJhc2ljQXV0aEhlYWRlcnMoKVxuXG4gIGZvciAoY29uc3QgZXhwZWN0ZWRIZWFkZXIgb2YgZXhwZWN0ZWRBdXRoSGVhZGVycykge1xuICAgIGlmIChhdXRoSGVhZGVyID09PSBleHBlY3RlZEhlYWRlcikge1xuICAgICAgcmV0dXJuIHsgaXNBdXRob3JpemVkOiB0cnVlIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBpc0F1dGhvcml6ZWQ6IGZhbHNlIH1cbn1cblxuLyoqIENhY2hlIHRoaXMgdmFsdWUsIHNvIHRoYXQgc3Vic2VxdWVudCBsYW1iZGEgaW52b2NhdGlvbnMgZG9uJ3QgaGF2ZSB0byByZWZldGNoLiAqL1xubGV0IGNhY2hlZEJhc2ljQXV0aEhlYWRlcnM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGxvd2VkIGJhc2ljIGF1dGggaGVhZGVycywgdG8gc3VwcG9ydCBjcmVkZW50aWFsIHNlY3JldHMgd2l0aCBtdWx0aXBsZVxuICogdmFsdWVzIChzZWUgYEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QgZm9yIG1vcmUgb24gdGhpcykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEV4cGVjdGVkQmFzaWNBdXRoSGVhZGVycygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGlmIChjYWNoZWRCYXNpY0F1dGhIZWFkZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBzZWNyZXROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgcHJvY2Vzcy5lbnZbXCJDUkVERU5USUFMU19TRUNSRVRfTkFNRVwiXVxuICAgIGlmICghc2VjcmV0TmFtZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIkNSRURFTlRJQUxTX1NFQ1JFVF9OQU1FIGVudiB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZFwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKClcbiAgICB9XG5cbiAgICBjYWNoZWRCYXNpY0F1dGhIZWFkZXJzID0gYXdhaXQgZ2V0U2VjcmV0QXNCYXNpY0F1dGhIZWFkZXJzKHNlY3JldE5hbWUpXG4gIH1cblxuICByZXR1cm4gY2FjaGVkQmFzaWNBdXRoSGVhZGVyc1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRTZWNyZXRBc0Jhc2ljQXV0aEhlYWRlcnMoXG4gIHNlY3JldE5hbWU6IHN0cmluZyxcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgc2VjcmV0ID0gYXdhaXQgZ2V0U2VjcmV0VmFsdWUoc2VjcmV0TmFtZSlcblxuICBpZiAoaXNTaW5nbGVVc2VybmFtZUFuZFBhc3N3b3JkKHNlY3JldCkpIHtcbiAgICBjb25zdCBoZWFkZXIgPVxuICAgICAgXCJCYXNpYyBcIiArXG4gICAgICBCdWZmZXIuZnJvbShgJHtzZWNyZXQudXNlcm5hbWV9OiR7c2VjcmV0LnBhc3N3b3JkfWApLnRvU3RyaW5nKFwiYmFzZTY0XCIpXG4gICAgcmV0dXJuIFtoZWFkZXJdXG4gIH1cblxuICAvLyBTZWUgYEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBmb3JtYXRzXG4gIC8vIHdlIHBhcnNlIGhlcmVcbiAgaWYgKGhhc0NyZWRlbnRpYWxzS2V5V2l0aFN0cmluZ1ZhbHVlKHNlY3JldCkpIHtcbiAgICBsZXQgY3JlZGVudGlhbHNBcnJheTogdW5rbm93blxuICAgIHRyeSB7XG4gICAgICBjcmVkZW50aWFsc0FycmF5ID0gSlNPTi5wYXJzZShzZWNyZXQuY3JlZGVudGlhbHMpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBwYXJzZSBjcmVkZW50aWFscyBhcnJheSBpbiBzZWNyZXQgJyR7c2VjcmV0TmFtZX0nIGFzIEpTT05gLFxuICAgICAgICBlLFxuICAgICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKClcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJpbmdBcnJheShjcmVkZW50aWFsc0FycmF5KSkge1xuICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzQXJyYXkubWFwKFxuICAgICAgICAoZW5jb2RlZENyZWRlbnRpYWwpID0+IGBCYXNpYyAke2VuY29kZWRDcmVkZW50aWFsfWAsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5lcnJvcihcbiAgICBgQmFzaWMgYXV0aCBjcmVkZW50aWFscyBzZWNyZXQgZGlkIG5vdCBmb2xsb3cgYW55IGV4cGVjdGVkIGZvcm1hdCAoc2VjcmV0IG5hbWU6ICcke3NlY3JldE5hbWV9JylgLFxuICApXG4gIHRocm93IG5ldyBFcnJvcigpXG59XG5cbi8qKiBGb3Igb3ZlcnJpZGluZyBkZXBlbmRlbmN5IGNyZWF0aW9uIGluIHRlc3RzLiAqL1xuZXhwb3J0IGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgY3JlYXRlU2VjcmV0c01hbmFnZXI6ICgpID0+IG5ldyBTZWNyZXRzTWFuYWdlcigpLFxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRTZWNyZXRWYWx1ZShzZWNyZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY2xpZW50ID0gZGVwZW5kZW5jaWVzLmNyZWF0ZVNlY3JldHNNYW5hZ2VyKClcbiAgY29uc3Qgc2VjcmV0ID0gYXdhaXQgY2xpZW50LmdldFNlY3JldFZhbHVlKHsgU2VjcmV0SWQ6IHNlY3JldE5hbWUgfSlcblxuICBpZiAoIXNlY3JldC5TZWNyZXRTdHJpbmcpIHtcbiAgICBjb25zb2xlLmVycm9yKGBTZWNyZXQgdmFsdWUgbm90IGZvdW5kIGZvciAnJHtzZWNyZXROYW1lfSdgKVxuICAgIHRocm93IG5ldyBFcnJvcigpXG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHNlY3JldC5TZWNyZXRTdHJpbmcpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2Ugc2VjcmV0ICcke3NlY3JldE5hbWV9JyBhcyBKU09OYCwgZSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzU2luZ2xlVXNlcm5hbWVBbmRQYXNzd29yZChcbiAgdmFsdWU6IHVua25vd24sXG4pOiB2YWx1ZSBpcyB7IHVzZXJuYW1lOiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmcgfSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICBcInVzZXJuYW1lXCIgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUudXNlcm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICBcInBhc3N3b3JkXCIgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUucGFzc3dvcmQgPT09IFwic3RyaW5nXCJcbiAgKVxufVxuXG5mdW5jdGlvbiBoYXNDcmVkZW50aWFsc0tleVdpdGhTdHJpbmdWYWx1ZShcbiAgdmFsdWU6IHVua25vd24sXG4pOiB2YWx1ZSBpcyB7IGNyZWRlbnRpYWxzOiBzdHJpbmcgfSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICBcImNyZWRlbnRpYWxzXCIgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUuY3JlZGVudGlhbHMgPT09IFwic3RyaW5nXCJcbiAgKVxufVxuXG5mdW5jdGlvbiBpc1N0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nW10ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNhY2hlKCkge1xuICBjYWNoZWRCYXNpY0F1dGhIZWFkZXJzID0gdW5kZWZpbmVkXG59XG4iXX0=
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWMtYXV0aC1hdXRob3JpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS1nYXRld2F5L2F1dGhvcml6ZXItbGFtYmRhcy9iYXNpYy1hdXRoLWF1dGhvcml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBTUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBb0JoRSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUMxQixLQUF5QyxFQUNkLEVBQUU7SUFDN0IsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUE7SUFDL0MsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFBO0lBQ2hDLENBQUM7SUFFRCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sK0JBQStCLEVBQUUsQ0FBQTtJQUVuRSxLQUFLLE1BQU0sUUFBUSxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDM0MsSUFBSSxVQUFVLEtBQUssUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzVDLE9BQU87Z0JBQ0wsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLE9BQU8sRUFBRTtvQkFDUCxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7aUJBQzVCO2FBQ0YsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQTtBQUNoQyxDQUFDLENBQUE7QUFPRCxxRkFBcUY7QUFDckYsSUFBSSwwQkFBMEIsR0FDNUIsU0FBUyxDQUFBO0FBRVg7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLCtCQUErQjtJQUc1QyxJQUFJLDBCQUEwQixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzdDLE1BQU0sVUFB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QixDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDNUQsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDckMsT0FBTyxDQUFDLEtBQUssQ0FDWCwyRUFBMkUsQ0FDNUUsQ0FBQTtRQUNELE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQTtJQUNuQixDQUFDO0lBRUQsT0FBTztRQUNMLGVBQWUsRUFBRSxTQUFTLGtCQUFrQixFQUFFO1FBQzlDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7S0FDakMsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVTtJQUN4QiwwQkFBMEIsR0FBRyxTQUFTLENBQUE7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBsYW1iZGEgdmVyaWZpZXMgYXV0aG9yaXphdGlvbiBoZWFkZXIgYWdhaW5zdCBzdGF0aWMgYmFzaWMgYXV0aCBjcmVkZW50aWFscyBzYXZlZCBpbiBTZWNyZXRcbiAqIE1hbmFnZXIuXG4gKlxuICogRXhwZWN0cyB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIC0gQ1JFREVOVElBTFNfU0VDUkVUX05BTUVcbiAqICAgLSBTZWNyZXQgdmFsdWUgc2hvdWxkIGZvbGxvdyB0aGlzIGZvcm1hdDogYHtcInVzZXJuYW1lXCI6XCI8dXNlcm5hbWU+XCIsXCJwYXNzd29yZFwiOlwiPHBhc3N3b3JkPlwifWAuXG4gKiAgICAgQSBkaWZmZXJlbnQgZm9ybWF0IHdpdGggYW4gYXJyYXkgb2YgcHJlLWVuY29kZWQgY3JlZGVudGlhbHMgaXMgYWxzbyBzdXBwb3J0ZWQgLSBzZWUgZG9jcyBmb3JcbiAqICAgICB0aGUgYEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBUElHYXRld2F5UmVxdWVzdEF1dGhvcml6ZXJFdmVudFYyLFxuICBBUElHYXRld2F5U2ltcGxlQXV0aG9yaXplclJlc3VsdCxcbn0gZnJvbSBcImF3cy1sYW1iZGFcIlxuaW1wb3J0IHsgU2VjcmV0c01hbmFnZXIgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlclwiXG5cbnR5cGUgQXV0aG9yaXplclJlc3VsdCA9IEFQSUdhdGV3YXlTaW1wbGVBdXRob3JpemVyUmVzdWx0ICYge1xuICAvKipcbiAgICogUmV0dXJuaW5nIGEgY29udGV4dCBvYmplY3QgZnJvbSBvdXIgYXV0aG9yaXplciBhbGxvd3Mgb3VyIEFQSSBHYXRld2F5IHRvIGFjY2VzcyB0aGVzZSB2YXJpYWJsZXNcbiAgICogdmlhIGAke2NvbnRleHQuYXV0aG9yaXplci48cHJvcGVydHk+fWAuXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1wYXJhbWV0ZXItbWFwcGluZy5odG1sXG4gICAqL1xuICBjb250ZXh0Pzoge1xuICAgIC8qKlxuICAgICAqIElmIHRoZSByZXF1ZXN0J3MgY3JlZGVudGlhbHMgYXJlIHZlcmlmaWVkLCB3ZSByZXR1cm4gdGhlIHVzZXJuYW1lIHRoYXQgd2FzIHVzZWQgaW4gdGhpc1xuICAgICAqIGNvbnRleHQgdmFyaWFibGUgKG5hbWVkIGBhdXRob3JpemVyLnVzZXJuYW1lYCkuIFdlIHVzZSB0aGlzIHRvIGluY2x1ZGUgdGhlIHJlcXVlc3RpbmcgdXNlciBpblxuICAgICAqIHRoZSBBUEkgR2F0ZXdheSBhY2Nlc3MgbG9ncyAoc2VlIGBkZWZhdWx0QWNjZXNzTG9nRm9ybWF0YCBpbiBvdXIgYEFwaUdhdGV3YXlgIGNvbnN0cnVjdCkuIFlvdVxuICAgICAqIGNhbiBhbHNvIHVzZSB0aGlzIHdoZW4gbWFwcGluZyBwYXJhbWV0ZXJzIHRvIHRoZSBiYWNrZW5kIGludGVncmF0aW9uIChzZWVcbiAgICAgKiBgQWxiSW50ZWdyYXRpb25Qcm9wcy5tYXBQYXJhbWV0ZXJzYCBvbiB0aGUgYEFwaUdhdGV3YXlgIGNvbnN0cnVjdCkuXG4gICAgICovXG4gICAgdXNlcm5hbWU6IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gYXN5bmMgKFxuICBldmVudDogQVBJR2F0ZXdheVJlcXVlc3RBdXRob3JpemVyRXZlbnRWMixcbik6IFByb21pc2U8QXV0aG9yaXplclJlc3VsdD4gPT4ge1xuICBjb25zdCBhdXRoSGVhZGVyID0gZXZlbnQuaGVhZGVycz8uYXV0aG9yaXphdGlvblxuICBpZiAoIWF1dGhIZWFkZXIgfHwgIWF1dGhIZWFkZXIuc3RhcnRzV2l0aChcIkJhc2ljIFwiKSkge1xuICAgIHJldHVybiB7IGlzQXV0aG9yaXplZDogZmFsc2UgfVxuICB9XG5cbiAgY29uc3QgZXhwZWN0ZWRDcmVkZW50aWFscyA9IGF3YWl0IGdldEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMoKVxuXG4gIGZvciAoY29uc3QgZXhwZWN0ZWQgb2YgZXhwZWN0ZWRDcmVkZW50aWFscykge1xuICAgIGlmIChhdXRoSGVhZGVyID09PSBleHBlY3RlZC5iYXNpY0F1dGhIZWFkZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzQXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIHVzZXJuYW1lOiBleHBlY3RlZC51c2VybmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBpc0F1dGhvcml6ZWQ6IGZhbHNlIH1cbn1cblxudHlwZSBFeHBlY3RlZEJhc2ljQXV0aENyZWRlbnRpYWxzID0ge1xuICBiYXNpY0F1dGhIZWFkZXI6IHN0cmluZ1xuICB1c2VybmFtZTogc3RyaW5nXG59XG5cbi8qKiBDYWNoZSB0aGlzIHZhbHVlLCBzbyB0aGF0IHN1YnNlcXVlbnQgbGFtYmRhIGludm9jYXRpb25zIGRvbid0IGhhdmUgdG8gcmVmZXRjaC4gKi9cbmxldCBjYWNoZWRCYXNpY0F1dGhDcmVkZW50aWFsczogRXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFsc1tdIHwgdW5kZWZpbmVkID1cbiAgdW5kZWZpbmVkXG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSwgdG8gc3VwcG9ydCBjcmVkZW50aWFsIHNlY3JldHMgd2l0aCBtdWx0aXBsZSB2YWx1ZXMgKHNlZVxuICogYEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QgZm9yIG1vcmUgb24gdGhpcykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMoKTogUHJvbWlzZTxcbiAgRXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFsc1tdXG4+IHtcbiAgaWYgKGNhY2hlZEJhc2ljQXV0aENyZWRlbnRpYWxzID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBzZWNyZXROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgcHJvY2Vzcy5lbnZbXCJDUkVERU5USUFMU19TRUNSRVRfTkFNRVwiXVxuICAgIGlmICghc2VjcmV0TmFtZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIkNSRURFTlRJQUxTX1NFQ1JFVF9OQU1FIGVudiB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZFwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKClcbiAgICB9XG5cbiAgICBjYWNoZWRCYXNpY0F1dGhDcmVkZW50aWFscyA9IGF3YWl0IGdldEJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0KHNlY3JldE5hbWUpXG4gIH1cblxuICByZXR1cm4gY2FjaGVkQmFzaWNBdXRoQ3JlZGVudGlhbHNcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QmFzaWNBdXRoQ3JlZGVudGlhbHNTZWNyZXQoXG4gIHNlY3JldE5hbWU6IHN0cmluZyxcbik6IFByb21pc2U8RXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFsc1tdPiB7XG4gIGNvbnN0IHNlY3JldCA9IGF3YWl0IGdldFNlY3JldFZhbHVlKHNlY3JldE5hbWUpXG5cbiAgaWYgKGlzU2luZ2xlVXNlcm5hbWVBbmRQYXNzd29yZChzZWNyZXQpKSB7XG4gICAgY29uc3QgaGVhZGVyID1cbiAgICAgIFwiQmFzaWMgXCIgK1xuICAgICAgQnVmZmVyLmZyb20oYCR7c2VjcmV0LnVzZXJuYW1lfToke3NlY3JldC5wYXNzd29yZH1gKS50b1N0cmluZyhcImJhc2U2NFwiKVxuICAgIHJldHVybiBbeyBiYXNpY0F1dGhIZWFkZXI6IGhlYWRlciwgdXNlcm5hbWU6IHNlY3JldC51c2VybmFtZSB9XVxuICB9XG5cbiAgLy8gU2VlIGBCYXNpY0F1dGhBdXRob3JpemVyUHJvcHNgIG9uIHRoZSBgQXBpR2F0ZXdheWAgY29uc3RydWN0IGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgZm9ybWF0c1xuICAvLyB3ZSBwYXJzZSBoZXJlXG4gIGlmIChoYXNDcmVkZW50aWFsc0tleVdpdGhTdHJpbmdWYWx1ZShzZWNyZXQpKSB7XG4gICAgbGV0IGNyZWRlbnRpYWxzQXJyYXk6IHVua25vd25cbiAgICB0cnkge1xuICAgICAgY3JlZGVudGlhbHNBcnJheSA9IEpTT04ucGFyc2Uoc2VjcmV0LmNyZWRlbnRpYWxzKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcGFyc2UgY3JlZGVudGlhbHMgYXJyYXkgaW4gc2VjcmV0ICcke3NlY3JldE5hbWV9JyBhcyBKU09OYCxcbiAgICAgICAgZSxcbiAgICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcigpXG4gICAgfVxuXG4gICAgaWYgKGlzU3RyaW5nQXJyYXkoY3JlZGVudGlhbHNBcnJheSkpIHtcbiAgICAgIHJldHVybiBjcmVkZW50aWFsc0FycmF5Lm1hcChwYXJzZUVuY29kZWRCYXNpY0F1dGhDcmVkZW50aWFscylcbiAgICB9XG4gIH1cblxuICBjb25zb2xlLmVycm9yKFxuICAgIGBCYXNpYyBhdXRoIGNyZWRlbnRpYWxzIHNlY3JldCBkaWQgbm90IGZvbGxvdyBhbnkgZXhwZWN0ZWQgZm9ybWF0IChzZWNyZXQgbmFtZTogJyR7c2VjcmV0TmFtZX0nKWAsXG4gIClcbiAgdGhyb3cgbmV3IEVycm9yKClcbn1cblxuLyoqIEZvciBvdmVycmlkaW5nIGRlcGVuZGVuY3kgY3JlYXRpb24gaW4gdGVzdHMuICovXG5leHBvcnQgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICBjcmVhdGVTZWNyZXRzTWFuYWdlcjogKCkgPT4gbmV3IFNlY3JldHNNYW5hZ2VyKCksXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNlY3JldFZhbHVlKHNlY3JldE5hbWU6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBjbGllbnQgPSBkZXBlbmRlbmNpZXMuY3JlYXRlU2VjcmV0c01hbmFnZXIoKVxuICBjb25zdCBzZWNyZXQgPSBhd2FpdCBjbGllbnQuZ2V0U2VjcmV0VmFsdWUoeyBTZWNyZXRJZDogc2VjcmV0TmFtZSB9KVxuXG4gIGlmICghc2VjcmV0LlNlY3JldFN0cmluZykge1xuICAgIGNvbnNvbGUuZXJyb3IoYFNlY3JldCB2YWx1ZSBub3QgZm91bmQgZm9yICcke3NlY3JldE5hbWV9J2ApXG4gICAgdGhyb3cgbmV3IEVycm9yKClcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc2VjcmV0LlNlY3JldFN0cmluZylcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwYXJzZSBzZWNyZXQgJyR7c2VjcmV0TmFtZX0nIGFzIEpTT046YCwgZSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzU2luZ2xlVXNlcm5hbWVBbmRQYXNzd29yZChcbiAgdmFsdWU6IHVua25vd24sXG4pOiB2YWx1ZSBpcyB7IHVzZXJuYW1lOiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmcgfSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICBcInVzZXJuYW1lXCIgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUudXNlcm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICBcInBhc3N3b3JkXCIgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUucGFzc3dvcmQgPT09IFwic3RyaW5nXCJcbiAgKVxufVxuXG5mdW5jdGlvbiBoYXNDcmVkZW50aWFsc0tleVdpdGhTdHJpbmdWYWx1ZShcbiAgdmFsdWU6IHVua25vd24sXG4pOiB2YWx1ZSBpcyB7IGNyZWRlbnRpYWxzOiBzdHJpbmcgfSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICBcImNyZWRlbnRpYWxzXCIgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUuY3JlZGVudGlhbHMgPT09IFwic3RyaW5nXCJcbiAgKVxufVxuXG5mdW5jdGlvbiBpc1N0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nW10ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogV2Ugd2FudCB0byByZXR1cm4gdGhlIHJlcXVlc3RpbmcgdXNlcm5hbWUgYXMgYSBjb250ZXh0IHZhcmlhYmxlIGluXG4gKiB7QGxpbmsgQXV0aG9yaXplclJlc3VsdC5jb250ZXh0fSwgZm9yIEFQSSBHYXRld2F5IGFjY2VzcyBsb2dzIGFuZCBwYXJhbWV0ZXIgbWFwcGluZy4gU28gaWYgdGhlXG4gKiBiYXNpYyBhdXRoIGNyZWRlbnRpYWxzIHNlY3JldCBpcyBzdG9yZWQgYXMgcHJlLWVuY29kZWQgYmFzZTY0IHN0cmluZ3MsIHdlIG5lZWQgdG8gcGFyc2UgdGhlbSB0b1xuICogZ2V0IHRoZSB1c2VybmFtZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VFbmNvZGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMoXG4gIGVuY29kZWRDcmVkZW50aWFsczogc3RyaW5nLFxuKTogRXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFscyB7XG4gIGxldCBkZWNvZGVkQ3JlZGVudGlhbHM6IHN0cmluZ1xuICB0cnkge1xuICAgIGRlY29kZWRDcmVkZW50aWFscyA9IEJ1ZmZlci5mcm9tKGVuY29kZWRDcmVkZW50aWFscywgXCJiYXNlNjRcIikudG9TdHJpbmcoKVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIFwiQmFzaWMgYXV0aCBjcmVkZW50aWFscyBzZWNyZXQgY291bGQgbm90IGJlIGRlY29kZWQgYXMgYmFzZTY0OlwiLFxuICAgICAgZSxcbiAgICApXG4gICAgdGhyb3cgbmV3IEVycm9yKClcbiAgfVxuXG4gIGNvbnN0IHVzZXJuYW1lQW5kUGFzc3dvcmQgPSBkZWNvZGVkQ3JlZGVudGlhbHMuc3BsaXQoXCI6XCIsIDIpXG4gIGlmICh1c2VybmFtZUFuZFBhc3N3b3JkLmxlbmd0aCAhPT0gMikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBcIkJhc2ljIGF1dGggY3JlZGVudGlhbHMgc2VjcmV0IGNvdWxkIG5vdCBiZSBkZWNvZGVkIGFzICd1c2VybmFtZTpwYXNzd29yZCdcIixcbiAgICApXG4gICAgdGhyb3cgbmV3IEVycm9yKClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmFzaWNBdXRoSGVhZGVyOiBgQmFzaWMgJHtlbmNvZGVkQ3JlZGVudGlhbHN9YCxcbiAgICB1c2VybmFtZTogdXNlcm5hbWVBbmRQYXNzd29yZFswXSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDYWNoZSgpIHtcbiAgY2FjaGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMgPSB1bmRlZmluZWRcbn1cbiJdfQ==
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* This lambda verifies
|
|
2
|
+
* This lambda verifies access token in Bearer authorization header using Cognito.
|
|
3
3
|
*
|
|
4
4
|
* Expects the following environment variables:
|
|
5
5
|
* - USER_POOL_ID
|
|
6
6
|
* - REQUIRED_SCOPE (optional)
|
|
7
|
-
* - Set this to require that the
|
|
7
|
+
* - Set this to require that the access token payload contains the given scope
|
|
8
8
|
* - CREDENTIALS_FOR_INTERNAL_AUTHORIZATION (optional)
|
|
9
9
|
* - Secret name from which to get basic auth credentials that should be forwarded to backend
|
|
10
10
|
* integration if authentication succeeds
|
|
@@ -17,14 +17,15 @@ type AuthorizerResult = APIGatewaySimpleAuthorizerResult & {
|
|
|
17
17
|
/**
|
|
18
18
|
* Returning a context object from our authorizer allows our API Gateway to access these variables
|
|
19
19
|
* via `${context.authorizer.<property>}`.
|
|
20
|
-
* https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-
|
|
20
|
+
* https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-parameter-mapping.html
|
|
21
21
|
*/
|
|
22
22
|
context?: {
|
|
23
23
|
/**
|
|
24
24
|
* If the token is verified, we return the auth client ID from the token's claims as a context
|
|
25
|
-
* variable (named `authorizer.clientId`).
|
|
26
|
-
* API Gateway (see `
|
|
27
|
-
*
|
|
25
|
+
* variable (named `authorizer.clientId`). We use this to include the requesting client in the
|
|
26
|
+
* API Gateway access logs (see `defaultAccessLogFormat` in our `ApiGateway` construct). You can
|
|
27
|
+
* also use this when mapping parameters to the backend integration (see
|
|
28
|
+
* `AlbIntegrationProps.mapParameters` on the `ApiGateway` construct).
|
|
28
29
|
*/
|
|
29
30
|
clientId: string;
|
|
30
31
|
/**
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* This lambda verifies
|
|
2
|
+
* This lambda verifies access token in Bearer authorization header using Cognito.
|
|
3
3
|
*
|
|
4
4
|
* Expects the following environment variables:
|
|
5
5
|
* - USER_POOL_ID
|
|
6
6
|
* - REQUIRED_SCOPE (optional)
|
|
7
|
-
* - Set this to require that the
|
|
7
|
+
* - Set this to require that the access token payload contains the given scope
|
|
8
8
|
* - CREDENTIALS_FOR_INTERNAL_AUTHORIZATION (optional)
|
|
9
9
|
* - Secret name from which to get basic auth credentials that should be forwarded to backend
|
|
10
10
|
* integration if authentication succeeds
|
|
@@ -130,4 +130,4 @@ export function clearCache() {
|
|
|
130
130
|
cachedTokenVerifier = undefined;
|
|
131
131
|
cachedInternalAuthorizationHeader = undefined;
|
|
132
132
|
}
|
|
133
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0by11c2VyLXBvb2wtYXV0aG9yaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGktZ2F0ZXdheS9hdXRob3JpemVyLWxhbWJkYXMvY29nbml0by11c2VyLXBvb2wtYXV0aG9yaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQU1ILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQTJCbkQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEtBQUssRUFDMUIsS0FBeUMsRUFDZCxFQUFFO0lBQzdCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFBO0lBQy9DLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQTtJQUNoQyxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxrQ0FBa0M7SUFDbEcsUUFBUSxNQUFNLEVBQUUsQ0FBQztRQUNmLEtBQUssU0FBUztZQUNaLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUE7UUFDaEMsS0FBSyxTQUFTO1lBQ1osd0ZBQXdGO1lBQ3hGLHFGQUFxRjtZQUNyRix5RkFBeUY7WUFDekYscUVBQXFFO1lBQ3JFLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDakMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNSLE9BQU87Z0JBQ0wsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLE9BQU8sRUFBRTtvQkFDUCxRQUFRLEVBQUUsTUFBTSxDQUFD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UUFBUSxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FDckUsUUFBUSxDQUNULENBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsY0FBYyxDQUFDLFVBQWtCO0lBQzlDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxDQUFBO0lBQ2xELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFBO0lBRXBFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekIsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsVUFBVSxHQUFHLENBQUMsQ0FBQTtRQUMzRCxNQUFNLElBQUksS0FBSyxFQUFFLENBQUE7SUFDbkIsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7QUFDeEMsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQzlCLEtBQWM7SUFFZCxPQUFPLENBQ0wsT0FBTyxLQUFLLEtBQUssUUFBUTtRQUN6QixLQUFLLEtBQUssSUFBSTtRQUNkLFVBQVUsSUFBSSxLQUFLO1FBQ25CLE9BQU8sS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRO1FBQ2xDLFVBQVUsSUFBSSxLQUFLO1FBQ25CLE9BQU8sS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQ25DLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVU7SUFDeEIsbUJBQW1CLEdBQUcsU0FBUyxDQUFBO0lBQy9CLGlDQUFpQyxHQUFHLFNBQVMsQ0FBQTtBQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIGxhbWJkYSB2ZXJpZmllcyBiZWFyZXIgdG9rZW4gaW4gYXV0aG9yaXphdGlvbiBoZWFkZXIgdXNpbmcgQ29nbml0by5cbiAqXG4gKiBFeHBlY3RzIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBVU0VSX1BPT0xfSURcbiAqIC0gUkVRVUlSRURfU0NPUEUgKG9wdGlvbmFsKVxuICogICAtIFNldCB0aGlzIHRvIHJlcXVpcmUgdGhhdCB0aGUgYmVhcmVyIHRva2VuIHBheWxvYWQgY29udGFpbnMgdGhlIGdpdmVuIHNjb3BlXG4gKiAtIENSRURFTlRJQUxTX0ZPUl9JTlRFUk5BTF9BVVRIT1JJWkFUSU9OIChvcHRpb25hbClcbiAqICAgLSBTZWNyZXQgbmFtZSBmcm9tIHdoaWNoIHRvIGdldCBiYXNpYyBhdXRoIGNyZWRlbnRpYWxzIHRoYXQgc2hvdWxkIGJlIGZvcndhcmRlZCB0byBiYWNrZW5kXG4gKiAgICAgaW50ZWdyYXRpb24gaWYgYXV0aGVudGljYXRpb24gc3VjY2VlZHNcbiAqICAgLSBTZWNyZXQgdmFsdWUgc2hvdWxkIGZvbGxvdyB0aGlzIGZvcm1hdDogYHtcInVzZXJuYW1lXCI6XCI8dXNlcm5hbWU+XCIsXCJwYXNzd29yZFwiOlwiPHBhc3N3b3JkPlwifWBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFQSUdhdGV3YXlSZXF1ZXN0QXV0aG9yaXplckV2ZW50VjIsXG4gIEFQSUdhdGV3YXlTaW1wbGVBdXRob3JpemVyUmVzdWx0LFxufSBmcm9tIFwiYXdzLWxhbWJkYVwiXG5pbXBvcnQgeyBTZWNyZXRzTWFuYWdlciB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtc2VjcmV0cy1tYW5hZ2VyXCJcbmltcG9ydCB7IENvZ25pdG9Kd3RWZXJpZmllciB9IGZyb20gXCJhd3Mtand0LXZlcmlmeVwiXG5pbXBvcnQgdHlwZSB7IENvZ25pdG9BY2Nlc3NUb2tlblBheWxvYWQgfSBmcm9tIFwiYXdzLWp3dC12ZXJpZnkvand0LW1vZGVsXCJcblxudHlwZSBBdXRob3JpemVyUmVzdWx0ID0gQVBJR2F0ZXdheVNpbXBsZUF1dGhvcml6ZXJSZXN1bHQgJiB7XG4gIC8qKlxuICAgKiBSZXR1cm5pbmcgYSBjb250ZXh0IG9iamVjdCBmcm9tIG91ciBhdXRob3JpemVyIGFsbG93cyBvdXIgQVBJIEdhdGV3YXkgdG8gYWNjZXNzIHRoZXNlIHZhcmlhYmxlc1xuICAgKiB2aWEgYCR7Y29udGV4dC5hdXRob3JpemVyLjxwcm9wZXJ0eT59YC5cbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWxvZ2dpbmctdmFyaWFibGVzLmh0bWxcbiAgICovXG4gIGNvbnRleHQ/OiB7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHRva2VuIGlzIHZlcmlmaWVkLCB3ZSByZXR1cm4gdGhlIGF1dGggY2xpZW50IElEIGZyb20gdGhlIHRva2VuJ3MgY2xhaW1zIGFzIGEgY29udGV4dFxuICAgICAqIHZhcmlhYmxlIChuYW1lZCBgYXV0aG9yaXplci5jbGllbnRJZGApLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgZm9yIHBhcmFtZXRlciBtYXBwaW5nIG9uIHRoZVxuICAgICAqIEFQSSBHYXRld2F5IChzZWUgYEFsYkludGVncmF0aW9uUHJvcHMubWFwUGFyYW1ldGVyc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QpLCBpZiBmb3JcbiAgICAgKiBleGFtcGxlIHlvdSB3YW50IHRvIGZvcndhcmQgdGhpcyB0byB0aGUgYmFja2VuZCBpbnRlZ3JhdGlvbi5cbiAgICAgKi9cbiAgICBjbGllbnRJZDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogSWYgYENSRURFTlRJQUxTX0ZPUl9JTlRFUk5BTF9BVVRIT1JJWkFUSU9OYCBpcyBwcm92aWRlZCwgd2Ugd2FudCB0byBmb3J3YXJkIGJhc2ljIGF1dGhcbiAgICAgKiBjcmVkZW50aWFscyB0byBvdXIgYmFja2VuZCwgYXMgYW4gYWRkaXRpb25hbCBhdXRoZW50aWNhdGlvbiBsYXllci4gU2VlIHRoZSBkb2NzdHJpbmcgb25cbiAgICAgKiBgQ29nbml0b1VzZXJQb29sQXV0aG9yaXplclByb3BzLmJhc2ljQXV0aEZvckludGVybmFsQXV0aG9yaXphdGlvbmAgaW4gdGhlIGBBcGlHYXRld2F5YFxuICAgICAqIGNvbnN0cnVjdCBmb3IgbW9yZSBvbiB0aGlzLlxuICAgICAqL1xuICAgIGludGVybmFsQXV0aG9yaXphdGlvbkhlYWRlcj86IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gYXN5bmMgKFxuICBldmVudDogQVBJR2F0ZXdheVJlcXVlc3RBdXRob3JpemVyRXZlbnRWMixcbik6IFByb21pc2U8QXV0aG9yaXplclJlc3VsdD4gPT4ge1xuICBjb25zdCBhdXRoSGVhZGVyID0gZXZlbnQuaGVhZGVycz8uYXV0aG9yaXphdGlvblxuICBpZiAoIWF1dGhIZWFkZXIgfHwgIWF1dGhIZWFkZXIuc3RhcnRzV2l0aChcIkJlYXJlciBcIikpIHtcbiAgICByZXR1cm4geyBpc0F1dGhvcml6ZWQ6IGZhbHNlIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZlcmlmeUFjY2Vzc1Rva2VuKGF1dGhIZWFkZXIuc3Vic3RyaW5nKDcpKSAvLyBzdWJzdHJpbmcoNykgPT0gYWZ0ZXIgJ0JlYXJlciAnXG4gIHN3aXRjaCAocmVzdWx0KSB7XG4gICAgY2FzZSBcIklOVkFMSURcIjpcbiAgICAgIHJldHVybiB7IGlzQXV0aG9yaXplZDogZmFsc2UgfVxuICAgIGNhc2UgXCJFWFBJUkVEXCI6XG4gICAgICAvLyBXZSB3YW50IHRvIHJldHVybiA0MDEgVW5hdXRob3JpemVkIGZvciBleHBpcmVkIHRva2Vucywgc28gdGhlIGNsaWVudCBrbm93cyB0byByZWZyZXNoXG4gICAgICAvLyB0aGVpciB0b2tlbiB3aGVuIHJlY2VpdmluZyB0aGlzIHN0YXR1cyBjb2RlLiBBUEkgR2F0ZXdheSBhdXRob3JpemVyIGxhbWJkYXMgcmV0dXJuXG4gICAgICAvLyA0MDMgRm9yYmlkZGVuIGZvciB7aXNBdXRob3JpemVkOiBmYWxzZX0sIGJ1dCB0aGVyZSBpcyBhIHdheSB0byByZXR1cm4gNDAxOiB0aHJvd2luZyBhblxuICAgICAgLy8gZXJyb3Igd2l0aCB0aGlzIGV4YWN0IHN0cmluZy4gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzcxOTY1ODkwXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmF1dGhvcml6ZWRcIilcbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc0F1dGhvcml6ZWQ6IHRydWUsXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBjbGllbnRJZDogcmVzdWx0LmNsaWVudF9pZCxcbiAgICAgICAgICBpbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXI6IGF3YWl0IGdldEludGVybmFsQXV0aG9yaXphdGlvbkhlYWRlcigpLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiogRGVjb2RlcyBhbmQgdmVyaWZpZXMgdGhlIGdpdmVuIHRva2VuIGFnYWluc3QgQ29nbml0by4gKi9cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUFjY2Vzc1Rva2VuKFxuICB0b2tlbjogc3RyaW5nLFxuKTogUHJvbWlzZTxDb2duaXRvQWNjZXNzVG9rZW5QYXlsb2FkIHwgXCJFWFBJUkVEXCIgfCBcIklOVkFMSURcIj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHRva2VuVmVyaWZpZXIgPSBnZXRUb2tlblZlcmlmaWVyKClcbiAgICAvLyBNdXN0IGF3YWl0IGhlcmUgaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIHByb21pc2UgZGlyZWN0bHksIHNvIHRoYXQgZXJyb3JzIGNhbiBiZSBjYXVnaHQgaW5cbiAgICAvLyB0aGlzIGZ1bmN0aW9uXG4gICAgcmV0dXJuIGF3YWl0IHRva2VuVmVyaWZpZXIudmVyaWZ5KHRva2VuKVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSWYgdGhlIEpXVCBoYXMgZXhwaXJlZCwgYXdzLWp3dC12ZXJpZnkgdGhyb3dzIHRoaXMgZXJyb3I6XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3c2xhYnMvYXdzLWp3dC12ZXJpZnkvYmxvYi84ZDhmNzE0ZDcyODE5MTNlY2Q2NjAxNDdmNWMzMDMxMTQ3OTYwMWMxL3NyYy9qd3QudHMjTDE5N1xuICAgIC8vIFdlIGNhbid0IGNoZWNrIGluc3RhbmNlb2Ygb24gdGhhdCBlcnJvciBjbGFzcywgc2luY2UgaXQncyBub3QgZXhwb3J0ZWQsIHNvIHRoaXMgaXMgdGhlIG5leHRcbiAgICAvLyBiZXN0IHRoaW5nLlxuICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlPy5pbmNsdWRlcyhcIlRva2VuIGV4cGlyZWRcIikpIHtcbiAgICAgIHJldHVybiBcIkVYUElSRURcIlxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJJTlZBTElEXCJcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgVG9rZW5WZXJpZmllciA9IHtcbiAgdmVyaWZ5OiAoYWNjZXNzVG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTxDb2duaXRvQWNjZXNzVG9rZW5QYXlsb2FkPlxufVxuXG4vKipcbiAqIFdlIGNhY2hlIHRoZSB2ZXJpZmllciBpbiB0aGlzIGdsb2JhbCB2YXJpYWJsZSwgc28gdGhhdCBzdWJzZXF1ZW50IGludm9jYXRpb25zIG9mIGEgaG90IGxhbWJkYVxuICogd2lsbCByZS11c2UgdGhpcy5cbiAqL1xubGV0IGNhY2hlZFRva2VuVmVyaWZpZXI6IFRva2VuVmVyaWZpZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcblxuZnVuY3Rpb24gZ2V0VG9rZW5WZXJpZmllcigpOiBUb2tlblZlcmlmaWVyIHtcbiAgaWYgKGNhY2hlZFRva2VuVmVyaWZpZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGNhY2hlZFRva2VuVmVyaWZpZXIgPSBkZXBlbmRlbmNpZXMuY3JlYXRlVG9rZW5WZXJpZmllcigpXG4gIH1cbiAgcmV0dXJuIGNhY2hlZFRva2VuVmVyaWZpZXJcbn1cblxuLyoqIEZvciBvdmVycmlkaW5nIGRlcGVuZGVuY3kgY3JlYXRpb24gaW4gdGVzdHMuICovXG5leHBvcnQgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICBjcmVhdGVUb2tlblZlcmlmaWVyOiAoKTogVG9rZW5WZXJpZmllciA9PiB7XG4gICAgY29uc3QgdXNlclBvb2xJZCA9IHByb2Nlc3MuZW52W1wiVVNFUl9QT09MX0lEXCJdXG4gICAgaWYgKCF1c2VyUG9vbElkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiVVNFUl9QT09MX0lEIGVudiB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZFwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKClcbiAgICB9XG5cbiAgICByZXR1cm4gQ29nbml0b0p3dFZlcmlmaWVyLmNyZWF0ZSh7XG4gICAgICB1c2VyUG9vbElkLFxuICAgICAgdG9rZW5Vc2U6IFwiYWNjZXNzXCIsXG4gICAgICBjbGllbnRJZDogbnVsbCxcbiAgICAgIHNjb3BlOiBwcm9jZXNzLmVudi5SRVFVSVJFRF9TQ09QRSB8fCB1bmRlZmluZWQsIC8vIGB8fCB1bmRlZmluZWRgIHRvIGRpc2NhcmQgZW1wdHkgc3RyaW5nXG4gICAgfSlcbiAgfSxcbiAgY3JlYXRlU2VjcmV0c01hbmFnZXI6ICgpID0+IG5ldyBTZWNyZXRzTWFuYWdlcigpLFxufVxuXG4vKiogQ2FjaGUgdGhpcyB2YWx1ZSwgc28gdGhhdCBzdWJzZXF1ZW50IGxhbWJkYSBpbnZvY2F0aW9ucyBkb24ndCBoYXZlIHRvIHJlZmV0Y2guICovXG5sZXQgY2FjaGVkSW50ZXJuYWxBdXRob3JpemF0aW9uSGVhZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcblxuYXN5bmMgZnVuY3Rpb24gZ2V0SW50ZXJuYWxBdXRob3JpemF0aW9uSGVhZGVyKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChjYWNoZWRJbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHNlY3JldE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9XG4gICAgICBwcm9jZXNzLmVudltcIkNSRURFTlRJQUxTX0ZPUl9JTlRFUk5BTF9BVVRIT1JJWkFUSU9OXCJdXG4gICAgaWYgKCFzZWNyZXROYW1lKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY2FjaGVkSW50ZXJuYWxBdXRob3JpemF0aW9uSGVhZGVyID1cbiAgICAgIGF3YWl0IGdldFNlY3JldEFzQmFzaWNBdXRoSGVhZGVyKHNlY3JldE5hbWUpXG4gIH1cblxuICByZXR1cm4gY2FjaGVkSW50ZXJuYWxBdXRob3JpemF0aW9uSGVhZGVyXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNlY3JldEFzQmFzaWNBdXRoSGVhZGVyKHNlY3JldE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgZ2V0U2VjcmV0VmFsdWUoc2VjcmV0TmFtZSlcbiAgaWYgKCFzZWNyZXRIYXNFeHBlY3RlZEZvcm1hdChjcmVkZW50aWFscykpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYEJhc2ljIGF1dGggY3JlZGVudGlhbHMgc2VjcmV0IGRpZCBub3QgZm9sbG93IGV4cGVjdGVkIGZvcm1hdCAoc2VjcmV0IG5hbWU6ICcke3NlY3JldE5hbWV9JylgLFxuICAgIClcbiAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICBcIkJhc2ljIFwiICtcbiAgICBCdWZmZXIuZnJvbShgJHtjcmVkZW50aWFscy51c2VybmFtZX06JHtjcmVkZW50aWFscy5wYXNzd29yZH1gKS50b1N0cmluZyhcbiAgICAgIFwiYmFzZTY0XCIsXG4gICAgKVxuICApXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNlY3JldFZhbHVlKHNlY3JldE5hbWU6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBjbGllbnQgPSBkZXBlbmRlbmNpZXMuY3JlYXRlU2VjcmV0c01hbmFnZXIoKVxuICBjb25zdCBzZWNyZXQgPSBhd2FpdCBjbGllbnQuZ2V0U2VjcmV0VmFsdWUoeyBTZWNyZXRJZDogc2VjcmV0TmFtZSB9KVxuXG4gIGlmICghc2VjcmV0LlNlY3JldFN0cmluZykge1xuICAgIGNvbnNvbGUuZXJyb3IoYFNlY3JldCB2YWx1ZSBub3QgZm91bmQgZm9yICcke3NlY3JldE5hbWV9J2ApXG4gICAgdGhyb3cgbmV3IEVycm9yKClcbiAgfVxuXG4gIHJldHVybiBKU09OLnBhcnNlKHNlY3JldC5TZWNyZXRTdHJpbmcpXG59XG5cbmZ1bmN0aW9uIHNlY3JldEhhc0V4cGVjdGVkRm9ybWF0KFxuICB2YWx1ZTogdW5rbm93bixcbik6IHZhbHVlIGlzIHsgdXNlcm5hbWU6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIFwidXNlcm5hbWVcIiBpbiB2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZS51c2VybmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIFwicGFzc3dvcmRcIiBpbiB2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZS5wYXNzd29yZCA9PT0gXCJzdHJpbmdcIlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNhY2hlKCkge1xuICBjYWNoZWRUb2tlblZlcmlmaWVyID0gdW5kZWZpbmVkXG4gIGNhY2hlZEludGVybmFsQXV0aG9yaXphdGlvbkhlYWRlciA9IHVuZGVmaW5lZFxufVxuIl19
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0by11c2VyLXBvb2wtYXV0aG9yaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGktZ2F0ZXdheS9hdXRob3JpemVyLWxhbWJkYXMvY29nbml0by11c2VyLXBvb2wtYXV0aG9yaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQU1ILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQTRCbkQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEtBQUssRUFDMUIsS0FBeUMsRUFDZCxFQUFFO0lBQzdCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFBO0lBQy9DLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQTtJQUNoQyxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxrQ0FBa0M7SUFDbEcsUUFBUSxNQUFNLEVBQUUsQ0FBQztRQUNmLEtBQUssU0FBUztZQUNaLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUE7UUFDaEMsS0FBSyxTQUFTO1lBQ1osd0ZBQXdGO1lBQ3hGLHFGQUFxRjtZQUNyRix5RkFBeUY7WUFDekYscUVBQXFFO1lBQ3JFLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDakMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNSLE9BQU87Z0JBQ0wsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLE9BQU8sRUFBRTtvQkFDUCxRQUFRLEVBQUUsTUFBTSxDQUFD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UUFBUSxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FDckUsUUFBUSxDQUNULENBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRCxLQUFLLFVBQVUsY0FBYyxDQUFDLFVBQWtCO0lBQzlDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxDQUFBO0lBQ2xELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFBO0lBRXBFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekIsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsVUFBVSxHQUFHLENBQUMsQ0FBQTtRQUMzRCxNQUFNLElBQUksS0FBSyxFQUFFLENBQUE7SUFDbkIsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7QUFDeEMsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQzlCLEtBQWM7SUFFZCxPQUFPLENBQ0wsT0FBTyxLQUFLLEtBQUssUUFBUTtRQUN6QixLQUFLLEtBQUssSUFBSTtRQUNkLFVBQVUsSUFBSSxLQUFLO1FBQ25CLE9BQU8sS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRO1FBQ2xDLFVBQVUsSUFBSSxLQUFLO1FBQ25CLE9BQU8sS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQ25DLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVU7SUFDeEIsbUJBQW1CLEdBQUcsU0FBUyxDQUFBO0lBQy9CLGlDQUFpQyxHQUFHLFNBQVMsQ0FBQTtBQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIGxhbWJkYSB2ZXJpZmllcyBhY2Nlc3MgdG9rZW4gaW4gQmVhcmVyIGF1dGhvcml6YXRpb24gaGVhZGVyIHVzaW5nIENvZ25pdG8uXG4gKlxuICogRXhwZWN0cyB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIC0gVVNFUl9QT09MX0lEXG4gKiAtIFJFUVVJUkVEX1NDT1BFIChvcHRpb25hbClcbiAqICAgLSBTZXQgdGhpcyB0byByZXF1aXJlIHRoYXQgdGhlIGFjY2VzcyB0b2tlbiBwYXlsb2FkIGNvbnRhaW5zIHRoZSBnaXZlbiBzY29wZVxuICogLSBDUkVERU5USUFMU19GT1JfSU5URVJOQUxfQVVUSE9SSVpBVElPTiAob3B0aW9uYWwpXG4gKiAgIC0gU2VjcmV0IG5hbWUgZnJvbSB3aGljaCB0byBnZXQgYmFzaWMgYXV0aCBjcmVkZW50aWFscyB0aGF0IHNob3VsZCBiZSBmb3J3YXJkZWQgdG8gYmFja2VuZFxuICogICAgIGludGVncmF0aW9uIGlmIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRzXG4gKiAgIC0gU2VjcmV0IHZhbHVlIHNob3VsZCBmb2xsb3cgdGhpcyBmb3JtYXQ6IGB7XCJ1c2VybmFtZVwiOlwiPHVzZXJuYW1lPlwiLFwicGFzc3dvcmRcIjpcIjxwYXNzd29yZD5cIn1gXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBUElHYXRld2F5UmVxdWVzdEF1dGhvcml6ZXJFdmVudFYyLFxuICBBUElHYXRld2F5U2ltcGxlQXV0aG9yaXplclJlc3VsdCxcbn0gZnJvbSBcImF3cy1sYW1iZGFcIlxuaW1wb3J0IHsgU2VjcmV0c01hbmFnZXIgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlclwiXG5pbXBvcnQgeyBDb2duaXRvSnd0VmVyaWZpZXIgfSBmcm9tIFwiYXdzLWp3dC12ZXJpZnlcIlxuaW1wb3J0IHR5cGUgeyBDb2duaXRvQWNjZXNzVG9rZW5QYXlsb2FkIH0gZnJvbSBcImF3cy1qd3QtdmVyaWZ5L2p3dC1tb2RlbFwiXG5cbnR5cGUgQXV0aG9yaXplclJlc3VsdCA9IEFQSUdhdGV3YXlTaW1wbGVBdXRob3JpemVyUmVzdWx0ICYge1xuICAvKipcbiAgICogUmV0dXJuaW5nIGEgY29udGV4dCBvYmplY3QgZnJvbSBvdXIgYXV0aG9yaXplciBhbGxvd3Mgb3VyIEFQSSBHYXRld2F5IHRvIGFjY2VzcyB0aGVzZSB2YXJpYWJsZXNcbiAgICogdmlhIGAke2NvbnRleHQuYXV0aG9yaXplci48cHJvcGVydHk+fWAuXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1wYXJhbWV0ZXItbWFwcGluZy5odG1sXG4gICAqL1xuICBjb250ZXh0Pzoge1xuICAgIC8qKlxuICAgICAqIElmIHRoZSB0b2tlbiBpcyB2ZXJpZmllZCwgd2UgcmV0dXJuIHRoZSBhdXRoIGNsaWVudCBJRCBmcm9tIHRoZSB0b2tlbidzIGNsYWltcyBhcyBhIGNvbnRleHRcbiAgICAgKiB2YXJpYWJsZSAobmFtZWQgYGF1dGhvcml6ZXIuY2xpZW50SWRgKS4gV2UgdXNlIHRoaXMgdG8gaW5jbHVkZSB0aGUgcmVxdWVzdGluZyBjbGllbnQgaW4gdGhlXG4gICAgICogQVBJIEdhdGV3YXkgYWNjZXNzIGxvZ3MgKHNlZSBgZGVmYXVsdEFjY2Vzc0xvZ0Zvcm1hdGAgaW4gb3VyIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QpLiBZb3UgY2FuXG4gICAgICogYWxzbyB1c2UgdGhpcyB3aGVuIG1hcHBpbmcgcGFyYW1ldGVycyB0byB0aGUgYmFja2VuZCBpbnRlZ3JhdGlvbiAoc2VlXG4gICAgICogYEFsYkludGVncmF0aW9uUHJvcHMubWFwUGFyYW1ldGVyc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QpLlxuICAgICAqL1xuICAgIGNsaWVudElkOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBJZiBgQ1JFREVOVElBTFNfRk9SX0lOVEVSTkFMX0FVVEhPUklaQVRJT05gIGlzIHByb3ZpZGVkLCB3ZSB3YW50IHRvIGZvcndhcmQgYmFzaWMgYXV0aFxuICAgICAqIGNyZWRlbnRpYWxzIHRvIG91ciBiYWNrZW5kLCBhcyBhbiBhZGRpdGlvbmFsIGF1dGhlbnRpY2F0aW9uIGxheWVyLiBTZWUgdGhlIGRvY3N0cmluZyBvblxuICAgICAqIGBDb2duaXRvVXNlclBvb2xBdXRob3JpemVyUHJvcHMuYmFzaWNBdXRoRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uYCBpbiB0aGUgYEFwaUdhdGV3YXlgXG4gICAgICogY29uc3RydWN0IGZvciBtb3JlIG9uIHRoaXMuXG4gICAgICovXG4gICAgaW50ZXJuYWxBdXRob3JpemF0aW9uSGVhZGVyPzogc3RyaW5nXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoXG4gIGV2ZW50OiBBUElHYXRld2F5UmVxdWVzdEF1dGhvcml6ZXJFdmVudFYyLFxuKTogUHJvbWlzZTxBdXRob3JpemVyUmVzdWx0PiA9PiB7XG4gIGNvbnN0IGF1dGhIZWFkZXIgPSBldmVudC5oZWFkZXJzPy5hdXRob3JpemF0aW9uXG4gIGlmICghYXV0aEhlYWRlciB8fCAhYXV0aEhlYWRlci5zdGFydHNXaXRoKFwiQmVhcmVyIFwiKSkge1xuICAgIHJldHVybiB7IGlzQXV0aG9yaXplZDogZmFsc2UgfVxuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdmVyaWZ5QWNjZXNzVG9rZW4oYXV0aEhlYWRlci5zdWJzdHJpbmcoNykpIC8vIHN1YnN0cmluZyg3KSA9PSBhZnRlciAnQmVhcmVyICdcbiAgc3dpdGNoIChyZXN1bHQpIHtcbiAgICBjYXNlIFwiSU5WQUxJRFwiOlxuICAgICAgcmV0dXJuIHsgaXNBdXRob3JpemVkOiBmYWxzZSB9XG4gICAgY2FzZSBcIkVYUElSRURcIjpcbiAgICAgIC8vIFdlIHdhbnQgdG8gcmV0dXJuIDQwMSBVbmF1dGhvcml6ZWQgZm9yIGV4cGlyZWQgdG9rZW5zLCBzbyB0aGUgY2xpZW50IGtub3dzIHRvIHJlZnJlc2hcbiAgICAgIC8vIHRoZWlyIHRva2VuIHdoZW4gcmVjZWl2aW5nIHRoaXMgc3RhdHVzIGNvZGUuIEFQSSBHYXRld2F5IGF1dGhvcml6ZXIgbGFtYmRhcyByZXR1cm5cbiAgICAgIC8vIDQwMyBGb3JiaWRkZW4gZm9yIHtpc0F1dGhvcml6ZWQ6IGZhbHNlfSwgYnV0IHRoZXJlIGlzIGEgd2F5IHRvIHJldHVybiA0MDE6IHRocm93aW5nIGFuXG4gICAgICAvLyBlcnJvciB3aXRoIHRoaXMgZXhhY3Qgc3RyaW5nLiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNzE5NjU4OTBcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYXV0aG9yaXplZFwiKVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzQXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGNsaWVudElkOiByZXN1bHQuY2xpZW50X2lkLFxuICAgICAgICAgIGludGVybmFsQXV0aG9yaXphdGlvbkhlYWRlcjogYXdhaXQgZ2V0SW50ZXJuYWxBdXRob3JpemF0aW9uSGVhZGVyKCksXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKiBEZWNvZGVzIGFuZCB2ZXJpZmllcyB0aGUgZ2l2ZW4gdG9rZW4gYWdhaW5zdCBDb2duaXRvLiAqL1xuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5QWNjZXNzVG9rZW4oXG4gIHRva2VuOiBzdHJpbmcsXG4pOiBQcm9taXNlPENvZ25pdG9BY2Nlc3NUb2tlblBheWxvYWQgfCBcIkVYUElSRURcIiB8IFwiSU5WQUxJRFwiPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdG9rZW5WZXJpZmllciA9IGdldFRva2VuVmVyaWZpZXIoKVxuICAgIC8vIE11c3QgYXdhaXQgaGVyZSBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgcHJvbWlzZSBkaXJlY3RseSwgc28gdGhhdCBlcnJvcnMgY2FuIGJlIGNhdWdodCBpblxuICAgIC8vIHRoaXMgZnVuY3Rpb25cbiAgICByZXR1cm4gYXdhaXQgdG9rZW5WZXJpZmllci52ZXJpZnkodG9rZW4pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJZiB0aGUgSldUIGhhcyBleHBpcmVkLCBhd3Mtand0LXZlcmlmeSB0aHJvd3MgdGhpcyBlcnJvcjpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzbGFicy9hd3Mtand0LXZlcmlmeS9ibG9iLzhkOGY3MTRkNzI4MTkxM2VjZDY2MDE0N2Y1YzMwMzExNDc5NjAxYzEvc3JjL2p3dC50cyNMMTk3XG4gICAgLy8gV2UgY2FuJ3QgY2hlY2sgaW5zdGFuY2VvZiBvbiB0aGF0IGVycm9yIGNsYXNzLCBzaW5jZSBpdCdzIG5vdCBleHBvcnRlZCwgc28gdGhpcyBpcyB0aGUgbmV4dFxuICAgIC8vIGJlc3QgdGhpbmcuXG4gICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2U/LmluY2x1ZGVzKFwiVG9rZW4gZXhwaXJlZFwiKSkge1xuICAgICAgcmV0dXJuIFwiRVhQSVJFRFwiXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIklOVkFMSURcIlxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBUb2tlblZlcmlmaWVyID0ge1xuICB2ZXJpZnk6IChhY2Nlc3NUb2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPENvZ25pdG9BY2Nlc3NUb2tlblBheWxvYWQ+XG59XG5cbi8qKlxuICogV2UgY2FjaGUgdGhlIHZlcmlmaWVyIGluIHRoaXMgZ2xvYmFsIHZhcmlhYmxlLCBzbyB0aGF0IHN1YnNlcXVlbnQgaW52b2NhdGlvbnMgb2YgYSBob3QgbGFtYmRhXG4gKiB3aWxsIHJlLXVzZSB0aGlzLlxuICovXG5sZXQgY2FjaGVkVG9rZW5WZXJpZmllcjogVG9rZW5WZXJpZmllciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG5mdW5jdGlvbiBnZXRUb2tlblZlcmlmaWVyKCk6IFRva2VuVmVyaWZpZXIge1xuICBpZiAoY2FjaGVkVG9rZW5WZXJpZmllciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2FjaGVkVG9rZW5WZXJpZmllciA9IGRlcGVuZGVuY2llcy5jcmVhdGVUb2tlblZlcmlmaWVyKClcbiAgfVxuICByZXR1cm4gY2FjaGVkVG9rZW5WZXJpZmllclxufVxuXG4vKiogRm9yIG92ZXJyaWRpbmcgZGVwZW5kZW5jeSBjcmVhdGlvbiBpbiB0ZXN0cy4gKi9cbmV4cG9ydCBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gIGNyZWF0ZVRva2VuVmVyaWZpZXI6ICgpOiBUb2tlblZlcmlmaWVyID0+IHtcbiAgICBjb25zdCB1c2VyUG9vbElkID0gcHJvY2Vzcy5lbnZbXCJVU0VSX1BPT0xfSURcIl1cbiAgICBpZiAoIXVzZXJQb29sSWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJVU0VSX1BPT0xfSUQgZW52IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICAgIH1cblxuICAgIHJldHVybiBDb2duaXRvSnd0VmVyaWZpZXIuY3JlYXRlKHtcbiAgICAgIHVzZXJQb29sSWQsXG4gICAgICB0b2tlblVzZTogXCJhY2Nlc3NcIixcbiAgICAgIGNsaWVudElkOiBudWxsLFxuICAgICAgc2NvcGU6IHByb2Nlc3MuZW52LlJFUVVJUkVEX1NDT1BFIHx8IHVuZGVmaW5lZCwgLy8gYHx8IHVuZGVmaW5lZGAgdG8gZGlzY2FyZCBlbXB0eSBzdHJpbmdcbiAgICB9KVxuICB9LFxuICBjcmVhdGVTZWNyZXRzTWFuYWdlcjogKCkgPT4gbmV3IFNlY3JldHNNYW5hZ2VyKCksXG59XG5cbi8qKiBDYWNoZSB0aGlzIHZhbHVlLCBzbyB0aGF0IHN1YnNlcXVlbnQgbGFtYmRhIGludm9jYXRpb25zIGRvbid0IGhhdmUgdG8gcmVmZXRjaC4gKi9cbmxldCBjYWNoZWRJbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG5hc3luYyBmdW5jdGlvbiBnZXRJbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXIoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKGNhY2hlZEludGVybmFsQXV0aG9yaXphdGlvbkhlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgc2VjcmV0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgIHByb2Nlc3MuZW52W1wiQ1JFREVOVElBTFNfRk9SX0lOVEVSTkFMX0FVVEhPUklaQVRJT05cIl1cbiAgICBpZiAoIXNlY3JldE5hbWUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjYWNoZWRJbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXIgPVxuICAgICAgYXdhaXQgZ2V0U2VjcmV0QXNCYXNpY0F1dGhIZWFkZXIoc2VjcmV0TmFtZSlcbiAgfVxuXG4gIHJldHVybiBjYWNoZWRJbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXJcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0U2VjcmV0QXNCYXNpY0F1dGhIZWFkZXIoc2VjcmV0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBnZXRTZWNyZXRWYWx1ZShzZWNyZXROYW1lKVxuICBpZiAoIXNlY3JldEhhc0V4cGVjdGVkRm9ybWF0KGNyZWRlbnRpYWxzKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgQmFzaWMgYXV0aCBjcmVkZW50aWFscyBzZWNyZXQgZGlkIG5vdCBmb2xsb3cgZXhwZWN0ZWQgZm9ybWF0IChzZWNyZXQgbmFtZTogJyR7c2VjcmV0TmFtZX0nKWAsXG4gICAgKVxuICAgIHRocm93IG5ldyBFcnJvcigpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIFwiQmFzaWMgXCIgK1xuICAgIEJ1ZmZlci5mcm9tKGAke2NyZWRlbnRpYWxzLnVzZXJuYW1lfToke2NyZWRlbnRpYWxzLnBhc3N3b3JkfWApLnRvU3RyaW5nKFxuICAgICAgXCJiYXNlNjRcIixcbiAgICApXG4gIClcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0U2VjcmV0VmFsdWUoc2VjcmV0TmFtZTogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGNsaWVudCA9IGRlcGVuZGVuY2llcy5jcmVhdGVTZWNyZXRzTWFuYWdlcigpXG4gIGNvbnN0IHNlY3JldCA9IGF3YWl0IGNsaWVudC5nZXRTZWNyZXRWYWx1ZSh7IFNlY3JldElkOiBzZWNyZXROYW1lIH0pXG5cbiAgaWYgKCFzZWNyZXQuU2VjcmV0U3RyaW5nKSB7XG4gICAgY29uc29sZS5lcnJvcihgU2VjcmV0IHZhbHVlIG5vdCBmb3VuZCBmb3IgJyR7c2VjcmV0TmFtZX0nYClcbiAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICB9XG5cbiAgcmV0dXJuIEpTT04ucGFyc2Uoc2VjcmV0LlNlY3JldFN0cmluZylcbn1cblxuZnVuY3Rpb24gc2VjcmV0SGFzRXhwZWN0ZWRGb3JtYXQoXG4gIHZhbHVlOiB1bmtub3duLFxuKTogdmFsdWUgaXMgeyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH0ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgXCJ1c2VybmFtZVwiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLnVzZXJuYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgXCJwYXNzd29yZFwiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLnBhc3N3b3JkID09PSBcInN0cmluZ1wiXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQ2FjaGUoKSB7XG4gIGNhY2hlZFRva2VuVmVyaWZpZXIgPSB1bmRlZmluZWRcbiAgY2FjaGVkSW50ZXJuYWxBdXRob3JpemF0aW9uSGVhZGVyID0gdW5kZWZpbmVkXG59XG4iXX0=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* This lambda verifies credentials:
|
|
3
|
-
* - Against Cognito user pool if request uses Bearer
|
|
3
|
+
* - Against Cognito user pool if request uses access token in Bearer authorization header
|
|
4
4
|
* - Against credentials saved in Secret Manager if request uses basic auth (and if secret exists)
|
|
5
5
|
*
|
|
6
6
|
* Expects the following environment variables
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* A different format with an array of pre-encoded credentials is also supported - see docs for
|
|
11
11
|
* the `CognitoUserPoolOrBasicAuthAuthorizerProps` on the `ApiGateway` construct.
|
|
12
12
|
* - REQUIRED_SCOPE (optional)
|
|
13
|
-
* - Set this to require that the
|
|
13
|
+
* - Set this to require that the access token payload contains the given scope
|
|
14
14
|
*/
|
|
15
15
|
import type { APIGatewayRequestAuthorizerEventV2, APIGatewaySimpleAuthorizerResult } from "aws-lambda";
|
|
16
16
|
import { SecretsManager } from "@aws-sdk/client-secrets-manager";
|
|
@@ -19,18 +19,27 @@ type AuthorizerResult = APIGatewaySimpleAuthorizerResult & {
|
|
|
19
19
|
/**
|
|
20
20
|
* Returning a context object from our authorizer allows our API Gateway to access these variables
|
|
21
21
|
* via `${context.authorizer.<property>}`.
|
|
22
|
-
* https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-
|
|
22
|
+
* https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-parameter-mapping.html
|
|
23
23
|
*/
|
|
24
24
|
context?: {
|
|
25
25
|
/**
|
|
26
|
-
* If the token
|
|
27
|
-
* variable (named `authorizer.clientId`).
|
|
28
|
-
*
|
|
29
|
-
*
|
|
26
|
+
* If the request used an access token, and the token was verified, we return the auth client ID
|
|
27
|
+
* from the token's claims in this context variable (named `authorizer.clientId`). We use this
|
|
28
|
+
* to include the requesting client in the API Gateway access logs (see `defaultAccessLogFormat`
|
|
29
|
+
* in our `ApiGateway` construct). You can also use this when mapping parameters to the backend
|
|
30
|
+
* integration (see `AlbIntegrationProps.mapParameters` on the `ApiGateway` construct).
|
|
30
31
|
*/
|
|
31
32
|
clientId?: string;
|
|
32
33
|
/**
|
|
33
|
-
*
|
|
34
|
+
* If the request used Basic Auth, and the credentials were verified, we return the username
|
|
35
|
+
* that was used in this context variable (named `authorizer.username`). We use this to include
|
|
36
|
+
* the requesting user in the API Gateway access logs (see `defaultAccessLogFormat` in our
|
|
37
|
+
* `ApiGateway` construct). You can also use this when mapping parameters to the backend
|
|
38
|
+
* integration (see `AlbIntegrationProps.mapParameters` on the `ApiGateway` construct).
|
|
39
|
+
*/
|
|
40
|
+
username?: string;
|
|
41
|
+
/**
|
|
42
|
+
* See `CognitoUserPoolAuthorizerProps.basicAuthForInternalAuthorization` on the `ApiGateway`
|
|
34
43
|
* construct (we provide the same context variable here as in the Cognito User Pool authorizer,
|
|
35
44
|
* using the credentials from BASIC_AUTH_CREDENTIALS_SECRET_NAME).
|
|
36
45
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* This lambda verifies credentials:
|
|
3
|
-
* - Against Cognito user pool if request uses Bearer
|
|
3
|
+
* - Against Cognito user pool if request uses access token in Bearer authorization header
|
|
4
4
|
* - Against credentials saved in Secret Manager if request uses basic auth (and if secret exists)
|
|
5
5
|
*
|
|
6
6
|
* Expects the following environment variables
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* A different format with an array of pre-encoded credentials is also supported - see docs for
|
|
11
11
|
* the `CognitoUserPoolOrBasicAuthAuthorizerProps` on the `ApiGateway` construct.
|
|
12
12
|
* - REQUIRED_SCOPE (optional)
|
|
13
|
-
* - Set this to require that the
|
|
13
|
+
* - Set this to require that the access token payload contains the given scope
|
|
14
14
|
*/
|
|
15
15
|
import { SecretsManager } from "@aws-sdk/client-secrets-manager";
|
|
16
16
|
import { CognitoJwtVerifier } from "aws-jwt-verify";
|
|
@@ -19,7 +19,7 @@ export const handler = async (event) => {
|
|
|
19
19
|
if (!authHeader) {
|
|
20
20
|
return { isAuthorized: false };
|
|
21
21
|
}
|
|
22
|
-
const
|
|
22
|
+
const expectedBasicAuthCredentials = await getExpectedBasicAuthCredentials();
|
|
23
23
|
if (authHeader.startsWith("Bearer ")) {
|
|
24
24
|
const result = await verifyAccessToken(authHeader.substring(7)); // substring(7) == after 'Bearer '
|
|
25
25
|
switch (result) {
|
|
@@ -36,19 +36,20 @@ export const handler = async (event) => {
|
|
|
36
36
|
isAuthorized: true,
|
|
37
37
|
context: {
|
|
38
38
|
clientId: result.client_id,
|
|
39
|
-
internalAuthorizationHeader:
|
|
39
|
+
internalAuthorizationHeader: expectedBasicAuthCredentials?.[0]?.basicAuthHeader,
|
|
40
40
|
},
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
else if (authHeader.startsWith("Basic ") &&
|
|
45
|
-
|
|
46
|
-
for (const
|
|
47
|
-
if (authHeader ===
|
|
45
|
+
expectedBasicAuthCredentials !== undefined) {
|
|
46
|
+
for (const expected of expectedBasicAuthCredentials) {
|
|
47
|
+
if (authHeader === expected.basicAuthHeader) {
|
|
48
48
|
return {
|
|
49
49
|
isAuthorized: true,
|
|
50
50
|
context: {
|
|
51
|
-
|
|
51
|
+
username: expected.username,
|
|
52
|
+
internalAuthorizationHeader: expected.basicAuthHeader,
|
|
52
53
|
},
|
|
53
54
|
};
|
|
54
55
|
}
|
|
@@ -109,27 +110,27 @@ export const dependencies = {
|
|
|
109
110
|
createSecretsManager: () => new SecretsManager(),
|
|
110
111
|
};
|
|
111
112
|
/** Cache this value, so that subsequent lambda invocations don't have to refetch. */
|
|
112
|
-
let
|
|
113
|
+
let cachedBasicAuthCredentials = undefined;
|
|
113
114
|
/**
|
|
114
|
-
* Returns an array
|
|
115
|
-
*
|
|
115
|
+
* Returns an array, to support credential secrets with multiple values (see
|
|
116
|
+
* `BasicAuthAuthorizerProps` on the `ApiGateway` construct for more on this).
|
|
116
117
|
*/
|
|
117
|
-
async function
|
|
118
|
-
if (
|
|
118
|
+
async function getExpectedBasicAuthCredentials() {
|
|
119
|
+
if (cachedBasicAuthCredentials === undefined) {
|
|
119
120
|
const secretName = process.env["BASIC_AUTH_CREDENTIALS_SECRET_NAME"];
|
|
120
121
|
if (!secretName) {
|
|
121
122
|
return undefined;
|
|
122
123
|
}
|
|
123
|
-
|
|
124
|
+
cachedBasicAuthCredentials = await getBasicAuthCredentialsSecret(secretName);
|
|
124
125
|
}
|
|
125
|
-
return
|
|
126
|
+
return cachedBasicAuthCredentials;
|
|
126
127
|
}
|
|
127
|
-
async function
|
|
128
|
+
async function getBasicAuthCredentialsSecret(secretName) {
|
|
128
129
|
const secret = await getSecretValue(secretName);
|
|
129
130
|
if (isSingleUsernameAndPassword(secret)) {
|
|
130
131
|
const header = "Basic " +
|
|
131
132
|
Buffer.from(`${secret.username}:${secret.password}`).toString("base64");
|
|
132
|
-
return [header];
|
|
133
|
+
return [{ basicAuthHeader: header, username: secret.username }];
|
|
133
134
|
}
|
|
134
135
|
// See `BasicAuthAuthorizerProps` on the `ApiGateway` construct for an explanation of the formats
|
|
135
136
|
// we parse here
|
|
@@ -143,7 +144,7 @@ async function getSecretAsBasicAuthHeaders(secretName) {
|
|
|
143
144
|
throw new Error();
|
|
144
145
|
}
|
|
145
146
|
if (isStringArray(credentialsArray)) {
|
|
146
|
-
return credentialsArray.map(
|
|
147
|
+
return credentialsArray.map(parseEncodedBasicAuthCredentials);
|
|
147
148
|
}
|
|
148
149
|
}
|
|
149
150
|
console.error(`Basic auth credentials secret did not follow any expected format (secret name: '${secretName}')`);
|
|
@@ -160,7 +161,7 @@ async function getSecretValue(secretName) {
|
|
|
160
161
|
return JSON.parse(secret.SecretString);
|
|
161
162
|
}
|
|
162
163
|
catch (e) {
|
|
163
|
-
console.error(`Failed to parse secret '${secretName}' as JSON
|
|
164
|
+
console.error(`Failed to parse secret '${secretName}' as JSON:`, e);
|
|
164
165
|
throw new Error();
|
|
165
166
|
}
|
|
166
167
|
}
|
|
@@ -189,8 +190,33 @@ function isStringArray(value) {
|
|
|
189
190
|
}
|
|
190
191
|
return true;
|
|
191
192
|
}
|
|
193
|
+
/**
|
|
194
|
+
* We want to return the requesting username as a context variable in
|
|
195
|
+
* {@link AuthorizerResult.context}, for API Gateway access logs and parameter mapping. So if the
|
|
196
|
+
* basic auth credentials secret is stored as pre-encoded base64 strings, we need to parse them to
|
|
197
|
+
* get the username.
|
|
198
|
+
*/
|
|
199
|
+
function parseEncodedBasicAuthCredentials(encodedCredentials) {
|
|
200
|
+
let decodedCredentials;
|
|
201
|
+
try {
|
|
202
|
+
decodedCredentials = Buffer.from(encodedCredentials, "base64").toString();
|
|
203
|
+
}
|
|
204
|
+
catch (e) {
|
|
205
|
+
console.error("Basic auth credentials secret could not be decoded as base64:", e);
|
|
206
|
+
throw new Error();
|
|
207
|
+
}
|
|
208
|
+
const usernameAndPassword = decodedCredentials.split(":", 2);
|
|
209
|
+
if (usernameAndPassword.length !== 2) {
|
|
210
|
+
console.error("Basic auth credentials secret could not be decoded as 'username:password'");
|
|
211
|
+
throw new Error();
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
basicAuthHeader: `Basic ${encodedCredentials}`,
|
|
215
|
+
username: usernameAndPassword[0],
|
|
216
|
+
};
|
|
217
|
+
}
|
|
192
218
|
export function clearCache() {
|
|
193
219
|
cachedTokenVerifier = undefined;
|
|
194
|
-
|
|
220
|
+
cachedBasicAuthCredentials = undefined;
|
|
195
221
|
}
|
|
196
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0by11c2VyLXBvb2wtb3ItYmFzaWMtYXV0aC1hdXRob3JpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS1nYXRld2F5L2F1dGhvcml6ZXItbGFtYmRhcy9jb2duaXRvLXVzZXItcG9vbC1vci1iYXNpYy1hdXRoLWF1dGhvcml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQU1ILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQTBCbkQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEtBQUssRUFDMUIsS0FBeUMsRUFDZCxFQUFFO0lBQzdCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFBO0lBQy9DLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFBO0lBQ2hDLENBQUM7SUFFRCxNQUFNLHdCQUF3QixHQUFHLE1BQU0sMkJBQTJCLEVBQUUsQ0FBQTtJQUVwRSxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxNQUFNLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLGtDQUFrQztRQUNsRyxRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxTQUFTO2dCQUNaLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUE7WUFDaEMsS0FBSyxTQUFTO2dCQUNaLHdGQUF3RjtnQkFDeEYscUZBQXFGO2dCQUNyRix5RkFBeUY7Z0JBQ3pGLHFFQUFxRTtnQkFDckUsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUNqQztn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SUFFZCxPQUFPLENBQ0wsT0FBTyxLQUFLLEtBQUssUUFBUTtRQUN6QixLQUFLLEtBQUssSUFBSTtRQUNkLGFBQWEsSUFBSSxLQUFLO1FBQ3RCLE9BQU8sS0FBSyxDQUFDLFdBQVcsS0FBSyxRQUFRLENBQ3RDLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVELEtBQUssTUFBTSxPQUFPLElBQUksS0FBSyxFQUFFLENBQUM7UUFDNUIsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxPQUFPLEtBQUssQ0FBQTtRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVU7SUFDeEIsbUJBQW1CLEdBQUcsU0FBUyxDQUFBO0lBQy9CLHNCQUFzQixHQUFHLFNBQVMsQ0FBQTtBQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIGxhbWJkYSB2ZXJpZmllcyBjcmVkZW50aWFsczpcbiAqIC0gQWdhaW5zdCBDb2duaXRvIHVzZXIgcG9vbCBpZiByZXF1ZXN0IHVzZXMgQmVhcmVyIHRva2VuXG4gKiAtIEFnYWluc3QgY3JlZGVudGlhbHMgc2F2ZWQgaW4gU2VjcmV0IE1hbmFnZXIgaWYgcmVxdWVzdCB1c2VzIGJhc2ljIGF1dGggKGFuZCBpZiBzZWNyZXQgZXhpc3RzKVxuICpcbiAqIEV4cGVjdHMgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAqIC0gVVNFUl9QT09MX0lEXG4gKiAtIEJBU0lDX0FVVEhfQ1JFREVOVElBTFNfU0VDUkVUX05BTUUgKG9wdGlvbmFsKVxuICogICAtIFNlY3JldCB2YWx1ZSBzaG91bGQgZm9sbG93IHRoaXMgZm9ybWF0OiBge1widXNlcm5hbWVcIjpcIjx1c2VybmFtZT5cIixcInBhc3N3b3JkXCI6XCI8cGFzc3dvcmQ+XCJ9YC5cbiAqICAgICBBIGRpZmZlcmVudCBmb3JtYXQgd2l0aCBhbiBhcnJheSBvZiBwcmUtZW5jb2RlZCBjcmVkZW50aWFscyBpcyBhbHNvIHN1cHBvcnRlZCAtIHNlZSBkb2NzIGZvclxuICogICAgIHRoZSBgQ29nbml0b1VzZXJQb29sT3JCYXNpY0F1dGhBdXRob3JpemVyUHJvcHNgIG9uIHRoZSBgQXBpR2F0ZXdheWAgY29uc3RydWN0LlxuICogLSBSRVFVSVJFRF9TQ09QRSAob3B0aW9uYWwpXG4gKiAgIC0gU2V0IHRoaXMgdG8gcmVxdWlyZSB0aGF0IHRoZSBiZWFyZXIgdG9rZW4gcGF5bG9hZCBjb250YWlucyB0aGUgZ2l2ZW4gc2NvcGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFQSUdhdGV3YXlSZXF1ZXN0QXV0aG9yaXplckV2ZW50VjIsXG4gIEFQSUdhdGV3YXlTaW1wbGVBdXRob3JpemVyUmVzdWx0LFxufSBmcm9tIFwiYXdzLWxhbWJkYVwiXG5pbXBvcnQgeyBTZWNyZXRzTWFuYWdlciB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtc2VjcmV0cy1tYW5hZ2VyXCJcbmltcG9ydCB7IENvZ25pdG9Kd3RWZXJpZmllciB9IGZyb20gXCJhd3Mtand0LXZlcmlmeVwiXG5pbXBvcnQgdHlwZSB7IENvZ25pdG9BY2Nlc3NUb2tlblBheWxvYWQgfSBmcm9tIFwiYXdzLWp3dC12ZXJpZnkvand0LW1vZGVsXCJcblxudHlwZSBBdXRob3JpemVyUmVzdWx0ID0gQVBJR2F0ZXdheVNpbXBsZUF1dGhvcml6ZXJSZXN1bHQgJiB7XG4gIC8qKlxuICAgKiBSZXR1cm5pbmcgYSBjb250ZXh0IG9iamVjdCBmcm9tIG91ciBhdXRob3JpemVyIGFsbG93cyBvdXIgQVBJIEdhdGV3YXkgdG8gYWNjZXNzIHRoZXNlIHZhcmlhYmxlc1xuICAgKiB2aWEgYCR7Y29udGV4dC5hdXRob3JpemVyLjxwcm9wZXJ0eT59YC5cbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWxvZ2dpbmctdmFyaWFibGVzLmh0bWxcbiAgICovXG4gIGNvbnRleHQ/OiB7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHRva2VuIGlzIHZlcmlmaWVkLCB3ZSByZXR1cm4gdGhlIGF1dGggY2xpZW50IElEIGZyb20gdGhlIHRva2VuJ3MgY2xhaW1zIGFzIGEgY29udGV4dFxuICAgICAqIHZhcmlhYmxlIChuYW1lZCBgYXV0aG9yaXplci5jbGllbnRJZGApLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgZm9yIHBhcmFtZXRlciBtYXBwaW5nIG9uIHRoZVxuICAgICAqIEFQSSBHYXRld2F5IChzZWUgYEFsYkludGVncmF0aW9uUHJvcHMubWFwUGFyYW1ldGVyc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QpLCBpZiBmb3JcbiAgICAgKiBleGFtcGxlIHlvdSB3YW50IHRvIGZvcndhcmQgdGhpcyB0byB0aGUgYmFja2VuZCBpbnRlZ3JhdGlvbi5cbiAgICAgKi9cbiAgICBjbGllbnRJZD86IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFNlZSBgQ29nbml0b1VzZXJQb29sQXV0aG9yaXplclByb3BzLmJhc2ljQXV0aEZvckludGVybmFsQXV0aG9yaXphdGlvbmAgaW4gdGhlIGBBcGlHYXRld2F5YFxuICAgICAqIGNvbnN0cnVjdCAod2UgcHJvdmlkZSB0aGUgc2FtZSBjb250ZXh0IHZhcmlhYmxlIGhlcmUgYXMgaW4gdGhlIENvZ25pdG8gVXNlciBQb29sIGF1dGhvcml6ZXIsXG4gICAgICogdXNpbmcgdGhlIGNyZWRlbnRpYWxzIGZyb20gQkFTSUNfQVVUSF9DUkVERU5USUFMU19TRUNSRVRfTkFNRSkuXG4gICAgICovXG4gICAgaW50ZXJuYWxBdXRob3JpemF0aW9uSGVhZGVyPzogc3RyaW5nXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoXG4gIGV2ZW50OiBBUElHYXRld2F5UmVxdWVzdEF1dGhvcml6ZXJFdmVudFYyLFxuKTogUHJvbWlzZTxBdXRob3JpemVyUmVzdWx0PiA9PiB7XG4gIGNvbnN0IGF1dGhIZWFkZXIgPSBldmVudC5oZWFkZXJzPy5hdXRob3JpemF0aW9uXG4gIGlmICghYXV0aEhlYWRlcikge1xuICAgIHJldHVybiB7IGlzQXV0aG9yaXplZDogZmFsc2UgfVxuICB9XG5cbiAgY29uc3QgZXhwZWN0ZWRCYXNpY0F1dGhIZWFkZXJzID0gYXdhaXQgZ2V0RXhwZWN0ZWRCYXNpY0F1dGhIZWFkZXJzKClcblxuICBpZiAoYXV0aEhlYWRlci5zdGFydHNXaXRoKFwiQmVhcmVyIFwiKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZlcmlmeUFjY2Vzc1Rva2VuKGF1dGhIZWFkZXIuc3Vic3RyaW5nKDcpKSAvLyBzdWJzdHJpbmcoNykgPT0gYWZ0ZXIgJ0JlYXJlciAnXG4gICAgc3dpdGNoIChyZXN1bHQpIHtcbiAgICAgIGNhc2UgXCJJTlZBTElEXCI6XG4gICAgICAgIHJldHVybiB7IGlzQXV0aG9yaXplZDogZmFsc2UgfVxuICAgICAgY2FzZSBcIkVYUElSRURcIjpcbiAgICAgICAgLy8gV2Ugd2FudCB0byByZXR1cm4gNDAxIFVuYXV0aG9yaXplZCBmb3IgZXhwaXJlZCB0b2tlbnMsIHNvIHRoZSBjbGllbnQga25vd3MgdG8gcmVmcmVzaFxuICAgICAgICAvLyB0aGVpciB0b2tlbiB3aGVuIHJlY2VpdmluZyB0aGlzIHN0YXR1cyBjb2RlLiBBUEkgR2F0ZXdheSBhdXRob3JpemVyIGxhbWJkYXMgcmV0dXJuXG4gICAgICAgIC8vIDQwMyBGb3JiaWRkZW4gZm9yIHtpc0F1dGhvcml6ZWQ6IGZhbHNlfSwgYnV0IHRoZXJlIGlzIGEgd2F5IHRvIHJldHVybiA0MDE6IHRocm93aW5nIGFuXG4gICAgICAgIC8vIGVycm9yIHdpdGggdGhpcyBleGFjdCBzdHJpbmcuIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS83MTk2NTg5MFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmF1dGhvcml6ZWRcIilcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNBdXRob3JpemVkOiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgIGNsaWVudElkOiByZXN1bHQuY2xpZW50X2lkLFxuICAgICAgICAgICAgaW50ZXJuYWxBdXRob3JpemF0aW9uSGVhZGVyOiBleHBlY3RlZEJhc2ljQXV0aEhlYWRlcnM/LlswXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKFxuICAgIGF1dGhIZWFkZXIuc3RhcnRzV2l0aChcIkJhc2ljIFwiKSAmJlxuICAgIGV4cGVjdGVkQmFzaWNBdXRoSGVhZGVycyAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIGZvciAoY29uc3QgZXhwZWN0ZWRIZWFkZXIgb2YgZXhwZWN0ZWRCYXNpY0F1dGhIZWFkZXJzKSB7XG4gICAgICBpZiAoYXV0aEhlYWRlciA9PT0gZXhwZWN0ZWRIZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc0F1dGhvcml6ZWQ6IHRydWUsXG4gICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgaW50ZXJuYWxBdXRob3JpemF0aW9uSGVhZGVyOiBleHBlY3RlZEhlYWRlcixcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGlzQXV0aG9yaXplZDogZmFsc2UgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB7IGlzQXV0aG9yaXplZDogZmFsc2UgfVxuICB9XG59XG5cbi8qKiBEZWNvZGVzIGFuZCB2ZXJpZmllcyB0aGUgZ2l2ZW4gdG9rZW4gYWdhaW5zdCBDb2duaXRvLiAqL1xuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5QWNjZXNzVG9rZW4oXG4gIHRva2VuOiBzdHJpbmcsXG4pOiBQcm9taXNlPENvZ25pdG9BY2Nlc3NUb2tlblBheWxvYWQgfCBcIkVYUElSRURcIiB8IFwiSU5WQUxJRFwiPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdG9rZW5WZXJpZmllciA9IGdldFRva2VuVmVyaWZpZXIoKVxuICAgIC8vIE11c3QgYXdhaXQgaGVyZSBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgcHJvbWlzZSBkaXJlY3RseSwgc28gdGhhdCBlcnJvcnMgY2FuIGJlIGNhdWdodCBpblxuICAgIC8vIHRoaXMgZnVuY3Rpb25cbiAgICByZXR1cm4gYXdhaXQgdG9rZW5WZXJpZmllci52ZXJpZnkodG9rZW4pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJZiB0aGUgSldUIGhhcyBleHBpcmVkLCBhd3Mtand0LXZlcmlmeSB0aHJvd3MgdGhpcyBlcnJvcjpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzbGFicy9hd3Mtand0LXZlcmlmeS9ibG9iLzhkOGY3MTRkNzI4MTkxM2VjZDY2MDE0N2Y1YzMwMzExNDc5NjAxYzEvc3JjL2p3dC50cyNMMTk3XG4gICAgLy8gV2UgY2FuJ3QgY2hlY2sgaW5zdGFuY2VvZiBvbiB0aGF0IGVycm9yIGNsYXNzLCBzaW5jZSBpdCdzIG5vdCBleHBvcnRlZCwgc28gdGhpcyBpcyB0aGUgbmV4dFxuICAgIC8vIGJlc3QgdGhpbmcuXG4gICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2U/LmluY2x1ZGVzKFwiVG9rZW4gZXhwaXJlZFwiKSkge1xuICAgICAgcmV0dXJuIFwiRVhQSVJFRFwiXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIklOVkFMSURcIlxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBUb2tlblZlcmlmaWVyID0ge1xuICB2ZXJpZnk6IChhY2Nlc3NUb2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPENvZ25pdG9BY2Nlc3NUb2tlblBheWxvYWQ+XG59XG5cbi8qKlxuICogV2UgY2FjaGUgdGhlIHZlcmlmaWVyIGluIHRoaXMgZ2xvYmFsIHZhcmlhYmxlLCBzbyB0aGF0IHN1YnNlcXVlbnQgaW52b2NhdGlvbnMgb2YgYSBob3QgbGFtYmRhXG4gKiB3aWxsIHJlLXVzZSB0aGlzLlxuICovXG5sZXQgY2FjaGVkVG9rZW5WZXJpZmllcjogVG9rZW5WZXJpZmllciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG5mdW5jdGlvbiBnZXRUb2tlblZlcmlmaWVyKCk6IFRva2VuVmVyaWZpZXIge1xuICBpZiAoY2FjaGVkVG9rZW5WZXJpZmllciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2FjaGVkVG9rZW5WZXJpZmllciA9IGRlcGVuZGVuY2llcy5jcmVhdGVUb2tlblZlcmlmaWVyKClcbiAgfVxuICByZXR1cm4gY2FjaGVkVG9rZW5WZXJpZmllclxufVxuXG4vKiogRm9yIG92ZXJyaWRpbmcgZGVwZW5kZW5jeSBjcmVhdGlvbiBpbiB0ZXN0cy4gKi9cbmV4cG9ydCBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gIGNyZWF0ZVRva2VuVmVyaWZpZXI6ICgpOiBUb2tlblZlcmlmaWVyID0+IHtcbiAgICBjb25zdCB1c2VyUG9vbElkID0gcHJvY2Vzcy5lbnZbXCJVU0VSX1BPT0xfSURcIl1cbiAgICBpZiAoIXVzZXJQb29sSWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJVU0VSX1BPT0xfSUQgZW52IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICAgIH1cblxuICAgIHJldHVybiBDb2duaXRvSnd0VmVyaWZpZXIuY3JlYXRlKHtcbiAgICAgIHVzZXJQb29sSWQsXG4gICAgICB0b2tlblVzZTogXCJhY2Nlc3NcIixcbiAgICAgIGNsaWVudElkOiBudWxsLFxuICAgICAgc2NvcGU6IHByb2Nlc3MuZW52LlJFUVVJUkVEX1NDT1BFIHx8IHVuZGVmaW5lZCwgLy8gYHx8IHVuZGVmaW5lZGAgdG8gZGlzY2FyZCBlbXB0eSBzdHJpbmdcbiAgICB9KVxuICB9LFxuICBjcmVhdGVTZWNyZXRzTWFuYWdlcjogKCkgPT4gbmV3IFNlY3JldHNNYW5hZ2VyKCksXG59XG5cbi8qKiBDYWNoZSB0aGlzIHZhbHVlLCBzbyB0aGF0IHN1YnNlcXVlbnQgbGFtYmRhIGludm9jYXRpb25zIGRvbid0IGhhdmUgdG8gcmVmZXRjaC4gKi9cbmxldCBjYWNoZWRCYXNpY0F1dGhIZWFkZXJzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsb3dlZCBiYXNpYyBhdXRoIGhlYWRlcnMsIHRvIHN1cHBvcnQgY3JlZGVudGlhbCBzZWNyZXRzIHdpdGggbXVsdGlwbGVcbiAqIHZhbHVlcyAoc2VlIGBCYXNpY0F1dGhBdXRob3JpemVyUHJvcHNgIG9uIHRoZSBgQXBpR2F0ZXdheWAgY29uc3RydWN0IGZvciBtb3JlIG9uIHRoaXMpLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRFeHBlY3RlZEJhc2ljQXV0aEhlYWRlcnMoKTogUHJvbWlzZTxzdHJpbmdbXSB8IHVuZGVmaW5lZD4ge1xuICBpZiAoY2FjaGVkQmFzaWNBdXRoSGVhZGVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgc2VjcmV0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgIHByb2Nlc3MuZW52W1wiQkFTSUNfQVVUSF9DUkVERU5USUFMU19TRUNSRVRfTkFNRVwiXVxuICAgIGlmICghc2VjcmV0TmFtZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNhY2hlZEJhc2ljQXV0aEhlYWRlcnMgPSBhd2FpdCBnZXRTZWNyZXRBc0Jhc2ljQXV0aEhlYWRlcnMoc2VjcmV0TmFtZSlcbiAgfVxuXG4gIHJldHVybiBjYWNoZWRCYXNpY0F1dGhIZWFkZXJzXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNlY3JldEFzQmFzaWNBdXRoSGVhZGVycyhcbiAgc2VjcmV0TmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBzZWNyZXQgPSBhd2FpdCBnZXRTZWNyZXRWYWx1ZShzZWNyZXROYW1lKVxuXG4gIGlmIChpc1NpbmdsZVVzZXJuYW1lQW5kUGFzc3dvcmQoc2VjcmV0KSkge1xuICAgIGNvbnN0IGhlYWRlciA9XG4gICAgICBcIkJhc2ljIFwiICtcbiAgICAgIEJ1ZmZlci5mcm9tKGAke3NlY3JldC51c2VybmFtZX06JHtzZWNyZXQucGFzc3dvcmR9YCkudG9TdHJpbmcoXCJiYXNlNjRcIilcbiAgICByZXR1cm4gW2hlYWRlcl1cbiAgfVxuXG4gIC8vIFNlZSBgQmFzaWNBdXRoQXV0aG9yaXplclByb3BzYCBvbiB0aGUgYEFwaUdhdGV3YXlgIGNvbnN0cnVjdCBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGZvcm1hdHNcbiAgLy8gd2UgcGFyc2UgaGVyZVxuICBpZiAoaGFzQ3JlZGVudGlhbHNLZXlXaXRoU3RyaW5nVmFsdWUoc2VjcmV0KSkge1xuICAgIGxldCBjcmVkZW50aWFsc0FycmF5OiB1bmtub3duXG4gICAgdHJ5IHtcbiAgICAgIGNyZWRlbnRpYWxzQXJyYXkgPSBKU09OLnBhcnNlKHNlY3JldC5jcmVkZW50aWFscylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHBhcnNlIGNyZWRlbnRpYWxzIGFycmF5IGluIHNlY3JldCAnJHtzZWNyZXROYW1lfScgYXMgSlNPTmAsXG4gICAgICAgIGUsXG4gICAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICAgIH1cblxuICAgIGlmIChpc1N0cmluZ0FycmF5KGNyZWRlbnRpYWxzQXJyYXkpKSB7XG4gICAgICByZXR1cm4gY3JlZGVudGlhbHNBcnJheS5tYXAoXG4gICAgICAgIChlbmNvZGVkQ3JlZGVudGlhbCkgPT4gYEJhc2ljICR7ZW5jb2RlZENyZWRlbnRpYWx9YCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjb25zb2xlLmVycm9yKFxuICAgIGBCYXNpYyBhdXRoIGNyZWRlbnRpYWxzIHNlY3JldCBkaWQgbm90IGZvbGxvdyBhbnkgZXhwZWN0ZWQgZm9ybWF0IChzZWNyZXQgbmFtZTogJyR7c2VjcmV0TmFtZX0nKWAsXG4gIClcbiAgdGhyb3cgbmV3IEVycm9yKClcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0U2VjcmV0VmFsdWUoc2VjcmV0TmFtZTogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGNsaWVudCA9IGRlcGVuZGVuY2llcy5jcmVhdGVTZWNyZXRzTWFuYWdlcigpXG4gIGNvbnN0IHNlY3JldCA9IGF3YWl0IGNsaWVudC5nZXRTZWNyZXRWYWx1ZSh7IFNlY3JldElkOiBzZWNyZXROYW1lIH0pXG5cbiAgaWYgKCFzZWNyZXQuU2VjcmV0U3RyaW5nKSB7XG4gICAgY29uc29sZS5lcnJvcihgU2VjcmV0IHZhbHVlIG5vdCBmb3VuZCBmb3IgJyR7c2VjcmV0TmFtZX0nYClcbiAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzZWNyZXQuU2VjcmV0U3RyaW5nKVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHNlY3JldCAnJHtzZWNyZXROYW1lfScgYXMgSlNPTmAsIGUpXG4gICAgdGhyb3cgbmV3IEVycm9yKClcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NpbmdsZVVzZXJuYW1lQW5kUGFzc3dvcmQoXG4gIHZhbHVlOiB1bmtub3duLFxuKTogdmFsdWUgaXMgeyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH0ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgXCJ1c2VybmFtZVwiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLnVzZXJuYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgXCJwYXNzd29yZFwiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLnBhc3N3b3JkID09PSBcInN0cmluZ1wiXG4gIClcbn1cblxuZnVuY3Rpb24gaGFzQ3JlZGVudGlhbHNLZXlXaXRoU3RyaW5nVmFsdWUoXG4gIHZhbHVlOiB1bmtub3duLFxuKTogdmFsdWUgaXMgeyBjcmVkZW50aWFsczogc3RyaW5nIH0ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgXCJjcmVkZW50aWFsc1wiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLmNyZWRlbnRpYWxzID09PSBcInN0cmluZ1wiXG4gIClcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZ1tdIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDYWNoZSgpIHtcbiAgY2FjaGVkVG9rZW5WZXJpZmllciA9IHVuZGVmaW5lZFxuICBjYWNoZWRCYXNpY0F1dGhIZWFkZXJzID0gdW5kZWZpbmVkXG59XG4iXX0=
|
|
222
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0by11c2VyLXBvb2wtb3ItYmFzaWMtYXV0aC1hdXRob3JpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS1nYXRld2F5L2F1dGhvcml6ZXItbGFtYmRhcy9jb2duaXRvLXVzZXItcG9vbC1vci1iYXNpYy1hdXRoLWF1dGhvcml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQU1ILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQW1DbkQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEtBQUssRUFDMUIsS0FBeUMsRUFDZCxFQUFFO0lBQzdCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFBO0lBQy9DLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFBO0lBQ2hDLENBQUM7SUFFRCxNQUFNLDRCQUE0QixHQUFHLE1BQU0sK0JBQStCLEVBQUUsQ0FBQTtJQUU1RSxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxNQUFNLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLGtDQUFrQztRQUNsRyxRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxTQUFTO2dCQUNaLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUE7WUFDaEMsS0FBSyxTQUFTO2dCQUNaLHdGQUF3RjtnQkFDeEYscUZBQXFGO2dCQUNyRix5RkFBeUY7Z0JBQ3pGLHFFQUFxRTtnQkFDckUsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUNqQztn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LENBQ1gsMkVBQTJFLENBQzVFLENBQUE7UUFDRCxNQUFNLElBQUksS0FBSyxFQUFFLENBQUE7SUFDbkIsQ0FBQztJQUVELE9BQU87UUFDTCxlQUFlLEVBQUUsU0FBUyxrQkFBa0IsRUFBRTtRQUM5QyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0tBQ2pDLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVU7SUFDeEIsbUJBQW1CLEdBQUcsU0FBUyxDQUFBO0lBQy9CLDBCQUEwQixHQUFHLFNBQVMsQ0FBQTtBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIGxhbWJkYSB2ZXJpZmllcyBjcmVkZW50aWFsczpcbiAqIC0gQWdhaW5zdCBDb2duaXRvIHVzZXIgcG9vbCBpZiByZXF1ZXN0IHVzZXMgYWNjZXNzIHRva2VuIGluIEJlYXJlciBhdXRob3JpemF0aW9uIGhlYWRlclxuICogLSBBZ2FpbnN0IGNyZWRlbnRpYWxzIHNhdmVkIGluIFNlY3JldCBNYW5hZ2VyIGlmIHJlcXVlc3QgdXNlcyBiYXNpYyBhdXRoIChhbmQgaWYgc2VjcmV0IGV4aXN0cylcbiAqXG4gKiBFeHBlY3RzIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gKiAtIFVTRVJfUE9PTF9JRFxuICogLSBCQVNJQ19BVVRIX0NSRURFTlRJQUxTX1NFQ1JFVF9OQU1FIChvcHRpb25hbClcbiAqICAgLSBTZWNyZXQgdmFsdWUgc2hvdWxkIGZvbGxvdyB0aGlzIGZvcm1hdDogYHtcInVzZXJuYW1lXCI6XCI8dXNlcm5hbWU+XCIsXCJwYXNzd29yZFwiOlwiPHBhc3N3b3JkPlwifWAuXG4gKiAgICAgQSBkaWZmZXJlbnQgZm9ybWF0IHdpdGggYW4gYXJyYXkgb2YgcHJlLWVuY29kZWQgY3JlZGVudGlhbHMgaXMgYWxzbyBzdXBwb3J0ZWQgLSBzZWUgZG9jcyBmb3JcbiAqICAgICB0aGUgYENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplclByb3BzYCBvbiB0aGUgYEFwaUdhdGV3YXlgIGNvbnN0cnVjdC5cbiAqIC0gUkVRVUlSRURfU0NPUEUgKG9wdGlvbmFsKVxuICogICAtIFNldCB0aGlzIHRvIHJlcXVpcmUgdGhhdCB0aGUgYWNjZXNzIHRva2VuIHBheWxvYWQgY29udGFpbnMgdGhlIGdpdmVuIHNjb3BlXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBUElHYXRld2F5UmVxdWVzdEF1dGhvcml6ZXJFdmVudFYyLFxuICBBUElHYXRld2F5U2ltcGxlQXV0aG9yaXplclJlc3VsdCxcbn0gZnJvbSBcImF3cy1sYW1iZGFcIlxuaW1wb3J0IHsgU2VjcmV0c01hbmFnZXIgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlclwiXG5pbXBvcnQgeyBDb2duaXRvSnd0VmVyaWZpZXIgfSBmcm9tIFwiYXdzLWp3dC12ZXJpZnlcIlxuaW1wb3J0IHR5cGUgeyBDb2duaXRvQWNjZXNzVG9rZW5QYXlsb2FkIH0gZnJvbSBcImF3cy1qd3QtdmVyaWZ5L2p3dC1tb2RlbFwiXG5cbnR5cGUgQXV0aG9yaXplclJlc3VsdCA9IEFQSUdhdGV3YXlTaW1wbGVBdXRob3JpemVyUmVzdWx0ICYge1xuICAvKipcbiAgICogUmV0dXJuaW5nIGEgY29udGV4dCBvYmplY3QgZnJvbSBvdXIgYXV0aG9yaXplciBhbGxvd3Mgb3VyIEFQSSBHYXRld2F5IHRvIGFjY2VzcyB0aGVzZSB2YXJpYWJsZXNcbiAgICogdmlhIGAke2NvbnRleHQuYXV0aG9yaXplci48cHJvcGVydHk+fWAuXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1wYXJhbWV0ZXItbWFwcGluZy5odG1sXG4gICAqL1xuICBjb250ZXh0Pzoge1xuICAgIC8qKlxuICAgICAqIElmIHRoZSByZXF1ZXN0IHVzZWQgYW4gYWNjZXNzIHRva2VuLCBhbmQgdGhlIHRva2VuIHdhcyB2ZXJpZmllZCwgd2UgcmV0dXJuIHRoZSBhdXRoIGNsaWVudCBJRFxuICAgICAqIGZyb20gdGhlIHRva2VuJ3MgY2xhaW1zIGluIHRoaXMgY29udGV4dCB2YXJpYWJsZSAobmFtZWQgYGF1dGhvcml6ZXIuY2xpZW50SWRgKS4gV2UgdXNlIHRoaXNcbiAgICAgKiB0byBpbmNsdWRlIHRoZSByZXF1ZXN0aW5nIGNsaWVudCBpbiB0aGUgQVBJIEdhdGV3YXkgYWNjZXNzIGxvZ3MgKHNlZSBgZGVmYXVsdEFjY2Vzc0xvZ0Zvcm1hdGBcbiAgICAgKiBpbiBvdXIgYEFwaUdhdGV3YXlgIGNvbnN0cnVjdCkuIFlvdSBjYW4gYWxzbyB1c2UgdGhpcyB3aGVuIG1hcHBpbmcgcGFyYW1ldGVycyB0byB0aGUgYmFja2VuZFxuICAgICAqIGludGVncmF0aW9uIChzZWUgYEFsYkludGVncmF0aW9uUHJvcHMubWFwUGFyYW1ldGVyc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QpLlxuICAgICAqL1xuICAgIGNsaWVudElkPzogc3RyaW5nXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHJlcXVlc3QgdXNlZCBCYXNpYyBBdXRoLCBhbmQgdGhlIGNyZWRlbnRpYWxzIHdlcmUgdmVyaWZpZWQsIHdlIHJldHVybiB0aGUgdXNlcm5hbWVcbiAgICAgKiB0aGF0IHdhcyB1c2VkIGluIHRoaXMgY29udGV4dCB2YXJpYWJsZSAobmFtZWQgYGF1dGhvcml6ZXIudXNlcm5hbWVgKS4gV2UgdXNlIHRoaXMgdG8gaW5jbHVkZVxuICAgICAqIHRoZSByZXF1ZXN0aW5nIHVzZXIgaW4gdGhlIEFQSSBHYXRld2F5IGFjY2VzcyBsb2dzIChzZWUgYGRlZmF1bHRBY2Nlc3NMb2dGb3JtYXRgIGluIG91clxuICAgICAqIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QpLiBZb3UgY2FuIGFsc28gdXNlIHRoaXMgd2hlbiBtYXBwaW5nIHBhcmFtZXRlcnMgdG8gdGhlIGJhY2tlbmRcbiAgICAgKiBpbnRlZ3JhdGlvbiAoc2VlIGBBbGJJbnRlZ3JhdGlvblByb3BzLm1hcFBhcmFtZXRlcnNgIG9uIHRoZSBgQXBpR2F0ZXdheWAgY29uc3RydWN0KS5cbiAgICAgKi9cbiAgICB1c2VybmFtZT86IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFNlZSBgQ29nbml0b1VzZXJQb29sQXV0aG9yaXplclByb3BzLmJhc2ljQXV0aEZvckludGVybmFsQXV0aG9yaXphdGlvbmAgb24gdGhlIGBBcGlHYXRld2F5YFxuICAgICAqIGNvbnN0cnVjdCAod2UgcHJvdmlkZSB0aGUgc2FtZSBjb250ZXh0IHZhcmlhYmxlIGhlcmUgYXMgaW4gdGhlIENvZ25pdG8gVXNlciBQb29sIGF1dGhvcml6ZXIsXG4gICAgICogdXNpbmcgdGhlIGNyZWRlbnRpYWxzIGZyb20gQkFTSUNfQVVUSF9DUkVERU5USUFMU19TRUNSRVRfTkFNRSkuXG4gICAgICovXG4gICAgaW50ZXJuYWxBdXRob3JpemF0aW9uSGVhZGVyPzogc3RyaW5nXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoXG4gIGV2ZW50OiBBUElHYXRld2F5UmVxdWVzdEF1dGhvcml6ZXJFdmVudFYyLFxuKTogUHJvbWlzZTxBdXRob3JpemVyUmVzdWx0PiA9PiB7XG4gIGNvbnN0IGF1dGhIZWFkZXIgPSBldmVudC5oZWFkZXJzPy5hdXRob3JpemF0aW9uXG4gIGlmICghYXV0aEhlYWRlcikge1xuICAgIHJldHVybiB7IGlzQXV0aG9yaXplZDogZmFsc2UgfVxuICB9XG5cbiAgY29uc3QgZXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFscyA9IGF3YWl0IGdldEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMoKVxuXG4gIGlmIChhdXRoSGVhZGVyLnN0YXJ0c1dpdGgoXCJCZWFyZXIgXCIpKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdmVyaWZ5QWNjZXNzVG9rZW4oYXV0aEhlYWRlci5zdWJzdHJpbmcoNykpIC8vIHN1YnN0cmluZyg3KSA9PSBhZnRlciAnQmVhcmVyICdcbiAgICBzd2l0Y2ggKHJlc3VsdCkge1xuICAgICAgY2FzZSBcIklOVkFMSURcIjpcbiAgICAgICAgcmV0dXJuIHsgaXNBdXRob3JpemVkOiBmYWxzZSB9XG4gICAgICBjYXNlIFwiRVhQSVJFRFwiOlxuICAgICAgICAvLyBXZSB3YW50IHRvIHJldHVybiA0MDEgVW5hdXRob3JpemVkIGZvciBleHBpcmVkIHRva2Vucywgc28gdGhlIGNsaWVudCBrbm93cyB0byByZWZyZXNoXG4gICAgICAgIC8vIHRoZWlyIHRva2VuIHdoZW4gcmVjZWl2aW5nIHRoaXMgc3RhdHVzIGNvZGUuIEFQSSBHYXRld2F5IGF1dGhvcml6ZXIgbGFtYmRhcyByZXR1cm5cbiAgICAgICAgLy8gNDAzIEZvcmJpZGRlbiBmb3Ige2lzQXV0aG9yaXplZDogZmFsc2V9LCBidXQgdGhlcmUgaXMgYSB3YXkgdG8gcmV0dXJuIDQwMTogdGhyb3dpbmcgYW5cbiAgICAgICAgLy8gZXJyb3Igd2l0aCB0aGlzIGV4YWN0IHN0cmluZy4gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzcxOTY1ODkwXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYXV0aG9yaXplZFwiKVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc0F1dGhvcml6ZWQ6IHRydWUsXG4gICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgY2xpZW50SWQ6IHJlc3VsdC5jbGllbnRfaWQsXG4gICAgICAgICAgICBpbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXI6XG4gICAgICAgICAgICAgIGV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHM/LlswXT8uYmFzaWNBdXRoSGVhZGVyLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoXG4gICAgYXV0aEhlYWRlci5zdGFydHNXaXRoKFwiQmFzaWMgXCIpICYmXG4gICAgZXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFscyAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIGZvciAoY29uc3QgZXhwZWN0ZWQgb2YgZXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFscykge1xuICAgICAgaWYgKGF1dGhIZWFkZXIgPT09IGV4cGVjdGVkLmJhc2ljQXV0aEhlYWRlcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzQXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICB1c2VybmFtZTogZXhwZWN0ZWQudXNlcm5hbWUsXG4gICAgICAgICAgICBpbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXI6IGV4cGVjdGVkLmJhc2ljQXV0aEhlYWRlcixcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGlzQXV0aG9yaXplZDogZmFsc2UgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB7IGlzQXV0aG9yaXplZDogZmFsc2UgfVxuICB9XG59XG5cbi8qKiBEZWNvZGVzIGFuZCB2ZXJpZmllcyB0aGUgZ2l2ZW4gdG9rZW4gYWdhaW5zdCBDb2duaXRvLiAqL1xuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5QWNjZXNzVG9rZW4oXG4gIHRva2VuOiBzdHJpbmcsXG4pOiBQcm9taXNlPENvZ25pdG9BY2Nlc3NUb2tlblBheWxvYWQgfCBcIkVYUElSRURcIiB8IFwiSU5WQUxJRFwiPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdG9rZW5WZXJpZmllciA9IGdldFRva2VuVmVyaWZpZXIoKVxuICAgIC8vIE11c3QgYXdhaXQgaGVyZSBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgcHJvbWlzZSBkaXJlY3RseSwgc28gdGhhdCBlcnJvcnMgY2FuIGJlIGNhdWdodCBpblxuICAgIC8vIHRoaXMgZnVuY3Rpb25cbiAgICByZXR1cm4gYXdhaXQgdG9rZW5WZXJpZmllci52ZXJpZnkodG9rZW4pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJZiB0aGUgSldUIGhhcyBleHBpcmVkLCBhd3Mtand0LXZlcmlmeSB0aHJvd3MgdGhpcyBlcnJvcjpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzbGFicy9hd3Mtand0LXZlcmlmeS9ibG9iLzhkOGY3MTRkNzI4MTkxM2VjZDY2MDE0N2Y1YzMwMzExNDc5NjAxYzEvc3JjL2p3dC50cyNMMTk3XG4gICAgLy8gV2UgY2FuJ3QgY2hlY2sgaW5zdGFuY2VvZiBvbiB0aGF0IGVycm9yIGNsYXNzLCBzaW5jZSBpdCdzIG5vdCBleHBvcnRlZCwgc28gdGhpcyBpcyB0aGUgbmV4dFxuICAgIC8vIGJlc3QgdGhpbmcuXG4gICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2U/LmluY2x1ZGVzKFwiVG9rZW4gZXhwaXJlZFwiKSkge1xuICAgICAgcmV0dXJuIFwiRVhQSVJFRFwiXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIklOVkFMSURcIlxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBUb2tlblZlcmlmaWVyID0ge1xuICB2ZXJpZnk6IChhY2Nlc3NUb2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPENvZ25pdG9BY2Nlc3NUb2tlblBheWxvYWQ+XG59XG5cbi8qKlxuICogV2UgY2FjaGUgdGhlIHZlcmlmaWVyIGluIHRoaXMgZ2xvYmFsIHZhcmlhYmxlLCBzbyB0aGF0IHN1YnNlcXVlbnQgaW52b2NhdGlvbnMgb2YgYSBob3QgbGFtYmRhXG4gKiB3aWxsIHJlLXVzZSB0aGlzLlxuICovXG5sZXQgY2FjaGVkVG9rZW5WZXJpZmllcjogVG9rZW5WZXJpZmllciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG5mdW5jdGlvbiBnZXRUb2tlblZlcmlmaWVyKCk6IFRva2VuVmVyaWZpZXIge1xuICBpZiAoY2FjaGVkVG9rZW5WZXJpZmllciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2FjaGVkVG9rZW5WZXJpZmllciA9IGRlcGVuZGVuY2llcy5jcmVhdGVUb2tlblZlcmlmaWVyKClcbiAgfVxuICByZXR1cm4gY2FjaGVkVG9rZW5WZXJpZmllclxufVxuXG4vKiogRm9yIG92ZXJyaWRpbmcgZGVwZW5kZW5jeSBjcmVhdGlvbiBpbiB0ZXN0cy4gKi9cbmV4cG9ydCBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gIGNyZWF0ZVRva2VuVmVyaWZpZXI6ICgpOiBUb2tlblZlcmlmaWVyID0+IHtcbiAgICBjb25zdCB1c2VyUG9vbElkID0gcHJvY2Vzcy5lbnZbXCJVU0VSX1BPT0xfSURcIl1cbiAgICBpZiAoIXVzZXJQb29sSWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJVU0VSX1BPT0xfSUQgZW52IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICAgIH1cblxuICAgIHJldHVybiBDb2duaXRvSnd0VmVyaWZpZXIuY3JlYXRlKHtcbiAgICAgIHVzZXJQb29sSWQsXG4gICAgICB0b2tlblVzZTogXCJhY2Nlc3NcIixcbiAgICAgIGNsaWVudElkOiBudWxsLFxuICAgICAgc2NvcGU6IHByb2Nlc3MuZW52LlJFUVVJUkVEX1NDT1BFIHx8IHVuZGVmaW5lZCwgLy8gYHx8IHVuZGVmaW5lZGAgdG8gZGlzY2FyZCBlbXB0eSBzdHJpbmdcbiAgICB9KVxuICB9LFxuICBjcmVhdGVTZWNyZXRzTWFuYWdlcjogKCkgPT4gbmV3IFNlY3JldHNNYW5hZ2VyKCksXG59XG5cbnR5cGUgRXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFscyA9IHtcbiAgYmFzaWNBdXRoSGVhZGVyOiBzdHJpbmdcbiAgdXNlcm5hbWU6IHN0cmluZ1xufVxuXG4vKiogQ2FjaGUgdGhpcyB2YWx1ZSwgc28gdGhhdCBzdWJzZXF1ZW50IGxhbWJkYSBpbnZvY2F0aW9ucyBkb24ndCBoYXZlIHRvIHJlZmV0Y2guICovXG5sZXQgY2FjaGVkQmFzaWNBdXRoQ3JlZGVudGlhbHM6IEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHNbXSB8IHVuZGVmaW5lZCA9XG4gIHVuZGVmaW5lZFxuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXksIHRvIHN1cHBvcnQgY3JlZGVudGlhbCBzZWNyZXRzIHdpdGggbXVsdGlwbGUgdmFsdWVzIChzZWVcbiAqIGBCYXNpY0F1dGhBdXRob3JpemVyUHJvcHNgIG9uIHRoZSBgQXBpR2F0ZXdheWAgY29uc3RydWN0IGZvciBtb3JlIG9uIHRoaXMpLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRFeHBlY3RlZEJhc2ljQXV0aENyZWRlbnRpYWxzKCk6IFByb21pc2U8XG4gIEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHNbXSB8IHVuZGVmaW5lZFxuPiB7XG4gIGlmIChjYWNoZWRCYXNpY0F1dGhDcmVkZW50aWFscyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgc2VjcmV0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgIHByb2Nlc3MuZW52W1wiQkFTSUNfQVVUSF9DUkVERU5USUFMU19TRUNSRVRfTkFNRVwiXVxuICAgIGlmICghc2VjcmV0TmFtZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNhY2hlZEJhc2ljQXV0aENyZWRlbnRpYWxzID0gYXdhaXQgZ2V0QmFzaWNBdXRoQ3JlZGVudGlhbHNTZWNyZXQoc2VjcmV0TmFtZSlcbiAgfVxuXG4gIHJldHVybiBjYWNoZWRCYXNpY0F1dGhDcmVkZW50aWFsc1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRCYXNpY0F1dGhDcmVkZW50aWFsc1NlY3JldChcbiAgc2VjcmV0TmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxFeHBlY3RlZEJhc2ljQXV0aENyZWRlbnRpYWxzW10+IHtcbiAgY29uc3Qgc2VjcmV0ID0gYXdhaXQgZ2V0U2VjcmV0VmFsdWUoc2VjcmV0TmFtZSlcblxuICBpZiAoaXNTaW5nbGVVc2VybmFtZUFuZFBhc3N3b3JkKHNlY3JldCkpIHtcbiAgICBjb25zdCBoZWFkZXIgPVxuICAgICAgXCJCYXNpYyBcIiArXG4gICAgICBCdWZmZXIuZnJvbShgJHtzZWNyZXQudXNlcm5hbWV9OiR7c2VjcmV0LnBhc3N3b3JkfWApLnRvU3RyaW5nKFwiYmFzZTY0XCIpXG4gICAgcmV0dXJuIFt7IGJhc2ljQXV0aEhlYWRlcjogaGVhZGVyLCB1c2VybmFtZTogc2VjcmV0LnVzZXJuYW1lIH1dXG4gIH1cblxuICAvLyBTZWUgYEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBmb3JtYXRzXG4gIC8vIHdlIHBhcnNlIGhlcmVcbiAgaWYgKGhhc0NyZWRlbnRpYWxzS2V5V2l0aFN0cmluZ1ZhbHVlKHNlY3JldCkpIHtcbiAgICBsZXQgY3JlZGVudGlhbHNBcnJheTogdW5rbm93blxuICAgIHRyeSB7XG4gICAgICBjcmVkZW50aWFsc0FycmF5ID0gSlNPTi5wYXJzZShzZWNyZXQuY3JlZGVudGlhbHMpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBwYXJzZSBjcmVkZW50aWFscyBhcnJheSBpbiBzZWNyZXQgJyR7c2VjcmV0TmFtZX0nIGFzIEpTT05gLFxuICAgICAgICBlLFxuICAgICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKClcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJpbmdBcnJheShjcmVkZW50aWFsc0FycmF5KSkge1xuICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzQXJyYXkubWFwKHBhcnNlRW5jb2RlZEJhc2ljQXV0aENyZWRlbnRpYWxzKVxuICAgIH1cbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgYEJhc2ljIGF1dGggY3JlZGVudGlhbHMgc2VjcmV0IGRpZCBub3QgZm9sbG93IGFueSBleHBlY3RlZCBmb3JtYXQgKHNlY3JldCBuYW1lOiAnJHtzZWNyZXROYW1lfScpYCxcbiAgKVxuICB0aHJvdyBuZXcgRXJyb3IoKVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRTZWNyZXRWYWx1ZShzZWNyZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY2xpZW50ID0gZGVwZW5kZW5jaWVzLmNyZWF0ZVNlY3JldHNNYW5hZ2VyKClcbiAgY29uc3Qgc2VjcmV0ID0gYXdhaXQgY2xpZW50LmdldFNlY3JldFZhbHVlKHsgU2VjcmV0SWQ6IHNlY3JldE5hbWUgfSlcblxuICBpZiAoIXNlY3JldC5TZWNyZXRTdHJpbmcpIHtcbiAgICBjb25zb2xlLmVycm9yKGBTZWNyZXQgdmFsdWUgbm90IGZvdW5kIGZvciAnJHtzZWNyZXROYW1lfSdgKVxuICAgIHRocm93IG5ldyBFcnJvcigpXG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHNlY3JldC5TZWNyZXRTdHJpbmcpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2Ugc2VjcmV0ICcke3NlY3JldE5hbWV9JyBhcyBKU09OOmAsIGUpXG4gICAgdGhyb3cgbmV3IEVycm9yKClcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NpbmdsZVVzZXJuYW1lQW5kUGFzc3dvcmQoXG4gIHZhbHVlOiB1bmtub3duLFxuKTogdmFsdWUgaXMgeyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH0ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgXCJ1c2VybmFtZVwiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLnVzZXJuYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgXCJwYXNzd29yZFwiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLnBhc3N3b3JkID09PSBcInN0cmluZ1wiXG4gIClcbn1cblxuZnVuY3Rpb24gaGFzQ3JlZGVudGlhbHNLZXlXaXRoU3RyaW5nVmFsdWUoXG4gIHZhbHVlOiB1bmtub3duLFxuKTogdmFsdWUgaXMgeyBjcmVkZW50aWFsczogc3RyaW5nIH0ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgXCJjcmVkZW50aWFsc1wiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLmNyZWRlbnRpYWxzID09PSBcInN0cmluZ1wiXG4gIClcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZ1tdIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIFdlIHdhbnQgdG8gcmV0dXJuIHRoZSByZXF1ZXN0aW5nIHVzZXJuYW1lIGFzIGEgY29udGV4dCB2YXJpYWJsZSBpblxuICoge0BsaW5rIEF1dGhvcml6ZXJSZXN1bHQuY29udGV4dH0sIGZvciBBUEkgR2F0ZXdheSBhY2Nlc3MgbG9ncyBhbmQgcGFyYW1ldGVyIG1hcHBpbmcuIFNvIGlmIHRoZVxuICogYmFzaWMgYXV0aCBjcmVkZW50aWFscyBzZWNyZXQgaXMgc3RvcmVkIGFzIHByZS1lbmNvZGVkIGJhc2U2NCBzdHJpbmdzLCB3ZSBuZWVkIHRvIHBhcnNlIHRoZW0gdG9cbiAqIGdldCB0aGUgdXNlcm5hbWUuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRW5jb2RlZEJhc2ljQXV0aENyZWRlbnRpYWxzKFxuICBlbmNvZGVkQ3JlZGVudGlhbHM6IHN0cmluZyxcbik6IEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMge1xuICBsZXQgZGVjb2RlZENyZWRlbnRpYWxzOiBzdHJpbmdcbiAgdHJ5IHtcbiAgICBkZWNvZGVkQ3JlZGVudGlhbHMgPSBCdWZmZXIuZnJvbShlbmNvZGVkQ3JlZGVudGlhbHMsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKClcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBcIkJhc2ljIGF1dGggY3JlZGVudGlhbHMgc2VjcmV0IGNvdWxkIG5vdCBiZSBkZWNvZGVkIGFzIGJhc2U2NDpcIixcbiAgICAgIGUsXG4gICAgKVxuICAgIHRocm93IG5ldyBFcnJvcigpXG4gIH1cblxuICBjb25zdCB1c2VybmFtZUFuZFBhc3N3b3JkID0gZGVjb2RlZENyZWRlbnRpYWxzLnNwbGl0KFwiOlwiLCAyKVxuICBpZiAodXNlcm5hbWVBbmRQYXNzd29yZC5sZW5ndGggIT09IDIpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgXCJCYXNpYyBhdXRoIGNyZWRlbnRpYWxzIHNlY3JldCBjb3VsZCBub3QgYmUgZGVjb2RlZCBhcyAndXNlcm5hbWU6cGFzc3dvcmQnXCIsXG4gICAgKVxuICAgIHRocm93IG5ldyBFcnJvcigpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJhc2ljQXV0aEhlYWRlcjogYEJhc2ljICR7ZW5jb2RlZENyZWRlbnRpYWxzfWAsXG4gICAgdXNlcm5hbWU6IHVzZXJuYW1lQW5kUGFzc3dvcmRbMF0sXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQ2FjaGUoKSB7XG4gIGNhY2hlZFRva2VuVmVyaWZpZXIgPSB1bmRlZmluZWRcbiAgY2FjaGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMgPSB1bmRlZmluZWRcbn1cbiJdfQ==
|
|
@@ -280,8 +280,8 @@ export type AuthorizationProps<AuthScopesT extends string = string> =
|
|
|
280
280
|
type: "IAM";
|
|
281
281
|
}
|
|
282
282
|
/**
|
|
283
|
-
* Creates a custom authorizer lambda which reads `Authorization: Bearer <token>` header
|
|
284
|
-
* verifies the token against a Cognito user pool.
|
|
283
|
+
* Creates a custom authorizer lambda which reads `Authorization: Bearer <access token>` header
|
|
284
|
+
* and verifies the token against a Cognito user pool.
|
|
285
285
|
*/
|
|
286
286
|
| ({
|
|
287
287
|
type: "COGNITO_USER_POOL";
|
|
@@ -295,8 +295,8 @@ export type AuthorizationProps<AuthScopesT extends string = string> =
|
|
|
295
295
|
} & BasicAuthAuthorizerProps)
|
|
296
296
|
/**
|
|
297
297
|
* Creates a custom authorizer lambda which allows both:
|
|
298
|
-
* - `Authorization: Bearer <token>` header, for which the token is checked against the
|
|
299
|
-
* Cognito user pool
|
|
298
|
+
* - `Authorization: Bearer <access token>` header, for which the token is checked against the
|
|
299
|
+
* given Cognito user pool
|
|
300
300
|
* - `Authorization: Basic <base64-encoded credentials>` header, for which the credentials are
|
|
301
301
|
* checked against the credentials from the given basic auth secret name
|
|
302
302
|
*
|
|
@@ -308,7 +308,7 @@ export type AuthorizationProps<AuthScopesT extends string = string> =
|
|
|
308
308
|
export type CognitoUserPoolAuthorizerProps<AuthScopesT extends string = string> = {
|
|
309
309
|
userPool: IUserPool;
|
|
310
310
|
/**
|
|
311
|
-
* Verifies that token claims contain the given scope.
|
|
311
|
+
* Verifies that access token claims contain the given scope.
|
|
312
312
|
*
|
|
313
313
|
* When defined as part of a resource server, scopes are on the format:
|
|
314
314
|
* `{resource server identifier}/{scope name}`, e.g. `external/view_users`.
|
|
@@ -400,8 +400,8 @@ export type CognitoUserPoolOrBasicAuthAuthorizerProps<AuthScopesT extends string
|
|
|
400
400
|
*/
|
|
401
401
|
basicAuthCredentialsSecretName?: string;
|
|
402
402
|
/**
|
|
403
|
-
* Verifies that token claims contain the given scope. Only applicable for
|
|
404
|
-
*
|
|
403
|
+
* Verifies that access token claims contain the given scope. Only applicable for requests that
|
|
404
|
+
* use `Authorization: Bearer <access token>` (not applicable for basic auth).
|
|
405
405
|
*
|
|
406
406
|
* When defined as part of a resource server, scopes are on the format:
|
|
407
407
|
* `{resource server identifier}/{scope name}`, e.g. `external/view_users`.
|
|
@@ -406,7 +406,7 @@ const authorizerFileExtension = __dirname.endsWith("src/api-gateway")
|
|
|
406
406
|
? "ts"
|
|
407
407
|
: "js";
|
|
408
408
|
/**
|
|
409
|
-
* Creates a custom authorizer lambda which reads `Authorization: Bearer <token>` header and
|
|
409
|
+
* Creates a custom authorizer lambda which reads `Authorization: Bearer <access token>` header and
|
|
410
410
|
* verifies the token against a Cognito user pool.
|
|
411
411
|
*/
|
|
412
412
|
class CognitoUserPoolAuthorizer extends constructs.Construct {
|
|
@@ -466,7 +466,7 @@ class BasicAuthAuthorizer extends constructs.Construct {
|
|
|
466
466
|
}
|
|
467
467
|
/**
|
|
468
468
|
* Creates a custom authorizer lambda which allows both:
|
|
469
|
-
* - `Authorization: Bearer <token>` header, for which the token is checked against the given
|
|
469
|
+
* - `Authorization: Bearer <access token>` header, for which the token is checked against the given
|
|
470
470
|
* Cognito user pool
|
|
471
471
|
* - `Authorization: Basic <base64-encoded credentials>` header, for which the credentials are
|
|
472
472
|
* checked against the credentials from the given basic auth secret name
|
|
@@ -520,7 +520,6 @@ const defaultAccessLogFormat = {
|
|
|
520
520
|
responseLength: "$context.responseLength",
|
|
521
521
|
responseLatency: "$context.responseLatency",
|
|
522
522
|
domainName: "$context.domainName",
|
|
523
|
-
// hostHeaderOverride: "$context.requestOverride.header.Host", //Mapping template overrides cannot be used with proxy integration endpoints, which lack data mappings https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-override-request-response-parameters.html#:~:text=Mapping%20template%20overrides%20cannot%20be%20used%20with%20proxy%20integration%20endpoints%2C%20which%20lack%20data%20mappings
|
|
524
523
|
error: {
|
|
525
524
|
type: "$context.error.responseType",
|
|
526
525
|
gatewayError: "$context.error.message",
|
|
@@ -539,13 +538,13 @@ const defaultAccessLogFormat = {
|
|
|
539
538
|
awsPrincipal: "$context.identity.caller",
|
|
540
539
|
awsPrincipalOrg: "$context.identity.principalOrgId",
|
|
541
540
|
},
|
|
542
|
-
basic: {
|
|
541
|
+
basic: { username: "$context.authorizer.username" },
|
|
542
|
+
cognito: { clientId: "$context.authorizer.clientId" },
|
|
543
543
|
},
|
|
544
544
|
awsEndpointRequest: {
|
|
545
545
|
id: "$context.awsEndpointRequestId",
|
|
546
546
|
id2: "$context.awsEndpointRequestId2",
|
|
547
547
|
},
|
|
548
|
-
// For datadog
|
|
549
548
|
message: "$context.identity.sourceIp - $context.httpMethod $context.domainName $context.path ($context.routeKey) - $context.status [$context.responseLatency ms]",
|
|
550
549
|
};
|
|
551
550
|
/**
|
|
@@ -586,4 +585,4 @@ function shortHash(str) {
|
|
|
586
585
|
// which is fine
|
|
587
586
|
return createHash("sha1").update(str).digest("hex").substring(0, 10);
|
|
588
587
|
}
|
|
589
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1hcGktZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGktZ2F0ZXdheS9odHRwLWFwaS1nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sYUFBYSxDQUFBO0FBR2xDLE9BQU8sS0FBSyxNQUFNLE1BQU0sd0JBQXdCLENBQUE7QUFFaEQsT0FBTyxLQUFLLEtBQUssTUFBTSw4QkFBOEIsQ0FBQTtBQUNyRCxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFBO0FBQzVDLE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUE7QUFDMUMsT0FBTyxLQUFLLGNBQWMsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUNoRSxPQUFPLEtBQUssWUFBWSxNQUFNLDJDQUEyQyxDQUFBO0FBQ3pFLE9BQU8sS0FBSyxXQUFXLE1BQU0sMENBQTBDLENBQUE7QUFFdkUsT0FBTyxLQUFLLFlBQVksTUFBTSwrQkFBK0IsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ25DLE9BQU8sS0FBSyxPQUFPLE1BQU0seUJBQXlCLENBQUE7QUFDbEQsT0FBTyxLQUFLLGNBQWMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNqRSxPQUFPLEtBQUssR0FBRyxNQUFNLG9DQUFvQyxDQUFBO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUE7QUFDNUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUVuQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FB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c0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB0eXBlICogYXMgZWxiIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiXG5pbXBvcnQgdHlwZSAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiXG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0IHR5cGUgKiBhcyBzcXMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zcXNcIlxuaW1wb3J0ICogYXMgYXBpZ3cgZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djJcIlxuaW1wb3J0ICogYXMgbG9ncyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIlxuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCJcbmltcG9ydCAqIGFzIHNlY3JldHNtYW5hZ2VyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIlxuaW1wb3J0ICogYXMgaW50ZWdyYXRpb25zIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyLWludGVncmF0aW9uc1wiXG5pbXBvcnQgKiBhcyBhdXRob3JpemVycyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2Mi1hdXRob3JpemVyc1wiXG5pbXBvcnQgdHlwZSB7IElVc2VyUG9vbCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY29nbml0b1wiXG5pbXBvcnQgKiBhcyBsYW1iZGFOb2RlanMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCJcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCJcbmltcG9ydCAqIGFzIHJvdXRlNTMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzXCJcbmltcG9ydCAqIGFzIHJvdXRlNTNUYXJnZXRzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1My10YXJnZXRzXCJcbmltcG9ydCAqIGFzIGFjbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiXG5pbXBvcnQgeyB0YWdSZXNvdXJjZXMgfSBmcm9tIFwiLi4vdGFnc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwidXJsXCJcblxuY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKVxuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpXG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSB7QGxpbmsgQXBpR2F0ZXdheX0gY29uc3RydWN0LlxuICpcbiAqIEBhdXRob3IgS3Jpc3RpYW4gUmVrc3RhZCA8a3JlQGNhcHJhY29uc3VsdGluZy5ubz5cbiAqIEBhdXRob3IgSGVybWFubiBNw7hya3JpZCA8aGVtQGxpZmxpZy5ubz5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpR2F0ZXdheVByb3BzPEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9IHtcbiAgLyoqIFNldHRpbmdzIGZvciB0aGUgZXh0ZXJuYWwtZmFjaW5nIHBhcnQgb2YgdGhlIEFQSS1HVy4gKi9cbiAgZG5zOiBBcGlHYXRld2F5RG5zUHJvcHNcblxuICAvKipcbiAgICogSWYgbm8gaW50ZWdyYXRpb24gaXMgc3BlY2lmaWVkIGZvciBhIHJvdXRlLCB0aGlzIGludGVncmF0aW9uIGlzIHVzZWQuXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgSW50ZWdyYXRpb25Qcm9wc30gZm9yIHRoZSBhdmFpbGFibGUgb3B0aW9ucy5cbiAgICovXG4gIGRlZmF1bHRJbnRlZ3JhdGlvbj86IEludGVncmF0aW9uUHJvcHNcblxuICAvKipcbiAgICogSWYgbm8gYXV0aG9yaXphdGlvbiBpcyBzcGVjaWZpZWQgZm9yIGEgcm91dGUsIHRoaXMgYXV0aG9yaXphdGlvbiBpcyB1c2VkLlxuICAgKlxuICAgKiBTZWUge0BsaW5rIEF1dGhvcml6YXRpb25Qcm9wc30gZm9yIHRoZSBhdmFpbGFibGUgb3B0aW9ucy5cbiAgICovXG4gIGRlZmF1bHRBdXRob3JpemF0aW9uPzogQXV0aG9yaXphdGlvblByb3BzPEF1dGhTY29wZXNUPlxuXG4gIHJvdXRlczogQXBpR2F0ZXdheVJvdXRlPEF1dGhTY29wZXNUPltdXG5cbiAgLyoqXG4gICAqIFRoZSBBUEktR1cgYWNjZXNzIGxvZ3MgZm9yIHRoZSBgJGRlZmF1bHRgIHN0YWdlIGFyZSBrZXB0LlxuICAgKiBUaGlzIGhhcyBvcHRpb25zIGZvciB0aGUgbG9ncy5cbiAgICovXG4gIGFjY2Vzc0xvZ3M/OiBBcGlHYXRld2F5QWNjZXNzTG9nc1Byb3BzXG5cbiAgLyoqXG4gICAqIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHJvdXRlLWxldmVsIG1ldHJpY3MuXG4gICAqIFRoaXMgY2FuIGluY3JlYXNlIENsb3VkV2F0Y2ggY29zdHMgd2hlbiBub3QgZGlzYWJsZWQuXG4gICAqXG4gICAqIFNlZSBbQVdTOiBXb3JraW5nIHdpdGggbWV0cmljcyBmb3IgSFRUUCBBUElzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktbWV0cmljcy5odG1sP2ljbXBpZD1hcGlnYXRld2F5X2NvbnNvbGVfaGVscCM6fjp0ZXh0PWFuZCUyMHN0YWdlJTIwSUQuLSxBcGlJZCUyQyUyMFN0YWdlJTJDJTIwUm91dGUsLUZpbHRlcnMlMjBBUEklMjBHYXRld2F5KVxuICAgKiBmb3IgbW9yZSBpbmZvLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBkZXRhaWxlZE1ldHJpY3M/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIFRocm90dGxpbmcgb2YgcmVxdWVzdHMuXG4gICAqIElmIG5vdCBzZXQsIHRoZSBBV1MgZGVmYXVsdCBvZiA1MDAwIGJ1cnN0IGFuZCAxMDAwMCByYXRlIGlzIHVzZWQuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IHRocm90dGxpbmcgaXMgcGVyLWFjY291bnQsIGFuZCBjb3VudHMgYWxsIEFQSXMgaW4gdGhlIGFjY291bnQgYW5kIHJlZ2lvbi5cbiAgICogSWYgeW91IGhhdmUgYW5vdGhlciBBUEkgaW4gdGhpcyByZWdpb24gZ2V0dGluZyAxMF8wMDAgcmVxdWVzdCByYXRlLCBpdCBtYXkgaW1wYWN0IHRoaXMgQVBJIGFzIHdlbGwuXG4gICAqL1xuICB0aHJvdHRsaW5nPzoge1xuICAgIC8qKlxuICAgICAqIEdvaW5nIG92ZXIgYDVfMDAwYCBtYXkgcmVxdWlyZSB5b3UgdG8gY29udGFjdCBBV1MgU3VwcG9ydCAtIHRoZXkgYXJlIGFjY291bnQgYm91bmQuXG4gICAgICovXG4gICAgYnVyc3Q/OiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBHb2luZyBvdmVyIGAxMF8wMDBgIG1heSByZXF1aXJlIHlvdSB0byBjb250YWN0IEFXUyBTdXBwb3J0IC0gdGhleSBhcmUgYWNjb3VudCBib3VuZC5cbiAgICAgKi9cbiAgICByYXRlPzogbnVtYmVyXG4gIH1cblxuICAvKipcbiAgICogU2V0cyBDT1JTIGhlYWRlcnMgb24gcmVzcG9uc2VzIGZyb20gdGhlIEFQSSBHYXRld2F5IHRvIGFsbG93IGFsbCBvcmlnaW5zLCBoZWFkZXJzIGFuZCBtZXRob2RzLlxuICAgKiBVc2VmdWwgaWYgeW91ciBBUEkgc2hvdWxkIGJlIGFjY2Vzc2VkIGJ5IGFueSBicm93c2VyLlxuICAgKi9cbiAgY29yc0FsbG93QWxsPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiBJZiBzb21lIHNldHRpbmdzIGluIHRoaXMgY29uc3RydWN0IGRvIG5vdCB3b3JrIGZvciB5b3UsIHRoaXMgaXMgYW4gZXNjYXBlIGhhdGNoIG1lY2hhbmlzbSB0b1xuICAgKiBvdmVycmlkZSBhbnl0aGluZy5cbiAgICovXG4gIHByb3BzT3ZlcnJpZGU/OiB7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgc2V0dGluZ3MgZm9yIHRoZSB7QGxpbmsgYXBpZ3cuSHR0cEFwaX0gKGFjY2Vzc2libGUgaW4ge0BsaW5rIEFwaUdhdGV3YXkuaHR0cEFwaX0pLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgZnJvbnRlbmQgYWNjZXNzaW5nIHRoaXMgQVBJLCB5b3UgbWlnaHQgd2FudCB0byBzZXRcbiAgICAgKiBbQ09SUyBwcmVmbGlnaHRdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jZGsvYXBpL3YxL2RvY3MvYXdzLWFwaWdhdGV3YXl2Mi1yZWFkbWUuaHRtbCNjcm9zcy1vcmlnaW4tcmVzb3VyY2Utc2hhcmluZy1jb3JzKVxuICAgICAqIHNldHRpbmdzLlxuICAgICAqL1xuICAgIGh0dHBBcGk/OiBQYXJ0aWFsPGFwaWd3Lkh0dHBBcGlQcm9wcz5cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBBcGlHYXRld2F5RG5zUHJvcHMgPSB7XG4gIC8qKlxuICAgKiBPbmx5IHRoZSBzdWJkb21haW4gcHJlZml4LCB3aGljaCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UuXG4gICAqIEV4YW1wbGU6IFN1YmRvbWFpbiBgcHJvZHVjdGAgd291bGQgZ2l2ZSB0aGUgZW5kIHJlc3VsdCBvZiBhbiBBUEktR1cgd2l0aFxuICAgKiBgcHJvZHVjdC5wbGF0Zm9ybS5leGFtcGxlLm5vYC5cbiAgICovXG4gIHN1YmRvbWFpbjogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEhvc3RlZCBab25lIGZvciB0aGUgZXh0ZXJuYWwgZmFjaW5nIGRvbWFpbi5cbiAgICogVGhpcyBpcyB3aGVyZSByb3V0ZXMgd2lsbCBiZSBjcmVhdGVkLCB0byByZWRpcmVjdCBjb25zdW1lcnMgdG8gdGhlIEFQSS1HVy5cbiAgICogRm9yIGV4YW1wbGUgYSBIWiBmb3IgYHBsYXRmb3JtLmV4YW1wbGUubm9gLlxuICAgKi9cbiAgaG9zdGVkWm9uZTogcm91dGU1My5JSG9zdGVkWm9uZVxuXG4gIC8qKlxuICAgKiBUaGUgVGltZSBUbyBMaXZlIChUVEwpIGZvciB0aGUgcHVibGljIEROUyBBIHJlY29yZCB0aGF0IHdpbGwgZXhwb3NlIHRoZSBBUEktR1cuXG4gICAqIFRoaXMgaXMgaG93IGxvbmcgRE5TIHNlcnZlcnMgd2lsbCBjYWNoZSB0aGUgcmVjb3JkLlxuICAgKlxuICAgKiBBIGxvbmcgVFRMIChob3VycykgaXMgYmVuZWZpY2lhbCB0byBETlMgc2VydmVycywgYnV0IG1ha2VzIGRldmVsb3BlcnMgKHlvdSkgd2FpdCBsb25nZXIgd2hlblxuICAgKiBkb2luZyBjaGFuZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCA1IG1pbnV0ZXNcbiAgICovXG4gIHR0bD86IGNkay5EdXJhdGlvblxufVxuXG5leHBvcnQgdHlwZSBBcGlHYXRld2F5Um91dGU8QXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xuICAvKiogVGhlIHBhdGggb2YgdGhlIHJvdXRlIHRvIGV4cG9zZSB0aHJvdWdoIHRoZSBBUEkgR2F0ZXdheS4gVXNlIFwiL1wiIGZvciB0aGUgcm9vdCByb3V0ZS4gKi9cbiAgcGF0aDogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQsIHdlIG9ubHkgZm9yd2FyZCByZXF1ZXN0cyB0aGF0IG1hdGNoIHRoZSByb3V0ZSdzIHBhdGggZXhhY3RseS4gU28gZm9yIGEgcm91dGUgd2l0aFxuICAgKiBwYXRoIGAvYXBpL3VzZXJzYCwgYSByZXF1ZXN0IHRvIGAvYXBpL3VzZXJzYCB3aWxsIGJlIGZvcndhcmRlZCwgYnV0IGEgcmVxdWVzdCB0b1xuICAgKiBgL2FwaS91c2Vycy9hZG1pbmAgd2lsbCBub3QuIElmIHlvdSB3YW50IHRvIGZvcndhcmQgcmVxdWVzdHMgdG8gYWxsIHN1Yi1wYXRocyB1bmRlciB0aGUgcm91dGUnc1xuICAgKiBwYXRoLCB5b3UgY2FuIHNldCB0aGlzIHRvIHRydWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBpbmNsdWRlU3VicGF0aHM/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIFRoZSBIVFRQIG1ldGhvZCB0byBleHBvc2UuIGBBTllgIGV4cG9zZXMgYWxsIEhUVFAgbWV0aG9kcyBvbiB0aGUgcGF0aC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJBTllcIlxuICAgKi9cbiAgbWV0aG9kPzogSHR0cE1ldGhvZFxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZWdyYXRpb24gdGhhdCB0aGUgcm91dGUgd2lsbCBmb3J3YXJkIHRvLiBTZWUge0BsaW5rIEludGVncmF0aW9uUHJvcHN9IGZvciB0aGUgYXZhaWxhYmxlXG4gICAqIG9wdGlvbnMuXG4gICAqXG4gICAqIElmIHVuZGVmaW5lZCwgdXNlcyB0aGUge0BsaW5rIEFwaUdhdGV3YXlQcm9wcy5kZWZhdWx0SW50ZWdyYXRpb259LlxuICAgKi9cbiAgaW50ZWdyYXRpb24/OiBJbnRlZ3JhdGlvblByb3BzXG5cbiAgLyoqXG4gICAqIEhvdyByZXF1ZXN0cyBvbiB0aGUgcm91dGUgYXJlIGF1dGhlbnRpY2F0ZWQuIFNlZSB7QGxpbmsgQXV0aG9yaXphdGlvblByb3BzfSBmb3IgdGhlIGF2YWlsYWJsZVxuICAgKiBvcHRpb25zLlxuICAgKlxuICAgKiBJZiB1bmRlZmluZWQsIHVzZXMgdGhlIHtAbGluayBBcGlHYXRld2F5UHJvcHMuZGVmYXVsdEF1dGhvcml6YXRpb259LlxuICAgKi9cbiAgYXV0aG9yaXphdGlvbj86IEF1dGhvcml6YXRpb25Qcm9wczxBdXRoU2NvcGVzVD5cbn1cblxuZXhwb3J0IHR5cGUgSHR0cE1ldGhvZCA9XG4gIHwgXCJBTllcIlxuICB8IFwiR0VUXCJcbiAgfCBcIlBPU1RcIlxuICB8IFwiUFVUXCJcbiAgfCBcIlBBVENIXCJcbiAgfCBcIkRFTEVURVwiXG4gIHwgXCJPUFRJT05TXCJcbiAgfCBcIkhFQURcIlxuXG5leHBvcnQgdHlwZSBJbnRlZ3JhdGlvblByb3BzID1cbiAgLyoqIFVzZSB0aGlzIHdoZW4gY29ubmVjdGluZyB0aGUgcm91dGUgdG8gYW4gQUxCIChBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VyKS4gKi9cbiAgfCAoeyB0eXBlOiBcIkFMQlwiIH0gJiBBbGJJbnRlZ3JhdGlvblByb3BzKVxuICAvKiogVXNlIHRoaXMgd2hlbiBjb25uZWN0aW5nIHJvdXRlIHRvIGEgTGFtYmRhLiAqL1xuICB8ICh7IHR5cGU6IFwiTGFtYmRhXCIgfSAmIExhbWJkYUludGVncmF0aW9uUHJvcHMpXG4gIC8qKiBVc2UgdGhpcyB3aGVuIGNvbm5lY3RpbmcgYSByb3V0ZSB0byBzZW5kIHRvIGFuIFNRUyBxdWV1ZS4gKi9cbiAgfCAoeyB0eXBlOiBcIlNRU1wiIH0gJiBTcXNJbnRlZ3JhdGlvblByb3BzKVxuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgQVBJLUdXIC0+IEFMQiAoQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlcikgaW50ZWdyYXRpb24uXG4gKlxuICogU2VlIHRoZSBub3RlIG9uIHtAbGluayBBcGlHYXRld2F5fSBhYm91dCB0aGUgbG9hZCBiYWxhbmNlciBzZWN1cml0eSBncm91cC5cbiAqL1xuZXhwb3J0IHR5cGUgQWxiSW50ZWdyYXRpb25Qcm9wcyA9IHtcbiAgLyoqXG4gICAqIEEgbGlzdGVuZXIgb24gZS5nLiBwb3J0IDQ0MyAoSFRUUFMpLlxuICAgKlxuICAgKiBTZWUgdGhlIG5vdGUgb24ge0BsaW5rIEFwaUdhdGV3YXl9IGFib3V0IHRoZSBsb2FkIGJhbGFuY2VyIHNlY3VyaXR5IGdyb3VwLlxuICAgKi9cbiAgbG9hZEJhbGFuY2VyTGlzdGVuZXI6IGVsYi5JQXBwbGljYXRpb25MaXN0ZW5lclxuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBuYW1lIChkb21haW4gbmFtZSkgb2YgdGhlIGJhY2tlbmQgc2VydmljZSB0aGF0IHdlIHdhbnQgdG8gcmVhY2ggdGhyb3VnaCB0aGUgQUxCLlxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWQgdG86XG4gICAqIC0gVmVyaWZ5IHRoZSBIVFRQUyBjZXJ0aWZpY2F0ZSBvZiB0aGUgYmFja2VuZCBzZXJ2aWNlLCBzbyB0aGF0IHRoZSByZXF1ZXN0IGZvcndhcmRlZCBmcm9tXG4gICAqICAgQVBJLUdXIGNhbiB1c2UgVExTXG4gICAqIC0gU2V0IHRoZSBgSG9zdGAgaGVhZGVyIG9uIHRoZSByZXF1ZXN0IHdoZW4gZm9yd2FyZGluZyB0byB0aGUgQUxCLCBzbyB0aGF0IHJlcXVlc3RzIGNhbiBiZVxuICAgKiAgIHJvdXRlZCB0byB0aGUgY29ycmVjdCBUYXJnZXQgR3JvdXBcbiAgICpcbiAgICogRXhhbXBsZSB2YWx1ZTogYDxzZXJ2aWNlPi5zdGFnaW5nLm15LXByb2plY3QubGlmbGlnLmlvYCAobm90IHByZWZpeGVkIGJ5IGBodHRwczovL2ApLlxuICAgKi9cbiAgaG9zdE5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBUaGUgVlBDIHVzZWQgYnkgdGhlIEFMQi4gVGhlIEFQSS1HVyBpbnRlZ3JhdGlvbiB3aWxsIGNvbm5lY3QgdG8gdGhlIEFMQiB1c2luZyBhIFZQQyBMaW5rIGZvclxuICAgKiB0aGlzIFZQQy5cbiAgICpcbiAgICogU2VlIHRoZSBub3RlIG9uIHtAbGluayBBcGlHYXRld2F5fSBhYm91dCB0aGUgbG9hZCBiYWxhbmNlciBzZWN1cml0eSBncm91cC5cbiAgICovXG4gIHZwYzogZWMyLklWcGNcblxuICAvKipcbiAgICogQSBzZWN1cml0eSBncm91cCAoU0cpIHRoYXQgYWxsb3dzIGluY29taW5nIHRyYWZmaWMgdG8gdGhlIEFMQi4gV2lsbCBiZSB1c2VkIGJ5IHRoZSBWUEMgbGluaywgc29cbiAgICogdGhlIEFQSS1HVyBpbnRlZ3JhdGlvbiBjYW4gY29ubmVjdC5cbiAgICpcbiAgICogVGhpcyBpcyB1c3VhbGx5IHRoZSBzYW1lIFNHIGFzIHRoZSBBTEIgdXNlcywgYmVjYXVzZSB0aGV5IGhhdmUgYSBydWxlIHRoYXQgYWxsb3dzIHRyYWZmaWMgZnJvbVxuICAgKiBvdGhlcnMgaW4gdGhlIHNhbWUgU0cuXG4gICAqXG4gICAqIFNlZSB0aGUgbm90ZSBvbiB7QGxpbmsgQXBpR2F0ZXdheX0gYWJvdXQgdGhlIGxvYWQgYmFsYW5jZXIgc2VjdXJpdHkgZ3JvdXAuXG4gICAqL1xuICBzZWN1cml0eUdyb3VwOiBlYzIuSVNlY3VyaXR5R3JvdXBcblxuICAvKipcbiAgICogTWFwIHJlcXVlc3QgcGFyYW1ldGVycyAoYWRkL292ZXJ3cml0ZSBwYXRoL2hlYWRlcnMvcXVlcnkgcGFyYW1zKSBiZWZvcmUgZm9yd2FyZGluZyB0byB0aGVcbiAgICogYmFja2VuZC5cbiAgICpcbiAgICogU2VlIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktcGFyYW1ldGVyLW1hcHBpbmcuaHRtbH1cbiAgICogZm9yIG1vcmUgb24gdGhpcy4gUmVhZCB0aGUgJ1Jlc2VydmVkIGhlYWRlcnMnIHNlY3Rpb24gZm9yIHdoaWNoIGhlYWRlcnMgY2Fubm90IGJlIG92ZXJyaWRkZW4uXG4gICAqIEluIGFkZGl0aW9uIHRvIHRoZSBBV1MtcmVzZXJ2ZWQgaGVhZGVycywgeW91IHNob3VsZCBub3Qgb3ZlcnJpZGUgdGhlICdIb3N0JyBoZWFkZXIgZWl0aGVyLCBhc1xuICAgKiB0aGF0J3MgdXNlZCBmb3Igcm91dGluZyB0aGUgcmVxdWVzdCB0byB0aGUgY29ycmVjdCBzZXJ2aWNlIGJlaGluZCB0aGUgbG9hZCBiYWxhbmNlci5cbiAgICpcbiAgICogIyMjIEV4YW1wbGU6XG4gICAqXG4gICAqIEFkZGluZyBhIGhlYWRlcjpcbiAgICogYGBgXG4gICAqIG1hcFBhcmFtZXRlcnM6IChwYXJhbWV0ZXJzKSA9PiBwYXJhbWV0ZXJzLm92ZXJ3cml0ZUhlYWRlcihcbiAgICogICAgXCJYLU15LUN1c3RvbS1IZWFkZXJcIixcbiAgICogICAgYXBpZ3cuTWFwcGluZ1ZhbHVlLmN1c3RvbShcIm15LWN1c3RvbS12YWx1ZVwiKSxcbiAgICogKVxuICAgKiBgYGBcbiAgICpcbiAgICogT3ZlcndyaXRpbmcgdGhlIHBhdGggKGlmLCBmb3IgZXhhbXBsZSwgeW91IGNvbmZpZ3VyZSBhIGAvdXNlcnNgIHJvdXRlIG9uIHRoZSBBUEkgR2F0ZXdheSB0aGF0XG4gICAqIHlvdSB3YW50IHRvIGZvcndhcmQgdG8gYC9hcGkvdXNlcnNgIG9uIHRoZSBiYWNrZW5kKTpcbiAgICogYGBgXG4gICAqIG1hcFBhcmFtZXRlcnM6IChwYXJhbWV0ZXJzKSA9PiBwYXJhbWV0ZXJzLm92ZXJ3cml0ZVBhdGgoXCIvYXBpL3VzZXJzXCIpXG4gICAqIGBgYFxuICAgKi9cbiAgbWFwUGFyYW1ldGVycz86IChwYXJhbWV0ZXJzOiBhcGlndy5QYXJhbWV0ZXJNYXBwaW5nKSA9PiB2b2lkXG59XG5cbmV4cG9ydCB0eXBlIExhbWJkYUludGVncmF0aW9uUHJvcHMgPSB7XG4gIC8qKlxuICAgKiBUaGUgTGFtYmRhIGludGVncmF0aW9uIHVzZXMgdGhlIFYyIHBheWxvYWQgZm9ybWF0OlxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWRldmVsb3AtaW50ZWdyYXRpb25zLWxhbWJkYS5odG1sfVxuICAgKlxuICAgKiBJZiB3cml0aW5nIHRoZSBMYW1iZGEgaW4gVHlwZVNjcmlwdCwgdGhpcyBtZWFucyB5b3Ugc2hvdWxkIHVzZSBgQVBJR2F0ZXdheVByb3h5RXZlbnRWMmAgYXMgdGhlXG4gICAqIHJlcXVlc3QgdHlwZSwgYW5kIGBBUElHYXRld2F5UHJveHlSZXN1bHRWMmAgYXMgdGhlIHJlc3BvbnNlIHR5cGUuXG4gICAqL1xuICBsYW1iZGE6IGxhbWJkYS5JRnVuY3Rpb25cbn1cblxuZXhwb3J0IHR5cGUgU3FzSW50ZWdyYXRpb25Qcm9wcyA9IHtcbiAgcXVldWU6IHNxcy5JUXVldWVcblxuICAvKipcbiAgICogTWVzc2FnZSBhdHRyaWJ1dGVzIHRvIHBhc3Mgb24gdG8gU1FTLiBUaGUga2V5cyBpbiB0aGlzIG9iamVjdCBhcmUgdGhlIG5hbWVzIG9mIHRoZSBhdHRyaWJ1dGVzLlxuICAgKiBFYWNoIGF0dHJpYnV0ZSBoYXMgYSBEYXRhVHlwZSBmaWVsZCwgYW5kIGVpdGhlciBhIFN0cmluZ1ZhbHVlIG9yIEJpbmFyeVZhbHVlIGZpZWxkIGRlcGVuZGluZyBvblxuICAgKiBpdHMgdHlwZS4gU2VlIEFXUyBkb2NzOlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTU2ltcGxlUXVldWVTZXJ2aWNlL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX01lc3NhZ2VBdHRyaWJ1dGVWYWx1ZS5odG1sXG4gICAqXG4gICAqIEluIHRoZSBTdHJpbmdWYWx1ZSBmaWVsZCwgeW91IGNhbiBkbyBBUEkgR2F0ZXdheSBwYXJhbWV0ZXIgbWFwcGluZzpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLXBhcmFtZXRlci1tYXBwaW5nLmh0bWxcbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogYGBgXG4gICAqIG1lc3NhZ2VBdHRyaWJ1dGVzOiB7XG4gICAqICAgY2xpZW50SWQ6IHtcbiAgICogICAgIERhdGFUeXBlOiBcIlN0cmluZ1wiLFxuICAgKiAgICAgU3RyaW5nVmFsdWU6IFwiJHtjb250ZXh0LmF1dGhvcml6ZXIuY2xpZW50SWR9XCIsXG4gICAqICAgfSxcbiAgICogfSxcbiAgICogYGBgXG4gICAqL1xuICBtZXNzYWdlQXR0cmlidXRlcz86IHtcbiAgICBbYXR0cmlidXRlTmFtZTogc3RyaW5nXTpcbiAgICAgIHwgeyBEYXRhVHlwZTogXCJTdHJpbmdcIiB8IFwiTnVtYmVyXCI7IFN0cmluZ1ZhbHVlOiBzdHJpbmcgfVxuICAgICAgfCB7XG4gICAgICAgICAgRGF0YVR5cGU6IFwiQmluYXJ5XCJcbiAgICAgICAgICAvKiogQmFzZTY0LWVuY29kZWQgYmluYXJ5IGRhdGEgb2JqZWN0LiAqL1xuICAgICAgICAgIEJpbmFyeVZhbHVlOiBzdHJpbmdcbiAgICAgICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIEF1dGhvcml6YXRpb25Qcm9wczxBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPVxuICAvKipcbiAgICogTm8gYXV0aGVudGljYXRpb24sIGZvciB3aGVuIHlvdSB3YW50IGEgZnVsbHkgcHVibGljIHJvdXRlIChvciBoYW5kbGUgYXV0aGVudGljYXRpb24gaW4gdGhlXG4gICAqIGJhY2tlbmQgaW50ZWdyYXRpb24pLlxuICAgKi9cbiAgfCB7IHR5cGU6IFwiTk9ORVwiIH1cbiAgLyoqXG4gICAqIEFXUyBJQU0gYXV0aG9yaXphdGlvbi5cbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWFjY2Vzcy1jb250cm9sLWlhbS5odG1sXG4gICAqL1xuICB8IHsgdHlwZTogXCJJQU1cIiB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY3VzdG9tIGF1dGhvcml6ZXIgbGFtYmRhIHdoaWNoIHJlYWRzIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPHRva2VuPmAgaGVhZGVyIGFuZFxuICAgKiB2ZXJpZmllcyB0aGUgdG9rZW4gYWdhaW5zdCBhIENvZ25pdG8gdXNlciBwb29sLlxuICAgKi9cbiAgfCAoe1xuICAgICAgdHlwZTogXCJDT0dOSVRPX1VTRVJfUE9PTFwiXG4gICAgfSAmIENvZ25pdG9Vc2VyUG9vbEF1dGhvcml6ZXJQcm9wczxBdXRoU2NvcGVzVD4pXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY3VzdG9tIGF1dGhvcml6ZXIgbGFtYmRhIHdoaWNoIHJlYWRzIGBBdXRob3JpemF0aW9uOiBCYXNpYyA8YmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM+YFxuICAgKiBoZWFkZXIgYW5kIHZlcmlmaWVzIHRoZSBjcmVkZW50aWFscyBhZ2FpbnN0IGEgZ2l2ZW4gc2VjcmV0LlxuICAgKi9cbiAgfCAoeyB0eXBlOiBcIkJBU0lDX0FVVEhcIiB9ICYgQmFzaWNBdXRoQXV0aG9yaXplclByb3BzKVxuICAvKipcbiAgICogQ3JlYXRlcyBhIGN1c3RvbSBhdXRob3JpemVyIGxhbWJkYSB3aGljaCBhbGxvd3MgYm90aDpcbiAgICogLSBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDx0b2tlbj5gIGhlYWRlciwgZm9yIHdoaWNoIHRoZSB0b2tlbiBpcyBjaGVja2VkIGFnYWluc3QgdGhlIGdpdmVuXG4gICAqICAgQ29nbml0byB1c2VyIHBvb2xcbiAgICogLSBgQXV0aG9yaXphdGlvbjogQmFzaWMgPGJhc2U2NC1lbmNvZGVkIGNyZWRlbnRpYWxzPmAgaGVhZGVyLCBmb3Igd2hpY2ggdGhlIGNyZWRlbnRpYWxzIGFyZVxuICAgKiAgIGNoZWNrZWQgYWdhaW5zdCB0aGUgY3JlZGVudGlhbHMgZnJvbSB0aGUgZ2l2ZW4gYmFzaWMgYXV0aCBzZWNyZXQgbmFtZVxuICAgKlxuICAgKiBJZiBlaXRoZXIgb2YgdGhlc2UgYXJlIGdpdmVuIGFuZCB2YWxpZCwgdGhlIHJlcXVlc3QgaXMgYXV0aGVudGljYXRlZC5cbiAgICovXG4gIHwgKHtcbiAgICAgIHR5cGU6IFwiQ09HTklUT19VU0VSX1BPT0xfT1JfQkFTSUNfQVVUSFwiXG4gICAgfSAmIENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplclByb3BzPEF1dGhTY29wZXNUPilcblxuZXhwb3J0IHR5cGUgQ29nbml0b1VzZXJQb29sQXV0aG9yaXplclByb3BzPFxuICBBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4gPSB7XG4gIHVzZXJQb29sOiBJVXNlclBvb2xcblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0b2tlbiBjbGFpbXMgY29udGFpbiB0aGUgZ2l2ZW4gc2NvcGUuXG4gICAqXG4gICAqIFdoZW4gZGVmaW5lZCBhcyBwYXJ0IG9mIGEgcmVzb3VyY2Ugc2VydmVyLCBzY29wZXMgYXJlIG9uIHRoZSBmb3JtYXQ6XG4gICAqIGB7cmVzb3VyY2Ugc2VydmVyIGlkZW50aWZpZXJ9L3tzY29wZSBuYW1lfWAsIGUuZy4gYGV4dGVybmFsL3ZpZXdfdXNlcnNgLlxuICAgKlxuICAgKiBUbyBnZXQgbW9yZSB0eXBlIHNhZmV0eSBvbiB0aGlzIHBhcmFtZXRlciwgc2VlIHRoZSBkb2NzIGZvciB0aGUgYEF1dGhTY29wZXNUYCB0eXBlIHBhcmFtZXRlciBvblxuICAgKiB7QGxpbmsgQXBpR2F0ZXdheX0uXG4gICAqL1xuICByZXF1aXJlZFNjb3BlPzogQXV0aFNjb3Blc1RcblxuICAvKipcbiAgICogTmFtZSBvZiBzZWNyZXQgaW4gQVdTIFNlY3JldHMgTWFuYWdlciB0aGF0IHN0b3JlcyBiYXNpYyBhdXRoIGNyZWRlbnRpYWxzIGZvciB0aGUgYmFja2VuZFxuICAgKiBzZXJ2aWNlLCB0byBiZSBmb3J3YXJkZWQgdG8gdGhlIGJhY2tlbmQgaWYgQ29nbml0byB1c2VyIHBvb2wgYXV0aGVudGljYXRpb24gc3VjY2VlZGVkLlxuICAgKlxuICAgKiBUaGUgc2VjcmV0IHZhbHVlIG11c3QgZm9sbG93IHRoaXMgZm9ybWF0OlxuICAgKiBgYGBqc29uXG4gICAqIHsgXCJ1c2VybmFtZVwiOiBcIjx1c2VybmFtZT5cIiwgXCJwYXNzd29yZFwiOiBcIjxwYXNzd29yZD5cIiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBUaGlzIHByb3Agc29sdmVzIHRoZSBmb2xsb3dpbmcgdXNlLWNhc2U6XG4gICAqIC0gWW91IHdhbnQgdG8gZG8gQ29nbml0byB1c2VyIHBvb2wgYXV0aGVudGljYXRpb24gaW4gdGhlIEFQSSBHYXRld2F5XG4gICAqIC0gWW91IHdhbnQgYW4gYWRkaXRpb25hbCBhdXRoIGNoZWNrIGluIHRoZSBiYWNrZW5kLCBidXQgeW91IGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoIENvZ25pdG9cbiAgICogICB0aGVyZVxuICAgKiAtIFRoZSBiYWNrZW5kIHVzZXMgYmFzaWMgYXV0aFxuICAgKlxuICAgKiBUaGlzIHByb3Agc29sdmVzIHRoaXMgYnkgbGV0dGluZyB5b3Ugc3BlY2lmeSBjcmVkZW50aWFscyB0byBwYXNzIHRvIHRoZSBiYWNrZW5kIGFmdGVyIEFQSS1HV1xuICAgKiBhdXRoZW50aWNhdGlvbiBzdWNjZWVkcy4gWW91IGNhbiBwYXNzIHRoZSBlbmNvZGVkIGNyZWRlbnRpYWxzIHRocm91Z2hcbiAgICoge0BsaW5rIEFsYkludGVncmF0aW9uUHJvcHMubWFwUGFyYW1ldGVyc30sIHVzaW5nIHRoZSBgYXV0aG9yaXplci5pbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXJgXG4gICAqIGNvbnRleHQgdmFyaWFibGUsIGxpa2Ugc286XG4gICAqIGBgYFxuICAgKiBtYXBQYXJhbWV0ZXJzOiAocGFyYW1ldGVycykgPT4gcGFyYW1ldGVycy5vdmVyd3JpdGVIZWFkZXIoXG4gICAqICAgLy8gJ0F1dGhvcml6YXRpb24nIGhlYWRlciBjYW5ub3QgYmUgb3ZlcnJpZGRlbiwgc28gd2UgdXNlIGEgY3VzdG9tIGhlYWRlclxuICAgKiAgIFwiWC1JbnRlcm5hbC1BdXRob3JpemF0aW9uXCIsXG4gICAqICAgYXBpZ3cuTWFwcGluZ1ZhbHVlLmNvbnRleHRWYXJpYWJsZShcImF1dGhvcml6ZXIuaW50ZXJuYWxBdXRob3JpemF0aW9uSGVhZGVyXCIpLFxuICAgKiApXG4gICAqIGBgYFxuICAgKiBUaGUgYmFja2VuZCBjYW4gdGhlbiBjaGVjayB0aGUgYFgtSW50ZXJuYWwtQXV0aG9yaXphdGlvbmAgaGVhZGVyLlxuICAgKi9cbiAgY3JlZGVudGlhbHNGb3JJbnRlcm5hbEF1dGhvcml6YXRpb24/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgQmFzaWNBdXRoQXV0aG9yaXplclByb3BzID0ge1xuICAvKipcbiAgICogTmFtZSBvZiBzZWNyZXQgaW4gQVdTIFNlY3JldHMgTWFuYWdlciB0aGF0IHN0b3JlcyBiYXNpYyBhdXRoIGNyZWRlbnRpYWxzLiBUaGUgc2VjcmV0IHZhbHVlXG4gICAqIHNob3VsZCBmb2xsb3cgdGhpcyBmb3JtYXQ6XG4gICAqIGBgYGpzb25cbiAgICogeyBcInVzZXJuYW1lXCI6IFwiPHVzZXJuYW1lPlwiLCBcInBhc3N3b3JkXCI6IFwiPHBhc3N3b3JkPlwiIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZm9ybWF0IGlzIGFsc28gc3VwcG9ydGVkOlxuICAgKiBgYGBqc29uXG4gICAqIHsgXCJjcmVkZW50aWFsc1wiOiBcIltcXFwiPGVuY29kZWQtY3JlZGVudGlhbC0xPlxcXCIsXFxcIjxlbmNvZGVkLWNyZWRlbnRpYWwtMj5cXFwiXVwiIH1cbiAgICogYGBgXG4gICAqIC4uLmNvbnNpc3Rpbmcgb2Y6XG4gICAqIC0gQSBzaW5nbGUga2V5LCBgY3JlZGVudGlhbHNgXG4gICAqIC0gV2l0aCBhIF9zdHJpbmdfIHZhbHVlXG4gICAqIC0gV2hpY2ggaXMgYSBzdHJpbmdpZmllZCwgZXNjYXBlZCBKU09OIGFycmF5IG9mIGJhc2U2NC1lbmNvZGVkIGNyZWRlbnRpYWxzXG4gICAqIC0gSW4gd2hpY2ggZWFjaCBlbGVtZW50IGlzIGVuY29kZWQgZnJvbSBgPHVzZXJuYW1lPjo8cGFzc3dvcmQ+YFxuICAgKlxuICAgKiBJZiB0aGUgc2VjcmV0IGlzIG9uIHRoaXMgZm9ybWF0LCB0aGUgYXV0aG9yaXplciB3aWxsIG1hdGNoIHRoZSByZXF1ZXN0J3MgQXV0aG9yaXphdGlvbiBoZWFkZXJcbiAgICogYWdhaW5zdCBhbnkgb25lIG9mIHRoZXNlIGVuY29kZWQgY3JlZGVudGlhbHMuXG4gICAqXG4gICAqIFRoZSByZWFzb24gdGhhdCB0aGlzIHNlY29uZCBmb3JtYXQgc3RvcmVzIHN0cmluZ2lmaWVkIEpTT04gX2luc2lkZV8gSlNPTiwgaXMgZHVlIHRvIGFcbiAgICogbGltaXRhdGlvbiBpbiBMaWZsaWcncyBgbG9hZC1zZWNyZXRzYCBsaWJyYXJ5LCB3aGljaCBvbmx5IGFsbG93cyBzdG9yaW5nIHN0cmluZ3MgdmFsdWVzLlxuICAgKi9cbiAgY3JlZGVudGlhbHNTZWNyZXROYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgQ29nbml0b1VzZXJQb29sT3JCYXNpY0F1dGhBdXRob3JpemVyUHJvcHM8XG4gIEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiA9IHtcbiAgdXNlclBvb2w6IElVc2VyUG9vbFxuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHNlY3JldCBpbiBBV1MgU2VjcmV0cyBNYW5hZ2VyIHRoYXQgc3RvcmVzIGJhc2ljIGF1dGggY3JlZGVudGlhbHMuIFRoZSBzZWNyZXQgdmFsdWVcbiAgICogc2hvdWxkIGZvbGxvdyB0aGlzIGZvcm1hdDpcbiAgICogYGBganNvblxuICAgKiB7IFwidXNlcm5hbWVcIjogXCI8dXNlcm5hbWU+XCIsIFwicGFzc3dvcmRcIjogXCI8cGFzc3dvcmQ+XCIgfVxuICAgKiBgYGBcbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBmb3JtYXQgaXMgYWxzbyBzdXBwb3J0ZWQ6XG4gICAqIGBgYGpzb25cbiAgICogeyBcImNyZWRlbnRpYWxzXCI6IFwiW1xcXCI8ZW5jb2RlZC1jcmVkZW50aWFsLTE+XFxcIixcXFwiPGVuY29kZWQtY3JlZGVudGlhbC0yPlxcXCJdXCIgfVxuICAgKiBgYGBcbiAgICogLi4uY29uc2lzdGluZyBvZjpcbiAgICogLSBBIHNpbmdsZSBrZXksIGBjcmVkZW50aWFsc2BcbiAgICogLSBXaXRoIGEgX3N0cmluZ18gdmFsdWVcbiAgICogLSBXaGljaCBpcyBhIHN0cmluZ2lmaWVkLCBlc2NhcGVkIEpTT04gYXJyYXkgb2YgYmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHNcbiAgICogLSBJbiB3aGljaCBlYWNoIGVsZW1lbnQgaXMgZW5jb2RlZCBmcm9tIGA8dXNlcm5hbWU+OjxwYXNzd29yZD5gXG4gICAqXG4gICAqIElmIHRoZSBzZWNyZXQgaXMgb24gdGhpcyBmb3JtYXQsIHRoZSBhdXRob3JpemVyIHdpbGwgbWF0Y2ggdGhlIHJlcXVlc3QncyBBdXRob3JpemF0aW9uIGhlYWRlclxuICAgKiBhZ2FpbnN0IGFueSBvbmUgb2YgdGhlc2UgZW5jb2RlZCBjcmVkZW50aWFscy5cbiAgICpcbiAgICogVGhlIHJlYXNvbiB0aGF0IHRoaXMgc2Vjb25kIGZvcm1hdCBzdG9yZXMgc3RyaW5naWZpZWQgSlNPTiBfaW5zaWRlXyBKU09OLCBpcyBkdWUgdG8gYVxuICAgKiBsaW1pdGF0aW9uIGluIExpZmxpZydzIGBsb2FkLXNlY3JldHNgIGxpYnJhcnksIHdoaWNoIG9ubHkgYWxsb3dzIHN0b3Jpbmcgc3RyaW5ncyB2YWx1ZXMuXG4gICAqL1xuICBiYXNpY0F1dGhDcmVkZW50aWFsc1NlY3JldE5hbWU/OiBzdHJpbmdcblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0b2tlbiBjbGFpbXMgY29udGFpbiB0aGUgZ2l2ZW4gc2NvcGUuIE9ubHkgYXBwbGljYWJsZSBmb3IgYEJlYXJlcmAgdG9rZW4gcmVxdWVzdHNcbiAgICogY2hlY2tlZCBhZ2FpbnN0IHRoZSBDb2duaXRvIFVzZXIgUG9vbCAobm90IGFwcGxpY2FibGUgZm9yIGJhc2ljIGF1dGgpLlxuICAgKlxuICAgKiBXaGVuIGRlZmluZWQgYXMgcGFydCBvZiBhIHJlc291cmNlIHNlcnZlciwgc2NvcGVzIGFyZSBvbiB0aGUgZm9ybWF0OlxuICAgKiBge3Jlc291cmNlIHNlcnZlciBpZGVudGlmaWVyfS97c2NvcGUgbmFtZX1gLCBlLmcuIGBleHRlcm5hbC92aWV3X3VzZXJzYC5cbiAgICpcbiAgICogVG8gZ2V0IG1vcmUgdHlwZSBzYWZldHkgb24gdGhpcyBwYXJhbWV0ZXIsIHNlZSB0aGUgZG9jcyBmb3IgdGhlIGBBdXRoU2NvcGVzVGAgdHlwZSBwYXJhbWV0ZXIgb25cbiAgICoge0BsaW5rIEFwaUdhdGV3YXl9LlxuICAgKi9cbiAgcmVxdWlyZWRTY29wZT86IEF1dGhTY29wZXNUXG59XG5cbmV4cG9ydCB0eXBlIEFwaUdhdGV3YXlBY2Nlc3NMb2dzUHJvcHMgPSB7XG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGFjY2VzcyBsb2dzIGlmIHRoaXMgY29uc3RydWN0IGlzIGRlbGV0ZWQ/XG4gICAqXG4gICAqIE1heWJlIHlvdSB3YW50IHRvIERFU1RST1kgaW5zdGVhZC4gT3IgZm9yIGxlZ2FsIHJlYXNvbnMsIHJldGFpbiBmb3IgYXVkaXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlbW92YWxQb2xpY3kuUkVUQUlOXG4gICAqL1xuICByZW1vdmFsUG9saWN5PzogY2RrLlJlbW92YWxQb2xpY3lcblxuICAvKipcbiAgICogSG93IGxvbmcgdG8ga2VlcCB0aGUgbG9ncy4gSWYgdW5kZWZpbmVkLCB1c2VzIHRoZSBzYW1lIGRlZmF1bHQgYXMgbmV3IEFXUyBsb2cgZ3JvdXBzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZXRlbnRpb25EYXlzLlRXT19ZRUFSU1xuICAgKi9cbiAgcmV0ZW50aW9uPzogbG9ncy5SZXRlbnRpb25EYXlzXG5cbiAgLyoqXG4gICAqIEEgY3VzdG9tIEpTT04gbG9nIGZvcm1hdCwgd2hpY2ggdXNlcyB2YXJpYWJsZXMgZnJvbSBgXCIkY29udGV4dFwiYC5cbiAgICpcbiAgICogU2VlIFtBV1M6IENsb3VkV2F0Y2ggbG9nIGZvcm1hdHMgZm9yIEFQSSBHYXRld2F5XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc2V0LXVwLWxvZ2dpbmcuaHRtbCNhcGlnYXRld2F5LWNsb3Vkd2F0Y2gtbG9nLWZvcm1hdHMpXG4gICAqIGZvciBmb3JtYXRzIGFuZCBydWxlcy4gSXQgaXMgcG9zc2libGUgdG8gdXNlIG90aGVyIGZvcm1hdHMgbGlrZSBDTEYgYW5kIFhNTCwgYnV0IHRoaXMgY29uc3RydWN0XG4gICAqIG9ubHkgc3VwcG9ydHMgSlNPTiBmb3Igbm93LlxuICAgKlxuICAgKiBGb3IgYSBsaXN0IG9mIGFsbCBwb3NzaWJsZSB2YXJpYWJsZXMgdG8gbG9nLCBzZWVcbiAgICogW0FXUzogJGNvbnRleHQgVmFyaWFibGVzIGZvciBkYXRhIG1vZGVscywgYXV0aG9yaXplcnMsIG1hcHBpbmcgdGVtcGxhdGVzLCBhbmQgQ2xvdWRXYXRjaCBhY2Nlc3MgbG9nZ2luZ10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2FwaS1nYXRld2F5LW1hcHBpbmctdGVtcGxhdGUtcmVmZXJlbmNlLmh0bWwjY29udGV4dC12YXJpYWJsZS1yZWZlcmVuY2UpXG4gICAqIGFuZFxuICAgKiBbQVdTOiAkY29udGV4dCBWYXJpYWJsZXMgZm9yIGFjY2VzcyBsb2dnaW5nIG9ubHldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9hcGktZ2F0ZXdheS1tYXBwaW5nLXRlbXBsYXRlLXJlZmVyZW5jZS5odG1sI2NvbnRleHQtdmFyaWFibGUtcmVmZXJlbmNlLWFjY2Vzcy1sb2dnaW5nLW9ubHkpIC5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIGRlZmF1bHRBY2Nlc3NMb2dGb3JtYXR9XG4gICAqL1xuICBhY2Nlc3NMb2dGb3JtYXQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG59XG5cbi8qKlxuICogVGhpcyBjb25zdHJ1Y3QgdHJpZXMgdG8gc2ltcGxpZnkgdGhlIGNyZWF0aW9uIG9mIGFuIEFQSSBHYXRld2F5IGZvciBhIHNlcnZpY2UsIGJ5IGNvbGxlY3RpbmcgbW9zdFxuICogb2YgdGhlIGNvbW1vbiBzZXR1cCBoZXJlLlxuICpcbiAqIFRoZSBhcHByb2FjaCBmb2xsb3dlZCBpbiB0aGlzIGNvbnN0cnVjdCBpczpcbiAqIDEuIE9uZSBBUEktR1cgcGVyIHNlcnZpY2VcbiAqIDIuIE9uZSBzdWJkb21haW4gcGVyIEFQSS1HVyAvIHNlcnZpY2VcbiAqIDMuIFVzZSBIVFRQIEFQSSwgbm90IFJFU1RcbiAqIDQuIFVzZSBhICRkZWZhdWx0IHN0YWdlIHdpdGggYXV0b2RlcGxveVxuICogNS4gU3VwcG9ydCBtdWx0aXBsZSByb3V0ZXMgKHdpdGggcG9zc2libGUgYC97cHJveHkrfWAgdG8gbGV0IGFsbCBzdWItcGF0aHMgdGhyb3VnaClcbiAqIDYuIEFsbG93IGN1c3RvbSBpbnRlZ3JhdGlvbi9hdXRob3JpemVyIGZvciBlYWNoIHJvdXRlLCBvciBkZWZhdWx0cyBmb3IgdGhlIHdob2xlIGdhdGV3YXlcbiAqXG4gKiBUaGUgcm91dGUgaW50ZWdyYXRpb24gaXMgb25lIG9mIHRoZXNlOlxuICogLSBBTEIgcHJpdmF0ZSBpbnRlZ3JhdGlvbiB3aXRoIFZQQyBMaW5rIHVzaW5nIEhUVFBTIHRvIHRoZSBBTEJcbiAqIC0gTGFtYmRhIGludGVncmF0aW9uXG4gKiAtIFNRUyBpbnRlZ3JhdGlvblxuICpcbiAqICMjIyBMb2FkIEJhbGFuY2VyIFNlY3VyaXR5IEdyb3VwXG4gKlxuICogTm90ZSB0aGF0IHRoZSBsb2FkIGJhbGFuY2VyIHVzZWQgaW4gYW4ge0BsaW5rIEFsYkludGVncmF0aW9uUHJvcHN9IG11c3QgYWxsb3cgb3V0Ym91bmQgSFRUUFNcbiAqIHRyYWZmaWMgdG8gaXRzIFNlY3VyaXR5R3JvdXAuIE90aGVyd2lzZSwgdGhlIFZQQyBMaW5rIHVzZWQgYnkgdGhlIEFQSS1HVyBjYW4ndCBnZXQgdHJhZmZpYyBmcm9tXG4gKiB0aGUgQUxCLlxuICpcbiAqIGBgYFxuICogY29uc3QgbG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cCA9IG5ldyBlYzIuU2VjdXJpdHlHcm91cCguLi4sIHtcbiAqICAgYWxsb3dBbGxPdXRib3VuZDogZmFsc2UsXG4gKiB9KVxuICpcbiAqIGxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAuYWRkRWdyZXNzUnVsZShcbiAqICAgbG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cCxcbiAqICAgZWMyLlBvcnQudGNwKDQ0MyksXG4gKiAgIFwiT3V0Ym91bmQgdG8gc2VsZiBmb3IgQUxCIHRvIEFQSS1HVyBWUEMtTGlua1wiLFxuICogKVxuICpcbiAqIGNvbnN0IGxvYWRCYWxhbmNlciA9IG5ldyBsaWZsaWdMb2FkQmFsYW5jZXIuTG9hZEJhbGFuY2VyKC4uLixcbiAqICAge1xuICogICAgIG92ZXJyaWRlTG9hZEJhbGFuY2VyUHJvcHM6IHtcbiAqICAgICAgIHNlY3VyaXR5R3JvdXA6IGxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAsXG4gKiAgICAgfSxcbiAqICAgfSxcbiAqIClcbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBBdXRoU2NvcGVzVCBUaGlzIHR5cGUgcGFyYW1ldGVyIGFsbG93cyB5b3UgdG8gaW1wcm92ZSB0eXBlIHNhZmV0eSBvbiB0aGVcbiAqIGByZXF1aXJlZFNjb3BlYCBmaWVsZCBvbiB7QGxpbmsgQ29nbml0b1VzZXJQb29sT3JCYXNpY0F1dGhBdXRob3JpemVyUHJvcHN9LCBieSBuYXJyb3dpbmcgdGhlIHR5cGVcbiAqIHRvIHNwZWNpZmljIHN0cmluZ3MuIFlvdSBjYW4gdGhlbiBleHRlbmQgdGhlIGBBcGlHYXRld2F5YCB3aXRoIHRoaXMgdHlwZSB0byBlbmZvcmNlIHRob3NlIHNjb3Blc1xuICogYWNyb3NzIHRoZSBhcHBsaWNhdGlvbi4gUmVtZW1iZXIgdGhhdCBhdXRoIHNjb3BlcyBtdXN0IGJlIG9uIHRoZSBmb3JtYXRcbiAqIGB7cmVzb3VyY2Ugc2VydmVyIGlkZW50aWZpZXJ9L3tzY29wZSBuYW1lfWAuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYFxuICogdHlwZSBBdXRoU2NvcGVzID0gXCJleHRlcm5hbC9yZWFkX3VzZXJzXCIgfCBcImludGVybmFsL2NyZWF0ZV91c2Vyc1wiXG4gKlxuICogZXhwb3J0IGNsYXNzIE15UHJvamVjdEFwaUdhdGV3YXkgZXh0ZW5kcyBBcGlHYXRld2F5PEF1dGhTY29wZXM+IHt9XG4gKiBgYGBcbiAqIFR5cGVTY3JpcHQgd2lsbCB0aGVuIGVuZm9yY2UgdGhhdCBgcmVxdWlyZWRTY29wZWAgaXMgb25lIG9mIGBBdXRoU2NvcGVzYCwgYW5kIHByb3ZpZGVcbiAqIGF1dG8tY29tcGxldGUuXG4gKlxuICogQGF1dGhvciBLcmlzdGlhbiBSZWtzdGFkIDxrcmVAY2FwcmFjb25zdWx0aW5nLm5vPlxuICogQGF1dGhvciBIZXJtYW5uIE3DuHJrcmlkIDxoZW1AbGlmbGlnLm5vPlxuICovXG5leHBvcnQgY2xhc3MgQXBpR2F0ZXdheTxcbiAgQXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+IGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICAvKiogVGhlIEFQSSBHYXRld2F5IEhUVFAgQVBJLiBUaGlzIGlzIHRoZSBtYWluIGNvbnN0cnVjdCBmb3IgQVBJLUdXLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaHR0cEFwaTogYXBpZ3cuSHR0cEFwaVxuXG4gIC8qKiBUaGUgcm91dGVzIHdoaWNoIGNvbm5lY3QgdGhlIHtAbGluayBodHRwQXBpfSB0byB0aGUgYmFja2VuZCBpbnRlZ3JhdGlvbihzKS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvdXRlczogYXBpZ3cuSHR0cFJvdXRlW10gPSBbXVxuXG4gIC8qKiBUaGUgZG9tYWluIHdoaWNoIGNvbnN1bWVycyBtdXN0IHVzZS4qL1xuICBwdWJsaWMgcmVhZG9ubHkgZG9tYWluOiBzdHJpbmdcblxuICAvKiogQWNjZXNzIGxvZyBncm91cC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ0dyb3VwOiBsb2dzLkxvZ0dyb3VwXG5cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogQXBpR2F0ZXdheVByb3BzPEF1dGhTY29wZXNUPlxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBBcGlHYXRld2F5UHJvcHM8QXV0aFNjb3Blc1Q+LFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG5cbiAgICBBcGlHYXRld2F5LnZhbGlkYXRlUHJvcHMocHJvcHMsIGlkLCBjZGsuU3RhY2sub2YodGhpcykpXG5cbiAgICBjb25zdCBjdXN0b21Eb21haW4gPSBuZXcgQ3VzdG9tRG9tYWluKHRoaXMsIFwiQ3VzdG9tRG9tYWluXCIsIHByb3BzLmRucylcbiAgICB0aGlzLmRvbWFpbiA9IGN1c3RvbURvbWFpbi5jdXN0b21Eb21haW5OYW1lXG5cbiAgICBsZXQgY29yc09wdGlvbnM6IGFwaWd3LkNvcnNQcmVmbGlnaHRPcHRpb25zIHwgdW5kZWZpbmVkXG4gICAgaWYgKHByb3BzLmNvcnNBbGxvd0FsbCkge1xuICAgICAgY29yc09wdGlvbnMgPSB7XG4gICAgICAgIGFsbG93T3JpZ2luczogW1wiKlwiXSxcbiAgICAgICAgLy8gXCJUaGUgQXV0aG9yaXphdGlvbiBoZWFkZXIgY2FuJ3QgYmUgd2lsZGNhcmRlZCBhbmQgYWx3YXlzIG5lZWRzIHRvIGJlIGxpc3RlZCBleHBsaWNpdGx5XCJcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnNcbiAgICAgICAgLy8gQ29udGVudC1UeXBlIG1heSBhbHNvIHJlcXVpcmUgZXhwbGljaXQgd2hpdGVsaXN0aW5nOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNjM1Njc2NDdcbiAgICAgICAgYWxsb3dIZWFkZXJzOiBbXCJBdXRob3JpemF0aW9uXCIsIFwiQ29udGVudC1UeXBlXCIsIFwiKlwiXSxcbiAgICAgICAgLy8gTm90IHVzaW5nICcqJyBoZXJlLCBiZWNhdXNlIFwiSW4gcmVxdWVzdHMgd2l0aCBjcmVkZW50aWFscywgaXQgaXMgdHJlYXRlZCBhcyB0aGUgbGl0ZXJhbFxuICAgICAgICAvLyBtZXRob2QgbmFtZSAnKicgd2l0aG91dCBzcGVjaWFsIHNlbWFudGljc1wiXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvSGVhZGVycy9BY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzXG4gICAgICAgIGFsbG93TWV0aG9kczogW1xuICAgICAgICAgIGFwaWd3LkNvcnNIdHRwTWV0aG9kLkdFVCxcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5QT1NULFxuICAgICAgICAgIGFwaWd3LkNvcnNIdHRwTWV0aG9kLlBVVCxcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5QQVRDSCxcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5ERUxFVEUsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuT1BUSU9OUyxcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5IRUFELFxuICAgICAgICBdLFxuICAgICAgICBtYXhBZ2U6IGNkay5EdXJhdGlvbi5kYXlzKDEpLFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBhY3R1YWwgQVBJLiBUaGlzIGhvbGRzIHRoZSByb3V0ZXMsIGF1dGhvcml6ZXJzIGFuZCBpbnRlZ3JhdGlvbnMuXG4gICAgY29uc3QgYXBpID0gbmV3IGFwaWd3Lkh0dHBBcGkodGhpcywgXCJIdHRwQXBpLVwiICsgcHJvcHMuZG5zLnN1YmRvbWFpbiwge1xuICAgICAgLy8gZGVmYXVsdEludGVncmF0aW9uOiBkZWZhdWx0SW50ZWdyYXRpb24sIC8vIFRoaXMgaXMgZm9yIGEgY2F0Y2gtYWxsICRkZWZhdWx0IHJvdXRlXG4gICAgICBkZXNjcmlwdGlvbjogYEFuIEhUVFAgQVBJIGZvciAke3Byb3BzLmRucy5zdWJkb21haW59LiR7cHJvcHMuZG5zLmhvc3RlZFpvbmUuem9uZU5hbWV9LmAsXG4gICAgICBkaXNhYmxlRXhlY3V0ZUFwaUVuZHBvaW50OiB0cnVlLCAvLyBGb3JjZSBleHRlcm5hbHMgdG8gZ28gdGhyb3VnaCBjdXN0b20gZG9tYWluLiBNVVNUIGJlIHRydWUgd2hlbiB1c2luZyBNdXR1YWwgVExTLCBmb3Igc2VjdXJpdHkgcmVhc29uc1xuICAgICAgY3JlYXRlRGVmYXVsdFN0YWdlOiB0cnVlLFxuICAgICAgZGVmYXVsdERvbWFpbk1hcHBpbmc6IHsgZG9tYWluTmFtZTogY3VzdG9tRG9tYWluLmFwaUd3Q3VzdG9tRG9tYWluIH0sXG4gICAgICBjb3JzUHJlZmxpZ2h0OiBjb3JzT3B0aW9ucyxcbiAgICAgIC4uLnByb3BzPy5wcm9wc092ZXJyaWRlPy5odHRwQXBpLFxuICAgIH0pXG4gICAgdGhpcy5odHRwQXBpID0gYXBpXG5cbiAgICBjb25zdCBzdGFnZSA9IGFwaS5kZWZhdWx0U3RhZ2U/Lm5vZGUuZGVmYXVsdENoaWxkIGFzIGFwaWd3LkNmblN0YWdlXG5cbiAgICBjb25zdCBsb2dzID0gbmV3IEFwaUdhdGV3YXlBY2Nlc3NMb2dzKFxuICAgICAgdGhpcyxcbiAgICAgIFwiQWNjZXNzTG9nc1wiLFxuICAgICAgc3RhZ2UsXG4gICAgICBwcm9wcy5hY2Nlc3NMb2dzLFxuICAgICAgZGVmYXVsdEFjY2Vzc0xvZ0Zvcm1hdCxcbiAgICApXG4gICAgdGhpcy5sb2dHcm91cCA9IGxvZ3MubG9nR3JvdXBcblxuICAgIHN0YWdlLmRlZmF1bHRSb3V0ZVNldHRpbmdzID0ge1xuICAgICAgLi4uc3RhZ2UuZGVmYXVsdFJvdXRlU2V0dGluZ3MsXG4gICAgICBkZXRhaWxlZE1ldHJpY3NFbmFibGVkOiBwcm9wcy5kZXRhaWxlZE1ldHJpY3MgPz8gdHJ1ZSxcbiAgICAgIHRocm90dGxpbmdCdXJzdExpbWl0OiBwcm9wcy50aHJvdHRsaW5nPy5idXJzdCwgLy8gRGVmYXVsdCBmb3IgYWNjb3VudCBpcyA1XzAwMFxuICAgICAgdGhyb3R0bGluZ1JhdGVMaW1pdDogcHJvcHMudGhyb3R0bGluZz8ucmF0ZSwgLy8gRGVmYXVsdCBmb3IgYWNjb3VudCBpcyAxMF8wMDBcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0SW50ZWdyYXRpb24gPSBwcm9wcy5kZWZhdWx0SW50ZWdyYXRpb25cbiAgICAgID8gdGhpcy5jcmVhdGVJbnRlZ3JhdGlvbihwcm9wcy5kZWZhdWx0SW50ZWdyYXRpb24sIHByb3BzLmRucylcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBkZWZhdWx0QXV0aG9yaXplciA9IHByb3BzLmRlZmF1bHRBdXRob3JpemF0aW9uXG4gICAgICA/IHRoaXMuY3JlYXRlQXV0aG9yaXplcihcIkRlZmF1bHRBdXRob3JpemVyXCIsIHByb3BzLmRlZmF1bHRBdXRob3JpemF0aW9uKVxuICAgICAgOiB1bmRlZmluZWRcblxuICAgIGZvciAoY29uc3Qgcm91dGUgb2YgcHJvcHMucm91dGVzKSB7XG4gICAgICBsZXQgaW50ZWdyYXRpb246IGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uXG4gICAgICBpZiAocm91dGUuaW50ZWdyYXRpb24pIHtcbiAgICAgICAgaW50ZWdyYXRpb24gPSB0aGlzLmNyZWF0ZUludGVncmF0aW9uKHJvdXRlLmludGVncmF0aW9uLCBwcm9wcy5kbnMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnRlZ3JhdGlvbiA9IGRlZmF1bHRJbnRlZ3JhdGlvbiEgLy8gVmVyaWZpZWQgaW4gdmFsaWRhdGVQcm9wc1xuICAgICAgfVxuXG4gICAgICBsZXQgYXV0aG9yaXplcjogYXBpZ3cuSUh0dHBSb3V0ZUF1dGhvcml6ZXIgfCB1bmRlZmluZWRcbiAgICAgIGlmIChyb3V0ZS5hdXRob3JpemF0aW9uKSB7XG4gICAgICAgIGF1dGhvcml6ZXIgPSB0aGlzLmNyZWF0ZUF1dGhvcml6ZXIoXG4gICAgICAgICAgLy8gVXNpbmcgdGhlIHJvdXRlIHBhdGggaGVyZSBjYXVzZWQgQ2xvdWRGb3JtYXRpb24gdG8gZmFpbCBkdWUgdG8gcmVzb3VyY2UgbmFtZXMgYmVpbmcgdG9vXG4gICAgICAgICAgLy8gbG9uZy4gVGhlcmVmb3JlLCB3ZSBub3cgaGFzaCB0aGUgcm91dGUgcGF0aCB0byBnZXQgYSBzaG9ydGVyIG5hbWUuXG4gICAgICAgICAgYFJvdXRlQXV0aG9yaXplciR7c2hvcnRIYXNoKGAke3JvdXRlLm1ldGhvZCA/PyBcIlwifSR7cm91dGUucGF0aH1gKX1gLFxuICAgICAgICAgIHJvdXRlLmF1dGhvcml6YXRpb24sXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF1dGhvcml6ZXIgPSBkZWZhdWx0QXV0aG9yaXplclxuICAgICAgfVxuXG4gICAgICBjb25zdCByb3V0ZVBhdGhzID0gW3JvdXRlLnBhdGhdXG4gICAgICBpZiAocm91dGUuaW5jbHVkZVN1YnBhdGhzID09PSB0cnVlKSB7XG4gICAgICAgIC8vIElmIHdlIGluY2x1ZGUgc3ViLXBhdGhzLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCByb3V0ZSB3aXRoIC97cHJveHkrfSAodGhlICsgbWVhbnMgaXQgd2lsbFxuICAgICAgICAvLyBtYXRjaCBhbGwgc3Vicm91dGVzKS4gV2Ugd2FudCBib3RoIHRoaXMgcm91dGUgYW5kIHRoZSBub3JtYWwgcm91dGUgd2l0aG91dCAve3Byb3h5K30sXG4gICAgICAgIC8vIHNpbmNlIC97cHJveHkrfSB3aWxsIG9ubHkgbWF0Y2ggdGhlIGJhc2UgcGF0aCB3aXRoIHRyYWlsaW5nIHNsYXNoLlxuICAgICAgICByb3V0ZVBhdGhzLnB1c2goXG4gICAgICAgICAgcm91dGUucGF0aCArIChyb3V0ZS5wYXRoID09PSBcIi9cIiA/IFwiXCIgOiBcIi9cIikgKyBcIntwcm94eSt9XCIsXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCByb3V0ZVBhdGggb2Ygcm91dGVQYXRocykge1xuICAgICAgICAvLyBUaGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgQVBJIEdhdGV3YXkgY29uc3RydWN0IGhhZCBhIHNpbmdsZSByb3V0ZSB3aXRoIHRoZSBJRFxuICAgICAgICAvLyAnRGVmYXVsdFByb3h5Um91dGUnLCBhbmQgYWxsIGdhdGV3YXlzIHdlIHVzZWQgZXhwb3NlZCB0aGUgcm91dGUgL3twcm94eSt9LiBXaGVuIHRyeWluZyB0b1xuICAgICAgICAvLyBjaGFuZ2UgdG8gdGhpcyBuZXcgdmVyc2lvbiBvZiB0aGUgY29uc3RydWN0LCBkZXBsb3ltZW50IGZhaWxlZCBmb3IgZ2F0ZXdheXMgZXhwb3NpbmdcbiAgICAgICAgLy8gL3twcm94eSt9LCBiZWNhdXNlIFwiYSByb3V0ZSB3aXRoIHRoYXQga2V5IFtpLmUuIHBhdGggKyBtZXRob2RdIGFscmVhZHkgZXhpc3RzXCIuIFdlIHRoaW5rXG4gICAgICAgIC8vIHRoaXMgbWF5IGJlIGJlY2F1c2Ugd2UgdXNlZCB0aGUgc2FtZSByb3V0ZSBwYXRoLCBidXQgd2l0aCBhIG5ldyByb3V0ZSBJRCwgY2F1c2luZ1xuICAgICAgICAvLyBjb25mdXNpb24gZm9yIENsb3VkRm9ybWF0aW9uLiBTbyB3ZSBrZWVwIHRoZSBvbGQgcm91dGUgSUQgaGVyZSBmb3IgL3twcm94eSt9LlxuICAgICAgICBjb25zdCByb3V0ZUlkID1cbiAgICAgICAgICByb3V0ZVBhdGggPT09IFwiL3twcm94eSt9XCIgPyBcIkRlZmF1bHRQcm94eVJvdXRlXCIgOiBgUm91dGUtJHtyb3V0ZVBhdGh9YFxuXG4gICAgICAgIHRoaXMucm91dGVzLnB1c2goXG4gICAgICAgICAgbmV3IGFwaWd3Lkh0dHBSb3V0ZSh0aGlzLCByb3V0ZUlkLCB7XG4gICAgICAgICAgICBodHRwQXBpOiBhcGksXG4gICAgICAgICAgICBpbnRlZ3JhdGlvbjogaW50ZWdyYXRpb24sXG4gICAgICAgICAgICBhdXRob3JpemVyOiBhdXRob3JpemVyLFxuICAgICAgICAgICAgcm91dGVLZXk6IGFwaWd3Lkh0dHBSb3V0ZUtleS53aXRoKFxuICAgICAgICAgICAgICByb3V0ZVBhdGgsXG4gICAgICAgICAgICAgIHJvdXRlLm1ldGhvZFxuICAgICAgICAgICAgICAgID8gYXBpZ3cuSHR0cE1ldGhvZFtyb3V0ZS5tZXRob2RdXG4gICAgICAgICAgICAgICAgOiBhcGlndy5IdHRwTWV0aG9kLkFOWSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YWdSZXNvdXJjZXModGhpcywgKCkgPT4gKHsgc2VydmljZTogcHJvcHMuZG5zLnN1YmRvbWFpbiB9KSlcbiAgfVxuXG4gIC8qKiBAdGhyb3dzIEVycm9yICovXG4gIHByaXZhdGUgc3RhdGljIHZhbGlkYXRlUHJvcHMoXG4gICAgcHJvcHM6IEFwaUdhdGV3YXlQcm9wcyxcbiAgICBpZDogc3RyaW5nLFxuICAgIHN0YWNrOiBjZGsuU3RhY2ssXG4gICkge1xuICAgIGZvciAoY29uc3Qgcm91dGUgb2YgcHJvcHMucm91dGVzKSB7XG4gICAgICBpZiAoIXJvdXRlLmludGVncmF0aW9uICYmICFwcm9wcy5kZWZhdWx0SW50ZWdyYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBObyBpbnRlZ3JhdGlvbiBkZWZpbmVkIGZvciByb3V0ZSAnJHtyb3V0ZS5wYXRofScsIGFuZCBubyBkZWZhdWx0IGludGVncmF0aW9uIHNwZWNpZmllZCBmb3IgdGhlIGdhdGV3YXlgLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAoIXJvdXRlLmF1dGhvcml6YXRpb24gJiYgIXByb3BzLmRlZmF1bHRBdXRob3JpemF0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm8gYXV0aG9yaXphdGlvbiBkZWZpbmVkIGZvciByb3V0ZSAnJHtyb3V0ZS5wYXRofScsIGFuZCBubyBkZWZhdWx0IGF1dGhvcml6YXRpb24gc3BlY2lmaWVkIGZvciB0aGUgZ2F0ZXdheWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmICghcm91dGUucGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgcGF0aCAnJHtyb3V0ZS5wYXRofSc6IHBhdGhzIG11c3QgYmVnaW4gd2l0aCAnLycgKHVzZSAnLycgZm9yIHJvb3QgcGF0aClgLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAocm91dGUucGF0aCAhPT0gXCIvXCIgJiYgcm91dGUucGF0aC5lbmRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHBhdGggJyR7cm91dGUucGF0aH0nOiBwYXRocyBjYW5ub3QgZW5kIHdpdGggJy8nIChleGNlcHQgcm9vdCBwYXRoKWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgcm91dGUuaW50ZWdyYXRpb24/LnR5cGUgPT09IFwiQUxCXCIgJiZcbiAgICAgICAgcm91dGUuaW50ZWdyYXRpb24uaG9zdE5hbWUuc3RhcnRzV2l0aChcImh0dHBzOlwiKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIGFsYkludGVncmF0aW9uLmhvc3RIdHRwc05hbWUgc2hvdWxkIG5vdCBpbmNsdWRlIGEgcHJvdG9jb2w6ICR7cm91dGUuaW50ZWdyYXRpb24uaG9zdE5hbWV9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJvcHMuZG5zLnN1YmRvbWFpbiA9PT0gXCJcIiB8fCBwcm9wcy5kbnMuc3ViZG9tYWluLmluY2x1ZGVzKFwiIFwiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU3ViZG9tYWluIG11c3QgYmUgc2V0LCBhbmQgbm90IGNvbnRhaW4gc3BhY2VzOiAke3Byb3BzLmRucy5zdWJkb21haW59YCxcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKHByb3BzLnRocm90dGxpbmc/LmJ1cnN0ICYmIHByb3BzLnRocm90dGxpbmcuYnVyc3QgPiA1XzAwMCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBg4pqg77iPIFlvdXIgdGhyb3R0bGluZyBidXJzdCBsaW1pdCAnJHtwcm9wcy50aHJvdHRsaW5nLmJ1cnN0fScgaXMgaGlnaGVyIHRoYW4gdGhlIEFXUyBBY2NvdW50IGxpbWl0LiBNYWtlIHN1cmUgeW91ciBhY2NvdW50IGhhcyB1cGdyYWRlZCB0aGlzIHF1b3RhISBgLFxuICAgICAgICBzdGFjayxcbiAgICAgICAgaWQsXG4gICAgICApXG4gICAgfVxuICAgIGlmIChwcm9wcy50aHJvdHRsaW5nPy5yYXRlICYmIHByb3BzLnRocm90dGxpbmcucmF0ZSA+IDEwXzAwMCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBg4pqg77iPIFlvdXIgdGhyb3R0bGluZyByYXRlIGxpbWl0ICcke3Byb3BzLnRocm90dGxpbmcucmF0ZX0nIGlzIGhpZ2hlciB0aGFuIHRoZSBBV1MgQWNjb3VudCBsaW1pdC4gTWFrZSBzdXJlIHlvdXIgYWNjb3VudCBoYXMgdXBncmFkZWQgdGhpcyBxdW90YSEgYCxcbiAgICAgICAgc3RhY2ssXG4gICAgICAgIGlkLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXV0aG9yaXplciBvbmx5IGFjY2VwdHMgcmVxdWVzdHMgZnJvbSBleHRlcm5hbCB1c2VycyB0aGF0IGFyZSBhdXRob3JpemVkLlxuICAgKiBVbmF1dGhvcml6ZWQgdXNlcnMgYXJlIHN0b3BwZWQgaW4gdGhlIEFQSS1HVywgYW5kIG5vdCBmb3J3YXJkZWQgdG8gdGhlIGludGVncmF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVBdXRob3JpemVyPEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nPihcbiAgICBpZDogc3RyaW5nLFxuICAgIGF1dGhvcml6YXRpb246IEF1dGhvcml6YXRpb25Qcm9wczxBdXRoU2NvcGVzVD4sXG4gICk6IGFwaWd3LklIdHRwUm91dGVBdXRob3JpemVyIHwgdW5kZWZpbmVkIHtcbiAgICBzd2l0Y2ggKGF1dGhvcml6YXRpb24udHlwZSkge1xuICAgICAgY2FzZSBcIk5PTkVcIjoge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgICBjYXNlIFwiSUFNXCI6IHtcbiAgICAgICAgLy8gQVBJIEdhdGV3YXkgaW52b2tlcyB5b3VyIEFQSSByb3V0ZSBvbmx5IGlmIHRoZSBjbGllbnQgaGFzIGV4ZWN1dGUtYXBpIHBlcm1pc3Npb24gZm9yIHRoZSByb3V0ZS5cbiAgICAgICAgLy8gVGhlIGNsaWVudCBoYXMgdG8gdXNlIEFXUyBTaWdWNCB0byBpZGVudGlmeSB0aGVtc2VsdmVzIGluIHRoZSByZXF1ZXN0LlxuICAgICAgICAvLyBSZWFkIHRoaXMgcGFnZSBmb3IgaGVscCB3aXRoIElBTSBhbmQgQVBJLUdXIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZWN1cml0eV9pYW1fc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAgICAgIC8vIE5vdGUgdGhhdCBbcmVzb3VyY2UgcG9saWNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0IGZvciBIVFRQXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktYWNjZXNzLWNvbnRyb2wtaWFtLmh0bWwpXG4gICAgICAgIHJldHVybiBuZXcgYXV0aG9yaXplcnMuSHR0cElhbUF1dGhvcml6ZXIoKVxuICAgICAgfVxuICAgICAgY2FzZSBcIkNPR05JVE9fVVNFUl9QT09MXCI6IHtcbiAgICAgICAgLy8gV2UgdXNlIGEgY3VzdG9tIGxhbWJkYSBhdXRob3JpemVyIGhlcmUgaW5zdGVhZCBvZiB0aGUgYEh0dHBVc2VyUG9vbEF1dGhvcml6ZXJgIHByb3ZpZGVkXG4gICAgICAgIC8vIGJ5IENESywgaW4gb3JkZXIgdG8gc3VwcG9ydCBgcmVxdWlyZWRTY29wZWAgYW5kIHNldHRpbmcgb2YgY3VzdG9tIGNvbnRleHQgdmFyaWFibGVzLlxuICAgICAgICBjb25zdCBhdXRob3JpemVyID0gbmV3IENvZ25pdG9Vc2VyUG9vbEF1dGhvcml6ZXIoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBpZCArIFwiTGFtYmRhXCIsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbixcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiBuZXcgYXV0aG9yaXplcnMuSHR0cExhbWJkYUF1dGhvcml6ZXIoaWQsIGF1dGhvcml6ZXIubGFtYmRhLCB7XG4gICAgICAgICAgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplci5yZXNwb25zZVR5cGVzLFxuICAgICAgICAgIC8vIE1heCAxaCwgb3IgZGlzYWJsZWQgKDBzKS4gVGhlIHZhbHVlIG9ubHkgbWF0dGVycyB3aGVuIGludmFsaWRhdGluZy9keW5hbWljIGNyZWRlbnRpYWxzXG4gICAgICAgICAgcmVzdWx0c0NhY2hlVHRsOiBjZGsuRHVyYXRpb24uaG91cnMoMSksXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjYXNlIFwiQkFTSUNfQVVUSFwiOiB7XG4gICAgICAgIGNvbnN0IGF1dGhvcml6ZXIgPSBuZXcgQmFzaWNBdXRoQXV0aG9yaXplcihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGlkICsgXCJMYW1iZGFcIixcbiAgICAgICAgICBhdXRob3JpemF0aW9uLFxuICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIG5ldyBhdXRob3JpemVycy5IdHRwTGFtYmRhQXV0aG9yaXplcihpZCwgYXV0aG9yaXplci5sYW1iZGEsIHtcbiAgICAgICAgICByZXNwb25zZVR5cGVzOiBhdXRob3JpemVyLnJlc3BvbnNlVHlwZXMsXG4gICAgICAgICAgLy8gTWF4IDFoLCBvciBkaXNhYmxlZCAoMHMpLiBUaGUgdmFsdWUgb25seSBtYXR0ZXJzIHdoZW4gaW52YWxpZGF0aW5nL2R5bmFtaWMgY3JlZGVudGlhbHNcbiAgICAgICAgICByZXN1bHRzQ2FjaGVUdGw6IGNkay5EdXJhdGlvbi5taW51dGVzKDMwKSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJDT0dOSVRPX1VTRVJfUE9PTF9PUl9CQVNJQ19BVVRIXCI6IHtcbiAgICAgICAgY29uc3QgYXV0aG9yaXplciA9IG5ldyBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXIoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBpZCArIFwiTGFtYmRhXCIsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbixcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiBuZXcgYXV0aG9yaXplcnMuSHR0cExhbWJkYUF1dGhvcml6ZXIoaWQsIGF1dGhvcml6ZXIubGFtYmRhLCB7XG4gICAgICAgICAgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplci5yZXNwb25zZVR5cGVzLFxuICAgICAgICAgIC8vIE1heCAxaCwgb3IgZGlzYWJsZWQgKDBzKS4gVGhlIHZhbHVlIG9ubHkgbWF0dGVycyB3aGVuIGludmFsaWRhdGluZy9keW5hbWljIGNyZWRlbnRpYWxzXG4gICAgICAgICAgcmVzdWx0c0NhY2hlVHRsOiBjZGsuRHVyYXRpb24uaG91cnMoMSksXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVJbnRlZ3JhdGlvbihcbiAgICBpbnRlZ3JhdGlvbjogSW50ZWdyYXRpb25Qcm9wcyxcbiAgICBkbnM6IEFwaUdhdGV3YXlQcm9wc1tcImRuc1wiXSxcbiAgKTogYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb24ge1xuICAgIHN3aXRjaCAoaW50ZWdyYXRpb24udHlwZSkge1xuICAgICAgY2FzZSBcIkFMQlwiOiB7XG4gICAgICAgIC8vIFRoZSBWUENMaW5rIGNvbm5lY3RzIHRoZSBpbnRlZ3JhdGlvbiBpbnRvIHRoZSBBTEIncyBWUEMuIE11c3QgYmUgbWFudWFsbHkgY3JlYXRlZCB3aGVuXG4gICAgICAgIC8vIHRoZSBWUEMgaXMgaW1wb3J0ZWQsIHdoaWNoIGlzIHRoZSBjYXNlIHdoZW4gdXNpbmcgQ29yZVBsYXRmb3JtQ29uc3VtZXIuXG4gICAgICAgIGNvbnN0IHZwY0xpbmsgPSBuZXcgYXBpZ3cuVnBjTGluayh0aGlzLCBcIkFsYlZwY0xpbmtcIiwge1xuICAgICAgICAgIHZwYzogaW50ZWdyYXRpb24udnBjLFxuICAgICAgICAgIHNlY3VyaXR5R3JvdXBzOiBbaW50ZWdyYXRpb24uc2VjdXJpdHlHcm91cF0sXG4gICAgICAgICAgc3VibmV0czogaW50ZWdyYXRpb24udnBjLnNlbGVjdFN1Ym5ldHMoKSwgLy8gVGhpcyBjb3JyZWN0bHkgc2VsZWN0cyB0aGUgcHJpdmF0ZSBzdWJuZXRzXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgcGFyYW1ldGVyTWFwcGluZyA9IG5ldyBhcGlndy5QYXJhbWV0ZXJNYXBwaW5nKClcbiAgICAgICAgICAvKiogU2VlIHtAbGluayBBbGJJbnRlZ3JhdGlvblByb3BzLmhvc3ROYW1lfSAqL1xuICAgICAgICAgIC5vdmVyd3JpdGVIZWFkZXIoXG4gICAgICAgICAgICBcIkhvc3RcIixcbiAgICAgICAgICAgIC8vIFRoZSBIb3N0IGhlYWRlciBjYW4gTk9UIHVzZSBkeW5hbWljIG1hcHBpbmcsIGxpa2UgJGNvbnRleHQuZG9tYWluTmFtZSBldGMuXG4gICAgICAgICAgICBhcGlndy5NYXBwaW5nVmFsdWUuY3VzdG9tKGludGVncmF0aW9uLmhvc3ROYW1lKSxcbiAgICAgICAgICApXG4gICAgICAgIGlmIChpbnRlZ3JhdGlvbi5tYXBQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpbnRlZ3JhdGlvbi5tYXBQYXJhbWV0ZXJzKHBhcmFtZXRlck1hcHBpbmcpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IGludGVncmF0aW9ucy5IdHRwQWxiSW50ZWdyYXRpb24oXG4gICAgICAgICAgXCJBbGJJbnRlZ3JhdGlvbi1cIiArIGRucy5zdWJkb21haW4sXG4gICAgICAgICAgaW50ZWdyYXRpb24ubG9hZEJhbGFuY2VyTGlzdGVuZXIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2VjdXJlU2VydmVyTmFtZTogaW50ZWdyYXRpb24uaG9zdE5hbWUsXG4gICAgICAgICAgICB2cGNMaW5rOiB2cGNMaW5rLFxuICAgICAgICAgICAgbWV0aG9kOiBhcGlndy5IdHRwTWV0aG9kLkFOWSxcbiAgICAgICAgICAgIHBhcmFtZXRlck1hcHBpbmcsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgY2FzZSBcIkxhbWJkYVwiOiB7XG4gICAgICAgIHJldHVybiBuZXcgaW50ZWdyYXRpb25zLkh0dHBMYW1iZGFJbnRlZ3JhdGlvbihcbiAgICAgICAgICBcIkxhbWJkYUludGVncmF0aW9uXCIsXG4gICAgICAgICAgaW50ZWdyYXRpb24ubGFtYmRhLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBheWxvYWRGb3JtYXRWZXJzaW9uOiBhcGlndy5QYXlsb2FkRm9ybWF0VmVyc2lvbi5WRVJTSU9OXzJfMCxcbiAgICAgICAgICAgIHBhcmFtZXRlck1hcHBpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjYXNlIFwiU1FTXCI6IHtcbiAgICAgICAgLy8gQVBJLUdXIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIFNRUyBieSBkZWZhdWx0XG4gICAgICAgIGNvbnN0IHJvbGUgPSBuZXcgaWFtLlJvbGUoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBgQXBpR3dUbyR7aW50ZWdyYXRpb24ucXVldWUubm9kZS5pZH1TZXJ2aWNlUm9sZWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgIFwiQWxsb3dzIEFQSS1HVyB0byBhZGQgbWVzc2FnZXMgdG8gXCIgKyBpbnRlZ3JhdGlvbi5xdWV1ZS5xdWV1ZUFybixcbiAgICAgICAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKFwiYXBpZ2F0ZXdheS5hbWF6b25hd3MuY29tXCIpLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgaW50ZWdyYXRpb24ucXVldWUuZ3JhbnRTZW5kTWVzc2FnZXMocm9sZSlcblxuICAgICAgICBsZXQgcGFyYW1ldGVyTWFwcGluZyA9IG5ldyBhcGlndy5QYXJhbWV0ZXJNYXBwaW5nKClcbiAgICAgICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktZGV2ZWxvcC1pbnRlZ3JhdGlvbnMtYXdzLXNlcnZpY2VzLXJlZmVyZW5jZS5odG1sI1NRUy1TZW5kTWVzc2FnZVxuICAgICAgICAgIC5jdXN0b20oXCJRdWV1ZVVybFwiLCBpbnRlZ3JhdGlvbi5xdWV1ZS5xdWV1ZVVybClcbiAgICAgICAgICAuY3VzdG9tKFwiTWVzc2FnZUJvZHlcIiwgXCIkcmVxdWVzdC5ib2R5XCIpXG4gICAgICAgICAgLmN1c3RvbShcIlJlZ2lvblwiLCBcImV1LXdlc3QtMVwiKSAvLyBDaGFuZ2UgdGhpcyBpZiB0aGUgU1FTIHF1ZXVlIGlzIGluIGFub3RoZXIgcmVnaW9uIVxuXG4gICAgICAgIGlmIChpbnRlZ3JhdGlvbi5tZXNzYWdlQXR0cmlidXRlcykge1xuICAgICAgICAgIHBhcmFtZXRlck1hcHBpbmcgPSBwYXJhbWV0ZXJNYXBwaW5nLmN1c3RvbShcbiAgICAgICAgICAgIFwiTWVzc2FnZUF0dHJpYnV0ZXNcIixcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGludGVncmF0aW9uLm1lc3NhZ2VBdHRyaWJ1dGVzKSxcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFNxc1JvdXRlSW50ZWdyYXRpb24oXCJTcXNJbnRlZ3JhdGlvblwiLCB7XG4gICAgICAgICAgdHlwZTogYXBpZ3cuSHR0cEludGVncmF0aW9uVHlwZS5BV1NfUFJPWFksXG4gICAgICAgICAgc3VidHlwZTogYXBpZ3cuSHR0cEludGVncmF0aW9uU3VidHlwZS5TUVNfU0VORF9NRVNTQUdFLFxuICAgICAgICAgIGNyZWRlbnRpYWxzOiBhcGlndy5JbnRlZ3JhdGlvbkNyZWRlbnRpYWxzLmZyb21Sb2xlKHJvbGUpLFxuICAgICAgICAgIHBhcmFtZXRlck1hcHBpbmc6IHBhcmFtZXRlck1hcHBpbmcsXG4gICAgICAgICAgcGF5bG9hZEZvcm1hdFZlcnNpb246IGFwaWd3LlBheWxvYWRGb3JtYXRWZXJzaW9uLlZFUlNJT05fMV8wLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgYSBncmFudGFibGUgdGFyZ2V0IChyb2xlLCB1c2VyIGV0Yy4pIHBlcm1pc3Npb24gdG8gaW52b2tlIHRoZSBBUEkuXG4gICAqIE9ubHkgd29ya3Mgd2hlbiB1c2luZyBgSUFNYCBhcyB7QGxpbmsgQXBpR2F0ZXdheVJvdXRlLmF1dGhvcml6YXRpb259LlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IEEgZ3JhbnRhYmxlLCBsaWtlIHtAbGluayBpYW0uUm9sZX1cbiAgICovXG4gIHB1YmxpYyBncmFudEludm9rZSh0YXJnZXQ6IGlhbS5JR3JhbnRhYmxlKSB7XG4gICAgZm9yIChjb25zdCByb3V0ZVByb3BzIG9mIHRoaXMucHJvcHMucm91dGVzKSB7XG4gICAgICBjb25zdCBhdXRoVHlwZSA9XG4gICAgICAgIHJvdXRlUHJvcHMuYXV0aG9yaXphdGlvbj8udHlwZSA/PyB0aGlzLnByb3BzLmRlZmF1bHRBdXRob3JpemF0aW9uPy50eXBlXG5cbiAgICAgIGlmIChhdXRoVHlwZSAhPT0gXCJJQU1cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCBncmFudCBpbnZva2UgZm9yIGFuIEFQSSBHYXRld2F5IHdoZW4gbm90IHVzaW5nIElBTSBhdXRoIChmb3VuZCBhdXRoICcke2F1dGhUeXBlfScgb24gcm91dGUgJyR7cm91dGVQcm9wcy5wYXRofScpIFske2Nkay5TdGFjay5vZih0aGlzKS5zdGFja05hbWV9XWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHRoaXMucm91dGVzKSB7XG4gICAgICByb3V0ZS5ncmFudEludm9rZSh0YXJnZXQpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGN1c3RvbSBkb21haW4gZm9yIHRoZSBBUEktR2F0ZXdheSwgYSBSb3V0ZTUzIHJlY29yZCBhbmQgYW4gSFRUUFMgY2VydC5cbiAqIEBhdXRob3IgS3Jpc3RpYW4gUmVrc3RhZCA8a3JlQGNhcHJhY29uc3VsdGluZy5ubz5cbiAqL1xuY2xhc3MgQ3VzdG9tRG9tYWluIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgYXBpR3dDdXN0b21Eb21haW46IGFwaWd3LkRvbWFpbk5hbWVcblxuICAvKiogVGhlIEZ1bGx5IFF1YWxpZmllZCBEb21haW4gTmFtZSAoRlFETikgbGlrZSBgcHJvZHVjdC5wbGF0Zm9ybS5leGFtcGxlLm5vYC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGN1c3RvbURvbWFpbk5hbWU6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBBcGlHYXRld2F5RG5zUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcbiAgICB0aGlzLmN1c3RvbURvbWFpbk5hbWUgPSBgJHtwcm9wcy5zdWJkb21haW59LiR7cHJvcHMuaG9zdGVkWm9uZS56b25lTmFtZX1gXG5cbiAgICAvLyBDYW4gYWxzbyB1c2Ugd2lsZGNhcmQgY2VydHMgaW5zdGVhZCEgQ2hlYXBlclxuICAgIC8qKiBBbGxvd3MgZXh0ZXJuYWwgdXNlcnMgdG8gY29ubmVjdCB3aXRoIEhUVFBTLiAqL1xuICAgIGNvbnN0IGN1c3RvbURvbWFpbkNlcnQgPSBuZXcgYWNtLkNlcnRpZmljYXRlKHRoaXMsIFwiSHR0cHNDZXJ0aWZpY2F0ZVwiLCB7XG4gICAgICBkb21haW5OYW1lOiB0aGlzLmN1c3RvbURvbWFpbk5hbWUsXG4gICAgICB2YWxpZGF0aW9uOiBhY20uQ2VydGlmaWNhdGVWYWxpZGF0aW9uLmZyb21EbnMocHJvcHMuaG9zdGVkWm9uZSksXG4gICAgfSlcblxuICAgIC8vIE5vdGUgdGhhdCBBUEktR1cgY2FuIGFsc28gc3VwcG9ydCB3aWxkY2FyZCBkb21haW5zISBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktY3VzdG9tLWRvbWFpbi1uYW1lcy5odG1sI2h0dHAtd2lsZGNhcmQtY3VzdG9tLWRvbWFpbi1uYW1lc1xuICAgIC8vIEJ1dCB0aGlzIHdpbGwgbm90IHdvcmsgd2hlbiBBV1MgYWNjb3VudCBYIGhhcyBDdXN0b21Eb21haW4gYHN0YWdpbmcucGxhdGZvcm0uZXhhbXBsZS5ub2AgYW5kIGFjY291bnQgWSBoYXMgQ3VzdG9tRG9tYWluIGAqLnBsYXRmb3JtLmV4YW1wbGUubm9gLlxuICAgIC8vIE5vdCBzdXJlIGhvdyBzdWItc3ViZG9tYWlucyBhcmUgYWZmZWN0ZWQ6IGBteXNlcnZpY2Uuc3RhZ2luZy5wbGF0Zm9ybS5leGFtcGxlLm5vYCBhbmQgYCoucGxhdGZvcm0uZXhhbXBsZS5ub2AuXG4gICAgdGhpcy5hcGlHd0N1c3RvbURvbWFpbiA9IG5ldyBhcGlndy5Eb21haW5OYW1lKFxuICAgICAgdGhpcyxcbiAgICAgIFwiRG9tYWluTmFtZS1cIiArIHByb3BzLnN1YmRvbWFpbixcbiAgICAgIHtcbiAgICAgICAgZG9tYWluTmFtZTogdGhpcy5jdXN0b21Eb21haW5OYW1lLFxuICAgICAgICBjZXJ0aWZpY2F0ZTogY3VzdG9tRG9tYWluQ2VydCxcbiAgICAgICAgZW5kcG9pbnRUeXBlOiBhcGlndy5FbmRwb2ludFR5cGUuUkVHSU9OQUwsXG4gICAgICAgIHNlY3VyaXR5UG9saWN5OiBhcGlndy5TZWN1cml0eVBvbGljeS5UTFNfMV8yLFxuICAgICAgfSxcbiAgICApXG5cbiAgICAvLyBUaGlzIG1ha2VzIHRoZSBBUEktR1cgcHVibGljbHkgYXZhaWxhYmxlIG9uIHRoZSBjdXN0b20gZG9tYWluIG5hbWUuXG4gICAgbmV3IHJvdXRlNTMuQVJlY29yZCh0aGlzLCBcIlJvdXRlNTNBUmVjb3JkQXBpZ3dBbGlhc1wiLCB7XG4gICAgICByZWNvcmROYW1lOiBwcm9wcy5zdWJkb21haW4sXG4gICAgICB6b25lOiBwcm9wcy5ob3N0ZWRab25lLFxuICAgICAgdGFyZ2V0OiByb3V0ZTUzLlJlY29yZFRhcmdldC5mcm9tQWxpYXMoXG4gICAgICAgIG5ldyByb3V0ZTUzVGFyZ2V0cy5BcGlHYXRld2F5djJEb21haW5Qcm9wZXJ0aWVzKFxuICAgICAgICAgIHRoaXMuYXBpR3dDdXN0b21Eb21haW4ucmVnaW9uYWxEb21haW5OYW1lLFxuICAgICAgICAgIHRoaXMuYXBpR3dDdXN0b21Eb21haW4ucmVnaW9uYWxIb3N0ZWRab25lSWQsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICAgdHRsOiBwcm9wcy50dGwgPz8gY2RrLkR1cmF0aW9uLm1pbnV0ZXMoNSksIC8vIExvdyBUVEwgbWFrZXMgaXQgZWFzaWVyIHRvIGRvIGNoYW5nZXNcbiAgICB9KVxuICB9XG59XG5cbi8qKiBBY3RzIGFzIGdsdWUgKGJldHdlZW4gdGhlIGludGVncmF0aW9uIHByb3BzIGFuZCB0aGUgSHR0cEFwaSkgd2hlbiBjcmVhdGluZyBhbiBTcXNJbnRlZ3JhdGlvbi4gKi9cbmNsYXNzIFNxc1JvdXRlSW50ZWdyYXRpb24gZXh0ZW5kcyBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAcGFyYW0gaWQgVGhlIGlkIHVzZWQgaW4gdGhlIHtAbGluayBhcGlndy5IdHRwSW50ZWdyYXRpb259IGNvbnN0cnVjdFxuICAgKiAgICBjcmVhdGVkIGludGVybmFsbHkgYnkge0BsaW5rIGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uLl9iaW5kVG9Sb3V0ZX0uXG4gICAqICAgIFtTb3VyY2UgY29kZV0oaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvYjVhZTM3NzgyYmMzY2I2MzdlZWVmOWZiYjFmYmUyYzVlZmRmYzA2OC9wYWNrYWdlcy8lNDBhd3MtY2RrL2F3cy1hcGlnYXRld2F5djIvbGliL2h0dHAvaW50ZWdyYXRpb24udHMjTDMyMSlcbiAgICogQHBhcmFtIGludGVncmF0aW9uUHJvcHMgVGhlIHByb3BzIHRvIHBhc3MgdG8gdGhlIHtAbGluayBhcGlndy5IdHRwSW50ZWdyYXRpb259IGNvbnN0cnVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBpbnRlZ3JhdGlvblByb3BzOiBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvbkNvbmZpZyxcbiAgKSB7XG4gICAgc3VwZXIoaWQpXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBzZW5kcyB0aGUgcHJvcGVydGllcyBuZWVkZWQgZm9yIGNyZWF0aW5nIGEge0BsaW5rIGFwaWd3Lkh0dHBJbnRlZ3JhdGlvbn0gdG8gdGhlXG4gICAqIHtAbGluayBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvbn0uXG4gICAqL1xuICBiaW5kKCk6IGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uQ29uZmlnIHtcbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnk6XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvYjVhZTM3NzgyYmMzY2I2MzdlZWVmOWZiYjFmYmUyYzVlZmRmYzA2OC9wYWNrYWdlcy8lNDBhd3MtY2RrL2F3cy1hcGlnYXRld2F5djIvbGliL2h0dHAvaW50ZWdyYXRpb24udHMjTDMxOVxuICAgIHJldHVybiB0aGlzLmludGVncmF0aW9uUHJvcHNcbiAgfVxufVxuXG4vKipcbiAqIFdoZW4gdXNpbmcgYE5vZGVqc0Z1bmN0aW9uYCB3aXRoIGBlbnRyeWAsIHdlIHBvaW50IENESyB0byBhIGZpbGUgd2l0aCBvdXIgbGFtYmRhIGNvZGUuIFRoaXMgY2FuXG4gKiBlaXRoZXIgYmUgYSBUeXBlU2NyaXB0IG9yIEphdmFTY3JpcHQgZmlsZS4gV2hlbiBjcmVhdGluZyBjb25zdHJ1Y3RzIGluIHRlc3RzIGluc2lkZSB0aGlzIGxpYnJhcnksXG4gKiB0aGUgZW50cnkgd2lsbCBwb2ludCB0byB0aGUgVHlwZVNjcmlwdCBmaWxlIGluIHRoZSBzb3VyY2UgY29kZS4gQnV0IHdoZW4gYSBsaWJyYXJ5IGNvbnN1bWVyIHVzZXNcbiAqIHRoaXMsIGl0IHdpbGwgaW5zdGVhZCBwb2ludCB0byB0aGUgdHJhbnNwaWxlZCBKYXZhU2NyaXB0IGZpbGUuIFNvIHRvIHNldCB0aGUgY29ycmVjdCBmaWxlXG4gKiBleHRlbnNpb24sIHdlIG11c3QgY2hlY2sgaWYgd2UncmUgYmVpbmcgcnVuIGluIHRoZSBjb250ZXh0IG9mIHRoZSBUeXBlU2NyaXB0IHNvdXJjZSBjb2RlXG4gKiAoc3JjL2FwaS1nYXRld2F5KSwgb3RoZXJ3aXNlIHdlJ3JlIGJlaW5nIHJ1biBieSBhIGNvbnN1bWVyIGFzIHRyYW5zcGlsZWQgSmF2YVNjcmlwdC5cbiAqL1xuY29uc3QgYXV0aG9yaXplckZpbGVFeHRlbnNpb24gPSBfX2Rpcm5hbWUuZW5kc1dpdGgoXCJzcmMvYXBpLWdhdGV3YXlcIilcbiAgPyBcInRzXCJcbiAgOiBcImpzXCJcblxuLyoqXG4gKiBDcmVhdGVzIGEgY3VzdG9tIGF1dGhvcml6ZXIgbGFtYmRhIHdoaWNoIHJlYWRzIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPHRva2VuPmAgaGVhZGVyIGFuZFxuICogdmVyaWZpZXMgdGhlIHRva2VuIGFnYWluc3QgYSBDb2duaXRvIHVzZXIgcG9vbC5cbiAqL1xuY2xhc3MgQ29nbml0b1VzZXJQb29sQXV0aG9yaXplcjxcbiAgQXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcsXG4+IGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgbGFtYmRhOiBsYW1iZGEuSUZ1bmN0aW9uXG5cbiAgLyoqXG4gICAqIFVzZSBzaW1wbGUgcmVzcG9uc2UgdHlwZSAoYHsgaXNBdXRob3JpemVkOiB0cnVlL2ZhbHNlIH1gKSwgYXMgb3Bwb3NlZCB0byByZXR1cm5pbmcgYW4gSUFNXG4gICAqIFBvbGljeSBkb2N1bWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNwb25zZVR5cGVzOiBhdXRob3JpemVycy5IdHRwTGFtYmRhUmVzcG9uc2VUeXBlW10gPSBbXG4gICAgYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZS5TSU1QTEUsXG4gIF1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQ29nbml0b1VzZXJQb29sQXV0aG9yaXplclByb3BzPEF1dGhTY29wZXNUPixcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5sYW1iZGEgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiQXV0aG9yaXplckZ1bmN0aW9uXCIsIHtcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgYGF1dGhvcml6ZXItbGFtYmRhcy9jb2duaXRvLXVzZXItcG9vbC1hdXRob3JpemVyLiR7YXV0aG9yaXplckZpbGVFeHRlbnNpb259YCxcbiAgICAgICksXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgW1wiVVNFUl9QT09MX0lEXCJdOiBwcm9wcy51c2VyUG9vbC51c2VyUG9vbElkLFxuICAgICAgICBbXCJSRVFVSVJFRF9TQ09QRVwiXTogcHJvcHMucmVxdWlyZWRTY29wZSA/PyBcIlwiLFxuICAgICAgICBbXCJDUkVERU5USUFMU19GT1JfSU5URVJOQUxfQVVUSE9SSVpBVElPTlwiXTpcbiAgICAgICAgICBwcm9wcy5jcmVkZW50aWFsc0ZvckludGVybmFsQXV0aG9yaXphdGlvblxuICAgICAgICAgICAgPyBwcm9wcy5jcmVkZW50aWFsc0ZvckludGVybmFsQXV0aG9yaXphdGlvblxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgaWYgKHByb3BzLmNyZWRlbnRpYWxzRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uKSB7XG4gICAgICBzZWNyZXRzbWFuYWdlci5TZWNyZXQuZnJvbVNlY3JldE5hbWVWMihcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIGlkICsgXCJCYXNpY0F1dGhTZWNyZXRcIixcbiAgICAgICAgcHJvcHMuY3JlZGVudGlhbHNGb3JJbnRlcm5hbEF1dGhvcml6YXRpb24sXG4gICAgICApLmdyYW50UmVhZCh0aGlzLmxhbWJkYSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY3VzdG9tIGF1dGhvcml6ZXIgbGFtYmRhIHdoaWNoIHJlYWRzIGBBdXRob3JpemF0aW9uOiBCYXNpYyA8YmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM+YFxuICogaGVhZGVyIGFuZCB2ZXJpZmllcyB0aGUgY3JlZGVudGlhbHMgYWdhaW5zdCBhIGdpdmVuIHNlY3JldC5cbiAqL1xuY2xhc3MgQmFzaWNBdXRoQXV0aG9yaXplciBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGxhbWJkYTogbGFtYmRhLklGdW5jdGlvblxuXG4gIC8vIFNpbXBsZSBpcyBgeyBpc0F1dGhvcml6ZWQ6IHRydWUvZmFsc2UgfWAsIGFzIG9wcG9zZWQgdG8gcmV0dXJuaW5nIGFuIElBTSBQb2xpY3kgZG9jdW1lbnRcbiAgcHVibGljIHJlYWRvbmx5IHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGVbXSA9IFtcbiAgICBhdXRob3JpemVycy5IdHRwTGFtYmRhUmVzcG9uc2VUeXBlLlNJTVBMRSxcbiAgXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBCYXNpY0F1dGhBdXRob3JpemVyUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIHRoaXMubGFtYmRhID0gbmV3IGxhbWJkYU5vZGVqcy5Ob2RlanNGdW5jdGlvbih0aGlzLCBcIkJhc2ljQXV0aExhbWJkYVwiLCB7XG4gICAgICBlbnRyeTogcGF0aC5qb2luKFxuICAgICAgICBfX2Rpcm5hbWUsXG4gICAgICAgIGBhdXRob3JpemVyLWxhbWJkYXMvYmFzaWMtYXV0aC1hdXRob3JpemVyLiR7YXV0aG9yaXplckZpbGVFeHRlbnNpb259YCxcbiAgICAgICksXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJBbiBhdXRob3JpemVyIGZvciBBUEktR2F0ZXdheSB0aGF0IGNoZWNrcyBCYXNpYyBBdXRoIGNyZWRlbnRpYWxzIG9uIHJlcXVlc3RzXCIsXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFtcIkNSRURFTlRJQUxTX1NFQ1JFVF9OQU1FXCJdOiBwcm9wcy5jcmVkZW50aWFsc1NlY3JldE5hbWVcbiAgICAgICAgICA/IHByb3BzLmNyZWRlbnRpYWxzU2VjcmV0TmFtZVxuICAgICAgICAgIDogXCJcIixcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGlmIChwcm9wcy5jcmVkZW50aWFsc1NlY3JldE5hbWUpIHtcbiAgICAgIHNlY3JldHNtYW5hZ2VyLlNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgICBzY29wZSxcbiAgICAgICAgaWQgKyBcIkJhc2ljQXV0aFNlY3JldFwiLFxuICAgICAgICBwcm9wcy5jcmVkZW50aWFsc1NlY3JldE5hbWUsXG4gICAgICApLmdyYW50UmVhZCh0aGlzLmxhbWJkYSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY3VzdG9tIGF1dGhvcml6ZXIgbGFtYmRhIHdoaWNoIGFsbG93cyBib3RoOlxuICogLSBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDx0b2tlbj5gIGhlYWRlciwgZm9yIHdoaWNoIHRoZSB0b2tlbiBpcyBjaGVja2VkIGFnYWluc3QgdGhlIGdpdmVuXG4gKiAgIENvZ25pdG8gdXNlciBwb29sXG4gKiAtIGBBdXRob3JpemF0aW9uOiBCYXNpYyA8YmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM+YCBoZWFkZXIsIGZvciB3aGljaCB0aGUgY3JlZGVudGlhbHMgYXJlXG4gKiAgIGNoZWNrZWQgYWdhaW5zdCB0aGUgY3JlZGVudGlhbHMgZnJvbSB0aGUgZ2l2ZW4gYmFzaWMgYXV0aCBzZWNyZXQgbmFtZVxuICpcbiAqIElmIGVpdGhlciBvZiB0aGVzZSBhcmUgZ2l2ZW4gYW5kIHZhbGlkLCB0aGUgcmVxdWVzdCBpcyBhdXRoZW50aWNhdGVkLlxuICovXG5jbGFzcyBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXI8XG4gIEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nLFxuPiBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGxhbWJkYTogbGFtYmRhLklGdW5jdGlvblxuXG4gIC8qKlxuICAgKiBVc2Ugc2ltcGxlIHJlc3BvbnNlIHR5cGUgKGB7IGlzQXV0aG9yaXplZDogdHJ1ZS9mYWxzZSB9YCksIGFzIG9wcG9zZWQgdG8gcmV0dXJuaW5nIGFuIElBTVxuICAgKiBQb2xpY3kgZG9jdW1lbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZVtdID0gW1xuICAgIGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGUuU0lNUExFLFxuICBdXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplclByb3BzPEF1dGhTY29wZXNUPixcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5sYW1iZGEgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiQXV0aG9yaXplckZ1bmN0aW9uXCIsIHtcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgYGF1dGhvcml6ZXItbGFtYmRhcy9jb2duaXRvLXVzZXItcG9vbC1vci1iYXNpYy1hdXRoLWF1dGhvcml6ZXIuJHthdXRob3JpemVyRmlsZUV4dGVuc2lvbn1gLFxuICAgICAgKSxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBbXCJVU0VSX1BPT0xfSURcIl06IHByb3BzLnVzZXJQb29sID8gcHJvcHMudXNlclBvb2wudXNlclBvb2xJZCA6IFwiXCIsXG4gICAgICAgIFtcIlJFUVVJUkVEX1NDT1BFXCJdOiBwcm9wcy5yZXF1aXJlZFNjb3BlID8/IFwiXCIsXG4gICAgICAgIFtcIkJBU0lDX0FVVEhfQ1JFREVOVElBTFNfU0VDUkVUX05BTUVcIl06XG4gICAgICAgICAgcHJvcHMuYmFzaWNBdXRoQ3JlZGVudGlhbHNTZWNyZXROYW1lXG4gICAgICAgICAgICA/IHByb3BzLmJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgaWYgKHByb3BzLmJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZSkge1xuICAgICAgc2VjcmV0c21hbmFnZXIuU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoXG4gICAgICAgIHNjb3BlLFxuICAgICAgICBpZCArIFwiQmFzaWNBdXRoU2VjcmV0XCIsXG4gICAgICAgIHByb3BzLmJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZSxcbiAgICAgICkuZ3JhbnRSZWFkKHRoaXMubGFtYmRhKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEEgc2xpZ2h0bHkgZXh0ZW5kZWQgdmVyc2lvbiBvZiB0aGUgW2RlZmF1bHQgSlNPTiBmb3JtYXQgc3VnZ2VzdGVkIGJ5IEFXU10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWxvZ2dpbmcuaHRtbCNodHRwLWFwaS1lbmFibGUtbG9nZ2luZy5leGFtcGxlcykuXG4gKi9cbmNvbnN0IGRlZmF1bHRBY2Nlc3NMb2dGb3JtYXQgPSB7XG4gIHJlcXVlc3RJZDogXCIkY29udGV4dC5yZXF1ZXN0SWRcIixcbiAgdXNlckFnZW50OiBcIiRjb250ZXh0LmlkZW50aXR5LnVzZXJBZ2VudFwiLFxuICBpcDogXCIkY29udGV4dC5pZGVudGl0eS5zb3VyY2VJcFwiLFxuICAvKiogQ0xGIGZvcm1hdDogYGRkL01NTS95eXl5OkhIOm1tOnNzICstaGhtbWAgKi9cbiAgcmVxdWVzdFRpbWU6IFwiJGNvbnRleHQucmVxdWVzdFRpbWVcIixcbiAgcmVxdWVzdFRpbWVFcG9jaDogXCIkY29udGV4dC5yZXF1ZXN0VGltZUVwb2NoXCIsXG4gIGRhdGFQcm9jZXNzZWQ6IFwiJGNvbnRleHQuZGF0YVByb2Nlc3NlZFwiLFxuICBodHRwTWV0aG9kOiBcIiRjb250ZXh0Lmh0dHBNZXRob2RcIixcbiAgcGF0aDogXCIkY29udGV4dC5wYXRoXCIsXG4gIHJvdXRlS2V5OiBcIiRjb250ZXh0LnJvdXRlS2V5XCIsXG4gIHN0YXR1czogXCIkY29udGV4dC5zdGF0dXNcIixcbiAgcHJvdG9jb2w6IFwiJGNvbnRleHQucHJvdG9jb2xcIixcbiAgcmVzcG9uc2VMZW5ndGg6IFwiJGNvbnRleHQucmVzcG9uc2VMZW5ndGhcIixcbiAgcmVzcG9uc2VMYXRlbmN5OiBcIiRjb250ZXh0LnJlc3BvbnNlTGF0ZW5jeVwiLFxuICBkb21haW5OYW1lOiBcIiRjb250ZXh0LmRvbWFpbk5hbWVcIixcbiAgLy8gIGhvc3RIZWFkZXJPdmVycmlkZTogXCIkY29udGV4dC5yZXF1ZXN0T3ZlcnJpZGUuaGVhZGVyLkhvc3RcIiwgLy9NYXBwaW5nIHRlbXBsYXRlIG92ZXJyaWRlcyBjYW5ub3QgYmUgdXNlZCB3aXRoIHByb3h5IGludGVncmF0aW9uIGVuZHBvaW50cywgd2hpY2ggbGFjayBkYXRhIG1hcHBpbmdzIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9hcGlnYXRld2F5LW92ZXJyaWRlLXJlcXVlc3QtcmVzcG9uc2UtcGFyYW1ldGVycy5odG1sIzp+OnRleHQ9TWFwcGluZyUyMHRlbXBsYXRlJTIwb3ZlcnJpZGVzJTIwY2Fubm90JTIwYmUlMjB1c2VkJTIwd2l0aCUyMHByb3h5JTIwaW50ZWdyYXRpb24lMjBlbmRwb2ludHMlMkMlMjB3aGljaCUyMGxhY2slMjBkYXRhJTIwbWFwcGluZ3NcbiAgZXJyb3I6IHtcbiAgICB0eXBlOiBcIiRjb250ZXh0LmVycm9yLnJlc3BvbnNlVHlwZVwiLFxuICAgIGdhdGV3YXlFcnJvcjogXCIkY29udGV4dC5lcnJvci5tZXNzYWdlXCIsXG4gICAgaW50ZWdyYXRpb25FcnJvcjogXCIkY29udGV4dC5pbnRlZ3JhdGlvbi5lcnJvclwiLFxuICAgIGF1dGhvcml6ZXJFcnJvcjogXCIkY29udGV4dC5hdXRob3JpemVyLmVycm9yXCIsXG4gIH0sXG4gIGludGVncmF0aW9uOiB7XG4gICAgbGF0ZW5jeTogXCIkY29udGV4dC5pbnRlZ3JhdGlvbi5sYXRlbmN5XCIsXG4gICAgcmVxdWVzdElkOiBcIiRjb250ZXh0LmludGVncmF0aW9uLnJlcXVlc3RJZFwiLFxuICAgIHJlc3BvbnNlU3RhdHVzOiBcIiRjb250ZXh0LmludGVncmF0aW9uLnN0YXR1c1wiLFxuICB9LFxuICBhdXRoOiB7XG4gICAgaWFtOiB7XG4gICAgICB1c2VyQXJuOiBcIiRjb250ZXh0LmlkZW50aXR5LnVzZXJBcm5cIixcbiAgICAgIGF3c0FjY291bnQ6IFwiJGNvbnRleHQuaWRlbnRpdHkuYWNjb3VudElkXCIsXG4gICAgICBhd3NQcmluY2lwYWw6IFwiJGNvbnRleHQuaWRlbnRpdHkuY2FsbGVyXCIsXG4gICAgICBhd3NQcmluY2lwYWxPcmc6IFwiJGNvbnRleHQuaWRlbnRpdHkucHJpbmNpcGFsT3JnSWRcIixcbiAgICB9LFxuICAgIGJhc2ljOiB7IHVzZXI6IFwiJGNvbnRleHQuYXV0aG9yaXplci51c2VyXCIgfSxcbiAgfSxcbiAgYXdzRW5kcG9pbnRSZXF1ZXN0OiB7XG4gICAgaWQ6IFwiJGNvbnRleHQuYXdzRW5kcG9pbnRSZXF1ZXN0SWRcIixcbiAgICBpZDI6IFwiJGNvbnRleHQuYXdzRW5kcG9pbnRSZXF1ZXN0SWQyXCIsXG4gIH0sXG4gIC8vIEZvciBkYXRhZG9nXG4gIG1lc3NhZ2U6XG4gICAgXCIkY29udGV4dC5pZGVudGl0eS5zb3VyY2VJcCAtICRjb250ZXh0Lmh0dHBNZXRob2QgJGNvbnRleHQuZG9tYWluTmFtZSAkY29udGV4dC5wYXRoICgkY29udGV4dC5yb3V0ZUtleSkgLSAkY29udGV4dC5zdGF0dXMgWyRjb250ZXh0LnJlc3BvbnNlTGF0ZW5jeSBtc11cIixcbn1cblxuLyoqXG4gKiBFbmFibGVzIGFjY2VzcyBsb2dzIG9uIHRoZSBBUEktR2F0ZXdheS5cbiAqXG4gKiBAYXV0aG9yIEtyaXN0aWFuIFJla3N0YWQgPGtyZUBjYXByYWNvbnN1bHRpbmcubm8+XG4gKi9cbmNsYXNzIEFwaUdhdGV3YXlBY2Nlc3NMb2dzIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nR3JvdXA6IGxvZ3MuTG9nR3JvdXBcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdGFnZTogYXBpZ3cuQ2ZuU3RhZ2UsXG4gICAgcHJvcHM6IEFwaUdhdGV3YXlBY2Nlc3NMb2dzUHJvcHMgfCB1bmRlZmluZWQsXG4gICAgZGVmYXVsdEFjY2Vzc0xvZ0Zvcm1hdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIC8vIGxvZ0dyb3VwIGlzIHNldCB1cCB3aXRoIGhlbHAgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy8xMTEwMCNpc3N1ZWNvbW1lbnQtOTA0NjI3MDgxXG4gICAgLy8gTm90IHN1cmUgaWYgSFRUUCBBUEkgYWN0dWFsbHkgbmVlZHMgdGhlIHNlcnZpY2Ugcm9sZSB3aXRoIG1hbmFnZWQgcG9saWN5OiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktbG9nZ2luZy5odG1sXG4gICAgY29uc3QgYWNjZXNzTG9ncyA9IG5ldyBsb2dzLkxvZ0dyb3VwKHRoaXMsIFwiQWNjZXNzTG9nR3JvdXBcIiwge1xuICAgICAgcmV0ZW50aW9uOiBwcm9wcz8ucmV0ZW50aW9uLFxuICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHM/LnJlbW92YWxQb2xpY3kgPz8gY2RrLlJlbW92YWxQb2xpY3kuUkVUQUlOLFxuICAgICAgLy8gQWx3YXlzIHVzZSB0aGUgZGVmYXVsdCBlbmNyeXB0aW9uIGtleS4gT3RoZXJ3aXNlLCB0aGUga2V5IG5lZWRzIHNwZWNpYWwgcG9saWNpZXM6XG4gICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbG9ncy9lbmNyeXB0LWxvZy1kYXRhLWttcy5odG1sI2Ntay1wZXJtaXNzaW9uc1xuICAgICAgZW5jcnlwdGlvbktleTogdW5kZWZpbmVkLFxuICAgIH0pXG4gICAgdGhpcy5sb2dHcm91cCA9IGFjY2Vzc0xvZ3NcblxuICAgIHN0YWdlLmFjY2Vzc0xvZ1NldHRpbmdzID0ge1xuICAgICAgZGVzdGluYXRpb25Bcm46IGFjY2Vzc0xvZ3MubG9nR3JvdXBBcm4sXG4gICAgICBmb3JtYXQ6IEpTT04uc3RyaW5naWZ5KHByb3BzPy5hY2Nlc3NMb2dGb3JtYXQgPz8gZGVmYXVsdEFjY2Vzc0xvZ0Zvcm1hdCksXG4gICAgfVxuXG4gICAgY29uc3QgYXBpR3dMb2dzUm9sZSA9IG5ldyBpYW0uUm9sZShcbiAgICAgIHRoaXMsXG4gICAgICBcIkFwaUdhdGV3YXlQdXNoVG9DbG91ZHdhdGNoTG9nc1JvbGVcIixcbiAgICAgIHtcbiAgICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJhcGlnYXRld2F5LmFtYXpvbmF3cy5jb21cIiksXG4gICAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcbiAgICAgICAgICAgIFwic2VydmljZS1yb2xlL0FtYXpvbkFQSUdhdGV3YXlQdXNoVG9DbG91ZFdhdGNoTG9nc1wiLFxuICAgICAgICAgICksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIClcblxuICAgIGFjY2Vzc0xvZ3MuZ3JhbnRXcml0ZShhcGlHd0xvZ3NSb2xlKVxuICB9XG59XG5cbi8qKiBSZXR1cm5zIGEgc2hvcnQgc2VtaS11bmlxdWUgaGFzaCBvZiB0aGUgZ2l2ZW4gc3RyaW5nLiAqL1xuZnVuY3Rpb24gc2hvcnRIYXNoKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gU0hBLTEgaXMgbm8tbm8gd2hlbiB3ZSBuZWVkIGNyeXB0b2dyYXBoaWMgc2VjdXJpdHksIGJ1dCBoZXJlIHdlIGp1c3QgaXQgZm9yIHNob3J0ZW5pbmcgYSBuYW1lLFxuICAvLyB3aGljaCBpcyBmaW5lXG4gIHJldHVybiBjcmVhdGVIYXNoKFwic2hhMVwiKS51cGRhdGUoc3RyKS5kaWdlc3QoXCJoZXhcIikuc3Vic3RyaW5nKDAsIDEwKVxufVxuIl19
|
|
588
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1hcGktZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGktZ2F0ZXdheS9odHRwLWFwaS1nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sYUFBYSxDQUFBO0FBR2xDLE9BQU8sS0FBSyxNQUFNLE1BQU0sd0JBQXdCLENBQUE7QUFFaEQsT0FBTyxLQUFLLEtBQUssTUFBTSw4QkFBOEIsQ0FBQTtBQUNyRCxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFBO0FBQzVDLE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUE7QUFDMUMsT0FBTyxLQUFLLGNBQWMsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUNoRSxPQUFPLEtBQUssWUFBWSxNQUFNLDJDQUEyQyxDQUFBO0FBQ3pFLE9BQU8sS0FBSyxXQUFXLE1BQU0sMENBQTBDLENBQUE7QUFFdkUsT0FBTyxLQUFLLFlBQVksTUFBTSwrQkFBK0IsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ25DLE9BQU8sS0FBSyxPQUFPLE1BQU0seUJBQXlCLENBQUE7QUFDbEQsT0FBTyxLQUFLLGNBQWMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNqRSxPQUFPLEtBQUssR0FBRyxNQUFNLG9DQUFvQyxDQUFBO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUE7QUFDNUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUVuQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FB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O0FBQ3RFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0IHR5cGUgKiBhcyBlbGIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyXCJcbmltcG9ydCB0eXBlICogYXMgZWMyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCJcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiXG5pbXBvcnQgdHlwZSAqIGFzIHNxcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiXG5pbXBvcnQgKiBhcyBhcGlndyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2MlwiXG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0ICogYXMgc2VjcmV0c21hbmFnZXIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiXG5pbXBvcnQgKiBhcyBpbnRlZ3JhdGlvbnMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djItaW50ZWdyYXRpb25zXCJcbmltcG9ydCAqIGFzIGF1dGhvcml6ZXJzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyLWF1dGhvcml6ZXJzXCJcbmltcG9ydCB0eXBlIHsgSVVzZXJQb29sIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2duaXRvXCJcbmltcG9ydCAqIGFzIGxhbWJkYU5vZGVqcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcIlxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0ICogYXMgcm91dGU1MyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIlxuaW1wb3J0ICogYXMgcm91dGU1M1RhcmdldHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIlxuaW1wb3J0ICogYXMgYWNtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCJcbmltcG9ydCB7IHRhZ1Jlc291cmNlcyB9IGZyb20gXCIuLi90YWdzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJ1cmxcIlxuXG5jb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpXG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoX19maWxlbmFtZSlcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIHtAbGluayBBcGlHYXRld2F5fSBjb25zdHJ1Y3QuXG4gKlxuICogQGF1dGhvciBLcmlzdGlhbiBSZWtzdGFkIDxrcmVAY2FwcmFjb25zdWx0aW5nLm5vPlxuICogQGF1dGhvciBIZXJtYW5uIE3DuHJrcmlkIDxoZW1AbGlmbGlnLm5vPlxuICovXG5leHBvcnQgdHlwZSBBcGlHYXRld2F5UHJvcHM8QXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xuICAvKiogU2V0dGluZ3MgZm9yIHRoZSBleHRlcm5hbC1mYWNpbmcgcGFydCBvZiB0aGUgQVBJLUdXLiAqL1xuICBkbnM6IEFwaUdhdGV3YXlEbnNQcm9wc1xuXG4gIC8qKlxuICAgKiBJZiBubyBpbnRlZ3JhdGlvbiBpcyBzcGVjaWZpZWQgZm9yIGEgcm91dGUsIHRoaXMgaW50ZWdyYXRpb24gaXMgdXNlZC5cbiAgICpcbiAgICogU2VlIHtAbGluayBJbnRlZ3JhdGlvblByb3BzfSBmb3IgdGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICAgKi9cbiAgZGVmYXVsdEludGVncmF0aW9uPzogSW50ZWdyYXRpb25Qcm9wc1xuXG4gIC8qKlxuICAgKiBJZiBubyBhdXRob3JpemF0aW9uIGlzIHNwZWNpZmllZCBmb3IgYSByb3V0ZSwgdGhpcyBhdXRob3JpemF0aW9uIGlzIHVzZWQuXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgQXV0aG9yaXphdGlvblByb3BzfSBmb3IgdGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICAgKi9cbiAgZGVmYXVsdEF1dGhvcml6YXRpb24/OiBBdXRob3JpemF0aW9uUHJvcHM8QXV0aFNjb3Blc1Q+XG5cbiAgcm91dGVzOiBBcGlHYXRld2F5Um91dGU8QXV0aFNjb3Blc1Q+W11cblxuICAvKipcbiAgICogVGhlIEFQSS1HVyBhY2Nlc3MgbG9ncyBmb3IgdGhlIGAkZGVmYXVsdGAgc3RhZ2UgYXJlIGtlcHQuXG4gICAqIFRoaXMgaGFzIG9wdGlvbnMgZm9yIHRoZSBsb2dzLlxuICAgKi9cbiAgYWNjZXNzTG9ncz86IEFwaUdhdGV3YXlBY2Nlc3NMb2dzUHJvcHNcblxuICAvKipcbiAgICogU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgcm91dGUtbGV2ZWwgbWV0cmljcy5cbiAgICogVGhpcyBjYW4gaW5jcmVhc2UgQ2xvdWRXYXRjaCBjb3N0cyB3aGVuIG5vdCBkaXNhYmxlZC5cbiAgICpcbiAgICogU2VlIFtBV1M6IFdvcmtpbmcgd2l0aCBtZXRyaWNzIGZvciBIVFRQIEFQSXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1tZXRyaWNzLmh0bWw/aWNtcGlkPWFwaWdhdGV3YXlfY29uc29sZV9oZWxwIzp+OnRleHQ9YW5kJTIwc3RhZ2UlMjBJRC4tLEFwaUlkJTJDJTIwU3RhZ2UlMkMlMjBSb3V0ZSwtRmlsdGVycyUyMEFQSSUyMEdhdGV3YXkpXG4gICAqIGZvciBtb3JlIGluZm8uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGRldGFpbGVkTWV0cmljcz86IGJvb2xlYW5cblxuICAvKipcbiAgICogVGhyb3R0bGluZyBvZiByZXF1ZXN0cy5cbiAgICogSWYgbm90IHNldCwgdGhlIEFXUyBkZWZhdWx0IG9mIDUwMDAgYnVyc3QgYW5kIDEwMDAwIHJhdGUgaXMgdXNlZC5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgdGhyb3R0bGluZyBpcyBwZXItYWNjb3VudCwgYW5kIGNvdW50cyBhbGwgQVBJcyBpbiB0aGUgYWNjb3VudCBhbmQgcmVnaW9uLlxuICAgKiBJZiB5b3UgaGF2ZSBhbm90aGVyIEFQSSBpbiB0aGlzIHJlZ2lvbiBnZXR0aW5nIDEwXzAwMCByZXF1ZXN0IHJhdGUsIGl0IG1heSBpbXBhY3QgdGhpcyBBUEkgYXMgd2VsbC5cbiAgICovXG4gIHRocm90dGxpbmc/OiB7XG4gICAgLyoqXG4gICAgICogR29pbmcgb3ZlciBgNV8wMDBgIG1heSByZXF1aXJlIHlvdSB0byBjb250YWN0IEFXUyBTdXBwb3J0IC0gdGhleSBhcmUgYWNjb3VudCBib3VuZC5cbiAgICAgKi9cbiAgICBidXJzdD86IG51bWJlclxuICAgIC8qKlxuICAgICAqIEdvaW5nIG92ZXIgYDEwXzAwMGAgbWF5IHJlcXVpcmUgeW91IHRvIGNvbnRhY3QgQVdTIFN1cHBvcnQgLSB0aGV5IGFyZSBhY2NvdW50IGJvdW5kLlxuICAgICAqL1xuICAgIHJhdGU/OiBudW1iZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIENPUlMgaGVhZGVycyBvbiByZXNwb25zZXMgZnJvbSB0aGUgQVBJIEdhdGV3YXkgdG8gYWxsb3cgYWxsIG9yaWdpbnMsIGhlYWRlcnMgYW5kIG1ldGhvZHMuXG4gICAqIFVzZWZ1bCBpZiB5b3VyIEFQSSBzaG91bGQgYmUgYWNjZXNzZWQgYnkgYW55IGJyb3dzZXIuXG4gICAqL1xuICBjb3JzQWxsb3dBbGw/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIElmIHNvbWUgc2V0dGluZ3MgaW4gdGhpcyBjb25zdHJ1Y3QgZG8gbm90IHdvcmsgZm9yIHlvdSwgdGhpcyBpcyBhbiBlc2NhcGUgaGF0Y2ggbWVjaGFuaXNtIHRvXG4gICAqIG92ZXJyaWRlIGFueXRoaW5nLlxuICAgKi9cbiAgcHJvcHNPdmVycmlkZT86IHtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSBzZXR0aW5ncyBmb3IgdGhlIHtAbGluayBhcGlndy5IdHRwQXBpfSAoYWNjZXNzaWJsZSBpbiB7QGxpbmsgQXBpR2F0ZXdheS5odHRwQXBpfSkuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBmcm9udGVuZCBhY2Nlc3NpbmcgdGhpcyBBUEksIHlvdSBtaWdodCB3YW50IHRvIHNldFxuICAgICAqIFtDT1JTIHByZWZsaWdodF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nkay9hcGkvdjEvZG9jcy9hd3MtYXBpZ2F0ZXdheXYyLXJlYWRtZS5odG1sI2Nyb3NzLW9yaWdpbi1yZXNvdXJjZS1zaGFyaW5nLWNvcnMpXG4gICAgICogc2V0dGluZ3MuXG4gICAgICovXG4gICAgaHR0cEFwaT86IFBhcnRpYWw8YXBpZ3cuSHR0cEFwaVByb3BzPlxuICB9XG59XG5cbmV4cG9ydCB0eXBlIEFwaUdhdGV3YXlEbnNQcm9wcyA9IHtcbiAgLyoqXG4gICAqIE9ubHkgdGhlIHN1YmRvbWFpbiBwcmVmaXgsIHdoaWNoIHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgc2VydmljZS5cbiAgICogRXhhbXBsZTogU3ViZG9tYWluIGBwcm9kdWN0YCB3b3VsZCBnaXZlIHRoZSBlbmQgcmVzdWx0IG9mIGFuIEFQSS1HVyB3aXRoXG4gICAqIGBwcm9kdWN0LnBsYXRmb3JtLmV4YW1wbGUubm9gLlxuICAgKi9cbiAgc3ViZG9tYWluOiBzdHJpbmdcblxuICAvKipcbiAgICogSG9zdGVkIFpvbmUgZm9yIHRoZSBleHRlcm5hbCBmYWNpbmcgZG9tYWluLlxuICAgKiBUaGlzIGlzIHdoZXJlIHJvdXRlcyB3aWxsIGJlIGNyZWF0ZWQsIHRvIHJlZGlyZWN0IGNvbnN1bWVycyB0byB0aGUgQVBJLUdXLlxuICAgKiBGb3IgZXhhbXBsZSBhIEhaIGZvciBgcGxhdGZvcm0uZXhhbXBsZS5ub2AuXG4gICAqL1xuICBob3N0ZWRab25lOiByb3V0ZTUzLklIb3N0ZWRab25lXG5cbiAgLyoqXG4gICAqIFRoZSBUaW1lIFRvIExpdmUgKFRUTCkgZm9yIHRoZSBwdWJsaWMgRE5TIEEgcmVjb3JkIHRoYXQgd2lsbCBleHBvc2UgdGhlIEFQSS1HVy5cbiAgICogVGhpcyBpcyBob3cgbG9uZyBETlMgc2VydmVycyB3aWxsIGNhY2hlIHRoZSByZWNvcmQuXG4gICAqXG4gICAqIEEgbG9uZyBUVEwgKGhvdXJzKSBpcyBiZW5lZmljaWFsIHRvIEROUyBzZXJ2ZXJzLCBidXQgbWFrZXMgZGV2ZWxvcGVycyAoeW91KSB3YWl0IGxvbmdlciB3aGVuXG4gICAqIGRvaW5nIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IDUgbWludXRlc1xuICAgKi9cbiAgdHRsPzogY2RrLkR1cmF0aW9uXG59XG5cbmV4cG9ydCB0eXBlIEFwaUdhdGV3YXlSb3V0ZTxBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XG4gIC8qKiBUaGUgcGF0aCBvZiB0aGUgcm91dGUgdG8gZXhwb3NlIHRocm91Z2ggdGhlIEFQSSBHYXRld2F5LiBVc2UgXCIvXCIgZm9yIHRoZSByb290IHJvdXRlLiAqL1xuICBwYXRoOiBzdHJpbmdcblxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgd2Ugb25seSBmb3J3YXJkIHJlcXVlc3RzIHRoYXQgbWF0Y2ggdGhlIHJvdXRlJ3MgcGF0aCBleGFjdGx5LiBTbyBmb3IgYSByb3V0ZSB3aXRoXG4gICAqIHBhdGggYC9hcGkvdXNlcnNgLCBhIHJlcXVlc3QgdG8gYC9hcGkvdXNlcnNgIHdpbGwgYmUgZm9yd2FyZGVkLCBidXQgYSByZXF1ZXN0IHRvXG4gICAqIGAvYXBpL3VzZXJzL2FkbWluYCB3aWxsIG5vdC4gSWYgeW91IHdhbnQgdG8gZm9yd2FyZCByZXF1ZXN0cyB0byBhbGwgc3ViLXBhdGhzIHVuZGVyIHRoZSByb3V0ZSdzXG4gICAqIHBhdGgsIHlvdSBjYW4gc2V0IHRoaXMgdG8gdHJ1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGluY2x1ZGVTdWJwYXRocz86IGJvb2xlYW5cblxuICAvKipcbiAgICogVGhlIEhUVFAgbWV0aG9kIHRvIGV4cG9zZS4gYEFOWWAgZXhwb3NlcyBhbGwgSFRUUCBtZXRob2RzIG9uIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIkFOWVwiXG4gICAqL1xuICBtZXRob2Q/OiBIdHRwTWV0aG9kXG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlZ3JhdGlvbiB0aGF0IHRoZSByb3V0ZSB3aWxsIGZvcndhcmQgdG8uIFNlZSB7QGxpbmsgSW50ZWdyYXRpb25Qcm9wc30gZm9yIHRoZSBhdmFpbGFibGVcbiAgICogb3B0aW9ucy5cbiAgICpcbiAgICogSWYgdW5kZWZpbmVkLCB1c2VzIHRoZSB7QGxpbmsgQXBpR2F0ZXdheVByb3BzLmRlZmF1bHRJbnRlZ3JhdGlvbn0uXG4gICAqL1xuICBpbnRlZ3JhdGlvbj86IEludGVncmF0aW9uUHJvcHNcblxuICAvKipcbiAgICogSG93IHJlcXVlc3RzIG9uIHRoZSByb3V0ZSBhcmUgYXV0aGVudGljYXRlZC4gU2VlIHtAbGluayBBdXRob3JpemF0aW9uUHJvcHN9IGZvciB0aGUgYXZhaWxhYmxlXG4gICAqIG9wdGlvbnMuXG4gICAqXG4gICAqIElmIHVuZGVmaW5lZCwgdXNlcyB0aGUge0BsaW5rIEFwaUdhdGV3YXlQcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvbn0uXG4gICAqL1xuICBhdXRob3JpemF0aW9uPzogQXV0aG9yaXphdGlvblByb3BzPEF1dGhTY29wZXNUPlxufVxuXG5leHBvcnQgdHlwZSBIdHRwTWV0aG9kID1cbiAgfCBcIkFOWVwiXG4gIHwgXCJHRVRcIlxuICB8IFwiUE9TVFwiXG4gIHwgXCJQVVRcIlxuICB8IFwiUEFUQ0hcIlxuICB8IFwiREVMRVRFXCJcbiAgfCBcIk9QVElPTlNcIlxuICB8IFwiSEVBRFwiXG5cbmV4cG9ydCB0eXBlIEludGVncmF0aW9uUHJvcHMgPVxuICAvKiogVXNlIHRoaXMgd2hlbiBjb25uZWN0aW5nIHRoZSByb3V0ZSB0byBhbiBBTEIgKEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIpLiAqL1xuICB8ICh7IHR5cGU6IFwiQUxCXCIgfSAmIEFsYkludGVncmF0aW9uUHJvcHMpXG4gIC8qKiBVc2UgdGhpcyB3aGVuIGNvbm5lY3Rpbmcgcm91dGUgdG8gYSBMYW1iZGEuICovXG4gIHwgKHsgdHlwZTogXCJMYW1iZGFcIiB9ICYgTGFtYmRhSW50ZWdyYXRpb25Qcm9wcylcbiAgLyoqIFVzZSB0aGlzIHdoZW4gY29ubmVjdGluZyBhIHJvdXRlIHRvIHNlbmQgdG8gYW4gU1FTIHF1ZXVlLiAqL1xuICB8ICh7IHR5cGU6IFwiU1FTXCIgfSAmIFNxc0ludGVncmF0aW9uUHJvcHMpXG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBBUEktR1cgLT4gQUxCIChBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VyKSBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBTZWUgdGhlIG5vdGUgb24ge0BsaW5rIEFwaUdhdGV3YXl9IGFib3V0IHRoZSBsb2FkIGJhbGFuY2VyIHNlY3VyaXR5IGdyb3VwLlxuICovXG5leHBvcnQgdHlwZSBBbGJJbnRlZ3JhdGlvblByb3BzID0ge1xuICAvKipcbiAgICogQSBsaXN0ZW5lciBvbiBlLmcuIHBvcnQgNDQzIChIVFRQUykuXG4gICAqXG4gICAqIFNlZSB0aGUgbm90ZSBvbiB7QGxpbmsgQXBpR2F0ZXdheX0gYWJvdXQgdGhlIGxvYWQgYmFsYW5jZXIgc2VjdXJpdHkgZ3JvdXAuXG4gICAqL1xuICBsb2FkQmFsYW5jZXJMaXN0ZW5lcjogZWxiLklBcHBsaWNhdGlvbkxpc3RlbmVyXG5cbiAgLyoqXG4gICAqIFRoZSBob3N0IG5hbWUgKGRvbWFpbiBuYW1lKSBvZiB0aGUgYmFja2VuZCBzZXJ2aWNlIHRoYXQgd2Ugd2FudCB0byByZWFjaCB0aHJvdWdoIHRoZSBBTEIuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZCB0bzpcbiAgICogLSBWZXJpZnkgdGhlIEhUVFBTIGNlcnRpZmljYXRlIG9mIHRoZSBiYWNrZW5kIHNlcnZpY2UsIHNvIHRoYXQgdGhlIHJlcXVlc3QgZm9yd2FyZGVkIGZyb21cbiAgICogICBBUEktR1cgY2FuIHVzZSBUTFNcbiAgICogLSBTZXQgdGhlIGBIb3N0YCBoZWFkZXIgb24gdGhlIHJlcXVlc3Qgd2hlbiBmb3J3YXJkaW5nIHRvIHRoZSBBTEIsIHNvIHRoYXQgcmVxdWVzdHMgY2FuIGJlXG4gICAqICAgcm91dGVkIHRvIHRoZSBjb3JyZWN0IFRhcmdldCBHcm91cFxuICAgKlxuICAgKiBFeGFtcGxlIHZhbHVlOiBgPHNlcnZpY2U+LnN0YWdpbmcubXktcHJvamVjdC5saWZsaWcuaW9gIChub3QgcHJlZml4ZWQgYnkgYGh0dHBzOi8vYCkuXG4gICAqL1xuICBob3N0TmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgdXNlZCBieSB0aGUgQUxCLiBUaGUgQVBJLUdXIGludGVncmF0aW9uIHdpbGwgY29ubmVjdCB0byB0aGUgQUxCIHVzaW5nIGEgVlBDIExpbmsgZm9yXG4gICAqIHRoaXMgVlBDLlxuICAgKlxuICAgKiBTZWUgdGhlIG5vdGUgb24ge0BsaW5rIEFwaUdhdGV3YXl9IGFib3V0IHRoZSBsb2FkIGJhbGFuY2VyIHNlY3VyaXR5IGdyb3VwLlxuICAgKi9cbiAgdnBjOiBlYzIuSVZwY1xuXG4gIC8qKlxuICAgKiBBIHNlY3VyaXR5IGdyb3VwIChTRykgdGhhdCBhbGxvd3MgaW5jb21pbmcgdHJhZmZpYyB0byB0aGUgQUxCLiBXaWxsIGJlIHVzZWQgYnkgdGhlIFZQQyBsaW5rLCBzb1xuICAgKiB0aGUgQVBJLUdXIGludGVncmF0aW9uIGNhbiBjb25uZWN0LlxuICAgKlxuICAgKiBUaGlzIGlzIHVzdWFsbHkgdGhlIHNhbWUgU0cgYXMgdGhlIEFMQiB1c2VzLCBiZWNhdXNlIHRoZXkgaGF2ZSBhIHJ1bGUgdGhhdCBhbGxvd3MgdHJhZmZpYyBmcm9tXG4gICAqIG90aGVycyBpbiB0aGUgc2FtZSBTRy5cbiAgICpcbiAgICogU2VlIHRoZSBub3RlIG9uIHtAbGluayBBcGlHYXRld2F5fSBhYm91dCB0aGUgbG9hZCBiYWxhbmNlciBzZWN1cml0eSBncm91cC5cbiAgICovXG4gIHNlY3VyaXR5R3JvdXA6IGVjMi5JU2VjdXJpdHlHcm91cFxuXG4gIC8qKlxuICAgKiBNYXAgcmVxdWVzdCBwYXJhbWV0ZXJzIChhZGQvb3ZlcndyaXRlIHBhdGgvaGVhZGVycy9xdWVyeSBwYXJhbXMpIGJlZm9yZSBmb3J3YXJkaW5nIHRvIHRoZVxuICAgKiBiYWNrZW5kLlxuICAgKlxuICAgKiBTZWUge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1wYXJhbWV0ZXItbWFwcGluZy5odG1sfVxuICAgKiBmb3IgbW9yZSBvbiB0aGlzLiBSZWFkIHRoZSAnUmVzZXJ2ZWQgaGVhZGVycycgc2VjdGlvbiBmb3Igd2hpY2ggaGVhZGVycyBjYW5ub3QgYmUgb3ZlcnJpZGRlbi5cbiAgICogSW4gYWRkaXRpb24gdG8gdGhlIEFXUy1yZXNlcnZlZCBoZWFkZXJzLCB5b3Ugc2hvdWxkIG5vdCBvdmVycmlkZSB0aGUgJ0hvc3QnIGhlYWRlciBlaXRoZXIsIGFzXG4gICAqIHRoYXQncyB1c2VkIGZvciByb3V0aW5nIHRoZSByZXF1ZXN0IHRvIHRoZSBjb3JyZWN0IHNlcnZpY2UgYmVoaW5kIHRoZSBsb2FkIGJhbGFuY2VyLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZTpcbiAgICpcbiAgICogQWRkaW5nIGEgaGVhZGVyOlxuICAgKiBgYGBcbiAgICogbWFwUGFyYW1ldGVyczogKHBhcmFtZXRlcnMpID0+IHBhcmFtZXRlcnMub3ZlcndyaXRlSGVhZGVyKFxuICAgKiAgICBcIlgtTXktQ3VzdG9tLUhlYWRlclwiLFxuICAgKiAgICBhcGlndy5NYXBwaW5nVmFsdWUuY3VzdG9tKFwibXktY3VzdG9tLXZhbHVlXCIpLFxuICAgKiApXG4gICAqIGBgYFxuICAgKlxuICAgKiBPdmVyd3JpdGluZyB0aGUgcGF0aCAoaWYsIGZvciBleGFtcGxlLCB5b3UgY29uZmlndXJlIGEgYC91c2Vyc2Agcm91dGUgb24gdGhlIEFQSSBHYXRld2F5IHRoYXRcbiAgICogeW91IHdhbnQgdG8gZm9yd2FyZCB0byBgL2FwaS91c2Vyc2Agb24gdGhlIGJhY2tlbmQpOlxuICAgKiBgYGBcbiAgICogbWFwUGFyYW1ldGVyczogKHBhcmFtZXRlcnMpID0+IHBhcmFtZXRlcnMub3ZlcndyaXRlUGF0aChcIi9hcGkvdXNlcnNcIilcbiAgICogYGBgXG4gICAqL1xuICBtYXBQYXJhbWV0ZXJzPzogKHBhcmFtZXRlcnM6IGFwaWd3LlBhcmFtZXRlck1hcHBpbmcpID0+IHZvaWRcbn1cblxuZXhwb3J0IHR5cGUgTGFtYmRhSW50ZWdyYXRpb25Qcm9wcyA9IHtcbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEgaW50ZWdyYXRpb24gdXNlcyB0aGUgVjIgcGF5bG9hZCBmb3JtYXQ6XG4gICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktZGV2ZWxvcC1pbnRlZ3JhdGlvbnMtbGFtYmRhLmh0bWx9XG4gICAqXG4gICAqIElmIHdyaXRpbmcgdGhlIExhbWJkYSBpbiBUeXBlU2NyaXB0LCB0aGlzIG1lYW5zIHlvdSBzaG91bGQgdXNlIGBBUElHYXRld2F5UHJveHlFdmVudFYyYCBhcyB0aGVcbiAgICogcmVxdWVzdCB0eXBlLCBhbmQgYEFQSUdhdGV3YXlQcm94eVJlc3VsdFYyYCBhcyB0aGUgcmVzcG9uc2UgdHlwZS5cbiAgICovXG4gIGxhbWJkYTogbGFtYmRhLklGdW5jdGlvblxufVxuXG5leHBvcnQgdHlwZSBTcXNJbnRlZ3JhdGlvblByb3BzID0ge1xuICBxdWV1ZTogc3FzLklRdWV1ZVxuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGF0dHJpYnV0ZXMgdG8gcGFzcyBvbiB0byBTUVMuIFRoZSBrZXlzIGluIHRoaXMgb2JqZWN0IGFyZSB0aGUgbmFtZXMgb2YgdGhlIGF0dHJpYnV0ZXMuXG4gICAqIEVhY2ggYXR0cmlidXRlIGhhcyBhIERhdGFUeXBlIGZpZWxkLCBhbmQgZWl0aGVyIGEgU3RyaW5nVmFsdWUgb3IgQmluYXJ5VmFsdWUgZmllbGQgZGVwZW5kaW5nIG9uXG4gICAqIGl0cyB0eXBlLiBTZWUgQVdTIGRvY3M6XG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NTaW1wbGVRdWV1ZVNlcnZpY2UvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTWVzc2FnZUF0dHJpYnV0ZVZhbHVlLmh0bWxcbiAgICpcbiAgICogSW4gdGhlIFN0cmluZ1ZhbHVlIGZpZWxkLCB5b3UgY2FuIGRvIEFQSSBHYXRld2F5IHBhcmFtZXRlciBtYXBwaW5nOlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktcGFyYW1ldGVyLW1hcHBpbmcuaHRtbFxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBgYGBcbiAgICogbWVzc2FnZUF0dHJpYnV0ZXM6IHtcbiAgICogICBjbGllbnRJZDoge1xuICAgKiAgICAgRGF0YVR5cGU6IFwiU3RyaW5nXCIsXG4gICAqICAgICBTdHJpbmdWYWx1ZTogXCIke2NvbnRleHQuYXV0aG9yaXplci5jbGllbnRJZH1cIixcbiAgICogICB9LFxuICAgKiB9LFxuICAgKiBgYGBcbiAgICovXG4gIG1lc3NhZ2VBdHRyaWJ1dGVzPzoge1xuICAgIFthdHRyaWJ1dGVOYW1lOiBzdHJpbmddOlxuICAgICAgfCB7IERhdGFUeXBlOiBcIlN0cmluZ1wiIHwgXCJOdW1iZXJcIjsgU3RyaW5nVmFsdWU6IHN0cmluZyB9XG4gICAgICB8IHtcbiAgICAgICAgICBEYXRhVHlwZTogXCJCaW5hcnlcIlxuICAgICAgICAgIC8qKiBCYXNlNjQtZW5jb2RlZCBiaW5hcnkgZGF0YSBvYmplY3QuICovXG4gICAgICAgICAgQmluYXJ5VmFsdWU6IHN0cmluZ1xuICAgICAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQXV0aG9yaXphdGlvblByb3BzPEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9XG4gIC8qKlxuICAgKiBObyBhdXRoZW50aWNhdGlvbiwgZm9yIHdoZW4geW91IHdhbnQgYSBmdWxseSBwdWJsaWMgcm91dGUgKG9yIGhhbmRsZSBhdXRoZW50aWNhdGlvbiBpbiB0aGVcbiAgICogYmFja2VuZCBpbnRlZ3JhdGlvbikuXG4gICAqL1xuICB8IHsgdHlwZTogXCJOT05FXCIgfVxuICAvKipcbiAgICogQVdTIElBTSBhdXRob3JpemF0aW9uLlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktYWNjZXNzLWNvbnRyb2wtaWFtLmh0bWxcbiAgICovXG4gIHwgeyB0eXBlOiBcIklBTVwiIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjdXN0b20gYXV0aG9yaXplciBsYW1iZGEgd2hpY2ggcmVhZHMgYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgaGVhZGVyXG4gICAqIGFuZCB2ZXJpZmllcyB0aGUgdG9rZW4gYWdhaW5zdCBhIENvZ25pdG8gdXNlciBwb29sLlxuICAgKi9cbiAgfCAoe1xuICAgICAgdHlwZTogXCJDT0dOSVRPX1VTRVJfUE9PTFwiXG4gICAgfSAmIENvZ25pdG9Vc2VyUG9vbEF1dGhvcml6ZXJQcm9wczxBdXRoU2NvcGVzVD4pXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY3VzdG9tIGF1dGhvcml6ZXIgbGFtYmRhIHdoaWNoIHJlYWRzIGBBdXRob3JpemF0aW9uOiBCYXNpYyA8YmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM+YFxuICAgKiBoZWFkZXIgYW5kIHZlcmlmaWVzIHRoZSBjcmVkZW50aWFscyBhZ2FpbnN0IGEgZ2l2ZW4gc2VjcmV0LlxuICAgKi9cbiAgfCAoeyB0eXBlOiBcIkJBU0lDX0FVVEhcIiB9ICYgQmFzaWNBdXRoQXV0aG9yaXplclByb3BzKVxuICAvKipcbiAgICogQ3JlYXRlcyBhIGN1c3RvbSBhdXRob3JpemVyIGxhbWJkYSB3aGljaCBhbGxvd3MgYm90aDpcbiAgICogLSBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDxhY2Nlc3MgdG9rZW4+YCBoZWFkZXIsIGZvciB3aGljaCB0aGUgdG9rZW4gaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZVxuICAgKiAgIGdpdmVuIENvZ25pdG8gdXNlciBwb29sXG4gICAqIC0gYEF1dGhvcml6YXRpb246IEJhc2ljIDxiYXNlNjQtZW5jb2RlZCBjcmVkZW50aWFscz5gIGhlYWRlciwgZm9yIHdoaWNoIHRoZSBjcmVkZW50aWFscyBhcmVcbiAgICogICBjaGVja2VkIGFnYWluc3QgdGhlIGNyZWRlbnRpYWxzIGZyb20gdGhlIGdpdmVuIGJhc2ljIGF1dGggc2VjcmV0IG5hbWVcbiAgICpcbiAgICogSWYgZWl0aGVyIG9mIHRoZXNlIGFyZSBnaXZlbiBhbmQgdmFsaWQsIHRoZSByZXF1ZXN0IGlzIGF1dGhlbnRpY2F0ZWQuXG4gICAqL1xuICB8ICh7XG4gICAgICB0eXBlOiBcIkNPR05JVE9fVVNFUl9QT09MX09SX0JBU0lDX0FVVEhcIlxuICAgIH0gJiBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wczxBdXRoU2NvcGVzVD4pXG5cbmV4cG9ydCB0eXBlIENvZ25pdG9Vc2VyUG9vbEF1dGhvcml6ZXJQcm9wczxcbiAgQXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+ID0ge1xuICB1c2VyUG9vbDogSVVzZXJQb29sXG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgYWNjZXNzIHRva2VuIGNsYWltcyBjb250YWluIHRoZSBnaXZlbiBzY29wZS5cbiAgICpcbiAgICogV2hlbiBkZWZpbmVkIGFzIHBhcnQgb2YgYSByZXNvdXJjZSBzZXJ2ZXIsIHNjb3BlcyBhcmUgb24gdGhlIGZvcm1hdDpcbiAgICogYHtyZXNvdXJjZSBzZXJ2ZXIgaWRlbnRpZmllcn0ve3Njb3BlIG5hbWV9YCwgZS5nLiBgZXh0ZXJuYWwvdmlld191c2Vyc2AuXG4gICAqXG4gICAqIFRvIGdldCBtb3JlIHR5cGUgc2FmZXR5IG9uIHRoaXMgcGFyYW1ldGVyLCBzZWUgdGhlIGRvY3MgZm9yIHRoZSBgQXV0aFNjb3Blc1RgIHR5cGUgcGFyYW1ldGVyIG9uXG4gICAqIHtAbGluayBBcGlHYXRld2F5fS5cbiAgICovXG4gIHJlcXVpcmVkU2NvcGU/OiBBdXRoU2NvcGVzVFxuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHNlY3JldCBpbiBBV1MgU2VjcmV0cyBNYW5hZ2VyIHRoYXQgc3RvcmVzIGJhc2ljIGF1dGggY3JlZGVudGlhbHMgZm9yIHRoZSBiYWNrZW5kXG4gICAqIHNlcnZpY2UsIHRvIGJlIGZvcndhcmRlZCB0byB0aGUgYmFja2VuZCBpZiBDb2duaXRvIHVzZXIgcG9vbCBhdXRoZW50aWNhdGlvbiBzdWNjZWVkZWQuXG4gICAqXG4gICAqIFRoZSBzZWNyZXQgdmFsdWUgbXVzdCBmb2xsb3cgdGhpcyBmb3JtYXQ6XG4gICAqIGBgYGpzb25cbiAgICogeyBcInVzZXJuYW1lXCI6IFwiPHVzZXJuYW1lPlwiLCBcInBhc3N3b3JkXCI6IFwiPHBhc3N3b3JkPlwiIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFRoaXMgcHJvcCBzb2x2ZXMgdGhlIGZvbGxvd2luZyB1c2UtY2FzZTpcbiAgICogLSBZb3Ugd2FudCB0byBkbyBDb2duaXRvIHVzZXIgcG9vbCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgQVBJIEdhdGV3YXlcbiAgICogLSBZb3Ugd2FudCBhbiBhZGRpdGlvbmFsIGF1dGggY2hlY2sgaW4gdGhlIGJhY2tlbmQsIGJ1dCB5b3UgZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGggQ29nbml0b1xuICAgKiAgIHRoZXJlXG4gICAqIC0gVGhlIGJhY2tlbmQgdXNlcyBiYXNpYyBhdXRoXG4gICAqXG4gICAqIFRoaXMgcHJvcCBzb2x2ZXMgdGhpcyBieSBsZXR0aW5nIHlvdSBzcGVjaWZ5IGNyZWRlbnRpYWxzIHRvIHBhc3MgdG8gdGhlIGJhY2tlbmQgYWZ0ZXIgQVBJLUdXXG4gICAqIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRzLiBZb3UgY2FuIHBhc3MgdGhlIGVuY29kZWQgY3JlZGVudGlhbHMgdGhyb3VnaFxuICAgKiB7QGxpbmsgQWxiSW50ZWdyYXRpb25Qcm9wcy5tYXBQYXJhbWV0ZXJzfSwgdXNpbmcgdGhlIGBhdXRob3JpemVyLmludGVybmFsQXV0aG9yaXphdGlvbkhlYWRlcmBcbiAgICogY29udGV4dCB2YXJpYWJsZSwgbGlrZSBzbzpcbiAgICogYGBgXG4gICAqIG1hcFBhcmFtZXRlcnM6IChwYXJhbWV0ZXJzKSA9PiBwYXJhbWV0ZXJzLm92ZXJ3cml0ZUhlYWRlcihcbiAgICogICAvLyAnQXV0aG9yaXphdGlvbicgaGVhZGVyIGNhbm5vdCBiZSBvdmVycmlkZGVuLCBzbyB3ZSB1c2UgYSBjdXN0b20gaGVhZGVyXG4gICAqICAgXCJYLUludGVybmFsLUF1dGhvcml6YXRpb25cIixcbiAgICogICBhcGlndy5NYXBwaW5nVmFsdWUuY29udGV4dFZhcmlhYmxlKFwiYXV0aG9yaXplci5pbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXJcIiksXG4gICAqIClcbiAgICogYGBgXG4gICAqIFRoZSBiYWNrZW5kIGNhbiB0aGVuIGNoZWNrIHRoZSBgWC1JbnRlcm5hbC1BdXRob3JpemF0aW9uYCBoZWFkZXIuXG4gICAqL1xuICBjcmVkZW50aWFsc0ZvckludGVybmFsQXV0aG9yaXphdGlvbj86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBCYXNpY0F1dGhBdXRob3JpemVyUHJvcHMgPSB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHNlY3JldCBpbiBBV1MgU2VjcmV0cyBNYW5hZ2VyIHRoYXQgc3RvcmVzIGJhc2ljIGF1dGggY3JlZGVudGlhbHMuIFRoZSBzZWNyZXQgdmFsdWVcbiAgICogc2hvdWxkIGZvbGxvdyB0aGlzIGZvcm1hdDpcbiAgICogYGBganNvblxuICAgKiB7IFwidXNlcm5hbWVcIjogXCI8dXNlcm5hbWU+XCIsIFwicGFzc3dvcmRcIjogXCI8cGFzc3dvcmQ+XCIgfVxuICAgKiBgYGBcbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBmb3JtYXQgaXMgYWxzbyBzdXBwb3J0ZWQ6XG4gICAqIGBgYGpzb25cbiAgICogeyBcImNyZWRlbnRpYWxzXCI6IFwiW1xcXCI8ZW5jb2RlZC1jcmVkZW50aWFsLTE+XFxcIixcXFwiPGVuY29kZWQtY3JlZGVudGlhbC0yPlxcXCJdXCIgfVxuICAgKiBgYGBcbiAgICogLi4uY29uc2lzdGluZyBvZjpcbiAgICogLSBBIHNpbmdsZSBrZXksIGBjcmVkZW50aWFsc2BcbiAgICogLSBXaXRoIGEgX3N0cmluZ18gdmFsdWVcbiAgICogLSBXaGljaCBpcyBhIHN0cmluZ2lmaWVkLCBlc2NhcGVkIEpTT04gYXJyYXkgb2YgYmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHNcbiAgICogLSBJbiB3aGljaCBlYWNoIGVsZW1lbnQgaXMgZW5jb2RlZCBmcm9tIGA8dXNlcm5hbWU+OjxwYXNzd29yZD5gXG4gICAqXG4gICAqIElmIHRoZSBzZWNyZXQgaXMgb24gdGhpcyBmb3JtYXQsIHRoZSBhdXRob3JpemVyIHdpbGwgbWF0Y2ggdGhlIHJlcXVlc3QncyBBdXRob3JpemF0aW9uIGhlYWRlclxuICAgKiBhZ2FpbnN0IGFueSBvbmUgb2YgdGhlc2UgZW5jb2RlZCBjcmVkZW50aWFscy5cbiAgICpcbiAgICogVGhlIHJlYXNvbiB0aGF0IHRoaXMgc2Vjb25kIGZvcm1hdCBzdG9yZXMgc3RyaW5naWZpZWQgSlNPTiBfaW5zaWRlXyBKU09OLCBpcyBkdWUgdG8gYVxuICAgKiBsaW1pdGF0aW9uIGluIExpZmxpZydzIGBsb2FkLXNlY3JldHNgIGxpYnJhcnksIHdoaWNoIG9ubHkgYWxsb3dzIHN0b3Jpbmcgc3RyaW5ncyB2YWx1ZXMuXG4gICAqL1xuICBjcmVkZW50aWFsc1NlY3JldE5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wczxcbiAgQXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+ID0ge1xuICB1c2VyUG9vbDogSVVzZXJQb29sXG5cbiAgLyoqXG4gICAqIE5hbWUgb2Ygc2VjcmV0IGluIEFXUyBTZWNyZXRzIE1hbmFnZXIgdGhhdCBzdG9yZXMgYmFzaWMgYXV0aCBjcmVkZW50aWFscy4gVGhlIHNlY3JldCB2YWx1ZVxuICAgKiBzaG91bGQgZm9sbG93IHRoaXMgZm9ybWF0OlxuICAgKiBgYGBqc29uXG4gICAqIHsgXCJ1c2VybmFtZVwiOiBcIjx1c2VybmFtZT5cIiwgXCJwYXNzd29yZFwiOiBcIjxwYXNzd29yZD5cIiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGZvcm1hdCBpcyBhbHNvIHN1cHBvcnRlZDpcbiAgICogYGBganNvblxuICAgKiB7IFwiY3JlZGVudGlhbHNcIjogXCJbXFxcIjxlbmNvZGVkLWNyZWRlbnRpYWwtMT5cXFwiLFxcXCI8ZW5jb2RlZC1jcmVkZW50aWFsLTI+XFxcIl1cIiB9XG4gICAqIGBgYFxuICAgKiAuLi5jb25zaXN0aW5nIG9mOlxuICAgKiAtIEEgc2luZ2xlIGtleSwgYGNyZWRlbnRpYWxzYFxuICAgKiAtIFdpdGggYSBfc3RyaW5nXyB2YWx1ZVxuICAgKiAtIFdoaWNoIGlzIGEgc3RyaW5naWZpZWQsIGVzY2FwZWQgSlNPTiBhcnJheSBvZiBiYXNlNjQtZW5jb2RlZCBjcmVkZW50aWFsc1xuICAgKiAtIEluIHdoaWNoIGVhY2ggZWxlbWVudCBpcyBlbmNvZGVkIGZyb20gYDx1c2VybmFtZT46PHBhc3N3b3JkPmBcbiAgICpcbiAgICogSWYgdGhlIHNlY3JldCBpcyBvbiB0aGlzIGZvcm1hdCwgdGhlIGF1dGhvcml6ZXIgd2lsbCBtYXRjaCB0aGUgcmVxdWVzdCdzIEF1dGhvcml6YXRpb24gaGVhZGVyXG4gICAqIGFnYWluc3QgYW55IG9uZSBvZiB0aGVzZSBlbmNvZGVkIGNyZWRlbnRpYWxzLlxuICAgKlxuICAgKiBUaGUgcmVhc29uIHRoYXQgdGhpcyBzZWNvbmQgZm9ybWF0IHN0b3JlcyBzdHJpbmdpZmllZCBKU09OIF9pbnNpZGVfIEpTT04sIGlzIGR1ZSB0byBhXG4gICAqIGxpbWl0YXRpb24gaW4gTGlmbGlnJ3MgYGxvYWQtc2VjcmV0c2AgbGlicmFyeSwgd2hpY2ggb25seSBhbGxvd3Mgc3RvcmluZyBzdHJpbmdzIHZhbHVlcy5cbiAgICovXG4gIGJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IGFjY2VzcyB0b2tlbiBjbGFpbXMgY29udGFpbiB0aGUgZ2l2ZW4gc2NvcGUuIE9ubHkgYXBwbGljYWJsZSBmb3IgcmVxdWVzdHMgdGhhdFxuICAgKiB1c2UgYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgKG5vdCBhcHBsaWNhYmxlIGZvciBiYXNpYyBhdXRoKS5cbiAgICpcbiAgICogV2hlbiBkZWZpbmVkIGFzIHBhcnQgb2YgYSByZXNvdXJjZSBzZXJ2ZXIsIHNjb3BlcyBhcmUgb24gdGhlIGZvcm1hdDpcbiAgICogYHtyZXNvdXJjZSBzZXJ2ZXIgaWRlbnRpZmllcn0ve3Njb3BlIG5hbWV9YCwgZS5nLiBgZXh0ZXJuYWwvdmlld191c2Vyc2AuXG4gICAqXG4gICAqIFRvIGdldCBtb3JlIHR5cGUgc2FmZXR5IG9uIHRoaXMgcGFyYW1ldGVyLCBzZWUgdGhlIGRvY3MgZm9yIHRoZSBgQXV0aFNjb3Blc1RgIHR5cGUgcGFyYW1ldGVyIG9uXG4gICAqIHtAbGluayBBcGlHYXRld2F5fS5cbiAgICovXG4gIHJlcXVpcmVkU2NvcGU/OiBBdXRoU2NvcGVzVFxufVxuXG5leHBvcnQgdHlwZSBBcGlHYXRld2F5QWNjZXNzTG9nc1Byb3BzID0ge1xuICAvKipcbiAgICogRGVsZXRlIHRoZSBhY2Nlc3MgbG9ncyBpZiB0aGlzIGNvbnN0cnVjdCBpcyBkZWxldGVkP1xuICAgKlxuICAgKiBNYXliZSB5b3Ugd2FudCB0byBERVNUUk9ZIGluc3RlYWQuIE9yIGZvciBsZWdhbCByZWFzb25zLCByZXRhaW4gZm9yIGF1ZGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LlJFVEFJTlxuICAgKi9cbiAgcmVtb3ZhbFBvbGljeT86IGNkay5SZW1vdmFsUG9saWN5XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRvIGtlZXAgdGhlIGxvZ3MuIElmIHVuZGVmaW5lZCwgdXNlcyB0aGUgc2FtZSBkZWZhdWx0IGFzIG5ldyBBV1MgbG9nIGdyb3Vwcy5cbiAgICpcbiAgICogQGRlZmF1bHQgUmV0ZW50aW9uRGF5cy5UV09fWUVBUlNcbiAgICovXG4gIHJldGVudGlvbj86IGxvZ3MuUmV0ZW50aW9uRGF5c1xuXG4gIC8qKlxuICAgKiBBIGN1c3RvbSBKU09OIGxvZyBmb3JtYXQsIHdoaWNoIHVzZXMgdmFyaWFibGVzIGZyb20gYFwiJGNvbnRleHRcImAuXG4gICAqXG4gICAqIFNlZSBbQVdTOiBDbG91ZFdhdGNoIGxvZyBmb3JtYXRzIGZvciBBUEkgR2F0ZXdheV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NldC11cC1sb2dnaW5nLmh0bWwjYXBpZ2F0ZXdheS1jbG91ZHdhdGNoLWxvZy1mb3JtYXRzKVxuICAgKiBmb3IgZm9ybWF0cyBhbmQgcnVsZXMuIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBvdGhlciBmb3JtYXRzIGxpa2UgQ0xGIGFuZCBYTUwsIGJ1dCB0aGlzIGNvbnN0cnVjdFxuICAgKiBvbmx5IHN1cHBvcnRzIEpTT04gZm9yIG5vdy5cbiAgICpcbiAgICogRm9yIGEgbGlzdCBvZiBhbGwgcG9zc2libGUgdmFyaWFibGVzIHRvIGxvZywgc2VlXG4gICAqIFtBV1M6ICRjb250ZXh0IFZhcmlhYmxlcyBmb3IgZGF0YSBtb2RlbHMsIGF1dGhvcml6ZXJzLCBtYXBwaW5nIHRlbXBsYXRlcywgYW5kIENsb3VkV2F0Y2ggYWNjZXNzIGxvZ2dpbmddKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9hcGktZ2F0ZXdheS1tYXBwaW5nLXRlbXBsYXRlLXJlZmVyZW5jZS5odG1sI2NvbnRleHQtdmFyaWFibGUtcmVmZXJlbmNlKVxuICAgKiBhbmRcbiAgICogW0FXUzogJGNvbnRleHQgVmFyaWFibGVzIGZvciBhY2Nlc3MgbG9nZ2luZyBvbmx5XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvYXBpLWdhdGV3YXktbWFwcGluZy10ZW1wbGF0ZS1yZWZlcmVuY2UuaHRtbCNjb250ZXh0LXZhcmlhYmxlLXJlZmVyZW5jZS1hY2Nlc3MtbG9nZ2luZy1vbmx5KSAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBkZWZhdWx0QWNjZXNzTG9nRm9ybWF0fVxuICAgKi9cbiAgYWNjZXNzTG9nRm9ybWF0PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxufVxuXG4vKipcbiAqIFRoaXMgY29uc3RydWN0IHRyaWVzIHRvIHNpbXBsaWZ5IHRoZSBjcmVhdGlvbiBvZiBhbiBBUEkgR2F0ZXdheSBmb3IgYSBzZXJ2aWNlLCBieSBjb2xsZWN0aW5nIG1vc3RcbiAqIG9mIHRoZSBjb21tb24gc2V0dXAgaGVyZS5cbiAqXG4gKiBUaGUgYXBwcm9hY2ggZm9sbG93ZWQgaW4gdGhpcyBjb25zdHJ1Y3QgaXM6XG4gKiAxLiBPbmUgQVBJLUdXIHBlciBzZXJ2aWNlXG4gKiAyLiBPbmUgc3ViZG9tYWluIHBlciBBUEktR1cgLyBzZXJ2aWNlXG4gKiAzLiBVc2UgSFRUUCBBUEksIG5vdCBSRVNUXG4gKiA0LiBVc2UgYSAkZGVmYXVsdCBzdGFnZSB3aXRoIGF1dG9kZXBsb3lcbiAqIDUuIFN1cHBvcnQgbXVsdGlwbGUgcm91dGVzICh3aXRoIHBvc3NpYmxlIGAve3Byb3h5K31gIHRvIGxldCBhbGwgc3ViLXBhdGhzIHRocm91Z2gpXG4gKiA2LiBBbGxvdyBjdXN0b20gaW50ZWdyYXRpb24vYXV0aG9yaXplciBmb3IgZWFjaCByb3V0ZSwgb3IgZGVmYXVsdHMgZm9yIHRoZSB3aG9sZSBnYXRld2F5XG4gKlxuICogVGhlIHJvdXRlIGludGVncmF0aW9uIGlzIG9uZSBvZiB0aGVzZTpcbiAqIC0gQUxCIHByaXZhdGUgaW50ZWdyYXRpb24gd2l0aCBWUEMgTGluayB1c2luZyBIVFRQUyB0byB0aGUgQUxCXG4gKiAtIExhbWJkYSBpbnRlZ3JhdGlvblxuICogLSBTUVMgaW50ZWdyYXRpb25cbiAqXG4gKiAjIyMgTG9hZCBCYWxhbmNlciBTZWN1cml0eSBHcm91cFxuICpcbiAqIE5vdGUgdGhhdCB0aGUgbG9hZCBiYWxhbmNlciB1c2VkIGluIGFuIHtAbGluayBBbGJJbnRlZ3JhdGlvblByb3BzfSBtdXN0IGFsbG93IG91dGJvdW5kIEhUVFBTXG4gKiB0cmFmZmljIHRvIGl0cyBTZWN1cml0eUdyb3VwLiBPdGhlcndpc2UsIHRoZSBWUEMgTGluayB1c2VkIGJ5IHRoZSBBUEktR1cgY2FuJ3QgZ2V0IHRyYWZmaWMgZnJvbVxuICogdGhlIEFMQi5cbiAqXG4gKiBgYGBcbiAqIGNvbnN0IGxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAgPSBuZXcgZWMyLlNlY3VyaXR5R3JvdXAoLi4uLCB7XG4gKiAgIGFsbG93QWxsT3V0Ym91bmQ6IGZhbHNlLFxuICogfSlcbiAqXG4gKiBsb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLmFkZEVncmVzc1J1bGUoXG4gKiAgIGxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAsXG4gKiAgIGVjMi5Qb3J0LnRjcCg0NDMpLFxuICogICBcIk91dGJvdW5kIHRvIHNlbGYgZm9yIEFMQiB0byBBUEktR1cgVlBDLUxpbmtcIixcbiAqIClcbiAqXG4gKiBjb25zdCBsb2FkQmFsYW5jZXIgPSBuZXcgbGlmbGlnTG9hZEJhbGFuY2VyLkxvYWRCYWxhbmNlciguLi4sXG4gKiAgIHtcbiAqICAgICBvdmVycmlkZUxvYWRCYWxhbmNlclByb3BzOiB7XG4gKiAgICAgICBzZWN1cml0eUdyb3VwOiBsb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLFxuICogICAgIH0sXG4gKiAgIH0sXG4gKiApXG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgQXV0aFNjb3Blc1QgVGhpcyB0eXBlIHBhcmFtZXRlciBhbGxvd3MgeW91IHRvIGltcHJvdmUgdHlwZSBzYWZldHkgb24gdGhlXG4gKiBgcmVxdWlyZWRTY29wZWAgZmllbGQgb24ge0BsaW5rIENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplclByb3BzfSwgYnkgbmFycm93aW5nIHRoZSB0eXBlXG4gKiB0byBzcGVjaWZpYyBzdHJpbmdzLiBZb3UgY2FuIHRoZW4gZXh0ZW5kIHRoZSBgQXBpR2F0ZXdheWAgd2l0aCB0aGlzIHR5cGUgdG8gZW5mb3JjZSB0aG9zZSBzY29wZXNcbiAqIGFjcm9zcyB0aGUgYXBwbGljYXRpb24uIFJlbWVtYmVyIHRoYXQgYXV0aCBzY29wZXMgbXVzdCBiZSBvbiB0aGUgZm9ybWF0XG4gKiBge3Jlc291cmNlIHNlcnZlciBpZGVudGlmaWVyfS97c2NvcGUgbmFtZX1gLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBcbiAqIHR5cGUgQXV0aFNjb3BlcyA9IFwiZXh0ZXJuYWwvcmVhZF91c2Vyc1wiIHwgXCJpbnRlcm5hbC9jcmVhdGVfdXNlcnNcIlxuICpcbiAqIGV4cG9ydCBjbGFzcyBNeVByb2plY3RBcGlHYXRld2F5IGV4dGVuZHMgQXBpR2F0ZXdheTxBdXRoU2NvcGVzPiB7fVxuICogYGBgXG4gKiBUeXBlU2NyaXB0IHdpbGwgdGhlbiBlbmZvcmNlIHRoYXQgYHJlcXVpcmVkU2NvcGVgIGlzIG9uZSBvZiBgQXV0aFNjb3Blc2AsIGFuZCBwcm92aWRlXG4gKiBhdXRvLWNvbXBsZXRlLlxuICpcbiAqIEBhdXRob3IgS3Jpc3RpYW4gUmVrc3RhZCA8a3JlQGNhcHJhY29uc3VsdGluZy5ubz5cbiAqIEBhdXRob3IgSGVybWFubiBNw7hya3JpZCA8aGVtQGxpZmxpZy5ubz5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwaUdhdGV3YXk8XG4gIEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgLyoqIFRoZSBBUEkgR2F0ZXdheSBIVFRQIEFQSS4gVGhpcyBpcyB0aGUgbWFpbiBjb25zdHJ1Y3QgZm9yIEFQSS1HVy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGh0dHBBcGk6IGFwaWd3Lkh0dHBBcGlcblxuICAvKiogVGhlIHJvdXRlcyB3aGljaCBjb25uZWN0IHRoZSB7QGxpbmsgaHR0cEFwaX0gdG8gdGhlIGJhY2tlbmQgaW50ZWdyYXRpb24ocykuICovXG4gIHB1YmxpYyByZWFkb25seSByb3V0ZXM6IGFwaWd3Lkh0dHBSb3V0ZVtdID0gW11cblxuICAvKiogVGhlIGRvbWFpbiB3aGljaCBjb25zdW1lcnMgbXVzdCB1c2UuKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbjogc3RyaW5nXG5cbiAgLyoqIEFjY2VzcyBsb2cgZ3JvdXAuICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dHcm91cDogbG9ncy5Mb2dHcm91cFxuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IEFwaUdhdGV3YXlQcm9wczxBdXRoU2NvcGVzVD5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQXBpR2F0ZXdheVByb3BzPEF1dGhTY29wZXNUPixcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuXG4gICAgQXBpR2F0ZXdheS52YWxpZGF0ZVByb3BzKHByb3BzLCBpZCwgY2RrLlN0YWNrLm9mKHRoaXMpKVxuXG4gICAgY29uc3QgY3VzdG9tRG9tYWluID0gbmV3IEN1c3RvbURvbWFpbih0aGlzLCBcIkN1c3RvbURvbWFpblwiLCBwcm9wcy5kbnMpXG4gICAgdGhpcy5kb21haW4gPSBjdXN0b21Eb21haW4uY3VzdG9tRG9tYWluTmFtZVxuXG4gICAgbGV0IGNvcnNPcHRpb25zOiBhcGlndy5Db3JzUHJlZmxpZ2h0T3B0aW9ucyB8IHVuZGVmaW5lZFxuICAgIGlmIChwcm9wcy5jb3JzQWxsb3dBbGwpIHtcbiAgICAgIGNvcnNPcHRpb25zID0ge1xuICAgICAgICBhbGxvd09yaWdpbnM6IFtcIipcIl0sXG4gICAgICAgIC8vIFwiVGhlIEF1dGhvcml6YXRpb24gaGVhZGVyIGNhbid0IGJlIHdpbGRjYXJkZWQgYW5kIGFsd2F5cyBuZWVkcyB0byBiZSBsaXN0ZWQgZXhwbGljaXRseVwiXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvSGVhZGVycy9BY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzXG4gICAgICAgIC8vIENvbnRlbnQtVHlwZSBtYXkgYWxzbyByZXF1aXJlIGV4cGxpY2l0IHdoaXRlbGlzdGluZzogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzYzNTY3NjQ3XG4gICAgICAgIGFsbG93SGVhZGVyczogW1wiQXV0aG9yaXphdGlvblwiLCBcIkNvbnRlbnQtVHlwZVwiLCBcIipcIl0sXG4gICAgICAgIC8vIE5vdCB1c2luZyAnKicgaGVyZSwgYmVjYXVzZSBcIkluIHJlcXVlc3RzIHdpdGggY3JlZGVudGlhbHMsIGl0IGlzIHRyZWF0ZWQgYXMgdGhlIGxpdGVyYWxcbiAgICAgICAgLy8gbWV0aG9kIG5hbWUgJyonIHdpdGhvdXQgc3BlY2lhbCBzZW1hbnRpY3NcIlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0hlYWRlcnMvQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kc1xuICAgICAgICBhbGxvd01ldGhvZHM6IFtcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5HRVQsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuUE9TVCxcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5QVVQsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuUEFUQ0gsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuREVMRVRFLFxuICAgICAgICAgIGFwaWd3LkNvcnNIdHRwTWV0aG9kLk9QVElPTlMsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuSEVBRCxcbiAgICAgICAgXSxcbiAgICAgICAgbWF4QWdlOiBjZGsuRHVyYXRpb24uZGF5cygxKSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgYWN0dWFsIEFQSS4gVGhpcyBob2xkcyB0aGUgcm91dGVzLCBhdXRob3JpemVycyBhbmQgaW50ZWdyYXRpb25zLlxuICAgIGNvbnN0IGFwaSA9IG5ldyBhcGlndy5IdHRwQXBpKHRoaXMsIFwiSHR0cEFwaS1cIiArIHByb3BzLmRucy5zdWJkb21haW4sIHtcbiAgICAgIC8vIGRlZmF1bHRJbnRlZ3JhdGlvbjogZGVmYXVsdEludGVncmF0aW9uLCAvLyBUaGlzIGlzIGZvciBhIGNhdGNoLWFsbCAkZGVmYXVsdCByb3V0ZVxuICAgICAgZGVzY3JpcHRpb246IGBBbiBIVFRQIEFQSSBmb3IgJHtwcm9wcy5kbnMuc3ViZG9tYWlufS4ke3Byb3BzLmRucy5ob3N0ZWRab25lLnpvbmVOYW1lfS5gLFxuICAgICAgZGlzYWJsZUV4ZWN1dGVBcGlFbmRwb2ludDogdHJ1ZSwgLy8gRm9yY2UgZXh0ZXJuYWxzIHRvIGdvIHRocm91Z2ggY3VzdG9tIGRvbWFpbi4gTVVTVCBiZSB0cnVlIHdoZW4gdXNpbmcgTXV0dWFsIFRMUywgZm9yIHNlY3VyaXR5IHJlYXNvbnNcbiAgICAgIGNyZWF0ZURlZmF1bHRTdGFnZTogdHJ1ZSxcbiAgICAgIGRlZmF1bHREb21haW5NYXBwaW5nOiB7IGRvbWFpbk5hbWU6IGN1c3RvbURvbWFpbi5hcGlHd0N1c3RvbURvbWFpbiB9LFxuICAgICAgY29yc1ByZWZsaWdodDogY29yc09wdGlvbnMsXG4gICAgICAuLi5wcm9wcz8ucHJvcHNPdmVycmlkZT8uaHR0cEFwaSxcbiAgICB9KVxuICAgIHRoaXMuaHR0cEFwaSA9IGFwaVxuXG4gICAgY29uc3Qgc3RhZ2UgPSBhcGkuZGVmYXVsdFN0YWdlPy5ub2RlLmRlZmF1bHRDaGlsZCBhcyBhcGlndy5DZm5TdGFnZVxuXG4gICAgY29uc3QgbG9ncyA9IG5ldyBBcGlHYXRld2F5QWNjZXNzTG9ncyhcbiAgICAgIHRoaXMsXG4gICAgICBcIkFjY2Vzc0xvZ3NcIixcbiAgICAgIHN0YWdlLFxuICAgICAgcHJvcHMuYWNjZXNzTG9ncyxcbiAgICAgIGRlZmF1bHRBY2Nlc3NMb2dGb3JtYXQsXG4gICAgKVxuICAgIHRoaXMubG9nR3JvdXAgPSBsb2dzLmxvZ0dyb3VwXG5cbiAgICBzdGFnZS5kZWZhdWx0Um91dGVTZXR0aW5ncyA9IHtcbiAgICAgIC4uLnN0YWdlLmRlZmF1bHRSb3V0ZVNldHRpbmdzLFxuICAgICAgZGV0YWlsZWRNZXRyaWNzRW5hYmxlZDogcHJvcHMuZGV0YWlsZWRNZXRyaWNzID8/IHRydWUsXG4gICAgICB0aHJvdHRsaW5nQnVyc3RMaW1pdDogcHJvcHMudGhyb3R0bGluZz8uYnVyc3QsIC8vIERlZmF1bHQgZm9yIGFjY291bnQgaXMgNV8wMDBcbiAgICAgIHRocm90dGxpbmdSYXRlTGltaXQ6IHByb3BzLnRocm90dGxpbmc/LnJhdGUsIC8vIERlZmF1bHQgZm9yIGFjY291bnQgaXMgMTBfMDAwXG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdEludGVncmF0aW9uID0gcHJvcHMuZGVmYXVsdEludGVncmF0aW9uXG4gICAgICA/IHRoaXMuY3JlYXRlSW50ZWdyYXRpb24ocHJvcHMuZGVmYXVsdEludGVncmF0aW9uLCBwcm9wcy5kbnMpXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZGVmYXVsdEF1dGhvcml6ZXIgPSBwcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvblxuICAgICAgPyB0aGlzLmNyZWF0ZUF1dGhvcml6ZXIoXCJEZWZhdWx0QXV0aG9yaXplclwiLCBwcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvbilcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHByb3BzLnJvdXRlcykge1xuICAgICAgbGV0IGludGVncmF0aW9uOiBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvblxuICAgICAgaWYgKHJvdXRlLmludGVncmF0aW9uKSB7XG4gICAgICAgIGludGVncmF0aW9uID0gdGhpcy5jcmVhdGVJbnRlZ3JhdGlvbihyb3V0ZS5pbnRlZ3JhdGlvbiwgcHJvcHMuZG5zKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZWdyYXRpb24gPSBkZWZhdWx0SW50ZWdyYXRpb24hIC8vIFZlcmlmaWVkIGluIHZhbGlkYXRlUHJvcHNcbiAgICAgIH1cblxuICAgICAgbGV0IGF1dGhvcml6ZXI6IGFwaWd3LklIdHRwUm91dGVBdXRob3JpemVyIHwgdW5kZWZpbmVkXG4gICAgICBpZiAocm91dGUuYXV0aG9yaXphdGlvbikge1xuICAgICAgICBhdXRob3JpemVyID0gdGhpcy5jcmVhdGVBdXRob3JpemVyKFxuICAgICAgICAgIC8vIFVzaW5nIHRoZSByb3V0ZSBwYXRoIGhlcmUgY2F1c2VkIENsb3VkRm9ybWF0aW9uIHRvIGZhaWwgZHVlIHRvIHJlc291cmNlIG5hbWVzIGJlaW5nIHRvb1xuICAgICAgICAgIC8vIGxvbmcuIFRoZXJlZm9yZSwgd2Ugbm93IGhhc2ggdGhlIHJvdXRlIHBhdGggdG8gZ2V0IGEgc2hvcnRlciBuYW1lLlxuICAgICAgICAgIGBSb3V0ZUF1dGhvcml6ZXIke3Nob3J0SGFzaChgJHtyb3V0ZS5tZXRob2QgPz8gXCJcIn0ke3JvdXRlLnBhdGh9YCl9YCxcbiAgICAgICAgICByb3V0ZS5hdXRob3JpemF0aW9uLFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdXRob3JpemVyID0gZGVmYXVsdEF1dGhvcml6ZXJcbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm91dGVQYXRocyA9IFtyb3V0ZS5wYXRoXVxuICAgICAgaWYgKHJvdXRlLmluY2x1ZGVTdWJwYXRocyA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBJZiB3ZSBpbmNsdWRlIHN1Yi1wYXRocywgd2UgYWRkIGFuIGFkZGl0aW9uYWwgcm91dGUgd2l0aCAve3Byb3h5K30gKHRoZSArIG1lYW5zIGl0IHdpbGxcbiAgICAgICAgLy8gbWF0Y2ggYWxsIHN1YnJvdXRlcykuIFdlIHdhbnQgYm90aCB0aGlzIHJvdXRlIGFuZCB0aGUgbm9ybWFsIHJvdXRlIHdpdGhvdXQgL3twcm94eSt9LFxuICAgICAgICAvLyBzaW5jZSAve3Byb3h5K30gd2lsbCBvbmx5IG1hdGNoIHRoZSBiYXNlIHBhdGggd2l0aCB0cmFpbGluZyBzbGFzaC5cbiAgICAgICAgcm91dGVQYXRocy5wdXNoKFxuICAgICAgICAgIHJvdXRlLnBhdGggKyAocm91dGUucGF0aCA9PT0gXCIvXCIgPyBcIlwiIDogXCIvXCIpICsgXCJ7cHJveHkrfVwiLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGVQYXRoIG9mIHJvdXRlUGF0aHMpIHtcbiAgICAgICAgLy8gVGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIEFQSSBHYXRld2F5IGNvbnN0cnVjdCBoYWQgYSBzaW5nbGUgcm91dGUgd2l0aCB0aGUgSURcbiAgICAgICAgLy8gJ0RlZmF1bHRQcm94eVJvdXRlJywgYW5kIGFsbCBnYXRld2F5cyB3ZSB1c2VkIGV4cG9zZWQgdGhlIHJvdXRlIC97cHJveHkrfS4gV2hlbiB0cnlpbmcgdG9cbiAgICAgICAgLy8gY2hhbmdlIHRvIHRoaXMgbmV3IHZlcnNpb24gb2YgdGhlIGNvbnN0cnVjdCwgZGVwbG95bWVudCBmYWlsZWQgZm9yIGdhdGV3YXlzIGV4cG9zaW5nXG4gICAgICAgIC8vIC97cHJveHkrfSwgYmVjYXVzZSBcImEgcm91dGUgd2l0aCB0aGF0IGtleSBbaS5lLiBwYXRoICsgbWV0aG9kXSBhbHJlYWR5IGV4aXN0c1wiLiBXZSB0aGlua1xuICAgICAgICAvLyB0aGlzIG1heSBiZSBiZWNhdXNlIHdlIHVzZWQgdGhlIHNhbWUgcm91dGUgcGF0aCwgYnV0IHdpdGggYSBuZXcgcm91dGUgSUQsIGNhdXNpbmdcbiAgICAgICAgLy8gY29uZnVzaW9uIGZvciBDbG91ZEZvcm1hdGlvbi4gU28gd2Uga2VlcCB0aGUgb2xkIHJvdXRlIElEIGhlcmUgZm9yIC97cHJveHkrfS5cbiAgICAgICAgY29uc3Qgcm91dGVJZCA9XG4gICAgICAgICAgcm91dGVQYXRoID09PSBcIi97cHJveHkrfVwiID8gXCJEZWZhdWx0UHJveHlSb3V0ZVwiIDogYFJvdXRlLSR7cm91dGVQYXRofWBcblxuICAgICAgICB0aGlzLnJvdXRlcy5wdXNoKFxuICAgICAgICAgIG5ldyBhcGlndy5IdHRwUm91dGUodGhpcywgcm91dGVJZCwge1xuICAgICAgICAgICAgaHR0cEFwaTogYXBpLFxuICAgICAgICAgICAgaW50ZWdyYXRpb246IGludGVncmF0aW9uLFxuICAgICAgICAgICAgYXV0aG9yaXplcjogYXV0aG9yaXplcixcbiAgICAgICAgICAgIHJvdXRlS2V5OiBhcGlndy5IdHRwUm91dGVLZXkud2l0aChcbiAgICAgICAgICAgICAgcm91dGVQYXRoLFxuICAgICAgICAgICAgICByb3V0ZS5tZXRob2RcbiAgICAgICAgICAgICAgICA/IGFwaWd3Lkh0dHBNZXRob2Rbcm91dGUubWV0aG9kXVxuICAgICAgICAgICAgICAgIDogYXBpZ3cuSHR0cE1ldGhvZC5BTlksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFnUmVzb3VyY2VzKHRoaXMsICgpID0+ICh7IHNlcnZpY2U6IHByb3BzLmRucy5zdWJkb21haW4gfSkpXG4gIH1cblxuICAvKiogQHRocm93cyBFcnJvciAqL1xuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZVByb3BzKFxuICAgIHByb3BzOiBBcGlHYXRld2F5UHJvcHMsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdGFjazogY2RrLlN0YWNrLFxuICApIHtcbiAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHByb3BzLnJvdXRlcykge1xuICAgICAgaWYgKCFyb3V0ZS5pbnRlZ3JhdGlvbiAmJiAhcHJvcHMuZGVmYXVsdEludGVncmF0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm8gaW50ZWdyYXRpb24gZGVmaW5lZCBmb3Igcm91dGUgJyR7cm91dGUucGF0aH0nLCBhbmQgbm8gZGVmYXVsdCBpbnRlZ3JhdGlvbiBzcGVjaWZpZWQgZm9yIHRoZSBnYXRld2F5YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKCFyb3V0ZS5hdXRob3JpemF0aW9uICYmICFwcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5vIGF1dGhvcml6YXRpb24gZGVmaW5lZCBmb3Igcm91dGUgJyR7cm91dGUucGF0aH0nLCBhbmQgbm8gZGVmYXVsdCBhdXRob3JpemF0aW9uIHNwZWNpZmllZCBmb3IgdGhlIGdhdGV3YXlgLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAoIXJvdXRlLnBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHBhdGggJyR7cm91dGUucGF0aH0nOiBwYXRocyBtdXN0IGJlZ2luIHdpdGggJy8nICh1c2UgJy8nIGZvciByb290IHBhdGgpYCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKHJvdXRlLnBhdGggIT09IFwiL1wiICYmIHJvdXRlLnBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBwYXRoICcke3JvdXRlLnBhdGh9JzogcGF0aHMgY2Fubm90IGVuZCB3aXRoICcvJyAoZXhjZXB0IHJvb3QgcGF0aClgLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHJvdXRlLmludGVncmF0aW9uPy50eXBlID09PSBcIkFMQlwiICYmXG4gICAgICAgIHJvdXRlLmludGVncmF0aW9uLmhvc3ROYW1lLnN0YXJ0c1dpdGgoXCJodHRwczpcIilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRoZSBhbGJJbnRlZ3JhdGlvbi5ob3N0SHR0cHNOYW1lIHNob3VsZCBub3QgaW5jbHVkZSBhIHByb3RvY29sOiAke3JvdXRlLmludGVncmF0aW9uLmhvc3ROYW1lfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb3BzLmRucy5zdWJkb21haW4gPT09IFwiXCIgfHwgcHJvcHMuZG5zLnN1YmRvbWFpbi5pbmNsdWRlcyhcIiBcIikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFN1YmRvbWFpbiBtdXN0IGJlIHNldCwgYW5kIG5vdCBjb250YWluIHNwYWNlczogJHtwcm9wcy5kbnMuc3ViZG9tYWlufWAsXG4gICAgICApXG4gICAgfVxuICAgIGlmIChwcm9wcy50aHJvdHRsaW5nPy5idXJzdCAmJiBwcm9wcy50aHJvdHRsaW5nLmJ1cnN0ID4gNV8wMDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYOKaoO+4jyBZb3VyIHRocm90dGxpbmcgYnVyc3QgbGltaXQgJyR7cHJvcHMudGhyb3R0bGluZy5idXJzdH0nIGlzIGhpZ2hlciB0aGFuIHRoZSBBV1MgQWNjb3VudCBsaW1pdC4gTWFrZSBzdXJlIHlvdXIgYWNjb3VudCBoYXMgdXBncmFkZWQgdGhpcyBxdW90YSEgYCxcbiAgICAgICAgc3RhY2ssXG4gICAgICAgIGlkLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAocHJvcHMudGhyb3R0bGluZz8ucmF0ZSAmJiBwcm9wcy50aHJvdHRsaW5nLnJhdGUgPiAxMF8wMDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYOKaoO+4jyBZb3VyIHRocm90dGxpbmcgcmF0ZSBsaW1pdCAnJHtwcm9wcy50aHJvdHRsaW5nLnJhdGV9JyBpcyBoaWdoZXIgdGhhbiB0aGUgQVdTIEFjY291bnQgbGltaXQuIE1ha2Ugc3VyZSB5b3VyIGFjY291bnQgaGFzIHVwZ3JhZGVkIHRoaXMgcXVvdGEhIGAsXG4gICAgICAgIHN0YWNrLFxuICAgICAgICBpZCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGF1dGhvcml6ZXIgb25seSBhY2NlcHRzIHJlcXVlc3RzIGZyb20gZXh0ZXJuYWwgdXNlcnMgdGhhdCBhcmUgYXV0aG9yaXplZC5cbiAgICogVW5hdXRob3JpemVkIHVzZXJzIGFyZSBzdG9wcGVkIGluIHRoZSBBUEktR1csIGFuZCBub3QgZm9yd2FyZGVkIHRvIHRoZSBpbnRlZ3JhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQXV0aG9yaXplcjxBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZz4oXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdXRob3JpemF0aW9uOiBBdXRob3JpemF0aW9uUHJvcHM8QXV0aFNjb3Blc1Q+LFxuICApOiBhcGlndy5JSHR0cFJvdXRlQXV0aG9yaXplciB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoIChhdXRob3JpemF0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJOT05FXCI6IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuICAgICAgY2FzZSBcIklBTVwiOiB7XG4gICAgICAgIC8vIEFQSSBHYXRld2F5IGludm9rZXMgeW91ciBBUEkgcm91dGUgb25seSBpZiB0aGUgY2xpZW50IGhhcyBleGVjdXRlLWFwaSBwZXJtaXNzaW9uIGZvciB0aGUgcm91dGUuXG4gICAgICAgIC8vIFRoZSBjbGllbnQgaGFzIHRvIHVzZSBBV1MgU2lnVjQgdG8gaWRlbnRpZnkgdGhlbXNlbHZlcyBpbiB0aGUgcmVxdWVzdC5cbiAgICAgICAgLy8gUmVhZCB0aGlzIHBhZ2UgZm9yIGhlbHAgd2l0aCBJQU0gYW5kIEFQSS1HVyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc2VjdXJpdHlfaWFtX3NlcnZpY2Utd2l0aC1pYW0uaHRtbFxuICAgICAgICAvLyBOb3RlIHRoYXQgW3Jlc291cmNlIHBvbGljaWVzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCBmb3IgSFRUUF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWFjY2Vzcy1jb250cm9sLWlhbS5odG1sKVxuICAgICAgICByZXR1cm4gbmV3IGF1dGhvcml6ZXJzLkh0dHBJYW1BdXRob3JpemVyKClcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJDT0dOSVRPX1VTRVJfUE9PTFwiOiB7XG4gICAgICAgIC8vIFdlIHVzZSBhIGN1c3RvbSBsYW1iZGEgYXV0aG9yaXplciBoZXJlIGluc3RlYWQgb2YgdGhlIGBIdHRwVXNlclBvb2xBdXRob3JpemVyYCBwcm92aWRlZFxuICAgICAgICAvLyBieSBDREssIGluIG9yZGVyIHRvIHN1cHBvcnQgYHJlcXVpcmVkU2NvcGVgIGFuZCBzZXR0aW5nIG9mIGN1c3RvbSBjb250ZXh0IHZhcmlhYmxlcy5cbiAgICAgICAgY29uc3QgYXV0aG9yaXplciA9IG5ldyBDb2duaXRvVXNlclBvb2xBdXRob3JpemVyKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgaWQgKyBcIkxhbWJkYVwiLFxuICAgICAgICAgIGF1dGhvcml6YXRpb24sXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gbmV3IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFBdXRob3JpemVyKGlkLCBhdXRob3JpemVyLmxhbWJkYSwge1xuICAgICAgICAgIHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXIucmVzcG9uc2VUeXBlcyxcbiAgICAgICAgICAvLyBNYXggMWgsIG9yIGRpc2FibGVkICgwcykuIFRoZSB2YWx1ZSBvbmx5IG1hdHRlcnMgd2hlbiBpbnZhbGlkYXRpbmcvZHluYW1pYyBjcmVkZW50aWFsc1xuICAgICAgICAgIHJlc3VsdHNDYWNoZVR0bDogY2RrLkR1cmF0aW9uLmhvdXJzKDEpLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgY2FzZSBcIkJBU0lDX0FVVEhcIjoge1xuICAgICAgICBjb25zdCBhdXRob3JpemVyID0gbmV3IEJhc2ljQXV0aEF1dGhvcml6ZXIoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBpZCArIFwiTGFtYmRhXCIsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbixcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiBuZXcgYXV0aG9yaXplcnMuSHR0cExhbWJkYUF1dGhvcml6ZXIoaWQsIGF1dGhvcml6ZXIubGFtYmRhLCB7XG4gICAgICAgICAgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplci5yZXNwb25zZVR5cGVzLFxuICAgICAgICAgIC8vIE1heCAxaCwgb3IgZGlzYWJsZWQgKDBzKS4gVGhlIHZhbHVlIG9ubHkgbWF0dGVycyB3aGVuIGludmFsaWRhdGluZy9keW5hbWljIGNyZWRlbnRpYWxzXG4gICAgICAgICAgcmVzdWx0c0NhY2hlVHRsOiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjYXNlIFwiQ09HTklUT19VU0VSX1BPT0xfT1JfQkFTSUNfQVVUSFwiOiB7XG4gICAgICAgIGNvbnN0IGF1dGhvcml6ZXIgPSBuZXcgQ29nbml0b1VzZXJQb29sT3JCYXNpY0F1dGhBdXRob3JpemVyKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgaWQgKyBcIkxhbWJkYVwiLFxuICAgICAgICAgIGF1dGhvcml6YXRpb24sXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gbmV3IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFBdXRob3JpemVyKGlkLCBhdXRob3JpemVyLmxhbWJkYSwge1xuICAgICAgICAgIHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXIucmVzcG9uc2VUeXBlcyxcbiAgICAgICAgICAvLyBNYXggMWgsIG9yIGRpc2FibGVkICgwcykuIFRoZSB2YWx1ZSBvbmx5IG1hdHRlcnMgd2hlbiBpbnZhbGlkYXRpbmcvZHluYW1pYyBjcmVkZW50aWFsc1xuICAgICAgICAgIHJlc3VsdHNDYWNoZVR0bDogY2RrLkR1cmF0aW9uLmhvdXJzKDEpLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW50ZWdyYXRpb24oXG4gICAgaW50ZWdyYXRpb246IEludGVncmF0aW9uUHJvcHMsXG4gICAgZG5zOiBBcGlHYXRld2F5UHJvcHNbXCJkbnNcIl0sXG4gICk6IGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uIHtcbiAgICBzd2l0Y2ggKGludGVncmF0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJBTEJcIjoge1xuICAgICAgICAvLyBUaGUgVlBDTGluayBjb25uZWN0cyB0aGUgaW50ZWdyYXRpb24gaW50byB0aGUgQUxCJ3MgVlBDLiBNdXN0IGJlIG1hbnVhbGx5IGNyZWF0ZWQgd2hlblxuICAgICAgICAvLyB0aGUgVlBDIGlzIGltcG9ydGVkLCB3aGljaCBpcyB0aGUgY2FzZSB3aGVuIHVzaW5nIENvcmVQbGF0Zm9ybUNvbnN1bWVyLlxuICAgICAgICBjb25zdCB2cGNMaW5rID0gbmV3IGFwaWd3LlZwY0xpbmsodGhpcywgXCJBbGJWcGNMaW5rXCIsIHtcbiAgICAgICAgICB2cGM6IGludGVncmF0aW9uLnZwYyxcbiAgICAgICAgICBzZWN1cml0eUdyb3VwczogW2ludGVncmF0aW9uLnNlY3VyaXR5R3JvdXBdLFxuICAgICAgICAgIHN1Ym5ldHM6IGludGVncmF0aW9uLnZwYy5zZWxlY3RTdWJuZXRzKCksIC8vIFRoaXMgY29ycmVjdGx5IHNlbGVjdHMgdGhlIHByaXZhdGUgc3VibmV0c1xuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlck1hcHBpbmcgPSBuZXcgYXBpZ3cuUGFyYW1ldGVyTWFwcGluZygpXG4gICAgICAgICAgLyoqIFNlZSB7QGxpbmsgQWxiSW50ZWdyYXRpb25Qcm9wcy5ob3N0TmFtZX0gKi9cbiAgICAgICAgICAub3ZlcndyaXRlSGVhZGVyKFxuICAgICAgICAgICAgXCJIb3N0XCIsXG4gICAgICAgICAgICAvLyBUaGUgSG9zdCBoZWFkZXIgY2FuIE5PVCB1c2UgZHluYW1pYyBtYXBwaW5nLCBsaWtlICRjb250ZXh0LmRvbWFpbk5hbWUgZXRjLlxuICAgICAgICAgICAgYXBpZ3cuTWFwcGluZ1ZhbHVlLmN1c3RvbShpbnRlZ3JhdGlvbi5ob3N0TmFtZSksXG4gICAgICAgICAgKVxuICAgICAgICBpZiAoaW50ZWdyYXRpb24ubWFwUGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaW50ZWdyYXRpb24ubWFwUGFyYW1ldGVycyhwYXJhbWV0ZXJNYXBwaW5nKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBpbnRlZ3JhdGlvbnMuSHR0cEFsYkludGVncmF0aW9uKFxuICAgICAgICAgIFwiQWxiSW50ZWdyYXRpb24tXCIgKyBkbnMuc3ViZG9tYWluLFxuICAgICAgICAgIGludGVncmF0aW9uLmxvYWRCYWxhbmNlckxpc3RlbmVyLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlY3VyZVNlcnZlck5hbWU6IGludGVncmF0aW9uLmhvc3ROYW1lLFxuICAgICAgICAgICAgdnBjTGluazogdnBjTGluayxcbiAgICAgICAgICAgIG1ldGhvZDogYXBpZ3cuSHR0cE1ldGhvZC5BTlksXG4gICAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJMYW1iZGFcIjoge1xuICAgICAgICByZXR1cm4gbmV3IGludGVncmF0aW9ucy5IdHRwTGFtYmRhSW50ZWdyYXRpb24oXG4gICAgICAgICAgXCJMYW1iZGFJbnRlZ3JhdGlvblwiLFxuICAgICAgICAgIGludGVncmF0aW9uLmxhbWJkYSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXlsb2FkRm9ybWF0VmVyc2lvbjogYXBpZ3cuUGF5bG9hZEZvcm1hdFZlcnNpb24uVkVSU0lPTl8yXzAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgY2FzZSBcIlNRU1wiOiB7XG4gICAgICAgIC8vIEFQSS1HVyBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byBTUVMgYnkgZGVmYXVsdFxuICAgICAgICBjb25zdCByb2xlID0gbmV3IGlhbS5Sb2xlKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYEFwaUd3VG8ke2ludGVncmF0aW9uLnF1ZXVlLm5vZGUuaWR9U2VydmljZVJvbGVgLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICBcIkFsbG93cyBBUEktR1cgdG8gYWRkIG1lc3NhZ2VzIHRvIFwiICsgaW50ZWdyYXRpb24ucXVldWUucXVldWVBcm4sXG4gICAgICAgICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbChcImFwaWdhdGV3YXkuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICAgIGludGVncmF0aW9uLnF1ZXVlLmdyYW50U2VuZE1lc3NhZ2VzKHJvbGUpXG5cbiAgICAgICAgbGV0IHBhcmFtZXRlck1hcHBpbmcgPSBuZXcgYXBpZ3cuUGFyYW1ldGVyTWFwcGluZygpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWRldmVsb3AtaW50ZWdyYXRpb25zLWF3cy1zZXJ2aWNlcy1yZWZlcmVuY2UuaHRtbCNTUVMtU2VuZE1lc3NhZ2VcbiAgICAgICAgICAuY3VzdG9tKFwiUXVldWVVcmxcIiwgaW50ZWdyYXRpb24ucXVldWUucXVldWVVcmwpXG4gICAgICAgICAgLmN1c3RvbShcIk1lc3NhZ2VCb2R5XCIsIFwiJHJlcXVlc3QuYm9keVwiKVxuICAgICAgICAgIC5jdXN0b20oXCJSZWdpb25cIiwgXCJldS13ZXN0LTFcIikgLy8gQ2hhbmdlIHRoaXMgaWYgdGhlIFNRUyBxdWV1ZSBpcyBpbiBhbm90aGVyIHJlZ2lvbiFcblxuICAgICAgICBpZiAoaW50ZWdyYXRpb24ubWVzc2FnZUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nID0gcGFyYW1ldGVyTWFwcGluZy5jdXN0b20oXG4gICAgICAgICAgICBcIk1lc3NhZ2VBdHRyaWJ1dGVzXCIsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShpbnRlZ3JhdGlvbi5tZXNzYWdlQXR0cmlidXRlcyksXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTcXNSb3V0ZUludGVncmF0aW9uKFwiU3FzSW50ZWdyYXRpb25cIiwge1xuICAgICAgICAgIHR5cGU6IGFwaWd3Lkh0dHBJbnRlZ3JhdGlvblR5cGUuQVdTX1BST1hZLFxuICAgICAgICAgIHN1YnR5cGU6IGFwaWd3Lkh0dHBJbnRlZ3JhdGlvblN1YnR5cGUuU1FTX1NFTkRfTUVTU0FHRSxcbiAgICAgICAgICBjcmVkZW50aWFsczogYXBpZ3cuSW50ZWdyYXRpb25DcmVkZW50aWFscy5mcm9tUm9sZShyb2xlKSxcbiAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nOiBwYXJhbWV0ZXJNYXBwaW5nLFxuICAgICAgICAgIHBheWxvYWRGb3JtYXRWZXJzaW9uOiBhcGlndy5QYXlsb2FkRm9ybWF0VmVyc2lvbi5WRVJTSU9OXzFfMCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGEgZ3JhbnRhYmxlIHRhcmdldCAocm9sZSwgdXNlciBldGMuKSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGUgQVBJLlxuICAgKiBPbmx5IHdvcmtzIHdoZW4gdXNpbmcgYElBTWAgYXMge0BsaW5rIEFwaUdhdGV3YXlSb3V0ZS5hdXRob3JpemF0aW9ufS5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldCBBIGdyYW50YWJsZSwgbGlrZSB7QGxpbmsgaWFtLlJvbGV9XG4gICAqL1xuICBwdWJsaWMgZ3JhbnRJbnZva2UodGFyZ2V0OiBpYW0uSUdyYW50YWJsZSkge1xuICAgIGZvciAoY29uc3Qgcm91dGVQcm9wcyBvZiB0aGlzLnByb3BzLnJvdXRlcykge1xuICAgICAgY29uc3QgYXV0aFR5cGUgPVxuICAgICAgICByb3V0ZVByb3BzLmF1dGhvcml6YXRpb24/LnR5cGUgPz8gdGhpcy5wcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvbj8udHlwZVxuXG4gICAgICBpZiAoYXV0aFR5cGUgIT09IFwiSUFNXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgZ3JhbnQgaW52b2tlIGZvciBhbiBBUEkgR2F0ZXdheSB3aGVuIG5vdCB1c2luZyBJQU0gYXV0aCAoZm91bmQgYXV0aCAnJHthdXRoVHlwZX0nIG9uIHJvdXRlICcke3JvdXRlUHJvcHMucGF0aH0nKSBbJHtjZGsuU3RhY2sub2YodGhpcykuc3RhY2tOYW1lfV1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByb3V0ZSBvZiB0aGlzLnJvdXRlcykge1xuICAgICAgcm91dGUuZ3JhbnRJbnZva2UodGFyZ2V0KVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gZG9tYWluIGZvciB0aGUgQVBJLUdhdGV3YXksIGEgUm91dGU1MyByZWNvcmQgYW5kIGFuIEhUVFBTIGNlcnQuXG4gKiBAYXV0aG9yIEtyaXN0aWFuIFJla3N0YWQgPGtyZUBjYXByYWNvbnN1bHRpbmcubm8+XG4gKi9cbmNsYXNzIEN1c3RvbURvbWFpbiBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGFwaUd3Q3VzdG9tRG9tYWluOiBhcGlndy5Eb21haW5OYW1lXG5cbiAgLyoqIFRoZSBGdWxseSBRdWFsaWZpZWQgRG9tYWluIE5hbWUgKEZRRE4pIGxpa2UgYHByb2R1Y3QucGxhdGZvcm0uZXhhbXBsZS5ub2AuICovXG4gIHB1YmxpYyByZWFkb25seSBjdXN0b21Eb21haW5OYW1lOiBzdHJpbmdcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQXBpR2F0ZXdheURuc1Byb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG4gICAgdGhpcy5jdXN0b21Eb21haW5OYW1lID0gYCR7cHJvcHMuc3ViZG9tYWlufS4ke3Byb3BzLmhvc3RlZFpvbmUuem9uZU5hbWV9YFxuXG4gICAgLy8gQ2FuIGFsc28gdXNlIHdpbGRjYXJkIGNlcnRzIGluc3RlYWQhIENoZWFwZXJcbiAgICAvKiogQWxsb3dzIGV4dGVybmFsIHVzZXJzIHRvIGNvbm5lY3Qgd2l0aCBIVFRQUy4gKi9cbiAgICBjb25zdCBjdXN0b21Eb21haW5DZXJ0ID0gbmV3IGFjbS5DZXJ0aWZpY2F0ZSh0aGlzLCBcIkh0dHBzQ2VydGlmaWNhdGVcIiwge1xuICAgICAgZG9tYWluTmFtZTogdGhpcy5jdXN0b21Eb21haW5OYW1lLFxuICAgICAgdmFsaWRhdGlvbjogYWNtLkNlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zKHByb3BzLmhvc3RlZFpvbmUpLFxuICAgIH0pXG5cbiAgICAvLyBOb3RlIHRoYXQgQVBJLUdXIGNhbiBhbHNvIHN1cHBvcnQgd2lsZGNhcmQgZG9tYWlucyEgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWN1c3RvbS1kb21haW4tbmFtZXMuaHRtbCNodHRwLXdpbGRjYXJkLWN1c3RvbS1kb21haW4tbmFtZXNcbiAgICAvLyBCdXQgdGhpcyB3aWxsIG5vdCB3b3JrIHdoZW4gQVdTIGFjY291bnQgWCBoYXMgQ3VzdG9tRG9tYWluIGBzdGFnaW5nLnBsYXRmb3JtLmV4YW1wbGUubm9gIGFuZCBhY2NvdW50IFkgaGFzIEN1c3RvbURvbWFpbiBgKi5wbGF0Zm9ybS5leGFtcGxlLm5vYC5cbiAgICAvLyBOb3Qgc3VyZSBob3cgc3ViLXN1YmRvbWFpbnMgYXJlIGFmZmVjdGVkOiBgbXlzZXJ2aWNlLnN0YWdpbmcucGxhdGZvcm0uZXhhbXBsZS5ub2AgYW5kIGAqLnBsYXRmb3JtLmV4YW1wbGUubm9gLlxuICAgIHRoaXMuYXBpR3dDdXN0b21Eb21haW4gPSBuZXcgYXBpZ3cuRG9tYWluTmFtZShcbiAgICAgIHRoaXMsXG4gICAgICBcIkRvbWFpbk5hbWUtXCIgKyBwcm9wcy5zdWJkb21haW4sXG4gICAgICB7XG4gICAgICAgIGRvbWFpbk5hbWU6IHRoaXMuY3VzdG9tRG9tYWluTmFtZSxcbiAgICAgICAgY2VydGlmaWNhdGU6IGN1c3RvbURvbWFpbkNlcnQsXG4gICAgICAgIGVuZHBvaW50VHlwZTogYXBpZ3cuRW5kcG9pbnRUeXBlLlJFR0lPTkFMLFxuICAgICAgICBzZWN1cml0eVBvbGljeTogYXBpZ3cuU2VjdXJpdHlQb2xpY3kuVExTXzFfMixcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgLy8gVGhpcyBtYWtlcyB0aGUgQVBJLUdXIHB1YmxpY2x5IGF2YWlsYWJsZSBvbiB0aGUgY3VzdG9tIGRvbWFpbiBuYW1lLlxuICAgIG5ldyByb3V0ZTUzLkFSZWNvcmQodGhpcywgXCJSb3V0ZTUzQVJlY29yZEFwaWd3QWxpYXNcIiwge1xuICAgICAgcmVjb3JkTmFtZTogcHJvcHMuc3ViZG9tYWluLFxuICAgICAgem9uZTogcHJvcHMuaG9zdGVkWm9uZSxcbiAgICAgIHRhcmdldDogcm91dGU1My5SZWNvcmRUYXJnZXQuZnJvbUFsaWFzKFxuICAgICAgICBuZXcgcm91dGU1M1RhcmdldHMuQXBpR2F0ZXdheXYyRG9tYWluUHJvcGVydGllcyhcbiAgICAgICAgICB0aGlzLmFwaUd3Q3VzdG9tRG9tYWluLnJlZ2lvbmFsRG9tYWluTmFtZSxcbiAgICAgICAgICB0aGlzLmFwaUd3Q3VzdG9tRG9tYWluLnJlZ2lvbmFsSG9zdGVkWm9uZUlkLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICAgIHR0bDogcHJvcHMudHRsID8/IGNkay5EdXJhdGlvbi5taW51dGVzKDUpLCAvLyBMb3cgVFRMIG1ha2VzIGl0IGVhc2llciB0byBkbyBjaGFuZ2VzXG4gICAgfSlcbiAgfVxufVxuXG4vKiogQWN0cyBhcyBnbHVlIChiZXR3ZWVuIHRoZSBpbnRlZ3JhdGlvbiBwcm9wcyBhbmQgdGhlIEh0dHBBcGkpIHdoZW4gY3JlYXRpbmcgYW4gU3FzSW50ZWdyYXRpb24uICovXG5jbGFzcyBTcXNSb3V0ZUludGVncmF0aW9uIGV4dGVuZHMgYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQHBhcmFtIGlkIFRoZSBpZCB1c2VkIGluIHRoZSB7QGxpbmsgYXBpZ3cuSHR0cEludGVncmF0aW9ufSBjb25zdHJ1Y3RcbiAgICogICAgY3JlYXRlZCBpbnRlcm5hbGx5IGJ5IHtAbGluayBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvbi5fYmluZFRvUm91dGV9LlxuICAgKiAgICBbU291cmNlIGNvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL2I1YWUzNzc4MmJjM2NiNjM3ZWVlZjlmYmIxZmJlMmM1ZWZkZmMwNjgvcGFja2FnZXMvJTQwYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyL2xpYi9odHRwL2ludGVncmF0aW9uLnRzI0wzMjEpXG4gICAqIEBwYXJhbSBpbnRlZ3JhdGlvblByb3BzIFRoZSBwcm9wcyB0byBwYXNzIHRvIHRoZSB7QGxpbmsgYXBpZ3cuSHR0cEludGVncmF0aW9ufSBjb25zdHJ1Y3QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBpZDogc3RyaW5nLFxuICAgIHByaXZhdGUgaW50ZWdyYXRpb25Qcm9wczogYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb25Db25maWcsXG4gICkge1xuICAgIHN1cGVyKGlkKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgc2VuZHMgdGhlIHByb3BlcnRpZXMgbmVlZGVkIGZvciBjcmVhdGluZyBhIHtAbGluayBhcGlndy5IdHRwSW50ZWdyYXRpb259IHRvIHRoZVxuICAgKiB7QGxpbmsgYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb259LlxuICAgKi9cbiAgYmluZCgpOiBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvbkNvbmZpZyB7XG4gICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5OlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL2I1YWUzNzc4MmJjM2NiNjM3ZWVlZjlmYmIxZmJlMmM1ZWZkZmMwNjgvcGFja2FnZXMvJTQwYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyL2xpYi9odHRwL2ludGVncmF0aW9uLnRzI0wzMTlcbiAgICByZXR1cm4gdGhpcy5pbnRlZ3JhdGlvblByb3BzXG4gIH1cbn1cblxuLyoqXG4gKiBXaGVuIHVzaW5nIGBOb2RlanNGdW5jdGlvbmAgd2l0aCBgZW50cnlgLCB3ZSBwb2ludCBDREsgdG8gYSBmaWxlIHdpdGggb3VyIGxhbWJkYSBjb2RlLiBUaGlzIGNhblxuICogZWl0aGVyIGJlIGEgVHlwZVNjcmlwdCBvciBKYXZhU2NyaXB0IGZpbGUuIFdoZW4gY3JlYXRpbmcgY29uc3RydWN0cyBpbiB0ZXN0cyBpbnNpZGUgdGhpcyBsaWJyYXJ5LFxuICogdGhlIGVudHJ5IHdpbGwgcG9pbnQgdG8gdGhlIFR5cGVTY3JpcHQgZmlsZSBpbiB0aGUgc291cmNlIGNvZGUuIEJ1dCB3aGVuIGEgbGlicmFyeSBjb25zdW1lciB1c2VzXG4gKiB0aGlzLCBpdCB3aWxsIGluc3RlYWQgcG9pbnQgdG8gdGhlIHRyYW5zcGlsZWQgSmF2YVNjcmlwdCBmaWxlLiBTbyB0byBzZXQgdGhlIGNvcnJlY3QgZmlsZVxuICogZXh0ZW5zaW9uLCB3ZSBtdXN0IGNoZWNrIGlmIHdlJ3JlIGJlaW5nIHJ1biBpbiB0aGUgY29udGV4dCBvZiB0aGUgVHlwZVNjcmlwdCBzb3VyY2UgY29kZVxuICogKHNyYy9hcGktZ2F0ZXdheSksIG90aGVyd2lzZSB3ZSdyZSBiZWluZyBydW4gYnkgYSBjb25zdW1lciBhcyB0cmFuc3BpbGVkIEphdmFTY3JpcHQuXG4gKi9cbmNvbnN0IGF1dGhvcml6ZXJGaWxlRXh0ZW5zaW9uID0gX19kaXJuYW1lLmVuZHNXaXRoKFwic3JjL2FwaS1nYXRld2F5XCIpXG4gID8gXCJ0c1wiXG4gIDogXCJqc1wiXG5cbi8qKlxuICogQ3JlYXRlcyBhIGN1c3RvbSBhdXRob3JpemVyIGxhbWJkYSB3aGljaCByZWFkcyBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDxhY2Nlc3MgdG9rZW4+YCBoZWFkZXIgYW5kXG4gKiB2ZXJpZmllcyB0aGUgdG9rZW4gYWdhaW5zdCBhIENvZ25pdG8gdXNlciBwb29sLlxuICovXG5jbGFzcyBDb2duaXRvVXNlclBvb2xBdXRob3JpemVyPFxuICBBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyxcbj4gZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBsYW1iZGE6IGxhbWJkYS5JRnVuY3Rpb25cblxuICAvKipcbiAgICogVXNlIHNpbXBsZSByZXNwb25zZSB0eXBlIChgeyBpc0F1dGhvcml6ZWQ6IHRydWUvZmFsc2UgfWApLCBhcyBvcHBvc2VkIHRvIHJldHVybmluZyBhbiBJQU1cbiAgICogUG9saWN5IGRvY3VtZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGVbXSA9IFtcbiAgICBhdXRob3JpemVycy5IdHRwTGFtYmRhUmVzcG9uc2VUeXBlLlNJTVBMRSxcbiAgXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBDb2duaXRvVXNlclBvb2xBdXRob3JpemVyUHJvcHM8QXV0aFNjb3Blc1Q+LFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICB0aGlzLmxhbWJkYSA9IG5ldyBsYW1iZGFOb2RlanMuTm9kZWpzRnVuY3Rpb24odGhpcywgXCJBdXRob3JpemVyRnVuY3Rpb25cIiwge1xuICAgICAgZW50cnk6IHBhdGguam9pbihcbiAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICBgYXV0aG9yaXplci1sYW1iZGFzL2NvZ25pdG8tdXNlci1wb29sLWF1dGhvcml6ZXIuJHthdXRob3JpemVyRmlsZUV4dGVuc2lvbn1gLFxuICAgICAgKSxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBbXCJVU0VSX1BPT0xfSURcIl06IHByb3BzLnVzZXJQb29sLnVzZXJQb29sSWQsXG4gICAgICAgIFtcIlJFUVVJUkVEX1NDT1BFXCJdOiBwcm9wcy5yZXF1aXJlZFNjb3BlID8/IFwiXCIsXG4gICAgICAgIFtcIkNSRURFTlRJQUxTX0ZPUl9JTlRFUk5BTF9BVVRIT1JJWkFUSU9OXCJdOlxuICAgICAgICAgIHByb3BzLmNyZWRlbnRpYWxzRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uXG4gICAgICAgICAgICA/IHByb3BzLmNyZWRlbnRpYWxzRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBpZiAocHJvcHMuY3JlZGVudGlhbHNGb3JJbnRlcm5hbEF1dGhvcml6YXRpb24pIHtcbiAgICAgIHNlY3JldHNtYW5hZ2VyLlNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgICBzY29wZSxcbiAgICAgICAgaWQgKyBcIkJhc2ljQXV0aFNlY3JldFwiLFxuICAgICAgICBwcm9wcy5jcmVkZW50aWFsc0ZvckludGVybmFsQXV0aG9yaXphdGlvbixcbiAgICAgICkuZ3JhbnRSZWFkKHRoaXMubGFtYmRhKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gYXV0aG9yaXplciBsYW1iZGEgd2hpY2ggcmVhZHMgYEF1dGhvcml6YXRpb246IEJhc2ljIDxiYXNlNjQtZW5jb2RlZCBjcmVkZW50aWFscz5gXG4gKiBoZWFkZXIgYW5kIHZlcmlmaWVzIHRoZSBjcmVkZW50aWFscyBhZ2FpbnN0IGEgZ2l2ZW4gc2VjcmV0LlxuICovXG5jbGFzcyBCYXNpY0F1dGhBdXRob3JpemVyIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgbGFtYmRhOiBsYW1iZGEuSUZ1bmN0aW9uXG5cbiAgLy8gU2ltcGxlIGlzIGB7IGlzQXV0aG9yaXplZDogdHJ1ZS9mYWxzZSB9YCwgYXMgb3Bwb3NlZCB0byByZXR1cm5pbmcgYW4gSUFNIFBvbGljeSBkb2N1bWVudFxuICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZVtdID0gW1xuICAgIGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGUuU0lNUExFLFxuICBdXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5sYW1iZGEgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiQmFzaWNBdXRoTGFtYmRhXCIsIHtcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgYGF1dGhvcml6ZXItbGFtYmRhcy9iYXNpYy1hdXRoLWF1dGhvcml6ZXIuJHthdXRob3JpemVyRmlsZUV4dGVuc2lvbn1gLFxuICAgICAgKSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkFuIGF1dGhvcml6ZXIgZm9yIEFQSS1HYXRld2F5IHRoYXQgY2hlY2tzIEJhc2ljIEF1dGggY3JlZGVudGlhbHMgb24gcmVxdWVzdHNcIixcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgW1wiQ1JFREVOVElBTFNfU0VDUkVUX05BTUVcIl06IHByb3BzLmNyZWRlbnRpYWxzU2VjcmV0TmFtZVxuICAgICAgICAgID8gcHJvcHMuY3JlZGVudGlhbHNTZWNyZXROYW1lXG4gICAgICAgICAgOiBcIlwiLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgaWYgKHByb3BzLmNyZWRlbnRpYWxzU2VjcmV0TmFtZSkge1xuICAgICAgc2VjcmV0c21hbmFnZXIuU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoXG4gICAgICAgIHNjb3BlLFxuICAgICAgICBpZCArIFwiQmFzaWNBdXRoU2VjcmV0XCIsXG4gICAgICAgIHByb3BzLmNyZWRlbnRpYWxzU2VjcmV0TmFtZSxcbiAgICAgICkuZ3JhbnRSZWFkKHRoaXMubGFtYmRhKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gYXV0aG9yaXplciBsYW1iZGEgd2hpY2ggYWxsb3dzIGJvdGg6XG4gKiAtIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPGFjY2VzcyB0b2tlbj5gIGhlYWRlciwgZm9yIHdoaWNoIHRoZSB0b2tlbiBpcyBjaGVja2VkIGFnYWluc3QgdGhlIGdpdmVuXG4gKiAgIENvZ25pdG8gdXNlciBwb29sXG4gKiAtIGBBdXRob3JpemF0aW9uOiBCYXNpYyA8YmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM+YCBoZWFkZXIsIGZvciB3aGljaCB0aGUgY3JlZGVudGlhbHMgYXJlXG4gKiAgIGNoZWNrZWQgYWdhaW5zdCB0aGUgY3JlZGVudGlhbHMgZnJvbSB0aGUgZ2l2ZW4gYmFzaWMgYXV0aCBzZWNyZXQgbmFtZVxuICpcbiAqIElmIGVpdGhlciBvZiB0aGVzZSBhcmUgZ2l2ZW4gYW5kIHZhbGlkLCB0aGUgcmVxdWVzdCBpcyBhdXRoZW50aWNhdGVkLlxuICovXG5jbGFzcyBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXI8XG4gIEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nLFxuPiBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGxhbWJkYTogbGFtYmRhLklGdW5jdGlvblxuXG4gIC8qKlxuICAgKiBVc2Ugc2ltcGxlIHJlc3BvbnNlIHR5cGUgKGB7IGlzQXV0aG9yaXplZDogdHJ1ZS9mYWxzZSB9YCksIGFzIG9wcG9zZWQgdG8gcmV0dXJuaW5nIGFuIElBTVxuICAgKiBQb2xpY3kgZG9jdW1lbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZVtdID0gW1xuICAgIGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGUuU0lNUExFLFxuICBdXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplclByb3BzPEF1dGhTY29wZXNUPixcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5sYW1iZGEgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiQXV0aG9yaXplckZ1bmN0aW9uXCIsIHtcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgYGF1dGhvcml6ZXItbGFtYmRhcy9jb2duaXRvLXVzZXItcG9vbC1vci1iYXNpYy1hdXRoLWF1dGhvcml6ZXIuJHthdXRob3JpemVyRmlsZUV4dGVuc2lvbn1gLFxuICAgICAgKSxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBbXCJVU0VSX1BPT0xfSURcIl06IHByb3BzLnVzZXJQb29sID8gcHJvcHMudXNlclBvb2wudXNlclBvb2xJZCA6IFwiXCIsXG4gICAgICAgIFtcIlJFUVVJUkVEX1NDT1BFXCJdOiBwcm9wcy5yZXF1aXJlZFNjb3BlID8/IFwiXCIsXG4gICAgICAgIFtcIkJBU0lDX0FVVEhfQ1JFREVOVElBTFNfU0VDUkVUX05BTUVcIl06XG4gICAgICAgICAgcHJvcHMuYmFzaWNBdXRoQ3JlZGVudGlhbHNTZWNyZXROYW1lXG4gICAgICAgICAgICA/IHByb3BzLmJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgaWYgKHByb3BzLmJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZSkge1xuICAgICAgc2VjcmV0c21hbmFnZXIuU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoXG4gICAgICAgIHNjb3BlLFxuICAgICAgICBpZCArIFwiQmFzaWNBdXRoU2VjcmV0XCIsXG4gICAgICAgIHByb3BzLmJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZSxcbiAgICAgICkuZ3JhbnRSZWFkKHRoaXMubGFtYmRhKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEEgc2xpZ2h0bHkgZXh0ZW5kZWQgdmVyc2lvbiBvZiB0aGUgW2RlZmF1bHQgSlNPTiBmb3JtYXQgc3VnZ2VzdGVkIGJ5IEFXU10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWxvZ2dpbmcuaHRtbCNodHRwLWFwaS1lbmFibGUtbG9nZ2luZy5leGFtcGxlcykuXG4gKi9cbmNvbnN0IGRlZmF1bHRBY2Nlc3NMb2dGb3JtYXQgPSB7XG4gIHJlcXVlc3RJZDogXCIkY29udGV4dC5yZXF1ZXN0SWRcIixcbiAgdXNlckFnZW50OiBcIiRjb250ZXh0LmlkZW50aXR5LnVzZXJBZ2VudFwiLFxuICBpcDogXCIkY29udGV4dC5pZGVudGl0eS5zb3VyY2VJcFwiLFxuICAvKiogQ0xGIGZvcm1hdDogYGRkL01NTS95eXl5OkhIOm1tOnNzICstaGhtbWAgKi9cbiAgcmVxdWVzdFRpbWU6IFwiJGNvbnRleHQucmVxdWVzdFRpbWVcIixcbiAgcmVxdWVzdFRpbWVFcG9jaDogXCIkY29udGV4dC5yZXF1ZXN0VGltZUVwb2NoXCIsXG4gIGRhdGFQcm9jZXNzZWQ6IFwiJGNvbnRleHQuZGF0YVByb2Nlc3NlZFwiLFxuICBodHRwTWV0aG9kOiBcIiRjb250ZXh0Lmh0dHBNZXRob2RcIixcbiAgcGF0aDogXCIkY29udGV4dC5wYXRoXCIsXG4gIHJvdXRlS2V5OiBcIiRjb250ZXh0LnJvdXRlS2V5XCIsXG4gIHN0YXR1czogXCIkY29udGV4dC5zdGF0dXNcIixcbiAgcHJvdG9jb2w6IFwiJGNvbnRleHQucHJvdG9jb2xcIixcbiAgcmVzcG9uc2VMZW5ndGg6IFwiJGNvbnRleHQucmVzcG9uc2VMZW5ndGhcIixcbiAgcmVzcG9uc2VMYXRlbmN5OiBcIiRjb250ZXh0LnJlc3BvbnNlTGF0ZW5jeVwiLFxuICBkb21haW5OYW1lOiBcIiRjb250ZXh0LmRvbWFpbk5hbWVcIixcbiAgZXJyb3I6IHtcbiAgICB0eXBlOiBcIiRjb250ZXh0LmVycm9yLnJlc3BvbnNlVHlwZVwiLFxuICAgIGdhdGV3YXlFcnJvcjogXCIkY29udGV4dC5lcnJvci5tZXNzYWdlXCIsXG4gICAgaW50ZWdyYXRpb25FcnJvcjogXCIkY29udGV4dC5pbnRlZ3JhdGlvbi5lcnJvclwiLFxuICAgIGF1dGhvcml6ZXJFcnJvcjogXCIkY29udGV4dC5hdXRob3JpemVyLmVycm9yXCIsXG4gIH0sXG4gIGludGVncmF0aW9uOiB7XG4gICAgbGF0ZW5jeTogXCIkY29udGV4dC5pbnRlZ3JhdGlvbi5sYXRlbmN5XCIsXG4gICAgcmVxdWVzdElkOiBcIiRjb250ZXh0LmludGVncmF0aW9uLnJlcXVlc3RJZFwiLFxuICAgIHJlc3BvbnNlU3RhdHVzOiBcIiRjb250ZXh0LmludGVncmF0aW9uLnN0YXR1c1wiLFxuICB9LFxuICBhdXRoOiB7XG4gICAgaWFtOiB7XG4gICAgICB1c2VyQXJuOiBcIiRjb250ZXh0LmlkZW50aXR5LnVzZXJBcm5cIixcbiAgICAgIGF3c0FjY291bnQ6IFwiJGNvbnRleHQuaWRlbnRpdHkuYWNjb3VudElkXCIsXG4gICAgICBhd3NQcmluY2lwYWw6IFwiJGNvbnRleHQuaWRlbnRpdHkuY2FsbGVyXCIsXG4gICAgICBhd3NQcmluY2lwYWxPcmc6IFwiJGNvbnRleHQuaWRlbnRpdHkucHJpbmNpcGFsT3JnSWRcIixcbiAgICB9LFxuICAgIGJhc2ljOiB7IHVzZXJuYW1lOiBcIiRjb250ZXh0LmF1dGhvcml6ZXIudXNlcm5hbWVcIiB9LFxuICAgIGNvZ25pdG86IHsgY2xpZW50SWQ6IFwiJGNvbnRleHQuYXV0aG9yaXplci5jbGllbnRJZFwiIH0sXG4gIH0sXG4gIGF3c0VuZHBvaW50UmVxdWVzdDoge1xuICAgIGlkOiBcIiRjb250ZXh0LmF3c0VuZHBvaW50UmVxdWVzdElkXCIsXG4gICAgaWQyOiBcIiRjb250ZXh0LmF3c0VuZHBvaW50UmVxdWVzdElkMlwiLFxuICB9LFxuICBtZXNzYWdlOlxuICAgIFwiJGNvbnRleHQuaWRlbnRpdHkuc291cmNlSXAgLSAkY29udGV4dC5odHRwTWV0aG9kICRjb250ZXh0LmRvbWFpbk5hbWUgJGNvbnRleHQucGF0aCAoJGNvbnRleHQucm91dGVLZXkpIC0gJGNvbnRleHQuc3RhdHVzIFskY29udGV4dC5yZXNwb25zZUxhdGVuY3kgbXNdXCIsXG59XG5cbi8qKlxuICogRW5hYmxlcyBhY2Nlc3MgbG9ncyBvbiB0aGUgQVBJLUdhdGV3YXkuXG4gKlxuICogQGF1dGhvciBLcmlzdGlhbiBSZWtzdGFkIDxrcmVAY2FwcmFjb25zdWx0aW5nLm5vPlxuICovXG5jbGFzcyBBcGlHYXRld2F5QWNjZXNzTG9ncyBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGxvZ0dyb3VwOiBsb2dzLkxvZ0dyb3VwXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3RhZ2U6IGFwaWd3LkNmblN0YWdlLFxuICAgIHByb3BzOiBBcGlHYXRld2F5QWNjZXNzTG9nc1Byb3BzIHwgdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRBY2Nlc3NMb2dGb3JtYXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICAvLyBsb2dHcm91cCBpcyBzZXQgdXAgd2l0aCBoZWxwIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMTExMDAjaXNzdWVjb21tZW50LTkwNDYyNzA4MVxuICAgIC8vIE5vdCBzdXJlIGlmIEhUVFAgQVBJIGFjdHVhbGx5IG5lZWRzIHRoZSBzZXJ2aWNlIHJvbGUgd2l0aCBtYW5hZ2VkIHBvbGljeTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWxvZ2dpbmcuaHRtbFxuICAgIGNvbnN0IGFjY2Vzc0xvZ3MgPSBuZXcgbG9ncy5Mb2dHcm91cCh0aGlzLCBcIkFjY2Vzc0xvZ0dyb3VwXCIsIHtcbiAgICAgIHJldGVudGlvbjogcHJvcHM/LnJldGVudGlvbixcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzPy5yZW1vdmFsUG9saWN5ID8/IGNkay5SZW1vdmFsUG9saWN5LlJFVEFJTixcbiAgICAgIC8vIEFsd2F5cyB1c2UgdGhlIGRlZmF1bHQgZW5jcnlwdGlvbiBrZXkuIE90aGVyd2lzZSwgdGhlIGtleSBuZWVkcyBzcGVjaWFsIHBvbGljaWVzOlxuICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L2xvZ3MvZW5jcnlwdC1sb2ctZGF0YS1rbXMuaHRtbCNjbWstcGVybWlzc2lvbnNcbiAgICAgIGVuY3J5cHRpb25LZXk6IHVuZGVmaW5lZCxcbiAgICB9KVxuICAgIHRoaXMubG9nR3JvdXAgPSBhY2Nlc3NMb2dzXG5cbiAgICBzdGFnZS5hY2Nlc3NMb2dTZXR0aW5ncyA9IHtcbiAgICAgIGRlc3RpbmF0aW9uQXJuOiBhY2Nlc3NMb2dzLmxvZ0dyb3VwQXJuLFxuICAgICAgZm9ybWF0OiBKU09OLnN0cmluZ2lmeShwcm9wcz8uYWNjZXNzTG9nRm9ybWF0ID8/IGRlZmF1bHRBY2Nlc3NMb2dGb3JtYXQpLFxuICAgIH1cblxuICAgIGNvbnN0IGFwaUd3TG9nc1JvbGUgPSBuZXcgaWFtLlJvbGUoXG4gICAgICB0aGlzLFxuICAgICAgXCJBcGlHYXRld2F5UHVzaFRvQ2xvdWR3YXRjaExvZ3NSb2xlXCIsXG4gICAgICB7XG4gICAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKFwiYXBpZ2F0ZXdheS5hbWF6b25hd3MuY29tXCIpLFxuICAgICAgICBtYW5hZ2VkUG9saWNpZXM6IFtcbiAgICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgICBcInNlcnZpY2Utcm9sZS9BbWF6b25BUElHYXRld2F5UHVzaFRvQ2xvdWRXYXRjaExvZ3NcIixcbiAgICAgICAgICApLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICApXG5cbiAgICBhY2Nlc3NMb2dzLmdyYW50V3JpdGUoYXBpR3dMb2dzUm9sZSlcbiAgfVxufVxuXG4vKiogUmV0dXJucyBhIHNob3J0IHNlbWktdW5pcXVlIGhhc2ggb2YgdGhlIGdpdmVuIHN0cmluZy4gKi9cbmZ1bmN0aW9uIHNob3J0SGFzaChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFNIQS0xIGlzIG5vLW5vIHdoZW4gd2UgbmVlZCBjcnlwdG9ncmFwaGljIHNlY3VyaXR5LCBidXQgaGVyZSB3ZSBqdXN0IGl0IGZvciBzaG9ydGVuaW5nIGEgbmFtZSxcbiAgLy8gd2hpY2ggaXMgZmluZVxuICByZXR1cm4gY3JlYXRlSGFzaChcInNoYTFcIikudXBkYXRlKHN0cikuZGlnZXN0KFwiaGV4XCIpLnN1YnN0cmluZygwLCAxMClcbn1cbiJdfQ==
|