velocious 1.0.700 → 1.0.701
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/configuration-types.js +1 -1
- package/build/configuration.js +52 -17
- package/build/src/configuration-types.d.ts +2 -2
- package/build/src/configuration-types.js +2 -2
- package/build/src/configuration.d.ts +11 -0
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +50 -17
- package/package.json +1 -1
- package/src/configuration-types.js +1 -1
- package/src/configuration.js +52 -17
|
@@ -329,7 +329,7 @@
|
|
|
329
329
|
* @property {string} [host] - Hostname to bind the HTTP server to.
|
|
330
330
|
* @property {boolean} [inProcess] - Run HTTP handlers in the main thread instead of worker threads.
|
|
331
331
|
* @property {number} [maxBufferedResponseBodyBytes] - Maximum UTF-8/binary byte length accepted by buffered response bodies. Unbounded when absent; streamed file responses are unaffected.
|
|
332
|
-
* @property {number} [maxRequestBodyBytes] - Maximum decoded request-body bytes accepted before routing. Unbounded when absent.
|
|
332
|
+
* @property {number} [maxRequestBodyBytes] - Maximum decoded request-body bytes accepted before routing. Unbounded when absent, except the built-in MCP endpoint, which defaults to a 1 MiB cap that this option overrides.
|
|
333
333
|
* @property {HttpRequestBodyPolicyResolver} [requestBodyPolicyResolver] - Optional synchronous header-stage resolver for per-request limits and raw-body handling.
|
|
334
334
|
* @property {number} [maxWorkers] - Backward-compatible alias for workers.
|
|
335
335
|
* @property {number} [port] - Port to bind the HTTP server to.
|
package/build/configuration.js
CHANGED
|
@@ -229,6 +229,14 @@ function normalizeHttpCompression(value) {
|
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
231
|
|
|
232
|
+
/**
|
|
233
|
+
* Default request-body limit for the built-in MCP endpoint. JSON-RPC messages are small,
|
|
234
|
+
* so the framework caps them instead of making every app that enables `mcp: true` restate
|
|
235
|
+
* a request-body policy. Explicit `httpServer.maxRequestBodyBytes` or a resolver limit wins.
|
|
236
|
+
* @type {number}
|
|
237
|
+
*/
|
|
238
|
+
const DEFAULT_MCP_MAX_REQUEST_BODY_BYTES = 1024 * 1024
|
|
239
|
+
|
|
232
240
|
export default class VelociousConfiguration {
|
|
233
241
|
/**
|
|
234
242
|
* Close database connections promise.
|
|
@@ -776,31 +784,58 @@ export default class VelociousConfiguration {
|
|
|
776
784
|
resolveHttpRequestBodyPolicy(args) {
|
|
777
785
|
const resolver = this.httpServer.requestBodyPolicyResolver
|
|
778
786
|
const configuredPolicy = resolver ? resolver(args) : undefined
|
|
787
|
+
/** @type {import("./configuration-types.js").ResolvedHttpRequestBodyPolicy} */
|
|
788
|
+
let resolvedPolicy
|
|
779
789
|
|
|
780
790
|
if (configuredPolicy === undefined) {
|
|
781
|
-
|
|
782
|
-
}
|
|
791
|
+
resolvedPolicy = {maxRequestBodyBytes: this.httpServer.maxRequestBodyBytes, mode: "parsed"}
|
|
792
|
+
} else {
|
|
793
|
+
if (!configuredPolicy || typeof configuredPolicy !== "object" || Array.isArray(configuredPolicy)) {
|
|
794
|
+
throw new TypeError("httpServer.requestBodyPolicyResolver must return an object or undefined")
|
|
795
|
+
}
|
|
783
796
|
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
}
|
|
797
|
+
const {maxRequestBodyBytes, mode = "parsed", ...restPolicy} = configuredPolicy
|
|
798
|
+
const unknownKeys = Object.keys(restPolicy)
|
|
787
799
|
|
|
788
|
-
|
|
789
|
-
|
|
800
|
+
if (unknownKeys.length > 0) {
|
|
801
|
+
throw new TypeError(`httpServer.requestBodyPolicyResolver returned unknown keys: ${unknownKeys.join(", ")} (supported: maxRequestBodyBytes, mode)`)
|
|
802
|
+
}
|
|
803
|
+
if (mode !== "parsed" && mode !== "raw") {
|
|
804
|
+
throw new TypeError(`httpServer.requestBodyPolicyResolver mode must be "parsed" or "raw", got: ${String(mode)}`)
|
|
805
|
+
}
|
|
790
806
|
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
807
|
+
resolvedPolicy = {
|
|
808
|
+
maxRequestBodyBytes: maxRequestBodyBytes === undefined
|
|
809
|
+
? this.httpServer.maxRequestBodyBytes
|
|
810
|
+
: optionalPositiveSafeInteger(maxRequestBodyBytes, "httpServer.requestBodyPolicyResolver maxRequestBodyBytes"),
|
|
811
|
+
mode
|
|
812
|
+
}
|
|
796
813
|
}
|
|
797
814
|
|
|
798
|
-
return {
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
815
|
+
return this._applyMcpRequestBodyPolicyDefaults({args, policy: resolvedPolicy})
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
/**
|
|
819
|
+
* Enforces the built-in MCP endpoint's body contract without per-app plumbing: the
|
|
820
|
+
* JSON-RPC envelope is read from parsed params, so raw mode is rejected with an
|
|
821
|
+
* actionable error, and a framework default byte cap applies when the app configured none.
|
|
822
|
+
* @param {{args: import("./configuration-types.js").HttpRequestBodyPolicyResolverArgs, policy: import("./configuration-types.js").ResolvedHttpRequestBodyPolicy}} options - Resolution inputs.
|
|
823
|
+
* @returns {import("./configuration-types.js").ResolvedHttpRequestBodyPolicy} - Effective request policy.
|
|
824
|
+
*/
|
|
825
|
+
_applyMcpRequestBodyPolicyDefaults({args, policy}) {
|
|
826
|
+
if (!this._mcp.enabled) return policy
|
|
827
|
+
if (args.httpMethod !== "POST") return policy
|
|
828
|
+
if (args.path.split("?")[0] !== this._mcp.path) return policy
|
|
829
|
+
|
|
830
|
+
if (policy.mode === "raw") {
|
|
831
|
+
throw new TypeError(
|
|
832
|
+
`The built-in MCP endpoint at ${this._mcp.path} requires parsed request bodies because its JSON-RPC envelope is read from params. Remove the raw-mode httpServer.requestBodyPolicyResolver entry for this path.`
|
|
833
|
+
)
|
|
803
834
|
}
|
|
835
|
+
|
|
836
|
+
if (policy.maxRequestBodyBytes !== undefined) return policy
|
|
837
|
+
|
|
838
|
+
return {maxRequestBodyBytes: DEFAULT_MCP_MAX_REQUEST_BODY_BYTES, mode: policy.mode}
|
|
804
839
|
}
|
|
805
840
|
|
|
806
841
|
/**
|
|
@@ -678,7 +678,7 @@ export type HttpServerConfiguration = {
|
|
|
678
678
|
*/
|
|
679
679
|
maxBufferedResponseBodyBytes?: number;
|
|
680
680
|
/**
|
|
681
|
-
* - Maximum decoded request-body bytes accepted before routing. Unbounded when absent.
|
|
681
|
+
* - Maximum decoded request-body bytes accepted before routing. Unbounded when absent, except the built-in MCP endpoint, which defaults to a 1 MiB cap that this option overrides.
|
|
682
682
|
*/
|
|
683
683
|
maxRequestBodyBytes?: number;
|
|
684
684
|
/**
|
|
@@ -2148,7 +2148,7 @@ export type ConfigurationArgsType = {
|
|
|
2148
2148
|
* @property {string} [host] - Hostname to bind the HTTP server to.
|
|
2149
2149
|
* @property {boolean} [inProcess] - Run HTTP handlers in the main thread instead of worker threads.
|
|
2150
2150
|
* @property {number} [maxBufferedResponseBodyBytes] - Maximum UTF-8/binary byte length accepted by buffered response bodies. Unbounded when absent; streamed file responses are unaffected.
|
|
2151
|
-
* @property {number} [maxRequestBodyBytes] - Maximum decoded request-body bytes accepted before routing. Unbounded when absent.
|
|
2151
|
+
* @property {number} [maxRequestBodyBytes] - Maximum decoded request-body bytes accepted before routing. Unbounded when absent, except the built-in MCP endpoint, which defaults to a 1 MiB cap that this option overrides.
|
|
2152
2152
|
* @property {HttpRequestBodyPolicyResolver} [requestBodyPolicyResolver] - Optional synchronous header-stage resolver for per-request limits and raw-body handling.
|
|
2153
2153
|
* @property {number} [maxWorkers] - Backward-compatible alias for workers.
|
|
2154
2154
|
* @property {number} [port] - Port to bind the HTTP server to.
|
|
@@ -300,7 +300,7 @@
|
|
|
300
300
|
* @property {string} [host] - Hostname to bind the HTTP server to.
|
|
301
301
|
* @property {boolean} [inProcess] - Run HTTP handlers in the main thread instead of worker threads.
|
|
302
302
|
* @property {number} [maxBufferedResponseBodyBytes] - Maximum UTF-8/binary byte length accepted by buffered response bodies. Unbounded when absent; streamed file responses are unaffected.
|
|
303
|
-
* @property {number} [maxRequestBodyBytes] - Maximum decoded request-body bytes accepted before routing. Unbounded when absent.
|
|
303
|
+
* @property {number} [maxRequestBodyBytes] - Maximum decoded request-body bytes accepted before routing. Unbounded when absent, except the built-in MCP endpoint, which defaults to a 1 MiB cap that this option overrides.
|
|
304
304
|
* @property {HttpRequestBodyPolicyResolver} [requestBodyPolicyResolver] - Optional synchronous header-stage resolver for per-request limits and raw-body handling.
|
|
305
305
|
* @property {number} [maxWorkers] - Backward-compatible alias for workers.
|
|
306
306
|
* @property {number} [port] - Port to bind the HTTP server to.
|
|
@@ -751,4 +751,4 @@
|
|
|
751
751
|
* @property {WebsocketMessageHandlerResolverType} [websocketMessageHandlerResolver] - Resolve a raw websocket message handler for each connection.
|
|
752
752
|
*/
|
|
753
753
|
export const nothing = {};
|
|
754
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWd1cmF0aW9uLXR5cGVzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7R0FFRztBQUVIOzs7OztHQUtHO0FBRUg7O0dBRUc7QUFFSDs7R0FFRztBQUVIOzs7Ozs7R0FNRztBQUVIOztHQUVHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0NHO0FBRUg7O0dBRUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7OztHQUlHO0FBRUg7Ozs7R0FJRztBQUVIOztHQUVHO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7R0FJRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUgsNERBQTREO0FBQzVELHlGQUF5RjtBQUN6Riw4SkFBOEo7QUFDOUosK0ZBQStGO0FBRS9GOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdGRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBQ0g7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUVILDhIQUE4SDtBQUU5SDs7OztHQUlHO0FBRUg7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUVIOzs7R0FHRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSDs7R0FFRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7R0FFRztBQUVIOztHQUVHO0FBRUg7OztHQUdHO0FBRUg7O0dBRUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUdIOztHQUVHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7R0FJRztBQUVIOzs7R0FHRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7R0FHRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUVIOzs7R0FHRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOztHQUVHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7R0FFRztBQUVIOztHQUVHO0FBRUg7O0dBRUc7QUFFSDs7R0FFRztBQUVIOztHQUVHO0FBRUg7Ozs7R0FJRztBQUNIOzs7O0dBSUc7QUFHSDs7OztHQUlHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7R0FFRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdERztBQUVILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAbW9kdWxlIHR5cGVzXG4gKi9cblxuLyoqXG4gKiBJbW11dGFibGUgaWRlbnRpdHkgc2hhcmVkIGJ5IGFwcGxpY2F0aW9uIGluaXRpYWxpemVycyBmb3Igb25lIHByb2Nlc3MgbGlmZWN5Y2xlLlxuICogQHR5cGVkZWYge29iamVjdH0gQXBwbGljYXRpb25Qcm9jZXNzQ29udGV4dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSBHZW5lcmljIHByb2Nlc3MgdHlwZSBzdXBwbGllZCB0byBgY29uZmlndXJhdGlvbi5pbml0aWFsaXplKClgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGluc3RhbmNlSWQgLSBPcGFxdWUgaWRlbnRpdHkgdW5pcXVlIHRvIHRoaXMgbGlmZWN5Y2xlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhhcmdzOiB7cmVxdWVzdDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdCwgcmVzcG9uc2U6IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzXCIpLmRlZmF1bHR9KSA9PiBQcm9taXNlPHZvaWQ+fSBDb3JzVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhhcmdzOiB7cmVxdWVzdDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCwgc3Vic2NyaXB0aW9uPzoge2NoYW5uZWw6IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSwgY2xpZW50OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9pbmRleC5qc1wiKS5kZWZhdWx0LCB3ZWJzb2NrZXRTZXNzaW9uOiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtc2Vzc2lvbi5qc1wiKS5kZWZhdWx0LCBjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0pID0+IHR5cGVvZiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHQgfCB2b2lkIHwgUHJvbWlzZTx0eXBlb2YgaW1wb3J0KFwiLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0IHwgdm9pZD59IFdlYnNvY2tldENoYW5uZWxSZXNvbHZlclR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYnNvY2tldE1lc3NhZ2VIYW5kbGVyXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7bWVzc2FnZTogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIHNlc3Npb246IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzXCIpLmRlZmF1bHR9KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZH0gW29uTWVzc2FnZV0gLSBIYW5kbGVyIGZvciBpbmNvbWluZyB3ZWJzb2NrZXQgbWVzc2FnZXMuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7c2Vzc2lvbjogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXNlc3Npb24uanNcIikuZGVmYXVsdH0pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkfSBbb25PcGVuXSAtIEhhbmRsZXIgd2hlbiB0aGUgd2Vic29ja2V0IHNlc3Npb24gb3BlbnMuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7c2Vzc2lvbjogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXNlc3Npb24uanNcIikuZGVmYXVsdH0pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkfSBbb25DbG9zZV0gLSBIYW5kbGVyIHdoZW4gdGhlIHdlYnNvY2tldCBzZXNzaW9uIGNsb3Nlcy5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHtlcnJvcjogRXJyb3IsIHNlc3Npb246IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzXCIpLmRlZmF1bHR9KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZH0gW29uRXJyb3JdIC0gSGFuZGxlciB3aGVuIGEgd2Vic29ja2V0IG1lc3NhZ2UgZXJyb3JzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhhcmdzOiB7cmVxdWVzdDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCwgY2xpZW50OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9pbmRleC5qc1wiKS5kZWZhdWx0LCBjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0pID0+IFdlYnNvY2tldE1lc3NhZ2VIYW5kbGVyIHwgdm9pZCB8IFByb21pc2U8V2Vic29ja2V0TWVzc2FnZUhhbmRsZXIgfCB2b2lkPn0gV2Vic29ja2V0TWVzc2FnZUhhbmRsZXJSZXNvbHZlclR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoaWQ6IHN0cmluZykgPT4ge2RlZmF1bHQ6IHR5cGVvZiBpbXBvcnQoXCIuL2luaXRpYWxpemVyLmpzXCIpLmRlZmF1bHR9fSBJbml0aWFsaXplcnNSZXF1aXJlQ29udGV4dFR5cGVcbiAqIEB0eXBlZGVmIHtJbml0aWFsaXplcnNSZXF1aXJlQ29udGV4dFR5cGUgJiB7XG4gKiAgIGtleXM6ICgpID0+IHN0cmluZ1tdLFxuICogICBpZDogc3RyaW5nXG4gKiB9fSBXZWJwYWNrUmVxdWlyZUNvbnRleHRcbiAqIEB0eXBlZGVmIHt7cmVxdWlyZUNvbnRleHQ6IFdlYnBhY2tSZXF1aXJlQ29udGV4dH19IEluaXRpYWxpemVyc0V4cG9ydFR5cGVcbiAqIEB0eXBlZGVmIHsoYXJnczoge2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSkgPT4gUHJvbWlzZTxJbml0aWFsaXplcnNFeHBvcnRUeXBlPn0gSW5pdGlhbGl6ZXJzVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3FsQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFiYXNlXSAtIERhdGFiYXNlIG5hbWUgZm9yIHRoZSBTUUwgZHJpdmVyLlxuICogQHByb3BlcnR5IHtvYmplY3R9IFtvcHRpb25zXSAtIERyaXZlci1zcGVjaWZpYyBjb25uZWN0aW9uIG9wdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvcHRpb25zLmVuY3J5cHRdIC0gV2hldGhlciB0byBlbmNyeXB0IHRoZSBjb25uZWN0aW9uIChNU1NRTCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW29wdGlvbnMuc2NoZW1hXSAtIERlZmF1bHQgc2NoZW1hIGZvciB1bnF1YWxpZmllZCB0YWJsZSBsb29rdXBzIChNU1NRTCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW29wdGlvbnMuc2VydmVyTmFtZV0gLSBUTFMgU05JIHNlcnZlciBuYW1lIG92ZXJyaWRlIGZvciBNU1NRTCAoZW1wdHkgc3RyaW5nIGRpc2FibGVzIFNOSSkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGVdIC0gV2hldGhlciB0byB0cnVzdCB0aGUgc2VydmVyIGNlcnRpZmljYXRlIChNU1NRTCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Bhc3N3b3JkXSAtIFBhc3N3b3JkIGZvciB0aGUgU1FMIHVzZXIuXG4gKiBAcHJvcGVydHkge29iamVjdH0gW3Bvb2xdIC0gQ29ubmVjdGlvbiBwb29sIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IFtwb29sLm1heF0gLSBNYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucy4gU2V0IG51bGwgdG8gZGlzYWJsZSB0aGUgY2FwLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb29sLm1pbl0gLSBNaW5pbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9vbC5pZGxlVGltZW91dE1pbGxpc10gLSBJZGxlIHRpbWVvdXQgYmVmb3JlIHJlbGVhc2luZyBhIGNvbm5lY3Rpb24uXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IFtwb29sLmNoZWNrb3V0VGltZW91dE1pbGxpc10gLSBUaW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIGFuIGF2YWlsYWJsZSBjb25uZWN0aW9uIGFmdGVyIHRoZSBtYXggY29ubmVjdGlvbiBjYXAgaXMgcmVhY2hlZC4gU2V0IG51bGwgdG8gd2FpdCBpbmRlZmluaXRlbHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlcnZlcl0gLSBTUUwgc2VydmVyIGhvc3RuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1c2VyXSAtIFNRTCB1c2VybmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERhdGFiYXNlUG9vbENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gW2NoZWNrb3V0VGltZW91dE1pbGxpc10gLSBUaW1lb3V0IHdoaWxlIGEgY2hlY2tvdXQgd2FpdHMgZm9yIGFuIGF2YWlsYWJsZSBhc3luYy10cmFja2VkIGNvbm5lY3Rpb24gYWZ0ZXIgdGhlIG1heCBsaXZlIGNvbm5lY3Rpb24gY2FwIGlzIHJlYWNoZWQuIFNldCBudWxsIHRvIHdhaXQgaW5kZWZpbml0ZWx5LiBEZWZhdWx0OiAxMDAwMC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gW2lkbGVUaW1lb3V0TWlsbGlzXSAtIElkbGUgdGltZW91dCBiZWZvcmUgY2xvc2luZyBhIGNoZWNrZWQtaW4gYXN5bmMtdHJhY2tlZCBjb25uZWN0aW9uLiBTZXQgbnVsbCB0byBkaXNhYmxlIGlkbGUgcmVhcGluZy4gRGVmYXVsdDogNTAwMC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gW21heF0gLSBNYXhpbXVtIGxpdmUgYXN5bmMtdHJhY2tlZCBjb25uZWN0aW9ucyBmb3IgdGhpcyBwb29sLiBEZWZhdWx0cyB0byAxMC4gRXh0cmEgY2hlY2tvdXRzIHdhaXQgdW50aWwgYSBtYXRjaGluZyBjb25uZWN0aW9uIGlzIGNoZWNrZWQgaW4gb3IgY2FwYWNpdHkgaXMgZnJlZWQuIFNldCBudWxsIHRvIGRpc2FibGUgdGhlIGNhcC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gW2Fkdmlzb3J5TG9ja0FjcXVpcmVUaW1lb3V0TXNdIC0gQm91bmQgKG1zKSBhIGJsb2NraW5nIGFkdmlzb3J5LWxvY2sgYWNxdWlzaXRpb24gd2FpdHMgZm9yIGEgY29udGVuZGVkIGxvY2sgYmVmb3JlIHJlcG9ydGluZyBmYWlsdXJlLiBEZWZhdWx0OiBgOTAwMDAwYCAoMTUgbWludXRlcykuIGBudWxsYCBvcHRzIG91dCBhbmQgcmVzdG9yZXMgdGhlIGRyaXZlcidzIGluZGVmaW5pdGUgd2FpdC4gQSBwZXItY2FsbCBgdGltZW91dE1zYCBhcmd1bWVudCBhbHdheXMgb3ZlcnJpZGVzIHRoaXMuXG4gKiBAcHJvcGVydHkge3tzbG93QWNxdWlyZU1zPzogbnVtYmVyIHwgbnVsbCwgc2xvd0hvbGRNcz86IG51bWJlciB8IG51bGx9fSBbYWR2aXNvcnlMb2NrVGVsZW1ldHJ5XSAtIEV2ZW50LWRyaXZlbiBhZHZpc29yeS1sb2NrIGR1cmF0aW9uIHRlbGVtZXRyeSB0aHJlc2hvbGRzLiBgc2xvd0FjcXVpcmVNc2AgKGRlZmF1bHQgYDUwMDBgKSByZXBvcnRzIGFuIGFjcXVpcmUgd2FpdCB0aGF0IGNvbXBsZXRlZCBzbG93ZXIgdGhhbiB0aGUgdGhyZXNob2xkLCBpbmNsdWRpbmcgdGhlIGV2ZW50dWFsIG91dGNvbWU7IGBhZHZpc29yeS1sb2NrLWFjcXVpcmUtdGltZW91dGAgYWx3YXlzIGZpcmVzIHdoZW4gYSB3YWl0IGV4Y2VlZHMgaXRzIGJvdW5kIGFuZCBjYXJyaWVzIHRoZSBob2xkZXIgaWRlbnRpdHkgYXZhaWxhYmxlIG9uIHRoZSB0aWVyIGF0IHRoYXQgbW9tZW50LiBgc2xvd0hvbGRNc2AgKGRlZmF1bHQgYDYwMDAwYCkgcmVwb3J0cyBhIGhvbGQgdGhhdCBvdXRsaXZlcyB0aGUgdGhyZXNob2xkIGF0IHJlbGVhc2UuIGBudWxsYCBkaXNhYmxlcyB0aGF0IHJlcG9ydC4gUmVwb3J0cyBmaXJlIG9uIHRoZSBldmVudHMgdGhlbXNlbHZlcyDigJQgbm8gcGVyaW9kaWMgc2Nhbm5lciDigJQgb24gYGdldEVycm9yRXZlbnRzKClgIGFzIGBmcmFtZXdvcmstZXJyb3JgIHdpdGggYGNvbnRleHQ6IFwiYWR2aXNvcnktbG9jay10ZWxlbWV0cnlcImAuIFNlZSBbZG9jcy9hZHZpc29yeS1sb2Nrcy5tZF0oLi4vZG9jcy9hZHZpc29yeS1sb2Nrcy5tZCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFiYXNlQ2hhcnNldF0gLSBEZWZhdWx0IGNoYXJhY3RlciBzZXQgYXBwbGllZCBieSBgZGI6Y3JlYXRlYCB2aWEgbXlzcWwvbWFyaWFkYiBgQ1JFQVRFIERBVEFCQVNFIC4uLiBDSEFSQUNURVIgU0VUYC4gRGlzdGluY3QgZnJvbSBgY2hhcnNldGAsIHdoaWNoIGlzIHRoZSBjbGllbnQgY29ubmVjdGlvbiBjaGFyc2V0IGZvcndhcmRlZCB0byB0aGUgbXlzcWwyIGRyaXZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGF0YWJhc2VDb2xsYXRpb25dIC0gRGVmYXVsdCBjb2xsYXRpb24gYXBwbGllZCBieSBgZGI6Y3JlYXRlYCB2aWEgbXlzcWwvbWFyaWFkYiBgQ1JFQVRFIERBVEFCQVNFIC4uLiBDT0xMQVRFYC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGF0YWJhc2VdIC0gRGF0YWJhc2UgbmFtZSBmb3IgdGhpcyBjb25uZWN0aW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWFkbG9ja01heFJldHJpZXNdIC0gTWF4aW11bSBhdHRlbXB0cyBmb3IgdGhlIG91dGVybW9zdCB0cmFuc2FjdGlvbiB3aGVuIGl0IGtlZXBzIGhpdHRpbmcgZGVhZGxvY2tzLiBEZWZhdWx0cyB0byA4LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWFkbG9ja0Jhc2VXYWl0TXNdIC0gQmFzZSBkZWxheSAobXMpIGZvciB0aGUgZGVhZGxvY2sgcmV0cnkgYmFja29mZjsgdGhlIHBlci1hdHRlbXB0IGNlaWxpbmcgZG91YmxlcyBmcm9tIGhlcmUuIERlZmF1bHRzIHRvIDUwLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWFkbG9ja01heFdhaXRNc10gLSBDYXAgKG1zKSBvbiB0aGUgZGVhZGxvY2sgcmV0cnkgYmFja29mZiBjZWlsaW5nIHNvIHRoZSBqaXR0ZXJlZCB3YWl0IHN0YXlzIGJvdW5kZWQuIERlZmF1bHRzIHRvIDEwMDAuXG4gKiBAcHJvcGVydHkge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBbZHJpdmVyXSAtIERyaXZlciBjbGFzcyB0byB1c2UgZm9yIHRoaXMgZGF0YWJhc2UuXG4gKiBAcHJvcGVydHkge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3Bvb2wvYmFzZS5qc1wiKS5kZWZhdWx0fSBbcG9vbFR5cGVdIC0gUG9vbCBjbGFzcyB0byB1c2UgZm9yIHRoaXMgZGF0YWJhc2UuXG4gKiBAcHJvcGVydHkgeygpID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBbZ2V0Q29ubmVjdGlvbl0gLSBDdXN0b20gY29ubmVjdGlvbiBmYWN0b3J5IG92ZXJyaWRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtob3N0XSAtIERhdGFiYXNlIGhvc3QuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFttaWdyYXRpb25zXSAtIFdoZXRoZXIgbWlncmF0aW9ucyBhcmUgZW5hYmxlZCBmb3IgdGhpcyBkYXRhYmFzZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW211bHRpcGxlU3RhdGVtZW50c10gLSAoTXlTUUwpIE9wdCBpbiB0byBtdWx0aS1zdGF0ZW1lbnQgcXVlcmllcyBzbyBzdHJ1Y3R1cmUgU1FMIGxvYWRzIGFuZCBhbGwtdGFibGUgY2xlYW51cCBjYW4gYmF0Y2ggaW50byBvbmUgcm91bmQtdHJpcC4gT2ZmIGJ5IGRlZmF1bHQ7IG9yZGluYXJ5IHF1ZXJpZXMgb3RoZXJ3aXNlIHJlamVjdCBzdGFja2VkIHN0YXRlbWVudHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heFJvd3NQZXJJbnNlcnRdIC0gTWF4aW11bSByb3dzIHBlciBgSU5TRVJUIC4uLiBWQUxVRVMgKC4uLiksICguLi4pLCAuLi5gIHN0YXRlbWVudCBnZW5lcmF0ZWQgYnkgYFJlY29yZC5pbnNlcnRNdWx0aXBsZWAuIERlZmF1bHRzIHRvIDUwMC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4SW5zZXJ0U3FsQnl0ZXNdIC0gTWF4aW11bSBzZXJpYWxpemVkIFNRTCBzaXplLCBpbiBieXRlcywgZm9yIGEgc2luZ2xlIGBJTlNFUlQgLi4uIFZBTFVFUyAoLi4uKSwgKC4uLiksIC4uLmAgc3RhdGVtZW50LiBEZWZhdWx0cyB0byAxIE1pQiAoMTA0ODU3NikuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heEluQ2xhdXNlVmFsdWVzXSAtIE1heGltdW0gdmFsdWVzIGluIGEgc2luZ2xlIGBJTiAoLi4uKWAgY29ob3J0IHVzZWQgYnkgcHJlbG9hZHMsIGFzc29jaWF0aW9uIGNvdW50cywgYW5kIHF1ZXJ5RGF0YSBhZ2dyZWdhdGVzLiBEZWZhdWx0cyB0byA5OTkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heFF1ZXJ5U3FsQnl0ZXNdIC0gTWF4aW11bSBzZXJpYWxpemVkIFNRTCBzaXplLCBpbiBieXRlcywgZm9yIGEgc2luZ2xlIGNvaG9ydCBxdWVyeSB1c2VkIGJ5IHByZWxvYWRzLCBhc3NvY2lhdGlvbiBjb3VudHMsIGFuZCBxdWVyeURhdGEgYWdncmVnYXRlcy4gRGVmYXVsdHMgdG8gMSBNaUIgKDEwNDg1NzYpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXNzd29yZF0gLSBQYXNzd29yZCBmb3IgdGhlIGRhdGFiYXNlIHVzZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIC0gRGF0YWJhc2UgcG9ydC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJpbWFyeUtleVR5cGVdIC0gRGVmYXVsdCB0eXBlIGZvciBpbXBsaWNpdCBtaWdyYXRpb24gcHJpbWFyeSBrZXlzIGFuZCByZWZlcmVuY2VzLiBEZWZhdWx0cyB0byBgdXVpZGAuXG4gKiBAcHJvcGVydHkge0RhdGFiYXNlUG9vbENvbmZpZ3VyYXRpb259IFtwb29sXSAtIFZlbG9jaW91cyBkYXRhYmFzZSBwb29sIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIEZyaWVuZGx5IG5hbWUgZm9yIHRoZSBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHsoZmlsZTogc3RyaW5nKSA9PiBzdHJpbmd9IFtsb2NhdGVGaWxlXSAtIE9wdGlvbmFsIHNxbGl0ZS13ZWIgc3FsLmpzIHdhc20gcmVzb2x2ZXIgKGBpbml0U3FsSnMoe2xvY2F0ZUZpbGV9KWApLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbcmVhZE9ubHldIC0gV2hldGhlciB3cml0ZXMgc2hvdWxkIGJlIGJsb2NrZWQgZm9yIHRoaXMgZGF0YWJhc2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NjaGVtYV0gLSBEZWZhdWx0IHNjaGVtYSBmb3IgdW5xdWFsaWZpZWQgdGFibGUgbG9va3VwcyAoTVNTUUwpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2NoZW1hQ2FjaGVdIC0gV2hldGhlciBzY2hlbWEgbWV0YWRhdGEgc2hvdWxkIGJlIGNhY2hlZCBvbiB0aGUgZHJpdmVyLiBEZWZhdWx0cyB0byB0cnVlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzY2hlbWFNZXRhZGF0YVJldHJ5RGVhZGxpbmVNc10gLSBCb3VuZGVkIGRlYWRsaW5lIChtcykgZm9yIG91dGxhc3RpbmcgYSBjYWNoZWQgc2NoZW1hLW1ldGFkYXRhIHJlYWQgdGhlIHNlcnZlciBza2lwcGVkIGJlY2F1c2UgY29uY3VycmVudCBvbmxpbmUgRERMIGlzIG1vZGlmeWluZyB0aGUgdGFibGUuIERlZmF1bHRzIHRvIDYwMDAwLlxuICogQHByb3BlcnR5IHtvYmplY3R9IFtyZWNvcmRdIC0gUmVjb3JkLWxldmVsIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZWNvcmQudHJhbnNhY3Rpb25zXSAtIFdoZXRoZXIgcmVjb3JkIG9wZXJhdGlvbnMgc2hvdWxkIHVzZSB0cmFuc2FjdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXNldF0gLSBXaGV0aGVyIHRvIHJlc2V0IHRoZSBkYXRhYmFzZSBvbiBzdGFydHVwLlxuICogQHByb3BlcnR5IHtTcWxDb25maWd9IFtzcWxDb25maWddIC0gRHJpdmVyLXNwZWNpZmljIFNRTCBjb25maWcuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0ZW5hbnRPbmx5XSAtIFdoZXRoZXIgdGhpcyBkYXRhYmFzZSBpZGVudGlmaWVyIGlzIG9ubHkgYWN0aXZlIGluc2lkZSBhIHJlc29sdmVkIHRlbmFudCBjb250ZXh0LlxuICogQHByb3BlcnR5IHtcIm1zc3FsXCIgfCBcIm15c3FsXCIgfCBcInBnc3FsXCIgfCBcInNxbGl0ZVwifSBbdHlwZV0gLSBEYXRhYmFzZSB0eXBlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3VzZURhdGFiYXNlXSAtIERhdGFiYXNlIHRvIHN3aXRjaCB0byBhZnRlciBjb25uZWN0aW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1c2VybmFtZV0gLSBVc2VybmFtZSBmb3IgZGF0YWJhc2UgYXV0aGVudGljYXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7XCJkZWJ1Zy1sb3ctbGV2ZWxcIiB8IFwiZGVidWdcIiB8IFwiaW5mb1wiIHwgXCJ3YXJuXCIgfCBcImVycm9yXCJ9IExvZ0xldmVsXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2dnaW5nT3V0cHV0UGF5bG9hZFxuICogQHByb3BlcnR5IHtMb2dMZXZlbH0gbGV2ZWwgLSBMb2cgbGV2ZWwuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVzc2FnZSAtIEZvcm1hdHRlZCBtZXNzYWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN1YmplY3QgLSBMb2cgc3ViamVjdC5cbiAqIEBwcm9wZXJ0eSB7RGF0ZX0gdGltZXN0YW1wIC0gVGltZXN0YW1wLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTG9nZ2luZ091dHB1dFxuICogQHByb3BlcnR5IHsoYXJnOiBMb2dnaW5nT3V0cHV0UGF5bG9hZCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWR9IHdyaXRlIC0gV3JpdGUgYSBsb2cgZW50cnkuXG4gKiBAcHJvcGVydHkge0xvZ0xldmVsW119IFtsZXZlbHNdIC0gRGVmYXVsdCBsZXZlbHMgZm9yIHRoaXMgb3V0cHV0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTG9nZ2luZ091dHB1dENvbmZpZ1xuICogQHByb3BlcnR5IHtMb2dnaW5nT3V0cHV0fSBvdXRwdXQgLSBPdXRwdXQgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge0FycmF5PExvZ0xldmVsPn0gW2xldmVsc10gLSBMZXZlbHMgZW5hYmxlZCBmb3IgdGhpcyBvdXRwdXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TG9nZ2luZ091dHB1dENvbmZpZyB8IExvZ2dpbmdPdXRwdXQgfCBpbXBvcnQoXCIuL2xvZ2dlci9iYXNlLWxvZ2dlci5qc1wiKS5kZWZhdWx0fSBMb2dnZXJDb25maWdcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExvZ2dpbmdDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zb2xlXSAtIEVuYWJsZS9kaXNhYmxlIGNvbnNvbGUgbG9nZ2luZyBmb3IgcmVxdWVzdCBsb2dnaW5nLiBEZWZhdWx0cyB0byB0cnVlIG91dHNpZGUgb2YgXCJ0ZXN0XCIgYW5kIGZvciBIVFRQIHNlcnZlciBsb2dzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmlsZV0gLSBFbmFibGUvZGlzYWJsZSB3cml0aW5nIGxvZ3MgdG8gYSBmaWxlLiBEZWZhdWx0cyB0byB0cnVlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkaXJlY3RvcnldIC0gRGlyZWN0b3J5IHdoZXJlIGxvZyBmaWxlcyBhcmUgc3RvcmVkLiBEZWZhdWx0cyB0byBcIjxwcm9qZWN0Pi9sb2dcIi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZmlsZVBhdGhdIC0gRXhwbGljaXQgcGF0aCBmb3IgdGhlIGxvZyBmaWxlLiBEZWZhdWx0cyB0byBcIjxkaXJlY3Rvcnk+LzxlbnZpcm9ubWVudD4ubG9nXCIuXG4gKiBAcHJvcGVydHkge0FycmF5PFwiZGVidWctbG93LWxldmVsXCIgfCBcImRlYnVnXCIgfCBcImluZm9cIiB8IFwid2FyblwiIHwgXCJlcnJvclwiPn0gW2xldmVsc10gLSBPdmVycmlkZSB3aGljaCBsb2cgbGV2ZWxzIGFyZSBlbWl0dGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVidWdMb3dMZXZlbF0gLSBDb252ZW5pZW5jZSBmbGFnIHRvIGluY2x1ZGUgdmVyeSBsb3ctbGV2ZWwgZGVidWcgbG9ncy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3F1ZXJ5TG9nZ2luZ10gLSBFbmFibGUvZGlzYWJsZSBkYXRhYmFzZSBxdWVyeSBsb2dnaW5nLiBEZWZhdWx0cyB0byB0cnVlIG91dHNpZGUgdGVzdCBhbmQgZmFsc2UgaW4gdGVzdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtzZW5zaXRpdmVOYW1lc10gLSBBZGRpdGlvbmFsIGNhc2UtaW5zZW5zaXRpdmUgc2Vuc2l0aXZlIGhlYWRlci9wYXJhbWV0ZXIgbmFtZXMgdG8gcmVkYWN0IGZyb20gbG9nZ2luZy5cbiAqIEBwcm9wZXJ0eSB7TG9nZ2VyQ29uZmlnW119IFtsb2dnZXJzXSAtIExvZ2dlciBpbnN0YW5jZXMgKGNvbnZlcnRlZCB0byBvdXRwdXRzIHdoZW4gY29uZmlndXJlZCkuXG4gKiBAcHJvcGVydHkge0xvZ2dpbmdPdXRwdXRDb25maWdbXX0gW291dHB1dHNdIC0gRXhwbGljaXQgbG9nZ2VyIG91dHB1dHMgKG92ZXJyaWRlcyBjb25zb2xlL2ZpbGUgZGVmYXVsdHMgd2hlbiBwcm92aWRlZCkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdHJ1Y3R1cmVTcWxDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZW5hYmxlZEVudmlyb25tZW50c10gLSBFbnZpcm9ubWVudHMgYWxsb3dlZCB0byB3cml0ZSBzdHJ1Y3R1cmUgc3FsIGZpbGVzIGR1cmluZyBhdXRvbWF0aWMgbWlncmF0aW9uIGR1bXBzLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2Rpc2FibGVkRW52aXJvbm1lbnRzXSAtIEVudmlyb25tZW50cyB0aGF0IHNob3VsZCBza2lwIHdyaXRpbmcgc3RydWN0dXJlIHNxbCBmaWxlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtcImJlYWNvblwiIHwgXCJwb2xsaW5nXCJ9IEJhY2tncm91bmRKb2JzRGlzcGF0Y2hTdHJhdGVneVxuICpcbiAqIC0gYFwiYmVhY29uXCJgIChkZWZhdWx0KTogZXZlbnQtZHJpdmVuIGRpc3BhdGNoLiBUaGVcbiAqICAgYGJhY2tncm91bmQtam9icy1tYWluYCBwcm9jZXNzIGRyYWlucyB0aGUgcXVldWUgb24gZW5xdWV1ZSwgb25cbiAqICAgd29ya2VyIHJlYWRpbmVzcywgb24gQmVhY29uIGJyb2FkY2FzdHMgKHNvIGNyb3NzLXByb2Nlc3MgZW5xdWV1ZXNcbiAqICAgd2FrZSBpdCksIGFuZCBhcm1zIGEgYHNldFRpbWVvdXRgIGZvciB0aGUgc29vbmVzdCBmdXR1cmUtc2NoZWR1bGVkXG4gKiAgIGpvYi4gRmFsbHMgYmFjayBncmFjZWZ1bGx5IHRvIGRpcmVjdCBpbi1wcm9jZXNzIHRyaWdnZXJpbmcgd2hlblxuICogICBCZWFjb24gaXMgbm90IGNvbmZpZ3VyZWQuXG4gKiAtIGBcInBvbGxpbmdcImA6IGxlZ2FjeSBtb2RlLCBydW5zIGEgZml4ZWQtaW50ZXJ2YWwgcG9sbCBvdmVyIHRoZVxuICogICBgYmFja2dyb3VuZF9qb2JzYCB0YWJsZSAoc2VlIGBwb2xsSW50ZXJ2YWxNc2ApLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7XCJiYWNrZ3JvdW5kXCIgfCBcImlubGluZVwifSBCYWNrZ3JvdW5kSm9ic01vZGUgKi9cbi8qKiBAdHlwZWRlZiB7XCJjYW5kaWRhdGVcIiB8IFwiYWN0aXZlXCIgfCBcInJldGlyZWRcIn0gQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uSW5pdGlhbFN0YXRlICovXG4vKiogQHR5cGVkZWYgeyhhcmdzOiB7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9KSA9PiBpbXBvcnQoXCIuL2JhY2tncm91bmQtam9icy9hZGFwdGVyLmpzXCIpLmRlZmF1bHR9IEJhY2tncm91bmRKb2JzQWRhcHRlckZhY3RvcnkgKi9cbi8qKiBAdHlwZWRlZiB7dHlwZW9mIGltcG9ydChcIi4vYmFja2dyb3VuZC1qb2JzL3BsYXRmb3JtLWpvYi5qc1wiKS5kZWZhdWx0fSBCYWNrZ3JvdW5kSm9iQ2xhc3MgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9ic0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9iYWNrZ3JvdW5kLWpvYnMvYWRhcHRlci5qc1wiKS5kZWZhdWx0IHwgQmFja2dyb3VuZEpvYnNBZGFwdGVyRmFjdG9yeX0gW2FkYXB0ZXJdIC0gQWRhcHRlciBpbnN0YW5jZSBvciBzeW5jaHJvbm91cyBmYWN0b3J5LiBBIGZhY3RvcnkgY3JlYXRlcyBvbmUgYWRhcHRlciBwZXIgY29uZmlndXJhdGlvbiBsaWZlY3ljbGU7IHRoZSBmcmFtZXdvcmsgY2xvc2VzIGFkYXB0ZXJzIGl0IHJlc29sdmVzLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iQ2xhc3NbXX0gW2pvYkNsYXNzZXNdIC0gU3RhdGljIHBvcnRhYmxlIGpvYiBjbGFzc2VzIGF2YWlsYWJsZSB0byBCcm93c2VyL0V4cG8gbG9jYWwgZGlzcGF0Y2guIERlZmF1bHRzIHRvIGBbXWA7IE5vZGUga2VlcHMgaXRzIGZpbGVzeXN0ZW0gcmVnaXN0cnkuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JzTW9kZX0gW21vZGVdIC0gYFwiYmFja2dyb3VuZFwiYCB1c2VzIHRoZSBjb25maWd1cmVkIGFkYXB0ZXIvdHJhbnNwb3J0IGFuZCBkdXJhYmxlIHF1ZXVlIHNlbWFudGljczsgYFwiaW5saW5lXCJgIHBlcmZvcm1zIGltbWVkaWF0ZWx5IHdpdGhvdXQgZHVyYWJsZSBxdWV1ZSBzdGF0ZS4gRGVmYXVsdHMgdG8gYFwiYmFja2dyb3VuZFwiYC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZ2VuZXJhdGlvbklkXSAtIE9wdC1pbiByZWxlYXNlIGdlbmVyYXRpb24gaWRlbnRpdHkuIE11c3QgbWF0Y2ggYF5bQS1aYS16MC05XVtBLVphLXowLTkuXy1dezAsMTI3fSRgIGFuZCBhZ3JlZSB3aXRoIGVudmlyb25tZW50L0FQSS9DTEkgc291cmNlcy5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uSW5pdGlhbFN0YXRlfSBbaW5pdGlhbEdlbmVyYXRpb25TdGF0ZV0gLSBHZW5lcmF0aW9uLWF3YXJlIGJvb3Qgc3RhdGUuIERlZmF1bHRzIHRvIGBcImNhbmRpZGF0ZVwiYDsgaW52YWxpZCB3aXRob3V0IGBnZW5lcmF0aW9uSWRgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtsaWZlY3ljbGVTb2NrZXRQYXRoXSAtIEFic29sdXRlIHJlbGVhc2UtbG9jYWwgVW5peCBzb2NrZXQgdXNlZCBieSBhY2tub3dsZWRnZWQgYWN0aXZhdGlvbiBhbmQgcmV0aXJlbWVudCBjb21tYW5kcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaG9zdF0gLSBIb3N0bmFtZSBmb3IgdGhlIGJhY2tncm91bmQgam9icyBtYWluIHByb2Nlc3MuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIC0gUG9ydCBmb3IgdGhlIGJhY2tncm91bmQgam9icyBtYWluIHByb2Nlc3MuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFiYXNlSWRlbnRpZmllcl0gLSBEYXRhYmFzZSBpZGVudGlmaWVyIHVzZWQgdG8gc3RvcmUgYmFja2dyb3VuZCBqb2JzLiBCcm93c2VyL0V4cG8gbG9jYWwgZGlzcGF0Y2ggdXNlcyB0aGlzIGV4aXN0aW5nIFNRTGl0ZSBkYXRhYmFzZSBhbmQgZGVmYXVsdHMgdG8gYFwiZGVmYXVsdFwiYC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4Q29uY3VycmVudElubGluZUpvYnNdIC0gSG93IG1hbnkgYGZvcmtlZDogZmFsc2VgIGpvYnMgYSBzaW5nbGVcbiAqICAgYGJhY2tncm91bmQtam9icy13b3JrZXJgIHByb2Nlc3MgaXMgYWxsb3dlZCB0byBydW4gaW4gcGFyYWxsZWwuIENvbmN1cnJlbmN5XG4gKiAgIGlzIGF0IHRoZSBKUyBldmVudC1sb29wIGxldmVsOiBldmVyeSBjb25jdXJyZW50IGpvYiBzaGFyZXMgdGhlIHdvcmtlcidzXG4gKiAgIHByb2Nlc3MgYW5kIERCIGNvbm5lY3Rpb24gcG9vbCwgc28gdGhpcyBzaG91bGQgZml0IHRoZSBwb29sIHNpemUsIG5vdCB0aGVcbiAqICAgQ1BVIGNvdW50LiBGb3JraW5nIHJlbWFpbnMgdGhlIHJpZ2h0IHRvb2wgZm9yIG1lbW9yeSBpc29sYXRpb24gYWNyb3NzXG4gKiAgIGxvbmctcnVubmluZyBqb2JzIGFuZCBmb3IgdXNpbmcgbW9yZSBjb3Jlcy4gRGVmYXVsdDogYDRgLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhDb25jdXJyZW50Rm9ya2VkSm9ic10gLSBIb3cgbWFueSBvdXQtb2YtcHJvY2Vzc1xuICogICBgXCJmb3JrZWRcImAgb3IgYFwic3Bhd25lZFwiYCBqb2JzIGEgc2luZ2xlIGBiYWNrZ3JvdW5kLWpvYnMtd29ya2VyYCBpc1xuICogICBhbGxvd2VkIHRvIGtlZXAgaW4gZmxpZ2h0LiBEZWZhdWx0OiBgNGAuIFRoaXMgaXMgYSBwZXItd29ya2VyIHNhZmV0eSBjYXA7XG4gKiAgIGZvciB3b3JrbG9hZC1zaGFwZWQgbGltaXRzIHVzZSBwZXItcXVldWUgY2FwcyAoYHF1ZXVlc2ApIGluc3RlYWQsIHdoaWNoIGFyZVxuICogICBlbmZvcmNlZCBjbHVzdGVyLXdpZGUgYW5kIGFyZSBpbW11bmUgdG8gZHVwbGljYXRlIHdvcmtlciBwcm9jZXNzZXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Bvb2xlZFJ1bm5lckNvdW50XSAtIE51bWJlciBvZiB3YXJtLCByZXVzYWJsZSBjaGlsZCBydW5uZXJzIG93bmVkIGJ5IGVhY2ggd29ya2VyLiBQb29sZWQgY2FwYWNpdHkgaXMgc2VwYXJhdGUgZnJvbSBpbmxpbmUgYW5kIGZvcmtlZC9zcGF3bmVkIGNhcGFjaXR5LiBEZWZhdWx0OiBgNGAuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Bvb2xlZFJ1bm5lckNvbmN1cnJlbmN5XSAtIE51bWJlciBvZiBqb2JzIGVhY2ggcG9vbGVkIGNoaWxkIHJ1bnMgY29uY3VycmVudGx5IG9uIGl0cyBvd24gZXZlbnQgbG9vcC4gVG90YWwgcGVyLXdvcmtlciBwb29sZWQgY2FwYWNpdHkgaXMgYHBvb2xlZFJ1bm5lckNvdW50IMOXIHBvb2xlZFJ1bm5lckNvbmN1cnJlbmN5YC4gYDFgIChkZWZhdWx0KSBrZWVwcyBlYWNoIGNoaWxkIHNlcmlhbDsgcmFpc2UgaXQgZm9yIEkvTy1ib3VuZCBqb2JzIHNvIGEgYm91bmRlZCBzZXQgb2YgaXNvbGF0ZWQgcHJvY2Vzc2VzIGhhbmRsZXMgaGlnaCBjb25jdXJyZW5jeSAobGlrZSB0aGUgaW5saW5lIGxhbmUpIHdpdGhvdXQgb25lIHByb2Nlc3MgcGVyIGNvbmN1cnJlbnQgam9iLiBEZWZhdWx0OiBgMWAuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Bvb2xlZFJ1bm5lck1heEpvYnNdIC0gTnVtYmVyIG9mIHNlcXVlbnRpYWwgam9icyBhIHBvb2xlZCBjaGlsZCBydW5zIGJlZm9yZSBpdCBpcyByZXBsYWNlZCwgYm91bmRpbmcgcHJvY2Vzcy1sZXZlbCByZXNvdXJjZSBhY2N1bXVsYXRpb24uIERlZmF1bHQ6IGAxMDBgLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb29sZWRSdW5uZXJNYXhSc3NCeXRlc10gLSBQZWFrIFJTUyAodGhlIGtlcm5lbCBgVm1IV01gIGhpZ2gtd2F0ZXIgbWFyayByZXBvcnRlZCBieSB0aGUgY2hpbGQpIGF0IHdoaWNoIGEgcG9vbGVkIGNoaWxkIGlzIHJlcGxhY2VkIGFmdGVyIGFuIGFja25vd2xlZGdlZCBqb2IuIFRoZSBjaGlsZCdzIHBlYWssIG5vdCBpdHMgc2V0dGxlZCBSU1MgYXQgam9iLW91dGNvbWUgdGltZSwgaXMgdGhlIHRyaWdnZXIsIHNvIGEgYnVyc3Qgd29ya2luZy1zZXQgdGhhdCByZWNsYWltcyBiZWZvcmUgdGhlIG91dGNvbWUgc3RpbGwgcmV0aXJlcyB0aGUgY2hpbGQuIERlZmF1bHQ6IGA1MzY4NzA5MTJgICg1MTIgTWlCKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9vbGVkUnVubmVyTWF4TGlmZXRpbWVNc10gLSBBZ2UgYWZ0ZXIgYW4gYWNrbm93bGVkZ2VkIGpvYiBhdCB3aGljaCBhIHBvb2xlZCBjaGlsZCBpcyByZXBsYWNlZC4gRGVmYXVsdDogYDM2MDAwMDBgIChvbmUgaG91cikuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3J1bm5lck1heE9sZFNwYWNlU2l6ZU1iXSAtIFY4IGhlYXAgY2FwIChgLS1tYXgtb2xkLXNwYWNlLXNpemVgLCBNaUIpIGFwcGxpZWQgdG8gZXZlcnkgYmFja2dyb3VuZC1qb2JzIHJ1bm5lciBjaGlsZCBwcm9jZXNzIChwb29sZWQsIGZvcmtlZCwgYW5kIHNwYXduZWQpIHNvIGEgc2luZ2xlIGNoaWxkIGNhbiBuZXZlciBjb21taXQgbXVsdGlwbGUgR0JzIG9mIGhlYXAuIERlZmF1bHQ6IGAyMDQ4YC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcnVubmVyTWFsbG9jQXJlbmFNYXhdIC0gYE1BTExPQ19BUkVOQV9NQVhgIGV4cG9ydGVkIHRvIGV2ZXJ5IGJhY2tncm91bmQtam9icyBydW5uZXIgY2hpbGQgcHJvY2VzcywgYm91bmRpbmcgZ2xpYmMgcGVyLXRocmVhZCBhcmVuYXMuIERlZmF1bHRzIHRvIGFuIGluaGVyaXRlZCBgTUFMTE9DX0FSRU5BX01BWGAsIGVsc2UgYDRgLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCB7bWF4Q29uY3VycmVudD86IG51bWJlciwgcHJpb3JpdHk/OiBudW1iZXJ9Pn0gW3F1ZXVlc10gLSBQZXItcXVldWVcbiAqICAgY29uY3VycmVuY3kgY2FwcyBhbmQgZGlzcGF0Y2ggcHJpb3JpdGllcywgU2lkZWtpcS1zdHlsZS4gQSBqb2IgZGVjbGFyZXMgaXRzIHF1ZXVlIChzdGF0aWNcbiAqICAgYHF1ZXVlYCBvbiB0aGUgam9iIGNsYXNzLCBvciB0aGUgYHF1ZXVlYCBlbnF1ZXVlIG9wdGlvbjsgZGVmYXVsdHMgdG8gYFwiZGVmYXVsdFwiYCksIGFuZFxuICogICBgcXVldWVzW25hbWVdLm1heENvbmN1cnJlbnRgIGJvdW5kcyBob3cgbWFueSBqb2JzIGZyb20gdGhhdCBxdWV1ZSBtYXkgYmVcbiAqICAgaW4gZmxpZ2h0IGFjcm9zcyB0aGUgd2hvbGUgY2x1c3RlciAoZW5mb3JjZWQgdmlhIGR1cmFibGUgcGVyLWtleVxuICogICBjb25jdXJyZW5jeSwgc28gaXQgaG9sZHMgcmVnYXJkbGVzcyBvZiBob3cgbWFueSB3b3JrZXIgcHJvY2Vzc2VzIHJ1bikuXG4gKiAgIFNpemUgZWFjaCBxdWV1ZSB0byBpdHMgd29ya2xvYWQ6IEkvTy1ib3VuZCBxdWV1ZXMgKGUuZy4gYnVpbGQgcnVubmVyc1xuICogICB3YWl0aW5nIG9uIHJlbW90ZSBEb2NrZXIgc2VydmVycykgY2FuIHJ1biBmYXIgYWJvdmUgdGhlIGNvcmUgY291bnQsIHdoaWxlXG4gKiAgIENQVS1ib3VuZCBxdWV1ZXMgc2hvdWxkIHN0YXkgbmVhciBpdC4gYHF1ZXVlc1tuYW1lXS5wcmlvcml0eWAgKGRlZmF1bHQgYDBgKVxuICogICBtYWtlcyB0aGUgbWFpbiBwcm9jZXNzIGRpc3BhdGNoIGhpZ2hlci1wcmlvcml0eSBxdWV1ZXMgYmVmb3JlIGxvd2VyLXByaW9yaXR5XG4gKiAgIG9uZXMgcmVnYXJkbGVzcyBvZiBlbnF1ZXVlIG9yZGVyLCBzbyBhIHNtYWxsIHRpbWUtY3JpdGljYWwgcXVldWUgY2FuIG5ldmVyIGJlXG4gKiAgIHN0YXJ2ZWQgYnkgYSBmbG9vZCBvZiBsb3ctcHJpb3JpdHkgd29yayBzaGFyaW5nIGEgd29ya2VyIHBvb2wuIFVubGlrZVxuICogICBTaWRla2lxJ3Mgc3RyaWN0IHF1ZXVlIG9yZGVyaW5nLCBwcmlvcml0eSBjb21wb3NlcyB3aXRoIHRoZSBwZXItcXVldWUgY2FwczpcbiAqICAgYSBoaWdoZXItcHJpb3JpdHkgcXVldWUgdGhhdCBpcyBhbHJlYWR5IGF0IGl0cyBgbWF4Q29uY3VycmVudGAgaXMgc2tpcHBlZCBhbmRcbiAqICAgZGlzcGF0Y2ggZmFsbHMgdGhyb3VnaCB0byB0aGUgbmV4dCBlbGlnaWJsZSBsb3dlci1wcmlvcml0eSBqb2IsIHNvIGEgYnVzeVxuICogICBoaWdoLXByaW9yaXR5IHF1ZXVlIGRvZXMgbm90IGJsb2NrIGV2ZXJ5dGhpbmcgZWxzZS4gVGhpcyBmYWxsdGhyb3VnaCBpcyBhXG4gKiAgIHByb3BlcnR5IG9mIHRoZSBxdWV1ZS1kZXJpdmVkIGNhcDsgYSBqb2IgdGhhdCBzdXBwbGllcyBpdHMgb3duIGV4cGxpY2l0XG4gKiAgIGBjb25jdXJyZW5jeUtleWAvYG1heENvbmN1cnJlbmN5YCBieXBhc3NlcyB0aGUgcXVldWUgY2FwIGVudGlyZWx5IChhblxuICogICBleHBsaWNpdCBrZXkgYWx3YXlzIHdpbnMg4oCUIHNlZSBhYm92ZSkgYW5kIGlzIGJvdW5kZWQgb25seSBieSB0aGF0IGtleSwgc28gaXRcbiAqICAgaXMgbm90IGhlbGQgYmFjayBieSB0aGUgcXVldWUncyBjYXAgYW5kIHByaW9yaXR5IHNpbXBseSBvcmRlcnMgaXQgbm9ybWFsbHkuXG4gKiAgIFByaW9yaXRpZXMgbWF5IGJlIGFueSBudW1iZXIsIGluY2x1ZGluZyBuZWdhdGl2ZSB0byBzaW5rIGEgcXVldWUgYmVsb3cgdGhlXG4gKiAgIGRlZmF1bHQuIEpvYnMgd2l0aGluIHRoZSBzYW1lIHByaW9yaXR5IGtlZXAgRklGTyAoYHNjaGVkdWxlZF9hdGAsIHRoZW5cbiAqICAgYGNyZWF0ZWRfYXRgKSBvcmRlci4gRGVmYXVsdDogYHt9YCAobm8gcXVldWUgY2FwcywgYWxsIHF1ZXVlcyBwcmlvcml0eSBgMGApLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBbc2NoZWR1bGVkRW5xdWV1ZVRpbWVvdXRNc10gLSBCb3VuZHMgb25lIHNjaGVkdWxlZCBlbnF1ZXVlIGF0dGVtcHQgaW4gdGhlIG1haW4gcHJvY2Vzcy4gQSBkdXJhYmxlIGVucXVldWUgdGhhdCBuZXZlciBzZXR0bGVzICh3ZWRnZWQgREIgY29ubmVjdGlvbiwgY29udGVuZGVkIGFkdmlzb3J5IGxvY2spIHdvdWxkIG90aGVyd2lzZSBrZWVwIGl0cyBzY2hlZHVsZSBrZXkgcGVybWFuZW50bHkgaW4gZmxpZ2h0LCBzbyBldmVyeSBsYXRlciB0aWNrIHNraXBwZWQgaXRzZWxmIGFuZCBzaHV0ZG93biBjb3VsZCBuZXZlciBkcmFpbi4gT24gdGltZW91dCB0aGUgYXR0ZW1wdCBpcyByZXBvcnRlZCBhcyBgYmFja2dyb3VuZC1qb2JzLXNjaGVkdWxlZC1lbnF1ZXVlLXN0YWxsYCBhbmQgdGhlIGtleSBjbGVhcnMgZm9yIHRoZSBuZXh0IHRpY2suIERlZmF1bHQ6IDIwIG1pbnV0ZXMg4oCUIGRlbGliZXJhdGVseSA1IG1pbnV0ZXMgYWJvdmUgYGFkdmlzb3J5TG9ja0FjcXVpcmVUaW1lb3V0TXNgIHNvIHRoZSBwcmVjaXNlIGxvY2sgZXJyb3Igc3VyZmFjZXMgZmlyc3QuIGBudWxsYCBvcHRzIG91dC5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYnNEaXNwYXRjaFN0cmF0ZWd5fSBbZGlzcGF0Y2hTdHJhdGVneV0gLSBIb3cgdGhlIG1haW4gcHJvY2Vzc1xuICogICBkZXRlY3RzIG5ldyB3b3JrLiBEZWZhdWx0cyB0byBgXCJiZWFjb25cImAgKGV2ZW50LWRyaXZlbikuIFNldCB0byBgXCJwb2xsaW5nXCJgXG4gKiAgIHRvIHJlc3RvcmUgdGhlIGxlZ2FjeSBmaXhlZC1pbnRlcnZhbCBwb2xsLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb2xsSW50ZXJ2YWxNc10gLSBQb2xsIGludGVydmFsIGluIG1pbGxpc2Vjb25kcy4gT25seSB1c2VkXG4gKiAgIHdoZW4gYGRpc3BhdGNoU3RyYXRlZ3kgPT09IFwicG9sbGluZ1wiYC4gRGVmYXVsdDogYDEwMDBgLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkcmFpblN0b3JlT3BlcmF0aW9uVGltZW91dE1zXSAtIEJvdW5kcyBvbmUgZHJhaW4tY3JpdGljYWxcbiAqICAgc3RvcmUgb3BlcmF0aW9uIGluIHRoZSBtYWluIHByb2Nlc3M6IHRoZSBxdWV1ZWQtam9iIGxvb2t1cCwgdGhlIGR1cmFibGVcbiAqICAgaGFuZG9mZiBjbGFpbSwgYW5kIGhhbmRvZmYtcmVjb3ZlcnkgdHJhbnNpdGlvbnMuIEEgc3RvcmUgY2FsbCB0aGF0IG5ldmVyXG4gKiAgIHNldHRsZXMgKHdlZGdlZCBEQiBjb25uZWN0aW9uLCBsb3N0IGFja25vd2xlZGdlbWVudCkgd291bGQgb3RoZXJ3aXNlIGZyZWV6ZVxuICogICB0aGUgY29hbGVzY2VkIGRyYWluIGFuZCBldmVyeSBsYXRlciBkaXNwYXRjaCBxdWV1ZWQgYmVoaW5kIGl0IHVudGlsIHRoZVxuICogICBwcm9jZXNzIGlzIGtpbGxlZDsgb24gdGltZW91dCB0aGUgZHJhaW4gZmFpbHMgaW50byBpdHMgZXhpc3RpbmdcbiAqICAgZXJyb3IvcmV0cnkgcGF0aCBhbmQgdGhlIHN0YWxsIGlzIHJlcG9ydGVkIGFzIGEgZnJhbWV3b3JrIGVycm9yLlxuICogICBEZWZhdWx0OiBgNjAwMDBgLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBbam9iVGltZW91dE1zXSAtIFdhbGwtY2xvY2sgYmFja3N0b3AsIGluIG1zLCBmb3IgYVxuICogICBgXCJmb3JrZWRcImAgam9iIHJ1bm5lci4gQSBmb3JrZWQgam9iIHN0aWxsIHJ1bm5pbmcgYWZ0ZXIgdGhpcyBpcyB0ZXJtaW5hdGVkXG4gKiAgIChTSUdURVJNLCB0aGVuIFNJR0tJTEwgYWZ0ZXIgdGhlIHJlYXBpbmcgZ3JhY2UpIGFuZCByZXBvcnRlZCBmYWlsZWQsIHNvIGFcbiAqICAgc2luZ2xlIGdlbnVpbmVseS1odW5nIHJ1bm5lciBjYW4ndCBwaW4gYSBkcmFpbmluZyB3b3JrZXIg4oCUIGFuZCBpdHMgZnVsbC1hcHBcbiAqICAgYm9vdCBhbmQgREIgY29ubmVjdGlvbnMg4oCUIGluZGVmaW5pdGVseSAoZS5nLiBhY3Jvc3MgYSBkZXBsb3kgd2hlcmUgYSByZXRpcmVkXG4gKiAgIHdvcmtlciBkcmFpbnMgaW4tZmxpZ2h0IGpvYnMpLiBUaGlzIGlzIGEgY29hcnNlIHNhZmV0eSBuZXQsIG5vdCBwZXItam9iXG4gKiAgIHR1bmluZzogc2V0IGl0IHdlbGwgYWJvdmUgdGhlIGxvbmdlc3QgbGVnaXRpbWF0ZSBmb3JrZWQgam9iIChidWlsZCBydW5uZXJzLFxuICogICBsb25nIGltcG9ydHMpIHNvIG9ubHkgZ2VudWluZWx5LXN0dWNrIHJ1bm5lcnMgYXJlIGtpbGxlZC4gT21pdCwgYG51bGxgLCBvclxuICogICBgPD0gMGAgdG8gZGlzYWJsZSAoZGVmYXVsdCksIHdoaWNoIHByZXNlcnZlcyB0aGUgcHJpb3IgdW5ib3VuZGVkIGJlaGF2aW9yLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9ic1JldGVudGlvbkNvbmZpZ3VyYXRpb259IFtyZXRlbnRpb25dIC0gUmV0ZW50aW9uL3BydW5pbmdcbiAqICAgb2YgdGVybWluYWwgam9iIHJvd3MuIFdpdGhvdXQgcHJ1bmluZyB0aGUgam9icyB0YWJsZSBncm93cyB1bmJvdW5kZWRcbiAqICAgKGNvbXBsZXRlZCByb3dzIGFjY3VtdWxhdGUgZm9yZXZlciksIHdoaWNoIGJsb2F0cyBzdG9yYWdlIGFuZCBpbmRleGVzIGFuZFxuICogICBldmVudHVhbGx5IHNsb3dzIGRpc3BhdGNoLiBUaGUgbWFpbiBwcm9jZXNzIHN3ZWVwcyB0ZXJtaW5hbCByb3dzIHBhc3QgdGhlaXJcbiAqICAgd2luZG93IG9uIGFuIGludGVydmFsLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYnNSZXRlbnRpb25Db25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IFtjb21wbGV0ZWRUdGxNc10gLSBEZWxldGUgYGNvbXBsZXRlZGAgam9icyB3aG9zZVxuICogICBgY29tcGxldGVkX2F0X21zYCBpcyBvbGRlciB0aGFuIHRoaXMgbWFueSBtcy4gYG51bGxgIG9yIGA8PSAwYCBkaXNhYmxlc1xuICogICBjb21wbGV0ZWQgcHJ1bmluZy4gRGVmYXVsdDogYDYwNDgwMDAwMGAgKDcgZGF5cykuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IFtmYWlsZWRUdGxNc10gLSBEZWxldGUgdGVybWluYWwgYGZhaWxlZGAvYG9ycGhhbmVkYFxuICogICBqb2JzIG9sZGVyIHRoYW4gdGhpcyBtYW55IG1zLiBgbnVsbGAgb3IgYDw9IDBgIGRpc2FibGVzIChrZWVwcyB0aGVtIGZvclxuICogICBkZWJ1Z2dpbmcpLiBEZWZhdWx0OiBgMjU5MjAwMDAwMGAgKDMwIGRheXMpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtiYXRjaFNpemVdIC0gUm93cyBkZWxldGVkIHBlciBiYXRjaC4gRGVmYXVsdDogYDEwMDBgLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzd2VlcEludGVydmFsTXNdIC0gSG93IG9mdGVuIHRoZSByZXRlbnRpb24gc3dlZXAgcnVucy5cbiAqICAgRGVmYXVsdDogYDM2MDAwMDBgICgxIGhvdXIpLlxuICovXG4vKipcbiAqIEZ1bGx5LXJlc29sdmVkIHJldGVudGlvbiBjb25maWcgYXMgcmV0dXJuZWQgYnkgYGdldEJhY2tncm91bmRKb2JzQ29uZmlnKClgXG4gKiAoZXZlcnkgZmllbGQgZGVmYXVsdGVkKSwgYXMgb3Bwb3NlZCB0byB0aGUgcGFydGlhbCB1c2VyLXByb3ZpZGVkIGlucHV0LlxuICogQHR5cGVkZWYge29iamVjdH0gUmVzb2x2ZWRCYWNrZ3JvdW5kSm9ic1JldGVudGlvbkNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gY29tcGxldGVkVHRsTXMgLSBSZXNvbHZlZCBjb21wbGV0ZWQtam9iIFRUTCBpbiBtcyAoYG51bGxgIGRpc2FibGVzKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gZmFpbGVkVHRsTXMgLSBSZXNvbHZlZCBmYWlsZWQvb3JwaGFuZWQgVFRMIGluIG1zIChgbnVsbGAgZGlzYWJsZXMpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJhdGNoU2l6ZSAtIFJlc29sdmVkIGRlbGV0ZSBiYXRjaCBzaXplLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN3ZWVwSW50ZXJ2YWxNcyAtIFJlc29sdmVkIHN3ZWVwIGludGVydmFsIGluIG1zLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmVhY29uQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtib29sZWFufSBbZW5hYmxlZF0gLSBXaGV0aGVyIHRvIGNvbm5lY3QgdG8gYSBCZWFjb24gYnJva2VyLiBEZWZhdWx0cyB0byBmYWxzZSB1bmxlc3MgYGhvc3RgL2Bwb3J0YCBvciBgaW5Qcm9jZXNzOiB0cnVlYCBhcmUgc2V0LCBvciBlbnYgdmFycyBhcmUgcHJlc2VudC4gRXhwbGljaXQgYGZhbHNlYCBkaXNhYmxlcyBCZWFjb24gZXZlbiB3aGVuIGVudiB2YXJzIGFyZSBzZXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpblByb2Nlc3NdIC0gV2hlbiB0cnVlLCB1c2UgYSBtb2R1bGUtbGV2ZWwgaW4tcHJvY2VzcyBicm9rZXIgc2luZ2xldG9uIGluc3RlYWQgb2YgY29ubmVjdGluZyBvdmVyIFRDUC4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGhvc3RgL2Bwb3J0YC4gVXNlZnVsIGZvciB0ZXN0cyBhbmQgc2luZ2xlLXByb2Nlc3MgZGVwbG95bWVudHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvc3RdIC0gSG9zdG5hbWUgb2YgdGhlIEJlYWNvbiBicm9rZXIgZGFlbW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb3J0XSAtIFBvcnQgb2YgdGhlIEJlYWNvbiBicm9rZXIgZGFlbW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwZWVyVHlwZV0gLSBPcHRpb25hbCBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhpcyBwZWVyIChlLmcuIFwic2VydmVyXCIsIFwiYmFja2dyb3VuZC1qb2JzLXdvcmtlclwiKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdW5yZWFjaGFibGVSZXBvcnRNc10gLSBHcmFjZSB3aW5kb3cgKG1zKSBhIGJlYWNvbiBjb25uZWN0L2Rpc2Nvbm5lY3QgYmxpcCBtdXN0IHBlcnNpc3QgYmVmb3JlIGl0IGlzIHJlcG9ydGVkIGFzIGEgZnJhbWV3b3JrLWVycm9yLiBUcmFuc2llbnQgb3V0YWdlcyB0aGF0IHJlY292ZXIgd2l0aGluIHRoaXMgd2luZG93IChlLmcuIGEgZGVwbG95IHJlc3RhcnRpbmcgdGhlIGJyb2tlcikgYXJlIG5vdCByZXBvcnRlZC4gRGVmYXVsdHMgdG8gMzAwMDAuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBIdHRwQ29tcHJlc3Npb25Db25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlbmFibGVkXSAtIFdoZXRoZXIgYnVmZmVyZWQgcmVzcG9uc2UgY29tcHJlc3Npb24gaXMgZW5hYmxlZC4gRGVmYXVsdHMgdG8gdHJ1ZTsgc2V0IGZhbHNlIHRvIGRpc2FibGUgZ2xvYmFsbHkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RocmVzaG9sZF0gLSBNaW5pbXVtIGJ1ZmZlcmVkIGJvZHkgc2l6ZSBpbiBieXRlcyBiZWZvcmUgY29tcHJlc3Npb24gaXMgYXBwbGllZC4gRGVmYXVsdHMgdG8gMTAyNC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbYnJvdGxpUXVhbGl0eV0gLSBCcm90bGkgZW5jb2RlciBxdWFsaXR5ICgwLTExKS4gRGVmYXVsdHMgdG8gNC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZ3ppcExldmVsXSAtIEd6aXAgY29tcHJlc3Npb24gbGV2ZWwgKDAtOSkuIERlZmF1bHRzIHRvIDYuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb3JtYWxpemVkSHR0cENvbXByZXNzaW9uQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtib29sZWFufSBlbmFibGVkIC0gV2hldGhlciBidWZmZXJlZCBIVFRQIHJlc3BvbnNlIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGhyZXNob2xkIC0gTWluaW11bSBidWZmZXJlZCBib2R5IHNpemUgaW4gYnl0ZXMgYmVmb3JlIGNvbXByZXNzaW9uIGlzIGFwcGxpZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gYnJvdGxpUXVhbGl0eSAtIEJyb3RsaSBlbmNvZGVyIHF1YWxpdHkgKDAtMTEpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGd6aXBMZXZlbCAtIEd6aXAgY29tcHJlc3Npb24gbGV2ZWwgKDAtOSkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBIdHRwUmVxdWVzdEJvZHlQb2xpY3lSZXNvbHZlckFyZ3NcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gaGVhZGVycyAtIENvbXBsZXRlIHJlcXVlc3QgaGVhZGVycyBhcyByZWNlaXZlZCBieSB0aGUgcGFyc2VyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGh0dHBNZXRob2QgLSBVcHBlcmNhc2UgSFRUUCBtZXRob2QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIFJlcXVlc3QgdGFyZ2V0LCBpbmNsdWRpbmcgaXRzIHF1ZXJ5IHN0cmluZyB3aGVuIHByZXNlbnQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBIdHRwUmVxdWVzdEJvZHlQb2xpY3lcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4UmVxdWVzdEJvZHlCeXRlc10gLSBQZXItcmVxdWVzdCBkZWNvZGVkIGJvZHkgbGltaXQuIEZhbGxzIGJhY2sgdG8gdGhlIGdsb2JhbCBsaW1pdCB3aGVuIG9taXR0ZWQuXG4gKiBAcHJvcGVydHkge1wicGFyc2VkXCIgfCBcInJhd1wifSBbbW9kZV0gLSBQYXJzZWQgcGFyYW1zIGJ5IGRlZmF1bHQ7IHJhdyBwcmVzZXJ2ZXMgZXhhY3QgYnl0ZXMgYW5kIHNraXBzIGJvZHkgZGVjb2RpbmcuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHsoYXJnczogSHR0cFJlcXVlc3RCb2R5UG9saWN5UmVzb2x2ZXJBcmdzKSA9PiBIdHRwUmVxdWVzdEJvZHlQb2xpY3kgfCB1bmRlZmluZWR9IEh0dHBSZXF1ZXN0Qm9keVBvbGljeVJlc29sdmVyICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmVzb2x2ZWRIdHRwUmVxdWVzdEJvZHlQb2xpY3lcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBtYXhSZXF1ZXN0Qm9keUJ5dGVzIC0gRWZmZWN0aXZlIGRlY29kZWQgYm9keSBsaW1pdC5cbiAqIEBwcm9wZXJ0eSB7XCJwYXJzZWRcIiB8IFwicmF3XCJ9IG1vZGUgLSBFZmZlY3RpdmUgYm9keSBoYW5kbGluZyBtb2RlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSHR0cFNlcnZlckNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IEh0dHBDb21wcmVzc2lvbkNvbmZpZ3VyYXRpb259IFtjb21wcmVzc2lvbl0gLSBCdWZmZXJlZCByZXNwb25zZSBjb21wcmVzc2lvbi4gRW5hYmxlZCB3aXRoIGRvY3VtZW50ZWQgZGVmYXVsdHMgd2hlbiBhYnNlbnQ7IGZhbHNlIG9yIHtlbmFibGVkOiBmYWxzZX0gZGlzYWJsZXMgaXQgZ2xvYmFsbHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvc3RdIC0gSG9zdG5hbWUgdG8gYmluZCB0aGUgSFRUUCBzZXJ2ZXIgdG8uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpblByb2Nlc3NdIC0gUnVuIEhUVFAgaGFuZGxlcnMgaW4gdGhlIG1haW4gdGhyZWFkIGluc3RlYWQgb2Ygd29ya2VyIHRocmVhZHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heEJ1ZmZlcmVkUmVzcG9uc2VCb2R5Qnl0ZXNdIC0gTWF4aW11bSBVVEYtOC9iaW5hcnkgYnl0ZSBsZW5ndGggYWNjZXB0ZWQgYnkgYnVmZmVyZWQgcmVzcG9uc2UgYm9kaWVzLiBVbmJvdW5kZWQgd2hlbiBhYnNlbnQ7IHN0cmVhbWVkIGZpbGUgcmVzcG9uc2VzIGFyZSB1bmFmZmVjdGVkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhSZXF1ZXN0Qm9keUJ5dGVzXSAtIE1heGltdW0gZGVjb2RlZCByZXF1ZXN0LWJvZHkgYnl0ZXMgYWNjZXB0ZWQgYmVmb3JlIHJvdXRpbmcuIFVuYm91bmRlZCB3aGVuIGFic2VudC5cbiAqIEBwcm9wZXJ0eSB7SHR0cFJlcXVlc3RCb2R5UG9saWN5UmVzb2x2ZXJ9IFtyZXF1ZXN0Qm9keVBvbGljeVJlc29sdmVyXSAtIE9wdGlvbmFsIHN5bmNocm9ub3VzIGhlYWRlci1zdGFnZSByZXNvbHZlciBmb3IgcGVyLXJlcXVlc3QgbGltaXRzIGFuZCByYXctYm9keSBoYW5kbGluZy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4V29ya2Vyc10gLSBCYWNrd2FyZC1jb21wYXRpYmxlIGFsaWFzIGZvciB3b3JrZXJzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb3J0XSAtIFBvcnQgdG8gYmluZCB0aGUgSFRUUCBzZXJ2ZXIgdG8uXG4gKiBAcHJvcGVydHkge3ttYXhQZW5kaW5nQnl0ZXM/OiBudW1iZXIsIG1heFBlbmRpbmdNZXNzYWdlcz86IG51bWJlcn19IFt3ZWJzb2NrZXRJbmJvdW5kUXVldWVdIC0gUGVyLXNlc3Npb24gcmV0YWluZWQgaW5ib3VuZCBXZWJTb2NrZXQgbWVzc2FnZSBsaW1pdHMuXG4gKiBAcHJvcGVydHkge3ttYXhQZW5kaW5nQnl0ZXM/OiBudW1iZXIsIG1heFBlbmRpbmdGcmFtZXM/OiBudW1iZXJ9fSBbd2Vic29ja2V0T3V0Ym91bmRRdWV1ZV0gLSBQZXItY2xpZW50IHJldGFpbmVkIG91dGJvdW5kIFdlYlNvY2tldCBmcmFtZSBsaW1pdHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3dvcmtlcnNdIC0gV29ya2VyIGhhbmRsZXJzIHRvIHN0YXJ0IGZvciB0aGUgSFRUUCBzZXJ2ZXIuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iRXZlcnlPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlciB8IHN0cmluZ30gW2ZpcnN0SW5dIC0gRGVsYXkgYmVmb3JlIHRoZSBmaXJzdCBlbnF1ZXVlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2NoZWR1bGVkQmFja2dyb3VuZEpvYkNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbYXJnc10gLSBBcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBqb2Igd2hlbiBlbnF1ZXVlZC5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4vYmFja2dyb3VuZC1qb2JzL2pvYi5qc1wiKS5kZWZhdWx0fSBjbGFzcyAtIEpvYiBjbGFzcyB0byBlbnF1ZXVlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjcm9uXSAtIENyb250YWIgZXhwcmVzc2lvbiAoNS1maWVsZCBQT1NJWCwgcGx1cyBgQGhvdXJseWAvYEBkYWlseWAvYEB3ZWVrbHlgL2BAbW9udGhseWAvYEB5ZWFybHlgL2BAbWlkbmlnaHRgKS4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGV2ZXJ5YC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2VuYWJsZWRdIC0gV2hldGhlciB0aGUgc2NoZWR1bGUgaXMgZW5hYmxlZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgc3RyaW5nIHwgW251bWJlciB8IHN0cmluZywgU2NoZWR1bGVkQmFja2dyb3VuZEpvYkV2ZXJ5T3B0aW9uc119IFtldmVyeV0gLSBSZXBlYXQgaW50ZXJ2YWwuIEVpdGhlciBgZXZlcnlgIG9yIGBjcm9uYCBtdXN0IGJlIHNldC5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9iYWNrZ3JvdW5kLWpvYnMvdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9IFtvcHRpb25zXSAtIEpvYiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFZlbG9jaW91c1BhcmFtc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vZnJvbnRlbmQtbW9kZWxzL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT59IENsaWVudEVycm9yUGF5bG9hZFJlcG9ydGVyUGF5bG9hZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRXJyb3JSZXF1ZXN0RGV0YWlsc1xuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gW2JvZHldIC0gU2FuaXRpemVkIHBhcnNlZCByZXF1ZXN0IGJvZHksIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGh0dHBNZXRob2QgLSBSZXF1ZXN0IEhUVFAgbWV0aG9kLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBSZXF1ZXN0IHBhdGguXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDbGllbnRFcnJvclBheWxvYWRDb250ZXh0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29udHJvbGxlciAtIENvbnRyb2xsZXIgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYWN0aW9uXSAtIENvbnRyb2xsZXIgYWN0aW9uIG9yIGVuZHBvaW50IGxhYmVsLlxuICogQHByb3BlcnR5IHtcImluZGV4XCIgfCBcImZpbmRcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJhdHRhY2htZW50TGlzdFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIiB8IFwiY3VzdG9tLWNvbW1hbmRcIn0gW2NvbW1hbmRUeXBlXSAtIEZyb250ZW5kLW1vZGVsIGNvbW1hbmQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29ycmVsYXRpb25JZF0gLSBTZXJ2ZXItZ2VuZXJhdGVkIGlkZW50aWZpZXIgc2hhcmVkIGJ5IGFuIHVuZXhwZWN0ZWQgY2xpZW50IGVycm9yIGFuZCBmcmFtZXdvcmsgcmVwb3J0cy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2V4cGVjdGVkRXJyb3JdIC0gV2hldGhlciB0aGUgZXJyb3IgaXMgYW4gZXhwZWN0ZWQgdXNlci1mbG93IGZhaWx1cmUuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmcm9udGVuZE1vZGVsRW5kcG9pbnRdIC0gV2hldGhlciB0aGUgZXJyb3IgY2FtZSBmcm9tIHRoZSBmcm9udGVuZC1tb2RlbCBlbmRwb2ludC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbW9kZWxdIC0gRnJvbnRlbmQtbW9kZWwgbmFtZSBmcm9tIHRoZSBmYWlsZWQgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmVxdWVzdElkXSAtIFNoYXJlZCBmcm9udGVuZC1tb2RlbCByZXF1ZXN0IGlkLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhhcmdzOiB7XG4gKiAgIGNvbnRleHQ6IENsaWVudEVycm9yUGF5bG9hZENvbnRleHQsXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgcmVxdWVzdDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCxcbiAqICAgcmVxdWVzdERldGFpbHM6IEVycm9yUmVxdWVzdERldGFpbHMgfCBudWxsXG4gKiB9KSA9PiBQcm9taXNlPENsaWVudEVycm9yUGF5bG9hZFJlcG9ydGVyUGF5bG9hZCB8IHZvaWQ+IHwgQ2xpZW50RXJyb3JQYXlsb2FkUmVwb3J0ZXJQYXlsb2FkIHwgdm9pZH0gQ2xpZW50RXJyb3JQYXlsb2FkUmVwb3J0ZXJUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgdW5rbm93bj4gJiB7Y29uZmlndXJhdGlvbj86IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBjdXJyZW50RGV2aWNlPzogdW5rbm93biwgY3VycmVudFVzZXI/OiB1bmtub3duLCBtb2RlbFJlZ2lzdHJ5PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB7bW9kZWw6IChuYW1lOiBzdHJpbmcpID0+IHVua25vd259LCBub3c/OiBEYXRlIHwgKCgpID0+IERhdGUpLCBvZmZsaW5lR3JhbnQ/OiB1bmtub3duLCBwYXJhbXM/OiBWZWxvY2lvdXNQYXJhbXMsIHJlcXVlc3Q/OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0LCByZXNvdXJjZVJ1bnRpbWU/OiBcImJhY2tlbmRcIiB8IFwiZnJvbnRlbmRcIiB8IFwib2ZmbGluZVwifX0gVmVsb2Npb3VzTG9vc2VPYmplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtuZXcgKGFyZ3M6IHthdHRhY2htZW50TmFtZT86IHN0cmluZywgY29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIG1vZGVsQ2xhc3M/OiB0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgbmFtZT86IHN0cmluZywgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0pID0+IG9iamVjdH0gQXR0YWNobWVudERyaXZlckNvbnN0cnVjdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgU2NoZWR1bGVkQmFja2dyb3VuZEpvYkNvbmZpZ3VyYXRpb24+fSBqb2JzIC0gU2NoZWR1bGVkIGpvYnMga2V5ZWQgYnkgbmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoYXJnczoge2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSkgPT4gU2NoZWR1bGVkQmFja2dyb3VuZEpvYnNDb25maWd1cmF0aW9uIHwgUHJvbWlzZTxTY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0NvbmZpZ3VyYXRpb24+fSBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0xvYWRlclR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF0dGFjaG1lbnREcml2ZXJDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIG5hbWU6IHN0cmluZywgb3B0aW9uczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSkgPT4gUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbY3JlYXRlXSAtIE9wdGlvbmFsIGZhY3RvcnkgZm9yIGEgY3VzdG9tIGF0dGFjaG1lbnQgZHJpdmVyIGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtBdHRhY2htZW50RHJpdmVyQ29uc3RydWN0b3J9IFtkcml2ZXJDbGFzc10gLSBPcHRpb25hbCBjdXN0b20gYXR0YWNobWVudCBkcml2ZXIgY2xhc3MuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW2luc3RhbmNlXSAtIE9wdGlvbmFsIGN1c3RvbSBhdHRhY2htZW50IGRyaXZlciBpbnN0YW5jZS5cbiAqL1xuXG4vKipcbiAqIENsaWVudC1zYWZlIHN5bmNocm9uaXphdGlvbiBwb2xpY3kgZGVjbGFyZWQgd2l0aCBhIG1vZGVsIGF0dGFjaG1lbnQuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdHRhY2htZW50U3luY0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJlYWdlclwiIHwgXCJvbi1kZW1hbmRcIn0gZmV0Y2ggLSBXaGV0aGVyIGNsaWVudHMgcHJlZmV0Y2ggdGhlIGF0dGFjaG1lbnQgb3Igd2FpdCB1bnRpbCBpdCBpcyByZXF1ZXN0ZWQuXG4gKiBAcHJvcGVydHkge1wib3B0aW9uYWxcIiB8IFwicmVxdWlyZWRcIn0gb2ZmbGluZVJlcXVpcmVtZW50IC0gV2hldGhlciBhbiBvZmZsaW5lLXJlYWR5IHNjb3BlIHJlcXVpcmVzIHRoZSBhdHRhY2htZW50IGJ5dGVzLlxuICogQHByb3BlcnR5IHtcImR1cmFibGVcIiB8IFwiZXZpY3RhYmxlXCJ9IHJldGVudGlvbiAtIFdoZXRoZXIgY2xpZW50cyBtYXkgZXZpY3QgdGhlIGF0dGFjaG1lbnQgdW5kZXIgc3RvcmFnZSBwcmVzc3VyZS5cbiAqL1xuXG4vKipcbiAqIE1vZGVsIGF0dGFjaG1lbnQgZGVjbGFyYXRpb24gcmV0YWluZWQgYnkgdGhlIHJlY29yZCBjbGFzcy5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlY29yZEF0dGFjaG1lbnRDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IEF0dGFjaG1lbnREcml2ZXJDb25zdHJ1Y3RvciB8IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW2RyaXZlcl0gLSBBdHRhY2htZW50IGRyaXZlciBuYW1lLCBjbGFzcywgb3IgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge0F0dGFjaG1lbnRTeW5jQ29uZmlndXJhdGlvbn0gW3N5bmNdIC0gQ2xpZW50LXNhZmUgc3luY2hyb25pemVkIGFzc2V0IHBvbGljeS5cbiAqIEBwcm9wZXJ0eSB7XCJoYXNPbmVcIiB8IFwiaGFzTWFueVwifSB0eXBlIC0gQXR0YWNobWVudCBjYXJkaW5hbGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF0dGFjaG1lbnRzQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkZWZhdWx0RHJpdmVyXSAtIERlZmF1bHQgYXR0YWNobWVudCBzdG9yYWdlIGRyaXZlciBuYW1lLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBBdHRhY2htZW50RHJpdmVyQ29uZmlndXJhdGlvbiAmIFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59IFtkcml2ZXJzXSAtIE5hbWVkIGF0dGFjaG1lbnQgZHJpdmVyIGNvbmZpZ3VyYXRpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbYWxsb3dQYXRoSW5wdXRdIC0gV2hldGhlciBge3BhdGg6IC4uLn1gIGF0dGFjaG1lbnQgaW5wdXQgaXMgYWxsb3dlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFthbGxvd2VkUGF0aFByZWZpeGVzXSAtIE9wdGlvbmFsIGFsbG93bGlzdCBvZiBkaXJlY3RvcmllcyBmb3IgYHtwYXRoOiAuLi59YCBpbnB1dC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1haWxlckJhY2tlbmRcbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHtwYXlsb2FkOiBpbXBvcnQoXCIuL21haWxlci5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWQsIGNvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSkgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gZGVsaXZlciAtIERlbGl2ZXIgYSBtYWlsZXIgcGF5bG9hZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gaW1wb3J0KFwiLi9tYWlsZXIuanNcIikuTWFpbGVyRGVsaXZlcnlJZGVtcG90ZW5jeUNhcGFiaWxpdHl9IFtkZWxpdmVyeUlkZW1wb3RlbmN5Q2FwYWJpbGl0eV0gLSBFeHBsaWNpdCBwcm92aWRlci1iYWNrZWQgZHVwbGljYXRlLXN1cHByZXNzaW9uIGNhcGFiaWxpdHkuIEdlbmVyaWMgU01UUCBvbWl0cyB0aGlzIGFuZCByZW1haW5zIGF0LWxlYXN0LW9uY2UuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7cGF5bG9hZDogaW1wb3J0KFwiLi9tYWlsZXIuanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkfSkgPT4gaW1wb3J0KFwiLi9tYWlsZXIuanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkfSBbcHJlcGFyZURlbGl2ZXJ5T3BlcmF0aW9uUGF5bG9hZF0gLSBSZXNvbHZlcyBwcm92aWRlciBkZWZhdWx0cyBpbnRvIHRoZSBpbW11dGFibGUgcGF5bG9hZCBiZWZvcmUgcmVxdWlyZWQtb3BlcmF0aW9uIGhhc2hpbmcgYW5kIGVucXVldWUuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7ZGVsaXZlcnlPcGVyYXRpb246IGltcG9ydChcIi4vbWFpbGVyLmpzXCIpLk1haWxlckRlbGl2ZXJ5T3BlcmF0aW9uUmVxdWVzdCB8IGltcG9ydChcIi4vbWFpbGVyLmpzXCIpLk1haWxlckRlbGl2ZXJ5T3BlcmF0aW9uLCBwYXlsb2FkOiBpbXBvcnQoXCIuL21haWxlci5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWR9KSA9PiB2b2lkfSBbdmFsaWRhdGVEZWxpdmVyeU9wZXJhdGlvbl0gLSBQcm92aWRlci1zcGVjaWZpYyBvcGVyYXRpb24gYW5kIHBheWxvYWQgdmFsaWRhdGlvbiBwZXJmb3JtZWQgYmVmb3JlIGVucXVldWUgYW5kIGV2ZXJ5IG5ldHdvcmsgYXR0ZW1wdC5cbiAqL1xuXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIHN0cmluZ1tdPn0gTG9jYWxlRmFsbGJhY2tzVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbFJlbGF0aW9uc2hpcENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJiZWxvbmdzVG9cIiB8IFwiaGFzT25lXCIgfCBcImhhc01hbnlcIn0gdHlwZSAtIFJlbGF0aW9uc2hpcCB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFttb2RlbF0gLSBUYXJnZXQgbW9kZWwgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY2xhc3NOYW1lXSAtIEFsaWFzIG9mIHRhcmdldCBtb2RlbCBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFttb2RlbENsYXNzTmFtZV0gLSBFeHBsaWNpdCB0YXJnZXQgbW9kZWwgY2xhc3MgbmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxBdHRyaWJ1dGVDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3R5cGVdIC0gQ29sdW1uIHR5cGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29sdW1uVHlwZV0gLSBBbGlhcyBmb3IgY29sdW1uIHR5cGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3FsVHlwZV0gLSBBbGlhcyBmb3IgY29sdW1uIHR5cGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGF0YVR5cGVdIC0gQWxpYXMgZm9yIGNvbHVtbiB0eXBlIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2pzRG9jVHlwZV0gLSBFeGFjdCBnZW5lcmF0ZWQgSlNEb2MgdHlwZSBmb3Igbm9uLWNvbHVtbiBhdHRyaWJ1dGVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIEF0dHJpYnV0ZSBuYW1lIHdoZW4gY29uZmlndXJlZCBhcyBhbiBhcnJheSBlbnRyeS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW251bGxdIC0gV2hldGhlciB2YWx1ZSBjYW4gYmUgbnVsbC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3NlbGVjdGVkQnlEZWZhdWx0XSAtIFdoZXRoZXIgaW5jbHVkZWQgaW4gZGVmYXVsdCBzZXJpYWxpemF0aW9uLiBEZWZhdWx0cyB0byB0cnVlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbEF0dGFjaG1lbnRDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge0F0dGFjaG1lbnRTeW5jQ29uZmlndXJhdGlvbn0gW3N5bmNdIC0gQ2xpZW50LXNpZGUgc3luY2hyb25pemVkIGFzc2V0IHBvbGljeS5cbiAqIEBwcm9wZXJ0eSB7XCJoYXNPbmVcIiB8IFwiaGFzTWFueVwifSB0eXBlIC0gQXR0YWNobWVudCBjYXJkaW5hbGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nIHwgRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+IHwgUmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gfCBpbXBvcnQoXCIuL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdCB8IGJvb2xlYW4+fSBhdHRyaWJ1dGVzIC0gQXR0cmlidXRlcyB0byBleHBvc2Ugb24gdGhlIGZyb250ZW5kIG1vZGVsLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2FiaWxpdGllc10gLSBBZGRpdGlvbmFsIGNhbWVsQ2FzZSBhYmlsaXR5IGFjdGlvbiBuYW1lcyB0byBleHBvc2UgZm9yIHBlci1yZWNvcmQgYHJlY29yZC5jYW4oYWN0aW9uKWAgcmVhZHMuIEJhc2UgQ1JVRCBhY3Rpb25zIChgcmVhZGAsIGBjcmVhdGVgLCBgdXBkYXRlYCwgYGRlc3Ryb3lgKSBhcmUgYWx3YXlzIGluY2x1ZGVkIGFuZCBtdXN0IG5vdCBiZSBsaXN0ZWQgaGVyZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbEF0dGFjaG1lbnRDb25maWd1cmF0aW9uPn0gW2F0dGFjaG1lbnRzXSAtIEF0dGFjaG1lbnQgaGVscGVycyBrZXllZCBieSBhdHRhY2htZW50IG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbY29tbWFuZHNdIC0gTGVnYWN5IGJ1aWx0LWluIGNvbW1hbmQgbmFtZXMgKGBpbmRleGAsIGBmaW5kYCwgYGNyZWF0ZWAsIGB1cGRhdGVgLCBgZGVzdHJveWAsIGBhdHRhY2hgLCBgZG93bmxvYWRgLCBgdXJsYCkuXG4gKiBAcHJvcGVydHkge0FycmF5PEZyb250ZW5kTW9kZWxSZXNvdXJjZUN1c3RvbUNvbW1hbmQ+fSBbY29sbGVjdGlvbkNvbW1hbmRzXSAtIEN1c3RvbSBjb2xsZWN0aW9uIGNvbW1hbmRzLiBFYWNoIGVudHJ5IGlzIGEgY2FtZWxDYXNlIG1ldGhvZCBuYW1lLCBvciBhIGB7bmFtZSwgYXJncz8sIHJldHVyblR5cGU/fWAgb2JqZWN0IGRlY2xhcmluZyB0eXBlZCBhcmd1bWVudHMgYW5kL29yIGEgcmVzcG9uc2UgdHlwZS4gVGhlIHJ1bnRpbWUgZGVyaXZlcyB0aGUga2ViYWItY2FzZSBjb21tYW5kIHNsdWcgZnJvbSB0aGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8RnJvbnRlbmRNb2RlbFJlc291cmNlQ3VzdG9tQ29tbWFuZD59IFttZW1iZXJDb21tYW5kc10gLSBDdXN0b20gbWVtYmVyIGNvbW1hbmRzLiBFYWNoIGVudHJ5IGlzIGEgY2FtZWxDYXNlIG1ldGhvZCBuYW1lLCBvciBhIGB7bmFtZSwgYXJncz8sIHJldHVyblR5cGU/fWAgb2JqZWN0IGRlY2xhcmluZyB0eXBlZCBhcmd1bWVudHMgYW5kL29yIGEgcmVzcG9uc2UgdHlwZS4gVGhlIHJ1bnRpbWUgZGVyaXZlcyB0aGUga2ViYWItY2FzZSBjb21tYW5kIHNsdWcgZnJvbSB0aGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzXSAtIEJ1aWx0LWluIGNvbGxlY3Rpb24gY29tbWFuZCBuYW1lcyAoYGluZGV4YCwgYGNyZWF0ZWApLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2J1aWx0SW5NZW1iZXJDb21tYW5kc10gLSBCdWlsdC1pbiBtZW1iZXIgY29tbWFuZCBuYW1lcyAoYGZpbmRgLCBgdXBkYXRlYCwgYGRlc3Ryb3lgLCBgYXR0YWNoYCwgYGRvd25sb2FkYCwgYHVybGApLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFttb2RlbE5hbWVdIC0gRnJvbnRlbmQgbW9kZWwgbmFtZSBvdmVycmlkZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtyZWxhdGlvbnNoaXBzXSAtIFJlbGF0aW9uc2hpcCBuYW1lcyB0byBleHBvc2UgaW4gZnJvbnRlbmQgbW9kZWxzLiBUeXBlIGFuZCB0YXJnZXQgbW9kZWwgYXJlIGluZmVycmVkIGZyb20gdGhlIGJhY2tlbmQgbW9kZWwncyByZWdpc3RlcmVkIHJlbGF0aW9uc2hpcHMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IHN0cmluZ1tdfSBbcHJpbWFyeUtleV0gLSBQcmltYXJ5IGtleSBhdHRyaWJ1dGUgbmFtZSBvciBvcmRlcmVkIGNvbXBvc2l0ZSBwcmltYXJ5LWtleSBhdHRyaWJ1dGUgbmFtZXMuXG4gKiBAcHJvcGVydHkge0Zyb250ZW5kTW9kZWxSZXNvdXJjZVNlcnZlckNvbmZpZ3VyYXRpb259IFtzZXJ2ZXJdIC0gT3B0aW9uYWwgbGVnYWN5IGJhY2tlbmQgYmVoYXZpb3Igb3ZlcnJpZGVzIGZvciBidWlsdC1pbiBmcm9udGVuZCBhY3Rpb25zLlxuICogQHByb3BlcnR5IHtGcm9udGVuZE1vZGVsUmVzb3VyY2VTeW5jQ29uZmlndXJhdGlvbiB8IGJvb2xlYW59IFtzeW5jXSAtIE9wdGlvbmFsIHNhZmUgbG9jYWwvb2ZmbGluZSBzeW5jIHBvbGljeSBtZXRhZGF0YS4gYHBvbGljeWAgcGFydGljaXBhdGVzIGluIHRoZSBoYXNoIGJ1dCBpcyBub3QgZXhwb3NlZCB0byBnZW5lcmF0ZWQgZnJvbnRlbmQgY29uZmlnL21hbmlmZXN0LlxuICovXG5cbi8qKlxuICogT2JqZWN0IGZvcm0gb2YgYSBjdXN0b20gY29tbWFuZCBlbnRyeSwgZGVjbGFyaW5nIGl0cyB0eXBlZCBhcmd1bWVudHMgYW5kL29yXG4gKiByZXNwb25zZSB0eXBlIGFsb25nc2lkZSB0aGUgY29tbWFuZCBuYW1lLlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbFJlc291cmNlQ3VzdG9tQ29tbWFuZE9iamVjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBjYW1lbENhc2UgY29tbWFuZCBtZXRob2QgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT59IFthcmdzXSAtIFR5cGVkIGNvbW1hbmQgYXJndW1lbnRzOyBlYWNoIGdlbmVyYXRlcyBhIG5hbWVkLCB0eXBlZCBtZXRob2QgcGFyYW1ldGVyIG1hcHBlZCBwb3NpdGlvbmFsbHkgaW50byB0aGUgY29tbWFuZCBwYXlsb2FkLiBgdHlwZWAgaXMgYSBKU0RvYyB0eXBlIHN0cmluZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmV0dXJuVHlwZV0gLSBKU0RvYyB0eXBlIGZvciB0aGUgY29tbWFuZCByZXNwb25zZS4gV2hlbiBzZXQsIHRoZSBnZW5lcmF0ZWQgbWV0aG9kIGlzIHR5cGVkIGBQcm9taXNlPHJldHVyblR5cGU+YCBpbnN0ZWFkIG9mIGBQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj5gLiBFbWl0dGVkIHZlcmJhdGltIGludG8gdGhlIGdlbmVyYXRlZCBmcm9udGVuZCBtb2RlbCwgc28gaXQgbXVzdCByZXNvbHZlIHRoZXJlLlxuICovXG5cbi8qKlxuICogQSBjdXN0b20gY29tbWFuZCBlbnRyeTogYSBwbGFpbiBjYW1lbENhc2UgbWV0aG9kIG5hbWUsIG9yIGFuIG9iamVjdCBkZWNsYXJpbmdcbiAqIHR5cGVkIGFyZ3MgYW5kL29yIGEgcmVzcG9uc2UgdHlwZS5cbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCBGcm9udGVuZE1vZGVsUmVzb3VyY2VDdXN0b21Db21tYW5kT2JqZWN0fSBGcm9udGVuZE1vZGVsUmVzb3VyY2VDdXN0b21Db21tYW5kXG4gKi9cblxuLyoqXG4gKiBKU09OIHZhbHVlIGFjY2VwdGVkIGJ5IHN5bmMgcG9saWN5IG1ldGFkYXRhL2hhc2ggaW5wdXRzLlxuICogQHR5cGVkZWYge251bGwgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5rbm93bltdIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj59IEZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlXG4gKi9cblxuLyoqXG4gKiBGcm9udGVuZC1tb2RlbCBsb2NhbC9vZmZsaW5lIHN5bmMgcG9saWN5IGNvbmZpZy4gYG1ldGFkYXRhYCBpcyBleHBvc2VkIHRvXG4gKiBmcm9udGVuZHMgYW5kIHBlZXJzOyBgcG9saWN5YCBpcyBoYXNoZWQgYnV0IGludGVudGlvbmFsbHkgb21pdHRlZCBmcm9tXG4gKiBmcm9udGVuZC1zYWZlIG1hbmlmZXN0cy5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxSZXNvdXJjZVN5bmNDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge1wib3B0aW1pc3RpY1ZlcnNpb25cIiB8IFwic2VydmVyV2luc1wiIHwgXCJsYXN0V3JpdGVyV2luc1wiIHwgXCJmaWVsZFRocmVlV2F5XCIgfCBcImFwcGVuZE9ubHlcIn0gW2NvbmZsaWN0U3RyYXRlZ3ldIC0gU3RyYXRlZ3kgdXNlZCB3aGVuIHJlcGxheSBkZXRlY3RzIHNlcnZlci9jbGllbnQgZGl2ZXJnZW5jZS4gRGVmYXVsdHMgdG8gYG9wdGltaXN0aWNWZXJzaW9uYC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2VuYWJsZWRdIC0gV2hldGhlciB0aGUgcmVzb3VyY2UgaXMgc3luYy1lbmFibGVkLiBEZWZhdWx0cyB0byB0cnVlIHdoZW4gYHN5bmNgIGlzIGNvbmZpZ3VyZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbb3BlcmF0aW9uc10gLSBTeW5jIG9wZXJhdGlvbiBuYW1lcyBzdWNoIGFzIGBpbmRleGAsIGBmaW5kYCwgYGNyZWF0ZWAsIGB1cGRhdGVgLCBjdXN0b20gZG9tYWluIGNvbW1hbmRzLCBldGMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bWJlcn0gW3BvbGljeVZlcnNpb25dIC0gQXBwLWNvbnRyb2xsZWQgcG9saWN5IHZlcnNpb24gdXNlZCBhcyBhIHN0YWJsZSBjaGFuZ2Ugc2lnbmFsLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IFttZXRhZGF0YV0gLSBTYWZlIGZyb250ZW5kLXZpc2libGUgbWV0YWRhdGEuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIEZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gW3BvbGljeV0gLSBEZXRlcm1pbmlzdGljIG5vbi1zZWNyZXQgcG9saWN5IGlucHV0cyBpbmNsdWRlZCBpbiB0aGUgcG9saWN5IGhhc2ggb25seS5cbiAqL1xuXG4vKipcbiAqIFZlbG9jaW91cyBzeW5jIEFQSSBlbmRwb2ludCBjb25maWd1cmF0aW9uLlxuICogQHR5cGVkZWYge29iamVjdH0gVmVsb2Npb3VzU3luY0FwaUNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbW91bnRQYXRoXSAtIE1vdW50IHBhdGggZm9yIHRoZSBzeW5jIGVuZHBvaW50cy4gRGVmYXVsdHMgdG8gXCIvdmVsb2Npb3VzL3N5bmNcIi5cbiAqIEBwcm9wZXJ0eSB7RnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlfSByZXNvdXJjZUNsYXNzIC0gQXBwIHN5bmMgcmVzb3VyY2UgY2xhc3Mgc2VydmVkIGJ5IHRoZSBhdXRvLW1vdW50ZWQgc3luYyBlbmRwb2ludHMuXG4gKi9cblxuLyoqXG4gKiBDbGllbnQtc2lkZSBzeW5jIHRyYW5zcG9ydCBvd25pbmcgSFRUUCBQT1NUcyB0byB0aGUgZnJhbWV3b3JrIHN5bmMgZW5kcG9pbnRzLFxuICogbWF0Y2hpbmcgdGhlIGZyb250ZW5kLW1vZGVsIHdlYnNvY2tldCBjbGllbnQgcG9zdCBjb250cmFjdC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZlbG9jaW91c1N5bmNDbGllbnRUcmFuc3BvcnRcbiAqIEBwcm9wZXJ0eSB7KHBhdGg6IHN0cmluZywgYm9keT86IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBvcHRpb25zPzoge2hlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBzaWduYWw/OiBBYm9ydFNpZ25hbH0pID0+IFByb21pc2U8e2pzb246ICgpID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fT59IHBvc3QgLSBQb3N0cyBvbmUgcmVxdWVzdCBhbmQgcmVzb2x2ZXMgYSByZXNwb25zZSB3aXRoIGEganNvbiBhY2Nlc3Nvci5cbiAqL1xuXG4vKipcbiAqIFdlYnNvY2tldCBjbGllbnQgY29udHJhY3QgcmVxdWlyZWQgZnJvbSBgc3luYy5jbGllbnQucmVhbHRpbWUuY3JlYXRlQ2xpZW50YCxcbiAqIG1hdGNoaW5nIGBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRgIC8gc25hcHJlcSdzIHdlYnNvY2tldCBjbGllbnQuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWZWxvY2lvdXNTeW5jUmVhbHRpbWVXZWJzb2NrZXRDbGllbnRcbiAqIEBwcm9wZXJ0eSB7KG9wdGlvbnM/OiB7c2lnbmFsPzogQWJvcnRTaWduYWx9KSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gY29ubmVjdCAtIENvbm5lY3RzIHRoZSB3ZWJzb2NrZXQuXG4gKiBAcHJvcGVydHkgeyhjaGFubmVsVHlwZTogc3RyaW5nLCBvcHRpb25zPzoge3BhcmFtcz86IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Piwgb25NZXNzYWdlPzogKGJvZHk6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+KSA9PiB2b2lkLCBvblJlc3VtZT86ICgpID0+IHZvaWQsIG9uQ2xvc2U/OiAocmVhc29uOiBzdHJpbmcpID0+IHZvaWR9KSA9PiBWZWxvY2lvdXNTeW5jUmVhbHRpbWVTdWJzY3JpcHRpb259IHN1YnNjcmliZUNoYW5uZWwgLSBPcGVucyBvbmUgY2hhbm5lbCBzdWJzY3JpcHRpb24uXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8dm9pZD59IGRpc2Nvbm5lY3RBbmRTdG9wUmVjb25uZWN0IC0gQ2xvc2VzIHRoZSBzb2NrZXQgYW5kIHN0b3BzIGF1dG8tcmVjb25uZWN0LlxuICovXG5cbi8qKlxuICogQ2hhbm5lbCBzdWJzY3JpcHRpb24gaGFuZGxlIHJldHVybmVkIGJ5IGBzdWJzY3JpYmVDaGFubmVsYC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZlbG9jaW91c1N5bmNSZWFsdGltZVN1YnNjcmlwdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBjbG9zZSAtIENsb3NlcyB0aGUgc3Vic2NyaXB0aW9uLlxuICogQHByb3BlcnR5IHsoKSA9PiBib29sZWFufSBpc1JlYWR5IC0gV2hldGhlciB0aGUgc3Vic2NyaXB0aW9uIGlzIGFja25vd2xlZGdlZCBhbmQgcmVhZHkuXG4gKiBAcHJvcGVydHkgeyhwYXJhbXM/OiB7c2lnbmFsPzogQWJvcnRTaWduYWwsIHRpbWVvdXRNcz86IG51bWJlcn0pID0+IFByb21pc2U8dm9pZD59IHdhaXRGb3JSZWFkeSAtIFJlc29sdmVzIG9uY2UgdGhlIHNlcnZlciBhY2tub3dsZWRnZXMgdGhlIHN1YnNjcmlwdGlvbi5cbiAqL1xuXG4vKipcbiAqIE9uZSByZWFsdGltZSBjaGFubmVsIHN1YnNjcmlwdGlvbiBkZXNjcmlwdG9yLlxuICogQHR5cGVkZWYge29iamVjdH0gVmVsb2Npb3VzU3luY1JlYWx0aW1lQ2hhbm5lbERlc2NyaXB0b3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjaGFubmVsIC0gU2VydmVyIGNoYW5uZWwgbmFtZSB0byBzdWJzY3JpYmUuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW3BhcmFtc10gLSBTdWJzY3JpYmUgcGFyYW1zIChydW50aW1lIHNjb3BlIHZhbHVlcykuIFRoZSBmcmFtZXdvcmsgaW5qZWN0cyBgYXV0aGVudGljYXRpb25Ub2tlbmAgYXV0b21hdGljYWxseS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmVzb3VyY2VUeXBlXSAtIERlZmF1bHQgcmVzb3VyY2UvbW9kZWwgbmFtZSBmb3IgcHVzaGVkIGNoYW5nZXMgdGhhdCBkbyBub3QgY2FycnkgdGhlaXIgb3duIHJlc291cmNlVHlwZS5cbiAqL1xuXG4vKipcbiAqIFJlYWx0aW1lIHB1c2ggY29uZmlndXJhdGlvbiBmb3IgdGhlIHN5bmMgY2xpZW50LiBPbmx5IHRoZSBnZW51aW5lbHlcbiAqIGFwcC1vd25lZCBjYWxsYmFjayBsaXZlcyBoZXJlOiBob3cgdG8gYnVpbGQgdGhlIHdlYnNvY2tldCBjbGllbnQuXG4gKiBFdmVyeXRoaW5nIGVsc2UgLSBkZXJpdmluZyB0aGUgZnJhbWV3b3JrIHN5bmMgY2hhbm5lbCBzdWJzY3JpcHRpb25zIGZyb21cbiAqIHRoZSBkZWNsYXJlZCBwdWxsIHNjb3Blcywgc3Vic2NyaWJpbmcsIGFwcGx5aW5nIHB1c2hlcyB0aHJvdWdoIHRoZSBkZXJpdmVkXG4gKiByZXNvdXJjZSBhcHBsaWVyLCBlY2hvIHN1cHByZXNzaW9uLCBhbmQgcHVsbC1vbi1yZWNvbm5lY3QgLSBpcyBkZXJpdmVkLlxuICogQHR5cGVkZWYge29iamVjdH0gVmVsb2Npb3VzU3luY0NsaWVudFJlYWx0aW1lQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBWZWxvY2lvdXNTeW5jUmVhbHRpbWVXZWJzb2NrZXRDbGllbnQgfCBQcm9taXNlPFZlbG9jaW91c1N5bmNSZWFsdGltZVdlYnNvY2tldENsaWVudD59IGNyZWF0ZUNsaWVudCAtIEJ1aWxkcyB0aGUgKHVuY29ubmVjdGVkKSB3ZWJzb2NrZXQgY2xpZW50OyB0aGUgZnJhbWV3b3JrIG93bnMgY29ubmVjdC9kaXNjb25uZWN0LlxuICogQHByb3BlcnR5IHsoY29udGV4dDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+IEFycmF5PFZlbG9jaW91c1N5bmNSZWFsdGltZUNoYW5uZWxEZXNjcmlwdG9yPiB8IFByb21pc2U8QXJyYXk8VmVsb2Npb3VzU3luY1JlYWx0aW1lQ2hhbm5lbERlc2NyaXB0b3I+Pn0gW2NoYW5uZWxzXSAtIERlcHJlY2F0ZWQgbGVnYWN5IGVzY2FwZSBoYXRjaDogcmVzb2x2ZXMgZXh0cmEgYXBwLWNoYW5uZWwgZGVzY3JpcHRvcnMgZnJvbSB0aGUgYHN1YnNjcmliZVJlYWx0aW1lKGNvbnRleHQpYCBjb250ZXh0LiBEZWNsYXJlZCBwdWxsIHNjb3BlcyBzdWJzY3JpYmUgdGhlIGZyYW1ld29yayBzeW5jIGNoYW5uZWwgYXV0b21hdGljYWxseS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+fSBbbG9jYWxPcmlnaW5dIC0gUmVzb2x2ZXMgdGhpcyBkZXZpY2UncyBlY2hvIG9yaWdpbjsgcHVzaGVkIG1lc3NhZ2VzIHdpdGggYSBtYXRjaGluZyBgZWNob09yaWdpbmAgYXJlIGRyb3BwZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwdWxsT25SZWNvbm5lY3RdIC0gRmlyZSBhIGNvYWxlc2NlZCBgcHVsbCgpYCB3aGVuIHN1YnNjcmlwdGlvbnMgYmVjb21lIHJlYWR5IG9yIHJlc3VtZSBhZnRlciBhIGRyb3AsIGNsb3Npbmcgb2ZmbGluZSBnYXBzLiBEZWZhdWx0cyB0byB0cnVlLlxuICovXG5cbi8qKlxuICogQ2xpZW50LXNpZGUgc3luYyBjb25maWd1cmF0aW9uIGNvbnN1bWVkIGJ5IGBTeW5jQ2xpZW50LmZyb21Db25maWd1cmF0aW9uKC4uLilgLlxuICogVGhlIGZyYW1ld29yayBvd25zIHRoZSBgJHttb3VudFBhdGh9L2NoYW5nZXNgIGFuZCBgJHttb3VudFBhdGh9L3JlcGxheWBcbiAqIFBPU1RlcnMgb3ZlciB0aGUgZ2l2ZW4gdHJhbnNwb3J0LlxuICogQHR5cGVkZWYge29iamVjdH0gVmVsb2Npb3VzU3luY0NsaWVudENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+fSBhdXRoZW50aWNhdGlvblRva2VuIC0gUmVzb2x2ZXMgdGhlIGF1dGggdG9rZW4gc2VudCB3aXRoIHN5bmMgcmVxdWVzdHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2JhdGNoU2l6ZV0gLSBNYXggc3luY3MgcGVyIHJlcXVlc3QuXG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+fSBbaXNPbmxpbmVdIC0gQ29ubmVjdGl2aXR5IGdhdGUgZm9yIHB1bGxzIGFuZCByZXBsYXlzLiBEZWZhdWx0cyB0byBhbHdheXMgb25saW5lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFttb3VudFBhdGhdIC0gTW91bnQgcGF0aCB0aGUgc2VydmVyIHNlcnZlcyB0aGUgc3luYyBlbmRwb2ludHMgdW5kZXIgKG1hdGNoIHRoZSBzZXJ2ZXIncyBgc3luYy5hcGkubW91bnRQYXRoYCkuIERlZmF1bHRzIHRvIFwiL3ZlbG9jaW91cy9zeW5jXCI7IG5vcm1hbGl6YXRpb24gc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMgYW5kIGFsd2F5cyBmaWxscyBpbiB0aGUgZGVmYXVsdC5cbiAqIEBwcm9wZXJ0eSB7KGVycm9yOiBFcnJvcikgPT4gdm9pZH0gW29uRXJyb3JdIC0gUmVwb3J0cyBiYWNrZ3JvdW5kIHJlcGxheS9wdWxsIGZhaWx1cmVzLiBEZWZhdWx0cyB0byByZXRocm93aW5nLlxuICogQHByb3BlcnR5IHtWZWxvY2lvdXNTeW5jQ2xpZW50UmVhbHRpbWVDb25maWd1cmF0aW9ufSBbcmVhbHRpbWVdIC0gUmVhbHRpbWUgcHVzaCBjb25maWd1cmF0aW9uIGNvbnN1bWVkIGJ5IGBzdWJzY3JpYmVSZWFsdGltZSguLi4pYC5cbiAqIEBwcm9wZXJ0eSB7VmVsb2Npb3VzU3luY0NsaWVudFRyYW5zcG9ydH0gdHJhbnNwb3J0IC0gVHJhbnNwb3J0IHBvc3RpbmcgdG8gdGhlIGZyYW1ld29yayBzeW5jIGVuZHBvaW50cyAoZS5nLiB0aGUgZnJvbnRlbmQtbW9kZWwgd2Vic29ja2V0IGNsaWVudCkuXG4gKiBAcHJvcGVydHkge1ZlbG9jaW91c1N5bmNSZWFsdGltZVdlYnNvY2tldENsaWVudH0gW3dlYnNvY2tldENsaWVudF0gLSBTaGFyZWQgYXBwLWxpZmV0aW1lIHdlYnNvY2tldCBjbGllbnQgKHRoZSBsb3ctbGV2ZWwgZm9ybSkgdGhhdCBhbGwgc3luYyB0cmFmZmljIHJpZGVzLiBQcm92aWRlIHRoZSBzYW1lIGluc3RhbmNlIHRoZSBmcm9udGVuZC1tb2RlbCB0cmFuc3BvcnQgdXNlcyBzbyBvbmUgY29ubmVjdGlvbiBjYXJyaWVzIGV2ZXJ5dGhpbmcuIFdoZW4gc2V0LCB0aGUgcmVhbHRpbWUgYnJpZGdlIHN1YnNjcmliZXMgY2hhbm5lbHMgb24gaXQgYW5kIG5ldmVyIG93bnMgaXRzIGxpZmVjeWNsZTogdW5zdWJzY3JpYmluZyBjbG9zZXMgb25seSBjaGFubmVsIHN1YnNjcmlwdGlvbnMsIGxlYXZpbmcgdGhlIHNvY2tldCBjb25uZWN0ZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8ICgoKSA9PiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKX0gW3dlYnNvY2tldFVybF0gLSBTaGFyZWQgYXBwLWxpZmV0aW1lIHdlYnNvY2tldCBVUkwuIFdoZW4gc2V0IChhbmQgbm8gYHdlYnNvY2tldENsaWVudGAgaXMgZ2l2ZW4pLCB0aGUgZnJhbWV3b3JrIGJ1aWxkcyBhbmQgb3ducyBvbmUgcmVjb25uZWN0aW5nIGBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRgIGZvciBhbGwgc3luYyB0cmFmZmljLCBjb25uZWN0ZWQgb24gZmlyc3QgdXNlLlxuICovXG5cbi8qKlxuICogVmVsb2Npb3VzIHN5bmMgY29uZmlndXJhdGlvbi5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZlbG9jaW91c1N5bmNDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge1ZlbG9jaW91c1N5bmNBcGlDb25maWd1cmF0aW9ufSBbYXBpXSAtIEF1dG8tbW91bnRzIHRoZSBWZWxvY2lvdXMgc3luYyBjaGFuZ2VzL3JlcGxheSBlbmRwb2ludHMgZm9yIHRoaXMgcmVzb3VyY2UgY2xhc3MuXG4gKiBAcHJvcGVydHkge1ZlbG9jaW91c1N5bmNDbGllbnRDb25maWd1cmF0aW9ufSBbY2xpZW50XSAtIENsaWVudC1zaWRlIHN5bmMgY29uZmlndXJhdGlvbiBjb25zdW1lZCBieSBgU3luY0NsaWVudC5mcm9tQ29uZmlndXJhdGlvbiguLi4pYC5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9zeW5jL2RldmljZS1pZGVudGl0eS5qc1wiKS5TeW5jSnNvbldlYktleSB8IG51bGx9IFtkZXZpY2VDZXJ0aWZpY2F0ZUJhY2tlbmRQdWJsaWNLZXldIC0gUHVibGljIGJhY2tlbmQga2V5IHVzZWQgdG8gdmVyaWZ5IG9mZmxpbmUgZGV2aWNlIGNlcnRpZmljYXRlcyBmb3Igc3luYyByZXBsYXkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2NoYW5nZUZlZWRSZXRlbnRpb25TaXplXSAtIE51bWJlciBvZiBhY2NlcHRlZCBzZXJ2ZXIgY2hhbmdlcyByZXRhaW5lZCBiZWZvcmUgY2xpZW50cyBtdXN0IHJlZnJlc2ggZnJvbSBzbmFwc2hvdC5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8aW1wb3J0KFwiLi9zeW5jL29mZmxpbmUtZ3JhbnQuanNcIikuT2ZmbGluZUdyYW50U2lnbmluZ0tleT59IG9mZmxpbmVHcmFudFNpZ25pbmdLZXlzIC0gU2lnbmluZyBrZXlzIHVzZWQgdG8gaXNzdWUgYW5kIHZlcmlmeSBvZmZsaW5lIGdyYW50cy4gU2VjcmV0cyBtdXN0IG5ldmVyIGJlIGV4cG9zZWQgdG8gY2xpZW50cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbb2ZmbGluZUdyYW50VHRsTXNdIC0gRGVmYXVsdCBvZmZsaW5lIGdyYW50IFRUTCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDI0IGhvdXJzLlxuICovXG5cbi8qKlxuICogRnJvbnRlbmQtc2FmZSBub3JtYWxpemVkIHN5bmMgbWV0YWRhdGEuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlU3luY0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJvcHRpbWlzdGljVmVyc2lvblwiIHwgXCJzZXJ2ZXJXaW5zXCIgfCBcImxhc3RXcml0ZXJXaW5zXCIgfCBcImZpZWxkVGhyZWVXYXlcIiB8IFwiYXBwZW5kT25seVwifSBjb25mbGljdFN0cmF0ZWd5IC0gTm9ybWFsaXplZCByZXBsYXkgY29uZmxpY3Qgc3RyYXRlZ3kuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSByZXNvdXJjZSBpcyBzeW5jLWVuYWJsZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBvcGVyYXRpb25zIC0gU29ydGVkLCBkdXBsaWNhdGUtZnJlZSBzeW5jIG9wZXJhdGlvbiBuYW1lcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gcG9saWN5VmVyc2lvbiAtIEFwcC1jb250cm9sbGVkIHBvbGljeSB2ZXJzaW9uLCBvciBudWxsLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBvbGljeUhhc2ggLSBEZXRlcm1pbmlzdGljIHNoYTI1NiBoYXNoIG9mIHNhZmUgcG9saWN5IGlucHV0cy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSBbbWV0YWRhdGFdIC0gU2FmZSBmcm9udGVuZC12aXNpYmxlIG1ldGFkYXRhLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09taXQ8RnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbiwgXCJhYmlsaXRpZXNcIiB8IFwiYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc1wiIHwgXCJidWlsdEluTWVtYmVyQ29tbWFuZHNcIiB8IFwiY29sbGVjdGlvbkNvbW1hbmRzXCIgfCBcImNvbW1hbmRzXCIgfCBcIm1lbWJlckNvbW1hbmRzXCIgfCBcInN5bmNcIj4gJiB7XG4gKiAgIGFiaWxpdGllczogRnJvbnRlbmRNb2RlbFJlc291cmNlQWJpbGl0aWVzQ29uZmlndXJhdGlvblxuICogICBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gKiAgIGJ1aWx0SW5NZW1iZXJDb21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICogICBjb2xsZWN0aW9uQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAqICAgY29tbWFuZE1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB7YXJnczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU6IHN0cmluZyB8IG51bGx9PlxuICogICBtZW1iZXJDb21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICogICBzeW5jPzogTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZVN5bmNDb25maWd1cmF0aW9uXG4gKiB9fSBOb3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvblxuICovXG5cbi8qKlxuICogVW5ib3VuZCByZXNvdXJjZSBjbGFzcyB1c2VkIGJ5IG1vZGVsLWFnbm9zdGljIHJlZ2lzdHJpZXMuXG4gKiBAdHlwZWRlZiB7T21pdDx0eXBlb2YgaW1wb3J0KFwiLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHQsIFwibW9kZWxDbGFzc1wiPiAmIHttb2RlbENsYXNzOiAoKSA9PiB0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgbmV3IChhcmdzOiBuZXZlcik6IGltcG9ydChcIi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0PHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0Pn19IFVuYm91bmRGcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGVcbiAqL1xuXG4vKipcbiAqIFJlc291cmNlIGNsYXNzIGJvdW5kIHRvIGEgc3BlY2lmaWMgbW9kZWwgY2xhc3MuXG4gKiBAdGVtcGxhdGUge2ltcG9ydChcIi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VNb2RlbENsYXNzfSBUTW9kZWxDbGFzc1xuICogQHRlbXBsYXRlIHt0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gVERhdGFiYXNlTW9kZWxDbGFzc1xuICogQHR5cGVkZWYge09taXQ8dHlwZW9mIGltcG9ydChcIi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0LCBcIk1vZGVsQ2xhc3NcIiB8IFwibW9kZWxDbGFzc1wiPiAmIHtNb2RlbENsYXNzOiBUTW9kZWxDbGFzcyB8IHVuZGVmaW5lZCwgbW9kZWxDbGFzczogKCkgPT4gVE1vZGVsQ2xhc3MsIG5ldyAoYXJnczogaW1wb3J0KFwiLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUFiaWxpdHlBcmdzPFRNb2RlbENsYXNzPiB8IGltcG9ydChcIi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDb250cm9sbGVyQXJnczxURGF0YWJhc2VNb2RlbENsYXNzPik6IGltcG9ydChcIi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0PFRNb2RlbENsYXNzLCBURGF0YWJhc2VNb2RlbENsYXNzPn19IEJvdW5kRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge2ltcG9ydChcIi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VNb2RlbENsYXNzfSBbVE1vZGVsQ2xhc3M9bmV2ZXJdXG4gKiBAdGVtcGxhdGUge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBbVERhdGFiYXNlTW9kZWxDbGFzcz1FeHRyYWN0PFRNb2RlbENsYXNzLCB0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD5dXG4gKiBAdHlwZWRlZiB7W1RNb2RlbENsYXNzXSBleHRlbmRzIFtuZXZlcl0gPyBVbmJvdW5kRnJvbnRlbmRNb2RlbFJlc291cmNlQ2xhc3NUeXBlIDogQm91bmRGcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGU8VE1vZGVsQ2xhc3MsIFREYXRhYmFzZU1vZGVsQ2xhc3M+fSBGcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7aW1wb3J0KFwiLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZU1vZGVsQ2xhc3N9IFtUTW9kZWxDbGFzcz1uZXZlcl1cbiAqIEB0eXBlZGVmIHtGcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGU8VE1vZGVsQ2xhc3M+fSBGcm9udGVuZE1vZGVsUmVzb3VyY2VEZWZpbml0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsUmVzb3VyY2VBYmlsaXRpZXNDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2luZGV4XSAtIEFiaWxpdHkgYWN0aW9uIGZvciBmcm9udGVuZCBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZmluZF0gLSBBYmlsaXR5IGFjdGlvbiBmb3IgZnJvbnRlbmQgZmluZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY3JlYXRlXSAtIEFiaWxpdHkgYWN0aW9uIGZvciBmcm9udGVuZCBjcmVhdGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3VwZGF0ZV0gLSBBYmlsaXR5IGFjdGlvbiBmb3IgZnJvbnRlbmQgdXBkYXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkZXN0cm95XSAtIEFiaWxpdHkgYWN0aW9uIGZvciBmcm9udGVuZCBkZXN0cm95LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbFJlc291cmNlU2VydmVyQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHsoYXJnczoge2FjdGlvbjogXCJpbmRleFwiIHwgXCJmaW5kXCIgfCBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiIHwgXCJhdHRhY2hcIiB8IFwiYXR0YWNobWVudExpc3RcIiB8IFwiZG93bmxvYWRcIiB8IFwidXJsXCIsIGNvbnRyb2xsZXI6IGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9KSA9PiAoYm9vbGVhbiB8IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4gfCB2b2lkPil9IFtiZWZvcmVBY3Rpb25dIC0gT3B0aW9uYWwgY2FsbGJhY2sgcnVuIGJlZm9yZSBidWlsdC1pbiBmcm9udGVuZCBhY3Rpb25zLlxuICogQHByb3BlcnR5IHsoYXJnczoge2FjdGlvbjogXCJpbmRleFwiLCBjb250cm9sbGVyOiBpbXBvcnQoXCIuL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSkgPT4gUHJvbWlzZTxpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0W10+fSBbcmVjb3Jkc10gLSBSZWNvcmRzIGxvYWRlciBmb3IgZnJvbnRlbmRJbmRleC5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHthY3Rpb246IFwiaW5kZXhcIiB8IFwiZmluZFwiIHwgXCJjcmVhdGVcIiB8IFwidXBkYXRlXCIsIGNvbnRyb2xsZXI6IGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQsIG1vZGVsOiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSkgPT4gUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSBbc2VyaWFsaXplXSAtIFJlY29yZCBzZXJpYWxpemVyIGZvciByZXNwb25zZSBwYXlsb2Fkcy5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHthY3Rpb246IFwiZmluZFwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiIHwgXCJhdHRhY2hcIiB8IFwiYXR0YWNobWVudExpc3RcIiB8IFwiZG93bmxvYWRcIiB8IFwidXJsXCIsIGNvbnRyb2xsZXI6IGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQsIGlkOiBzdHJpbmcgfCBudW1iZXJ9KSA9PiBQcm9taXNlPGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBudWxsPn0gW2ZpbmRdIC0gUmVjb3JkIGxvYWRlciBmb3IgZmluZC91cGRhdGUvZGVzdHJveS9hdHRhY2gvZG93bmxvYWQvdXJsIGFjdGlvbnMuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7YWN0aW9uOiBcImNyZWF0ZVwiLCBjb250cm9sbGVyOiBpbXBvcnQoXCIuL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59KSA9PiBQcm9taXNlPGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQ+fSBbY3JlYXRlXSAtIEN1c3RvbSBjcmVhdGUgY2FsbGJhY2suXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7YWN0aW9uOiBcInVwZGF0ZVwiLCBjb250cm9sbGVyOiBpbXBvcnQoXCIuL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBtb2RlbDogaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSkgPT4gUHJvbWlzZTxpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdm9pZD59IFt1cGRhdGVdIC0gQ3VzdG9tIHVwZGF0ZSBjYWxsYmFjay5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHthY3Rpb246IFwiZGVzdHJveVwiLCBjb250cm9sbGVyOiBpbXBvcnQoXCIuL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBtb2RlbDogaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0pID0+IFByb21pc2U8dm9pZD59IFtkZXN0cm95XSAtIEN1c3RvbSBkZXN0cm95IGNhbGxiYWNrLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2VuZFByb2plY3RDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIFBhdGggdG8gdGhlIGJhY2tlbmQgcHJvamVjdC4gTWF5IGJlIGFuIGFwcCByb290IG9yIGEgY29udHJpYnV0aW5nIHBhY2thZ2Ugcm9vdCAocGFja2FnZSBlbnRyaWVzIGFyZSBhcHBlbmRlZCBpbnRlcm5hbGx5IGZyb20gYHBhY2thZ2VzYCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Zyb250ZW5kTW9kZWxzT3V0cHV0UGF0aF0gLSBPcHRpb25hbCBvdXRwdXQgcHJvamVjdCBwYXRoIHdoZXJlIGBzcmMvZnJvbnRlbmQtbW9kZWxzYCBzaG91bGQgYmUgZ2VuZXJhdGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyZXNvdXJjZXNQYXRoXSAtIE9wdGlvbmFsIG92ZXJyaWRlIGZvciB0aGUgcmVzb3VyY2VzIGRpcmVjdG9yeSB0byBhdXRvLWRpc2NvdmVyOyBkZWZhdWx0cyB0byBgPHBhdGg+L3NyYy9yZXNvdXJjZXNgLiBTZXQgaW50ZXJuYWxseSBmb3IgcGFja2FnZSBlbnRyaWVzLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsUmVzb3VyY2VEZWZpbml0aW9uPn0gW2Zyb250ZW5kTW9kZWxzXSAtIEF1dG8tZGlzY292ZXJlZCBmcm9udGVuZCBtb2RlbCBkZWZpbml0aW9ucyBrZXllZCBieSBtb2RlbCBjbGFzcyBuYW1lLiBTZXQgaW50ZXJuYWxseSBieSB0aGUgZW52aXJvbm1lbnQgaGFuZGxlciDigJQgZG8gbm90IHNldCBtYW51YWxseS5cbiAqIEBwcm9wZXJ0eSB7QWJpbGl0eVJlc291cmNlQ2xhc3NUeXBlW119IFthYmlsaXR5UmVzb3VyY2VzXSAtIEF1dG8tZGlzY292ZXJlZCBhYmlsaXR5IHJlc291cmNlIGNsYXNzZXMgKGZyb250ZW5kLW1vZGVsIGFuZCBhdXRob3JpemF0aW9uKSBmcm9tIHRoaXMgcHJvamVjdCdzIHJlc291cmNlcyBkaXJlY3RvcnkuIFNldCBpbnRlcm5hbGx5IGJ5IHRoZSBlbnZpcm9ubWVudCBoYW5kbGVyIOKAlCBkbyBub3Qgc2V0IG1hbnVhbGx5LlxuICovXG5cbi8qKlxuICogQSBkZXNjcmlwdG9yIGZvciBhbiBleHRlcm5hbCBWZWxvY2lvdXMgcGFja2FnZSAoZW5naW5lKSB0aGF0IGNvbnRyaWJ1dGVzIG1vZGVscyxcbiAqIHJlc291cmNlcyBhbmQgbWlncmF0aW9ucy4gQSBwYWNrYWdlIHVzdWFsbHkgZXhwb3J0cyBgbmV3IFZlbG9jaW91c1BhY2thZ2Uoe25hbWUsIHVybDogaW1wb3J0Lm1ldGEudXJsfSlgLlxuICogQHR5cGVkZWYge29iamVjdH0gVmVsb2Npb3VzUGFja2FnZURlc2NyaXB0b3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gVGhlIHBhY2thZ2UgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBkZXNjcmlwdG9yIG1vZHVsZSdzIGBpbXBvcnQubWV0YS51cmxgOyB0aGUgcGFja2FnZSByb290IGlzIGRlcml2ZWQgZnJvbSBpdCB3aGVuIGBwYXRoYCBpcyBvbWl0dGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXSAtIFRoZSBwYWNrYWdlIHJvb3QgZGlyZWN0b3J5ICh0aGUgb25lIGNvbnRhaW5pbmcgYHNyY2ApLiBEZXJpdmVkIGZyb20gYHVybGAgd2hlbiBvbWl0dGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFttb2RlbHNQYXRoXSAtIE92ZXJyaWRlIGZvciB0aGUgcGFja2FnZSdzIG1vZGVscyBkaXJlY3RvcnkgKGRlZmF1bHQgYDxwYXRoPi9zcmMvbW9kZWxzYCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jlc291cmNlc1BhdGhdIC0gT3ZlcnJpZGUgZm9yIHRoZSBwYWNrYWdlJ3MgZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2VzIGRpcmVjdG9yeSAoZGVmYXVsdCBgPHBhdGg+L3NyYy9yZXNvdXJjZXNgKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbWlncmF0aW9uc1BhdGhdIC0gT3ZlcnJpZGUgZm9yIHRoZSBwYWNrYWdlJ3MgbWlncmF0aW9ucyBkaXJlY3RvcnkgKGRlZmF1bHQgYDxwYXRoPi9zcmMvZGF0YWJhc2UvbWlncmF0aW9uc2ApLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydChcIi4vcGFja2FnZXMvdmVsb2Npb3VzLXBhY2thZ2UuanNcIikuZGVmYXVsdCB8IFZlbG9jaW91c1BhY2thZ2VEZXNjcmlwdG9yfSBWZWxvY2lvdXNQYWNrYWdlQ29uZmlndXJhdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUm91dGVSZXNvbHZlckhvb2tBcmdzXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBwYXJhbXMgLSBNdXRhYmxlIHJlcXVlc3QgcGFyYW1zIG9iamVjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjdXJyZW50UGF0aCAtIFJlcXVlc3QgcGF0aCB3aXRob3V0IHF1ZXJ5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZV0gLSBUcnVlIHdoZW4gbWF0Y2hpbmcgYSBjb25maWd1cmVkIGN1c3RvbSByb3V0ZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdH0gcmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiKS5kZWZhdWx0fSByZXNwb25zZSAtIFJlc3BvbnNlIG9iamVjdC5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9yb3V0ZXMvcmVzb2x2ZXIuanNcIikuZGVmYXVsdH0gcmVzb2x2ZXIgLSBSZXNvbHZlciBpbnN0YW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJvdXRlUmVzb2x2ZXJIb29rUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9uIC0gRGFzaGVyaXplZCBhY3Rpb24gbmFtZSAoZm9yIGV4YW1wbGUgYGZyb250ZW5kLWluZGV4YCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29udHJvbGxlciAtIENvbnRyb2xsZXIgcGF0aCAoZm9yIGV4YW1wbGUgYGFjY291bnRzYCkuXG4gKiBAcHJvcGVydHkge3R5cGVvZiBpbXBvcnQoXCIuL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gW2NvbnRyb2xsZXJDbGFzc10gLSBPcHRpb25hbCBjb250cm9sbGVyIGNsYXNzIG92ZXJyaWRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb250cm9sbGVyUGF0aF0gLSBPcHRpb25hbCBhYnNvbHV0ZS9yZWxhdGl2ZSBjb250cm9sbGVyIGZpbGUgcGF0aCBvdmVycmlkZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbcGFyYW1zXSAtIEV4dHJhIHBhcmFtcyB0byBtZXJnZSBmb3IgY29udHJvbGxlci9hY3Rpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtza2lwQWJpbGl0eVJlc29sdXRpb25dIC0gV2hldGhlciB0byBydW4gdGhlIGNvbnRyb2xsZXIgYWN0aW9uIHdpdGhvdXQgcmVzb2x2aW5nIHJlcXVlc3QgYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3NraXBDb250cm9sbGVyQ29ubmVjdGlvbnNdIC0gV2hldGhlciB0byBydW4gdGhlIGNvbnRyb2xsZXIgYWN0aW9uIHdpdGhvdXQgdGhlIGF1dG9tYXRpYyBkYXRhYmFzZSBjaGVja291dCB3cmFwcGVyLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2tpcFRlbmFudFJlc29sdXRpb25dIC0gV2hldGhlciB0byBydW4gdGhlIGNvbnRyb2xsZXIgYWN0aW9uIHdpdGhvdXQgcmVzb2x2aW5nIHJlcXVlc3QgdGVuYW50LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt2aWV3UGF0aF0gLSBPcHRpb25hbCB2aWV3IHBhdGggb3ZlcnJpZGUgdXNlZCBieSBjb250cm9sbGVyIHJlbmRlciBsb29rdXBzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhhcmc6IFJvdXRlUmVzb2x2ZXJIb29rQXJncykgPT4gUm91dGVSZXNvbHZlckhvb2tSZXN1bHQgfCBudWxsIHwgUHJvbWlzZTxSb3V0ZVJlc29sdmVySG9va1Jlc3VsdCB8IG51bGw+fSBSb3V0ZVJlc29sdmVySG9va1R5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt0eXBlb2YgaW1wb3J0KFwiLi9hdXRob3JpemF0aW9uL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH0gQWJpbGl0eVJlc291cmNlQ2xhc3NUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KGFyZ3M6IHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIHJlcXVlc3Q6IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWQsIHJlc3BvbnNlOiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSkgPT4gaW1wb3J0KFwiLi9hdXRob3JpemF0aW9uL2FiaWxpdHkuanNcIikuZGVmYXVsdCB8IHZvaWQgfCBQcm9taXNlPGltcG9ydChcIi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCB2b2lkPn0gQWJpbGl0eVJlc29sdmVyVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhhcmdzOiB7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCByZXF1ZXN0OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkLCByZXNwb25zZTogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVzcG9uc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCwgc3Vic2NyaXB0aW9uPzoge2NoYW5uZWw6IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fX0pID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+IHwgdm9pZCB8IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4gfCB2b2lkPn0gVGVuYW50UmVzb2x2ZXJUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KGFyZ3M6IHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgZGF0YWJhc2VDb25maWd1cmF0aW9uOiBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlLCBpZGVudGlmaWVyOiBzdHJpbmcsIHRlbmFudDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59KSA9PiBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlIHwgUGFydGlhbDxEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlPiB8IHZvaWR9IFRlbmFudERhdGFiYXNlUmVzb2x2ZXJUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBcGlNYW5pZmVzdENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF0gLSBIVFRQIHBhdGggZm9yIHRoZSBidWlsdC1pbiBBUEkgbWFuaWZlc3QgZW5kcG9pbnQuIERlZmF1bHRzIHRvIGAvYXBpL21hbmlmZXN0YC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdG9rZW5dIC0gQmVhcmVyIHRva2VuIHJlcXVpcmVkIGluIHRoZSBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDx0b2tlbj5gIGhlYWRlci4gV2hlbiBzZXQsIHJlcXVlc3RzIHdpdGhvdXQgYSBtYXRjaGluZyB0b2tlbiBhcmUgbm90IHJvdXRlZCAoNDA0KSwgc28gdGhlIGVuZHBvaW50IHN0YXlzIGhpZGRlbi5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNY3BDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdIC0gSFRUUCBwYXRoIGZvciB0aGUgYnVpbHQtaW4gTUNQIGVuZHBvaW50LiBEZWZhdWx0cyB0byBgL21jcGAuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Rva2VuXSAtIEJlYXJlciB0b2tlbiByZXF1aXJlZCBpbiB0aGUgYEF1dGhvcml6YXRpb25gIGhlYWRlci4gV2hlbiBzZXQsIHJlcXVlc3RzIHdpdGhvdXQgYSBtYXRjaGluZyB0b2tlbiBhcmUgbm90IHJvdXRlZCAoNDA0KSwgc28gdGhlIGVuZHBvaW50IHN0YXlzIGhpZGRlbi5cbiAqL1xuXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVidWdFbmRwb2ludENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF0gLSBIVFRQIHBhdGggZm9yIHRoZSBidWlsdC1pbiBkZWJ1ZyBlbmRwb2ludC4gRGVmYXVsdHMgdG8gYC92ZWxvY2lvdXMvZGVidWdgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0b2tlbl0gLSBCZWFyZXIgdG9rZW4gcmVxdWlyZWQgaW4gdGhlIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPHRva2VuPmAgaGVhZGVyLiBXaGVuIHNldCwgcmVxdWVzdHMgd2l0aG91dCBhIG1hdGNoaW5nIHRva2VuIGFyZSBub3Qgcm91dGVkICg0MDQpLCBzbyB0aGUgZW5kcG9pbnQgc3RheXMgaGlkZGVuLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVGVzdFRlbmFudFBvb2xDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gdGVuYW50cyAtIFBvb2wgbWVtYmVyczogdGhlIHRlbmFudCBkZXNjcmlwdG9ycyB3aG9zZSBkYXRhYmFzZXMgdGhlIHBvb2wgcHJlLXByb3Zpc2lvbnMgYW5kIHJlLXVzZXMuIFBvb2wgc2l6ZSBpcyB0aGUgYXJyYXkgbGVuZ3RoLlxuICogQHByb3BlcnR5IHsoYXJnczoge2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBkYXRhYmFzZUlkZW50aWZpZXI6IHN0cmluZywgdGVuYW50OiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+fSBbcHJvdmlzaW9uVGVuYW50XSAtIEFwcC1vd25lZCBwcm92aXNpb25pbmcgb3ZlcnJpZGUgZm9yIG9uZSBtZW1iZXIgKHJ1bnMgaW5zdGVhZCBvZiB0aGUgZnJhbWV3b3JrIGNyZWF0ZSArIHN0cnVjdHVyZS1sb2FkICsgbGVkZ2VyLWJhc2VsaW5lIGRlZmF1bHQpLlxuICogQHByb3BlcnR5IHsoYXJnczoge2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBkYXRhYmFzZUlkZW50aWZpZXI6IHN0cmluZywgdGVuYW50OiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+fSBbcmVzZXRUZW5hbnRdIC0gQXBwLW93bmVkIHBlci10ZXN0IHJlc2V0IG92ZXJyaWRlIChydW5zIGluc3RlYWQgb2YgdGhlIGZyYW1ld29yayB0cnVuY2F0ZSArIGxlZGdlci1iYXNlbGluZSBkZWZhdWx0KS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBUZXN0VGVuYW50UG9vbENvbmZpZ3VyYXRpb24+fSBUZXN0VGVuYW50UG9vbHNDb25maWd1cmF0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUZW5hbnREYXRhYmFzZVByb3ZpZGVyVHlwZVxuICogQHByb3BlcnR5IHsoYXJnczoge2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBpZGVudGlmaWVyOiBzdHJpbmd9KSA9PiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBQcm9taXNlPEFycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59IGxpc3RUZW5hbnRzIC0gTGlzdHMgdGVuYW50cyB0aGF0IHNob3VsZCBiZSBjcmVhdGVkLCBjaGVja2VkLCBvciBtaWdyYXRlZCBmb3IgdGhpcyBkYXRhYmFzZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHsoYXJnczoge2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBpZGVudGlmaWVyOiBzdHJpbmd9KSA9PiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiB8IHZvaWQgfCBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+IHwgdm9pZD59IFtyZXNvbHZlR2VuZXJhdGlvblRlbmFudF0gLSBSZXNvbHZlcyBvbmUgZXhwbGljaXQgdGVuYW50IGRlc2NyaXB0b3IgZm9yIHNjaGVtYS9iYXNlLW1vZGVsIGdlbmVyYXRpb24gd2l0aG91dCBlbnVtZXJhdGluZyBsaWZlY3ljbGUgdGVuYW50cy5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgaWRlbnRpZmllcjogc3RyaW5nfSkgPT4gQXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgUHJvbWlzZTxBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSBbbGlzdFJlc3RyaWN0VGVuYW50c10gLSBMaXN0cyBleGlzdGluZyB0ZW5hbnRzIHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIGRlcGVuZGVudCByZXN0cmljdCBkZXN0cm95cy4gRGVmYXVsdHMgdG8gbGlzdFRlbmFudHMuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGRhdGFiYXNlQ29uZmlndXJhdGlvbjogRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZSwgaWRlbnRpZmllcjogc3RyaW5nLCB0ZW5hbnQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD59IFtjcmVhdGVEYXRhYmFzZV0gLSBDcmVhdGVzIHRoZSB0ZW5hbnQgZGF0YWJhc2Uvc2NoZW1hIGZvciBvbmUgdGVuYW50LlxuICogQHByb3BlcnR5IHsoYXJnczoge2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBkYXRhYmFzZUNvbmZpZ3VyYXRpb246IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGUsIGlkZW50aWZpZXI6IHN0cmluZywgdGVuYW50OiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+fSBbZHJvcERhdGFiYXNlXSAtIERyb3BzIHRoZSB0ZW5hbnQgZGF0YWJhc2Uvc2NoZW1hIGZvciBvbmUgdGVuYW50LlxuICogQHByb3BlcnR5IHsoYXJnczoge2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBkYXRhYmFzZUNvbmZpZ3VyYXRpb246IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGUsIGlkZW50aWZpZXI6IHN0cmluZywgdGVuYW50OiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+fSBbY2hlY2tUZW5hbnRdIC0gQ2hlY2tzIG9uZSB0ZW5hbnQgZGF0YWJhc2UgYmVmb3JlIGdlbmVyaWMgY29ubmVjdGlvbiB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHsoYXJnczoge2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBkYXRhYmFzZUNvbmZpZ3VyYXRpb246IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGUsIGlkZW50aWZpZXI6IHN0cmluZywgbWlncmF0aW9uc0FwcGxpZWQ6IG51bWJlciwgdGVuYW50OiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+fSBbYWZ0ZXJNaWdyYXRlVGVuYW50XSAtIFJ1bnMgYXBwLW93bmVkIHRlbmFudCB3b3JrIGFmdGVyIGdlbmVyaWMgbWlncmF0aW9ucyBmb3Igb25lIHRlbmFudC4gYG1pZ3JhdGlvbnNBcHBsaWVkYCBpcyBob3cgbWFueSBtaWdyYXRpb25zIGFjdHVhbGx5IHJhbiAoMCB3aGVuIHRoZSB0ZW5hbnQgd2FzIGFscmVhZHkgdXAgdG8gZGF0ZSksIHNvIHRoZSBhcHAgY2FuIHNraXAgZXhwZW5zaXZlIHBlci10ZW5hbnQgd29yayBvbiBuby1vcCBkZXBsb3lzLlxuICovXG5cbi8qKlxuICogQWR2aXNvcnktbG9jayBiYWNrZW5kIGNoYWluIGNvbmZpZ3VyYXRpb24gKFNUQy0yMTAgZGVzaWduIMKnMTAsIGZpbGUgdGllclxuICogaW1wbGVtZW50ZWQgYnkgU1RDLTIxMykuIEV2ZXJ5dGhpbmcgZGVmYXVsdHMgdG8gdG9kYXkncyBkcml2ZXItbmF0aXZlLW9ubHlcbiAqIGJlaGF2aW9yOyB0aGUgZmlsZSBiYWNrZW5kIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIG9ubHkgc2VsZWN0YWJsZSBieVxuICogZXhwbGljaXQgY29uZmlndXJhdGlvbi5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFkdmlzb3J5TG9ja3NDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3tmaWxlPzoge2RpcmVjdG9yeT86IHN0cmluZywgZW5hYmxlZD86IGJvb2xlYW4sIGxlYXNlTXM/OiBudW1iZXIsIHJlbmV3SW50ZXJ2YWxNcz86IG51bWJlcn19fSBbYmFja2VuZHNdIC0gQmFja2VuZCBlbmFibGVtZW50LiBgZmlsZS5lbmFibGVkYCBkZWZhdWx0cyB0byBmYWxzZTsgZW5hYmxpbmcgaXQgaXMgdGhlIGRlcGxveW1lbnQncyBleHBsaWNpdCBzaW5nbGUtaG9zdCBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9kYXRhYmFzZS9hZHZpc29yeS1sb2NrLWJhY2tlbmQtcG9saWN5LmpzXCIpLkFkdmlzb3J5TG9ja0JhY2tlbmRQb2xpY3lFbnRyeVtdfSBbcG9saWN5XSAtIFBlci1sb2NrLW5hbWUgbWluaW11bS9hbGxvd2VkL3ByZWZlcnJlZCB0aWVyIHJ1bGVzIChkZXNpZ24gwqc1KS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbmZpZ3VyYXRpb25BcmdzVHlwZVxuICogQHByb3BlcnR5IHtib29sZWFufSBbYXV0b2xvYWRdIC0gR2xvYmFsbHkgZW5hYmxlIGF1dG8tYmF0Y2gtcHJlbG9hZCBvZiByZWxhdGlvbnNoaXBzIG9uIGxhenkgYWNjZXNzLiBEZWZhdWx0IHRydWUuXG4gKiBAcHJvcGVydHkge0NvcnNUeXBlfSBbY29yc10gLSBDT1JTIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBIVFRQIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29va2llU2VjcmV0XSAtIFNlY3JldCBmb3IgZW5jcnlwdGluZyBjb29raWVzLlxuICogQHByb3BlcnR5IHtBYmlsaXR5UmVzb3VyY2VDbGFzc1R5cGVbXX0gW2FiaWxpdHlSZXNvdXJjZXNdIC0gUmVzb3VyY2UgY2xhc3NlcyB1c2VkIHRvIGRlZmluZSBhYmlsaXRpZXMgcGVyIG1vZGVsLlxuICogQHByb3BlcnR5IHtBYmlsaXR5UmVzb2x2ZXJUeXBlfSBbYWJpbGl0eVJlc29sdmVyXSAtIFJlc29sdmVyIGZvciBjcmVhdGluZyByZXF1ZXN0LXNjb3BlZCBhYmlsaXR5IGluc3RhbmNlcy5cbiAqIEBwcm9wZXJ0eSB7QWR2aXNvcnlMb2Nrc0NvbmZpZ3VyYXRpb259IFthZHZpc29yeUxvY2tzXSAtIEFkdmlzb3J5LWxvY2sgYmFja2VuZCBjaGFpbiBjb25maWd1cmF0aW9uIChiYWNrZW5kcyArIHBlci1sb2NrLW5hbWUgdGllciBwb2xpY3kpLiBEZWZhdWx0cyB0byB0b2RheSdzIGRyaXZlci1uYXRpdmUtb25seSBiZWhhdmlvci5cbiAqIEBwcm9wZXJ0eSB7QXR0YWNobWVudHNDb25maWd1cmF0aW9ufSBbYXR0YWNobWVudHNdIC0gQXR0YWNobWVudCBzdG9yYWdlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge0JhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbltdfSBbYmFja2VuZFByb2plY3RzXSAtIEJhY2tlbmQgcHJvamVjdCBkZWZpbml0aW9ucyB1c2VkIGZvciBmcm9udGVuZCBtb2RlbCBnZW5lcmF0aW9uLlxuICogQHByb3BlcnR5IHtWZWxvY2lvdXNQYWNrYWdlQ29uZmlndXJhdGlvbltdfSBbcGFja2FnZXNdIC0gRXh0ZXJuYWwgVmVsb2Npb3VzIHBhY2thZ2VzIHRoYXQgY29udHJpYnV0ZSBtb2RlbHMsIGZyb250ZW5kLW1vZGVsIHJlc291cmNlcyBhbmQgbWlncmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7ZmFsc2UgfCB7W2tleTogc3RyaW5nXToge1trZXk6IHN0cmluZ106IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGV9fX0gW2RhdGFiYXNlXSAtIERhdGFiYXNlIGNvbmZpZ3VyYXRpb25zIGtleWVkIGJ5IGVudmlyb25tZW50IGFuZCBpZGVudGlmaWVyLCBvciBmYWxzZSBmb3IgYW4gZXhwbGljaXRseSBkYXRhYmFzZS1mcmVlIGFwcGxpY2F0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVidWddIC0gRW5hYmxlIGRlYnVnIGxvZ2dpbmcuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBEZWJ1Z0VuZHBvaW50Q29uZmlndXJhdGlvbn0gW2RlYnVnRW5kcG9pbnRdIC0gRW5hYmxlIHRoZSBidWlsdC1pbiBkZWJ1ZyBlbmRwb2ludC4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBBcGlNYW5pZmVzdENvbmZpZ3VyYXRpb259IFthcGlNYW5pZmVzdF0gLSBFbmFibGUgdGhlIGJ1aWx0LWluIEFQSSBtYW5pZmVzdCBlbmRwb2ludC4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBNY3BDb25maWd1cmF0aW9ufSBbbWNwXSAtIEVuYWJsZSB0aGUgYnVpbHQtaW4gTUNQIGVuZHBvaW50IG9uIHRoZSBIVFRQIHNlcnZlciAoSlNPTi1SUEMgb3ZlciBIVFRQIGluIGFkZGl0aW9uIHRvIHRoZSBgdmVsb2Npb3VzIG1jcGAgc3RkaW8gc2VydmVyKS4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RpcmVjdG9yeV0gLSBCYXNlIGRpcmVjdG9yeSBmb3IgdGhlIHByb2plY3QuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlbmZvcmNlVGVuYW50RGF0YWJhc2VTY29wZXNdIC0gUmVxdWlyZSB0ZW5hbnQtc3dpdGNoZWQgbW9kZWwgcXVlcmllcyB0byByZXNvbHZlIGEgdGVuYW50IGRhdGFiYXNlIGlkZW50aWZpZXIuIERlZmF1bHRzIHRvIHRydWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Vudmlyb25tZW50XSAtIEN1cnJlbnQgZW52aXJvbm1lbnQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9lbnZpcm9ubWVudC1oYW5kbGVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGVudmlyb25tZW50SGFuZGxlciAtIEVudmlyb25tZW50IGhhbmRsZXIgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtleHBvc2VJbnRlcm5hbEVycm9yc1RvQ2xpZW50c10gLSBSZXR1cm4gdW5leHBlY3RlZCBpbnRlcm5hbCBlcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzIGluIGZyb250ZW5kLW1vZGVsIGNsaWVudCBwYXlsb2FkcyBpbiBldmVyeSBlbnZpcm9ubWVudC4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAqIEBwcm9wZXJ0eSB7e21heE9wZW5IYW5kbGVzPzogbnVtYmVyfX0gW2Zyb250ZW5kVGVuYW50U3FsaXRlXSAtIEJvdW5kZWQgZnJvbnRlbmQgdGVuYW50IFNRTGl0ZSBsaWZlY3ljbGUgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3NlY3VyZUZyb250ZW5kTW9kZWxFcnJvcnNdIC0gRGVwcmVjYXRlZCBjb21wYXRpYmlsaXR5IGFsaWFzIGZvciBgZXhwb3NlSW50ZXJuYWxFcnJvcnNUb0NsaWVudHM6IGZhbHNlYCB3aGVuIHRoZSBhdXRob3JpdGF0aXZlIG9wdGlvbiBpcyBvbWl0dGVkLlxuICogQHByb3BlcnR5IHtIdHRwU2VydmVyQ29uZmlndXJhdGlvbn0gW2h0dHBTZXJ2ZXJdIC0gRGVmYXVsdCBIVFRQIHNlcnZlciBjb25maWd1cmF0aW9uIGZvciBhcHBsaWNhdGlvbnMgc3RhcnRlZCBmcm9tIHRoaXMgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7TG9nZ2luZ0NvbmZpZ3VyYXRpb259IFtsb2dnaW5nXSAtIExvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYnNDb25maWd1cmF0aW9ufSBbYmFja2dyb3VuZEpvYnNdIC0gQmFja2dyb3VuZCBqb2JzIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge0JlYWNvbkNvbmZpZ3VyYXRpb259IFtiZWFjb25dIC0gQmVhY29uIGJyb2FkY2FzdCBidXMgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2NoZWR1bGVkQmFja2dyb3VuZEpvYnNDb25maWd1cmF0aW9uIHwgU2NoZWR1bGVkQmFja2dyb3VuZEpvYnNMb2FkZXJUeXBlfSBbc2NoZWR1bGVkQmFja2dyb3VuZEpvYnNdIC0gU2NoZWR1bGVkIGJhY2tncm91bmQgam9icyBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtNYWlsZXJCYWNrZW5kfSBbbWFpbGVyQmFja2VuZF0gLSBNYWlsIGRlbGl2ZXJ5IGJhY2tlbmQuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIHR5cGU6IHN0cmluZ30pID0+IHZvaWR9IGluaXRpYWxpemVNb2RlbHMgLSBIb29rIHRvIHJlZ2lzdGVyIG1vZGVscyBmb3IgYSBnaXZlbiBpbml0aWFsaXphdGlvbiB0eXBlLlxuICogQHByb3BlcnR5IHtJbml0aWFsaXplcnNUeXBlfSBbaW5pdGlhbGl6ZXJzXSAtIEluaXRpYWxpemVyIGxvYWRlciBmb3IgZW52aXJvbm1lbnQgYm9vdHN0cmFwcGluZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgKCgpID0+IHN0cmluZyl9IGxvY2FsZSAtIERlZmF1bHQgbG9jYWxlIG9yIGxvY2FsZSByZXNvbHZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGxvY2FsZXMgLSBTdXBwb3J0ZWQgbG9jYWxlcy5cbiAqIEBwcm9wZXJ0eSB7TG9jYWxlRmFsbGJhY2tzVHlwZX0gbG9jYWxlRmFsbGJhY2tzIC0gTG9jYWxlIGZhbGxiYWNrIG1hcC5cbiAqIEBwcm9wZXJ0eSB7U3RydWN0dXJlU3FsQ29uZmlndXJhdGlvbn0gW3N0cnVjdHVyZVNxbF0gLSBTdHJ1Y3R1cmUgU1FMIGdlbmVyYXRpb24gY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7VmVsb2Npb3VzU3luY0NvbmZpZ3VyYXRpb259IFtzeW5jXSAtIExvY2FsL29mZmxpbmUgc3luYyBmcmFtZXdvcmsgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7VGVuYW50UmVzb2x2ZXJUeXBlfSBbdGVuYW50UmVzb2x2ZXJdIC0gUmVzb2x2ZXIgZm9yIGNyZWF0aW5nIHJlcXVlc3Qtc2NvcGVkIHRlbmFudCBjb250ZXh0IG9iamVjdHMuXG4gKiBAcHJvcGVydHkge1RlbmFudERhdGFiYXNlUmVzb2x2ZXJUeXBlfSBbdGVuYW50RGF0YWJhc2VSZXNvbHZlcl0gLSBSZXNvbHZlciBmb3IgZGVyaXZpbmcgdGVuYW50LXNwZWNpZmljIGRhdGFiYXNlIGNvbmZpZyBvdmVycmlkZXMuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFRlbmFudERhdGFiYXNlUHJvdmlkZXJUeXBlPn0gW3RlbmFudERhdGFiYXNlUHJvdmlkZXJzXSAtIFRlbmFudCBkYXRhYmFzZSBsaWZlY3ljbGUgcHJvdmlkZXJzIGtleWVkIGJ5IGRhdGFiYXNlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge1Rlc3RUZW5hbnRQb29sc0NvbmZpZ3VyYXRpb259IFt0ZXN0VGVuYW50UG9vbHNdIC0gT3B0LWluIHJldXNhYmxlIHRlc3QgdGVuYW50LWRhdGFiYXNlIHBvb2xzIGtleWVkIGJ5IHRlbmFudCBkYXRhYmFzZSBpZGVudGlmaWVyLiBDb25zdW1lZCBvbmx5IGJ5IHRoZSB0ZXN0IGhhcm5lc3M7IG9yZGluYXJ5IHJ1bnRpbWUgaWdub3JlcyBpdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGVzdGluZ10gLSBQYXRoIHRvIHRoZSB0ZXN0aW5nIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgKCgpID0+IHN0cmluZyB8IHVuZGVmaW5lZCl9IFt0aW1lWm9uZV0gLSBEZWZhdWx0IHRpbWV6b25lIGZvciB0aW1lem9uZS1sZXNzIGRhdGV0aW1lIHN0cmluZ3MuXG4gKiBAcHJvcGVydHkge251bWJlciB8ICgoKSA9PiBudW1iZXIpfSBbdGltZXpvbmVPZmZzZXRNaW51dGVzXSAtIERlZmF1bHQgdGltZXpvbmUgb2Zmc2V0IGluIG1pbnV0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IHN0cmluZ1tdfSBbdHJ1c3RlZFByb3hpZXNdIC0gVHJ1c3RlZCByZXZlcnNlIHByb3h5IGFkZHJlc3MgcmFuZ2VzIHVzZWQgdG8gcmVzb2x2ZSByZXF1ZXN0IHJlbW90ZSBhZGRyZXNzZXMgZnJvbSBmb3J3YXJkaW5nIGhlYWRlcnMuXG4gKiBAcHJvcGVydHkge251bWJlciB8ICgoKSA9PiBudW1iZXIpfSBbcmVxdWVzdFRpbWVvdXRNc10gLSBUaW1lb3V0IGluIHNlY29uZHMgZm9yIGNvbXBsZXRpbmcgYSBIVFRQIHJlcXVlc3QuXG4gKiBAcHJvcGVydHkge1JvdXRlUmVzb2x2ZXJIb29rVHlwZVtdfSBbcm91dGVSZXNvbHZlckhvb2tzXSAtIEhvb2sgY2FsbGJhY2tzIHRoYXQgY2FuIGhpamFjayB1bnJlc29sdmVkIHJvdXRlcy5cbiAqIEBwcm9wZXJ0eSB7V2Vic29ja2V0Q2hhbm5lbFJlc29sdmVyVHlwZX0gW3dlYnNvY2tldENoYW5uZWxSZXNvbHZlcl0gLSBSZXNvbHZlIGEgd2Vic29ja2V0IGNoYW5uZWwgY2xhc3MvaW5zdGFuY2UgZm9yIGVhY2ggY29ubmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7V2Vic29ja2V0TWVzc2FnZUhhbmRsZXJSZXNvbHZlclR5cGV9IFt3ZWJzb2NrZXRNZXNzYWdlSGFuZGxlclJlc29sdmVyXSAtIFJlc29sdmUgYSByYXcgd2Vic29ja2V0IG1lc3NhZ2UgaGFuZGxlciBmb3IgZWFjaCBjb25uZWN0aW9uLlxuICovXG5cbmV4cG9ydCBjb25zdCBub3RoaW5nID0ge31cbiJdfQ==
|
|
754
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWd1cmF0aW9uLXR5cGVzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7R0FFRztBQUVIOzs7OztHQUtHO0FBRUg7O0dBRUc7QUFFSDs7R0FFRztBQUVIOzs7Ozs7R0FNRztBQUVIOztHQUVHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0NHO0FBRUg7O0dBRUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7OztHQUlHO0FBRUg7Ozs7R0FJRztBQUVIOztHQUVHO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBRUg7Ozs7R0FJRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUgsNERBQTREO0FBQzVELHlGQUF5RjtBQUN6Riw4SkFBOEo7QUFDOUosK0ZBQStGO0FBRS9GOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdGRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBQ0g7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUVILDhIQUE4SDtBQUU5SDs7OztHQUlHO0FBRUg7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUVIOzs7R0FHRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSDs7R0FFRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7R0FFRztBQUVIOztHQUVHO0FBRUg7OztHQUdHO0FBRUg7O0dBRUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUdIOztHQUVHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7R0FJRztBQUVIOzs7R0FHRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7R0FHRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUVIOzs7R0FHRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOztHQUVHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7R0FFRztBQUVIOztHQUVHO0FBRUg7O0dBRUc7QUFFSDs7R0FFRztBQUVIOztHQUVHO0FBRUg7Ozs7R0FJRztBQUNIOzs7O0dBSUc7QUFHSDs7OztHQUlHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7R0FFRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdERztBQUVILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAbW9kdWxlIHR5cGVzXG4gKi9cblxuLyoqXG4gKiBJbW11dGFibGUgaWRlbnRpdHkgc2hhcmVkIGJ5IGFwcGxpY2F0aW9uIGluaXRpYWxpemVycyBmb3Igb25lIHByb2Nlc3MgbGlmZWN5Y2xlLlxuICogQHR5cGVkZWYge29iamVjdH0gQXBwbGljYXRpb25Qcm9jZXNzQ29udGV4dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgLSBHZW5lcmljIHByb2Nlc3MgdHlwZSBzdXBwbGllZCB0byBgY29uZmlndXJhdGlvbi5pbml0aWFsaXplKClgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGluc3RhbmNlSWQgLSBPcGFxdWUgaWRlbnRpdHkgdW5pcXVlIHRvIHRoaXMgbGlmZWN5Y2xlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhhcmdzOiB7cmVxdWVzdDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdCwgcmVzcG9uc2U6IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzXCIpLmRlZmF1bHR9KSA9PiBQcm9taXNlPHZvaWQ+fSBDb3JzVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhhcmdzOiB7cmVxdWVzdDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCwgc3Vic2NyaXB0aW9uPzoge2NoYW5uZWw6IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSwgY2xpZW50OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9pbmRleC5qc1wiKS5kZWZhdWx0LCB3ZWJzb2NrZXRTZXNzaW9uOiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtc2Vzc2lvbi5qc1wiKS5kZWZhdWx0LCBjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0pID0+IHR5cGVvZiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHQgfCB2b2lkIHwgUHJvbWlzZTx0eXBlb2YgaW1wb3J0KFwiLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0IHwgdm9pZD59IFdlYnNvY2tldENoYW5uZWxSZXNvbHZlclR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYnNvY2tldE1lc3NhZ2VIYW5kbGVyXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7bWVzc2FnZTogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIHNlc3Npb246IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzXCIpLmRlZmF1bHR9KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZH0gW29uTWVzc2FnZV0gLSBIYW5kbGVyIGZvciBpbmNvbWluZyB3ZWJzb2NrZXQgbWVzc2FnZXMuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7c2Vzc2lvbjogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXNlc3Npb24uanNcIikuZGVmYXVsdH0pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkfSBbb25PcGVuXSAtIEhhbmRsZXIgd2hlbiB0aGUgd2Vic29ja2V0IHNlc3Npb24gb3BlbnMuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7c2Vzc2lvbjogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXNlc3Npb24uanNcIikuZGVmYXVsdH0pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkfSBbb25DbG9zZV0gLSBIYW5kbGVyIHdoZW4gdGhlIHdlYnNvY2tldCBzZXNzaW9uIGNsb3Nlcy5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHtlcnJvcjogRXJyb3IsIHNlc3Npb246IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzXCIpLmRlZmF1bHR9KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZH0gW29uRXJyb3JdIC0gSGFuZGxlciB3aGVuIGEgd2Vic29ja2V0IG1lc3NhZ2UgZXJyb3JzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhhcmdzOiB7cmVxdWVzdDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCwgY2xpZW50OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9pbmRleC5qc1wiKS5kZWZhdWx0LCBjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0pID0+IFdlYnNvY2tldE1lc3NhZ2VIYW5kbGVyIHwgdm9pZCB8IFByb21pc2U8V2Vic29ja2V0TWVzc2FnZUhhbmRsZXIgfCB2b2lkPn0gV2Vic29ja2V0TWVzc2FnZUhhbmRsZXJSZXNvbHZlclR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoaWQ6IHN0cmluZykgPT4ge2RlZmF1bHQ6IHR5cGVvZiBpbXBvcnQoXCIuL2luaXRpYWxpemVyLmpzXCIpLmRlZmF1bHR9fSBJbml0aWFsaXplcnNSZXF1aXJlQ29udGV4dFR5cGVcbiAqIEB0eXBlZGVmIHtJbml0aWFsaXplcnNSZXF1aXJlQ29udGV4dFR5cGUgJiB7XG4gKiAgIGtleXM6ICgpID0+IHN0cmluZ1tdLFxuICogICBpZDogc3RyaW5nXG4gKiB9fSBXZWJwYWNrUmVxdWlyZUNvbnRleHRcbiAqIEB0eXBlZGVmIHt7cmVxdWlyZUNvbnRleHQ6IFdlYnBhY2tSZXF1aXJlQ29udGV4dH19IEluaXRpYWxpemVyc0V4cG9ydFR5cGVcbiAqIEB0eXBlZGVmIHsoYXJnczoge2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSkgPT4gUHJvbWlzZTxJbml0aWFsaXplcnNFeHBvcnRUeXBlPn0gSW5pdGlhbGl6ZXJzVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3FsQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFiYXNlXSAtIERhdGFiYXNlIG5hbWUgZm9yIHRoZSBTUUwgZHJpdmVyLlxuICogQHByb3BlcnR5IHtvYmplY3R9IFtvcHRpb25zXSAtIERyaXZlci1zcGVjaWZpYyBjb25uZWN0aW9uIG9wdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvcHRpb25zLmVuY3J5cHRdIC0gV2hldGhlciB0byBlbmNyeXB0IHRoZSBjb25uZWN0aW9uIChNU1NRTCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW29wdGlvbnMuc2NoZW1hXSAtIERlZmF1bHQgc2NoZW1hIGZvciB1bnF1YWxpZmllZCB0YWJsZSBsb29rdXBzIChNU1NRTCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW29wdGlvbnMuc2VydmVyTmFtZV0gLSBUTFMgU05JIHNlcnZlciBuYW1lIG92ZXJyaWRlIGZvciBNU1NRTCAoZW1wdHkgc3RyaW5nIGRpc2FibGVzIFNOSSkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGVdIC0gV2hldGhlciB0byB0cnVzdCB0aGUgc2VydmVyIGNlcnRpZmljYXRlIChNU1NRTCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Bhc3N3b3JkXSAtIFBhc3N3b3JkIGZvciB0aGUgU1FMIHVzZXIuXG4gKiBAcHJvcGVydHkge29iamVjdH0gW3Bvb2xdIC0gQ29ubmVjdGlvbiBwb29sIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IFtwb29sLm1heF0gLSBNYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucy4gU2V0IG51bGwgdG8gZGlzYWJsZSB0aGUgY2FwLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb29sLm1pbl0gLSBNaW5pbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9vbC5pZGxlVGltZW91dE1pbGxpc10gLSBJZGxlIHRpbWVvdXQgYmVmb3JlIHJlbGVhc2luZyBhIGNvbm5lY3Rpb24uXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IFtwb29sLmNoZWNrb3V0VGltZW91dE1pbGxpc10gLSBUaW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIGFuIGF2YWlsYWJsZSBjb25uZWN0aW9uIGFmdGVyIHRoZSBtYXggY29ubmVjdGlvbiBjYXAgaXMgcmVhY2hlZC4gU2V0IG51bGwgdG8gd2FpdCBpbmRlZmluaXRlbHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlcnZlcl0gLSBTUUwgc2VydmVyIGhvc3RuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1c2VyXSAtIFNRTCB1c2VybmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERhdGFiYXNlUG9vbENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gW2NoZWNrb3V0VGltZW91dE1pbGxpc10gLSBUaW1lb3V0IHdoaWxlIGEgY2hlY2tvdXQgd2FpdHMgZm9yIGFuIGF2YWlsYWJsZSBhc3luYy10cmFja2VkIGNvbm5lY3Rpb24gYWZ0ZXIgdGhlIG1heCBsaXZlIGNvbm5lY3Rpb24gY2FwIGlzIHJlYWNoZWQuIFNldCBudWxsIHRvIHdhaXQgaW5kZWZpbml0ZWx5LiBEZWZhdWx0OiAxMDAwMC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gW2lkbGVUaW1lb3V0TWlsbGlzXSAtIElkbGUgdGltZW91dCBiZWZvcmUgY2xvc2luZyBhIGNoZWNrZWQtaW4gYXN5bmMtdHJhY2tlZCBjb25uZWN0aW9uLiBTZXQgbnVsbCB0byBkaXNhYmxlIGlkbGUgcmVhcGluZy4gRGVmYXVsdDogNTAwMC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gW21heF0gLSBNYXhpbXVtIGxpdmUgYXN5bmMtdHJhY2tlZCBjb25uZWN0aW9ucyBmb3IgdGhpcyBwb29sLiBEZWZhdWx0cyB0byAxMC4gRXh0cmEgY2hlY2tvdXRzIHdhaXQgdW50aWwgYSBtYXRjaGluZyBjb25uZWN0aW9uIGlzIGNoZWNrZWQgaW4gb3IgY2FwYWNpdHkgaXMgZnJlZWQuIFNldCBudWxsIHRvIGRpc2FibGUgdGhlIGNhcC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gW2Fkdmlzb3J5TG9ja0FjcXVpcmVUaW1lb3V0TXNdIC0gQm91bmQgKG1zKSBhIGJsb2NraW5nIGFkdmlzb3J5LWxvY2sgYWNxdWlzaXRpb24gd2FpdHMgZm9yIGEgY29udGVuZGVkIGxvY2sgYmVmb3JlIHJlcG9ydGluZyBmYWlsdXJlLiBEZWZhdWx0OiBgOTAwMDAwYCAoMTUgbWludXRlcykuIGBudWxsYCBvcHRzIG91dCBhbmQgcmVzdG9yZXMgdGhlIGRyaXZlcidzIGluZGVmaW5pdGUgd2FpdC4gQSBwZXItY2FsbCBgdGltZW91dE1zYCBhcmd1bWVudCBhbHdheXMgb3ZlcnJpZGVzIHRoaXMuXG4gKiBAcHJvcGVydHkge3tzbG93QWNxdWlyZU1zPzogbnVtYmVyIHwgbnVsbCwgc2xvd0hvbGRNcz86IG51bWJlciB8IG51bGx9fSBbYWR2aXNvcnlMb2NrVGVsZW1ldHJ5XSAtIEV2ZW50LWRyaXZlbiBhZHZpc29yeS1sb2NrIGR1cmF0aW9uIHRlbGVtZXRyeSB0aHJlc2hvbGRzLiBgc2xvd0FjcXVpcmVNc2AgKGRlZmF1bHQgYDUwMDBgKSByZXBvcnRzIGFuIGFjcXVpcmUgd2FpdCB0aGF0IGNvbXBsZXRlZCBzbG93ZXIgdGhhbiB0aGUgdGhyZXNob2xkLCBpbmNsdWRpbmcgdGhlIGV2ZW50dWFsIG91dGNvbWU7IGBhZHZpc29yeS1sb2NrLWFjcXVpcmUtdGltZW91dGAgYWx3YXlzIGZpcmVzIHdoZW4gYSB3YWl0IGV4Y2VlZHMgaXRzIGJvdW5kIGFuZCBjYXJyaWVzIHRoZSBob2xkZXIgaWRlbnRpdHkgYXZhaWxhYmxlIG9uIHRoZSB0aWVyIGF0IHRoYXQgbW9tZW50LiBgc2xvd0hvbGRNc2AgKGRlZmF1bHQgYDYwMDAwYCkgcmVwb3J0cyBhIGhvbGQgdGhhdCBvdXRsaXZlcyB0aGUgdGhyZXNob2xkIGF0IHJlbGVhc2UuIGBudWxsYCBkaXNhYmxlcyB0aGF0IHJlcG9ydC4gUmVwb3J0cyBmaXJlIG9uIHRoZSBldmVudHMgdGhlbXNlbHZlcyDigJQgbm8gcGVyaW9kaWMgc2Nhbm5lciDigJQgb24gYGdldEVycm9yRXZlbnRzKClgIGFzIGBmcmFtZXdvcmstZXJyb3JgIHdpdGggYGNvbnRleHQ6IFwiYWR2aXNvcnktbG9jay10ZWxlbWV0cnlcImAuIFNlZSBbZG9jcy9hZHZpc29yeS1sb2Nrcy5tZF0oLi4vZG9jcy9hZHZpc29yeS1sb2Nrcy5tZCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFiYXNlQ2hhcnNldF0gLSBEZWZhdWx0IGNoYXJhY3RlciBzZXQgYXBwbGllZCBieSBgZGI6Y3JlYXRlYCB2aWEgbXlzcWwvbWFyaWFkYiBgQ1JFQVRFIERBVEFCQVNFIC4uLiBDSEFSQUNURVIgU0VUYC4gRGlzdGluY3QgZnJvbSBgY2hhcnNldGAsIHdoaWNoIGlzIHRoZSBjbGllbnQgY29ubmVjdGlvbiBjaGFyc2V0IGZvcndhcmRlZCB0byB0aGUgbXlzcWwyIGRyaXZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGF0YWJhc2VDb2xsYXRpb25dIC0gRGVmYXVsdCBjb2xsYXRpb24gYXBwbGllZCBieSBgZGI6Y3JlYXRlYCB2aWEgbXlzcWwvbWFyaWFkYiBgQ1JFQVRFIERBVEFCQVNFIC4uLiBDT0xMQVRFYC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGF0YWJhc2VdIC0gRGF0YWJhc2UgbmFtZSBmb3IgdGhpcyBjb25uZWN0aW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWFkbG9ja01heFJldHJpZXNdIC0gTWF4aW11bSBhdHRlbXB0cyBmb3IgdGhlIG91dGVybW9zdCB0cmFuc2FjdGlvbiB3aGVuIGl0IGtlZXBzIGhpdHRpbmcgZGVhZGxvY2tzLiBEZWZhdWx0cyB0byA4LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWFkbG9ja0Jhc2VXYWl0TXNdIC0gQmFzZSBkZWxheSAobXMpIGZvciB0aGUgZGVhZGxvY2sgcmV0cnkgYmFja29mZjsgdGhlIHBlci1hdHRlbXB0IGNlaWxpbmcgZG91YmxlcyBmcm9tIGhlcmUuIERlZmF1bHRzIHRvIDUwLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWFkbG9ja01heFdhaXRNc10gLSBDYXAgKG1zKSBvbiB0aGUgZGVhZGxvY2sgcmV0cnkgYmFja29mZiBjZWlsaW5nIHNvIHRoZSBqaXR0ZXJlZCB3YWl0IHN0YXlzIGJvdW5kZWQuIERlZmF1bHRzIHRvIDEwMDAuXG4gKiBAcHJvcGVydHkge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBbZHJpdmVyXSAtIERyaXZlciBjbGFzcyB0byB1c2UgZm9yIHRoaXMgZGF0YWJhc2UuXG4gKiBAcHJvcGVydHkge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3Bvb2wvYmFzZS5qc1wiKS5kZWZhdWx0fSBbcG9vbFR5cGVdIC0gUG9vbCBjbGFzcyB0byB1c2UgZm9yIHRoaXMgZGF0YWJhc2UuXG4gKiBAcHJvcGVydHkgeygpID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBbZ2V0Q29ubmVjdGlvbl0gLSBDdXN0b20gY29ubmVjdGlvbiBmYWN0b3J5IG92ZXJyaWRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtob3N0XSAtIERhdGFiYXNlIGhvc3QuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFttaWdyYXRpb25zXSAtIFdoZXRoZXIgbWlncmF0aW9ucyBhcmUgZW5hYmxlZCBmb3IgdGhpcyBkYXRhYmFzZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW211bHRpcGxlU3RhdGVtZW50c10gLSAoTXlTUUwpIE9wdCBpbiB0byBtdWx0aS1zdGF0ZW1lbnQgcXVlcmllcyBzbyBzdHJ1Y3R1cmUgU1FMIGxvYWRzIGFuZCBhbGwtdGFibGUgY2xlYW51cCBjYW4gYmF0Y2ggaW50byBvbmUgcm91bmQtdHJpcC4gT2ZmIGJ5IGRlZmF1bHQ7IG9yZGluYXJ5IHF1ZXJpZXMgb3RoZXJ3aXNlIHJlamVjdCBzdGFja2VkIHN0YXRlbWVudHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heFJvd3NQZXJJbnNlcnRdIC0gTWF4aW11bSByb3dzIHBlciBgSU5TRVJUIC4uLiBWQUxVRVMgKC4uLiksICguLi4pLCAuLi5gIHN0YXRlbWVudCBnZW5lcmF0ZWQgYnkgYFJlY29yZC5pbnNlcnRNdWx0aXBsZWAuIERlZmF1bHRzIHRvIDUwMC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4SW5zZXJ0U3FsQnl0ZXNdIC0gTWF4aW11bSBzZXJpYWxpemVkIFNRTCBzaXplLCBpbiBieXRlcywgZm9yIGEgc2luZ2xlIGBJTlNFUlQgLi4uIFZBTFVFUyAoLi4uKSwgKC4uLiksIC4uLmAgc3RhdGVtZW50LiBEZWZhdWx0cyB0byAxIE1pQiAoMTA0ODU3NikuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heEluQ2xhdXNlVmFsdWVzXSAtIE1heGltdW0gdmFsdWVzIGluIGEgc2luZ2xlIGBJTiAoLi4uKWAgY29ob3J0IHVzZWQgYnkgcHJlbG9hZHMsIGFzc29jaWF0aW9uIGNvdW50cywgYW5kIHF1ZXJ5RGF0YSBhZ2dyZWdhdGVzLiBEZWZhdWx0cyB0byA5OTkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heFF1ZXJ5U3FsQnl0ZXNdIC0gTWF4aW11bSBzZXJpYWxpemVkIFNRTCBzaXplLCBpbiBieXRlcywgZm9yIGEgc2luZ2xlIGNvaG9ydCBxdWVyeSB1c2VkIGJ5IHByZWxvYWRzLCBhc3NvY2lhdGlvbiBjb3VudHMsIGFuZCBxdWVyeURhdGEgYWdncmVnYXRlcy4gRGVmYXVsdHMgdG8gMSBNaUIgKDEwNDg1NzYpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXNzd29yZF0gLSBQYXNzd29yZCBmb3IgdGhlIGRhdGFiYXNlIHVzZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIC0gRGF0YWJhc2UgcG9ydC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJpbWFyeUtleVR5cGVdIC0gRGVmYXVsdCB0eXBlIGZvciBpbXBsaWNpdCBtaWdyYXRpb24gcHJpbWFyeSBrZXlzIGFuZCByZWZlcmVuY2VzLiBEZWZhdWx0cyB0byBgdXVpZGAuXG4gKiBAcHJvcGVydHkge0RhdGFiYXNlUG9vbENvbmZpZ3VyYXRpb259IFtwb29sXSAtIFZlbG9jaW91cyBkYXRhYmFzZSBwb29sIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIEZyaWVuZGx5IG5hbWUgZm9yIHRoZSBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHsoZmlsZTogc3RyaW5nKSA9PiBzdHJpbmd9IFtsb2NhdGVGaWxlXSAtIE9wdGlvbmFsIHNxbGl0ZS13ZWIgc3FsLmpzIHdhc20gcmVzb2x2ZXIgKGBpbml0U3FsSnMoe2xvY2F0ZUZpbGV9KWApLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbcmVhZE9ubHldIC0gV2hldGhlciB3cml0ZXMgc2hvdWxkIGJlIGJsb2NrZWQgZm9yIHRoaXMgZGF0YWJhc2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NjaGVtYV0gLSBEZWZhdWx0IHNjaGVtYSBmb3IgdW5xdWFsaWZpZWQgdGFibGUgbG9va3VwcyAoTVNTUUwpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2NoZW1hQ2FjaGVdIC0gV2hldGhlciBzY2hlbWEgbWV0YWRhdGEgc2hvdWxkIGJlIGNhY2hlZCBvbiB0aGUgZHJpdmVyLiBEZWZhdWx0cyB0byB0cnVlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzY2hlbWFNZXRhZGF0YVJldHJ5RGVhZGxpbmVNc10gLSBCb3VuZGVkIGRlYWRsaW5lIChtcykgZm9yIG91dGxhc3RpbmcgYSBjYWNoZWQgc2NoZW1hLW1ldGFkYXRhIHJlYWQgdGhlIHNlcnZlciBza2lwcGVkIGJlY2F1c2UgY29uY3VycmVudCBvbmxpbmUgRERMIGlzIG1vZGlmeWluZyB0aGUgdGFibGUuIERlZmF1bHRzIHRvIDYwMDAwLlxuICogQHByb3BlcnR5IHtvYmplY3R9IFtyZWNvcmRdIC0gUmVjb3JkLWxldmVsIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZWNvcmQudHJhbnNhY3Rpb25zXSAtIFdoZXRoZXIgcmVjb3JkIG9wZXJhdGlvbnMgc2hvdWxkIHVzZSB0cmFuc2FjdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXNldF0gLSBXaGV0aGVyIHRvIHJlc2V0IHRoZSBkYXRhYmFzZSBvbiBzdGFydHVwLlxuICogQHByb3BlcnR5IHtTcWxDb25maWd9IFtzcWxDb25maWddIC0gRHJpdmVyLXNwZWNpZmljIFNRTCBjb25maWcuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0ZW5hbnRPbmx5XSAtIFdoZXRoZXIgdGhpcyBkYXRhYmFzZSBpZGVudGlmaWVyIGlzIG9ubHkgYWN0aXZlIGluc2lkZSBhIHJlc29sdmVkIHRlbmFudCBjb250ZXh0LlxuICogQHByb3BlcnR5IHtcIm1zc3FsXCIgfCBcIm15c3FsXCIgfCBcInBnc3FsXCIgfCBcInNxbGl0ZVwifSBbdHlwZV0gLSBEYXRhYmFzZSB0eXBlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3VzZURhdGFiYXNlXSAtIERhdGFiYXNlIHRvIHN3aXRjaCB0byBhZnRlciBjb25uZWN0aW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1c2VybmFtZV0gLSBVc2VybmFtZSBmb3IgZGF0YWJhc2UgYXV0aGVudGljYXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7XCJkZWJ1Zy1sb3ctbGV2ZWxcIiB8IFwiZGVidWdcIiB8IFwiaW5mb1wiIHwgXCJ3YXJuXCIgfCBcImVycm9yXCJ9IExvZ0xldmVsXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2dnaW5nT3V0cHV0UGF5bG9hZFxuICogQHByb3BlcnR5IHtMb2dMZXZlbH0gbGV2ZWwgLSBMb2cgbGV2ZWwuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVzc2FnZSAtIEZvcm1hdHRlZCBtZXNzYWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN1YmplY3QgLSBMb2cgc3ViamVjdC5cbiAqIEBwcm9wZXJ0eSB7RGF0ZX0gdGltZXN0YW1wIC0gVGltZXN0YW1wLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTG9nZ2luZ091dHB1dFxuICogQHByb3BlcnR5IHsoYXJnOiBMb2dnaW5nT3V0cHV0UGF5bG9hZCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWR9IHdyaXRlIC0gV3JpdGUgYSBsb2cgZW50cnkuXG4gKiBAcHJvcGVydHkge0xvZ0xldmVsW119IFtsZXZlbHNdIC0gRGVmYXVsdCBsZXZlbHMgZm9yIHRoaXMgb3V0cHV0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTG9nZ2luZ091dHB1dENvbmZpZ1xuICogQHByb3BlcnR5IHtMb2dnaW5nT3V0cHV0fSBvdXRwdXQgLSBPdXRwdXQgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge0FycmF5PExvZ0xldmVsPn0gW2xldmVsc10gLSBMZXZlbHMgZW5hYmxlZCBmb3IgdGhpcyBvdXRwdXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TG9nZ2luZ091dHB1dENvbmZpZyB8IExvZ2dpbmdPdXRwdXQgfCBpbXBvcnQoXCIuL2xvZ2dlci9iYXNlLWxvZ2dlci5qc1wiKS5kZWZhdWx0fSBMb2dnZXJDb25maWdcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExvZ2dpbmdDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zb2xlXSAtIEVuYWJsZS9kaXNhYmxlIGNvbnNvbGUgbG9nZ2luZyBmb3IgcmVxdWVzdCBsb2dnaW5nLiBEZWZhdWx0cyB0byB0cnVlIG91dHNpZGUgb2YgXCJ0ZXN0XCIgYW5kIGZvciBIVFRQIHNlcnZlciBsb2dzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmlsZV0gLSBFbmFibGUvZGlzYWJsZSB3cml0aW5nIGxvZ3MgdG8gYSBmaWxlLiBEZWZhdWx0cyB0byB0cnVlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkaXJlY3RvcnldIC0gRGlyZWN0b3J5IHdoZXJlIGxvZyBmaWxlcyBhcmUgc3RvcmVkLiBEZWZhdWx0cyB0byBcIjxwcm9qZWN0Pi9sb2dcIi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZmlsZVBhdGhdIC0gRXhwbGljaXQgcGF0aCBmb3IgdGhlIGxvZyBmaWxlLiBEZWZhdWx0cyB0byBcIjxkaXJlY3Rvcnk+LzxlbnZpcm9ubWVudD4ubG9nXCIuXG4gKiBAcHJvcGVydHkge0FycmF5PFwiZGVidWctbG93LWxldmVsXCIgfCBcImRlYnVnXCIgfCBcImluZm9cIiB8IFwid2FyblwiIHwgXCJlcnJvclwiPn0gW2xldmVsc10gLSBPdmVycmlkZSB3aGljaCBsb2cgbGV2ZWxzIGFyZSBlbWl0dGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVidWdMb3dMZXZlbF0gLSBDb252ZW5pZW5jZSBmbGFnIHRvIGluY2x1ZGUgdmVyeSBsb3ctbGV2ZWwgZGVidWcgbG9ncy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3F1ZXJ5TG9nZ2luZ10gLSBFbmFibGUvZGlzYWJsZSBkYXRhYmFzZSBxdWVyeSBsb2dnaW5nLiBEZWZhdWx0cyB0byB0cnVlIG91dHNpZGUgdGVzdCBhbmQgZmFsc2UgaW4gdGVzdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtzZW5zaXRpdmVOYW1lc10gLSBBZGRpdGlvbmFsIGNhc2UtaW5zZW5zaXRpdmUgc2Vuc2l0aXZlIGhlYWRlci9wYXJhbWV0ZXIgbmFtZXMgdG8gcmVkYWN0IGZyb20gbG9nZ2luZy5cbiAqIEBwcm9wZXJ0eSB7TG9nZ2VyQ29uZmlnW119IFtsb2dnZXJzXSAtIExvZ2dlciBpbnN0YW5jZXMgKGNvbnZlcnRlZCB0byBvdXRwdXRzIHdoZW4gY29uZmlndXJlZCkuXG4gKiBAcHJvcGVydHkge0xvZ2dpbmdPdXRwdXRDb25maWdbXX0gW291dHB1dHNdIC0gRXhwbGljaXQgbG9nZ2VyIG91dHB1dHMgKG92ZXJyaWRlcyBjb25zb2xlL2ZpbGUgZGVmYXVsdHMgd2hlbiBwcm92aWRlZCkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdHJ1Y3R1cmVTcWxDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZW5hYmxlZEVudmlyb25tZW50c10gLSBFbnZpcm9ubWVudHMgYWxsb3dlZCB0byB3cml0ZSBzdHJ1Y3R1cmUgc3FsIGZpbGVzIGR1cmluZyBhdXRvbWF0aWMgbWlncmF0aW9uIGR1bXBzLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2Rpc2FibGVkRW52aXJvbm1lbnRzXSAtIEVudmlyb25tZW50cyB0aGF0IHNob3VsZCBza2lwIHdyaXRpbmcgc3RydWN0dXJlIHNxbCBmaWxlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtcImJlYWNvblwiIHwgXCJwb2xsaW5nXCJ9IEJhY2tncm91bmRKb2JzRGlzcGF0Y2hTdHJhdGVneVxuICpcbiAqIC0gYFwiYmVhY29uXCJgIChkZWZhdWx0KTogZXZlbnQtZHJpdmVuIGRpc3BhdGNoLiBUaGVcbiAqICAgYGJhY2tncm91bmQtam9icy1tYWluYCBwcm9jZXNzIGRyYWlucyB0aGUgcXVldWUgb24gZW5xdWV1ZSwgb25cbiAqICAgd29ya2VyIHJlYWRpbmVzcywgb24gQmVhY29uIGJyb2FkY2FzdHMgKHNvIGNyb3NzLXByb2Nlc3MgZW5xdWV1ZXNcbiAqICAgd2FrZSBpdCksIGFuZCBhcm1zIGEgYHNldFRpbWVvdXRgIGZvciB0aGUgc29vbmVzdCBmdXR1cmUtc2NoZWR1bGVkXG4gKiAgIGpvYi4gRmFsbHMgYmFjayBncmFjZWZ1bGx5IHRvIGRpcmVjdCBpbi1wcm9jZXNzIHRyaWdnZXJpbmcgd2hlblxuICogICBCZWFjb24gaXMgbm90IGNvbmZpZ3VyZWQuXG4gKiAtIGBcInBvbGxpbmdcImA6IGxlZ2FjeSBtb2RlLCBydW5zIGEgZml4ZWQtaW50ZXJ2YWwgcG9sbCBvdmVyIHRoZVxuICogICBgYmFja2dyb3VuZF9qb2JzYCB0YWJsZSAoc2VlIGBwb2xsSW50ZXJ2YWxNc2ApLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7XCJiYWNrZ3JvdW5kXCIgfCBcImlubGluZVwifSBCYWNrZ3JvdW5kSm9ic01vZGUgKi9cbi8qKiBAdHlwZWRlZiB7XCJjYW5kaWRhdGVcIiB8IFwiYWN0aXZlXCIgfCBcInJldGlyZWRcIn0gQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uSW5pdGlhbFN0YXRlICovXG4vKiogQHR5cGVkZWYgeyhhcmdzOiB7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9KSA9PiBpbXBvcnQoXCIuL2JhY2tncm91bmQtam9icy9hZGFwdGVyLmpzXCIpLmRlZmF1bHR9IEJhY2tncm91bmRKb2JzQWRhcHRlckZhY3RvcnkgKi9cbi8qKiBAdHlwZWRlZiB7dHlwZW9mIGltcG9ydChcIi4vYmFja2dyb3VuZC1qb2JzL3BsYXRmb3JtLWpvYi5qc1wiKS5kZWZhdWx0fSBCYWNrZ3JvdW5kSm9iQ2xhc3MgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9ic0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9iYWNrZ3JvdW5kLWpvYnMvYWRhcHRlci5qc1wiKS5kZWZhdWx0IHwgQmFja2dyb3VuZEpvYnNBZGFwdGVyRmFjdG9yeX0gW2FkYXB0ZXJdIC0gQWRhcHRlciBpbnN0YW5jZSBvciBzeW5jaHJvbm91cyBmYWN0b3J5LiBBIGZhY3RvcnkgY3JlYXRlcyBvbmUgYWRhcHRlciBwZXIgY29uZmlndXJhdGlvbiBsaWZlY3ljbGU7IHRoZSBmcmFtZXdvcmsgY2xvc2VzIGFkYXB0ZXJzIGl0IHJlc29sdmVzLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iQ2xhc3NbXX0gW2pvYkNsYXNzZXNdIC0gU3RhdGljIHBvcnRhYmxlIGpvYiBjbGFzc2VzIGF2YWlsYWJsZSB0byBCcm93c2VyL0V4cG8gbG9jYWwgZGlzcGF0Y2guIERlZmF1bHRzIHRvIGBbXWA7IE5vZGUga2VlcHMgaXRzIGZpbGVzeXN0ZW0gcmVnaXN0cnkuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JzTW9kZX0gW21vZGVdIC0gYFwiYmFja2dyb3VuZFwiYCB1c2VzIHRoZSBjb25maWd1cmVkIGFkYXB0ZXIvdHJhbnNwb3J0IGFuZCBkdXJhYmxlIHF1ZXVlIHNlbWFudGljczsgYFwiaW5saW5lXCJgIHBlcmZvcm1zIGltbWVkaWF0ZWx5IHdpdGhvdXQgZHVyYWJsZSBxdWV1ZSBzdGF0ZS4gRGVmYXVsdHMgdG8gYFwiYmFja2dyb3VuZFwiYC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZ2VuZXJhdGlvbklkXSAtIE9wdC1pbiByZWxlYXNlIGdlbmVyYXRpb24gaWRlbnRpdHkuIE11c3QgbWF0Y2ggYF5bQS1aYS16MC05XVtBLVphLXowLTkuXy1dezAsMTI3fSRgIGFuZCBhZ3JlZSB3aXRoIGVudmlyb25tZW50L0FQSS9DTEkgc291cmNlcy5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uSW5pdGlhbFN0YXRlfSBbaW5pdGlhbEdlbmVyYXRpb25TdGF0ZV0gLSBHZW5lcmF0aW9uLWF3YXJlIGJvb3Qgc3RhdGUuIERlZmF1bHRzIHRvIGBcImNhbmRpZGF0ZVwiYDsgaW52YWxpZCB3aXRob3V0IGBnZW5lcmF0aW9uSWRgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtsaWZlY3ljbGVTb2NrZXRQYXRoXSAtIEFic29sdXRlIHJlbGVhc2UtbG9jYWwgVW5peCBzb2NrZXQgdXNlZCBieSBhY2tub3dsZWRnZWQgYWN0aXZhdGlvbiBhbmQgcmV0aXJlbWVudCBjb21tYW5kcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaG9zdF0gLSBIb3N0bmFtZSBmb3IgdGhlIGJhY2tncm91bmQgam9icyBtYWluIHByb2Nlc3MuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIC0gUG9ydCBmb3IgdGhlIGJhY2tncm91bmQgam9icyBtYWluIHByb2Nlc3MuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFiYXNlSWRlbnRpZmllcl0gLSBEYXRhYmFzZSBpZGVudGlmaWVyIHVzZWQgdG8gc3RvcmUgYmFja2dyb3VuZCBqb2JzLiBCcm93c2VyL0V4cG8gbG9jYWwgZGlzcGF0Y2ggdXNlcyB0aGlzIGV4aXN0aW5nIFNRTGl0ZSBkYXRhYmFzZSBhbmQgZGVmYXVsdHMgdG8gYFwiZGVmYXVsdFwiYC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4Q29uY3VycmVudElubGluZUpvYnNdIC0gSG93IG1hbnkgYGZvcmtlZDogZmFsc2VgIGpvYnMgYSBzaW5nbGVcbiAqICAgYGJhY2tncm91bmQtam9icy13b3JrZXJgIHByb2Nlc3MgaXMgYWxsb3dlZCB0byBydW4gaW4gcGFyYWxsZWwuIENvbmN1cnJlbmN5XG4gKiAgIGlzIGF0IHRoZSBKUyBldmVudC1sb29wIGxldmVsOiBldmVyeSBjb25jdXJyZW50IGpvYiBzaGFyZXMgdGhlIHdvcmtlcidzXG4gKiAgIHByb2Nlc3MgYW5kIERCIGNvbm5lY3Rpb24gcG9vbCwgc28gdGhpcyBzaG91bGQgZml0IHRoZSBwb29sIHNpemUsIG5vdCB0aGVcbiAqICAgQ1BVIGNvdW50LiBGb3JraW5nIHJlbWFpbnMgdGhlIHJpZ2h0IHRvb2wgZm9yIG1lbW9yeSBpc29sYXRpb24gYWNyb3NzXG4gKiAgIGxvbmctcnVubmluZyBqb2JzIGFuZCBmb3IgdXNpbmcgbW9yZSBjb3Jlcy4gRGVmYXVsdDogYDRgLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhDb25jdXJyZW50Rm9ya2VkSm9ic10gLSBIb3cgbWFueSBvdXQtb2YtcHJvY2Vzc1xuICogICBgXCJmb3JrZWRcImAgb3IgYFwic3Bhd25lZFwiYCBqb2JzIGEgc2luZ2xlIGBiYWNrZ3JvdW5kLWpvYnMtd29ya2VyYCBpc1xuICogICBhbGxvd2VkIHRvIGtlZXAgaW4gZmxpZ2h0LiBEZWZhdWx0OiBgNGAuIFRoaXMgaXMgYSBwZXItd29ya2VyIHNhZmV0eSBjYXA7XG4gKiAgIGZvciB3b3JrbG9hZC1zaGFwZWQgbGltaXRzIHVzZSBwZXItcXVldWUgY2FwcyAoYHF1ZXVlc2ApIGluc3RlYWQsIHdoaWNoIGFyZVxuICogICBlbmZvcmNlZCBjbHVzdGVyLXdpZGUgYW5kIGFyZSBpbW11bmUgdG8gZHVwbGljYXRlIHdvcmtlciBwcm9jZXNzZXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Bvb2xlZFJ1bm5lckNvdW50XSAtIE51bWJlciBvZiB3YXJtLCByZXVzYWJsZSBjaGlsZCBydW5uZXJzIG93bmVkIGJ5IGVhY2ggd29ya2VyLiBQb29sZWQgY2FwYWNpdHkgaXMgc2VwYXJhdGUgZnJvbSBpbmxpbmUgYW5kIGZvcmtlZC9zcGF3bmVkIGNhcGFjaXR5LiBEZWZhdWx0OiBgNGAuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Bvb2xlZFJ1bm5lckNvbmN1cnJlbmN5XSAtIE51bWJlciBvZiBqb2JzIGVhY2ggcG9vbGVkIGNoaWxkIHJ1bnMgY29uY3VycmVudGx5IG9uIGl0cyBvd24gZXZlbnQgbG9vcC4gVG90YWwgcGVyLXdvcmtlciBwb29sZWQgY2FwYWNpdHkgaXMgYHBvb2xlZFJ1bm5lckNvdW50IMOXIHBvb2xlZFJ1bm5lckNvbmN1cnJlbmN5YC4gYDFgIChkZWZhdWx0KSBrZWVwcyBlYWNoIGNoaWxkIHNlcmlhbDsgcmFpc2UgaXQgZm9yIEkvTy1ib3VuZCBqb2JzIHNvIGEgYm91bmRlZCBzZXQgb2YgaXNvbGF0ZWQgcHJvY2Vzc2VzIGhhbmRsZXMgaGlnaCBjb25jdXJyZW5jeSAobGlrZSB0aGUgaW5saW5lIGxhbmUpIHdpdGhvdXQgb25lIHByb2Nlc3MgcGVyIGNvbmN1cnJlbnQgam9iLiBEZWZhdWx0OiBgMWAuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Bvb2xlZFJ1bm5lck1heEpvYnNdIC0gTnVtYmVyIG9mIHNlcXVlbnRpYWwgam9icyBhIHBvb2xlZCBjaGlsZCBydW5zIGJlZm9yZSBpdCBpcyByZXBsYWNlZCwgYm91bmRpbmcgcHJvY2Vzcy1sZXZlbCByZXNvdXJjZSBhY2N1bXVsYXRpb24uIERlZmF1bHQ6IGAxMDBgLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb29sZWRSdW5uZXJNYXhSc3NCeXRlc10gLSBQZWFrIFJTUyAodGhlIGtlcm5lbCBgVm1IV01gIGhpZ2gtd2F0ZXIgbWFyayByZXBvcnRlZCBieSB0aGUgY2hpbGQpIGF0IHdoaWNoIGEgcG9vbGVkIGNoaWxkIGlzIHJlcGxhY2VkIGFmdGVyIGFuIGFja25vd2xlZGdlZCBqb2IuIFRoZSBjaGlsZCdzIHBlYWssIG5vdCBpdHMgc2V0dGxlZCBSU1MgYXQgam9iLW91dGNvbWUgdGltZSwgaXMgdGhlIHRyaWdnZXIsIHNvIGEgYnVyc3Qgd29ya2luZy1zZXQgdGhhdCByZWNsYWltcyBiZWZvcmUgdGhlIG91dGNvbWUgc3RpbGwgcmV0aXJlcyB0aGUgY2hpbGQuIERlZmF1bHQ6IGA1MzY4NzA5MTJgICg1MTIgTWlCKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9vbGVkUnVubmVyTWF4TGlmZXRpbWVNc10gLSBBZ2UgYWZ0ZXIgYW4gYWNrbm93bGVkZ2VkIGpvYiBhdCB3aGljaCBhIHBvb2xlZCBjaGlsZCBpcyByZXBsYWNlZC4gRGVmYXVsdDogYDM2MDAwMDBgIChvbmUgaG91cikuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3J1bm5lck1heE9sZFNwYWNlU2l6ZU1iXSAtIFY4IGhlYXAgY2FwIChgLS1tYXgtb2xkLXNwYWNlLXNpemVgLCBNaUIpIGFwcGxpZWQgdG8gZXZlcnkgYmFja2dyb3VuZC1qb2JzIHJ1bm5lciBjaGlsZCBwcm9jZXNzIChwb29sZWQsIGZvcmtlZCwgYW5kIHNwYXduZWQpIHNvIGEgc2luZ2xlIGNoaWxkIGNhbiBuZXZlciBjb21taXQgbXVsdGlwbGUgR0JzIG9mIGhlYXAuIERlZmF1bHQ6IGAyMDQ4YC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcnVubmVyTWFsbG9jQXJlbmFNYXhdIC0gYE1BTExPQ19BUkVOQV9NQVhgIGV4cG9ydGVkIHRvIGV2ZXJ5IGJhY2tncm91bmQtam9icyBydW5uZXIgY2hpbGQgcHJvY2VzcywgYm91bmRpbmcgZ2xpYmMgcGVyLXRocmVhZCBhcmVuYXMuIERlZmF1bHRzIHRvIGFuIGluaGVyaXRlZCBgTUFMTE9DX0FSRU5BX01BWGAsIGVsc2UgYDRgLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCB7bWF4Q29uY3VycmVudD86IG51bWJlciwgcHJpb3JpdHk/OiBudW1iZXJ9Pn0gW3F1ZXVlc10gLSBQZXItcXVldWVcbiAqICAgY29uY3VycmVuY3kgY2FwcyBhbmQgZGlzcGF0Y2ggcHJpb3JpdGllcywgU2lkZWtpcS1zdHlsZS4gQSBqb2IgZGVjbGFyZXMgaXRzIHF1ZXVlIChzdGF0aWNcbiAqICAgYHF1ZXVlYCBvbiB0aGUgam9iIGNsYXNzLCBvciB0aGUgYHF1ZXVlYCBlbnF1ZXVlIG9wdGlvbjsgZGVmYXVsdHMgdG8gYFwiZGVmYXVsdFwiYCksIGFuZFxuICogICBgcXVldWVzW25hbWVdLm1heENvbmN1cnJlbnRgIGJvdW5kcyBob3cgbWFueSBqb2JzIGZyb20gdGhhdCBxdWV1ZSBtYXkgYmVcbiAqICAgaW4gZmxpZ2h0IGFjcm9zcyB0aGUgd2hvbGUgY2x1c3RlciAoZW5mb3JjZWQgdmlhIGR1cmFibGUgcGVyLWtleVxuICogICBjb25jdXJyZW5jeSwgc28gaXQgaG9sZHMgcmVnYXJkbGVzcyBvZiBob3cgbWFueSB3b3JrZXIgcHJvY2Vzc2VzIHJ1bikuXG4gKiAgIFNpemUgZWFjaCBxdWV1ZSB0byBpdHMgd29ya2xvYWQ6IEkvTy1ib3VuZCBxdWV1ZXMgKGUuZy4gYnVpbGQgcnVubmVyc1xuICogICB3YWl0aW5nIG9uIHJlbW90ZSBEb2NrZXIgc2VydmVycykgY2FuIHJ1biBmYXIgYWJvdmUgdGhlIGNvcmUgY291bnQsIHdoaWxlXG4gKiAgIENQVS1ib3VuZCBxdWV1ZXMgc2hvdWxkIHN0YXkgbmVhciBpdC4gYHF1ZXVlc1tuYW1lXS5wcmlvcml0eWAgKGRlZmF1bHQgYDBgKVxuICogICBtYWtlcyB0aGUgbWFpbiBwcm9jZXNzIGRpc3BhdGNoIGhpZ2hlci1wcmlvcml0eSBxdWV1ZXMgYmVmb3JlIGxvd2VyLXByaW9yaXR5XG4gKiAgIG9uZXMgcmVnYXJkbGVzcyBvZiBlbnF1ZXVlIG9yZGVyLCBzbyBhIHNtYWxsIHRpbWUtY3JpdGljYWwgcXVldWUgY2FuIG5ldmVyIGJlXG4gKiAgIHN0YXJ2ZWQgYnkgYSBmbG9vZCBvZiBsb3ctcHJpb3JpdHkgd29yayBzaGFyaW5nIGEgd29ya2VyIHBvb2wuIFVubGlrZVxuICogICBTaWRla2lxJ3Mgc3RyaWN0IHF1ZXVlIG9yZGVyaW5nLCBwcmlvcml0eSBjb21wb3NlcyB3aXRoIHRoZSBwZXItcXVldWUgY2FwczpcbiAqICAgYSBoaWdoZXItcHJpb3JpdHkgcXVldWUgdGhhdCBpcyBhbHJlYWR5IGF0IGl0cyBgbWF4Q29uY3VycmVudGAgaXMgc2tpcHBlZCBhbmRcbiAqICAgZGlzcGF0Y2ggZmFsbHMgdGhyb3VnaCB0byB0aGUgbmV4dCBlbGlnaWJsZSBsb3dlci1wcmlvcml0eSBqb2IsIHNvIGEgYnVzeVxuICogICBoaWdoLXByaW9yaXR5IHF1ZXVlIGRvZXMgbm90IGJsb2NrIGV2ZXJ5dGhpbmcgZWxzZS4gVGhpcyBmYWxsdGhyb3VnaCBpcyBhXG4gKiAgIHByb3BlcnR5IG9mIHRoZSBxdWV1ZS1kZXJpdmVkIGNhcDsgYSBqb2IgdGhhdCBzdXBwbGllcyBpdHMgb3duIGV4cGxpY2l0XG4gKiAgIGBjb25jdXJyZW5jeUtleWAvYG1heENvbmN1cnJlbmN5YCBieXBhc3NlcyB0aGUgcXVldWUgY2FwIGVudGlyZWx5IChhblxuICogICBleHBsaWNpdCBrZXkgYWx3YXlzIHdpbnMg4oCUIHNlZSBhYm92ZSkgYW5kIGlzIGJvdW5kZWQgb25seSBieSB0aGF0IGtleSwgc28gaXRcbiAqICAgaXMgbm90IGhlbGQgYmFjayBieSB0aGUgcXVldWUncyBjYXAgYW5kIHByaW9yaXR5IHNpbXBseSBvcmRlcnMgaXQgbm9ybWFsbHkuXG4gKiAgIFByaW9yaXRpZXMgbWF5IGJlIGFueSBudW1iZXIsIGluY2x1ZGluZyBuZWdhdGl2ZSB0byBzaW5rIGEgcXVldWUgYmVsb3cgdGhlXG4gKiAgIGRlZmF1bHQuIEpvYnMgd2l0aGluIHRoZSBzYW1lIHByaW9yaXR5IGtlZXAgRklGTyAoYHNjaGVkdWxlZF9hdGAsIHRoZW5cbiAqICAgYGNyZWF0ZWRfYXRgKSBvcmRlci4gRGVmYXVsdDogYHt9YCAobm8gcXVldWUgY2FwcywgYWxsIHF1ZXVlcyBwcmlvcml0eSBgMGApLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBbc2NoZWR1bGVkRW5xdWV1ZVRpbWVvdXRNc10gLSBCb3VuZHMgb25lIHNjaGVkdWxlZCBlbnF1ZXVlIGF0dGVtcHQgaW4gdGhlIG1haW4gcHJvY2Vzcy4gQSBkdXJhYmxlIGVucXVldWUgdGhhdCBuZXZlciBzZXR0bGVzICh3ZWRnZWQgREIgY29ubmVjdGlvbiwgY29udGVuZGVkIGFkdmlzb3J5IGxvY2spIHdvdWxkIG90aGVyd2lzZSBrZWVwIGl0cyBzY2hlZHVsZSBrZXkgcGVybWFuZW50bHkgaW4gZmxpZ2h0LCBzbyBldmVyeSBsYXRlciB0aWNrIHNraXBwZWQgaXRzZWxmIGFuZCBzaHV0ZG93biBjb3VsZCBuZXZlciBkcmFpbi4gT24gdGltZW91dCB0aGUgYXR0ZW1wdCBpcyByZXBvcnRlZCBhcyBgYmFja2dyb3VuZC1qb2JzLXNjaGVkdWxlZC1lbnF1ZXVlLXN0YWxsYCBhbmQgdGhlIGtleSBjbGVhcnMgZm9yIHRoZSBuZXh0IHRpY2suIERlZmF1bHQ6IDIwIG1pbnV0ZXMg4oCUIGRlbGliZXJhdGVseSA1IG1pbnV0ZXMgYWJvdmUgYGFkdmlzb3J5TG9ja0FjcXVpcmVUaW1lb3V0TXNgIHNvIHRoZSBwcmVjaXNlIGxvY2sgZXJyb3Igc3VyZmFjZXMgZmlyc3QuIGBudWxsYCBvcHRzIG91dC5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYnNEaXNwYXRjaFN0cmF0ZWd5fSBbZGlzcGF0Y2hTdHJhdGVneV0gLSBIb3cgdGhlIG1haW4gcHJvY2Vzc1xuICogICBkZXRlY3RzIG5ldyB3b3JrLiBEZWZhdWx0cyB0byBgXCJiZWFjb25cImAgKGV2ZW50LWRyaXZlbikuIFNldCB0byBgXCJwb2xsaW5nXCJgXG4gKiAgIHRvIHJlc3RvcmUgdGhlIGxlZ2FjeSBmaXhlZC1pbnRlcnZhbCBwb2xsLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb2xsSW50ZXJ2YWxNc10gLSBQb2xsIGludGVydmFsIGluIG1pbGxpc2Vjb25kcy4gT25seSB1c2VkXG4gKiAgIHdoZW4gYGRpc3BhdGNoU3RyYXRlZ3kgPT09IFwicG9sbGluZ1wiYC4gRGVmYXVsdDogYDEwMDBgLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkcmFpblN0b3JlT3BlcmF0aW9uVGltZW91dE1zXSAtIEJvdW5kcyBvbmUgZHJhaW4tY3JpdGljYWxcbiAqICAgc3RvcmUgb3BlcmF0aW9uIGluIHRoZSBtYWluIHByb2Nlc3M6IHRoZSBxdWV1ZWQtam9iIGxvb2t1cCwgdGhlIGR1cmFibGVcbiAqICAgaGFuZG9mZiBjbGFpbSwgYW5kIGhhbmRvZmYtcmVjb3ZlcnkgdHJhbnNpdGlvbnMuIEEgc3RvcmUgY2FsbCB0aGF0IG5ldmVyXG4gKiAgIHNldHRsZXMgKHdlZGdlZCBEQiBjb25uZWN0aW9uLCBsb3N0IGFja25vd2xlZGdlbWVudCkgd291bGQgb3RoZXJ3aXNlIGZyZWV6ZVxuICogICB0aGUgY29hbGVzY2VkIGRyYWluIGFuZCBldmVyeSBsYXRlciBkaXNwYXRjaCBxdWV1ZWQgYmVoaW5kIGl0IHVudGlsIHRoZVxuICogICBwcm9jZXNzIGlzIGtpbGxlZDsgb24gdGltZW91dCB0aGUgZHJhaW4gZmFpbHMgaW50byBpdHMgZXhpc3RpbmdcbiAqICAgZXJyb3IvcmV0cnkgcGF0aCBhbmQgdGhlIHN0YWxsIGlzIHJlcG9ydGVkIGFzIGEgZnJhbWV3b3JrIGVycm9yLlxuICogICBEZWZhdWx0OiBgNjAwMDBgLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBbam9iVGltZW91dE1zXSAtIFdhbGwtY2xvY2sgYmFja3N0b3AsIGluIG1zLCBmb3IgYVxuICogICBgXCJmb3JrZWRcImAgam9iIHJ1bm5lci4gQSBmb3JrZWQgam9iIHN0aWxsIHJ1bm5pbmcgYWZ0ZXIgdGhpcyBpcyB0ZXJtaW5hdGVkXG4gKiAgIChTSUdURVJNLCB0aGVuIFNJR0tJTEwgYWZ0ZXIgdGhlIHJlYXBpbmcgZ3JhY2UpIGFuZCByZXBvcnRlZCBmYWlsZWQsIHNvIGFcbiAqICAgc2luZ2xlIGdlbnVpbmVseS1odW5nIHJ1bm5lciBjYW4ndCBwaW4gYSBkcmFpbmluZyB3b3JrZXIg4oCUIGFuZCBpdHMgZnVsbC1hcHBcbiAqICAgYm9vdCBhbmQgREIgY29ubmVjdGlvbnMg4oCUIGluZGVmaW5pdGVseSAoZS5nLiBhY3Jvc3MgYSBkZXBsb3kgd2hlcmUgYSByZXRpcmVkXG4gKiAgIHdvcmtlciBkcmFpbnMgaW4tZmxpZ2h0IGpvYnMpLiBUaGlzIGlzIGEgY29hcnNlIHNhZmV0eSBuZXQsIG5vdCBwZXItam9iXG4gKiAgIHR1bmluZzogc2V0IGl0IHdlbGwgYWJvdmUgdGhlIGxvbmdlc3QgbGVnaXRpbWF0ZSBmb3JrZWQgam9iIChidWlsZCBydW5uZXJzLFxuICogICBsb25nIGltcG9ydHMpIHNvIG9ubHkgZ2VudWluZWx5LXN0dWNrIHJ1bm5lcnMgYXJlIGtpbGxlZC4gT21pdCwgYG51bGxgLCBvclxuICogICBgPD0gMGAgdG8gZGlzYWJsZSAoZGVmYXVsdCksIHdoaWNoIHByZXNlcnZlcyB0aGUgcHJpb3IgdW5ib3VuZGVkIGJlaGF2aW9yLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9ic1JldGVudGlvbkNvbmZpZ3VyYXRpb259IFtyZXRlbnRpb25dIC0gUmV0ZW50aW9uL3BydW5pbmdcbiAqICAgb2YgdGVybWluYWwgam9iIHJvd3MuIFdpdGhvdXQgcHJ1bmluZyB0aGUgam9icyB0YWJsZSBncm93cyB1bmJvdW5kZWRcbiAqICAgKGNvbXBsZXRlZCByb3dzIGFjY3VtdWxhdGUgZm9yZXZlciksIHdoaWNoIGJsb2F0cyBzdG9yYWdlIGFuZCBpbmRleGVzIGFuZFxuICogICBldmVudHVhbGx5IHNsb3dzIGRpc3BhdGNoLiBUaGUgbWFpbiBwcm9jZXNzIHN3ZWVwcyB0ZXJtaW5hbCByb3dzIHBhc3QgdGhlaXJcbiAqICAgd2luZG93IG9uIGFuIGludGVydmFsLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYnNSZXRlbnRpb25Db25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IFtjb21wbGV0ZWRUdGxNc10gLSBEZWxldGUgYGNvbXBsZXRlZGAgam9icyB3aG9zZVxuICogICBgY29tcGxldGVkX2F0X21zYCBpcyBvbGRlciB0aGFuIHRoaXMgbWFueSBtcy4gYG51bGxgIG9yIGA8PSAwYCBkaXNhYmxlc1xuICogICBjb21wbGV0ZWQgcHJ1bmluZy4gRGVmYXVsdDogYDYwNDgwMDAwMGAgKDcgZGF5cykuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IFtmYWlsZWRUdGxNc10gLSBEZWxldGUgdGVybWluYWwgYGZhaWxlZGAvYG9ycGhhbmVkYFxuICogICBqb2JzIG9sZGVyIHRoYW4gdGhpcyBtYW55IG1zLiBgbnVsbGAgb3IgYDw9IDBgIGRpc2FibGVzIChrZWVwcyB0aGVtIGZvclxuICogICBkZWJ1Z2dpbmcpLiBEZWZhdWx0OiBgMjU5MjAwMDAwMGAgKDMwIGRheXMpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtiYXRjaFNpemVdIC0gUm93cyBkZWxldGVkIHBlciBiYXRjaC4gRGVmYXVsdDogYDEwMDBgLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzd2VlcEludGVydmFsTXNdIC0gSG93IG9mdGVuIHRoZSByZXRlbnRpb24gc3dlZXAgcnVucy5cbiAqICAgRGVmYXVsdDogYDM2MDAwMDBgICgxIGhvdXIpLlxuICovXG4vKipcbiAqIEZ1bGx5LXJlc29sdmVkIHJldGVudGlvbiBjb25maWcgYXMgcmV0dXJuZWQgYnkgYGdldEJhY2tncm91bmRKb2JzQ29uZmlnKClgXG4gKiAoZXZlcnkgZmllbGQgZGVmYXVsdGVkKSwgYXMgb3Bwb3NlZCB0byB0aGUgcGFydGlhbCB1c2VyLXByb3ZpZGVkIGlucHV0LlxuICogQHR5cGVkZWYge29iamVjdH0gUmVzb2x2ZWRCYWNrZ3JvdW5kSm9ic1JldGVudGlvbkNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gY29tcGxldGVkVHRsTXMgLSBSZXNvbHZlZCBjb21wbGV0ZWQtam9iIFRUTCBpbiBtcyAoYG51bGxgIGRpc2FibGVzKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gZmFpbGVkVHRsTXMgLSBSZXNvbHZlZCBmYWlsZWQvb3JwaGFuZWQgVFRMIGluIG1zIChgbnVsbGAgZGlzYWJsZXMpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJhdGNoU2l6ZSAtIFJlc29sdmVkIGRlbGV0ZSBiYXRjaCBzaXplLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN3ZWVwSW50ZXJ2YWxNcyAtIFJlc29sdmVkIHN3ZWVwIGludGVydmFsIGluIG1zLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmVhY29uQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtib29sZWFufSBbZW5hYmxlZF0gLSBXaGV0aGVyIHRvIGNvbm5lY3QgdG8gYSBCZWFjb24gYnJva2VyLiBEZWZhdWx0cyB0byBmYWxzZSB1bmxlc3MgYGhvc3RgL2Bwb3J0YCBvciBgaW5Qcm9jZXNzOiB0cnVlYCBhcmUgc2V0LCBvciBlbnYgdmFycyBhcmUgcHJlc2VudC4gRXhwbGljaXQgYGZhbHNlYCBkaXNhYmxlcyBCZWFjb24gZXZlbiB3aGVuIGVudiB2YXJzIGFyZSBzZXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpblByb2Nlc3NdIC0gV2hlbiB0cnVlLCB1c2UgYSBtb2R1bGUtbGV2ZWwgaW4tcHJvY2VzcyBicm9rZXIgc2luZ2xldG9uIGluc3RlYWQgb2YgY29ubmVjdGluZyBvdmVyIFRDUC4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGhvc3RgL2Bwb3J0YC4gVXNlZnVsIGZvciB0ZXN0cyBhbmQgc2luZ2xlLXByb2Nlc3MgZGVwbG95bWVudHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvc3RdIC0gSG9zdG5hbWUgb2YgdGhlIEJlYWNvbiBicm9rZXIgZGFlbW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb3J0XSAtIFBvcnQgb2YgdGhlIEJlYWNvbiBicm9rZXIgZGFlbW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwZWVyVHlwZV0gLSBPcHRpb25hbCBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhpcyBwZWVyIChlLmcuIFwic2VydmVyXCIsIFwiYmFja2dyb3VuZC1qb2JzLXdvcmtlclwiKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdW5yZWFjaGFibGVSZXBvcnRNc10gLSBHcmFjZSB3aW5kb3cgKG1zKSBhIGJlYWNvbiBjb25uZWN0L2Rpc2Nvbm5lY3QgYmxpcCBtdXN0IHBlcnNpc3QgYmVmb3JlIGl0IGlzIHJlcG9ydGVkIGFzIGEgZnJhbWV3b3JrLWVycm9yLiBUcmFuc2llbnQgb3V0YWdlcyB0aGF0IHJlY292ZXIgd2l0aGluIHRoaXMgd2luZG93IChlLmcuIGEgZGVwbG95IHJlc3RhcnRpbmcgdGhlIGJyb2tlcikgYXJlIG5vdCByZXBvcnRlZC4gRGVmYXVsdHMgdG8gMzAwMDAuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBIdHRwQ29tcHJlc3Npb25Db25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlbmFibGVkXSAtIFdoZXRoZXIgYnVmZmVyZWQgcmVzcG9uc2UgY29tcHJlc3Npb24gaXMgZW5hYmxlZC4gRGVmYXVsdHMgdG8gdHJ1ZTsgc2V0IGZhbHNlIHRvIGRpc2FibGUgZ2xvYmFsbHkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RocmVzaG9sZF0gLSBNaW5pbXVtIGJ1ZmZlcmVkIGJvZHkgc2l6ZSBpbiBieXRlcyBiZWZvcmUgY29tcHJlc3Npb24gaXMgYXBwbGllZC4gRGVmYXVsdHMgdG8gMTAyNC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbYnJvdGxpUXVhbGl0eV0gLSBCcm90bGkgZW5jb2RlciBxdWFsaXR5ICgwLTExKS4gRGVmYXVsdHMgdG8gNC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZ3ppcExldmVsXSAtIEd6aXAgY29tcHJlc3Npb24gbGV2ZWwgKDAtOSkuIERlZmF1bHRzIHRvIDYuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb3JtYWxpemVkSHR0cENvbXByZXNzaW9uQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtib29sZWFufSBlbmFibGVkIC0gV2hldGhlciBidWZmZXJlZCBIVFRQIHJlc3BvbnNlIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGhyZXNob2xkIC0gTWluaW11bSBidWZmZXJlZCBib2R5IHNpemUgaW4gYnl0ZXMgYmVmb3JlIGNvbXByZXNzaW9uIGlzIGFwcGxpZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gYnJvdGxpUXVhbGl0eSAtIEJyb3RsaSBlbmNvZGVyIHF1YWxpdHkgKDAtMTEpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGd6aXBMZXZlbCAtIEd6aXAgY29tcHJlc3Npb24gbGV2ZWwgKDAtOSkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBIdHRwUmVxdWVzdEJvZHlQb2xpY3lSZXNvbHZlckFyZ3NcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gaGVhZGVycyAtIENvbXBsZXRlIHJlcXVlc3QgaGVhZGVycyBhcyByZWNlaXZlZCBieSB0aGUgcGFyc2VyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGh0dHBNZXRob2QgLSBVcHBlcmNhc2UgSFRUUCBtZXRob2QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIFJlcXVlc3QgdGFyZ2V0LCBpbmNsdWRpbmcgaXRzIHF1ZXJ5IHN0cmluZyB3aGVuIHByZXNlbnQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBIdHRwUmVxdWVzdEJvZHlQb2xpY3lcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4UmVxdWVzdEJvZHlCeXRlc10gLSBQZXItcmVxdWVzdCBkZWNvZGVkIGJvZHkgbGltaXQuIEZhbGxzIGJhY2sgdG8gdGhlIGdsb2JhbCBsaW1pdCB3aGVuIG9taXR0ZWQuXG4gKiBAcHJvcGVydHkge1wicGFyc2VkXCIgfCBcInJhd1wifSBbbW9kZV0gLSBQYXJzZWQgcGFyYW1zIGJ5IGRlZmF1bHQ7IHJhdyBwcmVzZXJ2ZXMgZXhhY3QgYnl0ZXMgYW5kIHNraXBzIGJvZHkgZGVjb2RpbmcuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHsoYXJnczogSHR0cFJlcXVlc3RCb2R5UG9saWN5UmVzb2x2ZXJBcmdzKSA9PiBIdHRwUmVxdWVzdEJvZHlQb2xpY3kgfCB1bmRlZmluZWR9IEh0dHBSZXF1ZXN0Qm9keVBvbGljeVJlc29sdmVyICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmVzb2x2ZWRIdHRwUmVxdWVzdEJvZHlQb2xpY3lcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBtYXhSZXF1ZXN0Qm9keUJ5dGVzIC0gRWZmZWN0aXZlIGRlY29kZWQgYm9keSBsaW1pdC5cbiAqIEBwcm9wZXJ0eSB7XCJwYXJzZWRcIiB8IFwicmF3XCJ9IG1vZGUgLSBFZmZlY3RpdmUgYm9keSBoYW5kbGluZyBtb2RlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSHR0cFNlcnZlckNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IEh0dHBDb21wcmVzc2lvbkNvbmZpZ3VyYXRpb259IFtjb21wcmVzc2lvbl0gLSBCdWZmZXJlZCByZXNwb25zZSBjb21wcmVzc2lvbi4gRW5hYmxlZCB3aXRoIGRvY3VtZW50ZWQgZGVmYXVsdHMgd2hlbiBhYnNlbnQ7IGZhbHNlIG9yIHtlbmFibGVkOiBmYWxzZX0gZGlzYWJsZXMgaXQgZ2xvYmFsbHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvc3RdIC0gSG9zdG5hbWUgdG8gYmluZCB0aGUgSFRUUCBzZXJ2ZXIgdG8uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpblByb2Nlc3NdIC0gUnVuIEhUVFAgaGFuZGxlcnMgaW4gdGhlIG1haW4gdGhyZWFkIGluc3RlYWQgb2Ygd29ya2VyIHRocmVhZHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heEJ1ZmZlcmVkUmVzcG9uc2VCb2R5Qnl0ZXNdIC0gTWF4aW11bSBVVEYtOC9iaW5hcnkgYnl0ZSBsZW5ndGggYWNjZXB0ZWQgYnkgYnVmZmVyZWQgcmVzcG9uc2UgYm9kaWVzLiBVbmJvdW5kZWQgd2hlbiBhYnNlbnQ7IHN0cmVhbWVkIGZpbGUgcmVzcG9uc2VzIGFyZSB1bmFmZmVjdGVkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhSZXF1ZXN0Qm9keUJ5dGVzXSAtIE1heGltdW0gZGVjb2RlZCByZXF1ZXN0LWJvZHkgYnl0ZXMgYWNjZXB0ZWQgYmVmb3JlIHJvdXRpbmcuIFVuYm91bmRlZCB3aGVuIGFic2VudCwgZXhjZXB0IHRoZSBidWlsdC1pbiBNQ1AgZW5kcG9pbnQsIHdoaWNoIGRlZmF1bHRzIHRvIGEgMSBNaUIgY2FwIHRoYXQgdGhpcyBvcHRpb24gb3ZlcnJpZGVzLlxuICogQHByb3BlcnR5IHtIdHRwUmVxdWVzdEJvZHlQb2xpY3lSZXNvbHZlcn0gW3JlcXVlc3RCb2R5UG9saWN5UmVzb2x2ZXJdIC0gT3B0aW9uYWwgc3luY2hyb25vdXMgaGVhZGVyLXN0YWdlIHJlc29sdmVyIGZvciBwZXItcmVxdWVzdCBsaW1pdHMgYW5kIHJhdy1ib2R5IGhhbmRsaW5nLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhXb3JrZXJzXSAtIEJhY2t3YXJkLWNvbXBhdGlibGUgYWxpYXMgZm9yIHdvcmtlcnMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIC0gUG9ydCB0byBiaW5kIHRoZSBIVFRQIHNlcnZlciB0by5cbiAqIEBwcm9wZXJ0eSB7e21heFBlbmRpbmdCeXRlcz86IG51bWJlciwgbWF4UGVuZGluZ01lc3NhZ2VzPzogbnVtYmVyfX0gW3dlYnNvY2tldEluYm91bmRRdWV1ZV0gLSBQZXItc2Vzc2lvbiByZXRhaW5lZCBpbmJvdW5kIFdlYlNvY2tldCBtZXNzYWdlIGxpbWl0cy5cbiAqIEBwcm9wZXJ0eSB7e21heFBlbmRpbmdCeXRlcz86IG51bWJlciwgbWF4UGVuZGluZ0ZyYW1lcz86IG51bWJlcn19IFt3ZWJzb2NrZXRPdXRib3VuZFF1ZXVlXSAtIFBlci1jbGllbnQgcmV0YWluZWQgb3V0Ym91bmQgV2ViU29ja2V0IGZyYW1lIGxpbWl0cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbd29ya2Vyc10gLSBXb3JrZXIgaGFuZGxlcnMgdG8gc3RhcnQgZm9yIHRoZSBIVFRQIHNlcnZlci5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNjaGVkdWxlZEJhY2tncm91bmRKb2JFdmVyeU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgc3RyaW5nfSBbZmlyc3RJbl0gLSBEZWxheSBiZWZvcmUgdGhlIGZpcnN0IGVucXVldWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFthcmdzXSAtIEFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGpvYiB3aGVuIGVucXVldWVkLlxuICogQHByb3BlcnR5IHt0eXBlb2YgaW1wb3J0KFwiLi9iYWNrZ3JvdW5kLWpvYnMvam9iLmpzXCIpLmRlZmF1bHR9IGNsYXNzIC0gSm9iIGNsYXNzIHRvIGVucXVldWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Nyb25dIC0gQ3JvbnRhYiBleHByZXNzaW9uICg1LWZpZWxkIFBPU0lYLCBwbHVzIGBAaG91cmx5YC9gQGRhaWx5YC9gQHdlZWtseWAvYEBtb250aGx5YC9gQHllYXJseWAvYEBtaWRuaWdodGApLiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgZXZlcnlgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZW5hYmxlZF0gLSBXaGV0aGVyIHRoZSBzY2hlZHVsZSBpcyBlbmFibGVkLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBzdHJpbmcgfCBbbnVtYmVyIHwgc3RyaW5nLCBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iRXZlcnlPcHRpb25zXX0gW2V2ZXJ5XSAtIFJlcGVhdCBpbnRlcnZhbC4gRWl0aGVyIGBldmVyeWAgb3IgYGNyb25gIG11c3QgYmUgc2V0LlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2JhY2tncm91bmQtam9icy90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc30gW29wdGlvbnNdIC0gSm9iIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gVmVsb2Npb3VzUGFyYW1zXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi9mcm9udGVuZC1tb2RlbHMvcXVlcnkuanNcIikuRnJvbnRlbmRNb2RlbFRyYW5zcG9ydFZhbHVlPn0gQ2xpZW50RXJyb3JQYXlsb2FkUmVwb3J0ZXJQYXlsb2FkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFcnJvclJlcXVlc3REZXRhaWxzXG4gKiBAcHJvcGVydHkge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBbYm9keV0gLSBTYW5pdGl6ZWQgcGFyc2VkIHJlcXVlc3QgYm9keSwgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaHR0cE1ldGhvZCAtIFJlcXVlc3QgSFRUUCBtZXRob2QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIFJlcXVlc3QgcGF0aC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENsaWVudEVycm9yUGF5bG9hZENvbnRleHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250cm9sbGVyIC0gQ29udHJvbGxlciBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthY3Rpb25dIC0gQ29udHJvbGxlciBhY3Rpb24gb3IgZW5kcG9pbnQgbGFiZWwuXG4gKiBAcHJvcGVydHkge1wiaW5kZXhcIiB8IFwiZmluZFwiIHwgXCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIiB8IFwiYXR0YWNoXCIgfCBcImF0dGFjaG1lbnRMaXN0XCIgfCBcImRvd25sb2FkXCIgfCBcInVybFwiIHwgXCJjdXN0b20tY29tbWFuZFwifSBbY29tbWFuZFR5cGVdIC0gRnJvbnRlbmQtbW9kZWwgY29tbWFuZCB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb3JyZWxhdGlvbklkXSAtIFNlcnZlci1nZW5lcmF0ZWQgaWRlbnRpZmllciBzaGFyZWQgYnkgYW4gdW5leHBlY3RlZCBjbGllbnQgZXJyb3IgYW5kIGZyYW1ld29yayByZXBvcnRzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXhwZWN0ZWRFcnJvcl0gLSBXaGV0aGVyIHRoZSBlcnJvciBpcyBhbiBleHBlY3RlZCB1c2VyLWZsb3cgZmFpbHVyZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Zyb250ZW5kTW9kZWxFbmRwb2ludF0gLSBXaGV0aGVyIHRoZSBlcnJvciBjYW1lIGZyb20gdGhlIGZyb250ZW5kLW1vZGVsIGVuZHBvaW50LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFttb2RlbF0gLSBGcm9udGVuZC1tb2RlbCBuYW1lIGZyb20gdGhlIGZhaWxlZCByZXF1ZXN0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyZXF1ZXN0SWRdIC0gU2hhcmVkIGZyb250ZW5kLW1vZGVsIHJlcXVlc3QgaWQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KGFyZ3M6IHtcbiAqICAgY29udGV4dDogQ2xpZW50RXJyb3JQYXlsb2FkQ29udGV4dCxcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICByZXF1ZXN0OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkLFxuICogICByZXF1ZXN0RGV0YWlsczogRXJyb3JSZXF1ZXN0RGV0YWlscyB8IG51bGxcbiAqIH0pID0+IFByb21pc2U8Q2xpZW50RXJyb3JQYXlsb2FkUmVwb3J0ZXJQYXlsb2FkIHwgdm9pZD4gfCBDbGllbnRFcnJvclBheWxvYWRSZXBvcnRlclBheWxvYWQgfCB2b2lkfSBDbGllbnRFcnJvclBheWxvYWRSZXBvcnRlclR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIHtjb25maWd1cmF0aW9uPzogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGN1cnJlbnREZXZpY2U/OiB1bmtub3duLCBjdXJyZW50VXNlcj86IHVua25vd24sIG1vZGVsUmVnaXN0cnk/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHttb2RlbDogKG5hbWU6IHN0cmluZykgPT4gdW5rbm93bn0sIG5vdz86IERhdGUgfCAoKCkgPT4gRGF0ZSksIG9mZmxpbmVHcmFudD86IHVua25vd24sIHBhcmFtcz86IFZlbG9jaW91c1BhcmFtcywgcmVxdWVzdD86IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHQsIHJlc291cmNlUnVudGltZT86IFwiYmFja2VuZFwiIHwgXCJmcm9udGVuZFwiIHwgXCJvZmZsaW5lXCJ9fSBWZWxvY2lvdXNMb29zZU9iamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge25ldyAoYXJnczoge2F0dGFjaG1lbnROYW1lPzogc3RyaW5nLCBjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgbW9kZWxDbGFzcz86IHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBuYW1lPzogc3RyaW5nLCBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSkgPT4gb2JqZWN0fSBBdHRhY2htZW50RHJpdmVyQ29uc3RydWN0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNjaGVkdWxlZEJhY2tncm91bmRKb2JzQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iQ29uZmlndXJhdGlvbj59IGpvYnMgLSBTY2hlZHVsZWQgam9icyBrZXllZCBieSBuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhhcmdzOiB7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9KSA9PiBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0NvbmZpZ3VyYXRpb24gfCBQcm9taXNlPFNjaGVkdWxlZEJhY2tncm91bmRKb2JzQ29uZmlndXJhdGlvbj59IFNjaGVkdWxlZEJhY2tncm91bmRKb2JzTG9hZGVyVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXR0YWNobWVudERyaXZlckNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgbmFtZTogc3RyaW5nLCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59KSA9PiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFtjcmVhdGVdIC0gT3B0aW9uYWwgZmFjdG9yeSBmb3IgYSBjdXN0b20gYXR0YWNobWVudCBkcml2ZXIgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge0F0dGFjaG1lbnREcml2ZXJDb25zdHJ1Y3Rvcn0gW2RyaXZlckNsYXNzXSAtIE9wdGlvbmFsIGN1c3RvbSBhdHRhY2htZW50IGRyaXZlciBjbGFzcy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbaW5zdGFuY2VdIC0gT3B0aW9uYWwgY3VzdG9tIGF0dGFjaG1lbnQgZHJpdmVyIGluc3RhbmNlLlxuICovXG5cbi8qKlxuICogQ2xpZW50LXNhZmUgc3luY2hyb25pemF0aW9uIHBvbGljeSBkZWNsYXJlZCB3aXRoIGEgbW9kZWwgYXR0YWNobWVudC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF0dGFjaG1lbnRTeW5jQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtcImVhZ2VyXCIgfCBcIm9uLWRlbWFuZFwifSBmZXRjaCAtIFdoZXRoZXIgY2xpZW50cyBwcmVmZXRjaCB0aGUgYXR0YWNobWVudCBvciB3YWl0IHVudGlsIGl0IGlzIHJlcXVlc3RlZC5cbiAqIEBwcm9wZXJ0eSB7XCJvcHRpb25hbFwiIHwgXCJyZXF1aXJlZFwifSBvZmZsaW5lUmVxdWlyZW1lbnQgLSBXaGV0aGVyIGFuIG9mZmxpbmUtcmVhZHkgc2NvcGUgcmVxdWlyZXMgdGhlIGF0dGFjaG1lbnQgYnl0ZXMuXG4gKiBAcHJvcGVydHkge1wiZHVyYWJsZVwiIHwgXCJldmljdGFibGVcIn0gcmV0ZW50aW9uIC0gV2hldGhlciBjbGllbnRzIG1heSBldmljdCB0aGUgYXR0YWNobWVudCB1bmRlciBzdG9yYWdlIHByZXNzdXJlLlxuICovXG5cbi8qKlxuICogTW9kZWwgYXR0YWNobWVudCBkZWNsYXJhdGlvbiByZXRhaW5lZCBieSB0aGUgcmVjb3JkIGNsYXNzLlxuICogQHR5cGVkZWYge29iamVjdH0gUmVjb3JkQXR0YWNobWVudENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgQXR0YWNobWVudERyaXZlckNvbnN0cnVjdG9yIHwgUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbZHJpdmVyXSAtIEF0dGFjaG1lbnQgZHJpdmVyIG5hbWUsIGNsYXNzLCBvciBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7QXR0YWNobWVudFN5bmNDb25maWd1cmF0aW9ufSBbc3luY10gLSBDbGllbnQtc2FmZSBzeW5jaHJvbml6ZWQgYXNzZXQgcG9saWN5LlxuICogQHByb3BlcnR5IHtcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9IHR5cGUgLSBBdHRhY2htZW50IGNhcmRpbmFsaXR5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXR0YWNobWVudHNDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RlZmF1bHREcml2ZXJdIC0gRGVmYXVsdCBhdHRhY2htZW50IHN0b3JhZ2UgZHJpdmVyIG5hbWUuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIEF0dGFjaG1lbnREcml2ZXJDb25maWd1cmF0aW9uICYgUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gW2RyaXZlcnNdIC0gTmFtZWQgYXR0YWNobWVudCBkcml2ZXIgY29uZmlndXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthbGxvd1BhdGhJbnB1dF0gLSBXaGV0aGVyIGB7cGF0aDogLi4ufWAgYXR0YWNobWVudCBpbnB1dCBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2FsbG93ZWRQYXRoUHJlZml4ZXNdIC0gT3B0aW9uYWwgYWxsb3dsaXN0IG9mIGRpcmVjdG9yaWVzIGZvciBge3BhdGg6IC4uLn1gIGlucHV0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWFpbGVyQmFja2VuZFxuICogQHByb3BlcnR5IHsoYXJnczoge3BheWxvYWQ6IGltcG9ydChcIi4vbWFpbGVyLmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZCwgY29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9KSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiB8IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBkZWxpdmVyIC0gRGVsaXZlciBhIG1haWxlciBwYXlsb2FkLlxuICogQHByb3BlcnR5IHsoKSA9PiBpbXBvcnQoXCIuL21haWxlci5qc1wiKS5NYWlsZXJEZWxpdmVyeUlkZW1wb3RlbmN5Q2FwYWJpbGl0eX0gW2RlbGl2ZXJ5SWRlbXBvdGVuY3lDYXBhYmlsaXR5XSAtIEV4cGxpY2l0IHByb3ZpZGVyLWJhY2tlZCBkdXBsaWNhdGUtc3VwcHJlc3Npb24gY2FwYWJpbGl0eS4gR2VuZXJpYyBTTVRQIG9taXRzIHRoaXMgYW5kIHJlbWFpbnMgYXQtbGVhc3Qtb25jZS5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHtwYXlsb2FkOiBpbXBvcnQoXCIuL21haWxlci5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWR9KSA9PiBpbXBvcnQoXCIuL21haWxlci5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWR9IFtwcmVwYXJlRGVsaXZlcnlPcGVyYXRpb25QYXlsb2FkXSAtIFJlc29sdmVzIHByb3ZpZGVyIGRlZmF1bHRzIGludG8gdGhlIGltbXV0YWJsZSBwYXlsb2FkIGJlZm9yZSByZXF1aXJlZC1vcGVyYXRpb24gaGFzaGluZyBhbmQgZW5xdWV1ZS5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHtkZWxpdmVyeU9wZXJhdGlvbjogaW1wb3J0KFwiLi9tYWlsZXIuanNcIikuTWFpbGVyRGVsaXZlcnlPcGVyYXRpb25SZXF1ZXN0IHwgaW1wb3J0KFwiLi9tYWlsZXIuanNcIikuTWFpbGVyRGVsaXZlcnlPcGVyYXRpb24sIHBheWxvYWQ6IGltcG9ydChcIi4vbWFpbGVyLmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZH0pID0+IHZvaWR9IFt2YWxpZGF0ZURlbGl2ZXJ5T3BlcmF0aW9uXSAtIFByb3ZpZGVyLXNwZWNpZmljIG9wZXJhdGlvbiBhbmQgcGF5bG9hZCB2YWxpZGF0aW9uIHBlcmZvcm1lZCBiZWZvcmUgZW5xdWV1ZSBhbmQgZXZlcnkgbmV0d29yayBhdHRlbXB0LlxuICovXG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBMb2NhbGVGYWxsYmFja3NUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsUmVsYXRpb25zaGlwQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtcImJlbG9uZ3NUb1wiIHwgXCJoYXNPbmVcIiB8IFwiaGFzTWFueVwifSB0eXBlIC0gUmVsYXRpb25zaGlwIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21vZGVsXSAtIFRhcmdldCBtb2RlbCBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjbGFzc05hbWVdIC0gQWxpYXMgb2YgdGFyZ2V0IG1vZGVsIGNsYXNzIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21vZGVsQ2xhc3NOYW1lXSAtIEV4cGxpY2l0IHRhcmdldCBtb2RlbCBjbGFzcyBuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdHlwZV0gLSBDb2x1bW4gdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2x1bW5UeXBlXSAtIEFsaWFzIGZvciBjb2x1bW4gdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzcWxUeXBlXSAtIEFsaWFzIGZvciBjb2x1bW4gdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkYXRhVHlwZV0gLSBBbGlhcyBmb3IgY29sdW1uIHR5cGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbanNEb2NUeXBlXSAtIEV4YWN0IGdlbmVyYXRlZCBKU0RvYyB0eXBlIGZvciBub24tY29sdW1uIGF0dHJpYnV0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gQXR0cmlidXRlIG5hbWUgd2hlbiBjb25maWd1cmVkIGFzIGFuIGFycmF5IGVudHJ5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbnVsbF0gLSBXaGV0aGVyIHZhbHVlIGNhbiBiZSBudWxsLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2VsZWN0ZWRCeURlZmF1bHRdIC0gV2hldGhlciBpbmNsdWRlZCBpbiBkZWZhdWx0IHNlcmlhbGl6YXRpb24uIERlZmF1bHRzIHRvIHRydWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsQXR0YWNobWVudENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7QXR0YWNobWVudFN5bmNDb25maWd1cmF0aW9ufSBbc3luY10gLSBDbGllbnQtc2lkZSBzeW5jaHJvbml6ZWQgYXNzZXQgcG9saWN5LlxuICogQHByb3BlcnR5IHtcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9IHR5cGUgLSBBdHRhY2htZW50IGNhcmRpbmFsaXR5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtBcnJheTxzdHJpbmcgfCBGcm9udGVuZE1vZGVsQXR0cmlidXRlQ29uZmlndXJhdGlvbj4gfCBSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsQXR0cmlidXRlQ29uZmlndXJhdGlvbiB8IGltcG9ydChcIi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLWNvbHVtbi5qc1wiKS5kZWZhdWx0IHwgYm9vbGVhbj59IGF0dHJpYnV0ZXMgLSBBdHRyaWJ1dGVzIHRvIGV4cG9zZSBvbiB0aGUgZnJvbnRlbmQgbW9kZWwuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbYWJpbGl0aWVzXSAtIEFkZGl0aW9uYWwgY2FtZWxDYXNlIGFiaWxpdHkgYWN0aW9uIG5hbWVzIHRvIGV4cG9zZSBmb3IgcGVyLXJlY29yZCBgcmVjb3JkLmNhbihhY3Rpb24pYCByZWFkcy4gQmFzZSBDUlVEIGFjdGlvbnMgKGByZWFkYCwgYGNyZWF0ZWAsIGB1cGRhdGVgLCBgZGVzdHJveWApIGFyZSBhbHdheXMgaW5jbHVkZWQgYW5kIG11c3Qgbm90IGJlIGxpc3RlZCBoZXJlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsQXR0YWNobWVudENvbmZpZ3VyYXRpb24+fSBbYXR0YWNobWVudHNdIC0gQXR0YWNobWVudCBoZWxwZXJzIGtleWVkIGJ5IGF0dGFjaG1lbnQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtjb21tYW5kc10gLSBMZWdhY3kgYnVpbHQtaW4gY29tbWFuZCBuYW1lcyAoYGluZGV4YCwgYGZpbmRgLCBgY3JlYXRlYCwgYHVwZGF0ZWAsIGBkZXN0cm95YCwgYGF0dGFjaGAsIGBkb3dubG9hZGAsIGB1cmxgKS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8RnJvbnRlbmRNb2RlbFJlc291cmNlQ3VzdG9tQ29tbWFuZD59IFtjb2xsZWN0aW9uQ29tbWFuZHNdIC0gQ3VzdG9tIGNvbGxlY3Rpb24gY29tbWFuZHMuIEVhY2ggZW50cnkgaXMgYSBjYW1lbENhc2UgbWV0aG9kIG5hbWUsIG9yIGEgYHtuYW1lLCBhcmdzPywgcmV0dXJuVHlwZT99YCBvYmplY3QgZGVjbGFyaW5nIHR5cGVkIGFyZ3VtZW50cyBhbmQvb3IgYSByZXNwb25zZSB0eXBlLiBUaGUgcnVudGltZSBkZXJpdmVzIHRoZSBrZWJhYi1jYXNlIGNvbW1hbmQgc2x1ZyBmcm9tIHRoZSBuYW1lLlxuICogQHByb3BlcnR5IHtBcnJheTxGcm9udGVuZE1vZGVsUmVzb3VyY2VDdXN0b21Db21tYW5kPn0gW21lbWJlckNvbW1hbmRzXSAtIEN1c3RvbSBtZW1iZXIgY29tbWFuZHMuIEVhY2ggZW50cnkgaXMgYSBjYW1lbENhc2UgbWV0aG9kIG5hbWUsIG9yIGEgYHtuYW1lLCBhcmdzPywgcmV0dXJuVHlwZT99YCBvYmplY3QgZGVjbGFyaW5nIHR5cGVkIGFyZ3VtZW50cyBhbmQvb3IgYSByZXNwb25zZSB0eXBlLiBUaGUgcnVudGltZSBkZXJpdmVzIHRoZSBrZWJhYi1jYXNlIGNvbW1hbmQgc2x1ZyBmcm9tIHRoZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2J1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNdIC0gQnVpbHQtaW4gY29sbGVjdGlvbiBjb21tYW5kIG5hbWVzIChgaW5kZXhgLCBgY3JlYXRlYCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbYnVpbHRJbk1lbWJlckNvbW1hbmRzXSAtIEJ1aWx0LWluIG1lbWJlciBjb21tYW5kIG5hbWVzIChgZmluZGAsIGB1cGRhdGVgLCBgZGVzdHJveWAsIGBhdHRhY2hgLCBgZG93bmxvYWRgLCBgdXJsYCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21vZGVsTmFtZV0gLSBGcm9udGVuZCBtb2RlbCBuYW1lIG92ZXJyaWRlLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3JlbGF0aW9uc2hpcHNdIC0gUmVsYXRpb25zaGlwIG5hbWVzIHRvIGV4cG9zZSBpbiBmcm9udGVuZCBtb2RlbHMuIFR5cGUgYW5kIHRhcmdldCBtb2RlbCBhcmUgaW5mZXJyZWQgZnJvbSB0aGUgYmFja2VuZCBtb2RlbCdzIHJlZ2lzdGVyZWQgcmVsYXRpb25zaGlwcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgc3RyaW5nW119IFtwcmltYXJ5S2V5XSAtIFByaW1hcnkga2V5IGF0dHJpYnV0ZSBuYW1lIG9yIG9yZGVyZWQgY29tcG9zaXRlIHByaW1hcnkta2V5IGF0dHJpYnV0ZSBuYW1lcy5cbiAqIEBwcm9wZXJ0eSB7RnJvbnRlbmRNb2RlbFJlc291cmNlU2VydmVyQ29uZmlndXJhdGlvbn0gW3NlcnZlcl0gLSBPcHRpb25hbCBsZWdhY3kgYmFja2VuZCBiZWhhdmlvciBvdmVycmlkZXMgZm9yIGJ1aWx0LWluIGZyb250ZW5kIGFjdGlvbnMuXG4gKiBAcHJvcGVydHkge0Zyb250ZW5kTW9kZWxSZXNvdXJjZVN5bmNDb25maWd1cmF0aW9uIHwgYm9vbGVhbn0gW3N5bmNdIC0gT3B0aW9uYWwgc2FmZSBsb2NhbC9vZmZsaW5lIHN5bmMgcG9saWN5IG1ldGFkYXRhLiBgcG9saWN5YCBwYXJ0aWNpcGF0ZXMgaW4gdGhlIGhhc2ggYnV0IGlzIG5vdCBleHBvc2VkIHRvIGdlbmVyYXRlZCBmcm9udGVuZCBjb25maWcvbWFuaWZlc3QuXG4gKi9cblxuLyoqXG4gKiBPYmplY3QgZm9ybSBvZiBhIGN1c3RvbSBjb21tYW5kIGVudHJ5LCBkZWNsYXJpbmcgaXRzIHR5cGVkIGFyZ3VtZW50cyBhbmQvb3JcbiAqIHJlc3BvbnNlIHR5cGUgYWxvbmdzaWRlIHRoZSBjb21tYW5kIG5hbWUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsUmVzb3VyY2VDdXN0b21Db21tYW5kT2JqZWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIGNhbWVsQ2FzZSBjb21tYW5kIG1ldGhvZCBuYW1lLlxuICogQHByb3BlcnR5IHtBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9Pn0gW2FyZ3NdIC0gVHlwZWQgY29tbWFuZCBhcmd1bWVudHM7IGVhY2ggZ2VuZXJhdGVzIGEgbmFtZWQsIHR5cGVkIG1ldGhvZCBwYXJhbWV0ZXIgbWFwcGVkIHBvc2l0aW9uYWxseSBpbnRvIHRoZSBjb21tYW5kIHBheWxvYWQuIGB0eXBlYCBpcyBhIEpTRG9jIHR5cGUgc3RyaW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyZXR1cm5UeXBlXSAtIEpTRG9jIHR5cGUgZm9yIHRoZSBjb21tYW5kIHJlc3BvbnNlLiBXaGVuIHNldCwgdGhlIGdlbmVyYXRlZCBtZXRob2QgaXMgdHlwZWQgYFByb21pc2U8cmV0dXJuVHlwZT5gIGluc3RlYWQgb2YgYFByb21pc2U8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+PmAuIEVtaXR0ZWQgdmVyYmF0aW0gaW50byB0aGUgZ2VuZXJhdGVkIGZyb250ZW5kIG1vZGVsLCBzbyBpdCBtdXN0IHJlc29sdmUgdGhlcmUuXG4gKi9cblxuLyoqXG4gKiBBIGN1c3RvbSBjb21tYW5kIGVudHJ5OiBhIHBsYWluIGNhbWVsQ2FzZSBtZXRob2QgbmFtZSwgb3IgYW4gb2JqZWN0IGRlY2xhcmluZ1xuICogdHlwZWQgYXJncyBhbmQvb3IgYSByZXNwb25zZSB0eXBlLlxuICogQHR5cGVkZWYge3N0cmluZyB8IEZyb250ZW5kTW9kZWxSZXNvdXJjZUN1c3RvbUNvbW1hbmRPYmplY3R9IEZyb250ZW5kTW9kZWxSZXNvdXJjZUN1c3RvbUNvbW1hbmRcbiAqL1xuXG4vKipcbiAqIEpTT04gdmFsdWUgYWNjZXB0ZWQgYnkgc3luYyBwb2xpY3kgbWV0YWRhdGEvaGFzaCBpbnB1dHMuXG4gKiBAdHlwZWRlZiB7bnVsbCB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmtub3duW10gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWVcbiAqL1xuXG4vKipcbiAqIEZyb250ZW5kLW1vZGVsIGxvY2FsL29mZmxpbmUgc3luYyBwb2xpY3kgY29uZmlnLiBgbWV0YWRhdGFgIGlzIGV4cG9zZWQgdG9cbiAqIGZyb250ZW5kcyBhbmQgcGVlcnM7IGBwb2xpY3lgIGlzIGhhc2hlZCBidXQgaW50ZW50aW9uYWxseSBvbWl0dGVkIGZyb21cbiAqIGZyb250ZW5kLXNhZmUgbWFuaWZlc3RzLlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbFJlc291cmNlU3luY0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJvcHRpbWlzdGljVmVyc2lvblwiIHwgXCJzZXJ2ZXJXaW5zXCIgfCBcImxhc3RXcml0ZXJXaW5zXCIgfCBcImZpZWxkVGhyZWVXYXlcIiB8IFwiYXBwZW5kT25seVwifSBbY29uZmxpY3RTdHJhdGVneV0gLSBTdHJhdGVneSB1c2VkIHdoZW4gcmVwbGF5IGRldGVjdHMgc2VydmVyL2NsaWVudCBkaXZlcmdlbmNlLiBEZWZhdWx0cyB0byBgb3B0aW1pc3RpY1ZlcnNpb25gLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZW5hYmxlZF0gLSBXaGV0aGVyIHRoZSByZXNvdXJjZSBpcyBzeW5jLWVuYWJsZWQuIERlZmF1bHRzIHRvIHRydWUgd2hlbiBgc3luY2AgaXMgY29uZmlndXJlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtvcGVyYXRpb25zXSAtIFN5bmMgb3BlcmF0aW9uIG5hbWVzIHN1Y2ggYXMgYGluZGV4YCwgYGZpbmRgLCBgY3JlYXRlYCwgYHVwZGF0ZWAsIGN1c3RvbSBkb21haW4gY29tbWFuZHMsIGV0Yy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVtYmVyfSBbcG9saWN5VmVyc2lvbl0gLSBBcHAtY29udHJvbGxlZCBwb2xpY3kgdmVyc2lvbiB1c2VkIGFzIGEgc3RhYmxlIGNoYW5nZSBzaWduYWwuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIEZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gW21ldGFkYXRhXSAtIFNhZmUgZnJvbnRlbmQtdmlzaWJsZSBtZXRhZGF0YS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSBbcG9saWN5XSAtIERldGVybWluaXN0aWMgbm9uLXNlY3JldCBwb2xpY3kgaW5wdXRzIGluY2x1ZGVkIGluIHRoZSBwb2xpY3kgaGFzaCBvbmx5LlxuICovXG5cbi8qKlxuICogVmVsb2Npb3VzIHN5bmMgQVBJIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24uXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWZWxvY2lvdXNTeW5jQXBpQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFttb3VudFBhdGhdIC0gTW91bnQgcGF0aCBmb3IgdGhlIHN5bmMgZW5kcG9pbnRzLiBEZWZhdWx0cyB0byBcIi92ZWxvY2lvdXMvc3luY1wiLlxuICogQHByb3BlcnR5IHtGcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IHJlc291cmNlQ2xhc3MgLSBBcHAgc3luYyByZXNvdXJjZSBjbGFzcyBzZXJ2ZWQgYnkgdGhlIGF1dG8tbW91bnRlZCBzeW5jIGVuZHBvaW50cy5cbiAqL1xuXG4vKipcbiAqIENsaWVudC1zaWRlIHN5bmMgdHJhbnNwb3J0IG93bmluZyBIVFRQIFBPU1RzIHRvIHRoZSBmcmFtZXdvcmsgc3luYyBlbmRwb2ludHMsXG4gKiBtYXRjaGluZyB0aGUgZnJvbnRlbmQtbW9kZWwgd2Vic29ja2V0IGNsaWVudCBwb3N0IGNvbnRyYWN0LlxuICogQHR5cGVkZWYge29iamVjdH0gVmVsb2Npb3VzU3luY0NsaWVudFRyYW5zcG9ydFxuICogQHByb3BlcnR5IHsocGF0aDogc3RyaW5nLCBib2R5PzogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIG9wdGlvbnM/OiB7aGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHNpZ25hbD86IEFib3J0U2lnbmFsfSkgPT4gUHJvbWlzZTx7anNvbjogKCkgPT4gUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59Pn0gcG9zdCAtIFBvc3RzIG9uZSByZXF1ZXN0IGFuZCByZXNvbHZlcyBhIHJlc3BvbnNlIHdpdGggYSBqc29uIGFjY2Vzc29yLlxuICovXG5cbi8qKlxuICogV2Vic29ja2V0IGNsaWVudCBjb250cmFjdCByZXF1aXJlZCBmcm9tIGBzeW5jLmNsaWVudC5yZWFsdGltZS5jcmVhdGVDbGllbnRgLFxuICogbWF0Y2hpbmcgYFZlbG9jaW91c1dlYnNvY2tldENsaWVudGAgLyBzbmFwcmVxJ3Mgd2Vic29ja2V0IGNsaWVudC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZlbG9jaW91c1N5bmNSZWFsdGltZVdlYnNvY2tldENsaWVudFxuICogQHByb3BlcnR5IHsob3B0aW9ucz86IHtzaWduYWw/OiBBYm9ydFNpZ25hbH0pID0+IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBjb25uZWN0IC0gQ29ubmVjdHMgdGhlIHdlYnNvY2tldC5cbiAqIEBwcm9wZXJ0eSB7KGNoYW5uZWxUeXBlOiBzdHJpbmcsIG9wdGlvbnM/OiB7cGFyYW1zPzogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBvbk1lc3NhZ2U/OiAoYm9keTogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+IHZvaWQsIG9uUmVzdW1lPzogKCkgPT4gdm9pZCwgb25DbG9zZT86IChyZWFzb246IHN0cmluZykgPT4gdm9pZH0pID0+IFZlbG9jaW91c1N5bmNSZWFsdGltZVN1YnNjcmlwdGlvbn0gc3Vic2NyaWJlQ2hhbm5lbCAtIE9wZW5zIG9uZSBjaGFubmVsIHN1YnNjcmlwdGlvbi5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gZGlzY29ubmVjdEFuZFN0b3BSZWNvbm5lY3QgLSBDbG9zZXMgdGhlIHNvY2tldCBhbmQgc3RvcHMgYXV0by1yZWNvbm5lY3QuXG4gKi9cblxuLyoqXG4gKiBDaGFubmVsIHN1YnNjcmlwdGlvbiBoYW5kbGUgcmV0dXJuZWQgYnkgYHN1YnNjcmliZUNoYW5uZWxgLlxuICogQHR5cGVkZWYge29iamVjdH0gVmVsb2Npb3VzU3luY1JlYWx0aW1lU3Vic2NyaXB0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsb3NlIC0gQ2xvc2VzIHRoZSBzdWJzY3JpcHRpb24uXG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IGlzUmVhZHkgLSBXaGV0aGVyIHRoZSBzdWJzY3JpcHRpb24gaXMgYWNrbm93bGVkZ2VkIGFuZCByZWFkeS5cbiAqIEBwcm9wZXJ0eSB7KHBhcmFtcz86IHtzaWduYWw/OiBBYm9ydFNpZ25hbCwgdGltZW91dE1zPzogbnVtYmVyfSkgPT4gUHJvbWlzZTx2b2lkPn0gd2FpdEZvclJlYWR5IC0gUmVzb2x2ZXMgb25jZSB0aGUgc2VydmVyIGFja25vd2xlZGdlcyB0aGUgc3Vic2NyaXB0aW9uLlxuICovXG5cbi8qKlxuICogT25lIHJlYWx0aW1lIGNoYW5uZWwgc3Vic2NyaXB0aW9uIGRlc2NyaXB0b3IuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWZWxvY2lvdXNTeW5jUmVhbHRpbWVDaGFubmVsRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNoYW5uZWwgLSBTZXJ2ZXIgY2hhbm5lbCBuYW1lIHRvIHN1YnNjcmliZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbcGFyYW1zXSAtIFN1YnNjcmliZSBwYXJhbXMgKHJ1bnRpbWUgc2NvcGUgdmFsdWVzKS4gVGhlIGZyYW1ld29yayBpbmplY3RzIGBhdXRoZW50aWNhdGlvblRva2VuYCBhdXRvbWF0aWNhbGx5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyZXNvdXJjZVR5cGVdIC0gRGVmYXVsdCByZXNvdXJjZS9tb2RlbCBuYW1lIGZvciBwdXNoZWQgY2hhbmdlcyB0aGF0IGRvIG5vdCBjYXJyeSB0aGVpciBvd24gcmVzb3VyY2VUeXBlLlxuICovXG5cbi8qKlxuICogUmVhbHRpbWUgcHVzaCBjb25maWd1cmF0aW9uIGZvciB0aGUgc3luYyBjbGllbnQuIE9ubHkgdGhlIGdlbnVpbmVseVxuICogYXBwLW93bmVkIGNhbGxiYWNrIGxpdmVzIGhlcmU6IGhvdyB0byBidWlsZCB0aGUgd2Vic29ja2V0IGNsaWVudC5cbiAqIEV2ZXJ5dGhpbmcgZWxzZSAtIGRlcml2aW5nIHRoZSBmcmFtZXdvcmsgc3luYyBjaGFubmVsIHN1YnNjcmlwdGlvbnMgZnJvbVxuICogdGhlIGRlY2xhcmVkIHB1bGwgc2NvcGVzLCBzdWJzY3JpYmluZywgYXBwbHlpbmcgcHVzaGVzIHRocm91Z2ggdGhlIGRlcml2ZWRcbiAqIHJlc291cmNlIGFwcGxpZXIsIGVjaG8gc3VwcHJlc3Npb24sIGFuZCBwdWxsLW9uLXJlY29ubmVjdCAtIGlzIGRlcml2ZWQuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWZWxvY2lvdXNTeW5jQ2xpZW50UmVhbHRpbWVDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFZlbG9jaW91c1N5bmNSZWFsdGltZVdlYnNvY2tldENsaWVudCB8IFByb21pc2U8VmVsb2Npb3VzU3luY1JlYWx0aW1lV2Vic29ja2V0Q2xpZW50Pn0gY3JlYXRlQ2xpZW50IC0gQnVpbGRzIHRoZSAodW5jb25uZWN0ZWQpIHdlYnNvY2tldCBjbGllbnQ7IHRoZSBmcmFtZXdvcmsgb3ducyBjb25uZWN0L2Rpc2Nvbm5lY3QuXG4gKiBAcHJvcGVydHkgeyhjb250ZXh0OiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPikgPT4gQXJyYXk8VmVsb2Npb3VzU3luY1JlYWx0aW1lQ2hhbm5lbERlc2NyaXB0b3I+IHwgUHJvbWlzZTxBcnJheTxWZWxvY2lvdXNTeW5jUmVhbHRpbWVDaGFubmVsRGVzY3JpcHRvcj4+fSBbY2hhbm5lbHNdIC0gRGVwcmVjYXRlZCBsZWdhY3kgZXNjYXBlIGhhdGNoOiByZXNvbHZlcyBleHRyYSBhcHAtY2hhbm5lbCBkZXNjcmlwdG9ycyBmcm9tIHRoZSBgc3Vic2NyaWJlUmVhbHRpbWUoY29udGV4dClgIGNvbnRleHQuIERlY2xhcmVkIHB1bGwgc2NvcGVzIHN1YnNjcmliZSB0aGUgZnJhbWV3b3JrIHN5bmMgY2hhbm5lbCBhdXRvbWF0aWNhbGx5LlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz59IFtsb2NhbE9yaWdpbl0gLSBSZXNvbHZlcyB0aGlzIGRldmljZSdzIGVjaG8gb3JpZ2luOyBwdXNoZWQgbWVzc2FnZXMgd2l0aCBhIG1hdGNoaW5nIGBlY2hvT3JpZ2luYCBhcmUgZHJvcHBlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3B1bGxPblJlY29ubmVjdF0gLSBGaXJlIGEgY29hbGVzY2VkIGBwdWxsKClgIHdoZW4gc3Vic2NyaXB0aW9ucyBiZWNvbWUgcmVhZHkgb3IgcmVzdW1lIGFmdGVyIGEgZHJvcCwgY2xvc2luZyBvZmZsaW5lIGdhcHMuIERlZmF1bHRzIHRvIHRydWUuXG4gKi9cblxuLyoqXG4gKiBDbGllbnQtc2lkZSBzeW5jIGNvbmZpZ3VyYXRpb24gY29uc3VtZWQgYnkgYFN5bmNDbGllbnQuZnJvbUNvbmZpZ3VyYXRpb24oLi4uKWAuXG4gKiBUaGUgZnJhbWV3b3JrIG93bnMgdGhlIGAke21vdW50UGF0aH0vY2hhbmdlc2AgYW5kIGAke21vdW50UGF0aH0vcmVwbGF5YFxuICogUE9TVGVycyBvdmVyIHRoZSBnaXZlbiB0cmFuc3BvcnQuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWZWxvY2lvdXNTeW5jQ2xpZW50Q29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz59IGF1dGhlbnRpY2F0aW9uVG9rZW4gLSBSZXNvbHZlcyB0aGUgYXV0aCB0b2tlbiBzZW50IHdpdGggc3luYyByZXF1ZXN0cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbYmF0Y2hTaXplXSAtIE1heCBzeW5jcyBwZXIgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj59IFtpc09ubGluZV0gLSBDb25uZWN0aXZpdHkgZ2F0ZSBmb3IgcHVsbHMgYW5kIHJlcGxheXMuIERlZmF1bHRzIHRvIGFsd2F5cyBvbmxpbmUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21vdW50UGF0aF0gLSBNb3VudCBwYXRoIHRoZSBzZXJ2ZXIgc2VydmVzIHRoZSBzeW5jIGVuZHBvaW50cyB1bmRlciAobWF0Y2ggdGhlIHNlcnZlcidzIGBzeW5jLmFwaS5tb3VudFBhdGhgKS4gRGVmYXVsdHMgdG8gXCIvdmVsb2Npb3VzL3N5bmNcIjsgbm9ybWFsaXphdGlvbiBzdHJpcHMgdHJhaWxpbmcgc2xhc2hlcyBhbmQgYWx3YXlzIGZpbGxzIGluIHRoZSBkZWZhdWx0LlxuICogQHByb3BlcnR5IHsoZXJyb3I6IEVycm9yKSA9PiB2b2lkfSBbb25FcnJvcl0gLSBSZXBvcnRzIGJhY2tncm91bmQgcmVwbGF5L3B1bGwgZmFpbHVyZXMuIERlZmF1bHRzIHRvIHJldGhyb3dpbmcuXG4gKiBAcHJvcGVydHkge1ZlbG9jaW91c1N5bmNDbGllbnRSZWFsdGltZUNvbmZpZ3VyYXRpb259IFtyZWFsdGltZV0gLSBSZWFsdGltZSBwdXNoIGNvbmZpZ3VyYXRpb24gY29uc3VtZWQgYnkgYHN1YnNjcmliZVJlYWx0aW1lKC4uLilgLlxuICogQHByb3BlcnR5IHtWZWxvY2lvdXNTeW5jQ2xpZW50VHJhbnNwb3J0fSB0cmFuc3BvcnQgLSBUcmFuc3BvcnQgcG9zdGluZyB0byB0aGUgZnJhbWV3b3JrIHN5bmMgZW5kcG9pbnRzIChlLmcuIHRoZSBmcm9udGVuZC1tb2RlbCB3ZWJzb2NrZXQgY2xpZW50KS5cbiAqIEBwcm9wZXJ0eSB7VmVsb2Npb3VzU3luY1JlYWx0aW1lV2Vic29ja2V0Q2xpZW50fSBbd2Vic29ja2V0Q2xpZW50XSAtIFNoYXJlZCBhcHAtbGlmZXRpbWUgd2Vic29ja2V0IGNsaWVudCAodGhlIGxvdy1sZXZlbCBmb3JtKSB0aGF0IGFsbCBzeW5jIHRyYWZmaWMgcmlkZXMuIFByb3ZpZGUgdGhlIHNhbWUgaW5zdGFuY2UgdGhlIGZyb250ZW5kLW1vZGVsIHRyYW5zcG9ydCB1c2VzIHNvIG9uZSBjb25uZWN0aW9uIGNhcnJpZXMgZXZlcnl0aGluZy4gV2hlbiBzZXQsIHRoZSByZWFsdGltZSBicmlkZ2Ugc3Vic2NyaWJlcyBjaGFubmVscyBvbiBpdCBhbmQgbmV2ZXIgb3ducyBpdHMgbGlmZWN5Y2xlOiB1bnN1YnNjcmliaW5nIGNsb3NlcyBvbmx5IGNoYW5uZWwgc3Vic2NyaXB0aW9ucywgbGVhdmluZyB0aGUgc29ja2V0IGNvbm5lY3RlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgKCgpID0+IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpfSBbd2Vic29ja2V0VXJsXSAtIFNoYXJlZCBhcHAtbGlmZXRpbWUgd2Vic29ja2V0IFVSTC4gV2hlbiBzZXQgKGFuZCBubyBgd2Vic29ja2V0Q2xpZW50YCBpcyBnaXZlbiksIHRoZSBmcmFtZXdvcmsgYnVpbGRzIGFuZCBvd25zIG9uZSByZWNvbm5lY3RpbmcgYFZlbG9jaW91c1dlYnNvY2tldENsaWVudGAgZm9yIGFsbCBzeW5jIHRyYWZmaWMsIGNvbm5lY3RlZCBvbiBmaXJzdCB1c2UuXG4gKi9cblxuLyoqXG4gKiBWZWxvY2lvdXMgc3luYyBjb25maWd1cmF0aW9uLlxuICogQHR5cGVkZWYge29iamVjdH0gVmVsb2Npb3VzU3luY0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7VmVsb2Npb3VzU3luY0FwaUNvbmZpZ3VyYXRpb259IFthcGldIC0gQXV0by1tb3VudHMgdGhlIFZlbG9jaW91cyBzeW5jIGNoYW5nZXMvcmVwbGF5IGVuZHBvaW50cyBmb3IgdGhpcyByZXNvdXJjZSBjbGFzcy5cbiAqIEBwcm9wZXJ0eSB7VmVsb2Npb3VzU3luY0NsaWVudENvbmZpZ3VyYXRpb259IFtjbGllbnRdIC0gQ2xpZW50LXNpZGUgc3luYyBjb25maWd1cmF0aW9uIGNvbnN1bWVkIGJ5IGBTeW5jQ2xpZW50LmZyb21Db25maWd1cmF0aW9uKC4uLilgLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3N5bmMvZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNKc29uV2ViS2V5IHwgbnVsbH0gW2RldmljZUNlcnRpZmljYXRlQmFja2VuZFB1YmxpY0tleV0gLSBQdWJsaWMgYmFja2VuZCBrZXkgdXNlZCB0byB2ZXJpZnkgb2ZmbGluZSBkZXZpY2UgY2VydGlmaWNhdGVzIGZvciBzeW5jIHJlcGxheS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY2hhbmdlRmVlZFJldGVudGlvblNpemVdIC0gTnVtYmVyIG9mIGFjY2VwdGVkIHNlcnZlciBjaGFuZ2VzIHJldGFpbmVkIGJlZm9yZSBjbGllbnRzIG11c3QgcmVmcmVzaCBmcm9tIHNuYXBzaG90LlxuICogQHByb3BlcnR5IHtBcnJheTxpbXBvcnQoXCIuL3N5bmMvb2ZmbGluZS1ncmFudC5qc1wiKS5PZmZsaW5lR3JhbnRTaWduaW5nS2V5Pn0gb2ZmbGluZUdyYW50U2lnbmluZ0tleXMgLSBTaWduaW5nIGtleXMgdXNlZCB0byBpc3N1ZSBhbmQgdmVyaWZ5IG9mZmxpbmUgZ3JhbnRzLiBTZWNyZXRzIG11c3QgbmV2ZXIgYmUgZXhwb3NlZCB0byBjbGllbnRzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtvZmZsaW5lR3JhbnRUdGxNc10gLSBEZWZhdWx0IG9mZmxpbmUgZ3JhbnQgVFRMIGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gMjQgaG91cnMuXG4gKi9cblxuLyoqXG4gKiBGcm9udGVuZC1zYWZlIG5vcm1hbGl6ZWQgc3luYyBtZXRhZGF0YS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VTeW5jQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtcIm9wdGltaXN0aWNWZXJzaW9uXCIgfCBcInNlcnZlcldpbnNcIiB8IFwibGFzdFdyaXRlcldpbnNcIiB8IFwiZmllbGRUaHJlZVdheVwiIHwgXCJhcHBlbmRPbmx5XCJ9IGNvbmZsaWN0U3RyYXRlZ3kgLSBOb3JtYWxpemVkIHJlcGxheSBjb25mbGljdCBzdHJhdGVneS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIHJlc291cmNlIGlzIHN5bmMtZW5hYmxlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IG9wZXJhdGlvbnMgLSBTb3J0ZWQsIGR1cGxpY2F0ZS1mcmVlIHN5bmMgb3BlcmF0aW9uIG5hbWVzLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBwb2xpY3lWZXJzaW9uIC0gQXBwLWNvbnRyb2xsZWQgcG9saWN5IHZlcnNpb24sIG9yIG51bGwuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcG9saWN5SGFzaCAtIERldGVybWluaXN0aWMgc2hhMjU2IGhhc2ggb2Ygc2FmZSBwb2xpY3kgaW5wdXRzLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IFttZXRhZGF0YV0gLSBTYWZlIGZyb250ZW5kLXZpc2libGUgbWV0YWRhdGEuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T21pdDxGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uLCBcImFiaWxpdGllc1wiIHwgXCJidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzXCIgfCBcImJ1aWx0SW5NZW1iZXJDb21tYW5kc1wiIHwgXCJjb2xsZWN0aW9uQ29tbWFuZHNcIiB8IFwiY29tbWFuZHNcIiB8IFwibWVtYmVyQ29tbWFuZHNcIiB8IFwic3luY1wiPiAmIHtcbiAqICAgYWJpbGl0aWVzOiBGcm9udGVuZE1vZGVsUmVzb3VyY2VBYmlsaXRpZXNDb25maWd1cmF0aW9uXG4gKiAgIGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAqICAgYnVpbHRJbk1lbWJlckNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gKiAgIGNvbGxlY3Rpb25Db21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICogICBjb21tYW5kTWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHthcmdzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZTogc3RyaW5nIHwgbnVsbH0+XG4gKiAgIG1lbWJlckNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gKiAgIHN5bmM/OiBOb3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlU3luY0NvbmZpZ3VyYXRpb25cbiAqIH19IE5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uXG4gKi9cblxuLyoqXG4gKiBVbmJvdW5kIHJlc291cmNlIGNsYXNzIHVzZWQgYnkgbW9kZWwtYWdub3N0aWMgcmVnaXN0cmllcy5cbiAqIEB0eXBlZGVmIHtPbWl0PHR5cGVvZiBpbXBvcnQoXCIuL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdCwgXCJtb2RlbENsYXNzXCI+ICYge21vZGVsQ2xhc3M6ICgpID0+IHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBuZXcgKGFyZ3M6IG5ldmVyKTogaW1wb3J0KFwiLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHQ8dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQ+fX0gVW5ib3VuZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZVxuICovXG5cbi8qKlxuICogUmVzb3VyY2UgY2xhc3MgYm91bmQgdG8gYSBzcGVjaWZpYyBtb2RlbCBjbGFzcy5cbiAqIEB0ZW1wbGF0ZSB7aW1wb3J0KFwiLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZU1vZGVsQ2xhc3N9IFRNb2RlbENsYXNzXG4gKiBAdGVtcGxhdGUge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBURGF0YWJhc2VNb2RlbENsYXNzXG4gKiBAdHlwZWRlZiB7T21pdDx0eXBlb2YgaW1wb3J0KFwiLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHQsIFwiTW9kZWxDbGFzc1wiIHwgXCJtb2RlbENsYXNzXCI+ICYge01vZGVsQ2xhc3M6IFRNb2RlbENsYXNzIHwgdW5kZWZpbmVkLCBtb2RlbENsYXNzOiAoKSA9PiBUTW9kZWxDbGFzcywgbmV3IChhcmdzOiBpbXBvcnQoXCIuL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQWJpbGl0eUFyZ3M8VE1vZGVsQ2xhc3M+IHwgaW1wb3J0KFwiLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbnRyb2xsZXJBcmdzPFREYXRhYmFzZU1vZGVsQ2xhc3M+KTogaW1wb3J0KFwiLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHQ8VE1vZGVsQ2xhc3MsIFREYXRhYmFzZU1vZGVsQ2xhc3M+fX0gQm91bmRGcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7aW1wb3J0KFwiLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLkZyb250ZW5kTW9kZWxSZXNvdXJjZU1vZGVsQ2xhc3N9IFtUTW9kZWxDbGFzcz1uZXZlcl1cbiAqIEB0ZW1wbGF0ZSB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IFtURGF0YWJhc2VNb2RlbENsYXNzPUV4dHJhY3Q8VE1vZGVsQ2xhc3MsIHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0Pl1cbiAqIEB0eXBlZGVmIHtbVE1vZGVsQ2xhc3NdIGV4dGVuZHMgW25ldmVyXSA/IFVuYm91bmRGcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGUgOiBCb3VuZEZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZTxUTW9kZWxDbGFzcywgVERhdGFiYXNlTW9kZWxDbGFzcz59IEZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtpbXBvcnQoXCIuL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlTW9kZWxDbGFzc30gW1RNb2RlbENsYXNzPW5ldmVyXVxuICogQHR5cGVkZWYge0Zyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZTxUTW9kZWxDbGFzcz59IEZyb250ZW5kTW9kZWxSZXNvdXJjZURlZmluaXRpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxSZXNvdXJjZUFiaWxpdGllc0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaW5kZXhdIC0gQWJpbGl0eSBhY3Rpb24gZm9yIGZyb250ZW5kIGluZGV4LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmaW5kXSAtIEFiaWxpdHkgYWN0aW9uIGZvciBmcm9udGVuZCBmaW5kLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjcmVhdGVdIC0gQWJpbGl0eSBhY3Rpb24gZm9yIGZyb250ZW5kIGNyZWF0ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdXBkYXRlXSAtIEFiaWxpdHkgYWN0aW9uIGZvciBmcm9udGVuZCB1cGRhdGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Rlc3Ryb3ldIC0gQWJpbGl0eSBhY3Rpb24gZm9yIGZyb250ZW5kIGRlc3Ryb3kuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsUmVzb3VyY2VTZXJ2ZXJDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7YWN0aW9uOiBcImluZGV4XCIgfCBcImZpbmRcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJhdHRhY2htZW50TGlzdFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIiwgY29udHJvbGxlcjogaW1wb3J0KFwiLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0pID0+IChib29sZWFuIHwgdm9pZCB8IFByb21pc2U8Ym9vbGVhbiB8IHZvaWQ+KX0gW2JlZm9yZUFjdGlvbl0gLSBPcHRpb25hbCBjYWxsYmFjayBydW4gYmVmb3JlIGJ1aWx0LWluIGZyb250ZW5kIGFjdGlvbnMuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7YWN0aW9uOiBcImluZGV4XCIsIGNvbnRyb2xsZXI6IGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9KSA9PiBQcm9taXNlPGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXT59IFtyZWNvcmRzXSAtIFJlY29yZHMgbG9hZGVyIGZvciBmcm9udGVuZEluZGV4LlxuICogQHByb3BlcnR5IHsoYXJnczoge2FjdGlvbjogXCJpbmRleFwiIHwgXCJmaW5kXCIgfCBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiwgY29udHJvbGxlcjogaW1wb3J0KFwiLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgbW9kZWw6IGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9KSA9PiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59IFtzZXJpYWxpemVdIC0gUmVjb3JkIHNlcmlhbGl6ZXIgZm9yIHJlc3BvbnNlIHBheWxvYWRzLlxuICogQHByb3BlcnR5IHsoYXJnczoge2FjdGlvbjogXCJmaW5kXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJhdHRhY2htZW50TGlzdFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIiwgY29udHJvbGxlcjogaW1wb3J0KFwiLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgaWQ6IHN0cmluZyB8IG51bWJlcn0pID0+IFByb21pc2U8aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IG51bGw+fSBbZmluZF0gLSBSZWNvcmQgbG9hZGVyIGZvciBmaW5kL3VwZGF0ZS9kZXN0cm95L2F0dGFjaC9kb3dubG9hZC91cmwgYWN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHthY3Rpb246IFwiY3JlYXRlXCIsIGNvbnRyb2xsZXI6IGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQsIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0pID0+IFByb21pc2U8aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59IFtjcmVhdGVdIC0gQ3VzdG9tIGNyZWF0ZSBjYWxsYmFjay5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHthY3Rpb246IFwidXBkYXRlXCIsIGNvbnRyb2xsZXI6IGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQsIG1vZGVsOiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59KSA9PiBQcm9taXNlPGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB2b2lkPn0gW3VwZGF0ZV0gLSBDdXN0b20gdXBkYXRlIGNhbGxiYWNrLlxuICogQHByb3BlcnR5IHsoYXJnczoge2FjdGlvbjogXCJkZXN0cm95XCIsIGNvbnRyb2xsZXI6IGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQsIG1vZGVsOiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSkgPT4gUHJvbWlzZTx2b2lkPn0gW2Rlc3Ryb3ldIC0gQ3VzdG9tIGRlc3Ryb3kgY2FsbGJhY2suXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gUGF0aCB0byB0aGUgYmFja2VuZCBwcm9qZWN0LiBNYXkgYmUgYW4gYXBwIHJvb3Qgb3IgYSBjb250cmlidXRpbmcgcGFja2FnZSByb290IChwYWNrYWdlIGVudHJpZXMgYXJlIGFwcGVuZGVkIGludGVybmFsbHkgZnJvbSBgcGFja2FnZXNgKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbnRlbmRNb2RlbHNPdXRwdXRQYXRoXSAtIE9wdGlvbmFsIG91dHB1dCBwcm9qZWN0IHBhdGggd2hlcmUgYHNyYy9mcm9udGVuZC1tb2RlbHNgIHNob3VsZCBiZSBnZW5lcmF0ZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jlc291cmNlc1BhdGhdIC0gT3B0aW9uYWwgb3ZlcnJpZGUgZm9yIHRoZSByZXNvdXJjZXMgZGlyZWN0b3J5IHRvIGF1dG8tZGlzY292ZXI7IGRlZmF1bHRzIHRvIGA8cGF0aD4vc3JjL3Jlc291cmNlc2AuIFNldCBpbnRlcm5hbGx5IGZvciBwYWNrYWdlIGVudHJpZXMuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIEZyb250ZW5kTW9kZWxSZXNvdXJjZURlZmluaXRpb24+fSBbZnJvbnRlbmRNb2RlbHNdIC0gQXV0by1kaXNjb3ZlcmVkIGZyb250ZW5kIG1vZGVsIGRlZmluaXRpb25zIGtleWVkIGJ5IG1vZGVsIGNsYXNzIG5hbWUuIFNldCBpbnRlcm5hbGx5IGJ5IHRoZSBlbnZpcm9ubWVudCBoYW5kbGVyIOKAlCBkbyBub3Qgc2V0IG1hbnVhbGx5LlxuICogQHByb3BlcnR5IHtBYmlsaXR5UmVzb3VyY2VDbGFzc1R5cGVbXX0gW2FiaWxpdHlSZXNvdXJjZXNdIC0gQXV0by1kaXNjb3ZlcmVkIGFiaWxpdHkgcmVzb3VyY2UgY2xhc3NlcyAoZnJvbnRlbmQtbW9kZWwgYW5kIGF1dGhvcml6YXRpb24pIGZyb20gdGhpcyBwcm9qZWN0J3MgcmVzb3VyY2VzIGRpcmVjdG9yeS4gU2V0IGludGVybmFsbHkgYnkgdGhlIGVudmlyb25tZW50IGhhbmRsZXIg4oCUIGRvIG5vdCBzZXQgbWFudWFsbHkuXG4gKi9cblxuLyoqXG4gKiBBIGRlc2NyaXB0b3IgZm9yIGFuIGV4dGVybmFsIFZlbG9jaW91cyBwYWNrYWdlIChlbmdpbmUpIHRoYXQgY29udHJpYnV0ZXMgbW9kZWxzLFxuICogcmVzb3VyY2VzIGFuZCBtaWdyYXRpb25zLiBBIHBhY2thZ2UgdXN1YWxseSBleHBvcnRzIGBuZXcgVmVsb2Npb3VzUGFja2FnZSh7bmFtZSwgdXJsOiBpbXBvcnQubWV0YS51cmx9KWAuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWZWxvY2lvdXNQYWNrYWdlRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBUaGUgcGFja2FnZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1cmxdIC0gVGhlIGRlc2NyaXB0b3IgbW9kdWxlJ3MgYGltcG9ydC5tZXRhLnVybGA7IHRoZSBwYWNrYWdlIHJvb3QgaXMgZGVyaXZlZCBmcm9tIGl0IHdoZW4gYHBhdGhgIGlzIG9taXR0ZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdIC0gVGhlIHBhY2thZ2Ugcm9vdCBkaXJlY3RvcnkgKHRoZSBvbmUgY29udGFpbmluZyBgc3JjYCkuIERlcml2ZWQgZnJvbSBgdXJsYCB3aGVuIG9taXR0ZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21vZGVsc1BhdGhdIC0gT3ZlcnJpZGUgZm9yIHRoZSBwYWNrYWdlJ3MgbW9kZWxzIGRpcmVjdG9yeSAoZGVmYXVsdCBgPHBhdGg+L3NyYy9tb2RlbHNgKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmVzb3VyY2VzUGF0aF0gLSBPdmVycmlkZSBmb3IgdGhlIHBhY2thZ2UncyBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMgZGlyZWN0b3J5IChkZWZhdWx0IGA8cGF0aD4vc3JjL3Jlc291cmNlc2ApLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFttaWdyYXRpb25zUGF0aF0gLSBPdmVycmlkZSBmb3IgdGhlIHBhY2thZ2UncyBtaWdyYXRpb25zIGRpcmVjdG9yeSAoZGVmYXVsdCBgPHBhdGg+L3NyYy9kYXRhYmFzZS9taWdyYXRpb25zYCkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9wYWNrYWdlcy92ZWxvY2lvdXMtcGFja2FnZS5qc1wiKS5kZWZhdWx0IHwgVmVsb2Npb3VzUGFja2FnZURlc2NyaXB0b3J9IFZlbG9jaW91c1BhY2thZ2VDb25maWd1cmF0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSb3V0ZVJlc29sdmVySG9va0FyZ3NcbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IHBhcmFtcyAtIE11dGFibGUgcmVxdWVzdCBwYXJhbXMgb2JqZWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGN1cnJlbnRQYXRoIC0gUmVxdWVzdCBwYXRoIHdpdGhvdXQgcXVlcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtoYXNNYXRjaGluZ0N1c3RvbVJvdXRlXSAtIFRydWUgd2hlbiBtYXRjaGluZyBhIGNvbmZpZ3VyZWQgY3VzdG9tIHJvdXRlLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSByZXF1ZXN0IC0gUmVxdWVzdCBvYmplY3QuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzXCIpLmRlZmF1bHR9IHJlc3BvbnNlIC0gUmVzcG9uc2Ugb2JqZWN0LlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3JvdXRlcy9yZXNvbHZlci5qc1wiKS5kZWZhdWx0fSByZXNvbHZlciAtIFJlc29sdmVyIGluc3RhbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUm91dGVSZXNvbHZlckhvb2tSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpb24gLSBEYXNoZXJpemVkIGFjdGlvbiBuYW1lIChmb3IgZXhhbXBsZSBgZnJvbnRlbmQtaW5kZXhgKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250cm9sbGVyIC0gQ29udHJvbGxlciBwYXRoIChmb3IgZXhhbXBsZSBgYWNjb3VudHNgKS5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBbY29udHJvbGxlckNsYXNzXSAtIE9wdGlvbmFsIGNvbnRyb2xsZXIgY2xhc3Mgb3ZlcnJpZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbnRyb2xsZXJQYXRoXSAtIE9wdGlvbmFsIGFic29sdXRlL3JlbGF0aXZlIGNvbnRyb2xsZXIgZmlsZSBwYXRoIG92ZXJyaWRlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFtwYXJhbXNdIC0gRXh0cmEgcGFyYW1zIHRvIG1lcmdlIGZvciBjb250cm9sbGVyL2FjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3NraXBBYmlsaXR5UmVzb2x1dGlvbl0gLSBXaGV0aGVyIHRvIHJ1biB0aGUgY29udHJvbGxlciBhY3Rpb24gd2l0aG91dCByZXNvbHZpbmcgcmVxdWVzdCBhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2tpcENvbnRyb2xsZXJDb25uZWN0aW9uc10gLSBXaGV0aGVyIHRvIHJ1biB0aGUgY29udHJvbGxlciBhY3Rpb24gd2l0aG91dCB0aGUgYXV0b21hdGljIGRhdGFiYXNlIGNoZWNrb3V0IHdyYXBwZXIuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtza2lwVGVuYW50UmVzb2x1dGlvbl0gLSBXaGV0aGVyIHRvIHJ1biB0aGUgY29udHJvbGxlciBhY3Rpb24gd2l0aG91dCByZXNvbHZpbmcgcmVxdWVzdCB0ZW5hbnQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ZpZXdQYXRoXSAtIE9wdGlvbmFsIHZpZXcgcGF0aCBvdmVycmlkZSB1c2VkIGJ5IGNvbnRyb2xsZXIgcmVuZGVyIGxvb2t1cHMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KGFyZzogUm91dGVSZXNvbHZlckhvb2tBcmdzKSA9PiBSb3V0ZVJlc29sdmVySG9va1Jlc3VsdCB8IG51bGwgfCBQcm9taXNlPFJvdXRlUmVzb2x2ZXJIb29rUmVzdWx0IHwgbnVsbD59IFJvdXRlUmVzb2x2ZXJIb29rVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3R5cGVvZiBpbXBvcnQoXCIuL2F1dGhvcml6YXRpb24vYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0fSBBYmlsaXR5UmVzb3VyY2VDbGFzc1R5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoYXJnczoge2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiwgcmVxdWVzdDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCwgcmVzcG9uc2U6IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9KSA9PiBpbXBvcnQoXCIuL2F1dGhvcml6YXRpb24vYWJpbGl0eS5qc1wiKS5kZWZhdWx0IHwgdm9pZCB8IFByb21pc2U8aW1wb3J0KFwiLi9hdXRob3JpemF0aW9uL2FiaWxpdHkuanNcIikuZGVmYXVsdCB8IHZvaWQ+fSBBYmlsaXR5UmVzb2x2ZXJUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KGFyZ3M6IHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIHJlcXVlc3Q6IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWQsIHJlc3BvbnNlOiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkLCBzdWJzY3JpcHRpb24/OiB7Y2hhbm5lbDogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59fSkgPT4gUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4gfCB2b2lkIHwgUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiB8IHZvaWQ+fSBUZW5hbnRSZXNvbHZlclR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoYXJnczoge2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBkYXRhYmFzZUNvbmZpZ3VyYXRpb246IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGUsIGlkZW50aWZpZXI6IHN0cmluZywgdGVuYW50OiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0pID0+IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGUgfCBQYXJ0aWFsPERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGU+IHwgdm9pZH0gVGVuYW50RGF0YWJhc2VSZXNvbHZlclR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFwaU1hbmlmZXN0Q29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXSAtIEhUVFAgcGF0aCBmb3IgdGhlIGJ1aWx0LWluIEFQSSBtYW5pZmVzdCBlbmRwb2ludC4gRGVmYXVsdHMgdG8gYC9hcGkvbWFuaWZlc3RgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0b2tlbl0gLSBCZWFyZXIgdG9rZW4gcmVxdWlyZWQgaW4gdGhlIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPHRva2VuPmAgaGVhZGVyLiBXaGVuIHNldCwgcmVxdWVzdHMgd2l0aG91dCBhIG1hdGNoaW5nIHRva2VuIGFyZSBub3Qgcm91dGVkICg0MDQpLCBzbyB0aGUgZW5kcG9pbnQgc3RheXMgaGlkZGVuLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1jcENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF0gLSBIVFRQIHBhdGggZm9yIHRoZSBidWlsdC1pbiBNQ1AgZW5kcG9pbnQuIERlZmF1bHRzIHRvIGAvbWNwYC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdG9rZW5dIC0gQmVhcmVyIHRva2VuIHJlcXVpcmVkIGluIHRoZSBgQXV0aG9yaXphdGlvbmAgaGVhZGVyLiBXaGVuIHNldCwgcmVxdWVzdHMgd2l0aG91dCBhIG1hdGNoaW5nIHRva2VuIGFyZSBub3Qgcm91dGVkICg0MDQpLCBzbyB0aGUgZW5kcG9pbnQgc3RheXMgaGlkZGVuLlxuICovXG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWJ1Z0VuZHBvaW50Q29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXSAtIEhUVFAgcGF0aCBmb3IgdGhlIGJ1aWx0LWluIGRlYnVnIGVuZHBvaW50LiBEZWZhdWx0cyB0byBgL3ZlbG9jaW91cy9kZWJ1Z2AuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Rva2VuXSAtIEJlYXJlciB0b2tlbiByZXF1aXJlZCBpbiB0aGUgYEF1dGhvcml6YXRpb246IEJlYXJlciA8dG9rZW4+YCBoZWFkZXIuIFdoZW4gc2V0LCByZXF1ZXN0cyB3aXRob3V0IGEgbWF0Y2hpbmcgdG9rZW4gYXJlIG5vdCByb3V0ZWQgKDQwNCksIHNvIHRoZSBlbmRwb2ludCBzdGF5cyBoaWRkZW4uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUZXN0VGVuYW50UG9vbENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSB0ZW5hbnRzIC0gUG9vbCBtZW1iZXJzOiB0aGUgdGVuYW50IGRlc2NyaXB0b3JzIHdob3NlIGRhdGFiYXNlcyB0aGUgcG9vbCBwcmUtcHJvdmlzaW9ucyBhbmQgcmUtdXNlcy4gUG9vbCBzaXplIGlzIHRoZSBhcnJheSBsZW5ndGguXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGRhdGFiYXNlSWRlbnRpZmllcjogc3RyaW5nLCB0ZW5hbnQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD59IFtwcm92aXNpb25UZW5hbnRdIC0gQXBwLW93bmVkIHByb3Zpc2lvbmluZyBvdmVycmlkZSBmb3Igb25lIG1lbWJlciAocnVucyBpbnN0ZWFkIG9mIHRoZSBmcmFtZXdvcmsgY3JlYXRlICsgc3RydWN0dXJlLWxvYWQgKyBsZWRnZXItYmFzZWxpbmUgZGVmYXVsdCkuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGRhdGFiYXNlSWRlbnRpZmllcjogc3RyaW5nLCB0ZW5hbnQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD59IFtyZXNldFRlbmFudF0gLSBBcHAtb3duZWQgcGVyLXRlc3QgcmVzZXQgb3ZlcnJpZGUgKHJ1bnMgaW5zdGVhZCBvZiB0aGUgZnJhbWV3b3JrIHRydW5jYXRlICsgbGVkZ2VyLWJhc2VsaW5lIGRlZmF1bHQpLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIFRlc3RUZW5hbnRQb29sQ29uZmlndXJhdGlvbj59IFRlc3RUZW5hbnRQb29sc0NvbmZpZ3VyYXRpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFRlbmFudERhdGFiYXNlUHJvdmlkZXJUeXBlXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGlkZW50aWZpZXI6IHN0cmluZ30pID0+IEFycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiB8IFByb21pc2U8QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gbGlzdFRlbmFudHMgLSBMaXN0cyB0ZW5hbnRzIHRoYXQgc2hvdWxkIGJlIGNyZWF0ZWQsIGNoZWNrZWQsIG9yIG1pZ3JhdGVkIGZvciB0aGlzIGRhdGFiYXNlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGlkZW50aWZpZXI6IHN0cmluZ30pID0+IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+IHwgdm9pZCB8IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4gfCB2b2lkPn0gW3Jlc29sdmVHZW5lcmF0aW9uVGVuYW50XSAtIFJlc29sdmVzIG9uZSBleHBsaWNpdCB0ZW5hbnQgZGVzY3JpcHRvciBmb3Igc2NoZW1hL2Jhc2UtbW9kZWwgZ2VuZXJhdGlvbiB3aXRob3V0IGVudW1lcmF0aW5nIGxpZmVjeWNsZSB0ZW5hbnRzLlxuICogQHByb3BlcnR5IHsoYXJnczoge2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBpZGVudGlmaWVyOiBzdHJpbmd9KSA9PiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBQcm9taXNlPEFycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59IFtsaXN0UmVzdHJpY3RUZW5hbnRzXSAtIExpc3RzIGV4aXN0aW5nIHRlbmFudHMgdGhhdCBzaG91bGQgYmUgY2hlY2tlZCBmb3IgZGVwZW5kZW50IHJlc3RyaWN0IGRlc3Ryb3lzLiBEZWZhdWx0cyB0byBsaXN0VGVuYW50cy5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgZGF0YWJhc2VDb25maWd1cmF0aW9uOiBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlLCBpZGVudGlmaWVyOiBzdHJpbmcsIHRlbmFudDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPn0gW2NyZWF0ZURhdGFiYXNlXSAtIENyZWF0ZXMgdGhlIHRlbmFudCBkYXRhYmFzZS9zY2hlbWEgZm9yIG9uZSB0ZW5hbnQuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGRhdGFiYXNlQ29uZmlndXJhdGlvbjogRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZSwgaWRlbnRpZmllcjogc3RyaW5nLCB0ZW5hbnQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD59IFtkcm9wRGF0YWJhc2VdIC0gRHJvcHMgdGhlIHRlbmFudCBkYXRhYmFzZS9zY2hlbWEgZm9yIG9uZSB0ZW5hbnQuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGRhdGFiYXNlQ29uZmlndXJhdGlvbjogRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZSwgaWRlbnRpZmllcjogc3RyaW5nLCB0ZW5hbnQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD59IFtjaGVja1RlbmFudF0gLSBDaGVja3Mgb25lIHRlbmFudCBkYXRhYmFzZSBiZWZvcmUgZ2VuZXJpYyBjb25uZWN0aW9uIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGRhdGFiYXNlQ29uZmlndXJhdGlvbjogRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZSwgaWRlbnRpZmllcjogc3RyaW5nLCBtaWdyYXRpb25zQXBwbGllZDogbnVtYmVyLCB0ZW5hbnQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD59IFthZnRlck1pZ3JhdGVUZW5hbnRdIC0gUnVucyBhcHAtb3duZWQgdGVuYW50IHdvcmsgYWZ0ZXIgZ2VuZXJpYyBtaWdyYXRpb25zIGZvciBvbmUgdGVuYW50LiBgbWlncmF0aW9uc0FwcGxpZWRgIGlzIGhvdyBtYW55IG1pZ3JhdGlvbnMgYWN0dWFsbHkgcmFuICgwIHdoZW4gdGhlIHRlbmFudCB3YXMgYWxyZWFkeSB1cCB0byBkYXRlKSwgc28gdGhlIGFwcCBjYW4gc2tpcCBleHBlbnNpdmUgcGVyLXRlbmFudCB3b3JrIG9uIG5vLW9wIGRlcGxveXMuXG4gKi9cblxuLyoqXG4gKiBBZHZpc29yeS1sb2NrIGJhY2tlbmQgY2hhaW4gY29uZmlndXJhdGlvbiAoU1RDLTIxMCBkZXNpZ24gwqcxMCwgZmlsZSB0aWVyXG4gKiBpbXBsZW1lbnRlZCBieSBTVEMtMjEzKS4gRXZlcnl0aGluZyBkZWZhdWx0cyB0byB0b2RheSdzIGRyaXZlci1uYXRpdmUtb25seVxuICogYmVoYXZpb3I7IHRoZSBmaWxlIGJhY2tlbmQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgb25seSBzZWxlY3RhYmxlIGJ5XG4gKiBleHBsaWNpdCBjb25maWd1cmF0aW9uLlxuICogQHR5cGVkZWYge29iamVjdH0gQWR2aXNvcnlMb2Nrc0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7e2ZpbGU/OiB7ZGlyZWN0b3J5Pzogc3RyaW5nLCBlbmFibGVkPzogYm9vbGVhbiwgbGVhc2VNcz86IG51bWJlciwgcmVuZXdJbnRlcnZhbE1zPzogbnVtYmVyfX19IFtiYWNrZW5kc10gLSBCYWNrZW5kIGVuYWJsZW1lbnQuIGBmaWxlLmVuYWJsZWRgIGRlZmF1bHRzIHRvIGZhbHNlOyBlbmFibGluZyBpdCBpcyB0aGUgZGVwbG95bWVudCdzIGV4cGxpY2l0IHNpbmdsZS1ob3N0IGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2RhdGFiYXNlL2Fkdmlzb3J5LWxvY2stYmFja2VuZC1wb2xpY3kuanNcIikuQWR2aXNvcnlMb2NrQmFja2VuZFBvbGljeUVudHJ5W119IFtwb2xpY3ldIC0gUGVyLWxvY2stbmFtZSBtaW5pbXVtL2FsbG93ZWQvcHJlZmVycmVkIHRpZXIgcnVsZXMgKGRlc2lnbiDCpzUpLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29uZmlndXJhdGlvbkFyZ3NUeXBlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthdXRvbG9hZF0gLSBHbG9iYWxseSBlbmFibGUgYXV0by1iYXRjaC1wcmVsb2FkIG9mIHJlbGF0aW9uc2hpcHMgb24gbGF6eSBhY2Nlc3MuIERlZmF1bHQgdHJ1ZS5cbiAqIEBwcm9wZXJ0eSB7Q29yc1R5cGV9IFtjb3JzXSAtIENPUlMgY29uZmlndXJhdGlvbiBmb3IgdGhlIEhUVFAgc2VydmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb29raWVTZWNyZXRdIC0gU2VjcmV0IGZvciBlbmNyeXB0aW5nIGNvb2tpZXMuXG4gKiBAcHJvcGVydHkge0FiaWxpdHlSZXNvdXJjZUNsYXNzVHlwZVtdfSBbYWJpbGl0eVJlc291cmNlc10gLSBSZXNvdXJjZSBjbGFzc2VzIHVzZWQgdG8gZGVmaW5lIGFiaWxpdGllcyBwZXIgbW9kZWwuXG4gKiBAcHJvcGVydHkge0FiaWxpdHlSZXNvbHZlclR5cGV9IFthYmlsaXR5UmVzb2x2ZXJdIC0gUmVzb2x2ZXIgZm9yIGNyZWF0aW5nIHJlcXVlc3Qtc2NvcGVkIGFiaWxpdHkgaW5zdGFuY2VzLlxuICogQHByb3BlcnR5IHtBZHZpc29yeUxvY2tzQ29uZmlndXJhdGlvbn0gW2Fkdmlzb3J5TG9ja3NdIC0gQWR2aXNvcnktbG9jayBiYWNrZW5kIGNoYWluIGNvbmZpZ3VyYXRpb24gKGJhY2tlbmRzICsgcGVyLWxvY2stbmFtZSB0aWVyIHBvbGljeSkuIERlZmF1bHRzIHRvIHRvZGF5J3MgZHJpdmVyLW5hdGl2ZS1vbmx5IGJlaGF2aW9yLlxuICogQHByb3BlcnR5IHtBdHRhY2htZW50c0NvbmZpZ3VyYXRpb259IFthdHRhY2htZW50c10gLSBBdHRhY2htZW50IHN0b3JhZ2UgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QmFja2VuZFByb2plY3RDb25maWd1cmF0aW9uW119IFtiYWNrZW5kUHJvamVjdHNdIC0gQmFja2VuZCBwcm9qZWN0IGRlZmluaXRpb25zIHVzZWQgZm9yIGZyb250ZW5kIG1vZGVsIGdlbmVyYXRpb24uXG4gKiBAcHJvcGVydHkge1ZlbG9jaW91c1BhY2thZ2VDb25maWd1cmF0aW9uW119IFtwYWNrYWdlc10gLSBFeHRlcm5hbCBWZWxvY2lvdXMgcGFja2FnZXMgdGhhdCBjb250cmlidXRlIG1vZGVscywgZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2VzIGFuZCBtaWdyYXRpb25zLlxuICogQHByb3BlcnR5IHtmYWxzZSB8IHtba2V5OiBzdHJpbmddOiB7W2tleTogc3RyaW5nXTogRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX19fSBbZGF0YWJhc2VdIC0gRGF0YWJhc2UgY29uZmlndXJhdGlvbnMga2V5ZWQgYnkgZW52aXJvbm1lbnQgYW5kIGlkZW50aWZpZXIsIG9yIGZhbHNlIGZvciBhbiBleHBsaWNpdGx5IGRhdGFiYXNlLWZyZWUgYXBwbGljYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZWJ1Z10gLSBFbmFibGUgZGVidWcgbG9nZ2luZy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IERlYnVnRW5kcG9pbnRDb25maWd1cmF0aW9ufSBbZGVidWdFbmRwb2ludF0gLSBFbmFibGUgdGhlIGJ1aWx0LWluIGRlYnVnIGVuZHBvaW50LiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IEFwaU1hbmlmZXN0Q29uZmlndXJhdGlvbn0gW2FwaU1hbmlmZXN0XSAtIEVuYWJsZSB0aGUgYnVpbHQtaW4gQVBJIG1hbmlmZXN0IGVuZHBvaW50LiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IE1jcENvbmZpZ3VyYXRpb259IFttY3BdIC0gRW5hYmxlIHRoZSBidWlsdC1pbiBNQ1AgZW5kcG9pbnQgb24gdGhlIEhUVFAgc2VydmVyIChKU09OLVJQQyBvdmVyIEhUVFAgaW4gYWRkaXRpb24gdG8gdGhlIGB2ZWxvY2lvdXMgbWNwYCBzdGRpbyBzZXJ2ZXIpLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGlyZWN0b3J5XSAtIEJhc2UgZGlyZWN0b3J5IGZvciB0aGUgcHJvamVjdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2VuZm9yY2VUZW5hbnREYXRhYmFzZVNjb3Blc10gLSBSZXF1aXJlIHRlbmFudC1zd2l0Y2hlZCBtb2RlbCBxdWVyaWVzIHRvIHJlc29sdmUgYSB0ZW5hbnQgZGF0YWJhc2UgaWRlbnRpZmllci4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZW52aXJvbm1lbnRdIC0gQ3VycmVudCBlbnZpcm9ubWVudCBuYW1lLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2Vudmlyb25tZW50LWhhbmRsZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZW52aXJvbm1lbnRIYW5kbGVyIC0gRW52aXJvbm1lbnQgaGFuZGxlciBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2V4cG9zZUludGVybmFsRXJyb3JzVG9DbGllbnRzXSAtIFJldHVybiB1bmV4cGVjdGVkIGludGVybmFsIGVycm9yIG1lc3NhZ2VzIGFuZCBzdGFjayB0cmFjZXMgaW4gZnJvbnRlbmQtbW9kZWwgY2xpZW50IHBheWxvYWRzIGluIGV2ZXJ5IGVudmlyb25tZW50LiBEZWZhdWx0cyB0byB0cnVlLlxuICogQHByb3BlcnR5IHt7bWF4T3BlbkhhbmRsZXM/OiBudW1iZXJ9fSBbZnJvbnRlbmRUZW5hbnRTcWxpdGVdIC0gQm91bmRlZCBmcm9udGVuZCB0ZW5hbnQgU1FMaXRlIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2VjdXJlRnJvbnRlbmRNb2RlbEVycm9yc10gLSBEZXByZWNhdGVkIGNvbXBhdGliaWxpdHkgYWxpYXMgZm9yIGBleHBvc2VJbnRlcm5hbEVycm9yc1RvQ2xpZW50czogZmFsc2VgIHdoZW4gdGhlIGF1dGhvcml0YXRpdmUgb3B0aW9uIGlzIG9taXR0ZWQuXG4gKiBAcHJvcGVydHkge0h0dHBTZXJ2ZXJDb25maWd1cmF0aW9ufSBbaHR0cFNlcnZlcl0gLSBEZWZhdWx0IEhUVFAgc2VydmVyIGNvbmZpZ3VyYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBzdGFydGVkIGZyb20gdGhpcyBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtMb2dnaW5nQ29uZmlndXJhdGlvbn0gW2xvZ2dpbmddIC0gTG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9ic0NvbmZpZ3VyYXRpb259IFtiYWNrZ3JvdW5kSm9ic10gLSBCYWNrZ3JvdW5kIGpvYnMgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QmVhY29uQ29uZmlndXJhdGlvbn0gW2JlYWNvbl0gLSBCZWFjb24gYnJvYWRjYXN0IGJ1cyBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtTY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0NvbmZpZ3VyYXRpb24gfCBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0xvYWRlclR5cGV9IFtzY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic10gLSBTY2hlZHVsZWQgYmFja2dyb3VuZCBqb2JzIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge01haWxlckJhY2tlbmR9IFttYWlsZXJCYWNrZW5kXSAtIE1haWwgZGVsaXZlcnkgYmFja2VuZC5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgdHlwZTogc3RyaW5nfSkgPT4gdm9pZH0gaW5pdGlhbGl6ZU1vZGVscyAtIEhvb2sgdG8gcmVnaXN0ZXIgbW9kZWxzIGZvciBhIGdpdmVuIGluaXRpYWxpemF0aW9uIHR5cGUuXG4gKiBAcHJvcGVydHkge0luaXRpYWxpemVyc1R5cGV9IFtpbml0aWFsaXplcnNdIC0gSW5pdGlhbGl6ZXIgbG9hZGVyIGZvciBlbnZpcm9ubWVudCBib290c3RyYXBwaW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKX0gbG9jYWxlIC0gRGVmYXVsdCBsb2NhbGUgb3IgbG9jYWxlIHJlc29sdmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gbG9jYWxlcyAtIFN1cHBvcnRlZCBsb2NhbGVzLlxuICogQHByb3BlcnR5IHtMb2NhbGVGYWxsYmFja3NUeXBlfSBsb2NhbGVGYWxsYmFja3MgLSBMb2NhbGUgZmFsbGJhY2sgbWFwLlxuICogQHByb3BlcnR5IHtTdHJ1Y3R1cmVTcWxDb25maWd1cmF0aW9ufSBbc3RydWN0dXJlU3FsXSAtIFN0cnVjdHVyZSBTUUwgZ2VuZXJhdGlvbiBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtWZWxvY2lvdXNTeW5jQ29uZmlndXJhdGlvbn0gW3N5bmNdIC0gTG9jYWwvb2ZmbGluZSBzeW5jIGZyYW1ld29yayBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtUZW5hbnRSZXNvbHZlclR5cGV9IFt0ZW5hbnRSZXNvbHZlcl0gLSBSZXNvbHZlciBmb3IgY3JlYXRpbmcgcmVxdWVzdC1zY29wZWQgdGVuYW50IGNvbnRleHQgb2JqZWN0cy5cbiAqIEBwcm9wZXJ0eSB7VGVuYW50RGF0YWJhc2VSZXNvbHZlclR5cGV9IFt0ZW5hbnREYXRhYmFzZVJlc29sdmVyXSAtIFJlc29sdmVyIGZvciBkZXJpdmluZyB0ZW5hbnQtc3BlY2lmaWMgZGF0YWJhc2UgY29uZmlnIG92ZXJyaWRlcy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgVGVuYW50RGF0YWJhc2VQcm92aWRlclR5cGU+fSBbdGVuYW50RGF0YWJhc2VQcm92aWRlcnNdIC0gVGVuYW50IGRhdGFiYXNlIGxpZmVjeWNsZSBwcm92aWRlcnMga2V5ZWQgYnkgZGF0YWJhc2UgaWRlbnRpZmllci5cbiAqIEBwcm9wZXJ0eSB7VGVzdFRlbmFudFBvb2xzQ29uZmlndXJhdGlvbn0gW3Rlc3RUZW5hbnRQb29sc10gLSBPcHQtaW4gcmV1c2FibGUgdGVzdCB0ZW5hbnQtZGF0YWJhc2UgcG9vbHMga2V5ZWQgYnkgdGVuYW50IGRhdGFiYXNlIGlkZW50aWZpZXIuIENvbnN1bWVkIG9ubHkgYnkgdGhlIHRlc3QgaGFybmVzczsgb3JkaW5hcnkgcnVudGltZSBpZ25vcmVzIGl0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0ZXN0aW5nXSAtIFBhdGggdG8gdGhlIHRlc3RpbmcgY29uZmlndXJhdGlvbiBmaWxlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCAoKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkKX0gW3RpbWVab25lXSAtIERlZmF1bHQgdGltZXpvbmUgZm9yIHRpbWV6b25lLWxlc3MgZGF0ZXRpbWUgc3RyaW5ncy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgKCgpID0+IG51bWJlcil9IFt0aW1lem9uZU9mZnNldE1pbnV0ZXNdIC0gRGVmYXVsdCB0aW1lem9uZSBvZmZzZXQgaW4gbWludXRlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgc3RyaW5nW119IFt0cnVzdGVkUHJveGllc10gLSBUcnVzdGVkIHJldmVyc2UgcHJveHkgYWRkcmVzcyByYW5nZXMgdXNlZCB0byByZXNvbHZlIHJlcXVlc3QgcmVtb3RlIGFkZHJlc3NlcyBmcm9tIGZvcndhcmRpbmcgaGVhZGVycy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgKCgpID0+IG51bWJlcil9IFtyZXF1ZXN0VGltZW91dE1zXSAtIFRpbWVvdXQgaW4gc2Vjb25kcyBmb3IgY29tcGxldGluZyBhIEhUVFAgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7Um91dGVSZXNvbHZlckhvb2tUeXBlW119IFtyb3V0ZVJlc29sdmVySG9va3NdIC0gSG9vayBjYWxsYmFja3MgdGhhdCBjYW4gaGlqYWNrIHVucmVzb2x2ZWQgcm91dGVzLlxuICogQHByb3BlcnR5IHtXZWJzb2NrZXRDaGFubmVsUmVzb2x2ZXJUeXBlfSBbd2Vic29ja2V0Q2hhbm5lbFJlc29sdmVyXSAtIFJlc29sdmUgYSB3ZWJzb2NrZXQgY2hhbm5lbCBjbGFzcy9pbnN0YW5jZSBmb3IgZWFjaCBjb25uZWN0aW9uLlxuICogQHByb3BlcnR5IHtXZWJzb2NrZXRNZXNzYWdlSGFuZGxlclJlc29sdmVyVHlwZX0gW3dlYnNvY2tldE1lc3NhZ2VIYW5kbGVyUmVzb2x2ZXJdIC0gUmVzb2x2ZSBhIHJhdyB3ZWJzb2NrZXQgbWVzc2FnZSBoYW5kbGVyIGZvciBlYWNoIGNvbm5lY3Rpb24uXG4gKi9cblxuZXhwb3J0IGNvbnN0IG5vdGhpbmcgPSB7fVxuIl19
|
|
@@ -445,6 +445,17 @@ export default class VelociousConfiguration {
|
|
|
445
445
|
* @returns {import("./configuration-types.js").ResolvedHttpRequestBodyPolicy} - Effective request policy.
|
|
446
446
|
*/
|
|
447
447
|
resolveHttpRequestBodyPolicy(args: import("./configuration-types.js").HttpRequestBodyPolicyResolverArgs): import("./configuration-types.js").ResolvedHttpRequestBodyPolicy;
|
|
448
|
+
/**
|
|
449
|
+
* Enforces the built-in MCP endpoint's body contract without per-app plumbing: the
|
|
450
|
+
* JSON-RPC envelope is read from parsed params, so raw mode is rejected with an
|
|
451
|
+
* actionable error, and a framework default byte cap applies when the app configured none.
|
|
452
|
+
* @param {{args: import("./configuration-types.js").HttpRequestBodyPolicyResolverArgs, policy: import("./configuration-types.js").ResolvedHttpRequestBodyPolicy}} options - Resolution inputs.
|
|
453
|
+
* @returns {import("./configuration-types.js").ResolvedHttpRequestBodyPolicy} - Effective request policy.
|
|
454
|
+
*/
|
|
455
|
+
_applyMcpRequestBodyPolicyDefaults({ args, policy }: {
|
|
456
|
+
args: import("./configuration-types.js").HttpRequestBodyPolicyResolverArgs;
|
|
457
|
+
policy: import("./configuration-types.js").ResolvedHttpRequestBodyPolicy;
|
|
458
|
+
}): import("./configuration-types.js").ResolvedHttpRequestBodyPolicy;
|
|
448
459
|
/**
|
|
449
460
|
* Runs get cookie secret.
|
|
450
461
|
* @returns {string | undefined} - Cookie secret.
|