velocious 1.0.667 → 1.0.669
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 +34 -9
- package/build/configuration.js +23 -1
- package/build/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +2 -48
- package/build/environment-handlers/node/cli/commands/test.js +17 -69
- package/build/frontend-models/websocket-channel.js +18 -0
- package/build/http-server/client/websocket-session.js +41 -4
- package/build/http-server/websocket-channel.js +14 -0
- package/build/http-server/websocket-event-log-store.js +85 -12
- package/build/http-server/websocket-events-host.js +14 -6
- package/build/src/configuration.d.ts +18 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +22 -2
- package/build/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +3 -47
- package/build/src/environment-handlers/node/cli/commands/test.d.ts +2 -28
- package/build/src/environment-handlers/node/cli/commands/test.d.ts.map +1 -1
- package/build/src/environment-handlers/node/cli/commands/test.js +10 -61
- package/build/src/frontend-models/websocket-channel.d.ts +9 -0
- package/build/src/frontend-models/websocket-channel.d.ts.map +1 -1
- package/build/src/frontend-models/websocket-channel.js +16 -1
- package/build/src/http-server/client/websocket-session.d.ts +25 -2
- package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
- package/build/src/http-server/client/websocket-session.js +40 -5
- package/build/src/http-server/websocket-channel.d.ts +11 -0
- package/build/src/http-server/websocket-channel.d.ts.map +1 -1
- package/build/src/http-server/websocket-channel.js +14 -1
- package/build/src/http-server/websocket-event-log-store.d.ts +60 -41
- package/build/src/http-server/websocket-event-log-store.d.ts.map +1 -1
- package/build/src/http-server/websocket-event-log-store.js +79 -12
- package/build/src/http-server/websocket-events-host.d.ts +10 -3
- package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
- package/build/src/http-server/websocket-events-host.js +14 -7
- package/build/src/testing/expect-utils.d.ts +1 -51
- package/build/src/testing/expect-utils.d.ts.map +1 -1
- package/build/src/testing/expect-utils.js +2 -205
- package/build/src/testing/expect.d.ts +1 -171
- package/build/src/testing/expect.d.ts.map +1 -1
- package/build/src/testing/expect.js +2 -667
- package/build/src/testing/test-files-finder.d.ts +13 -116
- package/build/src/testing/test-files-finder.d.ts.map +1 -1
- package/build/src/testing/test-files-finder.js +26 -296
- package/build/src/testing/test-filter-parser.d.ts +32 -22
- package/build/src/testing/test-filter-parser.d.ts.map +1 -1
- package/build/src/testing/test-filter-parser.js +25 -217
- package/build/src/testing/test-profile-activity.d.ts +1 -6
- package/build/src/testing/test-profile-activity.d.ts.map +1 -1
- package/build/src/testing/test-profile-activity.js +2 -12
- package/build/src/testing/test-profile-output.d.ts +1 -40
- package/build/src/testing/test-profile-output.d.ts.map +1 -1
- package/build/src/testing/test-profile-output.js +2 -217
- package/build/src/testing/test-profiler.d.ts +15 -659
- package/build/src/testing/test-profiler.d.ts.map +1 -1
- package/build/src/testing/test-profiler.js +35 -833
- package/build/src/testing/test-runner.d.ts +10 -1
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +26 -4
- package/build/src/testing/test-suite-splitter.d.ts +1 -128
- package/build/src/testing/test-suite-splitter.d.ts.map +1 -1
- package/build/src/testing/test-suite-splitter.js +2 -259
- package/build/src/testing/test.d.ts +1 -13
- package/build/src/testing/test.d.ts.map +1 -1
- package/build/src/testing/test.js +2 -14
- package/build/src/testing/timing-manifest.d.ts +5 -93
- package/build/src/testing/timing-manifest.d.ts.map +1 -1
- package/build/src/testing/timing-manifest.js +4 -283
- package/build/src/testing/velocious-attempt-executor.d.ts.map +1 -1
- package/build/src/testing/velocious-attempt-executor.js +8 -2
- package/build/testing/expect-utils.js +1 -242
- package/build/testing/expect.js +1 -760
- package/build/testing/test-files-finder.js +29 -345
- package/build/testing/test-filter-parser.js +29 -248
- package/build/testing/test-profile-activity.js +1 -12
- package/build/testing/test-profile-output.js +8 -253
- package/build/testing/test-profiler.js +38 -895
- package/build/testing/test-runner.js +33 -9
- package/build/testing/test-suite-splitter.js +1 -301
- package/build/testing/test.js +3 -14
- package/build/testing/timing-manifest.js +10 -344
- package/build/testing/velocious-attempt-executor.js +7 -1
- package/package.json +3 -4
- package/scripts/test-browser.js +29 -6
- package/scripts/verify-docker-dev-environment.js +13 -1
- package/src/configuration.js +23 -1
- package/src/environment-handlers/node/cli/commands/test/timing-manifest/merge.js +2 -48
- package/src/environment-handlers/node/cli/commands/test.js +17 -69
- package/src/frontend-models/websocket-channel.js +18 -0
- package/src/http-server/client/websocket-session.js +41 -4
- package/src/http-server/websocket-channel.js +14 -0
- package/src/http-server/websocket-event-log-store.js +85 -12
- package/src/http-server/websocket-events-host.js +14 -6
- package/src/testing/expect-utils.js +1 -242
- package/src/testing/expect.js +1 -760
- package/src/testing/test-files-finder.js +29 -345
- package/src/testing/test-filter-parser.js +29 -248
- package/src/testing/test-profile-activity.js +1 -12
- package/src/testing/test-profile-output.js +8 -253
- package/src/testing/test-profiler.js +38 -895
- package/src/testing/test-runner.js +33 -9
- package/src/testing/test-suite-splitter.js +1 -301
- package/src/testing/test.js +3 -14
- package/src/testing/timing-manifest.js +10 -344
- package/src/testing/velocious-attempt-executor.js +7 -1
- package/build/src/testing/base-expect.d.ts +0 -15
- package/build/src/testing/base-expect.d.ts.map +0 -1
- package/build/src/testing/base-expect.js +0 -16
- package/build/src/testing/expect-to-change.d.ts +0 -32
- package/build/src/testing/expect-to-change.d.ts.map +0 -1
- package/build/src/testing/expect-to-change.js +0 -46
- package/build/testing/base-expect.js +0 -17
- package/build/testing/expect-to-change.js +0 -55
- package/src/testing/base-expect.js +0 -17
- package/src/testing/expect-to-change.js +0 -55
|
@@ -334,6 +334,21 @@ export default class FrontendModelWebsocketChannel extends VelociousWebsocketCha
|
|
|
334
334
|
matches(broadcastParams) {
|
|
335
335
|
return broadcastParams?.model === this._modelName();
|
|
336
336
|
}
|
|
337
|
+
/**
|
|
338
|
+
* Drops the server-only destroy-authorization snapshot before replay
|
|
339
|
+
* persistence. The snapshot is what makes replayed destroy events
|
|
340
|
+
* require a client resync, and the pre-delete row it captures must
|
|
341
|
+
* never be stored.
|
|
342
|
+
* @param {Record<string, import("./query.js").FrontendModelTransportValue> | null | undefined} broadcastParams - Params from `broadcastToChannel`.
|
|
343
|
+
* @returns {Record<string, import("./query.js").FrontendModelTransportValue> | null} - Persistable routing params.
|
|
344
|
+
*/
|
|
345
|
+
static replayableBroadcastParams(broadcastParams) {
|
|
346
|
+
if (!broadcastParams)
|
|
347
|
+
return null;
|
|
348
|
+
const replayableParams = { ...broadcastParams };
|
|
349
|
+
delete replayableParams.destroyAuthorizationRecord;
|
|
350
|
+
return replayableParams;
|
|
351
|
+
}
|
|
337
352
|
/**
|
|
338
353
|
* Runs debug snapshot.
|
|
339
354
|
* @returns {Record<string, ReturnType<typeof JSON.parse>>} Debug-safe subscription details.
|
|
@@ -648,4 +663,4 @@ export default class FrontendModelWebsocketChannel extends VelociousWebsocketCha
|
|
|
648
663
|
};
|
|
649
664
|
}
|
|
650
665
|
}
|
|
651
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNoYW5uZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZnJvbnRlbmQtbW9kZWxzL3dlYnNvY2tldC1jaGFubmVsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLHlCQUF5QixNQUFNLHFDQUFxQyxDQUFBO0FBQzNFLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDbEMsT0FBTyxRQUFRLE1BQU0sbUNBQW1DLENBQUE7QUFDeEQsT0FBTyxFQUFDLG1EQUFtRCxFQUFDLE1BQU0seUJBQXlCLENBQUE7QUFDM0YsT0FBTyxFQUFDLHdDQUF3QyxFQUFDLE1BQU0sMEJBQTBCLENBQUE7QUFDakYsT0FBTyxFQUFDLHNDQUFzQyxFQUFFLG9DQUFvQyxFQUFDLE1BQU0sOEJBQThCLENBQUE7QUFDekgsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sK0JBQStCLENBQUE7QUFFdkU7OztHQUdHO0FBQ0g7O0dBRUc7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtBQUV4RSxxRkFBcUY7QUFDckYsMkVBQTJFO0FBQzNFLE1BQU0sNEJBQTRCLEdBQUcsaUJBQWlCLENBQUE7QUFFdEQ7Ozs7R0FJRztBQUNILFNBQVMsNEJBQTRCLENBQUMsS0FBSztJQUN6QyxPQUFPLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0FBQzdFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyw0QkFBNEIsQ0FBQyxLQUFLO0lBQ3pDLE9BQU8sT0FBTyxDQUNaLEtBQUs7V0FDRixPQUFPLEtBQUssS0FBSyxRQUFR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O1lBQzlCLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNO1lBQ3hCLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFhO1lBQ2xDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTTtTQUMvQixDQUFBO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBWZWxvY2lvdXNXZWJzb2NrZXRDaGFubmVsIGZyb20gXCIuLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiXG5pbXBvcnQge0J1ZmZlcn0gZnJvbSBcIm5vZGU6YnVmZmVyXCJcbmltcG9ydCBSZXNwb25zZSBmcm9tIFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzXCJcbmltcG9ydCB7ZnJvbnRlbmRNb2RlbFJlc291cmNlc1dpdGhCdWlsdEluc0ZvckJhY2tlbmRQcm9qZWN0fSBmcm9tIFwiLi9idWlsdC1pbi1yZXNvdXJjZXMuanNcIlxuaW1wb3J0IHtmcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc0Zyb21EZWZpbml0aW9ufSBmcm9tIFwiLi9yZXNvdXJjZS1kZWZpbml0aW9uLmpzXCJcbmltcG9ydCB7ZGVzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUsIHNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZX0gZnJvbSBcIi4vdHJhbnNwb3J0LXNlcmlhbGl6YXRpb24uanNcIlxuaW1wb3J0IHttb2RlbFByaW1hcnlLZXlDb25kaXRpb25zfSBmcm9tIFwiLi4vdXRpbHMvbW9kZWwtcHJpbWFyeS1rZXkuanNcIlxuXG4vKipcbiAqIERlZmluZXMgdGhpcyB0eXBlZGVmLlxuICogQHR5cGVkZWYge3thY3Rpb24/OiBzdHJpbmcsIGlkPzogaW1wb3J0KFwiLi4vdXRpbHMvbW9kZWwtcHJpbWFyeS1rZXkuanNcIikuTW9kZWxQcmltYXJ5S2V5VmFsdWUsIG1hdGNoZWRFdmVudEZpbHRlcktleXM/OiBzdHJpbmdbXSwgcHJldmlvdXNJZD86IGltcG9ydChcIi4uL3V0aWxzL21vZGVsLXByaW1hcnkta2V5LmpzXCIpLk1vZGVsUHJpbWFyeUtleVZhbHVlLCByZWNvcmQ/OiBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZSwgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZH19IEZyb250ZW5kTW9kZWxMaWZlY3ljbGVCcm9hZGNhc3RCb2R5XG4gKi9cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPn0gRGVzdHJveUF1dGhvcml6YXRpb25SZWNvcmRcbiAqL1xuLyoqXG4gKiBEZWZpbmVzIHRoaXMgdHlwZWRlZi5cbiAqIEB0eXBlZGVmIHt7aGVhZGVycz86ICgpID0+IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPiwgcmVtb3RlQWRkcmVzcz86ICgpID0+IHN0cmluZyB8IHVuZGVmaW5lZH19IEZyb250ZW5kTW9kZWxXZWJzb2NrZXRVcGdyYWRlUmVxdWVzdFxuICovXG4vKipcbiAqIERlZmluZXMgdGhpcyB0eXBlZGVmLlxuICogQHR5cGVkZWYge3toZWFkZXJzOiAoKSA9PiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4sIGhlYWRlcjogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQsIG1ldGFkYXRhOiAoa2V5Pzogc3RyaW5nKSA9PiBSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT4gfCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZSB8IHVuZGVmaW5lZCwgcGF0aDogKCkgPT4gc3RyaW5nLCBodHRwTWV0aG9kOiAoKSA9PiBzdHJpbmcsIHJlbW90ZUFkZHJlc3M6ICgpID0+IHN0cmluZyB8IHVuZGVmaW5lZCwgb3JpZ2luOiAoKSA9PiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZH19IEZyb250ZW5kTW9kZWxXZWJzb2NrZXRTeW50aGV0aWNSZXF1ZXN0XG4gKi9cbmNvbnN0IEVWRU5UX0ZJTFRFUl9LRVlTID0gbmV3IFNldChbXCJqb2luc1wiLCBcImtleVwiLCBcInNlYXJjaGVzXCIsIFwid2hlcmVcIl0pXG5cbi8vIE1pcnJvcnMgRlJPTlRFTkRfTU9ERUxTX0NIQU5ORUxfTkFNRSBpbiAuL3dlYnNvY2tldC1wdWJsaXNoZXJzLmpzLCBkdXBsaWNhdGVkIGhlcmVcbi8vIHRvIGF2b2lkIHRoZSBjb25maWd1cmF0aW9uIOKGkiBsb2dnZXIg4oaSIHdlYnNvY2tldC1wdWJsaXNoZXJzIGltcG9ydCBjeWNsZS5cbmNvbnN0IEZST05URU5EX01PREVMU19DSEFOTkVMX05BTUUgPSBcImZyb250ZW5kLW1vZGVsc1wiXG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBzZXJ2ZXItc2lkZSBicm9hZGNhc3QgdmFsdWUgaXMgYSBkZXN0cm95LWF1dGhvcml6YXRpb24gcmVjb3JkLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZSB8IHVuZGVmaW5lZH0gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgRGVzdHJveUF1dGhvcml6YXRpb25SZWNvcmR9IC0gV2hldGhlciB0aGUgdmFsdWUgaXMgYSBjb2x1bW4ta2V5ZWQgcmVjb3JkLlxuICovXG5mdW5jdGlvbiBpc0Rlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkKHZhbHVlKSB7XG4gIHJldHVybiBCb29sZWFuKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBjYXB0dXJlZCB2YWx1ZSBpcyBhIHNlcmlhbGl6ZWQgYmluYXJ5LWNvbHVtbiBtYXJrZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlfSB2YWx1ZSAtIENhcHR1cmVkIGNvbHVtbiB2YWx1ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyB7X192ZWxvY2lvdXNEZXN0cm95QXV0aG9yaXphdGlvblR5cGU6IFwiYmluYXJ5XCIsIHZhbHVlOiBudW1iZXJbXX19IC0gV2hldGhlciB0aGUgdmFsdWUgY29udGFpbnMgc2VyaWFsaXplZCBieXRlcy5cbiAqL1xuZnVuY3Rpb24gaXNEZXN0cm95QXV0aG9yaXphdGlvbkJpbmFyeSh2YWx1ZSkge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICB2YWx1ZVxuICAgICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIlxuICAgICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICYmIFwiX192ZWxvY2lvdXNEZXN0cm95QXV0aG9yaXphdGlvblR5cGVcIiBpbiB2YWx1ZVxuICAgICYmIHZhbHVlLl9fdmVsb2Npb3VzRGVzdHJveUF1dGhvcml6YXRpb25UeXBlID09PSBcImJpbmFyeVwiXG4gICAgJiYgXCJ2YWx1ZVwiIGluIHZhbHVlXG4gICAgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZS52YWx1ZSlcbiAgICAmJiB2YWx1ZS52YWx1ZS5ldmVyeSgoYnl0ZSkgPT4gdHlwZW9mIGJ5dGUgPT09IFwibnVtYmVyXCIpXG4gIClcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBQb3N0Z3JlU1FMIGFycmF5IGV4cHJlc3Npb24gd2hvc2UgZWxlbWVudHMgYXJlIHF1b3RlZCBieSB0aGUgYWN0aXZlIGRyaXZlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGRyaXZlciAtIEFjdGl2ZSBQb3N0Z3JlU1FMIGRyaXZlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWVbXX0gdmFsdWVzIC0gQ2FwdHVyZWQgYXJyYXkgdmFsdWVzLlxuICogQHJldHVybnMge3N0cmluZ30gLSBQb3N0Z3JlU1FMIGFycmF5IGV4cHJlc3Npb24uXG4gKi9cbmZ1bmN0aW9uIHBnc3FsQXJyYXlWYWx1ZVNxbChkcml2ZXIsIHZhbHVlcykge1xuICBjb25zdCBlbGVtZW50cyA9IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gcGdzcWxBcnJheVZhbHVlU3FsKGRyaXZlciwgdmFsdWUpXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gXCJOVUxMXCJcblxuICAgIHJldHVybiBkcml2ZXIucXVvdGUodmFsdWUpXG4gIH0pXG5cbiAgcmV0dXJuIGBBUlJBWVske2VsZW1lbnRzLmpvaW4oXCIsIFwiKX1dYFxufVxuXG4vKipcbiAqIFJlc29sdmVzIGZyb250ZW5kIHJlc291cmNlIGlkZW50aXR5IGF0dHJpYnV0ZXMgdG8gYmFja2luZyBkYXRhYmFzZSBjb2x1bW5zLlxuICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IE1vZGVsQ2xhc3MgLSBCYWNraW5nIG1vZGVsIGNsYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi91dGlscy9tb2RlbC1wcmltYXJ5LWtleS5qc1wiKS5Nb2RlbFByaW1hcnlLZXlEZWZpbml0aW9ufSBwcmltYXJ5S2V5IC0gRnJvbnRlbmQgcmVzb3VyY2UgaWRlbnRpdHkgZGVmaW5pdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vdXRpbHMvbW9kZWwtcHJpbWFyeS1rZXkuanNcIikuTW9kZWxQcmltYXJ5S2V5VmFsdWV9IGlkIC0gRnJvbnRlbmQgcmVzb3VyY2UgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vdXRpbHMvbW9kZWwtcHJpbWFyeS1rZXkuanNcIikuTW9kZWxQcmltYXJ5S2V5U2NhbGFyPn0gLSBCYWNraW5nIGNvbHVtbiBjb25kaXRpb25zLlxuICovXG5mdW5jdGlvbiBmcm9udGVuZE1vZGVsUHJpbWFyeUtleURhdGFiYXNlQ29uZGl0aW9ucyhNb2RlbENsYXNzLCBwcmltYXJ5S2V5LCBpZCkge1xuICBjb25zdCByZXNvdXJjZUNvbmRpdGlvbnMgPSBtb2RlbFByaW1hcnlLZXlDb25kaXRpb25zKHByaW1hcnlLZXksIGlkKVxuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4uL3V0aWxzL21vZGVsLXByaW1hcnkta2V5LmpzXCIpLk1vZGVsUHJpbWFyeUtleVNjYWxhcj59ICovXG4gIGNvbnN0IGRhdGFiYXNlQ29uZGl0aW9ucyA9IHt9XG5cbiAgZm9yIChjb25zdCBbYXR0cmlidXRlTmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc291cmNlQ29uZGl0aW9ucykpIHtcbiAgICBkYXRhYmFzZUNvbmRpdGlvbnNbTW9kZWxDbGFzcy5nZXRDb2x1bW5OYW1lRm9yQXR0cmlidXRlTmFtZShhdHRyaWJ1dGVOYW1lKV0gPSB2YWx1ZVxuICB9XG5cbiAgcmV0dXJuIGRhdGFiYXNlQ29uZGl0aW9uc1xufVxuXG4vKipcbiAqIFJ1bnMgdHJhbnNwb3J0IHNlcmlhbGl6YXRpb24gb3B0aW9ucyBmb3IgYSBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHJhbnNwb3J0LXNlcmlhbGl6YXRpb24uanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFNlcmlhbGl6YXRpb25PcHRpb25zfSAtIFNlcmlhbGl6YXRpb24gb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gdHJhbnNwb3J0U2VyaWFsaXphdGlvbk9wdGlvbnNGb3JDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pIHtcbiAgcmV0dXJuIHtcbiAgICB0aW1lWm9uZTogY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudEhhbmRsZXIoKS5nZXRUaW1lWm9uZShjb25maWd1cmF0aW9uKVxuICB9XG59XG5cbi8qKlxuICogUGVyLXNlc3Npb24gY2hhbm5lbCBzdWJzY3JpcHRpb24gZm9yIGZyb250ZW5kLW1vZGVsIGxpZmVjeWNsZSBldmVudHMuXG4gKiBSZXBsYWNlcyB0aGUgbGVnYWN5IGBGcm9udGVuZE1vZGVsV2Vic29ja2V0Q2hhbm5lbGAgKFBoYXNlIDMpLlxuICpcbiAqIGBjYW5TdWJzY3JpYmVgIHJlc29sdmVzIHRoZSBjYWxsZXIncyBhYmlsaXR5IG9uY2UgYW5kIHJlcXVpcmVzIGEgcmVhZCBydWxlXG4gKiBmb3IgdGhlIHJlcXVlc3RlZCBtb2RlbCBjbGFzcy4gQ3JlYXRlL3VwZGF0ZSBkZWxpdmVyeSB0aGVuIHJlbG9hZHMgZWFjaFxuICogcmVjb3JkIHRocm91Z2ggdGhhdCBhYmlsaXR5IGFuZCBzZXJpYWxpemVzIGl0IHRocm91Z2ggdGhlIHN1YnNjcmliZWRcbiAqIGZyb250ZW5kIHJlc291cmNlLiBTdWJzY3JpYmVyLXByb3ZpZGVkIGV2ZW50IGZpbHRlcnMgY2FuIGZ1cnRoZXIgbmFycm93XG4gKiB0aG9zZSBhdXRob3JpemVkIGV2ZW50cy5cbiAqXG4gKiBXaXJlOiBzdWJzY3JpYmUgd2l0aCBgc3Vic2NyaWJlQ2hhbm5lbChcImZyb250ZW5kLW1vZGVsc1wiLCB7cGFyYW1zOiB7bW9kZWw6IE1vZGVsTmFtZX19KWAuXG4gKiBCYWNrZW5kIHB1Ymxpc2hlcyBge2FjdGlvbiwgaWQsIHJlY29yZH1gIHZpYVxuICogYGNvbmZpZ3VyYXRpb24uYnJvYWRjYXN0VG9DaGFubmVsKFwiZnJvbnRlbmQtbW9kZWxzXCIsIHttb2RlbDogTW9kZWxOYW1lfSwgYm9keSlgO1xuICogYG1hdGNoZXMoKWAgcm91dGVzIGJ5IG1vZGVsIG5hbWUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZyb250ZW5kTW9kZWxXZWJzb2NrZXRDaGFubmVsIGV4dGVuZHMgVmVsb2Npb3VzV2Vic29ja2V0Q2hhbm5lbCB7XG4gIC8qKlxuICAgKiBBYmlsaXR5LlxuICAgKiBAdHlwZSB7aW1wb3J0KFwiLi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCBudWxsfSAqL1xuICBfYWJpbGl0eSA9IG51bGxcblxuICAvKipcbiAgICogUnVucyBjYW4gc3Vic2NyaWJlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0aGUgZnJvbnRlbmQtbW9kZWwgc3Vic2NyaXB0aW9uIGlzIGF1dGhvcml6ZWQuXG4gICAqL1xuICBhc3luYyBjYW5TdWJzY3JpYmUoKSB7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gdGhpcy5fbW9kZWxOYW1lKClcblxuICAgIGlmICghbW9kZWxOYW1lKSByZXR1cm4gZmFsc2VcbiAgICB0aGlzLl9ldmVudEZpbHRlcnMoKVxuXG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuc2Vzc2lvbi5jb25maWd1cmF0aW9uXG4gICAgY29uc3QgTW9kZWxDbGFzcyA9IHRoaXMuX21vZGVsQ2xhc3MobW9kZWxOYW1lKVxuXG4gICAgaWYgKCFNb2RlbENsYXNzKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IHJlcXVlc3QgPSAvKiogQHR5cGUge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9ICovICh0aGlzLl9zeW50aGV0aWNSZXF1ZXN0KCkpXG4gICAgY29uc3QgYWJpbGl0eSA9IGF3YWl0IGNvbmZpZ3VyYXRpb24ucmVzb2x2ZUFiaWxpdHkoe1xuICAgICAgLy8gRm9yd2FyZCB0aGUgc3Vic2NyaWJlcidzIHBhcmFtcyAoZS5nLiBhdXRoZW50aWNhdGlvblRva2VuKSBzbyB0b2tlbi1hdXRoZW50aWNhdGVkIGNsaWVudHNcbiAgICAgIC8vIHJlc29sdmUgdGhlIHNhbWUgYWJpbGl0eSB0aGV5IHdvdWxkIG92ZXIgSFRUUC4gV2l0aG91dCB0aGlzIG9ubHkgc2Vzc2lvbi9jb29raWUgYXV0aCBvbiB0aGVcbiAgICAgIC8vIHVwZ3JhZGUgcmVxdWVzdCB3b3JrcywgYW5kIHBhcmFtLWJhc2VkIGF1dGggKGxpa2UgYSBzY2FubmVyIHBhc3NpbmcgYW4gYXV0aGVudGljYXRpb25Ub2tlbilcbiAgICAgIC8vIGlzIGRyb3BwZWQg4oCUIGxlYXZpbmcgc3VjaCBzdWJzY3JpYmVycyB3aXRoIGEgZ3Vlc3QgYWJpbGl0eSBhbmQgbm8gcmVhZCBydWxlLlxuICAgICAgcGFyYW1zOiB7Li4udGhpcy5wYXJhbXMsIG1vZGVsOiBtb2RlbE5hbWV9LFxuICAgICAgcmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlOiBuZXcgUmVzcG9uc2Uoe2NvbmZpZ3VyYXRpb259KVxuICAgIH0pXG5cbiAgICBpZiAoIWFiaWxpdHkpIHJldHVybiBmYWxzZVxuICAgIHRoaXMuX2FiaWxpdHkgPSBhYmlsaXR5XG5cbiAgICAvLyBMb2FkIHJlc291cmNlLWRlY2xhcmVkIHJ1bGVzIGZvciB0aGlzIG1vZGVsIGNsYXNzIGJlZm9yZSBjaGVja2luZyxcbiAgICAvLyBvdGhlcndpc2UgYHJ1bGVzRm9yYCByZXR1cm5zIGVtcHR5IGZvciBhYmlsaXRpZXMgd2hvc2UgcmVzb3VyY2VzXG4gICAgLy8gcmVnaXN0ZXIgcnVsZXMgbGF6aWx5IHZpYSBgYWJpbGl0aWVzKClgLlxuICAgIGFiaWxpdHkubG9hZEFiaWxpdGllc0Zvck1vZGVsQ2xhc3MoTW9kZWxDbGFzcylcblxuICAgIGNvbnN0IHJlYWRSdWxlcyA9IGFiaWxpdHkucnVsZXNGb3Ioe2FjdGlvbjogXCJyZWFkXCIsIG1vZGVsQ2xhc3M6IE1vZGVsQ2xhc3N9KVxuXG4gICAgcmV0dXJuIHJlYWRSdWxlcy5zb21lKCgvKiogQHR5cGUge3tlZmZlY3Q6IHN0cmluZ319ICovIHJ1bGUpID0+IHJ1bGUuZWZmZWN0ID09PSBcImFsbG93XCIpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBzdWJzY3JpcHRpb24gbmFtZSB0aHJvdWdoIGZyb250ZW5kIHJlc291cmNlcyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIGEgYmFja2luZyBtb2RlbCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lIC0gRnJvbnRlbmQgcmVzb3VyY2UgbmFtZS5cbiAgICogQHJldHVybnMge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gLSBCYWNraW5nIG1vZGVsIGNsYXNzLlxuICAgKi9cbiAgX21vZGVsQ2xhc3MobW9kZWxOYW1lKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuc2Vzc2lvbi5jb25maWd1cmF0aW9uXG5cbiAgICBmb3IgKGNvbnN0IGJhY2tlbmRQcm9qZWN0IG9mIGNvbmZpZ3VyYXRpb24uZ2V0QmFja2VuZFByb2plY3RzKCkpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlRGVmaW5pdGlvbiA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZXNXaXRoQnVpbHRJbnNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdClbbW9kZWxOYW1lXVxuICAgICAgY29uc3QgcmVzb3VyY2VDbGFzcyA9IHJlc291cmNlRGVmaW5pdGlvbiA/IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzRnJvbURlZmluaXRpb24ocmVzb3VyY2VEZWZpbml0aW9uKSA6IG51bGxcblxuICAgICAgaWYgKHJlc291cmNlQ2xhc3M/Lk1vZGVsQ2xhc3MpIHJldHVybiByZXNvdXJjZUNsYXNzLm1vZGVsQ2xhc3MoKVxuICAgIH1cblxuICAgIHJldHVybiBjb25maWd1cmF0aW9uLmdldE1vZGVsQ2xhc3NlcygpW21vZGVsTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRlbGl2ZXIgYnJvYWRjYXN0LlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxMaWZlY3ljbGVCcm9hZGNhc3RCb2R5fSBib2R5IC0gQnJvYWRjYXN0IGJvZHkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIikuV2Vic29ja2V0QnJvYWRjYXN0TWV0YWRhdGF9IFttZXRhXSAtIE9wdGlvbmFsIHNlcnZlci1zaWRlIGJyb2FkY2FzdCBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIGFmdGVyIGRlbGl2ZXJ5LlxuICAgKi9cbiAgYXN5bmMgZGVsaXZlckJyb2FkY2FzdChib2R5LCBtZXRhKSB7XG4gICAgYXdhaXQgdGhpcy5fZGVsaXZlckJyb2FkY2FzdChib2R5LCBtZXRhKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGVsaXZlciBicm9hZGNhc3QuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbExpZmVjeWNsZUJyb2FkY2FzdEJvZHl9IGJvZHkgLSBCcm9hZGNhc3QgYm9keS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5XZWJzb2NrZXRCcm9hZGNhc3RNZXRhZGF0YX0gW21ldGFdIC0gT3B0aW9uYWwgc2VydmVyLXNpZGUgYnJvYWRjYXN0IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgZGVsaXZlcnkuXG4gICAqL1xuICBhc3luYyBfZGVsaXZlckJyb2FkY2FzdChib2R5LCBtZXRhKSB7XG4gICAgY29uc3QgaGFzRXZlbnRGaWx0ZXJzID0gdGhpcy5faGFzRXZlbnRGaWx0ZXJQYXJhbXMoKVxuXG4gICAgaWYgKCFib2R5IHx8IHR5cGVvZiBib2R5ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAoIWhhc0V2ZW50RmlsdGVycyB8fCB0aGlzLl9oYXNVbmZpbHRlcmVkRXZlbnREZWxpdmVyeSgpKSB0aGlzLnNlbmRNZXNzYWdlKGJvZHksIG1ldGEpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGJvZHkubW9kZWwgPT09IFwic3RyaW5nXCIgJiYgYm9keS5tb2RlbCAhPT0gdGhpcy5fbW9kZWxOYW1lKCkpIHJldHVyblxuXG4gICAgaWYgKGJvZHkuYWN0aW9uID09PSBcImRlc3Ryb3lcIikge1xuICAgICAgaWYgKGJvZHkuaWQgPT09IHVuZGVmaW5lZCB8fCBib2R5LmlkID09PSBudWxsKSByZXR1cm5cblxuICAgICAgY29uc3QgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIgPSBhd2FpdCB0aGlzLl9mcm9udGVuZE1vZGVsQ29udHJvbGxlckNsYXNzKClcbiAgICAgIGNvbnN0IGF1dGhvcml6ZWQgPSBhd2FpdCB0aGlzLl9kZXN0cm95RXZlbnRJc0F1dGhvcml6ZWQoXG4gICAgICAgIGJvZHksXG4gICAgICAgIEZyb250ZW5kTW9kZWxDb250cm9sbGVyLFxuICAgICAgICBtZXRhPy5icm9hZGNhc3RQYXJhbXM/LmRlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkXG4gICAgICApXG5cbiAgICAgIGlmICghYXV0aG9yaXplZCkgcmV0dXJuXG5cbiAgICAgIGlmICghaGFzRXZlbnRGaWx0ZXJzIHx8IHRoaXMuX2hhc0Rlc3Ryb3lFdmVudERlbGl2ZXJ5KCkgfHwgdGhpcy5faGFzVW5maWx0ZXJlZEV2ZW50RGVsaXZlcnkoKSkge1xuICAgICAgICB0aGlzLnNlbmRNZXNzYWdlKHtcbiAgICAgICAgICBhY3Rpb246IGJvZHkuYWN0aW9uLFxuICAgICAgICAgIGlkOiBib2R5LmlkLFxuICAgICAgICAgIC4uLih0eXBlb2YgYm9keS5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IHttb2RlbDogYm9keS5tb2RlbH0gOiB7fSlcbiAgICAgICAgfSwgbWV0YSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChib2R5LmlkID09PSB1bmRlZmluZWQgfHwgYm9keS5pZCA9PT0gbnVsbCkge1xuICAgICAgaWYgKCFoYXNFdmVudEZpbHRlcnMgfHwgdGhpcy5faGFzVW5maWx0ZXJlZEV2ZW50RGVsaXZlcnkoKSkgdGhpcy5zZW5kTWVzc2FnZShib2R5LCBtZXRhKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIgPSBhd2FpdCB0aGlzLl9mcm9udGVuZE1vZGVsQ29udHJvbGxlckNsYXNzKClcbiAgICBjb25zdCBtYXRjaGVkRXZlbnRGaWx0ZXJLZXlzID0gaGFzRXZlbnRGaWx0ZXJzXG4gICAgICA/IGF3YWl0IHRoaXMuX21hdGNoZWRFdmVudEZpbHRlcktleXNGb3JFdmVudElkKGJvZHkuaWQsIEZyb250ZW5kTW9kZWxDb250cm9sbGVyKVxuICAgICAgOiBbXVxuICAgIGNvbnN0IGlzSWRlbnRpdHlUcmFuc2l0aW9uID0gYm9keS5hY3Rpb24gPT09IFwidXBkYXRlXCIgJiYgYm9keS5wcmV2aW91c0lkICE9PSB1bmRlZmluZWQgJiYgYm9keS5wcmV2aW91c0lkICE9PSBudWxsXG5cbiAgICBpZiAoaGFzRXZlbnRGaWx0ZXJzICYmIG1hdGNoZWRFdmVudEZpbHRlcktleXMubGVuZ3RoID09PSAwICYmICF0aGlzLl9oYXNVbmZpbHRlcmVkRXZlbnREZWxpdmVyeSgpICYmICFpc0lkZW50aXR5VHJhbnNpdGlvbikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdGVkUmVjb3JkID0gYXdhaXQgdGhpcy5fcHJvamVjdGVkUmVjb3JkRm9yRXZlbnRJZChib2R5LmlkLCBGcm9udGVuZE1vZGVsQ29udHJvbGxlcilcblxuICAgIGlmICghcHJvamVjdGVkUmVjb3JkKSB7XG4gICAgICBpZiAoaXNJZGVudGl0eVRyYW5zaXRpb24pIHtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZSh7XG4gICAgICAgICAgYWN0aW9uOiBib2R5LmFjdGlvbixcbiAgICAgICAgICBpZDogYm9keS5pZCxcbiAgICAgICAgICAuLi4oaGFzRXZlbnRGaWx0ZXJzID8ge21hdGNoZWRFdmVudEZpbHRlcktleXN9IDoge30pLFxuICAgICAgICAgIC4uLih0eXBlb2YgYm9keS5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IHttb2RlbDogYm9keS5tb2RlbH0gOiB7fSksXG4gICAgICAgICAgcHJldmlvdXNJZDogYm9keS5wcmV2aW91c0lkXG4gICAgICAgIH0sIG1ldGEpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5zZXNzaW9uLmNvbmZpZ3VyYXRpb25cblxuICAgIGlmICghY29uZmlndXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgbW9kZWwgd2Vic29ja2V0IGNoYW5uZWwgaGFzIG5vIGNvbmZpZ3VyYXRpb24gZm9yIHRyYW5zcG9ydCBzZXJpYWxpemF0aW9uXCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsaXZlciBib2R5LlxuICAgICAqIEB0eXBlIHtGcm9udGVuZE1vZGVsTGlmZWN5Y2xlQnJvYWRjYXN0Qm9keX0gKi9cbiAgICBsZXQgZGVsaXZlckJvZHkgPSB7XG4gICAgICAuLi5ib2R5LFxuICAgICAgcmVjb3JkOiAvKiogQHR5cGUge2ltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlfSAqLyAoc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKHByb2plY3RlZFJlY29yZCwgdHJhbnNwb3J0U2VyaWFsaXphdGlvbk9wdGlvbnNGb3JDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pKSlcbiAgICB9XG5cbiAgICBpZiAoaGFzRXZlbnRGaWx0ZXJzKSB7XG4gICAgICBkZWxpdmVyQm9keSA9IHtcbiAgICAgICAgLi4uZGVsaXZlckJvZHksXG4gICAgICAgIG1hdGNoZWRFdmVudEZpbHRlcktleXNcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlbmRNZXNzYWdlKGRlbGl2ZXJCb2R5LCBtZXRhKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVpcmVzIGEgcmVzeW5jIGZvciByZWxldmFudCBkZXN0cm95IGV2ZW50cyBiZWNhdXNlIHRoZWlyIGF1dGhvcml6YXRpb25cbiAgICogc25hcHNob3RzIGFyZSBpbnRlbnRpb25hbGx5IGV4Y2x1ZGVkIGZyb20gdGhlIHBlcnNpc3RlZCByZXBsYXkgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5XZWJzb2NrZXRKc29uVmFsdWV9IGJvZHkgLSBQZXJzaXN0ZWQgYnJvYWRjYXN0IHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgcmVwbGF5IGNhbm5vdCBzYWZlbHkgYXV0aG9yaXplIHRoaXMgZXZlbnQuXG4gICAqL1xuICBfcmVxdWlyZXNSZXBsYXlHYXAoYm9keSkge1xuICAgIGlmICghYm9keSB8fCB0eXBlb2YgYm9keSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGJvZHkpKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoIShcImFjdGlvblwiIGluIGJvZHkpIHx8IGJvZHkuYWN0aW9uICE9PSBcImRlc3Ryb3lcIikgcmV0dXJuIGZhbHNlXG4gICAgaWYgKCEoXCJpZFwiIGluIGJvZHkpIHx8IGJvZHkuaWQgPT09IHVuZGVmaW5lZCB8fCBib2R5LmlkID09PSBudWxsKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiAhKFwibW9kZWxcIiBpbiBib2R5KSB8fCB0eXBlb2YgYm9keS5tb2RlbCAhPT0gXCJzdHJpbmdcIiB8fCBib2R5Lm1vZGVsID09PSB0aGlzLl9tb2RlbE5hbWUoKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBhIGRlc3Ryb3kgYWdhaW5zdCB0aGUgc3Vic2NyaWJlcidzIG9yZGluYXJ5IGF1dGhvcml6ZWQgcXVlcnkgYnlcbiAgICogcmVwbGFjaW5nIHRoZSBkZWxldGVkIGJhY2tpbmcgdGFibGUgd2l0aCB0aGUgY2FwdHVyZWQgcHJlLWRlbGV0ZSByb3cuIFZhbHVlc1xuICAgKiBhcmUgcXVvdGVkIG9uIHRoaXMgdHJ1c3RlZCBkYXRhYmFzZSBjb25uZWN0aW9uOyBubyBicm9hZGNhc3QtcHJvdmlkZWQgU1FMIGlzIHJ1bi5cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsTGlmZWN5Y2xlQnJvYWRjYXN0Qm9keX0gYm9keSAtIERlc3Ryb3kgYnJvYWRjYXN0IGJvZHkuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLWNvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIgLSBTZXJ2ZXItc2lkZSBmcm9udGVuZC1tb2RlbCBjb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlIHwgdW5kZWZpbmVkfSBkZXN0cm95QXV0aG9yaXphdGlvblJlY29yZCAtIFNlcnZlci1vbmx5IHByZS1kZWxldGUgcmVjb3JkIGZyb20gbGl2ZSBicm9hZGNhc3QgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFdoZXRoZXIgdGhlIHN1YnNjcmliZXIgY291bGQgcmVhZCB0aGUgcmVjb3JkIGJlZm9yZSBkZWxldGlvbi5cbiAgICovXG4gIGFzeW5jIF9kZXN0cm95RXZlbnRJc0F1dGhvcml6ZWQoYm9keSwgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIsIGRlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkKSB7XG4gICAgY29uc3QgaWQgPSBib2R5LmlkXG5cbiAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCB8fCBpZCA9PT0gbnVsbCB8fCAhaXNEZXN0cm95QXV0aG9yaXphdGlvblJlY29yZChkZXN0cm95QXV0aG9yaXphdGlvblJlY29yZCkpIHJldHVybiBmYWxzZVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhFdmVudFRlbmFudChpZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuX2Zyb250ZW5kTW9kZWxDb250cm9sbGVyKEZyb250ZW5kTW9kZWxDb250cm9sbGVyKVxuXG4gICAgICBhd2FpdCBjb250cm9sbGVyLmVuc3VyZUZyb250ZW5kTW9kZWxDbGFzc0luaXRpYWxpemVkKClcblxuICAgICAgY29uc3QgTW9kZWxDbGFzcyA9IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbENsYXNzKClcbiAgICAgIGNvbnN0IHByaW1hcnlLZXkgPSBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxQcmltYXJ5S2V5KClcbiAgICAgIGNvbnN0IHJ1bGVRdWVyeUZhY3RvcnkgPSAoKSA9PiB0aGlzLl9kZXN0cm95QXV0aG9yaXphdGlvblF1ZXJ5KE1vZGVsQ2xhc3MsIGRlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkKVxuICAgICAgY29uc3QgcXVlcnkgPSBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxBdXRob3JpemVkUXVlcnkoXCJmaW5kXCIsIHtydWxlUXVlcnlGYWN0b3J5fSlcblxuICAgICAgdGhpcy5fYXBwbHlEZXN0cm95QXV0aG9yaXphdGlvblJlY29yZFRvUXVlcnkocXVlcnksIE1vZGVsQ2xhc3MsIGRlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkKVxuICAgICAgcXVlcnkud2hlcmUoe1xuICAgICAgICBbTW9kZWxDbGFzcy50YWJsZU5hbWUoKV06IGZyb250ZW5kTW9kZWxQcmltYXJ5S2V5RGF0YWJhc2VDb25kaXRpb25zKE1vZGVsQ2xhc3MsIHByaW1hcnlLZXksIGlkKVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIEJvb2xlYW4oYXdhaXQgcXVlcnkuZmlyc3QoKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIGJhY2tpbmctbW9kZWwgcXVlcnkgd2hvc2Ugc291cmNlIGlzIHRoZSBjYXB0dXJlZCBwcmUtZGVsZXRlIHJvdy5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IE1vZGVsQ2xhc3MgLSBCYWNraW5nIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge0Rlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkfSBkZXN0cm95QXV0aG9yaXphdGlvblJlY29yZCAtIENhcHR1cmVkIHByZS1kZWxldGUgcmVjb3JkLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQ+fSAtIE9uZS1yb3cgbW9kZWwgcXVlcnkuXG4gICAqL1xuICBfZGVzdHJveUF1dGhvcml6YXRpb25RdWVyeShNb2RlbENsYXNzLCBkZXN0cm95QXV0aG9yaXphdGlvblJlY29yZCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gTW9kZWxDbGFzcy5fbmV3UXVlcnkoKVxuXG4gICAgdGhpcy5fYXBwbHlEZXN0cm95QXV0aG9yaXphdGlvblJlY29yZFRvUXVlcnkocXVlcnksIE1vZGVsQ2xhc3MsIGRlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkKVxuXG4gICAgcmV0dXJuIHF1ZXJ5XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgYSBxdWVyeSdzIGJhY2tpbmcgdGFibGUgd2l0aCBhIHNhZmVseSBxdW90ZWQgb25lLXJvdyBkZXJpdmVkIHRhYmxlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gcXVlcnkgLSBRdWVyeSB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBNb2RlbENsYXNzIC0gQmFja2luZyBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtEZXN0cm95QXV0aG9yaXphdGlvblJlY29yZH0gZGVzdHJveUF1dGhvcml6YXRpb25SZWNvcmQgLSBDYXB0dXJlZCBwcmUtZGVsZXRlIHJlY29yZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfYXBwbHlEZXN0cm95QXV0aG9yaXphdGlvblJlY29yZFRvUXVlcnkocXVlcnksIE1vZGVsQ2xhc3MsIGRlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gT2JqZWN0LmVudHJpZXMoZGVzdHJveUF1dGhvcml6YXRpb25SZWNvcmQpLm1hcCgoW2NvbHVtbk5hbWUsIHNlcmlhbGl6ZWRWYWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gaXNEZXN0cm95QXV0aG9yaXphdGlvbkJpbmFyeShzZXJpYWxpemVkVmFsdWUpXG4gICAgICAgID8gQnVmZmVyLmZyb20oc2VyaWFsaXplZFZhbHVlLnZhbHVlKVxuICAgICAgICA6IGRlc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlKHNlcmlhbGl6ZWRWYWx1ZSlcbiAgICAgIGNvbnN0IGNvbHVtbiA9IE1vZGVsQ2xhc3MuZ2V0Q29sdW1uc0hhc2goKVtjb2x1bW5OYW1lXVxuXG4gICAgICBpZiAoIWNvbHVtbikgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgYXV0aG9yaXplIGEgZGVzdHJveWVkICR7TW9kZWxDbGFzcy5uYW1lfSB3aXRoIHVua25vd24gY29sdW1uICR7Y29sdW1uTmFtZX1gKVxuICAgICAgY29uc3QgcXVvdGVkVmFsdWUgPSBxdWVyeS5kcml2ZXIuZ2V0VHlwZSgpID09IFwicGdzcWxcIiAmJiBjb2x1bW4uZ2V0VHlwZSgpID09PSBcIkFSUkFZXCIgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgPyBwZ3NxbEFycmF5VmFsdWVTcWwocXVlcnkuZHJpdmVyLCB2YWx1ZSlcbiAgICAgICAgOiB2YWx1ZSA9PT0gbnVsbCA/IFwiTlVMTFwiIDogcXVlcnkuZHJpdmVyLnF1b3RlKHZhbHVlKVxuXG4gICAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gcXVlcnkuZHJpdmVyLmdldFR5cGUoKSA9PSBcInBnc3FsXCJcbiAgICAgICAgPyBgQ0FTVCgke3F1b3RlZFZhbHVlfSBBUyAke2NvbHVtbi5nZXREYXRhYmFzZVR5cGUoKX0pYFxuICAgICAgICA6IHF1b3RlZFZhbHVlXG5cbiAgICAgIHJldHVybiBgJHtzZWxlY3RlZFZhbHVlfSBBUyAke3F1ZXJ5LmRyaXZlci5xdW90ZUNvbHVtbihjb2x1bW5OYW1lKX1gXG4gICAgfSlcblxuICAgIGlmIChzZWxlY3RlZENvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBhdXRob3JpemUgYSBkZXN0cm95ZWQgJHtNb2RlbENsYXNzLm5hbWV9IHdpdGhvdXQgY2FwdHVyZWQgYXR0cmlidXRlc2ApXG4gICAgfVxuXG4gICAgY29uc3QgZnJvbXMgPSBxdWVyeS5nZXRGcm9tcygpXG5cbiAgICBmcm9tcy5zcGxpY2UoMCwgZnJvbXMubGVuZ3RoKVxuICAgIHF1ZXJ5LmZyb20oYChTRUxFQ1QgJHtzZWxlY3RlZENvbHVtbnMuam9pbihcIiwgXCIpfSkgQVMgJHtxdWVyeS5kcml2ZXIucXVvdGVUYWJsZShNb2RlbENsYXNzLnRhYmxlTmFtZSgpKX1gKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWF0Y2hlcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT59IGJyb2FkY2FzdFBhcmFtcyAtIFBhcmFtcyBmcm9tIGBicm9hZGNhc3RUb0NoYW5uZWxgLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgYnJvYWRjYXN0IG1hdGNoZXMgdGhpcyBzdWJzY3JpYmVyJ3MgbW9kZWwuXG4gICAqL1xuICBtYXRjaGVzKGJyb2FkY2FzdFBhcmFtcykge1xuICAgIHJldHVybiBicm9hZGNhc3RQYXJhbXM/Lm1vZGVsID09PSB0aGlzLl9tb2RlbE5hbWUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGVidWcgc25hcHNob3QuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IERlYnVnLXNhZmUgc3Vic2NyaXB0aW9uIGRldGFpbHMuXG4gICAqL1xuICBkZWJ1Z1NuYXBzaG90KCkge1xuICAgIGNvbnN0IGV2ZW50RmlsdGVycyA9IHRoaXMuX2V2ZW50RmlsdGVycygpXG5cbiAgICByZXR1cm4ge1xuICAgICAgYWJpbGl0aWVzOiB0aGlzLnBhcmFtcy5hYmlsaXRpZXMgIT09IHVuZGVmaW5lZCxcbiAgICAgIGV2ZW50RmlsdGVyQ291bnQ6IGV2ZW50RmlsdGVycy5sZW5ndGgsXG4gICAgICBkZXN0cm95RXZlbnREZWxpdmVyeTogdGhpcy5wYXJhbXMuZGVzdHJveUV2ZW50RGVsaXZlcnkgPT09IHRydWUsXG4gICAgICBtb2RlbDogdGhpcy5fbW9kZWxOYW1lKCksXG4gICAgICBwcmVsb2FkOiB0aGlzLnBhcmFtcy5wcmVsb2FkICE9PSB1bmRlZmluZWQsXG4gICAgICBxdWVyeURhdGE6IHRoaXMucGFyYW1zLnF1ZXJ5RGF0YSAhPT0gdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0OiB0aGlzLnBhcmFtcy5zZWxlY3QgIT09IHVuZGVmaW5lZCxcbiAgICAgIHNlbGVjdHNFeHRyYTogdGhpcy5wYXJhbXMuc2VsZWN0c0V4dHJhICE9PSB1bmRlZmluZWQsXG4gICAgICB1bmZpbHRlcmVkRXZlbnREZWxpdmVyeTogdGhpcy5wYXJhbXMudW5maWx0ZXJlZEV2ZW50RGVsaXZlcnkgPT09IHRydWUsXG4gICAgICB3aXRoQ291bnQ6IHRoaXMucGFyYW1zLndpdGhDb3VudCAhPT0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbW9kZWwgbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gUmVxdWVzdGVkIGZyb250ZW5kLW1vZGVsIG5hbWUgb3IgbnVsbC5cbiAgICovXG4gIF9tb2RlbE5hbWUoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLnBhcmFtcz8ubW9kZWwgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5wYXJhbXMubW9kZWwubGVuZ3RoID4gMFxuICAgICAgPyB0aGlzLnBhcmFtcy5tb2RlbFxuICAgICAgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYXMgZXZlbnQgZmlsdGVyIHBhcmFtcy5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGlzIHN1YnNjcmlwdGlvbiByZXF1ZXN0ZWQgZXZlbnQgcXVlcnkgZmlsdGVycy5cbiAgICovXG4gIF9oYXNFdmVudEZpbHRlclBhcmFtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRGaWx0ZXJzKCkubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaGFzIHVuZmlsdGVyZWQgZXZlbnQgZGVsaXZlcnkuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdW5maWx0ZXJlZCBjYWxsYmFja3Mgc2hvdWxkIHJlY2VpdmUgZXZlcnkgZXZlbnQuXG4gICAqL1xuICBfaGFzVW5maWx0ZXJlZEV2ZW50RGVsaXZlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zLnVuZmlsdGVyZWRFdmVudERlbGl2ZXJ5ID09PSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYXMgZGVzdHJveSBldmVudCBkZWxpdmVyeS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBpZC1vbmx5IGRlc3Ryb3kgZXZlbnRzIHNob3VsZCBiZSBkZWxpdmVyZWQgd2l0aCBldmVudCBmaWx0ZXJzLlxuICAgKi9cbiAgX2hhc0Rlc3Ryb3lFdmVudERlbGl2ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy5kZXN0cm95RXZlbnREZWxpdmVyeSA9PT0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZXZlbnQgZmlsdGVycy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbEV2ZW50RmlsdGVyUGF5bG9hZEVudHJ5W119IC0gVmFsaWQgZXZlbnQgZmlsdGVycy5cbiAgICovXG4gIF9ldmVudEZpbHRlcnMoKSB7XG4gICAgaWYgKHRoaXMucGFyYW1zLmV2ZW50RmlsdGVycyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW11cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5wYXJhbXMuZXZlbnRGaWx0ZXJzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgbW9kZWwgZXZlbnRGaWx0ZXJzIG11c3QgYmUgYW4gYXJyYXlcIilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJhbXMuZXZlbnRGaWx0ZXJzLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIGlmICghZW50cnkgfHwgdHlwZW9mIGVudHJ5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoZW50cnkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZyb250ZW5kIG1vZGVsIGV2ZW50RmlsdGVycyBlbnRyaWVzIG11c3QgYmUgb2JqZWN0c1wiKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBldmVudEZpbHRlciA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAoZW50cnkpXG4gICAgICBjb25zdCB1bmtub3duS2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50RmlsdGVyKS5maWx0ZXIoKGtleSkgPT4gIUVWRU5UX0ZJTFRFUl9LRVlTLmhhcyhrZXkpKVxuXG4gICAgICBpZiAodW5rbm93bktleXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZyb250ZW5kIG1vZGVsIGV2ZW50RmlsdGVycyBlbnRyaWVzIGNhbm5vdCBpbmNsdWRlICR7dW5rbm93bktleXMuam9pbihcIiwgXCIpfWApXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZXZlbnRGaWx0ZXIua2V5ICE9PSBcInN0cmluZ1wiIHx8IGV2ZW50RmlsdGVyLmtleS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgbW9kZWwgZXZlbnRGaWx0ZXJzIGVudHJpZXMgcmVxdWlyZSBhIGtleVwiKVxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFNhbml0aXplZCBldmVudCBmaWx0ZXIuXG4gICAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsRXZlbnRGaWx0ZXJQYXlsb2FkRW50cnl9ICovXG4gICAgICBjb25zdCBzYW5pdGl6ZWRFdmVudEZpbHRlciA9IHtrZXk6IGV2ZW50RmlsdGVyLmtleX1cblxuICAgICAgaWYgKGV2ZW50RmlsdGVyLmpvaW5zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2FuaXRpemVkRXZlbnRGaWx0ZXIuam9pbnMgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPn0gKi8gKGV2ZW50RmlsdGVyLmpvaW5zKVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRGaWx0ZXIuc2VhcmNoZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzYW5pdGl6ZWRFdmVudEZpbHRlci5zZWFyY2hlcyA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsU2VhcmNoW119ICovIChldmVudEZpbHRlci5zZWFyY2hlcylcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50RmlsdGVyLndoZXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2FuaXRpemVkRXZlbnRGaWx0ZXIud2hlcmUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPn0gKi8gKGV2ZW50RmlsdGVyLndoZXJlKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2FuaXRpemVkRXZlbnRGaWx0ZXJcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgY29udHJvbGxlciBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dHlwZW9mIGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLWNvbnRyb2xsZXIuanNcIikuZGVmYXVsdD59IC0gRnJvbnRlbmQgbW9kZWwgY29udHJvbGxlciBjbGFzcy5cbiAgICovXG4gIGFzeW5jIF9mcm9udGVuZE1vZGVsQ29udHJvbGxlckNsYXNzKCkge1xuICAgIGNvbnN0IGZyb250ZW5kTW9kZWxDb250cm9sbGVyUGF0aCA9IFwiLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiXG4gICAgY29uc3Qge2RlZmF1bHQ6IEZyb250ZW5kTW9kZWxDb250cm9sbGVyfSA9IGF3YWl0IGltcG9ydChmcm9udGVuZE1vZGVsQ29udHJvbGxlclBhdGgpXG5cbiAgICByZXR1cm4gRnJvbnRlbmRNb2RlbENvbnRyb2xsZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGZyb250ZW5kIG1vZGVsIGNvbnRyb2xsZXIuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLWNvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIgLSBTZXJ2ZXItc2lkZSBmcm9udGVuZC1tb2RlbCBjb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW3BhcmFtc10gLSBPcHRpb25hbCBwYXJhbXMgb3ZlcnJpZGUuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1jb250cm9sbGVyLmpzXCIpLmRlZmF1bHR9IC0gU3ludGhldGljIGNvbnRyb2xsZXIgdXNlZCBmb3IgcmVzb3VyY2Ugc2VyaWFsaXphdGlvbi5cbiAgICovXG4gIF9mcm9udGVuZE1vZGVsQ29udHJvbGxlcihGcm9udGVuZE1vZGVsQ29udHJvbGxlciwgcGFyYW1zID0ge30pIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5zZXNzaW9uLmNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEZyb250ZW5kTW9kZWxDb250cm9sbGVyKHtcbiAgICAgIGFjdGlvbjogXCJ3ZWJzb2NrZXRFdmVudFwiLFxuICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgIGNvbnRyb2xsZXI6IFwiZnJvbnRlbmQtbW9kZWxzXCIsXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgYWJpbGl0aWVzOiB0aGlzLnBhcmFtcy5hYmlsaXRpZXMsXG4gICAgICAgIGpvaW5zOiB0aGlzLnBhcmFtcy5qb2lucyxcbiAgICAgICAgbW9kZWw6IHRoaXMuX21vZGVsTmFtZSgpLFxuICAgICAgICBwcmVsb2FkOiB0aGlzLnBhcmFtcy5wcmVsb2FkLFxuICAgICAgICBxdWVyeURhdGE6IHRoaXMucGFyYW1zLnF1ZXJ5RGF0YSxcbiAgICAgICAgc2VhcmNoZXM6IHRoaXMucGFyYW1zLnNlYXJjaGVzLFxuICAgICAgICBzZWxlY3Q6IHRoaXMucGFyYW1zLnNlbGVjdCxcbiAgICAgICAgc2VsZWN0c0V4dHJhOiB0aGlzLnBhcmFtcy5zZWxlY3RzRXh0cmEsXG4gICAgICAgIHdoZXJlOiB0aGlzLnBhcmFtcy53aGVyZSxcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB3aXRoQ291bnQ6IHRoaXMucGFyYW1zLndpdGhDb3VudFxuICAgICAgfSxcbiAgICAgIHJlcXVlc3Q6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdH0gKi8gKHRoaXMuX3N5bnRoZXRpY1JlcXVlc3QoKSksXG4gICAgICByZXNwb25zZTogbmV3IFJlc3BvbnNlKHtjb25maWd1cmF0aW9ufSksXG4gICAgICB2aWV3UGF0aDogXCIvXCJcbiAgICB9KVxuXG4gICAgY29udHJvbGxlci5fZnJvbnRlbmRNb2RlbEFiaWxpdHlPdmVycmlkZSA9IHRoaXMuX2FiaWxpdHkgfHwgdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gY29udHJvbGxlclxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRlbmFudCBmb3IgZXZlbnQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vdXRpbHMvbW9kZWwtcHJpbWFyeS1rZXkuanNcIikuTW9kZWxQcmltYXJ5S2V5VmFsdWV9IGlkIC0gRXZlbnQgcmVjb3JkIGlkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gUmVzb2x2ZWQgdGVuYW50LlxuICAgKi9cbiAgYXN5bmMgX3Jlc29sdmVFdmVudFRlbmFudChpZCkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLnNlc3Npb24uY29uZmlndXJhdGlvblxuXG4gICAgcmV0dXJuIGF3YWl0IGNvbmZpZ3VyYXRpb24uZW5zdXJlQ29ubmVjdGlvbnMoe25hbWU6IFwiRnJvbnRlbmQgbW9kZWwgd2Vic29ja2V0IGV2ZW50IHRlbmFudCByZXNvbHV0aW9uXCJ9LCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBNaXJyb3IgdGhlIHN1YnNjcmliZS10aW1lIHRlbmFudCByZXNvbHV0aW9uIChgV2Vic29ja2V0U2Vzc2lvbi5fcmVzb2x2ZVRlbmFudGApOlxuICAgICAgLy8gcGFzcyBgc3Vic2NyaXB0aW9uOiB7Y2hhbm5lbCwgcGFyYW1zfWAgc28gcmVzb2x2ZXJzIHRoYXQgZGVyaXZlIHNjb3BlIGZyb20gdGhlXG4gICAgICAvLyBzdWJzY3JpcHRpb24gYmVoYXZlIHRoZSBzYW1lIGZvciBicm9hZGNhc3RzIGFzIHRoZXkgZGlkIGF0IGBjaGFubmVsLXN1YnNjcmliZWAuXG4gICAgICAvLyBUaGUgc3ludGhldGljIHJlcXVlc3QgZm9yd2FyZHMgdGhlIHN1YnNjcmliZXIncyBwYXJhbXMgKGUuZy4gYXV0aGVudGljYXRpb25Ub2tlbiksXG4gICAgICAvLyBtYXRjaGluZyB0aGlzIGNoYW5uZWwncyBhYmlsaXR5IHJlc29sdXRpb24gYWJvdmUuXG4gICAgICByZXR1cm4gYXdhaXQgY29uZmlndXJhdGlvbi5yZXNvbHZlVGVuYW50KHtcbiAgICAgICAgcGFyYW1zOiB7Li4udGhpcy5wYXJhbXMsIGlkLCBtb2RlbDogdGhpcy5fbW9kZWxOYW1lKCl9LFxuICAgICAgICByZXF1ZXN0OiAvKiogQHR5cGUge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHR9ICovICh0aGlzLl9zeW50aGV0aWNSZXF1ZXN0KCkpLFxuICAgICAgICByZXNwb25zZTogbmV3IFJlc3BvbnNlKHtjb25maWd1cmF0aW9ufSksXG4gICAgICAgIHN1YnNjcmlwdGlvbjoge2NoYW5uZWw6IEZST05URU5EX01PREVMU19DSEFOTkVMX05BTUUsIHBhcmFtczogdGhpcy5wYXJhbXN9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHN1YnNjcmliZXIncyB0ZW5hbnQgZm9yIHRoZSBicm9hZGNhc3QgcmVjb3JkIGFuZCBydW5zIGBjYWxsYmFja2AgaW5zaWRlIHRoYXQgdGVuYW50XG4gICAqIGNvbnRleHQuIEJyb2FkY2FzdCBkZWxpdmVyeSBydW5zIGluIHdoYXRldmVyIGFtYmllbnQgdGVuYW50IGNvbnRleHQgdGhlIHB1Ymxpc2hlciBsZWZ0IGJlaGluZC4gRm9yXG4gICAqIG11bHRpLXRlbmFudCByZWNvcmRzIHRoYXQgYW1iaWVudCB0ZW5hbnQgbWF5IGhhdmUgYmVlbiByZXNvbHZlZCB3aXRob3V0IHRoZSBzdWJzY3JpYmVyJ3MgcmVxdWVzdFxuICAgKiAoZS5nLiBhIHJlbGF5IGVuZHBvaW50IG9yIGJhY2tncm91bmQgam9iIG11dGF0aW5nIHRoZSByb3cpLCBzbyBpdCBsYWNrcyB0aGUgc3Vic2NyaWJlcidzIHBlci1yZWNvcmRcbiAgICogYWNjZXNzIGZsYWdzIGFuZCB0aGUgcGVyLWV2ZW50IGF1dGhvcml6YXRpb24gcXVlcnkgd3JvbmdseSBmaW5kcyBub3RoaW5nLiBSZS1yZXNvbHZpbmcgdGhlIHRlbmFudFxuICAgKiBmcm9tIHRoZSBldmVudCByZWNvcmQgaWQgcGx1cyB0aGUgc3Vic2NyaWJlcidzIHJlcXVlc3QgbWFrZXMgdGhlIGF1dGhvcml6YXRpb24gcXVlcmllcyBydW4gYWdhaW5zdFxuICAgKiB0aGUgc3Vic2NyaWJlcidzIG93biB0ZW5hbnQvYWJpbGl0eSBzY29wZS4gV2hlbiBubyB0ZW5hbnQgcmVzb2x2ZXMgKG5vbi1tdWx0aXRlbmFudCBjb25maWdzKSwgdGhlXG4gICAqIGNhbGxiYWNrIHJ1bnMgZGlyZWN0bHkgc28gdGhlIGFtYmllbnQgY29udGV4dCBpcyBwcmVzZXJ2ZWQuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vdXRpbHMvbW9kZWwtcHJpbWFyeS1rZXkuanNcIikuTW9kZWxQcmltYXJ5S2V5VmFsdWV9IGlkIC0gRXZlbnQgcmVjb3JkIGlkLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQXV0aG9yaXplZC1xdWVyeSBjYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8VD59IC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgX3dpdGhFdmVudFRlbmFudChpZCwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5zZXNzaW9uLmNvbmZpZ3VyYXRpb25cblxuICAgIGlmICghY29uZmlndXJhdGlvbiB8fCB0eXBlb2YgY29uZmlndXJhdGlvbi5yZXNvbHZlVGVuYW50ICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gICAgfVxuXG4gICAgY29uc3QgdGVuYW50ID0gYXdhaXQgdGhpcy5fcmVzb2x2ZUV2ZW50VGVuYW50KGlkKVxuXG4gICAgLy8gQWx3YXlzIGVudGVyIGBydW5XaXRoVGVuYW50YCwgZXZlbiB3aGVuIG5vIHRlbmFudCByZXNvbHZlZC4gQnJvYWRjYXN0IGZhbi1vdXRcbiAgICAvLyBydW5zIGluIHRoZSBwdWJsaXNoZXIncyBhbWJpZW50IHRlbmFudCBjb250ZXh0OyBmYWxsaW5nIGJhY2sgdG8gYGNhbGxiYWNrKClgXG4gICAgLy8gdGhlcmUgd291bGQgYXV0aG9yaXplIGEgY3Jvc3MtdGVuYW50IHJlY29yZCBhZ2FpbnN0IHRoZSBwdWJsaXNoZXIncyB0ZW5hbnQgYW5kXG4gICAgLy8gY291bGQgbGVhayBpdCB0byBhIHN1YnNjcmliZXIgd2hvc2Ugb3duIHJlc29sdmVyIGNvdWxkIG5vdCByZXNvbHZlIGl0LlxuICAgIHJldHVybiBhd2FpdCBjb25maWd1cmF0aW9uLnJ1bldpdGhUZW5hbnQodGVuYW50LCBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogXCJGcm9udGVuZCBtb2RlbCB3ZWJzb2NrZXQgZXZlbnQgdGVuYW50XCJ9LCBjYWxsYmFjaylcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWF0Y2hlZCBldmVudCBmaWx0ZXIga2V5cyBmb3IgZXZlbnQgaWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vdXRpbHMvbW9kZWwtcHJpbWFyeS1rZXkuanNcIikuTW9kZWxQcmltYXJ5S2V5VmFsdWV9IGlkIC0gRXZlbnQgcmVjb3JkIGlkLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1jb250cm9sbGVyLmpzXCIpLmRlZmF1bHR9IEZyb250ZW5kTW9kZWxDb250cm9sbGVyIC0gU2VydmVyLXNpZGUgZnJvbnRlbmQtbW9kZWwgY29udHJvbGxlciBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIEV2ZW50IGZpbHRlciBrZXlzIG1hdGNoZWQgYnkgdGhlIHJlY29yZC5cbiAgICovXG4gIGFzeW5jIF9tYXRjaGVkRXZlbnRGaWx0ZXJLZXlzRm9yRXZlbnRJZChpZCwgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIpIHtcbiAgICAvKipcbiAgICAgKiBNYXRjaGVkIGV2ZW50IGZpbHRlciBrZXlzLlxuICAgICAqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCBtYXRjaGVkRXZlbnRGaWx0ZXJLZXlzID0gW11cblxuICAgIGZvciAoY29uc3QgZXZlbnRGaWx0ZXIgb2YgdGhpcy5fZXZlbnRGaWx0ZXJzKCkpIHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBhd2FpdCB0aGlzLl9ldmVudE1hdGNoZXNGaWx0ZXIoe1xuICAgICAgICBGcm9udGVuZE1vZGVsQ29udHJvbGxlcixcbiAgICAgICAgZXZlbnRGaWx0ZXIsXG4gICAgICAgIGlkXG4gICAgICB9KVxuXG4gICAgICBpZiAobWF0Y2hlcykgbWF0Y2hlZEV2ZW50RmlsdGVyS2V5cy5wdXNoKGV2ZW50RmlsdGVyLmtleSlcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2hlZEV2ZW50RmlsdGVyS2V5c1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZXZlbnQgbWF0Y2hlcyBmaWx0ZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRmlsdGVyIGFyZ3MuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLWNvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gYXJncy5Gcm9udGVuZE1vZGVsQ29udHJvbGxlciAtIFNlcnZlci1zaWRlIGZyb250ZW5kLW1vZGVsIGNvbnRyb2xsZXIgY2xhc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsRXZlbnRGaWx0ZXJQYXlsb2FkRW50cnl9IGFyZ3MuZXZlbnRGaWx0ZXIgLSBFdmVudCBmaWx0ZXIgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi91dGlscy9tb2RlbC1wcmltYXJ5LWtleS5qc1wiKS5Nb2RlbFByaW1hcnlLZXlWYWx1ZX0gYXJncy5pZCAtIEV2ZW50IHJlY29yZCBpZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgdGhlIHJlY29yZCBtYXRjaGVzIHRoZSBmaWx0ZXIuXG4gICAqL1xuICBhc3luYyBfZXZlbnRNYXRjaGVzRmlsdGVyKHtGcm9udGVuZE1vZGVsQ29udHJvbGxlciwgZXZlbnRGaWx0ZXIsIGlkfSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl93aXRoRXZlbnRUZW5hbnQoaWQsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLl9mcm9udGVuZE1vZGVsQ29udHJvbGxlcihGcm9udGVuZE1vZGVsQ29udHJvbGxlciwge1xuICAgICAgICBqb2luczogZXZlbnRGaWx0ZXIuam9pbnMsXG4gICAgICAgIHNlYXJjaGVzOiBldmVudEZpbHRlci5zZWFyY2hlcyxcbiAgICAgICAgd2hlcmU6IGV2ZW50RmlsdGVyLndoZXJlXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCBjb250cm9sbGVyLmVuc3VyZUZyb250ZW5kTW9kZWxDbGFzc0luaXRpYWxpemVkKClcblxuICAgICAgY29uc3QgTW9kZWxDbGFzcyA9IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbENsYXNzKClcbiAgICAgIGNvbnN0IHByaW1hcnlLZXkgPSBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxQcmltYXJ5S2V5KClcbiAgICAgIGNvbnN0IHdoZXJlID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsV2hlcmUoKVxuICAgICAgY29uc3Qgam9pbnMgPSBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxKb2lucygpXG4gICAgICAvLyBTdGFydCBmcm9tIHRoZSBzdWJzY3JpYmVyJ3MgYXV0aG9yaXplZCBzY29wZSBzbyBhIGZpbHRlciBjYW4gb25seSBldmVyIG1hdGNoIHJlY29yZHMgdGhlXG4gICAgICAvLyBzdWJzY3JpcHRpb24ncyBhYmlsaXR5IHBlcm1pdHMgdG8gcmVhZC5cbiAgICAgIGxldCBxdWVyeSA9IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbEF1dGhvcml6ZWRRdWVyeShcImZpbmRcIikud2hlcmUoe1xuICAgICAgICBbTW9kZWxDbGFzcy50YWJsZU5hbWUoKV06IGZyb250ZW5kTW9kZWxQcmltYXJ5S2V5RGF0YWJhc2VDb25kaXRpb25zKE1vZGVsQ2xhc3MsIHByaW1hcnlLZXksIGlkKVxuICAgICAgfSlcblxuICAgICAgaWYgKHdoZXJlKSBjb250cm9sbGVyLmFwcGx5RnJvbnRlbmRNb2RlbFdoZXJlKHtxdWVyeSwgd2hlcmV9KVxuICAgICAgaWYgKGpvaW5zKSBjb250cm9sbGVyLmFwcGx5RnJvbnRlbmRNb2RlbEpvaW5zKHtqb2lucywgcXVlcnl9KVxuXG4gICAgICBmb3IgKGNvbnN0IHNlYXJjaCBvZiBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxTZWFyY2hlcygpKSB7XG4gICAgICAgIGNvbnRyb2xsZXIuYXBwbHlGcm9udGVuZE1vZGVsU2VhcmNoKHtxdWVyeSwgc2VhcmNofSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIEJvb2xlYW4oYXdhaXQgcXVlcnkuZmlyc3QoKSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcHJvamVjdGVkIHJlY29yZCBmb3IgZXZlbnQgaWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vdXRpbHMvbW9kZWwtcHJpbWFyeS1rZXkuanNcIikuTW9kZWxQcmltYXJ5S2V5VmFsdWV9IGlkIC0gRXZlbnQgcmVjb3JkIGlkLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9mcm9udGVuZC1tb2RlbC1jb250cm9sbGVyLmpzXCIpLmRlZmF1bHR9IEZyb250ZW5kTW9kZWxDb250cm9sbGVyIC0gU2VydmVyLXNpZGUgZnJvbnRlbmQtbW9kZWwgY29udHJvbGxlciBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWU+IHwgbnVsbD59IC0gU2VyaWFsaXplZCBwcm9qZWN0ZWQgcmVjb3JkLlxuICAgKi9cbiAgYXN5bmMgX3Byb2plY3RlZFJlY29yZEZvckV2ZW50SWQoaWQsIEZyb250ZW5kTW9kZWxDb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhFdmVudFRlbmFudChpZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuX2Zyb250ZW5kTW9kZWxDb250cm9sbGVyKEZyb250ZW5kTW9kZWxDb250cm9sbGVyKVxuXG4gICAgICBhd2FpdCBjb250cm9sbGVyLmVuc3VyZUZyb250ZW5kTW9kZWxDbGFzc0luaXRpYWxpemVkKClcblxuICAgICAgY29uc3QgTW9kZWxDbGFzcyA9IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbENsYXNzKClcbiAgICAgIGNvbnN0IHByaW1hcnlLZXkgPSBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxQcmltYXJ5S2V5KClcbiAgICAgIC8vIFJlbG9hZCB0aHJvdWdoIHRoZSBzdWJzY3JpYmVyJ3MgYXV0aG9yaXplZCBzY29wZSBzbyBwcm9qZWN0ZWQgcmVjb3JkcyBhcmUgb25seSBldmVyIHNlbnQgZm9yXG4gICAgICAvLyByb3dzIHRoZSBzdWJzY3JpcHRpb24ncyBhYmlsaXR5IHBlcm1pdHMgdG8gcmVhZC5cbiAgICAgIGxldCBxdWVyeSA9IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbEF1dGhvcml6ZWRRdWVyeShcImZpbmRcIikud2hlcmUoe1xuICAgICAgICBbTW9kZWxDbGFzcy50YWJsZU5hbWUoKV06IGZyb250ZW5kTW9kZWxQcmltYXJ5S2V5RGF0YWJhc2VDb25kaXRpb25zKE1vZGVsQ2xhc3MsIHByaW1hcnlLZXksIGlkKVxuICAgICAgfSlcbiAgICAgIGNvbnN0IHByZWxvYWQgPSBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxQcmVsb2FkKClcblxuICAgICAgaWYgKHByZWxvYWQpIHF1ZXJ5ID0gcXVlcnkucHJlbG9hZChwcmVsb2FkKVxuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbFdpdGhDb3VudCgpKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjLlxuICAgICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHtyZWxhdGlvbnNoaXA/OiBzdHJpbmcsIHdoZXJlPzogUmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWU+fT59ICovXG4gICAgICAgIGNvbnN0IHNwZWMgPSB7fVxuXG4gICAgICAgIHNwZWNbZW50cnkuYXR0cmlidXRlTmFtZV0gPSB7XG4gICAgICAgICAgcmVsYXRpb25zaGlwOiBlbnRyeS5yZWxhdGlvbnNoaXBOYW1lLFxuICAgICAgICAgIHdoZXJlOiBlbnRyeS53aGVyZSA/IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWU+fSAqLyAoZW50cnkud2hlcmUpIDogdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgICAgcXVlcnkud2l0aENvdW50KHNwZWMpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHF1ZXJ5RGF0YSA9IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbFF1ZXJ5RGF0YSgpXG5cbiAgICAgIGlmIChxdWVyeURhdGEgIT09IG51bGwpIHF1ZXJ5LnF1ZXJ5RGF0YShxdWVyeURhdGEpXG5cbiAgICAgIHF1ZXJ5ID0gY29udHJvbGxlci5hcHBseUZyb250ZW5kTW9kZWxUcmFuc2xhdGVkQXR0cmlidXRlUHJlbG9hZHMoe3F1ZXJ5fSlcblxuICAgICAgY29uc3QgbW9kZWwgPSBhd2FpdCBxdWVyeS5maXJzdCgpXG5cbiAgICAgIGlmICghbW9kZWwpIHJldHVybiBudWxsXG5cbiAgICAgIGlmICh0aGlzLnBhcmFtcy5hYmlsaXRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhd2FpdCBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxDb21wdXRlQWJpbGl0aWVzKFttb2RlbF0pXG4gICAgICB9XG5cbiAgICAgIGNvbnRyb2xsZXIuX2Zyb250ZW5kTW9kZWxBYmlsaXR5T3ZlcnJpZGUgPSB1bmRlZmluZWRcblxuICAgICAgcmV0dXJuIGF3YWl0IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbFJlc291cmNlSW5zdGFuY2UoKS5zZXJpYWxpemUobW9kZWwsIFwiZmluZFwiKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogTWluaW1hbCBSZXF1ZXN0LWxpa2Ugc3R1YiB1c2VkIG9ubHkgZm9yIGFiaWxpdHkgcmVzb2x1dGlvbi4gQXZvaWRzXG4gICAqIGltcG9ydGluZyBgV2Vic29ja2V0UmVxdWVzdGAgaGVyZSBiZWNhdXNlIGl0cyBgbm9kZTpxdWVyeXN0cmluZ2BcbiAgICogZGVwZW5kZW5jeSB3b3VsZCBwdWxsIHNlcnZlci1vbmx5IGNvZGUgaW50byBicm93c2VyIGJ1bmRsZXMgdmlhXG4gICAqIHRoZSBgY29uZmlndXJhdGlvbiDihpIgbG9nZ2VyIOKGkiB3ZWJzb2NrZXQtcHVibGlzaGVyc2AgaW1wb3J0IGNoYWluLlxuICAgKiBIZWFkZXIgbmFtZXMgYXJlIG5vcm1hbGl6ZWQgdG8gbG93ZXJjYXNlIHNvIGBoZWFkZXIoXCJjb29raWVcIilgXG4gICAqIGZpbmRzIGEgdmFsdWUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB1cGdyYWRlLXJlcXVlc3QgaGVhZGVyc1xuICAgKiBtYXAgdXNlcyBgXCJDb29raWVcImAgb3IgYFwiY29va2llXCJgLiBTZXNzaW9uIG1ldGFkYXRhIHN0YXlzIHNlcGFyYXRlXG4gICAqIGZyb20gaGVhZGVycyBhbmQgaXMgZXhwb3NlZCB0aHJvdWdoIGBtZXRhZGF0YSguLi4pYCBmb3IgYWJpbGl0eVxuICAgKiByZXNvbHZlcnMgdGhhdCBuZWVkIHdlYnNvY2tldC1kZWxpdmVyZWQgc2Vzc2lvbiBkYXRhLlxuICAgKiBAcmV0dXJucyB7RnJvbnRlbmRNb2RlbFdlYnNvY2tldFN5bnRoZXRpY1JlcXVlc3R9IFJlcXVlc3QtbGlrZSBvYmplY3QgZm9yIGFiaWxpdHkgcmVzb2x1dGlvbi5cbiAgICovXG4gIF9zeW50aGV0aWNSZXF1ZXN0KCkge1xuICAgIGNvbnN0IHVwZ3JhZGVSZXF1ZXN0ID0gLyoqIEB0eXBlIHtGcm9udGVuZE1vZGVsV2Vic29ja2V0VXBncmFkZVJlcXVlc3R9ICovICh0aGlzLnNlc3Npb24udXBncmFkZVJlcXVlc3QpXG4gICAgY29uc3QgcmF3SGVhZGVycyA9IHR5cGVvZiB1cGdyYWRlUmVxdWVzdD8uaGVhZGVycyA9PT0gXCJmdW5jdGlvblwiID8gdXBncmFkZVJlcXVlc3QuaGVhZGVycygpIDoge31cbiAgICBjb25zdCBtZXRhZGF0YSA9IHR5cGVvZiB0aGlzLnNlc3Npb24uZ2V0TWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXMuc2Vzc2lvbi5nZXRNZXRhZGF0YSgpIDoge31cbiAgICBjb25zdCByZW1vdGVBZGRyZXNzID0gdHlwZW9mIHVwZ3JhZGVSZXF1ZXN0Py5yZW1vdGVBZGRyZXNzID09PSBcImZ1bmN0aW9uXCIgPyB1cGdyYWRlUmVxdWVzdC5yZW1vdGVBZGRyZXNzKCkgOiB1bmRlZmluZWRcbiAgICAvKipcbiAgICAgKiBIZWFkZXIgbWFwLlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZD59ICovXG4gICAgY29uc3QgaGVhZGVyTWFwID0ge31cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJhd0hlYWRlcnMgfHwge30pKSB7XG4gICAgICBoZWFkZXJNYXBba2V5LnRvTG93ZXJDYXNlKCldID0gcmF3SGVhZGVyc1trZXldXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWRlcnM6ICgpID0+IGhlYWRlck1hcCxcbiAgICAgIGhlYWRlcjogKG5hbWUpID0+IGhlYWRlck1hcFtTdHJpbmcobmFtZSkudG9Mb3dlckNhc2UoKV0sXG4gICAgICBtZXRhZGF0YTogKGtleSkgPT4ga2V5ID09PSB1bmRlZmluZWQgPyB7Li4ubWV0YWRhdGF9IDogbWV0YWRhdGFba2V5XSxcbiAgICAgIHBhdGg6ICgpID0+IFwiL2Zyb250ZW5kLW1vZGVsc1wiLFxuICAgICAgaHR0cE1ldGhvZDogKCkgPT4gXCJQT1NUXCIsXG4gICAgICByZW1vdGVBZGRyZXNzOiAoKSA9PiByZW1vdGVBZGRyZXNzLFxuICAgICAgb3JpZ2luOiAoKSA9PiBoZWFkZXJNYXAub3JpZ2luXG4gICAgfVxuICB9XG59XG4iXX0=
|
|
666
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNoYW5uZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZnJvbnRlbmQtbW9kZWxzL3dlYnNvY2tldC1jaGFubmVsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLHlCQUF5QixNQUFNLHFDQUFxQyxDQUFBO0FBQzNFLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDbEMsT0FBTyxRQUFRLE1BQU0sbUNBQW1DLENBQUE7QUFDeEQsT0FBTyxFQUFDLG1EQUFtRCxFQUFDLE1BQU0seUJBQXlCLENBQUE7QUFDM0YsT0FBTyxFQUFDLHdDQUF3QyxFQUFDLE1BQU0sMEJBQTBCLENBQUE7QUFDakYsT0FBTyxFQUFDLHNDQUFzQyxFQUFFLG9DQUFvQyxFQUFDLE1BQU0sOEJBQThCLENBQUE7QUFDekgsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sK0JBQStCLENBQUE7QUFFdkU7OztHQUdHO0FBQ0g7O0dBRUc7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtBQUV4RSxxRkFBcUY7QUFDckYsMkVBQTJFO0FBQzNFLE1BQU0sNEJBQTRCLEdBQUcsaUJBQWlCLENBQUE7QUFFdEQ7Ozs7R0FJRztBQUNILFNBQVMsNEJBQTRCLENBQUMsS0FBSztJQUN6QyxPQUFPLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0FBQzdFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyw0QkFBNEIsQ0FBQyxLQUFLO0lBQ3pDLE9BQU8sT0FBTyxDQUNaLEtBQUs7V0FDRixPQUFPLEtBQUssS0FBSyxRQUFR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QUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZELFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxHQUFHLFFBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQ3BFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxrQkFBa0I7WUFDOUIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU07WUFDeEIsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLGFBQWE7WUFDbEMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNO1NBQy9CLENBQUE7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IFZlbG9jaW91c1dlYnNvY2tldENoYW5uZWwgZnJvbSBcIi4uL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCJcbmltcG9ydCB7QnVmZmVyfSBmcm9tIFwibm9kZTpidWZmZXJcIlxuaW1wb3J0IFJlc3BvbnNlIGZyb20gXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVzcG9uc2UuanNcIlxuaW1wb3J0IHtmcm9udGVuZE1vZGVsUmVzb3VyY2VzV2l0aEJ1aWx0SW5zRm9yQmFja2VuZFByb2plY3R9IGZyb20gXCIuL2J1aWx0LWluLXJlc291cmNlcy5qc1wiXG5pbXBvcnQge2Zyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzRnJvbURlZmluaXRpb259IGZyb20gXCIuL3Jlc291cmNlLWRlZmluaXRpb24uanNcIlxuaW1wb3J0IHtkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZSwgc2VyaWFsaXplRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlfSBmcm9tIFwiLi90cmFuc3BvcnQtc2VyaWFsaXphdGlvbi5qc1wiXG5pbXBvcnQge21vZGVsUHJpbWFyeUtleUNvbmRpdGlvbnN9IGZyb20gXCIuLi91dGlscy9tb2RlbC1wcmltYXJ5LWtleS5qc1wiXG5cbi8qKlxuICogRGVmaW5lcyB0aGlzIHR5cGVkZWYuXG4gKiBAdHlwZWRlZiB7e2FjdGlvbj86IHN0cmluZywgaWQ/OiBpbXBvcnQoXCIuLi91dGlscy9tb2RlbC1wcmltYXJ5LWtleS5qc1wiKS5Nb2RlbFByaW1hcnlLZXlWYWx1ZSwgbWF0Y2hlZEV2ZW50RmlsdGVyS2V5cz86IHN0cmluZ1tdLCBwcmV2aW91c0lkPzogaW1wb3J0KFwiLi4vdXRpbHMvbW9kZWwtcHJpbWFyeS1rZXkuanNcIikuTW9kZWxQcmltYXJ5S2V5VmFsdWUsIHJlY29yZD86IGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlLCBba2V5OiBzdHJpbmddOiBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZSB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkfX0gRnJvbnRlbmRNb2RlbExpZmVjeWNsZUJyb2FkY2FzdEJvZHlcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWU+fSBEZXN0cm95QXV0aG9yaXphdGlvblJlY29yZFxuICovXG4vKipcbiAqIERlZmluZXMgdGhpcyB0eXBlZGVmLlxuICogQHR5cGVkZWYge3toZWFkZXJzPzogKCkgPT4gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+LCByZW1vdGVBZGRyZXNzPzogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkfX0gRnJvbnRlbmRNb2RlbFdlYnNvY2tldFVwZ3JhZGVSZXF1ZXN0XG4gKi9cbi8qKlxuICogRGVmaW5lcyB0aGlzIHR5cGVkZWYuXG4gKiBAdHlwZWRlZiB7e2hlYWRlcnM6ICgpID0+IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPiwgaGVhZGVyOiAobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCwgbWV0YWRhdGE6IChrZXk/OiBzdHJpbmcpID0+IFJlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPiB8IGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlIHwgdW5kZWZpbmVkLCBwYXRoOiAoKSA9PiBzdHJpbmcsIGh0dHBNZXRob2Q6ICgpID0+IHN0cmluZywgcmVtb3RlQWRkcmVzczogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkLCBvcmlnaW46ICgpID0+IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkfX0gRnJvbnRlbmRNb2RlbFdlYnNvY2tldFN5bnRoZXRpY1JlcXVlc3RcbiAqL1xuY29uc3QgRVZFTlRfRklMVEVSX0tFWVMgPSBuZXcgU2V0KFtcImpvaW5zXCIsIFwia2V5XCIsIFwic2VhcmNoZXNcIiwgXCJ3aGVyZVwiXSlcblxuLy8gTWlycm9ycyBGUk9OVEVORF9NT0RFTFNfQ0hBTk5FTF9OQU1FIGluIC4vd2Vic29ja2V0LXB1Ymxpc2hlcnMuanMsIGR1cGxpY2F0ZWQgaGVyZVxuLy8gdG8gYXZvaWQgdGhlIGNvbmZpZ3VyYXRpb24g4oaSIGxvZ2dlciDihpIgd2Vic29ja2V0LXB1Ymxpc2hlcnMgaW1wb3J0IGN5Y2xlLlxuY29uc3QgRlJPTlRFTkRfTU9ERUxTX0NIQU5ORUxfTkFNRSA9IFwiZnJvbnRlbmQtbW9kZWxzXCJcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHNlcnZlci1zaWRlIGJyb2FkY2FzdCB2YWx1ZSBpcyBhIGRlc3Ryb3ktYXV0aG9yaXphdGlvbiByZWNvcmQuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlIHwgdW5kZWZpbmVkfSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBEZXN0cm95QXV0aG9yaXphdGlvblJlY29yZH0gLSBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIGNvbHVtbi1rZXllZCByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIGlzRGVzdHJveUF1dGhvcml6YXRpb25SZWNvcmQodmFsdWUpIHtcbiAgcmV0dXJuIEJvb2xlYW4odmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSlcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIGNhcHR1cmVkIHZhbHVlIGlzIGEgc2VyaWFsaXplZCBiaW5hcnktY29sdW1uIG1hcmtlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWV9IHZhbHVlIC0gQ2FwdHVyZWQgY29sdW1uIHZhbHVlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIHtfX3ZlbG9jaW91c0Rlc3Ryb3lBdXRob3JpemF0aW9uVHlwZTogXCJiaW5hcnlcIiwgdmFsdWU6IG51bWJlcltdfX0gLSBXaGV0aGVyIHRoZSB2YWx1ZSBjb250YWlucyBzZXJpYWxpemVkIGJ5dGVzLlxuICovXG5mdW5jdGlvbiBpc0Rlc3Ryb3lBdXRob3JpemF0aW9uQmluYXJ5KHZhbHVlKSB7XG4gIHJldHVybiBCb29sZWFuKFxuICAgIHZhbHVlXG4gICAgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiXG4gICAgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgJiYgXCJfX3ZlbG9jaW91c0Rlc3Ryb3lBdXRob3JpemF0aW9uVHlwZVwiIGluIHZhbHVlXG4gICAgJiYgdmFsdWUuX192ZWxvY2lvdXNEZXN0cm95QXV0aG9yaXphdGlvblR5cGUgPT09IFwiYmluYXJ5XCJcbiAgICAmJiBcInZhbHVlXCIgaW4gdmFsdWVcbiAgICAmJiBBcnJheS5pc0FycmF5KHZhbHVlLnZhbHVlKVxuICAgICYmIHZhbHVlLnZhbHVlLmV2ZXJ5KChieXRlKSA9PiB0eXBlb2YgYnl0ZSA9PT0gXCJudW1iZXJcIilcbiAgKVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIFBvc3RncmVTUUwgYXJyYXkgZXhwcmVzc2lvbiB3aG9zZSBlbGVtZW50cyBhcmUgcXVvdGVkIGJ5IHRoZSBhY3RpdmUgZHJpdmVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZHJpdmVyIC0gQWN0aXZlIFBvc3RncmVTUUwgZHJpdmVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZVtdfSB2YWx1ZXMgLSBDYXB0dXJlZCBhcnJheSB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFBvc3RncmVTUUwgYXJyYXkgZXhwcmVzc2lvbi5cbiAqL1xuZnVuY3Rpb24gcGdzcWxBcnJheVZhbHVlU3FsKGRyaXZlciwgdmFsdWVzKSB7XG4gIGNvbnN0IGVsZW1lbnRzID0gdmFsdWVzLm1hcCgodmFsdWUpID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBwZ3NxbEFycmF5VmFsdWVTcWwoZHJpdmVyLCB2YWx1ZSlcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBcIk5VTExcIlxuXG4gICAgcmV0dXJuIGRyaXZlci5xdW90ZSh2YWx1ZSlcbiAgfSlcblxuICByZXR1cm4gYEFSUkFZWyR7ZWxlbWVudHMuam9pbihcIiwgXCIpfV1gXG59XG5cbi8qKlxuICogUmVzb2x2ZXMgZnJvbnRlbmQgcmVzb3VyY2UgaWRlbnRpdHkgYXR0cmlidXRlcyB0byBiYWNraW5nIGRhdGFiYXNlIGNvbHVtbnMuXG4gKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gTW9kZWxDbGFzcyAtIEJhY2tpbmcgbW9kZWwgY2xhc3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL3V0aWxzL21vZGVsLXByaW1hcnkta2V5LmpzXCIpLk1vZGVsUHJpbWFyeUtleURlZmluaXRpb259IHByaW1hcnlLZXkgLSBGcm9udGVuZCByZXNvdXJjZSBpZGVudGl0eSBkZWZpbml0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi91dGlscy9tb2RlbC1wcmltYXJ5LWtleS5qc1wiKS5Nb2RlbFByaW1hcnlLZXlWYWx1ZX0gaWQgLSBGcm9udGVuZCByZXNvdXJjZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi91dGlscy9tb2RlbC1wcmltYXJ5LWtleS5qc1wiKS5Nb2RlbFByaW1hcnlLZXlTY2FsYXI+fSAtIEJhY2tpbmcgY29sdW1uIGNvbmRpdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGZyb250ZW5kTW9kZWxQcmltYXJ5S2V5RGF0YWJhc2VDb25kaXRpb25zKE1vZGVsQ2xhc3MsIHByaW1hcnlLZXksIGlkKSB7XG4gIGNvbnN0IHJlc291cmNlQ29uZGl0aW9ucyA9IG1vZGVsUHJpbWFyeUtleUNvbmRpdGlvbnMocHJpbWFyeUtleSwgaWQpXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vdXRpbHMvbW9kZWwtcHJpbWFyeS1rZXkuanNcIikuTW9kZWxQcmltYXJ5S2V5U2NhbGFyPn0gKi9cbiAgY29uc3QgZGF0YWJhc2VDb25kaXRpb25zID0ge31cblxuICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVzb3VyY2VDb25kaXRpb25zKSkge1xuICAgIGRhdGFiYXNlQ29uZGl0aW9uc1tNb2RlbENsYXNzLmdldENvbHVtbk5hbWVGb3JBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpXSA9IHZhbHVlXG4gIH1cblxuICByZXR1cm4gZGF0YWJhc2VDb25kaXRpb25zXG59XG5cbi8qKlxuICogUnVucyB0cmFuc3BvcnQgc2VyaWFsaXphdGlvbiBvcHRpb25zIGZvciBhIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90cmFuc3BvcnQtc2VyaWFsaXphdGlvbi5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0U2VyaWFsaXphdGlvbk9wdGlvbnN9IC0gU2VyaWFsaXphdGlvbiBvcHRpb25zLlxuICovXG5mdW5jdGlvbiB0cmFuc3BvcnRTZXJpYWxpemF0aW9uT3B0aW9uc0ZvckNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikge1xuICByZXR1cm4ge1xuICAgIHRpbWVab25lOiBjb25maWd1cmF0aW9uLmdldEVudmlyb25tZW50SGFuZGxlcigpLmdldFRpbWVab25lKGNvbmZpZ3VyYXRpb24pXG4gIH1cbn1cblxuLyoqXG4gKiBQZXItc2Vzc2lvbiBjaGFubmVsIHN1YnNjcmlwdGlvbiBmb3IgZnJvbnRlbmQtbW9kZWwgbGlmZWN5Y2xlIGV2ZW50cy5cbiAqIFJlcGxhY2VzIHRoZSBsZWdhY3kgYEZyb250ZW5kTW9kZWxXZWJzb2NrZXRDaGFubmVsYCAoUGhhc2UgMykuXG4gKlxuICogYGNhblN1YnNjcmliZWAgcmVzb2x2ZXMgdGhlIGNhbGxlcidzIGFiaWxpdHkgb25jZSBhbmQgcmVxdWlyZXMgYSByZWFkIHJ1bGVcbiAqIGZvciB0aGUgcmVxdWVzdGVkIG1vZGVsIGNsYXNzLiBDcmVhdGUvdXBkYXRlIGRlbGl2ZXJ5IHRoZW4gcmVsb2FkcyBlYWNoXG4gKiByZWNvcmQgdGhyb3VnaCB0aGF0IGFiaWxpdHkgYW5kIHNlcmlhbGl6ZXMgaXQgdGhyb3VnaCB0aGUgc3Vic2NyaWJlZFxuICogZnJvbnRlbmQgcmVzb3VyY2UuIFN1YnNjcmliZXItcHJvdmlkZWQgZXZlbnQgZmlsdGVycyBjYW4gZnVydGhlciBuYXJyb3dcbiAqIHRob3NlIGF1dGhvcml6ZWQgZXZlbnRzLlxuICpcbiAqIFdpcmU6IHN1YnNjcmliZSB3aXRoIGBzdWJzY3JpYmVDaGFubmVsKFwiZnJvbnRlbmQtbW9kZWxzXCIsIHtwYXJhbXM6IHttb2RlbDogTW9kZWxOYW1lfX0pYC5cbiAqIEJhY2tlbmQgcHVibGlzaGVzIGB7YWN0aW9uLCBpZCwgcmVjb3JkfWAgdmlhXG4gKiBgY29uZmlndXJhdGlvbi5icm9hZGNhc3RUb0NoYW5uZWwoXCJmcm9udGVuZC1tb2RlbHNcIiwge21vZGVsOiBNb2RlbE5hbWV9LCBib2R5KWA7XG4gKiBgbWF0Y2hlcygpYCByb3V0ZXMgYnkgbW9kZWwgbmFtZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRnJvbnRlbmRNb2RlbFdlYnNvY2tldENoYW5uZWwgZXh0ZW5kcyBWZWxvY2lvdXNXZWJzb2NrZXRDaGFubmVsIHtcbiAgLyoqXG4gICAqIEFiaWxpdHkuXG4gICAqIEB0eXBlIHtpbXBvcnQoXCIuLi9hdXRob3JpemF0aW9uL2FiaWxpdHkuanNcIikuZGVmYXVsdCB8IG51bGx9ICovXG4gIF9hYmlsaXR5ID0gbnVsbFxuXG4gIC8qKlxuICAgKiBSdW5zIGNhbiBzdWJzY3JpYmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIHRoZSBmcm9udGVuZC1tb2RlbCBzdWJzY3JpcHRpb24gaXMgYXV0aG9yaXplZC5cbiAgICovXG4gIGFzeW5jIGNhblN1YnNjcmliZSgpIHtcbiAgICBjb25zdCBtb2RlbE5hbWUgPSB0aGlzLl9tb2RlbE5hbWUoKVxuXG4gICAgaWYgKCFtb2RlbE5hbWUpIHJldHVybiBmYWxzZVxuICAgIHRoaXMuX2V2ZW50RmlsdGVycygpXG5cbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5zZXNzaW9uLmNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBNb2RlbENsYXNzID0gdGhpcy5fbW9kZWxDbGFzcyhtb2RlbE5hbWUpXG5cbiAgICBpZiAoIU1vZGVsQ2xhc3MpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdH0gKi8gKHRoaXMuX3N5bnRoZXRpY1JlcXVlc3QoKSlcbiAgICBjb25zdCBhYmlsaXR5ID0gYXdhaXQgY29uZmlndXJhdGlvbi5yZXNvbHZlQWJpbGl0eSh7XG4gICAgICAvLyBGb3J3YXJkIHRoZSBzdWJzY3JpYmVyJ3MgcGFyYW1zIChlLmcuIGF1dGhlbnRpY2F0aW9uVG9rZW4pIHNvIHRva2VuLWF1dGhlbnRpY2F0ZWQgY2xpZW50c1xuICAgICAgLy8gcmVzb2x2ZSB0aGUgc2FtZSBhYmlsaXR5IHRoZXkgd291bGQgb3ZlciBIVFRQLiBXaXRob3V0IHRoaXMgb25seSBzZXNzaW9uL2Nvb2tpZSBhdXRoIG9uIHRoZVxuICAgICAgLy8gdXBncmFkZSByZXF1ZXN0IHdvcmtzLCBhbmQgcGFyYW0tYmFzZWQgYXV0aCAobGlrZSBhIHNjYW5uZXIgcGFzc2luZyBhbiBhdXRoZW50aWNhdGlvblRva2VuKVxuICAgICAgLy8gaXMgZHJvcHBlZCDigJQgbGVhdmluZyBzdWNoIHN1YnNjcmliZXJzIHdpdGggYSBndWVzdCBhYmlsaXR5IGFuZCBubyByZWFkIHJ1bGUuXG4gICAgICBwYXJhbXM6IHsuLi50aGlzLnBhcmFtcywgbW9kZWw6IG1vZGVsTmFtZX0sXG4gICAgICByZXF1ZXN0LFxuICAgICAgcmVzcG9uc2U6IG5ldyBSZXNwb25zZSh7Y29uZmlndXJhdGlvbn0pXG4gICAgfSlcblxuICAgIGlmICghYWJpbGl0eSkgcmV0dXJuIGZhbHNlXG4gICAgdGhpcy5fYWJpbGl0eSA9IGFiaWxpdHlcblxuICAgIC8vIExvYWQgcmVzb3VyY2UtZGVjbGFyZWQgcnVsZXMgZm9yIHRoaXMgbW9kZWwgY2xhc3MgYmVmb3JlIGNoZWNraW5nLFxuICAgIC8vIG90aGVyd2lzZSBgcnVsZXNGb3JgIHJldHVybnMgZW1wdHkgZm9yIGFiaWxpdGllcyB3aG9zZSByZXNvdXJjZXNcbiAgICAvLyByZWdpc3RlciBydWxlcyBsYXppbHkgdmlhIGBhYmlsaXRpZXMoKWAuXG4gICAgYWJpbGl0eS5sb2FkQWJpbGl0aWVzRm9yTW9kZWxDbGFzcyhNb2RlbENsYXNzKVxuXG4gICAgY29uc3QgcmVhZFJ1bGVzID0gYWJpbGl0eS5ydWxlc0Zvcih7YWN0aW9uOiBcInJlYWRcIiwgbW9kZWxDbGFzczogTW9kZWxDbGFzc30pXG5cbiAgICByZXR1cm4gcmVhZFJ1bGVzLnNvbWUoKC8qKiBAdHlwZSB7e2VmZmVjdDogc3RyaW5nfX0gKi8gcnVsZSkgPT4gcnVsZS5lZmZlY3QgPT09IFwiYWxsb3dcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIHN1YnNjcmlwdGlvbiBuYW1lIHRocm91Z2ggZnJvbnRlbmQgcmVzb3VyY2VzIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gYSBiYWNraW5nIG1vZGVsIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWUgLSBGcm9udGVuZCByZXNvdXJjZSBuYW1lLlxuICAgKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIEJhY2tpbmcgbW9kZWwgY2xhc3MuXG4gICAqL1xuICBfbW9kZWxDbGFzcyhtb2RlbE5hbWUpIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5zZXNzaW9uLmNvbmZpZ3VyYXRpb25cblxuICAgIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgY29uZmlndXJhdGlvbi5nZXRCYWNrZW5kUHJvamVjdHMoKSkge1xuICAgICAgY29uc3QgcmVzb3VyY2VEZWZpbml0aW9uID0gZnJvbnRlbmRNb2RlbFJlc291cmNlc1dpdGhCdWlsdEluc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVttb2RlbE5hbWVdXG4gICAgICBjb25zdCByZXNvdXJjZUNsYXNzID0gcmVzb3VyY2VEZWZpbml0aW9uID8gZnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NGcm9tRGVmaW5pdGlvbihyZXNvdXJjZURlZmluaXRpb24pIDogbnVsbFxuXG4gICAgICBpZiAocmVzb3VyY2VDbGFzcz8uTW9kZWxDbGFzcykgcmV0dXJuIHJlc291cmNlQ2xhc3MubW9kZWxDbGFzcygpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzc2VzKClbbW9kZWxOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGVsaXZlciBicm9hZGNhc3QuXG4gICAqIEBwYXJhbSB7RnJvbnRlbmRNb2RlbExpZmVjeWNsZUJyb2FkY2FzdEJvZHl9IGJvZHkgLSBCcm9hZGNhc3QgYm9keS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5XZWJzb2NrZXRCcm9hZGNhc3RNZXRhZGF0YX0gW21ldGFdIC0gT3B0aW9uYWwgc2VydmVyLXNpZGUgYnJvYWRjYXN0IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgZGVsaXZlcnkuXG4gICAqL1xuICBhc3luYyBkZWxpdmVyQnJvYWRjYXN0KGJvZHksIG1ldGEpIHtcbiAgICBhd2FpdCB0aGlzLl9kZWxpdmVyQnJvYWRjYXN0KGJvZHksIG1ldGEpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkZWxpdmVyIGJyb2FkY2FzdC5cbiAgICogQHBhcmFtIHtGcm9udGVuZE1vZGVsTGlmZWN5Y2xlQnJvYWRjYXN0Qm9keX0gYm9keSAtIEJyb2FkY2FzdCBib2R5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLldlYnNvY2tldEJyb2FkY2FzdE1ldGFkYXRhfSBbbWV0YV0gLSBPcHRpb25hbCBzZXJ2ZXItc2lkZSBicm9hZGNhc3QgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBkZWxpdmVyeS5cbiAgICovXG4gIGFzeW5jIF9kZWxpdmVyQnJvYWRjYXN0KGJvZHksIG1ldGEpIHtcbiAgICBjb25zdCBoYXNFdmVudEZpbHRlcnMgPSB0aGlzLl9oYXNFdmVudEZpbHRlclBhcmFtcygpXG5cbiAgICBpZiAoIWJvZHkgfHwgdHlwZW9mIGJvZHkgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmICghaGFzRXZlbnRGaWx0ZXJzIHx8IHRoaXMuX2hhc1VuZmlsdGVyZWRFdmVudERlbGl2ZXJ5KCkpIHRoaXMuc2VuZE1lc3NhZ2UoYm9keSwgbWV0YSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYm9keS5tb2RlbCA9PT0gXCJzdHJpbmdcIiAmJiBib2R5Lm1vZGVsICE9PSB0aGlzLl9tb2RlbE5hbWUoKSkgcmV0dXJuXG5cbiAgICBpZiAoYm9keS5hY3Rpb24gPT09IFwiZGVzdHJveVwiKSB7XG4gICAgICBpZiAoYm9keS5pZCA9PT0gdW5kZWZpbmVkIHx8IGJvZHkuaWQgPT09IG51bGwpIHJldHVyblxuXG4gICAgICBjb25zdCBGcm9udGVuZE1vZGVsQ29udHJvbGxlciA9IGF3YWl0IHRoaXMuX2Zyb250ZW5kTW9kZWxDb250cm9sbGVyQ2xhc3MoKVxuICAgICAgY29uc3QgYXV0aG9yaXplZCA9IGF3YWl0IHRoaXMuX2Rlc3Ryb3lFdmVudElzQXV0aG9yaXplZChcbiAgICAgICAgYm9keSxcbiAgICAgICAgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIsXG4gICAgICAgIG1ldGE/LmJyb2FkY2FzdFBhcmFtcz8uZGVzdHJveUF1dGhvcml6YXRpb25SZWNvcmRcbiAgICAgIClcblxuICAgICAgaWYgKCFhdXRob3JpemVkKSByZXR1cm5cblxuICAgICAgaWYgKCFoYXNFdmVudEZpbHRlcnMgfHwgdGhpcy5faGFzRGVzdHJveUV2ZW50RGVsaXZlcnkoKSB8fCB0aGlzLl9oYXNVbmZpbHRlcmVkRXZlbnREZWxpdmVyeSgpKSB7XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2Uoe1xuICAgICAgICAgIGFjdGlvbjogYm9keS5hY3Rpb24sXG4gICAgICAgICAgaWQ6IGJvZHkuaWQsXG4gICAgICAgICAgLi4uKHR5cGVvZiBib2R5Lm1vZGVsID09PSBcInN0cmluZ1wiID8ge21vZGVsOiBib2R5Lm1vZGVsfSA6IHt9KVxuICAgICAgICB9LCBtZXRhKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGJvZHkuaWQgPT09IHVuZGVmaW5lZCB8fCBib2R5LmlkID09PSBudWxsKSB7XG4gICAgICBpZiAoIWhhc0V2ZW50RmlsdGVycyB8fCB0aGlzLl9oYXNVbmZpbHRlcmVkRXZlbnREZWxpdmVyeSgpKSB0aGlzLnNlbmRNZXNzYWdlKGJvZHksIG1ldGEpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBGcm9udGVuZE1vZGVsQ29udHJvbGxlciA9IGF3YWl0IHRoaXMuX2Zyb250ZW5kTW9kZWxDb250cm9sbGVyQ2xhc3MoKVxuICAgIGNvbnN0IG1hdGNoZWRFdmVudEZpbHRlcktleXMgPSBoYXNFdmVudEZpbHRlcnNcbiAgICAgID8gYXdhaXQgdGhpcy5fbWF0Y2hlZEV2ZW50RmlsdGVyS2V5c0ZvckV2ZW50SWQoYm9keS5pZCwgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIpXG4gICAgICA6IFtdXG4gICAgY29uc3QgaXNJZGVudGl0eVRyYW5zaXRpb24gPSBib2R5LmFjdGlvbiA9PT0gXCJ1cGRhdGVcIiAmJiBib2R5LnByZXZpb3VzSWQgIT09IHVuZGVmaW5lZCAmJiBib2R5LnByZXZpb3VzSWQgIT09IG51bGxcblxuICAgIGlmIChoYXNFdmVudEZpbHRlcnMgJiYgbWF0Y2hlZEV2ZW50RmlsdGVyS2V5cy5sZW5ndGggPT09IDAgJiYgIXRoaXMuX2hhc1VuZmlsdGVyZWRFdmVudERlbGl2ZXJ5KCkgJiYgIWlzSWRlbnRpdHlUcmFuc2l0aW9uKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0ZWRSZWNvcmQgPSBhd2FpdCB0aGlzLl9wcm9qZWN0ZWRSZWNvcmRGb3JFdmVudElkKGJvZHkuaWQsIEZyb250ZW5kTW9kZWxDb250cm9sbGVyKVxuXG4gICAgaWYgKCFwcm9qZWN0ZWRSZWNvcmQpIHtcbiAgICAgIGlmIChpc0lkZW50aXR5VHJhbnNpdGlvbikge1xuICAgICAgICB0aGlzLnNlbmRNZXNzYWdlKHtcbiAgICAgICAgICBhY3Rpb246IGJvZHkuYWN0aW9uLFxuICAgICAgICAgIGlkOiBib2R5LmlkLFxuICAgICAgICAgIC4uLihoYXNFdmVudEZpbHRlcnMgPyB7bWF0Y2hlZEV2ZW50RmlsdGVyS2V5c30gOiB7fSksXG4gICAgICAgICAgLi4uKHR5cGVvZiBib2R5Lm1vZGVsID09PSBcInN0cmluZ1wiID8ge21vZGVsOiBib2R5Lm1vZGVsfSA6IHt9KSxcbiAgICAgICAgICBwcmV2aW91c0lkOiBib2R5LnByZXZpb3VzSWRcbiAgICAgICAgfSwgbWV0YSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLnNlc3Npb24uY29uZmlndXJhdGlvblxuXG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGcm9udGVuZCBtb2RlbCB3ZWJzb2NrZXQgY2hhbm5lbCBoYXMgbm8gY29uZmlndXJhdGlvbiBmb3IgdHJhbnNwb3J0IHNlcmlhbGl6YXRpb25cIilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxpdmVyIGJvZHkuXG4gICAgICogQHR5cGUge0Zyb250ZW5kTW9kZWxMaWZlY3ljbGVCcm9hZGNhc3RCb2R5fSAqL1xuICAgIGxldCBkZWxpdmVyQm9keSA9IHtcbiAgICAgIC4uLmJvZHksXG4gICAgICByZWNvcmQ6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWV9ICovIChzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUocHJvamVjdGVkUmVjb3JkLCB0cmFuc3BvcnRTZXJpYWxpemF0aW9uT3B0aW9uc0ZvckNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikpKVxuICAgIH1cblxuICAgIGlmIChoYXNFdmVudEZpbHRlcnMpIHtcbiAgICAgIGRlbGl2ZXJCb2R5ID0ge1xuICAgICAgICAuLi5kZWxpdmVyQm9keSxcbiAgICAgICAgbWF0Y2hlZEV2ZW50RmlsdGVyS2V5c1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VuZE1lc3NhZ2UoZGVsaXZlckJvZHksIG1ldGEpXG4gIH1cblxuICAvKipcbiAgICogUmVxdWlyZXMgYSByZXN5bmMgZm9yIHJlbGV2YW50IGRlc3Ryb3kgZXZlbnRzIGJlY2F1c2UgdGhlaXIgYXV0aG9yaXphdGlvblxuICAgKiBzbmFwc2hvdHMgYXJlIGludGVudGlvbmFsbHkgZXhjbHVkZWQgZnJvbSB0aGUgcGVyc2lzdGVkIHJlcGxheSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLldlYnNvY2tldEpzb25WYWx1ZX0gYm9keSAtIFBlcnNpc3RlZCBicm9hZGNhc3QgcGF5bG9hZC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciByZXBsYXkgY2Fubm90IHNhZmVseSBhdXRob3JpemUgdGhpcyBldmVudC5cbiAgICovXG4gIF9yZXF1aXJlc1JlcGxheUdhcChib2R5KSB7XG4gICAgaWYgKCFib2R5IHx8IHR5cGVvZiBib2R5ICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoYm9keSkpIHJldHVybiBmYWxzZVxuICAgIGlmICghKFwiYWN0aW9uXCIgaW4gYm9keSkgfHwgYm9keS5hY3Rpb24gIT09IFwiZGVzdHJveVwiKSByZXR1cm4gZmFsc2VcbiAgICBpZiAoIShcImlkXCIgaW4gYm9keSkgfHwgYm9keS5pZCA9PT0gdW5kZWZpbmVkIHx8IGJvZHkuaWQgPT09IG51bGwpIHJldHVybiBmYWxzZVxuXG4gICAgcmV0dXJuICEoXCJtb2RlbFwiIGluIGJvZHkpIHx8IHR5cGVvZiBib2R5Lm1vZGVsICE9PSBcInN0cmluZ1wiIHx8IGJvZHkubW9kZWwgPT09IHRoaXMuX21vZGVsTmFtZSgpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGEgZGVzdHJveSBhZ2FpbnN0IHRoZSBzdWJzY3JpYmVyJ3Mgb3JkaW5hcnkgYXV0aG9yaXplZCBxdWVyeSBieVxuICAgKiByZXBsYWNpbmcgdGhlIGRlbGV0ZWQgYmFja2luZyB0YWJsZSB3aXRoIHRoZSBjYXB0dXJlZCBwcmUtZGVsZXRlIHJvdy4gVmFsdWVzXG4gICAqIGFyZSBxdW90ZWQgb24gdGhpcyB0cnVzdGVkIGRhdGFiYXNlIGNvbm5lY3Rpb247IG5vIGJyb2FkY2FzdC1wcm92aWRlZCBTUUwgaXMgcnVuLlxuICAgKiBAcGFyYW0ge0Zyb250ZW5kTW9kZWxMaWZlY3ljbGVCcm9hZGNhc3RCb2R5fSBib2R5IC0gRGVzdHJveSBicm9hZGNhc3QgYm9keS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBGcm9udGVuZE1vZGVsQ29udHJvbGxlciAtIFNlcnZlci1zaWRlIGZyb250ZW5kLW1vZGVsIGNvbnRyb2xsZXIgY2xhc3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUgfCB1bmRlZmluZWR9IGRlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkIC0gU2VydmVyLW9ubHkgcHJlLWRlbGV0ZSByZWNvcmQgZnJvbSBsaXZlIGJyb2FkY2FzdCBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gV2hldGhlciB0aGUgc3Vic2NyaWJlciBjb3VsZCByZWFkIHRoZSByZWNvcmQgYmVmb3JlIGRlbGV0aW9uLlxuICAgKi9cbiAgYXN5bmMgX2Rlc3Ryb3lFdmVudElzQXV0aG9yaXplZChib2R5LCBGcm9udGVuZE1vZGVsQ29udHJvbGxlciwgZGVzdHJveUF1dGhvcml6YXRpb25SZWNvcmQpIHtcbiAgICBjb25zdCBpZCA9IGJvZHkuaWRcblxuICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsIHx8ICFpc0Rlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkKGRlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkKSkgcmV0dXJuIGZhbHNlXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aEV2ZW50VGVuYW50KGlkLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5fZnJvbnRlbmRNb2RlbENvbnRyb2xsZXIoRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIpXG5cbiAgICAgIGF3YWl0IGNvbnRyb2xsZXIuZW5zdXJlRnJvbnRlbmRNb2RlbENsYXNzSW5pdGlhbGl6ZWQoKVxuXG4gICAgICBjb25zdCBNb2RlbENsYXNzID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsQ2xhc3MoKVxuICAgICAgY29uc3QgcHJpbWFyeUtleSA9IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbFByaW1hcnlLZXkoKVxuICAgICAgY29uc3QgcnVsZVF1ZXJ5RmFjdG9yeSA9ICgpID0+IHRoaXMuX2Rlc3Ryb3lBdXRob3JpemF0aW9uUXVlcnkoTW9kZWxDbGFzcywgZGVzdHJveUF1dGhvcml6YXRpb25SZWNvcmQpXG4gICAgICBjb25zdCBxdWVyeSA9IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbEF1dGhvcml6ZWRRdWVyeShcImZpbmRcIiwge3J1bGVRdWVyeUZhY3Rvcnl9KVxuXG4gICAgICB0aGlzLl9hcHBseURlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkVG9RdWVyeShxdWVyeSwgTW9kZWxDbGFzcywgZGVzdHJveUF1dGhvcml6YXRpb25SZWNvcmQpXG4gICAgICBxdWVyeS53aGVyZSh7XG4gICAgICAgIFtNb2RlbENsYXNzLnRhYmxlTmFtZSgpXTogZnJvbnRlbmRNb2RlbFByaW1hcnlLZXlEYXRhYmFzZUNvbmRpdGlvbnMoTW9kZWxDbGFzcywgcHJpbWFyeUtleSwgaWQpXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4gQm9vbGVhbihhd2FpdCBxdWVyeS5maXJzdCgpKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgYmFja2luZy1tb2RlbCBxdWVyeSB3aG9zZSBzb3VyY2UgaXMgdGhlIGNhcHR1cmVkIHByZS1kZWxldGUgcm93LlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gTW9kZWxDbGFzcyAtIEJhY2tpbmcgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7RGVzdHJveUF1dGhvcml6YXRpb25SZWNvcmR9IGRlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkIC0gQ2FwdHVyZWQgcHJlLWRlbGV0ZSByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0PHR5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59IC0gT25lLXJvdyBtb2RlbCBxdWVyeS5cbiAgICovXG4gIF9kZXN0cm95QXV0aG9yaXphdGlvblF1ZXJ5KE1vZGVsQ2xhc3MsIGRlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkKSB7XG4gICAgY29uc3QgcXVlcnkgPSBNb2RlbENsYXNzLl9uZXdRdWVyeSgpXG5cbiAgICB0aGlzLl9hcHBseURlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkVG9RdWVyeShxdWVyeSwgTW9kZWxDbGFzcywgZGVzdHJveUF1dGhvcml6YXRpb25SZWNvcmQpXG5cbiAgICByZXR1cm4gcXVlcnlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhIHF1ZXJ5J3MgYmFja2luZyB0YWJsZSB3aXRoIGEgc2FmZWx5IHF1b3RlZCBvbmUtcm93IGRlcml2ZWQgdGFibGUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQ+fSBxdWVyeSAtIFF1ZXJ5IHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IE1vZGVsQ2xhc3MgLSBCYWNraW5nIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge0Rlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkfSBkZXN0cm95QXV0aG9yaXphdGlvblJlY29yZCAtIENhcHR1cmVkIHByZS1kZWxldGUgcmVjb3JkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9hcHBseURlc3Ryb3lBdXRob3JpemF0aW9uUmVjb3JkVG9RdWVyeShxdWVyeSwgTW9kZWxDbGFzcywgZGVzdHJveUF1dGhvcml6YXRpb25SZWNvcmQpIHtcbiAgICBjb25zdCBzZWxlY3RlZENvbHVtbnMgPSBPYmplY3QuZW50cmllcyhkZXN0cm95QXV0aG9yaXphdGlvblJlY29yZCkubWFwKChbY29sdW1uTmFtZSwgc2VyaWFsaXplZFZhbHVlXSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBpc0Rlc3Ryb3lBdXRob3JpemF0aW9uQmluYXJ5KHNlcmlhbGl6ZWRWYWx1ZSlcbiAgICAgICAgPyBCdWZmZXIuZnJvbShzZXJpYWxpemVkVmFsdWUudmFsdWUpXG4gICAgICAgIDogZGVzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWUoc2VyaWFsaXplZFZhbHVlKVxuICAgICAgY29uc3QgY29sdW1uID0gTW9kZWxDbGFzcy5nZXRDb2x1bW5zSGFzaCgpW2NvbHVtbk5hbWVdXG5cbiAgICAgIGlmICghY29sdW1uKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBhdXRob3JpemUgYSBkZXN0cm95ZWQgJHtNb2RlbENsYXNzLm5hbWV9IHdpdGggdW5rbm93biBjb2x1bW4gJHtjb2x1bW5OYW1lfWApXG4gICAgICBjb25zdCBxdW90ZWRWYWx1ZSA9IHF1ZXJ5LmRyaXZlci5nZXRUeXBlKCkgPT0gXCJwZ3NxbFwiICYmIGNvbHVtbi5nZXRUeXBlKCkgPT09IFwiQVJSQVlcIiAmJiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICA/IHBnc3FsQXJyYXlWYWx1ZVNxbChxdWVyeS5kcml2ZXIsIHZhbHVlKVxuICAgICAgICA6IHZhbHVlID09PSBudWxsID8gXCJOVUxMXCIgOiBxdWVyeS5kcml2ZXIucXVvdGUodmFsdWUpXG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSBxdWVyeS5kcml2ZXIuZ2V0VHlwZSgpID09IFwicGdzcWxcIlxuICAgICAgICA/IGBDQVNUKCR7cXVvdGVkVmFsdWV9IEFTICR7Y29sdW1uLmdldERhdGFiYXNlVHlwZSgpfSlgXG4gICAgICAgIDogcXVvdGVkVmFsdWVcblxuICAgICAgcmV0dXJuIGAke3NlbGVjdGVkVmFsdWV9IEFTICR7cXVlcnkuZHJpdmVyLnF1b3RlQ29sdW1uKGNvbHVtbk5hbWUpfWBcbiAgICB9KVxuXG4gICAgaWYgKHNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGF1dGhvcml6ZSBhIGRlc3Ryb3llZCAke01vZGVsQ2xhc3MubmFtZX0gd2l0aG91dCBjYXB0dXJlZCBhdHRyaWJ1dGVzYClcbiAgICB9XG5cbiAgICBjb25zdCBmcm9tcyA9IHF1ZXJ5LmdldEZyb21zKClcblxuICAgIGZyb21zLnNwbGljZSgwLCBmcm9tcy5sZW5ndGgpXG4gICAgcXVlcnkuZnJvbShgKFNFTEVDVCAke3NlbGVjdGVkQ29sdW1ucy5qb2luKFwiLCBcIil9KSBBUyAke3F1ZXJ5LmRyaXZlci5xdW90ZVRhYmxlKE1vZGVsQ2xhc3MudGFibGVOYW1lKCkpfWApXG4gIH1cblxuICAvKipcbiAgICogUnVucyBtYXRjaGVzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPn0gYnJvYWRjYXN0UGFyYW1zIC0gUGFyYW1zIGZyb20gYGJyb2FkY2FzdFRvQ2hhbm5lbGAuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBicm9hZGNhc3QgbWF0Y2hlcyB0aGlzIHN1YnNjcmliZXIncyBtb2RlbC5cbiAgICovXG4gIG1hdGNoZXMoYnJvYWRjYXN0UGFyYW1zKSB7XG4gICAgcmV0dXJuIGJyb2FkY2FzdFBhcmFtcz8ubW9kZWwgPT09IHRoaXMuX21vZGVsTmFtZSgpXG4gIH1cblxuICAvKipcbiAgICogRHJvcHMgdGhlIHNlcnZlci1vbmx5IGRlc3Ryb3ktYXV0aG9yaXphdGlvbiBzbmFwc2hvdCBiZWZvcmUgcmVwbGF5XG4gICAqIHBlcnNpc3RlbmNlLiBUaGUgc25hcHNob3QgaXMgd2hhdCBtYWtlcyByZXBsYXllZCBkZXN0cm95IGV2ZW50c1xuICAgKiByZXF1aXJlIGEgY2xpZW50IHJlc3luYywgYW5kIHRoZSBwcmUtZGVsZXRlIHJvdyBpdCBjYXB0dXJlcyBtdXN0XG4gICAqIG5ldmVyIGJlIHN0b3JlZC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT4gfCBudWxsIHwgdW5kZWZpbmVkfSBicm9hZGNhc3RQYXJhbXMgLSBQYXJhbXMgZnJvbSBgYnJvYWRjYXN0VG9DaGFubmVsYC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPiB8IG51bGx9IC0gUGVyc2lzdGFibGUgcm91dGluZyBwYXJhbXMuXG4gICAqL1xuICBzdGF0aWMgcmVwbGF5YWJsZUJyb2FkY2FzdFBhcmFtcyhicm9hZGNhc3RQYXJhbXMpIHtcbiAgICBpZiAoIWJyb2FkY2FzdFBhcmFtcykgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHJlcGxheWFibGVQYXJhbXMgPSB7Li4uYnJvYWRjYXN0UGFyYW1zfVxuXG4gICAgZGVsZXRlIHJlcGxheWFibGVQYXJhbXMuZGVzdHJveUF1dGhvcml6YXRpb25SZWNvcmRcblxuICAgIHJldHVybiByZXBsYXlhYmxlUGFyYW1zXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkZWJ1ZyBzbmFwc2hvdC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gRGVidWctc2FmZSBzdWJzY3JpcHRpb24gZGV0YWlscy5cbiAgICovXG4gIGRlYnVnU25hcHNob3QoKSB7XG4gICAgY29uc3QgZXZlbnRGaWx0ZXJzID0gdGhpcy5fZXZlbnRGaWx0ZXJzKClcblxuICAgIHJldHVybiB7XG4gICAgICBhYmlsaXRpZXM6IHRoaXMucGFyYW1zLmFiaWxpdGllcyAhPT0gdW5kZWZpbmVkLFxuICAgICAgZXZlbnRGaWx0ZXJDb3VudDogZXZlbnRGaWx0ZXJzLmxlbmd0aCxcbiAgICAgIGRlc3Ryb3lFdmVudERlbGl2ZXJ5OiB0aGlzLnBhcmFtcy5kZXN0cm95RXZlbnREZWxpdmVyeSA9PT0gdHJ1ZSxcbiAgICAgIG1vZGVsOiB0aGlzLl9tb2RlbE5hbWUoKSxcbiAgICAgIHByZWxvYWQ6IHRoaXMucGFyYW1zLnByZWxvYWQgIT09IHVuZGVmaW5lZCxcbiAgICAgIHF1ZXJ5RGF0YTogdGhpcy5wYXJhbXMucXVlcnlEYXRhICE9PSB1bmRlZmluZWQsXG4gICAgICBzZWxlY3Q6IHRoaXMucGFyYW1zLnNlbGVjdCAhPT0gdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0c0V4dHJhOiB0aGlzLnBhcmFtcy5zZWxlY3RzRXh0cmEgIT09IHVuZGVmaW5lZCxcbiAgICAgIHVuZmlsdGVyZWRFdmVudERlbGl2ZXJ5OiB0aGlzLnBhcmFtcy51bmZpbHRlcmVkRXZlbnREZWxpdmVyeSA9PT0gdHJ1ZSxcbiAgICAgIHdpdGhDb3VudDogdGhpcy5wYXJhbXMud2l0aENvdW50ICE9PSB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBtb2RlbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBSZXF1ZXN0ZWQgZnJvbnRlbmQtbW9kZWwgbmFtZSBvciBudWxsLlxuICAgKi9cbiAgX21vZGVsTmFtZSgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucGFyYW1zPy5tb2RlbCA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLnBhcmFtcy5tb2RlbC5sZW5ndGggPiAwXG4gICAgICA/IHRoaXMucGFyYW1zLm1vZGVsXG4gICAgICA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGhhcyBldmVudCBmaWx0ZXIgcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoaXMgc3Vic2NyaXB0aW9uIHJlcXVlc3RlZCBldmVudCBxdWVyeSBmaWx0ZXJzLlxuICAgKi9cbiAgX2hhc0V2ZW50RmlsdGVyUGFyYW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9ldmVudEZpbHRlcnMoKS5sZW5ndGggPiAwXG4gIH1cblxuICAvKipcbiAgICogUnVucyBoYXMgdW5maWx0ZXJlZCBldmVudCBkZWxpdmVyeS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB1bmZpbHRlcmVkIGNhbGxiYWNrcyBzaG91bGQgcmVjZWl2ZSBldmVyeSBldmVudC5cbiAgICovXG4gIF9oYXNVbmZpbHRlcmVkRXZlbnREZWxpdmVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbXMudW5maWx0ZXJlZEV2ZW50RGVsaXZlcnkgPT09IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGhhcyBkZXN0cm95IGV2ZW50IGRlbGl2ZXJ5LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGlkLW9ubHkgZGVzdHJveSBldmVudHMgc2hvdWxkIGJlIGRlbGl2ZXJlZCB3aXRoIGV2ZW50IGZpbHRlcnMuXG4gICAqL1xuICBfaGFzRGVzdHJveUV2ZW50RGVsaXZlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zLmRlc3Ryb3lFdmVudERlbGl2ZXJ5ID09PSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBldmVudCBmaWx0ZXJzLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsRXZlbnRGaWx0ZXJQYXlsb2FkRW50cnlbXX0gLSBWYWxpZCBldmVudCBmaWx0ZXJzLlxuICAgKi9cbiAgX2V2ZW50RmlsdGVycygpIHtcbiAgICBpZiAodGhpcy5wYXJhbXMuZXZlbnRGaWx0ZXJzID09PSB1bmRlZmluZWQpIHJldHVybiBbXVxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnBhcmFtcy5ldmVudEZpbHRlcnMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGcm9udGVuZCBtb2RlbCBldmVudEZpbHRlcnMgbXVzdCBiZSBhbiBhcnJheVwiKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBhcmFtcy5ldmVudEZpbHRlcnMubWFwKChlbnRyeSkgPT4ge1xuICAgICAgaWYgKCFlbnRyeSB8fCB0eXBlb2YgZW50cnkgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShlbnRyeSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRnJvbnRlbmQgbW9kZWwgZXZlbnRGaWx0ZXJzIGVudHJpZXMgbXVzdCBiZSBvYmplY3RzXCIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV2ZW50RmlsdGVyID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChlbnRyeSlcbiAgICAgIGNvbnN0IHVua25vd25LZXlzID0gT2JqZWN0LmtleXMoZXZlbnRGaWx0ZXIpLmZpbHRlcigoa2V5KSA9PiAhRVZFTlRfRklMVEVSX0tFWVMuaGFzKGtleSkpXG5cbiAgICAgIGlmICh1bmtub3duS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRnJvbnRlbmQgbW9kZWwgZXZlbnRGaWx0ZXJzIGVudHJpZXMgY2Fubm90IGluY2x1ZGUgJHt1bmtub3duS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBldmVudEZpbHRlci5rZXkgIT09IFwic3RyaW5nXCIgfHwgZXZlbnRGaWx0ZXIua2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGcm9udGVuZCBtb2RlbCBldmVudEZpbHRlcnMgZW50cmllcyByZXF1aXJlIGEga2V5XCIpXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogU2FuaXRpemVkIGV2ZW50IGZpbHRlci5cbiAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxFdmVudEZpbHRlclBheWxvYWRFbnRyeX0gKi9cbiAgICAgIGNvbnN0IHNhbml0aXplZEV2ZW50RmlsdGVyID0ge2tleTogZXZlbnRGaWx0ZXIua2V5fVxuXG4gICAgICBpZiAoZXZlbnRGaWx0ZXIuam9pbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzYW5pdGl6ZWRFdmVudEZpbHRlci5qb2lucyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWU+fSAqLyAoZXZlbnRGaWx0ZXIuam9pbnMpXG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudEZpbHRlci5zZWFyY2hlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNhbml0aXplZEV2ZW50RmlsdGVyLnNlYXJjaGVzID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxTZWFyY2hbXX0gKi8gKGV2ZW50RmlsdGVyLnNlYXJjaGVzKVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRGaWx0ZXIud2hlcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzYW5pdGl6ZWRFdmVudEZpbHRlci53aGVyZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWU+fSAqLyAoZXZlbnRGaWx0ZXIud2hlcmUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzYW5pdGl6ZWRFdmVudEZpbHRlclxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBmcm9udGVuZCBtb2RlbCBjb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx0eXBlb2YgaW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiKS5kZWZhdWx0Pn0gLSBGcm9udGVuZCBtb2RlbCBjb250cm9sbGVyIGNsYXNzLlxuICAgKi9cbiAgYXN5bmMgX2Zyb250ZW5kTW9kZWxDb250cm9sbGVyQ2xhc3MoKSB7XG4gICAgY29uc3QgZnJvbnRlbmRNb2RlbENvbnRyb2xsZXJQYXRoID0gXCIuLi9mcm9udGVuZC1tb2RlbC1jb250cm9sbGVyLmpzXCJcbiAgICBjb25zdCB7ZGVmYXVsdDogRnJvbnRlbmRNb2RlbENvbnRyb2xsZXJ9ID0gYXdhaXQgaW1wb3J0KGZyb250ZW5kTW9kZWxDb250cm9sbGVyUGF0aClcblxuICAgIHJldHVybiBGcm9udGVuZE1vZGVsQ29udHJvbGxlclxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgY29udHJvbGxlci5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBGcm9udGVuZE1vZGVsQ29udHJvbGxlciAtIFNlcnZlci1zaWRlIGZyb250ZW5kLW1vZGVsIGNvbnRyb2xsZXIgY2xhc3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbcGFyYW1zXSAtIE9wdGlvbmFsIHBhcmFtcyBvdmVycmlkZS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLWNvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gLSBTeW50aGV0aWMgY29udHJvbGxlciB1c2VkIGZvciByZXNvdXJjZSBzZXJpYWxpemF0aW9uLlxuICAgKi9cbiAgX2Zyb250ZW5kTW9kZWxDb250cm9sbGVyKEZyb250ZW5kTW9kZWxDb250cm9sbGVyLCBwYXJhbXMgPSB7fSkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLnNlc3Npb24uY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIoe1xuICAgICAgYWN0aW9uOiBcIndlYnNvY2tldEV2ZW50XCIsXG4gICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgY29udHJvbGxlcjogXCJmcm9udGVuZC1tb2RlbHNcIixcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBhYmlsaXRpZXM6IHRoaXMucGFyYW1zLmFiaWxpdGllcyxcbiAgICAgICAgam9pbnM6IHRoaXMucGFyYW1zLmpvaW5zLFxuICAgICAgICBtb2RlbDogdGhpcy5fbW9kZWxOYW1lKCksXG4gICAgICAgIHByZWxvYWQ6IHRoaXMucGFyYW1zLnByZWxvYWQsXG4gICAgICAgIHF1ZXJ5RGF0YTogdGhpcy5wYXJhbXMucXVlcnlEYXRhLFxuICAgICAgICBzZWFyY2hlczogdGhpcy5wYXJhbXMuc2VhcmNoZXMsXG4gICAgICAgIHNlbGVjdDogdGhpcy5wYXJhbXMuc2VsZWN0LFxuICAgICAgICBzZWxlY3RzRXh0cmE6IHRoaXMucGFyYW1zLnNlbGVjdHNFeHRyYSxcbiAgICAgICAgd2hlcmU6IHRoaXMucGFyYW1zLndoZXJlLFxuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHdpdGhDb3VudDogdGhpcy5wYXJhbXMud2l0aENvdW50XG4gICAgICB9LFxuICAgICAgcmVxdWVzdDogLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSAqLyAodGhpcy5fc3ludGhldGljUmVxdWVzdCgpKSxcbiAgICAgIHJlc3BvbnNlOiBuZXcgUmVzcG9uc2Uoe2NvbmZpZ3VyYXRpb259KSxcbiAgICAgIHZpZXdQYXRoOiBcIi9cIlxuICAgIH0pXG5cbiAgICBjb250cm9sbGVyLl9mcm9udGVuZE1vZGVsQWJpbGl0eU92ZXJyaWRlID0gdGhpcy5fYWJpbGl0eSB8fCB1bmRlZmluZWRcblxuICAgIHJldHVybiBjb250cm9sbGVyXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGVuYW50IGZvciBldmVudC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi91dGlscy9tb2RlbC1wcmltYXJ5LWtleS5qc1wiKS5Nb2RlbFByaW1hcnlLZXlWYWx1ZX0gaWQgLSBFdmVudCByZWNvcmQgaWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBSZXNvbHZlZCB0ZW5hbnQuXG4gICAqL1xuICBhc3luYyBfcmVzb2x2ZUV2ZW50VGVuYW50KGlkKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuc2Vzc2lvbi5jb25maWd1cmF0aW9uXG5cbiAgICByZXR1cm4gYXdhaXQgY29uZmlndXJhdGlvbi5lbnN1cmVDb25uZWN0aW9ucyh7bmFtZTogXCJGcm9udGVuZCBtb2RlbCB3ZWJzb2NrZXQgZXZlbnQgdGVuYW50IHJlc29sdXRpb25cIn0sIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIE1pcnJvciB0aGUgc3Vic2NyaWJlLXRpbWUgdGVuYW50IHJlc29sdXRpb24gKGBXZWJzb2NrZXRTZXNzaW9uLl9yZXNvbHZlVGVuYW50YCk6XG4gICAgICAvLyBwYXNzIGBzdWJzY3JpcHRpb246IHtjaGFubmVsLCBwYXJhbXN9YCBzbyByZXNvbHZlcnMgdGhhdCBkZXJpdmUgc2NvcGUgZnJvbSB0aGVcbiAgICAgIC8vIHN1YnNjcmlwdGlvbiBiZWhhdmUgdGhlIHNhbWUgZm9yIGJyb2FkY2FzdHMgYXMgdGhleSBkaWQgYXQgYGNoYW5uZWwtc3Vic2NyaWJlYC5cbiAgICAgIC8vIFRoZSBzeW50aGV0aWMgcmVxdWVzdCBmb3J3YXJkcyB0aGUgc3Vic2NyaWJlcidzIHBhcmFtcyAoZS5nLiBhdXRoZW50aWNhdGlvblRva2VuKSxcbiAgICAgIC8vIG1hdGNoaW5nIHRoaXMgY2hhbm5lbCdzIGFiaWxpdHkgcmVzb2x1dGlvbiBhYm92ZS5cbiAgICAgIHJldHVybiBhd2FpdCBjb25maWd1cmF0aW9uLnJlc29sdmVUZW5hbnQoe1xuICAgICAgICBwYXJhbXM6IHsuLi50aGlzLnBhcmFtcywgaWQsIG1vZGVsOiB0aGlzLl9tb2RlbE5hbWUoKX0sXG4gICAgICAgIHJlcXVlc3Q6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdH0gKi8gKHRoaXMuX3N5bnRoZXRpY1JlcXVlc3QoKSksXG4gICAgICAgIHJlc3BvbnNlOiBuZXcgUmVzcG9uc2Uoe2NvbmZpZ3VyYXRpb259KSxcbiAgICAgICAgc3Vic2NyaXB0aW9uOiB7Y2hhbm5lbDogRlJPTlRFTkRfTU9ERUxTX0NIQU5ORUxfTkFNRSwgcGFyYW1zOiB0aGlzLnBhcmFtc31cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgc3Vic2NyaWJlcidzIHRlbmFudCBmb3IgdGhlIGJyb2FkY2FzdCByZWNvcmQgYW5kIHJ1bnMgYGNhbGxiYWNrYCBpbnNpZGUgdGhhdCB0ZW5hbnRcbiAgICogY29udGV4dC4gQnJvYWRjYXN0IGRlbGl2ZXJ5IHJ1bnMgaW4gd2hhdGV2ZXIgYW1iaWVudCB0ZW5hbnQgY29udGV4dCB0aGUgcHVibGlzaGVyIGxlZnQgYmVoaW5kLiBGb3JcbiAgICogbXVsdGktdGVuYW50IHJlY29yZHMgdGhhdCBhbWJpZW50IHRlbmFudCBtYXkgaGF2ZSBiZWVuIHJlc29sdmVkIHdpdGhvdXQgdGhlIHN1YnNjcmliZXIncyByZXF1ZXN0XG4gICAqIChlLmcuIGEgcmVsYXkgZW5kcG9pbnQgb3IgYmFja2dyb3VuZCBqb2IgbXV0YXRpbmcgdGhlIHJvdyksIHNvIGl0IGxhY2tzIHRoZSBzdWJzY3JpYmVyJ3MgcGVyLXJlY29yZFxuICAgKiBhY2Nlc3MgZmxhZ3MgYW5kIHRoZSBwZXItZXZlbnQgYXV0aG9yaXphdGlvbiBxdWVyeSB3cm9uZ2x5IGZpbmRzIG5vdGhpbmcuIFJlLXJlc29sdmluZyB0aGUgdGVuYW50XG4gICAqIGZyb20gdGhlIGV2ZW50IHJlY29yZCBpZCBwbHVzIHRoZSBzdWJzY3JpYmVyJ3MgcmVxdWVzdCBtYWtlcyB0aGUgYXV0aG9yaXphdGlvbiBxdWVyaWVzIHJ1biBhZ2FpbnN0XG4gICAqIHRoZSBzdWJzY3JpYmVyJ3Mgb3duIHRlbmFudC9hYmlsaXR5IHNjb3BlLiBXaGVuIG5vIHRlbmFudCByZXNvbHZlcyAobm9uLW11bHRpdGVuYW50IGNvbmZpZ3MpLCB0aGVcbiAgICogY2FsbGJhY2sgcnVucyBkaXJlY3RseSBzbyB0aGUgYW1iaWVudCBjb250ZXh0IGlzIHByZXNlcnZlZC5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi91dGlscy9tb2RlbC1wcmltYXJ5LWtleS5qc1wiKS5Nb2RlbFByaW1hcnlLZXlWYWx1ZX0gaWQgLSBFdmVudCByZWNvcmQgaWQuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2sgLSBBdXRob3JpemVkLXF1ZXJ5IGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyBfd2l0aEV2ZW50VGVuYW50KGlkLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLnNlc3Npb24uY29uZmlndXJhdGlvblxuXG4gICAgaWYgKCFjb25maWd1cmF0aW9uIHx8IHR5cGVvZiBjb25maWd1cmF0aW9uLnJlc29sdmVUZW5hbnQgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9XG5cbiAgICBjb25zdCB0ZW5hbnQgPSBhd2FpdCB0aGlzLl9yZXNvbHZlRXZlbnRUZW5hbnQoaWQpXG5cbiAgICAvLyBBbHdheXMgZW50ZXIgYHJ1bldpdGhUZW5hbnRgLCBldmVuIHdoZW4gbm8gdGVuYW50IHJlc29sdmVkLiBCcm9hZGNhc3QgZmFuLW91dFxuICAgIC8vIHJ1bnMgaW4gdGhlIHB1Ymxpc2hlcidzIGFtYmllbnQgdGVuYW50IGNvbnRleHQ7IGZhbGxpbmcgYmFjayB0byBgY2FsbGJhY2soKWBcbiAgICAvLyB0aGVyZSB3b3VsZCBhdXRob3JpemUgYSBjcm9zcy10ZW5hbnQgcmVjb3JkIGFnYWluc3QgdGhlIHB1Ymxpc2hlcidzIHRlbmFudCBhbmRcbiAgICAvLyBjb3VsZCBsZWFrIGl0IHRvIGEgc3Vic2NyaWJlciB3aG9zZSBvd24gcmVzb2x2ZXIgY291bGQgbm90IHJlc29sdmUgaXQuXG4gICAgcmV0dXJuIGF3YWl0IGNvbmZpZ3VyYXRpb24ucnVuV2l0aFRlbmFudCh0ZW5hbnQsIGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCBjb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtuYW1lOiBcIkZyb250ZW5kIG1vZGVsIHdlYnNvY2tldCBldmVudCB0ZW5hbnRcIn0sIGNhbGxiYWNrKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBtYXRjaGVkIGV2ZW50IGZpbHRlciBrZXlzIGZvciBldmVudCBpZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi91dGlscy9tb2RlbC1wcmltYXJ5LWtleS5qc1wiKS5Nb2RlbFByaW1hcnlLZXlWYWx1ZX0gaWQgLSBFdmVudCByZWNvcmQgaWQuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLWNvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIgLSBTZXJ2ZXItc2lkZSBmcm9udGVuZC1tb2RlbCBjb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gRXZlbnQgZmlsdGVyIGtleXMgbWF0Y2hlZCBieSB0aGUgcmVjb3JkLlxuICAgKi9cbiAgYXN5bmMgX21hdGNoZWRFdmVudEZpbHRlcktleXNGb3JFdmVudElkKGlkLCBGcm9udGVuZE1vZGVsQ29udHJvbGxlcikge1xuICAgIC8qKlxuICAgICAqIE1hdGNoZWQgZXZlbnQgZmlsdGVyIGtleXMuXG4gICAgICogQHR5cGUge3N0cmluZ1tdfSAqL1xuICAgIGNvbnN0IG1hdGNoZWRFdmVudEZpbHRlcktleXMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBldmVudEZpbHRlciBvZiB0aGlzLl9ldmVudEZpbHRlcnMoKSkge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGF3YWl0IHRoaXMuX2V2ZW50TWF0Y2hlc0ZpbHRlcih7XG4gICAgICAgIEZyb250ZW5kTW9kZWxDb250cm9sbGVyLFxuICAgICAgICBldmVudEZpbHRlcixcbiAgICAgICAgaWRcbiAgICAgIH0pXG5cbiAgICAgIGlmIChtYXRjaGVzKSBtYXRjaGVkRXZlbnRGaWx0ZXJLZXlzLnB1c2goZXZlbnRGaWx0ZXIua2V5KVxuICAgIH1cblxuICAgIHJldHVybiBtYXRjaGVkRXZlbnRGaWx0ZXJLZXlzXG4gIH1cblxuICAvKipcbiAgICogUnVucyBldmVudCBtYXRjaGVzIGZpbHRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBGaWx0ZXIgYXJncy5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBhcmdzLkZyb250ZW5kTW9kZWxDb250cm9sbGVyIC0gU2VydmVyLXNpZGUgZnJvbnRlbmQtbW9kZWwgY29udHJvbGxlciBjbGFzcy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxFdmVudEZpbHRlclBheWxvYWRFbnRyeX0gYXJncy5ldmVudEZpbHRlciAtIEV2ZW50IGZpbHRlciBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL3V0aWxzL21vZGVsLXByaW1hcnkta2V5LmpzXCIpLk1vZGVsUHJpbWFyeUtleVZhbHVlfSBhcmdzLmlkIC0gRXZlbnQgcmVjb3JkIGlkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciB0aGUgcmVjb3JkIG1hdGNoZXMgdGhlIGZpbHRlci5cbiAgICovXG4gIGFzeW5jIF9ldmVudE1hdGNoZXNGaWx0ZXIoe0Zyb250ZW5kTW9kZWxDb250cm9sbGVyLCBldmVudEZpbHRlciwgaWR9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dpdGhFdmVudFRlbmFudChpZCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuX2Zyb250ZW5kTW9kZWxDb250cm9sbGVyKEZyb250ZW5kTW9kZWxDb250cm9sbGVyLCB7XG4gICAgICAgIGpvaW5zOiBldmVudEZpbHRlci5qb2lucyxcbiAgICAgICAgc2VhcmNoZXM6IGV2ZW50RmlsdGVyLnNlYXJjaGVzLFxuICAgICAgICB3aGVyZTogZXZlbnRGaWx0ZXIud2hlcmVcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IGNvbnRyb2xsZXIuZW5zdXJlRnJvbnRlbmRNb2RlbENsYXNzSW5pdGlhbGl6ZWQoKVxuXG4gICAgICBjb25zdCBNb2RlbENsYXNzID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsQ2xhc3MoKVxuICAgICAgY29uc3QgcHJpbWFyeUtleSA9IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbFByaW1hcnlLZXkoKVxuICAgICAgY29uc3Qgd2hlcmUgPSBjb250cm9sbGVyLmZyb250ZW5kTW9kZWxXaGVyZSgpXG4gICAgICBjb25zdCBqb2lucyA9IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbEpvaW5zKClcbiAgICAgIC8vIFN0YXJ0IGZyb20gdGhlIHN1YnNjcmliZXIncyBhdXRob3JpemVkIHNjb3BlIHNvIGEgZmlsdGVyIGNhbiBvbmx5IGV2ZXIgbWF0Y2ggcmVjb3JkcyB0aGVcbiAgICAgIC8vIHN1YnNjcmlwdGlvbidzIGFiaWxpdHkgcGVybWl0cyB0byByZWFkLlxuICAgICAgbGV0IHF1ZXJ5ID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsQXV0aG9yaXplZFF1ZXJ5KFwiZmluZFwiKS53aGVyZSh7XG4gICAgICAgIFtNb2RlbENsYXNzLnRhYmxlTmFtZSgpXTogZnJvbnRlbmRNb2RlbFByaW1hcnlLZXlEYXRhYmFzZUNvbmRpdGlvbnMoTW9kZWxDbGFzcywgcHJpbWFyeUtleSwgaWQpXG4gICAgICB9KVxuXG4gICAgICBpZiAod2hlcmUpIGNvbnRyb2xsZXIuYXBwbHlGcm9udGVuZE1vZGVsV2hlcmUoe3F1ZXJ5LCB3aGVyZX0pXG4gICAgICBpZiAoam9pbnMpIGNvbnRyb2xsZXIuYXBwbHlGcm9udGVuZE1vZGVsSm9pbnMoe2pvaW5zLCBxdWVyeX0pXG5cbiAgICAgIGZvciAoY29uc3Qgc2VhcmNoIG9mIGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbFNlYXJjaGVzKCkpIHtcbiAgICAgICAgY29udHJvbGxlci5hcHBseUZyb250ZW5kTW9kZWxTZWFyY2goe3F1ZXJ5LCBzZWFyY2h9KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gQm9vbGVhbihhd2FpdCBxdWVyeS5maXJzdCgpKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwcm9qZWN0ZWQgcmVjb3JkIGZvciBldmVudCBpZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi91dGlscy9tb2RlbC1wcmltYXJ5LWtleS5qc1wiKS5Nb2RlbFByaW1hcnlLZXlWYWx1ZX0gaWQgLSBFdmVudCByZWNvcmQgaWQuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2Zyb250ZW5kLW1vZGVsLWNvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIgLSBTZXJ2ZXItc2lkZSBmcm9udGVuZC1tb2RlbCBjb250cm9sbGVyIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT4gfCBudWxsPn0gLSBTZXJpYWxpemVkIHByb2plY3RlZCByZWNvcmQuXG4gICAqL1xuICBhc3luYyBfcHJvamVjdGVkUmVjb3JkRm9yRXZlbnRJZChpZCwgRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fd2l0aEV2ZW50VGVuYW50KGlkLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5fZnJvbnRlbmRNb2RlbENvbnRyb2xsZXIoRnJvbnRlbmRNb2RlbENvbnRyb2xsZXIpXG5cbiAgICAgIGF3YWl0IGNvbnRyb2xsZXIuZW5zdXJlRnJvbnRlbmRNb2RlbENsYXNzSW5pdGlhbGl6ZWQoKVxuXG4gICAgICBjb25zdCBNb2RlbENsYXNzID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsQ2xhc3MoKVxuICAgICAgY29uc3QgcHJpbWFyeUtleSA9IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbFByaW1hcnlLZXkoKVxuICAgICAgLy8gUmVsb2FkIHRocm91Z2ggdGhlIHN1YnNjcmliZXIncyBhdXRob3JpemVkIHNjb3BlIHNvIHByb2plY3RlZCByZWNvcmRzIGFyZSBvbmx5IGV2ZXIgc2VudCBmb3JcbiAgICAgIC8vIHJvd3MgdGhlIHN1YnNjcmlwdGlvbidzIGFiaWxpdHkgcGVybWl0cyB0byByZWFkLlxuICAgICAgbGV0IHF1ZXJ5ID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsQXV0aG9yaXplZFF1ZXJ5KFwiZmluZFwiKS53aGVyZSh7XG4gICAgICAgIFtNb2RlbENsYXNzLnRhYmxlTmFtZSgpXTogZnJvbnRlbmRNb2RlbFByaW1hcnlLZXlEYXRhYmFzZUNvbmRpdGlvbnMoTW9kZWxDbGFzcywgcHJpbWFyeUtleSwgaWQpXG4gICAgICB9KVxuICAgICAgY29uc3QgcHJlbG9hZCA9IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbFByZWxvYWQoKVxuXG4gICAgICBpZiAocHJlbG9hZCkgcXVlcnkgPSBxdWVyeS5wcmVsb2FkKHByZWxvYWQpXG5cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgY29udHJvbGxlci5mcm9udGVuZE1vZGVsV2l0aENvdW50KCkpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWMuXG4gICAgICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwge3JlbGF0aW9uc2hpcD86IHN0cmluZywgd2hlcmU/OiBSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT59Pn0gKi9cbiAgICAgICAgY29uc3Qgc3BlYyA9IHt9XG5cbiAgICAgICAgc3BlY1tlbnRyeS5hdHRyaWJ1dGVOYW1lXSA9IHtcbiAgICAgICAgICByZWxhdGlvbnNoaXA6IGVudHJ5LnJlbGF0aW9uc2hpcE5hbWUsXG4gICAgICAgICAgd2hlcmU6IGVudHJ5LndoZXJlID8gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT59ICovIChlbnRyeS53aGVyZSkgOiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgICBxdWVyeS53aXRoQ291bnQoc3BlYylcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnlEYXRhID0gY29udHJvbGxlci5mcm9udGVuZE1vZGVsUXVlcnlEYXRhKClcblxuICAgICAgaWYgKHF1ZXJ5RGF0YSAhPT0gbnVsbCkgcXVlcnkucXVlcnlEYXRhKHF1ZXJ5RGF0YSlcblxuICAgICAgcXVlcnkgPSBjb250cm9sbGVyLmFwcGx5RnJvbnRlbmRNb2RlbFRyYW5zbGF0ZWRBdHRyaWJ1dGVQcmVsb2Fkcyh7cXVlcnl9KVxuXG4gICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHF1ZXJ5LmZpcnN0KClcblxuICAgICAgaWYgKCFtb2RlbCkgcmV0dXJuIG51bGxcblxuICAgICAgaWYgKHRoaXMucGFyYW1zLmFiaWxpdGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGF3YWl0IGNvbnRyb2xsZXIuZnJvbnRlbmRNb2RlbENvbXB1dGVBYmlsaXRpZXMoW21vZGVsXSlcbiAgICAgIH1cblxuICAgICAgY29udHJvbGxlci5fZnJvbnRlbmRNb2RlbEFiaWxpdHlPdmVycmlkZSA9IHVuZGVmaW5lZFxuXG4gICAgICByZXR1cm4gYXdhaXQgY29udHJvbGxlci5mcm9udGVuZE1vZGVsUmVzb3VyY2VJbnN0YW5jZSgpLnNlcmlhbGl6ZShtb2RlbCwgXCJmaW5kXCIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBNaW5pbWFsIFJlcXVlc3QtbGlrZSBzdHViIHVzZWQgb25seSBmb3IgYWJpbGl0eSByZXNvbHV0aW9uLiBBdm9pZHNcbiAgICogaW1wb3J0aW5nIGBXZWJzb2NrZXRSZXF1ZXN0YCBoZXJlIGJlY2F1c2UgaXRzIGBub2RlOnF1ZXJ5c3RyaW5nYFxuICAgKiBkZXBlbmRlbmN5IHdvdWxkIHB1bGwgc2VydmVyLW9ubHkgY29kZSBpbnRvIGJyb3dzZXIgYnVuZGxlcyB2aWFcbiAgICogdGhlIGBjb25maWd1cmF0aW9uIOKGkiBsb2dnZXIg4oaSIHdlYnNvY2tldC1wdWJsaXNoZXJzYCBpbXBvcnQgY2hhaW4uXG4gICAqIEhlYWRlciBuYW1lcyBhcmUgbm9ybWFsaXplZCB0byBsb3dlcmNhc2Ugc28gYGhlYWRlcihcImNvb2tpZVwiKWBcbiAgICogZmluZHMgYSB2YWx1ZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHVwZ3JhZGUtcmVxdWVzdCBoZWFkZXJzXG4gICAqIG1hcCB1c2VzIGBcIkNvb2tpZVwiYCBvciBgXCJjb29raWVcImAuIFNlc3Npb24gbWV0YWRhdGEgc3RheXMgc2VwYXJhdGVcbiAgICogZnJvbSBoZWFkZXJzIGFuZCBpcyBleHBvc2VkIHRocm91Z2ggYG1ldGFkYXRhKC4uLilgIGZvciBhYmlsaXR5XG4gICAqIHJlc29sdmVycyB0aGF0IG5lZWQgd2Vic29ja2V0LWRlbGl2ZXJlZCBzZXNzaW9uIGRhdGEuXG4gICAqIEByZXR1cm5zIHtGcm9udGVuZE1vZGVsV2Vic29ja2V0U3ludGhldGljUmVxdWVzdH0gUmVxdWVzdC1saWtlIG9iamVjdCBmb3IgYWJpbGl0eSByZXNvbHV0aW9uLlxuICAgKi9cbiAgX3N5bnRoZXRpY1JlcXVlc3QoKSB7XG4gICAgY29uc3QgdXBncmFkZVJlcXVlc3QgPSAvKiogQHR5cGUge0Zyb250ZW5kTW9kZWxXZWJzb2NrZXRVcGdyYWRlUmVxdWVzdH0gKi8gKHRoaXMuc2Vzc2lvbi51cGdyYWRlUmVxdWVzdClcbiAgICBjb25zdCByYXdIZWFkZXJzID0gdHlwZW9mIHVwZ3JhZGVSZXF1ZXN0Py5oZWFkZXJzID09PSBcImZ1bmN0aW9uXCIgPyB1cGdyYWRlUmVxdWVzdC5oZWFkZXJzKCkgOiB7fVxuICAgIGNvbnN0IG1ldGFkYXRhID0gdHlwZW9mIHRoaXMuc2Vzc2lvbi5nZXRNZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiID8gdGhpcy5zZXNzaW9uLmdldE1ldGFkYXRhKCkgOiB7fVxuICAgIGNvbnN0IHJlbW90ZUFkZHJlc3MgPSB0eXBlb2YgdXBncmFkZVJlcXVlc3Q/LnJlbW90ZUFkZHJlc3MgPT09IFwiZnVuY3Rpb25cIiA/IHVwZ3JhZGVSZXF1ZXN0LnJlbW90ZUFkZHJlc3MoKSA6IHVuZGVmaW5lZFxuICAgIC8qKlxuICAgICAqIEhlYWRlciBtYXAuXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPn0gKi9cbiAgICBjb25zdCBoZWFkZXJNYXAgPSB7fVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmF3SGVhZGVycyB8fCB7fSkpIHtcbiAgICAgIGhlYWRlck1hcFtrZXkudG9Mb3dlckNhc2UoKV0gPSByYXdIZWFkZXJzW2tleV1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaGVhZGVyczogKCkgPT4gaGVhZGVyTWFwLFxuICAgICAgaGVhZGVyOiAobmFtZSkgPT4gaGVhZGVyTWFwW1N0cmluZyhuYW1lKS50b0xvd2VyQ2FzZSgpXSxcbiAgICAgIG1ldGFkYXRhOiAoa2V5KSA9PiBrZXkgPT09IHVuZGVmaW5lZCA/IHsuLi5tZXRhZGF0YX0gOiBtZXRhZGF0YVtrZXldLFxuICAgICAgcGF0aDogKCkgPT4gXCIvZnJvbnRlbmQtbW9kZWxzXCIsXG4gICAgICBodHRwTWV0aG9kOiAoKSA9PiBcIlBPU1RcIixcbiAgICAgIHJlbW90ZUFkZHJlc3M6ICgpID0+IHJlbW90ZUFkZHJlc3MsXG4gICAgICBvcmlnaW46ICgpID0+IGhlYWRlck1hcC5vcmlnaW5cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -537,8 +537,13 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
537
537
|
_handleChannelSubscribe(message: Record<string, ReturnType<typeof JSON.parse>>): Promise<void>;
|
|
538
538
|
/**
|
|
539
539
|
* Replays missed events from the persistent event-log store for a
|
|
540
|
-
* channel subscription that provided `lastEventId`.
|
|
541
|
-
*
|
|
540
|
+
* channel subscription that provided `lastEventId`. Delivery is
|
|
541
|
+
* stream-scoped: each persisted event's broadcast params are
|
|
542
|
+
* re-applied through the subscription's `matches()` — the same routing
|
|
543
|
+
* decision live delivery uses — so the subscription only replays events
|
|
544
|
+
* from its own stream of the channel. A checkpoint that belongs to a
|
|
545
|
+
* different stream (or is no longer retained) yields
|
|
546
|
+
* `channel-replay-gap` instead of cross-stream replay.
|
|
542
547
|
* @param {object} args - Options.
|
|
543
548
|
* @param {string} args.channelType - Channel type name (event-log key).
|
|
544
549
|
* @param {string} args.lastEventId - Client's last-seen event id.
|
|
@@ -550,6 +555,24 @@ export default class VelociousHttpServerClientWebsocketSession {
|
|
|
550
555
|
lastEventId: string;
|
|
551
556
|
subscription: import("../websocket-channel.js").default;
|
|
552
557
|
}): Promise<void>;
|
|
558
|
+
/**
|
|
559
|
+
* Whether a persisted replay event belongs to this subscription's
|
|
560
|
+
* stream. A `matches()` failure means the stream membership cannot be
|
|
561
|
+
* proven, so the event is treated as not matching — the same isolation
|
|
562
|
+
* live delivery applies to a broken `matches()`.
|
|
563
|
+
* @param {object} args - Options.
|
|
564
|
+
* @param {string} args.channelType - Channel type name.
|
|
565
|
+
* @param {{params: Record<string, ReturnType<typeof JSON.parse>> | null}} args.event - Persisted replay event.
|
|
566
|
+
* @param {import("../websocket-channel.js").default} args.subscription - Live subscription.
|
|
567
|
+
* @returns {boolean} - Whether the event belongs to the subscription's stream.
|
|
568
|
+
*/
|
|
569
|
+
_replayEventMatchesSubscription({ channelType, event, subscription }: {
|
|
570
|
+
channelType: string;
|
|
571
|
+
event: {
|
|
572
|
+
params: Record<string, ReturnType<typeof JSON.parse>> | null;
|
|
573
|
+
};
|
|
574
|
+
subscription: import("../websocket-channel.js").default;
|
|
575
|
+
}): boolean;
|
|
553
576
|
/**
|
|
554
577
|
* Handles `{type: "channel-unsubscribe"}` from the client — calls
|
|
555
578
|
* `unsubscribed()` and sends `channel-unsubscribed`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-session.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/websocket-session.js"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"websocket-session.d.ts","sourceRoot":"","sources":["../../../../src/http-server/client/websocket-session.js"],"names":[],"mappings":"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"}
|