velocious 1.0.276 → 1.0.277
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/build/src/configuration-types.d.ts +5 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +2 -1
- package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +7 -7
- package/build/src/frontend-models/base.d.ts +6 -0
- package/build/src/frontend-models/base.d.ts.map +1 -1
- package/build/src/frontend-models/base.js +26 -1
- package/build/src/routes/hooks/frontend-model-command-route-hook.d.ts +3 -1
- package/build/src/routes/hooks/frontend-model-command-route-hook.d.ts.map +1 -1
- package/build/src/routes/hooks/frontend-model-command-route-hook.js +6 -2
- package/build/src/routes/resolver.d.ts +5 -1
- package/build/src/routes/resolver.d.ts.map +1 -1
- package/build/src/routes/resolver.js +12 -3
- package/build/src/utils/ransack.js +22 -1
- package/package.json +1 -1
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
* @param {object} args - Hook args.
|
|
3
3
|
* @param {import("../../configuration.js").default} args.configuration - Configuration instance.
|
|
4
4
|
* @param {string} args.currentPath - Request path without query.
|
|
5
|
+
* @param {boolean} [args.hasMatchingCustomRoute] - Set when the request path matches an explicit custom route.
|
|
5
6
|
* @returns {Promise<import("../../configuration-types.js").RouteResolverHookResult | null>} - Route override or null.
|
|
6
7
|
*/
|
|
7
|
-
export default function frontendModelCommandRouteHook({ configuration, currentPath }: {
|
|
8
|
+
export default function frontendModelCommandRouteHook({ configuration, currentPath, hasMatchingCustomRoute }: {
|
|
8
9
|
configuration: import("../../configuration.js").default;
|
|
9
10
|
currentPath: string;
|
|
11
|
+
hasMatchingCustomRoute?: boolean | undefined;
|
|
10
12
|
}): Promise<import("../../configuration-types.js").RouteResolverHookResult | null>;
|
|
11
13
|
//# sourceMappingURL=frontend-model-command-route-hook.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontend-model-command-route-hook.d.ts","sourceRoot":"","sources":["../../../../src/routes/hooks/frontend-model-command-route-hook.js"],"names":[],"mappings":"AAOA
|
|
1
|
+
{"version":3,"file":"frontend-model-command-route-hook.d.ts","sourceRoot":"","sources":["../../../../src/routes/hooks/frontend-model-command-route-hook.js"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,8GALG;IAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO;IAC3B,WAAW,EAAxB,MAAM;IACS,sBAAsB;CAC7C,GAAU,OAAO,CAAC,OAAO,8BAA8B,EAAE,uBAAuB,GAAG,IAAI,CAAC,CAqE1F"}
|
|
@@ -6,9 +6,10 @@ const FRONTEND_MODEL_CONTROLLER_PATH = new URL("../../frontend-model-controller.
|
|
|
6
6
|
* @param {object} args - Hook args.
|
|
7
7
|
* @param {import("../../configuration.js").default} args.configuration - Configuration instance.
|
|
8
8
|
* @param {string} args.currentPath - Request path without query.
|
|
9
|
+
* @param {boolean} [args.hasMatchingCustomRoute] - Set when the request path matches an explicit custom route.
|
|
9
10
|
* @returns {Promise<import("../../configuration-types.js").RouteResolverHookResult | null>} - Route override or null.
|
|
10
11
|
*/
|
|
11
|
-
export default async function frontendModelCommandRouteHook({ configuration, currentPath }) {
|
|
12
|
+
export default async function frontendModelCommandRouteHook({ configuration, currentPath, hasMatchingCustomRoute }) {
|
|
12
13
|
const normalizedCurrentPath = normalizePath(currentPath);
|
|
13
14
|
if (normalizedCurrentPath === SHARED_FRONTEND_MODEL_API_PATH) {
|
|
14
15
|
return {
|
|
@@ -17,6 +18,9 @@ export default async function frontendModelCommandRouteHook({ configuration, cur
|
|
|
17
18
|
controllerPath: FRONTEND_MODEL_CONTROLLER_PATH
|
|
18
19
|
};
|
|
19
20
|
}
|
|
21
|
+
// Don't intercept paths that match explicitly defined custom routes
|
|
22
|
+
if (hasMatchingCustomRoute)
|
|
23
|
+
return null;
|
|
20
24
|
const backendProjects = configuration.getBackendProjects?.() || [];
|
|
21
25
|
const customCommandMatch = frontendModelCustomCommandForPath({
|
|
22
26
|
backendProjects,
|
|
@@ -75,4 +79,4 @@ function normalizePath(path) {
|
|
|
75
79
|
}
|
|
76
80
|
return withLeadingSlash;
|
|
77
81
|
}
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWwtY29tbWFuZC1yb3V0ZS1ob29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3JvdXRlcy9ob29rcy9mcm9udGVuZC1tb2RlbC1jb21tYW5kLXJvdXRlLWhvb2suanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyw2QkFBNkIsRUFBRSxpQ0FBaUMsRUFBRSx5QkFBeUIsRUFBRSx1Q0FBdUMsRUFBQyxNQUFNLDhDQUE4QyxDQUFBO0FBRWpNLE1BQU0sOEJBQThCLEdBQUcsa0JBQWtCLENBQUE7QUFDekQsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxvQ0FBb0MsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUUxRzs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssVUFBVSw2QkFBNkIsQ0FBQyxFQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUM7SUFDOUcsTUFBTSxxQkFBcUIsR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUE7SUFFeEQsSUFBSSxxQkFBcUIsS0FBSyw4QkFBOEIsRUFBRSxDQUFDO1FBQzdELE9BQU87WUFDTCxNQUFNLEVBQUUsY0FBYztZQUN0QixVQUFVLEVBQUUsZUFBZTtZQUMzQixjQUFjLEVBQUUsOEJBQThCO1NBQy9DLENBQUE7SUFDSCxDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLElBQUksc0JBQXNCO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFFdkMsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUE7SUFDbEUsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztRQUMzRCxlQUFlO1FBQ2YsV0FBVyxFQUFFLHFCQUFxQjtLQUNuQyxDQUFDLENBQUE7SUFFRixJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDdkIsa0NBQWtDO1FBQ2xDLE1BQU0sTUFBTSxHQUFHO1lBQ2Isb0NBQW9DLEVBQUUsa0JBQWtCLENBQUMsVUFBVTtZQUNuRSwrQkFBK0IsRUFBRSxrQkFBa0IsQ0FBQyxLQUFLO1lBQ3pELEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxTQUFTO1NBQ3BDLENBQUE7UUFFRCxJQUFJLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFBO1FBQ3pDLENBQUM7UUFFRCxPQUFPO1lBQ0wsTUFBTSxFQUFFLHlCQUF5QjtZQUNqQyxVQUFVLEVBQUUsa0JBQWtCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQy9ELGNBQWMsRUFBRSw4QkFBOEI7WUFDOUMsTUFBTTtTQUNQLENBQUE7SUFDSCxDQUFDO0lBRUQsS0FBSyxNQUFNLGNBQWMsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUM3QyxNQUFNLFNBQVMsR0FBRyx1Q0FBdUMsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUV6RSxLQUFLLE1BQU0sU0FBUyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQy9DLE1BQU0sWUFBWSxHQUFHLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO1lBQzdFLE1BQU0sc0JBQXNCLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQzFELE1BQU0sY0FBYyxHQUFHLEdBQUcsc0JBQXNCLEdBQUcsQ0FBQTtZQUVuRCxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQztnQkFBRSxTQUFRO1lBRS9ELE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDdEUsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztnQkFBRSxTQUFRO1lBRXZDLE1BQU0sTUFBTSxHQUFHLDZCQUE2QixDQUFDLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBQyxDQUFDLENBQUE7WUFDMUYsSUFBSSxDQUFDLE1BQU07Z0JBQUUsU0FBUTtZQUNyQixNQUFNLFVBQVUsR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBRTdELE9BQU87Z0JBQ0wsTUFBTSxFQUFFLFlBQVksTUFBTSxFQUFFO2dCQUM1QixVQUFVO2dCQUNWLGNBQWMsRUFBRSw4QkFBOEI7YUFDL0MsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxhQUFhLENBQUMsSUFBSTtJQUN6QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUVqRSxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoQyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVELE9BQU8sZ0JBQWdCLENBQUE7QUFDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2Zyb250ZW5kTW9kZWxBY3Rpb25Gb3JDb21tYW5kLCBmcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZEZvclBhdGgsIGZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGgsIGZyb250ZW5kTW9kZWxSZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdH0gZnJvbSBcIi4uLy4uL2Zyb250ZW5kLW1vZGVscy9yZXNvdXJjZS1kZWZpbml0aW9uLmpzXCJcblxuY29uc3QgU0hBUkVEX0ZST05URU5EX01PREVMX0FQSV9QQVRIID0gXCIvZnJvbnRlbmQtbW9kZWxzXCJcbmNvbnN0IEZST05URU5EX01PREVMX0NPTlRST0xMRVJfUEFUSCA9IG5ldyBVUkwoXCIuLi8uLi9mcm9udGVuZC1tb2RlbC1jb250cm9sbGVyLmpzXCIsIGltcG9ydC5tZXRhLnVybCkuaHJlZlxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gSG9vayBhcmdzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jdXJyZW50UGF0aCAtIFJlcXVlc3QgcGF0aCB3aXRob3V0IHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5oYXNNYXRjaGluZ0N1c3RvbVJvdXRlXSAtIFNldCB3aGVuIHRoZSByZXF1ZXN0IHBhdGggbWF0Y2hlcyBhbiBleHBsaWNpdCBjdXN0b20gcm91dGUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlJvdXRlUmVzb2x2ZXJIb29rUmVzdWx0IHwgbnVsbD59IC0gUm91dGUgb3ZlcnJpZGUgb3IgbnVsbC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbENvbW1hbmRSb3V0ZUhvb2soe2NvbmZpZ3VyYXRpb24sIGN1cnJlbnRQYXRoLCBoYXNNYXRjaGluZ0N1c3RvbVJvdXRlfSkge1xuICBjb25zdCBub3JtYWxpemVkQ3VycmVudFBhdGggPSBub3JtYWxpemVQYXRoKGN1cnJlbnRQYXRoKVxuXG4gIGlmIChub3JtYWxpemVkQ3VycmVudFBhdGggPT09IFNIQVJFRF9GUk9OVEVORF9NT0RFTF9BUElfUEFUSCkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiZnJvbnRlbmQtYXBpXCIsXG4gICAgICBjb250cm9sbGVyOiBcInZlbG9jaW91cy9hcGlcIixcbiAgICAgIGNvbnRyb2xsZXJQYXRoOiBGUk9OVEVORF9NT0RFTF9DT05UUk9MTEVSX1BBVEhcbiAgICB9XG4gIH1cblxuICAvLyBEb24ndCBpbnRlcmNlcHQgcGF0aHMgdGhhdCBtYXRjaCBleHBsaWNpdGx5IGRlZmluZWQgY3VzdG9tIHJvdXRlc1xuICBpZiAoaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZSkgcmV0dXJuIG51bGxcblxuICBjb25zdCBiYWNrZW5kUHJvamVjdHMgPSBjb25maWd1cmF0aW9uLmdldEJhY2tlbmRQcm9qZWN0cz8uKCkgfHwgW11cbiAgY29uc3QgY3VzdG9tQ29tbWFuZE1hdGNoID0gZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRGb3JQYXRoKHtcbiAgICBiYWNrZW5kUHJvamVjdHMsXG4gICAgY3VycmVudFBhdGg6IG5vcm1hbGl6ZWRDdXJyZW50UGF0aFxuICB9KVxuXG4gIGlmIChjdXN0b21Db21tYW5kTWF0Y2gpIHtcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRNZXRob2ROYW1lOiBjdXN0b21Db21tYW5kTWF0Y2gubWV0aG9kTmFtZSxcbiAgICAgIGZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kU2NvcGU6IGN1c3RvbUNvbW1hbmRNYXRjaC5zY29wZSxcbiAgICAgIG1vZGVsOiBjdXN0b21Db21tYW5kTWF0Y2gubW9kZWxOYW1lXG4gICAgfVxuXG4gICAgaWYgKGN1c3RvbUNvbW1hbmRNYXRjaC5tZW1iZXJJZCkge1xuICAgICAgcGFyYW1zLmlkID0gY3VzdG9tQ29tbWFuZE1hdGNoLm1lbWJlcklkXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJmcm9udGVuZC1jdXN0b20tY29tbWFuZFwiLFxuICAgICAgY29udHJvbGxlcjogY3VzdG9tQ29tbWFuZE1hdGNoLnJlc291cmNlUGF0aC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpLFxuICAgICAgY29udHJvbGxlclBhdGg6IEZST05URU5EX01PREVMX0NPTlRST0xMRVJfUEFUSCxcbiAgICAgIHBhcmFtc1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgYmFja2VuZFByb2plY3RzKSB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gZnJvbnRlbmRNb2RlbFJlc291cmNlc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVxuXG4gICAgZm9yIChjb25zdCBtb2RlbE5hbWUgaW4gcmVzb3VyY2VzKSB7XG4gICAgICBjb25zdCByZXNvdXJjZURlZmluaXRpb24gPSByZXNvdXJjZXNbbW9kZWxOYW1lXVxuICAgICAgY29uc3QgcmVzb3VyY2VQYXRoID0gZnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aChtb2RlbE5hbWUsIHJlc291cmNlRGVmaW5pdGlvbilcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXNvdXJjZVBhdGggPSBub3JtYWxpemVQYXRoKHJlc291cmNlUGF0aClcbiAgICAgIGNvbnN0IGV4cGVjdGVkUHJlZml4ID0gYCR7bm9ybWFsaXplZFJlc291cmNlUGF0aH0vYFxuXG4gICAgICBpZiAoIW5vcm1hbGl6ZWRDdXJyZW50UGF0aC5zdGFydHNXaXRoKGV4cGVjdGVkUHJlZml4KSkgY29udGludWVcblxuICAgICAgY29uc3QgY29tbWFuZE5hbWUgPSBub3JtYWxpemVkQ3VycmVudFBhdGguc2xpY2UoZXhwZWN0ZWRQcmVmaXgubGVuZ3RoKVxuICAgICAgaWYgKGNvbW1hbmROYW1lLmluY2x1ZGVzKFwiL1wiKSkgY29udGludWVcblxuICAgICAgY29uc3QgYWN0aW9uID0gZnJvbnRlbmRNb2RlbEFjdGlvbkZvckNvbW1hbmQoe2NvbW1hbmROYW1lLCBtb2RlbE5hbWUsIHJlc291cmNlRGVmaW5pdGlvbn0pXG4gICAgICBpZiAoIWFjdGlvbikgY29udGludWVcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBub3JtYWxpemVkUmVzb3VyY2VQYXRoLnJlcGxhY2UoL15cXC8rLywgXCJcIilcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uOiBgZnJvbnRlbmQtJHthY3Rpb259YCxcbiAgICAgICAgY29udHJvbGxlcixcbiAgICAgICAgY29udHJvbGxlclBhdGg6IEZST05URU5EX01PREVMX0NPTlRST0xMRVJfUEFUSFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoIHZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBOb3JtYWxpemVkIHBhdGggd2l0aCBsZWFkaW5nIHNsYXNoIGFuZCBubyB0cmFpbGluZyBzbGFzaC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gIGNvbnN0IHdpdGhMZWFkaW5nU2xhc2ggPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aCA6IGAvJHtwYXRofWBcblxuICBpZiAod2l0aExlYWRpbmdTbGFzaC5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIHdpdGhMZWFkaW5nU2xhc2gucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuICB9XG5cbiAgcmV0dXJuIHdpdGhMZWFkaW5nU2xhc2hcbn1cbiJdfQ==
|
|
@@ -42,9 +42,13 @@ export default class VelociousRoutesResolver {
|
|
|
42
42
|
} | undefined;
|
|
43
43
|
/**
|
|
44
44
|
* @param {string} currentPath - Request path without query string.
|
|
45
|
+
* @param {object} options - Resolver hook options.
|
|
46
|
+
* @param {boolean} [options.hasMatchingCustomRoute] - True when the path matched an explicit custom route.
|
|
45
47
|
* @returns {Promise<import("../configuration-types.js").RouteResolverHookResult | null>} - Matched action/controller from hooks.
|
|
46
48
|
*/
|
|
47
|
-
resolveRouteResolverHooks(currentPath: string
|
|
49
|
+
resolveRouteResolverHooks(currentPath: string, options?: {
|
|
50
|
+
hasMatchingCustomRoute?: boolean | undefined;
|
|
51
|
+
}): Promise<import("../configuration-types.js").RouteResolverHookResult | null>;
|
|
48
52
|
/**
|
|
49
53
|
* @param {object} args - Options object.
|
|
50
54
|
* @param {string} args.action - Action.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/routes/resolver.js"],"names":[],"mappings":"AAkDA;IAIE;;;;;OAKG;IACH,kDAJG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACmF,OAAO,EAA/H,OAAO,kCAAkC,EAAE,OAAO,GAAG,OAAO,4CAA4C,EAAE,OAAO;QACvD,QAAQ,EAAlE,OAAO,mCAAmC,EAAE,OAAO;KAC7D,EAcA;IAtBD,iCAAiC;IACjC,QADW,MAAM,GAAG,SAAS,CACvB;IAaJ,qDAAkC;IAGlC;;MAAgC;IAGhC,2HAAsB;IACtB,8DAAwB;IAG1B;;OAEG;IACH,mBAFa,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBlC;IAED,
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/routes/resolver.js"],"names":[],"mappings":"AAkDA;IAIE;;;;;OAKG;IACH,kDAJG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACmF,OAAO,EAA/H,OAAO,kCAAkC,EAAE,OAAO,GAAG,OAAO,4CAA4C,EAAE,OAAO;QACvD,QAAQ,EAAlE,OAAO,mCAAmC,EAAE,OAAO;KAC7D,EAcA;IAtBD,iCAAiC;IACjC,QADW,MAAM,GAAG,SAAS,CACvB;IAaJ,qDAAkC;IAGlC;;MAAgC;IAGhC,2HAAsB;IACtB,8DAAwB;IAG1B;;OAEG;IACH,mBAFa,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBlC;IAED,yBAiIC;IAhIC,gFAAyC;IAkI3C;;;;OAIG;IACH,2CAHG;QAAqB,cAAc,EAA3B,MAAM;KACd,GAAU,OAAO,CAAC,cAAc,kBAAkB,EAAE,OAAO,CAAC,CAsB9D;IAED;;;;OAIG;IACH,2BAJW,OAAO,iBAAiB,EAAE,OAAO,QACjC,MAAM,GACJ;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,SAAS,CAiC1C;IAED;;;;;OAKG;IACH,uCALW,MAAM,YAEd;QAA0B,sBAAsB;KAChD,GAAU,OAAO,CAAC,OAAO,2BAA2B,EAAE,uBAAuB,GAAG,IAAI,CAAC,CAoDvF;IAED;;;;;OAKG;IACH,6CAJG;QAAqB,MAAM,EAAnB,MAAM;QAC0C,eAAe,EAA/D,cAAc,kBAAkB,EAAE,OAAO;KACjD,GAAU,OAAO,CAAC,IAAI,CAAC,CAiBzB;IAED;;;OAGG;IACH,uBAHW,IAAI,GACF,MAAM,CAqBlB;IAED;;;OAGG;IACH,iCAHW,GAAG,GACD,GAAG,CA2Bf;CACF;mBAtakB,cAAc"}
|
|
@@ -90,7 +90,12 @@ export default class VelociousRoutesResolver {
|
|
|
90
90
|
const rawPath = this.request.path();
|
|
91
91
|
const currentPath = rawPath.split("?")[0];
|
|
92
92
|
let viewPath;
|
|
93
|
-
const
|
|
93
|
+
const preCheckParams = { ...this.params };
|
|
94
|
+
const hasMatchingCustomRoute = currentRoute ? !!this.matchPathWithRoutes(currentRoute, currentPath) : false;
|
|
95
|
+
if (hasMatchingCustomRoute) {
|
|
96
|
+
this.params = preCheckParams;
|
|
97
|
+
}
|
|
98
|
+
const routeResolverHookMatch = await this.resolveRouteResolverHooks(currentPath, { hasMatchingCustomRoute });
|
|
94
99
|
const matchResult = routeResolverHookMatch || !currentRoute ? undefined : this.matchPathWithRoutes(currentRoute, currentPath);
|
|
95
100
|
const actionParam = this.params.action;
|
|
96
101
|
const controllerParam = this.params.controller;
|
|
@@ -247,14 +252,18 @@ export default class VelociousRoutesResolver {
|
|
|
247
252
|
}
|
|
248
253
|
/**
|
|
249
254
|
* @param {string} currentPath - Request path without query string.
|
|
255
|
+
* @param {object} options - Resolver hook options.
|
|
256
|
+
* @param {boolean} [options.hasMatchingCustomRoute] - True when the path matched an explicit custom route.
|
|
250
257
|
* @returns {Promise<import("../configuration-types.js").RouteResolverHookResult | null>} - Matched action/controller from hooks.
|
|
251
258
|
*/
|
|
252
|
-
async resolveRouteResolverHooks(currentPath) {
|
|
259
|
+
async resolveRouteResolverHooks(currentPath, options = {}) {
|
|
260
|
+
const { hasMatchingCustomRoute = false } = options;
|
|
253
261
|
const hooks = this.configuration.getRouteResolverHooks?.() || [];
|
|
254
262
|
for (const hook of hooks) {
|
|
255
263
|
const hookResult = await hook({
|
|
256
264
|
configuration: this.configuration,
|
|
257
265
|
currentPath,
|
|
266
|
+
hasMatchingCustomRoute,
|
|
258
267
|
params: this.params,
|
|
259
268
|
request: this.request,
|
|
260
269
|
resolver: this,
|
|
@@ -355,4 +364,4 @@ export default class VelociousRoutesResolver {
|
|
|
355
364
|
return value;
|
|
356
365
|
}
|
|
357
366
|
}
|
|
358
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL3Jlc29sdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxLQUFLLENBQUE7QUFDakMsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUNqQyxPQUFPLFlBQVksTUFBTSxzREFBc0QsQ0FBQTtBQUMvRSxPQUFPLFdBQVcsTUFBTSwwQkFBMEIsQ0FBQTtBQUNsRCxPQUFPLGlCQUFpQixNQUFNLGlDQUFpQyxDQUFBO0FBRS9EOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQUMsVUFBVTtJQUNyQyxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUN4RixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUywrQkFBK0IsQ0FBQyxLQUFLO0lBQzVDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUNwRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUE7SUFFN0YsT0FBTyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNuQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUywwQkFBMEIsQ0FBQyxFQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUscUJBQXFCLEVBQUM7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cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZGlybmFtZX0gZnJvbSBcInBhdGhcIlxuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tIFwidXJsXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IFVwbG9hZGVkRmlsZSBmcm9tIFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3VwbG9hZGVkLWZpbGUvdXBsb2FkZWQtZmlsZS5qc1wiXG5pbXBvcnQgZW5zdXJlRXJyb3IgZnJvbSBcIi4uL3V0aWxzL2Vuc3VyZS1lcnJvci5qc1wiXG5pbXBvcnQgdG9JbXBvcnRTcGVjaWZpZXIgZnJvbSBcIi4uL3V0aWxzL3RvLWltcG9ydC1zcGVjaWZpZXIuanNcIlxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25OYW1lIC0gUmF3IGFjdGlvbiBuYW1lIGZyb20gcm91dGUgcGFyYW1zIG9yIHJvdXRlIGhvb2suXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vcm1hbGl6ZWQgY29udHJvbGxlciBtZXRob2QgbmFtZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQWN0aW9uTmFtZShhY3Rpb25OYW1lKSB7XG4gIHJldHVybiBpbmZsZWN0aW9uLmNhbWVsaXplKGFjdGlvbk5hbWUucmVwbGFjZUFsbChcIi1cIiwgXCJfXCIpLnJlcGxhY2VBbGwoXCIvXCIsIFwiX1wiKSwgdHJ1ZSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEltcG9ydCBlcnJvci5cbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gTWlzc2luZyBtb2R1bGUgc3BlY2lmaWVyIGZyb20gYW4gRVJSX01PRFVMRV9OT1RfRk9VTkQgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gbWlzc2luZ01vZHVsZVNwZWNpZmllckZyb21FcnJvcihlcnJvcikge1xuICBjb25zdCBmaXJzdExpbmUgPSBlcnJvci5tZXNzYWdlLnNwbGl0KFwiXFxuXCIpWzBdIHx8IFwiXCJcbiAgY29uc3QgbWF0Y2ggPSBmaXJzdExpbmUubWF0Y2goL15DYW5ub3QgZmluZCAoPzptb2R1bGV8cGFja2FnZSkgWydcIl0oLis/KVsnXCJdIGltcG9ydGVkIGZyb20gLylcblxuICByZXR1cm4gbWF0Y2g/LlsxXVxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICogQHBhcmFtIHtFcnJvcn0gYXJncy5lcnJvciAtIEltcG9ydCBlcnJvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRhcmdldFBhdGggLSBUYXJnZXQgY29udHJvbGxlciBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudGFyZ2V0SW1wb3J0U3BlY2lmaWVyIC0gVGFyZ2V0IGNvbnRyb2xsZXIgaW1wb3J0IHNwZWNpZmllci5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgd2hlbiB0aGUgbWlzc2luZyBtb2R1bGUgaXMgdGhlIHRhcmdldCBjb250cm9sbGVyIGZpbGUuXG4gKi9cbmZ1bmN0aW9uIGlzTWlzc2luZ1RhcmdldE1vZHVsZUVycm9yKHtlcnJvciwgdGFyZ2V0UGF0aCwgdGFyZ2V0SW1wb3J0U3BlY2lmaWVyfSkge1xuICBjb25zdCBlbnN1cmVkRXJyb3IgPSBlbnN1cmVFcnJvcihlcnJvcilcbiAgY29uc3QgaXNNb2R1bGVOb3RGb3VuZEVycm9yID0gXCJjb2RlXCIgaW4gZW5zdXJlZEVycm9yICYmIGVuc3VyZWRFcnJvci5jb2RlID09PSBcIkVSUl9NT0RVTEVfTk9UX0ZPVU5EXCJcblxuICBpZiAoIWlzTW9kdWxlTm90Rm91bmRFcnJvcikgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgbWlzc2luZ1NwZWNpZmllciA9IG1pc3NpbmdNb2R1bGVTcGVjaWZpZXJGcm9tRXJyb3IoZW5zdXJlZEVycm9yKVxuXG4gIGlmICghbWlzc2luZ1NwZWNpZmllcikgcmV0dXJuIGZhbHNlXG5cbiAgcmV0dXJuIG1pc3NpbmdTcGVjaWZpZXIgPT09IHRhcmdldFBhdGggfHwgbWlzc2luZ1NwZWNpZmllciA9PT0gdGFyZ2V0SW1wb3J0U3BlY2lmaWVyXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c1JvdXRlc1Jlc29sdmVyIHtcbiAgLyoqIEB0eXBlIHtMb2dnZXIgfCB1bmRlZmluZWR9ICovXG4gIGxvZ2dlclxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9IGFyZ3MucmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlc3BvbnNlIC0gUmVzcG9uc2Ugb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIHJlcXVlc3QsIHJlc3BvbnNlfSkge1xuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29uZmlndXJhdGlvbiBnaXZlblwiKVxuICAgIGlmICghcmVxdWVzdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVxdWVzdCBnaXZlblwiKVxuICAgIGlmICghcmVzcG9uc2UpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlc3BvbnNlIGdpdmVuXCIpXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5sb2dnZXIgPSBuZXcgTG9nZ2VyKFwiUm91dGVzUmVzb2x2ZXJcIiwge2NvbmZpZ3VyYXRpb259KVxuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSByZXF1ZXN0LnBhcmFtcygpIHx8IHt9XG4gICAgdGhpcy5wYXJhbXMgPSB7Li4ucmVxdWVzdFBhcmFtc31cbiAgICBkZWxldGUgdGhpcy5wYXJhbXMuYWN0aW9uXG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLmNvbnRyb2xsZXJcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0XG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IC0gRmxhdCBxdWVyeSBwYXJhbXMgZm9yIHRlbmFudC9hYmlsaXR5IHJlc29sdXRpb24uXG4gICAqL1xuICBxdWVyeVBhcmFtZXRlcnMoKSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnJlcXVlc3QucGF0aCgpLnNwbGl0KFwiP1wiKVsxXVxuXG4gICAgaWYgKCFxdWVyeSkgcmV0dXJuIHt9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gICAgY29uc3QgcGFyYW1zID0ge31cbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5KVxuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc2VhcmNoUGFyYW1zLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHBhcmFtc1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFyYW1zW2tleV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXNcbiAgfVxuXG4gIGFzeW5jIHJlc29sdmUoKSB7XG4gICAgdGhpcy5yb3V0ZUhvb2tDb250cm9sbGVyQ2xhc3MgPSB1bmRlZmluZWRcbiAgICBsZXQgY29udHJvbGxlclBhdGhcbiAgICBjb25zdCBjb25maWd1cmF0aW9uUm91dGVzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFJvdXRlcygpXG4gICAgY29uc3QgY3VycmVudFJvdXRlID0gY29uZmlndXJhdGlvblJvdXRlcz8ucm9vdFJvdXRlXG4gICAgY29uc3QgcmF3UGF0aCA9IHRoaXMucmVxdWVzdC5wYXRoKClcbiAgICBjb25zdCBjdXJyZW50UGF0aCA9IHJhd1BhdGguc3BsaXQoXCI/XCIpWzBdXG4gICAgbGV0IHZpZXdQYXRoXG5cbiAgICBjb25zdCByb3V0ZVJlc29sdmVySG9va01hdGNoID0gYXdhaXQgdGhpcy5yZXNvbHZlUm91dGVSZXNvbHZlckhvb2tzKGN1cnJlbnRQYXRoKVxuICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaCB8fCAhY3VycmVudFJvdXRlID8gdW5kZWZpbmVkIDogdGhpcy5tYXRjaFBhdGhXaXRoUm91dGVzKGN1cnJlbnRSb3V0ZSwgY3VycmVudFBhdGgpXG4gICAgY29uc3QgYWN0aW9uUGFyYW0gPSB0aGlzLnBhcmFtcy5hY3Rpb25cbiAgICBjb25zdCBjb250cm9sbGVyUGFyYW0gPSB0aGlzLnBhcmFtcy5jb250cm9sbGVyXG4gICAgY29uc3QgYWN0aW9uVmFsdWUgPSB0eXBlb2YgYWN0aW9uUGFyYW0gPT0gXCJzdHJpbmdcIiA/IGFjdGlvblBhcmFtIDogKEFycmF5LmlzQXJyYXkoYWN0aW9uUGFyYW0pID8gYWN0aW9uUGFyYW1bMF0gOiB1bmRlZmluZWQpXG4gICAgbGV0IGFjdGlvbiA9IHR5cGVvZiBhY3Rpb25WYWx1ZSA9PSBcInN0cmluZ1wiID8gbm9ybWFsaXplQWN0aW9uTmFtZShhY3Rpb25WYWx1ZSkgOiB1bmRlZmluZWRcbiAgICBsZXQgY29udHJvbGxlciA9IHR5cGVvZiBjb250cm9sbGVyUGFyYW0gPT0gXCJzdHJpbmdcIiA/IGNvbnRyb2xsZXJQYXJhbSA6IChBcnJheS5pc0FycmF5KGNvbnRyb2xsZXJQYXJhbSkgPyBjb250cm9sbGVyUGFyYW1bMF0gOiB1bmRlZmluZWQpXG5cbiAgICBpZiAocm91dGVSZXNvbHZlckhvb2tNYXRjaCkge1xuICAgICAgY29uc3Qgcm91dGVIb29rQ29udHJvbGxlckNsYXNzID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaC5jb250cm9sbGVyQ2xhc3NcbiAgICAgIGxldCByb3V0ZUhvb2tDb250cm9sbGVyUGF0aFxuICAgICAgbGV0IHJvdXRlSG9va1ZpZXdQYXRoXG5cbiAgICAgIGlmICh0eXBlb2Ygcm91dGVSZXNvbHZlckhvb2tNYXRjaC5jb250cm9sbGVyUGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByb3V0ZUhvb2tDb250cm9sbGVyUGF0aCA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlclBhdGhcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiByb3V0ZVJlc29sdmVySG9va01hdGNoLnZpZXdQYXRoID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJvdXRlSG9va1ZpZXdQYXRoID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaC52aWV3UGF0aFxuICAgICAgfVxuXG4gICAgICBjb250cm9sbGVyID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaC5jb250cm9sbGVyXG4gICAgICBhY3Rpb24gPSBub3JtYWxpemVBY3Rpb25OYW1lKHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guYWN0aW9uKVxuICAgICAgdGhpcy5wYXJhbXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXJcbiAgICAgIHRoaXMucGFyYW1zLmFjdGlvbiA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guYWN0aW9uXG4gICAgICBjb250cm9sbGVyUGF0aCA9IHJvdXRlSG9va0NvbnRyb2xsZXJQYXRoIHx8IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9L2NvbnRyb2xsZXIuanNgXG4gICAgICB2aWV3UGF0aCA9IHJvdXRlSG9va1ZpZXdQYXRoIHx8IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9YFxuICAgICAgdGhpcy5yb3V0ZUhvb2tDb250cm9sbGVyQ2xhc3MgPSByb3V0ZUhvb2tDb250cm9sbGVyQ2xhc3NcbiAgICB9IGVsc2UgaWYgKCFtYXRjaFJlc3VsdCkge1xuICAgICAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpXG4gICAgICAgIGNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoX19maWxlbmFtZSlcbiAgICAgICAgY29uc3QgcmVxdWVzdGVkUGF0aCA9IGN1cnJlbnRQYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKSB8fCBcIl9yb290XCJcbiAgICAgICAgY29uc3QgYXR0ZW1wdGVkQ29udHJvbGxlclBhdGggPSBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCl9L3NyYy9yb3V0ZXMvJHtyZXF1ZXN0ZWRQYXRofS9jb250cm9sbGVyLmpzYFxuXG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IHRoaXMubG9nZ2VyXG5cbiAgICAgICAgaWYgKCFsb2dnZXIpIHRocm93IG5ldyBFcnJvcihcIkxvZ2dlciBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgICAgICBhd2FpdCBsb2dnZXIud2FybihgTm8gcm91dGUgbWF0Y2hlZCBmb3IgJHtyYXdQYXRofS4gVHJpZWQgY29udHJvbGxlciBhdCAke2F0dGVtcHRlZENvbnRyb2xsZXJQYXRofWApXG5cbiAgICAgICAgY29udHJvbGxlciA9IFwiZXJyb3JzXCJcbiAgICAgICAgY29udHJvbGxlclBhdGggPSBcIi4vYnVpbHQtaW4vZXJyb3JzL2NvbnRyb2xsZXIuanNcIlxuICAgICAgICBhY3Rpb24gPSBcIm5vdEZvdW5kXCJcbiAgICAgICAgdmlld1BhdGggPSBhd2FpdCBmcy5yZWFscGF0aChgJHtfX2Rpcm5hbWV9L2J1aWx0LWluL2Vycm9yc2ApXG4gICAgfSBlbHNlIGlmIChhY3Rpb24pIHtcbiAgICAgIGlmICghY29udHJvbGxlcikgY29udHJvbGxlciA9IFwiX3Jvb3RcIlxuXG4gICAgICBjb250cm9sbGVyUGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9L2NvbnRyb2xsZXIuanNgXG4gICAgICB2aWV3UGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9YFxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hdGNoZWQgdGhlIHJvdXRlIGJ1dCBkaWRuJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggaXQ6ICR7cmF3UGF0aH0gKGFjdGlvbjogJHthY3Rpb259LCBjb250cm9sbGVyOiAke2NvbnRyb2xsZXJ9LCBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wYXJhbXMpfSlgKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xsZXJDbGFzcyA9IGF3YWl0IHRoaXMucmVzb2x2ZUNvbnRyb2xsZXJDbGFzcyh7Y29udHJvbGxlclBhdGh9KVxuICAgIGNvbnN0IGNvbnRyb2xsZXJSZXF1ZXN0ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5yZXF1ZXN0KVxuICAgIGNvbnN0IGNvbnRyb2xsZXJJbnN0YW5jZSA9IG5ldyBjb250cm9sbGVyQ2xhc3Moe1xuICAgICAgYWN0aW9uLFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgY29udHJvbGxlcixcbiAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICByZXF1ZXN0OiBjb250cm9sbGVyUmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlLFxuICAgICAgdmlld1BhdGhcbiAgICB9KVxuXG4gICAgaWYgKCEoYWN0aW9uIGluIGNvbnRyb2xsZXJJbnN0YW5jZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBhY3Rpb24gb24gY29udHJvbGxlcjogJHtjb250cm9sbGVyfSMke2FjdGlvbn1gKVxuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbkhhbmRsZXJzID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj59ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChjb250cm9sbGVySW5zdGFuY2UpKVxuXG4gICAgYXdhaXQgdGhpcy5fbG9nQWN0aW9uU3RhcnQoe2FjdGlvbiwgY29udHJvbGxlckNsYXNzfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW5hbnQgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucmVzb2x2ZVRlbmFudCh7XG4gICAgICAgIHBhcmFtczogey4uLnRoaXMucXVlcnlQYXJhbWV0ZXJzKCksIC4uLnRoaXMucGFyYW1zfSxcbiAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICByZXNwb25zZTogdGhpcy5yZXNwb25zZVxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYWJpbGl0eSA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5yZXNvbHZlQWJpbGl0eSh7XG4gICAgICAgICAgICBwYXJhbXM6IHRoaXMucGFyYW1zLFxuICAgICAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICAgICAgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2VcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhBYmlsaXR5KGFiaWxpdHksIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGNvbnRyb2xsZXJJbnN0YW5jZS5fcnVuQmVmb3JlQ2FsbGJhY2tzKClcbiAgICAgICAgICAgIGF3YWl0IGFjdGlvbkhhbmRsZXJzW2FjdGlvbl0oKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbnN1cmVkRXJyb3IgPSBlbnN1cmVFcnJvcihlcnJvcilcbiAgICAgIGNvbnN0IGVycm9yQ29udGV4dCA9IHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjb250cm9sbGVyLFxuICAgICAgICBodHRwTWV0aG9kOiB0aGlzLnJlcXVlc3QuaHR0cE1ldGhvZCgpLFxuICAgICAgICBwYXRoOiB0aGlzLnJlcXVlc3QucGF0aCgpLFxuICAgICAgICBzdGFnZTogXCJjb250cm9sbGVyLWFjdGlvblwiXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9yV2l0aENvbnRleHQgPSAvKiogQHR5cGUge3t2ZWxvY2lvdXNDb250ZXh0Pzogb2JqZWN0fX0gKi8gKGVuc3VyZWRFcnJvcilcblxuICAgICAgZXJyb3JXaXRoQ29udGV4dC52ZWxvY2lvdXNDb250ZXh0ID0ge1xuICAgICAgICAuLi4oZXJyb3JXaXRoQ29udGV4dC52ZWxvY2lvdXNDb250ZXh0IHx8IHt9KSxcbiAgICAgICAgY29udHJvbGxlckFjdGlvbjogZXJyb3JDb250ZXh0XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVuc3VyZWRFcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbnRyb2xsZXJQYXRoIC0gQ29udHJvbGxlciBpbXBvcnQgcGF0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdD59IC0gVGhlIHJlc29sdmVkIGNvbnRyb2xsZXIgY2xhc3MuXG4gICAqL1xuICBhc3luYyByZXNvbHZlQ29udHJvbGxlckNsYXNzKHtjb250cm9sbGVyUGF0aH0pIHtcbiAgICBjb25zdCBjb250cm9sbGVySW1wb3J0U3BlY2lmaWVyID0gdG9JbXBvcnRTcGVjaWZpZXIoY29udHJvbGxlclBhdGgpXG5cbiAgICBpZiAoIXRoaXMucm91dGVIb29rQ29udHJvbGxlckNsYXNzKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSAqLyAoKGF3YWl0IGltcG9ydChjb250cm9sbGVySW1wb3J0U3BlY2lmaWVyKSkuZGVmYXVsdClcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gKi8gKChhd2FpdCBpbXBvcnQoY29udHJvbGxlckltcG9ydFNwZWNpZmllcikpLmRlZmF1bHQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGlzTWlzc2luZ0NvbnRyb2xsZXJGaWxlRXJyb3IgPSBpc01pc3NpbmdUYXJnZXRNb2R1bGVFcnJvcih7XG4gICAgICAgIGVycm9yOiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICAgIHRhcmdldEltcG9ydFNwZWNpZmllcjogY29udHJvbGxlckltcG9ydFNwZWNpZmllcixcbiAgICAgICAgdGFyZ2V0UGF0aDogY29udHJvbGxlclBhdGhcbiAgICAgIH0pXG5cbiAgICAgIGlmICghaXNNaXNzaW5nQ29udHJvbGxlckZpbGVFcnJvcikgdGhyb3cgZW5zdXJlRXJyb3IoZXJyb3IpXG5cbiAgICAgIHJldHVybiAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHR9ICovICh0aGlzLnJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2Utcm91dGUuanNcIikuZGVmYXVsdH0gcm91dGUgLSBSb3V0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcmV0dXJucyB7e3Jlc3RQYXRoOiBzdHJpbmd9IHwgdW5kZWZpbmVkfSAtIFJFU1QgcGF0aCBtZXRhZGF0YSBmb3IgdGhpcyByb3V0ZS5cbiAgICovXG4gIG1hdGNoUGF0aFdpdGhSb3V0ZXMocm91dGUsIHBhdGgpIHtcbiAgICBjb25zdCBwYXRoV2l0aG91dFNsYXNoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIikuc3BsaXQoXCI/XCIpWzBdXG5cbiAgICBmb3IgKGNvbnN0IHN1YlJvdXRlIG9mIHJvdXRlLnJvdXRlcykge1xuICAgICAgY29uc3QgcGFyYW1zU25hcHNob3QgPSB7Li4udGhpcy5wYXJhbXN9XG4gICAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN1YlJvdXRlLm1hdGNoV2l0aFBhdGgoe1xuICAgICAgICBwYXJhbXM6IHRoaXMucGFyYW1zLFxuICAgICAgICBwYXRoOiBwYXRoV2l0aG91dFNsYXNoLFxuICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3RcbiAgICAgIH0pXG5cbiAgICAgIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXNTbmFwc2hvdFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7cmVzdFBhdGh9ID0gbWF0Y2hSZXN1bHRcblxuICAgICAgaWYgKHJlc3RQYXRoKSB7XG4gICAgICAgIGNvbnN0IHJlY3Vyc2l2ZU1hdGNoID0gdGhpcy5tYXRjaFBhdGhXaXRoUm91dGVzKHN1YlJvdXRlLCByZXN0UGF0aClcblxuICAgICAgICBpZiAocmVjdXJzaXZlTWF0Y2gpIHtcbiAgICAgICAgICByZXR1cm4gcmVjdXJzaXZlTWF0Y2hcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zU25hcHNob3RcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hdGNoUmVzdWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjdXJyZW50UGF0aCAtIFJlcXVlc3QgcGF0aCB3aXRob3V0IHF1ZXJ5IHN0cmluZy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Sb3V0ZVJlc29sdmVySG9va1Jlc3VsdCB8IG51bGw+fSAtIE1hdGNoZWQgYWN0aW9uL2NvbnRyb2xsZXIgZnJvbSBob29rcy5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVSb3V0ZVJlc29sdmVySG9va3MoY3VycmVudFBhdGgpIHtcbiAgICBjb25zdCBob29rcyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRSb3V0ZVJlc29sdmVySG9va3M/LigpIHx8IFtdXG5cbiAgICBmb3IgKGNvbnN0IGhvb2sgb2YgaG9va3MpIHtcbiAgICAgIGNvbnN0IGhvb2tSZXN1bHQgPSBhd2FpdCBob29rKHtcbiAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICBjdXJyZW50UGF0aCxcbiAgICAgICAgcGFyYW1zOiB0aGlzLnBhcmFtcyxcbiAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICByZXNvbHZlcjogdGhpcyxcbiAgICAgICAgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2VcbiAgICAgIH0pXG5cbiAgICAgIGlmICghaG9va1Jlc3VsdCkgY29udGludWVcblxuICAgICAgaWYgKHR5cGVvZiBob29rUmVzdWx0LmFjdGlvbiAhPT0gXCJzdHJpbmdcIiB8fCBob29rUmVzdWx0LmFjdGlvbi5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBhY3Rpb24gdG8gYmUgYSBzdHJpbmcsIGdvdDogJHtob29rUmVzdWx0LmFjdGlvbn1gKVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGhvb2tSZXN1bHQuY29udHJvbGxlciAhPT0gXCJzdHJpbmdcIiB8fCBob29rUmVzdWx0LmNvbnRyb2xsZXIubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgY29udHJvbGxlciB0byBiZSBhIHN0cmluZywgZ290OiAke2hvb2tSZXN1bHQuY29udHJvbGxlcn1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC5wYXJhbXMgJiYgdHlwZW9mIGhvb2tSZXN1bHQucGFyYW1zICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBwYXJhbXMgdG8gYmUgYW4gb2JqZWN0LCBnb3Q6ICR7aG9va1Jlc3VsdC5wYXJhbXN9YClcbiAgICAgIH1cblxuICAgICAgaWYgKGhvb2tSZXN1bHQuY29udHJvbGxlckNsYXNzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGhvb2tSZXN1bHQuY29udHJvbGxlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIGNvbnRyb2xsZXJDbGFzcyB0byBiZSBhIGNsYXNzL2Z1bmN0aW9uIHdoZW4gcHJvdmlkZWQsIGdvdDogJHtob29rUmVzdWx0LmNvbnRyb2xsZXJDbGFzc31gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC5jb250cm9sbGVyUGF0aCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LmNvbnRyb2xsZXJQYXRoICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBjb250cm9sbGVyUGF0aCB0byBiZSBhIHN0cmluZyB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC5jb250cm9sbGVyUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC52aWV3UGF0aCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBob29rUmVzdWx0LnZpZXdQYXRoICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayB2aWV3UGF0aCB0byBiZSBhIHN0cmluZyB3aGVuIHByb3ZpZGVkLCBnb3Q6ICR7aG9va1Jlc3VsdC52aWV3UGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC5wYXJhbXMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBhcmFtcywgaG9va1Jlc3VsdC5wYXJhbXMpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBob29rUmVzdWx0XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hY3Rpb24gLSBBY3Rpb24uXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gYXJncy5jb250cm9sbGVyQ2xhc3MgLSBDb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2xvZ0FjdGlvblN0YXJ0KHthY3Rpb24sIGNvbnRyb2xsZXJDbGFzc30pIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0XG4gICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5fZm9ybWF0VGltZXN0YW1wKG5ldyBEYXRlKCkpXG4gICAgY29uc3QgcmVtb3RlQWRkcmVzcyA9IHJlcXVlc3QucmVtb3RlQWRkcmVzcz8uKCkgfHwgcmVxdWVzdC5oZWFkZXIoXCJ4LWZvcndhcmRlZC1mb3JcIikgfHwgXCJ1bmtub3duXCJcbiAgICBjb25zdCBsb2dnZWRQYXJhbXMgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodGhpcy5fc2FuaXRpemVQYXJhbXNGb3JMb2dnaW5nKHRoaXMucGFyYW1zKSlcbiAgICBjb25zdCBsb2dNZXRob2QgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnQoKSA9PT0gXCJ0ZXN0XCIgPyBcImRlYnVnXCIgOiBcImluZm9cIlxuXG4gICAgZGVsZXRlIGxvZ2dlZFBhcmFtcy5hY3Rpb25cbiAgICBkZWxldGUgbG9nZ2VkUGFyYW1zLmNvbnRyb2xsZXJcblxuICAgIGNvbnN0IGNvbnRyb2xsZXJMb2dnZXIgPSBuZXcgTG9nZ2VyKGNvbnRyb2xsZXJDbGFzcy5uYW1lLCB7Y29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9ufSlcblxuICAgIGF3YWl0IGNvbnRyb2xsZXJMb2dnZXJbbG9nTWV0aG9kXSgoKSA9PiBgU3RhcnRlZCAke3JlcXVlc3QuaHR0cE1ldGhvZCgpfSBcIiR7cmVxdWVzdC5wYXRoKCl9XCIgZm9yICR7cmVtb3RlQWRkcmVzc30gYXQgJHt0aW1lc3RhbXB9YClcbiAgICBhd2FpdCBjb250cm9sbGVyTG9nZ2VyW2xvZ01ldGhvZF0oKCkgPT4gYFByb2Nlc3NpbmcgYnkgJHtjb250cm9sbGVyQ2xhc3MubmFtZX0jJHthY3Rpb259YClcbiAgICBhd2FpdCBjb250cm9sbGVyTG9nZ2VyW2xvZ01ldGhvZF0oKCkgPT4gW2AgIFBhcmFtZXRlcnM6YCwgbG9nZ2VkUGFyYW1zXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgLSBEYXRlIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSB0aW1lc3RhbXAuXG4gICAqL1xuICBfZm9ybWF0VGltZXN0YW1wKGRhdGUpIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtIC0gTnVtLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHBhZC5cbiAgICAgKi9cbiAgICBjb25zdCBwYWQgPSAobnVtKSA9PiBTdHJpbmcobnVtKS5wYWRTdGFydCgyLCBcIjBcIilcbiAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpXG4gICAgY29uc3QgbW9udGggPSBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgICBjb25zdCBkYXkgPSBwYWQoZGF0ZS5nZXREYXRlKCkpXG4gICAgY29uc3QgaG91cnMgPSBwYWQoZGF0ZS5nZXRIb3VycygpKVxuICAgIGNvbnN0IG1pbnV0ZXMgPSBwYWQoZGF0ZS5nZXRNaW51dGVzKCkpXG4gICAgY29uc3Qgc2Vjb25kcyA9IHBhZChkYXRlLmdldFNlY29uZHMoKSlcbiAgICBjb25zdCBvZmZzZXRNaW51dGVzID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpXG4gICAgY29uc3Qgb2Zmc2V0U2lnbiA9IG9mZnNldE1pbnV0ZXMgPiAwID8gXCItXCIgOiBcIitcIlxuICAgIGNvbnN0IG9mZnNldFRvdGFsTWludXRlcyA9IE1hdGguYWJzKG9mZnNldE1pbnV0ZXMpXG4gICAgY29uc3Qgb2Zmc2V0SG91cnMgPSBwYWQoTWF0aC5mbG9vcihvZmZzZXRUb3RhbE1pbnV0ZXMgLyA2MCkpXG4gICAgY29uc3Qgb2Zmc2V0UmVtYWluaW5nTWludXRlcyA9IHBhZChvZmZzZXRUb3RhbE1pbnV0ZXMgJSA2MClcblxuICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0gJHtob3Vyc306JHttaW51dGVzfToke3NlY29uZHN9ICR7b2Zmc2V0U2lnbn0ke29mZnNldEhvdXJzfSR7b2Zmc2V0UmVtYWluaW5nTWludXRlc31gXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7YW55fSAtIFRoZSBzYW5pdGl6ZSBwYXJhbXMgZm9yIGxvZ2dpbmcuXG4gICAqL1xuICBfc2FuaXRpemVQYXJhbXNGb3JMb2dnaW5nKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVXBsb2FkZWRGaWxlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbGFzc05hbWU6IHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICAgIGZpbGVuYW1lOiB2YWx1ZS5maWxlbmFtZSgpLFxuICAgICAgICBzaXplOiB2YWx1ZS5zaXplKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHRoaXMuX3Nhbml0aXplUGFyYW1zRm9yTG9nZ2luZyhpdGVtKSlcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgICBjb25zdCByZXN1bHQgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLl9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcodmFsdWVba2V5XSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG4iXX0=
|
|
367
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL3Jlc29sdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxLQUFLLENBQUE7QUFDakMsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQUNqQyxPQUFPLFlBQVksTUFBTSxzREFBc0QsQ0FBQTtBQUMvRSxPQUFPLFdBQVcsTUFBTSwwQkFBMEIsQ0FBQTtBQUNsRCxPQUFPLGlCQUFpQixNQUFNLGlDQUFpQyxDQUFBO0FBRS9EOzs7R0FHRztBQUNILFNBQVMsbUJBQW1CLENBQUMsVUFBVTtJQUNyQyxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUN4RixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUywrQkFBK0IsQ0FBQyxLQUFLO0lBQzVDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUNwRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUE7SUFFN0YsT0FBTyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNuQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUywwQkFBMEIsQ0FBQyxFQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUscUJBQXFCLEVBQUM7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Q0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ2xFLENBQUM7UUFFRCxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxrQ0FBa0M7WUFDbEMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFBO1lBRWpCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNyQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQzFELENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQTtRQUNmLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2Rpcm5hbWV9IGZyb20gXCJwYXRoXCJcbmltcG9ydCB7ZmlsZVVSTFRvUGF0aH0gZnJvbSBcInVybFwiXG5pbXBvcnQgZnMgZnJvbSBcImZzL3Byb21pc2VzXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi4vbG9nZ2VyLmpzXCJcbmltcG9ydCBVcGxvYWRlZEZpbGUgZnJvbSBcIi4uL2h0dHAtc2VydmVyL2NsaWVudC91cGxvYWRlZC1maWxlL3VwbG9hZGVkLWZpbGUuanNcIlxuaW1wb3J0IGVuc3VyZUVycm9yIGZyb20gXCIuLi91dGlscy9lbnN1cmUtZXJyb3IuanNcIlxuaW1wb3J0IHRvSW1wb3J0U3BlY2lmaWVyIGZyb20gXCIuLi91dGlscy90by1pbXBvcnQtc3BlY2lmaWVyLmpzXCJcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uTmFtZSAtIFJhdyBhY3Rpb24gbmFtZSBmcm9tIHJvdXRlIHBhcmFtcyBvciByb3V0ZSBob29rLlxuICogQHJldHVybnMge3N0cmluZ30gLSBOb3JtYWxpemVkIGNvbnRyb2xsZXIgbWV0aG9kIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFjdGlvbk5hbWUoYWN0aW9uTmFtZSkge1xuICByZXR1cm4gaW5mbGVjdGlvbi5jYW1lbGl6ZShhY3Rpb25OYW1lLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKS5yZXBsYWNlQWxsKFwiL1wiLCBcIl9cIiksIHRydWUpXG59XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBJbXBvcnQgZXJyb3IuXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIE1pc3NpbmcgbW9kdWxlIHNwZWNpZmllciBmcm9tIGFuIEVSUl9NT0RVTEVfTk9UX0ZPVU5EIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIG1pc3NpbmdNb2R1bGVTcGVjaWZpZXJGcm9tRXJyb3IoZXJyb3IpIHtcbiAgY29uc3QgZmlyc3RMaW5lID0gZXJyb3IubWVzc2FnZS5zcGxpdChcIlxcblwiKVswXSB8fCBcIlwiXG4gIGNvbnN0IG1hdGNoID0gZmlyc3RMaW5lLm1hdGNoKC9eQ2Fubm90IGZpbmQgKD86bW9kdWxlfHBhY2thZ2UpIFsnXCJdKC4rPylbJ1wiXSBpbXBvcnRlZCBmcm9tIC8pXG5cbiAgcmV0dXJuIG1hdGNoPy5bMV1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7RXJyb3J9IGFyZ3MuZXJyb3IgLSBJbXBvcnQgZXJyb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy50YXJnZXRQYXRoIC0gVGFyZ2V0IGNvbnRyb2xsZXIgcGF0aC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnRhcmdldEltcG9ydFNwZWNpZmllciAtIFRhcmdldCBjb250cm9sbGVyIGltcG9ydCBzcGVjaWZpZXIuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIHdoZW4gdGhlIG1pc3NpbmcgbW9kdWxlIGlzIHRoZSB0YXJnZXQgY29udHJvbGxlciBmaWxlLlxuICovXG5mdW5jdGlvbiBpc01pc3NpbmdUYXJnZXRNb2R1bGVFcnJvcih7ZXJyb3IsIHRhcmdldFBhdGgsIHRhcmdldEltcG9ydFNwZWNpZmllcn0pIHtcbiAgY29uc3QgZW5zdXJlZEVycm9yID0gZW5zdXJlRXJyb3IoZXJyb3IpXG4gIGNvbnN0IGlzTW9kdWxlTm90Rm91bmRFcnJvciA9IFwiY29kZVwiIGluIGVuc3VyZWRFcnJvciAmJiBlbnN1cmVkRXJyb3IuY29kZSA9PT0gXCJFUlJfTU9EVUxFX05PVF9GT1VORFwiXG5cbiAgaWYgKCFpc01vZHVsZU5vdEZvdW5kRXJyb3IpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IG1pc3NpbmdTcGVjaWZpZXIgPSBtaXNzaW5nTW9kdWxlU3BlY2lmaWVyRnJvbUVycm9yKGVuc3VyZWRFcnJvcilcblxuICBpZiAoIW1pc3NpbmdTcGVjaWZpZXIpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBtaXNzaW5nU3BlY2lmaWVyID09PSB0YXJnZXRQYXRoIHx8IG1pc3NpbmdTcGVjaWZpZXIgPT09IHRhcmdldEltcG9ydFNwZWNpZmllclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNSb3V0ZXNSZXNvbHZlciB7XG4gIC8qKiBAdHlwZSB7TG9nZ2VyIHwgdW5kZWZpbmVkfSAqL1xuICBsb2dnZXJcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSBhcmdzLnJlcXVlc3QgLSBSZXF1ZXN0IG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVzcG9uc2UuanNcIikuZGVmYXVsdH0gYXJncy5yZXNwb25zZSAtIFJlc3BvbnNlIG9iamVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCByZXF1ZXN0LCByZXNwb25zZX0pIHtcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbmZpZ3VyYXRpb24gZ2l2ZW5cIilcbiAgICBpZiAoIXJlcXVlc3QpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlcXVlc3QgZ2l2ZW5cIilcbiAgICBpZiAoIXJlc3BvbnNlKSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZXNwb25zZSBnaXZlblwiKVxuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcihcIlJvdXRlc1Jlc29sdmVyXCIsIHtjb25maWd1cmF0aW9ufSlcbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zID0gcmVxdWVzdC5wYXJhbXMoKSB8fCB7fVxuICAgIHRoaXMucGFyYW1zID0gey4uLnJlcXVlc3RQYXJhbXN9XG4gICAgZGVsZXRlIHRoaXMucGFyYW1zLmFjdGlvblxuICAgIGRlbGV0ZSB0aGlzLnBhcmFtcy5jb250cm9sbGVyXG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdFxuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAtIEZsYXQgcXVlcnkgcGFyYW1zIGZvciB0ZW5hbnQvYWJpbGl0eSByZXNvbHV0aW9uLlxuICAgKi9cbiAgcXVlcnlQYXJhbWV0ZXJzKCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5yZXF1ZXN0LnBhdGgoKS5zcGxpdChcIj9cIilbMV1cblxuICAgIGlmICghcXVlcnkpIHJldHVybiB7fVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICAgIGNvbnN0IHBhcmFtcyA9IHt9XG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxdWVyeSlcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHNlYXJjaFBhcmFtcy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChwYXJhbXNba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhcmFtc1trZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zXG4gIH1cblxuICBhc3luYyByZXNvbHZlKCkge1xuICAgIHRoaXMucm91dGVIb29rQ29udHJvbGxlckNsYXNzID0gdW5kZWZpbmVkXG4gICAgbGV0IGNvbnRyb2xsZXJQYXRoXG4gICAgY29uc3QgY29uZmlndXJhdGlvblJvdXRlcyA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRSb3V0ZXMoKVxuICAgIGNvbnN0IGN1cnJlbnRSb3V0ZSA9IGNvbmZpZ3VyYXRpb25Sb3V0ZXM/LnJvb3RSb3V0ZVxuICAgIGNvbnN0IHJhd1BhdGggPSB0aGlzLnJlcXVlc3QucGF0aCgpXG4gICAgY29uc3QgY3VycmVudFBhdGggPSByYXdQYXRoLnNwbGl0KFwiP1wiKVswXVxuICAgIGxldCB2aWV3UGF0aFxuXG4gICAgY29uc3QgcHJlQ2hlY2tQYXJhbXMgPSB7Li4udGhpcy5wYXJhbXN9XG4gICAgY29uc3QgaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZSA9IGN1cnJlbnRSb3V0ZSA/ICEhdGhpcy5tYXRjaFBhdGhXaXRoUm91dGVzKGN1cnJlbnRSb3V0ZSwgY3VycmVudFBhdGgpIDogZmFsc2VcblxuICAgIGlmIChoYXNNYXRjaGluZ0N1c3RvbVJvdXRlKSB7XG4gICAgICB0aGlzLnBhcmFtcyA9IHByZUNoZWNrUGFyYW1zXG4gICAgfVxuXG4gICAgY29uc3Qgcm91dGVSZXNvbHZlckhvb2tNYXRjaCA9IGF3YWl0IHRoaXMucmVzb2x2ZVJvdXRlUmVzb2x2ZXJIb29rcyhjdXJyZW50UGF0aCwge2hhc01hdGNoaW5nQ3VzdG9tUm91dGV9KVxuICAgIGNvbnN0IG1hdGNoUmVzdWx0ID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaCB8fCAhY3VycmVudFJvdXRlID8gdW5kZWZpbmVkIDogdGhpcy5tYXRjaFBhdGhXaXRoUm91dGVzKGN1cnJlbnRSb3V0ZSwgY3VycmVudFBhdGgpXG4gICAgY29uc3QgYWN0aW9uUGFyYW0gPSB0aGlzLnBhcmFtcy5hY3Rpb25cbiAgICBjb25zdCBjb250cm9sbGVyUGFyYW0gPSB0aGlzLnBhcmFtcy5jb250cm9sbGVyXG4gICAgY29uc3QgYWN0aW9uVmFsdWUgPSB0eXBlb2YgYWN0aW9uUGFyYW0gPT0gXCJzdHJpbmdcIiA/IGFjdGlvblBhcmFtIDogKEFycmF5LmlzQXJyYXkoYWN0aW9uUGFyYW0pID8gYWN0aW9uUGFyYW1bMF0gOiB1bmRlZmluZWQpXG4gICAgbGV0IGFjdGlvbiA9IHR5cGVvZiBhY3Rpb25WYWx1ZSA9PSBcInN0cmluZ1wiID8gbm9ybWFsaXplQWN0aW9uTmFtZShhY3Rpb25WYWx1ZSkgOiB1bmRlZmluZWRcbiAgICBsZXQgY29udHJvbGxlciA9IHR5cGVvZiBjb250cm9sbGVyUGFyYW0gPT0gXCJzdHJpbmdcIiA/IGNvbnRyb2xsZXJQYXJhbSA6IChBcnJheS5pc0FycmF5KGNvbnRyb2xsZXJQYXJhbSkgPyBjb250cm9sbGVyUGFyYW1bMF0gOiB1bmRlZmluZWQpXG5cbiAgICBpZiAocm91dGVSZXNvbHZlckhvb2tNYXRjaCkge1xuICAgICAgY29uc3Qgcm91dGVIb29rQ29udHJvbGxlckNsYXNzID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaC5jb250cm9sbGVyQ2xhc3NcbiAgICAgIGxldCByb3V0ZUhvb2tDb250cm9sbGVyUGF0aFxuICAgICAgbGV0IHJvdXRlSG9va1ZpZXdQYXRoXG5cbiAgICAgIGlmICh0eXBlb2Ygcm91dGVSZXNvbHZlckhvb2tNYXRjaC5jb250cm9sbGVyUGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByb3V0ZUhvb2tDb250cm9sbGVyUGF0aCA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guY29udHJvbGxlclBhdGhcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiByb3V0ZVJlc29sdmVySG9va01hdGNoLnZpZXdQYXRoID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJvdXRlSG9va1ZpZXdQYXRoID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaC52aWV3UGF0aFxuICAgICAgfVxuXG4gICAgICBjb250cm9sbGVyID0gcm91dGVSZXNvbHZlckhvb2tNYXRjaC5jb250cm9sbGVyXG4gICAgICBhY3Rpb24gPSBub3JtYWxpemVBY3Rpb25OYW1lKHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guYWN0aW9uKVxuICAgICAgdGhpcy5wYXJhbXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXJcbiAgICAgIHRoaXMucGFyYW1zLmFjdGlvbiA9IHJvdXRlUmVzb2x2ZXJIb29rTWF0Y2guYWN0aW9uXG4gICAgICBjb250cm9sbGVyUGF0aCA9IHJvdXRlSG9va0NvbnRyb2xsZXJQYXRoIHx8IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9L2NvbnRyb2xsZXIuanNgXG4gICAgICB2aWV3UGF0aCA9IHJvdXRlSG9va1ZpZXdQYXRoIHx8IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9YFxuICAgICAgdGhpcy5yb3V0ZUhvb2tDb250cm9sbGVyQ2xhc3MgPSByb3V0ZUhvb2tDb250cm9sbGVyQ2xhc3NcbiAgICB9IGVsc2UgaWYgKCFtYXRjaFJlc3VsdCkge1xuICAgICAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpXG4gICAgICAgIGNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoX19maWxlbmFtZSlcbiAgICAgICAgY29uc3QgcmVxdWVzdGVkUGF0aCA9IGN1cnJlbnRQYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKSB8fCBcIl9yb290XCJcbiAgICAgICAgY29uc3QgYXR0ZW1wdGVkQ29udHJvbGxlclBhdGggPSBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCl9L3NyYy9yb3V0ZXMvJHtyZXF1ZXN0ZWRQYXRofS9jb250cm9sbGVyLmpzYFxuXG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IHRoaXMubG9nZ2VyXG5cbiAgICAgICAgaWYgKCFsb2dnZXIpIHRocm93IG5ldyBFcnJvcihcIkxvZ2dlciBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgICAgICBhd2FpdCBsb2dnZXIud2FybihgTm8gcm91dGUgbWF0Y2hlZCBmb3IgJHtyYXdQYXRofS4gVHJpZWQgY29udHJvbGxlciBhdCAke2F0dGVtcHRlZENvbnRyb2xsZXJQYXRofWApXG5cbiAgICAgICAgY29udHJvbGxlciA9IFwiZXJyb3JzXCJcbiAgICAgICAgY29udHJvbGxlclBhdGggPSBcIi4vYnVpbHQtaW4vZXJyb3JzL2NvbnRyb2xsZXIuanNcIlxuICAgICAgICBhY3Rpb24gPSBcIm5vdEZvdW5kXCJcbiAgICAgICAgdmlld1BhdGggPSBhd2FpdCBmcy5yZWFscGF0aChgJHtfX2Rpcm5hbWV9L2J1aWx0LWluL2Vycm9yc2ApXG4gICAgfSBlbHNlIGlmIChhY3Rpb24pIHtcbiAgICAgIGlmICghY29udHJvbGxlcikgY29udHJvbGxlciA9IFwiX3Jvb3RcIlxuXG4gICAgICBjb250cm9sbGVyUGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9L2NvbnRyb2xsZXIuanNgXG4gICAgICB2aWV3UGF0aCA9IGAke3RoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL3JvdXRlcy8ke2NvbnRyb2xsZXJ9YFxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hdGNoZWQgdGhlIHJvdXRlIGJ1dCBkaWRuJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggaXQ6ICR7cmF3UGF0aH0gKGFjdGlvbjogJHthY3Rpb259LCBjb250cm9sbGVyOiAke2NvbnRyb2xsZXJ9LCBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wYXJhbXMpfSlgKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xsZXJDbGFzcyA9IGF3YWl0IHRoaXMucmVzb2x2ZUNvbnRyb2xsZXJDbGFzcyh7Y29udHJvbGxlclBhdGh9KVxuICAgIGNvbnN0IGNvbnRyb2xsZXJSZXF1ZXN0ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5yZXF1ZXN0KVxuICAgIGNvbnN0IGNvbnRyb2xsZXJJbnN0YW5jZSA9IG5ldyBjb250cm9sbGVyQ2xhc3Moe1xuICAgICAgYWN0aW9uLFxuICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgY29udHJvbGxlcixcbiAgICAgIHBhcmFtczogdGhpcy5wYXJhbXMsXG4gICAgICByZXF1ZXN0OiBjb250cm9sbGVyUmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlLFxuICAgICAgdmlld1BhdGhcbiAgICB9KVxuXG4gICAgaWYgKCEoYWN0aW9uIGluIGNvbnRyb2xsZXJJbnN0YW5jZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBhY3Rpb24gb24gY29udHJvbGxlcjogJHtjb250cm9sbGVyfSMke2FjdGlvbn1gKVxuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbkhhbmRsZXJzID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj59ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChjb250cm9sbGVySW5zdGFuY2UpKVxuXG4gICAgYXdhaXQgdGhpcy5fbG9nQWN0aW9uU3RhcnQoe2FjdGlvbiwgY29udHJvbGxlckNsYXNzfSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW5hbnQgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24ucmVzb2x2ZVRlbmFudCh7XG4gICAgICAgIHBhcmFtczogey4uLnRoaXMucXVlcnlQYXJhbWV0ZXJzKCksIC4uLnRoaXMucGFyYW1zfSxcbiAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICByZXNwb25zZTogdGhpcy5yZXNwb25zZVxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYWJpbGl0eSA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvbi5yZXNvbHZlQWJpbGl0eSh7XG4gICAgICAgICAgICBwYXJhbXM6IHRoaXMucGFyYW1zLFxuICAgICAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICAgICAgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2VcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLnJ1bldpdGhBYmlsaXR5KGFiaWxpdHksIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGNvbnRyb2xsZXJJbnN0YW5jZS5fcnVuQmVmb3JlQ2FsbGJhY2tzKClcbiAgICAgICAgICAgIGF3YWl0IGFjdGlvbkhhbmRsZXJzW2FjdGlvbl0oKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbnN1cmVkRXJyb3IgPSBlbnN1cmVFcnJvcihlcnJvcilcbiAgICAgIGNvbnN0IGVycm9yQ29udGV4dCA9IHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjb250cm9sbGVyLFxuICAgICAgICBodHRwTWV0aG9kOiB0aGlzLnJlcXVlc3QuaHR0cE1ldGhvZCgpLFxuICAgICAgICBwYXRoOiB0aGlzLnJlcXVlc3QucGF0aCgpLFxuICAgICAgICBzdGFnZTogXCJjb250cm9sbGVyLWFjdGlvblwiXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9yV2l0aENvbnRleHQgPSAvKiogQHR5cGUge3t2ZWxvY2lvdXNDb250ZXh0Pzogb2JqZWN0fX0gKi8gKGVuc3VyZWRFcnJvcilcblxuICAgICAgZXJyb3JXaXRoQ29udGV4dC52ZWxvY2lvdXNDb250ZXh0ID0ge1xuICAgICAgICAuLi4oZXJyb3JXaXRoQ29udGV4dC52ZWxvY2lvdXNDb250ZXh0IHx8IHt9KSxcbiAgICAgICAgY29udHJvbGxlckFjdGlvbjogZXJyb3JDb250ZXh0XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVuc3VyZWRFcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbnRyb2xsZXJQYXRoIC0gQ29udHJvbGxlciBpbXBvcnQgcGF0aC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdD59IC0gVGhlIHJlc29sdmVkIGNvbnRyb2xsZXIgY2xhc3MuXG4gICAqL1xuICBhc3luYyByZXNvbHZlQ29udHJvbGxlckNsYXNzKHtjb250cm9sbGVyUGF0aH0pIHtcbiAgICBjb25zdCBjb250cm9sbGVySW1wb3J0U3BlY2lmaWVyID0gdG9JbXBvcnRTcGVjaWZpZXIoY29udHJvbGxlclBhdGgpXG5cbiAgICBpZiAoIXRoaXMucm91dGVIb29rQ29udHJvbGxlckNsYXNzKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSAqLyAoKGF3YWl0IGltcG9ydChjb250cm9sbGVySW1wb3J0U3BlY2lmaWVyKSkuZGVmYXVsdClcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4uL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gKi8gKChhd2FpdCBpbXBvcnQoY29udHJvbGxlckltcG9ydFNwZWNpZmllcikpLmRlZmF1bHQpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGlzTWlzc2luZ0NvbnRyb2xsZXJGaWxlRXJyb3IgPSBpc01pc3NpbmdUYXJnZXRNb2R1bGVFcnJvcih7XG4gICAgICAgIGVycm9yOiBlbnN1cmVFcnJvcihlcnJvciksXG4gICAgICAgIHRhcmdldEltcG9ydFNwZWNpZmllcjogY29udHJvbGxlckltcG9ydFNwZWNpZmllcixcbiAgICAgICAgdGFyZ2V0UGF0aDogY29udHJvbGxlclBhdGhcbiAgICAgIH0pXG5cbiAgICAgIGlmICghaXNNaXNzaW5nQ29udHJvbGxlckZpbGVFcnJvcikgdGhyb3cgZW5zdXJlRXJyb3IoZXJyb3IpXG5cbiAgICAgIHJldHVybiAvKiogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCIuLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHR9ICovICh0aGlzLnJvdXRlSG9va0NvbnRyb2xsZXJDbGFzcylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2Utcm91dGUuanNcIikuZGVmYXVsdH0gcm91dGUgLSBSb3V0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcmV0dXJucyB7e3Jlc3RQYXRoOiBzdHJpbmd9IHwgdW5kZWZpbmVkfSAtIFJFU1QgcGF0aCBtZXRhZGF0YSBmb3IgdGhpcyByb3V0ZS5cbiAgICovXG4gIG1hdGNoUGF0aFdpdGhSb3V0ZXMocm91dGUsIHBhdGgpIHtcbiAgICBjb25zdCBwYXRoV2l0aG91dFNsYXNoID0gcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIikuc3BsaXQoXCI/XCIpWzBdXG5cbiAgICBmb3IgKGNvbnN0IHN1YlJvdXRlIG9mIHJvdXRlLnJvdXRlcykge1xuICAgICAgY29uc3QgcGFyYW1zU25hcHNob3QgPSB7Li4udGhpcy5wYXJhbXN9XG4gICAgICBjb25zdCBtYXRjaFJlc3VsdCA9IHN1YlJvdXRlLm1hdGNoV2l0aFBhdGgoe1xuICAgICAgICBwYXJhbXM6IHRoaXMucGFyYW1zLFxuICAgICAgICBwYXRoOiBwYXRoV2l0aG91dFNsYXNoLFxuICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3RcbiAgICAgIH0pXG5cbiAgICAgIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXNTbmFwc2hvdFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7cmVzdFBhdGh9ID0gbWF0Y2hSZXN1bHRcblxuICAgICAgaWYgKHJlc3RQYXRoKSB7XG4gICAgICAgIGNvbnN0IHJlY3Vyc2l2ZU1hdGNoID0gdGhpcy5tYXRjaFBhdGhXaXRoUm91dGVzKHN1YlJvdXRlLCByZXN0UGF0aClcblxuICAgICAgICBpZiAocmVjdXJzaXZlTWF0Y2gpIHtcbiAgICAgICAgICByZXR1cm4gcmVjdXJzaXZlTWF0Y2hcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zU25hcHNob3RcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hdGNoUmVzdWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjdXJyZW50UGF0aCAtIFJlcXVlc3QgcGF0aCB3aXRob3V0IHF1ZXJ5IHN0cmluZy5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBSZXNvbHZlciBob29rIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZV0gLSBUcnVlIHdoZW4gdGhlIHBhdGggbWF0Y2hlZCBhbiBleHBsaWNpdCBjdXN0b20gcm91dGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuUm91dGVSZXNvbHZlckhvb2tSZXN1bHQgfCBudWxsPn0gLSBNYXRjaGVkIGFjdGlvbi9jb250cm9sbGVyIGZyb20gaG9va3MuXG4gICAqL1xuICBhc3luYyByZXNvbHZlUm91dGVSZXNvbHZlckhvb2tzKGN1cnJlbnRQYXRoLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7aGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZSA9IGZhbHNlfSA9IG9wdGlvbnNcblxuICAgIGNvbnN0IGhvb2tzID0gdGhpcy5jb25maWd1cmF0aW9uLmdldFJvdXRlUmVzb2x2ZXJIb29rcz8uKCkgfHwgW11cblxuICAgIGZvciAoY29uc3QgaG9vayBvZiBob29rcykge1xuICAgICAgY29uc3QgaG9va1Jlc3VsdCA9IGF3YWl0IGhvb2soe1xuICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgIGN1cnJlbnRQYXRoLFxuICAgICAgICBoYXNNYXRjaGluZ0N1c3RvbVJvdXRlLFxuICAgICAgICBwYXJhbXM6IHRoaXMucGFyYW1zLFxuICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3QsXG4gICAgICAgIHJlc29sdmVyOiB0aGlzLFxuICAgICAgICByZXNwb25zZTogdGhpcy5yZXNwb25zZVxuICAgICAgfSlcblxuICAgICAgaWYgKCFob29rUmVzdWx0KSBjb250aW51ZVxuXG4gICAgICBpZiAodHlwZW9mIGhvb2tSZXN1bHQuYWN0aW9uICE9PSBcInN0cmluZ1wiIHx8IGhvb2tSZXN1bHQuYWN0aW9uLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIGFjdGlvbiB0byBiZSBhIHN0cmluZywgZ290OiAke2hvb2tSZXN1bHQuYWN0aW9ufWApXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaG9va1Jlc3VsdC5jb250cm9sbGVyICE9PSBcInN0cmluZ1wiIHx8IGhvb2tSZXN1bHQuY29udHJvbGxlci5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgcm91dGUgcmVzb2x2ZXIgaG9vayBjb250cm9sbGVyIHRvIGJlIGEgc3RyaW5nLCBnb3Q6ICR7aG9va1Jlc3VsdC5jb250cm9sbGVyfWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LnBhcmFtcyAmJiB0eXBlb2YgaG9va1Jlc3VsdC5wYXJhbXMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIHBhcmFtcyB0byBiZSBhbiBvYmplY3QsIGdvdDogJHtob29rUmVzdWx0LnBhcmFtc31gKVxuICAgICAgfVxuXG4gICAgICBpZiAoaG9va1Jlc3VsdC5jb250cm9sbGVyQ2xhc3MgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaG9va1Jlc3VsdC5jb250cm9sbGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHJvdXRlIHJlc29sdmVyIGhvb2sgY29udHJvbGxlckNsYXNzIHRvIGJlIGEgY2xhc3MvZnVuY3Rpb24gd2hlbiBwcm92aWRlZCwgZ290OiAke2hvb2tSZXN1bHQuY29udHJvbGxlckNsYXNzfWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LmNvbnRyb2xsZXJQYXRoICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGhvb2tSZXN1bHQuY29udHJvbGxlclBhdGggIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIGNvbnRyb2xsZXJQYXRoIHRvIGJlIGEgc3RyaW5nIHdoZW4gcHJvdmlkZWQsIGdvdDogJHtob29rUmVzdWx0LmNvbnRyb2xsZXJQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LnZpZXdQYXRoICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGhvb2tSZXN1bHQudmlld1BhdGggIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCByb3V0ZSByZXNvbHZlciBob29rIHZpZXdQYXRoIHRvIGJlIGEgc3RyaW5nIHdoZW4gcHJvdmlkZWQsIGdvdDogJHtob29rUmVzdWx0LnZpZXdQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGlmIChob29rUmVzdWx0LnBhcmFtcykge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMucGFyYW1zLCBob29rUmVzdWx0LnBhcmFtcylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhvb2tSZXN1bHRcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmFjdGlvbiAtIEFjdGlvbi5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbnRyb2xsZXJDbGFzcyAtIENvbnRyb2xsZXIgY2xhc3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfbG9nQWN0aW9uU3RhcnQoe2FjdGlvbiwgY29udHJvbGxlckNsYXNzfSkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RcbiAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLl9mb3JtYXRUaW1lc3RhbXAobmV3IERhdGUoKSlcbiAgICBjb25zdCByZW1vdGVBZGRyZXNzID0gcmVxdWVzdC5yZW1vdGVBZGRyZXNzPy4oKSB8fCByZXF1ZXN0LmhlYWRlcihcIngtZm9yd2FyZGVkLWZvclwiKSB8fCBcInVua25vd25cIlxuICAgIGNvbnN0IGxvZ2dlZFBhcmFtcyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh0aGlzLl9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcodGhpcy5wYXJhbXMpKVxuICAgIGNvbnN0IGxvZ01ldGhvZCA9IHRoaXMuY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudCgpID09PSBcInRlc3RcIiA/IFwiZGVidWdcIiA6IFwiaW5mb1wiXG5cbiAgICBkZWxldGUgbG9nZ2VkUGFyYW1zLmFjdGlvblxuICAgIGRlbGV0ZSBsb2dnZWRQYXJhbXMuY29udHJvbGxlclxuXG4gICAgY29uc3QgY29udHJvbGxlckxvZ2dlciA9IG5ldyBMb2dnZXIoY29udHJvbGxlckNsYXNzLm5hbWUsIHtjb25maWd1cmF0aW9uOiB0aGlzLmNvbmZpZ3VyYXRpb259KVxuXG4gICAgYXdhaXQgY29udHJvbGxlckxvZ2dlcltsb2dNZXRob2RdKCgpID0+IGBTdGFydGVkICR7cmVxdWVzdC5odHRwTWV0aG9kKCl9IFwiJHtyZXF1ZXN0LnBhdGgoKX1cIiBmb3IgJHtyZW1vdGVBZGRyZXNzfSBhdCAke3RpbWVzdGFtcH1gKVxuICAgIGF3YWl0IGNvbnRyb2xsZXJMb2dnZXJbbG9nTWV0aG9kXSgoKSA9PiBgUHJvY2Vzc2luZyBieSAke2NvbnRyb2xsZXJDbGFzcy5uYW1lfSMke2FjdGlvbn1gKVxuICAgIGF3YWl0IGNvbnRyb2xsZXJMb2dnZXJbbG9nTWV0aG9kXSgoKSA9PiBbYCAgUGFyYW1ldGVyczpgLCBsb2dnZWRQYXJhbXNdKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSAtIERhdGUgdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHRpbWVzdGFtcC5cbiAgICovXG4gIF9mb3JtYXRUaW1lc3RhbXAoZGF0ZSkge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW0gLSBOdW0uXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgcGFkLlxuICAgICAqL1xuICAgIGNvbnN0IHBhZCA9IChudW0pID0+IFN0cmluZyhudW0pLnBhZFN0YXJ0KDIsIFwiMFwiKVxuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKClcbiAgICBjb25zdCBtb250aCA9IHBhZChkYXRlLmdldE1vbnRoKCkgKyAxKVxuICAgIGNvbnN0IGRheSA9IHBhZChkYXRlLmdldERhdGUoKSlcbiAgICBjb25zdCBob3VycyA9IHBhZChkYXRlLmdldEhvdXJzKCkpXG4gICAgY29uc3QgbWludXRlcyA9IHBhZChkYXRlLmdldE1pbnV0ZXMoKSlcbiAgICBjb25zdCBzZWNvbmRzID0gcGFkKGRhdGUuZ2V0U2Vjb25kcygpKVxuICAgIGNvbnN0IG9mZnNldE1pbnV0ZXMgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KClcbiAgICBjb25zdCBvZmZzZXRTaWduID0gb2Zmc2V0TWludXRlcyA+IDAgPyBcIi1cIiA6IFwiK1wiXG4gICAgY29uc3Qgb2Zmc2V0VG90YWxNaW51dGVzID0gTWF0aC5hYnMob2Zmc2V0TWludXRlcylcbiAgICBjb25zdCBvZmZzZXRIb3VycyA9IHBhZChNYXRoLmZsb29yKG9mZnNldFRvdGFsTWludXRlcyAvIDYwKSlcbiAgICBjb25zdCBvZmZzZXRSZW1haW5pbmdNaW51dGVzID0gcGFkKG9mZnNldFRvdGFsTWludXRlcyAlIDYwKVxuXG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fSAke2hvdXJzfToke21pbnV0ZXN9OiR7c2Vjb25kc30gJHtvZmZzZXRTaWdufSR7b2Zmc2V0SG91cnN9JHtvZmZzZXRSZW1haW5pbmdNaW51dGVzfWBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBWYWx1ZSB0byB1c2UuXG4gICAqIEByZXR1cm5zIHthbnl9IC0gVGhlIHNhbml0aXplIHBhcmFtcyBmb3IgbG9nZ2luZy5cbiAgICovXG4gIF9zYW5pdGl6ZVBhcmFtc0ZvckxvZ2dpbmcodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBVcGxvYWRlZEZpbGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNsYXNzTmFtZTogdmFsdWUuY29uc3RydWN0b3IubmFtZSxcbiAgICAgICAgZmlsZW5hbWU6IHZhbHVlLmZpbGVuYW1lKCksXG4gICAgICAgIHNpemU6IHZhbHVlLnNpemUoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLm1hcCgoaXRlbSkgPT4gdGhpcy5fc2FuaXRpemVQYXJhbXNGb3JMb2dnaW5nKGl0ZW0pKVxuICAgIH1cblxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMuX3Nhbml0aXplUGFyYW1zRm9yTG9nZ2luZyh2YWx1ZVtrZXldKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cbiJdfQ==
|
|
@@ -270,8 +270,29 @@ function parseRansackKey(key) {
|
|
|
270
270
|
predicate: /** @type {RansackPredicate} */ (predicate)
|
|
271
271
|
};
|
|
272
272
|
}
|
|
273
|
+
for (const predicate of supportedPredicates) {
|
|
274
|
+
const camelSuffix = snakeToCamelSuffix(predicate);
|
|
275
|
+
if (!key.endsWith(camelSuffix))
|
|
276
|
+
continue;
|
|
277
|
+
const pathValue = key.slice(0, key.length - camelSuffix.length);
|
|
278
|
+
if (pathValue.length < 1) {
|
|
279
|
+
throw new Error(`Invalid ransack key: ${key}`);
|
|
280
|
+
}
|
|
281
|
+
return {
|
|
282
|
+
pathValue,
|
|
283
|
+
predicate: /** @type {RansackPredicate} */ (predicate)
|
|
284
|
+
};
|
|
285
|
+
}
|
|
273
286
|
return null;
|
|
274
287
|
}
|
|
288
|
+
/**
|
|
289
|
+
* @param {string} value - Snake-case predicate.
|
|
290
|
+
* @returns {string} - CamelCase predicate suffix used in ransack keys.
|
|
291
|
+
*/
|
|
292
|
+
function snakeToCamelSuffix(value) {
|
|
293
|
+
const segments = value.split("_");
|
|
294
|
+
return segments.map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)).join("");
|
|
295
|
+
}
|
|
275
296
|
/**
|
|
276
297
|
* @param {object} args - Options.
|
|
277
298
|
* @param {RansackPredicate} args.predicate - Parsed predicate.
|
|
@@ -344,4 +365,4 @@ function isPlainObject(value) {
|
|
|
344
365
|
function uniqunize(values) {
|
|
345
366
|
return Array.from(new Set(values));
|
|
346
367
|
}
|
|
347
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuc2Fjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9yYW5zYWNrLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQTtBQUU5RTs7R0FFRztBQUVIOztHQUVHO0FBRUg7Ozs7OztHQU1HO0FBRUgsTUFBTSxtQkFBbUIsR0FBRztJQUMxQixRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7Q0FDTCxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsTUFBTTtJQUN2RCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsT0FBTyxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBQ2pGLENBQUM7SUFFRCxpQ0FBaUM7SUFDakMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFBO0lBRXJCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDckQsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRXRDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFDakUsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQTtRQUNqRixNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUNoRixNQUFNLGFBQWEsR0FBRyxvQkFBb0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLGNBQWMsRUFBQyxDQUFDLENBQUE7UUFFOUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLFlBQVksQ0FBQyxjQUFjLFNBQVMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUM1RyxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcscUJBQXFCLENBQUM7WUFDbEMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTO1lBQzlCLEtBQUssRUFBRSxRQUFRO1NBQ2hCLENBQUMsQ0FBQTtRQUVGLElBQUksS0FBSyxLQUFLLHNCQUFzQjtZQUFFLFNBQVE7UUFFOUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUNkLGFBQWE7WUFDYixJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUk7WUFDdkIsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTO1lBQzlCLEtBQUs7U0FDTixDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUE7QUFDbkIsQ0FBQztBQUVELE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUE7QUFFL0Q7Ozs7O0dBS0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBQztJQUMxQyxJQUFJLGlCQUFpQixHQUFHLFVBQVUsQ0FBQTtJQUVsQyxLQUFLLE1BQU0sZ0JBQWdCLElBQUksSUFBSSxFQUFFLENBQUM7UUFDcEMsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBRTdFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxnQkFBZ0IsU0FBUyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3JHLENBQUM7UUFFRCxpQkFBaUIsR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUE7SUFDbkQsQ0FBQztJQUVELE9BQU8saUJBQWlCLENBQUE7QUFDMUIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUM7SUFDN0MsdUJBQXVCO0lBQ3ZCLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUNmLElBQUksaUJBQWlCLEdBQUcsVUFBVSxDQUFBO0lBQ2xDLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQTtJQUUxQixPQUFPLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxvQkFBb0IsQ0FBQyxFQUFDLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pGLE1BQUs7UUFDUCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsc0JBQXNCLENBQUM7WUFDbkMsVUFBVSxFQUFFLGlCQUFpQjtZQUM3QixLQUFLLEVBQUUsY0FBYztTQUN0QixDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsS0FBSztZQUFFLE1BQUs7UUFFakIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUNqQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUE7UUFDMUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUE7SUFDdkMsQ0FBQztJQUVELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFFRCxPQUFPO1FBQ0wsY0FBYyxFQUFFLGNBQWM7UUFDOUIsSUFBSTtLQUNMLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHNCQUFzQixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBQztJQUNqRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUE7SUFFcEIsS0FBSyxNQUFNLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVFLE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFFdEUsS0FBSyxNQUFNLFNBQVMsSUFBSSxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDakUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQztnQkFBRSxTQUFRO1lBRWhELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtZQUV4RCxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFBRSxTQUFRO1lBQ3ZDLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLGVBQWU7Z0JBQUUsU0FBUTtZQUV4RSxTQUFTLEdBQUc7Z0JBQ1YsZUFBZSxFQUFFLFNBQVMsQ0FBQyxNQUFNO2dCQUNqQyxnQkFBZ0I7Z0JBQ2hCLGNBQWM7Z0JBQ2QsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLGdCQUFnQjthQUNoRCxDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsU0FBUztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRTNCLE9BQU87UUFDTCxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsZ0JBQWdCO1FBQzVDLGNBQWMsRUFBRSxTQUFTLENBQUMsY0FBYztRQUN4QyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsZ0JBQWdCO0tBQzdDLENBQUE7QUFDSCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxnQkFBZ0I7SUFDOUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQy9FLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsb0JBQW9CLENBQUMsRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFDO0lBQy9DLEtBQUssTUFBTSxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2RixJQUFJLHFCQUFxQixDQUFDLEVBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUQsT0FBTyxhQUFhLENBQUE7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxVQUFVO0lBQ3JDLElBQUksT0FBTyxrQkFBa0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLG1CQUFtQixLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQzlFLG9FQUFvRTtRQUNwRSxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFDbEIsTUFBTSxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLENBQUE7UUFFOUUsS0FBSyxNQUFNLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQzdELE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUE7WUFFdkQsSUFBSSxPQUFPLFlBQVksQ0FBQyxhQUFhLEtBQUssVUFBVSxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUU7Z0JBQUUsU0FBUTtZQUU5RixNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO1lBRTNELElBQUksQ0FBQyxnQkFBZ0I7Z0JBQUUsU0FBUTtZQUUvQixPQUFPLENBQUMsZ0JBQWdCLENBQUMsR0FBRztnQkFDMUIsZ0JBQWdCO2FBQ2pCLENBQUE7UUFDSCxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUE7SUFDaEIsQ0FBQztJQUVELElBQUksT0FBTyxrQkFBa0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLHVCQUF1QixLQUFLLFVBQVU7UUFDL0UsT0FBTyxrQkFBa0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLHdCQUF3QixLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2pGLG9FQUFvRTtRQUNwRSxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFDbEIsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO1FBQzdFLE1BQU0sd0JBQXdCLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFBO1FBRTNGLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDeEQsTUFBTSxnQkFBZ0IsR0FBRyx5QkFBeUIsQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUE7WUFFOUYsSUFBSSxDQUFDLGdCQUFnQjtnQkFBRSxTQUFRO1lBRS9CLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUMsZ0JBQWdCLEVBQUMsQ0FBQTtRQUNoRCxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUE7SUFDaEIsQ0FBQztJQUVELE9BQU8sRUFBRSxDQUFBO0FBQ1gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsVUFBVTtJQUNsQyxJQUFJLE9BQU8sa0JBQWtCLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQywrQkFBK0IsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUMxRixPQUFPLHFDQUFxQyxDQUFDLENBQUMsRUFBQyxrQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQywrQkFBK0IsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUNwSCxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsT0FBTyxrQkFBa0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGNBQWMsS0FBSyxVQUFVO1FBQ3pGLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGNBQWMsRUFBRTtRQUNsRCxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQ04sTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQTtJQUM1QyxxQ0FBcUM7SUFDckMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBO0lBRWxCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQzlCLEtBQUssTUFBTSxhQUFhLElBQUksVUFBVSxFQUFFLENBQUM7WUFDdkMsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRO2dCQUFFLFNBQVE7WUFFL0MsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLGFBQWEsQ0FBQTtRQUN4QyxDQUFDO0lBQ0gsQ0FBQztTQUFNLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDckMsS0FBSyxNQUFNLGFBQWEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDcEQsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLGFBQWEsQ0FBQTtRQUN4QyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLEVBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUM7SUFDL0QsT0FBTyxTQUFTLENBQUM7UUFDZixhQUFhO1FBQ2IsVUFBVTtRQUNWLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQ3BDLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO0tBQ2xDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDcEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZUFBZSxDQUFDLEdBQUc7SUFDMUIsS0FBSyxNQUFNLFNBQVMsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUE7UUFFOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQUUsU0FBUTtRQUVuQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUUxRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUNoRCxDQUFDO1FBRUQsT0FBTztZQUNMLFNBQVM7WUFDVCxTQUFTLEVBQUUsK0JBQStCLENBQUMsQ0FBQyxTQUFTLENBQUM7U0FDdkQsQ0FBQTtJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMscUJBQXFCLENBQUMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDO0lBQy9DLElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLE1BQU0sWUFBWSxHQUFHLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRW5ELElBQUksWUFBWSxLQUFLLElBQUk7WUFBRSxPQUFPLHNCQUFzQixDQUFBO1FBRXhELE9BQU8sWUFBWSxDQUFBO0lBQ3JCLENBQUM7SUFFRCxJQUFJLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2pELE1BQU0sZUFBZSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXBELElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsT0FBTyxzQkFBc0IsQ0FBQTtRQUU3RCxPQUFPLGVBQWUsQ0FBQTtJQUN4QixDQUFDO0lBRUQsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxzQkFBc0IsQ0FBQTtJQUN4RSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLHNCQUFzQixDQUFBO0lBRWhGLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsdUJBQXVCLENBQUMsS0FBSztJQUNwQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUNuRCxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLEdBQUcsSUFBSSxLQUFLLEtBQUssTUFBTTtRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQ2pFLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssR0FBRyxJQUFJLEtBQUssS0FBSyxPQUFPO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDbkUsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUV0RSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQ3BFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHFCQUFxQixDQUFDLEtBQUs7SUFDbEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZGLENBQUM7SUFFRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUMxRixDQUFDO0lBRUQsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7UUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUVwRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDaEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsYUFBYSxDQUFDLEtBQUs7SUFDMUIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUU3RSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRTlDLE9BQU8sU0FBUyxLQUFLLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUyxLQUFLLElBQUksQ0FBQTtBQUM3RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxTQUFTLENBQUMsTUFBTTtJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtBQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHtyZXNvbHZlRnJvbnRlbmRNb2RlbENsYXNzfSBmcm9tIFwiLi4vZnJvbnRlbmQtbW9kZWxzL21vZGVsLXJlZ2lzdHJ5LmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7XCJjb250XCIgfCBcImVuZFwiIHwgXCJlcVwiIHwgXCJndFwiIHwgXCJndGVxXCIgfCBcImluXCIgfCBcImx0XCIgfCBcImx0ZXFcIiB8IFwibm90X2VxXCIgfCBcIm5vdF9pblwiIHwgXCJudWxsXCIgfCBcInN0YXJ0XCJ9IFJhbnNhY2tQcmVkaWNhdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB0eXBlb2YgaW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWxzL2Jhc2UuanNcIikuZGVmYXVsdH0gUmFuc2Fja01vZGVsQ2xhc3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbnNhY2tDb25kaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lIC0gUmVzb2x2ZWQgYXR0cmlidXRlIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBwYXRoIC0gUmVzb2x2ZWQgcmVsYXRpb25zaGlwIHBhdGguXG4gKiBAcHJvcGVydHkge1JhbnNhY2tQcmVkaWNhdGV9IHByZWRpY2F0ZSAtIFBhcnNlZCBSYW5zYWNrIHByZWRpY2F0ZS5cbiAqIEBwcm9wZXJ0eSB7YW55fSB2YWx1ZSAtIE5vcm1hbGl6ZWQgdmFsdWUuXG4gKi9cblxuY29uc3Qgc3VwcG9ydGVkUHJlZGljYXRlcyA9IFtcbiAgXCJub3RfaW5cIixcbiAgXCJub3RfZXFcIixcbiAgXCJndGVxXCIsXG4gIFwibHRlcVwiLFxuICBcInN0YXJ0XCIsXG4gIFwiY29udFwiLFxuICBcIm51bGxcIixcbiAgXCJlbmRcIixcbiAgXCJlcVwiLFxuICBcImd0XCIsXG4gIFwibHRcIixcbiAgXCJpblwiXG5dXG5cbi8qKlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gbW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwYXJhbXMgLSBSYW5zYWNrLXN0eWxlIHBhcmFtcyBoYXNoLlxuICogQHJldHVybnMge1JhbnNhY2tDb25kaXRpb25bXX0gLSBOb3JtYWxpemVkIGNvbmRpdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSYW5zYWNrUGFyYW1zKG1vZGVsQ2xhc3MsIHBhcmFtcykge1xuICBpZiAoIWlzUGxhaW5PYmplY3QocGFyYW1zKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmFuc2FjayBwYXJhbXMgbXVzdCBiZSBhIHBsYWluIG9iamVjdCwgZ290OiAke3R5cGVvZiBwYXJhbXN9YClcbiAgfVxuXG4gIC8qKiBAdHlwZSB7UmFuc2Fja0NvbmRpdGlvbltdfSAqL1xuICBjb25zdCBub3JtYWxpemVkID0gW11cblxuICBmb3IgKGNvbnN0IFtrZXksIHJhd1ZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbXMpKSB7XG4gICAgY29uc3QgcGFyc2VkS2V5ID0gcGFyc2VSYW5zYWNrS2V5KGtleSlcblxuICAgIGlmICghcGFyc2VkS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHJhbnNhY2sgcHJlZGljYXRlIGluIGtleTogJHtrZXl9YClcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlUmFuc2Fja1BhdGgoe21vZGVsQ2xhc3MsIHZhbHVlOiBwYXJzZWRLZXkucGF0aFZhbHVlfSlcbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gbW9kZWxDbGFzc0F0UGF0aCh7bW9kZWxDbGFzcywgcGF0aDogcmVzb2x2ZWRQYXRoLnBhdGh9KVxuICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSByZXNvbHZlQXR0cmlidXRlTmFtZSh7bW9kZWxDbGFzczogdGFyZ2V0TW9kZWxDbGFzcywgdmFsdWU6IHJlc29sdmVkUGF0aC5hdHRyaWJ1dGVWYWx1ZX0pXG5cbiAgICBpZiAoIWF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByYW5zYWNrIGF0dHJpYnV0ZSBcIiR7cmVzb2x2ZWRQYXRoLmF0dHJpYnV0ZVZhbHVlfVwiIGZvciAke3RhcmdldE1vZGVsQ2xhc3MubmFtZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gbm9ybWFsaXplUmFuc2Fja1ZhbHVlKHtcbiAgICAgIHByZWRpY2F0ZTogcGFyc2VkS2V5LnByZWRpY2F0ZSxcbiAgICAgIHZhbHVlOiByYXdWYWx1ZVxuICAgIH0pXG5cbiAgICBpZiAodmFsdWUgPT09IFNLSVBfUkFOU0FDS19DT05ESVRJT04pIGNvbnRpbnVlXG5cbiAgICBub3JtYWxpemVkLnB1c2goe1xuICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgIHBhdGg6IHJlc29sdmVkUGF0aC5wYXRoLFxuICAgICAgcHJlZGljYXRlOiBwYXJzZWRLZXkucHJlZGljYXRlLFxuICAgICAgdmFsdWVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuY29uc3QgU0tJUF9SQU5TQUNLX0NPTkRJVElPTiA9IFN5bWJvbChcInNraXAtcmFuc2Fjay1jb25kaXRpb25cIilcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBhcmdzLm1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy5wYXRoIC0gUmVsYXRpb25zaGlwIHBhdGguXG4gKiBAcmV0dXJucyB7UmFuc2Fja01vZGVsQ2xhc3N9IC0gVGFyZ2V0IG1vZGVsIGNsYXNzLlxuICovXG5mdW5jdGlvbiBtb2RlbENsYXNzQXRQYXRoKHttb2RlbENsYXNzLCBwYXRofSkge1xuICBsZXQgY3VycmVudE1vZGVsQ2xhc3MgPSBtb2RlbENsYXNzXG5cbiAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIHBhdGgpIHtcbiAgICBjb25zdCByZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXBFbnRyaWVzKGN1cnJlbnRNb2RlbENsYXNzKVtyZWxhdGlvbnNoaXBOYW1lXVxuXG4gICAgaWYgKCFyZWxhdGlvbnNoaXApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByYW5zYWNrIHJlbGF0aW9uc2hpcCBcIiR7cmVsYXRpb25zaGlwTmFtZX1cIiBmb3IgJHtjdXJyZW50TW9kZWxDbGFzcy5uYW1lfWApXG4gICAgfVxuXG4gICAgY3VycmVudE1vZGVsQ2xhc3MgPSByZWxhdGlvbnNoaXAudGFyZ2V0TW9kZWxDbGFzc1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnRNb2RlbENsYXNzXG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gYXJncy5tb2RlbENsYXNzIC0gQ3VycmVudCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZhbHVlIC0gUmVtYWluaW5nIHBhdGggdmFsdWUuXG4gKiBAcmV0dXJucyB7e2F0dHJpYnV0ZVZhbHVlOiBzdHJpbmcsIHBhdGg6IHN0cmluZ1tdfX0gLSBSZXNvbHZlZCByZWxhdGlvbnNoaXAgcGF0aCBhbmQgcmVtYWluaW5nIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJhbnNhY2tQYXRoKHttb2RlbENsYXNzLCB2YWx1ZX0pIHtcbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgcGF0aCA9IFtdXG4gIGxldCBjdXJyZW50TW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3NcbiAgbGV0IHJlbWFpbmluZ1ZhbHVlID0gdmFsdWVcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChyZXNvbHZlQXR0cmlidXRlTmFtZSh7bW9kZWxDbGFzczogY3VycmVudE1vZGVsQ2xhc3MsIHZhbHVlOiByZW1haW5pbmdWYWx1ZX0pKSB7XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoID0gZmluZFJlbGF0aW9uc2hpcFByZWZpeCh7XG4gICAgICBtb2RlbENsYXNzOiBjdXJyZW50TW9kZWxDbGFzcyxcbiAgICAgIHZhbHVlOiByZW1haW5pbmdWYWx1ZVxuICAgIH0pXG5cbiAgICBpZiAoIW1hdGNoKSBicmVha1xuXG4gICAgcGF0aC5wdXNoKG1hdGNoLnJlbGF0aW9uc2hpcE5hbWUpXG4gICAgY3VycmVudE1vZGVsQ2xhc3MgPSBtYXRjaC50YXJnZXRNb2RlbENsYXNzXG4gICAgcmVtYWluaW5nVmFsdWUgPSBtYXRjaC5yZW1haW5pbmdWYWx1ZVxuICB9XG5cbiAgaWYgKHJlbWFpbmluZ1ZhbHVlLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmFuc2FjayBrZXkgcGF0aDogJHt2YWx1ZX1gKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhdHRyaWJ1dGVWYWx1ZTogcmVtYWluaW5nVmFsdWUsXG4gICAgcGF0aFxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gYXJncy5tb2RlbENsYXNzIC0gQ3VycmVudCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZhbHVlIC0gUmVtYWluaW5nIHZhbHVlIHRvIG1hdGNoLlxuICogQHJldHVybnMge3tyZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmcsIHJlbWFpbmluZ1ZhbHVlOiBzdHJpbmcsIHRhcmdldE1vZGVsQ2xhc3M6IFJhbnNhY2tNb2RlbENsYXNzfSB8IG51bGx9IC0gTWF0Y2hpbmcgcmVsYXRpb25zaGlwIHByZWZpeC5cbiAqL1xuZnVuY3Rpb24gZmluZFJlbGF0aW9uc2hpcFByZWZpeCh7bW9kZWxDbGFzcywgdmFsdWV9KSB7XG4gIGxldCBiZXN0TWF0Y2ggPSBudWxsXG5cbiAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIE9iamVjdC5rZXlzKHJlbGF0aW9uc2hpcEVudHJpZXMobW9kZWxDbGFzcykpKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwRW50cmllcyhtb2RlbENsYXNzKVtyZWxhdGlvbnNoaXBOYW1lXVxuXG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgcmVsYXRpb25zaGlwQ2FuZGlkYXRlcyhyZWxhdGlvbnNoaXBOYW1lKSkge1xuICAgICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKGAke2NhbmRpZGF0ZX1fYCkpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHJlbWFpbmluZ1ZhbHVlID0gdmFsdWUuc2xpY2UoY2FuZGlkYXRlLmxlbmd0aCArIDEpXG5cbiAgICAgIGlmIChyZW1haW5pbmdWYWx1ZS5sZW5ndGggPCAxKSBjb250aW51ZVxuICAgICAgaWYgKGJlc3RNYXRjaCAmJiBjYW5kaWRhdGUubGVuZ3RoIDw9IGJlc3RNYXRjaC5jYW5kaWRhdGVMZW5ndGgpIGNvbnRpbnVlXG5cbiAgICAgIGJlc3RNYXRjaCA9IHtcbiAgICAgICAgY2FuZGlkYXRlTGVuZ3RoOiBjYW5kaWRhdGUubGVuZ3RoLFxuICAgICAgICByZWxhdGlvbnNoaXBOYW1lLFxuICAgICAgICByZW1haW5pbmdWYWx1ZSxcbiAgICAgICAgdGFyZ2V0TW9kZWxDbGFzczogcmVsYXRpb25zaGlwLnRhcmdldE1vZGVsQ2xhc3NcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWJlc3RNYXRjaCkgcmV0dXJuIG51bGxcblxuICByZXR1cm4ge1xuICAgIHJlbGF0aW9uc2hpcE5hbWU6IGJlc3RNYXRjaC5yZWxhdGlvbnNoaXBOYW1lLFxuICAgIHJlbWFpbmluZ1ZhbHVlOiBiZXN0TWF0Y2gucmVtYWluaW5nVmFsdWUsXG4gICAgdGFyZ2V0TW9kZWxDbGFzczogYmVzdE1hdGNoLnRhcmdldE1vZGVsQ2xhc3NcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGlvbnNoaXBOYW1lIC0gUmVsYXRpb25zaGlwIG5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gQ2FuZGlkYXRlIHRva2VucyBmb3IgbWF0Y2hpbmcuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0aW9uc2hpcENhbmRpZGF0ZXMocmVsYXRpb25zaGlwTmFtZSkge1xuICByZXR1cm4gdW5pcXVuaXplKFtyZWxhdGlvbnNoaXBOYW1lLCBpbmZsZWN0aW9uLnVuZGVyc2NvcmUocmVsYXRpb25zaGlwTmFtZSldKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudmFsdWUgLSBBdHRyaWJ1dGUgY2FuZGlkYXRlLlxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBSZXNvbHZlZCBhdHRyaWJ1dGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUF0dHJpYnV0ZU5hbWUoe21vZGVsQ2xhc3MsIHZhbHVlfSkge1xuICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCBjb2x1bW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhhdHRyaWJ1dGVFbnRyaWVzKG1vZGVsQ2xhc3MpKSkge1xuICAgIGlmIChtYXRjaGVzQXR0cmlidXRlVmFsdWUoe2F0dHJpYnV0ZU5hbWUsIGNvbHVtbk5hbWUsIHZhbHVlfSkpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB7dGFyZ2V0TW9kZWxDbGFzczogUmFuc2Fja01vZGVsQ2xhc3N9Pn0gLSBSZWxhdGlvbnNoaXAgZW50cmllcyBrZXllZCBieSBuYW1lLlxuICovXG5mdW5jdGlvbiByZWxhdGlvbnNoaXBFbnRyaWVzKG1vZGVsQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiAvKiogQHR5cGUge2FueX0gKi8gKG1vZGVsQ2xhc3MpLmdldFJlbGF0aW9uc2hpcHNNYXAgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywge3RhcmdldE1vZGVsQ2xhc3M6IFJhbnNhY2tNb2RlbENsYXNzfT59ICovXG4gICAgY29uc3QgZW50cmllcyA9IHt9XG4gICAgY29uc3QgcmVsYXRpb25zaGlwc01hcCA9IC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykuZ2V0UmVsYXRpb25zaGlwc01hcCgpXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgb2YgT2JqZWN0LmtleXMocmVsYXRpb25zaGlwc01hcCkpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcHNNYXBbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgICAgaWYgKHR5cGVvZiByZWxhdGlvbnNoaXAuaXNQb2x5bW9ycGhpYyA9PT0gXCJmdW5jdGlvblwiICYmIHJlbGF0aW9uc2hpcC5pc1BvbHltb3JwaGljKCkpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSByZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG5cbiAgICAgIGlmICghdGFyZ2V0TW9kZWxDbGFzcykgY29udGludWVcblxuICAgICAgZW50cmllc1tyZWxhdGlvbnNoaXBOYW1lXSA9IHtcbiAgICAgICAgdGFyZ2V0TW9kZWxDbGFzc1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzXG4gIH1cblxuICBpZiAodHlwZW9mIC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykucmVsYXRpb25zaGlwRGVmaW5pdGlvbnMgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiAvKiogQHR5cGUge2FueX0gKi8gKG1vZGVsQ2xhc3MpLnJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB7dGFyZ2V0TW9kZWxDbGFzczogUmFuc2Fja01vZGVsQ2xhc3N9Pn0gKi9cbiAgICBjb25zdCBlbnRyaWVzID0ge31cbiAgICBjb25zdCBkZWZpbml0aW9ucyA9IC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykucmVsYXRpb25zaGlwRGVmaW5pdGlvbnMoKVxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcyA9IC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykucmVsYXRpb25zaGlwTW9kZWxDbGFzc2VzKClcblxuICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBvZiBPYmplY3Qua2V5cyhkZWZpbml0aW9ucykpIHtcbiAgICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSByZXNvbHZlRnJvbnRlbmRNb2RlbENsYXNzKHJlbGF0aW9uc2hpcE1vZGVsQ2xhc3Nlc1tyZWxhdGlvbnNoaXBOYW1lXSlcblxuICAgICAgaWYgKCF0YXJnZXRNb2RlbENsYXNzKSBjb250aW51ZVxuXG4gICAgICBlbnRyaWVzW3JlbGF0aW9uc2hpcE5hbWVdID0ge3RhcmdldE1vZGVsQ2xhc3N9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudHJpZXNcbiAgfVxuXG4gIHJldHVybiB7fVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAtIEF0dHJpYnV0ZS10by1jb2x1bW4gZW50cmllcyBrZXllZCBieSBhdHRyaWJ1dGUgbmFtZS5cbiAqL1xuZnVuY3Rpb24gYXR0cmlidXRlRW50cmllcyhtb2RlbENsYXNzKSB7XG4gIGlmICh0eXBlb2YgLyoqIEB0eXBlIHthbnl9ICovIChtb2RlbENsYXNzKS5nZXRBdHRyaWJ1dGVOYW1lVG9Db2x1bW5OYW1lTWFwID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqLyAoKC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykuZ2V0QXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcCgpKSlcbiAgfVxuXG4gIGNvbnN0IHJlc291cmNlQ29uZmlnID0gdHlwZW9mIC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykucmVzb3VyY2VDb25maWcgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gLyoqIEB0eXBlIHthbnl9ICovIChtb2RlbENsYXNzKS5yZXNvdXJjZUNvbmZpZygpXG4gICAgOiB7fVxuICBjb25zdCBhdHRyaWJ1dGVzID0gcmVzb3VyY2VDb25maWcuYXR0cmlidXRlc1xuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZz59ICovXG4gIGNvbnN0IGVudHJpZXMgPSB7fVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpKSB7XG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGVOYW1lIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGlmICh0eXBlb2YgYXR0cmlidXRlTmFtZSAhPT0gXCJzdHJpbmdcIikgY29udGludWVcblxuICAgICAgZW50cmllc1thdHRyaWJ1dGVOYW1lXSA9IGF0dHJpYnV0ZU5hbWVcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVzKSkge1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSkge1xuICAgICAgZW50cmllc1thdHRyaWJ1dGVOYW1lXSA9IGF0dHJpYnV0ZU5hbWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW50cmllc1xufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBBdHRyaWJ1dGUgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbHVtbk5hbWUgLSBDb2x1bW4gbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgY2FuZGlkYXRlIHJlc29sdmVzIHRvIHRoZSBhdHRyaWJ1dGUuXG4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNBdHRyaWJ1dGVWYWx1ZSh7YXR0cmlidXRlTmFtZSwgY29sdW1uTmFtZSwgdmFsdWV9KSB7XG4gIHJldHVybiB1bmlxdW5pemUoW1xuICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgY29sdW1uTmFtZSxcbiAgICBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYXR0cmlidXRlTmFtZSksXG4gICAgaW5mbGVjdGlvbi51bmRlcnNjb3JlKGNvbHVtbk5hbWUpXG4gIF0pLmluY2x1ZGVzKHZhbHVlKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBSYW5zYWNrIGtleS5cbiAqIEByZXR1cm5zIHt7cGF0aFZhbHVlOiBzdHJpbmcsIHByZWRpY2F0ZTogUmFuc2Fja1ByZWRpY2F0ZX0gfCBudWxsfSAtIFBhcnNlZCBrZXkuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUmFuc2Fja0tleShrZXkpIHtcbiAgZm9yIChjb25zdCBwcmVkaWNhdGUgb2Ygc3VwcG9ydGVkUHJlZGljYXRlcykge1xuICAgIGNvbnN0IHN1ZmZpeCA9IGBfJHtwcmVkaWNhdGV9YFxuXG4gICAgaWYgKCFrZXkuZW5kc1dpdGgoc3VmZml4KSkgY29udGludWVcblxuICAgIGNvbnN0IHBhdGhWYWx1ZSA9IGtleS5zbGljZSgwLCBrZXkubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aClcblxuICAgIGlmIChwYXRoVmFsdWUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJhbnNhY2sga2V5OiAke2tleX1gKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwYXRoVmFsdWUsXG4gICAgICBwcmVkaWNhdGU6IC8qKiBAdHlwZSB7UmFuc2Fja1ByZWRpY2F0ZX0gKi8gKHByZWRpY2F0ZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja1ByZWRpY2F0ZX0gYXJncy5wcmVkaWNhdGUgLSBQYXJzZWQgcHJlZGljYXRlLlxuICogQHBhcmFtIHthbnl9IGFyZ3MudmFsdWUgLSBSYXcgdmFsdWUuXG4gKiBAcmV0dXJucyB7YW55fSAtIE5vcm1hbGl6ZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhbnNhY2tWYWx1ZSh7cHJlZGljYXRlLCB2YWx1ZX0pIHtcbiAgaWYgKHByZWRpY2F0ZSA9PT0gXCJudWxsXCIpIHtcbiAgICBjb25zdCBib29sZWFuVmFsdWUgPSBub3JtYWxpemVSYW5zYWNrQm9vbGVhbih2YWx1ZSlcblxuICAgIGlmIChib29sZWFuVmFsdWUgPT09IG51bGwpIHJldHVybiBTS0lQX1JBTlNBQ0tfQ09ORElUSU9OXG5cbiAgICByZXR1cm4gYm9vbGVhblZhbHVlXG4gIH1cblxuICBpZiAocHJlZGljYXRlID09PSBcImluXCIgfHwgcHJlZGljYXRlID09PSBcIm5vdF9pblwiKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEFycmF5ID0gbm9ybWFsaXplUmFuc2Fja0FycmF5KHZhbHVlKVxuXG4gICAgaWYgKG5vcm1hbGl6ZWRBcnJheS5sZW5ndGggPCAxKSByZXR1cm4gU0tJUF9SQU5TQUNLX0NPTkRJVElPTlxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRBcnJheVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybiBTS0lQX1JBTlNBQ0tfQ09ORElUSU9OXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUubGVuZ3RoIDwgMSkgcmV0dXJuIFNLSVBfUkFOU0FDS19DT05ESVRJT05cblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGJvb2xlYW4uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbiB8IG51bGx9IC0gTm9ybWFsaXplZCBib29sZWFuIG9yIG51bGwgd2hlbiBibGFuay5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmFuc2Fja0Jvb2xlYW4odmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSkgcmV0dXJuIHZhbHVlXG4gIGlmICh2YWx1ZSA9PT0gMSB8fCB2YWx1ZSA9PT0gXCIxXCIgfHwgdmFsdWUgPT09IFwidHJ1ZVwiKSByZXR1cm4gdHJ1ZVxuICBpZiAodmFsdWUgPT09IDAgfHwgdmFsdWUgPT09IFwiMFwiIHx8IHZhbHVlID09PSBcImZhbHNlXCIpIHJldHVybiBmYWxzZVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIG51bGxcblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmFuc2FjayBib29sZWFuIHZhbHVlOiAke1N0cmluZyh2YWx1ZSl9YClcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGFycmF5LWlzaCB2YWx1ZS5cbiAqIEByZXR1cm5zIHthbnlbXX0gLSBOb3JtYWxpemVkIGFycmF5IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmFuc2Fja0FycmF5KHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGVudHJ5ICE9PSBudWxsICYmIGVudHJ5ICE9PSBcIlwiKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB2YWx1ZS5zcGxpdChcIixcIikubWFwKChlbnRyeSkgPT4gZW50cnkudHJpbSgpKS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5sZW5ndGggPiAwKVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiBbXVxuXG4gIHJldHVybiBbdmFsdWVdXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBvYmplY3QuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgYW55Pn0gLSBXaGV0aGVyIHRoaXMgaXMgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSlcblxuICByZXR1cm4gcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvdHlwZSA9PT0gbnVsbFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nW119IHZhbHVlcyAtIElucHV0IHZhbHVlcy5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBVbmlxdWUgdmFsdWVzIGluIG9yaWdpbmFsIG9yZGVyLlxuICovXG5mdW5jdGlvbiB1bmlxdW5pemUodmFsdWVzKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodmFsdWVzKSlcbn1cbiJdfQ==
|
|
368
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuc2Fjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9yYW5zYWNrLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQTtBQUU5RTs7R0FFRztBQUVIOztHQUVHO0FBRUg7Ozs7OztHQU1HO0FBRUgsTUFBTSxtQkFBbUIsR0FBRztJQUMxQixRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLE1BQU07SUFDTixNQUFNO0lBQ04sS0FBSztJQUNMLElBQUk7SUFDSixJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7Q0FDTCxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsTUFBTTtJQUN2RCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsT0FBTyxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBQ2pGLENBQUM7SUFFRCxpQ0FBaUM7SUFDakMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFBO0lBRXJCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDckQsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRXRDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFDakUsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLENB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QUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDMUYsQ0FBQztJQUVELElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFcEUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQ2hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxLQUFLO0lBQzFCLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFN0UsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUU5QyxPQUFPLFNBQVMsS0FBSyxNQUFNLENBQUMsU0FBUyxJQUFJLFNBQVMsS0FBSyxJQUFJLENBQUE7QUFDN0QsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsU0FBUyxDQUFDLE1BQU07SUFDdkIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7QUFDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCB7cmVzb2x2ZUZyb250ZW5kTW9kZWxDbGFzc30gZnJvbSBcIi4uL2Zyb250ZW5kLW1vZGVscy9tb2RlbC1yZWdpc3RyeS5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge1wiY29udFwiIHwgXCJlbmRcIiB8IFwiZXFcIiB8IFwiZ3RcIiB8IFwiZ3RlcVwiIHwgXCJpblwiIHwgXCJsdFwiIHwgXCJsdGVxXCIgfCBcIm5vdF9lcVwiIHwgXCJub3RfaW5cIiB8IFwibnVsbFwiIHwgXCJzdGFydFwifSBSYW5zYWNrUHJlZGljYXRlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdHlwZW9mIGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVscy9iYXNlLmpzXCIpLmRlZmF1bHR9IFJhbnNhY2tNb2RlbENsYXNzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYW5zYWNrQ29uZGl0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXR0cmlidXRlTmFtZSAtIFJlc29sdmVkIGF0dHJpYnV0ZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gcGF0aCAtIFJlc29sdmVkIHJlbGF0aW9uc2hpcCBwYXRoLlxuICogQHByb3BlcnR5IHtSYW5zYWNrUHJlZGljYXRlfSBwcmVkaWNhdGUgLSBQYXJzZWQgUmFuc2FjayBwcmVkaWNhdGUuXG4gKiBAcHJvcGVydHkge2FueX0gdmFsdWUgLSBOb3JtYWxpemVkIHZhbHVlLlxuICovXG5cbmNvbnN0IHN1cHBvcnRlZFByZWRpY2F0ZXMgPSBbXG4gIFwibm90X2luXCIsXG4gIFwibm90X2VxXCIsXG4gIFwiZ3RlcVwiLFxuICBcImx0ZXFcIixcbiAgXCJzdGFydFwiLFxuICBcImNvbnRcIixcbiAgXCJudWxsXCIsXG4gIFwiZW5kXCIsXG4gIFwiZXFcIixcbiAgXCJndFwiLFxuICBcImx0XCIsXG4gIFwiaW5cIlxuXVxuXG4vKipcbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IG1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcGFyYW1zIC0gUmFuc2Fjay1zdHlsZSBwYXJhbXMgaGFzaC5cbiAqIEByZXR1cm5zIHtSYW5zYWNrQ29uZGl0aW9uW119IC0gTm9ybWFsaXplZCBjb25kaXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUmFuc2Fja1BhcmFtcyhtb2RlbENsYXNzLCBwYXJhbXMpIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHBhcmFtcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJhbnNhY2sgcGFyYW1zIG11c3QgYmUgYSBwbGFpbiBvYmplY3QsIGdvdDogJHt0eXBlb2YgcGFyYW1zfWApXG4gIH1cblxuICAvKiogQHR5cGUge1JhbnNhY2tDb25kaXRpb25bXX0gKi9cbiAgY29uc3Qgbm9ybWFsaXplZCA9IFtdXG5cbiAgZm9yIChjb25zdCBba2V5LCByYXdWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1zKSkge1xuICAgIGNvbnN0IHBhcnNlZEtleSA9IHBhcnNlUmFuc2Fja0tleShrZXkpXG5cbiAgICBpZiAoIXBhcnNlZEtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCByYW5zYWNrIHByZWRpY2F0ZSBpbiBrZXk6ICR7a2V5fWApXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZVJhbnNhY2tQYXRoKHttb2RlbENsYXNzLCB2YWx1ZTogcGFyc2VkS2V5LnBhdGhWYWx1ZX0pXG4gICAgY29uc3QgdGFyZ2V0TW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3NBdFBhdGgoe21vZGVsQ2xhc3MsIHBhdGg6IHJlc29sdmVkUGF0aC5wYXRofSlcbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gcmVzb2x2ZUF0dHJpYnV0ZU5hbWUoe21vZGVsQ2xhc3M6IHRhcmdldE1vZGVsQ2xhc3MsIHZhbHVlOiByZXNvbHZlZFBhdGguYXR0cmlidXRlVmFsdWV9KVxuXG4gICAgaWYgKCFhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmFuc2FjayBhdHRyaWJ1dGUgXCIke3Jlc29sdmVkUGF0aC5hdHRyaWJ1dGVWYWx1ZX1cIiBmb3IgJHt0YXJnZXRNb2RlbENsYXNzLm5hbWV9YClcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IG5vcm1hbGl6ZVJhbnNhY2tWYWx1ZSh7XG4gICAgICBwcmVkaWNhdGU6IHBhcnNlZEtleS5wcmVkaWNhdGUsXG4gICAgICB2YWx1ZTogcmF3VmFsdWVcbiAgICB9KVxuXG4gICAgaWYgKHZhbHVlID09PSBTS0lQX1JBTlNBQ0tfQ09ORElUSU9OKSBjb250aW51ZVxuXG4gICAgbm9ybWFsaXplZC5wdXNoKHtcbiAgICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgICBwYXRoOiByZXNvbHZlZFBhdGgucGF0aCxcbiAgICAgIHByZWRpY2F0ZTogcGFyc2VkS2V5LnByZWRpY2F0ZSxcbiAgICAgIHZhbHVlXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbmNvbnN0IFNLSVBfUkFOU0FDS19DT05ESVRJT04gPSBTeW1ib2woXCJza2lwLXJhbnNhY2stY29uZGl0aW9uXCIpXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICogQHBhcmFtIHtSYW5zYWNrTW9kZWxDbGFzc30gYXJncy5tb2RlbENsYXNzIC0gUm9vdCBtb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MucGF0aCAtIFJlbGF0aW9uc2hpcCBwYXRoLlxuICogQHJldHVybnMge1JhbnNhY2tNb2RlbENsYXNzfSAtIFRhcmdldCBtb2RlbCBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gbW9kZWxDbGFzc0F0UGF0aCh7bW9kZWxDbGFzcywgcGF0aH0pIHtcbiAgbGV0IGN1cnJlbnRNb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuXG4gIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBvZiBwYXRoKSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwID0gcmVsYXRpb25zaGlwRW50cmllcyhjdXJyZW50TW9kZWxDbGFzcylbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgIGlmICghcmVsYXRpb25zaGlwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmFuc2FjayByZWxhdGlvbnNoaXAgXCIke3JlbGF0aW9uc2hpcE5hbWV9XCIgZm9yICR7Y3VycmVudE1vZGVsQ2xhc3MubmFtZX1gKVxuICAgIH1cblxuICAgIGN1cnJlbnRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLnRhcmdldE1vZGVsQ2xhc3NcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50TW9kZWxDbGFzc1xufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIEN1cnJlbnQgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52YWx1ZSAtIFJlbWFpbmluZyBwYXRoIHZhbHVlLlxuICogQHJldHVybnMge3thdHRyaWJ1dGVWYWx1ZTogc3RyaW5nLCBwYXRoOiBzdHJpbmdbXX19IC0gUmVzb2x2ZWQgcmVsYXRpb25zaGlwIHBhdGggYW5kIHJlbWFpbmluZyBhdHRyaWJ1dGUgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSYW5zYWNrUGF0aCh7bW9kZWxDbGFzcywgdmFsdWV9KSB7XG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gIGNvbnN0IHBhdGggPSBbXVxuICBsZXQgY3VycmVudE1vZGVsQ2xhc3MgPSBtb2RlbENsYXNzXG4gIGxldCByZW1haW5pbmdWYWx1ZSA9IHZhbHVlXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAocmVzb2x2ZUF0dHJpYnV0ZU5hbWUoe21vZGVsQ2xhc3M6IGN1cnJlbnRNb2RlbENsYXNzLCB2YWx1ZTogcmVtYWluaW5nVmFsdWV9KSkge1xuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaCA9IGZpbmRSZWxhdGlvbnNoaXBQcmVmaXgoe1xuICAgICAgbW9kZWxDbGFzczogY3VycmVudE1vZGVsQ2xhc3MsXG4gICAgICB2YWx1ZTogcmVtYWluaW5nVmFsdWVcbiAgICB9KVxuXG4gICAgaWYgKCFtYXRjaCkgYnJlYWtcblxuICAgIHBhdGgucHVzaChtYXRjaC5yZWxhdGlvbnNoaXBOYW1lKVxuICAgIGN1cnJlbnRNb2RlbENsYXNzID0gbWF0Y2gudGFyZ2V0TW9kZWxDbGFzc1xuICAgIHJlbWFpbmluZ1ZhbHVlID0gbWF0Y2gucmVtYWluaW5nVmFsdWVcbiAgfVxuXG4gIGlmIChyZW1haW5pbmdWYWx1ZS5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJhbnNhY2sga2V5IHBhdGg6ICR7dmFsdWV9YClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXR0cmlidXRlVmFsdWU6IHJlbWFpbmluZ1ZhbHVlLFxuICAgIHBhdGhcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAqIEBwYXJhbSB7UmFuc2Fja01vZGVsQ2xhc3N9IGFyZ3MubW9kZWxDbGFzcyAtIEN1cnJlbnQgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52YWx1ZSAtIFJlbWFpbmluZyB2YWx1ZSB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHt7cmVsYXRpb25zaGlwTmFtZTogc3RyaW5nLCByZW1haW5pbmdWYWx1ZTogc3RyaW5nLCB0YXJnZXRNb2RlbENsYXNzOiBSYW5zYWNrTW9kZWxDbGFzc30gfCBudWxsfSAtIE1hdGNoaW5nIHJlbGF0aW9uc2hpcCBwcmVmaXguXG4gKi9cbmZ1bmN0aW9uIGZpbmRSZWxhdGlvbnNoaXBQcmVmaXgoe21vZGVsQ2xhc3MsIHZhbHVlfSkge1xuICBsZXQgYmVzdE1hdGNoID0gbnVsbFxuXG4gIGZvciAoY29uc3QgcmVsYXRpb25zaGlwTmFtZSBvZiBPYmplY3Qua2V5cyhyZWxhdGlvbnNoaXBFbnRyaWVzKG1vZGVsQ2xhc3MpKSkge1xuICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcEVudHJpZXMobW9kZWxDbGFzcylbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIHJlbGF0aW9uc2hpcENhbmRpZGF0ZXMocmVsYXRpb25zaGlwTmFtZSkpIHtcbiAgICAgIGlmICghdmFsdWUuc3RhcnRzV2l0aChgJHtjYW5kaWRhdGV9X2ApKSBjb250aW51ZVxuXG4gICAgICBjb25zdCByZW1haW5pbmdWYWx1ZSA9IHZhbHVlLnNsaWNlKGNhbmRpZGF0ZS5sZW5ndGggKyAxKVxuXG4gICAgICBpZiAocmVtYWluaW5nVmFsdWUubGVuZ3RoIDwgMSkgY29udGludWVcbiAgICAgIGlmIChiZXN0TWF0Y2ggJiYgY2FuZGlkYXRlLmxlbmd0aCA8PSBiZXN0TWF0Y2guY2FuZGlkYXRlTGVuZ3RoKSBjb250aW51ZVxuXG4gICAgICBiZXN0TWF0Y2ggPSB7XG4gICAgICAgIGNhbmRpZGF0ZUxlbmd0aDogY2FuZGlkYXRlLmxlbmd0aCxcbiAgICAgICAgcmVsYXRpb25zaGlwTmFtZSxcbiAgICAgICAgcmVtYWluaW5nVmFsdWUsXG4gICAgICAgIHRhcmdldE1vZGVsQ2xhc3M6IHJlbGF0aW9uc2hpcC50YXJnZXRNb2RlbENsYXNzXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFiZXN0TWF0Y2gpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIHtcbiAgICByZWxhdGlvbnNoaXBOYW1lOiBiZXN0TWF0Y2gucmVsYXRpb25zaGlwTmFtZSxcbiAgICByZW1haW5pbmdWYWx1ZTogYmVzdE1hdGNoLnJlbWFpbmluZ1ZhbHVlLFxuICAgIHRhcmdldE1vZGVsQ2xhc3M6IGJlc3RNYXRjaC50YXJnZXRNb2RlbENsYXNzXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpb25zaGlwTmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICogQHJldHVybnMge3N0cmluZ1tdfSAtIENhbmRpZGF0ZSB0b2tlbnMgZm9yIG1hdGNoaW5nLlxuICovXG5mdW5jdGlvbiByZWxhdGlvbnNoaXBDYW5kaWRhdGVzKHJlbGF0aW9uc2hpcE5hbWUpIHtcbiAgcmV0dXJuIHVuaXF1bml6ZShbcmVsYXRpb25zaGlwTmFtZSwgaW5mbGVjdGlvbi51bmRlcnNjb3JlKHJlbGF0aW9uc2hpcE5hbWUpXSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBhcmdzLm1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnZhbHVlIC0gQXR0cmlidXRlIGNhbmRpZGF0ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gUmVzb2x2ZWQgYXR0cmlidXRlIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVBdHRyaWJ1dGVOYW1lKHttb2RlbENsYXNzLCB2YWx1ZX0pIHtcbiAgZm9yIChjb25zdCBbYXR0cmlidXRlTmFtZSwgY29sdW1uTmFtZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlRW50cmllcyhtb2RlbENsYXNzKSkpIHtcbiAgICBpZiAobWF0Y2hlc0F0dHJpYnV0ZVZhbHVlKHthdHRyaWJ1dGVOYW1lLCBjb2x1bW5OYW1lLCB2YWx1ZX0pKSB7XG4gICAgICByZXR1cm4gYXR0cmlidXRlTmFtZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywge3RhcmdldE1vZGVsQ2xhc3M6IFJhbnNhY2tNb2RlbENsYXNzfT59IC0gUmVsYXRpb25zaGlwIGVudHJpZXMga2V5ZWQgYnkgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcmVsYXRpb25zaGlwRW50cmllcyhtb2RlbENsYXNzKSB7XG4gIGlmICh0eXBlb2YgLyoqIEB0eXBlIHthbnl9ICovIChtb2RlbENsYXNzKS5nZXRSZWxhdGlvbnNoaXBzTWFwID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHt0YXJnZXRNb2RlbENsYXNzOiBSYW5zYWNrTW9kZWxDbGFzc30+fSAqL1xuICAgIGNvbnN0IGVudHJpZXMgPSB7fVxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHNNYXAgPSAvKiogQHR5cGUge2FueX0gKi8gKG1vZGVsQ2xhc3MpLmdldFJlbGF0aW9uc2hpcHNNYXAoKVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIG9mIE9iamVjdC5rZXlzKHJlbGF0aW9uc2hpcHNNYXApKSB7XG4gICAgICBjb25zdCByZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXBzTWFwW3JlbGF0aW9uc2hpcE5hbWVdXG5cbiAgICAgIGlmICh0eXBlb2YgcmVsYXRpb25zaGlwLmlzUG9seW1vcnBoaWMgPT09IFwiZnVuY3Rpb25cIiAmJiByZWxhdGlvbnNoaXAuaXNQb2x5bW9ycGhpYygpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuXG4gICAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIGNvbnRpbnVlXG5cbiAgICAgIGVudHJpZXNbcmVsYXRpb25zaGlwTmFtZV0gPSB7XG4gICAgICAgIHRhcmdldE1vZGVsQ2xhc3NcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW50cmllc1xuICB9XG5cbiAgaWYgKHR5cGVvZiAvKiogQHR5cGUge2FueX0gKi8gKG1vZGVsQ2xhc3MpLnJlbGF0aW9uc2hpcERlZmluaXRpb25zID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICB0eXBlb2YgLyoqIEB0eXBlIHthbnl9ICovIChtb2RlbENsYXNzKS5yZWxhdGlvbnNoaXBNb2RlbENsYXNzZXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywge3RhcmdldE1vZGVsQ2xhc3M6IFJhbnNhY2tNb2RlbENsYXNzfT59ICovXG4gICAgY29uc3QgZW50cmllcyA9IHt9XG4gICAgY29uc3QgZGVmaW5pdGlvbnMgPSAvKiogQHR5cGUge2FueX0gKi8gKG1vZGVsQ2xhc3MpLnJlbGF0aW9uc2hpcERlZmluaXRpb25zKClcbiAgICBjb25zdCByZWxhdGlvbnNoaXBNb2RlbENsYXNzZXMgPSAvKiogQHR5cGUge2FueX0gKi8gKG1vZGVsQ2xhc3MpLnJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcygpXG5cbiAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcE5hbWUgb2YgT2JqZWN0LmtleXMoZGVmaW5pdGlvbnMpKSB7XG4gICAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVzb2x2ZUZyb250ZW5kTW9kZWxDbGFzcyhyZWxhdGlvbnNoaXBNb2RlbENsYXNzZXNbcmVsYXRpb25zaGlwTmFtZV0pXG5cbiAgICAgIGlmICghdGFyZ2V0TW9kZWxDbGFzcykgY29udGludWVcblxuICAgICAgZW50cmllc1tyZWxhdGlvbnNoaXBOYW1lXSA9IHt0YXJnZXRNb2RlbENsYXNzfVxuICAgIH1cblxuICAgIHJldHVybiBlbnRyaWVzXG4gIH1cblxuICByZXR1cm4ge31cbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JhbnNhY2tNb2RlbENsYXNzfSBtb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gLSBBdHRyaWJ1dGUtdG8tY29sdW1uIGVudHJpZXMga2V5ZWQgYnkgYXR0cmlidXRlIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGF0dHJpYnV0ZUVudHJpZXMobW9kZWxDbGFzcykge1xuICBpZiAodHlwZW9mIC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykuZ2V0QXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi8gKCgvKiogQHR5cGUge2FueX0gKi8gKG1vZGVsQ2xhc3MpLmdldEF0dHJpYnV0ZU5hbWVUb0NvbHVtbk5hbWVNYXAoKSkpXG4gIH1cblxuICBjb25zdCByZXNvdXJjZUNvbmZpZyA9IHR5cGVvZiAvKiogQHR5cGUge2FueX0gKi8gKG1vZGVsQ2xhc3MpLnJlc291cmNlQ29uZmlnID09PSBcImZ1bmN0aW9uXCJcbiAgICA/IC8qKiBAdHlwZSB7YW55fSAqLyAobW9kZWxDbGFzcykucmVzb3VyY2VDb25maWcoKVxuICAgIDoge31cbiAgY29uc3QgYXR0cmlidXRlcyA9IHJlc291cmNlQ29uZmlnLmF0dHJpYnV0ZXNcbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCBlbnRyaWVzID0ge31cblxuICBpZiAoQXJyYXkuaXNBcnJheShhdHRyaWJ1dGVzKSkge1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZU5hbWUgIT09IFwic3RyaW5nXCIpIGNvbnRpbnVlXG5cbiAgICAgIGVudHJpZXNbYXR0cmlidXRlTmFtZV0gPSBhdHRyaWJ1dGVOYW1lXG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoYXR0cmlidXRlcykpIHtcbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgT2JqZWN0LmtleXMoYXR0cmlidXRlcykpIHtcbiAgICAgIGVudHJpZXNbYXR0cmlidXRlTmFtZV0gPSBhdHRyaWJ1dGVOYW1lXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdHRyaWJ1dGVOYW1lIC0gQXR0cmlidXRlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy52YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNhbmRpZGF0ZSByZXNvbHZlcyB0byB0aGUgYXR0cmlidXRlLlxuICovXG5mdW5jdGlvbiBtYXRjaGVzQXR0cmlidXRlVmFsdWUoe2F0dHJpYnV0ZU5hbWUsIGNvbHVtbk5hbWUsIHZhbHVlfSkge1xuICByZXR1cm4gdW5pcXVuaXplKFtcbiAgICBhdHRyaWJ1dGVOYW1lLFxuICAgIGNvbHVtbk5hbWUsXG4gICAgaW5mbGVjdGlvbi51bmRlcnNjb3JlKGF0dHJpYnV0ZU5hbWUpLFxuICAgIGluZmxlY3Rpb24udW5kZXJzY29yZShjb2x1bW5OYW1lKVxuICBdKS5pbmNsdWRlcyh2YWx1ZSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gUmFuc2FjayBrZXkuXG4gKiBAcmV0dXJucyB7e3BhdGhWYWx1ZTogc3RyaW5nLCBwcmVkaWNhdGU6IFJhbnNhY2tQcmVkaWNhdGV9IHwgbnVsbH0gLSBQYXJzZWQga2V5LlxuICovXG5mdW5jdGlvbiBwYXJzZVJhbnNhY2tLZXkoa2V5KSB7XG4gIGZvciAoY29uc3QgcHJlZGljYXRlIG9mIHN1cHBvcnRlZFByZWRpY2F0ZXMpIHtcbiAgICBjb25zdCBzdWZmaXggPSBgXyR7cHJlZGljYXRlfWBcbiAgICBpZiAoIWtleS5lbmRzV2l0aChzdWZmaXgpKSBjb250aW51ZVxuXG4gICAgY29uc3QgcGF0aFZhbHVlID0ga2V5LnNsaWNlKDAsIGtleS5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKVxuXG4gICAgaWYgKHBhdGhWYWx1ZS5sZW5ndGggPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmFuc2FjayBrZXk6ICR7a2V5fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGhWYWx1ZSxcbiAgICAgIHByZWRpY2F0ZTogLyoqIEB0eXBlIHtSYW5zYWNrUHJlZGljYXRlfSAqLyAocHJlZGljYXRlKVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcHJlZGljYXRlIG9mIHN1cHBvcnRlZFByZWRpY2F0ZXMpIHtcbiAgICBjb25zdCBjYW1lbFN1ZmZpeCA9IHNuYWtlVG9DYW1lbFN1ZmZpeChwcmVkaWNhdGUpXG5cbiAgICBpZiAoIWtleS5lbmRzV2l0aChjYW1lbFN1ZmZpeCkpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBwYXRoVmFsdWUgPSBrZXkuc2xpY2UoMCwga2V5Lmxlbmd0aCAtIGNhbWVsU3VmZml4Lmxlbmd0aClcblxuICAgIGlmIChwYXRoVmFsdWUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJhbnNhY2sga2V5OiAke2tleX1gKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwYXRoVmFsdWUsXG4gICAgICBwcmVkaWNhdGU6IC8qKiBAdHlwZSB7UmFuc2Fja1ByZWRpY2F0ZX0gKi8gKHByZWRpY2F0ZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFNuYWtlLWNhc2UgcHJlZGljYXRlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBDYW1lbENhc2UgcHJlZGljYXRlIHN1ZmZpeCB1c2VkIGluIHJhbnNhY2sga2V5cy5cbiAqL1xuZnVuY3Rpb24gc25ha2VUb0NhbWVsU3VmZml4KHZhbHVlKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gdmFsdWUuc3BsaXQoXCJfXCIpXG5cbiAgcmV0dXJuIHNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHNlZ21lbnQuc2xpY2UoMSkpLmpvaW4oXCJcIilcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge1JhbnNhY2tQcmVkaWNhdGV9IGFyZ3MucHJlZGljYXRlIC0gUGFyc2VkIHByZWRpY2F0ZS5cbiAqIEBwYXJhbSB7YW55fSBhcmdzLnZhbHVlIC0gUmF3IHZhbHVlLlxuICogQHJldHVybnMge2FueX0gLSBOb3JtYWxpemVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSYW5zYWNrVmFsdWUoe3ByZWRpY2F0ZSwgdmFsdWV9KSB7XG4gIGlmIChwcmVkaWNhdGUgPT09IFwibnVsbFwiKSB7XG4gICAgY29uc3QgYm9vbGVhblZhbHVlID0gbm9ybWFsaXplUmFuc2Fja0Jvb2xlYW4odmFsdWUpXG5cbiAgICBpZiAoYm9vbGVhblZhbHVlID09PSBudWxsKSByZXR1cm4gU0tJUF9SQU5TQUNLX0NPTkRJVElPTlxuXG4gICAgcmV0dXJuIGJvb2xlYW5WYWx1ZVxuICB9XG5cbiAgaWYgKHByZWRpY2F0ZSA9PT0gXCJpblwiIHx8IHByZWRpY2F0ZSA9PT0gXCJub3RfaW5cIikge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRBcnJheSA9IG5vcm1hbGl6ZVJhbnNhY2tBcnJheSh2YWx1ZSlcblxuICAgIGlmIChub3JtYWxpemVkQXJyYXkubGVuZ3RoIDwgMSkgcmV0dXJuIFNLSVBfUkFOU0FDS19DT05ESVRJT05cblxuICAgIHJldHVybiBub3JtYWxpemVkQXJyYXlcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gU0tJUF9SQU5TQUNLX0NPTkRJVElPTlxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLmxlbmd0aCA8IDEpIHJldHVybiBTS0lQX1JBTlNBQ0tfQ09ORElUSU9OXG5cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBib29sZWFuLlxuICogQHJldHVybnMge2Jvb2xlYW4gfCBudWxsfSAtIE5vcm1hbGl6ZWQgYm9vbGVhbiBvciBudWxsIHdoZW4gYmxhbmsuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhbnNhY2tCb29sZWFuKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2UpIHJldHVybiB2YWx1ZVxuICBpZiAodmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IFwiMVwiIHx8IHZhbHVlID09PSBcInRydWVcIikgcmV0dXJuIHRydWVcbiAgaWYgKHZhbHVlID09PSAwIHx8IHZhbHVlID09PSBcIjBcIiB8fCB2YWx1ZSA9PT0gXCJmYWxzZVwiKSByZXR1cm4gZmFsc2VcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiBudWxsXG5cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJhbnNhY2sgYm9vbGVhbiB2YWx1ZTogJHtTdHJpbmcodmFsdWUpfWApXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSBhcnJheS1pc2ggdmFsdWUuXG4gKiBAcmV0dXJucyB7YW55W119IC0gTm9ybWFsaXplZCBhcnJheSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhbnNhY2tBcnJheSh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkgIT09IHVuZGVmaW5lZCAmJiBlbnRyeSAhPT0gbnVsbCAmJiBlbnRyeSAhPT0gXCJcIilcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gdmFsdWUuc3BsaXQoXCIsXCIpLm1hcCgoZW50cnkpID0+IGVudHJ5LnRyaW0oKSkuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkubGVuZ3RoID4gMClcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gW11cblxuICByZXR1cm4gW3ZhbHVlXVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgb2JqZWN0LlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIGFueT59IC0gV2hldGhlciB0aGlzIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG5cbiAgcmV0dXJuIHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90b3R5cGUgPT09IG51bGxcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB2YWx1ZXMgLSBJbnB1dCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gVW5pcXVlIHZhbHVlcyBpbiBvcmlnaW5hbCBvcmRlci5cbiAqL1xuZnVuY3Rpb24gdW5pcXVuaXplKHZhbHVlcykge1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHZhbHVlcykpXG59XG4iXX0=
|