velocious 1.0.633 → 1.0.635
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 +21 -1
- package/build/background-jobs/lifecycle-client.js +1 -1
- package/build/background-jobs/lifecycle-control-server.js +1 -1
- package/build/background-jobs/main.js +9 -3
- package/build/cli/commands/db/migrate.js +3 -1
- package/build/cli/commands/db/tenants/migrate.js +4 -1
- package/build/cli/commands/db/tenants/migrations/pending.js +4 -1
- package/build/cli/index.js +1 -1
- package/build/cli/migration-execution-phase-argument.js +20 -0
- package/build/database/migration/index.js +21 -0
- package/build/database/migration-execution-phase.js +34 -0
- package/build/database/migrator.js +6 -1
- package/build/src/background-jobs/lifecycle-client.d.ts +1 -1
- package/build/src/background-jobs/lifecycle-client.d.ts.map +1 -1
- package/build/src/background-jobs/lifecycle-client.js +2 -2
- package/build/src/background-jobs/lifecycle-control-server.js +2 -2
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +11 -4
- package/build/src/cli/commands/db/migrate.d.ts.map +1 -1
- package/build/src/cli/commands/db/migrate.js +4 -2
- package/build/src/cli/commands/db/tenants/migrate.d.ts.map +1 -1
- package/build/src/cli/commands/db/tenants/migrate.js +5 -2
- package/build/src/cli/commands/db/tenants/migrations/pending.d.ts.map +1 -1
- package/build/src/cli/commands/db/tenants/migrations/pending.js +5 -2
- package/build/src/cli/index.js +2 -2
- package/build/src/cli/migration-execution-phase-argument.d.ts +7 -0
- package/build/src/cli/migration-execution-phase-argument.d.ts.map +1 -0
- package/build/src/cli/migration-execution-phase-argument.js +17 -0
- package/build/src/database/migration/index.d.ts +13 -0
- package/build/src/database/migration/index.d.ts.map +1 -1
- package/build/src/database/migration/index.js +19 -1
- package/build/src/database/migration-execution-phase.d.ts +18 -0
- package/build/src/database/migration-execution-phase.d.ts.map +1 -0
- package/build/src/database/migration-execution-phase.js +30 -0
- package/build/src/database/migrator.d.ts +4 -1
- package/build/src/database/migrator.d.ts.map +1 -1
- package/build/src/database/migrator.js +9 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/background-jobs/lifecycle-client.js +1 -1
- package/src/background-jobs/lifecycle-control-server.js +1 -1
- package/src/background-jobs/main.js +9 -3
- package/src/cli/commands/db/migrate.js +3 -1
- package/src/cli/commands/db/tenants/migrate.js +4 -1
- package/src/cli/commands/db/tenants/migrations/pending.js +4 -1
- package/src/cli/index.js +1 -1
- package/src/cli/migration-execution-phase-argument.js +20 -0
- package/src/database/migration/index.js +21 -0
- package/src/database/migration-execution-phase.js +34 -0
- package/src/database/migrator.js +6 -1
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
import { convertLegacyDateValueToUtcStorage } from "../datetime-storage.js";
|
|
27
27
|
import * as inflection from "inflection";
|
|
28
28
|
import restArgsError from "../../utils/rest-args-error.js";
|
|
29
|
+
import { DEFAULT_MIGRATION_EXECUTION_PHASE, migrationExecutionPhase } from "../migration-execution-phase.js";
|
|
29
30
|
import ChangeTable from "./change-table.js";
|
|
30
31
|
import CreateIndexBase from "../query/create-index-base.js";
|
|
31
32
|
import TableColumn from "../table-data/table-column.js";
|
|
@@ -35,6 +36,23 @@ class NotImplementedError extends Error {
|
|
|
35
36
|
}
|
|
36
37
|
export { NotImplementedError };
|
|
37
38
|
export default class VelociousDatabaseMigration {
|
|
39
|
+
/** @type {import("../migration-execution-phase.js").MigrationExecutionPhase | undefined} */
|
|
40
|
+
static _executionPhase;
|
|
41
|
+
/**
|
|
42
|
+
* Declares when this migration is eligible to run.
|
|
43
|
+
* @param {import("../migration-execution-phase.js").MigrationExecutionPhase} phase - Execution phase.
|
|
44
|
+
* @returns {void} - No return value.
|
|
45
|
+
*/
|
|
46
|
+
static runInPhase(phase) {
|
|
47
|
+
this._executionPhase = migrationExecutionPhase(phase);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Gets the declared execution phase.
|
|
51
|
+
* @returns {import("../migration-execution-phase.js").MigrationExecutionPhase} - Declared execution phase.
|
|
52
|
+
*/
|
|
53
|
+
static getExecutionPhase() {
|
|
54
|
+
return this._executionPhase || DEFAULT_MIGRATION_EXECUTION_PHASE;
|
|
55
|
+
}
|
|
38
56
|
/**
|
|
39
57
|
* Runs on databases.
|
|
40
58
|
* @param {string[]} databaseIdentifiers - Database identifiers.
|
|
@@ -837,4 +855,4 @@ export function dedicatedAuditTableName(modelTableName) {
|
|
|
837
855
|
}
|
|
838
856
|
return `${modelTableName}_audits`;
|
|
839
857
|
}
|
|
840
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvbWlncmF0aW9uL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWiwrRkFBK0Y7QUFDL0Y7Ozs7O0dBS0c7QUFDSDs7Ozs7R0FLRztBQUNIOzs7R0FHRztBQUNIOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQzNFLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sYUFBYSxNQUFNLGdDQUFnQyxDQUFBO0FBQzFELE9BQU8sV0FBVyxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sZUFBZSxNQUFNLCtCQUErQixDQUFBO0FBQzNELE9BQU8sV0FBVyxNQUFNLCtCQUErQixDQUFBO0FBQ3ZELE9BQU8sU0FBUyxNQUFNLHdCQUF3QixDQUFBO0FBQzlDLE9BQU8sVUFBVSxNQUFNLDhCQUE4QixDQUFBO0FBQ3JELE1BQU0sbUJBQW9CLFNBQVEsS0FBSztDQUFHO0FBRTFDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxDQUFBO0FBRTVCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sMEJBQTBCO0lBQzdDOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFDLG1CQUFtQjtRQUNwQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsbUJBQW1CLENBQUE7SUFDakQsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxzQkFBc0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUE7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFlBQVksRUFBQyxhQUFhLEVBQUUsa0JBQWtCLEdBQUcsU0FBUyxFQUFFLEVBQUUsRUFBQztRQUM3RCxJQUFJLENBQUMsa0JBQWtCO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO1FBQ3hF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QUFDLENBQUE7UUFFRixPQUFPLFVBQVUsQ0FBQTtJQUNuQixDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLGNBQWM7SUFDcEQsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNoRCxDQUFDO0lBRUQsT0FBTyxHQUFHLGNBQWMsU0FBUyxDQUFBO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi90YWJsZS1kYXRhL3RhYmxlLWNvbHVtbi5qc1wiKS5UYWJsZUNvbHVtbkFyZ3NUeXBlfSBBZGRDb2x1bW5BcmdzVHlwZSAqL1xuLyoqXG4gKiBDcmVhdGVUYWJsZUlkQXJnc1R5cGUgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IENyZWF0ZVRhYmxlSWRBcmdzVHlwZVxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gW2RlZmF1bHRdIC0gRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIElEIGNvbHVtbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdHlwZV0gLSBDb2x1bW4gdHlwZSBmb3IgdGhlIElEIGNvbHVtbi5cbiAqL1xuLyoqXG4gKiBDcmVhdGVUYWJsZUFyZ3NUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDcmVhdGVUYWJsZUFyZ3NUeXBlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZk5vdEV4aXN0c10gLSBTa2lwIGNyZWF0aW9uIGlmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cy5cbiAqIEBwcm9wZXJ0eSB7Q3JlYXRlVGFibGVJZEFyZ3NUeXBlIHwgZmFsc2V9IFtpZF0gLSBJRCBjb2x1bW4gb3B0aW9ucyBvciBmYWxzZSB0byBza2lwIElELlxuICovXG4vKipcbiAqIENyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7KHRhYmxlOiBUYWJsZURhdGEpID0+IHZvaWR9IENyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlXG4gKi9cbi8qKlxuICogTGVnYWN5TG9jYWxEYXRlVGltZXNNaWdyYXRpb25BcmdzVHlwZSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gTGVnYWN5TG9jYWxEYXRlVGltZXNNaWdyYXRpb25BcmdzVHlwZVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IFtjb2x1bW5zQnlUYWJsZV0gLSBFeHBsaWNpdCBkYXRldGltZSBjb2x1bW5zIGtleWVkIGJ5IHRhYmxlIG5hbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2xlZ2FjeUxvY2FsT2Zmc2V0TWludXRlc10gLSBVVEMtbWludXMtbG9jYWwgb2Zmc2V0IGluIG1pbnV0ZXMgZm9yIGxlZ2FjeSByb3dzLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3RhYmxlc10gLSBUYWJsZXMgdG8gbWlncmF0ZS4gRGVmYXVsdHMgdG8gYWxsIG5vbi1pbnRlcm5hbCB0YWJsZXMuXG4gKi9cblxuaW1wb3J0IHsgY29udmVydExlZ2FjeURhdGVWYWx1ZVRvVXRjU3RvcmFnZSB9IGZyb20gXCIuLi9kYXRldGltZS1zdG9yYWdlLmpzXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uLy4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5pbXBvcnQgQ2hhbmdlVGFibGUgZnJvbSBcIi4vY2hhbmdlLXRhYmxlLmpzXCJcbmltcG9ydCBDcmVhdGVJbmRleEJhc2UgZnJvbSBcIi4uL3F1ZXJ5L2NyZWF0ZS1pbmRleC1iYXNlLmpzXCJcbmltcG9ydCBUYWJsZUNvbHVtbiBmcm9tIFwiLi4vdGFibGUtZGF0YS90YWJsZS1jb2x1bW4uanNcIlxuaW1wb3J0IFRhYmxlRGF0YSBmcm9tIFwiLi4vdGFibGUtZGF0YS9pbmRleC5qc1wiXG5pbXBvcnQgVGFibGVJbmRleCBmcm9tIFwiLi4vdGFibGUtZGF0YS90YWJsZS1pbmRleC5qc1wiXG5jbGFzcyBOb3RJbXBsZW1lbnRlZEVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuZXhwb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yfVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNEYXRhYmFzZU1pZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBSdW5zIG9uIGRhdGFiYXNlcy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gZGF0YWJhc2VJZGVudGlmaWVycyAtIERhdGFiYXNlIGlkZW50aWZpZXJzLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzdGF0aWMgb25EYXRhYmFzZXMoZGF0YWJhc2VJZGVudGlmaWVycykge1xuICAgIHRoaXMuX2RhdGFiYXNlSWRlbnRpZmllcnMgPSBkYXRhYmFzZUlkZW50aWZpZXJzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgZGF0YWJhc2UgaWRlbnRpZmllcnMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXSB8IHVuZGVmaW5lZH0gLSBUaGUgZGF0YWJhc2UgaWRlbnRpZmllcnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0RGF0YWJhc2VJZGVudGlmaWVycygpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YWJhc2VJZGVudGlmaWVyc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5kYXRhYmFzZUlkZW50aWZpZXIgLSBEYXRhYmFzZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBhcmdzLmRiIC0gRGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBkYXRhYmFzZUlkZW50aWZpZXIgPSBcImRlZmF1bHRcIiwgZGJ9KSB7XG4gICAgaWYgKCFkYXRhYmFzZUlkZW50aWZpZXIpIHRocm93IG5ldyBFcnJvcihcIk5vIGRhdGFiYXNlIGlkZW50aWZpZXIgZ2l2ZW5cIilcbiAgICBpZiAoIWRiKSB0aHJvdyBuZXcgRXJyb3IoXCJObyAnZGInIGdpdmVuXCIpXG5cbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5fZGF0YWJhc2VJZGVudGlmaWVyID0gZGF0YWJhc2VJZGVudGlmaWVyXG4gICAgdGhpcy5fZGIgPSBkYlxuICB9XG5cbiAgX2dldERhdGFiYXNlSWRlbnRpZmllcigpIHtcbiAgICBpZiAoIXRoaXMuX2RhdGFiYXNlSWRlbnRpZmllcikgdGhyb3cgbmV3IEVycm9yKFwiTm8gZGF0YWJhc2UgaWRlbnRpZmllciBzZXRcIilcblxuICAgIHJldHVybiB0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBkcml2ZXIuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gLSBUaGUgZHJpdmVyLlxuICAgKi9cbiAgZ2V0RHJpdmVyKCkgeyByZXR1cm4gdGhpcy5fZGIgfVxuICBjb25uZWN0aW9uKCkgeyByZXR1cm4gdGhpcy5nZXREcml2ZXIoKSB9XG5cbiAgYXN5bmMgY2hhbmdlKCkge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFwiJ2NoYW5nZScgbm90IGltcGxlbWVudGVkXCIpXG4gIH1cblxuICBhc3luYyB1cCgpIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIidjaGFuZ2UnIG5vdCBpbXBsZW1lbnRlZFwiKVxuICB9XG5cbiAgYXN5bmMgZG93bigpIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIidjaGFuZ2UnIG5vdCBpbXBsZW1lbnRlZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZXhlY3V0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNxbCAtIFNRTCBzdHJpbmcuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS5qc1wiKS5RdWVyeVJlc3VsdFR5cGU+fSAtIFJlc29sdmVzIHdpdGggdGhlIGV4ZWN1dGUuXG4gICAqL1xuICBhc3luYyBleGVjdXRlKHNxbCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rpb24oKS5xdWVyeShzcWwpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZGQgY29sdW1uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtbk5hbWUgLSBDb2x1bW4gbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtblR5cGUgLSBDb2x1bW4gdHlwZS5cbiAgICogQHBhcmFtIHtBZGRDb2x1bW5BcmdzVHlwZX0gW2FyZ3NdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBhZGRDb2x1bW4odGFibGVOYW1lLCBjb2x1bW5OYW1lLCBjb2x1bW5UeXBlLCBhcmdzKSB7XG4gICAgaWYgKCFjb2x1bW5UeXBlKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb2x1bW4gdHlwZSBnaXZlblwiKVxuXG4gICAgY29uc3QgdGFibGVDb2x1bW5BcmdzID0gT2JqZWN0LmFzc2lnbih7aXNOZXdDb2x1bW46IHRydWUsIHR5cGU6IGNvbHVtblR5cGV9LCBhcmdzKVxuICAgIGNvbnN0IHRhYmxlRGF0YSA9IG5ldyBUYWJsZURhdGEodGFibGVOYW1lKVxuXG4gICAgdGFibGVEYXRhLmFkZENvbHVtbihjb2x1bW5OYW1lLCB0YWJsZUNvbHVtbkFyZ3MpXG5cbiAgICBjb25zdCBzcWxzID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5hbHRlclRhYmxlU1FMcyh0YWJsZURhdGEpXG5cbiAgICBmb3IgKGNvbnN0IHNxbCBvZiBzcWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLnF1ZXJ5KHNxbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZW1vdmUgY29sdW1uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtbk5hbWUgLSBDb2x1bW4gbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJlbW92ZUNvbHVtbih0YWJsZU5hbWUsIGNvbHVtbk5hbWUpIHtcbiAgICBjb25zdCB0YWJsZUNvbHVtbkFyZ3MgPSBPYmplY3QuYXNzaWduKHtkcm9wQ29sdW1uOiB0cnVlfSlcbiAgICBjb25zdCB0YWJsZURhdGEgPSBuZXcgVGFibGVEYXRhKHRhYmxlTmFtZSlcblxuICAgIHRhYmxlRGF0YS5hZGRDb2x1bW4oY29sdW1uTmFtZSwgdGFibGVDb2x1bW5BcmdzKVxuXG4gICAgY29uc3Qgc3FscyA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuYWx0ZXJUYWJsZVNRTHModGFibGVEYXRhKVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2Ygc3Fscykge1xuICAgICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5xdWVyeShzcWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZEluZGV4QXJnc1R5cGUgdHlwZS5cbiAgICogQHR5cGVkZWYge29iamVjdH0gQWRkSW5kZXhBcmdzVHlwZVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZk5vdEV4aXN0c10gLSBTa2lwIGNyZWF0aW9uIGlmIHRoZSBpbmRleCBhbHJlYWR5IGV4aXN0cy5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIEV4cGxpY2l0IGluZGV4IG5hbWUgdG8gdXNlLlxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1bmlxdWVdIC0gV2hldGhlciB0aGUgaW5kZXggc2hvdWxkIGJlIHVuaXF1ZS5cbiAgICovXG4gIC8qKlxuICAgKiBSdW5zIGFkZCBpbmRleC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgaW1wb3J0KFwiLi4vdGFibGUtZGF0YS90YWJsZS1jb2x1bW4uanNcIikuZGVmYXVsdD59IGNvbHVtbnMgLSBDb2x1bW4gbmFtZSBvciBhcnJheSBvZiBjb2x1bW4gbmFtZXMuXG4gICAqIEBwYXJhbSB7QWRkSW5kZXhBcmdzVHlwZX0gW2FyZ3NdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBhZGRJbmRleCh0YWJsZU5hbWUsIGNvbHVtbnMsIGFyZ3MpIHtcbiAgICBjb25zdCBub3JtYWxpemVkQ29sdW1ucyA9IHR5cGVvZiBjb2x1bW5zID09PSBcInN0cmluZ1wiID8gW2NvbHVtbnNdIDogY29sdW1uc1xuICAgIGNvbnN0IGNyZWF0ZUluZGV4QXJncyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7XG4gICAgICAgIGNvbHVtbnM6IG5vcm1hbGl6ZWRDb2x1bW5zLFxuICAgICAgICB0YWJsZU5hbWVcbiAgICAgIH0sXG4gICAgICBhcmdzXG4gICAgKVxuICAgIGNvbnN0IHNxbHMgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmNyZWF0ZUluZGV4U1FMcyhjcmVhdGVJbmRleEFyZ3MpXG5cbiAgICBmb3IgKGNvbnN0IHNxbCBvZiBzcWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLnF1ZXJ5KHNxbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlSW5kZXhBcmdzVHlwZSB0eXBlLlxuICAgKiBAdHlwZWRlZiB7b2JqZWN0fSBSZW1vdmVJbmRleEFyZ3NUeXBlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBFeHBsaWNpdCBpbmRleCBuYW1lIHRvIHJlbW92ZS5cbiAgICovXG4gIC8qKlxuICAgKiBSdW5zIHJlbW92ZSBpbmRleC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgaW1wb3J0KFwiLi4vdGFibGUtZGF0YS90YWJsZS1jb2x1bW4uanNcIikuZGVmYXVsdD59IG5hbWVPckNvbHVtbnMgLSBJbmRleCBuYW1lIG9yIGNvbHVtbnMgd2hvc2UgZGVmYXVsdCBhZGRJbmRleCBuYW1lIHNob3VsZCBiZSByZW1vdmVkLlxuICAgKiBAcGFyYW0ge1JlbW92ZUluZGV4QXJnc1R5cGV9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlSW5kZXgodGFibGVOYW1lLCBuYW1lT3JDb2x1bW5zLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7bmFtZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGNvbnN0IHJlbW92ZUluZGV4TmFtZSA9IG5hbWUgfHwgdGhpcy5fcmVtb3ZlSW5kZXhOYW1lKHRhYmxlTmFtZSwgbmFtZU9yQ29sdW1ucylcbiAgICBjb25zdCBzcWxzID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5yZW1vdmVJbmRleFNRTHMoe25hbWU6IHJlbW92ZUluZGV4TmFtZSwgdGFibGVOYW1lfSlcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbW92ZSBpbmRleCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBpbXBvcnQoXCIuLi90YWJsZS1kYXRhL3RhYmxlLWNvbHVtbi5qc1wiKS5kZWZhdWx0Pn0gbmFtZU9yQ29sdW1ucyAtIEluZGV4IG5hbWUgb3IgY29sdW1ucy5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgaW5kZXggbmFtZS5cbiAgICovXG4gIF9yZW1vdmVJbmRleE5hbWUodGFibGVOYW1lLCBuYW1lT3JDb2x1bW5zKSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lT3JDb2x1bW5zID09PSBcInN0cmluZ1wiKSByZXR1cm4gbmFtZU9yQ29sdW1uc1xuXG4gICAgY29uc3QgY3JlYXRlSW5kZXggPSBuZXcgQ3JlYXRlSW5kZXhCYXNlKHtcbiAgICAgIGNvbHVtbnM6IG5hbWVPckNvbHVtbnMsXG4gICAgICBkcml2ZXI6IHRoaXMuZ2V0RHJpdmVyKCksXG4gICAgICB0YWJsZU5hbWVcbiAgICB9KVxuXG4gICAgcmV0dXJuIGNyZWF0ZUluZGV4LmdlbmVyYXRlSW5kZXhOYW1lKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRGb3JlaWduS2V5QXJnc1R5cGUgdHlwZS5cbiAgICogQHR5cGVkZWYge29iamVjdH0gQWRkRm9yZWlnbktleUFyZ3NUeXBlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29sdW1uTmFtZV0gLSBPdmVycmlkZSB0aGUgZGVyaXZlZCBGSyBjb2x1bW4gbmFtZSAoZGVmYXVsdDogYCR7cmVmZXJlbmNlX3VuZGVyc2NvcmVkfV9pZGApLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gT3ZlcnJpZGUgdGhlIGRlcml2ZWQgY29uc3RyYWludCBuYW1lIChkZWZhdWx0OiBgZmtfJHt0YWJsZU5hbWV9XyR7cmVmZXJlbmNlTmFtZX1gKS5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtyZWZlcmVuY2VkQ29sdW1uTmFtZV0gLSBPdmVycmlkZSB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSAoZGVmYXVsdDogYGlkYCkuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmVmZXJlbmNlZFRhYmxlTmFtZV0gLSBPdmVycmlkZSB0aGUgZGVyaXZlZCByZWZlcmVuY2VkIHRhYmxlIChkZWZhdWx0OiBwbHVyYWxpemVkIGByZWZlcmVuY2VOYW1lYCkuXG4gICAqL1xuICAvKipcbiAgICogUnVucyBhZGQgZm9yZWlnbiBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSB0aGUgRksgbGl2ZXMgb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2VOYW1lIC0gU2luZ3VsYXIgcmVmZXJlbmNlIG5hbWUuIERlZmF1bHRzIGRlcml2ZVxuICAgKiAgIHRoZSBGSyBjb2x1bW4gYXMgYCR7cmVmZXJlbmNlfV9pZGAsIHRoZSByZWZlcmVuY2VkIHRhYmxlIGJ5IHBsdXJhbGl6aW5nXG4gICAqICAgdGhlIHJlZmVyZW5jZSwgdGhlIHJlZmVyZW5jZWQgY29sdW1uIGFzIGBpZGAsIGFuZCB0aGUgY29uc3RyYWludCBuYW1lXG4gICAqICAgYXMgYGZrXyR7dGFibGVOYW1lfV8ke3JlZmVyZW5jZU5hbWV9YC4gT3ZlcnJpZGUgYW55IG9mIHRob3NlIHZpYSBgYXJnc2BcbiAgICogICB3aGVuIHRoZSBzY2hlbWEgZG9lc24ndCBmb2xsb3cgdGhlIGNvbnZlbnRpb24uXG4gICAqIEBwYXJhbSB7QWRkRm9yZWlnbktleUFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25hbCBvdmVycmlkZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBhZGRGb3JlaWduS2V5KHRhYmxlTmFtZSwgcmVmZXJlbmNlTmFtZSwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge2NvbHVtbk5hbWUsIG5hbWUsIHJlZmVyZW5jZWRDb2x1bW5OYW1lLCByZWZlcmVuY2VkVGFibGVOYW1lLCAuLi5yZXN0QXJnc30gPSBhcmdzXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgY29uc3QgcmVmZXJlbmNlTmFtZVVuZGVyc2NvcmUgPSBpbmZsZWN0aW9uLnVuZGVyc2NvcmUocmVmZXJlbmNlTmFtZSlcbiAgICBjb25zdCByZXNvbHZlZFJlZmVyZW5jZWRUYWJsZU5hbWUgPSByZWZlcmVuY2VkVGFibGVOYW1lIHx8IGluZmxlY3Rpb24ucGx1cmFsaXplKHJlZmVyZW5jZU5hbWVVbmRlcnNjb3JlKVxuICAgIGNvbnN0IHJlc29sdmVkQ29sdW1uTmFtZSA9IGNvbHVtbk5hbWUgfHwgYCR7cmVmZXJlbmNlTmFtZVVuZGVyc2NvcmV9X2lkYFxuICAgIGNvbnN0IHJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSByZWZlcmVuY2VkQ29sdW1uTmFtZSB8fCBcImlkXCJcbiAgICBjb25zdCByZXNvbHZlZE5hbWUgPSBuYW1lIHx8IGBma18ke3RhYmxlTmFtZX1fJHtyZWZlcmVuY2VOYW1lfWBcblxuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuYWRkRm9yZWlnbktleShcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHJlc29sdmVkQ29sdW1uTmFtZSxcbiAgICAgIHJlc29sdmVkUmVmZXJlbmNlZFRhYmxlTmFtZSxcbiAgICAgIHJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWUsXG4gICAgICB7XG4gICAgICAgIGlzTmV3Rm9yZWlnbktleTogdHJ1ZSxcbiAgICAgICAgbmFtZTogcmVzb2x2ZWROYW1lXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZUZvcmVpZ25LZXlBcmdzVHlwZSB0eXBlLlxuICAgKiBAdHlwZWRlZiB7b2JqZWN0fSBSZW1vdmVGb3JlaWduS2V5QXJnc1R5cGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2x1bW5OYW1lXSAtIE92ZXJyaWRlIHRoZSBkZXJpdmVkIGZvcmVpZ24ta2V5IGNvbHVtbiBuYW1lLlxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3ZlIGZvcmVpZ24ga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgdGhlIGZvcmVpZ24ga2V5IGxpdmVzIG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmZXJlbmNlTmFtZSAtIFNpbmd1bGFyIHJlZmVyZW5jZSBuYW1lIHVzZWQgdG8gZGVyaXZlIHRoZSBGSyBjb2x1bW4uXG4gICAqIEBwYXJhbSB7UmVtb3ZlRm9yZWlnbktleUFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25hbCBvdmVycmlkZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyByZW1vdmVGb3JlaWduS2V5KHRhYmxlTmFtZSwgcmVmZXJlbmNlTmFtZSwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge2NvbHVtbk5hbWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCByZXNvbHZlZENvbHVtbk5hbWUgPSBjb2x1bW5OYW1lIHx8IGAke2luZmxlY3Rpb24udW5kZXJzY29yZShyZWZlcmVuY2VOYW1lKX1faWRgXG4gICAgY29uc3QgZHJpdmVyID0gdGhpcy5nZXREcml2ZXIoKVxuICAgIGxldCBtYXhpbXVtUmVtb3ZhbHMgPSAwXG4gICAgbGV0IHByZXZpb3VzTWF0Y2hpbmdDb3VudCA9IDBcblxuICAgIGZvciAobGV0IHJlbW92YWxBdHRlbXB0ID0gMDsgOyByZW1vdmFsQXR0ZW1wdCsrKSB7XG4gICAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGRyaXZlci5nZXRUYWJsZUJ5TmFtZSh0YWJsZU5hbWUpXG5cbiAgICAgIGlmICghdGFibGUpIHRocm93IG5ldyBFcnJvcihgVGFibGUgJHt0YWJsZU5hbWV9IGRvZXMgbm90IGV4aXN0YClcblxuICAgICAgY29uc3QgZm9yZWlnbktleXMgPSBhd2FpdCB0YWJsZS5nZXRGb3JlaWduS2V5cygpXG4gICAgICBjb25zdCBtYXRjaGluZ0ZvcmVpZ25LZXlzID0gZm9yZWlnbktleXMuZmlsdGVyKChmb3JlaWduS2V5KSA9PiBmb3JlaWduS2V5LmdldENvbHVtbk5hbWUoKSA9PSByZXNvbHZlZENvbHVtbk5hbWUpXG5cbiAgICAgIGlmIChtYXRjaGluZ0ZvcmVpZ25LZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAocmVtb3ZhbEF0dGVtcHQgPT09IDApIHRocm93IG5ldyBFcnJvcihgTm8gZm9yZWlnbiBrZXkgb24gJHt0YWJsZU5hbWV9LiR7cmVzb2x2ZWRDb2x1bW5OYW1lfWApXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChyZW1vdmFsQXR0ZW1wdCA9PT0gMCkge1xuICAgICAgICBtYXhpbXVtUmVtb3ZhbHMgPSBtYXRjaGluZ0ZvcmVpZ25LZXlzLmxlbmd0aFxuICAgICAgfSBlbHNlIGlmIChtYXRjaGluZ0ZvcmVpZ25LZXlzLmxlbmd0aCA+PSBwcmV2aW91c01hdGNoaW5nQ291bnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3JlaWduIGtleSByZW1vdmFsIGRpZCBub3QgcmVkdWNlIG1hdGNoZXMgb24gJHt0YWJsZU5hbWV9LiR7cmVzb2x2ZWRDb2x1bW5OYW1lfWApXG4gICAgICB9XG5cbiAgICAgIGlmIChyZW1vdmFsQXR0ZW1wdCA+PSBtYXhpbXVtUmVtb3ZhbHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb3JlaWduIGtleSByZW1vdmFsIGV4Y2VlZGVkIGV4cGVjdGVkIG1hdGNoZXMgb24gJHt0YWJsZU5hbWV9LiR7cmVzb2x2ZWRDb2x1bW5OYW1lfWApXG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzTWF0Y2hpbmdDb3VudCA9IG1hdGNoaW5nRm9yZWlnbktleXMubGVuZ3RoXG4gICAgICBhd2FpdCBkcml2ZXIucmVtb3ZlRm9yZWlnbktleSh0YWJsZU5hbWUsIG1hdGNoaW5nRm9yZWlnbktleXNbMF0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2VOYW1lIC0gUmVmZXJlbmNlIG5hbWUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZm9yZWlnbktleV0gLSBXaGV0aGVyIGZvcmVpZ24ga2V5LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLm51bGxdIC0gV2hldGhlciBudWxsYWJsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnR5cGVdIC0gVHlwZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLnVuaXF1ZV0gLSBXaGV0aGVyIHVuaXF1ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGFkZFJlZmVyZW5jZSh0YWJsZU5hbWUsIHJlZmVyZW5jZU5hbWUsIGFyZ3MpIHtcbiAgICBjb25zdCB7Zm9yZWlnbktleSwgbnVsbDogbnVsbGFibGUsIHR5cGUsIHVuaXF1ZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBgJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUocmVmZXJlbmNlTmFtZSl9X2lkYFxuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGNvbnN0IGNvbHVtblR5cGUgPSB0eXBlIHx8IFwiaW50ZWdlclwiXG4gICAgY29uc3QgY29sdW1uQXJncyA9IG51bGxhYmxlICE9PSB1bmRlZmluZWQgPyB7bnVsbDogbnVsbGFibGV9IDogdW5kZWZpbmVkXG5cbiAgICBhd2FpdCB0aGlzLmFkZENvbHVtbih0YWJsZU5hbWUsIGNvbHVtbk5hbWUsIGNvbHVtblR5cGUsIGNvbHVtbkFyZ3MpXG4gICAgYXdhaXQgdGhpcy5hZGRJbmRleCh0YWJsZU5hbWUsIFtjb2x1bW5OYW1lXSwge3VuaXF1ZTogdW5pcXVlfSlcblxuICAgIGlmIChmb3JlaWduS2V5KSB7XG4gICAgICBhd2FpdCB0aGlzLmFkZEZvcmVpZ25LZXkodGFibGVOYW1lLCByZWZlcmVuY2VOYW1lKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVSZWZlcmVuY2VBcmdzVHlwZSB0eXBlLlxuICAgKiBAdHlwZWRlZiB7b2JqZWN0fSBSZW1vdmVSZWZlcmVuY2VBcmdzVHlwZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbHVtbk5hbWVdIC0gT3ZlcnJpZGUgdGhlIGRlcml2ZWQgcmVmZXJlbmNlIGNvbHVtbiBuYW1lLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2luZGV4TmFtZV0gLSBFeHBsaWNpdCBnZW5lcmF0ZWQgaW5kZXggbmFtZSB0byByZW1vdmUuXG4gICAqL1xuICAvKipcbiAgICogUnVucyByZW1vdmUgcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZmVyZW5jZU5hbWUgLSBSZWZlcmVuY2UgbmFtZS5cbiAgICogQHBhcmFtIHtSZW1vdmVSZWZlcmVuY2VBcmdzVHlwZX0gW2FyZ3NdIC0gT3B0aW9uYWwgb3ZlcnJpZGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlUmVmZXJlbmNlKHRhYmxlTmFtZSwgcmVmZXJlbmNlTmFtZSwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge2NvbHVtbk5hbWUsIGluZGV4TmFtZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGNvbnN0IHJlc29sdmVkQ29sdW1uTmFtZSA9IGNvbHVtbk5hbWUgfHwgYCR7aW5mbGVjdGlvbi51bmRlcnNjb3JlKHJlZmVyZW5jZU5hbWUpfV9pZGBcbiAgICBjb25zdCBkcml2ZXIgPSB0aGlzLmdldERyaXZlcigpXG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCBkcml2ZXIuZ2V0VGFibGVCeU5hbWUodGFibGVOYW1lKVxuXG4gICAgaWYgKCF0YWJsZSkgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gZG9lcyBub3QgZXhpc3RgKVxuXG4gICAgY29uc3QgZm9yZWlnbktleXMgPSBhd2FpdCB0YWJsZS5nZXRGb3JlaWduS2V5cygpXG5cbiAgICBmb3IgKGNvbnN0IGZvcmVpZ25LZXkgb2YgZm9yZWlnbktleXMpIHtcbiAgICAgIGlmIChmb3JlaWduS2V5LmdldENvbHVtbk5hbWUoKSAhPSByZXNvbHZlZENvbHVtbk5hbWUpIGNvbnRpbnVlXG5cbiAgICAgIGF3YWl0IGRyaXZlci5yZW1vdmVGb3JlaWduS2V5KHRhYmxlTmFtZSwgZm9yZWlnbktleSlcbiAgICB9XG5cbiAgICBjb25zdCBleHBlY3RlZEluZGV4TmFtZSA9IGluZGV4TmFtZSB8fCB0aGlzLl9yZW1vdmVJbmRleE5hbWUodGFibGVOYW1lLCBbcmVzb2x2ZWRDb2x1bW5OYW1lXSlcbiAgICBjb25zdCBpbmRleGVzID0gYXdhaXQgdGFibGUuZ2V0SW5kZXhlcygpXG4gICAgY29uc3QgZ2VuZXJhdGVkSW5kZXggPSBpbmRleGVzLmZpbmQoKGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpbmRleENvbHVtbk5hbWVzID0gaW5kZXguZ2V0Q29sdW1uTmFtZXMoKVxuXG4gICAgICByZXR1cm4gIWluZGV4LmlzUHJpbWFyeUtleSgpICYmXG4gICAgICAgIGluZGV4LmdldE5hbWUoKSA9PSBleHBlY3RlZEluZGV4TmFtZSAmJlxuICAgICAgICBpbmRleENvbHVtbk5hbWVzLmxlbmd0aCA9PSAxICYmXG4gICAgICAgIGluZGV4Q29sdW1uTmFtZXNbMF0gPT0gcmVzb2x2ZWRDb2x1bW5OYW1lXG4gICAgfSlcblxuICAgIGlmIChnZW5lcmF0ZWRJbmRleCkge1xuICAgICAgYXdhaXQgdGhpcy5yZW1vdmVJbmRleCh0YWJsZU5hbWUsIGdlbmVyYXRlZEluZGV4LmdldE5hbWUoKSlcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnJlbW92ZUNvbHVtbih0YWJsZU5hbWUsIHJlc29sdmVkQ29sdW1uTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNoYW5nZSBjb2x1bW4gbnVsbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gbnVsbGFibGUgLSBXaGV0aGVyIG51bGxhYmxlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgY2hhbmdlQ29sdW1uTnVsbCh0YWJsZU5hbWUsIGNvbHVtbk5hbWUsIG51bGxhYmxlKSB7XG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmdldFRhYmxlQnlOYW1lKHRhYmxlTmFtZSlcblxuICAgIGlmICghdGFibGUpIHRocm93IG5ldyBFcnJvcihgVGFibGUgJHt0YWJsZU5hbWV9IGRvZXMgbm90IGV4aXN0YClcblxuICAgIGNvbnN0IGNvbHVtbiA9IGF3YWl0IHRhYmxlLmdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lKVxuXG4gICAgaWYgKCFjb2x1bW4pIHRocm93IG5ldyBFcnJvcihgQ29sdW1uICR7Y29sdW1uTmFtZX0gZG9lcyBub3QgZXhpc3QgaW4gdGFibGUgJHt0YWJsZU5hbWV9YClcblxuICAgIGF3YWl0IGNvbHVtbi5jaGFuZ2VOdWxsYWJsZShudWxsYWJsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBNaWdyYXRlcyBsZWdhY3kgdGltZXpvbmUtbGVzcyBsb2NhbCBkYXRldGltZSByb3dzIGludG8gVVRDIGRhdGV0aW1lIHN0b3JhZ2UuXG4gICAqIE5ldyBTUUxpdGUgVVRDIHJvd3MgaW5jbHVkZSBhIHRpbWV6b25lIHN1ZmZpeCBhbmQgYXJlIHNraXBwZWQuXG4gICAqIEBwYXJhbSB7TGVnYWN5TG9jYWxEYXRlVGltZXNNaWdyYXRpb25BcmdzVHlwZX0gW2FyZ3NdIC0gTWlncmF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBtaWdyYXRlTGVnYWN5TG9jYWxEYXRlVGltZXNUb1V0Y1N0b3JhZ2UoYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge2NvbHVtbnNCeVRhYmxlLCBsZWdhY3lMb2NhbE9mZnNldE1pbnV0ZXMsIHRhYmxlcywgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGNvbnN0IHRhYmxlTmFtZXMgPSBhd2FpdCB0aGlzLl9sZWdhY3lMb2NhbERhdGVUaW1lc1RhYmxlTmFtZXModGFibGVzKVxuXG4gICAgZm9yIChjb25zdCB0YWJsZU5hbWUgb2YgdGFibGVOYW1lcykge1xuICAgICAgYXdhaXQgdGhpcy5fbWlncmF0ZUxlZ2FjeUxvY2FsRGF0ZVRpbWVzVGFibGUoe1xuICAgICAgICBjb2x1bW5zQnlUYWJsZSxcbiAgICAgICAgbGVnYWN5TG9jYWxPZmZzZXRNaW51dGVzLFxuICAgICAgICB0YWJsZU5hbWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRhYmxlIG5hbWVzIGZvciBhIGxlZ2FjeSBsb2NhbCBkYXRldGltZSBtaWdyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCB1bmRlZmluZWR9IHRhYmxlcyAtIEV4cGxpY2l0IHRhYmxlIG5hbWVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gVGFibGUgbmFtZXMuXG4gICAqL1xuICBhc3luYyBfbGVnYWN5TG9jYWxEYXRlVGltZXNUYWJsZU5hbWVzKHRhYmxlcykge1xuICAgIGlmICh0YWJsZXMpIHJldHVybiB0YWJsZXNcblxuICAgIHJldHVybiAoYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5nZXRUYWJsZXMoKSlcbiAgICAgIC5tYXAoKHRhYmxlKSA9PiB0YWJsZS5nZXROYW1lKCkpXG4gICAgICAuZmlsdGVyKCh0YWJsZU5hbWUpID0+IHRhYmxlTmFtZSAhPSBcInNjaGVtYV9taWdyYXRpb25zXCIgJiYgIXRhYmxlTmFtZS5zdGFydHNXaXRoKFwic3FsaXRlX1wiKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBNaWdyYXRlcyBvbmUgdGFibGUncyBsZWdhY3kgbG9jYWwgZGF0ZXRpbWUgdmFsdWVzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHwgdW5kZWZpbmVkfSBhcmdzLmNvbHVtbnNCeVRhYmxlIC0gRXhwbGljaXQgY29sdW1ucyBrZXllZCBieSB0YWJsZS5cbiAgICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWR9IGFyZ3MubGVnYWN5TG9jYWxPZmZzZXRNaW51dGVzIC0gVVRDLW1pbnVzLWxvY2FsIG9mZnNldCBpbiBtaW51dGVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy50YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX21pZ3JhdGVMZWdhY3lMb2NhbERhdGVUaW1lc1RhYmxlKHtjb2x1bW5zQnlUYWJsZSwgbGVnYWN5TG9jYWxPZmZzZXRNaW51dGVzLCB0YWJsZU5hbWV9KSB7XG4gICAgY29uc3QgZHJpdmVyID0gdGhpcy5nZXREcml2ZXIoKVxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgZHJpdmVyLmdldFRhYmxlQnlOYW1lT3JGYWlsKHRhYmxlTmFtZSlcbiAgICBjb25zdCBjb2x1bW5zID0gYXdhaXQgdGhpcy5fbGVnYWN5TG9jYWxEYXRlVGltZXNDb2x1bW5zKHtjb2x1bW5zQnlUYWJsZSwgdGFibGV9KVxuXG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHByaW1hcnlLZXlDb2x1bW4gPSBhd2FpdCB0aGlzLl9sZWdhY3lMb2NhbERhdGVUaW1lc1ByaW1hcnlLZXkodGFibGUpXG4gICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gW3ByaW1hcnlLZXlDb2x1bW4sIC4uLmNvbHVtbnNdXG4gICAgY29uc3Qgc2VsZWN0U3FsID0gc2VsZWN0ZWRDb2x1bW5zXG4gICAgICAubWFwKChjb2x1bW5OYW1lKSA9PiBkcml2ZXIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSkpXG4gICAgICAuam9pbihcIiwgXCIpXG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IGRyaXZlci5xdWVyeShgU0VMRUNUICR7c2VsZWN0U3FsfSBGUk9NICR7ZHJpdmVyLnF1b3RlVGFibGUodGFibGVOYW1lKX1gKVxuXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgZm9yIChjb25zdCBjb2x1bW5OYW1lIG9mIGNvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByb3dbY29sdW1uTmFtZV1cbiAgICAgICAgY29uc3QgY29udmVydGVkVmFsdWUgPSBjb252ZXJ0TGVnYWN5RGF0ZVZhbHVlVG9VdGNTdG9yYWdlKHZhbHVlLCB7XG4gICAgICAgICAgZGF0YWJhc2VUeXBlOiBkcml2ZXIuZ2V0VHlwZSgpLFxuICAgICAgICAgIGxlZ2FjeUxvY2FsT2Zmc2V0TWludXRlc1xuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChjb252ZXJ0ZWRWYWx1ZSA9PT0gdmFsdWUpIGNvbnRpbnVlXG5cbiAgICAgICAgYXdhaXQgZHJpdmVyLnF1ZXJ5KGBcbiAgICAgICAgICBVUERBVEUgJHtkcml2ZXIucXVvdGVUYWJsZSh0YWJsZU5hbWUpfVxuICAgICAgICAgIFNFVCAke2RyaXZlci5xdW90ZUNvbHVtbihjb2x1bW5OYW1lKX0gPSAke2RyaXZlci5xdW90ZShjb252ZXJ0ZWRWYWx1ZSl9XG4gICAgICAgICAgV0hFUkUgJHtkcml2ZXIucXVvdGVDb2x1bW4ocHJpbWFyeUtleUNvbHVtbil9ID0gJHtkcml2ZXIucXVvdGUocm93W3ByaW1hcnlLZXlDb2x1bW5dKX1cbiAgICAgICAgYClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgZGF0ZS1saWtlIGNvbHVtbnMgZm9yIG9uZSB0YWJsZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB8IHVuZGVmaW5lZH0gYXJncy5jb2x1bW5zQnlUYWJsZSAtIEV4cGxpY2l0IGNvbHVtbnMga2V5ZWQgYnkgdGFibGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLXRhYmxlLmpzXCIpLmRlZmF1bHR9IGFyZ3MudGFibGUgLSBUYWJsZSBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIERhdGUtbGlrZSBjb2x1bW4gbmFtZXMuXG4gICAqL1xuICBhc3luYyBfbGVnYWN5TG9jYWxEYXRlVGltZXNDb2x1bW5zKHtjb2x1bW5zQnlUYWJsZSwgdGFibGV9KSB7XG4gICAgY29uc3QgZXhwbGljaXRDb2x1bW5zID0gY29sdW1uc0J5VGFibGU/Llt0YWJsZS5nZXROYW1lKCldXG5cbiAgICBpZiAoZXhwbGljaXRDb2x1bW5zKSByZXR1cm4gZXhwbGljaXRDb2x1bW5zXG5cbiAgICByZXR1cm4gKGF3YWl0IHRhYmxlLmdldENvbHVtbnMoKSlcbiAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4gdGhpcy5fbGVnYWN5TG9jYWxEYXRlVGltZXNDb2x1bW5Jc0RhdGVMaWtlKGNvbHVtbikpXG4gICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5nZXROYW1lKCkpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBjb2x1bW4gc2hvdWxkIGJlIGluY2x1ZGVkIGJ5IGRlZmF1bHQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLWNvbHVtbi5qc1wiKS5kZWZhdWx0fSBjb2x1bW4gLSBDb2x1bW4gbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGNvbHVtbiBpcyBkYXRlLWxpa2UuXG4gICAqL1xuICBfbGVnYWN5TG9jYWxEYXRlVGltZXNDb2x1bW5Jc0RhdGVMaWtlKGNvbHVtbikge1xuICAgIGNvbnN0IGNvbHVtblR5cGUgPSBjb2x1bW4uZ2V0VHlwZSgpLnRvTG93ZXJDYXNlKClcblxuICAgIHJldHVybiBjb2x1bW5UeXBlLmluY2x1ZGVzKFwiZGF0ZVwiKSB8fCBjb2x1bW5UeXBlLmluY2x1ZGVzKFwidGltZXN0YW1wXCIpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHNpbmdsZSBwcmltYXJ5IGtleSBjb2x1bW4gZm9yIHJvdyB1cGRhdGVzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0fSB0YWJsZSAtIFRhYmxlIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIFByaW1hcnkga2V5IGNvbHVtbiBuYW1lLlxuICAgKi9cbiAgYXN5bmMgX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzUHJpbWFyeUtleSh0YWJsZSkge1xuICAgIGNvbnN0IHByaW1hcnlLZXlDb2x1bW5zID0gKGF3YWl0IHRhYmxlLmdldENvbHVtbnMoKSkuZmlsdGVyKChjb2x1bW4pID0+IGNvbHVtbi5nZXRQcmltYXJ5S2V5KCkpXG5cbiAgICBpZiAocHJpbWFyeUtleUNvbHVtbnMubGVuZ3RoICE9IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSBvbmUgcHJpbWFyeSBrZXkgb24gJHt0YWJsZS5nZXROYW1lKCl9IGJ1dCBmb3VuZCAke3ByaW1hcnlLZXlDb2x1bW5zLmxlbmd0aH1gKVxuICAgIH1cblxuICAgIHJldHVybiBwcmltYXJ5S2V5Q29sdW1uc1swXS5nZXROYW1lKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbHVtbiBleGlzdHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBSZXNvbHZlcyB3aXRoIFdoZXRoZXIgY29sdW1uIGV4aXN0cy5cbiAgICovXG4gIGFzeW5jIGNvbHVtbkV4aXN0cyh0YWJsZU5hbWUsIGNvbHVtbk5hbWUpIHtcbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuZ2V0VGFibGVCeU5hbWUodGFibGVOYW1lKVxuXG4gICAgaWYgKHRhYmxlKSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSBhd2FpdCB0YWJsZS5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSlcblxuICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBCb29sZWFuKGZhbHNlKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGFuIGluZGV4IHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3RzIG9uIGEgdGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5kZXhOYW1lIC0gSW5kZXggbmFtZSB0byBsb29rIGZvci5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgaW5kZXggZXhpc3RzIG9uIHRoZSB0YWJsZS5cbiAgICovXG4gIGFzeW5jIGluZGV4RXhpc3RzKHRhYmxlTmFtZSwgaW5kZXhOYW1lKSB7XG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmdldFRhYmxlQnlOYW1lKHRhYmxlTmFtZSwge3Rocm93RXJyb3I6IGZhbHNlfSlcblxuICAgIGlmICh0YWJsZSkge1xuICAgICAgZm9yIChjb25zdCBpbmRleCBvZiBhd2FpdCB0YWJsZS5nZXRJbmRleGVzKCkpIHtcbiAgICAgICAgaWYgKGluZGV4LmdldE5hbWUoKSA9PSBpbmRleE5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgZGF0YWJhc2Ugc2NoZW1hIGZvciBhIGdhcC1sZXNzIHBvc2l0aW9uYWwgbGlzdC4gQWRkcyB0aGVcbiAgICogcG9zaXRpb24gY29sdW1uIChJTlQgTk9UIE5VTEwpIGlmIGFic2VudCBhbmQgY3JlYXRlcyBhIFVOSVFVRSBpbmRleCBvblxuICAgKiAoc2NvcGUsIHBvc2l0aW9uKS4gVGhpcyBpcyB0aGUgc2NoZW1hLXNpZGUgY291bnRlcnBhcnQgb2ZcbiAgICogYE1vZGVsLmFjdHNBc0xpc3QoKWAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcG9zaXRpb25Db2x1bW4gLSBDb2x1bW4gbmFtZSBmb3IgdGhlIHBvc2l0aW9uIChlLmcuIFwicm93X251bWJlclwiKS5cbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5zY29wZSAtIENvbHVtbiBuYW1lIGZvciB0aGUgc2NvcGUgKGUuZy4gXCJib2FyZF9jb2x1bW5faWRcIikuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgYWRkQWN0c0FzTGlzdCh0YWJsZU5hbWUsIHBvc2l0aW9uQ29sdW1uLCB7c2NvcGV9KSB7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5jb2x1bW5FeGlzdHModGFibGVOYW1lLCBwb3NpdGlvbkNvbHVtbikpKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkZENvbHVtbih0YWJsZU5hbWUsIHBvc2l0aW9uQ29sdW1uLCBcImludGVnZXJcIiwge251bGw6IGZhbHNlfSlcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5jaGFuZ2VDb2x1bW5OdWxsKHRhYmxlTmFtZSwgcG9zaXRpb25Db2x1bW4sIGZhbHNlKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuYWRkSW5kZXgodGFibGVOYW1lLCBbc2NvcGUsIHBvc2l0aW9uQ29sdW1uXSwge3VuaXF1ZTogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIHdpdGggZGVmYXVsdCBvcHRpb25zLlxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7Q3JlYXRlVGFibGVDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIHdpdGggZXhwbGljaXQgb3B0aW9ucy5cbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge0NyZWF0ZVRhYmxlQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtDcmVhdGVUYWJsZUNhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIC8qKlxuICAgKiBSdW5zIGNyZWF0ZSB0YWJsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7Q3JlYXRlVGFibGVBcmdzVHlwZSB8IENyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlfSBhcmcxIC0gQXJnMS5cbiAgICogQHBhcmFtIHtDcmVhdGVUYWJsZUNhbGxiYWNrVHlwZSB8IHVuZGVmaW5lZH0gW2FyZzJdIC0gQXJnMi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVRhYmxlKHRhYmxlTmFtZSwgYXJnMSwgYXJnMikge1xuICAgIGxldCBhcmdzXG4gICAgbGV0IGNhbGxiYWNrXG5cbiAgICBpZiAodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBhcmdzID0ge31cbiAgICAgIGNhbGxiYWNrID0gYXJnMVxuICAgIH0gZWxzZSB7XG4gICAgICBhcmdzID0gYXJnMVxuICAgICAgY2FsbGJhY2sgPSBhcmcyXG4gICAgfVxuXG4gICAgY29uc3Qge2lkID0ge30sIGlmTm90RXhpc3RzID0gZmFsc2UsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICBjb25zdCBkcml2ZXIgPSB0aGlzLmdldERyaXZlcigpXG4gICAgY29uc3QgZGVmYXVsdFByaW1hcnlLZXlUeXBlID0gZHJpdmVyLnByaW1hcnlLZXlUeXBlKClcbiAgICBsZXQgaWREZWZhdWx0LCBpZFR5cGUsIHJlc3RBcmdzSWRcblxuICAgIGlmIChpZCAhPT0gZmFsc2UpIHtcbiAgICAgICh7ZGVmYXVsdDogaWREZWZhdWx0LCB0eXBlOiBpZFR5cGUsIC4uLnJlc3RBcmdzSWR9ID0gaWQpXG5cbiAgICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3NJZClcbiAgICB9XG5cbiAgICBpZiAoIWlkVHlwZSkge1xuICAgICAgaWRUeXBlID0gZGVmYXVsdFByaW1hcnlLZXlUeXBlXG4gICAgfVxuICAgIGNvbnN0IGRyaXZlclN1cHBvcnRzRGVmYXVsdFVVSUQgPSBkcml2ZXIuc3VwcG9ydHNEZWZhdWx0UHJpbWFyeUtleVVVSUQ/LigpXG4gICAgY29uc3QgbG93ZXJJZFR5cGUgPSBpZFR5cGU/LnRvTG93ZXJDYXNlKClcbiAgICBjb25zdCBpc1VVSURQcmltYXJ5S2V5ID0gbG93ZXJJZFR5cGUgPT0gXCJ1dWlkXCJcbiAgICBjb25zdCBudW1lcmljQXV0b0luY3JlbWVudFR5cGVzID0gW1wiaW50XCIsIFwiaW50ZWdlclwiLCBcImJpZ2ludFwiLCBcInNtYWxsaW50XCIsIFwidGlueWludFwiXVxuICAgIGxldCBpZEF1dG9JbmNyZW1lbnQgPSBudW1lcmljQXV0b0luY3JlbWVudFR5cGVzLmluY2x1ZGVzKGxvd2VySWRUeXBlIHx8IFwiXCIpXG5cbiAgICBpZiAoaXNVVUlEUHJpbWFyeUtleSkge1xuICAgICAgaWRBdXRvSW5jcmVtZW50ID0gZmFsc2VcblxuICAgICAgaWYgKGRyaXZlclN1cHBvcnRzRGVmYXVsdFVVSUQpIHtcbiAgICAgICAgaWYgKGlkRGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWREZWZhdWx0ID0gKCkgPT4gXCJVVUlEKClcIlxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlkRGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIExldCBhcHBsaWNhdGlvbiBjb2RlIGFzc2lnbiBVVUlEcyAoc2VlIERhdGFiYXNlUmVjb3JkLmluc2VydCkgd2hlbiB0aGUgZHJpdmVyIGNhbid0IGRvIGl0LlxuICAgICAgICBpZERlZmF1bHQgPSB1bmRlZmluZWRcbiAgICAgIH1cbiAgICAgIC8vIElmIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQgVVVJRCgpIGJ1dCB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgc2V0IGEgZGVmYXVsdCwgcmVzcGVjdCBpdC5cbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZURhdGEgPSBuZXcgVGFibGVEYXRhKHRhYmxlTmFtZSwge2lmTm90RXhpc3RzLCBwcmltYXJ5S2V5VHlwZTogZGVmYXVsdFByaW1hcnlLZXlUeXBlfSlcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBpZiAoIShpZFR5cGUgaW4gdGFibGVEYXRhKSkgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBwcmltYXJ5IGtleSB0eXBlOiAke2lkVHlwZX1gKVxuXG4gICAgaWYgKGlkICE9PSBmYWxzZSkge1xuICAgICAgdGFibGVEYXRhLmFkZENvbHVtbihcImlkXCIsIHthdXRvSW5jcmVtZW50OiBpZEF1dG9JbmNyZW1lbnQsIGRlZmF1bHQ6IGlkRGVmYXVsdCwgbnVsbDogZmFsc2UsIHByaW1hcnlLZXk6IHRydWUsIHR5cGU6IGlkVHlwZX0pXG4gICAgfVxuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjayh0YWJsZURhdGEpXG4gICAgfVxuXG4gICAgY29uc3Qgc3FscyA9IGF3YWl0IGRyaXZlci5jcmVhdGVUYWJsZVNxbCh0YWJsZURhdGEpXG5cbiAgICBmb3IgKGNvbnN0IHNxbCBvZiBzcWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLl9kYi5xdWVyeShzcWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZVRhYmxlQXJnc1R5cGUgdHlwZS5cbiAgICogQHR5cGVkZWYge29iamVjdH0gQ2hhbmdlVGFibGVBcmdzVHlwZVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtidWxrXSAtIENvbWJpbmUgY29tcGF0aWJsZSBjb250aWd1b3VzIERETCBpbnRvIHNpbmdsZVxuICAgKiAgIEFMVEVSIFRBQkxFIHN0YXRlbWVudHMgb24gZHJpdmVycyB0aGF0IHN1cHBvcnQgYnVsayBhbHRlcnMgKE15U1FML01hcmlhREJcbiAgICogICBhbmQgUG9zdGdyZVNRTCkuIGBidWxrYCBjb250cm9scyBEREwgZ3JvdXBpbmcgb25seSwgbm90IHRyYW5zYWN0aW9uYWxcbiAgICogICBhdG9taWNpdHk7IHVuY2hhbmdlZCBkcml2ZXJzIGV4ZWN1dGUgdGhlIHJlY29yZGVkIGNvbW1hbmRzIHNlcXVlbnRpYWxseS5cbiAgICovXG5cbiAgLyoqXG4gICAqIENoYW5nZVRhYmxlQ2FsbGJhY2tUeXBlIHR5cGUuXG4gICAqIEB0eXBlZGVmIHsodGFibGU6IGltcG9ydChcIi4vY2hhbmdlLXRhYmxlLmpzXCIpLmRlZmF1bHQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+fSBDaGFuZ2VUYWJsZUNhbGxiYWNrVHlwZVxuICAgKi9cblxuICAvKipcbiAgICogQ2hhbmdlcyBhIHRhYmxlIHVzaW5nIGEgUmFpbHMtc3R5bGUgdGFibGUtc2NvcGVkIHJlY29yZGVyLlxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7Q2hhbmdlVGFibGVDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICAvKipcbiAgICogQ2hhbmdlcyBhIHRhYmxlIHdpdGggZXhwbGljaXQgb3B0aW9ucy5cbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge0NoYW5nZVRhYmxlQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtDaGFuZ2VUYWJsZUNhbGxiYWNrVHlwZX0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIC8qKlxuICAgKiBSdW5zIGNoYW5nZSB0YWJsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7Q2hhbmdlVGFibGVBcmdzVHlwZSB8IENoYW5nZVRhYmxlQ2FsbGJhY2tUeXBlfSBhcmcxIC0gQXJnMS5cbiAgICogQHBhcmFtIHtDaGFuZ2VUYWJsZUNhbGxiYWNrVHlwZSB8IHVuZGVmaW5lZH0gW2FyZzJdIC0gQXJnMi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGNoYW5nZVRhYmxlKHRhYmxlTmFtZSwgYXJnMSwgYXJnMikge1xuICAgIGxldCBhcmdzID0gLyoqIEB0eXBlIHtDaGFuZ2VUYWJsZUFyZ3NUeXBlfSAqLyAoe30pXG4gICAgbGV0IGNhbGxiYWNrXG5cbiAgICBpZiAodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjYWxsYmFjayA9IGFyZzFcbiAgICB9IGVsc2Uge1xuICAgICAgYXJncyA9IGFyZzEgfHwge31cbiAgICAgIGNhbGxiYWNrID0gYXJnMlxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBjYWxsYmFjayBnaXZlblwiKVxuXG4gICAgY29uc3Qge2J1bGsgPSBmYWxzZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGNvbnN0IHRhYmxlID0gbmV3IENoYW5nZVRhYmxlKHt0YWJsZU5hbWV9KVxuXG4gICAgYXdhaXQgY2FsbGJhY2sodGFibGUpXG5cbiAgICBhd2FpdCB0aGlzLl9leGVjdXRlQ2hhbmdlVGFibGVPcGVyYXRpb25zKHRhYmxlTmFtZSwgdGFibGUuZ2V0T3BlcmF0aW9ucygpLCB7YnVsa30pXG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgcmVjb3JkZWQgY2hhbmdlVGFibGUgb3BlcmF0aW9ucy4gV2l0aCBgYnVsa2AgZW5hYmxlZCBvbiBhXG4gICAqIHN1cHBvcnRpbmcgZHJpdmVyLCBjb21wYXRpYmxlIGNvbnRpZ3VvdXMgY29sdW1uIG9wZXJhdGlvbnMgYWNjdW11bGF0ZSBpbnRvXG4gICAqIGEgc2luZ2xlIFRhYmxlRGF0YSBmbHVzaGVkIHRocm91Z2ggYGFsdGVyVGFibGVTUUxzYDsgaW5jb21wYXRpYmxlIGNvbW1hbmRzXG4gICAqIGZsdXNoIHRoZSBiYXRjaCBmaXJzdCBhbmQgcnVuIHRocm91Z2ggdGhlIGV4aXN0aW5nIG1pZ3JhdGlvbiBoZWxwZXJzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NoYW5nZS10YWJsZS5qc1wiKS5DaGFuZ2VUYWJsZU9wZXJhdGlvblR5cGVbXX0gb3BlcmF0aW9ucyAtIFJlY29yZGVkIG9wZXJhdGlvbnMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYXJncy5idWxrIC0gV2hldGhlciB0byBlbmFibGUgYnVsayBjb21tYW5kIGdyb3VwaW5nLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2V4ZWN1dGVDaGFuZ2VUYWJsZU9wZXJhdGlvbnModGFibGVOYW1lLCBvcGVyYXRpb25zLCB7YnVsa30pIHtcbiAgICBjb25zdCBkcml2ZXIgPSB0aGlzLmdldERyaXZlcigpXG4gICAgY29uc3QgYnVsa1N1cHBvcnRlZCA9IGJ1bGsgJiYgZHJpdmVyLnN1cHBvcnRzQnVsa0FsdGVyKClcblxuICAgIGlmICghYnVsa1N1cHBvcnRlZCkge1xuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBhd2FpdCB0aGlzLl9leGVjdXRlQ2hhbmdlVGFibGVPcGVyYXRpb24odGFibGVOYW1lLCBvcGVyYXRpb24pXG4gICAgICB9XG5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCBiYXRjaCA9IG5ldyBUYWJsZURhdGEodGFibGVOYW1lKVxuXG4gICAgY29uc3QgZmx1c2hCYXRjaCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChiYXRjaC5nZXRDb2x1bW5zKCkubGVuZ3RoID09IDAgJiYgYmF0Y2guZ2V0SW5kZXhlcygpLmxlbmd0aCA9PSAwKSByZXR1cm5cblxuICAgICAgY29uc3Qgc3FscyA9IGF3YWl0IGRyaXZlci5hbHRlclRhYmxlU1FMcyhiYXRjaClcblxuICAgICAgZm9yIChjb25zdCBzcWwgb2Ygc3Fscykge1xuICAgICAgICBhd2FpdCBkcml2ZXIucXVlcnkoc3FsKVxuICAgICAgfVxuXG4gICAgICBiYXRjaCA9IG5ldyBUYWJsZURhdGEodGFibGVOYW1lKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIG9wZXJhdGlvbnMpIHtcbiAgICAgIHN3aXRjaCAob3BlcmF0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcImFkZENvbHVtblwiOiB7XG4gICAgICAgICAgaWYgKCFvcGVyYXRpb24uY29sdW1uVHlwZSkgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29sdW1uIHR5cGUgZ2l2ZW5cIilcblxuICAgICAgICAgIC8vIEZsdXNoIGFuIGFscmVhZHktcmVjb3JkZWQgaW5kZXggYmF0Y2ggZmlyc3Qgc28gdGhlIGVtaXR0ZWQgU1FMIGtlZXBzXG4gICAgICAgICAgLy8gdGhlIHJlY29yZGVkIGRlY2xhcmF0aW9uIG9yZGVyIChpbmRleCBiZWZvcmUgY29sdW1uKS5cbiAgICAgICAgICBpZiAoYmF0Y2guZ2V0SW5kZXhlcygpLmxlbmd0aCA+IDApIGF3YWl0IGZsdXNoQmF0Y2goKVxuXG4gICAgICAgICAgYmF0Y2guYWRkQ29sdW1uKG5ldyBUYWJsZUNvbHVtbihvcGVyYXRpb24uY29sdW1uTmFtZSwgT2JqZWN0LmFzc2lnbih7aXNOZXdDb2x1bW46IHRydWUsIHR5cGU6IG9wZXJhdGlvbi5jb2x1bW5UeXBlfSwgb3BlcmF0aW9uLmFyZ3MpKSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyZW1vdmVDb2x1bW5cIjpcbiAgICAgICAgICAvLyBGbHVzaCBhbiBhbHJlYWR5LXJlY29yZGVkIGluZGV4IGJhdGNoIGZpcnN0IHNvIHRoZSBlbWl0dGVkIFNRTCBrZWVwc1xuICAgICAgICAgIC8vIHRoZSByZWNvcmRlZCBkZWNsYXJhdGlvbiBvcmRlciAoaW5kZXggYmVmb3JlIGNvbHVtbikuXG4gICAgICAgICAgaWYgKGJhdGNoLmdldEluZGV4ZXMoKS5sZW5ndGggPiAwKSBhd2FpdCBmbHVzaEJhdGNoKClcblxuICAgICAgICAgIGJhdGNoLmFkZENvbHVtbihuZXcgVGFibGVDb2x1bW4ob3BlcmF0aW9uLmNvbHVtbk5hbWUsIHtkcm9wQ29sdW1uOiB0cnVlfSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBcImFkZEluZGV4XCI6XG4gICAgICAgICAgLy8gRHJpdmVycyB3aXRob3V0IGBzdXBwb3J0c0J1bGtBbHRlckluZGV4ZXNgIChQb3N0Z3JlU1FMKSBrZWVwIGluZGV4ZXNcbiAgICAgICAgICAvLyBzdGFuZGFsb25lIGJlY2F1c2UgdGhlaXIgQUxURVIgVEFCTEUgZG9lcyBub3QgY2FycnkgQ1JFQVRFIElOREVYXG4gICAgICAgICAgLy8gY2xhdXNlcy4gQW4gaWZOb3RFeGlzdHMgaW5kZXggaXMgbmV2ZXIgY29tYmluZWQgYmVjYXVzZSB0aGUgY29tYmluZWRcbiAgICAgICAgICAvLyBidWxrIGZvcm0gY2Fubm90IGV4cHJlc3MgdGhhdCBndWFyZC5cbiAgICAgICAgICBpZiAoIWRyaXZlci5zdXBwb3J0c0J1bGtBbHRlckluZGV4ZXMoKSB8fCBvcGVyYXRpb24uYXJncz8uaWZOb3RFeGlzdHMpIHtcbiAgICAgICAgICAgIGF3YWl0IGZsdXNoQmF0Y2goKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0ZUNoYW5nZVRhYmxlT3BlcmF0aW9uKHRhYmxlTmFtZSwgb3BlcmF0aW9uKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiYXRjaC5hZGRJbmRleCh0aGlzLl9jaGFuZ2VUYWJsZVRhYmxlSW5kZXgodGFibGVOYW1lLCBvcGVyYXRpb24pKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGF3YWl0IGZsdXNoQmF0Y2goKVxuICAgICAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGVDaGFuZ2VUYWJsZU9wZXJhdGlvbih0YWJsZU5hbWUsIG9wZXJhdGlvbilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBmbHVzaEJhdGNoKClcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBUYWJsZUluZGV4IGZvciBhIGJhdGNoIGZyb20gYSByZWNvcmRlZCBhZGRJbmRleCBvcGVyYXRpb24sXG4gICAqIHJlc29sdmluZyB0aGUgZGVmYXVsdCBhZGRJbmRleCBuYW1lIGVhZ2VybHkgc28gYSBjb21iaW5lZCBNeVNRTCBBTFRFUlxuICAgKiBuZXZlciBzaWxlbnRseSBuYW1lcyB0aGUgaW5kZXggZGlmZmVyZW50bHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY2hhbmdlLXRhYmxlLmpzXCIpLkNoYW5nZVRhYmxlQWRkSW5kZXhPcGVyYXRpb25UeXBlfSBvcGVyYXRpb24gLSBSZWNvcmRlZCBvcGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtUYWJsZUluZGV4fSAtIFRoZSB0YWJsZSBpbmRleC5cbiAgICovXG4gIF9jaGFuZ2VUYWJsZVRhYmxlSW5kZXgodGFibGVOYW1lLCBvcGVyYXRpb24pIHtcbiAgICBjb25zdCB7YXJncywgY29sdW1uc30gPSBvcGVyYXRpb25cbiAgICAvLyBBbiBpZk5vdEV4aXN0cyBpbmRleCBuZXZlciByZWFjaGVzIGJhdGNoaW5nIChpdCBpcyBmbHVzaGVkIHN0YW5kYWxvbmUpLFxuICAgIC8vIHNvIHRoZSBjb21iaW5lZCBBTFRFUiBjYW5ub3QgY2FycnkgdGhhdCBndWFyZC5cbiAgICBjb25zdCB7bmFtZSwgLi4ucmVzdEluZGV4QXJnc30gPSBhcmdzIHx8IHt9XG4gICAgY29uc3QgaW5kZXhOYW1lID0gbmFtZSB8fCBuZXcgQ3JlYXRlSW5kZXhCYXNlKHtjb2x1bW5zLCBkcml2ZXI6IHRoaXMuZ2V0RHJpdmVyKCksIHRhYmxlTmFtZX0pLmdlbmVyYXRlSW5kZXhOYW1lKClcblxuICAgIHJldHVybiBuZXcgVGFibGVJbmRleChjb2x1bW5zLCBPYmplY3QuYXNzaWduKHt9LCByZXN0SW5kZXhBcmdzLCB7bmFtZTogaW5kZXhOYW1lfSkpXG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBzaW5nbGUgcmVjb3JkZWQgY2hhbmdlVGFibGUgb3BlcmF0aW9uIHRocm91Z2ggdGhlIGV4aXN0aW5nXG4gICAqIG1pZ3JhdGlvbiBoZWxwZXIgd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgYSBkaXJlY3QgaGVscGVyIGNhbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY2hhbmdlLXRhYmxlLmpzXCIpLkNoYW5nZVRhYmxlT3BlcmF0aW9uVHlwZX0gb3BlcmF0aW9uIC0gUmVjb3JkZWQgb3BlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgX2V4ZWN1dGVDaGFuZ2VUYWJsZU9wZXJhdGlvbih0YWJsZU5hbWUsIG9wZXJhdGlvbikge1xuICAgIHN3aXRjaCAob3BlcmF0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJhZGRDb2x1bW5cIjpcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRDb2x1bW4odGFibGVOYW1lLCBvcGVyYXRpb24uY29sdW1uTmFtZSwgb3BlcmF0aW9uLmNvbHVtblR5cGUsIG9wZXJhdGlvbi5hcmdzKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcInJlbW92ZUNvbHVtblwiOlxuICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUNvbHVtbih0YWJsZU5hbWUsIG9wZXJhdGlvbi5jb2x1bW5OYW1lKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImFkZEluZGV4XCI6XG4gICAgICAgIGF3YWl0IHRoaXMuYWRkSW5kZXgodGFibGVOYW1lLCBvcGVyYXRpb24uY29sdW1ucywgb3BlcmF0aW9uLmFyZ3MpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwicmVtb3ZlSW5kZXhcIjpcbiAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVJbmRleCh0YWJsZU5hbWUsIG9wZXJhdGlvbi5uYW1lT3JDb2x1bW5zLCBvcGVyYXRpb24uYXJncylcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJhZGRSZWZlcmVuY2VcIjpcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRSZWZlcmVuY2UodGFibGVOYW1lLCBvcGVyYXRpb24ucmVmZXJlbmNlTmFtZSwgb3BlcmF0aW9uLmFyZ3MgfHwge30pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwicmVtb3ZlUmVmZXJlbmNlXCI6XG4gICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlUmVmZXJlbmNlKHRhYmxlTmFtZSwgb3BlcmF0aW9uLnJlZmVyZW5jZU5hbWUsIG9wZXJhdGlvbi5hcmdzKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcInJlbmFtZUNvbHVtblwiOlxuICAgICAgICBhd2FpdCB0aGlzLnJlbmFtZUNvbHVtbih0YWJsZU5hbWUsIG9wZXJhdGlvbi5vbGRDb2x1bW5OYW1lLCBvcGVyYXRpb24ubmV3Q29sdW1uTmFtZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJjaGFuZ2VDb2x1bW5OdWxsXCI6XG4gICAgICAgIGF3YWl0IHRoaXMuY2hhbmdlQ29sdW1uTnVsbCh0YWJsZU5hbWUsIG9wZXJhdGlvbi5jb2x1bW5OYW1lLCBvcGVyYXRpb24ubnVsbGFibGUpXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGNoYW5nZSB0YWJsZSBvcGVyYXRpb25cIilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBkcm9wIHRhYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGRyb3BUYWJsZSh0YWJsZU5hbWUpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLmRyb3BUYWJsZSh0YWJsZU5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZW5hbWUgY29sdW1uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9sZENvbHVtbk5hbWUgLSBQcmV2aW91cyBjb2x1bW4gbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5ld0NvbHVtbk5hbWUgLSBOZXcgY29sdW1uIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyByZW5hbWVDb2x1bW4odGFibGVOYW1lLCBvbGRDb2x1bW5OYW1lLCBuZXdDb2x1bW5OYW1lKSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5yZW5hbWVDb2x1bW4odGFibGVOYW1lLCBvbGRDb2x1bW5OYW1lLCBuZXdDb2x1bW5OYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGFibGUgZXhpc3RzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gUmVzb2x2ZXMgd2l0aCBXaGV0aGVyIHRhYmxlIGV4aXN0cy5cbiAgICovXG4gIGFzeW5jIHRhYmxlRXhpc3RzKHRhYmxlTmFtZSkge1xuICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkudGFibGVFeGlzdHModGFibGVOYW1lKVxuXG4gICAgcmV0dXJuIGV4aXN0c1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlcjogY3JlYXRlcyB0aGUgc2hhcmVkIGF1ZGl0IHRhYmxlcyAoYGF1ZGl0X2FjdGlvbnNgLFxuICAgKiBgYXVkaXRfYXVkaXRhYmxlX3R5cGVzYCwgYGF1ZGl0c2ApLiBDYWxsIGZyb20gYHVwKClgIGluIGEgbWlncmF0aW9uLlxuICAgKiBAcGFyYW0ge3tpZD86IHt0eXBlPzogc3RyaW5nfX19IFtvcHRpb25zXSAtIElEIGNvbHVtbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNoYXJlZEF1ZGl0VGFibGVzKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGlkID0gb3B0aW9ucy5pZCB8fCB7fVxuXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVUYWJsZShcImF1ZGl0X2FjdGlvbnNcIiwge2lkfSwgKHRhYmxlKSA9PiB7XG4gICAgICB0YWJsZS5zdHJpbmcoXCJhY3Rpb25cIiwge2luZGV4OiB7dW5pcXVlOiB0cnVlfSwgbnVsbDogZmFsc2V9KVxuICAgICAgdGFibGUudGltZXN0YW1wcygpXG4gICAgfSlcblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlVGFibGUoXCJhdWRpdF9hdWRpdGFibGVfdHlwZXNcIiwge2lkfSwgKHRhYmxlKSA9PiB7XG4gICAgICB0YWJsZS5zdHJpbmcoXCJuYW1lXCIsIHtpbmRleDoge3VuaXF1ZTogdHJ1ZX0sIG51bGw6IGZhbHNlfSlcbiAgICAgIHRhYmxlLnRpbWVzdGFtcHMoKVxuICAgIH0pXG5cbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKFwiYXVkaXRzXCIsIHtpZH0sICh0YWJsZSkgPT4ge1xuICAgICAgdGFibGUucmVmZXJlbmNlcyhcImF1ZGl0X2FjdGlvblwiLCB7Zm9yZWlnbktleTogdHJ1ZSwgbnVsbDogZmFsc2V9KVxuICAgICAgdGFibGUucmVmZXJlbmNlcyhcImF1ZGl0X2F1ZGl0YWJsZV90eXBlXCIsIHtmb3JlaWduS2V5OiB0cnVlLCBudWxsOiBmYWxzZX0pXG4gICAgICB0YWJsZS5yZWZlcmVuY2VzKFwiYXVkaXRhYmxlXCIsIHtudWxsOiBmYWxzZSwgcG9seW1vcnBoaWM6IHRydWV9KVxuICAgICAgdGFibGUuanNvbihcImF1ZGl0ZWRfY2hhbmdlc1wiKVxuICAgICAgdGFibGUuanNvbihcInBhcmFtc1wiKVxuICAgICAgdGFibGUudGltZXN0YW1wcygpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXI6IGNyZWF0ZXMgYSBkZWRpY2F0ZWQgYXVkaXQgdGFibGUgZm9yIGEgbW9kZWwgKGUuZy5cbiAgICogYHByb2plY3RfYXVkaXRzYCBmb3IgdGhlIGBwcm9qZWN0c2AgdGFibGUpLiBDYWxsIGZyb20gYHVwKClgXG4gICAqIGluIGEgbWlncmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxUYWJsZU5hbWUgLSBNb2RlbCB0YWJsZSBuYW1lIChlLmcuIFwicHJvamVjdHNcIikuXG4gICAqIEBwYXJhbSB7e2lkPzoge3R5cGU/OiBzdHJpbmd9fX0gW29wdGlvbnNdIC0gSUQgY29sdW1uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFRoZSBjcmVhdGVkIGF1ZGl0IHRhYmxlIG5hbWUuXG4gICAqL1xuICBhc3luYyBjcmVhdGVEZWRpY2F0ZWRBdWRpdFRhYmxlKG1vZGVsVGFibGVOYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBhdWRpdFRhYmxlID0gZGVkaWNhdGVkQXVkaXRUYWJsZU5hbWUobW9kZWxUYWJsZU5hbWUpXG4gICAgY29uc3QgaWQgPSBvcHRpb25zLmlkIHx8IHt9XG5cbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKGF1ZGl0VGFibGUsIHtpZH0sICh0YWJsZSkgPT4ge1xuICAgICAgY29uc3QgcmVmS2V5ID0gaW5mbGVjdGlvbi5zaW5ndWxhcml6ZShtb2RlbFRhYmxlTmFtZSlcblxuICAgICAgdGFibGUucmVmZXJlbmNlcyhyZWZLZXksIHtmb3JlaWduS2V5OiB0cnVlLCBudWxsOiBmYWxzZX0pXG4gICAgICB0YWJsZS5yZWZlcmVuY2VzKFwiYXVkaXRfYWN0aW9uXCIsIHtmb3JlaWduS2V5OiB0cnVlLCBudWxsOiBmYWxzZX0pXG4gICAgICB0YWJsZS5qc29uKFwiYXVkaXRlZF9jaGFuZ2VzXCIpXG4gICAgICB0YWJsZS5qc29uKFwicGFyYW1zXCIpXG4gICAgICB0YWJsZS50aW1lc3RhbXBzKClcbiAgICB9KVxuXG4gICAgcmV0dXJuIGF1ZGl0VGFibGVcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGRlZGljYXRlZCBhdWRpdCB0YWJsZSBuYW1lIGZvciBhIG1vZGVsIHRhYmxlLlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsVGFibGVOYW1lIC0gTW9kZWwgdGFibGUgbmFtZSAoZS5nLiBcInByb2plY3RzXCIpLlxuICogQHJldHVybnMge3N0cmluZ30gRGVkaWNhdGVkIGF1ZGl0IHRhYmxlIG5hbWUgKGUuZy4gXCJwcm9qZWN0X2F1ZGl0c1wiKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZGljYXRlZEF1ZGl0VGFibGVOYW1lKG1vZGVsVGFibGVOYW1lKSB7XG4gIGlmIChtb2RlbFRhYmxlTmFtZS5lbmRzV2l0aChcInNcIikpIHtcbiAgICByZXR1cm4gYCR7bW9kZWxUYWJsZU5hbWUuc2xpY2UoMCwgLTEpfV9hdWRpdHNgXG4gIH1cblxuICByZXR1cm4gYCR7bW9kZWxUYWJsZU5hbWV9X2F1ZGl0c2Bcbn1cbiJdfQ==
|
|
858
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvbWlncmF0aW9uL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWiwrRkFBK0Y7QUFDL0Y7Ozs7O0dBS0c7QUFDSDs7Ozs7R0FLRztBQUNIOzs7R0FHRztBQUNIOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQzNFLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sYUFBYSxNQUFNLGdDQUFnQyxDQUFBO0FBQzFELE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQzVHLE9BQU8sV0FBVyxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sZUFBZSxNQUFNLCtCQUErQixDQUFBO0FBQzNELE9BQU8sV0FBVyxNQUFNLCtCQUErQixDQUFBO0FBQ3ZELE9BQU8sU0FBUyxNQUFNLHdCQUF3QixDQUFBO0FBQzlDLE9BQU8sVUFBVSxNQUFNLDhCQUE4QixDQUFBO0FBQ3JELE1BQU0sbUJBQW9CLFNBQVEsS0FBSztDQUFHO0FBRTFDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxDQUFBO0FBRTVCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sMEJBQTBCO0lBQzdDLDRGQUE0RjtJQUM1RixNQUFNLENBQUMsZUFBZSxDQUFBO0lBRXRCOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUs7UUFDckIsSUFBSSxDQUFDLGVBQWUsR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN2RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLGlCQUFpQjtRQUN0QixPQUFPLElBQUksQ0FBQyxlQUFlLElBQUksaUNBQWlDLENBQUE7SUFDbEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsV0FBVyxDQUFDLG1CQUFtQjtRQUNwQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsbUJBQW1CLENBQUE7SUFDakQsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxzQkFBc0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUE7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFlBQVksRUFBQyxhQUFhLEVBQUUsa0JBQWtCLEdBQUcsU0FBUyxFQUFFLEVBQUUsRUFBQztRQUM3RCxJQUFJLENBQUMsa0JBQWtCO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO1FBQ3hFLElBQUksQ0FBQyxFQUFFO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUV6QyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsa0JBQWtCLENBQUE7UUFDN0MsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUE7SUFDZixDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO1FBRTVFLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFBO0lBQ2pDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLEtBQUssT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFBLENBQUMsQ0FBQztJQUMvQixVQUFVLEtBQUssT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUEsQ0FBQyxDQUFDO0lBRXhDLEtBQUssQ0FBQyxNQUFNO1FBQ1YsTUFBTSxJQUFJLG1CQUFtQixDQUFDLDBCQUEwQixDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVELEtBQUssQ0FBQyxFQUFFO1FBQ04sTUFBTSxJQUFJLG1CQUFtQixDQUFDLDBCQUEwQixDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJO1FBQ1IsTUFBTSxJQUFJLG1CQUFtQixDQUFDLDBCQUEwQixDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUc7UUFDZixPQUFPLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUMzQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsSUFBSTtRQUNyRCxJQUFJLENBQUMsVUFBVTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtRQUV4RCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDbEYsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFMUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsZUFBZSxDQUFDLENBQUE7UUFFaEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRTdELEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxVQUFVO1FBQ3RDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtRQUN6RCxNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUUxQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQTtRQUVoRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFN0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSTtRQUNyQyxNQUFNLGlCQUFpQixHQUFHLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFBO1FBQzNFLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQ25DO1lBQ0UsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixTQUFTO1NBQ1YsRUFDRCxJQUFJLENBQ0wsQ0FBQTtRQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUVwRSxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDbkQsTUFBTSxFQUFDLElBQUksRUFBRSxHQUFHLFFBQVEsRUFBQyxHQUFHLElBQUksQ0FBQTtRQUVoQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFdkIsTUFBTSxlQUFlLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDL0UsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDLEVBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFBO1FBRXZGLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsYUFBYTtRQUN2QyxJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVE7WUFBRSxPQUFPLGFBQWEsQ0FBQTtRQUUzRCxNQUFNLFdBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBQztZQUN0QyxPQUFPLEVBQUUsYUFBYTtZQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN4QixTQUFTO1NBQ1YsQ0FBQyxDQUFBO1FBRUYsT0FBTyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtJQUN4QyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNIOzs7Ozs7Ozs7O09BVUc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDckQsTUFBTSxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxRQUFRLEVBQUMsR0FBRyxJQUFJLENBQUE7UUFFdkYsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZCLE1BQU0sdUJBQXVCLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUNwRSxNQUFNLDJCQUEyQixHQUFHLG1CQUFtQixJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtRQUN4RyxNQUFNLGtCQUFrQixHQUFHLFVBQVUsSUFBSSxHQUFHLHVCQUF1QixLQUFLLENBQUE7UUFDeEUsTUFBTSw0QkFBNEIsR0FBRyxvQkFBb0IsSUFBSSxJQUFJLENBQUE7UUFDakUsTUFBTSxZQUFZLEdBQUcsSUFBSSxJQUFJLE1BQU0sU0FBUyxJQUFJLGFBQWEsRUFBRSxDQUFBO1FBRS9ELE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLGFBQWEsQ0FDbEMsU0FBUyxFQUNULGtCQUFrQixFQUNsQiwyQkFBMkIsRUFDM0IsNEJBQTRCLEVBQzVCO1lBQ0UsZUFBZSxFQUFFLElBQUk7WUFDckIsSUFBSSxFQUFFLFlBQVk7U0FDbkIsQ0FDRixDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUN4RCxNQUFNLEVBQUMsVUFBVSxFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsSUFBSSxDQUFBO1FBRXRDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixNQUFNLGtCQUFrQixHQUFHLFVBQVUsSUFBSSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQTtRQUNyRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7UUFDL0IsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFBO1FBQ3ZCLElBQUkscUJBQXFCLEdBQUcsQ0FBQyxDQUFBO1FBRTdCLEtBQUssSUFBSSxjQUFjLEdBQUcsQ0FBQyxHQUFJLGNBQWMsRUFBRSxFQUFFLENBQUM7WUFDaEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBRXBELElBQUksQ0FBQyxLQUFLO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxTQUFTLGlCQUFpQixDQUFDLENBQUE7WUFFaEUsTUFBTSxXQUFXLEdBQUcsTUFBTSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUE7WUFDaEQsTUFBTSxtQkFBbUIsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLElBQUksa0JBQWtCLENBQUMsQ0FBQTtZQUVoSCxJQUFJLG1CQUFtQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxjQUFjLEtBQUssQ0FBQztvQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixTQUFTLElBQUksa0JBQWtCLEVBQUUsQ0FBQyxDQUFBO2dCQUVqRyxPQUFNO1lBQ1IsQ0FBQztZQUVELElBQUksY0FBYyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN6QixlQUFlLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFBO1lBQzlDLENBQUM7aUJBQU0sSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLElBQUkscUJBQXFCLEVBQUUsQ0FBQztnQkFDL0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsU0FBUyxJQUFJLGtCQUFrQixFQUFFLENBQUMsQ0FBQTtZQUNyRyxDQUFDO1lBRUQsSUFBSSxjQUFjLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELFNBQVMsSUFBSSxrQkFBa0IsRUFBRSxDQUFDLENBQUE7WUFDeEcsQ0FBQztZQUVELHFCQUFxQixHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQTtZQUNsRCxNQUFNLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNsRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsSUFBSTtRQUMvQyxNQUFNLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLFFBQVEsRUFBQyxHQUFHLElBQUksQ0FBQTtRQUNwRSxNQUFNLFVBQVUsR0FBRyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQTtRQUUvRCxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFdkIsTUFBTSxVQUFVLEdBQUcsSUFBSSxJQUFJLFNBQVMsQ0FBQTtRQUNwQyxNQUFNLFVBQVUsR0FBRyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBRXhFLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUNuRSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUU5RCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUNwRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0g7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ3ZELE1BQU0sRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsSUFBSSxDQUFBO1FBRWpELGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUV2QixNQUFNLGtCQUFrQixHQUFHLFVBQVUsSUFBSSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQTtRQUNyRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7UUFDL0IsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRXBELElBQUksQ0FBQyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLFNBQVMsaUJBQWlCLENBQUMsQ0FBQTtRQUVoRSxNQUFNLFdBQVcsR0FBRyxNQUFNLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUVoRCxLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLElBQUksVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLGtCQUFrQjtnQkFBRSxTQUFRO1lBRTlELE1BQU0sTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUN0RCxDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQTtRQUM3RixNQUFNLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUN4QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUE7WUFFL0MsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUU7Z0JBQzFCLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxpQkFBaUI7Z0JBQ3BDLGdCQUFnQixDQUFDLE1BQU0sSUFBSSxDQUFDO2dCQUM1QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxrQkFBa0IsQ0FBQTtRQUM3QyxDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUM3RCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRO1FBQ3BELE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUU5RCxJQUFJLENBQUMsS0FBSztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxTQUFTLGlCQUFpQixDQUFDLENBQUE7UUFFaEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRXRELElBQUksQ0FBQyxNQUFNO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLFVBQVUsNEJBQTRCLFNBQVMsRUFBRSxDQUFDLENBQUE7UUFFekYsTUFBTSxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxJQUFJLEdBQUcsRUFBRTtRQUNyRCxNQUFNLEVBQUMsY0FBYyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sRUFBRSxHQUFHLFFBQVEsRUFBQyxHQUFHLElBQUksQ0FBQTtRQUU1RSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFdkIsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsK0JBQStCLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFckUsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQztnQkFDM0MsY0FBYztnQkFDZCx3QkFBd0I7Z0JBQ3hCLFNBQVM7YUFDVixDQUFDLENBQUE7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsK0JBQStCLENBQUMsTUFBTTtRQUMxQyxJQUFJLE1BQU07WUFBRSxPQUFPLE1BQU0sQ0FBQTtRQUV6QixPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7YUFDeEMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDL0IsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLElBQUksbUJBQW1CLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7SUFDaEcsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsaUNBQWlDLENBQUMsRUFBQyxjQUFjLEVBQUUsd0JBQXdCLEVBQUUsU0FBUyxFQUFDO1FBQzNGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUMvQixNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUMxRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxFQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1FBRWhGLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTTtRQUVoQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLCtCQUErQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzFFLE1BQU0sZUFBZSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQTtRQUN0RCxNQUFNLFNBQVMsR0FBRyxlQUFlO2FBQzlCLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDYixNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxTQUFTLFNBQVMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFM0YsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixLQUFLLE1BQU0sVUFBVSxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNqQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7Z0JBQzdCLE1BQU0sY0FBYyxHQUFHLGtDQUFrQyxDQUFDLEtBQUssRUFBRTtvQkFDL0QsWUFBWSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUU7b0JBQzlCLHdCQUF3QjtpQkFDekIsQ0FBQyxDQUFBO2dCQUVGLElBQUksY0FBYyxLQUFLLEtBQUs7b0JBQUUsU0FBUTtnQkFFdEMsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDO21CQUNSLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO2dCQUMvQixNQUFNLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO2tCQUM5RCxNQUFNLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUN0RixDQUFDLENBQUE7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsNEJBQTRCLENBQUMsRUFBQyxjQUFjLEVBQUUsS0FBSyxFQUFDO1FBQ3hELE1BQU0sZUFBZSxHQUFHLGNBQWMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBRXpELElBQUksZUFBZTtZQUFFLE9BQU8sZUFBZSxDQUFBO1FBRTNDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQzthQUM5QixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUN0RSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gscUNBQXFDLENBQUMsTUFBTTtRQUMxQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUE7UUFFakQsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDeEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsK0JBQStCLENBQUMsS0FBSztRQUN6QyxNQUFNLGlCQUFpQixHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFBO1FBRS9GLElBQUksaUJBQWlCLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLEtBQUssQ0FBQyxPQUFPLEVBQUUsY0FBYyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ2pILENBQUM7UUFFRCxPQUFPLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFVBQVU7UUFDdEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRTlELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFdEQsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxPQUFPLElBQUksQ0FBQTtZQUNiLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsU0FBUztRQUNwQyxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7UUFFbkYsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxLQUFLLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztnQkFDN0MsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ2pDLE9BQU8sSUFBSSxDQUFBO2dCQUNiLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsRUFBQyxLQUFLLEVBQUM7UUFDcEQsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDMUQsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLEVBQUMsSUFBSSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7UUFDM0UsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQy9ELENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7SUFDekUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNIOzs7Ozs7O09BT0c7SUFDSDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSTtRQUNyQyxJQUFJLElBQUksQ0FBQTtRQUNSLElBQUksUUFBUSxDQUFBO1FBRVosSUFBSSxPQUFPLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUM5QixJQUFJLEdBQUcsRUFBRSxDQUFBO1lBQ1QsUUFBUSxHQUFHLElBQUksQ0FBQTtRQUNqQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksR0FBRyxJQUFJLENBQUE7WUFDWCxRQUFRLEdBQUcsSUFBSSxDQUFBO1FBQ2pCLENBQUM7UUFFRCxNQUFNLEVBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxXQUFXLEdBQUcsS0FBSyxFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsSUFBSSxDQUFBO1FBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUMvQixNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUNyRCxJQUFJLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFBO1FBRWpDLElBQUksRUFBRSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ2pCLENBQUMsRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxVQUFVLEVBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtZQUV4RCxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDM0IsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQTtRQUNoQyxDQUFDO1FBQ0QsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxDQUFBO1FBQzFFLE1BQU0sV0FBVyxHQUFHLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQTtRQUN6QyxNQUFNLGdCQUFnQixHQUFHLFdBQVcsSUFBSSxNQUFNLENBQUE7UUFDOUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUNyRixJQUFJLGVBQWUsR0FBRyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBRTNFLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQixlQUFlLEdBQUcsS0FBSyxDQUFBO1lBRXZCLElBQUkseUJBQXlCLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzVCLFNBQVMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUE7Z0JBQzVCLENBQUM7WUFDSCxDQUFDO2lCQUFNLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNuQyw2RkFBNkY7Z0JBQzdGLFNBQVMsR0FBRyxTQUFTLENBQUE7WUFDdkIsQ0FBQztZQUNELHdGQUF3RjtRQUMxRixDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFLEVBQUMsV0FBVyxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBQyxDQUFDLENBQUE7UUFFaEcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZCLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBRXRGLElBQUksRUFBRSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ2pCLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUM5SCxDQUFDO1FBRUQsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNyQixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRW5ELEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFFSDs7O09BR0c7SUFFSDs7Ozs7O09BTUc7SUFDSDs7Ozs7OztPQU9HO0lBQ0g7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUk7UUFDckMsSUFBSSxJQUFJLEdBQUcsa0NBQWtDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNsRCxJQUFJLFFBQVEsQ0FBQTtRQUVaLElBQUksT0FBTyxJQUFJLElBQUksVUFBVSxFQUFFLENBQUM7WUFDOUIsUUFBUSxHQUFHLElBQUksQ0FBQTtRQUNqQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1lBQ2pCLFFBQVEsR0FBRyxJQUFJLENBQUE7UUFDakIsQ0FBQztRQUVELElBQUksT0FBTyxRQUFRLElBQUksVUFBVTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUV2RSxNQUFNLEVBQUMsSUFBSSxHQUFHLEtBQUssRUFBRSxHQUFHLFFBQVEsRUFBQyxHQUFHLElBQUksQ0FBQTtRQUV4QyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFdkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxDQUFBO1FBRTFDLE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXJCLE1BQU0sSUFBSSxDQUFDLDZCQUE2QixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLEVBQUUsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFBO0lBQ3BGLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsS0FBSyxDQUFDLDZCQUE2QixDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFBQyxJQUFJLEVBQUM7UUFDL0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBQy9CLE1BQU0sYUFBYSxHQUFHLElBQUksSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUV4RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQy9ELENBQUM7WUFFRCxPQUFNO1FBQ1IsQ0FBQztRQUVELElBQUksS0FBSyxHQUFHLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRXBDLE1BQU0sVUFBVSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQzVCLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDO2dCQUFFLE9BQU07WUFFNUUsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBRS9DLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN6QixDQUFDO1lBRUQsS0FBSyxHQUFHLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2xDLENBQUMsQ0FBQTtRQUVELEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7WUFDbkMsUUFBUSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZCLEtBQUssV0FBVyxFQUFFLENBQUM7b0JBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVTt3QkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUE7b0JBRWxFLHVFQUF1RTtvQkFDdkUsd0RBQXdEO29CQUN4RCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFBRSxNQUFNLFVBQVUsRUFBRSxDQUFBO29CQUVyRCxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO29CQUN0SSxNQUFLO2dCQUNQLENBQUM7Z0JBQ0QsS0FBSyxjQUFjO29CQUNqQix1RUFBdUU7b0JBQ3ZFLHdEQUF3RDtvQkFDeEQsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQUUsTUFBTSxVQUFVLEVBQUUsQ0FBQTtvQkFFckQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsQ0FBQTtvQkFDMUUsTUFBSztnQkFDUCxLQUFLLFVBQVU7b0JBQ2IsdUVBQXVFO29CQUN2RSxtRUFBbUU7b0JBQ25FLHVFQUF1RTtvQkFDdkUsdUNBQXVDO29CQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLHdCQUF3QixFQUFFLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQzt3QkFDdEUsTUFBTSxVQUFVLEVBQUUsQ0FBQTt3QkFDbEIsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFBO29CQUMvRCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUE7b0JBQ25FLENBQUM7b0JBQ0QsTUFBSztnQkFDUDtvQkFDRSxNQUFNLFVBQVUsRUFBRSxDQUFBO29CQUNsQixNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUE7WUFDakUsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLFVBQVUsRUFBRSxDQUFBO0lBQ3BCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsc0JBQXNCLENBQUMsU0FBUyxFQUFFLFNBQVM7UUFDekMsTUFBTSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUMsR0FBRyxTQUFTLENBQUE7UUFDakMsMEVBQTBFO1FBQzFFLGlEQUFpRDtRQUNqRCxNQUFNLEVBQUMsSUFBSSxFQUFFLEdBQUcsYUFBYSxFQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUMzQyxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksSUFBSSxlQUFlLENBQUMsRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFFakgsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsYUFBYSxFQUFFLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUMsQ0FBQTtJQUNyRixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxTQUFTO1FBQ3JELFFBQVEsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZCLEtBQUssV0FBVztnQkFDZCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQzNGLE1BQUs7WUFDUCxLQUFLLGNBQWM7Z0JBQ2pCLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFBO2dCQUN4RCxNQUFLO1lBQ1AsS0FBSyxVQUFVO2dCQUNiLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ2pFLE1BQUs7WUFDUCxLQUFLLGFBQWE7Z0JBQ2hCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQzFFLE1BQUs7WUFDUCxLQUFLLGNBQWM7Z0JBQ2pCLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFBO2dCQUNqRixNQUFLO1lBQ1AsS0FBSyxpQkFBaUI7Z0JBQ3BCLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQzlFLE1BQUs7WUFDUCxLQUFLLGNBQWM7Z0JBQ2pCLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUE7Z0JBQ3BGLE1BQUs7WUFDUCxLQUFLLGtCQUFrQjtnQkFDckIsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUNoRixNQUFLO1lBQ1A7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFBO1FBQ3JELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUztRQUN2QixNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDN0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxhQUFhO1FBQ3hELE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQzlFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUU1RCxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEdBQUcsRUFBRTtRQUN4QyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQTtRQUUzQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLEVBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0RCxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtZQUM1RCxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDcEIsQ0FBQyxDQUFDLENBQUE7UUFFRixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLEVBQUUsRUFBQyxFQUFFLEVBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzlELEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1lBQzFELEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUNwQixDQUFDLENBQUMsQ0FBQTtRQUVGLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsRUFBQyxFQUFFLEVBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQy9DLEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtZQUNqRSxLQUFLLENBQUMsVUFBVSxDQUFDLHNCQUFzQixFQUFFLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtZQUN6RSxLQUFLLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7WUFDL0QsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1lBQzdCLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDcEIsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ3BCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMseUJBQXlCLENBQUMsY0FBYyxFQUFFLE9BQU8sR0FBRyxFQUFFO1FBQzFELE1BQU0sVUFBVSxHQUFHLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQzFELE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFBO1FBRTNCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsRUFBQyxFQUFFLEVBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2pELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUE7WUFFckQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1lBQ3pELEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtZQUNqRSxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7WUFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNwQixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDcEIsQ0FBQyxDQUFDLENBQUE7UUFFRixPQUFPLFVBQVUsQ0FBQTtJQUNuQixDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLGNBQWM7SUFDcEQsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNoRCxDQUFDO0lBRUQsT0FBTyxHQUFHLGNBQWMsU0FBUyxDQUFBO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuLi90YWJsZS1kYXRhL3RhYmxlLWNvbHVtbi5qc1wiKS5UYWJsZUNvbHVtbkFyZ3NUeXBlfSBBZGRDb2x1bW5BcmdzVHlwZSAqL1xuLyoqXG4gKiBDcmVhdGVUYWJsZUlkQXJnc1R5cGUgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IENyZWF0ZVRhYmxlSWRBcmdzVHlwZVxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gW2RlZmF1bHRdIC0gRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIElEIGNvbHVtbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdHlwZV0gLSBDb2x1bW4gdHlwZSBmb3IgdGhlIElEIGNvbHVtbi5cbiAqL1xuLyoqXG4gKiBDcmVhdGVUYWJsZUFyZ3NUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDcmVhdGVUYWJsZUFyZ3NUeXBlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZk5vdEV4aXN0c10gLSBTa2lwIGNyZWF0aW9uIGlmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cy5cbiAqIEBwcm9wZXJ0eSB7Q3JlYXRlVGFibGVJZEFyZ3NUeXBlIHwgZmFsc2V9IFtpZF0gLSBJRCBjb2x1bW4gb3B0aW9ucyBvciBmYWxzZSB0byBza2lwIElELlxuICovXG4vKipcbiAqIENyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlIHR5cGUuXG4gKiBAdHlwZWRlZiB7KHRhYmxlOiBUYWJsZURhdGEpID0+IHZvaWR9IENyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlXG4gKi9cbi8qKlxuICogTGVnYWN5TG9jYWxEYXRlVGltZXNNaWdyYXRpb25BcmdzVHlwZSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gTGVnYWN5TG9jYWxEYXRlVGltZXNNaWdyYXRpb25BcmdzVHlwZVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IFtjb2x1bW5zQnlUYWJsZV0gLSBFeHBsaWNpdCBkYXRldGltZSBjb2x1bW5zIGtleWVkIGJ5IHRhYmxlIG5hbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2xlZ2FjeUxvY2FsT2Zmc2V0TWludXRlc10gLSBVVEMtbWludXMtbG9jYWwgb2Zmc2V0IGluIG1pbnV0ZXMgZm9yIGxlZ2FjeSByb3dzLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3RhYmxlc10gLSBUYWJsZXMgdG8gbWlncmF0ZS4gRGVmYXVsdHMgdG8gYWxsIG5vbi1pbnRlcm5hbCB0YWJsZXMuXG4gKi9cblxuaW1wb3J0IHsgY29udmVydExlZ2FjeURhdGVWYWx1ZVRvVXRjU3RvcmFnZSB9IGZyb20gXCIuLi9kYXRldGltZS1zdG9yYWdlLmpzXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uLy4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5pbXBvcnQgeyBERUZBVUxUX01JR1JBVElPTl9FWEVDVVRJT05fUEhBU0UsIG1pZ3JhdGlvbkV4ZWN1dGlvblBoYXNlIH0gZnJvbSBcIi4uL21pZ3JhdGlvbi1leGVjdXRpb24tcGhhc2UuanNcIlxuaW1wb3J0IENoYW5nZVRhYmxlIGZyb20gXCIuL2NoYW5nZS10YWJsZS5qc1wiXG5pbXBvcnQgQ3JlYXRlSW5kZXhCYXNlIGZyb20gXCIuLi9xdWVyeS9jcmVhdGUtaW5kZXgtYmFzZS5qc1wiXG5pbXBvcnQgVGFibGVDb2x1bW4gZnJvbSBcIi4uL3RhYmxlLWRhdGEvdGFibGUtY29sdW1uLmpzXCJcbmltcG9ydCBUYWJsZURhdGEgZnJvbSBcIi4uL3RhYmxlLWRhdGEvaW5kZXguanNcIlxuaW1wb3J0IFRhYmxlSW5kZXggZnJvbSBcIi4uL3RhYmxlLWRhdGEvdGFibGUtaW5kZXguanNcIlxuY2xhc3MgTm90SW1wbGVtZW50ZWRFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbmV4cG9ydCB7Tm90SW1wbGVtZW50ZWRFcnJvcn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRGF0YWJhc2VNaWdyYXRpb24ge1xuICAvKiogQHR5cGUge2ltcG9ydChcIi4uL21pZ3JhdGlvbi1leGVjdXRpb24tcGhhc2UuanNcIikuTWlncmF0aW9uRXhlY3V0aW9uUGhhc2UgfCB1bmRlZmluZWR9ICovXG4gIHN0YXRpYyBfZXhlY3V0aW9uUGhhc2VcblxuICAvKipcbiAgICogRGVjbGFyZXMgd2hlbiB0aGlzIG1pZ3JhdGlvbiBpcyBlbGlnaWJsZSB0byBydW4uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vbWlncmF0aW9uLWV4ZWN1dGlvbi1waGFzZS5qc1wiKS5NaWdyYXRpb25FeGVjdXRpb25QaGFzZX0gcGhhc2UgLSBFeGVjdXRpb24gcGhhc2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBydW5JblBoYXNlKHBoYXNlKSB7XG4gICAgdGhpcy5fZXhlY3V0aW9uUGhhc2UgPSBtaWdyYXRpb25FeGVjdXRpb25QaGFzZShwaGFzZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkZWNsYXJlZCBleGVjdXRpb24gcGhhc2UuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9taWdyYXRpb24tZXhlY3V0aW9uLXBoYXNlLmpzXCIpLk1pZ3JhdGlvbkV4ZWN1dGlvblBoYXNlfSAtIERlY2xhcmVkIGV4ZWN1dGlvbiBwaGFzZS5cbiAgICovXG4gIHN0YXRpYyBnZXRFeGVjdXRpb25QaGFzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZXhlY3V0aW9uUGhhc2UgfHwgREVGQVVMVF9NSUdSQVRJT05fRVhFQ1VUSU9OX1BIQVNFXG4gIH1cblxuICAvKipcbiAgICogUnVucyBvbiBkYXRhYmFzZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGRhdGFiYXNlSWRlbnRpZmllcnMgLSBEYXRhYmFzZSBpZGVudGlmaWVycy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc3RhdGljIG9uRGF0YWJhc2VzKGRhdGFiYXNlSWRlbnRpZmllcnMpIHtcbiAgICB0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXJzID0gZGF0YWJhc2VJZGVudGlmaWVyc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IGRhdGFiYXNlIGlkZW50aWZpZXJzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW10gfCB1bmRlZmluZWR9IC0gVGhlIGRhdGFiYXNlIGlkZW50aWZpZXJzLlxuICAgKi9cbiAgc3RhdGljIGdldERhdGFiYXNlSWRlbnRpZmllcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFiYXNlSWRlbnRpZmllcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZGF0YWJhc2VJZGVudGlmaWVyIC0gRGF0YWJhc2UgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gYXJncy5kYiAtIERhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgZGF0YWJhc2VJZGVudGlmaWVyID0gXCJkZWZhdWx0XCIsIGRifSkge1xuICAgIGlmICghZGF0YWJhc2VJZGVudGlmaWVyKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBkYXRhYmFzZSBpZGVudGlmaWVyIGdpdmVuXCIpXG4gICAgaWYgKCFkYikgdGhyb3cgbmV3IEVycm9yKFwiTm8gJ2RiJyBnaXZlblwiKVxuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMuX2RhdGFiYXNlSWRlbnRpZmllciA9IGRhdGFiYXNlSWRlbnRpZmllclxuICAgIHRoaXMuX2RiID0gZGJcbiAgfVxuXG4gIF9nZXREYXRhYmFzZUlkZW50aWZpZXIoKSB7XG4gICAgaWYgKCF0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXIpIHRocm93IG5ldyBFcnJvcihcIk5vIGRhdGFiYXNlIGlkZW50aWZpZXIgc2V0XCIpXG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YWJhc2VJZGVudGlmaWVyXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgZHJpdmVyLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IC0gVGhlIGRyaXZlci5cbiAgICovXG4gIGdldERyaXZlcigpIHsgcmV0dXJuIHRoaXMuX2RiIH1cbiAgY29ubmVjdGlvbigpIHsgcmV0dXJuIHRoaXMuZ2V0RHJpdmVyKCkgfVxuXG4gIGFzeW5jIGNoYW5nZSgpIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcIidjaGFuZ2UnIG5vdCBpbXBsZW1lbnRlZFwiKVxuICB9XG5cbiAgYXN5bmMgdXAoKSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCInY2hhbmdlJyBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIGFzeW5jIGRvd24oKSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXCInY2hhbmdlJyBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV4ZWN1dGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcWwgLSBTUUwgc3RyaW5nLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UuanNcIikuUXVlcnlSZXN1bHRUeXBlPn0gLSBSZXNvbHZlcyB3aXRoIHRoZSBleGVjdXRlLlxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShzcWwpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25uZWN0aW9uKCkucXVlcnkoc3FsKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGNvbHVtbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5UeXBlIC0gQ29sdW1uIHR5cGUuXG4gICAqIEBwYXJhbSB7QWRkQ29sdW1uQXJnc1R5cGV9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYWRkQ29sdW1uKHRhYmxlTmFtZSwgY29sdW1uTmFtZSwgY29sdW1uVHlwZSwgYXJncykge1xuICAgIGlmICghY29sdW1uVHlwZSkgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29sdW1uIHR5cGUgZ2l2ZW5cIilcblxuICAgIGNvbnN0IHRhYmxlQ29sdW1uQXJncyA9IE9iamVjdC5hc3NpZ24oe2lzTmV3Q29sdW1uOiB0cnVlLCB0eXBlOiBjb2x1bW5UeXBlfSwgYXJncylcbiAgICBjb25zdCB0YWJsZURhdGEgPSBuZXcgVGFibGVEYXRhKHRhYmxlTmFtZSlcblxuICAgIHRhYmxlRGF0YS5hZGRDb2x1bW4oY29sdW1uTmFtZSwgdGFibGVDb2x1bW5BcmdzKVxuXG4gICAgY29uc3Qgc3FscyA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuYWx0ZXJUYWJsZVNRTHModGFibGVEYXRhKVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2Ygc3Fscykge1xuICAgICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5xdWVyeShzcWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3ZlIGNvbHVtbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gQ29sdW1uIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyByZW1vdmVDb2x1bW4odGFibGVOYW1lLCBjb2x1bW5OYW1lKSB7XG4gICAgY29uc3QgdGFibGVDb2x1bW5BcmdzID0gT2JqZWN0LmFzc2lnbih7ZHJvcENvbHVtbjogdHJ1ZX0pXG4gICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFRhYmxlRGF0YSh0YWJsZU5hbWUpXG5cbiAgICB0YWJsZURhdGEuYWRkQ29sdW1uKGNvbHVtbk5hbWUsIHRhYmxlQ29sdW1uQXJncylcblxuICAgIGNvbnN0IHNxbHMgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmFsdGVyVGFibGVTUUxzKHRhYmxlRGF0YSlcblxuICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRJbmRleEFyZ3NUeXBlIHR5cGUuXG4gICAqIEB0eXBlZGVmIHtvYmplY3R9IEFkZEluZGV4QXJnc1R5cGVcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbaWZOb3RFeGlzdHNdIC0gU2tpcCBjcmVhdGlvbiBpZiB0aGUgaW5kZXggYWxyZWFkeSBleGlzdHMuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBFeHBsaWNpdCBpbmRleCBuYW1lIHRvIHVzZS5cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbdW5pcXVlXSAtIFdoZXRoZXIgdGhlIGluZGV4IHNob3VsZCBiZSB1bmlxdWUuXG4gICAqL1xuICAvKipcbiAgICogUnVucyBhZGQgaW5kZXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IGltcG9ydChcIi4uL3RhYmxlLWRhdGEvdGFibGUtY29sdW1uLmpzXCIpLmRlZmF1bHQ+fSBjb2x1bW5zIC0gQ29sdW1uIG5hbWUgb3IgYXJyYXkgb2YgY29sdW1uIG5hbWVzLlxuICAgKiBAcGFyYW0ge0FkZEluZGV4QXJnc1R5cGV9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYWRkSW5kZXgodGFibGVOYW1lLCBjb2x1bW5zLCBhcmdzKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENvbHVtbnMgPSB0eXBlb2YgY29sdW1ucyA9PT0gXCJzdHJpbmdcIiA/IFtjb2x1bW5zXSA6IGNvbHVtbnNcbiAgICBjb25zdCBjcmVhdGVJbmRleEFyZ3MgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBjb2x1bW5zOiBub3JtYWxpemVkQ29sdW1ucyxcbiAgICAgICAgdGFibGVOYW1lXG4gICAgICB9LFxuICAgICAgYXJnc1xuICAgIClcbiAgICBjb25zdCBzcWxzID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5jcmVhdGVJbmRleFNRTHMoY3JlYXRlSW5kZXhBcmdzKVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2Ygc3Fscykge1xuICAgICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5xdWVyeShzcWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZUluZGV4QXJnc1R5cGUgdHlwZS5cbiAgICogQHR5cGVkZWYge29iamVjdH0gUmVtb3ZlSW5kZXhBcmdzVHlwZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gRXhwbGljaXQgaW5kZXggbmFtZSB0byByZW1vdmUuXG4gICAqL1xuICAvKipcbiAgICogUnVucyByZW1vdmUgaW5kZXguXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZyB8IGltcG9ydChcIi4uL3RhYmxlLWRhdGEvdGFibGUtY29sdW1uLmpzXCIpLmRlZmF1bHQ+fSBuYW1lT3JDb2x1bW5zIC0gSW5kZXggbmFtZSBvciBjb2x1bW5zIHdob3NlIGRlZmF1bHQgYWRkSW5kZXggbmFtZSBzaG91bGQgYmUgcmVtb3ZlZC5cbiAgICogQHBhcmFtIHtSZW1vdmVJbmRleEFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJlbW92ZUluZGV4KHRhYmxlTmFtZSwgbmFtZU9yQ29sdW1ucywgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge25hbWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCByZW1vdmVJbmRleE5hbWUgPSBuYW1lIHx8IHRoaXMuX3JlbW92ZUluZGV4TmFtZSh0YWJsZU5hbWUsIG5hbWVPckNvbHVtbnMpXG4gICAgY29uc3Qgc3FscyA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucmVtb3ZlSW5kZXhTUUxzKHtuYW1lOiByZW1vdmVJbmRleE5hbWUsIHRhYmxlTmFtZX0pXG5cbiAgICBmb3IgKGNvbnN0IHNxbCBvZiBzcWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLnF1ZXJ5KHNxbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyByZW1vdmUgaW5kZXggbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgaW1wb3J0KFwiLi4vdGFibGUtZGF0YS90YWJsZS1jb2x1bW4uanNcIikuZGVmYXVsdD59IG5hbWVPckNvbHVtbnMgLSBJbmRleCBuYW1lIG9yIGNvbHVtbnMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGluZGV4IG5hbWUuXG4gICAqL1xuICBfcmVtb3ZlSW5kZXhOYW1lKHRhYmxlTmFtZSwgbmFtZU9yQ29sdW1ucykge1xuICAgIGlmICh0eXBlb2YgbmFtZU9yQ29sdW1ucyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIG5hbWVPckNvbHVtbnNcblxuICAgIGNvbnN0IGNyZWF0ZUluZGV4ID0gbmV3IENyZWF0ZUluZGV4QmFzZSh7XG4gICAgICBjb2x1bW5zOiBuYW1lT3JDb2x1bW5zLFxuICAgICAgZHJpdmVyOiB0aGlzLmdldERyaXZlcigpLFxuICAgICAgdGFibGVOYW1lXG4gICAgfSlcblxuICAgIHJldHVybiBjcmVhdGVJbmRleC5nZW5lcmF0ZUluZGV4TmFtZSgpXG4gIH1cblxuICAvKipcbiAgICogQWRkRm9yZWlnbktleUFyZ3NUeXBlIHR5cGUuXG4gICAqIEB0eXBlZGVmIHtvYmplY3R9IEFkZEZvcmVpZ25LZXlBcmdzVHlwZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbHVtbk5hbWVdIC0gT3ZlcnJpZGUgdGhlIGRlcml2ZWQgRksgY29sdW1uIG5hbWUgKGRlZmF1bHQ6IGAke3JlZmVyZW5jZV91bmRlcnNjb3JlZH1faWRgKS5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIE92ZXJyaWRlIHRoZSBkZXJpdmVkIGNvbnN0cmFpbnQgbmFtZSAoZGVmYXVsdDogYGZrXyR7dGFibGVOYW1lfV8ke3JlZmVyZW5jZU5hbWV9YCkuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmVmZXJlbmNlZENvbHVtbk5hbWVdIC0gT3ZlcnJpZGUgdGhlIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgKGRlZmF1bHQ6IGBpZGApLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3JlZmVyZW5jZWRUYWJsZU5hbWVdIC0gT3ZlcnJpZGUgdGhlIGRlcml2ZWQgcmVmZXJlbmNlZCB0YWJsZSAoZGVmYXVsdDogcGx1cmFsaXplZCBgcmVmZXJlbmNlTmFtZWApLlxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgYWRkIGZvcmVpZ24ga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgdGhlIEZLIGxpdmVzIG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmZXJlbmNlTmFtZSAtIFNpbmd1bGFyIHJlZmVyZW5jZSBuYW1lLiBEZWZhdWx0cyBkZXJpdmVcbiAgICogICB0aGUgRksgY29sdW1uIGFzIGAke3JlZmVyZW5jZX1faWRgLCB0aGUgcmVmZXJlbmNlZCB0YWJsZSBieSBwbHVyYWxpemluZ1xuICAgKiAgIHRoZSByZWZlcmVuY2UsIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBhcyBgaWRgLCBhbmQgdGhlIGNvbnN0cmFpbnQgbmFtZVxuICAgKiAgIGFzIGBma18ke3RhYmxlTmFtZX1fJHtyZWZlcmVuY2VOYW1lfWAuIE92ZXJyaWRlIGFueSBvZiB0aG9zZSB2aWEgYGFyZ3NgXG4gICAqICAgd2hlbiB0aGUgc2NoZW1hIGRvZXNuJ3QgZm9sbG93IHRoZSBjb252ZW50aW9uLlxuICAgKiBAcGFyYW0ge0FkZEZvcmVpZ25LZXlBcmdzVHlwZX0gW2FyZ3NdIC0gT3B0aW9uYWwgb3ZlcnJpZGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgYWRkRm9yZWlnbktleSh0YWJsZU5hbWUsIHJlZmVyZW5jZU5hbWUsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtjb2x1bW5OYW1lLCBuYW1lLCByZWZlcmVuY2VkQ29sdW1uTmFtZSwgcmVmZXJlbmNlZFRhYmxlTmFtZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGNvbnN0IHJlZmVyZW5jZU5hbWVVbmRlcnNjb3JlID0gaW5mbGVjdGlvbi51bmRlcnNjb3JlKHJlZmVyZW5jZU5hbWUpXG4gICAgY29uc3QgcmVzb2x2ZWRSZWZlcmVuY2VkVGFibGVOYW1lID0gcmVmZXJlbmNlZFRhYmxlTmFtZSB8fCBpbmZsZWN0aW9uLnBsdXJhbGl6ZShyZWZlcmVuY2VOYW1lVW5kZXJzY29yZSlcbiAgICBjb25zdCByZXNvbHZlZENvbHVtbk5hbWUgPSBjb2x1bW5OYW1lIHx8IGAke3JlZmVyZW5jZU5hbWVVbmRlcnNjb3JlfV9pZGBcbiAgICBjb25zdCByZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gcmVmZXJlbmNlZENvbHVtbk5hbWUgfHwgXCJpZFwiXG4gICAgY29uc3QgcmVzb2x2ZWROYW1lID0gbmFtZSB8fCBgZmtfJHt0YWJsZU5hbWV9XyR7cmVmZXJlbmNlTmFtZX1gXG5cbiAgICBhd2FpdCB0aGlzLmdldERyaXZlcigpLmFkZEZvcmVpZ25LZXkoXG4gICAgICB0YWJsZU5hbWUsXG4gICAgICByZXNvbHZlZENvbHVtbk5hbWUsXG4gICAgICByZXNvbHZlZFJlZmVyZW5jZWRUYWJsZU5hbWUsXG4gICAgICByZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lLFxuICAgICAge1xuICAgICAgICBpc05ld0ZvcmVpZ25LZXk6IHRydWUsXG4gICAgICAgIG5hbWU6IHJlc29sdmVkTmFtZVxuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVGb3JlaWduS2V5QXJnc1R5cGUgdHlwZS5cbiAgICogQHR5cGVkZWYge29iamVjdH0gUmVtb3ZlRm9yZWlnbktleUFyZ3NUeXBlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29sdW1uTmFtZV0gLSBPdmVycmlkZSB0aGUgZGVyaXZlZCBmb3JlaWduLWtleSBjb2x1bW4gbmFtZS5cbiAgICovXG4gIC8qKlxuICAgKiBSdW5zIHJlbW92ZSBmb3JlaWduIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIHRoZSBmb3JlaWduIGtleSBsaXZlcyBvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZmVyZW5jZU5hbWUgLSBTaW5ndWxhciByZWZlcmVuY2UgbmFtZSB1c2VkIHRvIGRlcml2ZSB0aGUgRksgY29sdW1uLlxuICAgKiBAcGFyYW0ge1JlbW92ZUZvcmVpZ25LZXlBcmdzVHlwZX0gW2FyZ3NdIC0gT3B0aW9uYWwgb3ZlcnJpZGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlRm9yZWlnbktleSh0YWJsZU5hbWUsIHJlZmVyZW5jZU5hbWUsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtjb2x1bW5OYW1lLCAuLi5yZXN0QXJnc30gPSBhcmdzXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgY29uc3QgcmVzb2x2ZWRDb2x1bW5OYW1lID0gY29sdW1uTmFtZSB8fCBgJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUocmVmZXJlbmNlTmFtZSl9X2lkYFxuICAgIGNvbnN0IGRyaXZlciA9IHRoaXMuZ2V0RHJpdmVyKClcbiAgICBsZXQgbWF4aW11bVJlbW92YWxzID0gMFxuICAgIGxldCBwcmV2aW91c01hdGNoaW5nQ291bnQgPSAwXG5cbiAgICBmb3IgKGxldCByZW1vdmFsQXR0ZW1wdCA9IDA7IDsgcmVtb3ZhbEF0dGVtcHQrKykge1xuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBkcml2ZXIuZ2V0VGFibGVCeU5hbWUodGFibGVOYW1lKVxuXG4gICAgICBpZiAoIXRhYmxlKSB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlICR7dGFibGVOYW1lfSBkb2VzIG5vdCBleGlzdGApXG5cbiAgICAgIGNvbnN0IGZvcmVpZ25LZXlzID0gYXdhaXQgdGFibGUuZ2V0Rm9yZWlnbktleXMoKVxuICAgICAgY29uc3QgbWF0Y2hpbmdGb3JlaWduS2V5cyA9IGZvcmVpZ25LZXlzLmZpbHRlcigoZm9yZWlnbktleSkgPT4gZm9yZWlnbktleS5nZXRDb2x1bW5OYW1lKCkgPT0gcmVzb2x2ZWRDb2x1bW5OYW1lKVxuXG4gICAgICBpZiAobWF0Y2hpbmdGb3JlaWduS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKHJlbW92YWxBdHRlbXB0ID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoYE5vIGZvcmVpZ24ga2V5IG9uICR7dGFibGVOYW1lfS4ke3Jlc29sdmVkQ29sdW1uTmFtZX1gKVxuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAocmVtb3ZhbEF0dGVtcHQgPT09IDApIHtcbiAgICAgICAgbWF4aW11bVJlbW92YWxzID0gbWF0Y2hpbmdGb3JlaWduS2V5cy5sZW5ndGhcbiAgICAgIH0gZWxzZSBpZiAobWF0Y2hpbmdGb3JlaWduS2V5cy5sZW5ndGggPj0gcHJldmlvdXNNYXRjaGluZ0NvdW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9yZWlnbiBrZXkgcmVtb3ZhbCBkaWQgbm90IHJlZHVjZSBtYXRjaGVzIG9uICR7dGFibGVOYW1lfS4ke3Jlc29sdmVkQ29sdW1uTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBpZiAocmVtb3ZhbEF0dGVtcHQgPj0gbWF4aW11bVJlbW92YWxzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9yZWlnbiBrZXkgcmVtb3ZhbCBleGNlZWRlZCBleHBlY3RlZCBtYXRjaGVzIG9uICR7dGFibGVOYW1lfS4ke3Jlc29sdmVkQ29sdW1uTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBwcmV2aW91c01hdGNoaW5nQ291bnQgPSBtYXRjaGluZ0ZvcmVpZ25LZXlzLmxlbmd0aFxuICAgICAgYXdhaXQgZHJpdmVyLnJlbW92ZUZvcmVpZ25LZXkodGFibGVOYW1lLCBtYXRjaGluZ0ZvcmVpZ25LZXlzWzBdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFkZCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmZXJlbmNlTmFtZSAtIFJlZmVyZW5jZSBuYW1lLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmZvcmVpZ25LZXldIC0gV2hldGhlciBmb3JlaWduIGtleS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5udWxsXSAtIFdoZXRoZXIgbnVsbGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy50eXBlXSAtIFR5cGUgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy51bmlxdWVdIC0gV2hldGhlciB1bmlxdWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBhZGRSZWZlcmVuY2UodGFibGVOYW1lLCByZWZlcmVuY2VOYW1lLCBhcmdzKSB7XG4gICAgY29uc3Qge2ZvcmVpZ25LZXksIG51bGw6IG51bGxhYmxlLCB0eXBlLCB1bmlxdWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICBjb25zdCBjb2x1bW5OYW1lID0gYCR7aW5mbGVjdGlvbi51bmRlcnNjb3JlKHJlZmVyZW5jZU5hbWUpfV9pZGBcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCBjb2x1bW5UeXBlID0gdHlwZSB8fCBcImludGVnZXJcIlxuICAgIGNvbnN0IGNvbHVtbkFyZ3MgPSBudWxsYWJsZSAhPT0gdW5kZWZpbmVkID8ge251bGw6IG51bGxhYmxlfSA6IHVuZGVmaW5lZFxuXG4gICAgYXdhaXQgdGhpcy5hZGRDb2x1bW4odGFibGVOYW1lLCBjb2x1bW5OYW1lLCBjb2x1bW5UeXBlLCBjb2x1bW5BcmdzKVxuICAgIGF3YWl0IHRoaXMuYWRkSW5kZXgodGFibGVOYW1lLCBbY29sdW1uTmFtZV0sIHt1bmlxdWU6IHVuaXF1ZX0pXG5cbiAgICBpZiAoZm9yZWlnbktleSkge1xuICAgICAgYXdhaXQgdGhpcy5hZGRGb3JlaWduS2V5KHRhYmxlTmFtZSwgcmVmZXJlbmNlTmFtZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlUmVmZXJlbmNlQXJnc1R5cGUgdHlwZS5cbiAgICogQHR5cGVkZWYge29iamVjdH0gUmVtb3ZlUmVmZXJlbmNlQXJnc1R5cGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2x1bW5OYW1lXSAtIE92ZXJyaWRlIHRoZSBkZXJpdmVkIHJlZmVyZW5jZSBjb2x1bW4gbmFtZS5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtpbmRleE5hbWVdIC0gRXhwbGljaXQgZ2VuZXJhdGVkIGluZGV4IG5hbWUgdG8gcmVtb3ZlLlxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgcmVtb3ZlIHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2VOYW1lIC0gUmVmZXJlbmNlIG5hbWUuXG4gICAqIEBwYXJhbSB7UmVtb3ZlUmVmZXJlbmNlQXJnc1R5cGV9IFthcmdzXSAtIE9wdGlvbmFsIG92ZXJyaWRlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHJlbW92ZVJlZmVyZW5jZSh0YWJsZU5hbWUsIHJlZmVyZW5jZU5hbWUsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtjb2x1bW5OYW1lLCBpbmRleE5hbWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCByZXNvbHZlZENvbHVtbk5hbWUgPSBjb2x1bW5OYW1lIHx8IGAke2luZmxlY3Rpb24udW5kZXJzY29yZShyZWZlcmVuY2VOYW1lKX1faWRgXG4gICAgY29uc3QgZHJpdmVyID0gdGhpcy5nZXREcml2ZXIoKVxuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgZHJpdmVyLmdldFRhYmxlQnlOYW1lKHRhYmxlTmFtZSlcblxuICAgIGlmICghdGFibGUpIHRocm93IG5ldyBFcnJvcihgVGFibGUgJHt0YWJsZU5hbWV9IGRvZXMgbm90IGV4aXN0YClcblxuICAgIGNvbnN0IGZvcmVpZ25LZXlzID0gYXdhaXQgdGFibGUuZ2V0Rm9yZWlnbktleXMoKVxuXG4gICAgZm9yIChjb25zdCBmb3JlaWduS2V5IG9mIGZvcmVpZ25LZXlzKSB7XG4gICAgICBpZiAoZm9yZWlnbktleS5nZXRDb2x1bW5OYW1lKCkgIT0gcmVzb2x2ZWRDb2x1bW5OYW1lKSBjb250aW51ZVxuXG4gICAgICBhd2FpdCBkcml2ZXIucmVtb3ZlRm9yZWlnbktleSh0YWJsZU5hbWUsIGZvcmVpZ25LZXkpXG4gICAgfVxuXG4gICAgY29uc3QgZXhwZWN0ZWRJbmRleE5hbWUgPSBpbmRleE5hbWUgfHwgdGhpcy5fcmVtb3ZlSW5kZXhOYW1lKHRhYmxlTmFtZSwgW3Jlc29sdmVkQ29sdW1uTmFtZV0pXG4gICAgY29uc3QgaW5kZXhlcyA9IGF3YWl0IHRhYmxlLmdldEluZGV4ZXMoKVxuICAgIGNvbnN0IGdlbmVyYXRlZEluZGV4ID0gaW5kZXhlcy5maW5kKChpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaW5kZXhDb2x1bW5OYW1lcyA9IGluZGV4LmdldENvbHVtbk5hbWVzKClcblxuICAgICAgcmV0dXJuICFpbmRleC5pc1ByaW1hcnlLZXkoKSAmJlxuICAgICAgICBpbmRleC5nZXROYW1lKCkgPT0gZXhwZWN0ZWRJbmRleE5hbWUgJiZcbiAgICAgICAgaW5kZXhDb2x1bW5OYW1lcy5sZW5ndGggPT0gMSAmJlxuICAgICAgICBpbmRleENvbHVtbk5hbWVzWzBdID09IHJlc29sdmVkQ29sdW1uTmFtZVxuICAgIH0pXG5cbiAgICBpZiAoZ2VuZXJhdGVkSW5kZXgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVtb3ZlSW5kZXgodGFibGVOYW1lLCBnZW5lcmF0ZWRJbmRleC5nZXROYW1lKCkpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5yZW1vdmVDb2x1bW4odGFibGVOYW1lLCByZXNvbHZlZENvbHVtbk5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjaGFuZ2UgY29sdW1uIG51bGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uTmFtZSAtIENvbHVtbiBuYW1lLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG51bGxhYmxlIC0gV2hldGhlciBudWxsYWJsZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGNoYW5nZUNvbHVtbk51bGwodGFibGVOYW1lLCBjb2x1bW5OYW1lLCBudWxsYWJsZSkge1xuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5nZXRUYWJsZUJ5TmFtZSh0YWJsZU5hbWUpXG5cbiAgICBpZiAoIXRhYmxlKSB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlICR7dGFibGVOYW1lfSBkb2VzIG5vdCBleGlzdGApXG5cbiAgICBjb25zdCBjb2x1bW4gPSBhd2FpdCB0YWJsZS5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSlcblxuICAgIGlmICghY29sdW1uKSB0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAke2NvbHVtbk5hbWV9IGRvZXMgbm90IGV4aXN0IGluIHRhYmxlICR7dGFibGVOYW1lfWApXG5cbiAgICBhd2FpdCBjb2x1bW4uY2hhbmdlTnVsbGFibGUobnVsbGFibGUpXG4gIH1cblxuICAvKipcbiAgICogTWlncmF0ZXMgbGVnYWN5IHRpbWV6b25lLWxlc3MgbG9jYWwgZGF0ZXRpbWUgcm93cyBpbnRvIFVUQyBkYXRldGltZSBzdG9yYWdlLlxuICAgKiBOZXcgU1FMaXRlIFVUQyByb3dzIGluY2x1ZGUgYSB0aW1lem9uZSBzdWZmaXggYW5kIGFyZSBza2lwcGVkLlxuICAgKiBAcGFyYW0ge0xlZ2FjeUxvY2FsRGF0ZVRpbWVzTWlncmF0aW9uQXJnc1R5cGV9IFthcmdzXSAtIE1pZ3JhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgbWlncmF0ZUxlZ2FjeUxvY2FsRGF0ZVRpbWVzVG9VdGNTdG9yYWdlKGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtjb2x1bW5zQnlUYWJsZSwgbGVnYWN5TG9jYWxPZmZzZXRNaW51dGVzLCB0YWJsZXMsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCB0YWJsZU5hbWVzID0gYXdhaXQgdGhpcy5fbGVnYWN5TG9jYWxEYXRlVGltZXNUYWJsZU5hbWVzKHRhYmxlcylcblxuICAgIGZvciAoY29uc3QgdGFibGVOYW1lIG9mIHRhYmxlTmFtZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuX21pZ3JhdGVMZWdhY3lMb2NhbERhdGVUaW1lc1RhYmxlKHtcbiAgICAgICAgY29sdW1uc0J5VGFibGUsXG4gICAgICAgIGxlZ2FjeUxvY2FsT2Zmc2V0TWludXRlcyxcbiAgICAgICAgdGFibGVOYW1lXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0YWJsZSBuYW1lcyBmb3IgYSBsZWdhY3kgbG9jYWwgZGF0ZXRpbWUgbWlncmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSB0YWJsZXMgLSBFeHBsaWNpdCB0YWJsZSBuYW1lcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFRhYmxlIG5hbWVzLlxuICAgKi9cbiAgYXN5bmMgX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzVGFibGVOYW1lcyh0YWJsZXMpIHtcbiAgICBpZiAodGFibGVzKSByZXR1cm4gdGFibGVzXG5cbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuZ2V0VGFibGVzKCkpXG4gICAgICAubWFwKCh0YWJsZSkgPT4gdGFibGUuZ2V0TmFtZSgpKVxuICAgICAgLmZpbHRlcigodGFibGVOYW1lKSA9PiB0YWJsZU5hbWUgIT0gXCJzY2hlbWFfbWlncmF0aW9uc1wiICYmICF0YWJsZU5hbWUuc3RhcnRzV2l0aChcInNxbGl0ZV9cIikpXG4gIH1cblxuICAvKipcbiAgICogTWlncmF0ZXMgb25lIHRhYmxlJ3MgbGVnYWN5IGxvY2FsIGRhdGV0aW1lIHZhbHVlcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB8IHVuZGVmaW5lZH0gYXJncy5jb2x1bW5zQnlUYWJsZSAtIEV4cGxpY2l0IGNvbHVtbnMga2V5ZWQgYnkgdGFibGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBhcmdzLmxlZ2FjeUxvY2FsT2Zmc2V0TWludXRlcyAtIFVUQy1taW51cy1sb2NhbCBvZmZzZXQgaW4gbWludXRlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MudGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9taWdyYXRlTGVnYWN5TG9jYWxEYXRlVGltZXNUYWJsZSh7Y29sdW1uc0J5VGFibGUsIGxlZ2FjeUxvY2FsT2Zmc2V0TWludXRlcywgdGFibGVOYW1lfSkge1xuICAgIGNvbnN0IGRyaXZlciA9IHRoaXMuZ2V0RHJpdmVyKClcbiAgICBjb25zdCB0YWJsZSA9IGF3YWl0IGRyaXZlci5nZXRUYWJsZUJ5TmFtZU9yRmFpbCh0YWJsZU5hbWUpXG4gICAgY29uc3QgY29sdW1ucyA9IGF3YWl0IHRoaXMuX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzQ29sdW1ucyh7Y29sdW1uc0J5VGFibGUsIHRhYmxlfSlcblxuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBwcmltYXJ5S2V5Q29sdW1uID0gYXdhaXQgdGhpcy5fbGVnYWN5TG9jYWxEYXRlVGltZXNQcmltYXJ5S2V5KHRhYmxlKVxuICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IFtwcmltYXJ5S2V5Q29sdW1uLCAuLi5jb2x1bW5zXVxuICAgIGNvbnN0IHNlbGVjdFNxbCA9IHNlbGVjdGVkQ29sdW1uc1xuICAgICAgLm1hcCgoY29sdW1uTmFtZSkgPT4gZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpKVxuICAgICAgLmpvaW4oXCIsIFwiKVxuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBkcml2ZXIucXVlcnkoYFNFTEVDVCAke3NlbGVjdFNxbH0gRlJPTSAke2RyaXZlci5xdW90ZVRhYmxlKHRhYmxlTmFtZSl9YClcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uTmFtZSBvZiBjb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93W2NvbHVtbk5hbWVdXG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZFZhbHVlID0gY29udmVydExlZ2FjeURhdGVWYWx1ZVRvVXRjU3RvcmFnZSh2YWx1ZSwge1xuICAgICAgICAgIGRhdGFiYXNlVHlwZTogZHJpdmVyLmdldFR5cGUoKSxcbiAgICAgICAgICBsZWdhY3lMb2NhbE9mZnNldE1pbnV0ZXNcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoY29udmVydGVkVmFsdWUgPT09IHZhbHVlKSBjb250aW51ZVxuXG4gICAgICAgIGF3YWl0IGRyaXZlci5xdWVyeShgXG4gICAgICAgICAgVVBEQVRFICR7ZHJpdmVyLnF1b3RlVGFibGUodGFibGVOYW1lKX1cbiAgICAgICAgICBTRVQgJHtkcml2ZXIucXVvdGVDb2x1bW4oY29sdW1uTmFtZSl9ID0gJHtkcml2ZXIucXVvdGUoY29udmVydGVkVmFsdWUpfVxuICAgICAgICAgIFdIRVJFICR7ZHJpdmVyLnF1b3RlQ29sdW1uKHByaW1hcnlLZXlDb2x1bW4pfSA9ICR7ZHJpdmVyLnF1b3RlKHJvd1twcmltYXJ5S2V5Q29sdW1uXSl9XG4gICAgICAgIGApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGRhdGUtbGlrZSBjb2x1bW5zIGZvciBvbmUgdGFibGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCB1bmRlZmluZWR9IGFyZ3MuY29sdW1uc0J5VGFibGUgLSBFeHBsaWNpdCBjb2x1bW5zIGtleWVkIGJ5IHRhYmxlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS10YWJsZS5qc1wiKS5kZWZhdWx0fSBhcmdzLnRhYmxlIC0gVGFibGUgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBEYXRlLWxpa2UgY29sdW1uIG5hbWVzLlxuICAgKi9cbiAgYXN5bmMgX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzQ29sdW1ucyh7Y29sdW1uc0J5VGFibGUsIHRhYmxlfSkge1xuICAgIGNvbnN0IGV4cGxpY2l0Q29sdW1ucyA9IGNvbHVtbnNCeVRhYmxlPy5bdGFibGUuZ2V0TmFtZSgpXVxuXG4gICAgaWYgKGV4cGxpY2l0Q29sdW1ucykgcmV0dXJuIGV4cGxpY2l0Q29sdW1uc1xuXG4gICAgcmV0dXJuIChhd2FpdCB0YWJsZS5nZXRDb2x1bW5zKCkpXG4gICAgICAuZmlsdGVyKChjb2x1bW4pID0+IHRoaXMuX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzQ29sdW1uSXNEYXRlTGlrZShjb2x1bW4pKVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uZ2V0TmFtZSgpKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgY29sdW1uIHNob3VsZCBiZSBpbmNsdWRlZCBieSBkZWZhdWx0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gY29sdW1uIC0gQ29sdW1uIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBjb2x1bW4gaXMgZGF0ZS1saWtlLlxuICAgKi9cbiAgX2xlZ2FjeUxvY2FsRGF0ZVRpbWVzQ29sdW1uSXNEYXRlTGlrZShjb2x1bW4pIHtcbiAgICBjb25zdCBjb2x1bW5UeXBlID0gY29sdW1uLmdldFR5cGUoKS50b0xvd2VyQ2FzZSgpXG5cbiAgICByZXR1cm4gY29sdW1uVHlwZS5pbmNsdWRlcyhcImRhdGVcIikgfHwgY29sdW1uVHlwZS5pbmNsdWRlcyhcInRpbWVzdGFtcFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzaW5nbGUgcHJpbWFyeSBrZXkgY29sdW1uIGZvciByb3cgdXBkYXRlcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kcml2ZXJzL2Jhc2UtdGFibGUuanNcIikuZGVmYXVsdH0gdGFibGUgLSBUYWJsZSBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBQcmltYXJ5IGtleSBjb2x1bW4gbmFtZS5cbiAgICovXG4gIGFzeW5jIF9sZWdhY3lMb2NhbERhdGVUaW1lc1ByaW1hcnlLZXkodGFibGUpIHtcbiAgICBjb25zdCBwcmltYXJ5S2V5Q29sdW1ucyA9IChhd2FpdCB0YWJsZS5nZXRDb2x1bW5zKCkpLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uZ2V0UHJpbWFyeUtleSgpKVxuXG4gICAgaWYgKHByaW1hcnlLZXlDb2x1bW5zLmxlbmd0aCAhPSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgb25lIHByaW1hcnkga2V5IG9uICR7dGFibGUuZ2V0TmFtZSgpfSBidXQgZm91bmQgJHtwcmltYXJ5S2V5Q29sdW1ucy5sZW5ndGh9YClcbiAgICB9XG5cbiAgICByZXR1cm4gcHJpbWFyeUtleUNvbHVtbnNbMF0uZ2V0TmFtZSgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBjb2x1bW4gZXhpc3RzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbHVtbk5hbWUgLSBDb2x1bW4gbmFtZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gUmVzb2x2ZXMgd2l0aCBXaGV0aGVyIGNvbHVtbiBleGlzdHMuXG4gICAqL1xuICBhc3luYyBjb2x1bW5FeGlzdHModGFibGVOYW1lLCBjb2x1bW5OYW1lKSB7XG4gICAgY29uc3QgdGFibGUgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLmdldFRhYmxlQnlOYW1lKHRhYmxlTmFtZSlcblxuICAgIGlmICh0YWJsZSkge1xuICAgICAgY29uc3QgY29sdW1uID0gYXdhaXQgdGFibGUuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWUpXG5cbiAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQm9vbGVhbihmYWxzZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhbiBpbmRleCB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0cyBvbiBhIHRhYmxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGluZGV4TmFtZSAtIEluZGV4IG5hbWUgdG8gbG9vayBmb3IuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIGluZGV4IGV4aXN0cyBvbiB0aGUgdGFibGUuXG4gICAqL1xuICBhc3luYyBpbmRleEV4aXN0cyh0YWJsZU5hbWUsIGluZGV4TmFtZSkge1xuICAgIGNvbnN0IHRhYmxlID0gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5nZXRUYWJsZUJ5TmFtZSh0YWJsZU5hbWUsIHt0aHJvd0Vycm9yOiBmYWxzZX0pXG5cbiAgICBpZiAodGFibGUpIHtcbiAgICAgIGZvciAoY29uc3QgaW5kZXggb2YgYXdhaXQgdGFibGUuZ2V0SW5kZXhlcygpKSB7XG4gICAgICAgIGlmIChpbmRleC5nZXROYW1lKCkgPT0gaW5kZXhOYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgdGhlIGRhdGFiYXNlIHNjaGVtYSBmb3IgYSBnYXAtbGVzcyBwb3NpdGlvbmFsIGxpc3QuIEFkZHMgdGhlXG4gICAqIHBvc2l0aW9uIGNvbHVtbiAoSU5UIE5PVCBOVUxMKSBpZiBhYnNlbnQgYW5kIGNyZWF0ZXMgYSBVTklRVUUgaW5kZXggb25cbiAgICogKHNjb3BlLCBwb3NpdGlvbikuIFRoaXMgaXMgdGhlIHNjaGVtYS1zaWRlIGNvdW50ZXJwYXJ0IG9mXG4gICAqIGBNb2RlbC5hY3RzQXNMaXN0KClgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBvc2l0aW9uQ29sdW1uIC0gQ29sdW1uIG5hbWUgZm9yIHRoZSBwb3NpdGlvbiAoZS5nLiBcInJvd19udW1iZXJcIikuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuc2NvcGUgLSBDb2x1bW4gbmFtZSBmb3IgdGhlIHNjb3BlIChlLmcuIFwiYm9hcmRfY29sdW1uX2lkXCIpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGFkZEFjdHNBc0xpc3QodGFibGVOYW1lLCBwb3NpdGlvbkNvbHVtbiwge3Njb3BlfSkge1xuICAgIGlmICghKGF3YWl0IHRoaXMuY29sdW1uRXhpc3RzKHRhYmxlTmFtZSwgcG9zaXRpb25Db2x1bW4pKSkge1xuICAgICAgYXdhaXQgdGhpcy5hZGRDb2x1bW4odGFibGVOYW1lLCBwb3NpdGlvbkNvbHVtbiwgXCJpbnRlZ2VyXCIsIHtudWxsOiBmYWxzZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuY2hhbmdlQ29sdW1uTnVsbCh0YWJsZU5hbWUsIHBvc2l0aW9uQ29sdW1uLCBmYWxzZSlcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFkZEluZGV4KHRhYmxlTmFtZSwgW3Njb3BlLCBwb3NpdGlvbkNvbHVtbl0sIHt1bmlxdWU6IHRydWV9KVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0YWJsZSB3aXRoIGRlZmF1bHQgb3B0aW9ucy5cbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge0NyZWF0ZVRhYmxlQ2FsbGJhY2tUeXBlfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0YWJsZSB3aXRoIGV4cGxpY2l0IG9wdGlvbnMuXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtDcmVhdGVUYWJsZUFyZ3NUeXBlfSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Q3JlYXRlVGFibGVDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICAvKipcbiAgICogUnVucyBjcmVhdGUgdGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge0NyZWF0ZVRhYmxlQXJnc1R5cGUgfCBDcmVhdGVUYWJsZUNhbGxiYWNrVHlwZX0gYXJnMSAtIEFyZzEuXG4gICAqIEBwYXJhbSB7Q3JlYXRlVGFibGVDYWxsYmFja1R5cGUgfCB1bmRlZmluZWR9IFthcmcyXSAtIEFyZzIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjcmVhdGVUYWJsZSh0YWJsZU5hbWUsIGFyZzEsIGFyZzIpIHtcbiAgICBsZXQgYXJnc1xuICAgIGxldCBjYWxsYmFja1xuXG4gICAgaWYgKHR5cGVvZiBhcmcxID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgYXJncyA9IHt9XG4gICAgICBjYWxsYmFjayA9IGFyZzFcbiAgICB9IGVsc2Uge1xuICAgICAgYXJncyA9IGFyZzFcbiAgICAgIGNhbGxiYWNrID0gYXJnMlxuICAgIH1cblxuICAgIGNvbnN0IHtpZCA9IHt9LCBpZk5vdEV4aXN0cyA9IGZhbHNlLCAuLi5yZXN0QXJnc30gPSBhcmdzXG4gICAgY29uc3QgZHJpdmVyID0gdGhpcy5nZXREcml2ZXIoKVxuICAgIGNvbnN0IGRlZmF1bHRQcmltYXJ5S2V5VHlwZSA9IGRyaXZlci5wcmltYXJ5S2V5VHlwZSgpXG4gICAgbGV0IGlkRGVmYXVsdCwgaWRUeXBlLCByZXN0QXJnc0lkXG5cbiAgICBpZiAoaWQgIT09IGZhbHNlKSB7XG4gICAgICAoe2RlZmF1bHQ6IGlkRGVmYXVsdCwgdHlwZTogaWRUeXBlLCAuLi5yZXN0QXJnc0lkfSA9IGlkKVxuXG4gICAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzSWQpXG4gICAgfVxuXG4gICAgaWYgKCFpZFR5cGUpIHtcbiAgICAgIGlkVHlwZSA9IGRlZmF1bHRQcmltYXJ5S2V5VHlwZVxuICAgIH1cbiAgICBjb25zdCBkcml2ZXJTdXBwb3J0c0RlZmF1bHRVVUlEID0gZHJpdmVyLnN1cHBvcnRzRGVmYXVsdFByaW1hcnlLZXlVVUlEPy4oKVxuICAgIGNvbnN0IGxvd2VySWRUeXBlID0gaWRUeXBlPy50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgaXNVVUlEUHJpbWFyeUtleSA9IGxvd2VySWRUeXBlID09IFwidXVpZFwiXG4gICAgY29uc3QgbnVtZXJpY0F1dG9JbmNyZW1lbnRUeXBlcyA9IFtcImludFwiLCBcImludGVnZXJcIiwgXCJiaWdpbnRcIiwgXCJzbWFsbGludFwiLCBcInRpbnlpbnRcIl1cbiAgICBsZXQgaWRBdXRvSW5jcmVtZW50ID0gbnVtZXJpY0F1dG9JbmNyZW1lbnRUeXBlcy5pbmNsdWRlcyhsb3dlcklkVHlwZSB8fCBcIlwiKVxuXG4gICAgaWYgKGlzVVVJRFByaW1hcnlLZXkpIHtcbiAgICAgIGlkQXV0b0luY3JlbWVudCA9IGZhbHNlXG5cbiAgICAgIGlmIChkcml2ZXJTdXBwb3J0c0RlZmF1bHRVVUlEKSB7XG4gICAgICAgIGlmIChpZERlZmF1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlkRGVmYXVsdCA9ICgpID0+IFwiVVVJRCgpXCJcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpZERlZmF1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBMZXQgYXBwbGljYXRpb24gY29kZSBhc3NpZ24gVVVJRHMgKHNlZSBEYXRhYmFzZVJlY29yZC5pbnNlcnQpIHdoZW4gdGhlIGRyaXZlciBjYW4ndCBkbyBpdC5cbiAgICAgICAgaWREZWZhdWx0ID0gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgICAvLyBJZiBkcml2ZXIgZG9lc24ndCBzdXBwb3J0IFVVSUQoKSBidXQgdGhlIGNhbGxlciBleHBsaWNpdGx5IHNldCBhIGRlZmF1bHQsIHJlc3BlY3QgaXQuXG4gICAgfVxuXG4gICAgY29uc3QgdGFibGVEYXRhID0gbmV3IFRhYmxlRGF0YSh0YWJsZU5hbWUsIHtpZk5vdEV4aXN0cywgcHJpbWFyeUtleVR5cGU6IGRlZmF1bHRQcmltYXJ5S2V5VHlwZX0pXG5cbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgaWYgKCEoaWRUeXBlIGluIHRhYmxlRGF0YSkpIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcHJpbWFyeSBrZXkgdHlwZTogJHtpZFR5cGV9YClcblxuICAgIGlmIChpZCAhPT0gZmFsc2UpIHtcbiAgICAgIHRhYmxlRGF0YS5hZGRDb2x1bW4oXCJpZFwiLCB7YXV0b0luY3JlbWVudDogaWRBdXRvSW5jcmVtZW50LCBkZWZhdWx0OiBpZERlZmF1bHQsIG51bGw6IGZhbHNlLCBwcmltYXJ5S2V5OiB0cnVlLCB0eXBlOiBpZFR5cGV9KVxuICAgIH1cblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2sodGFibGVEYXRhKVxuICAgIH1cblxuICAgIGNvbnN0IHNxbHMgPSBhd2FpdCBkcml2ZXIuY3JlYXRlVGFibGVTcWwodGFibGVEYXRhKVxuXG4gICAgZm9yIChjb25zdCBzcWwgb2Ygc3Fscykge1xuICAgICAgYXdhaXQgdGhpcy5fZGIucXVlcnkoc3FsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2VUYWJsZUFyZ3NUeXBlIHR5cGUuXG4gICAqIEB0eXBlZGVmIHtvYmplY3R9IENoYW5nZVRhYmxlQXJnc1R5cGVcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYnVsa10gLSBDb21iaW5lIGNvbXBhdGlibGUgY29udGlndW91cyBEREwgaW50byBzaW5nbGVcbiAgICogICBBTFRFUiBUQUJMRSBzdGF0ZW1lbnRzIG9uIGRyaXZlcnMgdGhhdCBzdXBwb3J0IGJ1bGsgYWx0ZXJzIChNeVNRTC9NYXJpYURCXG4gICAqICAgYW5kIFBvc3RncmVTUUwpLiBgYnVsa2AgY29udHJvbHMgRERMIGdyb3VwaW5nIG9ubHksIG5vdCB0cmFuc2FjdGlvbmFsXG4gICAqICAgYXRvbWljaXR5OyB1bmNoYW5nZWQgZHJpdmVycyBleGVjdXRlIHRoZSByZWNvcmRlZCBjb21tYW5kcyBzZXF1ZW50aWFsbHkuXG4gICAqL1xuXG4gIC8qKlxuICAgKiBDaGFuZ2VUYWJsZUNhbGxiYWNrVHlwZSB0eXBlLlxuICAgKiBAdHlwZWRlZiB7KHRhYmxlOiBpbXBvcnQoXCIuL2NoYW5nZS10YWJsZS5qc1wiKS5kZWZhdWx0KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPn0gQ2hhbmdlVGFibGVDYWxsYmFja1R5cGVcbiAgICovXG5cbiAgLyoqXG4gICAqIENoYW5nZXMgYSB0YWJsZSB1c2luZyBhIFJhaWxzLXN0eWxlIHRhYmxlLXNjb3BlZCByZWNvcmRlci5cbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge0NoYW5nZVRhYmxlQ2FsbGJhY2tUeXBlfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgLyoqXG4gICAqIENoYW5nZXMgYSB0YWJsZSB3aXRoIGV4cGxpY2l0IG9wdGlvbnMuXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtDaGFuZ2VUYWJsZUFyZ3NUeXBlfSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Q2hhbmdlVGFibGVDYWxsYmFja1R5cGV9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICAvKipcbiAgICogUnVucyBjaGFuZ2UgdGFibGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lLlxuICAgKiBAcGFyYW0ge0NoYW5nZVRhYmxlQXJnc1R5cGUgfCBDaGFuZ2VUYWJsZUNhbGxiYWNrVHlwZX0gYXJnMSAtIEFyZzEuXG4gICAqIEBwYXJhbSB7Q2hhbmdlVGFibGVDYWxsYmFja1R5cGUgfCB1bmRlZmluZWR9IFthcmcyXSAtIEFyZzIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjaGFuZ2VUYWJsZSh0YWJsZU5hbWUsIGFyZzEsIGFyZzIpIHtcbiAgICBsZXQgYXJncyA9IC8qKiBAdHlwZSB7Q2hhbmdlVGFibGVBcmdzVHlwZX0gKi8gKHt9KVxuICAgIGxldCBjYWxsYmFja1xuXG4gICAgaWYgKHR5cGVvZiBhcmcxID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY2FsbGJhY2sgPSBhcmcxXG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MgPSBhcmcxIHx8IHt9XG4gICAgICBjYWxsYmFjayA9IGFyZzJcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKFwiTm8gY2FsbGJhY2sgZ2l2ZW5cIilcblxuICAgIGNvbnN0IHtidWxrID0gZmFsc2UsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcblxuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCB0YWJsZSA9IG5ldyBDaGFuZ2VUYWJsZSh7dGFibGVOYW1lfSlcblxuICAgIGF3YWl0IGNhbGxiYWNrKHRhYmxlKVxuXG4gICAgYXdhaXQgdGhpcy5fZXhlY3V0ZUNoYW5nZVRhYmxlT3BlcmF0aW9ucyh0YWJsZU5hbWUsIHRhYmxlLmdldE9wZXJhdGlvbnMoKSwge2J1bGt9KVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHJlY29yZGVkIGNoYW5nZVRhYmxlIG9wZXJhdGlvbnMuIFdpdGggYGJ1bGtgIGVuYWJsZWQgb24gYVxuICAgKiBzdXBwb3J0aW5nIGRyaXZlciwgY29tcGF0aWJsZSBjb250aWd1b3VzIGNvbHVtbiBvcGVyYXRpb25zIGFjY3VtdWxhdGUgaW50b1xuICAgKiBhIHNpbmdsZSBUYWJsZURhdGEgZmx1c2hlZCB0aHJvdWdoIGBhbHRlclRhYmxlU1FMc2A7IGluY29tcGF0aWJsZSBjb21tYW5kc1xuICAgKiBmbHVzaCB0aGUgYmF0Y2ggZmlyc3QgYW5kIHJ1biB0aHJvdWdoIHRoZSBleGlzdGluZyBtaWdyYXRpb24gaGVscGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jaGFuZ2UtdGFibGUuanNcIikuQ2hhbmdlVGFibGVPcGVyYXRpb25UeXBlW119IG9wZXJhdGlvbnMgLSBSZWNvcmRlZCBvcGVyYXRpb25zLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFyZ3MuYnVsayAtIFdoZXRoZXIgdG8gZW5hYmxlIGJ1bGsgY29tbWFuZCBncm91cGluZy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9leGVjdXRlQ2hhbmdlVGFibGVPcGVyYXRpb25zKHRhYmxlTmFtZSwgb3BlcmF0aW9ucywge2J1bGt9KSB7XG4gICAgY29uc3QgZHJpdmVyID0gdGhpcy5nZXREcml2ZXIoKVxuICAgIGNvbnN0IGJ1bGtTdXBwb3J0ZWQgPSBidWxrICYmIGRyaXZlci5zdXBwb3J0c0J1bGtBbHRlcigpXG5cbiAgICBpZiAoIWJ1bGtTdXBwb3J0ZWQpIHtcbiAgICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIG9wZXJhdGlvbnMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0ZUNoYW5nZVRhYmxlT3BlcmF0aW9uKHRhYmxlTmFtZSwgb3BlcmF0aW9uKVxuICAgICAgfVxuXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsZXQgYmF0Y2ggPSBuZXcgVGFibGVEYXRhKHRhYmxlTmFtZSlcblxuICAgIGNvbnN0IGZsdXNoQmF0Y2ggPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoYmF0Y2guZ2V0Q29sdW1ucygpLmxlbmd0aCA9PSAwICYmIGJhdGNoLmdldEluZGV4ZXMoKS5sZW5ndGggPT0gMCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHNxbHMgPSBhd2FpdCBkcml2ZXIuYWx0ZXJUYWJsZVNRTHMoYmF0Y2gpXG5cbiAgICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgICAgYXdhaXQgZHJpdmVyLnF1ZXJ5KHNxbClcbiAgICAgIH1cblxuICAgICAgYmF0Y2ggPSBuZXcgVGFibGVEYXRhKHRhYmxlTmFtZSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICBzd2l0Y2ggKG9wZXJhdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJhZGRDb2x1bW5cIjoge1xuICAgICAgICAgIGlmICghb3BlcmF0aW9uLmNvbHVtblR5cGUpIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbHVtbiB0eXBlIGdpdmVuXCIpXG5cbiAgICAgICAgICAvLyBGbHVzaCBhbiBhbHJlYWR5LXJlY29yZGVkIGluZGV4IGJhdGNoIGZpcnN0IHNvIHRoZSBlbWl0dGVkIFNRTCBrZWVwc1xuICAgICAgICAgIC8vIHRoZSByZWNvcmRlZCBkZWNsYXJhdGlvbiBvcmRlciAoaW5kZXggYmVmb3JlIGNvbHVtbikuXG4gICAgICAgICAgaWYgKGJhdGNoLmdldEluZGV4ZXMoKS5sZW5ndGggPiAwKSBhd2FpdCBmbHVzaEJhdGNoKClcblxuICAgICAgICAgIGJhdGNoLmFkZENvbHVtbihuZXcgVGFibGVDb2x1bW4ob3BlcmF0aW9uLmNvbHVtbk5hbWUsIE9iamVjdC5hc3NpZ24oe2lzTmV3Q29sdW1uOiB0cnVlLCB0eXBlOiBvcGVyYXRpb24uY29sdW1uVHlwZX0sIG9wZXJhdGlvbi5hcmdzKSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmVtb3ZlQ29sdW1uXCI6XG4gICAgICAgICAgLy8gRmx1c2ggYW4gYWxyZWFkeS1yZWNvcmRlZCBpbmRleCBiYXRjaCBmaXJzdCBzbyB0aGUgZW1pdHRlZCBTUUwga2VlcHNcbiAgICAgICAgICAvLyB0aGUgcmVjb3JkZWQgZGVjbGFyYXRpb24gb3JkZXIgKGluZGV4IGJlZm9yZSBjb2x1bW4pLlxuICAgICAgICAgIGlmIChiYXRjaC5nZXRJbmRleGVzKCkubGVuZ3RoID4gMCkgYXdhaXQgZmx1c2hCYXRjaCgpXG5cbiAgICAgICAgICBiYXRjaC5hZGRDb2x1bW4obmV3IFRhYmxlQ29sdW1uKG9wZXJhdGlvbi5jb2x1bW5OYW1lLCB7ZHJvcENvbHVtbjogdHJ1ZX0pKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgXCJhZGRJbmRleFwiOlxuICAgICAgICAgIC8vIERyaXZlcnMgd2l0aG91dCBgc3VwcG9ydHNCdWxrQWx0ZXJJbmRleGVzYCAoUG9zdGdyZVNRTCkga2VlcCBpbmRleGVzXG4gICAgICAgICAgLy8gc3RhbmRhbG9uZSBiZWNhdXNlIHRoZWlyIEFMVEVSIFRBQkxFIGRvZXMgbm90IGNhcnJ5IENSRUFURSBJTkRFWFxuICAgICAgICAgIC8vIGNsYXVzZXMuIEFuIGlmTm90RXhpc3RzIGluZGV4IGlzIG5ldmVyIGNvbWJpbmVkIGJlY2F1c2UgdGhlIGNvbWJpbmVkXG4gICAgICAgICAgLy8gYnVsayBmb3JtIGNhbm5vdCBleHByZXNzIHRoYXQgZ3VhcmQuXG4gICAgICAgICAgaWYgKCFkcml2ZXIuc3VwcG9ydHNCdWxrQWx0ZXJJbmRleGVzKCkgfHwgb3BlcmF0aW9uLmFyZ3M/LmlmTm90RXhpc3RzKSB7XG4gICAgICAgICAgICBhd2FpdCBmbHVzaEJhdGNoKClcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGVDaGFuZ2VUYWJsZU9wZXJhdGlvbih0YWJsZU5hbWUsIG9wZXJhdGlvbilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmF0Y2guYWRkSW5kZXgodGhpcy5fY2hhbmdlVGFibGVUYWJsZUluZGV4KHRhYmxlTmFtZSwgb3BlcmF0aW9uKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBhd2FpdCBmbHVzaEJhdGNoKClcbiAgICAgICAgICBhd2FpdCB0aGlzLl9leGVjdXRlQ2hhbmdlVGFibGVPcGVyYXRpb24odGFibGVOYW1lLCBvcGVyYXRpb24pXG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgZmx1c2hCYXRjaCgpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgVGFibGVJbmRleCBmb3IgYSBiYXRjaCBmcm9tIGEgcmVjb3JkZWQgYWRkSW5kZXggb3BlcmF0aW9uLFxuICAgKiByZXNvbHZpbmcgdGhlIGRlZmF1bHQgYWRkSW5kZXggbmFtZSBlYWdlcmx5IHNvIGEgY29tYmluZWQgTXlTUUwgQUxURVJcbiAgICogbmV2ZXIgc2lsZW50bHkgbmFtZXMgdGhlIGluZGV4IGRpZmZlcmVudGx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NoYW5nZS10YWJsZS5qc1wiKS5DaGFuZ2VUYWJsZUFkZEluZGV4T3BlcmF0aW9uVHlwZX0gb3BlcmF0aW9uIC0gUmVjb3JkZWQgb3BlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7VGFibGVJbmRleH0gLSBUaGUgdGFibGUgaW5kZXguXG4gICAqL1xuICBfY2hhbmdlVGFibGVUYWJsZUluZGV4KHRhYmxlTmFtZSwgb3BlcmF0aW9uKSB7XG4gICAgY29uc3Qge2FyZ3MsIGNvbHVtbnN9ID0gb3BlcmF0aW9uXG4gICAgLy8gQW4gaWZOb3RFeGlzdHMgaW5kZXggbmV2ZXIgcmVhY2hlcyBiYXRjaGluZyAoaXQgaXMgZmx1c2hlZCBzdGFuZGFsb25lKSxcbiAgICAvLyBzbyB0aGUgY29tYmluZWQgQUxURVIgY2Fubm90IGNhcnJ5IHRoYXQgZ3VhcmQuXG4gICAgY29uc3Qge25hbWUsIC4uLnJlc3RJbmRleEFyZ3N9ID0gYXJncyB8fCB7fVxuICAgIGNvbnN0IGluZGV4TmFtZSA9IG5hbWUgfHwgbmV3IENyZWF0ZUluZGV4QmFzZSh7Y29sdW1ucywgZHJpdmVyOiB0aGlzLmdldERyaXZlcigpLCB0YWJsZU5hbWV9KS5nZW5lcmF0ZUluZGV4TmFtZSgpXG5cbiAgICByZXR1cm4gbmV3IFRhYmxlSW5kZXgoY29sdW1ucywgT2JqZWN0LmFzc2lnbih7fSwgcmVzdEluZGV4QXJncywge25hbWU6IGluZGV4TmFtZX0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgc2luZ2xlIHJlY29yZGVkIGNoYW5nZVRhYmxlIG9wZXJhdGlvbiB0aHJvdWdoIHRoZSBleGlzdGluZ1xuICAgKiBtaWdyYXRpb24gaGVscGVyIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIGFzIGEgZGlyZWN0IGhlbHBlciBjYWxsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NoYW5nZS10YWJsZS5qc1wiKS5DaGFuZ2VUYWJsZU9wZXJhdGlvblR5cGV9IG9wZXJhdGlvbiAtIFJlY29yZGVkIG9wZXJhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF9leGVjdXRlQ2hhbmdlVGFibGVPcGVyYXRpb24odGFibGVOYW1lLCBvcGVyYXRpb24pIHtcbiAgICBzd2l0Y2ggKG9wZXJhdGlvbi50eXBlKSB7XG4gICAgICBjYXNlIFwiYWRkQ29sdW1uXCI6XG4gICAgICAgIGF3YWl0IHRoaXMuYWRkQ29sdW1uKHRhYmxlTmFtZSwgb3BlcmF0aW9uLmNvbHVtbk5hbWUsIG9wZXJhdGlvbi5jb2x1bW5UeXBlLCBvcGVyYXRpb24uYXJncylcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJyZW1vdmVDb2x1bW5cIjpcbiAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVDb2x1bW4odGFibGVOYW1lLCBvcGVyYXRpb24uY29sdW1uTmFtZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJhZGRJbmRleFwiOlxuICAgICAgICBhd2FpdCB0aGlzLmFkZEluZGV4KHRhYmxlTmFtZSwgb3BlcmF0aW9uLmNvbHVtbnMsIG9wZXJhdGlvbi5hcmdzKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcInJlbW92ZUluZGV4XCI6XG4gICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlSW5kZXgodGFibGVOYW1lLCBvcGVyYXRpb24ubmFtZU9yQ29sdW1ucywgb3BlcmF0aW9uLmFyZ3MpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiYWRkUmVmZXJlbmNlXCI6XG4gICAgICAgIGF3YWl0IHRoaXMuYWRkUmVmZXJlbmNlKHRhYmxlTmFtZSwgb3BlcmF0aW9uLnJlZmVyZW5jZU5hbWUsIG9wZXJhdGlvbi5hcmdzIHx8IHt9KVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcInJlbW92ZVJlZmVyZW5jZVwiOlxuICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZVJlZmVyZW5jZSh0YWJsZU5hbWUsIG9wZXJhdGlvbi5yZWZlcmVuY2VOYW1lLCBvcGVyYXRpb24uYXJncylcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJyZW5hbWVDb2x1bW5cIjpcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5hbWVDb2x1bW4odGFibGVOYW1lLCBvcGVyYXRpb24ub2xkQ29sdW1uTmFtZSwgb3BlcmF0aW9uLm5ld0NvbHVtbk5hbWUpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwiY2hhbmdlQ29sdW1uTnVsbFwiOlxuICAgICAgICBhd2FpdCB0aGlzLmNoYW5nZUNvbHVtbk51bGwodGFibGVOYW1lLCBvcGVyYXRpb24uY29sdW1uTmFtZSwgb3BlcmF0aW9uLm51bGxhYmxlKVxuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBjaGFuZ2UgdGFibGUgb3BlcmF0aW9uXCIpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZHJvcCB0YWJsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBkcm9wVGFibGUodGFibGVOYW1lKSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5kcm9wVGFibGUodGFibGVOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVuYW1lIGNvbHVtbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvbGRDb2x1bW5OYW1lIC0gUHJldmlvdXMgY29sdW1uIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdDb2x1bW5OYW1lIC0gTmV3IGNvbHVtbiBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcmVuYW1lQ29sdW1uKHRhYmxlTmFtZSwgb2xkQ29sdW1uTmFtZSwgbmV3Q29sdW1uTmFtZSkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkucmVuYW1lQ29sdW1uKHRhYmxlTmFtZSwgb2xkQ29sdW1uTmFtZSwgbmV3Q29sdW1uTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRhYmxlIGV4aXN0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFJlc29sdmVzIHdpdGggV2hldGhlciB0YWJsZSBleGlzdHMuXG4gICAqL1xuICBhc3luYyB0YWJsZUV4aXN0cyh0YWJsZU5hbWUpIHtcbiAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmdldERyaXZlcigpLnRhYmxlRXhpc3RzKHRhYmxlTmFtZSlcblxuICAgIHJldHVybiBleGlzdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXI6IGNyZWF0ZXMgdGhlIHNoYXJlZCBhdWRpdCB0YWJsZXMgKGBhdWRpdF9hY3Rpb25zYCxcbiAgICogYGF1ZGl0X2F1ZGl0YWJsZV90eXBlc2AsIGBhdWRpdHNgKS4gQ2FsbCBmcm9tIGB1cCgpYCBpbiBhIG1pZ3JhdGlvbi5cbiAgICogQHBhcmFtIHt7aWQ/OiB7dHlwZT86IHN0cmluZ319fSBbb3B0aW9uc10gLSBJRCBjb2x1bW4gb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjcmVhdGVTaGFyZWRBdWRpdFRhYmxlcyhvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBpZCA9IG9wdGlvbnMuaWQgfHwge31cblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlVGFibGUoXCJhdWRpdF9hY3Rpb25zXCIsIHtpZH0sICh0YWJsZSkgPT4ge1xuICAgICAgdGFibGUuc3RyaW5nKFwiYWN0aW9uXCIsIHtpbmRleDoge3VuaXF1ZTogdHJ1ZX0sIG51bGw6IGZhbHNlfSlcbiAgICAgIHRhYmxlLnRpbWVzdGFtcHMoKVxuICAgIH0pXG5cbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVRhYmxlKFwiYXVkaXRfYXVkaXRhYmxlX3R5cGVzXCIsIHtpZH0sICh0YWJsZSkgPT4ge1xuICAgICAgdGFibGUuc3RyaW5nKFwibmFtZVwiLCB7aW5kZXg6IHt1bmlxdWU6IHRydWV9LCBudWxsOiBmYWxzZX0pXG4gICAgICB0YWJsZS50aW1lc3RhbXBzKClcbiAgICB9KVxuXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVUYWJsZShcImF1ZGl0c1wiLCB7aWR9LCAodGFibGUpID0+IHtcbiAgICAgIHRhYmxlLnJlZmVyZW5jZXMoXCJhdWRpdF9hY3Rpb25cIiwge2ZvcmVpZ25LZXk6IHRydWUsIG51bGw6IGZhbHNlfSlcbiAgICAgIHRhYmxlLnJlZmVyZW5jZXMoXCJhdWRpdF9hdWRpdGFibGVfdHlwZVwiLCB7Zm9yZWlnbktleTogdHJ1ZSwgbnVsbDogZmFsc2V9KVxuICAgICAgdGFibGUucmVmZXJlbmNlcyhcImF1ZGl0YWJsZVwiLCB7bnVsbDogZmFsc2UsIHBvbHltb3JwaGljOiB0cnVlfSlcbiAgICAgIHRhYmxlLmpzb24oXCJhdWRpdGVkX2NoYW5nZXNcIilcbiAgICAgIHRhYmxlLmpzb24oXCJwYXJhbXNcIilcbiAgICAgIHRhYmxlLnRpbWVzdGFtcHMoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogSGVscGVyOiBjcmVhdGVzIGEgZGVkaWNhdGVkIGF1ZGl0IHRhYmxlIGZvciBhIG1vZGVsIChlLmcuXG4gICAqIGBwcm9qZWN0X2F1ZGl0c2AgZm9yIHRoZSBgcHJvamVjdHNgIHRhYmxlKS4gQ2FsbCBmcm9tIGB1cCgpYFxuICAgKiBpbiBhIG1pZ3JhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsVGFibGVOYW1lIC0gTW9kZWwgdGFibGUgbmFtZSAoZS5nLiBcInByb2plY3RzXCIpLlxuICAgKiBAcGFyYW0ge3tpZD86IHt0eXBlPzogc3RyaW5nfX19IFtvcHRpb25zXSAtIElEIGNvbHVtbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBUaGUgY3JlYXRlZCBhdWRpdCB0YWJsZSBuYW1lLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRGVkaWNhdGVkQXVkaXRUYWJsZShtb2RlbFRhYmxlTmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgYXVkaXRUYWJsZSA9IGRlZGljYXRlZEF1ZGl0VGFibGVOYW1lKG1vZGVsVGFibGVOYW1lKVxuICAgIGNvbnN0IGlkID0gb3B0aW9ucy5pZCB8fCB7fVxuXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVUYWJsZShhdWRpdFRhYmxlLCB7aWR9LCAodGFibGUpID0+IHtcbiAgICAgIGNvbnN0IHJlZktleSA9IGluZmxlY3Rpb24uc2luZ3VsYXJpemUobW9kZWxUYWJsZU5hbWUpXG5cbiAgICAgIHRhYmxlLnJlZmVyZW5jZXMocmVmS2V5LCB7Zm9yZWlnbktleTogdHJ1ZSwgbnVsbDogZmFsc2V9KVxuICAgICAgdGFibGUucmVmZXJlbmNlcyhcImF1ZGl0X2FjdGlvblwiLCB7Zm9yZWlnbktleTogdHJ1ZSwgbnVsbDogZmFsc2V9KVxuICAgICAgdGFibGUuanNvbihcImF1ZGl0ZWRfY2hhbmdlc1wiKVxuICAgICAgdGFibGUuanNvbihcInBhcmFtc1wiKVxuICAgICAgdGFibGUudGltZXN0YW1wcygpXG4gICAgfSlcblxuICAgIHJldHVybiBhdWRpdFRhYmxlXG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkZWRpY2F0ZWQgYXVkaXQgdGFibGUgbmFtZSBmb3IgYSBtb2RlbCB0YWJsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbFRhYmxlTmFtZSAtIE1vZGVsIHRhYmxlIG5hbWUgKGUuZy4gXCJwcm9qZWN0c1wiKS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IERlZGljYXRlZCBhdWRpdCB0YWJsZSBuYW1lIChlLmcuIFwicHJvamVjdF9hdWRpdHNcIikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWRpY2F0ZWRBdWRpdFRhYmxlTmFtZShtb2RlbFRhYmxlTmFtZSkge1xuICBpZiAobW9kZWxUYWJsZU5hbWUuZW5kc1dpdGgoXCJzXCIpKSB7XG4gICAgcmV0dXJuIGAke21vZGVsVGFibGVOYW1lLnNsaWNlKDAsIC0xKX1fYXVkaXRzYFxuICB9XG5cbiAgcmV0dXJuIGAke21vZGVsVGFibGVOYW1lfV9hdWRpdHNgXG59XG4iXX0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type MigrationExecutionPhase = "post-publication" | "pre-runtime";
|
|
2
|
+
/** @typedef {"post-publication" | "pre-runtime"} MigrationExecutionPhase */
|
|
3
|
+
/** @type {MigrationExecutionPhase} */
|
|
4
|
+
export declare const DEFAULT_MIGRATION_EXECUTION_PHASE: MigrationExecutionPhase;
|
|
5
|
+
/**
|
|
6
|
+
* Validates and returns one supported migration execution phase.
|
|
7
|
+
* @param {string | undefined} phase - Migration execution phase.
|
|
8
|
+
* @returns {MigrationExecutionPhase} - Validated execution phase.
|
|
9
|
+
*/
|
|
10
|
+
export declare function migrationExecutionPhase(phase: string | undefined): MigrationExecutionPhase;
|
|
11
|
+
/**
|
|
12
|
+
* Tests whether a migration class belongs to an optional selected phase.
|
|
13
|
+
* @param {typeof import("./migration/index.js").default} MigrationClass - Migration class.
|
|
14
|
+
* @param {MigrationExecutionPhase | undefined} executionPhase - Optional selected phase.
|
|
15
|
+
* @returns {boolean} - Whether the migration belongs to the selection.
|
|
16
|
+
*/
|
|
17
|
+
export declare function migrationRunsInExecutionPhase(MigrationClass: typeof import("./migration/index.js").default, executionPhase: MigrationExecutionPhase | undefined): boolean;
|
|
18
|
+
//# sourceMappingURL=migration-execution-phase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-execution-phase.d.ts","sourceRoot":"","sources":["../../../src/database/migration-execution-phase.js"],"names":[],"mappings":"AAEI,YAA8C,uBAAuB,GAA3D,kBAAkB,GAAG,aAAa,CAAyB;AAAzE,4EAA4E;AAE5E,sCAAsC;AACtC,eAAO,MAAM,iCAAiC,EADnC,uBACmD,CAAA;AAE9D;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAHlC,MAAM,GAAG,SAGyB,GAFhC,uBAAuB,CAWnC;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,cAAc,EAJjD,cAAc,sBAAsB,EAAE,OAIW,EAAE,cAAc,EAHjE,uBAAuB,GAAG,SAGuC,GAF/D,OAAO,CAMnB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/** @typedef {"post-publication" | "pre-runtime"} MigrationExecutionPhase */
|
|
3
|
+
/** @type {MigrationExecutionPhase} */
|
|
4
|
+
export const DEFAULT_MIGRATION_EXECUTION_PHASE = "pre-runtime";
|
|
5
|
+
/**
|
|
6
|
+
* Validates and returns one supported migration execution phase.
|
|
7
|
+
* @param {string | undefined} phase - Migration execution phase.
|
|
8
|
+
* @returns {MigrationExecutionPhase} - Validated execution phase.
|
|
9
|
+
*/
|
|
10
|
+
export function migrationExecutionPhase(phase) {
|
|
11
|
+
if (phase === undefined) {
|
|
12
|
+
throw new Error("Missing migration execution phase. Expected one of: pre-runtime, post-publication");
|
|
13
|
+
}
|
|
14
|
+
if (phase !== "pre-runtime" && phase !== "post-publication") {
|
|
15
|
+
throw new Error(`Unknown migration execution phase ${JSON.stringify(phase)}. Expected one of: pre-runtime, post-publication`);
|
|
16
|
+
}
|
|
17
|
+
return phase;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Tests whether a migration class belongs to an optional selected phase.
|
|
21
|
+
* @param {typeof import("./migration/index.js").default} MigrationClass - Migration class.
|
|
22
|
+
* @param {MigrationExecutionPhase | undefined} executionPhase - Optional selected phase.
|
|
23
|
+
* @returns {boolean} - Whether the migration belongs to the selection.
|
|
24
|
+
*/
|
|
25
|
+
export function migrationRunsInExecutionPhase(MigrationClass, executionPhase) {
|
|
26
|
+
if (executionPhase === undefined)
|
|
27
|
+
return true;
|
|
28
|
+
return MigrationClass.getExecutionPhase() === executionPhase;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uLWV4ZWN1dGlvbi1waGFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhYmFzZS9taWdyYXRpb24tZXhlY3V0aW9uLXBoYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWiw0RUFBNEU7QUFFNUUsc0NBQXNDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLGFBQWEsQ0FBQTtBQUU5RDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEtBQUs7SUFDM0MsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtRkFBbUYsQ0FBQyxDQUFBO0lBQ3RHLENBQUM7SUFDRCxJQUFJLEtBQUssS0FBSyxhQUFhLElBQUksS0FBSyxLQUFLLGtCQUFrQixFQUFFLENBQUM7UUFDNUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQTtJQUMvSCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQUMsY0FBYyxFQUFFLGNBQWM7SUFDMUUsSUFBSSxjQUFjLEtBQUssU0FBUztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRTdDLE9BQU8sY0FBYyxDQUFDLGlCQUFpQixFQUFFLEtBQUssY0FBYyxDQUFBO0FBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqIEB0eXBlZGVmIHtcInBvc3QtcHVibGljYXRpb25cIiB8IFwicHJlLXJ1bnRpbWVcIn0gTWlncmF0aW9uRXhlY3V0aW9uUGhhc2UgKi9cblxuLyoqIEB0eXBlIHtNaWdyYXRpb25FeGVjdXRpb25QaGFzZX0gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01JR1JBVElPTl9FWEVDVVRJT05fUEhBU0UgPSBcInByZS1ydW50aW1lXCJcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW5kIHJldHVybnMgb25lIHN1cHBvcnRlZCBtaWdyYXRpb24gZXhlY3V0aW9uIHBoYXNlLlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHBoYXNlIC0gTWlncmF0aW9uIGV4ZWN1dGlvbiBwaGFzZS5cbiAqIEByZXR1cm5zIHtNaWdyYXRpb25FeGVjdXRpb25QaGFzZX0gLSBWYWxpZGF0ZWQgZXhlY3V0aW9uIHBoYXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWlncmF0aW9uRXhlY3V0aW9uUGhhc2UocGhhc2UpIHtcbiAgaWYgKHBoYXNlID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIG1pZ3JhdGlvbiBleGVjdXRpb24gcGhhc2UuIEV4cGVjdGVkIG9uZSBvZjogcHJlLXJ1bnRpbWUsIHBvc3QtcHVibGljYXRpb25cIilcbiAgfVxuICBpZiAocGhhc2UgIT09IFwicHJlLXJ1bnRpbWVcIiAmJiBwaGFzZSAhPT0gXCJwb3N0LXB1YmxpY2F0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbWlncmF0aW9uIGV4ZWN1dGlvbiBwaGFzZSAke0pTT04uc3RyaW5naWZ5KHBoYXNlKX0uIEV4cGVjdGVkIG9uZSBvZjogcHJlLXJ1bnRpbWUsIHBvc3QtcHVibGljYXRpb25gKVxuICB9XG5cbiAgcmV0dXJuIHBoYXNlXG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIG1pZ3JhdGlvbiBjbGFzcyBiZWxvbmdzIHRvIGFuIG9wdGlvbmFsIHNlbGVjdGVkIHBoYXNlLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9taWdyYXRpb24vaW5kZXguanNcIikuZGVmYXVsdH0gTWlncmF0aW9uQ2xhc3MgLSBNaWdyYXRpb24gY2xhc3MuXG4gKiBAcGFyYW0ge01pZ3JhdGlvbkV4ZWN1dGlvblBoYXNlIHwgdW5kZWZpbmVkfSBleGVjdXRpb25QaGFzZSAtIE9wdGlvbmFsIHNlbGVjdGVkIHBoYXNlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgbWlncmF0aW9uIGJlbG9uZ3MgdG8gdGhlIHNlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pZ3JhdGlvblJ1bnNJbkV4ZWN1dGlvblBoYXNlKE1pZ3JhdGlvbkNsYXNzLCBleGVjdXRpb25QaGFzZSkge1xuICBpZiAoZXhlY3V0aW9uUGhhc2UgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWVcblxuICByZXR1cm4gTWlncmF0aW9uQ2xhc3MuZ2V0RXhlY3V0aW9uUGhhc2UoKSA9PT0gZXhlY3V0aW9uUGhhc2Vcbn1cbiJdfQ==
|
|
@@ -2,6 +2,7 @@ import Logger from "../logger.js";
|
|
|
2
2
|
export default class VelociousDatabaseMigrator {
|
|
3
3
|
configuration: import("../configuration.js").default;
|
|
4
4
|
databaseIdentifiers: string[] | undefined;
|
|
5
|
+
executionPhase: import("./migration-execution-phase.js").MigrationExecutionPhase | undefined;
|
|
5
6
|
logger: Logger;
|
|
6
7
|
/**
|
|
7
8
|
* Migrations versions.
|
|
@@ -12,10 +13,12 @@ export default class VelociousDatabaseMigrator {
|
|
|
12
13
|
* @param {object} args - Options object.
|
|
13
14
|
* @param {import("../configuration.js").default} args.configuration - Configuration instance.
|
|
14
15
|
* @param {string[]} [args.databaseIdentifiers] - Optional database identifiers to migrate.
|
|
16
|
+
* @param {import("./migration-execution-phase.js").MigrationExecutionPhase} [args.executionPhase] - Optional migration execution phase to select.
|
|
15
17
|
*/
|
|
16
|
-
constructor({ configuration, databaseIdentifiers, ...restArgs }: {
|
|
18
|
+
constructor({ configuration, databaseIdentifiers, executionPhase, ...restArgs }: {
|
|
17
19
|
configuration: import("../configuration.js").default;
|
|
18
20
|
databaseIdentifiers?: string[];
|
|
21
|
+
executionPhase?: import("./migration-execution-phase.js").MigrationExecutionPhase;
|
|
19
22
|
});
|
|
20
23
|
/**
|
|
21
24
|
* Runs handles database identifier.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../../src/database/migrator.js"],"names":[],"mappings":"AAIA,OAAO,MAAM,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../../src/database/migrator.js"],"names":[],"mappings":"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"}
|