cdk-local-lambda 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/lib/cli/commands/local.js +8 -10
- package/lib/cli/docker/container.d.ts +5 -5
- package/lib/cli/docker/container.js +1 -1
- package/lib/cli/docker/types.d.ts +2 -2
- package/lib/cli/docker/types.js +1 -1
- package/lib/cli/runtime-api/types.d.ts +2 -2
- package/lib/cli/runtime-api/types.js +1 -1
- package/lib/shared/types.d.ts +1 -1
- package/lib/shared/types.js +1 -1
- package/package.json +2 -2
|
@@ -233,7 +233,9 @@ const startFunctionContainer = (fn, port, projectRoot, additionalEnv, invocation
|
|
|
233
233
|
yield* Effect.logInfo(`Starting container for ${fn.functionName} on port ${port}`);
|
|
234
234
|
// Use Effect.forkDaemon to run the container independently with context preserved
|
|
235
235
|
// Effect.scoped provides the scope needed by docker.run
|
|
236
|
-
const fiber = yield* docker
|
|
236
|
+
const fiber = yield* docker
|
|
237
|
+
.run(containerConfig)
|
|
238
|
+
.pipe(Effect.scoped, Effect.ignore, Effect.forkDaemon);
|
|
237
239
|
return fiber;
|
|
238
240
|
}).pipe(Effect.provide(DockerLive));
|
|
239
241
|
// Type guards for response types
|
|
@@ -747,7 +749,7 @@ const rebuildDockerContainer = (functionId, containersRef, projectRoot) => Effec
|
|
|
747
749
|
yield* Effect.logError(`Container for ${functionId} exited with code ${code}`);
|
|
748
750
|
yield* Effect.logError(`stderr: ${result.stderr}`);
|
|
749
751
|
}
|
|
750
|
-
})), Effect.
|
|
752
|
+
})), Effect.ignore, Effect.catchAll((error) => Effect.logError(`Container error for ${functionId}: ${error}`)), Effect.forkDaemon);
|
|
751
753
|
// Update the container state with the new fiber
|
|
752
754
|
container.containerFiber = newFiber;
|
|
753
755
|
// Wait a moment for the container to start and begin polling
|
|
@@ -871,7 +873,6 @@ const startCdkWatch = (options, scope) => Effect.gen(function* () {
|
|
|
871
873
|
// State tracking for deploy status messages
|
|
872
874
|
let isDeploying = false;
|
|
873
875
|
let isFirstDeploy = true;
|
|
874
|
-
let outputBuffer = "";
|
|
875
876
|
const discoveredStacks = new Set();
|
|
876
877
|
// Patterns to detect CDK watch behavior
|
|
877
878
|
const deployCompletePattern = /✅\s+\S+|Deployment time:/;
|
|
@@ -883,7 +884,6 @@ const startCdkWatch = (options, scope) => Effect.gen(function* () {
|
|
|
883
884
|
const outputStream = Stream.merge(proc.stdout, proc.stderr).pipe(Stream.decodeText(), Stream.splitLines);
|
|
884
885
|
// Fork stream processing in background
|
|
885
886
|
yield* outputStream.pipe(Stream.runForEach((line) => Effect.gen(function* () {
|
|
886
|
-
outputBuffer += line + "\n";
|
|
887
887
|
// Log all output at debug level
|
|
888
888
|
yield* Effect.logDebug(`[CDK] ${line}`);
|
|
889
889
|
// Try to extract stack name
|
|
@@ -907,13 +907,12 @@ const startCdkWatch = (options, scope) => Effect.gen(function* () {
|
|
|
907
907
|
}
|
|
908
908
|
// Detect errors - output immediately
|
|
909
909
|
if (errorPattern.test(line)) {
|
|
910
|
-
yield* Effect.sync(() => process.stderr.write(line
|
|
910
|
+
yield* Effect.sync(() => process.stderr.write(`${line}\n`));
|
|
911
911
|
}
|
|
912
912
|
// Check for deploy completion (only trigger once per deploy cycle)
|
|
913
913
|
if (isDeploying && deployCompletePattern.test(line)) {
|
|
914
914
|
isDeploying = false;
|
|
915
915
|
isFirstDeploy = false;
|
|
916
|
-
outputBuffer = "";
|
|
917
916
|
yield* Effect.logInfo("[CDK] Deploy complete");
|
|
918
917
|
// Small delay to ensure AWS has propagated the changes
|
|
919
918
|
yield* Effect.sleep("1 second");
|
|
@@ -922,7 +921,6 @@ const startCdkWatch = (options, scope) => Effect.gen(function* () {
|
|
|
922
921
|
// Check for no changes
|
|
923
922
|
if (noChangesPattern.test(line)) {
|
|
924
923
|
isDeploying = false;
|
|
925
|
-
outputBuffer = "";
|
|
926
924
|
}
|
|
927
925
|
})),
|
|
928
926
|
// Log errors and exit code when stream ends
|
|
@@ -977,8 +975,8 @@ export const localCommand = Command.make("local", {
|
|
|
977
975
|
// Bootstrap check must complete first
|
|
978
976
|
yield* ensureBootstrap({
|
|
979
977
|
qualifier,
|
|
980
|
-
profile: profileValue,
|
|
981
|
-
region: regionValue,
|
|
978
|
+
...(profileValue !== undefined && { profile: profileValue }),
|
|
979
|
+
...(regionValue !== undefined && { region: regionValue }),
|
|
982
980
|
});
|
|
983
981
|
// Stack filter - populated from CDK watch output, used to filter Lambda discovery
|
|
984
982
|
// Using object so closure in startOrUpdateDaemon sees updates
|
|
@@ -1169,4 +1167,4 @@ export const localCommand = Command.make("local", {
|
|
|
1169
1167
|
yield* Effect.never;
|
|
1170
1168
|
}).pipe(Effect.provide(Logger.pretty), Effect.provide(Logger.minimumLogLevel(logLevel)));
|
|
1171
1169
|
}).pipe(Command.withDescription("Start local Lambda development with CDK watch and Docker containers"));
|
|
1172
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2xvY2FsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBRUgsT0FBTyxFQUFxQixLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUM3RCxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ3hDLE9BQU8sRUFDTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLGVBQWUsR0FDaEIsTUFBTSx3QkFBd0IsQ0FBQTtBQUMvQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDcEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDOUMsT0FBTyxFQUVMLE9BQU8sSUFBSSxlQUFlLEdBQzNCLE1BQU0sa0JBQWtCLENBQUE7QUFFekIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ2pELE9BQU8sRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksRUFDSixLQUFLLEVBQ0wsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBQ0wsR0FBRyxFQUNILFFBQVEsRUFDUixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sUUFBUSxDQUFBO0FBQ2YsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBRWhCLHNCQUFzQixFQUN0QixlQUFlLEVBRWYsYUFBYSxHQUNkLE1BQU0sdUJBQXVCLENBQUE7QUFDOUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDeEQsT0FBTyxFQUNMLDRCQUE0QixFQUM1QixNQUFNLEVBQ04sVUFBVSxFQUNWLHlCQUF5QixHQUMxQixNQUFNLHdCQUF3QixDQUFBO0FBQy9CLE9BQU8sRUFFTCxtQkFBbUIsR0FDcEIsTUFBTSxzQkFBc0IsQ0FBQTtBQUM3QixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGVBQWUsRUFFZixxQkFBcUIsRUFDckIsZUFBZSxHQUNoQixNQUFNLDBCQUEwQixDQUFBO0FBcUJqQzs7OztHQUlHO0FBQ0gsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUEsQ0FBQywyQkFBMkI7QUF5RG5FOzs7R0FHRztBQUNILE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FDbEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDbEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDbkMsTUFBTSxRQUFRLEdBQUcsR0FBRyxhQUFhLElBQUksU0FBUyxFQUFFLENBQUE7SUFFaEQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUN0QyxHQUFHLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDZCxNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQ25DLElBQUksbUJBQW1CLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxRQUFRLFVBQVUsRUFBRSxDQUFDLENBQ3pELENBQUE7WUFDRCxPQUFPLFFBQVEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFBO1FBQ2xDLENBQUM7UUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSTtLQUNsQixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFcEQsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDcEIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFBO1FBQ3BFLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVELElBQUksTUFBTSxLQUFLLGlCQUFpQixFQUFFLENBQUM7UUFDakMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDbkIsMkNBQTJDLE1BQU0sY0FBYyxpQkFBaUIsRUFBRSxDQUNuRixDQUFBO1FBQ0QsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDLENBQUMsQ0FBQTtBQUVKOztHQUVHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsQ0FBQyxPQUE4QyxFQUFFLEVBQUUsQ0FDdEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDbEIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFBO0lBRTlELG1EQUFtRDtJQUNuRCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQzFDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUU5RCxNQUFNLElBQUksR0FBRztRQUNYLEtBQUs7UUFDTCxRQUFRO1FBQ1Isb0JBQW9CO1FBQ3BCLG9CQUFvQjtRQUNwQixPQUFPO1FBQ1AsT0FBTztRQUNQLE9BQU8sVUFBVSxFQUFFO0tBQ3BCLENBQUE7SUFFRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDekMsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUEyQjtRQUNsQyxHQUFHLE9BQU8sQ0FBQyxHQUFHO0tBQ1csQ0FBQTtJQUMzQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNuQixHQUFHLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUE7UUFDL0IsR0FBRyxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUE7SUFDekMsQ0FBQztJQUVELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRXZELE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUN2RCxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUN4QixlQUFlLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUNqQyxDQUFBO0lBRUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVsRCwyQkFBMkI7SUFDM0IsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ2hELE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFDbkIsTUFBTSxDQUFDLFVBQVUsRUFDakIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFBO0lBQ25DLENBQUMsQ0FBQyxDQUNILENBQ0YsQ0FBQTtJQUVELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUE7SUFDckMsSUFBSSxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkIsT0FBTyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN2QixJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsUUFBUSxFQUFFLENBQUMsQ0FDcEUsQ0FBQTtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxDQUFDLENBQUE7QUFDakUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUV4Qjs7O0dBR0c7QUFDSCxNQUFNLGVBQWUsR0FBRyxDQUFDLE9BSXhCLEVBQUUsRUFBRSxDQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ2xCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsNkNBQTZDLENBQUMsQ0FBQTtJQUVyRSxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7SUFFakUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDbkIsMERBQTBELENBQzNELENBQUE7UUFDRCxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7SUFDM0UsQ0FBQztTQUFNLENBQUM7UUFDTixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLHFDQUFxQyxDQUFDLENBQUE7SUFDL0QsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFBO0FBRUo7O0dBRUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQ2hELE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ2xCLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ25DLE1BQU0sUUFBUSxHQUFHLEdBQUcsYUFBYSxJQUFJLFNBQVMsRUFBRSxDQUFBO0lBRWhELE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FDaEMsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUNoQixHQUFHLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDZCxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQ2pDLElBQUksbUJBQW1CLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxRQUFRLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUN6RCxDQUFBO1lBQ0QsT0FBTyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUE7UUFDdEMsQ0FBQztRQUNELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ2YsSUFBSSxLQUFLLENBQUMsK0JBQStCLElBQUksS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztLQUNyRSxDQUFDLENBQUE7SUFFSixNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUE7SUFDckQsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtJQUU3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLENBQUE7QUFDM0MsQ0FBQyxDQUFDLENBQUE7QUFFSjs7R0FFRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsK0JBQStCLENBQUE7QUFFMUQ7OztHQUdHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFdBQXNCLEVBQUUsRUFBRSxDQUNuRCxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUNsQixNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUN6QyxNQUFNLFNBQVMsR0FBeUIsRUFBRSxDQUFBO0lBRTFDLHFCQUFxQjtJQUNyQixJQUFJLFVBQThCLENBQUE7SUFDbEMsR0FBRyxDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUM1QyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQ1IsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLG9CQUFvQixDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDckUsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDZixJQUFJLEtBQUssQ0FBQyw2QkFBNkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7U0FDMUQsQ0FBQyxDQUFBO1FBRUYsS0FBSyxNQUFNLEVBQUUsSUFBSSxZQUFZLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzlDLDZCQUE2QjtZQUM3QixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO2dCQUMxQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQ1IsWUFBWSxDQUFDLElBQUksQ0FDZixJQUFJLGVBQWUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FDbEQ7Z0JBQ0gsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLDBCQUEwQixFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDcEUsQ0FBQyxDQUFDLElBQUksQ0FDTCxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUNuQixNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQTRCLEVBQUUsQ0FBQyxDQUN2RCxDQUNGLENBQUE7WUFFRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtZQUVsQyw0REFBNEQ7WUFDNUQsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQztnQkFDMUQsb0NBQW9DO2dCQUNwQyxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUMxQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtvQkFDMUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQzt3QkFDbkQsU0FBUTtvQkFDVixDQUFDO2dCQUNILENBQUM7Z0JBRUQsNENBQTRDO2dCQUM1QyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUMsYUFBYSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQ3BELE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO29CQUNsRCxDQUFDLENBQUUsT0FBaUI7b0JBQ3BCLENBQUMsQ0FBRSxRQUFrQixDQUFBO2dCQUV2QixNQUFNLFVBQVUsR0FBdUI7b0JBQ3JDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBYTtvQkFDOUIsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFZO29CQUM1QixZQUFZLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUU7b0JBQ3pDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztvQkFDL0MsUUFBUSxFQUFFLEVBQUUsQ0FBQyxVQUFVLElBQUksR0FBRztvQkFDOUIsWUFBWTtpQkFDYixDQUFBO2dCQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDNUIsQ0FBQztRQUNILENBQUM7UUFFRCxVQUFVLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQTtJQUN0QyxDQUFDLFFBQVEsVUFBVSxFQUFDO0lBRXBCLE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUMsQ0FBQyxDQUFBO0FBRUo7Ozs7O0dBS0c7QUFDSCxNQUFNLHNCQUFzQixHQUFHLENBQzdCLEVBQXNCLEVBQ3RCLElBQVksRUFDWixXQUFtQixFQUNuQixhQUFxQyxFQUNyQyxrQkFBaUQsRUFLakQsRUFBRSxDQUNGLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ2xCLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMxQixPQUFPLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3ZCLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLFlBQVksNkJBQTZCLENBQUMsQ0FDcEUsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUE7SUFFNUIsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFBO0lBQ3BELE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxlQUFlO1FBQ2xELENBQUMsQ0FBQyxzQkFBc0I7UUFDeEIsQ0FBQyxDQUFDLGFBQWEsQ0FBQTtJQUVqQixpREFBaUQ7SUFDakQsTUFBTSxTQUFTLEdBQUcsZUFBZSxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQTtJQUU1RixvREFBb0Q7SUFDcEQsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFDdEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUI7UUFDdEIsQ0FBQyxDQUFDLEdBQUcsV0FBVyxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO0lBRTVDLHVDQUF1QztJQUN2QyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsWUFBWSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUE7SUFFNUUsNENBQTRDO0lBQzVDLEtBQUssQ0FBQyxDQUFDLE1BQU07U0FDVixLQUFLLENBQUM7UUFDTCxXQUFXO1FBQ1gsU0FBUztRQUNULFFBQVE7S0FDVCxDQUFDO1NBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUV0Qix5RUFBeUU7SUFDekUsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3hFLE1BQU0sZ0JBQWdCLEdBQUcsNEJBQTRCLENBQ25ELFdBQVcsQ0FBQyxVQUFVLEVBQ3RCLFdBQVcsQ0FBQyxHQUFHLENBQ2hCLENBQUE7SUFFRCxNQUFNLGVBQWUsR0FBRyx5QkFBeUIsQ0FBQztRQUNoRCxRQUFRLEVBQUUsU0FBUztRQUNuQixjQUFjO1FBQ2QsY0FBYyxFQUFFLElBQUk7UUFDcEIsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZO1FBQzdCLGVBQWUsRUFBRSxTQUFTO1FBQzFCLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUTtRQUNyQixjQUFjLEVBQUUsSUFBSSxFQUFFLHlDQUF5QztRQUMvRCxRQUFRO1FBQ1IsYUFBYTtRQUNiLGtCQUFrQjtLQUNuQixDQUFDLENBQUE7SUFFRiw2REFBNkQ7SUFDN0QsZUFBZSxDQUFDLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUE7SUFDeEQsZUFBZSxDQUFDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUE7SUFFbEQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDbkIsMEJBQTBCLEVBQUUsQ0FBQyxZQUFZLFlBQVksSUFBSSxFQUFFLENBQzVELENBQUE7SUFFRCxrRkFBa0Y7SUFDbEYsd0RBQXdEO0lBQ3hELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUNuRCxNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBaUIsQ0FBQyxFQUNuQyxNQUFNLENBQUMsVUFBVSxDQUNsQixDQUFBO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO0FBRXJDLGlDQUFpQztBQUNqQyxNQUFNLGdCQUFnQixHQUFHLENBQ3ZCLENBQWlELEVBQzVCLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLENBQUE7QUFFNUQsTUFBTSxhQUFhLEdBQUcsQ0FDcEIsQ0FBaUQsRUFDL0IsRUFBRSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksV0FBVyxJQUFJLENBQUMsQ0FBQTtBQUUzRCxNQUFNLGlCQUFpQixHQUFHLENBQ3hCLENBQWlELEVBQzNCLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxJQUFJLFdBQVcsSUFBSSxDQUFDLENBQUE7QUFFbEU7Ozs7R0FJRztBQUNILE1BQU0sY0FBYyxHQUFHLENBQ3JCLFNBQTRCLEVBQzVCLGFBQXNELEVBQ3RELGFBQXFCLEVBQ3dDLEVBQUUsQ0FDL0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDbEIsK0JBQStCO0lBQy9CLElBQUksU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzdCLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FDbkQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQ25DLENBQUE7UUFDRCxTQUFTLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQTtJQUNqQyxDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLE1BQU0sVUFBVSxHQUFvQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNuRSxRQUFRLENBQUM7UUFDUCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtRQUVuRCw2Q0FBNkM7UUFDN0MsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDbkIsbUNBQW1DLFNBQVMsQ0FBQyxFQUFFLENBQUMsWUFBWSxvQ0FBb0MsQ0FDakcsQ0FBQTtRQUVELHlEQUF5RDtRQUN6RCx5RUFBeUU7UUFDekUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFBO1FBQzVCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ2pELE1BQU0sQ0FBQyxNQUFNLEVBQ2IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQ25DLENBQUE7UUFFRCw2REFBNkQ7UUFDN0QsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ3ZELGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ25ELEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUE7SUFDbEQsQ0FBQyxDQUNGLENBQUMsSUFBSSxDQUNKLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQzFCLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUNsQyxNQUFNLENBQUMsVUFBVSxDQUNsQixDQUFBO0lBRUQsU0FBUyxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUE7QUFDdkMsQ0FBQyxDQUFDLENBQUE7QUFFSjs7OztHQUlHO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRyxDQUNoQyxTQUE0QixFQUM1QixhQUFzRCxFQUN0RCxhQUFxQixFQUNyQixNQUE0QyxFQUM1QyxrQkFBa0QsRUFDVyxFQUFFLENBQy9ELE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ2xCLE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBRTVFLG9EQUFvRDtJQUNwRCxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ1osTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUU3RCxJQUFJLFFBQXlCLENBQUE7UUFDN0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzdCLFFBQVEsR0FBRztnQkFDVCxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2dCQUMzQixNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUk7YUFDcEIsQ0FBQTtRQUNILENBQUM7YUFBTSxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2pDLFFBQVEsR0FBRztnQkFDVCxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2dCQUMzQixLQUFLLEVBQUU7b0JBQ0wsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO29CQUMzQixZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7b0JBQ2pDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtpQkFDOUI7YUFDRixDQUFBO1FBQ0gsQ0FBQzthQUFNLElBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQix1QkFBdUIsTUFBTSxDQUFDLFNBQVMsS0FBSyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQ2xFLENBQUE7WUFDRCxTQUFRO1FBQ1YsQ0FBQzthQUFNLENBQUM7WUFDTixTQUFRO1FBQ1YsQ0FBQztRQUVELGlDQUFpQztRQUNqQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUN4RCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLDZCQUE2QixRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUV6RSwrQkFBK0I7UUFDL0IsTUFBTSxHQUFHLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN0RCxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ1IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUE7WUFDekMsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQ1QsSUFBSSxHQUFHLENBQUMsR0FBRywrQkFBK0IsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssUUFBUSxDQUFDLEtBQUssQ0FBQyxZQUFZLEtBQUssVUFBVSxrQkFBa0IsQ0FDcEksQ0FBQTtZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsR0FBRyxDQUNULElBQUksR0FBRyxDQUFDLEdBQUcscUNBQXFDLFVBQVUsa0JBQWtCLENBQzdFLENBQUE7WUFDSCxDQUFDO1lBQ0Qsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUMvQyxDQUFDO1FBRUQsNEVBQTRFO1FBQzVFLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQ2hFLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQTtBQUVKOzs7O0dBSUc7QUFDSCxNQUFNLGlCQUFpQixHQUFHLENBQ3hCLEVBQXNCLEVBQ3RCLElBQVksRUFDWixXQUFtQixFQUNuQixHQUEyQixFQUMzQixrQkFBa0QsRUFDZCxFQUFFLENBQ3RDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ2xCLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDckIsT0FBTyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN2QixJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxZQUFZLDRCQUE0QixDQUFDLENBQ25FLENBQUE7SUFDSCxDQUFDO0lBRUQsMkRBQTJEO0lBQzNELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2pELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDMUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUNyQyxTQUFTLEVBQ1QsSUFBSSxFQUNKLGlCQUFpQixFQUNqQixtQkFBbUIsQ0FDcEIsQ0FBQTtJQUVELHVFQUF1RTtJQUN2RSxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDdkIsSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FDckQsQ0FBQTtJQUNILENBQUM7SUFFRCwyQ0FBMkM7SUFDM0MsNkVBQTZFO0lBQzdFLE1BQU0sU0FBUyxHQUFzQjtRQUNuQyxrRkFBa0Y7UUFDbEYsR0FBRyxHQUFHO1FBQ04saUVBQWlFO1FBQ2pFLHNCQUFzQixFQUFFLGFBQWEsSUFBSSxFQUFFO1FBQzNDLFFBQVEsRUFBRSxFQUFFLENBQUMsWUFBWTtRQUN6QixnQkFBZ0IsRUFBRSxXQUFXO1FBQzdCLGtDQUFrQztRQUNsQywrQkFBK0IsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQztLQUNyRCxDQUFBO0lBRUQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDcEIsdUNBQXVDLEVBQUUsQ0FBQyxZQUFZLFlBQVksSUFBSSxFQUFFLENBQ3pFLENBQUE7SUFDRCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQTtJQUU3RCw0RUFBNEU7SUFDNUUsZ0VBQWdFO0lBQ2hFLG9FQUFvRTtJQUNwRSxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFDLEVBQUU7UUFDcEUsR0FBRyxFQUFFLFdBQVc7UUFDaEIsR0FBRyxFQUFFLFNBQVM7UUFDZCxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztLQUNsQyxDQUFDLENBQUE7SUFFRiw0RUFBNEU7SUFDNUUscUZBQXFGO0lBQ3JGLE1BQU0sZ0JBQWdCLEdBQ3BCLGtFQUFrRSxDQUFBO0lBRXBFLG1EQUFtRDtJQUNuRCxNQUFNLFVBQVUsR0FBRyxDQUNqQixPQUFlLEVBQ3NCLEVBQUU7UUFDdkMsNERBQTREO1FBQzVELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN6QyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQzFCLE1BQU0sR0FBRyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUM3QyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLDBEQUEwRDtnQkFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7WUFDdEQsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUE7SUFDOUMsQ0FBQyxDQUFBO0lBRUQsc0RBQXNEO0lBQ3RELGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQVksRUFBRSxFQUFFO1FBQ2hELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDaEQsS0FBSyxNQUFNLE9BQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUM1QixNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDckMsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBWSxFQUFFLEVBQUU7UUFDaEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNoRCxLQUFLLE1BQU0sT0FBTyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzVCLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQy9DLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUN2QyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixhQUFhLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ2hDLE1BQU0sQ0FBQyxPQUFPLENBQ1osTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUNsRCxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLENBQ2pELENBQ0YsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsYUFBYSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNqQyxNQUFNLENBQUMsT0FBTyxDQUNaLE1BQU0sQ0FBQyxPQUFPLENBQUMsMkJBQTJCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUNwRCxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLENBQ2pELENBQ0YsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsT0FBTyxhQUFhLENBQUE7QUFDdEIsQ0FBQyxDQUFDLENBQUE7QUFFSjs7R0FFRztBQUNILE1BQU0sc0JBQXNCLEdBQUcsQ0FDN0IsTUFBb0IsRUFDcEIsTUFBNEMsRUFDNUMsa0JBQWtELEVBQ2xELEVBQUUsQ0FDRixNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUNsQixNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUV6RSxpREFBaUQ7SUFDakQsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFMUQsSUFBSSxRQUF5QixDQUFBO1FBQzdCLElBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM3QixRQUFRLEdBQUc7Z0JBQ1QsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztnQkFDM0IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2FBQ3BCLENBQUE7UUFDSCxDQUFDO2FBQU0sSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxRQUFRLEdBQUc7Z0JBQ1QsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztnQkFDM0IsS0FBSyxFQUFFO29CQUNMLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztvQkFDM0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO29CQUNqQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7aUJBQzlCO2FBQ0YsQ0FBQTtRQUNILENBQUM7YUFBTSxJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDckMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDcEIsOEJBQThCLE1BQU0sQ0FBQyxTQUFTLEtBQUssTUFBTSxDQUFDLFlBQVksRUFBRSxDQUN6RSxDQUFBO1lBQ0QsU0FBUTtRQUNWLENBQUM7YUFBTSxDQUFDO1lBQ04sU0FBUTtRQUNWLENBQUM7UUFFRCxpQ0FBaUM7UUFDakMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDeEQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7UUFFekUsK0JBQStCO1FBQy9CLE1BQU0sR0FBRyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDdEQsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFBO1lBQ3pDLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuQixPQUFPLENBQUMsR0FBRyxDQUNULElBQUksR0FBRyxDQUFDLEdBQUcsK0JBQStCLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUMsWUFBWSxLQUFLLFVBQVUsa0JBQWtCLENBQ3BJLENBQUE7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLEdBQUcsQ0FDVCxJQUFJLEdBQUcsQ0FBQyxHQUFHLHFDQUFxQyxVQUFVLGtCQUFrQixDQUM3RSxDQUFBO1lBQ0gsQ0FBQztZQUNELGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDL0MsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQTtBQUVKOzs7R0FHRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUE7QUFFbEU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLDBCQUEwQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3pDLG1CQUFtQjtJQUNuQix1QkFBdUI7SUFDdkIsbUJBQW1CO0NBQ3BCLENBQUMsQ0FBQTtBQUVGOztHQUVHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRyxDQUM1QixHQUEyQixFQUNILEVBQUU7SUFDMUIsTUFBTSxNQUFNLEdBQTJCLEVBQUUsQ0FBQTtJQUN6QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFBO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDLENBQUE7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLEdBQUcsQ0FDakIsTUFBOEIsRUFDOUIsTUFBOEIsRUFDdEIsRUFBRTtJQUNWLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQTtJQUU1QixtQ0FBbUM7SUFDbkMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdEMsSUFBSSwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQUUsU0FBUTtRQUNqRCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUN6QixDQUFDO2FBQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCx5QkFBeUI7SUFDekIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdEMsSUFBSSwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQUUsU0FBUTtRQUNqRCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUMzQixDQUFDLENBQUE7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxDQUMxQixFQUFzQixFQUN0QixhQUFxQyxFQUNyQyxVQUE4QyxFQUM5QyxXQUF3QixFQUN4QixXQUFtQixFQUNuQixhQUFtRCxFQUNuRCxrQkFBa0QsRUFDZCxFQUFFLENBQ3RDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ2xCLGlDQUFpQztJQUNqQyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ2pELE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQ3BELElBQUksUUFBUSxFQUFFLENBQUM7UUFDYiw0REFBNEQ7UUFDNUQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDdkQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQ25CLG1DQUFtQyxFQUFFLENBQUMsWUFBWSwyQkFBMkIsT0FBTyxHQUFHLENBQ3hGLENBQUE7WUFDRCxzQkFBc0I7WUFDdEIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDbEUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQ25DLENBQUE7WUFDRCwrQ0FBK0M7WUFDL0MsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDdEMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUE7UUFDNUMsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLFFBQVEsQ0FBQTtRQUNqQixDQUFDO0lBQ0gsQ0FBQztJQUVELHlDQUF5QztJQUN6QyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQiwyREFBMkQsRUFBRSxDQUFDLFlBQVksS0FBSyxDQUNoRixDQUFBO0lBRUQsOENBQThDO0lBQzlDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLHFCQUFxQixDQUFDO1FBQ2pFLGdCQUFnQixFQUFFO1lBQ2hCLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWTtZQUM3QixlQUFlLEVBQUUsU0FBUztZQUMxQixPQUFPLEVBQUUsRUFBRSxDQUFDLFlBQVk7U0FDekI7S0FDRixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFBO0lBRXhELDZFQUE2RTtJQUM3RSx3RUFBd0U7SUFDeEUsTUFBTSxNQUFNLEdBQWlCO1FBQzNCLEVBQUU7UUFDRixZQUFZO1FBQ1osSUFBSTtRQUNKLGFBQWEsRUFBRSxTQUFvQyxFQUFFLHNCQUFzQjtRQUMzRSxHQUFHLEVBQUUsYUFBYTtLQUNuQixDQUFBO0lBRUQsb0RBQW9EO0lBQ3BELGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUMzQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQTtJQUUxQyx3REFBd0Q7SUFDeEQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLENBQUMsaUJBQWlCLENBQzVDLEVBQUUsRUFDRixJQUFJLEVBQ0osV0FBVyxFQUNYLGFBQWEsRUFDYixrQkFBa0IsQ0FDbkIsQ0FBQyxJQUFJLENBQ0osTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ2xCLDJDQUEyQztRQUMzQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQixzQ0FBc0MsRUFBRSxDQUFDLFlBQVksS0FBSyxLQUFLLEVBQUUsQ0FDbEUsQ0FBQTtRQUNELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDMUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDL0IsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDbkMsT0FBTyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2xDLENBQUMsQ0FBQyxDQUNILENBQ0YsQ0FBQTtJQUVELGlDQUFpQztJQUNqQyxNQUFNLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtJQUVwQywrQ0FBK0M7SUFDL0MsTUFBTSxDQUFDLE9BQU8sQ0FDWixzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixDQUFDLENBQ2xFLENBQUE7SUFFRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMsQ0FBQyxDQUFBO0FBRUo7Ozs7O0dBS0c7QUFDSCxNQUFNLHNCQUFzQixHQUFHLENBQzdCLEVBQXNCLEVBQ3RCLGFBQXFDLEVBQ3JDLGFBQXNELEVBQ3RELFdBQXdCLEVBQ3hCLFdBQW1CLEVBQ25CLGFBQXFCLEVBQ3JCLGFBQXFCLEVBQ3JCLGFBQW1ELEVBQ25ELGtCQUFrRCxFQUN3QixFQUFFLENBQzVFLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ2xCLG9DQUFvQztJQUNwQyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDdkQsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUN2RCxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsNERBQTREO1FBQzVELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBQ3ZELElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixtRUFBbUU7WUFDbkUsa0VBQWtFO1lBQ2xFLGdDQUFnQztZQUNoQyxRQUFRLENBQUMsR0FBRyxHQUFHLGFBQWEsQ0FBQTtZQUU1QiwyRUFBMkU7WUFDM0UsbUVBQW1FO1lBQ25FLElBQUksUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUMxQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQiw4REFBOEQsRUFBRSxDQUFDLFlBQVksdUJBQXVCLENBQ3JHLENBQUE7Z0JBQ0QsT0FBTyxRQUFRLENBQUE7WUFDakIsQ0FBQztZQUVELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQ25CLG1DQUFtQyxFQUFFLENBQUMsWUFBWSw4QkFBOEIsT0FBTyxHQUFHLENBQzNGLENBQUE7WUFDRCxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQTtZQUU1QixvREFBb0Q7WUFDcEQscURBQXFEO1lBQ3JELHNFQUFzRTtZQUN0RSxpREFBaUQ7WUFDakQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7Z0JBQ3pCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQTtnQkFDNUIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDbkUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNMLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQzFCLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUN4QixNQUFNLENBQUMsUUFBUSxDQUNiLDhEQUE4RCxLQUFLLEVBQUUsQ0FDdEUsQ0FDRixDQUNGLENBQUE7WUFFRCwrRUFBK0U7WUFDL0UsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUNsRCxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FDbkMsQ0FBQTtZQUVELDBFQUEwRTtZQUMxRSxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxzQkFBc0IsQ0FDNUMsRUFBRSxFQUNGLFFBQVEsQ0FBQyxJQUFJLEVBQ2IsV0FBVyxFQUNYLGFBQWEsRUFDYixrQkFBa0IsQ0FDbkIsQ0FBQyxJQUFJLENBQ0osTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUNsQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQiwyQ0FBMkMsRUFBRSxDQUFDLFlBQVksS0FBSyxLQUFLLEVBQUUsQ0FDdkUsQ0FBQTtnQkFDRCxRQUFRLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQTtnQkFDN0IsT0FBTyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2xDLENBQUMsQ0FBQyxDQUNILENBQ0YsQ0FBQTtZQUVELGtDQUFrQztZQUNsQyxRQUFRLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQTtZQUNsQyxRQUFRLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQTtZQUU3QixPQUFPLFFBQVEsQ0FBQTtRQUNqQixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sUUFBUSxDQUFBO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0lBRUQsNENBQTRDO0lBQzVDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQ25CLHNEQUFzRCxFQUFFLENBQUMsWUFBWSxLQUFLLENBQzNFLENBQUE7SUFFRCw4Q0FBOEM7SUFDOUMsaUZBQWlGO0lBQ2pGLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLHFCQUFxQixDQUFDO1FBQ2pFLGFBQWE7UUFDYixnQkFBZ0IsRUFBRTtZQUNoQixZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVk7WUFDN0IsZUFBZSxFQUFFLFNBQVM7WUFDMUIsT0FBTyxFQUFFLGVBQWU7U0FDekI7S0FDRixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFBO0lBRXhELHlDQUF5QztJQUN6QyxNQUFNLGFBQWEsR0FBRyxVQUFVLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFBO0lBQy9FLE1BQU0sU0FBUyxHQUFHLGVBQWUsRUFBRSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUE7SUFFNUYsOEVBQThFO0lBQzlFLDJFQUEyRTtJQUMzRSxNQUFNLFNBQVMsR0FBc0I7UUFDbkMsRUFBRTtRQUNGLFlBQVk7UUFDWixJQUFJO1FBQ0osY0FBYyxFQUFFLFNBQXVELEVBQUUsc0JBQXNCO1FBQy9GLGFBQWE7UUFDYixTQUFTO1FBQ1QsWUFBWSxFQUFFLEtBQUs7UUFDbkIsZ0JBQWdCLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDM0IsY0FBYyxFQUFFLElBQUk7UUFDcEIsR0FBRyxFQUFFLGFBQWE7S0FDbkIsQ0FBQTtJQUVELG9EQUFvRDtJQUNwRCxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUNqRCxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO0lBRWhELDZEQUE2RDtJQUM3RCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsQ0FBQyxzQkFBc0IsQ0FDbEQsRUFBRSxFQUNGLElBQUksRUFDSixXQUFXLEVBQ1gsYUFBYSxFQUNiLGtCQUFrQixDQUNuQixDQUFDLElBQUksQ0FDSixNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDbEIsOENBQThDO1FBQzlDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ3BCLHlDQUF5QyxFQUFFLENBQUMsWUFBWSxLQUFLLEtBQUssRUFBRSxDQUNyRSxDQUFBO1FBQ0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUM3QyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUMvQixLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUN0QyxPQUFPLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDbEMsQ0FBQyxDQUFDLENBQ0gsQ0FDRixDQUFBO0lBRUQsa0NBQWtDO0lBQ2xDLFNBQVMsQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFBO0lBRXpDLGdFQUFnRTtJQUNoRSxLQUFLLENBQUMsQ0FBQyx5QkFBeUIsQ0FDOUIsU0FBUyxFQUNULGFBQWEsRUFDYixhQUFhLEVBQ2IsYUFBYSxFQUNiLGtCQUFrQixDQUNuQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUE7SUFFekIsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQyxDQUFDLENBQUE7QUFFSjs7O0dBR0c7QUFDSCxNQUFNLHNCQUFzQixHQUFHLENBQzdCLFVBQWtCLEVBQ2xCLGFBQXNELEVBQ3RELFdBQW1CLEVBQzBDLEVBQUUsQ0FDL0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDbEIsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUNoRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRTVDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQ25CLDBCQUEwQixVQUFVLHdCQUF3QixDQUM3RCxDQUFBO1FBQ0QsT0FBTTtJQUNSLENBQUM7SUFFRCxrRUFBa0U7SUFDbEUsU0FBUyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUE7SUFFN0IsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxvQ0FBb0MsVUFBVSxLQUFLLENBQUMsQ0FBQTtJQUUzRSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUE7SUFFNUIsbURBQW1EO0lBQ25ELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUE7SUFDM0MsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDbkIsZ0RBQWdELFdBQVcsRUFBRSxDQUM5RCxDQUFBO0lBRUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQ3BELE1BQU0sQ0FBQyxNQUFNLEVBQ2IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ2xCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsbUNBQW1DLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDakUsT0FBTyxDQUFDLENBQUE7SUFDVixDQUFDLENBQUMsQ0FDSCxDQUNGLENBQUE7SUFDRCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixTQUFTLGVBQWUsQ0FBQyxDQUFBO0lBRW5FLDJCQUEyQjtJQUMzQixNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFBO0lBQ3ZCLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxFQUFFLENBQUMsaUJBQWlCO1FBQ3RCLENBQUMsQ0FBQyxHQUFHLFdBQVcsSUFBSSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtJQUU1Qyx1Q0FBdUM7SUFDdkMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLFlBQVksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFBO0lBRTVFLDJCQUEyQjtJQUMzQixLQUFLLENBQUMsQ0FBQyxNQUFNO1NBQ1YsS0FBSyxDQUFDO1FBQ0wsV0FBVztRQUNYLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUztRQUM5QixRQUFRO0tBQ1QsQ0FBQztTQUNELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFdEIseUVBQXlFO0lBQ3pFLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU07U0FDOUIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7U0FDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN0QixNQUFNLGdCQUFnQixHQUFHLDRCQUE0QixDQUNuRCxXQUFXLENBQUMsVUFBVSxFQUN0QixXQUFXLENBQUMsR0FBRyxDQUNoQixDQUFBO0lBRUQsd0RBQXdEO0lBQ3hELG9FQUFvRTtJQUNwRSw2QkFBNkI7SUFDN0IsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFBO0lBQ3BELE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxlQUFlO1FBQ2xELENBQUMsQ0FBQyxzQkFBc0I7UUFDeEIsQ0FBQyxDQUFDLGFBQWEsQ0FBQTtJQUVqQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNuQix3REFBd0QsY0FBYyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FDM0YsQ0FBQTtJQUVELE1BQU0sZUFBZSxHQUFHLHlCQUF5QixDQUFDO1FBQ2hELFFBQVEsRUFBRSxTQUFTLENBQUMsU0FBUztRQUM3QixjQUFjO1FBQ2QsY0FBYyxFQUFFLFNBQVMsQ0FBQyxJQUFJO1FBQzlCLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWTtRQUM3QixlQUFlLEVBQUUsU0FBUztRQUMxQixRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVE7UUFDckIsY0FBYyxFQUFFLElBQUk7UUFDcEIsUUFBUTtLQUNULENBQUMsQ0FBQTtJQUVGLDZEQUE2RDtJQUM3RCxlQUFlLENBQUMsVUFBVSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQTtJQUN4RCxlQUFlLENBQUMsT0FBTyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQTtJQUVsRCwwQkFBMEI7SUFDMUIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDcEIsc0NBQXNDLFVBQVUsS0FBSyxDQUN0RCxDQUFBO0lBRUQsMkRBQTJEO0lBQzNELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUN0RCxNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUNsQixpRUFBaUU7UUFDakUsdUNBQXVDO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUE7UUFDNUIsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQy9DLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ3BCLGlCQUFpQixVQUFVLHFCQUFxQixJQUFJLEVBQUUsQ0FDdkQsQ0FBQTtZQUNELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUNwRCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQ0gsRUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQWlCLENBQUMsRUFDbkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3hCLE1BQU0sQ0FBQyxRQUFRLENBQUMsdUJBQXVCLFVBQVUsS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUMvRCxFQUNELE1BQU0sQ0FBQyxVQUFVLENBQ2xCLENBQUE7SUFFRCxnREFBZ0Q7SUFDaEQsU0FBUyxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUE7SUFFbkMsNkRBQTZEO0lBQzdELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUE7SUFFaEMsU0FBUyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUE7SUFDOUIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQ0FBaUMsVUFBVSxFQUFFLENBQUMsQ0FBQTtBQUN2RSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO0FBRXJDOzs7O0dBSUc7QUFDSCxNQUFNLHNCQUFzQixHQUFHLENBQzdCLEVBQXNCLEVBQ3RCLFVBQTZCLEVBQzdCLGFBQXNELEVBQ3RELFdBQXdCLEVBQ3hCLFdBQW1CLEVBQ25CLGFBQXFCLEVBQ3JCLGFBQXFCLEVBQ3JCLGFBQW1ELEVBQ25ELGlCQUFrQyxFQUNsQyxrQkFBa0QsRUFDVyxFQUFFLENBQy9ELE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ2xCLGlFQUFpRTtJQUNqRSx3RUFBd0U7SUFDeEUsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsc0JBQXNCLENBQzdDLEVBQUUsRUFDRixxQkFBcUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUMzQyxhQUFhLEVBQ2IsV0FBVyxFQUNYLFdBQVcsRUFDWCxhQUFhLEVBQ2IsYUFBYSxFQUNiLGFBQWEsRUFDYixrQkFBa0IsQ0FDbkIsQ0FBQTtJQUVELHlEQUF5RDtJQUN6RCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUMzQyxpQkFBaUIsRUFDakIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQ2IsQ0FBQTtJQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQTtJQUM1QixrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRTtRQUMzQyxHQUFHLEVBQUUsYUFBYTtRQUNsQixLQUFLLEVBQUUsU0FBUztRQUNoQixFQUFFLEVBQUUsRUFBRSxDQUFDLFlBQVk7UUFDbkIsUUFBUSxFQUFFLElBQUk7S0FDZixDQUFDLENBQUE7SUFFRixxQkFBcUI7SUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FDVCxNQUFNLGFBQWEsaUNBQWlDLEVBQUUsQ0FBQyxZQUFZLGVBQWUsQ0FDbkYsQ0FBQTtJQUVELGtDQUFrQztJQUNsQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQiwrQkFBK0IsVUFBVSxDQUFDLFNBQVMsUUFBUSxFQUFFLENBQUMsWUFBWSw0REFBNEQsQ0FDdkksQ0FBQTtJQUNILENBQUM7U0FBTSxDQUFDO1FBQ04sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDcEIsK0JBQStCLFVBQVUsQ0FBQyxTQUFTLFFBQVEsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUM3RSxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sZ0JBQWdCLEdBQXFCO1FBQ3pDLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztRQUMvQixLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7UUFDdkIsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0I7UUFDekQsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLHdCQUF3QjtRQUNwRSxZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVk7UUFDN0IsZUFBZSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsZUFBZTtRQUNuRCxhQUFhLEVBQUUsRUFBRSxDQUFDLFFBQVE7UUFDMUIsWUFBWSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWTtRQUM3QyxhQUFhLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxhQUFhO0tBQ2hELENBQUE7SUFFRCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQiwyQ0FBMkMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUM1RCxDQUFBO0lBQ0QsMEVBQTBFO0lBQzFFLEtBQUssQ0FBQyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtJQUN2RSxLQUFLLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO0lBQ2hFLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsd0NBQXdDLENBQUMsQ0FBQTtBQUNsRSxDQUFDLENBQUMsQ0FBQTtBQUVKOzs7R0FHRztBQUNILE1BQU0sc0JBQXNCLEdBQUcsQ0FDN0IsRUFBc0IsRUFDdEIsVUFBNkIsRUFDN0IsVUFBOEMsRUFDOUMsV0FBd0IsRUFDeEIsV0FBbUIsRUFDbkIsYUFBbUQsRUFDbkQsaUJBQWtDLEVBQ2xDLGtCQUFrRCxFQUN0QixFQUFFLENBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ2xCLDhEQUE4RDtJQUM5RCxNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBRWpFLDhEQUE4RDtJQUM5RCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxtQkFBbUIsQ0FDdkMsRUFBRSxFQUNGLGFBQWEsRUFDYixVQUFVLEVBQ1YsV0FBVyxFQUNYLFdBQVcsRUFDWCxhQUFhLEVBQ2Isa0JBQWtCLENBQ25CLENBQUE7SUFFRCx5REFBeUQ7SUFDekQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FDM0MsaUJBQWlCLEVBQ2pCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUNiLENBQUE7SUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7SUFDNUIsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUU7UUFDM0MsR0FBRyxFQUFFLGFBQWE7UUFDbEIsS0FBSyxFQUFFLFNBQVM7UUFDaEIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxZQUFZO1FBQ25CLFFBQVEsRUFBRSxLQUFLO0tBQ2hCLENBQUMsQ0FBQTtJQUVGLHFCQUFxQjtJQUNyQixPQUFPLENBQUMsR0FBRyxDQUNULE1BQU0sYUFBYSx3QkFBd0IsRUFBRSxDQUFDLFlBQVksZUFBZSxDQUMxRSxDQUFBO0lBRUQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDcEIsK0JBQStCLFVBQVUsQ0FBQyxTQUFTLFFBQVEsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUM3RSxDQUFBO0lBRUQsTUFBTSxnQkFBZ0IsR0FBcUI7UUFDekMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTO1FBQy9CLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztRQUN2QixrQkFBa0IsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLGtCQUFrQjtRQUN6RCxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsd0JBQXdCO1FBQ3BFLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWTtRQUM3QixlQUFlLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlO1FBQ25ELGFBQWEsRUFBRSxFQUFFLENBQUMsUUFBUTtRQUMxQixZQUFZLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxZQUFZO1FBQzdDLGFBQWEsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLGFBQWE7S0FDaEQsQ0FBQTtJQUVELEtBQUssQ0FBQyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUE7QUFDL0QsQ0FBQyxDQUFDLENBQUE7QUFTSjs7O0dBR0c7QUFDSCxNQUFNLGFBQWEsR0FBRyxDQUNwQixPQUtDLEVBQ0QsS0FBa0IsRUFLbEIsRUFBRSxDQUNGLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ2xCLE1BQU0sSUFBSSxHQUFHO1FBQ1gsS0FBSztRQUNMLE9BQU87UUFDUCxvQkFBb0I7UUFDcEIsV0FBVztRQUNYLGlCQUFpQjtLQUNsQixDQUFBO0lBRUQsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDOUIsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDcEIsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQTJCO1FBQ2xDLEdBQUcsT0FBTyxDQUFDLEdBQUc7UUFDZCxRQUFRLEVBQUUsTUFBTTtLQUNTLENBQUE7SUFFM0IsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkIsR0FBRyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFBO1FBQy9CLEdBQUcsQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFBO0lBQ3pDLENBQUM7SUFFRCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUV6RCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FDdkQsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFDeEIsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFDaEMsZUFBZSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FDakMsQ0FBQTtJQUVELDZEQUE2RDtJQUM3RCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFFNUUsMENBQTBDO0lBQzFDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQWlCLENBQUE7SUFFdEQsNENBQTRDO0lBQzVDLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQTtJQUN2QixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUE7SUFDeEIsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFBO0lBQ3JCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQTtJQUUxQyx3Q0FBd0M7SUFDeEMsTUFBTSxxQkFBcUIsR0FBRywwQkFBMEIsQ0FBQTtJQUN4RCxNQUFNLGtCQUFrQixHQUFHLHlDQUF5QyxDQUFBO0lBQ3BFLE1BQU0sZ0JBQWdCLEdBQUcsa0NBQWtDLENBQUE7SUFDM0QsTUFBTSxZQUFZLEdBQUcsaUNBQWlDLENBQUE7SUFDdEQsTUFBTSxnQkFBZ0IsR0FBRywrQkFBK0IsQ0FBQTtJQUV4RCw0REFBNEQ7SUFDNUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQzlELE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFDbkIsTUFBTSxDQUFDLFVBQVUsQ0FDbEIsQ0FBQTtJQUVELHVDQUF1QztJQUN2QyxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUN0QixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDbEIsWUFBWSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUE7UUFFM0IsZ0NBQWdDO1FBQ2hDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBRXZDLDRCQUE0QjtRQUM1QixNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFDaEQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDdEMsSUFBSSxTQUFTLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDbEQsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO2dCQUMvQixLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtvQkFDekIsSUFBSSxFQUFFLGlCQUFpQjtvQkFDdkIsU0FBUztpQkFDVixDQUFDLENBQUE7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixJQUFJLENBQUMsV0FBVyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xELFdBQVcsR0FBRyxJQUFJLENBQUE7WUFDbEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNuQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUE7WUFDN0MsQ0FBQztRQUNILENBQUM7UUFFRCxxQ0FBcUM7UUFDckMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDNUIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUM3RCxDQUFDO1FBRUQsbUVBQW1FO1FBQ25FLElBQUksV0FBVyxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BELFdBQVcsR0FBRyxLQUFLLENBQUE7WUFDbkIsYUFBYSxHQUFHLEtBQUssQ0FBQTtZQUNyQixZQUFZLEdBQUcsRUFBRSxDQUFBO1lBQ2pCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtZQUM5Qyx1REFBdUQ7WUFDdkQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUMvQixLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUE7UUFDeEQsQ0FBQztRQUVELHVCQUF1QjtRQUN2QixJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2hDLFdBQVcsR0FBRyxLQUFLLENBQUE7WUFDbkIsWUFBWSxHQUFHLEVBQUUsQ0FBQTtRQUNuQixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQ0g7SUFDRCw0Q0FBNEM7SUFDNUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3hCLE1BQU0sQ0FBQyxRQUFRLENBQUMsMEJBQTBCLEtBQUssRUFBRSxDQUFDLENBQ25ELEVBQ0QsTUFBTSxDQUFDLFFBQVEsQ0FDYixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDaEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ3RCLElBQUksS0FBSyxDQUFDO1FBQ1IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsb0NBQW9DLElBQUksRUFBRSxDQUFDO1FBQzdELENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxJQUFJLEVBQUUsQ0FBQyxDQUNoRSxFQUNELE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUNuQyxDQUNGLEVBQ0QsTUFBTSxDQUFDLElBQUksQ0FDWixDQUFBO0lBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUE7QUFDbEMsQ0FBQyxDQUFDLENBQUE7QUFFSjs7R0FFRztBQUNILE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUNoRCxPQUFPLENBQUMsUUFBUSxFQUNoQixPQUFPLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLENBQzlDLENBQUE7QUFFRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FDOUMsT0FBTyxDQUFDLFFBQVEsRUFDaEIsT0FBTyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FDdEMsQ0FBQTtBQUVELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUNwRCxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxFQUNoQyxPQUFPLENBQUMsZUFBZSxDQUFDLHlCQUF5QixDQUFDLENBQ25ELENBQUE7QUFFRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FDOUMsT0FBTyxDQUFDLFFBQVEsRUFDaEIsT0FBTyxDQUFDLGVBQWUsQ0FDckIsdURBQXVELENBQ3hELENBQ0YsQ0FBQTtBQUVELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUNqRCxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUMxQixPQUFPLENBQUMsZUFBZSxDQUFDLDJDQUEyQyxDQUFDLENBQ3JFLENBQUE7QUFFRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDL0MsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFDMUIsT0FBTyxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUNoRCxDQUFBO0FBRUQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FDNUQsT0FBTyxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxFQUM1QyxPQUFPLENBQUMsZUFBZSxDQUNyQixpRUFBaUUsQ0FDbEUsQ0FDRixDQUFBO0FBRUQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FDNUQsT0FBTyxDQUFDLFFBQVEsRUFDaEIsT0FBTyxDQUFDLGVBQWUsQ0FDckIsc0dBQXNHLENBQ3ZHLENBQ0YsQ0FBQTtBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQ3RDLE9BQU8sRUFDUDtJQUNFLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLFNBQVMsRUFBRSxlQUFlO0lBQzFCLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLEdBQUcsRUFBRSxlQUFlO0lBQ3BCLEtBQUssRUFBRSxXQUFXO0lBQ2xCLFdBQVcsRUFBRSxpQkFBaUI7SUFDOUIsV0FBVyxFQUFFLGlCQUFpQjtDQUMvQixFQUNELENBQUMsRUFDQyxPQUFPLEVBQ1AsTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLEVBQ04sR0FBRyxFQUNILEtBQUssRUFDTCxXQUFXLEVBQ1gsV0FBVyxHQUNaLEVBQUUsRUFBRTtJQUNILE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQTtJQUN2RCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsOENBQThDLENBQUMsQ0FBQTtRQUVyRSxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBQ3hFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7UUFDckUsTUFBTSxnQkFBZ0IsR0FDcEIsTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNO1lBQ3BCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5QyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBRWYsZ0ZBQWdGO1FBQ2hGLGtFQUFrRTtRQUNsRSxNQUFNLG9CQUFvQixHQUN4QixXQUFXLENBQUMsSUFBSSxLQUFLLE1BQU07WUFDekIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLO1lBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUEsQ0FBQyxxQkFBcUI7UUFFakUsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUE7UUFDeEMsQ0FBQztRQUNELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFBO1FBQ3RDLENBQUM7UUFFRCxzQ0FBc0M7UUFDdEMsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDO1lBQ3JCLFNBQVM7WUFDVCxPQUFPLEVBQUUsWUFBWTtZQUNyQixNQUFNLEVBQUUsV0FBVztTQUNwQixDQUFDLENBQUE7UUFFRixrRkFBa0Y7UUFDbEYsOERBQThEO1FBQzlELE1BQU0sV0FBVyxHQUFHLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixJQUFLLEVBQWUsRUFBRSxDQUFBO1FBRXBFLDhFQUE4RTtRQUM5RSx3RUFBd0U7UUFDeEUsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO1FBRXZDLDhDQUE4QztRQUM5QyxpRkFBaUY7UUFDakYsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBRTNDLE1BQU0sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FDbkQsS0FBSyxDQUFDLENBQUMsYUFBYSxDQUNsQjtZQUNFLE9BQU8sRUFBRSxZQUFZO1lBQ3JCLE1BQU0sRUFBRSxXQUFXO1lBQ25CLE1BQU0sRUFBRSxnQkFBZ0I7WUFDeEIsR0FBRztTQUNKLEVBQ0QsV0FBVyxDQUNaLENBQUE7UUFFSCxtREFBbUQ7UUFDbkQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FDaEMsSUFBSSxHQUFHLEVBQUUsQ0FDVixDQUFBO1FBRUQsaURBQWlEO1FBQ2pELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQTRCLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUVyRSxpRUFBaUU7UUFDakUsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUV6QyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFFWixtREFBbUQ7UUFDbkQsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFBO1FBRWhELGtEQUFrRDtRQUNsRCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQVMsQ0FBQyxDQUFDLENBQUE7UUFDcEQsc0ZBQXNGO1FBQ3RGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQTZCLENBQUE7UUFFL0Qsc0VBQXNFO1FBQ3RFLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUVqQyxJQUFJLGFBQWEsR0FBZ0QsSUFBSSxDQUFBO1FBRXJFLCtEQUErRDtRQUMvRCxNQUFNLFFBQVEsR0FBRyxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsQ0FBQTtRQUV2RSxnRUFBZ0U7UUFDaEUsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUM5QyxvREFBb0Q7WUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNoQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtDQUFrQyxDQUFDLENBQUE7WUFDM0QsQ0FBQztZQUVELDREQUE0RDtZQUM1RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ25CLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ3BCLCtDQUErQyxDQUNoRCxDQUFBO2dCQUNELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FDMUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUNwRSxDQUFBO2dCQUNELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ3BCLDBCQUEwQixTQUFTLENBQUMsWUFBWSxFQUFFLENBQ25ELENBQUE7Z0JBQ0QsYUFBYSxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzlDLENBQUM7WUFFRCw4REFBOEQ7WUFDOUQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFBO1lBQ2pFLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUU5RCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQ25CLHFJQUFxSSxDQUN0SSxDQUFBO2dCQUNELE9BQU07WUFDUixDQUFDO1lBRUQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUE7WUFFN0Qsb0NBQW9DO1lBQ3BDLE1BQU0sWUFBWSxHQUdiLEVBQUUsQ0FBQTtZQUVQLEtBQUssTUFBTSxFQUFFLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtnQkFDOUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtnQkFFdEQsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUMzQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQixvQkFBb0IsRUFBRSxDQUFDLFlBQVksdUNBQXVDLENBQzNFLENBQUE7b0JBQ0QsU0FBUTtnQkFDVixDQUFDO2dCQUVELElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUMzQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQiw0QkFBNEIsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUM5QyxDQUFBO29CQUNELFNBQVE7Z0JBQ1YsQ0FBQztnQkFFRCxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7WUFDckMsQ0FBQztZQUVELHdDQUF3QztZQUN4QyxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sT0FBTyxHQUFHLFlBQVk7cUJBQ3pCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7b0JBQ3hCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7b0JBQ3pDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQzt3QkFDN0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxZQUFZO3dCQUNoRSxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQTtvQkFDbkIsT0FBTyxHQUFHLFNBQVMsS0FBSyxJQUFJLEdBQUcsQ0FBQTtnQkFDakMsQ0FBQyxDQUFDO3FCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDYiwwREFBMEQ7Z0JBQzFELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxpQkFBaUI7b0JBQ3ZDLENBQUMsQ0FBQywwQkFBMEI7b0JBQzVCLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQTtnQkFDeEIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFBO1lBQy9DLENBQUM7WUFFRCw4Q0FBOEM7WUFDOUMsS0FBSyxNQUFNLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUM1QyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQix1QkFBdUIsRUFBRSxDQUFDLFlBQVksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQzlFLENBQUE7Z0JBRUQsd0JBQXdCO2dCQUN4QixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQTtnQkFFMUMsNkNBQTZDO2dCQUM3QyxNQUFNLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUE7Z0JBQ3RFLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ3BCLDBDQUEwQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQzVELENBQUE7Z0JBRUQseUVBQXlFO2dCQUN6RSw0REFBNEQ7Z0JBQzVELElBQUksUUFBUSxFQUFFLENBQUM7b0JBQ2IsS0FBSyxDQUFDLENBQUMsYUFBYzt5QkFDbEIsc0JBQXNCLENBQUMsaUJBQWlCLENBQUM7eUJBQ3pDLElBQUksQ0FDSCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDL0Isc0JBQXNCLENBQ3BCLEVBQUUsRUFDRixVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsRUFDWCxXQUFXLEVBQ1gsV0FBVyxFQUNYLG9CQUFvQixFQUNwQixhQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLGtCQUFrQixDQUNuQixDQUFDLElBQUksQ0FDSixNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDeEIsTUFBTSxDQUFDLFFBQVEsQ0FDYixvQ0FBb0MsS0FBSyxFQUFFLENBQzVDLENBQ0YsQ0FDRixDQUNGLEVBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FDbEIsQ0FBQTtnQkFDTCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sS0FBSyxDQUFDLENBQUMsYUFBYzt5QkFDbEIsc0JBQXNCLENBQUMsaUJBQWlCLENBQUM7eUJBQ3pDLElBQUksQ0FDSCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDL0Isc0JBQXNCLENBQ3BCLEVBQUUsRUFDRixVQUFVLEVBQ1YsT0FBTyxFQUNQLFdBQVcsRUFDWCxXQUFXLEVBQ1gsYUFBYyxFQUNkLGlCQUFpQixFQUNqQixrQkFBa0IsQ0FDbkIsQ0FBQyxJQUFJLENBQ0osTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3hCLE1BQU0sQ0FBQyxRQUFRLENBQ2IscUNBQXFDLEtBQUssRUFBRSxDQUM3QyxDQUNGLENBQ0YsQ0FDRixFQUNELE1BQU0sQ0FBQyxVQUFVLENBQ2xCLENBQUE7Z0JBQ0wsQ0FBQztZQUNILENBQUM7WUFFRCxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLGlCQUFpQixDQUFDLENBQUE7WUFFdEQsK0NBQStDO1lBQy9DLE1BQU0sa0JBQWtCLEdBQTRCLEVBQUUsQ0FBQTtZQUN0RCxLQUFLLE1BQU0sRUFBRSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUMzQixJQUNFLEVBQUUsQ0FBQyxpQkFBaUI7b0JBQ3BCLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFDNUMsQ0FBQztvQkFDRCwyQkFBMkI7b0JBQzNCLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO3dCQUN0RCxDQUFDLENBQUMsRUFBRSxDQUFDLGlCQUFpQjt3QkFDdEIsQ0FBQyxDQUFDLEdBQUcsV0FBVyxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO29CQUU1QyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7d0JBQ3RCLFVBQVUsRUFBRSxFQUFFLENBQUMsWUFBWTt3QkFDM0IsaUJBQWlCLEVBQUUsV0FBVztxQkFDL0IsQ0FBQyxDQUFBO29CQUNGLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUE7Z0JBQzdDLENBQUM7WUFDSCxDQUFDO1lBRUQscUNBQXFDO1lBQ3JDLElBQUksa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQixzQ0FBc0Msa0JBQWtCLENBQUMsTUFBTSx3QkFBd0IsQ0FDeEYsQ0FBQTtnQkFFRCwwRUFBMEU7Z0JBQzFFLEtBQUssQ0FBQyxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FDdEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO29CQUNsQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQiwyQkFBMkIsS0FBSyxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQ2pFLENBQUE7b0JBQ0QsS0FBSyxDQUFDLENBQUMsc0JBQXNCLENBQzNCLEtBQUssQ0FBQyxVQUFVLEVBQ2hCLFVBQVUsRUFDVixXQUFXLENBQ1osQ0FBQyxJQUFJLENBQ0osTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3hCLE1BQU0sQ0FBQyxRQUFRLENBQ2IsOEJBQThCLEtBQUssQ0FBQyxVQUFVLEtBQUssS0FBSyxFQUFFLENBQzNELENBQ0YsQ0FDRixDQUFBO2dCQUNILENBQUMsQ0FBQyxDQUNILEVBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FDbEIsQ0FBQTtZQUNILENBQUM7WUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ2hDLFFBQVEsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUE7Z0JBQ2pDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsK0JBQStCLENBQUMsQ0FBQTtZQUN4RCxDQUFDO1lBRUQsNENBQTRDO1lBQzVDLFFBQVEsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUE7UUFDbkMsQ0FBQyxDQUFDLENBQUE7UUFFRixrRUFBa0U7UUFDbEUsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQy9CLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUN2QixNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUNsQixRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbkIsS0FBSyxpQkFBaUI7b0JBQ3BCLHlEQUF5RDtvQkFDekQsSUFDRSxDQUFDLGdCQUFnQjt3QkFDakIsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQzdDLENBQUM7d0JBQ0QsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO3dCQUN4QyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQiw2QkFBNkIsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUMvQyxDQUFBO29CQUNILENBQUM7b0JBQ0QsTUFBSztnQkFDUCxLQUFLLGdCQUFnQjtvQkFDbkIseUNBQXlDO29CQUN6QyxLQUFLLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQzdCLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUN4QixNQUFNLENBQUMsUUFBUSxDQUFDLDRCQUE0QixLQUFLLEVBQUUsQ0FBQyxDQUNyRCxDQUNGLENBQUE7b0JBQ0QsTUFBSztZQUNULENBQUM7UUFDSCxDQUFDLENBQUMsQ0FDSCxFQUNELE1BQU0sQ0FBQyxPQUFPLEVBQ2QsTUFBTSxDQUFDLElBQUksQ0FDWixDQUFBO1FBRUQseUJBQXlCO1FBQ3pCLE1BQU0sT0FBTyxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQ3pCLE1BQU0sTUFBTSxDQUFDLFVBQVUsQ0FDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7Z0JBQ2xCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtnQkFFM0MsaUJBQWlCO2dCQUNqQixLQUFLLENBQUMsQ0FBQyxlQUFlO3FCQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDO3FCQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO2dCQUUzQyxzREFBc0Q7Z0JBQ3RELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQTtnQkFDNUIsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO2dCQUNwRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksaUJBQWlCLEVBQUUsQ0FBQztvQkFDbEQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsSUFBSSxFQUFFLENBQUMsQ0FBQTtvQkFDcEQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUM5QyxNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUNuQyxDQUFBO2dCQUNILENBQUM7Z0JBRUQsMkJBQTJCO2dCQUMzQixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUM5QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksY0FBYyxFQUFFLENBQUM7b0JBQzVDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLElBQUksRUFBRSxDQUFDLENBQUE7b0JBQ2pELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQ3JCLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUNyQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO2dCQUM1QyxDQUFDO2dCQUVELHlEQUF5RDtnQkFDekQsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQzVDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTCxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUMxQixNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFDaEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQzdCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUNqRCxDQUNGLENBQUE7WUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2pCLENBQUMsQ0FBQTtRQUVELE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzdCLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBRTlCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQTtRQUVyRCwyQkFBMkI7UUFDM0IsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQTtJQUNyQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ0wsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQzdCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUNqRCxDQUFBO0FBQ0gsQ0FBQyxDQUNGLENBQUMsSUFBSSxDQUNKLE9BQU8sQ0FBQyxlQUFlLENBQ3JCLHFFQUFxRSxDQUN0RSxDQUNGLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExvY2FsIGNvbW1hbmQgZm9yIHJ1bm5pbmcgTGFtYmRhIGZ1bmN0aW9ucyBsb2NhbGx5IHVzaW5nIERvY2tlci5cbiAqXG4gKiBUaGlzIGNvbW1hbmQ6XG4gKiAxLiBTdGFydHMgQ0RLIHdhdGNoIHdpdGggQ0RLX0xJVkU9dHJ1ZSBhbmQgaG90c3dhcFxuICogMi4gRGlzY292ZXJzIExhbWJkYSBmdW5jdGlvbnMgd2l0aCBsaXZlLWxhbWJkYTpoYW5kbGVyIHRhZ1xuICogMy4gQ29ubmVjdHMgdG8gQXBwU3luYyBFdmVudHNcbiAqIDQuIFN1YnNjcmliZXMgdG8gaW52b2NhdGlvbiBjaGFubmVsc1xuICogNS4gRm9yIGVhY2ggZnVuY3Rpb24sIG1haW50YWlucyBPTkUgRG9ja2VyIGNvbnRhaW5lciB0aGF0IGhhbmRsZXMgYWxsIGludm9jYXRpb25zXG4gKiA2LiBTZW5kcyByZXNwb25zZXMgYmFjayB2aWEgQXBwU3luY1xuICogNy4gUmUtZGlzY292ZXJzIGZ1bmN0aW9ucyBhZnRlciBlYWNoIENESyBkZXBsb3lcbiAqL1xuXG5pbXBvcnQgeyB0eXBlIENoaWxkUHJvY2Vzcywgc3Bhd24gfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCJcbmltcG9ydCB7XG4gIExhbWJkYUNsaWVudCxcbiAgTGlzdEZ1bmN0aW9uc0NvbW1hbmQsXG4gIExpc3RUYWdzQ29tbWFuZCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1sYW1iZGFcIlxuaW1wb3J0IHsgR2V0UGFyYW1ldGVyQ29tbWFuZCwgU1NNQ2xpZW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zc21cIlxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9ucyB9IGZyb20gXCJAZWZmZWN0L2NsaVwiXG5pbXBvcnQge1xuICB0eXBlIENvbW1hbmRFeGVjdXRvcixcbiAgQ29tbWFuZCBhcyBQbGF0Zm9ybUNvbW1hbmQsXG59IGZyb20gXCJAZWZmZWN0L3BsYXRmb3JtXCJcbmltcG9ydCB0eXBlIHsgUHJvY2VzcyBhcyBFZmZlY3RQcm9jZXNzIH0gZnJvbSBcIkBlZmZlY3QvcGxhdGZvcm0vQ29tbWFuZEV4ZWN1dG9yXCJcbmltcG9ydCB7IEJ1bkNvbnRleHQgfSBmcm9tIFwiQGVmZmVjdC9wbGF0Zm9ybS1idW5cIlxuaW1wb3J0IHtcbiAgRHVyYXRpb24sXG4gIEVmZmVjdCxcbiAgRXhpdCxcbiAgRmliZXIsXG4gIExvZ2dlcixcbiAgTG9nTGV2ZWwsXG4gIFF1ZXVlLFxuICBSZWYsXG4gIFNjaGVkdWxlLFxuICBTY29wZSxcbiAgU3RyZWFtLFxufSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB7XG4gIEJPT1RTVFJBUF9TVEFDS19OQU1FLFxuICBCT09UU1RSQVBfVkVSU0lPTixcbiAgYnVpbGRDaGFubmVsTmFtZSxcbiAgdHlwZSBJbnZvY2F0aW9uTWVzc2FnZSxcbiAgTElWRV9MQU1CREFfRE9DS0VSX1RBRyxcbiAgTElWRV9MQU1CREFfVEFHLFxuICB0eXBlIFJlc3BvbnNlTWVzc2FnZSxcbiAgU1NNX0JBU0VfUEFUSCxcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlcy5qc1wiXG5pbXBvcnQgeyBtYWtlQXBwU3luY0NsaWVudCB9IGZyb20gXCIuLi9hcHBzeW5jL2NsaWVudC5qc1wiXG5pbXBvcnQge1xuICBidWlsZEV4dGVuc2lvbldyYXBwZXJDb21tYW5kLFxuICBEb2NrZXIsXG4gIERvY2tlckxpdmUsXG4gIG1ha2VMYW1iZGFDb250YWluZXJDb25maWcsXG59IGZyb20gXCIuLi9kb2NrZXIvY29udGFpbmVyLmpzXCJcbmltcG9ydCB7XG4gIHR5cGUgV2F0Y2hlZERvY2tlckZ1bmN0aW9uLFxuICB3YXRjaERvY2tlckNvbnRleHRzLFxufSBmcm9tIFwiLi4vZG9ja2VyL3dhdGNoZXIuanNcIlxuaW1wb3J0IHtcbiAgbm90aWZ5RXh0ZW5zaW9uc0ludm9rZSxcbiAgcXVldWVJbnZvY2F0aW9uLFxuICB0eXBlIFJ1bnRpbWVBcGlTdGF0ZSxcbiAgc3RhcnRSdW50aW1lQXBpU2VydmVyLFxuICB3YWl0Rm9yUmVzcG9uc2UsXG59IGZyb20gXCIuLi9ydW50aW1lLWFwaS9zZXJ2ZXIuanNcIlxuaW1wb3J0IHR5cGUge1xuICBMYW1iZGFFcnJvcixcbiAgTGFtYmRhSW5pdEVycm9yLFxuICBMYW1iZGFJbnZvY2F0aW9uLFxuICBMYW1iZGFSZXNwb25zZSxcbn0gZnJvbSBcIi4uL3J1bnRpbWUtYXBpL3R5cGVzLmpzXCJcblxuLyoqXG4gKiBEaXNjb3ZlcmVkIExhbWJkYSBmdW5jdGlvbiBpbmZvLlxuICovXG5pbnRlcmZhY2UgRGlzY292ZXJlZEZ1bmN0aW9uIHtcbiAgZnVuY3Rpb25OYW1lOiBzdHJpbmdcbiAgZnVuY3Rpb25Bcm46IHN0cmluZ1xuICBsb2NhbEhhbmRsZXI6IHN0cmluZ1xuICAvKiogTG9jYWwgRG9ja2VyIGNvbnRleHQgcGF0aCBmb3IgRG9ja2VySW1hZ2VGdW5jdGlvbiAqL1xuICBkb2NrZXJDb250ZXh0UGF0aD86IHN0cmluZ1xuICBtZW1vcnlNQjogbnVtYmVyXG4gIGFyY2hpdGVjdHVyZT86IFwiYXJtNjRcIiB8IFwieDg2XzY0XCJcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGlkbGUgdGltZW91dCBiZWZvcmUgcHJvYWN0aXZlbHkgc3RvcHBpbmcgY29udGFpbmVycy5cbiAqIFNldCBzbGlnaHRseSBiZWxvdyB0aGUgcG9sbCB0aW1lb3V0ICgyNDBzKSB0byBzdG9wIGNvbnRhaW5lciBiZWZvcmVcbiAqIHRoZSBMYW1iZGEgUklDIGdldHMgYSA1MDMgZXJyb3IuXG4gKi9cbmNvbnN0IERFRkFVTFRfSURMRV9USU1FT1VUX01TID0gMjMwXzAwMCAvLyAyMzAgc2Vjb25kcyAofjQgbWludXRlcylcblxuLyoqXG4gKiBTdGF0ZSBmb3IgYSBydW5uaW5nIGZ1bmN0aW9uIGNvbnRhaW5lci5cbiAqL1xuaW50ZXJmYWNlIEZ1bmN0aW9uQ29udGFpbmVyIHtcbiAgZm46IERpc2NvdmVyZWRGdW5jdGlvblxuICBydW50aW1lU3RhdGU6IFJ1bnRpbWVBcGlTdGF0ZVxuICAvKiogVGhlIHBvcnQgdGhlIFJ1bnRpbWUgQVBJIHNlcnZlciBpcyBsaXN0ZW5pbmcgb24gKi9cbiAgcG9ydDogbnVtYmVyXG4gIGNvbnRhaW5lckZpYmVyOiBGaWJlci5SdW50aW1lRmliZXI8dm9pZCwgRXJyb3I+XG4gIGNvbnRhaW5lck5hbWU6IHN0cmluZ1xuICAvKiogRG9ja2VyIGltYWdlIG5hbWUgZm9yIHJlYnVpbGRzICovXG4gIGltYWdlTmFtZTogc3RyaW5nXG4gIC8qKiBXaGV0aGVyIHRoZSBjb250YWluZXIgaXMgY3VycmVudGx5IGJlaW5nIHJlYnVpbHQgKGludm9jYXRpb25zIHdpbGwgcXVldWUpICovXG4gIGlzUmVidWlsZGluZzogYm9vbGVhblxuICAvKiogTWFwIG9mIHJlcXVlc3RJZCAtPiByZXNwb25zZSByZXNvbHZlciAqL1xuICBwZW5kaW5nUmVzcG9uc2VzOiBNYXA8XG4gICAgc3RyaW5nLFxuICAgIHtcbiAgICAgIHJlc29sdmU6IChyZXNwb25zZTogUmVzcG9uc2VNZXNzYWdlKSA9PiB2b2lkXG4gICAgfVxuICA+XG4gIC8qKiBGaWJlciBmb3IgdGhlIGlkbGUgc2h1dGRvd24gdGltZXIsIGNhbmNlbGxlZCB3aGVuIG5ldyByZXNwb25zZXMgYXJyaXZlICovXG4gIGlkbGVUaW1lckZpYmVyOiBGaWJlci5SdW50aW1lRmliZXI8dm9pZCwgbmV2ZXI+IHwgbnVsbFxuICAvKiogRW52aXJvbm1lbnQgdmFyaWFibGVzIGNhcHR1cmVkIGZyb20gZmlyc3QgaW52b2NhdGlvbiAqL1xuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn1cblxuLyoqXG4gKiBTdGF0ZSBmb3IgYSBydW5uaW5nIE5vZGUuanMgd29ya2VyIHByb2Nlc3MuXG4gKi9cbmludGVyZmFjZSBOb2RlanNXb3JrZXIge1xuICBmbjogRGlzY292ZXJlZEZ1bmN0aW9uXG4gIHJ1bnRpbWVTdGF0ZTogUnVudGltZUFwaVN0YXRlXG4gIC8qKiBUaGUgcG9ydCB0aGUgUnVudGltZSBBUEkgc2VydmVyIGlzIGxpc3RlbmluZyBvbiAqL1xuICBwb3J0OiBudW1iZXJcbiAgLyoqIFRoZSBzcGF3bmVkIEJ1biBwcm9jZXNzICovXG4gIHdvcmtlclByb2Nlc3M6IENoaWxkUHJvY2Vzc1xuICAvKiogRW52aXJvbm1lbnQgdmFyaWFibGVzIGNhcHR1cmVkIGZyb20gZmlyc3QgaW52b2NhdGlvbiAqL1xuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn1cblxuLyoqXG4gKiBJbnZvY2F0aW9uIGNvbnRleHQgZm9yIHRyYWNraW5nIGFuZCBsb2dnaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludm9jYXRpb25Db250ZXh0IHtcbiAgLyoqIFNlcXVlbnRpYWwgaW52b2NhdGlvbiBudW1iZXIgKi9cbiAgbnVtOiBudW1iZXJcbiAgLyoqIFN0YXJ0IHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMgKi9cbiAgc3RhcnQ6IG51bWJlclxuICAvKiogRnVuY3Rpb24gbmFtZSAqL1xuICBmbjogc3RyaW5nXG4gIC8qKiBXaGV0aGVyIHRoaXMgaXMgYSBEb2NrZXIgY29udGFpbmVyIGludm9jYXRpb24gKi9cbiAgaXNEb2NrZXI6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBib290c3RyYXAgc3RhY2sgdmVyc2lvbiBtYXRjaGVzIHRoZSBleHBlY3RlZCB2ZXJzaW9uLlxuICogUmV0dXJucyB0cnVlIGlmIHZlcnNpb24gbWF0Y2hlcywgZmFsc2UgaWYgbWlzc2luZyBvciBtaXNtYXRjaGVkLlxuICovXG5jb25zdCBjaGVja0Jvb3RzdHJhcFZlcnNpb24gPSAocXVhbGlmaWVyOiBzdHJpbmcpID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBzc21DbGllbnQgPSBuZXcgU1NNQ2xpZW50KHt9KVxuICAgIGNvbnN0IGJhc2VQYXRoID0gYCR7U1NNX0JBU0VfUEFUSH0vJHtxdWFsaWZpZXJ9YFxuXG4gICAgY29uc3QgcmVzdWx0ID0geWllbGQqIEVmZmVjdC50cnlQcm9taXNlKHtcbiAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNzbUNsaWVudC5zZW5kKFxuICAgICAgICAgIG5ldyBHZXRQYXJhbWV0ZXJDb21tYW5kKHsgTmFtZTogYCR7YmFzZVBhdGh9L3ZlcnNpb25gIH0pLFxuICAgICAgICApXG4gICAgICAgIHJldHVybiByZXNwb25zZS5QYXJhbWV0ZXI/LlZhbHVlXG4gICAgICB9LFxuICAgICAgY2F0Y2g6ICgpID0+IG51bGwsXG4gICAgfSkucGlwZShFZmZlY3QuY2F0Y2hBbGwoKCkgPT4gRWZmZWN0LnN1Y2NlZWQobnVsbCkpKVxuXG4gICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgeWllbGQqIEVmZmVjdC5sb2dJbmZvKFwiQm9vdHN0cmFwIHN0YWNrIHZlcnNpb24gcGFyYW1ldGVyIG5vdCBmb3VuZFwiKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCAhPT0gQk9PVFNUUkFQX1ZFUlNJT04pIHtcbiAgICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcbiAgICAgICAgYEJvb3RzdHJhcCBzdGFjayB2ZXJzaW9uIG1pc21hdGNoOiBmb3VuZCAke3Jlc3VsdH0sIGV4cGVjdGVkICR7Qk9PVFNUUkFQX1ZFUlNJT059YCxcbiAgICAgIClcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH0pXG5cbi8qKlxuICogUnVuIHRoZSBib290c3RyYXAgc3RhY2sgZGVwbG95bWVudC5cbiAqL1xuY29uc3QgcnVuQm9vdHN0cmFwID0gKG9wdGlvbnM6IHsgcHJvZmlsZT86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nIH0pID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oXCJSdW5uaW5nIGJvb3RzdHJhcCBzdGFjayBkZXBsb3ltZW50Li4uXCIpXG5cbiAgICAvLyBSZXNvbHZlIHRoZSBDREsgYXBwIHBhdGggcmVsYXRpdmUgdG8gdGhpcyBtb2R1bGVcbiAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpXG4gICAgY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpXG4gICAgY29uc3QgY2RrQXBwUGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsIFwiLi5cIiwgXCJjZGstYXBwLmpzXCIpXG5cbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgXCJjZGtcIixcbiAgICAgIFwiZGVwbG95XCIsXG4gICAgICBCT09UU1RSQVBfU1RBQ0tfTkFNRSxcbiAgICAgIFwiLS1yZXF1aXJlLWFwcHJvdmFsXCIsXG4gICAgICBcIm5ldmVyXCIsXG4gICAgICBcIi0tYXBwXCIsXG4gICAgICBgYnVuICR7Y2RrQXBwUGF0aH1gLFxuICAgIF1cblxuICAgIGlmIChvcHRpb25zLnByb2ZpbGUpIHtcbiAgICAgIGFyZ3MucHVzaChcIi0tcHJvZmlsZVwiLCBvcHRpb25zLnByb2ZpbGUpXG4gICAgfVxuXG4gICAgY29uc3QgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgfSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgaWYgKG9wdGlvbnMucmVnaW9uKSB7XG4gICAgICBlbnYuQVdTX1JFR0lPTiA9IG9wdGlvbnMucmVnaW9uXG4gICAgICBlbnYuQ0RLX0RFRkFVTFRfUkVHSU9OID0gb3B0aW9ucy5yZWdpb25cbiAgICB9XG5cbiAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oYFJ1bm5pbmc6IG5weCAke2FyZ3Muam9pbihcIiBcIil9YClcblxuICAgIGNvbnN0IGNvbW1hbmQgPSBQbGF0Zm9ybUNvbW1hbmQubWFrZShcIm5weFwiLCAuLi5hcmdzKS5waXBlKFxuICAgICAgUGxhdGZvcm1Db21tYW5kLmVudihlbnYpLFxuICAgICAgUGxhdGZvcm1Db21tYW5kLnN0ZGluKFwiaW5oZXJpdFwiKSxcbiAgICApXG5cbiAgICBjb25zdCBwcm9jID0geWllbGQqIFBsYXRmb3JtQ29tbWFuZC5zdGFydChjb21tYW5kKVxuXG4gICAgLy8gU3RyZWFtIG91dHB1dCB0byBjb25zb2xlXG4gICAgeWllbGQqIFN0cmVhbS5tZXJnZShwcm9jLnN0ZG91dCwgcHJvYy5zdGRlcnIpLnBpcGUoXG4gICAgICBTdHJlYW0uZGVjb2RlVGV4dCgpLFxuICAgICAgU3RyZWFtLnNwbGl0TGluZXMsXG4gICAgICBTdHJlYW0ucnVuRm9yRWFjaCgobGluZSkgPT5cbiAgICAgICAgRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke2xpbmV9XFxuYClcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgIClcblxuICAgIGNvbnN0IGV4aXRDb2RlID0geWllbGQqIHByb2MuZXhpdENvZGVcbiAgICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmZhaWwoXG4gICAgICAgIG5ldyBFcnJvcihgQm9vdHN0cmFwIGRlcGxveW1lbnQgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7ZXhpdENvZGV9YCksXG4gICAgICApXG4gICAgfVxuXG4gICAgeWllbGQqIEVmZmVjdC5sb2dJbmZvKFwiQm9vdHN0cmFwIHN0YWNrIGRlcGxveWVkIHN1Y2Nlc3NmdWxseSFcIilcbiAgfSkucGlwZShFZmZlY3Quc2NvcGVkKVxuXG4vKipcbiAqIEVuc3VyZSBib290c3RyYXAgc3RhY2sgaXMgZGVwbG95ZWQgd2l0aCBjb3JyZWN0IHZlcnNpb24uXG4gKiBBdXRvbWF0aWNhbGx5IGRlcGxveXMgaWYgbWlzc2luZyBvciBvdXRkYXRlZC5cbiAqL1xuY29uc3QgZW5zdXJlQm9vdHN0cmFwID0gKG9wdGlvbnM6IHtcbiAgcXVhbGlmaWVyOiBzdHJpbmdcbiAgcHJvZmlsZT86IHN0cmluZ1xuICByZWdpb24/OiBzdHJpbmdcbn0pID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKFwiW0xvY2FsXSBDaGVja2luZyBib290c3RyYXAgc3RhY2sgdmVyc2lvbi4uLlwiKVxuXG4gICAgY29uc3QgdmVyc2lvbk9rID0geWllbGQqIGNoZWNrQm9vdHN0cmFwVmVyc2lvbihvcHRpb25zLnF1YWxpZmllcilcblxuICAgIGlmICghdmVyc2lvbk9rKSB7XG4gICAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oXG4gICAgICAgIFwiW0xvY2FsXSBCb290c3RyYXAgc3RhY2sgbmVlZHMgdG8gYmUgZGVwbG95ZWQgb3IgdXBkYXRlZC5cIixcbiAgICAgIClcbiAgICAgIHlpZWxkKiBydW5Cb290c3RyYXAoeyBwcm9maWxlOiBvcHRpb25zLnByb2ZpbGUsIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24gfSlcbiAgICB9IGVsc2Uge1xuICAgICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhcIltMb2NhbF0gQm9vdHN0cmFwIHN0YWNrIHZlcnNpb24gT0suXCIpXG4gICAgfVxuICB9KVxuXG4vKipcbiAqIFJlYWQgQXBwU3luYyBlbmRwb2ludHMgZnJvbSBTU00uXG4gKi9cbmNvbnN0IGdldEFwcFN5bmNFbmRwb2ludHMgPSAocXVhbGlmaWVyOiBzdHJpbmcpID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBzc21DbGllbnQgPSBuZXcgU1NNQ2xpZW50KHt9KVxuICAgIGNvbnN0IGJhc2VQYXRoID0gYCR7U1NNX0JBU0VfUEFUSH0vJHtxdWFsaWZpZXJ9YFxuXG4gICAgY29uc3QgZ2V0UGFyYW0gPSAobmFtZTogc3RyaW5nKSA9PlxuICAgICAgRWZmZWN0LnRyeVByb21pc2Uoe1xuICAgICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzc21DbGllbnQuc2VuZChcbiAgICAgICAgICAgIG5ldyBHZXRQYXJhbWV0ZXJDb21tYW5kKHsgTmFtZTogYCR7YmFzZVBhdGh9LyR7bmFtZX1gIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LlBhcmFtZXRlcj8uVmFsdWUgPz8gXCJcIlxuICAgICAgICB9LFxuICAgICAgICBjYXRjaDogKGVycm9yKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCBTU00gcGFyYW1ldGVyICR7bmFtZX06ICR7U3RyaW5nKGVycm9yKX1gKSxcbiAgICAgIH0pXG5cbiAgICBjb25zdCBodHRwRW5kcG9pbnQgPSB5aWVsZCogZ2V0UGFyYW0oXCJodHRwLWVuZHBvaW50XCIpXG4gICAgY29uc3QgcmVhbHRpbWVFbmRwb2ludCA9IHlpZWxkKiBnZXRQYXJhbShcInJlYWx0aW1lLWVuZHBvaW50XCIpXG5cbiAgICByZXR1cm4geyBodHRwRW5kcG9pbnQsIHJlYWx0aW1lRW5kcG9pbnQgfVxuICB9KVxuXG4vKipcbiAqIENsb3VkRm9ybWF0aW9uIHN0YWNrIG5hbWUgdGFnIChzZXQgYXV0b21hdGljYWxseSBieSBDREspXG4gKi9cbmNvbnN0IENGTl9TVEFDS19OQU1FX1RBRyA9IFwiYXdzOmNsb3VkZm9ybWF0aW9uOnN0YWNrLW5hbWVcIlxuXG4vKipcbiAqIERpc2NvdmVyIExhbWJkYSBmdW5jdGlvbnMgd2l0aCBsaXZlLWxhbWJkYSB0YWdzLlxuICogQHBhcmFtIHN0YWNrRmlsdGVyIC0gT3B0aW9uYWwgbGlzdCBvZiBzdGFjayBuYW1lcyB0byBmaWx0ZXIgYnlcbiAqL1xuY29uc3QgZGlzY292ZXJGdW5jdGlvbnMgPSAoc3RhY2tGaWx0ZXI/OiBzdHJpbmdbXSkgPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IGxhbWJkYUNsaWVudCA9IG5ldyBMYW1iZGFDbGllbnQoe30pXG4gICAgY29uc3QgZnVuY3Rpb25zOiBEaXNjb3ZlcmVkRnVuY3Rpb25bXSA9IFtdXG5cbiAgICAvLyBMaXN0IGFsbCBmdW5jdGlvbnNcbiAgICBsZXQgbmV4dE1hcmtlcjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgZG8ge1xuICAgICAgY29uc3QgbGlzdFJlc3BvbnNlID0geWllbGQqIEVmZmVjdC50cnlQcm9taXNlKHtcbiAgICAgICAgdHJ5OiAoKSA9PlxuICAgICAgICAgIGxhbWJkYUNsaWVudC5zZW5kKG5ldyBMaXN0RnVuY3Rpb25zQ29tbWFuZCh7IE1hcmtlcjogbmV4dE1hcmtlciB9KSksXG4gICAgICAgIGNhdGNoOiAoZXJyb3IpID0+XG4gICAgICAgICAgbmV3IEVycm9yKGBGYWlsZWQgdG8gbGlzdCBmdW5jdGlvbnM6ICR7U3RyaW5nKGVycm9yKX1gKSxcbiAgICAgIH0pXG5cbiAgICAgIGZvciAoY29uc3QgZm4gb2YgbGlzdFJlc3BvbnNlLkZ1bmN0aW9ucyA/PyBbXSkge1xuICAgICAgICAvLyBHZXQgdGFncyBmb3IgZWFjaCBmdW5jdGlvblxuICAgICAgICBjb25zdCB0YWdzUmVzdWx0ID0geWllbGQqIEVmZmVjdC50cnlQcm9taXNlKHtcbiAgICAgICAgICB0cnk6ICgpID0+XG4gICAgICAgICAgICBsYW1iZGFDbGllbnQuc2VuZChcbiAgICAgICAgICAgICAgbmV3IExpc3RUYWdzQ29tbWFuZCh7IFJlc291cmNlOiBmbi5GdW5jdGlvbkFybiB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgY2F0Y2g6ICgpID0+IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCB0YWdzIGZvciAke2ZuLkZ1bmN0aW9uTmFtZX1gKSxcbiAgICAgICAgfSkucGlwZShcbiAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGwoKCkgPT5cbiAgICAgICAgICAgIEVmZmVjdC5zdWNjZWVkKHsgVGFnczoge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KSxcbiAgICAgICAgICApLFxuICAgICAgICApXG5cbiAgICAgICAgY29uc3QgdGFncyA9IHRhZ3NSZXN1bHQuVGFncyA/PyB7fVxuXG4gICAgICAgIC8vIENoZWNrIGZvciBsaXZlLWxhbWJkYSB0YWcgKGhhbmRsZXIpIG9yIGRvY2tlci1jb250ZXh0IHRhZ1xuICAgICAgICBpZiAodGFnc1tMSVZFX0xBTUJEQV9UQUddIHx8IHRhZ3NbTElWRV9MQU1CREFfRE9DS0VSX1RBR10pIHtcbiAgICAgICAgICAvLyBGaWx0ZXIgYnkgc3RhY2sgbmFtZSBpZiBzcGVjaWZpZWRcbiAgICAgICAgICBpZiAoc3RhY2tGaWx0ZXIgJiYgc3RhY2tGaWx0ZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc3RhY2tOYW1lID0gdGFnc1tDRk5fU1RBQ0tfTkFNRV9UQUddXG4gICAgICAgICAgICBpZiAoIXN0YWNrTmFtZSB8fCAhc3RhY2tGaWx0ZXIuaW5jbHVkZXMoc3RhY2tOYW1lKSkge1xuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERldGVybWluZSBhcmNoaXRlY3R1cmUgZnJvbSBMYW1iZGEgY29uZmlnXG4gICAgICAgICAgY29uc3QgYXJjaGl0ZWN0dXJlcyA9IGZuLkFyY2hpdGVjdHVyZXMgPz8gW1wieDg2XzY0XCJdXG4gICAgICAgICAgY29uc3QgYXJjaGl0ZWN0dXJlID0gYXJjaGl0ZWN0dXJlcy5pbmNsdWRlcyhcImFybTY0XCIpXG4gICAgICAgICAgICA/IChcImFybTY0XCIgYXMgY29uc3QpXG4gICAgICAgICAgICA6IChcIng4Nl82NFwiIGFzIGNvbnN0KVxuXG4gICAgICAgICAgY29uc3QgZGlzY292ZXJlZDogRGlzY292ZXJlZEZ1bmN0aW9uID0ge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBmbi5GdW5jdGlvbk5hbWUhLFxuICAgICAgICAgICAgZnVuY3Rpb25Bcm46IGZuLkZ1bmN0aW9uQXJuISxcbiAgICAgICAgICAgIGxvY2FsSGFuZGxlcjogdGFnc1tMSVZFX0xBTUJEQV9UQUddID8/IFwiXCIsXG4gICAgICAgICAgICBkb2NrZXJDb250ZXh0UGF0aDogdGFnc1tMSVZFX0xBTUJEQV9ET0NLRVJfVEFHXSxcbiAgICAgICAgICAgIG1lbW9yeU1COiBmbi5NZW1vcnlTaXplID8/IDEyOCxcbiAgICAgICAgICAgIGFyY2hpdGVjdHVyZSxcbiAgICAgICAgICB9XG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goZGlzY292ZXJlZClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0TWFya2VyID0gbGlzdFJlc3BvbnNlLk5leHRNYXJrZXJcbiAgICB9IHdoaWxlIChuZXh0TWFya2VyKVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uc1xuICB9KVxuXG4vKipcbiAqIFN0YXJ0IGEgbG9uZy1ydW5uaW5nIERvY2tlciBjb250YWluZXIgZm9yIGEgZnVuY3Rpb24uXG4gKiBCdWlsZHMgdGhlIGltYWdlIGZyb20gdGhlIGxvY2FsIERvY2tlciBjb250ZXh0IHBhdGgsIHRoZW4gcnVucyBpdC5cbiAqIFRoZSBjb250YWluZXIgY29udGludW91c2x5IHBvbGxzIG91ciBSdW50aW1lIEFQSSBmb3IgaW52b2NhdGlvbnMuXG4gKiBVc2VzIEVmZmVjdC5mb3JrRGFlbW9uIHRvIGVuc3VyZSB0aGUgY29udGFpbmVyIHJ1bnMgaW5kZXBlbmRlbnRseSB3aXRoIGNvbnRleHQuXG4gKi9cbmNvbnN0IHN0YXJ0RnVuY3Rpb25Db250YWluZXIgPSAoXG4gIGZuOiBEaXNjb3ZlcmVkRnVuY3Rpb24sXG4gIHBvcnQ6IG51bWJlcixcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgYWRkaXRpb25hbEVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgaW52b2NhdGlvbkNvbnRleHRzPzogTWFwPHN0cmluZywgeyBudW06IG51bWJlciB9Pixcbik6IEVmZmVjdC5FZmZlY3Q8XG4gIEZpYmVyLlJ1bnRpbWVGaWJlcjx2b2lkLCBFcnJvcj4sXG4gIEVycm9yLFxuICBDb21tYW5kRXhlY3V0b3IuQ29tbWFuZEV4ZWN1dG9yXG4+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBpZiAoIWZuLmRvY2tlckNvbnRleHRQYXRoKSB7XG4gICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5mYWlsKFxuICAgICAgICBuZXcgRXJyb3IoYEZ1bmN0aW9uICR7Zm4uZnVuY3Rpb25OYW1lfSBoYXMgbm8gRG9ja2VyIGNvbnRleHQgcGF0aGApLFxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGRvY2tlciA9IHlpZWxkKiBEb2NrZXJcblxuICAgIGNvbnN0IGRvY2tlclJ1bnRpbWUgPSB5aWVsZCogZG9ja2VyLmdldFJ1bnRpbWVJbmZvKClcbiAgICBjb25zdCBydW50aW1lQXBpSG9zdCA9IGRvY2tlclJ1bnRpbWUuaXNEb2NrZXJEZXNrdG9wXG4gICAgICA/IFwiaG9zdC5kb2NrZXIuaW50ZXJuYWxcIlxuICAgICAgOiBcInJ1bnRpbWUuYXBpXCJcblxuICAgIC8vIEdlbmVyYXRlIGEgbG9jYWwgaW1hZ2UgbmFtZSBmcm9tIGZ1bmN0aW9uIG5hbWVcbiAgICBjb25zdCBpbWFnZU5hbWUgPSBgbGl2ZS1sYW1iZGEtJHtmbi5mdW5jdGlvbk5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csIFwiLVwiKX1gXG5cbiAgICAvLyBSZXNvbHZlIHRoZSBjb250ZXh0IHBhdGggcmVsYXRpdmUgdG8gcHJvamVjdCByb290XG4gICAgY29uc3QgY29udGV4dFBhdGggPSBmbi5kb2NrZXJDb250ZXh0UGF0aC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgPyBmbi5kb2NrZXJDb250ZXh0UGF0aFxuICAgICAgOiBgJHtwcm9qZWN0Um9vdH0vJHtmbi5kb2NrZXJDb250ZXh0UGF0aH1gXG5cbiAgICAvLyBEZXRlcm1pbmUgcGxhdGZvcm0gZnJvbSBhcmNoaXRlY3R1cmVcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGZuLmFyY2hpdGVjdHVyZSA9PT0gXCJhcm02NFwiID8gXCJsaW51eC9hcm02NFwiIDogXCJsaW51eC9hbWQ2NFwiXG5cbiAgICAvLyBCdWlsZCB0aGUgRG9ja2VyIGltYWdlIGZyb20gbG9jYWwgY29udGV4dFxuICAgIHlpZWxkKiBkb2NrZXJcbiAgICAgIC5idWlsZCh7XG4gICAgICAgIGNvbnRleHRQYXRoLFxuICAgICAgICBpbWFnZU5hbWUsXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgfSlcbiAgICAgIC5waXBlKEVmZmVjdC5zY29wZWQpXG5cbiAgICAvLyBJbnNwZWN0IHRoZSBpbWFnZSB0byBnZXQgb3JpZ2luYWwgZW50cnlwb2ludC9jbWQgZm9yIGV4dGVuc2lvbiB3cmFwcGVyXG4gICAgY29uc3QgaW1hZ2VDb25maWcgPSB5aWVsZCogZG9ja2VyLmluc3BlY3QoaW1hZ2VOYW1lKS5waXBlKEVmZmVjdC5zY29wZWQpXG4gICAgY29uc3QgZXh0ZW5zaW9uV3JhcHBlciA9IGJ1aWxkRXh0ZW5zaW9uV3JhcHBlckNvbW1hbmQoXG4gICAgICBpbWFnZUNvbmZpZy5lbnRyeXBvaW50LFxuICAgICAgaW1hZ2VDb25maWcuY21kLFxuICAgIClcblxuICAgIGNvbnN0IGNvbnRhaW5lckNvbmZpZyA9IG1ha2VMYW1iZGFDb250YWluZXJDb25maWcoe1xuICAgICAgaW1hZ2VVcmk6IGltYWdlTmFtZSxcbiAgICAgIHJ1bnRpbWVBcGlIb3N0LFxuICAgICAgcnVudGltZUFwaVBvcnQ6IHBvcnQsXG4gICAgICBmdW5jdGlvbk5hbWU6IGZuLmZ1bmN0aW9uTmFtZSxcbiAgICAgIGZ1bmN0aW9uVmVyc2lvbjogXCIkTEFURVNUXCIsXG4gICAgICBtZW1vcnlNQjogZm4ubWVtb3J5TUIsXG4gICAgICB0aW1lb3V0U2Vjb25kczogMzYwMCwgLy8gTG9uZyB0aW1lb3V0IC0gY29udGFpbmVyIHN0YXlzIHJ1bm5pbmdcbiAgICAgIHBsYXRmb3JtLFxuICAgICAgYWRkaXRpb25hbEVudixcbiAgICAgIGludm9jYXRpb25Db250ZXh0cyxcbiAgICB9KVxuXG4gICAgLy8gQXBwbHkgZXh0ZW5zaW9uIHdyYXBwZXIgdG8gc3RhcnQgZXh0ZW5zaW9ucyBiZWZvcmUgdGhlIGFwcFxuICAgIGNvbnRhaW5lckNvbmZpZy5lbnRyeXBvaW50ID0gZXh0ZW5zaW9uV3JhcHBlci5lbnRyeXBvaW50XG4gICAgY29udGFpbmVyQ29uZmlnLmNvbW1hbmQgPSBleHRlbnNpb25XcmFwcGVyLmNvbW1hbmRcblxuICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcbiAgICAgIGBTdGFydGluZyBjb250YWluZXIgZm9yICR7Zm4uZnVuY3Rpb25OYW1lfSBvbiBwb3J0ICR7cG9ydH1gLFxuICAgIClcblxuICAgIC8vIFVzZSBFZmZlY3QuZm9ya0RhZW1vbiB0byBydW4gdGhlIGNvbnRhaW5lciBpbmRlcGVuZGVudGx5IHdpdGggY29udGV4dCBwcmVzZXJ2ZWRcbiAgICAvLyBFZmZlY3Quc2NvcGVkIHByb3ZpZGVzIHRoZSBzY29wZSBuZWVkZWQgYnkgZG9ja2VyLnJ1blxuICAgIGNvbnN0IGZpYmVyID0geWllbGQqIGRvY2tlci5ydW4oY29udGFpbmVyQ29uZmlnKS5waXBlKFxuICAgICAgRWZmZWN0LnNjb3BlZCxcbiAgICAgIEVmZmVjdC5tYXAoKCkgPT4gdW5kZWZpbmVkIGFzIHZvaWQpLFxuICAgICAgRWZmZWN0LmZvcmtEYWVtb24sXG4gICAgKVxuXG4gICAgcmV0dXJuIGZpYmVyXG4gIH0pLnBpcGUoRWZmZWN0LnByb3ZpZGUoRG9ja2VyTGl2ZSkpXG5cbi8vIFR5cGUgZ3VhcmRzIGZvciByZXNwb25zZSB0eXBlc1xuY29uc3QgaXNMYW1iZGFSZXNwb25zZSA9IChcbiAgcjogTGFtYmRhUmVzcG9uc2UgfCBMYW1iZGFFcnJvciB8IExhbWJkYUluaXRFcnJvcixcbik6IHIgaXMgTGFtYmRhUmVzcG9uc2UgPT4gXCJib2R5XCIgaW4gciAmJiAhKFwiZXJyb3JUeXBlXCIgaW4gcilcblxuY29uc3QgaXNMYW1iZGFFcnJvciA9IChcbiAgcjogTGFtYmRhUmVzcG9uc2UgfCBMYW1iZGFFcnJvciB8IExhbWJkYUluaXRFcnJvcixcbik6IHIgaXMgTGFtYmRhRXJyb3IgPT4gXCJyZXF1ZXN0SWRcIiBpbiByICYmIFwiZXJyb3JUeXBlXCIgaW4gclxuXG5jb25zdCBpc0xhbWJkYUluaXRFcnJvciA9IChcbiAgcjogTGFtYmRhUmVzcG9uc2UgfCBMYW1iZGFFcnJvciB8IExhbWJkYUluaXRFcnJvcixcbik6IHIgaXMgTGFtYmRhSW5pdEVycm9yID0+ICEoXCJyZXF1ZXN0SWRcIiBpbiByKSAmJiBcImVycm9yVHlwZVwiIGluIHJcblxuLyoqXG4gKiBSZXNldCB0aGUgaWRsZSB0aW1lciBmb3IgYSBjb250YWluZXIuXG4gKiBBZnRlciB0aGUgdGltZW91dCBleHBpcmVzIHdpdGggbm8gbmV3IHJlc3BvbnNlcywgdGhlIGNvbnRhaW5lciBpcyBzdG9wcGVkLlxuICogVGhpcyBwcmV2ZW50cyB0aGUgY29uZnVzaW5nIDUwMyBlcnJvciBmcm9tIHRoZSBMYW1iZGEgUklDIHdoZW4gdGhlIHBvbGwgdGltZXMgb3V0LlxuICovXG5jb25zdCByZXNldElkbGVUaW1lciA9IChcbiAgY29udGFpbmVyOiBGdW5jdGlvbkNvbnRhaW5lcixcbiAgY29udGFpbmVyc1JlZjogUmVmLlJlZjxNYXA8c3RyaW5nLCBGdW5jdGlvbkNvbnRhaW5lcj4+LFxuICBpZGxlVGltZW91dE1zOiBudW1iZXIsXG4pOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBDb21tYW5kRXhlY3V0b3IuQ29tbWFuZEV4ZWN1dG9yPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgLy8gQ2FuY2VsIGV4aXN0aW5nIHRpbWVyIGlmIGFueVxuICAgIGlmIChjb250YWluZXIuaWRsZVRpbWVyRmliZXIpIHtcbiAgICAgIHlpZWxkKiBGaWJlci5pbnRlcnJ1cHQoY29udGFpbmVyLmlkbGVUaW1lckZpYmVyKS5waXBlKFxuICAgICAgICBFZmZlY3QuY2F0Y2hBbGwoKCkgPT4gRWZmZWN0LnZvaWQpLFxuICAgICAgKVxuICAgICAgY29udGFpbmVyLmlkbGVUaW1lckZpYmVyID0gbnVsbFxuICAgIH1cblxuICAgIC8vIFN0YXJ0IG5ldyB0aW1lciAtIHVzZSBuZXZlciBmb3IgZXJyb3IgdHlwZSBzaW5jZSB3ZSBjYXRjaCBhbGwgZXJyb3JzXG4gICAgY29uc3QgdGltZXJGaWJlcjogRmliZXIuUnVudGltZUZpYmVyPHZvaWQsIG5ldmVyPiA9IHlpZWxkKiBFZmZlY3QuZ2VuKFxuICAgICAgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgeWllbGQqIEVmZmVjdC5zbGVlcChEdXJhdGlvbi5taWxsaXMoaWRsZVRpbWVvdXRNcykpXG5cbiAgICAgICAgLy8gVGltZXIgZXhwaXJlZCAtIHN0b3AgY29udGFpbmVyIHByb2FjdGl2ZWx5XG4gICAgICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcbiAgICAgICAgICBgW0xvY2FsXSBTdG9wcGluZyBpZGxlIGNvbnRhaW5lciAke2NvbnRhaW5lci5mbi5mdW5jdGlvbk5hbWV9ICh3aWxsIHJlc3RhcnQgb24gbmV4dCBpbnZvY2F0aW9uKWAsXG4gICAgICAgIClcblxuICAgICAgICAvLyBTdG9wIHRoZSBjb250YWluZXIgdXNpbmcgRG9ja2VyIHdpdGggZmFzdCB0aW1lb3V0ICgxcylcbiAgICAgICAgLy8gVGhlIGNvbnRhaW5lciBtYXkgYmUgYmxvY2tlZCBvbiBsb25nLXBvbGxpbmcsIHNvIHdlIG5lZWQgdG8gZm9yY2Uga2lsbFxuICAgICAgICBjb25zdCBkb2NrZXIgPSB5aWVsZCogRG9ja2VyXG4gICAgICAgIHlpZWxkKiBkb2NrZXIuc3RvcChjb250YWluZXIuY29udGFpbmVyTmFtZSwgMSkucGlwZShcbiAgICAgICAgICBFZmZlY3Quc2NvcGVkLFxuICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbCgoKSA9PiBFZmZlY3Qudm9pZCksXG4gICAgICAgIClcblxuICAgICAgICAvLyBSZW1vdmUgZnJvbSBtYXAgc28gbmV4dCBpbnZvY2F0aW9uIGNyZWF0ZXMgZnJlc2ggY29udGFpbmVyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb250YWluZXJzID0geWllbGQqIFJlZi5nZXQoY29udGFpbmVyc1JlZilcbiAgICAgICAgY3VycmVudENvbnRhaW5lcnMuZGVsZXRlKGNvbnRhaW5lci5mbi5mdW5jdGlvbk5hbWUpXG4gICAgICAgIHlpZWxkKiBSZWYuc2V0KGNvbnRhaW5lcnNSZWYsIGN1cnJlbnRDb250YWluZXJzKVxuICAgICAgfSxcbiAgICApLnBpcGUoXG4gICAgICBFZmZlY3QucHJvdmlkZShEb2NrZXJMaXZlKSxcbiAgICAgIEVmZmVjdC5jYXRjaEFsbCgoKSA9PiBFZmZlY3Qudm9pZCksXG4gICAgICBFZmZlY3QuZm9ya0RhZW1vbixcbiAgICApXG5cbiAgICBjb250YWluZXIuaWRsZVRpbWVyRmliZXIgPSB0aW1lckZpYmVyXG4gIH0pXG5cbi8qKlxuICogUHJvY2VzcyByZXNwb25zZXMgZnJvbSBhIGNvbnRhaW5lciBhbmQgZGlzcGF0Y2ggdG8gd2FpdGluZyBjYWxsZXJzLlxuICogQWZ0ZXIgZWFjaCByZXNwb25zZSwgcmVzZXRzIHRoZSBpZGxlIHRpbWVyIHRvIHByb2FjdGl2ZWx5IHN0b3AgdGhlIGNvbnRhaW5lclxuICogYmVmb3JlIHRoZSBwb2xsIHRpbWVvdXQgY2F1c2VzIGNvbmZ1c2luZyBMYW1iZGEgUklDIGVycm9ycy5cbiAqL1xuY29uc3QgcHJvY2Vzc0NvbnRhaW5lclJlc3BvbnNlcyA9IChcbiAgY29udGFpbmVyOiBGdW5jdGlvbkNvbnRhaW5lcixcbiAgY29udGFpbmVyc1JlZjogUmVmLlJlZjxNYXA8c3RyaW5nLCBGdW5jdGlvbkNvbnRhaW5lcj4+LFxuICBpZGxlVGltZW91dE1zOiBudW1iZXIsXG4gIGNsaWVudDogUmV0dXJuVHlwZTx0eXBlb2YgbWFrZUFwcFN5bmNDbGllbnQ+LFxuICBpbnZvY2F0aW9uQ29udGV4dHM6IE1hcDxzdHJpbmcsIEludm9jYXRpb25Db250ZXh0Pixcbik6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgRXJyb3IsIENvbW1hbmRFeGVjdXRvci5Db21tYW5kRXhlY3V0b3I+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCByZXNwb25zZUNoYW5uZWwgPSBidWlsZENoYW5uZWxOYW1lLnJlc3BvbnNlKGNvbnRhaW5lci5mbi5mdW5jdGlvbk5hbWUpXG5cbiAgICAvLyBDb250aW51b3VzbHkgcHJvY2VzcyByZXNwb25zZXMgZnJvbSB0aGUgY29udGFpbmVyXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkKiB3YWl0Rm9yUmVzcG9uc2UoY29udGFpbmVyLnJ1bnRpbWVTdGF0ZSlcblxuICAgICAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZU1lc3NhZ2VcbiAgICAgIGlmIChpc0xhbWJkYVJlc3BvbnNlKHJlc3VsdCkpIHtcbiAgICAgICAgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgdHlwZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgIHJlcXVlc3RJZDogcmVzdWx0LnJlcXVlc3RJZCxcbiAgICAgICAgICByZXN1bHQ6IHJlc3VsdC5ib2R5LFxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzTGFtYmRhRXJyb3IocmVzdWx0KSkge1xuICAgICAgICByZXNwb25zZSA9IHtcbiAgICAgICAgICB0eXBlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgcmVxdWVzdElkOiByZXN1bHQucmVxdWVzdElkLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBlcnJvclR5cGU6IHJlc3VsdC5lcnJvclR5cGUsXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHJlc3VsdC5lcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICBzdGFja1RyYWNlOiByZXN1bHQuc3RhY2tUcmFjZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzTGFtYmRhSW5pdEVycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dFcnJvcihcbiAgICAgICAgICBgW0xvY2FsXSBJbml0IGVycm9yOiAke3Jlc3VsdC5lcnJvclR5cGV9OiAke3Jlc3VsdC5lcnJvck1lc3NhZ2V9YCxcbiAgICAgICAgKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gU2VuZCByZXNwb25zZSBiYWNrIHZpYSBBcHBTeW5jXG4gICAgICB5aWVsZCogY2xpZW50LnB1Ymxpc2hSZXNwb25zZShyZXNwb25zZUNoYW5uZWwsIHJlc3BvbnNlKVxuICAgICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhgW0xvY2FsXSBTZW50IHJlc3BvbnNlIGZvciAke3Jlc3BvbnNlLnJlcXVlc3RJZH1gKVxuXG4gICAgICAvLyBQcmludCBlbmQgbWFya2VyIHdpdGggdGltaW5nXG4gICAgICBjb25zdCBjdHggPSBpbnZvY2F0aW9uQ29udGV4dHMuZ2V0KHJlc3BvbnNlLnJlcXVlc3RJZClcbiAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IERhdGUubm93KCkgLSBjdHguc3RhcnRcbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgWyR7Y3R4Lm51bX1dIFxcdTI1MTRcXHUyNTAwXFx1MjUwMCBcXHUyNzE3ICR7cmVzcG9uc2UuZXJyb3IuZXJyb3JUeXBlfTogJHtyZXNwb25zZS5lcnJvci5lcnJvck1lc3NhZ2V9ICgke2R1cmF0aW9uTXN9bXMpIFxcdTI1MDBcXHUyNTAwYCxcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgWyR7Y3R4Lm51bX1dIFxcdTI1MTRcXHUyNTAwXFx1MjUwMCBcXHUyNzEzIERvbmUgKCR7ZHVyYXRpb25Nc31tcykgXFx1MjUwMFxcdTI1MDBgLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICBpbnZvY2F0aW9uQ29udGV4dHMuZGVsZXRlKHJlc3BvbnNlLnJlcXVlc3RJZClcbiAgICAgIH1cblxuICAgICAgLy8gUmVzZXQgaWRsZSB0aW1lciAtIGNvbnRhaW5lciB3aWxsIGJlIHN0b3BwZWQgaWYgbm8gbmV3IGludm9jYXRpb25zIGFycml2ZVxuICAgICAgeWllbGQqIHJlc2V0SWRsZVRpbWVyKGNvbnRhaW5lciwgY29udGFpbmVyc1JlZiwgaWRsZVRpbWVvdXRNcylcbiAgICB9XG4gIH0pXG5cbi8qKlxuICogU3RhcnQgYSBOb2RlLmpzIHdvcmtlciBwcm9jZXNzIGZvciBhIGZ1bmN0aW9uLlxuICogU3Bhd25zIEJ1biB0byBydW4gdGhlIHJ1bnRpbWUgd3JhcHBlciB3aXRoIHRoZSBoYW5kbGVyIHBhdGguXG4gKiBUaGUgd29ya2VyIGNvbnRpbnVvdXNseSBwb2xscyBvdXIgUnVudGltZSBBUEkgZm9yIGludm9jYXRpb25zLlxuICovXG5jb25zdCBzdGFydE5vZGVqc1dvcmtlciA9IChcbiAgZm46IERpc2NvdmVyZWRGdW5jdGlvbixcbiAgcG9ydDogbnVtYmVyLFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGludm9jYXRpb25Db250ZXh0czogTWFwPHN0cmluZywgSW52b2NhdGlvbkNvbnRleHQ+LFxuKTogRWZmZWN0LkVmZmVjdDxDaGlsZFByb2Nlc3MsIEVycm9yPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgaWYgKCFmbi5sb2NhbEhhbmRsZXIpIHtcbiAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmZhaWwoXG4gICAgICAgIG5ldyBFcnJvcihgRnVuY3Rpb24gJHtmbi5mdW5jdGlvbk5hbWV9IGhhcyBubyBsb2NhbCBoYW5kbGVyIHBhdGhgKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBydW50aW1lIHdyYXBwZXIgcGF0aCByZWxhdGl2ZSB0byB0aGlzIG1vZHVsZVxuICAgIGNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybClcbiAgICBjb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoX19maWxlbmFtZSlcbiAgICBjb25zdCBydW50aW1lV3JhcHBlclBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICBfX2Rpcm5hbWUsXG4gICAgICBcIi4uXCIsXG4gICAgICBcInJ1bnRpbWUtd3JhcHBlclwiLFxuICAgICAgXCJub2RlanMtcnVudGltZS5qc1wiLFxuICAgIClcblxuICAgIC8vIEdldCBhYnNvbHV0ZSBwYXRoIHRvIGJ1biBmb3IgcHVyZSBlbnYgaXNvbGF0aW9uIChubyBQQVRIIGRlcGVuZGVuY3kpXG4gICAgY29uc3QgYnVuUGF0aCA9IEJ1bi53aGljaChcImJ1blwiKVxuICAgIGlmICghYnVuUGF0aCkge1xuICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZmFpbChcbiAgICAgICAgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgJ2J1bicgZXhlY3V0YWJsZSBpbiBQQVRIXCIpLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIEJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgd29ya2VyIHByb2Nlc3NcbiAgICAvLyBQdXJlIGlzb2xhdGlvbjogb25seSBlbnYgZnJvbSBicmlkZ2UgKyBsb2NhbCBvdmVycmlkZXMsIG5vIGxvY2FsIFBBVEgvSE9NRVxuICAgIGNvbnN0IHdvcmtlckVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7XG4gICAgICAvLyBTdGFydCB3aXRoIGVudiB2YXJzIGZyb20gdGhlIGJyaWRnZSBMYW1iZGEgKEFXUyBjcmVkZW50aWFscywgdXNlci1kZWZpbmVkIHZhcnMpXG4gICAgICAuLi5lbnYsXG4gICAgICAvLyBMb2NhbCBvdmVycmlkZXMgKHRoZXNlIGFyZSBzZXQgYnkgdGhlIGRhZW1vbiwgbm90IGZyb20gYnJpZGdlKVxuICAgICAgQVdTX0xBTUJEQV9SVU5USU1FX0FQSTogYGxvY2FsaG9zdDoke3BvcnR9YCxcbiAgICAgIF9IQU5ETEVSOiBmbi5sb2NhbEhhbmRsZXIsXG4gICAgICBMQU1CREFfVEFTS19ST09UOiBwcm9qZWN0Um9vdCxcbiAgICAgIC8vIE1lbW9yeSBsaW1pdCBmb3IgY29udGV4dCBvYmplY3RcbiAgICAgIEFXU19MQU1CREFfRlVOQ1RJT05fTUVNT1JZX1NJWkU6IFN0cmluZyhmbi5tZW1vcnlNQiksXG4gICAgfVxuXG4gICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhcbiAgICAgIGBbTG9jYWxdIFN0YXJ0aW5nIE5vZGUuanMgd29ya2VyIGZvciAke2ZuLmZ1bmN0aW9uTmFtZX0gb24gcG9ydCAke3BvcnR9YCxcbiAgICApXG4gICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhgW0xvY2FsXSBIYW5kbGVyOiAke2ZuLmxvY2FsSGFuZGxlcn1gKVxuXG4gICAgLy8gU3Bhd24gQnVuIHdpdGggLS13YXRjaCB0byBhdXRvbWF0aWNhbGx5IHJlc3RhcnQgd2hlbiBoYW5kbGVyIGZpbGVzIGNoYW5nZVxuICAgIC8vIFRoaXMgZW5hYmxlcyBob3QtcmVsb2FkIHdpdGhvdXQgbmVlZGluZyB0byByZXN0YXJ0IHRoZSBkYWVtb25cbiAgICAvLyBVc2UgYWJzb2x1dGUgYnVuIHBhdGggZm9yIHB1cmUgZW52IGlzb2xhdGlvbiAobm8gUEFUSCBkZXBlbmRlbmN5KVxuICAgIGNvbnN0IHdvcmtlclByb2Nlc3MgPSBzcGF3bihidW5QYXRoLCBbXCItLXdhdGNoXCIsIHJ1bnRpbWVXcmFwcGVyUGF0aF0sIHtcbiAgICAgIGN3ZDogcHJvamVjdFJvb3QsXG4gICAgICBlbnY6IHdvcmtlckVudixcbiAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcbiAgICB9KVxuXG4gICAgLy8gUGF0dGVybiB0byBwYXJzZSBMYW1iZGEgbG9nIGZvcm1hdDogVElNRVNUQU1QXFx0UkVRVUVTVF9JRFxcdExFVkVMXFx0TUVTU0FHRVxuICAgIC8vIExhbWJkYSB1c2VzIHRhYnMgYmV0d2VlbiBmaWVsZHMuIENhcHR1cmVzOiBbMV0gPSByZXF1ZXN0IElELCBbMl0gPSBsZXZlbCArIG1lc3NhZ2VcbiAgICBjb25zdCBsYW1iZGFMb2dQYXR0ZXJuID1cbiAgICAgIC9eKFxcZHs0fS1cXGR7Mn0tXFxkezJ9VFtcXGQ6Ll0rWilbXFx0XFxzXSsoWzAtOWEtZi1dezM2fSlbXFx0XFxzXSsoLiopJC9pXG5cbiAgICAvLyBIZWxwZXIgdG8gZm9ybWF0IGxvZyBsaW5lIHdpdGggaW52b2NhdGlvbiBwcmVmaXhcbiAgICBjb25zdCBmb3JtYXRMaW5lID0gKFxuICAgICAgcmF3TGluZTogc3RyaW5nLFxuICAgICk6IHsgcHJlZml4OiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9ID0+IHtcbiAgICAgIC8vIFN0cmlwIGNhcnJpYWdlIHJldHVybnMgdGhhdCBjYW4gY2F1c2UgdGVybWluYWwgY29ycnVwdGlvblxuICAgICAgY29uc3QgbGluZSA9IHJhd0xpbmUucmVwbGFjZSgvXFxyL2csIFwiXCIpXG4gICAgICBjb25zdCBtYXRjaCA9IGxhbWJkYUxvZ1BhdHRlcm4uZXhlYyhsaW5lKVxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IG1hdGNoWzJdXG4gICAgICAgIGNvbnN0IGN0eCA9IGludm9jYXRpb25Db250ZXh0cy5nZXQocmVxdWVzdElkKVxuICAgICAgICBpZiAoY3R4KSB7XG4gICAgICAgICAgLy8gU3RyaXAgdGltZXN0YW1wIGFuZCByZXF1ZXN0IElELCBrZWVwIGp1c3QgTEVWRUwgTUVTU0FHRVxuICAgICAgICAgIHJldHVybiB7IHByZWZpeDogYFske2N0eC5udW19XWAsIGNvbnRlbnQ6IG1hdGNoWzNdIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgcHJlZml4OiBcIltXb3JrZXJdXCIsIGNvbnRlbnQ6IGxpbmUgfVxuICAgIH1cblxuICAgIC8vIEZvcndhcmQgc3Rkb3V0L3N0ZGVyciB3aXRoIGludm9jYXRpb24gbnVtYmVyIHByZWZpeFxuICAgIHdvcmtlclByb2Nlc3Muc3Rkb3V0Py5vbihcImRhdGFcIiwgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgY29uc3QgbGluZXMgPSBkYXRhLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KFwiXFxuXCIpXG4gICAgICBmb3IgKGNvbnN0IHJhd0xpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgY29uc3QgeyBwcmVmaXgsIGNvbnRlbnQgfSA9IGZvcm1hdExpbmUocmF3TGluZSlcbiAgICAgICAgY29uc29sZS5sb2coYCR7cHJlZml4fSAke2NvbnRlbnR9YClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgd29ya2VyUHJvY2Vzcy5zdGRlcnI/Lm9uKFwiZGF0YVwiLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICBjb25zdCBsaW5lcyA9IGRhdGEudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoXCJcXG5cIilcbiAgICAgIGZvciAoY29uc3QgcmF3TGluZSBvZiBsaW5lcykge1xuICAgICAgICBjb25zdCB7IHByZWZpeCwgY29udGVudCB9ID0gZm9ybWF0TGluZShyYXdMaW5lKVxuICAgICAgICBjb25zb2xlLmVycm9yKGAke3ByZWZpeH0gJHtjb250ZW50fWApXG4gICAgICB9XG4gICAgfSlcblxuICAgIHdvcmtlclByb2Nlc3Mub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICBFZmZlY3QucnVuU3luYyhcbiAgICAgICAgRWZmZWN0LmxvZ0Vycm9yKGBXb3JrZXIgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCkucGlwZShcbiAgICAgICAgICBFZmZlY3QuYW5ub3RhdGVMb2dzKFwiZnVuY3Rpb25cIiwgZm4uZnVuY3Rpb25OYW1lKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICB9KVxuXG4gICAgd29ya2VyUHJvY2Vzcy5vbihcImNsb3NlXCIsIChjb2RlKSA9PiB7XG4gICAgICBFZmZlY3QucnVuU3luYyhcbiAgICAgICAgRWZmZWN0LmxvZ0luZm8oYFdvcmtlciBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKS5waXBlKFxuICAgICAgICAgIEVmZmVjdC5hbm5vdGF0ZUxvZ3MoXCJmdW5jdGlvblwiLCBmbi5mdW5jdGlvbk5hbWUpLFxuICAgICAgICApLFxuICAgICAgKVxuICAgIH0pXG5cbiAgICByZXR1cm4gd29ya2VyUHJvY2Vzc1xuICB9KVxuXG4vKipcbiAqIFByb2Nlc3MgcmVzcG9uc2VzIGZyb20gYSBOb2RlLmpzIHdvcmtlciBhbmQgZGlzcGF0Y2ggdG8gd2FpdGluZyBjYWxsZXJzLlxuICovXG5jb25zdCBwcm9jZXNzV29ya2VyUmVzcG9uc2VzID0gKFxuICB3b3JrZXI6IE5vZGVqc1dvcmtlcixcbiAgY2xpZW50OiBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQXBwU3luY0NsaWVudD4sXG4gIGludm9jYXRpb25Db250ZXh0czogTWFwPHN0cmluZywgSW52b2NhdGlvbkNvbnRleHQ+LFxuKSA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgcmVzcG9uc2VDaGFubmVsID0gYnVpbGRDaGFubmVsTmFtZS5yZXNwb25zZSh3b3JrZXIuZm4uZnVuY3Rpb25OYW1lKVxuXG4gICAgLy8gQ29udGludW91c2x5IHByb2Nlc3MgcmVzcG9uc2VzIGZyb20gdGhlIHdvcmtlclxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCogd2FpdEZvclJlc3BvbnNlKHdvcmtlci5ydW50aW1lU3RhdGUpXG5cbiAgICAgIGxldCByZXNwb25zZTogUmVzcG9uc2VNZXNzYWdlXG4gICAgICBpZiAoaXNMYW1iZGFSZXNwb25zZShyZXN1bHQpKSB7XG4gICAgICAgIHJlc3BvbnNlID0ge1xuICAgICAgICAgIHR5cGU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICByZXF1ZXN0SWQ6IHJlc3VsdC5yZXF1ZXN0SWQsXG4gICAgICAgICAgcmVzdWx0OiByZXN1bHQuYm9keSxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0xhbWJkYUVycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgdHlwZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgIHJlcXVlc3RJZDogcmVzdWx0LnJlcXVlc3RJZCxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgZXJyb3JUeXBlOiByZXN1bHQuZXJyb3JUeXBlLFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiByZXN1bHQuZXJyb3JNZXNzYWdlLFxuICAgICAgICAgICAgc3RhY2tUcmFjZTogcmVzdWx0LnN0YWNrVHJhY2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0xhbWJkYUluaXRFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRXJyb3IoXG4gICAgICAgICAgYFtMb2NhbF0gV29ya2VyIGluaXQgZXJyb3I6ICR7cmVzdWx0LmVycm9yVHlwZX06ICR7cmVzdWx0LmVycm9yTWVzc2FnZX1gLFxuICAgICAgICApXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBTZW5kIHJlc3BvbnNlIGJhY2sgdmlhIEFwcFN5bmNcbiAgICAgIHlpZWxkKiBjbGllbnQucHVibGlzaFJlc3BvbnNlKHJlc3BvbnNlQ2hhbm5lbCwgcmVzcG9uc2UpXG4gICAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKGBbTG9jYWxdIFNlbnQgcmVzcG9uc2UgZm9yICR7cmVzcG9uc2UucmVxdWVzdElkfWApXG5cbiAgICAgIC8vIFByaW50IGVuZCBtYXJrZXIgd2l0aCB0aW1pbmdcbiAgICAgIGNvbnN0IGN0eCA9IGludm9jYXRpb25Db250ZXh0cy5nZXQocmVzcG9uc2UucmVxdWVzdElkKVxuICAgICAgaWYgKGN0eCkge1xuICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gRGF0ZS5ub3coKSAtIGN0eC5zdGFydFxuICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBbJHtjdHgubnVtfV0gXFx1MjUxNFxcdTI1MDBcXHUyNTAwIFxcdTI3MTcgJHtyZXNwb25zZS5lcnJvci5lcnJvclR5cGV9OiAke3Jlc3BvbnNlLmVycm9yLmVycm9yTWVzc2FnZX0gKCR7ZHVyYXRpb25Nc31tcykgXFx1MjUwMFxcdTI1MDBgLFxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBbJHtjdHgubnVtfV0gXFx1MjUxNFxcdTI1MDBcXHUyNTAwIFxcdTI3MTMgRG9uZSAoJHtkdXJhdGlvbk1zfW1zKSBcXHUyNTAwXFx1MjUwMGAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIGludm9jYXRpb25Db250ZXh0cy5kZWxldGUocmVzcG9uc2UucmVxdWVzdElkKVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuLyoqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gY29tcGxldGVseSBmaWx0ZXIgb3V0IGZyb20gaW52b2NhdGlvbiBlbnYuXG4gKiBUaGVzZSBhcmUgbm90IHJlbGV2YW50IGZvciBsb2NhbCBleGVjdXRpb24uXG4gKi9cbmNvbnN0IEVOVl9WQVJTX1RPX0ZJTFRFUiA9IG5ldyBTZXQoW1wiQVdTX0xBTUJEQV9MT0dfU1RSRUFNX05BTUVcIl0pXG5cbi8qKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGlnbm9yZSB3aGVuIGNhbGN1bGF0aW5nIGlmIGVudiBoYXMgY2hhbmdlZC5cbiAqIFRoZXNlIGNoYW5nZSBmcmVxdWVudGx5IGJ1dCBkb24ndCByZXF1aXJlIGEgY29udGFpbmVyIHJlc3RhcnQuXG4gKlxuICogVE9ETzogQVdTIGNyZWRlbnRpYWxzIChBQ0NFU1NfS0VZX0lELCBTRUNSRVRfQUNDRVNTX0tFWSwgU0VTU0lPTl9UT0tFTilcbiAqIGRvIGV4cGlyZSBhbmQgd2lsbCBuZWVkIHJlZnJlc2hpbmcuIEZvciBub3cgd2UgaWdub3JlIHRoZW0gdG8gYXZvaWRcbiAqIHVubmVjZXNzYXJ5IHJlc3RhcnRzLCBidXQgd2Ugc2hvdWxkIGltcGxlbWVudCBjcmVkZW50aWFsIHJlZnJlc2ggbG9naWNcbiAqIHRoYXQgdXBkYXRlcyB0aGUgY29udGFpbmVyJ3MgY3JlZGVudGlhbHMgd2l0aG91dCBhIGZ1bGwgcmVzdGFydC5cbiAqL1xuY29uc3QgRU5WX1ZBUlNfVE9fSUdOT1JFX0lOX0RJRkYgPSBuZXcgU2V0KFtcbiAgXCJBV1NfQUNDRVNTX0tFWV9JRFwiLFxuICBcIkFXU19TRUNSRVRfQUNDRVNTX0tFWVwiLFxuICBcIkFXU19TRVNTSU9OX1RPS0VOXCIsXG5dKVxuXG4vKipcbiAqIEZpbHRlciBvdXQgaXJyZWxldmFudCBlbnYgdmFycyBmcm9tIGludm9jYXRpb24gZW52aXJvbm1lbnQuXG4gKi9cbmNvbnN0IHNhbml0aXplSW52b2NhdGlvbkVudiA9IChcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9PiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudikpIHtcbiAgICBpZiAoIUVOVl9WQVJTX1RPX0ZJTFRFUi5oYXMoa2V5KSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogQ29tcHV0ZSB3aGljaCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaGF2ZSBjaGFuZ2VkIGJldHdlZW4gdHdvIGVudiBvYmplY3RzLlxuICogUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkgb2YgdGhlIGNoYW5nZXMuXG4gKiBJZ25vcmVzIGVudiB2YXJzIGluIEVOVl9WQVJTX1RPX0lHTk9SRV9JTl9ESUZGLlxuICovXG5jb25zdCBnZXRFbnZEaWZmID0gKFxuICBvbGRFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG5ld0VudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGNoYW5nZXM6IHN0cmluZ1tdID0gW11cblxuICAvLyBDaGVjayBmb3IgYWRkZWQgb3IgbW9kaWZpZWQga2V5c1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhuZXdFbnYpKSB7XG4gICAgaWYgKEVOVl9WQVJTX1RPX0lHTk9SRV9JTl9ESUZGLmhhcyhrZXkpKSBjb250aW51ZVxuICAgIGlmICghKGtleSBpbiBvbGRFbnYpKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goYCske2tleX1gKVxuICAgIH0gZWxzZSBpZiAob2xkRW52W2tleV0gIT09IG5ld0VudltrZXldKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goYH4ke2tleX1gKVxuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGZvciByZW1vdmVkIGtleXNcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2xkRW52KSkge1xuICAgIGlmIChFTlZfVkFSU19UT19JR05PUkVfSU5fRElGRi5oYXMoa2V5KSkgY29udGludWVcbiAgICBpZiAoIShrZXkgaW4gbmV3RW52KSkge1xuICAgICAgY2hhbmdlcy5wdXNoKGAtJHtrZXl9YClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2hhbmdlcy5qb2luKFwiLCBcIilcbn1cblxuLyoqXG4gKiBFbnN1cmUgYSBOb2RlLmpzIHdvcmtlciBpcyBzdGFydGVkIGZvciBhIGZ1bmN0aW9uLlxuICogSWYgdGhlIHdvcmtlciBhbHJlYWR5IGV4aXN0cywgcmV0dXJuIGl0LlxuICogT3RoZXJ3aXNlLCBjcmVhdGUgdGhlIFJ1bnRpbWUgQVBJIHNlcnZlciwgYWRkIHRvIHdvcmtlcnMgbWFwLCBhbmQgc3RhcnQgdGhlIHdvcmtlci5cbiAqL1xuY29uc3QgZW5zdXJlV29ya2VyU3RhcnRlZCA9IChcbiAgZm46IERpc2NvdmVyZWRGdW5jdGlvbixcbiAgaW52b2NhdGlvbkVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgd29ya2Vyc1JlZjogUmVmLlJlZjxNYXA8c3RyaW5nLCBOb2RlanNXb3JrZXI+PixcbiAgc2VydmVyU2NvcGU6IFNjb3BlLlNjb3BlLFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBhcHBTeW5jQ2xpZW50OiBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQXBwU3luY0NsaWVudD4sXG4gIGludm9jYXRpb25Db250ZXh0czogTWFwPHN0cmluZywgSW52b2NhdGlvbkNvbnRleHQ+LFxuKTogRWZmZWN0LkVmZmVjdDxOb2RlanNXb3JrZXIsIEVycm9yPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgLy8gQ2hlY2sgaWYgd29ya2VyIGFscmVhZHkgZXhpc3RzXG4gICAgY29uc3QgY3VycmVudFdvcmtlcnMgPSB5aWVsZCogUmVmLmdldCh3b3JrZXJzUmVmKVxuICAgIGNvbnN0IGV4aXN0aW5nID0gY3VycmVudFdvcmtlcnMuZ2V0KGZuLmZ1bmN0aW9uTmFtZSlcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIC8vIENoZWNrIGlmIGVudiB2YXJzIGhhdmUgY2hhbmdlZCAoZS5nLiwgYWZ0ZXIgQ0RLIHJlZGVwbG95KVxuICAgICAgY29uc3QgZW52RGlmZiA9IGdldEVudkRpZmYoZXhpc3RpbmcuZW52LCBpbnZvY2F0aW9uRW52KVxuICAgICAgaWYgKGVudkRpZmYpIHtcbiAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dJbmZvKFxuICAgICAgICAgIGBbTG9jYWxdIEVudmlyb25tZW50IGNoYW5nZWQgZm9yICR7Zm4uZnVuY3Rpb25OYW1lfSwgcmVzdGFydGluZyB3b3JrZXIuLi4gKCR7ZW52RGlmZn0pYCxcbiAgICAgICAgKVxuICAgICAgICAvLyBLaWxsIHRoZSBvbGQgd29ya2VyXG4gICAgICAgIHlpZWxkKiBFZmZlY3QudHJ5KCgpID0+IGV4aXN0aW5nLndvcmtlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIikpLnBpcGUoXG4gICAgICAgICAgRWZmZWN0LmNhdGNoQWxsKCgpID0+IEVmZmVjdC52b2lkKSxcbiAgICAgICAgKVxuICAgICAgICAvLyBSZW1vdmUgZnJvbSBtYXAgc28gd2UgY3JlYXRlIGEgbmV3IG9uZSBiZWxvd1xuICAgICAgICBjdXJyZW50V29ya2Vycy5kZWxldGUoZm4uZnVuY3Rpb25OYW1lKVxuICAgICAgICB5aWVsZCogUmVmLnNldCh3b3JrZXJzUmVmLCBjdXJyZW50V29ya2VycylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBleGlzdGluZ1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdvcmtlciBkb2Vzbid0IGV4aXN0IC0gc3RhcnQgaXQgbGF6aWx5XG4gICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhcbiAgICAgIGBbTG9jYWxdIFN0YXJ0aW5nIE5vZGUuanMgd29ya2VyIGZvciBmaXJzdCBpbnZvY2F0aW9uIG9mICR7Zm4uZnVuY3Rpb25OYW1lfS4uLmAsXG4gICAgKVxuXG4gICAgLy8gQ3JlYXRlIFJ1bnRpbWUgQVBJIHNlcnZlciBvbiBlcGhlbWVyYWwgcG9ydFxuICAgIGNvbnN0IHsgcG9ydCwgc3RhdGU6IHJ1bnRpbWVTdGF0ZSB9ID0geWllbGQqIHN0YXJ0UnVudGltZUFwaVNlcnZlcih7XG4gICAgICBmdW5jdGlvbk1ldGFkYXRhOiB7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogZm4uZnVuY3Rpb25OYW1lLFxuICAgICAgICBmdW5jdGlvblZlcnNpb246IFwiJExBVEVTVFwiLFxuICAgICAgICBoYW5kbGVyOiBmbi5sb2NhbEhhbmRsZXIsXG4gICAgICB9LFxuICAgIH0pLnBpcGUoRWZmZWN0LnByb3ZpZGVTZXJ2aWNlKFNjb3BlLlNjb3BlLCBzZXJ2ZXJTY29wZSkpXG5cbiAgICAvLyBDcmVhdGUgd29ya2VyIG9iamVjdCAod2l0aG91dCBwcm9jZXNzIGluaXRpYWxseSAtIHdpbGwgYmUgc2V0IGFmdGVyIHN0YXJ0KVxuICAgIC8vIFdlIGFkZCB0byBtYXAgQkVGT1JFIHN0YXJ0aW5nIHdvcmtlciB0byBoYW5kbGUgY29uY3VycmVudCBpbnZvY2F0aW9uc1xuICAgIGNvbnN0IHdvcmtlcjogTm9kZWpzV29ya2VyID0ge1xuICAgICAgZm4sXG4gICAgICBydW50aW1lU3RhdGUsXG4gICAgICBwb3J0LFxuICAgICAgd29ya2VyUHJvY2VzczogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgQ2hpbGRQcm9jZXNzLCAvLyBXaWxsIGJlIHNldCBzaG9ydGx5XG4gICAgICBlbnY6IGludm9jYXRpb25FbnYsXG4gICAgfVxuXG4gICAgLy8gQWRkIHRvIG1hcCBpbW1lZGlhdGVseSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgIGN1cnJlbnRXb3JrZXJzLnNldChmbi5mdW5jdGlvbk5hbWUsIHdvcmtlcilcbiAgICB5aWVsZCogUmVmLnNldCh3b3JrZXJzUmVmLCBjdXJyZW50V29ya2VycylcblxuICAgIC8vIFN0YXJ0IHRoZSB3b3JrZXIgcHJvY2VzcyAtIHJlbW92ZSBmcm9tIG1hcCBvbiBmYWlsdXJlXG4gICAgY29uc3Qgd29ya2VyUHJvY2VzcyA9IHlpZWxkKiBzdGFydE5vZGVqc1dvcmtlcihcbiAgICAgIGZuLFxuICAgICAgcG9ydCxcbiAgICAgIHByb2plY3RSb290LFxuICAgICAgaW52b2NhdGlvbkVudixcbiAgICAgIGludm9jYXRpb25Db250ZXh0cyxcbiAgICApLnBpcGUoXG4gICAgICBFZmZlY3QuY2F0Y2hBbGwoKGVycm9yKSA9PlxuICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIGJyb2tlbiB3b3JrZXIgZnJvbSBtYXAgb24gZmFpbHVyZVxuICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRXJyb3IoXG4gICAgICAgICAgICBgW0xvY2FsXSBGYWlsZWQgdG8gc3RhcnQgd29ya2VyIGZvciAke2ZuLmZ1bmN0aW9uTmFtZX06ICR7ZXJyb3J9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IHlpZWxkKiBSZWYuZ2V0KHdvcmtlcnNSZWYpXG4gICAgICAgICAgY3VycmVudC5kZWxldGUoZm4uZnVuY3Rpb25OYW1lKVxuICAgICAgICAgIHlpZWxkKiBSZWYuc2V0KHdvcmtlcnNSZWYsIGN1cnJlbnQpXG4gICAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZmFpbChlcnJvcilcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgIClcblxuICAgIC8vIFVwZGF0ZSB3b3JrZXIgd2l0aCB0aGUgcHJvY2Vzc1xuICAgIHdvcmtlci53b3JrZXJQcm9jZXNzID0gd29ya2VyUHJvY2Vzc1xuXG4gICAgLy8gU3RhcnQgcHJvY2Vzc2luZyByZXNwb25zZXMgaW4gdGhlIGJhY2tncm91bmRcbiAgICBFZmZlY3QucnVuRm9yayhcbiAgICAgIHByb2Nlc3NXb3JrZXJSZXNwb25zZXMod29ya2VyLCBhcHBTeW5jQ2xpZW50LCBpbnZvY2F0aW9uQ29udGV4dHMpLFxuICAgIClcblxuICAgIHJldHVybiB3b3JrZXJcbiAgfSlcblxuLyoqXG4gKiBFbnN1cmUgYSBjb250YWluZXIgaXMgc3RhcnRlZCBmb3IgYSBmdW5jdGlvbi5cbiAqIElmIHRoZSBjb250YWluZXIgYWxyZWFkeSBleGlzdHMsIHJldHVybiBpdC5cbiAqIElmIHRoZSBlbnYgdmFycyBoYXZlIGNoYW5nZWQsIHJlc3RhcnQgdGhlIGNvbnRhaW5lci5cbiAqIE90aGVyd2lzZSwgY3JlYXRlIHRoZSBSdW50aW1lIEFQSSBzZXJ2ZXIsIGFkZCB0byBjb250YWluZXJzIG1hcCwgYW5kIHN0YXJ0IHRoZSBjb250YWluZXIuXG4gKi9cbmNvbnN0IGVuc3VyZUNvbnRhaW5lclN0YXJ0ZWQgPSAoXG4gIGZuOiBEaXNjb3ZlcmVkRnVuY3Rpb24sXG4gIGludm9jYXRpb25FbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGNvbnRhaW5lcnNSZWY6IFJlZi5SZWY8TWFwPHN0cmluZywgRnVuY3Rpb25Db250YWluZXI+PixcbiAgc2VydmVyU2NvcGU6IFNjb3BlLlNjb3BlLFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuICBpZGxlVGltZW91dE1zOiBudW1iZXIsXG4gIHBvbGxUaW1lb3V0TXM6IG51bWJlcixcbiAgYXBwU3luY0NsaWVudDogUmV0dXJuVHlwZTx0eXBlb2YgbWFrZUFwcFN5bmNDbGllbnQ+LFxuICBpbnZvY2F0aW9uQ29udGV4dHM6IE1hcDxzdHJpbmcsIEludm9jYXRpb25Db250ZXh0Pixcbik6IEVmZmVjdC5FZmZlY3Q8RnVuY3Rpb25Db250YWluZXIsIEVycm9yLCBDb21tYW5kRXhlY3V0b3IuQ29tbWFuZEV4ZWN1dG9yPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgLy8gQ2hlY2sgaWYgY29udGFpbmVyIGFscmVhZHkgZXhpc3RzXG4gICAgY29uc3QgY3VycmVudENvbnRhaW5lcnMgPSB5aWVsZCogUmVmLmdldChjb250YWluZXJzUmVmKVxuICAgIGNvbnN0IGV4aXN0aW5nID0gY3VycmVudENvbnRhaW5lcnMuZ2V0KGZuLmZ1bmN0aW9uTmFtZSlcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIC8vIENoZWNrIGlmIGVudiB2YXJzIGhhdmUgY2hhbmdlZCAoZS5nLiwgYWZ0ZXIgQ0RLIHJlZGVwbG95KVxuICAgICAgY29uc3QgZW52RGlmZiA9IGdldEVudkRpZmYoZXhpc3RpbmcuZW52LCBpbnZvY2F0aW9uRW52KVxuICAgICAgaWYgKGVudkRpZmYpIHtcbiAgICAgICAgLy8gSU1QT1JUQU5UOiBVcGRhdGUgZW52IGltbWVkaWF0ZWx5IChiZWZvcmUgYW55IHlpZWxkcykgdG8gcHJldmVudFxuICAgICAgICAvLyBvdGhlciBjb25jdXJyZW50IGludm9jYXRpb25zIGZyb20gYWxzbyBkZXRlY3RpbmcgdGhlIGNoYW5nZSBhbmRcbiAgICAgICAgLy8gdHJpZ2dlcmluZyBkdXBsaWNhdGUgcmVzdGFydHNcbiAgICAgICAgZXhpc3RpbmcuZW52ID0gaW52b2NhdGlvbkVudlxuXG4gICAgICAgIC8vIElmIGFscmVhZHkgcmVzdGFydGluZyBmb3IgZW52IGNoYW5nZSwganVzdCByZXR1cm4gdGhlIGV4aXN0aW5nIGNvbnRhaW5lclxuICAgICAgICAvLyBUaGUgaW52b2NhdGlvbiB3aWxsIGJlIHF1ZXVlZCBhbmQgcGlja2VkIHVwIGJ5IHRoZSBuZXcgY29udGFpbmVyXG4gICAgICAgIGlmIChleGlzdGluZy5pc1JlYnVpbGRpbmcpIHtcbiAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKFxuICAgICAgICAgICAgYFtMb2NhbF0gRW52aXJvbm1lbnQgY2hhbmdlIHJlc3RhcnQgYWxyZWFkeSBpbiBwcm9ncmVzcyBmb3IgJHtmbi5mdW5jdGlvbk5hbWV9LCBxdWV1ZWluZyBpbnZvY2F0aW9uYCxcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nXG4gICAgICAgIH1cblxuICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oXG4gICAgICAgICAgYFtMb2NhbF0gRW52aXJvbm1lbnQgY2hhbmdlZCBmb3IgJHtmbi5mdW5jdGlvbk5hbWV9LCByZXN0YXJ0aW5nIGNvbnRhaW5lci4uLiAoJHtlbnZEaWZmfSlgLFxuICAgICAgICApXG4gICAgICAgIGV4aXN0aW5nLmlzUmVidWlsZGluZyA9IHRydWVcblxuICAgICAgICAvLyBTdG9wIHRoZSBEb2NrZXIgY29udGFpbmVyIGZvcmNlZnVsbHkgKHRpbWVvdXQ9MXMpXG4gICAgICAgIC8vIFRoaXMgc2VuZHMgU0lHVEVSTSBhbmQgdGhlbiBTSUdLSUxMIGFmdGVyIDEgc2Vjb25kXG4gICAgICAgIC8vIFdlIG11c3QgZG8gdGhpcyBCRUZPUkUgaW50ZXJydXB0aW5nIHRoZSBmaWJlciwgYmVjYXVzZSB0aGUgZmliZXIgaXNcbiAgICAgICAgLy8gYmxvY2tlZCB3YWl0aW5nIGZvciB0aGUgZG9ja2VyIHByb2Nlc3MgdG8gZXhpdFxuICAgICAgICB5aWVsZCogRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgIGNvbnN0IGRvY2tlciA9IHlpZWxkKiBEb2NrZXJcbiAgICAgICAgICB5aWVsZCogZG9ja2VyLnN0b3AoZXhpc3RpbmcuY29udGFpbmVyTmFtZSwgMSkucGlwZShFZmZlY3Quc2NvcGVkKVxuICAgICAgICB9KS5waXBlKFxuICAgICAgICAgIEVmZmVjdC5wcm92aWRlKERvY2tlckxpdmUpLFxuICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbCgoZXJyb3IpID0+XG4gICAgICAgICAgICBFZmZlY3QubG9nRGVidWcoXG4gICAgICAgICAgICAgIGBbTG9jYWxdIEVycm9yIHN0b3BwaW5nIGNvbnRhaW5lciAobWF5IGFscmVhZHkgYmUgc3RvcHBlZCk6ICR7ZXJyb3J9YCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuXG4gICAgICAgIC8vIE5vdyBpbnRlcnJ1cHQgdGhlIGZpYmVyIChpdCBzaG91bGQgY29tcGxldGUgcXVpY2tseSBzaW5jZSBjb250YWluZXIgc3RvcHBlZClcbiAgICAgICAgeWllbGQqIEZpYmVyLmludGVycnVwdChleGlzdGluZy5jb250YWluZXJGaWJlcikucGlwZShcbiAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGwoKCkgPT4gRWZmZWN0LnZvaWQpLFxuICAgICAgICApXG5cbiAgICAgICAgLy8gUmVzdGFydCB0aGUgY29udGFpbmVyIHdpdGggbmV3IGVudmlyb25tZW50LCByZXVzaW5nIGV4aXN0aW5nIFJ1bnRpbWVBUElcbiAgICAgICAgY29uc3QgbmV3RmliZXIgPSB5aWVsZCogc3RhcnRGdW5jdGlvbkNvbnRhaW5lcihcbiAgICAgICAgICBmbixcbiAgICAgICAgICBleGlzdGluZy5wb3J0LFxuICAgICAgICAgIHByb2plY3RSb290LFxuICAgICAgICAgIGludm9jYXRpb25FbnYsXG4gICAgICAgICAgaW52b2NhdGlvbkNvbnRleHRzLFxuICAgICAgICApLnBpcGUoXG4gICAgICAgICAgRWZmZWN0LmNhdGNoQWxsKChlcnJvcikgPT5cbiAgICAgICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dFcnJvcihcbiAgICAgICAgICAgICAgICBgW0xvY2FsXSBGYWlsZWQgdG8gcmVzdGFydCBjb250YWluZXIgZm9yICR7Zm4uZnVuY3Rpb25OYW1lfTogJHtlcnJvcn1gLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGV4aXN0aW5nLmlzUmVidWlsZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmZhaWwoZXJyb3IpXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICApXG5cbiAgICAgICAgLy8gVXBkYXRlIGNvbnRhaW5lciB3aXRoIG5ldyBmaWJlclxuICAgICAgICBleGlzdGluZy5jb250YWluZXJGaWJlciA9IG5ld0ZpYmVyXG4gICAgICAgIGV4aXN0aW5nLmlzUmVidWlsZGluZyA9IGZhbHNlXG5cbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb250YWluZXIgZG9lc24ndCBleGlzdCAtIHN0YXJ0IGl0IGxhemlseVxuICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcbiAgICAgIGBbTG9jYWxdIFN0YXJ0aW5nIGNvbnRhaW5lciBmb3IgZmlyc3QgaW52b2NhdGlvbiBvZiAke2ZuLmZ1bmN0aW9uTmFtZX0uLi5gLFxuICAgIClcblxuICAgIC8vIENyZWF0ZSBSdW50aW1lIEFQSSBzZXJ2ZXIgb24gZXBoZW1lcmFsIHBvcnRcbiAgICAvLyBVc2UgcG9sbCB0aW1lb3V0IHRoYXQncyBzaG9ydGVyIHRoYW4gaWRsZSB0aW1lb3V0IHNvIGNvbnRhaW5lciBleGl0cyBuYXR1cmFsbHlcbiAgICBjb25zdCB7IHBvcnQsIHN0YXRlOiBydW50aW1lU3RhdGUgfSA9IHlpZWxkKiBzdGFydFJ1bnRpbWVBcGlTZXJ2ZXIoe1xuICAgICAgcG9sbFRpbWVvdXRNcyxcbiAgICAgIGZ1bmN0aW9uTWV0YWRhdGE6IHtcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBmbi5mdW5jdGlvbk5hbWUsXG4gICAgICAgIGZ1bmN0aW9uVmVyc2lvbjogXCIkTEFURVNUXCIsXG4gICAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgfSxcbiAgICB9KS5waXBlKEVmZmVjdC5wcm92aWRlU2VydmljZShTY29wZS5TY29wZSwgc2VydmVyU2NvcGUpKVxuXG4gICAgLy8gR2VuZXJhdGUgY29udGFpbmVyIG5hbWUgYW5kIGltYWdlIG5hbWVcbiAgICBjb25zdCBjb250YWluZXJOYW1lID0gYGxhbWJkYS0ke2ZuLmZ1bmN0aW9uTmFtZS5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCItXCIpfWBcbiAgICBjb25zdCBpbWFnZU5hbWUgPSBgbGl2ZS1sYW1iZGEtJHtmbi5mdW5jdGlvbk5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csIFwiLVwiKX1gXG5cbiAgICAvLyBDcmVhdGUgY29udGFpbmVyIG9iamVjdCAod2l0aG91dCBmaWJlciBpbml0aWFsbHkgLSB3aWxsIGJlIHNldCBhZnRlciBzdGFydClcbiAgICAvLyBXZSBhZGQgdG8gbWFwIEJFRk9SRSBzdGFydGluZyBjb250YWluZXIgdG8gaGFuZGxlIGNvbmN1cnJlbnQgaW52b2NhdGlvbnNcbiAgICBjb25zdCBjb250YWluZXI6IEZ1bmN0aW9uQ29udGFpbmVyID0ge1xuICAgICAgZm4sXG4gICAgICBydW50aW1lU3RhdGUsXG4gICAgICBwb3J0LFxuICAgICAgY29udGFpbmVyRmliZXI6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIEZpYmVyLlJ1bnRpbWVGaWJlcjx2b2lkLCBFcnJvcj4sIC8vIFdpbGwgYmUgc2V0IHNob3J0bHlcbiAgICAgIGNvbnRhaW5lck5hbWUsXG4gICAgICBpbWFnZU5hbWUsXG4gICAgICBpc1JlYnVpbGRpbmc6IGZhbHNlLFxuICAgICAgcGVuZGluZ1Jlc3BvbnNlczogbmV3IE1hcCgpLFxuICAgICAgaWRsZVRpbWVyRmliZXI6IG51bGwsXG4gICAgICBlbnY6IGludm9jYXRpb25FbnYsXG4gICAgfVxuXG4gICAgLy8gQWRkIHRvIG1hcCBpbW1lZGlhdGVseSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgIGN1cnJlbnRDb250YWluZXJzLnNldChmbi5mdW5jdGlvbk5hbWUsIGNvbnRhaW5lcilcbiAgICB5aWVsZCogUmVmLnNldChjb250YWluZXJzUmVmLCBjdXJyZW50Q29udGFpbmVycylcblxuICAgIC8vIEJ1aWxkIGFuZCBzdGFydCB0aGUgY29udGFpbmVyIC0gcmVtb3ZlIGZyb20gbWFwIG9uIGZhaWx1cmVcbiAgICBjb25zdCBjb250YWluZXJGaWJlciA9IHlpZWxkKiBzdGFydEZ1bmN0aW9uQ29udGFpbmVyKFxuICAgICAgZm4sXG4gICAgICBwb3J0LFxuICAgICAgcHJvamVjdFJvb3QsXG4gICAgICBpbnZvY2F0aW9uRW52LFxuICAgICAgaW52b2NhdGlvbkNvbnRleHRzLFxuICAgICkucGlwZShcbiAgICAgIEVmZmVjdC5jYXRjaEFsbCgoZXJyb3IpID0+XG4gICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAvLyBSZW1vdmUgYnJva2VuIGNvbnRhaW5lciBmcm9tIG1hcCBvbiBmYWlsdXJlXG4gICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dFcnJvcihcbiAgICAgICAgICAgIGBbTG9jYWxdIEZhaWxlZCB0byBzdGFydCBjb250YWluZXIgZm9yICR7Zm4uZnVuY3Rpb25OYW1lfTogJHtlcnJvcn1gLFxuICAgICAgICAgIClcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0geWllbGQqIFJlZi5nZXQoY29udGFpbmVyc1JlZilcbiAgICAgICAgICBjdXJyZW50LmRlbGV0ZShmbi5mdW5jdGlvbk5hbWUpXG4gICAgICAgICAgeWllbGQqIFJlZi5zZXQoY29udGFpbmVyc1JlZiwgY3VycmVudClcbiAgICAgICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5mYWlsKGVycm9yKVxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKVxuXG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciB3aXRoIHRoZSBmaWJlclxuICAgIGNvbnRhaW5lci5jb250YWluZXJGaWJlciA9IGNvbnRhaW5lckZpYmVyXG5cbiAgICAvLyBTdGFydCBwcm9jZXNzaW5nIHJlc3BvbnNlcyBpbiB0aGUgYmFja2dyb3VuZCB1c2luZyBmb3JrRGFlbW9uXG4gICAgeWllbGQqIHByb2Nlc3NDb250YWluZXJSZXNwb25zZXMoXG4gICAgICBjb250YWluZXIsXG4gICAgICBjb250YWluZXJzUmVmLFxuICAgICAgaWRsZVRpbWVvdXRNcyxcbiAgICAgIGFwcFN5bmNDbGllbnQsXG4gICAgICBpbnZvY2F0aW9uQ29udGV4dHMsXG4gICAgKS5waXBlKEVmZmVjdC5mb3JrRGFlbW9uKVxuXG4gICAgcmV0dXJuIGNvbnRhaW5lclxuICB9KVxuXG4vKipcbiAqIFJlYnVpbGQgYSBEb2NrZXIgY29udGFpbmVyIGFmdGVyIGZpbGUgY2hhbmdlcy5cbiAqIEludm9jYXRpb25zIGFycml2aW5nIGR1cmluZyByZWJ1aWxkIHdpbGwgYmUgcXVldWVkIGFuZCBwaWNrZWQgdXAgYnkgdGhlIG5ldyBjb250YWluZXIuXG4gKi9cbmNvbnN0IHJlYnVpbGREb2NrZXJDb250YWluZXIgPSAoXG4gIGZ1bmN0aW9uSWQ6IHN0cmluZyxcbiAgY29udGFpbmVyc1JlZjogUmVmLlJlZjxNYXA8c3RyaW5nLCBGdW5jdGlvbkNvbnRhaW5lcj4+LFxuICBwcm9qZWN0Um9vdDogc3RyaW5nLFxuKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBFcnJvciwgQ29tbWFuZEV4ZWN1dG9yLkNvbW1hbmRFeGVjdXRvcj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IGNvbnRhaW5lcnMgPSB5aWVsZCogUmVmLmdldChjb250YWluZXJzUmVmKVxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbnRhaW5lcnMuZ2V0KGZ1bmN0aW9uSWQpXG5cbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgeWllbGQqIEVmZmVjdC5sb2dJbmZvKFxuICAgICAgICBgW0xvY2FsXSBDYW5ub3QgcmVidWlsZCAke2Z1bmN0aW9uSWR9IC0gY29udGFpbmVyIG5vdCBmb3VuZGAsXG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBNYXJrIGFzIHJlYnVpbGRpbmcgLSBpbnZvY2F0aW9ucyB3aWxsIHN0aWxsIHF1ZXVlIGJ1dCB3ZSBsb2cgaXRcbiAgICBjb250YWluZXIuaXNSZWJ1aWxkaW5nID0gdHJ1ZVxuXG4gICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhgW0xvY2FsXSBSZWJ1aWxkaW5nIGNvbnRhaW5lciBmb3IgJHtmdW5jdGlvbklkfS4uLmApXG5cbiAgICBjb25zdCBkb2NrZXIgPSB5aWVsZCogRG9ja2VyXG5cbiAgICAvLyBTdG9wIHRoZSBleGlzdGluZyBjb250YWluZXIgdXNpbmcgRG9ja2VyIHNlcnZpY2VcbiAgICBjb25zdCBjb250YWluZXJJZCA9IGNvbnRhaW5lci5jb250YWluZXJOYW1lXG4gICAgeWllbGQqIEVmZmVjdC5sb2dJbmZvKFxuICAgICAgYFtMb2NhbF0gU3RvcHBpbmcgY29udGFpbmVyIHdpdGggbmFtZSBwcmVmaXg6ICR7Y29udGFpbmVySWR9YCxcbiAgICApXG5cbiAgICBjb25zdCBzdG9wQ291bnQgPSB5aWVsZCogZG9ja2VyLnN0b3AoY29udGFpbmVySWQpLnBpcGUoXG4gICAgICBFZmZlY3Quc2NvcGVkLFxuICAgICAgRWZmZWN0LmNhdGNoQWxsKChlcnJvcikgPT5cbiAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhgTm90ZTogQ29udGFpbmVyIHN0b3AgaGFkIGlzc3VlOiAke2Vycm9yfWApXG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgIClcbiAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKGBbTG9jYWxdIFN0b3BwZWQgJHtzdG9wQ291bnR9IGNvbnRhaW5lcihzKWApXG5cbiAgICAvLyBSZXNvbHZlIHRoZSBjb250ZXh0IHBhdGhcbiAgICBjb25zdCBmbiA9IGNvbnRhaW5lci5mblxuICAgIGNvbnN0IGNvbnRleHRQYXRoID0gZm4uZG9ja2VyQ29udGV4dFBhdGg/LnN0YXJ0c1dpdGgoXCIvXCIpXG4gICAgICA/IGZuLmRvY2tlckNvbnRleHRQYXRoXG4gICAgICA6IGAke3Byb2plY3RSb290fS8ke2ZuLmRvY2tlckNvbnRleHRQYXRofWBcblxuICAgIC8vIERldGVybWluZSBwbGF0Zm9ybSBmcm9tIGFyY2hpdGVjdHVyZVxuICAgIGNvbnN0IHBsYXRmb3JtID0gZm4uYXJjaGl0ZWN0dXJlID09PSBcImFybTY0XCIgPyBcImxpbnV4L2FybTY0XCIgOiBcImxpbnV4L2FtZDY0XCJcblxuICAgIC8vIFJlYnVpbGQgdGhlIERvY2tlciBpbWFnZVxuICAgIHlpZWxkKiBkb2NrZXJcbiAgICAgIC5idWlsZCh7XG4gICAgICAgIGNvbnRleHRQYXRoLFxuICAgICAgICBpbWFnZU5hbWU6IGNvbnRhaW5lci5pbWFnZU5hbWUsXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgfSlcbiAgICAgIC5waXBlKEVmZmVjdC5zY29wZWQpXG5cbiAgICAvLyBJbnNwZWN0IHRoZSBpbWFnZSB0byBnZXQgb3JpZ2luYWwgZW50cnlwb2ludC9jbWQgZm9yIGV4dGVuc2lvbiB3cmFwcGVyXG4gICAgY29uc3QgaW1hZ2VDb25maWcgPSB5aWVsZCogZG9ja2VyXG4gICAgICAuaW5zcGVjdChjb250YWluZXIuaW1hZ2VOYW1lKVxuICAgICAgLnBpcGUoRWZmZWN0LnNjb3BlZClcbiAgICBjb25zdCBleHRlbnNpb25XcmFwcGVyID0gYnVpbGRFeHRlbnNpb25XcmFwcGVyQ29tbWFuZChcbiAgICAgIGltYWdlQ29uZmlnLmVudHJ5cG9pbnQsXG4gICAgICBpbWFnZUNvbmZpZy5jbWQsXG4gICAgKVxuXG4gICAgLy8gUmVzdGFydCB0aGUgY29udGFpbmVyIGJ5IHRyaWdnZXJpbmcgY29udGFpbmVyIHN0YXJ0dXBcbiAgICAvLyBUaGUgZXhpc3RpbmcgZmliZXIgd2lsbCBoYXZlIGV4aXRlZCB3aGVuIHdlIHN0b3BwZWQgdGhlIGNvbnRhaW5lclxuICAgIC8vIFdlIG5lZWQgdG8gc3RhcnQgYSBuZXcgb25lXG4gICAgY29uc3QgZG9ja2VyUnVudGltZSA9IHlpZWxkKiBkb2NrZXIuZ2V0UnVudGltZUluZm8oKVxuICAgIGNvbnN0IHJ1bnRpbWVBcGlIb3N0ID0gZG9ja2VyUnVudGltZS5pc0RvY2tlckRlc2t0b3BcbiAgICAgID8gXCJob3N0LmRvY2tlci5pbnRlcm5hbFwiXG4gICAgICA6IFwicnVudGltZS5hcGlcIlxuXG4gICAgeWllbGQqIEVmZmVjdC5sb2dJbmZvKFxuICAgICAgYFtMb2NhbF0gTmV3IGNvbnRhaW5lciB3aWxsIGNvbm5lY3QgdG8gUnVudGltZSBBUEkgYXQgJHtydW50aW1lQXBpSG9zdH06JHtjb250YWluZXIucG9ydH1gLFxuICAgIClcblxuICAgIGNvbnN0IGNvbnRhaW5lckNvbmZpZyA9IG1ha2VMYW1iZGFDb250YWluZXJDb25maWcoe1xuICAgICAgaW1hZ2VVcmk6IGNvbnRhaW5lci5pbWFnZU5hbWUsXG4gICAgICBydW50aW1lQXBpSG9zdCxcbiAgICAgIHJ1bnRpbWVBcGlQb3J0OiBjb250YWluZXIucG9ydCxcbiAgICAgIGZ1bmN0aW9uTmFtZTogZm4uZnVuY3Rpb25OYW1lLFxuICAgICAgZnVuY3Rpb25WZXJzaW9uOiBcIiRMQVRFU1RcIixcbiAgICAgIG1lbW9yeU1COiBmbi5tZW1vcnlNQixcbiAgICAgIHRpbWVvdXRTZWNvbmRzOiAzNjAwLFxuICAgICAgcGxhdGZvcm0sXG4gICAgfSlcblxuICAgIC8vIEFwcGx5IGV4dGVuc2lvbiB3cmFwcGVyIHRvIHN0YXJ0IGV4dGVuc2lvbnMgYmVmb3JlIHRoZSBhcHBcbiAgICBjb250YWluZXJDb25maWcuZW50cnlwb2ludCA9IGV4dGVuc2lvbldyYXBwZXIuZW50cnlwb2ludFxuICAgIGNvbnRhaW5lckNvbmZpZy5jb21tYW5kID0gZXh0ZW5zaW9uV3JhcHBlci5jb21tYW5kXG5cbiAgICAvLyBTdGFydCB0aGUgbmV3IGNvbnRhaW5lclxuICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoXG4gICAgICBgW0xvY2FsXSBTdGFydGluZyBuZXcgY29udGFpbmVyIGZvciAke2Z1bmN0aW9uSWR9Li4uYCxcbiAgICApXG5cbiAgICAvLyBVc2UgRWZmZWN0LmZvcmtEYWVtb24gdG8gcnVuIHRoZSBjb250YWluZXIgaW5kZXBlbmRlbnRseVxuICAgIGNvbnN0IG5ld0ZpYmVyID0geWllbGQqIGRvY2tlci5ydW4oY29udGFpbmVyQ29uZmlnKS5waXBlKFxuICAgICAgRWZmZWN0LnNjb3BlZCxcbiAgICAgIEVmZmVjdC50YXAoKHJlc3VsdCkgPT5cbiAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgIC8vIE9ubHkgc3VwcHJlc3MgZXJyb3JzIGZvciBleHBlY3RlZCBleGl0IGNvZGVzIGZyb20gZG9ja2VyIHN0b3A6XG4gICAgICAgICAgLy8gMDogY2xlYW4sIDE0MzogU0lHVEVSTSwgMTM3OiBTSUdLSUxMXG4gICAgICAgICAgY29uc3QgY29kZSA9IHJlc3VsdC5leGl0Q29kZVxuICAgICAgICAgIGlmIChjb2RlICE9PSAwICYmIGNvZGUgIT09IDE0MyAmJiBjb2RlICE9PSAxMzcpIHtcbiAgICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRXJyb3IoXG4gICAgICAgICAgICAgIGBDb250YWluZXIgZm9yICR7ZnVuY3Rpb25JZH0gZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRXJyb3IoYHN0ZGVycjogJHtyZXN1bHQuc3RkZXJyfWApXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBFZmZlY3QubWFwKCgpID0+IHVuZGVmaW5lZCBhcyB2b2lkKSxcbiAgICAgIEVmZmVjdC5jYXRjaEFsbCgoZXJyb3IpID0+XG4gICAgICAgIEVmZmVjdC5sb2dFcnJvcihgQ29udGFpbmVyIGVycm9yIGZvciAke2Z1bmN0aW9uSWR9OiAke2Vycm9yfWApLFxuICAgICAgKSxcbiAgICAgIEVmZmVjdC5mb3JrRGFlbW9uLFxuICAgIClcblxuICAgIC8vIFVwZGF0ZSB0aGUgY29udGFpbmVyIHN0YXRlIHdpdGggdGhlIG5ldyBmaWJlclxuICAgIGNvbnRhaW5lci5jb250YWluZXJGaWJlciA9IG5ld0ZpYmVyXG5cbiAgICAvLyBXYWl0IGEgbW9tZW50IGZvciB0aGUgY29udGFpbmVyIHRvIHN0YXJ0IGFuZCBiZWdpbiBwb2xsaW5nXG4gICAgeWllbGQqIEVmZmVjdC5zbGVlcChcIjIgc2Vjb25kc1wiKVxuXG4gICAgY29udGFpbmVyLmlzUmVidWlsZGluZyA9IGZhbHNlXG4gICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhgW0xvY2FsXSBDb250YWluZXIgcmVidWlsdCBmb3IgJHtmdW5jdGlvbklkfWApXG4gIH0pLnBpcGUoRWZmZWN0LnByb3ZpZGUoRG9ja2VyTGl2ZSkpXG5cbi8qKlxuICogSGFuZGxlIGluY29taW5nIGludm9jYXRpb25zIGZvciBhIERvY2tlciBjb250YWluZXIgZnVuY3Rpb24gYnkgcXVldWVpbmcgdGhlbS5cbiAqIFN0YXJ0cyB0aGUgY29udGFpbmVyIGxhemlseSBpZiBub3QgYWxyZWFkeSBydW5uaW5nLlxuICogSW52b2NhdGlvbnMgYXJlIHF1ZXVlZCBldmVuIGlmIGEgcmVidWlsZCBpcyBpbiBwcm9ncmVzcyAtIHRoZSBuZXcgY29udGFpbmVyIHdpbGwgcGljayB0aGVtIHVwLlxuICovXG5jb25zdCBoYW5kbGVEb2NrZXJJbnZvY2F0aW9uID0gKFxuICBmbjogRGlzY292ZXJlZEZ1bmN0aW9uLFxuICBpbnZvY2F0aW9uOiBJbnZvY2F0aW9uTWVzc2FnZSxcbiAgY29udGFpbmVyc1JlZjogUmVmLlJlZjxNYXA8c3RyaW5nLCBGdW5jdGlvbkNvbnRhaW5lcj4+LFxuICBzZXJ2ZXJTY29wZTogU2NvcGUuU2NvcGUsXG4gIHByb2plY3RSb290OiBzdHJpbmcsXG4gIGlkbGVUaW1lb3V0TXM6IG51bWJlcixcbiAgcG9sbFRpbWVvdXRNczogbnVtYmVyLFxuICBhcHBTeW5jQ2xpZW50OiBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQXBwU3luY0NsaWVudD4sXG4gIGludm9jYXRpb25Db3VudGVyOiBSZWYuUmVmPG51bWJlcj4sXG4gIGludm9jYXRpb25Db250ZXh0czogTWFwPHN0cmluZywgSW52b2NhdGlvbkNvbnRleHQ+LFxuKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBFcnJvciwgQ29tbWFuZEV4ZWN1dG9yLkNvbW1hbmRFeGVjdXRvcj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIC8vIEVuc3VyZSBjb250YWluZXIgaXMgc3RhcnRlZCAobGF6eSBzdGFydHVwIG9uIGZpcnN0IGludm9jYXRpb24pXG4gICAgLy8gVXNlIGVudiBmcm9tIGludm9jYXRpb24gKGNhcHR1cmVkIGZyb20gYnJpZGdlIExhbWJkYSBvbiBmaXJzdCBpbnZva2UpXG4gICAgY29uc3QgY29udGFpbmVyID0geWllbGQqIGVuc3VyZUNvbnRhaW5lclN0YXJ0ZWQoXG4gICAgICBmbixcbiAgICAgIHNhbml0aXplSW52b2NhdGlvbkVudihpbnZvY2F0aW9uLmVudiA/PyB7fSksXG4gICAgICBjb250YWluZXJzUmVmLFxuICAgICAgc2VydmVyU2NvcGUsXG4gICAgICBwcm9qZWN0Um9vdCxcbiAgICAgIGlkbGVUaW1lb3V0TXMsXG4gICAgICBwb2xsVGltZW91dE1zLFxuICAgICAgYXBwU3luY0NsaWVudCxcbiAgICAgIGludm9jYXRpb25Db250ZXh0cyxcbiAgICApXG5cbiAgICAvLyBBc3NpZ24gaW52b2NhdGlvbiBudW1iZXIgYW5kIHRyYWNrIGNvbnRleHQgZm9yIGxvZ2dpbmdcbiAgICBjb25zdCBpbnZvY2F0aW9uTnVtID0geWllbGQqIFJlZi51cGRhdGVBbmRHZXQoXG4gICAgICBpbnZvY2F0aW9uQ291bnRlcixcbiAgICAgIChuKSA9PiBuICsgMSxcbiAgICApXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGludm9jYXRpb25Db250ZXh0cy5zZXQoaW52b2NhdGlvbi5yZXF1ZXN0SWQsIHtcbiAgICAgIG51bTogaW52b2NhdGlvbk51bSxcbiAgICAgIHN0YXJ0OiBzdGFydFRpbWUsXG4gICAgICBmbjogZm4uZnVuY3Rpb25OYW1lLFxuICAgICAgaXNEb2NrZXI6IHRydWUsXG4gICAgfSlcblxuICAgIC8vIFByaW50IHN0YXJ0IG1hcmtlclxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFxcblske2ludm9jYXRpb25OdW19XSBcXHUyNTBjXFx1MjUwMFxcdTI1MDAgW0RvY2tlcl0gJHtmbi5mdW5jdGlvbk5hbWV9IFxcdTI1MDBcXHUyNTAwYCxcbiAgICApXG5cbiAgICAvLyBMb2cgaWYgcXVldWluZyBkdXJpbmcgYSByZWJ1aWxkXG4gICAgaWYgKGNvbnRhaW5lci5pc1JlYnVpbGRpbmcpIHtcbiAgICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoXG4gICAgICAgIGBbTG9jYWxdIFF1ZXVlaW5nIGludm9jYXRpb24gJHtpbnZvY2F0aW9uLnJlcXVlc3RJZH0gZm9yICR7Zm4uZnVuY3Rpb25OYW1lfSAocmVidWlsZCBpbiBwcm9ncmVzcywgd2lsbCBiZSBwaWNrZWQgdXAgYnkgbmV3IGNvbnRhaW5lcilgLFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKFxuICAgICAgICBgW0xvY2FsXSBRdWV1ZWluZyBpbnZvY2F0aW9uICR7aW52b2NhdGlvbi5yZXF1ZXN0SWR9IGZvciAke2ZuLmZ1bmN0aW9uTmFtZX1gLFxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGxhbWJkYUludm9jYXRpb246IExhbWJkYUludm9jYXRpb24gPSB7XG4gICAgICByZXF1ZXN0SWQ6IGludm9jYXRpb24ucmVxdWVzdElkLFxuICAgICAgZXZlbnQ6IGludm9jYXRpb24uZXZlbnQsXG4gICAgICBpbnZva2VkRnVuY3Rpb25Bcm46IGludm9jYXRpb24uY29udGV4dC5pbnZva2VkRnVuY3Rpb25Bcm4sXG4gICAgICBkZWFkbGluZU1zOiBEYXRlLm5vdygpICsgaW52b2NhdGlvbi5jb250ZXh0LmdldFJlbWFpbmluZ1RpbWVJbk1pbGxpcyxcbiAgICAgIGZ1bmN0aW9uTmFtZTogZm4uZnVuY3Rpb25OYW1lLFxuICAgICAgZnVuY3Rpb25WZXJzaW9uOiBpbnZvY2F0aW9uLmNvbnRleHQuZnVuY3Rpb25WZXJzaW9uLFxuICAgICAgbWVtb3J5TGltaXRNQjogZm4ubWVtb3J5TUIsXG4gICAgICBsb2dHcm91cE5hbWU6IGludm9jYXRpb24uY29udGV4dC5sb2dHcm91cE5hbWUsXG4gICAgICBsb2dTdHJlYW1OYW1lOiBpbnZvY2F0aW9uLmNvbnRleHQubG9nU3RyZWFtTmFtZSxcbiAgICB9XG5cbiAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKFxuICAgICAgYFtMb2NhbF0gUXVldWVpbmcgdG8gUnVudGltZSBBUEkgb24gcG9ydCAke2NvbnRhaW5lci5wb3J0fWAsXG4gICAgKVxuICAgIC8vIE5vdGlmeSBleHRlbnNpb25zIGFib3V0IHRoZSBpbnZvY2F0aW9uIChmb3IgTGFtYmRhIFdlYiBBZGFwdGVyIHN1cHBvcnQpXG4gICAgeWllbGQqIG5vdGlmeUV4dGVuc2lvbnNJbnZva2UoY29udGFpbmVyLnJ1bnRpbWVTdGF0ZSwgbGFtYmRhSW52b2NhdGlvbilcbiAgICB5aWVsZCogcXVldWVJbnZvY2F0aW9uKGNvbnRhaW5lci5ydW50aW1lU3RhdGUsIGxhbWJkYUludm9jYXRpb24pXG4gICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhgW0xvY2FsXSBJbnZvY2F0aW9uIHF1ZXVlZCBzdWNjZXNzZnVsbHlgKVxuICB9KVxuXG4vKipcbiAqIEhhbmRsZSBpbmNvbWluZyBpbnZvY2F0aW9ucyBmb3IgYSBOb2RlLmpzIGZ1bmN0aW9uIGJ5IHF1ZXVlaW5nIHRoZW0uXG4gKiBTdGFydHMgdGhlIHdvcmtlciBsYXppbHkgaWYgbm90IGFscmVhZHkgcnVubmluZy5cbiAqL1xuY29uc3QgaGFuZGxlTm9kZWpzSW52b2NhdGlvbiA9IChcbiAgZm46IERpc2NvdmVyZWRGdW5jdGlvbixcbiAgaW52b2NhdGlvbjogSW52b2NhdGlvbk1lc3NhZ2UsXG4gIHdvcmtlcnNSZWY6IFJlZi5SZWY8TWFwPHN0cmluZywgTm9kZWpzV29ya2VyPj4sXG4gIHNlcnZlclNjb3BlOiBTY29wZS5TY29wZSxcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgYXBwU3luY0NsaWVudDogUmV0dXJuVHlwZTx0eXBlb2YgbWFrZUFwcFN5bmNDbGllbnQ+LFxuICBpbnZvY2F0aW9uQ291bnRlcjogUmVmLlJlZjxudW1iZXI+LFxuICBpbnZvY2F0aW9uQ29udGV4dHM6IE1hcDxzdHJpbmcsIEludm9jYXRpb25Db250ZXh0Pixcbik6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgRXJyb3I+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAvLyBHZXQgZW52IHZhcnMgZnJvbSBpbnZvY2F0aW9uIChmb3J3YXJkZWQgZnJvbSBicmlkZ2UgTGFtYmRhKVxuICAgIGNvbnN0IGludm9jYXRpb25FbnYgPSBzYW5pdGl6ZUludm9jYXRpb25FbnYoaW52b2NhdGlvbi5lbnYgPz8ge30pXG5cbiAgICAvLyBFbnN1cmUgd29ya2VyIGlzIHN0YXJ0ZWQgKGxhenkgc3RhcnR1cCBvbiBmaXJzdCBpbnZvY2F0aW9uKVxuICAgIGNvbnN0IHdvcmtlciA9IHlpZWxkKiBlbnN1cmVXb3JrZXJTdGFydGVkKFxuICAgICAgZm4sXG4gICAgICBpbnZvY2F0aW9uRW52LFxuICAgICAgd29ya2Vyc1JlZixcbiAgICAgIHNlcnZlclNjb3BlLFxuICAgICAgcHJvamVjdFJvb3QsXG4gICAgICBhcHBTeW5jQ2xpZW50LFxuICAgICAgaW52b2NhdGlvbkNvbnRleHRzLFxuICAgIClcblxuICAgIC8vIEFzc2lnbiBpbnZvY2F0aW9uIG51bWJlciBhbmQgdHJhY2sgY29udGV4dCBmb3IgbG9nZ2luZ1xuICAgIGNvbnN0IGludm9jYXRpb25OdW0gPSB5aWVsZCogUmVmLnVwZGF0ZUFuZEdldChcbiAgICAgIGludm9jYXRpb25Db3VudGVyLFxuICAgICAgKG4pID0+IG4gKyAxLFxuICAgIClcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgaW52b2NhdGlvbkNvbnRleHRzLnNldChpbnZvY2F0aW9uLnJlcXVlc3RJZCwge1xuICAgICAgbnVtOiBpbnZvY2F0aW9uTnVtLFxuICAgICAgc3RhcnQ6IHN0YXJ0VGltZSxcbiAgICAgIGZuOiBmbi5mdW5jdGlvbk5hbWUsXG4gICAgICBpc0RvY2tlcjogZmFsc2UsXG4gICAgfSlcblxuICAgIC8vIFByaW50IHN0YXJ0IG1hcmtlclxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFxcblske2ludm9jYXRpb25OdW19XSBcXHUyNTBjXFx1MjUwMFxcdTI1MDAgJHtmbi5mdW5jdGlvbk5hbWV9IFxcdTI1MDBcXHUyNTAwYCxcbiAgICApXG5cbiAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKFxuICAgICAgYFtMb2NhbF0gUXVldWVpbmcgaW52b2NhdGlvbiAke2ludm9jYXRpb24ucmVxdWVzdElkfSBmb3IgJHtmbi5mdW5jdGlvbk5hbWV9YCxcbiAgICApXG5cbiAgICBjb25zdCBsYW1iZGFJbnZvY2F0aW9uOiBMYW1iZGFJbnZvY2F0aW9uID0ge1xuICAgICAgcmVxdWVzdElkOiBpbnZvY2F0aW9uLnJlcXVlc3RJZCxcbiAgICAgIGV2ZW50OiBpbnZvY2F0aW9uLmV2ZW50LFxuICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiBpbnZvY2F0aW9uLmNvbnRleHQuaW52b2tlZEZ1bmN0aW9uQXJuLFxuICAgICAgZGVhZGxpbmVNczogRGF0ZS5ub3coKSArIGludm9jYXRpb24uY29udGV4dC5nZXRSZW1haW5pbmdUaW1lSW5NaWxsaXMsXG4gICAgICBmdW5jdGlvbk5hbWU6IGZuLmZ1bmN0aW9uTmFtZSxcbiAgICAgIGZ1bmN0aW9uVmVyc2lvbjogaW52b2NhdGlvbi5jb250ZXh0LmZ1bmN0aW9uVmVyc2lvbixcbiAgICAgIG1lbW9yeUxpbWl0TUI6IGZuLm1lbW9yeU1CLFxuICAgICAgbG9nR3JvdXBOYW1lOiBpbnZvY2F0aW9uLmNvbnRleHQubG9nR3JvdXBOYW1lLFxuICAgICAgbG9nU3RyZWFtTmFtZTogaW52b2NhdGlvbi5jb250ZXh0LmxvZ1N0cmVhbU5hbWUsXG4gICAgfVxuXG4gICAgeWllbGQqIHF1ZXVlSW52b2NhdGlvbih3b3JrZXIucnVudGltZVN0YXRlLCBsYW1iZGFJbnZvY2F0aW9uKVxuICB9KVxuXG4vKipcbiAqIENESyB3YXRjaCBldmVudCB0eXBlcy5cbiAqL1xudHlwZSBDZGtXYXRjaEV2ZW50ID1cbiAgfCB7IHJlYWRvbmx5IF90YWc6IFwiU3RhY2tEaXNjb3ZlcmVkXCI7IHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nIH1cbiAgfCB7IHJlYWRvbmx5IF90YWc6IFwiRGVwbG95Q29tcGxldGVcIiB9XG5cbi8qKlxuICogU3RhcnQgQ0RLIHdhdGNoIHByb2Nlc3Mgd2l0aCBDREtfTElWRT10cnVlIHVzaW5nIEVmZmVjdCdzIENvbW1hbmQuXG4gKiBSZXR1cm5zIHRoZSBwcm9jZXNzIGFuZCBhIHF1ZXVlIG9mIGV2ZW50cy5cbiAqL1xuY29uc3Qgc3RhcnRDZGtXYXRjaCA9IChcbiAgb3B0aW9uczoge1xuICAgIHByb2ZpbGU/OiBzdHJpbmdcbiAgICByZWdpb24/OiBzdHJpbmdcbiAgICBzdGFja3M/OiBzdHJpbmdbXVxuICAgIGFsbD86IGJvb2xlYW5cbiAgfSxcbiAgc2NvcGU6IFNjb3BlLlNjb3BlLFxuKTogRWZmZWN0LkVmZmVjdDxcbiAgeyBwcm9jZXNzOiBFZmZlY3RQcm9jZXNzOyBldmVudHM6IFF1ZXVlLlF1ZXVlPENka1dhdGNoRXZlbnQ+IH0sXG4gIEVycm9yLFxuICBDb21tYW5kRXhlY3V0b3IuQ29tbWFuZEV4ZWN1dG9yXG4+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgXCJjZGtcIixcbiAgICAgIFwid2F0Y2hcIixcbiAgICAgIFwiLS1ob3Rzd2FwLWZhbGxiYWNrXCIsXG4gICAgICBcIi0tbm8tbG9nc1wiLFxuICAgICAgXCItLW1ldGhvZD1kaXJlY3RcIixcbiAgICBdXG5cbiAgICBpZiAob3B0aW9ucy5zdGFja3MgJiYgb3B0aW9ucy5zdGFja3MubGVuZ3RoID4gMCkge1xuICAgICAgYXJncy5wdXNoKC4uLm9wdGlvbnMuc3RhY2tzKVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5hbGwpIHtcbiAgICAgIGFyZ3MucHVzaChcIi0tYWxsXCIpXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucHJvZmlsZSkge1xuICAgICAgYXJncy5wdXNoKFwiLS1wcm9maWxlXCIsIG9wdGlvbnMucHJvZmlsZSlcbiAgICB9XG5cbiAgICBjb25zdCBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgIENES19MSVZFOiBcInRydWVcIixcbiAgICB9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuICAgIGlmIChvcHRpb25zLnJlZ2lvbikge1xuICAgICAgZW52LkFXU19SRUdJT04gPSBvcHRpb25zLnJlZ2lvblxuICAgICAgZW52LkNES19ERUZBVUxUX1JFR0lPTiA9IG9wdGlvbnMucmVnaW9uXG4gICAgfVxuXG4gICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhgU3RhcnRpbmc6IG5weCAke2FyZ3Muam9pbihcIiBcIil9YClcblxuICAgIGNvbnN0IGNvbW1hbmQgPSBQbGF0Zm9ybUNvbW1hbmQubWFrZShcIm5weFwiLCAuLi5hcmdzKS5waXBlKFxuICAgICAgUGxhdGZvcm1Db21tYW5kLmVudihlbnYpLFxuICAgICAgUGxhdGZvcm1Db21tYW5kLnJ1bkluU2hlbGwodHJ1ZSksXG4gICAgICBQbGF0Zm9ybUNvbW1hbmQuc3RkaW4oXCJpbmhlcml0XCIpLFxuICAgIClcblxuICAgIC8vIEV4dGVuZCB0aGUgcHJvY2VzcyByZXNvdXJjZSBsaWZldGltZSB0byB0aGUgcHJvdmlkZWQgc2NvcGVcbiAgICBjb25zdCBwcm9jID0geWllbGQqIFBsYXRmb3JtQ29tbWFuZC5zdGFydChjb21tYW5kKS5waXBlKFNjb3BlLmV4dGVuZChzY29wZSkpXG5cbiAgICAvLyBFdmVudCBxdWV1ZSBmb3IgY2FsbGVycyB0byBzdWJzY3JpYmUgdG9cbiAgICBjb25zdCBldmVudHMgPSB5aWVsZCogUXVldWUudW5ib3VuZGVkPENka1dhdGNoRXZlbnQ+KClcblxuICAgIC8vIFN0YXRlIHRyYWNraW5nIGZvciBkZXBsb3kgc3RhdHVzIG1lc3NhZ2VzXG4gICAgbGV0IGlzRGVwbG95aW5nID0gZmFsc2VcbiAgICBsZXQgaXNGaXJzdERlcGxveSA9IHRydWVcbiAgICBsZXQgb3V0cHV0QnVmZmVyID0gXCJcIlxuICAgIGNvbnN0IGRpc2NvdmVyZWRTdGFja3MgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gICAgLy8gUGF0dGVybnMgdG8gZGV0ZWN0IENESyB3YXRjaCBiZWhhdmlvclxuICAgIGNvbnN0IGRlcGxveUNvbXBsZXRlUGF0dGVybiA9IC/inIVcXHMrXFxTK3xEZXBsb3ltZW50IHRpbWU6L1xuICAgIGNvbnN0IGRlcGxveVN0YXJ0UGF0dGVybiA9IC9EZXBsb3lpbmd8aG90c3dhcHxIb3Rzd2FwcGluZ3xCdW5kbGluZy9pXG4gICAgY29uc3Qgbm9DaGFuZ2VzUGF0dGVybiA9IC9ubyBjaGFuZ2VzfGlkZW50aWNhbHx1cCB0byBkYXRlL2lcbiAgICBjb25zdCBlcnJvclBhdHRlcm4gPSAvZXJyb3J8ZmFpbGVkfEVycm9yfEZhaWxlZHxFUlIhL2lcbiAgICBjb25zdCBzdGFja05hbWVQYXR0ZXJuID0gL14oXFxTKyk6XFxzKmRlcGxveWluZ3zinIVcXHMrKFxcUyspL1xuXG4gICAgLy8gTWVyZ2Ugc3Rkb3V0IGFuZCBzdGRlcnIsIGRlY29kZSB0byB0ZXh0LCBzcGxpdCBpbnRvIGxpbmVzXG4gICAgY29uc3Qgb3V0cHV0U3RyZWFtID0gU3RyZWFtLm1lcmdlKHByb2Muc3Rkb3V0LCBwcm9jLnN0ZGVycikucGlwZShcbiAgICAgIFN0cmVhbS5kZWNvZGVUZXh0KCksXG4gICAgICBTdHJlYW0uc3BsaXRMaW5lcyxcbiAgICApXG5cbiAgICAvLyBGb3JrIHN0cmVhbSBwcm9jZXNzaW5nIGluIGJhY2tncm91bmRcbiAgICB5aWVsZCogb3V0cHV0U3RyZWFtLnBpcGUoXG4gICAgICBTdHJlYW0ucnVuRm9yRWFjaCgobGluZSkgPT5cbiAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgIG91dHB1dEJ1ZmZlciArPSBsaW5lICsgXCJcXG5cIlxuXG4gICAgICAgICAgLy8gTG9nIGFsbCBvdXRwdXQgYXQgZGVidWcgbGV2ZWxcbiAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKGBbQ0RLXSAke2xpbmV9YClcblxuICAgICAgICAgIC8vIFRyeSB0byBleHRyYWN0IHN0YWNrIG5hbWVcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IHN0YWNrTmFtZVBhdHRlcm4uZXhlYyhsaW5lLnRyaW0oKSlcbiAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrTmFtZSA9IG1hdGNoWzFdIHx8IG1hdGNoWzJdXG4gICAgICAgICAgICBpZiAoc3RhY2tOYW1lICYmICFkaXNjb3ZlcmVkU3RhY2tzLmhhcyhzdGFja05hbWUpKSB7XG4gICAgICAgICAgICAgIGRpc2NvdmVyZWRTdGFja3MuYWRkKHN0YWNrTmFtZSlcbiAgICAgICAgICAgICAgeWllbGQqIFF1ZXVlLm9mZmVyKGV2ZW50cywge1xuICAgICAgICAgICAgICAgIF90YWc6IFwiU3RhY2tEaXNjb3ZlcmVkXCIsXG4gICAgICAgICAgICAgICAgc3RhY2tOYW1lLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERldGVjdCBkZXBsb3kgc3RhcnRcbiAgICAgICAgICBpZiAoIWlzRGVwbG95aW5nICYmIGRlcGxveVN0YXJ0UGF0dGVybi50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICBpc0RlcGxveWluZyA9IHRydWVcbiAgICAgICAgICAgIGlmICghaXNGaXJzdERlcGxveSkge1xuICAgICAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oXCJbQ0RLXSBEZXBsb3lpbmcuLi5cIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBEZXRlY3QgZXJyb3JzIC0gb3V0cHV0IGltbWVkaWF0ZWx5XG4gICAgICAgICAgaWYgKGVycm9yUGF0dGVybi50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICB5aWVsZCogRWZmZWN0LnN5bmMoKCkgPT4gcHJvY2Vzcy5zdGRlcnIud3JpdGUobGluZSArIFwiXFxuXCIpKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGZvciBkZXBsb3kgY29tcGxldGlvbiAob25seSB0cmlnZ2VyIG9uY2UgcGVyIGRlcGxveSBjeWNsZSlcbiAgICAgICAgICBpZiAoaXNEZXBsb3lpbmcgJiYgZGVwbG95Q29tcGxldGVQYXR0ZXJuLnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgIGlzRGVwbG95aW5nID0gZmFsc2VcbiAgICAgICAgICAgIGlzRmlyc3REZXBsb3kgPSBmYWxzZVxuICAgICAgICAgICAgb3V0cHV0QnVmZmVyID0gXCJcIlxuICAgICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dJbmZvKFwiW0NES10gRGVwbG95IGNvbXBsZXRlXCIpXG4gICAgICAgICAgICAvLyBTbWFsbCBkZWxheSB0byBlbnN1cmUgQVdTIGhhcyBwcm9wYWdhdGVkIHRoZSBjaGFuZ2VzXG4gICAgICAgICAgICB5aWVsZCogRWZmZWN0LnNsZWVwKFwiMSBzZWNvbmRcIilcbiAgICAgICAgICAgIHlpZWxkKiBRdWV1ZS5vZmZlcihldmVudHMsIHsgX3RhZzogXCJEZXBsb3lDb21wbGV0ZVwiIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgZm9yIG5vIGNoYW5nZXNcbiAgICAgICAgICBpZiAobm9DaGFuZ2VzUGF0dGVybi50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICBpc0RlcGxveWluZyA9IGZhbHNlXG4gICAgICAgICAgICBvdXRwdXRCdWZmZXIgPSBcIlwiXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICAvLyBMb2cgZXJyb3JzIGFuZCBleGl0IGNvZGUgd2hlbiBzdHJlYW0gZW5kc1xuICAgICAgRWZmZWN0LnRhcEVycm9yKChlcnJvcikgPT5cbiAgICAgICAgRWZmZWN0LmxvZ0Vycm9yKGBbQ0RLXSBDREsgd2F0Y2ggZXJyb3I6ICR7ZXJyb3J9YCksXG4gICAgICApLFxuICAgICAgRWZmZWN0LmVuc3VyaW5nKFxuICAgICAgICBwcm9jLmV4aXRDb2RlLnBpcGUoXG4gICAgICAgICAgRWZmZWN0LmZsYXRNYXAoKGNvZGUpID0+XG4gICAgICAgICAgICBjb2RlICE9PSAwXG4gICAgICAgICAgICAgID8gRWZmZWN0LmxvZ0Vycm9yKGBbQ0RLXSBDREsgd2F0Y2ggZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YClcbiAgICAgICAgICAgICAgOiBFZmZlY3QubG9nRGVidWcoYFtDREtdIENESyB3YXRjaCBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKSxcbiAgICAgICAgICApLFxuICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbCgoKSA9PiBFZmZlY3Qudm9pZCksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICAgRWZmZWN0LmZvcmssXG4gICAgKVxuXG4gICAgcmV0dXJuIHsgcHJvY2VzczogcHJvYywgZXZlbnRzIH1cbiAgfSlcblxuLyoqXG4gKiBDb21tb24gQ0xJIG9wdGlvbnMuXG4gKi9cbmNvbnN0IHByb2ZpbGVPcHRpb24gPSBPcHRpb25zLnRleHQoXCJwcm9maWxlXCIpLnBpcGUoXG4gIE9wdGlvbnMub3B0aW9uYWwsXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiQVdTIHByb2ZpbGUgdG8gdXNlXCIpLFxuKVxuXG5jb25zdCByZWdpb25PcHRpb24gPSBPcHRpb25zLnRleHQoXCJyZWdpb25cIikucGlwZShcbiAgT3B0aW9ucy5vcHRpb25hbCxcbiAgT3B0aW9ucy53aXRoRGVzY3JpcHRpb24oXCJBV1MgcmVnaW9uXCIpLFxuKVxuXG5jb25zdCBxdWFsaWZpZXJPcHRpb24gPSBPcHRpb25zLnRleHQoXCJxdWFsaWZpZXJcIikucGlwZShcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChcImhuYjY1OWZkc1wiKSxcbiAgT3B0aW9ucy53aXRoRGVzY3JpcHRpb24oXCJDREsgYm9vdHN0cmFwIHF1YWxpZmllclwiKSxcbilcblxuY29uc3Qgc3RhY2tzT3B0aW9uID0gT3B0aW9ucy50ZXh0KFwic3RhY2tzXCIpLnBpcGUoXG4gIE9wdGlvbnMub3B0aW9uYWwsXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFxuICAgIFwiU3RhY2sgbmFtZXMgdG8gZGVwbG95IChjb21tYS1zZXBhcmF0ZWQsIGRlZmF1bHQ6IGFsbClcIixcbiAgKSxcbilcblxuY29uc3QgYWxsU3RhY2tzT3B0aW9uID0gT3B0aW9ucy5ib29sZWFuKFwiYWxsXCIpLnBpcGUoXG4gIE9wdGlvbnMud2l0aERlZmF1bHQoZmFsc2UpLFxuICBPcHRpb25zLndpdGhEZXNjcmlwdGlvbihcIkRlcGxveSBhbGwgc3RhY2tzIChsaWtlIGNkayBkZXBsb3kgLS1hbGwpXCIpLFxuKVxuXG5jb25zdCBkZWJ1Z09wdGlvbiA9IE9wdGlvbnMuYm9vbGVhbihcImRlYnVnXCIpLnBpcGUoXG4gIE9wdGlvbnMud2l0aERlZmF1bHQoZmFsc2UpLFxuICBPcHRpb25zLndpdGhEZXNjcmlwdGlvbihcIkVuYWJsZSBkZWJ1ZyBsb2dnaW5nXCIpLFxuKVxuXG5jb25zdCBpZGxlVGltZW91dE9wdGlvbiA9IE9wdGlvbnMuaW50ZWdlcihcImlkbGUtdGltZW91dFwiKS5waXBlKFxuICBPcHRpb25zLndpdGhEZWZhdWx0KERFRkFVTFRfSURMRV9USU1FT1VUX01TKSxcbiAgT3B0aW9ucy53aXRoRGVzY3JpcHRpb24oXG4gICAgXCJJZGxlIHRpbWVvdXQgaW4gbXMgYmVmb3JlIHN0b3BwaW5nIGNvbnRhaW5lcnMgKGRlZmF1bHQ6IDIzMDAwMClcIixcbiAgKSxcbilcblxuY29uc3QgcG9sbFRpbWVvdXRPcHRpb24gPSBPcHRpb25zLmludGVnZXIoXCJwb2xsLXRpbWVvdXRcIikucGlwZShcbiAgT3B0aW9ucy5vcHRpb25hbCxcbiAgT3B0aW9ucy53aXRoRGVzY3JpcHRpb24oXG4gICAgXCJQb2xsIHRpbWVvdXQgaW4gbXMgZm9yIFJ1bnRpbWUgQVBJIChkZWZhdWx0OiBpZGxlLXRpbWVvdXQgLSAxMHMpLiBNdXN0IGJlIHNob3J0ZXIgdGhhbiBpZGxlLXRpbWVvdXQuXCIsXG4gICksXG4pXG5cbi8qKlxuICogTG9jYWwgY29tbWFuZCBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgY29uc3QgbG9jYWxDb21tYW5kID0gQ29tbWFuZC5tYWtlKFxuICBcImxvY2FsXCIsXG4gIHtcbiAgICBwcm9maWxlOiBwcm9maWxlT3B0aW9uLFxuICAgIHJlZ2lvbjogcmVnaW9uT3B0aW9uLFxuICAgIHF1YWxpZmllcjogcXVhbGlmaWVyT3B0aW9uLFxuICAgIHN0YWNrczogc3RhY2tzT3B0aW9uLFxuICAgIGFsbDogYWxsU3RhY2tzT3B0aW9uLFxuICAgIGRlYnVnOiBkZWJ1Z09wdGlvbixcbiAgICBpZGxlVGltZW91dDogaWRsZVRpbWVvdXRPcHRpb24sXG4gICAgcG9sbFRpbWVvdXQ6IHBvbGxUaW1lb3V0T3B0aW9uLFxuICB9LFxuICAoe1xuICAgIHByb2ZpbGUsXG4gICAgcmVnaW9uLFxuICAgIHF1YWxpZmllcixcbiAgICBzdGFja3MsXG4gICAgYWxsLFxuICAgIGRlYnVnLFxuICAgIGlkbGVUaW1lb3V0LFxuICAgIHBvbGxUaW1lb3V0LFxuICB9KSA9PiB7XG4gICAgY29uc3QgbG9nTGV2ZWwgPSBkZWJ1ZyA/IExvZ0xldmVsLkRlYnVnIDogTG9nTGV2ZWwuSW5mb1xuICAgIHJldHVybiBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oXCJbTG9jYWxdIFN0YXJ0aW5nIGxvY2FsIExhbWJkYSBkZXZlbG9wbWVudC4uLlwiKVxuXG4gICAgICBjb25zdCBwcm9maWxlVmFsdWUgPSBwcm9maWxlLl90YWcgPT09IFwiU29tZVwiID8gcHJvZmlsZS52YWx1ZSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgcmVnaW9uVmFsdWUgPSByZWdpb24uX3RhZyA9PT0gXCJTb21lXCIgPyByZWdpb24udmFsdWUgOiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHN0YWNrc0Zyb21PcHRpb24gPVxuICAgICAgICBzdGFja3MuX3RhZyA9PT0gXCJTb21lXCJcbiAgICAgICAgICA/IHN0YWNrcy52YWx1ZS5zcGxpdChcIixcIikubWFwKChzKSA9PiBzLnRyaW0oKSlcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICAvLyBQb2xsIHRpbWVvdXQgc2hvdWxkIGJlIHNob3J0ZXIgdGhhbiBpZGxlIHRpbWVvdXQgc28gY29udGFpbmVycyBleGl0IG5hdHVyYWxseVxuICAgICAgLy8gYmVmb3JlIHdlIHRyeSB0byBzdG9wIHRoZW0uIERlZmF1bHQ6IGlkbGUgdGltZW91dCAtIDEwIHNlY29uZHMuXG4gICAgICBjb25zdCBlZmZlY3RpdmVQb2xsVGltZW91dCA9XG4gICAgICAgIHBvbGxUaW1lb3V0Ll90YWcgPT09IFwiU29tZVwiXG4gICAgICAgICAgPyBwb2xsVGltZW91dC52YWx1ZVxuICAgICAgICAgIDogTWF0aC5tYXgoaWRsZVRpbWVvdXQgLSAxMF8wMDAsIDVfMDAwKSAvLyBBdCBsZWFzdCA1IHNlY29uZHNcblxuICAgICAgaWYgKHByb2ZpbGVWYWx1ZSkge1xuICAgICAgICBwcm9jZXNzLmVudi5BV1NfUFJPRklMRSA9IHByb2ZpbGVWYWx1ZVxuICAgICAgfVxuICAgICAgaWYgKHJlZ2lvblZhbHVlKSB7XG4gICAgICAgIHByb2Nlc3MuZW52LkFXU19SRUdJT04gPSByZWdpb25WYWx1ZVxuICAgICAgfVxuXG4gICAgICAvLyBCb290c3RyYXAgY2hlY2sgbXVzdCBjb21wbGV0ZSBmaXJzdFxuICAgICAgeWllbGQqIGVuc3VyZUJvb3RzdHJhcCh7XG4gICAgICAgIHF1YWxpZmllcixcbiAgICAgICAgcHJvZmlsZTogcHJvZmlsZVZhbHVlLFxuICAgICAgICByZWdpb246IHJlZ2lvblZhbHVlLFxuICAgICAgfSlcblxuICAgICAgLy8gU3RhY2sgZmlsdGVyIC0gcG9wdWxhdGVkIGZyb20gQ0RLIHdhdGNoIG91dHB1dCwgdXNlZCB0byBmaWx0ZXIgTGFtYmRhIGRpc2NvdmVyeVxuICAgICAgLy8gVXNpbmcgb2JqZWN0IHNvIGNsb3N1cmUgaW4gc3RhcnRPclVwZGF0ZURhZW1vbiBzZWVzIHVwZGF0ZXNcbiAgICAgIGNvbnN0IGZpbHRlclN0YXRlID0geyBzdGFja3M6IHN0YWNrc0Zyb21PcHRpb24gPz8gKFtdIGFzIHN0cmluZ1tdKSB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIGxvbmctbGl2ZWQgc2NvcGUgZm9yIGFsbCBSdW50aW1lIEFQSSBzZXJ2ZXJzIGFuZCBDREsgd2F0Y2ggcHJvY2Vzc1xuICAgICAgLy8gUmVzb3VyY2VzIHdpbGwgcnVuIHVudGlsIHRoaXMgc2NvcGUgaXMgY2xvc2VkICh3aGVuIHRoZSBwcm9ncmFtIGVuZHMpXG4gICAgICBjb25zdCBzZXJ2ZXJTY29wZSA9IHlpZWxkKiBTY29wZS5tYWtlKClcblxuICAgICAgLy8gU3RhcnQgQ0RLIHdhdGNoIGltbWVkaWF0ZWx5IGFmdGVyIGJvb3RzdHJhcFxuICAgICAgLy8gU3RhY2sgbmFtZXMgYXJlIGRpc2NvdmVyZWQgZnJvbSBDREsgd2F0Y2ggb3V0cHV0IChubyBuZWVkIGZvciBzZXBhcmF0ZSBjZGsgbHMpXG4gICAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oXCJbQ0RLXSBEZXBsb3lpbmcuLi5cIilcblxuICAgICAgY29uc3QgeyBwcm9jZXNzOiBjZGtXYXRjaFByb2Nlc3MsIGV2ZW50czogY2RrRXZlbnRzIH0gPVxuICAgICAgICB5aWVsZCogc3RhcnRDZGtXYXRjaChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcm9maWxlOiBwcm9maWxlVmFsdWUsXG4gICAgICAgICAgICByZWdpb246IHJlZ2lvblZhbHVlLFxuICAgICAgICAgICAgc3RhY2tzOiBzdGFja3NGcm9tT3B0aW9uLFxuICAgICAgICAgICAgYWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2VydmVyU2NvcGUsXG4gICAgICAgIClcblxuICAgICAgLy8gVHJhY2sgcnVubmluZyBEb2NrZXIgY29udGFpbmVycyBieSBmdW5jdGlvbiBuYW1lXG4gICAgICBjb25zdCBjb250YWluZXJzID0geWllbGQqIFJlZi5tYWtlPE1hcDxzdHJpbmcsIEZ1bmN0aW9uQ29udGFpbmVyPj4oXG4gICAgICAgIG5ldyBNYXAoKSxcbiAgICAgIClcblxuICAgICAgLy8gVHJhY2sgcnVubmluZyBOb2RlLmpzIHdvcmtlcnMgYnkgZnVuY3Rpb24gbmFtZVxuICAgICAgY29uc3Qgd29ya2VycyA9IHlpZWxkKiBSZWYubWFrZTxNYXA8c3RyaW5nLCBOb2RlanNXb3JrZXI+PihuZXcgTWFwKCkpXG5cbiAgICAgIC8vIFRyYWNrIHJlZ2lzdGVyZWQgZnVuY3Rpb25zIChmb3IgbGF6eSBjb250YWluZXIvd29ya2VyIHN0YXJ0dXApXG4gICAgICBjb25zdCByZWdpc3RlcmVkRnVuY3Rpb25zID0geWllbGQqIFJlZi5tYWtlPFxuICAgICAgICBNYXA8c3RyaW5nLCBEaXNjb3ZlcmVkRnVuY3Rpb24+XG4gICAgICA+KG5ldyBNYXAoKSlcblxuICAgICAgLy8gVHJhY2sgRG9ja2VyIGZ1bmN0aW9ucyB3aXRoIGFjdGl2ZSBmaWxlIHdhdGNoZXJzXG4gICAgICBjb25zdCB3YXRjaGVkRG9ja2VyRnVuY3Rpb25zID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAgICAgLy8gSW52b2NhdGlvbiB0cmFja2luZyBmb3IgaW1wcm92ZWQgbG9nZ2luZyBvdXRwdXRcbiAgICAgIGNvbnN0IGludm9jYXRpb25Db3VudGVyID0geWllbGQqIFJlZi5tYWtlPG51bWJlcj4oMClcbiAgICAgIC8vIFVzZSBhIHBsYWluIE1hcCBmb3IgaW52b2NhdGlvbiBjb250ZXh0cyBzbyBpdCBjYW4gYmUgYWNjZXNzZWQgZnJvbSBzdHJlYW0gY2FsbGJhY2tzXG4gICAgICBjb25zdCBpbnZvY2F0aW9uQ29udGV4dHMgPSBuZXcgTWFwPHN0cmluZywgSW52b2NhdGlvbkNvbnRleHQ+KClcblxuICAgICAgLy8gUHJvamVjdCByb290IGlzIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICh3aGVyZSBDREsgYXBwIGxpdmVzKVxuICAgICAgY29uc3QgcHJvamVjdFJvb3QgPSBwcm9jZXNzLmN3ZCgpXG5cbiAgICAgIGxldCBhcHBTeW5jQ2xpZW50OiBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQXBwU3luY0NsaWVudD4gfCBudWxsID0gbnVsbFxuXG4gICAgICAvLyBUcmFjayBpZiB3ZSd2ZSBsb2dnZWQgdGhlIFwiV2F0Y2hpbmdcIiBtZXNzYWdlIChvbmx5IGxvZyBvbmNlKVxuICAgICAgY29uc3QgbG9nU3RhdGUgPSB7IGhhc0xvZ2dlZFdhdGNoaW5nOiBmYWxzZSwgaGFzRGlzY292ZXJlZE9uY2U6IGZhbHNlIH1cblxuICAgICAgLy8gRnVuY3Rpb24gdG8gc3RhcnQvdXBkYXRlIHRoZSBkYWVtb24gd2l0aCBkaXNjb3ZlcmVkIGZ1bmN0aW9uc1xuICAgICAgY29uc3Qgc3RhcnRPclVwZGF0ZURhZW1vbiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgLy8gT25seSBzaG93IFwiRGlzY292ZXJpbmcgZnVuY3Rpb25zLi4uXCIgb24gZmlyc3QgcnVuXG4gICAgICAgIGlmICghbG9nU3RhdGUuaGFzRGlzY292ZXJlZE9uY2UpIHtcbiAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oXCJbTG9jYWxdIERpc2NvdmVyaW5nIGZ1bmN0aW9ucy4uLlwiKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IEFwcFN5bmMgZW5kcG9pbnRzIChtYXkgbmVlZCB0byB3YWl0IGZvciBmaXJzdCBkZXBsb3kpXG4gICAgICAgIGlmICghYXBwU3luY0NsaWVudCkge1xuICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoXG4gICAgICAgICAgICBcIltMb2NhbF0gUmVhZGluZyBBcHBTeW5jIGVuZHBvaW50cyBmcm9tIFNTTS4uLlwiLFxuICAgICAgICAgIClcbiAgICAgICAgICBjb25zdCBlbmRwb2ludHMgPSB5aWVsZCogZ2V0QXBwU3luY0VuZHBvaW50cyhxdWFsaWZpZXIpLnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QucmV0cnkoeyB0aW1lczogMTAsIHNjaGVkdWxlOiBTY2hlZHVsZS5zcGFjZWQoXCIzIHNlY29uZHNcIikgfSksXG4gICAgICAgICAgKVxuICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoXG4gICAgICAgICAgICBgW0xvY2FsXSBIVFRQIGVuZHBvaW50OiAke2VuZHBvaW50cy5odHRwRW5kcG9pbnR9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgYXBwU3luY0NsaWVudCA9IG1ha2VBcHBTeW5jQ2xpZW50KGVuZHBvaW50cylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2NvdmVyIGZ1bmN0aW9ucyAoZmlsdGVyZWQgdG8gc3RhY2tzIGluIHRoaXMgQ0RLIHByb2plY3QpXG4gICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoXCJbTG9jYWxdIERpc2NvdmVyaW5nIExhbWJkYSBmdW5jdGlvbnMuLi5cIilcbiAgICAgICAgY29uc3QgZnVuY3Rpb25zID0geWllbGQqIGRpc2NvdmVyRnVuY3Rpb25zKGZpbHRlclN0YXRlLnN0YWNrcylcblxuICAgICAgICBpZiAoZnVuY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcbiAgICAgICAgICAgIFwiW0xvY2FsXSBObyBmdW5jdGlvbnMgZm91bmQgd2l0aCBsaXZlLWxhbWJkYSB0YWdzIHlldC4gSGF2ZSB5b3UgcGF0Y2hlZCB5b3VyIENESyBwcm9qZWN0IChib290c3RyYXApIGFuZCBhZGRlZCB0aGUgTGl2ZUxhbWJkYUFzcGVjdD9cIixcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50UmVnaXN0ZXJlZCA9IHlpZWxkKiBSZWYuZ2V0KHJlZ2lzdGVyZWRGdW5jdGlvbnMpXG5cbiAgICAgICAgLy8gQ29sbGVjdCBuZXcgZnVuY3Rpb25zIHRvIHJlZ2lzdGVyXG4gICAgICAgIGNvbnN0IG5ld0Z1bmN0aW9uczogQXJyYXk8e1xuICAgICAgICAgIGZuOiBEaXNjb3ZlcmVkRnVuY3Rpb25cbiAgICAgICAgICBpc0RvY2tlcjogYm9vbGVhblxuICAgICAgICB9PiA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBmbiBvZiBmdW5jdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBpc0RvY2tlciA9IEJvb2xlYW4oZm4uZG9ja2VyQ29udGV4dFBhdGgpXG4gICAgICAgICAgY29uc3QgaXNOb2RlanMgPSAhaXNEb2NrZXIgJiYgQm9vbGVhbihmbi5sb2NhbEhhbmRsZXIpXG5cbiAgICAgICAgICBpZiAoIWlzRG9ja2VyICYmICFpc05vZGVqcykge1xuICAgICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhcbiAgICAgICAgICAgICAgYFtMb2NhbF0gU2tpcHBpbmcgJHtmbi5mdW5jdGlvbk5hbWV9IC0gbm8gRG9ja2VyIGNvbnRleHQgb3IgbG9jYWwgaGFuZGxlcmAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjdXJyZW50UmVnaXN0ZXJlZC5oYXMoZm4uZnVuY3Rpb25OYW1lKSkge1xuICAgICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhcbiAgICAgICAgICAgICAgYFtMb2NhbF0gQWxyZWFkeSB3YXRjaGluZyAke2ZuLmZ1bmN0aW9uTmFtZX1gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXdGdW5jdGlvbnMucHVzaCh7IGZuLCBpc0RvY2tlciB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJpbnQgc3VtbWFyeSBvZiBkaXNjb3ZlcmVkIGZ1bmN0aW9uc1xuICAgICAgICBpZiAobmV3RnVuY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gbmV3RnVuY3Rpb25zXG4gICAgICAgICAgICAubWFwKCh7IGZuLCBpc0RvY2tlciB9KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG1vZGUgPSBpc0RvY2tlciA/IFwiZG9ja2VyXCIgOiBcIm5vZGVcIlxuICAgICAgICAgICAgICBjb25zdCBzaG9ydE5hbWUgPSBmbi5mdW5jdGlvbk5hbWUuaW5jbHVkZXMoXCItXCIpXG4gICAgICAgICAgICAgICAgPyBmbi5mdW5jdGlvbk5hbWUuc3BsaXQoXCItXCIpLnNsaWNlKC0yLCAtMSlbMF0gfHwgZm4uZnVuY3Rpb25OYW1lXG4gICAgICAgICAgICAgICAgOiBmbi5mdW5jdGlvbk5hbWVcbiAgICAgICAgICAgICAgcmV0dXJuIGAke3Nob3J0TmFtZX0gKCR7bW9kZX0pYFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiLCBcIilcbiAgICAgICAgICAvLyBVc2UgZGlmZmVyZW50IG1lc3NhZ2UgZm9yIGZpcnN0IGRpc2NvdmVyeSB2cyBzdWJzZXF1ZW50XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gbG9nU3RhdGUuaGFzRGlzY292ZXJlZE9uY2VcbiAgICAgICAgICAgID8gXCJbTG9jYWxdIEZ1bmN0aW9ucyBhZGRlZDpcIlxuICAgICAgICAgICAgOiBcIltMb2NhbF0gRnVuY3Rpb25zOlwiXG4gICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dJbmZvKGAke3ByZWZpeH0gJHtzdW1tYXJ5fWApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWdpc3RlciBmdW5jdGlvbnMgYW5kIHNldCB1cCBzdWJzY3JpcHRpb25zXG4gICAgICAgIGZvciAoY29uc3QgeyBmbiwgaXNEb2NrZXIgfSBvZiBuZXdGdW5jdGlvbnMpIHtcbiAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKFxuICAgICAgICAgICAgYFtMb2NhbF0gUmVnaXN0ZXJpbmcgJHtmbi5mdW5jdGlvbk5hbWV9ICgke2lzRG9ja2VyID8gXCJEb2NrZXJcIiA6IFwiTm9kZS5qc1wifSlgLFxuICAgICAgICAgIClcblxuICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBmdW5jdGlvblxuICAgICAgICAgIGN1cnJlbnRSZWdpc3RlcmVkLnNldChmbi5mdW5jdGlvbk5hbWUsIGZuKVxuXG4gICAgICAgICAgLy8gU3Vic2NyaWJlIHRvIGludm9jYXRpb25zIGZvciB0aGlzIGZ1bmN0aW9uXG4gICAgICAgICAgY29uc3QgaW52b2NhdGlvbkNoYW5uZWwgPSBidWlsZENoYW5uZWxOYW1lLmludm9jYXRpb24oZm4uZnVuY3Rpb25OYW1lKVxuICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoXG4gICAgICAgICAgICBgW0xvY2FsXSBTdWJzY3JpYmluZyB0byBpbnZvY2F0aW9ucyBmb3IgJHtmbi5mdW5jdGlvbk5hbWV9YCxcbiAgICAgICAgICApXG5cbiAgICAgICAgICAvLyBTdWJzY3JpYmUgdXNpbmcgZm9ya0RhZW1vbiB0byBydW4gaW5kZXBlbmRlbnRseSB3aXRoIGNvbnRleHQgcHJlc2VydmVkXG4gICAgICAgICAgLy8gUm91dGUgdG8gRG9ja2VyIG9yIE5vZGUuanMgaGFuZGxlciBiYXNlZCBvbiBmdW5jdGlvbiB0eXBlXG4gICAgICAgICAgaWYgKGlzRG9ja2VyKSB7XG4gICAgICAgICAgICB5aWVsZCogYXBwU3luY0NsaWVudCFcbiAgICAgICAgICAgICAgLnN1YnNjcmliZVRvSW52b2NhdGlvbnMoaW52b2NhdGlvbkNoYW5uZWwpXG4gICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIFN0cmVhbS5ydW5Gb3JFYWNoKChpbnZvY2F0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgaGFuZGxlRG9ja2VySW52b2NhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgZm4sXG4gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcnMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlclNjb3BlLFxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0Um9vdCxcbiAgICAgICAgICAgICAgICAgICAgaWRsZVRpbWVvdXQsXG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVBvbGxUaW1lb3V0LFxuICAgICAgICAgICAgICAgICAgICBhcHBTeW5jQ2xpZW50ISxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvdW50ZXIsXG4gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db250ZXh0cyxcbiAgICAgICAgICAgICAgICAgICkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsKChlcnJvcikgPT5cbiAgICAgICAgICAgICAgICAgICAgICBFZmZlY3QubG9nRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgW0xvY2FsXSBEb2NrZXIgaW52b2NhdGlvbiBlcnJvcjogJHtlcnJvcn1gLFxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgRWZmZWN0LmZvcmtEYWVtb24sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeWllbGQqIGFwcFN5bmNDbGllbnQhXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmVUb0ludm9jYXRpb25zKGludm9jYXRpb25DaGFubmVsKVxuICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBTdHJlYW0ucnVuRm9yRWFjaCgoaW52b2NhdGlvbikgPT5cbiAgICAgICAgICAgICAgICAgIGhhbmRsZU5vZGVqc0ludm9jYXRpb24oXG4gICAgICAgICAgICAgICAgICAgIGZuLFxuICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZXJzLFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTY29wZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdFJvb3QsXG4gICAgICAgICAgICAgICAgICAgIGFwcFN5bmNDbGllbnQhLFxuICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnRlcixcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvbnRleHRzLFxuICAgICAgICAgICAgICAgICAgKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGwoKGVycm9yKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdC5sb2dFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBbTG9jYWxdIE5vZGUuanMgaW52b2NhdGlvbiBlcnJvcjogJHtlcnJvcn1gLFxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgRWZmZWN0LmZvcmtEYWVtb24sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB5aWVsZCogUmVmLnNldChyZWdpc3RlcmVkRnVuY3Rpb25zLCBjdXJyZW50UmVnaXN0ZXJlZClcblxuICAgICAgICAvLyBTdGFydCBmaWxlIHdhdGNoZXJzIGZvciBuZXcgRG9ja2VyIGZ1bmN0aW9uc1xuICAgICAgICBjb25zdCBuZXdEb2NrZXJGdW5jdGlvbnM6IFdhdGNoZWREb2NrZXJGdW5jdGlvbltdID0gW11cbiAgICAgICAgZm9yIChjb25zdCBmbiBvZiBmdW5jdGlvbnMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmbi5kb2NrZXJDb250ZXh0UGF0aCAmJlxuICAgICAgICAgICAgIXdhdGNoZWREb2NrZXJGdW5jdGlvbnMuaGFzKGZuLmZ1bmN0aW9uTmFtZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIGNvbnRleHQgcGF0aFxuICAgICAgICAgICAgY29uc3QgY29udGV4dFBhdGggPSBmbi5kb2NrZXJDb250ZXh0UGF0aC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgICAgICAgICA/IGZuLmRvY2tlckNvbnRleHRQYXRoXG4gICAgICAgICAgICAgIDogYCR7cHJvamVjdFJvb3R9LyR7Zm4uZG9ja2VyQ29udGV4dFBhdGh9YFxuXG4gICAgICAgICAgICBuZXdEb2NrZXJGdW5jdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgIGZ1bmN0aW9uSWQ6IGZuLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgZG9ja2VyQ29udGV4dFBhdGg6IGNvbnRleHRQYXRoLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHdhdGNoZWREb2NrZXJGdW5jdGlvbnMuYWRkKGZuLmZ1bmN0aW9uTmFtZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFydCB3YXRjaGluZyBuZXcgRG9ja2VyIGNvbnRleHRzXG4gICAgICAgIGlmIChuZXdEb2NrZXJGdW5jdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoXG4gICAgICAgICAgICBgW0xvY2FsXSBTdGFydGluZyBmaWxlIHdhdGNoZXJzIGZvciAke25ld0RvY2tlckZ1bmN0aW9ucy5sZW5ndGh9IERvY2tlciBmdW5jdGlvbihzKS4uLmAsXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgLy8gRm9yayBhIGRhZW1vbiBmaWJlciB0byBoYW5kbGUgZmlsZSBjaGFuZ2UgZXZlbnRzIHdpdGggY29udGV4dCBwcmVzZXJ2ZWRcbiAgICAgICAgICB5aWVsZCogd2F0Y2hEb2NrZXJDb250ZXh0cyhuZXdEb2NrZXJGdW5jdGlvbnMsIDUwMCkucGlwZShcbiAgICAgICAgICAgIFN0cmVhbS5ydW5Gb3JFYWNoKChldmVudCkgPT5cbiAgICAgICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoXG4gICAgICAgICAgICAgICAgICBgW0xvY2FsXSBGaWxlIGNoYW5nZWQgaW4gJHtldmVudC5mdW5jdGlvbklkfTogJHtldmVudC5maWxlUGF0aH1gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB5aWVsZCogcmVidWlsZERvY2tlckNvbnRhaW5lcihcbiAgICAgICAgICAgICAgICAgIGV2ZW50LmZ1bmN0aW9uSWQsXG4gICAgICAgICAgICAgICAgICBjb250YWluZXJzLFxuICAgICAgICAgICAgICAgICAgcHJvamVjdFJvb3QsXG4gICAgICAgICAgICAgICAgKS5waXBlKFxuICAgICAgICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsKChlcnJvcikgPT5cbiAgICAgICAgICAgICAgICAgICAgRWZmZWN0LmxvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIGBbTG9jYWxdIFJlYnVpbGQgZmFpbGVkIGZvciAke2V2ZW50LmZ1bmN0aW9uSWR9OiAke2Vycm9yfWAsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgRWZmZWN0LmZvcmtEYWVtb24sXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsb2dTdGF0ZS5oYXNMb2dnZWRXYXRjaGluZykge1xuICAgICAgICAgIGxvZ1N0YXRlLmhhc0xvZ2dlZFdhdGNoaW5nID0gdHJ1ZVxuICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcIltMb2NhbF0gUmVhZHkgZm9yIGludm9jYXRpb25zXCIpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIHRoYXQgd2UndmUgY29tcGxldGVkIGZpcnN0IGRpc2NvdmVyeVxuICAgICAgICBsb2dTdGF0ZS5oYXNEaXNjb3ZlcmVkT25jZSA9IHRydWVcbiAgICAgIH0pXG5cbiAgICAgIC8vIEhhbmRsZSBDREsgd2F0Y2ggZXZlbnRzIChzdGFjayBkaXNjb3ZlcnkgYW5kIGRlcGxveSBjb21wbGV0aW9uKVxuICAgICAgeWllbGQqIFF1ZXVlLnRha2UoY2RrRXZlbnRzKS5waXBlKFxuICAgICAgICBFZmZlY3QuZmxhdE1hcCgoZXZlbnQpID0+XG4gICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgc3dpdGNoIChldmVudC5fdGFnKSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJTdGFja0Rpc2NvdmVyZWRcIjpcbiAgICAgICAgICAgICAgICAvLyBBZGQgZGlzY292ZXJlZCBzdGFjayB0byBmaWx0ZXIgKGlmIG5vdCB1c2luZyAtLXN0YWNrcylcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAhc3RhY2tzRnJvbU9wdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgIWZpbHRlclN0YXRlLnN0YWNrcy5pbmNsdWRlcyhldmVudC5zdGFja05hbWUpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBmaWx0ZXJTdGF0ZS5zdGFja3MucHVzaChldmVudC5zdGFja05hbWUpXG4gICAgICAgICAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKFxuICAgICAgICAgICAgICAgICAgICBgW0xvY2FsXSBEaXNjb3ZlcmVkIHN0YWNrOiAke2V2ZW50LnN0YWNrTmFtZX1gLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlIFwiRGVwbG95Q29tcGxldGVcIjpcbiAgICAgICAgICAgICAgICAvLyBSdW4gZGFlbW9uIHVwZGF0ZSBvbiBkZXBsb3kgY29tcGxldGlvblxuICAgICAgICAgICAgICAgIHlpZWxkKiBzdGFydE9yVXBkYXRlRGFlbW9uLnBpcGUoXG4gICAgICAgICAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGwoKGVycm9yKSA9PlxuICAgICAgICAgICAgICAgICAgICBFZmZlY3QubG9nRXJyb3IoYEZhaWxlZCB0byB1cGRhdGUgZGFlbW9uOiAke2Vycm9yfWApLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgICAgRWZmZWN0LmZvcmV2ZXIsXG4gICAgICAgIEVmZmVjdC5mb3JrLFxuICAgICAgKVxuXG4gICAgICAvLyBIYW5kbGUgY2xlYW51cCBvbiBleGl0XG4gICAgICBjb25zdCBjbGVhbnVwID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBFZmZlY3QucnVuUHJvbWlzZShcbiAgICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oXCJcXG5TaHV0dGluZyBkb3duLi4uXCIpXG5cbiAgICAgICAgICAgIC8vIFN0b3AgQ0RLIHdhdGNoXG4gICAgICAgICAgICB5aWVsZCogY2RrV2F0Y2hQcm9jZXNzXG4gICAgICAgICAgICAgIC5raWxsKFwiU0lHVEVSTVwiKVxuICAgICAgICAgICAgICAucGlwZShFZmZlY3QuY2F0Y2hBbGwoKCkgPT4gRWZmZWN0LnZvaWQpKVxuXG4gICAgICAgICAgICAvLyBTdG9wIGFsbCBEb2NrZXIgY29udGFpbmVycyB1c2luZyB0aGUgRG9ja2VyIHNlcnZpY2VcbiAgICAgICAgICAgIGNvbnN0IGRvY2tlciA9IHlpZWxkKiBEb2NrZXJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDb250YWluZXJzID0geWllbGQqIFJlZi5nZXQoY29udGFpbmVycylcbiAgICAgICAgICAgIGZvciAoY29uc3QgW25hbWUsIGNvbnRhaW5lcl0gb2YgY3VycmVudENvbnRhaW5lcnMpIHtcbiAgICAgICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dJbmZvKGBTdG9wcGluZyBjb250YWluZXI6ICR7bmFtZX1gKVxuICAgICAgICAgICAgICB5aWVsZCogZG9ja2VyLnN0b3AoY29udGFpbmVyLmNvbnRhaW5lck5hbWUpLnBpcGUoXG4gICAgICAgICAgICAgICAgRWZmZWN0LnNjb3BlZCxcbiAgICAgICAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGwoKCkgPT4gRWZmZWN0LnZvaWQpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFN0b3AgYWxsIE5vZGUuanMgd29ya2Vyc1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFdvcmtlcnMgPSB5aWVsZCogUmVmLmdldCh3b3JrZXJzKVxuICAgICAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgd29ya2VyXSBvZiBjdXJyZW50V29ya2Vycykge1xuICAgICAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oYFN0b3BwaW5nIHdvcmtlcjogJHtuYW1lfWApXG4gICAgICAgICAgICAgIHlpZWxkKiBFZmZlY3QudHJ5KCgpID0+XG4gICAgICAgICAgICAgICAgd29ya2VyLndvcmtlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIiksXG4gICAgICAgICAgICAgICkucGlwZShFZmZlY3QuY2F0Y2hBbGwoKCkgPT4gRWZmZWN0LnZvaWQpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDbG9zZSB0aGUgc2VydmVyIHNjb3BlIHRvIGNsZWFuIHVwIFJ1bnRpbWUgQVBJIHNlcnZlcnNcbiAgICAgICAgICAgIHlpZWxkKiBTY29wZS5jbG9zZShzZXJ2ZXJTY29wZSwgRXhpdC52b2lkKVxuICAgICAgICAgIH0pLnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QucHJvdmlkZShEb2NrZXJMaXZlKSxcbiAgICAgICAgICAgIEVmZmVjdC5wcm92aWRlKEJ1bkNvbnRleHQubGF5ZXIpLFxuICAgICAgICAgICAgRWZmZWN0LnByb3ZpZGUoTG9nZ2VyLnByZXR0eSksXG4gICAgICAgICAgICBFZmZlY3QucHJvdmlkZShMb2dnZXIubWluaW11bUxvZ0xldmVsKGxvZ0xldmVsKSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuXG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKVxuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLm9uKFwiU0lHSU5UXCIsIGNsZWFudXApXG4gICAgICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBjbGVhbnVwKVxuXG4gICAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oXCJbTG9jYWxdIFByZXNzIEN0cmwrQyB0byBzdG9wXCIpXG5cbiAgICAgIC8vIEtlZXAgdGhlIHByb2Nlc3MgcnVubmluZ1xuICAgICAgeWllbGQqIEVmZmVjdC5uZXZlclxuICAgIH0pLnBpcGUoXG4gICAgICBFZmZlY3QucHJvdmlkZShMb2dnZXIucHJldHR5KSxcbiAgICAgIEVmZmVjdC5wcm92aWRlKExvZ2dlci5taW5pbXVtTG9nTGV2ZWwobG9nTGV2ZWwpKSxcbiAgICApXG4gIH0sXG4pLnBpcGUoXG4gIENvbW1hbmQud2l0aERlc2NyaXB0aW9uKFxuICAgIFwiU3RhcnQgbG9jYWwgTGFtYmRhIGRldmVsb3BtZW50IHdpdGggQ0RLIHdhdGNoIGFuZCBEb2NrZXIgY29udGFpbmVyc1wiLFxuICApLFxuKVxuIl19
|
|
1170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2xvY2FsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBRUgsT0FBTyxFQUFxQixLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUM3RCxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ3hDLE9BQU8sRUFDTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLGVBQWUsR0FDaEIsTUFBTSx3QkFBd0IsQ0FBQTtBQUMvQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDcEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDOUMsT0FBTyxFQUVMLE9BQU8sSUFBSSxlQUFlLEdBQzNCLE1BQU0sa0JBQWtCLENBQUE7QUFFekIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ2pELE9BQU8sRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksRUFDSixLQUFLLEVBQ0wsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBQ0wsR0FBRyxFQUNILFFBQVEsRUFDUixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sUUFBUSxDQUFBO0FBQ2YsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBRWhCLHNCQUFzQixFQUN0QixlQUFlLEVBRWYsYUFBYSxHQUNkLE1BQU0sdUJBQXVCLENBQUE7QUFDOUIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDeEQsT0FBTyxFQUNMLDRCQUE0QixFQUM1QixNQUFNLEVBQ04sVUFBVSxFQUNWLHlCQUF5QixHQUMxQixNQUFNLHdCQUF3QixDQUFBO0FBQy9CLE9BQU8sRUFFTCxtQkFBbUIsR0FDcEIsTUFBTSxzQkFBc0IsQ0FBQTtBQUM3QixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGVBQWUsRUFFZixxQkFBcUIsRUFDckIsZUFBZSxHQUNoQixNQUFNLDBCQUEwQixDQUFBO0FBcUJqQzs7OztHQUlHO0FBQ0gsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUEsQ0FBQywyQkFBMkI7QUF5RG5FOzs7R0FHRztBQUNILE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FDbEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDbEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDbkMsTUFBTSxRQUFRLEdBQUcsR0FBRyxhQUFhLElBQUksU0FBUyxFQUFFLENBQUE7SUFFaEQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUN0QyxHQUFHLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDZCxNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQ25DLElBQUksbUJBQW1CLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxRQUFRLFVBQVUsRUFBRSxDQUFDLENBQ3pELENBQUE7WUFDRCxPQUFPLFFBQVEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFBO1FBQ2xDLENBQUM7UUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSTtLQUNsQixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFcEQsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDcEIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFBO1FBQ3BFLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVELElBQUksTUFBTSxLQUFLLGlCQUFpQixFQUFFLENBQUM7UUFDakMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDbkIsMkNBQTJDLE1BQU0sY0FBYyxpQkFBaUIsRUFBRSxDQUNuRixDQUFBO1FBQ0QsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDLENBQUMsQ0FBQTtBQUVKOztHQUVHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsQ0FBQyxPQUdyQixFQUFFLEVBQUUsQ0FDSCxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUNsQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxDQUFDLENBQUE7SUFFOUQsbURBQW1EO0lBQ25ELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2pELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFBO0lBRTlELE1BQU0sSUFBSSxHQUFHO1FBQ1gsS0FBSztRQUNMLFFBQVE7UUFDUixvQkFBb0I7UUFDcEIsb0JBQW9CO1FBQ3BCLE9BQU87UUFDUCxPQUFPO1FBQ1AsT0FBTyxVQUFVLEVBQUU7S0FDcEIsQ0FBQTtJQUVELElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQTJCO1FBQ2xDLEdBQUcsT0FBTyxDQUFDLEdBQUc7S0FDVyxDQUFBO0lBQzNCLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25CLEdBQUcsQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQTtRQUMvQixHQUFHLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQTtJQUN6QyxDQUFDO0lBRUQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFdkQsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ3ZELGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQ3hCLGVBQWUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQ2pDLENBQUE7SUFFRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBRWxELDJCQUEyQjtJQUMzQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDaEQsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUNuQixNQUFNLENBQUMsVUFBVSxFQUNqQixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDZixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUE7SUFDbkMsQ0FBQyxDQUFDLENBQ0gsQ0FDRixDQUFBO0lBRUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQTtJQUNyQyxJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuQixPQUFPLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3ZCLElBQUksS0FBSyxDQUFDLDhDQUE4QyxRQUFRLEVBQUUsQ0FBQyxDQUNwRSxDQUFBO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsd0NBQXdDLENBQUMsQ0FBQTtBQUNqRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBRXhCOzs7R0FHRztBQUNILE1BQU0sZUFBZSxHQUFHLENBQUMsT0FJeEIsRUFBRSxFQUFFLENBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDbEIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFBO0lBRXJFLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUVqRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNuQiwwREFBMEQsQ0FDM0QsQ0FBQTtRQUNELEtBQUssQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUMzRSxDQUFDO1NBQU0sQ0FBQztRQUNOLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMscUNBQXFDLENBQUMsQ0FBQTtJQUMvRCxDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUE7QUFFSjs7R0FFRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FDaEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDbEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDbkMsTUFBTSxRQUFRLEdBQUcsR0FBRyxhQUFhLElBQUksU0FBUyxFQUFFLENBQUE7SUFFaEQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUNoQyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ2hCLEdBQUcsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNkLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FDakMsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLFFBQVEsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQ3pELENBQUE7WUFDRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQTtRQUN0QyxDQUFDO1FBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDZixJQUFJLEtBQUssQ0FBQywrQkFBK0IsSUFBSSxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0tBQ3JFLENBQUMsQ0FBQTtJQUVKLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUNyRCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBRTdELE9BQU8sRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQTtBQUMzQyxDQUFDLENBQUMsQ0FBQTtBQUVKOztHQUVHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRywrQkFBK0IsQ0FBQTtBQUUxRDs7O0dBR0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLENBQUMsV0FBc0IsRUFBRSxFQUFFLENBQ25ELE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ2xCLE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ3pDLE1BQU0sU0FBUyxHQUF5QixFQUFFLENBQUE7SUFFMUMscUJBQXFCO0lBQ3JCLElBQUksVUFBOEIsQ0FBQTtJQUNsQyxHQUFHLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQzVDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FDUixZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksb0JBQW9CLENBQUMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNyRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNmLElBQUksS0FBSyxDQUFDLDZCQUE2QixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUMxRCxDQUFDLENBQUE7UUFFRixLQUFLLE1BQU0sRUFBRSxJQUFJLFlBQVksQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFLENBQUM7WUFDOUMsNkJBQTZCO1lBQzdCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7Z0JBQzFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FDUixZQUFZLENBQUMsSUFBSSxDQUNmLElBQUksZUFBZSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUNsRDtnQkFDSCxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUNwRSxDQUFDLENBQUMsSUFBSSxDQUNMLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQ25CLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBNEIsRUFBRSxDQUFDLENBQ3ZELENBQ0YsQ0FBQTtZQUVELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO1lBRWxDLDREQUE0RDtZQUM1RCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDO2dCQUMxRCxvQ0FBb0M7Z0JBQ3BDLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzFDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO29CQUMxQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO3dCQUNuRCxTQUFRO29CQUNWLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCw0Q0FBNEM7Z0JBQzVDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxhQUFhLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDcEQsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7b0JBQ2xELENBQUMsQ0FBRSxPQUFpQjtvQkFDcEIsQ0FBQyxDQUFFLFFBQWtCLENBQUE7Z0JBRXZCLE1BQU0sVUFBVSxHQUF1QjtvQkFDckMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFhO29CQUM5QixXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVk7b0JBQzVCLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRTtvQkFDekMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDO29CQUMvQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFVBQVUsSUFBSSxHQUFHO29CQUM5QixZQUFZO2lCQUNiLENBQUE7Z0JBQ0QsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUM1QixDQUFDO1FBQ0gsQ0FBQztRQUVELFVBQVUsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFBO0lBQ3RDLENBQUMsUUFBUSxVQUFVLEVBQUM7SUFFcEIsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQyxDQUFDLENBQUE7QUFFSjs7Ozs7R0FLRztBQUNILE1BQU0sc0JBQXNCLEdBQUcsQ0FDN0IsRUFBc0IsRUFDdEIsSUFBWSxFQUNaLFdBQW1CLEVBQ25CLGFBQXFDLEVBQ3JDLGtCQUFpRCxFQUtqRCxFQUFFLENBQ0YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDbEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDdkIsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsWUFBWSw2QkFBNkIsQ0FBQyxDQUNwRSxDQUFBO0lBQ0gsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQTtJQUU1QixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUE7SUFDcEQsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDLGVBQWU7UUFDbEQsQ0FBQyxDQUFDLHNCQUFzQjtRQUN4QixDQUFDLENBQUMsYUFBYSxDQUFBO0lBRWpCLGlEQUFpRDtJQUNqRCxNQUFNLFNBQVMsR0FBRyxlQUFlLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFBO0lBRTVGLG9EQUFvRDtJQUNwRCxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUN0RCxDQUFDLENBQUMsRUFBRSxDQUFDLGlCQUFpQjtRQUN0QixDQUFDLENBQUMsR0FBRyxXQUFXLElBQUksRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUE7SUFFNUMsdUNBQXVDO0lBQ3ZDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxZQUFZLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQTtJQUU1RSw0Q0FBNEM7SUFDNUMsS0FBSyxDQUFDLENBQUMsTUFBTTtTQUNWLEtBQUssQ0FBQztRQUNMLFdBQVc7UUFDWCxTQUFTO1FBQ1QsUUFBUTtLQUNULENBQUM7U0FDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRXRCLHlFQUF5RTtJQUN6RSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDeEUsTUFBTSxnQkFBZ0IsR0FBRyw0QkFBNEIsQ0FDbkQsV0FBVyxDQUFDLFVBQVUsRUFDdEIsV0FBVyxDQUFDLEdBQUcsQ0FDaEIsQ0FBQTtJQUVELE1BQU0sZUFBZSxHQUFHLHlCQUF5QixDQUFDO1FBQ2hELFFBQVEsRUFBRSxTQUFTO1FBQ25CLGNBQWM7UUFDZCxjQUFjLEVBQUUsSUFBSTtRQUNwQixZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVk7UUFDN0IsZUFBZSxFQUFFLFNBQVM7UUFDMUIsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRO1FBQ3JCLGNBQWMsRUFBRSxJQUFJLEVBQUUseUNBQXlDO1FBQy9ELFFBQVE7UUFDUixhQUFhO1FBQ2Isa0JBQWtCO0tBQ25CLENBQUMsQ0FBQTtJQUVGLDZEQUE2RDtJQUM3RCxlQUFlLENBQUMsVUFBVSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQTtJQUN4RCxlQUFlLENBQUMsT0FBTyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQTtJQUVsRCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNuQiwwQkFBMEIsRUFBRSxDQUFDLFlBQVksWUFBWSxJQUFJLEVBQUUsQ0FDNUQsQ0FBQTtJQUVELGtGQUFrRjtJQUNsRix3REFBd0Q7SUFDeEQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTTtTQUN4QixHQUFHLENBQUMsZUFBZSxDQUFDO1NBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRXhELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtBQUVyQyxpQ0FBaUM7QUFDakMsTUFBTSxnQkFBZ0IsR0FBRyxDQUN2QixDQUFpRCxFQUM1QixFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBRTVELE1BQU0sYUFBYSxHQUFHLENBQ3BCLENBQWlELEVBQy9CLEVBQUUsQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLFdBQVcsSUFBSSxDQUFDLENBQUE7QUFFM0QsTUFBTSxpQkFBaUIsR0FBRyxDQUN4QixDQUFpRCxFQUMzQixFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsSUFBSSxXQUFXLElBQUksQ0FBQyxDQUFBO0FBRWxFOzs7O0dBSUc7QUFDSCxNQUFNLGNBQWMsR0FBRyxDQUNyQixTQUE0QixFQUM1QixhQUFzRCxFQUN0RCxhQUFxQixFQUN3QyxFQUFFLENBQy9ELE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ2xCLCtCQUErQjtJQUMvQixJQUFJLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM3QixLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQ25ELE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUNuQyxDQUFBO1FBQ0QsU0FBUyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUE7SUFDakMsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSxNQUFNLFVBQVUsR0FBb0MsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FDbkUsUUFBUSxDQUFDO1FBQ1AsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUE7UUFFbkQsNkNBQTZDO1FBQzdDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQ25CLG1DQUFtQyxTQUFTLENBQUMsRUFBRSxDQUFDLFlBQVksb0NBQW9DLENBQ2pHLENBQUE7UUFFRCx5REFBeUQ7UUFDekQseUVBQXlFO1FBQ3pFLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQTtRQUM1QixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNqRCxNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUNuQyxDQUFBO1FBRUQsNkRBQTZEO1FBQzdELE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUN2RCxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNuRCxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO0lBQ2xELENBQUMsQ0FDRixDQUFDLElBQUksQ0FDSixNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUMxQixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFDbEMsTUFBTSxDQUFDLFVBQVUsQ0FDbEIsQ0FBQTtJQUVELFNBQVMsQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFBO0FBQ3ZDLENBQUMsQ0FBQyxDQUFBO0FBRUo7Ozs7R0FJRztBQUNILE1BQU0seUJBQXlCLEdBQUcsQ0FDaEMsU0FBNEIsRUFDNUIsYUFBc0QsRUFDdEQsYUFBcUIsRUFDckIsTUFBNEMsRUFDNUMsa0JBQWtELEVBQ1csRUFBRSxDQUMvRCxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUNsQixNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUU1RSxvREFBb0Q7SUFDcEQsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNaLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFN0QsSUFBSSxRQUF5QixDQUFBO1FBQzdCLElBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM3QixRQUFRLEdBQUc7Z0JBQ1QsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztnQkFDM0IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2FBQ3BCLENBQUE7UUFDSCxDQUFDO2FBQU0sSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxRQUFRLEdBQUc7Z0JBQ1QsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztnQkFDM0IsS0FBSyxFQUFFO29CQUNMLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztvQkFDM0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO29CQUNqQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7aUJBQzlCO2FBQ0YsQ0FBQTtRQUNILENBQUM7YUFBTSxJQUFJLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDckMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDcEIsdUJBQXVCLE1BQU0sQ0FBQyxTQUFTLEtBQUssTUFBTSxDQUFDLFlBQVksRUFBRSxDQUNsRSxDQUFBO1lBQ0QsU0FBUTtRQUNWLENBQUM7YUFBTSxDQUFDO1lBQ04sU0FBUTtRQUNWLENBQUM7UUFFRCxpQ0FBaUM7UUFDakMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDeEQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7UUFFekUsK0JBQStCO1FBQy9CLE1BQU0sR0FBRyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDdEQsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNSLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFBO1lBQ3pDLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuQixPQUFPLENBQUMsR0FBRyxDQUNULElBQUksR0FBRyxDQUFDLEdBQUcsK0JBQStCLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUMsWUFBWSxLQUFLLFVBQVUsa0JBQWtCLENBQ3BJLENBQUE7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLEdBQUcsQ0FDVCxJQUFJLEdBQUcsQ0FBQyxHQUFHLHFDQUFxQyxVQUFVLGtCQUFrQixDQUM3RSxDQUFBO1lBQ0gsQ0FBQztZQUNELGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDL0MsQ0FBQztRQUVELDRFQUE0RTtRQUM1RSxLQUFLLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUNoRSxDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUE7QUFFSjs7OztHQUlHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxDQUN4QixFQUFzQixFQUN0QixJQUFZLEVBQ1osV0FBbUIsRUFDbkIsR0FBMkIsRUFDM0Isa0JBQWtELEVBQ2QsRUFBRSxDQUN0QyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUNsQixJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JCLE9BQU8sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDdkIsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsWUFBWSw0QkFBNEIsQ0FBQyxDQUNuRSxDQUFBO0lBQ0gsQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQzFDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FDckMsU0FBUyxFQUNULElBQUksRUFDSixpQkFBaUIsRUFDakIsbUJBQW1CLENBQ3BCLENBQUE7SUFFRCx1RUFBdUU7SUFDdkUsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNoQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3ZCLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQ3JELENBQUE7SUFDSCxDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLDZFQUE2RTtJQUM3RSxNQUFNLFNBQVMsR0FBc0I7UUFDbkMsa0ZBQWtGO1FBQ2xGLEdBQUcsR0FBRztRQUNOLGlFQUFpRTtRQUNqRSxzQkFBc0IsRUFBRSxhQUFhLElBQUksRUFBRTtRQUMzQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFlBQVk7UUFDekIsZ0JBQWdCLEVBQUUsV0FBVztRQUM3QixrQ0FBa0M7UUFDbEMsK0JBQStCLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUM7S0FDckQsQ0FBQTtJQUVELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ3BCLHVDQUF1QyxFQUFFLENBQUMsWUFBWSxZQUFZLElBQUksRUFBRSxDQUN6RSxDQUFBO0lBQ0QsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUE7SUFFN0QsNEVBQTRFO0lBQzVFLGdFQUFnRTtJQUNoRSxvRUFBb0U7SUFDcEUsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFO1FBQ3BFLEdBQUcsRUFBRSxXQUFXO1FBQ2hCLEdBQUcsRUFBRSxTQUFTO1FBQ2QsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7S0FDbEMsQ0FBQyxDQUFBO0lBRUYsNEVBQTRFO0lBQzVFLHFGQUFxRjtJQUNyRixNQUFNLGdCQUFnQixHQUNwQixrRUFBa0UsQ0FBQTtJQUVwRSxtREFBbUQ7SUFDbkQsTUFBTSxVQUFVLEdBQUcsQ0FDakIsT0FBZSxFQUNzQixFQUFFO1FBQ3ZDLDREQUE0RDtRQUM1RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUN2QyxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDekMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUMxQixNQUFNLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDN0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUiwwREFBMEQ7Z0JBQzFELE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1lBQ3RELENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFBO0lBQzlDLENBQUMsQ0FBQTtJQUVELHNEQUFzRDtJQUN0RCxhQUFhLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFZLEVBQUUsRUFBRTtRQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2hELEtBQUssTUFBTSxPQUFPLElBQUksS0FBSyxFQUFFLENBQUM7WUFDNUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDL0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQ3JDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQVksRUFBRSxFQUFFO1FBQ2hELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDaEQsS0FBSyxNQUFNLE9BQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUM1QixNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUMvQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDdkMsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsYUFBYSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNoQyxNQUFNLENBQUMsT0FBTyxDQUNaLE1BQU0sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDbEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUNqRCxDQUNGLENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLGFBQWEsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDakMsTUFBTSxDQUFDLE9BQU8sQ0FDWixNQUFNLENBQUMsT0FBTyxDQUFDLDJCQUEyQixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDcEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUNqRCxDQUNGLENBQUE7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLE9BQU8sYUFBYSxDQUFBO0FBQ3RCLENBQUMsQ0FBQyxDQUFBO0FBRUo7O0dBRUc7QUFDSCxNQUFNLHNCQUFzQixHQUFHLENBQzdCLE1BQW9CLEVBQ3BCLE1BQTRDLEVBQzVDLGtCQUFrRCxFQUNsRCxFQUFFLENBQ0YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDbEIsTUFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUE7SUFFekUsaURBQWlEO0lBQ2pELE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDWixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBRTFELElBQUksUUFBeUIsQ0FBQTtRQUM3QixJQUFJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDN0IsUUFBUSxHQUFHO2dCQUNULElBQUksRUFBRSxVQUFVO2dCQUNoQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7Z0JBQzNCLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSTthQUNwQixDQUFBO1FBQ0gsQ0FBQzthQUFNLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDakMsUUFBUSxHQUFHO2dCQUNULElBQUksRUFBRSxVQUFVO2dCQUNoQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7Z0JBQzNCLEtBQUssRUFBRTtvQkFDTCxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7b0JBQzNCLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtvQkFDakMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO2lCQUM5QjthQUNGLENBQUE7UUFDSCxDQUFDO2FBQU0sSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3JDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ3BCLDhCQUE4QixNQUFNLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FDekUsQ0FBQTtZQUNELFNBQVE7UUFDVixDQUFDO2FBQU0sQ0FBQztZQUNOLFNBQVE7UUFDVixDQUFDO1FBRUQsaUNBQWlDO1FBQ2pDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3hELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsNkJBQTZCLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBRXpFLCtCQUErQjtRQUMvQixNQUFNLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3RELElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQTtZQUN6QyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FDVCxJQUFJLEdBQUcsQ0FBQyxHQUFHLCtCQUErQixRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsS0FBSyxDQUFDLFlBQVksS0FBSyxVQUFVLGtCQUFrQixDQUNwSSxDQUFBO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxHQUFHLENBQ1QsSUFBSSxHQUFHLENBQUMsR0FBRyxxQ0FBcUMsVUFBVSxrQkFBa0IsQ0FDN0UsQ0FBQTtZQUNILENBQUM7WUFDRCxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQy9DLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUE7QUFFSjs7O0dBR0c7QUFDSCxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFBO0FBRWxFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUN6QyxtQkFBbUI7SUFDbkIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtDQUNwQixDQUFDLENBQUE7QUFFRjs7R0FFRztBQUNILE1BQU0scUJBQXFCLEdBQUcsQ0FDNUIsR0FBMkIsRUFDSCxFQUFFO0lBQzFCLE1BQU0sTUFBTSxHQUEyQixFQUFFLENBQUE7SUFDekMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxHQUFHLENBQ2pCLE1BQThCLEVBQzlCLE1BQThCLEVBQ3RCLEVBQUU7SUFDVixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUE7SUFFNUIsbUNBQW1DO0lBQ25DLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3RDLElBQUksMEJBQTBCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUFFLFNBQVE7UUFDakQsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDckIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFDekIsQ0FBQzthQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFBO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQseUJBQXlCO0lBQ3pCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3RDLElBQUksMEJBQTBCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUFFLFNBQVE7UUFDakQsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDckIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDM0IsQ0FBQyxDQUFBO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsQ0FDMUIsRUFBc0IsRUFDdEIsYUFBcUMsRUFDckMsVUFBOEMsRUFDOUMsV0FBd0IsRUFDeEIsV0FBbUIsRUFDbkIsYUFBbUQsRUFDbkQsa0JBQWtELEVBQ2QsRUFBRSxDQUN0QyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUNsQixpQ0FBaUM7SUFDakMsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNqRCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUNwRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsNERBQTREO1FBQzVELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBQ3ZELElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNuQixtQ0FBbUMsRUFBRSxDQUFDLFlBQVksMkJBQTJCLE9BQU8sR0FBRyxDQUN4RixDQUFBO1lBQ0Qsc0JBQXNCO1lBQ3RCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ2xFLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUNuQyxDQUFBO1lBQ0QsK0NBQStDO1lBQy9DLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQ3RDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFBO1FBQzVDLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxRQUFRLENBQUE7UUFDakIsQ0FBQztJQUNILENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDcEIsMkRBQTJELEVBQUUsQ0FBQyxZQUFZLEtBQUssQ0FDaEYsQ0FBQTtJQUVELDhDQUE4QztJQUM5QyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQztRQUNqRSxnQkFBZ0IsRUFBRTtZQUNoQixZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVk7WUFDN0IsZUFBZSxFQUFFLFNBQVM7WUFDMUIsT0FBTyxFQUFFLEVBQUUsQ0FBQyxZQUFZO1NBQ3pCO0tBQ0YsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQTtJQUV4RCw2RUFBNkU7SUFDN0Usd0VBQXdFO0lBQ3hFLE1BQU0sTUFBTSxHQUFpQjtRQUMzQixFQUFFO1FBQ0YsWUFBWTtRQUNaLElBQUk7UUFDSixhQUFhLEVBQUUsU0FBb0MsRUFBRSxzQkFBc0I7UUFDM0UsR0FBRyxFQUFFLGFBQWE7S0FDbkIsQ0FBQTtJQUVELG9EQUFvRDtJQUNwRCxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDM0MsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUE7SUFFMUMsd0RBQXdEO0lBQ3hELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUFDLGlCQUFpQixDQUM1QyxFQUFFLEVBQ0YsSUFBSSxFQUNKLFdBQVcsRUFDWCxhQUFhLEVBQ2Isa0JBQWtCLENBQ25CLENBQUMsSUFBSSxDQUNKLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUNsQiwyQ0FBMkM7UUFDM0MsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDcEIsc0NBQXNDLEVBQUUsQ0FBQyxZQUFZLEtBQUssS0FBSyxFQUFFLENBQ2xFLENBQUE7UUFDRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQy9CLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ25DLE9BQU8sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNsQyxDQUFDLENBQUMsQ0FDSCxDQUNGLENBQUE7SUFFRCxpQ0FBaUM7SUFDakMsTUFBTSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7SUFFcEMsK0NBQStDO0lBQy9DLE1BQU0sQ0FBQyxPQUFPLENBQ1osc0JBQXNCLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQyxDQUNsRSxDQUFBO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDLENBQUMsQ0FBQTtBQUVKOzs7OztHQUtHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxDQUM3QixFQUFzQixFQUN0QixhQUFxQyxFQUNyQyxhQUFzRCxFQUN0RCxXQUF3QixFQUN4QixXQUFtQixFQUNuQixhQUFxQixFQUNyQixhQUFxQixFQUNyQixhQUFtRCxFQUNuRCxrQkFBa0QsRUFDd0IsRUFBRSxDQUM1RSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUNsQixvQ0FBb0M7SUFDcEMsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ3ZELE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDdkQsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLDREQUE0RDtRQUM1RCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUN2RCxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osbUVBQW1FO1lBQ25FLGtFQUFrRTtZQUNsRSxnQ0FBZ0M7WUFDaEMsUUFBUSxDQUFDLEdBQUcsR0FBRyxhQUFhLENBQUE7WUFFNUIsMkVBQTJFO1lBQzNFLG1FQUFtRTtZQUNuRSxJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDMUIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDcEIsOERBQThELEVBQUUsQ0FBQyxZQUFZLHVCQUF1QixDQUNyRyxDQUFBO2dCQUNELE9BQU8sUUFBUSxDQUFBO1lBQ2pCLENBQUM7WUFFRCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNuQixtQ0FBbUMsRUFBRSxDQUFDLFlBQVksOEJBQThCLE9BQU8sR0FBRyxDQUMzRixDQUFBO1lBQ0QsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUE7WUFFNUIsb0RBQW9EO1lBQ3BELHFEQUFxRDtZQUNyRCxzRUFBc0U7WUFDdEUsaURBQWlEO1lBQ2pELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUN6QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUE7Z0JBQzVCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ25FLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTCxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUMxQixNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDeEIsTUFBTSxDQUFDLFFBQVEsQ0FDYiw4REFBOEQsS0FBSyxFQUFFLENBQ3RFLENBQ0YsQ0FDRixDQUFBO1lBRUQsK0VBQStFO1lBQy9FLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FDbEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQ25DLENBQUE7WUFFRCwwRUFBMEU7WUFDMUUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsc0JBQXNCLENBQzVDLEVBQUUsRUFDRixRQUFRLENBQUMsSUFBSSxFQUNiLFdBQVcsRUFDWCxhQUFhLEVBQ2Isa0JBQWtCLENBQ25CLENBQUMsSUFBSSxDQUNKLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztnQkFDbEIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDcEIsMkNBQTJDLEVBQUUsQ0FBQyxZQUFZLEtBQUssS0FBSyxFQUFFLENBQ3ZFLENBQUE7Z0JBQ0QsUUFBUSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUE7Z0JBQzdCLE9BQU8sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNsQyxDQUFDLENBQUMsQ0FDSCxDQUNGLENBQUE7WUFFRCxrQ0FBa0M7WUFDbEMsUUFBUSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUE7WUFDbEMsUUFBUSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUE7WUFFN0IsT0FBTyxRQUFRLENBQUE7UUFDakIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLFFBQVEsQ0FBQTtRQUNqQixDQUFDO0lBQ0gsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNuQixzREFBc0QsRUFBRSxDQUFDLFlBQVksS0FBSyxDQUMzRSxDQUFBO0lBRUQsOENBQThDO0lBQzlDLGlGQUFpRjtJQUNqRixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQztRQUNqRSxhQUFhO1FBQ2IsZ0JBQWdCLEVBQUU7WUFDaEIsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZO1lBQzdCLGVBQWUsRUFBRSxTQUFTO1lBQzFCLE9BQU8sRUFBRSxlQUFlO1NBQ3pCO0tBQ0YsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQTtJQUV4RCx5Q0FBeUM7SUFDekMsTUFBTSxhQUFhLEdBQUcsVUFBVSxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQTtJQUMvRSxNQUFNLFNBQVMsR0FBRyxlQUFlLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFBO0lBRTVGLDhFQUE4RTtJQUM5RSwyRUFBMkU7SUFDM0UsTUFBTSxTQUFTLEdBQXNCO1FBQ25DLEVBQUU7UUFDRixZQUFZO1FBQ1osSUFBSTtRQUNKLGNBQWMsRUFBRSxTQUF1RCxFQUFFLHNCQUFzQjtRQUMvRixhQUFhO1FBQ2IsU0FBUztRQUNULFlBQVksRUFBRSxLQUFLO1FBQ25CLGdCQUFnQixFQUFFLElBQUksR0FBRyxFQUFFO1FBQzNCLGNBQWMsRUFBRSxJQUFJO1FBQ3BCLEdBQUcsRUFBRSxhQUFhO0tBQ25CLENBQUE7SUFFRCxvREFBb0Q7SUFDcEQsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDakQsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtJQUVoRCw2REFBNkQ7SUFDN0QsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLENBQUMsc0JBQXNCLENBQ2xELEVBQUUsRUFDRixJQUFJLEVBQ0osV0FBVyxFQUNYLGFBQWEsRUFDYixrQkFBa0IsQ0FDbkIsQ0FBQyxJQUFJLENBQ0osTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ2xCLDhDQUE4QztRQUM5QyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQix5Q0FBeUMsRUFBRSxDQUFDLFlBQVksS0FBSyxLQUFLLEVBQUUsQ0FDckUsQ0FBQTtRQUNELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDN0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDL0IsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDdEMsT0FBTyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2xDLENBQUMsQ0FBQyxDQUNILENBQ0YsQ0FBQTtJQUVELGtDQUFrQztJQUNsQyxTQUFTLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQTtJQUV6QyxnRUFBZ0U7SUFDaEUsS0FBSyxDQUFDLENBQUMseUJBQXlCLENBQzlCLFNBQVMsRUFDVCxhQUFhLEVBQ2IsYUFBYSxFQUNiLGFBQWEsRUFDYixrQkFBa0IsQ0FDbkIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRXpCLE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUMsQ0FBQyxDQUFBO0FBRUo7OztHQUdHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxDQUM3QixVQUFrQixFQUNsQixhQUFzRCxFQUN0RCxXQUFtQixFQUMwQyxFQUFFLENBQy9ELE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO0lBQ2xCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDaEQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUU1QyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUNuQiwwQkFBMEIsVUFBVSx3QkFBd0IsQ0FDN0QsQ0FBQTtRQUNELE9BQU07SUFDUixDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLFNBQVMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFBO0lBRTdCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsb0NBQW9DLFVBQVUsS0FBSyxDQUFDLENBQUE7SUFFM0UsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFBO0lBRTVCLG1EQUFtRDtJQUNuRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFBO0lBQzNDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQ25CLGdEQUFnRCxXQUFXLEVBQUUsQ0FDOUQsQ0FBQTtJQUVELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUNwRCxNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUNsQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLG1DQUFtQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ2pFLE9BQU8sQ0FBQyxDQUFBO0lBQ1YsQ0FBQyxDQUFDLENBQ0gsQ0FDRixDQUFBO0lBQ0QsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsU0FBUyxlQUFlLENBQUMsQ0FBQTtJQUVuRSwyQkFBMkI7SUFDM0IsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQTtJQUN2QixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUN2RCxDQUFDLENBQUMsRUFBRSxDQUFDLGlCQUFpQjtRQUN0QixDQUFDLENBQUMsR0FBRyxXQUFXLElBQUksRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUE7SUFFNUMsdUNBQXVDO0lBQ3ZDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxZQUFZLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQTtJQUU1RSwyQkFBMkI7SUFDM0IsS0FBSyxDQUFDLENBQUMsTUFBTTtTQUNWLEtBQUssQ0FBQztRQUNMLFdBQVc7UUFDWCxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVM7UUFDOUIsUUFBUTtLQUNULENBQUM7U0FDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRXRCLHlFQUF5RTtJQUN6RSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNO1NBQzlCLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDO1NBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdEIsTUFBTSxnQkFBZ0IsR0FBRyw0QkFBNEIsQ0FDbkQsV0FBVyxDQUFDLFVBQVUsRUFDdEIsV0FBVyxDQUFDLEdBQUcsQ0FDaEIsQ0FBQTtJQUVELHdEQUF3RDtJQUN4RCxvRUFBb0U7SUFDcEUsNkJBQTZCO0lBQzdCLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQTtJQUNwRCxNQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsZUFBZTtRQUNsRCxDQUFDLENBQUMsc0JBQXNCO1FBQ3hCLENBQUMsQ0FBQyxhQUFhLENBQUE7SUFFakIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDbkIsd0RBQXdELGNBQWMsSUFBSSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQzNGLENBQUE7SUFFRCxNQUFNLGVBQWUsR0FBRyx5QkFBeUIsQ0FBQztRQUNoRCxRQUFRLEVBQUUsU0FBUyxDQUFDLFNBQVM7UUFDN0IsY0FBYztRQUNkLGNBQWMsRUFBRSxTQUFTLENBQUMsSUFBSTtRQUM5QixZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVk7UUFDN0IsZUFBZSxFQUFFLFNBQVM7UUFDMUIsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRO1FBQ3JCLGNBQWMsRUFBRSxJQUFJO1FBQ3BCLFFBQVE7S0FDVCxDQUFDLENBQUE7SUFFRiw2REFBNkQ7SUFDN0QsZUFBZSxDQUFDLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUE7SUFDeEQsZUFBZSxDQUFDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUE7SUFFbEQsMEJBQTBCO0lBQzFCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ3BCLHNDQUFzQyxVQUFVLEtBQUssQ0FDdEQsQ0FBQTtJQUVELDJEQUEyRDtJQUMzRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FDdEQsTUFBTSxDQUFDLE1BQU0sRUFDYixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDcEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDbEIsaUVBQWlFO1FBQ2pFLHVDQUF1QztRQUN2QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFBO1FBQzVCLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUMvQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQixpQkFBaUIsVUFBVSxxQkFBcUIsSUFBSSxFQUFFLENBQ3ZELENBQUE7WUFDRCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDcEQsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUNILEVBQ0QsTUFBTSxDQUFDLE1BQU0sRUFDYixNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDeEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsVUFBVSxLQUFLLEtBQUssRUFBRSxDQUFDLENBQy9ELEVBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FDbEIsQ0FBQTtJQUVELGdEQUFnRDtJQUNoRCxTQUFTLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQTtJQUVuQyw2REFBNkQ7SUFDN0QsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUVoQyxTQUFTLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQTtJQUM5QixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGlDQUFpQyxVQUFVLEVBQUUsQ0FBQyxDQUFBO0FBQ3ZFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7QUFFckM7Ozs7R0FJRztBQUNILE1BQU0sc0JBQXNCLEdBQUcsQ0FDN0IsRUFBc0IsRUFDdEIsVUFBNkIsRUFDN0IsYUFBc0QsRUFDdEQsV0FBd0IsRUFDeEIsV0FBbUIsRUFDbkIsYUFBcUIsRUFDckIsYUFBcUIsRUFDckIsYUFBbUQsRUFDbkQsaUJBQWtDLEVBQ2xDLGtCQUFrRCxFQUNXLEVBQUUsQ0FDL0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDbEIsaUVBQWlFO0lBQ2pFLHdFQUF3RTtJQUN4RSxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxzQkFBc0IsQ0FDN0MsRUFBRSxFQUNGLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQzNDLGFBQWEsRUFDYixXQUFXLEVBQ1gsV0FBVyxFQUNYLGFBQWEsRUFDYixhQUFhLEVBQ2IsYUFBYSxFQUNiLGtCQUFrQixDQUNuQixDQUFBO0lBRUQseURBQXlEO0lBQ3pELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQzNDLGlCQUFpQixFQUNqQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FDYixDQUFBO0lBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQzVCLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFO1FBQzNDLEdBQUcsRUFBRSxhQUFhO1FBQ2xCLEtBQUssRUFBRSxTQUFTO1FBQ2hCLEVBQUUsRUFBRSxFQUFFLENBQUMsWUFBWTtRQUNuQixRQUFRLEVBQUUsSUFBSTtLQUNmLENBQUMsQ0FBQTtJQUVGLHFCQUFxQjtJQUNyQixPQUFPLENBQUMsR0FBRyxDQUNULE1BQU0sYUFBYSxpQ0FBaUMsRUFBRSxDQUFDLFlBQVksZUFBZSxDQUNuRixDQUFBO0lBRUQsa0NBQWtDO0lBQ2xDLElBQUksU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ3BCLCtCQUErQixVQUFVLENBQUMsU0FBUyxRQUFRLEVBQUUsQ0FBQyxZQUFZLDREQUE0RCxDQUN2SSxDQUFBO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQiwrQkFBK0IsVUFBVSxDQUFDLFNBQVMsUUFBUSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQzdFLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxnQkFBZ0IsR0FBcUI7UUFDekMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTO1FBQy9CLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztRQUN2QixrQkFBa0IsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLGtCQUFrQjtRQUN6RCxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsd0JBQXdCO1FBQ3BFLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWTtRQUM3QixlQUFlLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlO1FBQ25ELGFBQWEsRUFBRSxFQUFFLENBQUMsUUFBUTtRQUMxQixZQUFZLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxZQUFZO1FBQzdDLGFBQWEsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLGFBQWE7S0FDaEQsQ0FBQTtJQUVELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ3BCLDJDQUEyQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQzVELENBQUE7SUFDRCwwRUFBMEU7SUFDMUUsS0FBSyxDQUFDLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO0lBQ3ZFLEtBQUssQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUE7SUFDaEUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFBO0FBQ2xFLENBQUMsQ0FBQyxDQUFBO0FBRUo7OztHQUdHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxDQUM3QixFQUFzQixFQUN0QixVQUE2QixFQUM3QixVQUE4QyxFQUM5QyxXQUF3QixFQUN4QixXQUFtQixFQUNuQixhQUFtRCxFQUNuRCxpQkFBa0MsRUFDbEMsa0JBQWtELEVBQ3RCLEVBQUUsQ0FDOUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDbEIsOERBQThEO0lBQzlELE1BQU0sYUFBYSxHQUFHLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUE7SUFFakUsOERBQThEO0lBQzlELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLG1CQUFtQixDQUN2QyxFQUFFLEVBQ0YsYUFBYSxFQUNiLFVBQVUsRUFDVixXQUFXLEVBQ1gsV0FBVyxFQUNYLGFBQWEsRUFDYixrQkFBa0IsQ0FDbkIsQ0FBQTtJQUVELHlEQUF5RDtJQUN6RCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUMzQyxpQkFBaUIsRUFDakIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQ2IsQ0FBQTtJQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQTtJQUM1QixrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRTtRQUMzQyxHQUFHLEVBQUUsYUFBYTtRQUNsQixLQUFLLEVBQUUsU0FBUztRQUNoQixFQUFFLEVBQUUsRUFBRSxDQUFDLFlBQVk7UUFDbkIsUUFBUSxFQUFFLEtBQUs7S0FDaEIsQ0FBQyxDQUFBO0lBRUYscUJBQXFCO0lBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQ1QsTUFBTSxhQUFhLHdCQUF3QixFQUFFLENBQUMsWUFBWSxlQUFlLENBQzFFLENBQUE7SUFFRCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQiwrQkFBK0IsVUFBVSxDQUFDLFNBQVMsUUFBUSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQzdFLENBQUE7SUFFRCxNQUFNLGdCQUFnQixHQUFxQjtRQUN6QyxTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVM7UUFDL0IsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1FBQ3ZCLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsa0JBQWtCO1FBQ3pELFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0I7UUFDcEUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZO1FBQzdCLGVBQWUsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWU7UUFDbkQsYUFBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRO1FBQzFCLFlBQVksRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFlBQVk7UUFDN0MsYUFBYSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsYUFBYTtLQUNoRCxDQUFBO0lBRUQsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtBQUMvRCxDQUFDLENBQUMsQ0FBQTtBQVNKOzs7R0FHRztBQUNILE1BQU0sYUFBYSxHQUFHLENBQ3BCLE9BS0MsRUFDRCxLQUFrQixFQUtsQixFQUFFLENBQ0YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDbEIsTUFBTSxJQUFJLEdBQUc7UUFDWCxLQUFLO1FBQ0wsT0FBTztRQUNQLG9CQUFvQjtRQUNwQixXQUFXO1FBQ1gsaUJBQWlCO0tBQ2xCLENBQUE7SUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUM5QixDQUFDO1NBQU0sSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNwQixDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3pDLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBMkI7UUFDbEMsR0FBRyxPQUFPLENBQUMsR0FBRztRQUNkLFFBQVEsRUFBRSxNQUFNO0tBQ1MsQ0FBQTtJQUUzQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNuQixHQUFHLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUE7UUFDL0IsR0FBRyxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUE7SUFDekMsQ0FBQztJQUVELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRXpELE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUN2RCxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUN4QixlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUNoQyxlQUFlLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUNqQyxDQUFBO0lBRUQsNkRBQTZEO0lBQzdELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUU1RSwwQ0FBMEM7SUFDMUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBaUIsQ0FBQTtJQUV0RCw0Q0FBNEM7SUFDNUMsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFBO0lBQ3ZCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQTtJQUN4QixNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUE7SUFFMUMsd0NBQXdDO0lBQ3hDLE1BQU0scUJBQXFCLEdBQUcsMEJBQTBCLENBQUE7SUFDeEQsTUFBTSxrQkFBa0IsR0FBRyx5Q0FBeUMsQ0FBQTtJQUNwRSxNQUFNLGdCQUFnQixHQUFHLGtDQUFrQyxDQUFBO0lBQzNELE1BQU0sWUFBWSxHQUFHLGlDQUFpQyxDQUFBO0lBQ3RELE1BQU0sZ0JBQWdCLEdBQUcsK0JBQStCLENBQUE7SUFFeEQsNERBQTREO0lBQzVELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUM5RCxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQ25CLE1BQU0sQ0FBQyxVQUFVLENBQ2xCLENBQUE7SUFFRCx1Q0FBdUM7SUFDdkMsS0FBSyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDdEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ3pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ2xCLGdDQUFnQztRQUNoQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUV2Qyw0QkFBNEI7UUFDNUIsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ2hELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3RDLElBQUksU0FBUyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xELGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtnQkFDL0IsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7b0JBQ3pCLElBQUksRUFBRSxpQkFBaUI7b0JBQ3ZCLFNBQVM7aUJBQ1YsQ0FBQyxDQUFBO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLFdBQVcsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNsRCxXQUFXLEdBQUcsSUFBSSxDQUFBO1lBQ2xCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbkIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1lBQzdDLENBQUM7UUFDSCxDQUFDO1FBRUQscUNBQXFDO1FBQ3JDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzVCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDN0QsQ0FBQztRQUVELG1FQUFtRTtRQUNuRSxJQUFJLFdBQVcsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwRCxXQUFXLEdBQUcsS0FBSyxDQUFBO1lBQ25CLGFBQWEsR0FBRyxLQUFLLENBQUE7WUFDckIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1lBQzlDLHVEQUF1RDtZQUN2RCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQy9CLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQTtRQUN4RCxDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDaEMsV0FBVyxHQUFHLEtBQUssQ0FBQTtRQUNyQixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQ0g7SUFDRCw0Q0FBNEM7SUFDNUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3hCLE1BQU0sQ0FBQyxRQUFRLENBQUMsMEJBQTBCLEtBQUssRUFBRSxDQUFDLENBQ25ELEVBQ0QsTUFBTSxDQUFDLFFBQVEsQ0FDYixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDaEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ3RCLElBQUksS0FBSyxDQUFDO1FBQ1IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsb0NBQW9DLElBQUksRUFBRSxDQUFDO1FBQzdELENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxJQUFJLEVBQUUsQ0FBQyxDQUNoRSxFQUNELE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUNuQyxDQUNGLEVBQ0QsTUFBTSxDQUFDLElBQUksQ0FDWixDQUFBO0lBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUE7QUFDbEMsQ0FBQyxDQUFDLENBQUE7QUFFSjs7R0FFRztBQUNILE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUNoRCxPQUFPLENBQUMsUUFBUSxFQUNoQixPQUFPLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLENBQzlDLENBQUE7QUFFRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FDOUMsT0FBTyxDQUFDLFFBQVEsRUFDaEIsT0FBTyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FDdEMsQ0FBQTtBQUVELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUNwRCxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxFQUNoQyxPQUFPLENBQUMsZUFBZSxDQUFDLHlCQUF5QixDQUFDLENBQ25ELENBQUE7QUFFRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FDOUMsT0FBTyxDQUFDLFFBQVEsRUFDaEIsT0FBTyxDQUFDLGVBQWUsQ0FDckIsdURBQXVELENBQ3hELENBQ0YsQ0FBQTtBQUVELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUNqRCxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUMxQixPQUFPLENBQUMsZUFBZSxDQUFDLDJDQUEyQyxDQUFDLENBQ3JFLENBQUE7QUFFRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDL0MsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFDMUIsT0FBTyxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUNoRCxDQUFBO0FBRUQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FDNUQsT0FBTyxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxFQUM1QyxPQUFPLENBQUMsZUFBZSxDQUNyQixpRUFBaUUsQ0FDbEUsQ0FDRixDQUFBO0FBRUQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FDNUQsT0FBTyxDQUFDLFFBQVEsRUFDaEIsT0FBTyxDQUFDLGVBQWUsQ0FDckIsc0dBQXNHLENBQ3ZHLENBQ0YsQ0FBQTtBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQ3RDLE9BQU8sRUFDUDtJQUNFLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLFNBQVMsRUFBRSxlQUFlO0lBQzFCLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLEdBQUcsRUFBRSxlQUFlO0lBQ3BCLEtBQUssRUFBRSxXQUFXO0lBQ2xCLFdBQVcsRUFBRSxpQkFBaUI7SUFDOUIsV0FBVyxFQUFFLGlCQUFpQjtDQUMvQixFQUNELENBQUMsRUFDQyxPQUFPLEVBQ1AsTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLEVBQ04sR0FBRyxFQUNILEtBQUssRUFDTCxXQUFXLEVBQ1gsV0FBVyxHQUNaLEVBQUUsRUFBRTtJQUNILE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQTtJQUN2RCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsOENBQThDLENBQUMsQ0FBQTtRQUVyRSxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBQ3hFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7UUFDckUsTUFBTSxnQkFBZ0IsR0FDcEIsTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNO1lBQ3BCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5QyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBRWYsZ0ZBQWdGO1FBQ2hGLGtFQUFrRTtRQUNsRSxNQUFNLG9CQUFvQixHQUN4QixXQUFXLENBQUMsSUFBSSxLQUFLLE1BQU07WUFDekIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLO1lBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUEsQ0FBQyxxQkFBcUI7UUFFakUsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUE7UUFDeEMsQ0FBQztRQUNELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFBO1FBQ3RDLENBQUM7UUFFRCxzQ0FBc0M7UUFDdEMsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDO1lBQ3JCLFNBQVM7WUFDVCxHQUFHLENBQUMsWUFBWSxLQUFLLFNBQVMsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsQ0FBQztZQUM1RCxHQUFHLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQztTQUMxRCxDQUFDLENBQUE7UUFFRixrRkFBa0Y7UUFDbEYsOERBQThEO1FBQzlELE1BQU0sV0FBVyxHQUFHLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixJQUFLLEVBQWUsRUFBRSxDQUFBO1FBRXBFLDhFQUE4RTtRQUM5RSx3RUFBd0U7UUFDeEUsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO1FBRXZDLDhDQUE4QztRQUM5QyxpRkFBaUY7UUFDakYsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBRTNDLE1BQU0sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FDbkQsS0FBSyxDQUFDLENBQUMsYUFBYSxDQUNsQjtZQUNFLE9BQU8sRUFBRSxZQUFZO1lBQ3JCLE1BQU0sRUFBRSxXQUFXO1lBQ25CLE1BQU0sRUFBRSxnQkFBZ0I7WUFDeEIsR0FBRztTQUNKLEVBQ0QsV0FBVyxDQUNaLENBQUE7UUFFSCxtREFBbUQ7UUFDbkQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FDaEMsSUFBSSxHQUFHLEVBQUUsQ0FDVixDQUFBO1FBRUQsaURBQWlEO1FBQ2pELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQTRCLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUVyRSxpRUFBaUU7UUFDakUsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUV6QyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFFWixtREFBbUQ7UUFDbkQsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFBO1FBRWhELGtEQUFrRDtRQUNsRCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQVMsQ0FBQyxDQUFDLENBQUE7UUFDcEQsc0ZBQXNGO1FBQ3RGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQTZCLENBQUE7UUFFL0Qsc0VBQXNFO1FBQ3RFLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUVqQyxJQUFJLGFBQWEsR0FBZ0QsSUFBSSxDQUFBO1FBRXJFLCtEQUErRDtRQUMvRCxNQUFNLFFBQVEsR0FBRyxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsQ0FBQTtRQUV2RSxnRUFBZ0U7UUFDaEUsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUM5QyxvREFBb0Q7WUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNoQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtDQUFrQyxDQUFDLENBQUE7WUFDM0QsQ0FBQztZQUVELDREQUE0RDtZQUM1RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ25CLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ3BCLCtDQUErQyxDQUNoRCxDQUFBO2dCQUNELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FDMUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUNwRSxDQUFBO2dCQUNELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ3BCLDBCQUEwQixTQUFTLENBQUMsWUFBWSxFQUFFLENBQ25ELENBQUE7Z0JBQ0QsYUFBYSxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzlDLENBQUM7WUFFRCw4REFBOEQ7WUFDOUQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFBO1lBQ2pFLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUU5RCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQ25CLHFJQUFxSSxDQUN0SSxDQUFBO2dCQUNELE9BQU07WUFDUixDQUFDO1lBRUQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUE7WUFFN0Qsb0NBQW9DO1lBQ3BDLE1BQU0sWUFBWSxHQUdiLEVBQUUsQ0FBQTtZQUVQLEtBQUssTUFBTSxFQUFFLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtnQkFDOUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtnQkFFdEQsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUMzQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQixvQkFBb0IsRUFBRSxDQUFDLFlBQVksdUNBQXVDLENBQzNFLENBQUE7b0JBQ0QsU0FBUTtnQkFDVixDQUFDO2dCQUVELElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUMzQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQiw0QkFBNEIsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUM5QyxDQUFBO29CQUNELFNBQVE7Z0JBQ1YsQ0FBQztnQkFFRCxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUE7WUFDckMsQ0FBQztZQUVELHdDQUF3QztZQUN4QyxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sT0FBTyxHQUFHLFlBQVk7cUJBQ3pCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7b0JBQ3hCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7b0JBQ3pDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQzt3QkFDN0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxZQUFZO3dCQUNoRSxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQTtvQkFDbkIsT0FBTyxHQUFHLFNBQVMsS0FBSyxJQUFJLEdBQUcsQ0FBQTtnQkFDakMsQ0FBQyxDQUFDO3FCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDYiwwREFBMEQ7Z0JBQzFELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxpQkFBaUI7b0JBQ3ZDLENBQUMsQ0FBQywwQkFBMEI7b0JBQzVCLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQTtnQkFDeEIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFBO1lBQy9DLENBQUM7WUFFRCw4Q0FBOEM7WUFDOUMsS0FBSyxNQUFNLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUM1QyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQix1QkFBdUIsRUFBRSxDQUFDLFlBQVksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQzlFLENBQUE7Z0JBRUQsd0JBQXdCO2dCQUN4QixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQTtnQkFFMUMsNkNBQTZDO2dCQUM3QyxNQUFNLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUE7Z0JBQ3RFLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ3BCLDBDQUEwQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQzVELENBQUE7Z0JBRUQseUVBQXlFO2dCQUN6RSw0REFBNEQ7Z0JBQzVELElBQUksUUFBUSxFQUFFLENBQUM7b0JBQ2IsS0FBSyxDQUFDLENBQUMsYUFBYzt5QkFDbEIsc0JBQXNCLENBQUMsaUJBQWlCLENBQUM7eUJBQ3pDLElBQUksQ0FDSCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDL0Isc0JBQXNCLENBQ3BCLEVBQUUsRUFDRixVQUFVLEVBQ1YsVUFBVSxFQUNWLFdBQVcsRUFDWCxXQUFXLEVBQ1gsV0FBVyxFQUNYLG9CQUFvQixFQUNwQixhQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLGtCQUFrQixDQUNuQixDQUFDLElBQUksQ0FDSixNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDeEIsTUFBTSxDQUFDLFFBQVEsQ0FDYixvQ0FBb0MsS0FBSyxFQUFFLENBQzVDLENBQ0YsQ0FDRixDQUNGLEVBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FDbEIsQ0FBQTtnQkFDTCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sS0FBSyxDQUFDLENBQUMsYUFBYzt5QkFDbEIsc0JBQXNCLENBQUMsaUJBQWlCLENBQUM7eUJBQ3pDLElBQUksQ0FDSCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDL0Isc0JBQXNCLENBQ3BCLEVBQUUsRUFDRixVQUFVLEVBQ1YsT0FBTyxFQUNQLFdBQVcsRUFDWCxXQUFXLEVBQ1gsYUFBYyxFQUNkLGlCQUFpQixFQUNqQixrQkFBa0IsQ0FDbkIsQ0FBQyxJQUFJLENBQ0osTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3hCLE1BQU0sQ0FBQyxRQUFRLENBQ2IscUNBQXFDLEtBQUssRUFBRSxDQUM3QyxDQUNGLENBQ0YsQ0FDRixFQUNELE1BQU0sQ0FBQyxVQUFVLENBQ2xCLENBQUE7Z0JBQ0wsQ0FBQztZQUNILENBQUM7WUFFRCxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLGlCQUFpQixDQUFDLENBQUE7WUFFdEQsK0NBQStDO1lBQy9DLE1BQU0sa0JBQWtCLEdBQTRCLEVBQUUsQ0FBQTtZQUN0RCxLQUFLLE1BQU0sRUFBRSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUMzQixJQUNFLEVBQUUsQ0FBQyxpQkFBaUI7b0JBQ3BCLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFDNUMsQ0FBQztvQkFDRCwyQkFBMkI7b0JBQzNCLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO3dCQUN0RCxDQUFDLENBQUMsRUFBRSxDQUFDLGlCQUFpQjt3QkFDdEIsQ0FBQyxDQUFDLEdBQUcsV0FBVyxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO29CQUU1QyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7d0JBQ3RCLFVBQVUsRUFBRSxFQUFFLENBQUMsWUFBWTt3QkFDM0IsaUJBQWlCLEVBQUUsV0FBVztxQkFDL0IsQ0FBQyxDQUFBO29CQUNGLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUE7Z0JBQzdDLENBQUM7WUFDSCxDQUFDO1lBRUQscUNBQXFDO1lBQ3JDLElBQUksa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQixzQ0FBc0Msa0JBQWtCLENBQUMsTUFBTSx3QkFBd0IsQ0FDeEYsQ0FBQTtnQkFFRCwwRUFBMEU7Z0JBQzFFLEtBQUssQ0FBQyxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FDdEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO29CQUNsQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQiwyQkFBMkIsS0FBSyxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQ2pFLENBQUE7b0JBQ0QsS0FBSyxDQUFDLENBQUMsc0JBQXNCLENBQzNCLEtBQUssQ0FBQyxVQUFVLEVBQ2hCLFVBQVUsRUFDVixXQUFXLENBQ1osQ0FBQyxJQUFJLENBQ0osTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3hCLE1BQU0sQ0FBQyxRQUFRLENBQ2IsOEJBQThCLEtBQUssQ0FBQyxVQUFVLEtBQUssS0FBSyxFQUFFLENBQzNELENBQ0YsQ0FDRixDQUFBO2dCQUNILENBQUMsQ0FBQyxDQUNILEVBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FDbEIsQ0FBQTtZQUNILENBQUM7WUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ2hDLFFBQVEsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUE7Z0JBQ2pDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsK0JBQStCLENBQUMsQ0FBQTtZQUN4RCxDQUFDO1lBRUQsNENBQTRDO1lBQzVDLFFBQVEsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUE7UUFDbkMsQ0FBQyxDQUFDLENBQUE7UUFFRixrRUFBa0U7UUFDbEUsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQy9CLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUN2QixNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUNsQixRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbkIsS0FBSyxpQkFBaUI7b0JBQ3BCLHlEQUF5RDtvQkFDekQsSUFDRSxDQUFDLGdCQUFnQjt3QkFDakIsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQzdDLENBQUM7d0JBQ0QsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO3dCQUN4QyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNwQiw2QkFBNkIsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUMvQyxDQUFBO29CQUNILENBQUM7b0JBQ0QsTUFBSztnQkFDUCxLQUFLLGdCQUFnQjtvQkFDbkIseUNBQXlDO29CQUN6QyxLQUFLLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQzdCLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUN4QixNQUFNLENBQUMsUUFBUSxDQUFDLDRCQUE0QixLQUFLLEVBQUUsQ0FBQyxDQUNyRCxDQUNGLENBQUE7b0JBQ0QsTUFBSztZQUNULENBQUM7UUFDSCxDQUFDLENBQUMsQ0FDSCxFQUNELE1BQU0sQ0FBQyxPQUFPLEVBQ2QsTUFBTSxDQUFDLElBQUksQ0FDWixDQUFBO1FBRUQseUJBQXlCO1FBQ3pCLE1BQU0sT0FBTyxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQ3pCLE1BQU0sTUFBTSxDQUFDLFVBQVUsQ0FDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7Z0JBQ2xCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtnQkFFM0MsaUJBQWlCO2dCQUNqQixLQUFLLENBQUMsQ0FBQyxlQUFlO3FCQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDO3FCQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO2dCQUUzQyxzREFBc0Q7Z0JBQ3RELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQTtnQkFDNUIsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO2dCQUNwRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksaUJBQWlCLEVBQUUsQ0FBQztvQkFDbEQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsSUFBSSxFQUFFLENBQUMsQ0FBQTtvQkFDcEQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUM5QyxNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUNuQyxDQUFBO2dCQUNILENBQUM7Z0JBRUQsMkJBQTJCO2dCQUMzQixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUM5QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksY0FBYyxFQUFFLENBQUM7b0JBQzVDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLElBQUksRUFBRSxDQUFDLENBQUE7b0JBQ2pELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQ3JCLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUNyQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO2dCQUM1QyxDQUFDO2dCQUVELHlEQUF5RDtnQkFDekQsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQzVDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTCxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUMxQixNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFDaEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQzdCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUNqRCxDQUNGLENBQUE7WUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2pCLENBQUMsQ0FBQTtRQUVELE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzdCLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBRTlCLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQTtRQUVyRCwyQkFBMkI7UUFDM0IsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQTtJQUNyQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ0wsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQzdCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUNqRCxDQUFBO0FBQ0gsQ0FBQyxDQUNGLENBQUMsSUFBSSxDQUNKLE9BQU8sQ0FBQyxlQUFlLENBQ3JCLHFFQUFxRSxDQUN0RSxDQUNGLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExvY2FsIGNvbW1hbmQgZm9yIHJ1bm5pbmcgTGFtYmRhIGZ1bmN0aW9ucyBsb2NhbGx5IHVzaW5nIERvY2tlci5cbiAqXG4gKiBUaGlzIGNvbW1hbmQ6XG4gKiAxLiBTdGFydHMgQ0RLIHdhdGNoIHdpdGggQ0RLX0xJVkU9dHJ1ZSBhbmQgaG90c3dhcFxuICogMi4gRGlzY292ZXJzIExhbWJkYSBmdW5jdGlvbnMgd2l0aCBsaXZlLWxhbWJkYTpoYW5kbGVyIHRhZ1xuICogMy4gQ29ubmVjdHMgdG8gQXBwU3luYyBFdmVudHNcbiAqIDQuIFN1YnNjcmliZXMgdG8gaW52b2NhdGlvbiBjaGFubmVsc1xuICogNS4gRm9yIGVhY2ggZnVuY3Rpb24sIG1haW50YWlucyBPTkUgRG9ja2VyIGNvbnRhaW5lciB0aGF0IGhhbmRsZXMgYWxsIGludm9jYXRpb25zXG4gKiA2LiBTZW5kcyByZXNwb25zZXMgYmFjayB2aWEgQXBwU3luY1xuICogNy4gUmUtZGlzY292ZXJzIGZ1bmN0aW9ucyBhZnRlciBlYWNoIENESyBkZXBsb3lcbiAqL1xuXG5pbXBvcnQgeyB0eXBlIENoaWxkUHJvY2Vzcywgc3Bhd24gfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCJcbmltcG9ydCB7XG4gIExhbWJkYUNsaWVudCxcbiAgTGlzdEZ1bmN0aW9uc0NvbW1hbmQsXG4gIExpc3RUYWdzQ29tbWFuZCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1sYW1iZGFcIlxuaW1wb3J0IHsgR2V0UGFyYW1ldGVyQ29tbWFuZCwgU1NNQ2xpZW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zc21cIlxuaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9ucyB9IGZyb20gXCJAZWZmZWN0L2NsaVwiXG5pbXBvcnQge1xuICB0eXBlIENvbW1hbmRFeGVjdXRvcixcbiAgQ29tbWFuZCBhcyBQbGF0Zm9ybUNvbW1hbmQsXG59IGZyb20gXCJAZWZmZWN0L3BsYXRmb3JtXCJcbmltcG9ydCB0eXBlIHsgUHJvY2VzcyBhcyBFZmZlY3RQcm9jZXNzIH0gZnJvbSBcIkBlZmZlY3QvcGxhdGZvcm0vQ29tbWFuZEV4ZWN1dG9yXCJcbmltcG9ydCB7IEJ1bkNvbnRleHQgfSBmcm9tIFwiQGVmZmVjdC9wbGF0Zm9ybS1idW5cIlxuaW1wb3J0IHtcbiAgRHVyYXRpb24sXG4gIEVmZmVjdCxcbiAgRXhpdCxcbiAgRmliZXIsXG4gIExvZ2dlcixcbiAgTG9nTGV2ZWwsXG4gIFF1ZXVlLFxuICBSZWYsXG4gIFNjaGVkdWxlLFxuICBTY29wZSxcbiAgU3RyZWFtLFxufSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB7XG4gIEJPT1RTVFJBUF9TVEFDS19OQU1FLFxuICBCT09UU1RSQVBfVkVSU0lPTixcbiAgYnVpbGRDaGFubmVsTmFtZSxcbiAgdHlwZSBJbnZvY2F0aW9uTWVzc2FnZSxcbiAgTElWRV9MQU1CREFfRE9DS0VSX1RBRyxcbiAgTElWRV9MQU1CREFfVEFHLFxuICB0eXBlIFJlc3BvbnNlTWVzc2FnZSxcbiAgU1NNX0JBU0VfUEFUSCxcbn0gZnJvbSBcIi4uLy4uL3NoYXJlZC90eXBlcy5qc1wiXG5pbXBvcnQgeyBtYWtlQXBwU3luY0NsaWVudCB9IGZyb20gXCIuLi9hcHBzeW5jL2NsaWVudC5qc1wiXG5pbXBvcnQge1xuICBidWlsZEV4dGVuc2lvbldyYXBwZXJDb21tYW5kLFxuICBEb2NrZXIsXG4gIERvY2tlckxpdmUsXG4gIG1ha2VMYW1iZGFDb250YWluZXJDb25maWcsXG59IGZyb20gXCIuLi9kb2NrZXIvY29udGFpbmVyLmpzXCJcbmltcG9ydCB7XG4gIHR5cGUgV2F0Y2hlZERvY2tlckZ1bmN0aW9uLFxuICB3YXRjaERvY2tlckNvbnRleHRzLFxufSBmcm9tIFwiLi4vZG9ja2VyL3dhdGNoZXIuanNcIlxuaW1wb3J0IHtcbiAgbm90aWZ5RXh0ZW5zaW9uc0ludm9rZSxcbiAgcXVldWVJbnZvY2F0aW9uLFxuICB0eXBlIFJ1bnRpbWVBcGlTdGF0ZSxcbiAgc3RhcnRSdW50aW1lQXBpU2VydmVyLFxuICB3YWl0Rm9yUmVzcG9uc2UsXG59IGZyb20gXCIuLi9ydW50aW1lLWFwaS9zZXJ2ZXIuanNcIlxuaW1wb3J0IHR5cGUge1xuICBMYW1iZGFFcnJvcixcbiAgTGFtYmRhSW5pdEVycm9yLFxuICBMYW1iZGFJbnZvY2F0aW9uLFxuICBMYW1iZGFSZXNwb25zZSxcbn0gZnJvbSBcIi4uL3J1bnRpbWUtYXBpL3R5cGVzLmpzXCJcblxuLyoqXG4gKiBEaXNjb3ZlcmVkIExhbWJkYSBmdW5jdGlvbiBpbmZvLlxuICovXG5pbnRlcmZhY2UgRGlzY292ZXJlZEZ1bmN0aW9uIHtcbiAgZnVuY3Rpb25OYW1lOiBzdHJpbmdcbiAgZnVuY3Rpb25Bcm46IHN0cmluZ1xuICBsb2NhbEhhbmRsZXI6IHN0cmluZ1xuICAvKiogTG9jYWwgRG9ja2VyIGNvbnRleHQgcGF0aCBmb3IgRG9ja2VySW1hZ2VGdW5jdGlvbiAqL1xuICBkb2NrZXJDb250ZXh0UGF0aD86IHN0cmluZ1xuICBtZW1vcnlNQjogbnVtYmVyXG4gIGFyY2hpdGVjdHVyZT86IFwiYXJtNjRcIiB8IFwieDg2XzY0XCJcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGlkbGUgdGltZW91dCBiZWZvcmUgcHJvYWN0aXZlbHkgc3RvcHBpbmcgY29udGFpbmVycy5cbiAqIFNldCBzbGlnaHRseSBiZWxvdyB0aGUgcG9sbCB0aW1lb3V0ICgyNDBzKSB0byBzdG9wIGNvbnRhaW5lciBiZWZvcmVcbiAqIHRoZSBMYW1iZGEgUklDIGdldHMgYSA1MDMgZXJyb3IuXG4gKi9cbmNvbnN0IERFRkFVTFRfSURMRV9USU1FT1VUX01TID0gMjMwXzAwMCAvLyAyMzAgc2Vjb25kcyAofjQgbWludXRlcylcblxuLyoqXG4gKiBTdGF0ZSBmb3IgYSBydW5uaW5nIGZ1bmN0aW9uIGNvbnRhaW5lci5cbiAqL1xuaW50ZXJmYWNlIEZ1bmN0aW9uQ29udGFpbmVyIHtcbiAgZm46IERpc2NvdmVyZWRGdW5jdGlvblxuICBydW50aW1lU3RhdGU6IFJ1bnRpbWVBcGlTdGF0ZVxuICAvKiogVGhlIHBvcnQgdGhlIFJ1bnRpbWUgQVBJIHNlcnZlciBpcyBsaXN0ZW5pbmcgb24gKi9cbiAgcG9ydDogbnVtYmVyXG4gIGNvbnRhaW5lckZpYmVyOiBGaWJlci5SdW50aW1lRmliZXI8dm9pZCwgRXJyb3I+XG4gIGNvbnRhaW5lck5hbWU6IHN0cmluZ1xuICAvKiogRG9ja2VyIGltYWdlIG5hbWUgZm9yIHJlYnVpbGRzICovXG4gIGltYWdlTmFtZTogc3RyaW5nXG4gIC8qKiBXaGV0aGVyIHRoZSBjb250YWluZXIgaXMgY3VycmVudGx5IGJlaW5nIHJlYnVpbHQgKGludm9jYXRpb25zIHdpbGwgcXVldWUpICovXG4gIGlzUmVidWlsZGluZzogYm9vbGVhblxuICAvKiogTWFwIG9mIHJlcXVlc3RJZCAtPiByZXNwb25zZSByZXNvbHZlciAqL1xuICBwZW5kaW5nUmVzcG9uc2VzOiBNYXA8XG4gICAgc3RyaW5nLFxuICAgIHtcbiAgICAgIHJlc29sdmU6IChyZXNwb25zZTogUmVzcG9uc2VNZXNzYWdlKSA9PiB2b2lkXG4gICAgfVxuICA+XG4gIC8qKiBGaWJlciBmb3IgdGhlIGlkbGUgc2h1dGRvd24gdGltZXIsIGNhbmNlbGxlZCB3aGVuIG5ldyByZXNwb25zZXMgYXJyaXZlICovXG4gIGlkbGVUaW1lckZpYmVyOiBGaWJlci5SdW50aW1lRmliZXI8dm9pZCwgbmV2ZXI+IHwgbnVsbFxuICAvKiogRW52aXJvbm1lbnQgdmFyaWFibGVzIGNhcHR1cmVkIGZyb20gZmlyc3QgaW52b2NhdGlvbiAqL1xuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn1cblxuLyoqXG4gKiBTdGF0ZSBmb3IgYSBydW5uaW5nIE5vZGUuanMgd29ya2VyIHByb2Nlc3MuXG4gKi9cbmludGVyZmFjZSBOb2RlanNXb3JrZXIge1xuICBmbjogRGlzY292ZXJlZEZ1bmN0aW9uXG4gIHJ1bnRpbWVTdGF0ZTogUnVudGltZUFwaVN0YXRlXG4gIC8qKiBUaGUgcG9ydCB0aGUgUnVudGltZSBBUEkgc2VydmVyIGlzIGxpc3RlbmluZyBvbiAqL1xuICBwb3J0OiBudW1iZXJcbiAgLyoqIFRoZSBzcGF3bmVkIEJ1biBwcm9jZXNzICovXG4gIHdvcmtlclByb2Nlc3M6IENoaWxkUHJvY2Vzc1xuICAvKiogRW52aXJvbm1lbnQgdmFyaWFibGVzIGNhcHR1cmVkIGZyb20gZmlyc3QgaW52b2NhdGlvbiAqL1xuICBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn1cblxuLyoqXG4gKiBJbnZvY2F0aW9uIGNvbnRleHQgZm9yIHRyYWNraW5nIGFuZCBsb2dnaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludm9jYXRpb25Db250ZXh0IHtcbiAgLyoqIFNlcXVlbnRpYWwgaW52b2NhdGlvbiBudW1iZXIgKi9cbiAgbnVtOiBudW1iZXJcbiAgLyoqIFN0YXJ0IHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMgKi9cbiAgc3RhcnQ6IG51bWJlclxuICAvKiogRnVuY3Rpb24gbmFtZSAqL1xuICBmbjogc3RyaW5nXG4gIC8qKiBXaGV0aGVyIHRoaXMgaXMgYSBEb2NrZXIgY29udGFpbmVyIGludm9jYXRpb24gKi9cbiAgaXNEb2NrZXI6IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBib290c3RyYXAgc3RhY2sgdmVyc2lvbiBtYXRjaGVzIHRoZSBleHBlY3RlZCB2ZXJzaW9uLlxuICogUmV0dXJucyB0cnVlIGlmIHZlcnNpb24gbWF0Y2hlcywgZmFsc2UgaWYgbWlzc2luZyBvciBtaXNtYXRjaGVkLlxuICovXG5jb25zdCBjaGVja0Jvb3RzdHJhcFZlcnNpb24gPSAocXVhbGlmaWVyOiBzdHJpbmcpID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBzc21DbGllbnQgPSBuZXcgU1NNQ2xpZW50KHt9KVxuICAgIGNvbnN0IGJhc2VQYXRoID0gYCR7U1NNX0JBU0VfUEFUSH0vJHtxdWFsaWZpZXJ9YFxuXG4gICAgY29uc3QgcmVzdWx0ID0geWllbGQqIEVmZmVjdC50cnlQcm9taXNlKHtcbiAgICAgIHRyeTogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNzbUNsaWVudC5zZW5kKFxuICAgICAgICAgIG5ldyBHZXRQYXJhbWV0ZXJDb21tYW5kKHsgTmFtZTogYCR7YmFzZVBhdGh9L3ZlcnNpb25gIH0pLFxuICAgICAgICApXG4gICAgICAgIHJldHVybiByZXNwb25zZS5QYXJhbWV0ZXI/LlZhbHVlXG4gICAgICB9LFxuICAgICAgY2F0Y2g6ICgpID0+IG51bGwsXG4gICAgfSkucGlwZShFZmZlY3QuY2F0Y2hBbGwoKCkgPT4gRWZmZWN0LnN1Y2NlZWQobnVsbCkpKVxuXG4gICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgeWllbGQqIEVmZmVjdC5sb2dJbmZvKFwiQm9vdHN0cmFwIHN0YWNrIHZlcnNpb24gcGFyYW1ldGVyIG5vdCBmb3VuZFwiKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCAhPT0gQk9PVFNUUkFQX1ZFUlNJT04pIHtcbiAgICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcbiAgICAgICAgYEJvb3RzdHJhcCBzdGFjayB2ZXJzaW9uIG1pc21hdGNoOiBmb3VuZCAke3Jlc3VsdH0sIGV4cGVjdGVkICR7Qk9PVFNUUkFQX1ZFUlNJT059YCxcbiAgICAgIClcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH0pXG5cbi8qKlxuICogUnVuIHRoZSBib290c3RyYXAgc3RhY2sgZGVwbG95bWVudC5cbiAqL1xuY29uc3QgcnVuQm9vdHN0cmFwID0gKG9wdGlvbnM6IHtcbiAgcHJvZmlsZT86IHN0cmluZyB8IHVuZGVmaW5lZFxuICByZWdpb24/OiBzdHJpbmcgfCB1bmRlZmluZWRcbn0pID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oXCJSdW5uaW5nIGJvb3RzdHJhcCBzdGFjayBkZXBsb3ltZW50Li4uXCIpXG5cbiAgICAvLyBSZXNvbHZlIHRoZSBDREsgYXBwIHBhdGggcmVsYXRpdmUgdG8gdGhpcyBtb2R1bGVcbiAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpXG4gICAgY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpXG4gICAgY29uc3QgY2RrQXBwUGF0aCA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsIFwiLi5cIiwgXCJjZGstYXBwLmpzXCIpXG5cbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgXCJjZGtcIixcbiAgICAgIFwiZGVwbG95XCIsXG4gICAgICBCT09UU1RSQVBfU1RBQ0tfTkFNRSxcbiAgICAgIFwiLS1yZXF1aXJlLWFwcHJvdmFsXCIsXG4gICAgICBcIm5ldmVyXCIsXG4gICAgICBcIi0tYXBwXCIsXG4gICAgICBgYnVuICR7Y2RrQXBwUGF0aH1gLFxuICAgIF1cblxuICAgIGlmIChvcHRpb25zLnByb2ZpbGUpIHtcbiAgICAgIGFyZ3MucHVzaChcIi0tcHJvZmlsZVwiLCBvcHRpb25zLnByb2ZpbGUpXG4gICAgfVxuXG4gICAgY29uc3QgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgfSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgaWYgKG9wdGlvbnMucmVnaW9uKSB7XG4gICAgICBlbnYuQVdTX1JFR0lPTiA9IG9wdGlvbnMucmVnaW9uXG4gICAgICBlbnYuQ0RLX0RFRkFVTFRfUkVHSU9OID0gb3B0aW9ucy5yZWdpb25cbiAgICB9XG5cbiAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oYFJ1bm5pbmc6IG5weCAke2FyZ3Muam9pbihcIiBcIil9YClcblxuICAgIGNvbnN0IGNvbW1hbmQgPSBQbGF0Zm9ybUNvbW1hbmQubWFrZShcIm5weFwiLCAuLi5hcmdzKS5waXBlKFxuICAgICAgUGxhdGZvcm1Db21tYW5kLmVudihlbnYpLFxuICAgICAgUGxhdGZvcm1Db21tYW5kLnN0ZGluKFwiaW5oZXJpdFwiKSxcbiAgICApXG5cbiAgICBjb25zdCBwcm9jID0geWllbGQqIFBsYXRmb3JtQ29tbWFuZC5zdGFydChjb21tYW5kKVxuXG4gICAgLy8gU3RyZWFtIG91dHB1dCB0byBjb25zb2xlXG4gICAgeWllbGQqIFN0cmVhbS5tZXJnZShwcm9jLnN0ZG91dCwgcHJvYy5zdGRlcnIpLnBpcGUoXG4gICAgICBTdHJlYW0uZGVjb2RlVGV4dCgpLFxuICAgICAgU3RyZWFtLnNwbGl0TGluZXMsXG4gICAgICBTdHJlYW0ucnVuRm9yRWFjaCgobGluZSkgPT5cbiAgICAgICAgRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGAke2xpbmV9XFxuYClcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgIClcblxuICAgIGNvbnN0IGV4aXRDb2RlID0geWllbGQqIHByb2MuZXhpdENvZGVcbiAgICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmZhaWwoXG4gICAgICAgIG5ldyBFcnJvcihgQm9vdHN0cmFwIGRlcGxveW1lbnQgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7ZXhpdENvZGV9YCksXG4gICAgICApXG4gICAgfVxuXG4gICAgeWllbGQqIEVmZmVjdC5sb2dJbmZvKFwiQm9vdHN0cmFwIHN0YWNrIGRlcGxveWVkIHN1Y2Nlc3NmdWxseSFcIilcbiAgfSkucGlwZShFZmZlY3Quc2NvcGVkKVxuXG4vKipcbiAqIEVuc3VyZSBib290c3RyYXAgc3RhY2sgaXMgZGVwbG95ZWQgd2l0aCBjb3JyZWN0IHZlcnNpb24uXG4gKiBBdXRvbWF0aWNhbGx5IGRlcGxveXMgaWYgbWlzc2luZyBvciBvdXRkYXRlZC5cbiAqL1xuY29uc3QgZW5zdXJlQm9vdHN0cmFwID0gKG9wdGlvbnM6IHtcbiAgcXVhbGlmaWVyOiBzdHJpbmdcbiAgcHJvZmlsZT86IHN0cmluZyB8IHVuZGVmaW5lZFxuICByZWdpb24/OiBzdHJpbmcgfCB1bmRlZmluZWRcbn0pID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKFwiW0xvY2FsXSBDaGVja2luZyBib290c3RyYXAgc3RhY2sgdmVyc2lvbi4uLlwiKVxuXG4gICAgY29uc3QgdmVyc2lvbk9rID0geWllbGQqIGNoZWNrQm9vdHN0cmFwVmVyc2lvbihvcHRpb25zLnF1YWxpZmllcilcblxuICAgIGlmICghdmVyc2lvbk9rKSB7XG4gICAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oXG4gICAgICAgIFwiW0xvY2FsXSBCb290c3RyYXAgc3RhY2sgbmVlZHMgdG8gYmUgZGVwbG95ZWQgb3IgdXBkYXRlZC5cIixcbiAgICAgIClcbiAgICAgIHlpZWxkKiBydW5Cb290c3RyYXAoeyBwcm9maWxlOiBvcHRpb25zLnByb2ZpbGUsIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24gfSlcbiAgICB9IGVsc2Uge1xuICAgICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhcIltMb2NhbF0gQm9vdHN0cmFwIHN0YWNrIHZlcnNpb24gT0suXCIpXG4gICAgfVxuICB9KVxuXG4vKipcbiAqIFJlYWQgQXBwU3luYyBlbmRwb2ludHMgZnJvbSBTU00uXG4gKi9cbmNvbnN0IGdldEFwcFN5bmNFbmRwb2ludHMgPSAocXVhbGlmaWVyOiBzdHJpbmcpID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBzc21DbGllbnQgPSBuZXcgU1NNQ2xpZW50KHt9KVxuICAgIGNvbnN0IGJhc2VQYXRoID0gYCR7U1NNX0JBU0VfUEFUSH0vJHtxdWFsaWZpZXJ9YFxuXG4gICAgY29uc3QgZ2V0UGFyYW0gPSAobmFtZTogc3RyaW5nKSA9PlxuICAgICAgRWZmZWN0LnRyeVByb21pc2Uoe1xuICAgICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzc21DbGllbnQuc2VuZChcbiAgICAgICAgICAgIG5ldyBHZXRQYXJhbWV0ZXJDb21tYW5kKHsgTmFtZTogYCR7YmFzZVBhdGh9LyR7bmFtZX1gIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LlBhcmFtZXRlcj8uVmFsdWUgPz8gXCJcIlxuICAgICAgICB9LFxuICAgICAgICBjYXRjaDogKGVycm9yKSA9PlxuICAgICAgICAgIG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCBTU00gcGFyYW1ldGVyICR7bmFtZX06ICR7U3RyaW5nKGVycm9yKX1gKSxcbiAgICAgIH0pXG5cbiAgICBjb25zdCBodHRwRW5kcG9pbnQgPSB5aWVsZCogZ2V0UGFyYW0oXCJodHRwLWVuZHBvaW50XCIpXG4gICAgY29uc3QgcmVhbHRpbWVFbmRwb2ludCA9IHlpZWxkKiBnZXRQYXJhbShcInJlYWx0aW1lLWVuZHBvaW50XCIpXG5cbiAgICByZXR1cm4geyBodHRwRW5kcG9pbnQsIHJlYWx0aW1lRW5kcG9pbnQgfVxuICB9KVxuXG4vKipcbiAqIENsb3VkRm9ybWF0aW9uIHN0YWNrIG5hbWUgdGFnIChzZXQgYXV0b21hdGljYWxseSBieSBDREspXG4gKi9cbmNvbnN0IENGTl9TVEFDS19OQU1FX1RBRyA9IFwiYXdzOmNsb3VkZm9ybWF0aW9uOnN0YWNrLW5hbWVcIlxuXG4vKipcbiAqIERpc2NvdmVyIExhbWJkYSBmdW5jdGlvbnMgd2l0aCBsaXZlLWxhbWJkYSB0YWdzLlxuICogQHBhcmFtIHN0YWNrRmlsdGVyIC0gT3B0aW9uYWwgbGlzdCBvZiBzdGFjayBuYW1lcyB0byBmaWx0ZXIgYnlcbiAqL1xuY29uc3QgZGlzY292ZXJGdW5jdGlvbnMgPSAoc3RhY2tGaWx0ZXI/OiBzdHJpbmdbXSkgPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IGxhbWJkYUNsaWVudCA9IG5ldyBMYW1iZGFDbGllbnQoe30pXG4gICAgY29uc3QgZnVuY3Rpb25zOiBEaXNjb3ZlcmVkRnVuY3Rpb25bXSA9IFtdXG5cbiAgICAvLyBMaXN0IGFsbCBmdW5jdGlvbnNcbiAgICBsZXQgbmV4dE1hcmtlcjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgZG8ge1xuICAgICAgY29uc3QgbGlzdFJlc3BvbnNlID0geWllbGQqIEVmZmVjdC50cnlQcm9taXNlKHtcbiAgICAgICAgdHJ5OiAoKSA9PlxuICAgICAgICAgIGxhbWJkYUNsaWVudC5zZW5kKG5ldyBMaXN0RnVuY3Rpb25zQ29tbWFuZCh7IE1hcmtlcjogbmV4dE1hcmtlciB9KSksXG4gICAgICAgIGNhdGNoOiAoZXJyb3IpID0+XG4gICAgICAgICAgbmV3IEVycm9yKGBGYWlsZWQgdG8gbGlzdCBmdW5jdGlvbnM6ICR7U3RyaW5nKGVycm9yKX1gKSxcbiAgICAgIH0pXG5cbiAgICAgIGZvciAoY29uc3QgZm4gb2YgbGlzdFJlc3BvbnNlLkZ1bmN0aW9ucyA/PyBbXSkge1xuICAgICAgICAvLyBHZXQgdGFncyBmb3IgZWFjaCBmdW5jdGlvblxuICAgICAgICBjb25zdCB0YWdzUmVzdWx0ID0geWllbGQqIEVmZmVjdC50cnlQcm9taXNlKHtcbiAgICAgICAgICB0cnk6ICgpID0+XG4gICAgICAgICAgICBsYW1iZGFDbGllbnQuc2VuZChcbiAgICAgICAgICAgICAgbmV3IExpc3RUYWdzQ29tbWFuZCh7IFJlc291cmNlOiBmbi5GdW5jdGlvbkFybiB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgY2F0Y2g6ICgpID0+IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCB0YWdzIGZvciAke2ZuLkZ1bmN0aW9uTmFtZX1gKSxcbiAgICAgICAgfSkucGlwZShcbiAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGwoKCkgPT5cbiAgICAgICAgICAgIEVmZmVjdC5zdWNjZWVkKHsgVGFnczoge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KSxcbiAgICAgICAgICApLFxuICAgICAgICApXG5cbiAgICAgICAgY29uc3QgdGFncyA9IHRhZ3NSZXN1bHQuVGFncyA/PyB7fVxuXG4gICAgICAgIC8vIENoZWNrIGZvciBsaXZlLWxhbWJkYSB0YWcgKGhhbmRsZXIpIG9yIGRvY2tlci1jb250ZXh0IHRhZ1xuICAgICAgICBpZiAodGFnc1tMSVZFX0xBTUJEQV9UQUddIHx8IHRhZ3NbTElWRV9MQU1CREFfRE9DS0VSX1RBR10pIHtcbiAgICAgICAgICAvLyBGaWx0ZXIgYnkgc3RhY2sgbmFtZSBpZiBzcGVjaWZpZWRcbiAgICAgICAgICBpZiAoc3RhY2tGaWx0ZXIgJiYgc3RhY2tGaWx0ZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgc3RhY2tOYW1lID0gdGFnc1tDRk5fU1RBQ0tfTkFNRV9UQUddXG4gICAgICAgICAgICBpZiAoIXN0YWNrTmFtZSB8fCAhc3RhY2tGaWx0ZXIuaW5jbHVkZXMoc3RhY2tOYW1lKSkge1xuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERldGVybWluZSBhcmNoaXRlY3R1cmUgZnJvbSBMYW1iZGEgY29uZmlnXG4gICAgICAgICAgY29uc3QgYXJjaGl0ZWN0dXJlcyA9IGZuLkFyY2hpdGVjdHVyZXMgPz8gW1wieDg2XzY0XCJdXG4gICAgICAgICAgY29uc3QgYXJjaGl0ZWN0dXJlID0gYXJjaGl0ZWN0dXJlcy5pbmNsdWRlcyhcImFybTY0XCIpXG4gICAgICAgICAgICA/IChcImFybTY0XCIgYXMgY29uc3QpXG4gICAgICAgICAgICA6IChcIng4Nl82NFwiIGFzIGNvbnN0KVxuXG4gICAgICAgICAgY29uc3QgZGlzY292ZXJlZDogRGlzY292ZXJlZEZ1bmN0aW9uID0ge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBmbi5GdW5jdGlvbk5hbWUhLFxuICAgICAgICAgICAgZnVuY3Rpb25Bcm46IGZuLkZ1bmN0aW9uQXJuISxcbiAgICAgICAgICAgIGxvY2FsSGFuZGxlcjogdGFnc1tMSVZFX0xBTUJEQV9UQUddID8/IFwiXCIsXG4gICAgICAgICAgICBkb2NrZXJDb250ZXh0UGF0aDogdGFnc1tMSVZFX0xBTUJEQV9ET0NLRVJfVEFHXSxcbiAgICAgICAgICAgIG1lbW9yeU1COiBmbi5NZW1vcnlTaXplID8/IDEyOCxcbiAgICAgICAgICAgIGFyY2hpdGVjdHVyZSxcbiAgICAgICAgICB9XG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goZGlzY292ZXJlZClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0TWFya2VyID0gbGlzdFJlc3BvbnNlLk5leHRNYXJrZXJcbiAgICB9IHdoaWxlIChuZXh0TWFya2VyKVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uc1xuICB9KVxuXG4vKipcbiAqIFN0YXJ0IGEgbG9uZy1ydW5uaW5nIERvY2tlciBjb250YWluZXIgZm9yIGEgZnVuY3Rpb24uXG4gKiBCdWlsZHMgdGhlIGltYWdlIGZyb20gdGhlIGxvY2FsIERvY2tlciBjb250ZXh0IHBhdGgsIHRoZW4gcnVucyBpdC5cbiAqIFRoZSBjb250YWluZXIgY29udGludW91c2x5IHBvbGxzIG91ciBSdW50aW1lIEFQSSBmb3IgaW52b2NhdGlvbnMuXG4gKiBVc2VzIEVmZmVjdC5mb3JrRGFlbW9uIHRvIGVuc3VyZSB0aGUgY29udGFpbmVyIHJ1bnMgaW5kZXBlbmRlbnRseSB3aXRoIGNvbnRleHQuXG4gKi9cbmNvbnN0IHN0YXJ0RnVuY3Rpb25Db250YWluZXIgPSAoXG4gIGZuOiBEaXNjb3ZlcmVkRnVuY3Rpb24sXG4gIHBvcnQ6IG51bWJlcixcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgYWRkaXRpb25hbEVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgaW52b2NhdGlvbkNvbnRleHRzPzogTWFwPHN0cmluZywgeyBudW06IG51bWJlciB9Pixcbik6IEVmZmVjdC5FZmZlY3Q8XG4gIEZpYmVyLlJ1bnRpbWVGaWJlcjx2b2lkLCBFcnJvcj4sXG4gIEVycm9yLFxuICBDb21tYW5kRXhlY3V0b3IuQ29tbWFuZEV4ZWN1dG9yXG4+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBpZiAoIWZuLmRvY2tlckNvbnRleHRQYXRoKSB7XG4gICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5mYWlsKFxuICAgICAgICBuZXcgRXJyb3IoYEZ1bmN0aW9uICR7Zm4uZnVuY3Rpb25OYW1lfSBoYXMgbm8gRG9ja2VyIGNvbnRleHQgcGF0aGApLFxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGRvY2tlciA9IHlpZWxkKiBEb2NrZXJcblxuICAgIGNvbnN0IGRvY2tlclJ1bnRpbWUgPSB5aWVsZCogZG9ja2VyLmdldFJ1bnRpbWVJbmZvKClcbiAgICBjb25zdCBydW50aW1lQXBpSG9zdCA9IGRvY2tlclJ1bnRpbWUuaXNEb2NrZXJEZXNrdG9wXG4gICAgICA/IFwiaG9zdC5kb2NrZXIuaW50ZXJuYWxcIlxuICAgICAgOiBcInJ1bnRpbWUuYXBpXCJcblxuICAgIC8vIEdlbmVyYXRlIGEgbG9jYWwgaW1hZ2UgbmFtZSBmcm9tIGZ1bmN0aW9uIG5hbWVcbiAgICBjb25zdCBpbWFnZU5hbWUgPSBgbGl2ZS1sYW1iZGEtJHtmbi5mdW5jdGlvbk5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csIFwiLVwiKX1gXG5cbiAgICAvLyBSZXNvbHZlIHRoZSBjb250ZXh0IHBhdGggcmVsYXRpdmUgdG8gcHJvamVjdCByb290XG4gICAgY29uc3QgY29udGV4dFBhdGggPSBmbi5kb2NrZXJDb250ZXh0UGF0aC5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgPyBmbi5kb2NrZXJDb250ZXh0UGF0aFxuICAgICAgOiBgJHtwcm9qZWN0Um9vdH0vJHtmbi5kb2NrZXJDb250ZXh0UGF0aH1gXG5cbiAgICAvLyBEZXRlcm1pbmUgcGxhdGZvcm0gZnJvbSBhcmNoaXRlY3R1cmVcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGZuLmFyY2hpdGVjdHVyZSA9PT0gXCJhcm02NFwiID8gXCJsaW51eC9hcm02NFwiIDogXCJsaW51eC9hbWQ2NFwiXG5cbiAgICAvLyBCdWlsZCB0aGUgRG9ja2VyIGltYWdlIGZyb20gbG9jYWwgY29udGV4dFxuICAgIHlpZWxkKiBkb2NrZXJcbiAgICAgIC5idWlsZCh7XG4gICAgICAgIGNvbnRleHRQYXRoLFxuICAgICAgICBpbWFnZU5hbWUsXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgfSlcbiAgICAgIC5waXBlKEVmZmVjdC5zY29wZWQpXG5cbiAgICAvLyBJbnNwZWN0IHRoZSBpbWFnZSB0byBnZXQgb3JpZ2luYWwgZW50cnlwb2ludC9jbWQgZm9yIGV4dGVuc2lvbiB3cmFwcGVyXG4gICAgY29uc3QgaW1hZ2VDb25maWcgPSB5aWVsZCogZG9ja2VyLmluc3BlY3QoaW1hZ2VOYW1lKS5waXBlKEVmZmVjdC5zY29wZWQpXG4gICAgY29uc3QgZXh0ZW5zaW9uV3JhcHBlciA9IGJ1aWxkRXh0ZW5zaW9uV3JhcHBlckNvbW1hbmQoXG4gICAgICBpbWFnZUNvbmZpZy5lbnRyeXBvaW50LFxuICAgICAgaW1hZ2VDb25maWcuY21kLFxuICAgIClcblxuICAgIGNvbnN0IGNvbnRhaW5lckNvbmZpZyA9IG1ha2VMYW1iZGFDb250YWluZXJDb25maWcoe1xuICAgICAgaW1hZ2VVcmk6IGltYWdlTmFtZSxcbiAgICAgIHJ1bnRpbWVBcGlIb3N0LFxuICAgICAgcnVudGltZUFwaVBvcnQ6IHBvcnQsXG4gICAgICBmdW5jdGlvbk5hbWU6IGZuLmZ1bmN0aW9uTmFtZSxcbiAgICAgIGZ1bmN0aW9uVmVyc2lvbjogXCIkTEFURVNUXCIsXG4gICAgICBtZW1vcnlNQjogZm4ubWVtb3J5TUIsXG4gICAgICB0aW1lb3V0U2Vjb25kczogMzYwMCwgLy8gTG9uZyB0aW1lb3V0IC0gY29udGFpbmVyIHN0YXlzIHJ1bm5pbmdcbiAgICAgIHBsYXRmb3JtLFxuICAgICAgYWRkaXRpb25hbEVudixcbiAgICAgIGludm9jYXRpb25Db250ZXh0cyxcbiAgICB9KVxuXG4gICAgLy8gQXBwbHkgZXh0ZW5zaW9uIHdyYXBwZXIgdG8gc3RhcnQgZXh0ZW5zaW9ucyBiZWZvcmUgdGhlIGFwcFxuICAgIGNvbnRhaW5lckNvbmZpZy5lbnRyeXBvaW50ID0gZXh0ZW5zaW9uV3JhcHBlci5lbnRyeXBvaW50XG4gICAgY29udGFpbmVyQ29uZmlnLmNvbW1hbmQgPSBleHRlbnNpb25XcmFwcGVyLmNvbW1hbmRcblxuICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcbiAgICAgIGBTdGFydGluZyBjb250YWluZXIgZm9yICR7Zm4uZnVuY3Rpb25OYW1lfSBvbiBwb3J0ICR7cG9ydH1gLFxuICAgIClcblxuICAgIC8vIFVzZSBFZmZlY3QuZm9ya0RhZW1vbiB0byBydW4gdGhlIGNvbnRhaW5lciBpbmRlcGVuZGVudGx5IHdpdGggY29udGV4dCBwcmVzZXJ2ZWRcbiAgICAvLyBFZmZlY3Quc2NvcGVkIHByb3ZpZGVzIHRoZSBzY29wZSBuZWVkZWQgYnkgZG9ja2VyLnJ1blxuICAgIGNvbnN0IGZpYmVyID0geWllbGQqIGRvY2tlclxuICAgICAgLnJ1bihjb250YWluZXJDb25maWcpXG4gICAgICAucGlwZShFZmZlY3Quc2NvcGVkLCBFZmZlY3QuaWdub3JlLCBFZmZlY3QuZm9ya0RhZW1vbilcblxuICAgIHJldHVybiBmaWJlclxuICB9KS5waXBlKEVmZmVjdC5wcm92aWRlKERvY2tlckxpdmUpKVxuXG4vLyBUeXBlIGd1YXJkcyBmb3IgcmVzcG9uc2UgdHlwZXNcbmNvbnN0IGlzTGFtYmRhUmVzcG9uc2UgPSAoXG4gIHI6IExhbWJkYVJlc3BvbnNlIHwgTGFtYmRhRXJyb3IgfCBMYW1iZGFJbml0RXJyb3IsXG4pOiByIGlzIExhbWJkYVJlc3BvbnNlID0+IFwiYm9keVwiIGluIHIgJiYgIShcImVycm9yVHlwZVwiIGluIHIpXG5cbmNvbnN0IGlzTGFtYmRhRXJyb3IgPSAoXG4gIHI6IExhbWJkYVJlc3BvbnNlIHwgTGFtYmRhRXJyb3IgfCBMYW1iZGFJbml0RXJyb3IsXG4pOiByIGlzIExhbWJkYUVycm9yID0+IFwicmVxdWVzdElkXCIgaW4gciAmJiBcImVycm9yVHlwZVwiIGluIHJcblxuY29uc3QgaXNMYW1iZGFJbml0RXJyb3IgPSAoXG4gIHI6IExhbWJkYVJlc3BvbnNlIHwgTGFtYmRhRXJyb3IgfCBMYW1iZGFJbml0RXJyb3IsXG4pOiByIGlzIExhbWJkYUluaXRFcnJvciA9PiAhKFwicmVxdWVzdElkXCIgaW4gcikgJiYgXCJlcnJvclR5cGVcIiBpbiByXG5cbi8qKlxuICogUmVzZXQgdGhlIGlkbGUgdGltZXIgZm9yIGEgY29udGFpbmVyLlxuICogQWZ0ZXIgdGhlIHRpbWVvdXQgZXhwaXJlcyB3aXRoIG5vIG5ldyByZXNwb25zZXMsIHRoZSBjb250YWluZXIgaXMgc3RvcHBlZC5cbiAqIFRoaXMgcHJldmVudHMgdGhlIGNvbmZ1c2luZyA1MDMgZXJyb3IgZnJvbSB0aGUgTGFtYmRhIFJJQyB3aGVuIHRoZSBwb2xsIHRpbWVzIG91dC5cbiAqL1xuY29uc3QgcmVzZXRJZGxlVGltZXIgPSAoXG4gIGNvbnRhaW5lcjogRnVuY3Rpb25Db250YWluZXIsXG4gIGNvbnRhaW5lcnNSZWY6IFJlZi5SZWY8TWFwPHN0cmluZywgRnVuY3Rpb25Db250YWluZXI+PixcbiAgaWRsZVRpbWVvdXRNczogbnVtYmVyLFxuKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgQ29tbWFuZEV4ZWN1dG9yLkNvbW1hbmRFeGVjdXRvcj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIC8vIENhbmNlbCBleGlzdGluZyB0aW1lciBpZiBhbnlcbiAgICBpZiAoY29udGFpbmVyLmlkbGVUaW1lckZpYmVyKSB7XG4gICAgICB5aWVsZCogRmliZXIuaW50ZXJydXB0KGNvbnRhaW5lci5pZGxlVGltZXJGaWJlcikucGlwZShcbiAgICAgICAgRWZmZWN0LmNhdGNoQWxsKCgpID0+IEVmZmVjdC52b2lkKSxcbiAgICAgIClcbiAgICAgIGNvbnRhaW5lci5pZGxlVGltZXJGaWJlciA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBTdGFydCBuZXcgdGltZXIgLSB1c2UgbmV2ZXIgZm9yIGVycm9yIHR5cGUgc2luY2Ugd2UgY2F0Y2ggYWxsIGVycm9yc1xuICAgIGNvbnN0IHRpbWVyRmliZXI6IEZpYmVyLlJ1bnRpbWVGaWJlcjx2b2lkLCBuZXZlcj4gPSB5aWVsZCogRWZmZWN0LmdlbihcbiAgICAgIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHlpZWxkKiBFZmZlY3Quc2xlZXAoRHVyYXRpb24ubWlsbGlzKGlkbGVUaW1lb3V0TXMpKVxuXG4gICAgICAgIC8vIFRpbWVyIGV4cGlyZWQgLSBzdG9wIGNvbnRhaW5lciBwcm9hY3RpdmVseVxuICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oXG4gICAgICAgICAgYFtMb2NhbF0gU3RvcHBpbmcgaWRsZSBjb250YWluZXIgJHtjb250YWluZXIuZm4uZnVuY3Rpb25OYW1lfSAod2lsbCByZXN0YXJ0IG9uIG5leHQgaW52b2NhdGlvbilgLFxuICAgICAgICApXG5cbiAgICAgICAgLy8gU3RvcCB0aGUgY29udGFpbmVyIHVzaW5nIERvY2tlciB3aXRoIGZhc3QgdGltZW91dCAoMXMpXG4gICAgICAgIC8vIFRoZSBjb250YWluZXIgbWF5IGJlIGJsb2NrZWQgb24gbG9uZy1wb2xsaW5nLCBzbyB3ZSBuZWVkIHRvIGZvcmNlIGtpbGxcbiAgICAgICAgY29uc3QgZG9ja2VyID0geWllbGQqIERvY2tlclxuICAgICAgICB5aWVsZCogZG9ja2VyLnN0b3AoY29udGFpbmVyLmNvbnRhaW5lck5hbWUsIDEpLnBpcGUoXG4gICAgICAgICAgRWZmZWN0LnNjb3BlZCxcbiAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGwoKCkgPT4gRWZmZWN0LnZvaWQpLFxuICAgICAgICApXG5cbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gbWFwIHNvIG5leHQgaW52b2NhdGlvbiBjcmVhdGVzIGZyZXNoIGNvbnRhaW5lclxuICAgICAgICBjb25zdCBjdXJyZW50Q29udGFpbmVycyA9IHlpZWxkKiBSZWYuZ2V0KGNvbnRhaW5lcnNSZWYpXG4gICAgICAgIGN1cnJlbnRDb250YWluZXJzLmRlbGV0ZShjb250YWluZXIuZm4uZnVuY3Rpb25OYW1lKVxuICAgICAgICB5aWVsZCogUmVmLnNldChjb250YWluZXJzUmVmLCBjdXJyZW50Q29udGFpbmVycylcbiAgICAgIH0sXG4gICAgKS5waXBlKFxuICAgICAgRWZmZWN0LnByb3ZpZGUoRG9ja2VyTGl2ZSksXG4gICAgICBFZmZlY3QuY2F0Y2hBbGwoKCkgPT4gRWZmZWN0LnZvaWQpLFxuICAgICAgRWZmZWN0LmZvcmtEYWVtb24sXG4gICAgKVxuXG4gICAgY29udGFpbmVyLmlkbGVUaW1lckZpYmVyID0gdGltZXJGaWJlclxuICB9KVxuXG4vKipcbiAqIFByb2Nlc3MgcmVzcG9uc2VzIGZyb20gYSBjb250YWluZXIgYW5kIGRpc3BhdGNoIHRvIHdhaXRpbmcgY2FsbGVycy5cbiAqIEFmdGVyIGVhY2ggcmVzcG9uc2UsIHJlc2V0cyB0aGUgaWRsZSB0aW1lciB0byBwcm9hY3RpdmVseSBzdG9wIHRoZSBjb250YWluZXJcbiAqIGJlZm9yZSB0aGUgcG9sbCB0aW1lb3V0IGNhdXNlcyBjb25mdXNpbmcgTGFtYmRhIFJJQyBlcnJvcnMuXG4gKi9cbmNvbnN0IHByb2Nlc3NDb250YWluZXJSZXNwb25zZXMgPSAoXG4gIGNvbnRhaW5lcjogRnVuY3Rpb25Db250YWluZXIsXG4gIGNvbnRhaW5lcnNSZWY6IFJlZi5SZWY8TWFwPHN0cmluZywgRnVuY3Rpb25Db250YWluZXI+PixcbiAgaWRsZVRpbWVvdXRNczogbnVtYmVyLFxuICBjbGllbnQ6IFJldHVyblR5cGU8dHlwZW9mIG1ha2VBcHBTeW5jQ2xpZW50PixcbiAgaW52b2NhdGlvbkNvbnRleHRzOiBNYXA8c3RyaW5nLCBJbnZvY2F0aW9uQ29udGV4dD4sXG4pOiBFZmZlY3QuRWZmZWN0PHZvaWQsIEVycm9yLCBDb21tYW5kRXhlY3V0b3IuQ29tbWFuZEV4ZWN1dG9yPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgcmVzcG9uc2VDaGFubmVsID0gYnVpbGRDaGFubmVsTmFtZS5yZXNwb25zZShjb250YWluZXIuZm4uZnVuY3Rpb25OYW1lKVxuXG4gICAgLy8gQ29udGludW91c2x5IHByb2Nlc3MgcmVzcG9uc2VzIGZyb20gdGhlIGNvbnRhaW5lclxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCogd2FpdEZvclJlc3BvbnNlKGNvbnRhaW5lci5ydW50aW1lU3RhdGUpXG5cbiAgICAgIGxldCByZXNwb25zZTogUmVzcG9uc2VNZXNzYWdlXG4gICAgICBpZiAoaXNMYW1iZGFSZXNwb25zZShyZXN1bHQpKSB7XG4gICAgICAgIHJlc3BvbnNlID0ge1xuICAgICAgICAgIHR5cGU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICByZXF1ZXN0SWQ6IHJlc3VsdC5yZXF1ZXN0SWQsXG4gICAgICAgICAgcmVzdWx0OiByZXN1bHQuYm9keSxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0xhbWJkYUVycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgdHlwZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgIHJlcXVlc3RJZDogcmVzdWx0LnJlcXVlc3RJZCxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgZXJyb3JUeXBlOiByZXN1bHQuZXJyb3JUeXBlLFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiByZXN1bHQuZXJyb3JNZXNzYWdlLFxuICAgICAgICAgICAgc3RhY2tUcmFjZTogcmVzdWx0LnN0YWNrVHJhY2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0xhbWJkYUluaXRFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRXJyb3IoXG4gICAgICAgICAgYFtMb2NhbF0gSW5pdCBlcnJvcjogJHtyZXN1bHQuZXJyb3JUeXBlfTogJHtyZXN1bHQuZXJyb3JNZXNzYWdlfWAsXG4gICAgICAgIClcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIFNlbmQgcmVzcG9uc2UgYmFjayB2aWEgQXBwU3luY1xuICAgICAgeWllbGQqIGNsaWVudC5wdWJsaXNoUmVzcG9uc2UocmVzcG9uc2VDaGFubmVsLCByZXNwb25zZSlcbiAgICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoYFtMb2NhbF0gU2VudCByZXNwb25zZSBmb3IgJHtyZXNwb25zZS5yZXF1ZXN0SWR9YClcblxuICAgICAgLy8gUHJpbnQgZW5kIG1hcmtlciB3aXRoIHRpbWluZ1xuICAgICAgY29uc3QgY3R4ID0gaW52b2NhdGlvbkNvbnRleHRzLmdldChyZXNwb25zZS5yZXF1ZXN0SWQpXG4gICAgICBpZiAoY3R4KSB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gY3R4LnN0YXJ0XG4gICAgICAgIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFske2N0eC5udW19XSBcXHUyNTE0XFx1MjUwMFxcdTI1MDAgXFx1MjcxNyAke3Jlc3BvbnNlLmVycm9yLmVycm9yVHlwZX06ICR7cmVzcG9uc2UuZXJyb3IuZXJyb3JNZXNzYWdlfSAoJHtkdXJhdGlvbk1zfW1zKSBcXHUyNTAwXFx1MjUwMGAsXG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFske2N0eC5udW19XSBcXHUyNTE0XFx1MjUwMFxcdTI1MDAgXFx1MjcxMyBEb25lICgke2R1cmF0aW9uTXN9bXMpIFxcdTI1MDBcXHUyNTAwYCxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgaW52b2NhdGlvbkNvbnRleHRzLmRlbGV0ZShyZXNwb25zZS5yZXF1ZXN0SWQpXG4gICAgICB9XG5cbiAgICAgIC8vIFJlc2V0IGlkbGUgdGltZXIgLSBjb250YWluZXIgd2lsbCBiZSBzdG9wcGVkIGlmIG5vIG5ldyBpbnZvY2F0aW9ucyBhcnJpdmVcbiAgICAgIHlpZWxkKiByZXNldElkbGVUaW1lcihjb250YWluZXIsIGNvbnRhaW5lcnNSZWYsIGlkbGVUaW1lb3V0TXMpXG4gICAgfVxuICB9KVxuXG4vKipcbiAqIFN0YXJ0IGEgTm9kZS5qcyB3b3JrZXIgcHJvY2VzcyBmb3IgYSBmdW5jdGlvbi5cbiAqIFNwYXducyBCdW4gdG8gcnVuIHRoZSBydW50aW1lIHdyYXBwZXIgd2l0aCB0aGUgaGFuZGxlciBwYXRoLlxuICogVGhlIHdvcmtlciBjb250aW51b3VzbHkgcG9sbHMgb3VyIFJ1bnRpbWUgQVBJIGZvciBpbnZvY2F0aW9ucy5cbiAqL1xuY29uc3Qgc3RhcnROb2RlanNXb3JrZXIgPSAoXG4gIGZuOiBEaXNjb3ZlcmVkRnVuY3Rpb24sXG4gIHBvcnQ6IG51bWJlcixcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBpbnZvY2F0aW9uQ29udGV4dHM6IE1hcDxzdHJpbmcsIEludm9jYXRpb25Db250ZXh0Pixcbik6IEVmZmVjdC5FZmZlY3Q8Q2hpbGRQcm9jZXNzLCBFcnJvcj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGlmICghZm4ubG9jYWxIYW5kbGVyKSB7XG4gICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5mYWlsKFxuICAgICAgICBuZXcgRXJyb3IoYEZ1bmN0aW9uICR7Zm4uZnVuY3Rpb25OYW1lfSBoYXMgbm8gbG9jYWwgaGFuZGxlciBwYXRoYCksXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gUmVzb2x2ZSB0aGUgcnVudGltZSB3cmFwcGVyIHBhdGggcmVsYXRpdmUgdG8gdGhpcyBtb2R1bGVcbiAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpXG4gICAgY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpXG4gICAgY29uc3QgcnVudGltZVdyYXBwZXJQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgX19kaXJuYW1lLFxuICAgICAgXCIuLlwiLFxuICAgICAgXCJydW50aW1lLXdyYXBwZXJcIixcbiAgICAgIFwibm9kZWpzLXJ1bnRpbWUuanNcIixcbiAgICApXG5cbiAgICAvLyBHZXQgYWJzb2x1dGUgcGF0aCB0byBidW4gZm9yIHB1cmUgZW52IGlzb2xhdGlvbiAobm8gUEFUSCBkZXBlbmRlbmN5KVxuICAgIGNvbnN0IGJ1blBhdGggPSBCdW4ud2hpY2goXCJidW5cIilcbiAgICBpZiAoIWJ1blBhdGgpIHtcbiAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmZhaWwoXG4gICAgICAgIG5ldyBFcnJvcihcIkNvdWxkIG5vdCBmaW5kICdidW4nIGV4ZWN1dGFibGUgaW4gUEFUSFwiKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBlbnZpcm9ubWVudCBmb3IgdGhlIHdvcmtlciBwcm9jZXNzXG4gICAgLy8gUHVyZSBpc29sYXRpb246IG9ubHkgZW52IGZyb20gYnJpZGdlICsgbG9jYWwgb3ZlcnJpZGVzLCBubyBsb2NhbCBQQVRIL0hPTUVcbiAgICBjb25zdCB3b3JrZXJFbnY6IE5vZGVKUy5Qcm9jZXNzRW52ID0ge1xuICAgICAgLy8gU3RhcnQgd2l0aCBlbnYgdmFycyBmcm9tIHRoZSBicmlkZ2UgTGFtYmRhIChBV1MgY3JlZGVudGlhbHMsIHVzZXItZGVmaW5lZCB2YXJzKVxuICAgICAgLi4uZW52LFxuICAgICAgLy8gTG9jYWwgb3ZlcnJpZGVzICh0aGVzZSBhcmUgc2V0IGJ5IHRoZSBkYWVtb24sIG5vdCBmcm9tIGJyaWRnZSlcbiAgICAgIEFXU19MQU1CREFfUlVOVElNRV9BUEk6IGBsb2NhbGhvc3Q6JHtwb3J0fWAsXG4gICAgICBfSEFORExFUjogZm4ubG9jYWxIYW5kbGVyLFxuICAgICAgTEFNQkRBX1RBU0tfUk9PVDogcHJvamVjdFJvb3QsXG4gICAgICAvLyBNZW1vcnkgbGltaXQgZm9yIGNvbnRleHQgb2JqZWN0XG4gICAgICBBV1NfTEFNQkRBX0ZVTkNUSU9OX01FTU9SWV9TSVpFOiBTdHJpbmcoZm4ubWVtb3J5TUIpLFxuICAgIH1cblxuICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoXG4gICAgICBgW0xvY2FsXSBTdGFydGluZyBOb2RlLmpzIHdvcmtlciBmb3IgJHtmbi5mdW5jdGlvbk5hbWV9IG9uIHBvcnQgJHtwb3J0fWAsXG4gICAgKVxuICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoYFtMb2NhbF0gSGFuZGxlcjogJHtmbi5sb2NhbEhhbmRsZXJ9YClcblxuICAgIC8vIFNwYXduIEJ1biB3aXRoIC0td2F0Y2ggdG8gYXV0b21hdGljYWxseSByZXN0YXJ0IHdoZW4gaGFuZGxlciBmaWxlcyBjaGFuZ2VcbiAgICAvLyBUaGlzIGVuYWJsZXMgaG90LXJlbG9hZCB3aXRob3V0IG5lZWRpbmcgdG8gcmVzdGFydCB0aGUgZGFlbW9uXG4gICAgLy8gVXNlIGFic29sdXRlIGJ1biBwYXRoIGZvciBwdXJlIGVudiBpc29sYXRpb24gKG5vIFBBVEggZGVwZW5kZW5jeSlcbiAgICBjb25zdCB3b3JrZXJQcm9jZXNzID0gc3Bhd24oYnVuUGF0aCwgW1wiLS13YXRjaFwiLCBydW50aW1lV3JhcHBlclBhdGhdLCB7XG4gICAgICBjd2Q6IHByb2plY3RSb290LFxuICAgICAgZW52OiB3b3JrZXJFbnYsXG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwicGlwZVwiLCBcInBpcGVcIl0sXG4gICAgfSlcblxuICAgIC8vIFBhdHRlcm4gdG8gcGFyc2UgTGFtYmRhIGxvZyBmb3JtYXQ6IFRJTUVTVEFNUFxcdFJFUVVFU1RfSURcXHRMRVZFTFxcdE1FU1NBR0VcbiAgICAvLyBMYW1iZGEgdXNlcyB0YWJzIGJldHdlZW4gZmllbGRzLiBDYXB0dXJlczogWzFdID0gcmVxdWVzdCBJRCwgWzJdID0gbGV2ZWwgKyBtZXNzYWdlXG4gICAgY29uc3QgbGFtYmRhTG9nUGF0dGVybiA9XG4gICAgICAvXihcXGR7NH0tXFxkezJ9LVxcZHsyfVRbXFxkOi5dK1opW1xcdFxcc10rKFswLTlhLWYtXXszNn0pW1xcdFxcc10rKC4qKSQvaVxuXG4gICAgLy8gSGVscGVyIHRvIGZvcm1hdCBsb2cgbGluZSB3aXRoIGludm9jYXRpb24gcHJlZml4XG4gICAgY29uc3QgZm9ybWF0TGluZSA9IChcbiAgICAgIHJhd0xpbmU6IHN0cmluZyxcbiAgICApOiB7IHByZWZpeDogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfSA9PiB7XG4gICAgICAvLyBTdHJpcCBjYXJyaWFnZSByZXR1cm5zIHRoYXQgY2FuIGNhdXNlIHRlcm1pbmFsIGNvcnJ1cHRpb25cbiAgICAgIGNvbnN0IGxpbmUgPSByYXdMaW5lLnJlcGxhY2UoL1xcci9nLCBcIlwiKVxuICAgICAgY29uc3QgbWF0Y2ggPSBsYW1iZGFMb2dQYXR0ZXJuLmV4ZWMobGluZSlcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSBtYXRjaFsyXVxuICAgICAgICBjb25zdCBjdHggPSBpbnZvY2F0aW9uQ29udGV4dHMuZ2V0KHJlcXVlc3RJZClcbiAgICAgICAgaWYgKGN0eCkge1xuICAgICAgICAgIC8vIFN0cmlwIHRpbWVzdGFtcCBhbmQgcmVxdWVzdCBJRCwga2VlcCBqdXN0IExFVkVMIE1FU1NBR0VcbiAgICAgICAgICByZXR1cm4geyBwcmVmaXg6IGBbJHtjdHgubnVtfV1gLCBjb250ZW50OiBtYXRjaFszXSB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHByZWZpeDogXCJbV29ya2VyXVwiLCBjb250ZW50OiBsaW5lIH1cbiAgICB9XG5cbiAgICAvLyBGb3J3YXJkIHN0ZG91dC9zdGRlcnIgd2l0aCBpbnZvY2F0aW9uIG51bWJlciBwcmVmaXhcbiAgICB3b3JrZXJQcm9jZXNzLnN0ZG91dD8ub24oXCJkYXRhXCIsIChkYXRhOiBCdWZmZXIpID0+IHtcbiAgICAgIGNvbnN0IGxpbmVzID0gZGF0YS50b1N0cmluZygpLnRyaW0oKS5zcGxpdChcIlxcblwiKVxuICAgICAgZm9yIChjb25zdCByYXdMaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGNvbnN0IHsgcHJlZml4LCBjb250ZW50IH0gPSBmb3JtYXRMaW5lKHJhd0xpbmUpXG4gICAgICAgIGNvbnNvbGUubG9nKGAke3ByZWZpeH0gJHtjb250ZW50fWApXG4gICAgICB9XG4gICAgfSlcblxuICAgIHdvcmtlclByb2Nlc3Muc3RkZXJyPy5vbihcImRhdGFcIiwgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgY29uc3QgbGluZXMgPSBkYXRhLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KFwiXFxuXCIpXG4gICAgICBmb3IgKGNvbnN0IHJhd0xpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgY29uc3QgeyBwcmVmaXgsIGNvbnRlbnQgfSA9IGZvcm1hdExpbmUocmF3TGluZSlcbiAgICAgICAgY29uc29sZS5lcnJvcihgJHtwcmVmaXh9ICR7Y29udGVudH1gKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB3b3JrZXJQcm9jZXNzLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgRWZmZWN0LnJ1blN5bmMoXG4gICAgICAgIEVmZmVjdC5sb2dFcnJvcihgV29ya2VyIGVycm9yOiAke2Vyci5tZXNzYWdlfWApLnBpcGUoXG4gICAgICAgICAgRWZmZWN0LmFubm90YXRlTG9ncyhcImZ1bmN0aW9uXCIsIGZuLmZ1bmN0aW9uTmFtZSksXG4gICAgICAgICksXG4gICAgICApXG4gICAgfSlcblxuICAgIHdvcmtlclByb2Nlc3Mub24oXCJjbG9zZVwiLCAoY29kZSkgPT4ge1xuICAgICAgRWZmZWN0LnJ1blN5bmMoXG4gICAgICAgIEVmZmVjdC5sb2dJbmZvKGBXb3JrZXIgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCkucGlwZShcbiAgICAgICAgICBFZmZlY3QuYW5ub3RhdGVMb2dzKFwiZnVuY3Rpb25cIiwgZm4uZnVuY3Rpb25OYW1lKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICB9KVxuXG4gICAgcmV0dXJuIHdvcmtlclByb2Nlc3NcbiAgfSlcblxuLyoqXG4gKiBQcm9jZXNzIHJlc3BvbnNlcyBmcm9tIGEgTm9kZS5qcyB3b3JrZXIgYW5kIGRpc3BhdGNoIHRvIHdhaXRpbmcgY2FsbGVycy5cbiAqL1xuY29uc3QgcHJvY2Vzc1dvcmtlclJlc3BvbnNlcyA9IChcbiAgd29ya2VyOiBOb2RlanNXb3JrZXIsXG4gIGNsaWVudDogUmV0dXJuVHlwZTx0eXBlb2YgbWFrZUFwcFN5bmNDbGllbnQ+LFxuICBpbnZvY2F0aW9uQ29udGV4dHM6IE1hcDxzdHJpbmcsIEludm9jYXRpb25Db250ZXh0PixcbikgPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHJlc3BvbnNlQ2hhbm5lbCA9IGJ1aWxkQ2hhbm5lbE5hbWUucmVzcG9uc2Uod29ya2VyLmZuLmZ1bmN0aW9uTmFtZSlcblxuICAgIC8vIENvbnRpbnVvdXNseSBwcm9jZXNzIHJlc3BvbnNlcyBmcm9tIHRoZSB3b3JrZXJcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQqIHdhaXRGb3JSZXNwb25zZSh3b3JrZXIucnVudGltZVN0YXRlKVxuXG4gICAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlTWVzc2FnZVxuICAgICAgaWYgKGlzTGFtYmRhUmVzcG9uc2UocmVzdWx0KSkge1xuICAgICAgICByZXNwb25zZSA9IHtcbiAgICAgICAgICB0eXBlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgcmVxdWVzdElkOiByZXN1bHQucmVxdWVzdElkLFxuICAgICAgICAgIHJlc3VsdDogcmVzdWx0LmJvZHksXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNMYW1iZGFFcnJvcihyZXN1bHQpKSB7XG4gICAgICAgIHJlc3BvbnNlID0ge1xuICAgICAgICAgIHR5cGU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICByZXF1ZXN0SWQ6IHJlc3VsdC5yZXF1ZXN0SWQsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIGVycm9yVHlwZTogcmVzdWx0LmVycm9yVHlwZSxcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZTogcmVzdWx0LmVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgIHN0YWNrVHJhY2U6IHJlc3VsdC5zdGFja1RyYWNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNMYW1iZGFJbml0RXJyb3IocmVzdWx0KSkge1xuICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0Vycm9yKFxuICAgICAgICAgIGBbTG9jYWxdIFdvcmtlciBpbml0IGVycm9yOiAke3Jlc3VsdC5lcnJvclR5cGV9OiAke3Jlc3VsdC5lcnJvck1lc3NhZ2V9YCxcbiAgICAgICAgKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gU2VuZCByZXNwb25zZSBiYWNrIHZpYSBBcHBTeW5jXG4gICAgICB5aWVsZCogY2xpZW50LnB1Ymxpc2hSZXNwb25zZShyZXNwb25zZUNoYW5uZWwsIHJlc3BvbnNlKVxuICAgICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhgW0xvY2FsXSBTZW50IHJlc3BvbnNlIGZvciAke3Jlc3BvbnNlLnJlcXVlc3RJZH1gKVxuXG4gICAgICAvLyBQcmludCBlbmQgbWFya2VyIHdpdGggdGltaW5nXG4gICAgICBjb25zdCBjdHggPSBpbnZvY2F0aW9uQ29udGV4dHMuZ2V0KHJlc3BvbnNlLnJlcXVlc3RJZClcbiAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IERhdGUubm93KCkgLSBjdHguc3RhcnRcbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgWyR7Y3R4Lm51bX1dIFxcdTI1MTRcXHUyNTAwXFx1MjUwMCBcXHUyNzE3ICR7cmVzcG9uc2UuZXJyb3IuZXJyb3JUeXBlfTogJHtyZXNwb25zZS5lcnJvci5lcnJvck1lc3NhZ2V9ICgke2R1cmF0aW9uTXN9bXMpIFxcdTI1MDBcXHUyNTAwYCxcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgWyR7Y3R4Lm51bX1dIFxcdTI1MTRcXHUyNTAwXFx1MjUwMCBcXHUyNzEzIERvbmUgKCR7ZHVyYXRpb25Nc31tcykgXFx1MjUwMFxcdTI1MDBgLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICBpbnZvY2F0aW9uQ29udGV4dHMuZGVsZXRlKHJlc3BvbnNlLnJlcXVlc3RJZClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbi8qKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGNvbXBsZXRlbHkgZmlsdGVyIG91dCBmcm9tIGludm9jYXRpb24gZW52LlxuICogVGhlc2UgYXJlIG5vdCByZWxldmFudCBmb3IgbG9jYWwgZXhlY3V0aW9uLlxuICovXG5jb25zdCBFTlZfVkFSU19UT19GSUxURVIgPSBuZXcgU2V0KFtcIkFXU19MQU1CREFfTE9HX1NUUkVBTV9OQU1FXCJdKVxuXG4vKipcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBpZ25vcmUgd2hlbiBjYWxjdWxhdGluZyBpZiBlbnYgaGFzIGNoYW5nZWQuXG4gKiBUaGVzZSBjaGFuZ2UgZnJlcXVlbnRseSBidXQgZG9uJ3QgcmVxdWlyZSBhIGNvbnRhaW5lciByZXN0YXJ0LlxuICpcbiAqIFRPRE86IEFXUyBjcmVkZW50aWFscyAoQUNDRVNTX0tFWV9JRCwgU0VDUkVUX0FDQ0VTU19LRVksIFNFU1NJT05fVE9LRU4pXG4gKiBkbyBleHBpcmUgYW5kIHdpbGwgbmVlZCByZWZyZXNoaW5nLiBGb3Igbm93IHdlIGlnbm9yZSB0aGVtIHRvIGF2b2lkXG4gKiB1bm5lY2Vzc2FyeSByZXN0YXJ0cywgYnV0IHdlIHNob3VsZCBpbXBsZW1lbnQgY3JlZGVudGlhbCByZWZyZXNoIGxvZ2ljXG4gKiB0aGF0IHVwZGF0ZXMgdGhlIGNvbnRhaW5lcidzIGNyZWRlbnRpYWxzIHdpdGhvdXQgYSBmdWxsIHJlc3RhcnQuXG4gKi9cbmNvbnN0IEVOVl9WQVJTX1RPX0lHTk9SRV9JTl9ESUZGID0gbmV3IFNldChbXG4gIFwiQVdTX0FDQ0VTU19LRVlfSURcIixcbiAgXCJBV1NfU0VDUkVUX0FDQ0VTU19LRVlcIixcbiAgXCJBV1NfU0VTU0lPTl9UT0tFTlwiLFxuXSlcblxuLyoqXG4gKiBGaWx0ZXIgb3V0IGlycmVsZXZhbnQgZW52IHZhcnMgZnJvbSBpbnZvY2F0aW9uIGVudmlyb25tZW50LlxuICovXG5jb25zdCBzYW5pdGl6ZUludm9jYXRpb25FbnYgPSAoXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnYpKSB7XG4gICAgaWYgKCFFTlZfVkFSU19UT19GSUxURVIuaGFzKGtleSkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIENvbXB1dGUgd2hpY2ggZW52aXJvbm1lbnQgdmFyaWFibGVzIGhhdmUgY2hhbmdlZCBiZXR3ZWVuIHR3byBlbnYgb2JqZWN0cy5cbiAqIFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBzdW1tYXJ5IG9mIHRoZSBjaGFuZ2VzLlxuICogSWdub3JlcyBlbnYgdmFycyBpbiBFTlZfVkFSU19UT19JR05PUkVfSU5fRElGRi5cbiAqL1xuY29uc3QgZ2V0RW52RGlmZiA9IChcbiAgb2xkRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBuZXdFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBjaGFuZ2VzOiBzdHJpbmdbXSA9IFtdXG5cbiAgLy8gQ2hlY2sgZm9yIGFkZGVkIG9yIG1vZGlmaWVkIGtleXNcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobmV3RW52KSkge1xuICAgIGlmIChFTlZfVkFSU19UT19JR05PUkVfSU5fRElGRi5oYXMoa2V5KSkgY29udGludWVcbiAgICBpZiAoIShrZXkgaW4gb2xkRW52KSkge1xuICAgICAgY2hhbmdlcy5wdXNoKGArJHtrZXl9YClcbiAgICB9IGVsc2UgaWYgKG9sZEVudltrZXldICE9PSBuZXdFbnZba2V5XSkge1xuICAgICAgY2hhbmdlcy5wdXNoKGB+JHtrZXl9YClcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBmb3IgcmVtb3ZlZCBrZXlzXG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9sZEVudikpIHtcbiAgICBpZiAoRU5WX1ZBUlNfVE9fSUdOT1JFX0lOX0RJRkYuaGFzKGtleSkpIGNvbnRpbnVlXG4gICAgaWYgKCEoa2V5IGluIG5ld0VudikpIHtcbiAgICAgIGNoYW5nZXMucHVzaChgLSR7a2V5fWApXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNoYW5nZXMuam9pbihcIiwgXCIpXG59XG5cbi8qKlxuICogRW5zdXJlIGEgTm9kZS5qcyB3b3JrZXIgaXMgc3RhcnRlZCBmb3IgYSBmdW5jdGlvbi5cbiAqIElmIHRoZSB3b3JrZXIgYWxyZWFkeSBleGlzdHMsIHJldHVybiBpdC5cbiAqIE90aGVyd2lzZSwgY3JlYXRlIHRoZSBSdW50aW1lIEFQSSBzZXJ2ZXIsIGFkZCB0byB3b3JrZXJzIG1hcCwgYW5kIHN0YXJ0IHRoZSB3b3JrZXIuXG4gKi9cbmNvbnN0IGVuc3VyZVdvcmtlclN0YXJ0ZWQgPSAoXG4gIGZuOiBEaXNjb3ZlcmVkRnVuY3Rpb24sXG4gIGludm9jYXRpb25FbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIHdvcmtlcnNSZWY6IFJlZi5SZWY8TWFwPHN0cmluZywgTm9kZWpzV29ya2VyPj4sXG4gIHNlcnZlclNjb3BlOiBTY29wZS5TY29wZSxcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgYXBwU3luY0NsaWVudDogUmV0dXJuVHlwZTx0eXBlb2YgbWFrZUFwcFN5bmNDbGllbnQ+LFxuICBpbnZvY2F0aW9uQ29udGV4dHM6IE1hcDxzdHJpbmcsIEludm9jYXRpb25Db250ZXh0Pixcbik6IEVmZmVjdC5FZmZlY3Q8Tm9kZWpzV29ya2VyLCBFcnJvcj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIC8vIENoZWNrIGlmIHdvcmtlciBhbHJlYWR5IGV4aXN0c1xuICAgIGNvbnN0IGN1cnJlbnRXb3JrZXJzID0geWllbGQqIFJlZi5nZXQod29ya2Vyc1JlZilcbiAgICBjb25zdCBleGlzdGluZyA9IGN1cnJlbnRXb3JrZXJzLmdldChmbi5mdW5jdGlvbk5hbWUpXG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAvLyBDaGVjayBpZiBlbnYgdmFycyBoYXZlIGNoYW5nZWQgKGUuZy4sIGFmdGVyIENESyByZWRlcGxveSlcbiAgICAgIGNvbnN0IGVudkRpZmYgPSBnZXRFbnZEaWZmKGV4aXN0aW5nLmVudiwgaW52b2NhdGlvbkVudilcbiAgICAgIGlmIChlbnZEaWZmKSB7XG4gICAgICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcbiAgICAgICAgICBgW0xvY2FsXSBFbnZpcm9ubWVudCBjaGFuZ2VkIGZvciAke2ZuLmZ1bmN0aW9uTmFtZX0sIHJlc3RhcnRpbmcgd29ya2VyLi4uICgke2VudkRpZmZ9KWAsXG4gICAgICAgIClcbiAgICAgICAgLy8gS2lsbCB0aGUgb2xkIHdvcmtlclxuICAgICAgICB5aWVsZCogRWZmZWN0LnRyeSgoKSA9PiBleGlzdGluZy53b3JrZXJQcm9jZXNzLmtpbGwoXCJTSUdURVJNXCIpKS5waXBlKFxuICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbCgoKSA9PiBFZmZlY3Qudm9pZCksXG4gICAgICAgIClcbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gbWFwIHNvIHdlIGNyZWF0ZSBhIG5ldyBvbmUgYmVsb3dcbiAgICAgICAgY3VycmVudFdvcmtlcnMuZGVsZXRlKGZuLmZ1bmN0aW9uTmFtZSlcbiAgICAgICAgeWllbGQqIFJlZi5zZXQod29ya2Vyc1JlZiwgY3VycmVudFdvcmtlcnMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXb3JrZXIgZG9lc24ndCBleGlzdCAtIHN0YXJ0IGl0IGxhemlseVxuICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoXG4gICAgICBgW0xvY2FsXSBTdGFydGluZyBOb2RlLmpzIHdvcmtlciBmb3IgZmlyc3QgaW52b2NhdGlvbiBvZiAke2ZuLmZ1bmN0aW9uTmFtZX0uLi5gLFxuICAgIClcblxuICAgIC8vIENyZWF0ZSBSdW50aW1lIEFQSSBzZXJ2ZXIgb24gZXBoZW1lcmFsIHBvcnRcbiAgICBjb25zdCB7IHBvcnQsIHN0YXRlOiBydW50aW1lU3RhdGUgfSA9IHlpZWxkKiBzdGFydFJ1bnRpbWVBcGlTZXJ2ZXIoe1xuICAgICAgZnVuY3Rpb25NZXRhZGF0YToge1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGZuLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgZnVuY3Rpb25WZXJzaW9uOiBcIiRMQVRFU1RcIixcbiAgICAgICAgaGFuZGxlcjogZm4ubG9jYWxIYW5kbGVyLFxuICAgICAgfSxcbiAgICB9KS5waXBlKEVmZmVjdC5wcm92aWRlU2VydmljZShTY29wZS5TY29wZSwgc2VydmVyU2NvcGUpKVxuXG4gICAgLy8gQ3JlYXRlIHdvcmtlciBvYmplY3QgKHdpdGhvdXQgcHJvY2VzcyBpbml0aWFsbHkgLSB3aWxsIGJlIHNldCBhZnRlciBzdGFydClcbiAgICAvLyBXZSBhZGQgdG8gbWFwIEJFRk9SRSBzdGFydGluZyB3b3JrZXIgdG8gaGFuZGxlIGNvbmN1cnJlbnQgaW52b2NhdGlvbnNcbiAgICBjb25zdCB3b3JrZXI6IE5vZGVqc1dvcmtlciA9IHtcbiAgICAgIGZuLFxuICAgICAgcnVudGltZVN0YXRlLFxuICAgICAgcG9ydCxcbiAgICAgIHdvcmtlclByb2Nlc3M6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIENoaWxkUHJvY2VzcywgLy8gV2lsbCBiZSBzZXQgc2hvcnRseVxuICAgICAgZW52OiBpbnZvY2F0aW9uRW52LFxuICAgIH1cblxuICAgIC8vIEFkZCB0byBtYXAgaW1tZWRpYXRlbHkgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICBjdXJyZW50V29ya2Vycy5zZXQoZm4uZnVuY3Rpb25OYW1lLCB3b3JrZXIpXG4gICAgeWllbGQqIFJlZi5zZXQod29ya2Vyc1JlZiwgY3VycmVudFdvcmtlcnMpXG5cbiAgICAvLyBTdGFydCB0aGUgd29ya2VyIHByb2Nlc3MgLSByZW1vdmUgZnJvbSBtYXAgb24gZmFpbHVyZVxuICAgIGNvbnN0IHdvcmtlclByb2Nlc3MgPSB5aWVsZCogc3RhcnROb2RlanNXb3JrZXIoXG4gICAgICBmbixcbiAgICAgIHBvcnQsXG4gICAgICBwcm9qZWN0Um9vdCxcbiAgICAgIGludm9jYXRpb25FbnYsXG4gICAgICBpbnZvY2F0aW9uQ29udGV4dHMsXG4gICAgKS5waXBlKFxuICAgICAgRWZmZWN0LmNhdGNoQWxsKChlcnJvcikgPT5cbiAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgIC8vIFJlbW92ZSBicm9rZW4gd29ya2VyIGZyb20gbWFwIG9uIGZhaWx1cmVcbiAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0Vycm9yKFxuICAgICAgICAgICAgYFtMb2NhbF0gRmFpbGVkIHRvIHN0YXJ0IHdvcmtlciBmb3IgJHtmbi5mdW5jdGlvbk5hbWV9OiAke2Vycm9yfWAsXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSB5aWVsZCogUmVmLmdldCh3b3JrZXJzUmVmKVxuICAgICAgICAgIGN1cnJlbnQuZGVsZXRlKGZuLmZ1bmN0aW9uTmFtZSlcbiAgICAgICAgICB5aWVsZCogUmVmLnNldCh3b3JrZXJzUmVmLCBjdXJyZW50KVxuICAgICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmZhaWwoZXJyb3IpXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApXG5cbiAgICAvLyBVcGRhdGUgd29ya2VyIHdpdGggdGhlIHByb2Nlc3NcbiAgICB3b3JrZXIud29ya2VyUHJvY2VzcyA9IHdvcmtlclByb2Nlc3NcblxuICAgIC8vIFN0YXJ0IHByb2Nlc3NpbmcgcmVzcG9uc2VzIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgRWZmZWN0LnJ1bkZvcmsoXG4gICAgICBwcm9jZXNzV29ya2VyUmVzcG9uc2VzKHdvcmtlciwgYXBwU3luY0NsaWVudCwgaW52b2NhdGlvbkNvbnRleHRzKSxcbiAgICApXG5cbiAgICByZXR1cm4gd29ya2VyXG4gIH0pXG5cbi8qKlxuICogRW5zdXJlIGEgY29udGFpbmVyIGlzIHN0YXJ0ZWQgZm9yIGEgZnVuY3Rpb24uXG4gKiBJZiB0aGUgY29udGFpbmVyIGFscmVhZHkgZXhpc3RzLCByZXR1cm4gaXQuXG4gKiBJZiB0aGUgZW52IHZhcnMgaGF2ZSBjaGFuZ2VkLCByZXN0YXJ0IHRoZSBjb250YWluZXIuXG4gKiBPdGhlcndpc2UsIGNyZWF0ZSB0aGUgUnVudGltZSBBUEkgc2VydmVyLCBhZGQgdG8gY29udGFpbmVycyBtYXAsIGFuZCBzdGFydCB0aGUgY29udGFpbmVyLlxuICovXG5jb25zdCBlbnN1cmVDb250YWluZXJTdGFydGVkID0gKFxuICBmbjogRGlzY292ZXJlZEZ1bmN0aW9uLFxuICBpbnZvY2F0aW9uRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBjb250YWluZXJzUmVmOiBSZWYuUmVmPE1hcDxzdHJpbmcsIEZ1bmN0aW9uQ29udGFpbmVyPj4sXG4gIHNlcnZlclNjb3BlOiBTY29wZS5TY29wZSxcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgaWRsZVRpbWVvdXRNczogbnVtYmVyLFxuICBwb2xsVGltZW91dE1zOiBudW1iZXIsXG4gIGFwcFN5bmNDbGllbnQ6IFJldHVyblR5cGU8dHlwZW9mIG1ha2VBcHBTeW5jQ2xpZW50PixcbiAgaW52b2NhdGlvbkNvbnRleHRzOiBNYXA8c3RyaW5nLCBJbnZvY2F0aW9uQ29udGV4dD4sXG4pOiBFZmZlY3QuRWZmZWN0PEZ1bmN0aW9uQ29udGFpbmVyLCBFcnJvciwgQ29tbWFuZEV4ZWN1dG9yLkNvbW1hbmRFeGVjdXRvcj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIC8vIENoZWNrIGlmIGNvbnRhaW5lciBhbHJlYWR5IGV4aXN0c1xuICAgIGNvbnN0IGN1cnJlbnRDb250YWluZXJzID0geWllbGQqIFJlZi5nZXQoY29udGFpbmVyc1JlZilcbiAgICBjb25zdCBleGlzdGluZyA9IGN1cnJlbnRDb250YWluZXJzLmdldChmbi5mdW5jdGlvbk5hbWUpXG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAvLyBDaGVjayBpZiBlbnYgdmFycyBoYXZlIGNoYW5nZWQgKGUuZy4sIGFmdGVyIENESyByZWRlcGxveSlcbiAgICAgIGNvbnN0IGVudkRpZmYgPSBnZXRFbnZEaWZmKGV4aXN0aW5nLmVudiwgaW52b2NhdGlvbkVudilcbiAgICAgIGlmIChlbnZEaWZmKSB7XG4gICAgICAgIC8vIElNUE9SVEFOVDogVXBkYXRlIGVudiBpbW1lZGlhdGVseSAoYmVmb3JlIGFueSB5aWVsZHMpIHRvIHByZXZlbnRcbiAgICAgICAgLy8gb3RoZXIgY29uY3VycmVudCBpbnZvY2F0aW9ucyBmcm9tIGFsc28gZGV0ZWN0aW5nIHRoZSBjaGFuZ2UgYW5kXG4gICAgICAgIC8vIHRyaWdnZXJpbmcgZHVwbGljYXRlIHJlc3RhcnRzXG4gICAgICAgIGV4aXN0aW5nLmVudiA9IGludm9jYXRpb25FbnZcblxuICAgICAgICAvLyBJZiBhbHJlYWR5IHJlc3RhcnRpbmcgZm9yIGVudiBjaGFuZ2UsIGp1c3QgcmV0dXJuIHRoZSBleGlzdGluZyBjb250YWluZXJcbiAgICAgICAgLy8gVGhlIGludm9jYXRpb24gd2lsbCBiZSBxdWV1ZWQgYW5kIHBpY2tlZCB1cCBieSB0aGUgbmV3IGNvbnRhaW5lclxuICAgICAgICBpZiAoZXhpc3RpbmcuaXNSZWJ1aWxkaW5nKSB7XG4gICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhcbiAgICAgICAgICAgIGBbTG9jYWxdIEVudmlyb25tZW50IGNoYW5nZSByZXN0YXJ0IGFscmVhZHkgaW4gcHJvZ3Jlc3MgZm9yICR7Zm4uZnVuY3Rpb25OYW1lfSwgcXVldWVpbmcgaW52b2NhdGlvbmAsXG4gICAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBleGlzdGluZ1xuICAgICAgICB9XG5cbiAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dJbmZvKFxuICAgICAgICAgIGBbTG9jYWxdIEVudmlyb25tZW50IGNoYW5nZWQgZm9yICR7Zm4uZnVuY3Rpb25OYW1lfSwgcmVzdGFydGluZyBjb250YWluZXIuLi4gKCR7ZW52RGlmZn0pYCxcbiAgICAgICAgKVxuICAgICAgICBleGlzdGluZy5pc1JlYnVpbGRpbmcgPSB0cnVlXG5cbiAgICAgICAgLy8gU3RvcCB0aGUgRG9ja2VyIGNvbnRhaW5lciBmb3JjZWZ1bGx5ICh0aW1lb3V0PTFzKVxuICAgICAgICAvLyBUaGlzIHNlbmRzIFNJR1RFUk0gYW5kIHRoZW4gU0lHS0lMTCBhZnRlciAxIHNlY29uZFxuICAgICAgICAvLyBXZSBtdXN0IGRvIHRoaXMgQkVGT1JFIGludGVycnVwdGluZyB0aGUgZmliZXIsIGJlY2F1c2UgdGhlIGZpYmVyIGlzXG4gICAgICAgIC8vIGJsb2NrZWQgd2FpdGluZyBmb3IgdGhlIGRvY2tlciBwcm9jZXNzIHRvIGV4aXRcbiAgICAgICAgeWllbGQqIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICBjb25zdCBkb2NrZXIgPSB5aWVsZCogRG9ja2VyXG4gICAgICAgICAgeWllbGQqIGRvY2tlci5zdG9wKGV4aXN0aW5nLmNvbnRhaW5lck5hbWUsIDEpLnBpcGUoRWZmZWN0LnNjb3BlZClcbiAgICAgICAgfSkucGlwZShcbiAgICAgICAgICBFZmZlY3QucHJvdmlkZShEb2NrZXJMaXZlKSxcbiAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGwoKGVycm9yKSA9PlxuICAgICAgICAgICAgRWZmZWN0LmxvZ0RlYnVnKFxuICAgICAgICAgICAgICBgW0xvY2FsXSBFcnJvciBzdG9wcGluZyBjb250YWluZXIgKG1heSBhbHJlYWR5IGJlIHN0b3BwZWQpOiAke2Vycm9yfWAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIClcblxuICAgICAgICAvLyBOb3cgaW50ZXJydXB0IHRoZSBmaWJlciAoaXQgc2hvdWxkIGNvbXBsZXRlIHF1aWNrbHkgc2luY2UgY29udGFpbmVyIHN0b3BwZWQpXG4gICAgICAgIHlpZWxkKiBGaWJlci5pbnRlcnJ1cHQoZXhpc3RpbmcuY29udGFpbmVyRmliZXIpLnBpcGUoXG4gICAgICAgICAgRWZmZWN0LmNhdGNoQWxsKCgpID0+IEVmZmVjdC52b2lkKSxcbiAgICAgICAgKVxuXG4gICAgICAgIC8vIFJlc3RhcnQgdGhlIGNvbnRhaW5lciB3aXRoIG5ldyBlbnZpcm9ubWVudCwgcmV1c2luZyBleGlzdGluZyBSdW50aW1lQVBJXG4gICAgICAgIGNvbnN0IG5ld0ZpYmVyID0geWllbGQqIHN0YXJ0RnVuY3Rpb25Db250YWluZXIoXG4gICAgICAgICAgZm4sXG4gICAgICAgICAgZXhpc3RpbmcucG9ydCxcbiAgICAgICAgICBwcm9qZWN0Um9vdCxcbiAgICAgICAgICBpbnZvY2F0aW9uRW52LFxuICAgICAgICAgIGludm9jYXRpb25Db250ZXh0cyxcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbCgoZXJyb3IpID0+XG4gICAgICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRXJyb3IoXG4gICAgICAgICAgICAgICAgYFtMb2NhbF0gRmFpbGVkIHRvIHJlc3RhcnQgY29udGFpbmVyIGZvciAke2ZuLmZ1bmN0aW9uTmFtZX06ICR7ZXJyb3J9YCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBleGlzdGluZy5pc1JlYnVpbGRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5mYWlsKGVycm9yKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuXG4gICAgICAgIC8vIFVwZGF0ZSBjb250YWluZXIgd2l0aCBuZXcgZmliZXJcbiAgICAgICAgZXhpc3RpbmcuY29udGFpbmVyRmliZXIgPSBuZXdGaWJlclxuICAgICAgICBleGlzdGluZy5pc1JlYnVpbGRpbmcgPSBmYWxzZVxuXG4gICAgICAgIHJldHVybiBleGlzdGluZ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29udGFpbmVyIGRvZXNuJ3QgZXhpc3QgLSBzdGFydCBpdCBsYXppbHlcbiAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oXG4gICAgICBgW0xvY2FsXSBTdGFydGluZyBjb250YWluZXIgZm9yIGZpcnN0IGludm9jYXRpb24gb2YgJHtmbi5mdW5jdGlvbk5hbWV9Li4uYCxcbiAgICApXG5cbiAgICAvLyBDcmVhdGUgUnVudGltZSBBUEkgc2VydmVyIG9uIGVwaGVtZXJhbCBwb3J0XG4gICAgLy8gVXNlIHBvbGwgdGltZW91dCB0aGF0J3Mgc2hvcnRlciB0aGFuIGlkbGUgdGltZW91dCBzbyBjb250YWluZXIgZXhpdHMgbmF0dXJhbGx5XG4gICAgY29uc3QgeyBwb3J0LCBzdGF0ZTogcnVudGltZVN0YXRlIH0gPSB5aWVsZCogc3RhcnRSdW50aW1lQXBpU2VydmVyKHtcbiAgICAgIHBvbGxUaW1lb3V0TXMsXG4gICAgICBmdW5jdGlvbk1ldGFkYXRhOiB7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogZm4uZnVuY3Rpb25OYW1lLFxuICAgICAgICBmdW5jdGlvblZlcnNpb246IFwiJExBVEVTVFwiLFxuICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIH0sXG4gICAgfSkucGlwZShFZmZlY3QucHJvdmlkZVNlcnZpY2UoU2NvcGUuU2NvcGUsIHNlcnZlclNjb3BlKSlcblxuICAgIC8vIEdlbmVyYXRlIGNvbnRhaW5lciBuYW1lIGFuZCBpbWFnZSBuYW1lXG4gICAgY29uc3QgY29udGFpbmVyTmFtZSA9IGBsYW1iZGEtJHtmbi5mdW5jdGlvbk5hbWUucmVwbGFjZSgvW15hLXpBLVowLTldL2csIFwiLVwiKX1gXG4gICAgY29uc3QgaW1hZ2VOYW1lID0gYGxpdmUtbGFtYmRhLSR7Zm4uZnVuY3Rpb25OYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCBcIi1cIil9YFxuXG4gICAgLy8gQ3JlYXRlIGNvbnRhaW5lciBvYmplY3QgKHdpdGhvdXQgZmliZXIgaW5pdGlhbGx5IC0gd2lsbCBiZSBzZXQgYWZ0ZXIgc3RhcnQpXG4gICAgLy8gV2UgYWRkIHRvIG1hcCBCRUZPUkUgc3RhcnRpbmcgY29udGFpbmVyIHRvIGhhbmRsZSBjb25jdXJyZW50IGludm9jYXRpb25zXG4gICAgY29uc3QgY29udGFpbmVyOiBGdW5jdGlvbkNvbnRhaW5lciA9IHtcbiAgICAgIGZuLFxuICAgICAgcnVudGltZVN0YXRlLFxuICAgICAgcG9ydCxcbiAgICAgIGNvbnRhaW5lckZpYmVyOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBGaWJlci5SdW50aW1lRmliZXI8dm9pZCwgRXJyb3I+LCAvLyBXaWxsIGJlIHNldCBzaG9ydGx5XG4gICAgICBjb250YWluZXJOYW1lLFxuICAgICAgaW1hZ2VOYW1lLFxuICAgICAgaXNSZWJ1aWxkaW5nOiBmYWxzZSxcbiAgICAgIHBlbmRpbmdSZXNwb25zZXM6IG5ldyBNYXAoKSxcbiAgICAgIGlkbGVUaW1lckZpYmVyOiBudWxsLFxuICAgICAgZW52OiBpbnZvY2F0aW9uRW52LFxuICAgIH1cblxuICAgIC8vIEFkZCB0byBtYXAgaW1tZWRpYXRlbHkgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICBjdXJyZW50Q29udGFpbmVycy5zZXQoZm4uZnVuY3Rpb25OYW1lLCBjb250YWluZXIpXG4gICAgeWllbGQqIFJlZi5zZXQoY29udGFpbmVyc1JlZiwgY3VycmVudENvbnRhaW5lcnMpXG5cbiAgICAvLyBCdWlsZCBhbmQgc3RhcnQgdGhlIGNvbnRhaW5lciAtIHJlbW92ZSBmcm9tIG1hcCBvbiBmYWlsdXJlXG4gICAgY29uc3QgY29udGFpbmVyRmliZXIgPSB5aWVsZCogc3RhcnRGdW5jdGlvbkNvbnRhaW5lcihcbiAgICAgIGZuLFxuICAgICAgcG9ydCxcbiAgICAgIHByb2plY3RSb290LFxuICAgICAgaW52b2NhdGlvbkVudixcbiAgICAgIGludm9jYXRpb25Db250ZXh0cyxcbiAgICApLnBpcGUoXG4gICAgICBFZmZlY3QuY2F0Y2hBbGwoKGVycm9yKSA9PlxuICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIGJyb2tlbiBjb250YWluZXIgZnJvbSBtYXAgb24gZmFpbHVyZVxuICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRXJyb3IoXG4gICAgICAgICAgICBgW0xvY2FsXSBGYWlsZWQgdG8gc3RhcnQgY29udGFpbmVyIGZvciAke2ZuLmZ1bmN0aW9uTmFtZX06ICR7ZXJyb3J9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IHlpZWxkKiBSZWYuZ2V0KGNvbnRhaW5lcnNSZWYpXG4gICAgICAgICAgY3VycmVudC5kZWxldGUoZm4uZnVuY3Rpb25OYW1lKVxuICAgICAgICAgIHlpZWxkKiBSZWYuc2V0KGNvbnRhaW5lcnNSZWYsIGN1cnJlbnQpXG4gICAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZmFpbChlcnJvcilcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgIClcblxuICAgIC8vIFVwZGF0ZSBjb250YWluZXIgd2l0aCB0aGUgZmliZXJcbiAgICBjb250YWluZXIuY29udGFpbmVyRmliZXIgPSBjb250YWluZXJGaWJlclxuXG4gICAgLy8gU3RhcnQgcHJvY2Vzc2luZyByZXNwb25zZXMgaW4gdGhlIGJhY2tncm91bmQgdXNpbmcgZm9ya0RhZW1vblxuICAgIHlpZWxkKiBwcm9jZXNzQ29udGFpbmVyUmVzcG9uc2VzKFxuICAgICAgY29udGFpbmVyLFxuICAgICAgY29udGFpbmVyc1JlZixcbiAgICAgIGlkbGVUaW1lb3V0TXMsXG4gICAgICBhcHBTeW5jQ2xpZW50LFxuICAgICAgaW52b2NhdGlvbkNvbnRleHRzLFxuICAgICkucGlwZShFZmZlY3QuZm9ya0RhZW1vbilcblxuICAgIHJldHVybiBjb250YWluZXJcbiAgfSlcblxuLyoqXG4gKiBSZWJ1aWxkIGEgRG9ja2VyIGNvbnRhaW5lciBhZnRlciBmaWxlIGNoYW5nZXMuXG4gKiBJbnZvY2F0aW9ucyBhcnJpdmluZyBkdXJpbmcgcmVidWlsZCB3aWxsIGJlIHF1ZXVlZCBhbmQgcGlja2VkIHVwIGJ5IHRoZSBuZXcgY29udGFpbmVyLlxuICovXG5jb25zdCByZWJ1aWxkRG9ja2VyQ29udGFpbmVyID0gKFxuICBmdW5jdGlvbklkOiBzdHJpbmcsXG4gIGNvbnRhaW5lcnNSZWY6IFJlZi5SZWY8TWFwPHN0cmluZywgRnVuY3Rpb25Db250YWluZXI+PixcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbik6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgRXJyb3IsIENvbW1hbmRFeGVjdXRvci5Db21tYW5kRXhlY3V0b3I+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBjb250YWluZXJzID0geWllbGQqIFJlZi5nZXQoY29udGFpbmVyc1JlZilcbiAgICBjb25zdCBjb250YWluZXIgPSBjb250YWluZXJzLmdldChmdW5jdGlvbklkKVxuXG4gICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcbiAgICAgICAgYFtMb2NhbF0gQ2Fubm90IHJlYnVpbGQgJHtmdW5jdGlvbklkfSAtIGNvbnRhaW5lciBub3QgZm91bmRgLFxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gTWFyayBhcyByZWJ1aWxkaW5nIC0gaW52b2NhdGlvbnMgd2lsbCBzdGlsbCBxdWV1ZSBidXQgd2UgbG9nIGl0XG4gICAgY29udGFpbmVyLmlzUmVidWlsZGluZyA9IHRydWVcblxuICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoYFtMb2NhbF0gUmVidWlsZGluZyBjb250YWluZXIgZm9yICR7ZnVuY3Rpb25JZH0uLi5gKVxuXG4gICAgY29uc3QgZG9ja2VyID0geWllbGQqIERvY2tlclxuXG4gICAgLy8gU3RvcCB0aGUgZXhpc3RpbmcgY29udGFpbmVyIHVzaW5nIERvY2tlciBzZXJ2aWNlXG4gICAgY29uc3QgY29udGFpbmVySWQgPSBjb250YWluZXIuY29udGFpbmVyTmFtZVxuICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcbiAgICAgIGBbTG9jYWxdIFN0b3BwaW5nIGNvbnRhaW5lciB3aXRoIG5hbWUgcHJlZml4OiAke2NvbnRhaW5lcklkfWAsXG4gICAgKVxuXG4gICAgY29uc3Qgc3RvcENvdW50ID0geWllbGQqIGRvY2tlci5zdG9wKGNvbnRhaW5lcklkKS5waXBlKFxuICAgICAgRWZmZWN0LnNjb3BlZCxcbiAgICAgIEVmZmVjdC5jYXRjaEFsbCgoZXJyb3IpID0+XG4gICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oYE5vdGU6IENvbnRhaW5lciBzdG9wIGhhZCBpc3N1ZTogJHtlcnJvcn1gKVxuICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApXG4gICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhgW0xvY2FsXSBTdG9wcGVkICR7c3RvcENvdW50fSBjb250YWluZXIocylgKVxuXG4gICAgLy8gUmVzb2x2ZSB0aGUgY29udGV4dCBwYXRoXG4gICAgY29uc3QgZm4gPSBjb250YWluZXIuZm5cbiAgICBjb25zdCBjb250ZXh0UGF0aCA9IGZuLmRvY2tlckNvbnRleHRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKVxuICAgICAgPyBmbi5kb2NrZXJDb250ZXh0UGF0aFxuICAgICAgOiBgJHtwcm9qZWN0Um9vdH0vJHtmbi5kb2NrZXJDb250ZXh0UGF0aH1gXG5cbiAgICAvLyBEZXRlcm1pbmUgcGxhdGZvcm0gZnJvbSBhcmNoaXRlY3R1cmVcbiAgICBjb25zdCBwbGF0Zm9ybSA9IGZuLmFyY2hpdGVjdHVyZSA9PT0gXCJhcm02NFwiID8gXCJsaW51eC9hcm02NFwiIDogXCJsaW51eC9hbWQ2NFwiXG5cbiAgICAvLyBSZWJ1aWxkIHRoZSBEb2NrZXIgaW1hZ2VcbiAgICB5aWVsZCogZG9ja2VyXG4gICAgICAuYnVpbGQoe1xuICAgICAgICBjb250ZXh0UGF0aCxcbiAgICAgICAgaW1hZ2VOYW1lOiBjb250YWluZXIuaW1hZ2VOYW1lLFxuICAgICAgICBwbGF0Zm9ybSxcbiAgICAgIH0pXG4gICAgICAucGlwZShFZmZlY3Quc2NvcGVkKVxuXG4gICAgLy8gSW5zcGVjdCB0aGUgaW1hZ2UgdG8gZ2V0IG9yaWdpbmFsIGVudHJ5cG9pbnQvY21kIGZvciBleHRlbnNpb24gd3JhcHBlclxuICAgIGNvbnN0IGltYWdlQ29uZmlnID0geWllbGQqIGRvY2tlclxuICAgICAgLmluc3BlY3QoY29udGFpbmVyLmltYWdlTmFtZSlcbiAgICAgIC5waXBlKEVmZmVjdC5zY29wZWQpXG4gICAgY29uc3QgZXh0ZW5zaW9uV3JhcHBlciA9IGJ1aWxkRXh0ZW5zaW9uV3JhcHBlckNvbW1hbmQoXG4gICAgICBpbWFnZUNvbmZpZy5lbnRyeXBvaW50LFxuICAgICAgaW1hZ2VDb25maWcuY21kLFxuICAgIClcblxuICAgIC8vIFJlc3RhcnQgdGhlIGNvbnRhaW5lciBieSB0cmlnZ2VyaW5nIGNvbnRhaW5lciBzdGFydHVwXG4gICAgLy8gVGhlIGV4aXN0aW5nIGZpYmVyIHdpbGwgaGF2ZSBleGl0ZWQgd2hlbiB3ZSBzdG9wcGVkIHRoZSBjb250YWluZXJcbiAgICAvLyBXZSBuZWVkIHRvIHN0YXJ0IGEgbmV3IG9uZVxuICAgIGNvbnN0IGRvY2tlclJ1bnRpbWUgPSB5aWVsZCogZG9ja2VyLmdldFJ1bnRpbWVJbmZvKClcbiAgICBjb25zdCBydW50aW1lQXBpSG9zdCA9IGRvY2tlclJ1bnRpbWUuaXNEb2NrZXJEZXNrdG9wXG4gICAgICA/IFwiaG9zdC5kb2NrZXIuaW50ZXJuYWxcIlxuICAgICAgOiBcInJ1bnRpbWUuYXBpXCJcblxuICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcbiAgICAgIGBbTG9jYWxdIE5ldyBjb250YWluZXIgd2lsbCBjb25uZWN0IHRvIFJ1bnRpbWUgQVBJIGF0ICR7cnVudGltZUFwaUhvc3R9OiR7Y29udGFpbmVyLnBvcnR9YCxcbiAgICApXG5cbiAgICBjb25zdCBjb250YWluZXJDb25maWcgPSBtYWtlTGFtYmRhQ29udGFpbmVyQ29uZmlnKHtcbiAgICAgIGltYWdlVXJpOiBjb250YWluZXIuaW1hZ2VOYW1lLFxuICAgICAgcnVudGltZUFwaUhvc3QsXG4gICAgICBydW50aW1lQXBpUG9ydDogY29udGFpbmVyLnBvcnQsXG4gICAgICBmdW5jdGlvbk5hbWU6IGZuLmZ1bmN0aW9uTmFtZSxcbiAgICAgIGZ1bmN0aW9uVmVyc2lvbjogXCIkTEFURVNUXCIsXG4gICAgICBtZW1vcnlNQjogZm4ubWVtb3J5TUIsXG4gICAgICB0aW1lb3V0U2Vjb25kczogMzYwMCxcbiAgICAgIHBsYXRmb3JtLFxuICAgIH0pXG5cbiAgICAvLyBBcHBseSBleHRlbnNpb24gd3JhcHBlciB0byBzdGFydCBleHRlbnNpb25zIGJlZm9yZSB0aGUgYXBwXG4gICAgY29udGFpbmVyQ29uZmlnLmVudHJ5cG9pbnQgPSBleHRlbnNpb25XcmFwcGVyLmVudHJ5cG9pbnRcbiAgICBjb250YWluZXJDb25maWcuY29tbWFuZCA9IGV4dGVuc2lvbldyYXBwZXIuY29tbWFuZFxuXG4gICAgLy8gU3RhcnQgdGhlIG5ldyBjb250YWluZXJcbiAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKFxuICAgICAgYFtMb2NhbF0gU3RhcnRpbmcgbmV3IGNvbnRhaW5lciBmb3IgJHtmdW5jdGlvbklkfS4uLmAsXG4gICAgKVxuXG4gICAgLy8gVXNlIEVmZmVjdC5mb3JrRGFlbW9uIHRvIHJ1biB0aGUgY29udGFpbmVyIGluZGVwZW5kZW50bHlcbiAgICBjb25zdCBuZXdGaWJlciA9IHlpZWxkKiBkb2NrZXIucnVuKGNvbnRhaW5lckNvbmZpZykucGlwZShcbiAgICAgIEVmZmVjdC5zY29wZWQsXG4gICAgICBFZmZlY3QudGFwKChyZXN1bHQpID0+XG4gICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAvLyBPbmx5IHN1cHByZXNzIGVycm9ycyBmb3IgZXhwZWN0ZWQgZXhpdCBjb2RlcyBmcm9tIGRvY2tlciBzdG9wOlxuICAgICAgICAgIC8vIDA6IGNsZWFuLCAxNDM6IFNJR1RFUk0sIDEzNzogU0lHS0lMTFxuICAgICAgICAgIGNvbnN0IGNvZGUgPSByZXN1bHQuZXhpdENvZGVcbiAgICAgICAgICBpZiAoY29kZSAhPT0gMCAmJiBjb2RlICE9PSAxNDMgJiYgY29kZSAhPT0gMTM3KSB7XG4gICAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0Vycm9yKFxuICAgICAgICAgICAgICBgQ29udGFpbmVyIGZvciAke2Z1bmN0aW9uSWR9IGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0Vycm9yKGBzdGRlcnI6ICR7cmVzdWx0LnN0ZGVycn1gKVxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAgRWZmZWN0Lmlnbm9yZSxcbiAgICAgIEVmZmVjdC5jYXRjaEFsbCgoZXJyb3IpID0+XG4gICAgICAgIEVmZmVjdC5sb2dFcnJvcihgQ29udGFpbmVyIGVycm9yIGZvciAke2Z1bmN0aW9uSWR9OiAke2Vycm9yfWApLFxuICAgICAgKSxcbiAgICAgIEVmZmVjdC5mb3JrRGFlbW9uLFxuICAgIClcblxuICAgIC8vIFVwZGF0ZSB0aGUgY29udGFpbmVyIHN0YXRlIHdpdGggdGhlIG5ldyBmaWJlclxuICAgIGNvbnRhaW5lci5jb250YWluZXJGaWJlciA9IG5ld0ZpYmVyXG5cbiAgICAvLyBXYWl0IGEgbW9tZW50IGZvciB0aGUgY29udGFpbmVyIHRvIHN0YXJ0IGFuZCBiZWdpbiBwb2xsaW5nXG4gICAgeWllbGQqIEVmZmVjdC5zbGVlcChcIjIgc2Vjb25kc1wiKVxuXG4gICAgY29udGFpbmVyLmlzUmVidWlsZGluZyA9IGZhbHNlXG4gICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhgW0xvY2FsXSBDb250YWluZXIgcmVidWlsdCBmb3IgJHtmdW5jdGlvbklkfWApXG4gIH0pLnBpcGUoRWZmZWN0LnByb3ZpZGUoRG9ja2VyTGl2ZSkpXG5cbi8qKlxuICogSGFuZGxlIGluY29taW5nIGludm9jYXRpb25zIGZvciBhIERvY2tlciBjb250YWluZXIgZnVuY3Rpb24gYnkgcXVldWVpbmcgdGhlbS5cbiAqIFN0YXJ0cyB0aGUgY29udGFpbmVyIGxhemlseSBpZiBub3QgYWxyZWFkeSBydW5uaW5nLlxuICogSW52b2NhdGlvbnMgYXJlIHF1ZXVlZCBldmVuIGlmIGEgcmVidWlsZCBpcyBpbiBwcm9ncmVzcyAtIHRoZSBuZXcgY29udGFpbmVyIHdpbGwgcGljayB0aGVtIHVwLlxuICovXG5jb25zdCBoYW5kbGVEb2NrZXJJbnZvY2F0aW9uID0gKFxuICBmbjogRGlzY292ZXJlZEZ1bmN0aW9uLFxuICBpbnZvY2F0aW9uOiBJbnZvY2F0aW9uTWVzc2FnZSxcbiAgY29udGFpbmVyc1JlZjogUmVmLlJlZjxNYXA8c3RyaW5nLCBGdW5jdGlvbkNvbnRhaW5lcj4+LFxuICBzZXJ2ZXJTY29wZTogU2NvcGUuU2NvcGUsXG4gIHByb2plY3RSb290OiBzdHJpbmcsXG4gIGlkbGVUaW1lb3V0TXM6IG51bWJlcixcbiAgcG9sbFRpbWVvdXRNczogbnVtYmVyLFxuICBhcHBTeW5jQ2xpZW50OiBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQXBwU3luY0NsaWVudD4sXG4gIGludm9jYXRpb25Db3VudGVyOiBSZWYuUmVmPG51bWJlcj4sXG4gIGludm9jYXRpb25Db250ZXh0czogTWFwPHN0cmluZywgSW52b2NhdGlvbkNvbnRleHQ+LFxuKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBFcnJvciwgQ29tbWFuZEV4ZWN1dG9yLkNvbW1hbmRFeGVjdXRvcj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIC8vIEVuc3VyZSBjb250YWluZXIgaXMgc3RhcnRlZCAobGF6eSBzdGFydHVwIG9uIGZpcnN0IGludm9jYXRpb24pXG4gICAgLy8gVXNlIGVudiBmcm9tIGludm9jYXRpb24gKGNhcHR1cmVkIGZyb20gYnJpZGdlIExhbWJkYSBvbiBmaXJzdCBpbnZva2UpXG4gICAgY29uc3QgY29udGFpbmVyID0geWllbGQqIGVuc3VyZUNvbnRhaW5lclN0YXJ0ZWQoXG4gICAgICBmbixcbiAgICAgIHNhbml0aXplSW52b2NhdGlvbkVudihpbnZvY2F0aW9uLmVudiA/PyB7fSksXG4gICAgICBjb250YWluZXJzUmVmLFxuICAgICAgc2VydmVyU2NvcGUsXG4gICAgICBwcm9qZWN0Um9vdCxcbiAgICAgIGlkbGVUaW1lb3V0TXMsXG4gICAgICBwb2xsVGltZW91dE1zLFxuICAgICAgYXBwU3luY0NsaWVudCxcbiAgICAgIGludm9jYXRpb25Db250ZXh0cyxcbiAgICApXG5cbiAgICAvLyBBc3NpZ24gaW52b2NhdGlvbiBudW1iZXIgYW5kIHRyYWNrIGNvbnRleHQgZm9yIGxvZ2dpbmdcbiAgICBjb25zdCBpbnZvY2F0aW9uTnVtID0geWllbGQqIFJlZi51cGRhdGVBbmRHZXQoXG4gICAgICBpbnZvY2F0aW9uQ291bnRlcixcbiAgICAgIChuKSA9PiBuICsgMSxcbiAgICApXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGludm9jYXRpb25Db250ZXh0cy5zZXQoaW52b2NhdGlvbi5yZXF1ZXN0SWQsIHtcbiAgICAgIG51bTogaW52b2NhdGlvbk51bSxcbiAgICAgIHN0YXJ0OiBzdGFydFRpbWUsXG4gICAgICBmbjogZm4uZnVuY3Rpb25OYW1lLFxuICAgICAgaXNEb2NrZXI6IHRydWUsXG4gICAgfSlcblxuICAgIC8vIFByaW50IHN0YXJ0IG1hcmtlclxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFxcblske2ludm9jYXRpb25OdW19XSBcXHUyNTBjXFx1MjUwMFxcdTI1MDAgW0RvY2tlcl0gJHtmbi5mdW5jdGlvbk5hbWV9IFxcdTI1MDBcXHUyNTAwYCxcbiAgICApXG5cbiAgICAvLyBMb2cgaWYgcXVldWluZyBkdXJpbmcgYSByZWJ1aWxkXG4gICAgaWYgKGNvbnRhaW5lci5pc1JlYnVpbGRpbmcpIHtcbiAgICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoXG4gICAgICAgIGBbTG9jYWxdIFF1ZXVlaW5nIGludm9jYXRpb24gJHtpbnZvY2F0aW9uLnJlcXVlc3RJZH0gZm9yICR7Zm4uZnVuY3Rpb25OYW1lfSAocmVidWlsZCBpbiBwcm9ncmVzcywgd2lsbCBiZSBwaWNrZWQgdXAgYnkgbmV3IGNvbnRhaW5lcilgLFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKFxuICAgICAgICBgW0xvY2FsXSBRdWV1ZWluZyBpbnZvY2F0aW9uICR7aW52b2NhdGlvbi5yZXF1ZXN0SWR9IGZvciAke2ZuLmZ1bmN0aW9uTmFtZX1gLFxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGxhbWJkYUludm9jYXRpb246IExhbWJkYUludm9jYXRpb24gPSB7XG4gICAgICByZXF1ZXN0SWQ6IGludm9jYXRpb24ucmVxdWVzdElkLFxuICAgICAgZXZlbnQ6IGludm9jYXRpb24uZXZlbnQsXG4gICAgICBpbnZva2VkRnVuY3Rpb25Bcm46IGludm9jYXRpb24uY29udGV4dC5pbnZva2VkRnVuY3Rpb25Bcm4sXG4gICAgICBkZWFkbGluZU1zOiBEYXRlLm5vdygpICsgaW52b2NhdGlvbi5jb250ZXh0LmdldFJlbWFpbmluZ1RpbWVJbk1pbGxpcyxcbiAgICAgIGZ1bmN0aW9uTmFtZTogZm4uZnVuY3Rpb25OYW1lLFxuICAgICAgZnVuY3Rpb25WZXJzaW9uOiBpbnZvY2F0aW9uLmNvbnRleHQuZnVuY3Rpb25WZXJzaW9uLFxuICAgICAgbWVtb3J5TGltaXRNQjogZm4ubWVtb3J5TUIsXG4gICAgICBsb2dHcm91cE5hbWU6IGludm9jYXRpb24uY29udGV4dC5sb2dHcm91cE5hbWUsXG4gICAgICBsb2dTdHJlYW1OYW1lOiBpbnZvY2F0aW9uLmNvbnRleHQubG9nU3RyZWFtTmFtZSxcbiAgICB9XG5cbiAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKFxuICAgICAgYFtMb2NhbF0gUXVldWVpbmcgdG8gUnVudGltZSBBUEkgb24gcG9ydCAke2NvbnRhaW5lci5wb3J0fWAsXG4gICAgKVxuICAgIC8vIE5vdGlmeSBleHRlbnNpb25zIGFib3V0IHRoZSBpbnZvY2F0aW9uIChmb3IgTGFtYmRhIFdlYiBBZGFwdGVyIHN1cHBvcnQpXG4gICAgeWllbGQqIG5vdGlmeUV4dGVuc2lvbnNJbnZva2UoY29udGFpbmVyLnJ1bnRpbWVTdGF0ZSwgbGFtYmRhSW52b2NhdGlvbilcbiAgICB5aWVsZCogcXVldWVJbnZvY2F0aW9uKGNvbnRhaW5lci5ydW50aW1lU3RhdGUsIGxhbWJkYUludm9jYXRpb24pXG4gICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhgW0xvY2FsXSBJbnZvY2F0aW9uIHF1ZXVlZCBzdWNjZXNzZnVsbHlgKVxuICB9KVxuXG4vKipcbiAqIEhhbmRsZSBpbmNvbWluZyBpbnZvY2F0aW9ucyBmb3IgYSBOb2RlLmpzIGZ1bmN0aW9uIGJ5IHF1ZXVlaW5nIHRoZW0uXG4gKiBTdGFydHMgdGhlIHdvcmtlciBsYXppbHkgaWYgbm90IGFscmVhZHkgcnVubmluZy5cbiAqL1xuY29uc3QgaGFuZGxlTm9kZWpzSW52b2NhdGlvbiA9IChcbiAgZm46IERpc2NvdmVyZWRGdW5jdGlvbixcbiAgaW52b2NhdGlvbjogSW52b2NhdGlvbk1lc3NhZ2UsXG4gIHdvcmtlcnNSZWY6IFJlZi5SZWY8TWFwPHN0cmluZywgTm9kZWpzV29ya2VyPj4sXG4gIHNlcnZlclNjb3BlOiBTY29wZS5TY29wZSxcbiAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgYXBwU3luY0NsaWVudDogUmV0dXJuVHlwZTx0eXBlb2YgbWFrZUFwcFN5bmNDbGllbnQ+LFxuICBpbnZvY2F0aW9uQ291bnRlcjogUmVmLlJlZjxudW1iZXI+LFxuICBpbnZvY2F0aW9uQ29udGV4dHM6IE1hcDxzdHJpbmcsIEludm9jYXRpb25Db250ZXh0Pixcbik6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgRXJyb3I+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAvLyBHZXQgZW52IHZhcnMgZnJvbSBpbnZvY2F0aW9uIChmb3J3YXJkZWQgZnJvbSBicmlkZ2UgTGFtYmRhKVxuICAgIGNvbnN0IGludm9jYXRpb25FbnYgPSBzYW5pdGl6ZUludm9jYXRpb25FbnYoaW52b2NhdGlvbi5lbnYgPz8ge30pXG5cbiAgICAvLyBFbnN1cmUgd29ya2VyIGlzIHN0YXJ0ZWQgKGxhenkgc3RhcnR1cCBvbiBmaXJzdCBpbnZvY2F0aW9uKVxuICAgIGNvbnN0IHdvcmtlciA9IHlpZWxkKiBlbnN1cmVXb3JrZXJTdGFydGVkKFxuICAgICAgZm4sXG4gICAgICBpbnZvY2F0aW9uRW52LFxuICAgICAgd29ya2Vyc1JlZixcbiAgICAgIHNlcnZlclNjb3BlLFxuICAgICAgcHJvamVjdFJvb3QsXG4gICAgICBhcHBTeW5jQ2xpZW50LFxuICAgICAgaW52b2NhdGlvbkNvbnRleHRzLFxuICAgIClcblxuICAgIC8vIEFzc2lnbiBpbnZvY2F0aW9uIG51bWJlciBhbmQgdHJhY2sgY29udGV4dCBmb3IgbG9nZ2luZ1xuICAgIGNvbnN0IGludm9jYXRpb25OdW0gPSB5aWVsZCogUmVmLnVwZGF0ZUFuZEdldChcbiAgICAgIGludm9jYXRpb25Db3VudGVyLFxuICAgICAgKG4pID0+IG4gKyAxLFxuICAgIClcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgaW52b2NhdGlvbkNvbnRleHRzLnNldChpbnZvY2F0aW9uLnJlcXVlc3RJZCwge1xuICAgICAgbnVtOiBpbnZvY2F0aW9uTnVtLFxuICAgICAgc3RhcnQ6IHN0YXJ0VGltZSxcbiAgICAgIGZuOiBmbi5mdW5jdGlvbk5hbWUsXG4gICAgICBpc0RvY2tlcjogZmFsc2UsXG4gICAgfSlcblxuICAgIC8vIFByaW50IHN0YXJ0IG1hcmtlclxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFxcblske2ludm9jYXRpb25OdW19XSBcXHUyNTBjXFx1MjUwMFxcdTI1MDAgJHtmbi5mdW5jdGlvbk5hbWV9IFxcdTI1MDBcXHUyNTAwYCxcbiAgICApXG5cbiAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKFxuICAgICAgYFtMb2NhbF0gUXVldWVpbmcgaW52b2NhdGlvbiAke2ludm9jYXRpb24ucmVxdWVzdElkfSBmb3IgJHtmbi5mdW5jdGlvbk5hbWV9YCxcbiAgICApXG5cbiAgICBjb25zdCBsYW1iZGFJbnZvY2F0aW9uOiBMYW1iZGFJbnZvY2F0aW9uID0ge1xuICAgICAgcmVxdWVzdElkOiBpbnZvY2F0aW9uLnJlcXVlc3RJZCxcbiAgICAgIGV2ZW50OiBpbnZvY2F0aW9uLmV2ZW50LFxuICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiBpbnZvY2F0aW9uLmNvbnRleHQuaW52b2tlZEZ1bmN0aW9uQXJuLFxuICAgICAgZGVhZGxpbmVNczogRGF0ZS5ub3coKSArIGludm9jYXRpb24uY29udGV4dC5nZXRSZW1haW5pbmdUaW1lSW5NaWxsaXMsXG4gICAgICBmdW5jdGlvbk5hbWU6IGZuLmZ1bmN0aW9uTmFtZSxcbiAgICAgIGZ1bmN0aW9uVmVyc2lvbjogaW52b2NhdGlvbi5jb250ZXh0LmZ1bmN0aW9uVmVyc2lvbixcbiAgICAgIG1lbW9yeUxpbWl0TUI6IGZuLm1lbW9yeU1CLFxuICAgICAgbG9nR3JvdXBOYW1lOiBpbnZvY2F0aW9uLmNvbnRleHQubG9nR3JvdXBOYW1lLFxuICAgICAgbG9nU3RyZWFtTmFtZTogaW52b2NhdGlvbi5jb250ZXh0LmxvZ1N0cmVhbU5hbWUsXG4gICAgfVxuXG4gICAgeWllbGQqIHF1ZXVlSW52b2NhdGlvbih3b3JrZXIucnVudGltZVN0YXRlLCBsYW1iZGFJbnZvY2F0aW9uKVxuICB9KVxuXG4vKipcbiAqIENESyB3YXRjaCBldmVudCB0eXBlcy5cbiAqL1xudHlwZSBDZGtXYXRjaEV2ZW50ID1cbiAgfCB7IHJlYWRvbmx5IF90YWc6IFwiU3RhY2tEaXNjb3ZlcmVkXCI7IHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nIH1cbiAgfCB7IHJlYWRvbmx5IF90YWc6IFwiRGVwbG95Q29tcGxldGVcIiB9XG5cbi8qKlxuICogU3RhcnQgQ0RLIHdhdGNoIHByb2Nlc3Mgd2l0aCBDREtfTElWRT10cnVlIHVzaW5nIEVmZmVjdCdzIENvbW1hbmQuXG4gKiBSZXR1cm5zIHRoZSBwcm9jZXNzIGFuZCBhIHF1ZXVlIG9mIGV2ZW50cy5cbiAqL1xuY29uc3Qgc3RhcnRDZGtXYXRjaCA9IChcbiAgb3B0aW9uczoge1xuICAgIHByb2ZpbGU/OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICByZWdpb24/OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICBzdGFja3M/OiBzdHJpbmdbXSB8IHVuZGVmaW5lZFxuICAgIGFsbD86IGJvb2xlYW4gfCB1bmRlZmluZWRcbiAgfSxcbiAgc2NvcGU6IFNjb3BlLlNjb3BlLFxuKTogRWZmZWN0LkVmZmVjdDxcbiAgeyBwcm9jZXNzOiBFZmZlY3RQcm9jZXNzOyBldmVudHM6IFF1ZXVlLlF1ZXVlPENka1dhdGNoRXZlbnQ+IH0sXG4gIEVycm9yLFxuICBDb21tYW5kRXhlY3V0b3IuQ29tbWFuZEV4ZWN1dG9yXG4+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgXCJjZGtcIixcbiAgICAgIFwid2F0Y2hcIixcbiAgICAgIFwiLS1ob3Rzd2FwLWZhbGxiYWNrXCIsXG4gICAgICBcIi0tbm8tbG9nc1wiLFxuICAgICAgXCItLW1ldGhvZD1kaXJlY3RcIixcbiAgICBdXG5cbiAgICBpZiAob3B0aW9ucy5zdGFja3MgJiYgb3B0aW9ucy5zdGFja3MubGVuZ3RoID4gMCkge1xuICAgICAgYXJncy5wdXNoKC4uLm9wdGlvbnMuc3RhY2tzKVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5hbGwpIHtcbiAgICAgIGFyZ3MucHVzaChcIi0tYWxsXCIpXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucHJvZmlsZSkge1xuICAgICAgYXJncy5wdXNoKFwiLS1wcm9maWxlXCIsIG9wdGlvbnMucHJvZmlsZSlcbiAgICB9XG5cbiAgICBjb25zdCBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgIENES19MSVZFOiBcInRydWVcIixcbiAgICB9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuICAgIGlmIChvcHRpb25zLnJlZ2lvbikge1xuICAgICAgZW52LkFXU19SRUdJT04gPSBvcHRpb25zLnJlZ2lvblxuICAgICAgZW52LkNES19ERUZBVUxUX1JFR0lPTiA9IG9wdGlvbnMucmVnaW9uXG4gICAgfVxuXG4gICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhgU3RhcnRpbmc6IG5weCAke2FyZ3Muam9pbihcIiBcIil9YClcblxuICAgIGNvbnN0IGNvbW1hbmQgPSBQbGF0Zm9ybUNvbW1hbmQubWFrZShcIm5weFwiLCAuLi5hcmdzKS5waXBlKFxuICAgICAgUGxhdGZvcm1Db21tYW5kLmVudihlbnYpLFxuICAgICAgUGxhdGZvcm1Db21tYW5kLnJ1bkluU2hlbGwodHJ1ZSksXG4gICAgICBQbGF0Zm9ybUNvbW1hbmQuc3RkaW4oXCJpbmhlcml0XCIpLFxuICAgIClcblxuICAgIC8vIEV4dGVuZCB0aGUgcHJvY2VzcyByZXNvdXJjZSBsaWZldGltZSB0byB0aGUgcHJvdmlkZWQgc2NvcGVcbiAgICBjb25zdCBwcm9jID0geWllbGQqIFBsYXRmb3JtQ29tbWFuZC5zdGFydChjb21tYW5kKS5waXBlKFNjb3BlLmV4dGVuZChzY29wZSkpXG5cbiAgICAvLyBFdmVudCBxdWV1ZSBmb3IgY2FsbGVycyB0byBzdWJzY3JpYmUgdG9cbiAgICBjb25zdCBldmVudHMgPSB5aWVsZCogUXVldWUudW5ib3VuZGVkPENka1dhdGNoRXZlbnQ+KClcblxuICAgIC8vIFN0YXRlIHRyYWNraW5nIGZvciBkZXBsb3kgc3RhdHVzIG1lc3NhZ2VzXG4gICAgbGV0IGlzRGVwbG95aW5nID0gZmFsc2VcbiAgICBsZXQgaXNGaXJzdERlcGxveSA9IHRydWVcbiAgICBjb25zdCBkaXNjb3ZlcmVkU3RhY2tzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAgIC8vIFBhdHRlcm5zIHRvIGRldGVjdCBDREsgd2F0Y2ggYmVoYXZpb3JcbiAgICBjb25zdCBkZXBsb3lDb21wbGV0ZVBhdHRlcm4gPSAv4pyFXFxzK1xcUyt8RGVwbG95bWVudCB0aW1lOi9cbiAgICBjb25zdCBkZXBsb3lTdGFydFBhdHRlcm4gPSAvRGVwbG95aW5nfGhvdHN3YXB8SG90c3dhcHBpbmd8QnVuZGxpbmcvaVxuICAgIGNvbnN0IG5vQ2hhbmdlc1BhdHRlcm4gPSAvbm8gY2hhbmdlc3xpZGVudGljYWx8dXAgdG8gZGF0ZS9pXG4gICAgY29uc3QgZXJyb3JQYXR0ZXJuID0gL2Vycm9yfGZhaWxlZHxFcnJvcnxGYWlsZWR8RVJSIS9pXG4gICAgY29uc3Qgc3RhY2tOYW1lUGF0dGVybiA9IC9eKFxcUyspOlxccypkZXBsb3lpbmd84pyFXFxzKyhcXFMrKS9cblxuICAgIC8vIE1lcmdlIHN0ZG91dCBhbmQgc3RkZXJyLCBkZWNvZGUgdG8gdGV4dCwgc3BsaXQgaW50byBsaW5lc1xuICAgIGNvbnN0IG91dHB1dFN0cmVhbSA9IFN0cmVhbS5tZXJnZShwcm9jLnN0ZG91dCwgcHJvYy5zdGRlcnIpLnBpcGUoXG4gICAgICBTdHJlYW0uZGVjb2RlVGV4dCgpLFxuICAgICAgU3RyZWFtLnNwbGl0TGluZXMsXG4gICAgKVxuXG4gICAgLy8gRm9yayBzdHJlYW0gcHJvY2Vzc2luZyBpbiBiYWNrZ3JvdW5kXG4gICAgeWllbGQqIG91dHB1dFN0cmVhbS5waXBlKFxuICAgICAgU3RyZWFtLnJ1bkZvckVhY2goKGxpbmUpID0+XG4gICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAvLyBMb2cgYWxsIG91dHB1dCBhdCBkZWJ1ZyBsZXZlbFxuICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoYFtDREtdICR7bGluZX1gKVxuXG4gICAgICAgICAgLy8gVHJ5IHRvIGV4dHJhY3Qgc3RhY2sgbmFtZVxuICAgICAgICAgIGNvbnN0IG1hdGNoID0gc3RhY2tOYW1lUGF0dGVybi5leGVjKGxpbmUudHJpbSgpKVxuICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgY29uc3Qgc3RhY2tOYW1lID0gbWF0Y2hbMV0gfHwgbWF0Y2hbMl1cbiAgICAgICAgICAgIGlmIChzdGFja05hbWUgJiYgIWRpc2NvdmVyZWRTdGFja3MuaGFzKHN0YWNrTmFtZSkpIHtcbiAgICAgICAgICAgICAgZGlzY292ZXJlZFN0YWNrcy5hZGQoc3RhY2tOYW1lKVxuICAgICAgICAgICAgICB5aWVsZCogUXVldWUub2ZmZXIoZXZlbnRzLCB7XG4gICAgICAgICAgICAgICAgX3RhZzogXCJTdGFja0Rpc2NvdmVyZWRcIixcbiAgICAgICAgICAgICAgICBzdGFja05hbWUsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRGV0ZWN0IGRlcGxveSBzdGFydFxuICAgICAgICAgIGlmICghaXNEZXBsb3lpbmcgJiYgZGVwbG95U3RhcnRQYXR0ZXJuLnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgIGlzRGVwbG95aW5nID0gdHJ1ZVxuICAgICAgICAgICAgaWYgKCFpc0ZpcnN0RGVwbG95KSB7XG4gICAgICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcIltDREtdIERlcGxveWluZy4uLlwiKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIERldGVjdCBlcnJvcnMgLSBvdXRwdXQgaW1tZWRpYXRlbHlcbiAgICAgICAgICBpZiAoZXJyb3JQYXR0ZXJuLnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgIHlpZWxkKiBFZmZlY3Quc3luYygoKSA9PiBwcm9jZXNzLnN0ZGVyci53cml0ZShgJHtsaW5lfVxcbmApKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGZvciBkZXBsb3kgY29tcGxldGlvbiAob25seSB0cmlnZ2VyIG9uY2UgcGVyIGRlcGxveSBjeWNsZSlcbiAgICAgICAgICBpZiAoaXNEZXBsb3lpbmcgJiYgZGVwbG95Q29tcGxldGVQYXR0ZXJuLnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgIGlzRGVwbG95aW5nID0gZmFsc2VcbiAgICAgICAgICAgIGlzRmlyc3REZXBsb3kgPSBmYWxzZVxuICAgICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dJbmZvKFwiW0NES10gRGVwbG95IGNvbXBsZXRlXCIpXG4gICAgICAgICAgICAvLyBTbWFsbCBkZWxheSB0byBlbnN1cmUgQVdTIGhhcyBwcm9wYWdhdGVkIHRoZSBjaGFuZ2VzXG4gICAgICAgICAgICB5aWVsZCogRWZmZWN0LnNsZWVwKFwiMSBzZWNvbmRcIilcbiAgICAgICAgICAgIHlpZWxkKiBRdWV1ZS5vZmZlcihldmVudHMsIHsgX3RhZzogXCJEZXBsb3lDb21wbGV0ZVwiIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgZm9yIG5vIGNoYW5nZXNcbiAgICAgICAgICBpZiAobm9DaGFuZ2VzUGF0dGVybi50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICBpc0RlcGxveWluZyA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICAvLyBMb2cgZXJyb3JzIGFuZCBleGl0IGNvZGUgd2hlbiBzdHJlYW0gZW5kc1xuICAgICAgRWZmZWN0LnRhcEVycm9yKChlcnJvcikgPT5cbiAgICAgICAgRWZmZWN0LmxvZ0Vycm9yKGBbQ0RLXSBDREsgd2F0Y2ggZXJyb3I6ICR7ZXJyb3J9YCksXG4gICAgICApLFxuICAgICAgRWZmZWN0LmVuc3VyaW5nKFxuICAgICAgICBwcm9jLmV4aXRDb2RlLnBpcGUoXG4gICAgICAgICAgRWZmZWN0LmZsYXRNYXAoKGNvZGUpID0+XG4gICAgICAgICAgICBjb2RlICE9PSAwXG4gICAgICAgICAgICAgID8gRWZmZWN0LmxvZ0Vycm9yKGBbQ0RLXSBDREsgd2F0Y2ggZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YClcbiAgICAgICAgICAgICAgOiBFZmZlY3QubG9nRGVidWcoYFtDREtdIENESyB3YXRjaCBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKSxcbiAgICAgICAgICApLFxuICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbCgoKSA9PiBFZmZlY3Qudm9pZCksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICAgRWZmZWN0LmZvcmssXG4gICAgKVxuXG4gICAgcmV0dXJuIHsgcHJvY2VzczogcHJvYywgZXZlbnRzIH1cbiAgfSlcblxuLyoqXG4gKiBDb21tb24gQ0xJIG9wdGlvbnMuXG4gKi9cbmNvbnN0IHByb2ZpbGVPcHRpb24gPSBPcHRpb25zLnRleHQoXCJwcm9maWxlXCIpLnBpcGUoXG4gIE9wdGlvbnMub3B0aW9uYWwsXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFwiQVdTIHByb2ZpbGUgdG8gdXNlXCIpLFxuKVxuXG5jb25zdCByZWdpb25PcHRpb24gPSBPcHRpb25zLnRleHQoXCJyZWdpb25cIikucGlwZShcbiAgT3B0aW9ucy5vcHRpb25hbCxcbiAgT3B0aW9ucy53aXRoRGVzY3JpcHRpb24oXCJBV1MgcmVnaW9uXCIpLFxuKVxuXG5jb25zdCBxdWFsaWZpZXJPcHRpb24gPSBPcHRpb25zLnRleHQoXCJxdWFsaWZpZXJcIikucGlwZShcbiAgT3B0aW9ucy53aXRoRGVmYXVsdChcImhuYjY1OWZkc1wiKSxcbiAgT3B0aW9ucy53aXRoRGVzY3JpcHRpb24oXCJDREsgYm9vdHN0cmFwIHF1YWxpZmllclwiKSxcbilcblxuY29uc3Qgc3RhY2tzT3B0aW9uID0gT3B0aW9ucy50ZXh0KFwic3RhY2tzXCIpLnBpcGUoXG4gIE9wdGlvbnMub3B0aW9uYWwsXG4gIE9wdGlvbnMud2l0aERlc2NyaXB0aW9uKFxuICAgIFwiU3RhY2sgbmFtZXMgdG8gZGVwbG95IChjb21tYS1zZXBhcmF0ZWQsIGRlZmF1bHQ6IGFsbClcIixcbiAgKSxcbilcblxuY29uc3QgYWxsU3RhY2tzT3B0aW9uID0gT3B0aW9ucy5ib29sZWFuKFwiYWxsXCIpLnBpcGUoXG4gIE9wdGlvbnMud2l0aERlZmF1bHQoZmFsc2UpLFxuICBPcHRpb25zLndpdGhEZXNjcmlwdGlvbihcIkRlcGxveSBhbGwgc3RhY2tzIChsaWtlIGNkayBkZXBsb3kgLS1hbGwpXCIpLFxuKVxuXG5jb25zdCBkZWJ1Z09wdGlvbiA9IE9wdGlvbnMuYm9vbGVhbihcImRlYnVnXCIpLnBpcGUoXG4gIE9wdGlvbnMud2l0aERlZmF1bHQoZmFsc2UpLFxuICBPcHRpb25zLndpdGhEZXNjcmlwdGlvbihcIkVuYWJsZSBkZWJ1ZyBsb2dnaW5nXCIpLFxuKVxuXG5jb25zdCBpZGxlVGltZW91dE9wdGlvbiA9IE9wdGlvbnMuaW50ZWdlcihcImlkbGUtdGltZW91dFwiKS5waXBlKFxuICBPcHRpb25zLndpdGhEZWZhdWx0KERFRkFVTFRfSURMRV9USU1FT1VUX01TKSxcbiAgT3B0aW9ucy53aXRoRGVzY3JpcHRpb24oXG4gICAgXCJJZGxlIHRpbWVvdXQgaW4gbXMgYmVmb3JlIHN0b3BwaW5nIGNvbnRhaW5lcnMgKGRlZmF1bHQ6IDIzMDAwMClcIixcbiAgKSxcbilcblxuY29uc3QgcG9sbFRpbWVvdXRPcHRpb24gPSBPcHRpb25zLmludGVnZXIoXCJwb2xsLXRpbWVvdXRcIikucGlwZShcbiAgT3B0aW9ucy5vcHRpb25hbCxcbiAgT3B0aW9ucy53aXRoRGVzY3JpcHRpb24oXG4gICAgXCJQb2xsIHRpbWVvdXQgaW4gbXMgZm9yIFJ1bnRpbWUgQVBJIChkZWZhdWx0OiBpZGxlLXRpbWVvdXQgLSAxMHMpLiBNdXN0IGJlIHNob3J0ZXIgdGhhbiBpZGxlLXRpbWVvdXQuXCIsXG4gICksXG4pXG5cbi8qKlxuICogTG9jYWwgY29tbWFuZCBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgY29uc3QgbG9jYWxDb21tYW5kID0gQ29tbWFuZC5tYWtlKFxuICBcImxvY2FsXCIsXG4gIHtcbiAgICBwcm9maWxlOiBwcm9maWxlT3B0aW9uLFxuICAgIHJlZ2lvbjogcmVnaW9uT3B0aW9uLFxuICAgIHF1YWxpZmllcjogcXVhbGlmaWVyT3B0aW9uLFxuICAgIHN0YWNrczogc3RhY2tzT3B0aW9uLFxuICAgIGFsbDogYWxsU3RhY2tzT3B0aW9uLFxuICAgIGRlYnVnOiBkZWJ1Z09wdGlvbixcbiAgICBpZGxlVGltZW91dDogaWRsZVRpbWVvdXRPcHRpb24sXG4gICAgcG9sbFRpbWVvdXQ6IHBvbGxUaW1lb3V0T3B0aW9uLFxuICB9LFxuICAoe1xuICAgIHByb2ZpbGUsXG4gICAgcmVnaW9uLFxuICAgIHF1YWxpZmllcixcbiAgICBzdGFja3MsXG4gICAgYWxsLFxuICAgIGRlYnVnLFxuICAgIGlkbGVUaW1lb3V0LFxuICAgIHBvbGxUaW1lb3V0LFxuICB9KSA9PiB7XG4gICAgY29uc3QgbG9nTGV2ZWwgPSBkZWJ1ZyA/IExvZ0xldmVsLkRlYnVnIDogTG9nTGV2ZWwuSW5mb1xuICAgIHJldHVybiBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oXCJbTG9jYWxdIFN0YXJ0aW5nIGxvY2FsIExhbWJkYSBkZXZlbG9wbWVudC4uLlwiKVxuXG4gICAgICBjb25zdCBwcm9maWxlVmFsdWUgPSBwcm9maWxlLl90YWcgPT09IFwiU29tZVwiID8gcHJvZmlsZS52YWx1ZSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgcmVnaW9uVmFsdWUgPSByZWdpb24uX3RhZyA9PT0gXCJTb21lXCIgPyByZWdpb24udmFsdWUgOiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IHN0YWNrc0Zyb21PcHRpb24gPVxuICAgICAgICBzdGFja3MuX3RhZyA9PT0gXCJTb21lXCJcbiAgICAgICAgICA/IHN0YWNrcy52YWx1ZS5zcGxpdChcIixcIikubWFwKChzKSA9PiBzLnRyaW0oKSlcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICAvLyBQb2xsIHRpbWVvdXQgc2hvdWxkIGJlIHNob3J0ZXIgdGhhbiBpZGxlIHRpbWVvdXQgc28gY29udGFpbmVycyBleGl0IG5hdHVyYWxseVxuICAgICAgLy8gYmVmb3JlIHdlIHRyeSB0byBzdG9wIHRoZW0uIERlZmF1bHQ6IGlkbGUgdGltZW91dCAtIDEwIHNlY29uZHMuXG4gICAgICBjb25zdCBlZmZlY3RpdmVQb2xsVGltZW91dCA9XG4gICAgICAgIHBvbGxUaW1lb3V0Ll90YWcgPT09IFwiU29tZVwiXG4gICAgICAgICAgPyBwb2xsVGltZW91dC52YWx1ZVxuICAgICAgICAgIDogTWF0aC5tYXgoaWRsZVRpbWVvdXQgLSAxMF8wMDAsIDVfMDAwKSAvLyBBdCBsZWFzdCA1IHNlY29uZHNcblxuICAgICAgaWYgKHByb2ZpbGVWYWx1ZSkge1xuICAgICAgICBwcm9jZXNzLmVudi5BV1NfUFJPRklMRSA9IHByb2ZpbGVWYWx1ZVxuICAgICAgfVxuICAgICAgaWYgKHJlZ2lvblZhbHVlKSB7XG4gICAgICAgIHByb2Nlc3MuZW52LkFXU19SRUdJT04gPSByZWdpb25WYWx1ZVxuICAgICAgfVxuXG4gICAgICAvLyBCb290c3RyYXAgY2hlY2sgbXVzdCBjb21wbGV0ZSBmaXJzdFxuICAgICAgeWllbGQqIGVuc3VyZUJvb3RzdHJhcCh7XG4gICAgICAgIHF1YWxpZmllcixcbiAgICAgICAgLi4uKHByb2ZpbGVWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHsgcHJvZmlsZTogcHJvZmlsZVZhbHVlIH0pLFxuICAgICAgICAuLi4ocmVnaW9uVmFsdWUgIT09IHVuZGVmaW5lZCAmJiB7IHJlZ2lvbjogcmVnaW9uVmFsdWUgfSksXG4gICAgICB9KVxuXG4gICAgICAvLyBTdGFjayBmaWx0ZXIgLSBwb3B1bGF0ZWQgZnJvbSBDREsgd2F0Y2ggb3V0cHV0LCB1c2VkIHRvIGZpbHRlciBMYW1iZGEgZGlzY292ZXJ5XG4gICAgICAvLyBVc2luZyBvYmplY3Qgc28gY2xvc3VyZSBpbiBzdGFydE9yVXBkYXRlRGFlbW9uIHNlZXMgdXBkYXRlc1xuICAgICAgY29uc3QgZmlsdGVyU3RhdGUgPSB7IHN0YWNrczogc3RhY2tzRnJvbU9wdGlvbiA/PyAoW10gYXMgc3RyaW5nW10pIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgbG9uZy1saXZlZCBzY29wZSBmb3IgYWxsIFJ1bnRpbWUgQVBJIHNlcnZlcnMgYW5kIENESyB3YXRjaCBwcm9jZXNzXG4gICAgICAvLyBSZXNvdXJjZXMgd2lsbCBydW4gdW50aWwgdGhpcyBzY29wZSBpcyBjbG9zZWQgKHdoZW4gdGhlIHByb2dyYW0gZW5kcylcbiAgICAgIGNvbnN0IHNlcnZlclNjb3BlID0geWllbGQqIFNjb3BlLm1ha2UoKVxuXG4gICAgICAvLyBTdGFydCBDREsgd2F0Y2ggaW1tZWRpYXRlbHkgYWZ0ZXIgYm9vdHN0cmFwXG4gICAgICAvLyBTdGFjayBuYW1lcyBhcmUgZGlzY292ZXJlZCBmcm9tIENESyB3YXRjaCBvdXRwdXQgKG5vIG5lZWQgZm9yIHNlcGFyYXRlIGNkayBscylcbiAgICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcIltDREtdIERlcGxveWluZy4uLlwiKVxuXG4gICAgICBjb25zdCB7IHByb2Nlc3M6IGNka1dhdGNoUHJvY2VzcywgZXZlbnRzOiBjZGtFdmVudHMgfSA9XG4gICAgICAgIHlpZWxkKiBzdGFydENka1dhdGNoKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByb2ZpbGU6IHByb2ZpbGVWYWx1ZSxcbiAgICAgICAgICAgIHJlZ2lvbjogcmVnaW9uVmFsdWUsXG4gICAgICAgICAgICBzdGFja3M6IHN0YWNrc0Zyb21PcHRpb24sXG4gICAgICAgICAgICBhbGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXJ2ZXJTY29wZSxcbiAgICAgICAgKVxuXG4gICAgICAvLyBUcmFjayBydW5uaW5nIERvY2tlciBjb250YWluZXJzIGJ5IGZ1bmN0aW9uIG5hbWVcbiAgICAgIGNvbnN0IGNvbnRhaW5lcnMgPSB5aWVsZCogUmVmLm1ha2U8TWFwPHN0cmluZywgRnVuY3Rpb25Db250YWluZXI+PihcbiAgICAgICAgbmV3IE1hcCgpLFxuICAgICAgKVxuXG4gICAgICAvLyBUcmFjayBydW5uaW5nIE5vZGUuanMgd29ya2VycyBieSBmdW5jdGlvbiBuYW1lXG4gICAgICBjb25zdCB3b3JrZXJzID0geWllbGQqIFJlZi5tYWtlPE1hcDxzdHJpbmcsIE5vZGVqc1dvcmtlcj4+KG5ldyBNYXAoKSlcblxuICAgICAgLy8gVHJhY2sgcmVnaXN0ZXJlZCBmdW5jdGlvbnMgKGZvciBsYXp5IGNvbnRhaW5lci93b3JrZXIgc3RhcnR1cClcbiAgICAgIGNvbnN0IHJlZ2lzdGVyZWRGdW5jdGlvbnMgPSB5aWVsZCogUmVmLm1ha2U8XG4gICAgICAgIE1hcDxzdHJpbmcsIERpc2NvdmVyZWRGdW5jdGlvbj5cbiAgICAgID4obmV3IE1hcCgpKVxuXG4gICAgICAvLyBUcmFjayBEb2NrZXIgZnVuY3Rpb25zIHdpdGggYWN0aXZlIGZpbGUgd2F0Y2hlcnNcbiAgICAgIGNvbnN0IHdhdGNoZWREb2NrZXJGdW5jdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gICAgICAvLyBJbnZvY2F0aW9uIHRyYWNraW5nIGZvciBpbXByb3ZlZCBsb2dnaW5nIG91dHB1dFxuICAgICAgY29uc3QgaW52b2NhdGlvbkNvdW50ZXIgPSB5aWVsZCogUmVmLm1ha2U8bnVtYmVyPigwKVxuICAgICAgLy8gVXNlIGEgcGxhaW4gTWFwIGZvciBpbnZvY2F0aW9uIGNvbnRleHRzIHNvIGl0IGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHN0cmVhbSBjYWxsYmFja3NcbiAgICAgIGNvbnN0IGludm9jYXRpb25Db250ZXh0cyA9IG5ldyBNYXA8c3RyaW5nLCBJbnZvY2F0aW9uQ29udGV4dD4oKVxuXG4gICAgICAvLyBQcm9qZWN0IHJvb3QgaXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKHdoZXJlIENESyBhcHAgbGl2ZXMpXG4gICAgICBjb25zdCBwcm9qZWN0Um9vdCA9IHByb2Nlc3MuY3dkKClcblxuICAgICAgbGV0IGFwcFN5bmNDbGllbnQ6IFJldHVyblR5cGU8dHlwZW9mIG1ha2VBcHBTeW5jQ2xpZW50PiB8IG51bGwgPSBudWxsXG5cbiAgICAgIC8vIFRyYWNrIGlmIHdlJ3ZlIGxvZ2dlZCB0aGUgXCJXYXRjaGluZ1wiIG1lc3NhZ2UgKG9ubHkgbG9nIG9uY2UpXG4gICAgICBjb25zdCBsb2dTdGF0ZSA9IHsgaGFzTG9nZ2VkV2F0Y2hpbmc6IGZhbHNlLCBoYXNEaXNjb3ZlcmVkT25jZTogZmFsc2UgfVxuXG4gICAgICAvLyBGdW5jdGlvbiB0byBzdGFydC91cGRhdGUgdGhlIGRhZW1vbiB3aXRoIGRpc2NvdmVyZWQgZnVuY3Rpb25zXG4gICAgICBjb25zdCBzdGFydE9yVXBkYXRlRGFlbW9uID0gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAvLyBPbmx5IHNob3cgXCJEaXNjb3ZlcmluZyBmdW5jdGlvbnMuLi5cIiBvbiBmaXJzdCBydW5cbiAgICAgICAgaWYgKCFsb2dTdGF0ZS5oYXNEaXNjb3ZlcmVkT25jZSkge1xuICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcIltMb2NhbF0gRGlzY292ZXJpbmcgZnVuY3Rpb25zLi4uXCIpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgQXBwU3luYyBlbmRwb2ludHMgKG1heSBuZWVkIHRvIHdhaXQgZm9yIGZpcnN0IGRlcGxveSlcbiAgICAgICAgaWYgKCFhcHBTeW5jQ2xpZW50KSB7XG4gICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhcbiAgICAgICAgICAgIFwiW0xvY2FsXSBSZWFkaW5nIEFwcFN5bmMgZW5kcG9pbnRzIGZyb20gU1NNLi4uXCIsXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnN0IGVuZHBvaW50cyA9IHlpZWxkKiBnZXRBcHBTeW5jRW5kcG9pbnRzKHF1YWxpZmllcikucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5yZXRyeSh7IHRpbWVzOiAxMCwgc2NoZWR1bGU6IFNjaGVkdWxlLnNwYWNlZChcIjMgc2Vjb25kc1wiKSB9KSxcbiAgICAgICAgICApXG4gICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhcbiAgICAgICAgICAgIGBbTG9jYWxdIEhUVFAgZW5kcG9pbnQ6ICR7ZW5kcG9pbnRzLmh0dHBFbmRwb2ludH1gLFxuICAgICAgICAgIClcbiAgICAgICAgICBhcHBTeW5jQ2xpZW50ID0gbWFrZUFwcFN5bmNDbGllbnQoZW5kcG9pbnRzKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlzY292ZXIgZnVuY3Rpb25zIChmaWx0ZXJlZCB0byBzdGFja3MgaW4gdGhpcyBDREsgcHJvamVjdClcbiAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhcIltMb2NhbF0gRGlzY292ZXJpbmcgTGFtYmRhIGZ1bmN0aW9ucy4uLlwiKVxuICAgICAgICBjb25zdCBmdW5jdGlvbnMgPSB5aWVsZCogZGlzY292ZXJGdW5jdGlvbnMoZmlsdGVyU3RhdGUuc3RhY2tzKVxuXG4gICAgICAgIGlmIChmdW5jdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dJbmZvKFxuICAgICAgICAgICAgXCJbTG9jYWxdIE5vIGZ1bmN0aW9ucyBmb3VuZCB3aXRoIGxpdmUtbGFtYmRhIHRhZ3MgeWV0LiBIYXZlIHlvdSBwYXRjaGVkIHlvdXIgQ0RLIHByb2plY3QgKGJvb3RzdHJhcCkgYW5kIGFkZGVkIHRoZSBMaXZlTGFtYmRhQXNwZWN0P1wiLFxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZWdpc3RlcmVkID0geWllbGQqIFJlZi5nZXQocmVnaXN0ZXJlZEZ1bmN0aW9ucylcblxuICAgICAgICAvLyBDb2xsZWN0IG5ldyBmdW5jdGlvbnMgdG8gcmVnaXN0ZXJcbiAgICAgICAgY29uc3QgbmV3RnVuY3Rpb25zOiBBcnJheTx7XG4gICAgICAgICAgZm46IERpc2NvdmVyZWRGdW5jdGlvblxuICAgICAgICAgIGlzRG9ja2VyOiBib29sZWFuXG4gICAgICAgIH0+ID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGZuIG9mIGZ1bmN0aW9ucykge1xuICAgICAgICAgIGNvbnN0IGlzRG9ja2VyID0gQm9vbGVhbihmbi5kb2NrZXJDb250ZXh0UGF0aClcbiAgICAgICAgICBjb25zdCBpc05vZGVqcyA9ICFpc0RvY2tlciAmJiBCb29sZWFuKGZuLmxvY2FsSGFuZGxlcilcblxuICAgICAgICAgIGlmICghaXNEb2NrZXIgJiYgIWlzTm9kZWpzKSB7XG4gICAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKFxuICAgICAgICAgICAgICBgW0xvY2FsXSBTa2lwcGluZyAke2ZuLmZ1bmN0aW9uTmFtZX0gLSBubyBEb2NrZXIgY29udGV4dCBvciBsb2NhbCBoYW5kbGVyYCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGN1cnJlbnRSZWdpc3RlcmVkLmhhcyhmbi5mdW5jdGlvbk5hbWUpKSB7XG4gICAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0RlYnVnKFxuICAgICAgICAgICAgICBgW0xvY2FsXSBBbHJlYWR5IHdhdGNoaW5nICR7Zm4uZnVuY3Rpb25OYW1lfWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5ld0Z1bmN0aW9ucy5wdXNoKHsgZm4sIGlzRG9ja2VyIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmludCBzdW1tYXJ5IG9mIGRpc2NvdmVyZWQgZnVuY3Rpb25zXG4gICAgICAgIGlmIChuZXdGdW5jdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSBuZXdGdW5jdGlvbnNcbiAgICAgICAgICAgIC5tYXAoKHsgZm4sIGlzRG9ja2VyIH0pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbW9kZSA9IGlzRG9ja2VyID8gXCJkb2NrZXJcIiA6IFwibm9kZVwiXG4gICAgICAgICAgICAgIGNvbnN0IHNob3J0TmFtZSA9IGZuLmZ1bmN0aW9uTmFtZS5pbmNsdWRlcyhcIi1cIilcbiAgICAgICAgICAgICAgICA/IGZuLmZ1bmN0aW9uTmFtZS5zcGxpdChcIi1cIikuc2xpY2UoLTIsIC0xKVswXSB8fCBmbi5mdW5jdGlvbk5hbWVcbiAgICAgICAgICAgICAgICA6IGZuLmZ1bmN0aW9uTmFtZVxuICAgICAgICAgICAgICByZXR1cm4gYCR7c2hvcnROYW1lfSAoJHttb2RlfSlgXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oXCIsIFwiKVxuICAgICAgICAgIC8vIFVzZSBkaWZmZXJlbnQgbWVzc2FnZSBmb3IgZmlyc3QgZGlzY292ZXJ5IHZzIHN1YnNlcXVlbnRcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSBsb2dTdGF0ZS5oYXNEaXNjb3ZlcmVkT25jZVxuICAgICAgICAgICAgPyBcIltMb2NhbF0gRnVuY3Rpb25zIGFkZGVkOlwiXG4gICAgICAgICAgICA6IFwiW0xvY2FsXSBGdW5jdGlvbnM6XCJcbiAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oYCR7cHJlZml4fSAke3N1bW1hcnl9YClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlZ2lzdGVyIGZ1bmN0aW9ucyBhbmQgc2V0IHVwIHN1YnNjcmlwdGlvbnNcbiAgICAgICAgZm9yIChjb25zdCB7IGZuLCBpc0RvY2tlciB9IG9mIG5ld0Z1bmN0aW9ucykge1xuICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoXG4gICAgICAgICAgICBgW0xvY2FsXSBSZWdpc3RlcmluZyAke2ZuLmZ1bmN0aW9uTmFtZX0gKCR7aXNEb2NrZXIgPyBcIkRvY2tlclwiIDogXCJOb2RlLmpzXCJ9KWAsXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGZ1bmN0aW9uXG4gICAgICAgICAgY3VycmVudFJlZ2lzdGVyZWQuc2V0KGZuLmZ1bmN0aW9uTmFtZSwgZm4pXG5cbiAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gaW52b2NhdGlvbnMgZm9yIHRoaXMgZnVuY3Rpb25cbiAgICAgICAgICBjb25zdCBpbnZvY2F0aW9uQ2hhbm5lbCA9IGJ1aWxkQ2hhbm5lbE5hbWUuaW52b2NhdGlvbihmbi5mdW5jdGlvbk5hbWUpXG4gICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhcbiAgICAgICAgICAgIGBbTG9jYWxdIFN1YnNjcmliaW5nIHRvIGludm9jYXRpb25zIGZvciAke2ZuLmZ1bmN0aW9uTmFtZX1gLFxuICAgICAgICAgIClcblxuICAgICAgICAgIC8vIFN1YnNjcmliZSB1c2luZyBmb3JrRGFlbW9uIHRvIHJ1biBpbmRlcGVuZGVudGx5IHdpdGggY29udGV4dCBwcmVzZXJ2ZWRcbiAgICAgICAgICAvLyBSb3V0ZSB0byBEb2NrZXIgb3IgTm9kZS5qcyBoYW5kbGVyIGJhc2VkIG9uIGZ1bmN0aW9uIHR5cGVcbiAgICAgICAgICBpZiAoaXNEb2NrZXIpIHtcbiAgICAgICAgICAgIHlpZWxkKiBhcHBTeW5jQ2xpZW50IVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlVG9JbnZvY2F0aW9ucyhpbnZvY2F0aW9uQ2hhbm5lbClcbiAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgU3RyZWFtLnJ1bkZvckVhY2goKGludm9jYXRpb24pID0+XG4gICAgICAgICAgICAgICAgICBoYW5kbGVEb2NrZXJJbnZvY2F0aW9uKFxuICAgICAgICAgICAgICAgICAgICBmbixcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVycyxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyU2NvcGUsXG4gICAgICAgICAgICAgICAgICAgIHByb2plY3RSb290LFxuICAgICAgICAgICAgICAgICAgICBpZGxlVGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUG9sbFRpbWVvdXQsXG4gICAgICAgICAgICAgICAgICAgIGFwcFN5bmNDbGllbnQhLFxuICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ291bnRlcixcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNvbnRleHRzLFxuICAgICAgICAgICAgICAgICAgKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGwoKGVycm9yKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdC5sb2dFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBbTG9jYWxdIERvY2tlciBpbnZvY2F0aW9uIGVycm9yOiAke2Vycm9yfWAsXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBFZmZlY3QuZm9ya0RhZW1vbixcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB5aWVsZCogYXBwU3luY0NsaWVudCFcbiAgICAgICAgICAgICAgLnN1YnNjcmliZVRvSW52b2NhdGlvbnMoaW52b2NhdGlvbkNoYW5uZWwpXG4gICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIFN0cmVhbS5ydW5Gb3JFYWNoKChpbnZvY2F0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgaGFuZGxlTm9kZWpzSW52b2NhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgZm4sXG4gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHdvcmtlcnMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlclNjb3BlLFxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0Um9vdCxcbiAgICAgICAgICAgICAgICAgICAgYXBwU3luY0NsaWVudCEsXG4gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db3VudGVyLFxuICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ29udGV4dHMsXG4gICAgICAgICAgICAgICAgICApLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbCgoZXJyb3IpID0+XG4gICAgICAgICAgICAgICAgICAgICAgRWZmZWN0LmxvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYFtMb2NhbF0gTm9kZS5qcyBpbnZvY2F0aW9uIGVycm9yOiAke2Vycm9yfWAsXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBFZmZlY3QuZm9ya0RhZW1vbixcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHlpZWxkKiBSZWYuc2V0KHJlZ2lzdGVyZWRGdW5jdGlvbnMsIGN1cnJlbnRSZWdpc3RlcmVkKVxuXG4gICAgICAgIC8vIFN0YXJ0IGZpbGUgd2F0Y2hlcnMgZm9yIG5ldyBEb2NrZXIgZnVuY3Rpb25zXG4gICAgICAgIGNvbnN0IG5ld0RvY2tlckZ1bmN0aW9uczogV2F0Y2hlZERvY2tlckZ1bmN0aW9uW10gPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IGZuIG9mIGZ1bmN0aW9ucykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGZuLmRvY2tlckNvbnRleHRQYXRoICYmXG4gICAgICAgICAgICAhd2F0Y2hlZERvY2tlckZ1bmN0aW9ucy5oYXMoZm4uZnVuY3Rpb25OYW1lKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgY29udGV4dCBwYXRoXG4gICAgICAgICAgICBjb25zdCBjb250ZXh0UGF0aCA9IGZuLmRvY2tlckNvbnRleHRQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpXG4gICAgICAgICAgICAgID8gZm4uZG9ja2VyQ29udGV4dFBhdGhcbiAgICAgICAgICAgICAgOiBgJHtwcm9qZWN0Um9vdH0vJHtmbi5kb2NrZXJDb250ZXh0UGF0aH1gXG5cbiAgICAgICAgICAgIG5ld0RvY2tlckZ1bmN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgZnVuY3Rpb25JZDogZm4uZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgICBkb2NrZXJDb250ZXh0UGF0aDogY29udGV4dFBhdGgsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgd2F0Y2hlZERvY2tlckZ1bmN0aW9ucy5hZGQoZm4uZnVuY3Rpb25OYW1lKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXJ0IHdhdGNoaW5nIG5ldyBEb2NrZXIgY29udGV4dHNcbiAgICAgICAgaWYgKG5ld0RvY2tlckZ1bmN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhcbiAgICAgICAgICAgIGBbTG9jYWxdIFN0YXJ0aW5nIGZpbGUgd2F0Y2hlcnMgZm9yICR7bmV3RG9ja2VyRnVuY3Rpb25zLmxlbmd0aH0gRG9ja2VyIGZ1bmN0aW9uKHMpLi4uYCxcbiAgICAgICAgICApXG5cbiAgICAgICAgICAvLyBGb3JrIGEgZGFlbW9uIGZpYmVyIHRvIGhhbmRsZSBmaWxlIGNoYW5nZSBldmVudHMgd2l0aCBjb250ZXh0IHByZXNlcnZlZFxuICAgICAgICAgIHlpZWxkKiB3YXRjaERvY2tlckNvbnRleHRzKG5ld0RvY2tlckZ1bmN0aW9ucywgNTAwKS5waXBlKFxuICAgICAgICAgICAgU3RyZWFtLnJ1bkZvckVhY2goKGV2ZW50KSA9PlxuICAgICAgICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dEZWJ1ZyhcbiAgICAgICAgICAgICAgICAgIGBbTG9jYWxdIEZpbGUgY2hhbmdlZCBpbiAke2V2ZW50LmZ1bmN0aW9uSWR9OiAke2V2ZW50LmZpbGVQYXRofWAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHlpZWxkKiByZWJ1aWxkRG9ja2VyQ29udGFpbmVyKFxuICAgICAgICAgICAgICAgICAgZXZlbnQuZnVuY3Rpb25JZCxcbiAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcnMsXG4gICAgICAgICAgICAgICAgICBwcm9qZWN0Um9vdCxcbiAgICAgICAgICAgICAgICApLnBpcGUoXG4gICAgICAgICAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGwoKGVycm9yKSA9PlxuICAgICAgICAgICAgICAgICAgICBFZmZlY3QubG9nRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgYFtMb2NhbF0gUmVidWlsZCBmYWlsZWQgZm9yICR7ZXZlbnQuZnVuY3Rpb25JZH06ICR7ZXJyb3J9YCxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBFZmZlY3QuZm9ya0RhZW1vbixcbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWxvZ1N0YXRlLmhhc0xvZ2dlZFdhdGNoaW5nKSB7XG4gICAgICAgICAgbG9nU3RhdGUuaGFzTG9nZ2VkV2F0Y2hpbmcgPSB0cnVlXG4gICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dJbmZvKFwiW0xvY2FsXSBSZWFkeSBmb3IgaW52b2NhdGlvbnNcIilcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgdGhhdCB3ZSd2ZSBjb21wbGV0ZWQgZmlyc3QgZGlzY292ZXJ5XG4gICAgICAgIGxvZ1N0YXRlLmhhc0Rpc2NvdmVyZWRPbmNlID0gdHJ1ZVxuICAgICAgfSlcblxuICAgICAgLy8gSGFuZGxlIENESyB3YXRjaCBldmVudHMgKHN0YWNrIGRpc2NvdmVyeSBhbmQgZGVwbG95IGNvbXBsZXRpb24pXG4gICAgICB5aWVsZCogUXVldWUudGFrZShjZGtFdmVudHMpLnBpcGUoXG4gICAgICAgIEVmZmVjdC5mbGF0TWFwKChldmVudCkgPT5cbiAgICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50Ll90YWcpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIlN0YWNrRGlzY292ZXJlZFwiOlxuICAgICAgICAgICAgICAgIC8vIEFkZCBkaXNjb3ZlcmVkIHN0YWNrIHRvIGZpbHRlciAoaWYgbm90IHVzaW5nIC0tc3RhY2tzKVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICFzdGFja3NGcm9tT3B0aW9uICYmXG4gICAgICAgICAgICAgICAgICAhZmlsdGVyU3RhdGUuc3RhY2tzLmluY2x1ZGVzKGV2ZW50LnN0YWNrTmFtZSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGZpbHRlclN0YXRlLnN0YWNrcy5wdXNoKGV2ZW50LnN0YWNrTmFtZSlcbiAgICAgICAgICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nRGVidWcoXG4gICAgICAgICAgICAgICAgICAgIGBbTG9jYWxdIERpc2NvdmVyZWQgc3RhY2s6ICR7ZXZlbnQuc3RhY2tOYW1lfWAsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgXCJEZXBsb3lDb21wbGV0ZVwiOlxuICAgICAgICAgICAgICAgIC8vIFJ1biBkYWVtb24gdXBkYXRlIG9uIGRlcGxveSBjb21wbGV0aW9uXG4gICAgICAgICAgICAgICAgeWllbGQqIHN0YXJ0T3JVcGRhdGVEYWVtb24ucGlwZShcbiAgICAgICAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbCgoZXJyb3IpID0+XG4gICAgICAgICAgICAgICAgICAgIEVmZmVjdC5sb2dFcnJvcihgRmFpbGVkIHRvIHVwZGF0ZSBkYWVtb246ICR7ZXJyb3J9YCksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgICBFZmZlY3QuZm9yZXZlcixcbiAgICAgICAgRWZmZWN0LmZvcmssXG4gICAgICApXG5cbiAgICAgIC8vIEhhbmRsZSBjbGVhbnVwIG9uIGV4aXRcbiAgICAgIGNvbnN0IGNsZWFudXAgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IEVmZmVjdC5ydW5Qcm9taXNlKFxuICAgICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcIlxcblNodXR0aW5nIGRvd24uLi5cIilcblxuICAgICAgICAgICAgLy8gU3RvcCBDREsgd2F0Y2hcbiAgICAgICAgICAgIHlpZWxkKiBjZGtXYXRjaFByb2Nlc3NcbiAgICAgICAgICAgICAgLmtpbGwoXCJTSUdURVJNXCIpXG4gICAgICAgICAgICAgIC5waXBlKEVmZmVjdC5jYXRjaEFsbCgoKSA9PiBFZmZlY3Qudm9pZCkpXG5cbiAgICAgICAgICAgIC8vIFN0b3AgYWxsIERvY2tlciBjb250YWluZXJzIHVzaW5nIHRoZSBEb2NrZXIgc2VydmljZVxuICAgICAgICAgICAgY29uc3QgZG9ja2VyID0geWllbGQqIERvY2tlclxuICAgICAgICAgICAgY29uc3QgY3VycmVudENvbnRhaW5lcnMgPSB5aWVsZCogUmVmLmdldChjb250YWluZXJzKVxuICAgICAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgY29udGFpbmVyXSBvZiBjdXJyZW50Q29udGFpbmVycykge1xuICAgICAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0luZm8oYFN0b3BwaW5nIGNvbnRhaW5lcjogJHtuYW1lfWApXG4gICAgICAgICAgICAgIHlpZWxkKiBkb2NrZXIuc3RvcChjb250YWluZXIuY29udGFpbmVyTmFtZSkucGlwZShcbiAgICAgICAgICAgICAgICBFZmZlY3Quc2NvcGVkLFxuICAgICAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbCgoKSA9PiBFZmZlY3Qudm9pZCksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3RvcCBhbGwgTm9kZS5qcyB3b3JrZXJzXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50V29ya2VycyA9IHlpZWxkKiBSZWYuZ2V0KHdvcmtlcnMpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB3b3JrZXJdIG9mIGN1cnJlbnRXb3JrZXJzKSB7XG4gICAgICAgICAgICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhgU3RvcHBpbmcgd29ya2VyOiAke25hbWV9YClcbiAgICAgICAgICAgICAgeWllbGQqIEVmZmVjdC50cnkoKCkgPT5cbiAgICAgICAgICAgICAgICB3b3JrZXIud29ya2VyUHJvY2Vzcy5raWxsKFwiU0lHVEVSTVwiKSxcbiAgICAgICAgICAgICAgKS5waXBlKEVmZmVjdC5jYXRjaEFsbCgoKSA9PiBFZmZlY3Qudm9pZCkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENsb3NlIHRoZSBzZXJ2ZXIgc2NvcGUgdG8gY2xlYW4gdXAgUnVudGltZSBBUEkgc2VydmVyc1xuICAgICAgICAgICAgeWllbGQqIFNjb3BlLmNsb3NlKHNlcnZlclNjb3BlLCBFeGl0LnZvaWQpXG4gICAgICAgICAgfSkucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5wcm92aWRlKERvY2tlckxpdmUpLFxuICAgICAgICAgICAgRWZmZWN0LnByb3ZpZGUoQnVuQ29udGV4dC5sYXllciksXG4gICAgICAgICAgICBFZmZlY3QucHJvdmlkZShMb2dnZXIucHJldHR5KSxcbiAgICAgICAgICAgIEVmZmVjdC5wcm92aWRlKExvZ2dlci5taW5pbXVtTG9nTGV2ZWwobG9nTGV2ZWwpKSxcbiAgICAgICAgICApLFxuICAgICAgICApXG5cbiAgICAgICAgcHJvY2Vzcy5leGl0KDApXG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgY2xlYW51cClcbiAgICAgIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIGNsZWFudXApXG5cbiAgICAgIHlpZWxkKiBFZmZlY3QubG9nSW5mbyhcIltMb2NhbF0gUHJlc3MgQ3RybCtDIHRvIHN0b3BcIilcblxuICAgICAgLy8gS2VlcCB0aGUgcHJvY2VzcyBydW5uaW5nXG4gICAgICB5aWVsZCogRWZmZWN0Lm5ldmVyXG4gICAgfSkucGlwZShcbiAgICAgIEVmZmVjdC5wcm92aWRlKExvZ2dlci5wcmV0dHkpLFxuICAgICAgRWZmZWN0LnByb3ZpZGUoTG9nZ2VyLm1pbmltdW1Mb2dMZXZlbChsb2dMZXZlbCkpLFxuICAgIClcbiAgfSxcbikucGlwZShcbiAgQ29tbWFuZC53aXRoRGVzY3JpcHRpb24oXG4gICAgXCJTdGFydCBsb2NhbCBMYW1iZGEgZGV2ZWxvcG1lbnQgd2l0aCBDREsgd2F0Y2ggYW5kIERvY2tlciBjb250YWluZXJzXCIsXG4gICksXG4pXG4iXX0=
|