velocious 1.0.712 → 1.0.714
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/build/background-jobs/platform-job.js +31 -1
- package/build/background-jobs/types.js +1 -1
- package/build/src/background-jobs/platform-job.d.ts +20 -0
- package/build/src/background-jobs/platform-job.d.ts.map +1 -1
- package/build/src/background-jobs/platform-job.js +28 -2
- package/build/src/background-jobs/types.d.ts +2 -2
- package/build/src/background-jobs/types.js +2 -2
- package/build/src/sync/sync-model-change-feed-service.d.ts +4 -3
- package/build/src/sync/sync-model-change-feed-service.d.ts.map +1 -1
- package/build/src/sync/sync-model-change-feed-service.js +18 -7
- package/build/sync/sync-model-change-feed-service.js +19 -6
- package/package.json +1 -1
- package/src/background-jobs/platform-job.js +31 -1
- package/src/background-jobs/types.js +1 -1
- package/src/sync/sync-model-change-feed-service.js +19 -6
package/README.md
CHANGED
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
* Explicit database-free in-process HTTP applications with optional request and buffered-response byte limits (see [docs/http-server.md](docs/http-server.md#database-free-applications))
|
|
40
40
|
* Client-disconnect hooks for buffered (`request.onClientDisconnect` / `request.clientDisconnected`) alongside the streaming `response.onStreamClose` so long-running handlers can settle in-flight work when the socket goes away (see [docs/http-server.md](docs/http-server.md#client-disconnect-for-buffered-requests))
|
|
41
41
|
* Default-on buffered HTTP response compression with Brotli/gzip content negotiation, global and per-response opt-outs, and HEAD-correct representation headers (see [docs/http-server.md](docs/http-server.md#response-compression))
|
|
42
|
-
* Background jobs with Node SQL/TCP workers plus a Browser/Expo local SQLite store and in-process dispatcher, including failure events, authorized database-scoped dashboard counts, bounded drain-stall detection/recovery for the main dispatcher (`drainStoreOperationTimeoutMs`, reported as `background-jobs-drain-stall`), and an opt-in release-scoped main/worker generation protocol with acknowledged activation, asynchronous retirement, and retired-main recovery. Production compliance additionally requires downstream supervisor retention/activation ordering and release pins (see [docs/background-jobs.md](docs/background-jobs.md), [docs/local-background-jobs.md](docs/local-background-jobs.md), and [docs/background-jobs-dashboard.md](docs/background-jobs-dashboard.md))
|
|
42
|
+
* Background jobs with Node SQL/TCP workers plus a Browser/Expo local SQLite store and in-process dispatcher, including per-job-class wall-clock timeouts (`static timeoutMs`), failure events, authorized database-scoped dashboard counts, bounded drain-stall detection/recovery for the main dispatcher (`drainStoreOperationTimeoutMs`, reported as `background-jobs-drain-stall`), and an opt-in release-scoped main/worker generation protocol with acknowledged activation, asynchronous retirement, and retired-main recovery. Production compliance additionally requires downstream supervisor retention/activation ordering and release pins (see [docs/background-jobs.md](docs/background-jobs.md), [docs/local-background-jobs.md](docs/local-background-jobs.md), and [docs/background-jobs-dashboard.md](docs/background-jobs-dashboard.md))
|
|
43
43
|
* Durable one-off background-job scheduling with exact epoch timestamps plus stable replacement, cancellation, normalized readback, and duplicate-free wake across Node SQL/TCP and Browser/Expo local SQLite adapters (see [docs/scheduled-background-job-enqueue.md](docs/scheduled-background-job-enqueue.md))
|
|
44
44
|
* Rails-style request and database query logging with structured credential redaction (see [docs/logging.md](docs/logging.md))
|
|
45
45
|
* EJS-backed mailers with delivery, queueing, and payload rendering support (see [docs/mailers.md](docs/mailers.md))
|
|
@@ -55,6 +55,17 @@ export default class VelociousJob {
|
|
|
55
55
|
*/
|
|
56
56
|
static processTitle = undefined
|
|
57
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Wall-clock bound this job class runs under, in ms. Set e.g.
|
|
60
|
+
* `static timeoutMs = 60 * 60 * 1000` on a job whose work legitimately takes
|
|
61
|
+
* hours so its type carries its own bound instead of relying on one global
|
|
62
|
+
* `backgroundJobs.jobTimeoutMs` tuned for the slowest job in the system. The
|
|
63
|
+
* `{timeoutMs}` enqueue option overrides it. A non-positive value disables the
|
|
64
|
+
* bound for this class. Left undefined, the worker-level value applies.
|
|
65
|
+
* @type {number | undefined}
|
|
66
|
+
*/
|
|
67
|
+
static timeoutMs = undefined
|
|
68
|
+
|
|
58
69
|
/**
|
|
59
70
|
* Stops this performance and reschedules the same logical job row. This is
|
|
60
71
|
* normal control flow: it does not count as a failure or consume a retry.
|
|
@@ -93,6 +104,25 @@ export default class VelociousJob {
|
|
|
93
104
|
return merged
|
|
94
105
|
}
|
|
95
106
|
|
|
107
|
+
/**
|
|
108
|
+
* Folds this job class's static `timeoutMs` into the enqueue options unless the
|
|
109
|
+
* caller already specified one, so a job type carries its own wall-clock bound
|
|
110
|
+
* instead of every job sharing one worker-level value. A class that declares
|
|
111
|
+
* nothing leaves the option absent, and the worker falls back to its own
|
|
112
|
+
* default — the prior behavior.
|
|
113
|
+
* @param {import("./types.js").BackgroundJobOptions | undefined} options - Job options.
|
|
114
|
+
* @returns {import("./types.js").BackgroundJobOptions} - Options including the resolved timeout.
|
|
115
|
+
*/
|
|
116
|
+
static _withTimeout(options) {
|
|
117
|
+
const merged = options ? {...options} : {}
|
|
118
|
+
|
|
119
|
+
if (merged.timeoutMs === undefined && typeof this.timeoutMs === "number") {
|
|
120
|
+
merged.timeoutMs = this.timeoutMs
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return merged
|
|
124
|
+
}
|
|
125
|
+
|
|
96
126
|
/**
|
|
97
127
|
* Resolves class-derived enqueue options on a hydrated job instance. Explicit
|
|
98
128
|
* per-enqueue options take precedence over the instance concurrency key.
|
|
@@ -102,7 +132,7 @@ export default class VelociousJob {
|
|
|
102
132
|
* @returns {import("./types.js").BackgroundJobOptions} - Resolved job options.
|
|
103
133
|
*/
|
|
104
134
|
static _withJobContext({jobArgs, jobOptions}) {
|
|
105
|
-
const options = this._withQueue(jobOptions)
|
|
135
|
+
const options = this._withTimeout(this._withQueue(jobOptions))
|
|
106
136
|
|
|
107
137
|
if (options.concurrencyKey !== undefined) return options
|
|
108
138
|
|
|
@@ -175,7 +175,7 @@
|
|
|
175
175
|
* @property {boolean} [deduplicateWhileQueued] - When true, skip the enqueue if an identical still-queued job (same job name, args and queue) is scheduled no later than this enqueue, returning the earliest matching job's id. A future retry does not suppress earlier work. Deduplication is independent of `concurrencyKey`, so the job keeps its normal (e.g. queue-derived) concurrency cap. Keeps an interval-scheduled recurring job (e.g. retention pruning) from piling up redundant queued rows when it runs slower than its interval or no worker is free.
|
|
176
176
|
* @property {string} [idempotencyKey] - Durable enqueue identity scoped to the resolved job class name and queue. Exact replay returns the original job id across every state and after job pruning; reuse with different canonical arguments or behavior-affecting options fails. Ownership is independent of `deduplicateWhileQueued` and is retained until an explicit future retention policy removes it.
|
|
177
177
|
* @property {number} [scheduledAtMs] - Epoch timestamp in milliseconds when the job becomes eligible for dispatch. Defaults to enqueue time.
|
|
178
|
-
* @property {number} [timeoutMs] - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
|
|
178
|
+
* @property {number} [timeoutMs] - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides a job class's `static timeoutMs` and the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
|
|
179
179
|
*/
|
|
180
180
|
/**
|
|
181
181
|
* @typedef {object} BackgroundJobPayload
|
|
@@ -39,6 +39,16 @@ export default class VelociousJob<TArgs extends Array<ReturnType<typeof JSON.par
|
|
|
39
39
|
* @type {string | undefined}
|
|
40
40
|
*/
|
|
41
41
|
static processTitle: string | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Wall-clock bound this job class runs under, in ms. Set e.g.
|
|
44
|
+
* `static timeoutMs = 60 * 60 * 1000` on a job whose work legitimately takes
|
|
45
|
+
* hours so its type carries its own bound instead of relying on one global
|
|
46
|
+
* `backgroundJobs.jobTimeoutMs` tuned for the slowest job in the system. The
|
|
47
|
+
* `{timeoutMs}` enqueue option overrides it. A non-positive value disables the
|
|
48
|
+
* bound for this class. Left undefined, the worker-level value applies.
|
|
49
|
+
* @type {number | undefined}
|
|
50
|
+
*/
|
|
51
|
+
static timeoutMs: number | undefined;
|
|
42
52
|
/**
|
|
43
53
|
* Stops this performance and reschedules the same logical job row. This is
|
|
44
54
|
* normal control flow: it does not count as a failure or consume a retry.
|
|
@@ -58,6 +68,16 @@ export default class VelociousJob<TArgs extends Array<ReturnType<typeof JSON.par
|
|
|
58
68
|
* @returns {import("./types.js").BackgroundJobOptions} - Options including the resolved queue.
|
|
59
69
|
*/
|
|
60
70
|
static _withQueue(options: import("./types.js").BackgroundJobOptions | undefined): import("./types.js").BackgroundJobOptions;
|
|
71
|
+
/**
|
|
72
|
+
* Folds this job class's static `timeoutMs` into the enqueue options unless the
|
|
73
|
+
* caller already specified one, so a job type carries its own wall-clock bound
|
|
74
|
+
* instead of every job sharing one worker-level value. A class that declares
|
|
75
|
+
* nothing leaves the option absent, and the worker falls back to its own
|
|
76
|
+
* default — the prior behavior.
|
|
77
|
+
* @param {import("./types.js").BackgroundJobOptions | undefined} options - Job options.
|
|
78
|
+
* @returns {import("./types.js").BackgroundJobOptions} - Options including the resolved timeout.
|
|
79
|
+
*/
|
|
80
|
+
static _withTimeout(options: import("./types.js").BackgroundJobOptions | undefined): import("./types.js").BackgroundJobOptions;
|
|
61
81
|
/**
|
|
62
82
|
* Resolves class-derived enqueue options on a hydrated job instance. Explicit
|
|
63
83
|
* per-enqueue options take precedence over the instance concurrency key.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-job.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/platform-job.js"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"platform-job.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/platform-job.js"],"names":[],"mappings":"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"}
|
|
@@ -43,6 +43,16 @@ export default class VelociousJob {
|
|
|
43
43
|
* @type {string | undefined}
|
|
44
44
|
*/
|
|
45
45
|
static processTitle = undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Wall-clock bound this job class runs under, in ms. Set e.g.
|
|
48
|
+
* `static timeoutMs = 60 * 60 * 1000` on a job whose work legitimately takes
|
|
49
|
+
* hours so its type carries its own bound instead of relying on one global
|
|
50
|
+
* `backgroundJobs.jobTimeoutMs` tuned for the slowest job in the system. The
|
|
51
|
+
* `{timeoutMs}` enqueue option overrides it. A non-positive value disables the
|
|
52
|
+
* bound for this class. Left undefined, the worker-level value applies.
|
|
53
|
+
* @type {number | undefined}
|
|
54
|
+
*/
|
|
55
|
+
static timeoutMs = undefined;
|
|
46
56
|
/**
|
|
47
57
|
* Stops this performance and reschedules the same logical job row. This is
|
|
48
58
|
* normal control flow: it does not count as a failure or consume a retry.
|
|
@@ -75,6 +85,22 @@ export default class VelociousJob {
|
|
|
75
85
|
}
|
|
76
86
|
return merged;
|
|
77
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Folds this job class's static `timeoutMs` into the enqueue options unless the
|
|
90
|
+
* caller already specified one, so a job type carries its own wall-clock bound
|
|
91
|
+
* instead of every job sharing one worker-level value. A class that declares
|
|
92
|
+
* nothing leaves the option absent, and the worker falls back to its own
|
|
93
|
+
* default — the prior behavior.
|
|
94
|
+
* @param {import("./types.js").BackgroundJobOptions | undefined} options - Job options.
|
|
95
|
+
* @returns {import("./types.js").BackgroundJobOptions} - Options including the resolved timeout.
|
|
96
|
+
*/
|
|
97
|
+
static _withTimeout(options) {
|
|
98
|
+
const merged = options ? { ...options } : {};
|
|
99
|
+
if (merged.timeoutMs === undefined && typeof this.timeoutMs === "number") {
|
|
100
|
+
merged.timeoutMs = this.timeoutMs;
|
|
101
|
+
}
|
|
102
|
+
return merged;
|
|
103
|
+
}
|
|
78
104
|
/**
|
|
79
105
|
* Resolves class-derived enqueue options on a hydrated job instance. Explicit
|
|
80
106
|
* per-enqueue options take precedence over the instance concurrency key.
|
|
@@ -84,7 +110,7 @@ export default class VelociousJob {
|
|
|
84
110
|
* @returns {import("./types.js").BackgroundJobOptions} - Resolved job options.
|
|
85
111
|
*/
|
|
86
112
|
static _withJobContext({ jobArgs, jobOptions }) {
|
|
87
|
-
const options = this._withQueue(jobOptions);
|
|
113
|
+
const options = this._withTimeout(this._withQueue(jobOptions));
|
|
88
114
|
if (options.concurrencyKey !== undefined)
|
|
89
115
|
return options;
|
|
90
116
|
const jobInstance = new this();
|
|
@@ -207,4 +233,4 @@ export default class VelociousJob {
|
|
|
207
233
|
throw new Error("perform not implemented");
|
|
208
234
|
}
|
|
209
235
|
}
|
|
210
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0tam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy9wbGF0Zm9ybS1qb2IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sNkJBQTZCLE1BQU0sd0JBQXdCLENBQUE7QUFDbEUsT0FBTyxFQUNMLDRCQUE0QixFQUM1QixvQkFBb0IsRUFDcEIseUJBQXlCLEVBQ3pCLDZCQUE2QixFQUM3QiwwQkFBMEIsRUFDM0IsTUFBTSxjQUFjLENBQUE7QUFFckI7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxZQUFZO0lBQy9CO1FBQ0Usb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLENBQUE7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUE7SUFFdEM7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUE7SUFFeEI7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUE7SUFFL0I7Ozs7O09BS0c7SUFDSCxZQUFZLENBQUMsT0FBTztRQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLFNBQVMsQ0FBQyx1RUFBdUUsQ0FBQyxDQUFBO1FBQzlGLENBQUM7UUFFRCxNQUFNLElBQUksNkJBQTZCLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDbEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFBO0lBQ2xCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTztRQUN2QixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUMsR0FBRyxPQUFPLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRTFDLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxRixNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUE7UUFDM0IsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUMsT0FBTyxFQUFFLFVBQVUsRUFBQztRQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRTNDLElBQUksT0FBTyxDQUFDLGNBQWMsS0FBSyxTQUFTO1lBQUUsT0FBTyxPQUFPLENBQUE7UUFFeEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtRQUM5QixXQUFXLENBQUMsd0JBQXdCLENBQUM7WUFDbkMsSUFBSSxFQUFFLE9BQU87WUFDYixRQUFRLEVBQUUsSUFBSTtZQUNkLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3ZCLE9BQU87U0FDUixDQUFDLENBQUE7UUFDRixNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUE7UUFFbkQsSUFBSSxjQUFjLEtBQUssU0FBUztZQUFFLE9BQU8sQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFBO1FBRXpFLE9BQU8sT0FBTyxDQUFBO0lBQ2hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILHdCQUF3QixDQUFDLE9BQU87UUFDOUIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLE9BQU8sQ0FBQTtJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFBO1FBRTFGLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFBO0lBQ25DLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGNBQWM7UUFDWixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSTtRQUMvQixNQUFNLEVBQUMsT0FBTyxFQUFFLFVBQVUsRUFBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM3RCxPQUFPLE1BQU0sb0JBQW9CLENBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO0lBQzFFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBQztRQUNsRCxPQUFPLE1BQU0sb0JBQW9CLENBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7SUFDekYsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUM7UUFDeEQsT0FBTyxNQUFNLDZCQUE2QixDQUFDLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQTtJQUMvRyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFdBQVc7UUFDdEMsT0FBTyxNQUFNLDRCQUE0QixDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3hELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxPQUFPLEdBQUcsRUFBRTtRQUNwRCxPQUFPLE1BQU0seUJBQXlCLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzlELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsV0FBVztRQUNwQyxPQUFPLE1BQU0sMEJBQTBCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDdEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSTtRQUM5QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxFQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBQyxDQUFBO1FBQ3RDLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUNyQyxNQUFNLFlBQVksR0FBRyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxZQUFZLElBQUksT0FBTyxDQUFBO1FBRWpILElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsTUFBTSxFQUFDLFVBQVUsRUFBQyxHQUFHLHNFQUFzRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDckcsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLElBQUksRUFBRSxFQUFDLENBQUE7UUFDbkUsQ0FBQztRQUVELE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUMsQ0FBQTtJQUN4QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLO1FBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQTtJQUM1QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IEJhY2tncm91bmRKb2JSZXNjaGVkdWxlU2lnbmFsIGZyb20gXCIuL3Jlc2NoZWR1bGUtc2lnbmFsLmpzXCJcbmltcG9ydCB7XG4gIGNhbmNlbFNjaGVkdWxlZEJhY2tncm91bmRKb2IsXG4gIGVucXVldWVCYWNrZ3JvdW5kSm9iLFxuICBnZXRTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iLFxuICByZXBsYWNlU2NoZWR1bGVkQmFja2dyb3VuZEpvYixcbiAgd2FrZVNjaGVkdWxlZEJhY2tncm91bmRKb2Jcbn0gZnJvbSBcIi4vcnVudGltZS5qc1wiXG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYmFja2dyb3VuZCBqb2JzLlxuICpcbiAqIGBUQXJnc2AgaXMgdGhlIHR1cGxlIG9mIGFyZ3VtZW50cyB0aGUgc3ViY2xhc3MncyBgcGVyZm9ybWAgYWNjZXB0cywgc28gYSBqb2IgdGhhdFxuICogbmVlZHMgYXJndW1lbnRzIGRlY2xhcmVzIHRoZW0gYXMgcmVxdWlyZWQgYW5kIHR5cGVkIOKAlCBmb3IgZXhhbXBsZVxuICogYGNsYXNzIFJ1bkJ1aWxkSm9iIGV4dGVuZHMgVmVsb2Npb3VzSm9iPFtzdHJpbmddPmAgd2l0aCBgYXN5bmMgcGVyZm9ybShidWlsZElkKWAuXG4gKiBUaGUgZGVmYXVsdCBlbXB0eSB0dXBsZSBrZWVwcyBhcmd1bWVudC1sZXNzIGpvYnMgKGBleHRlbmRzIFZlbG9jaW91c0pvYmAsXG4gKiBgYXN5bmMgcGVyZm9ybSgpYCkgd29ya2luZyB1bmNoYW5nZWQuXG4gKiBAdGVtcGxhdGUge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gW1RBcmdzPVtdXVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNKb2Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYkNvbnRleHQgfCB1bmRlZmluZWR9ICovXG4gICAgdGhpcy5fYmFja2dyb3VuZEpvYkNvbnRleHQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRhYmFzZSBpZGVudGlmaWVycyBjaGVja2VkIG91dCB3aGlsZSB0aGlzIGpvYiBwZXJmb3Jtcy4gU2V0IGFuIGV4cGxpY2l0XG4gICAqIGxpc3QgdG8gYXZvaWQgaG9sZGluZyB1bnJlbGF0ZWQgY29uZmlndXJlZCBkYXRhYmFzZSBjb25uZWN0aW9ucywgb3IgYFtdYFxuICAgKiB3aGVuIHRoZSBqb2IgZXN0YWJsaXNoZXMgYW55IGNvbm5lY3Rpb25zIGl0IG5lZWRzIGl0c2VsZi4gTGVmdCB1bmRlZmluZWQsXG4gICAqIGpvYnMgcmV0YWluIHRoZSBleGlzdGluZyBiZWhhdmlvciBvZiBjaGVja2luZyBvdXQgZXZlcnkgYWN0aXZlIGRhdGFiYXNlLlxuICAgKiBAdHlwZSB7c3RyaW5nW10gfCB1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgZGF0YWJhc2VJZGVudGlmaWVycyA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBRdWV1ZSB0aGlzIGpvYiBjbGFzcyBydW5zIG9uLiBTdWJjbGFzc2VzIHNldCBlLmcuIGBzdGF0aWMgcXVldWUgPSBcImJ1aWxkc1wiYFxuICAgKiB0byByb3V0ZSBvbnRvIGEgcXVldWUgd2l0aCBpdHMgb3duIGNsdXN0ZXItd2lkZSBjb25jdXJyZW5jeSBjYXAgKGNvbmZpZ3VyZWRcbiAgICogdmlhIGBiYWNrZ3JvdW5kSm9icy5xdWV1ZXNgKS4gVGhlIGB7cXVldWV9YCBlbnF1ZXVlIG9wdGlvbiBvdmVycmlkZXMgaXQuXG4gICAqIExlZnQgdW5kZWZpbmVkLCBqb2JzIHJ1biBvbiB0aGUgYFwiZGVmYXVsdFwiYCBxdWV1ZS5cbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICovXG4gIHN0YXRpYyBxdWV1ZSA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBwcm9jZXNzIHRpdGxlIHNob3duIGZvciB0aGUgcnVubmVyIHdoaWxlIHRoaXMgam9iIGV4ZWN1dGVzLlxuICAgKiBWZWxvY2lvdXMgc2V0cyBgcHJvY2Vzcy50aXRsZWAgdG8gdGhpcyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBqb2Ig4oCUIHNvXG4gICAqIGBwc2AvYHRvcGAvYGh0b3BgIGlkZW50aWZ5IHdoYXQgYSBydW5uZXIgaXMgZG9pbmcg4oCUIGFuZCByZXN0b3JlcyB0aGVcbiAgICogcnVubmVyJ3MgYmFzZSB0aXRsZSB3aGVuIHRoZSBqb2IgZmluaXNoZXMuIExlZnQgdW5kZWZpbmVkLCB0aGUgcnVubmVyIGZhbGxzXG4gICAqIGJhY2sgdG8gYHZlbG9jaW91cyBqb2ItcnVubmVyOiA8Sm9iTmFtZT5gLiBTZXQgZS5nLlxuICAgKiBgc3RhdGljIHByb2Nlc3NUaXRsZSA9IFwidmVsb2Npb3VzIG1lZGlhIHRyYW5zY29kZXJcImAgdG8gZ2l2ZSBhIGpvYiBhXG4gICAqIGN1c3RvbSwgaHVtYW4tcmVhZGFibGUgdGl0bGUuXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgcHJvY2Vzc1RpdGxlID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoaXMgcGVyZm9ybWFuY2UgYW5kIHJlc2NoZWR1bGVzIHRoZSBzYW1lIGxvZ2ljYWwgam9iIHJvdy4gVGhpcyBpc1xuICAgKiBub3JtYWwgY29udHJvbCBmbG93OiBpdCBkb2VzIG5vdCBjb3VudCBhcyBhIGZhaWx1cmUgb3IgY29uc3VtZSBhIHJldHJ5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gZGVsYXlNcyAtIE5vbi1uZWdhdGl2ZSBzYWZlLWludGVnZXIgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBAcmV0dXJucyB7bmV2ZXJ9IC0gVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucy5cbiAgICovXG4gIHJlc2NoZWR1bGVJbihkZWxheU1zKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihkZWxheU1zKSB8fCBkZWxheU1zIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImJhY2tncm91bmQgam9iIHJlc2NoZWR1bGUgZGVsYXlNcyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIHNhZmUgaW50ZWdlclwiKVxuICAgIH1cblxuICAgIHRocm93IG5ldyBCYWNrZ3JvdW5kSm9iUmVzY2hlZHVsZVNpZ25hbChkZWxheU1zKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgam9iIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSm9iIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgam9iTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lXG4gIH1cblxuICAvKipcbiAgICogRm9sZHMgdGhpcyBqb2IgY2xhc3MncyBzdGF0aWMgYHF1ZXVlYCBpbnRvIHRoZSBlbnF1ZXVlIG9wdGlvbnMgdW5sZXNzIHRoZVxuICAgKiBjYWxsZXIgYWxyZWFkeSBzcGVjaWZpZWQgb25lLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnMgfCB1bmRlZmluZWR9IG9wdGlvbnMgLSBKb2Igb3B0aW9ucy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9IC0gT3B0aW9ucyBpbmNsdWRpbmcgdGhlIHJlc29sdmVkIHF1ZXVlLlxuICAgKi9cbiAgc3RhdGljIF93aXRoUXVldWUob3B0aW9ucykge1xuICAgIGNvbnN0IG1lcmdlZCA9IG9wdGlvbnMgPyB7Li4ub3B0aW9uc30gOiB7fVxuXG4gICAgaWYgKG1lcmdlZC5xdWV1ZSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0aGlzLnF1ZXVlID09PSBcInN0cmluZ1wiICYmIHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgbWVyZ2VkLnF1ZXVlID0gdGhpcy5xdWV1ZVxuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBjbGFzcy1kZXJpdmVkIGVucXVldWUgb3B0aW9ucyBvbiBhIGh5ZHJhdGVkIGpvYiBpbnN0YW5jZS4gRXhwbGljaXRcbiAgICogcGVyLWVucXVldWUgb3B0aW9ucyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgaW5zdGFuY2UgY29uY3VycmVuY3kga2V5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEpvYiBjb250ZXh0LlxuICAgKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5qb2JBcmdzIC0gSm9iIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JPcHRpb25zIHwgdW5kZWZpbmVkfSBhcmdzLmpvYk9wdGlvbnMgLSBKb2Igb3B0aW9ucy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9IC0gUmVzb2x2ZWQgam9iIG9wdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgX3dpdGhKb2JDb250ZXh0KHtqb2JBcmdzLCBqb2JPcHRpb25zfSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl93aXRoUXVldWUoam9iT3B0aW9ucylcblxuICAgIGlmIChvcHRpb25zLmNvbmN1cnJlbmN5S2V5ICE9PSB1bmRlZmluZWQpIHJldHVybiBvcHRpb25zXG5cbiAgICBjb25zdCBqb2JJbnN0YW5jZSA9IG5ldyB0aGlzKClcbiAgICBqb2JJbnN0YW5jZS5fc2V0QmFja2dyb3VuZEpvYkNvbnRleHQoe1xuICAgICAgYXJnczogam9iQXJncyxcbiAgICAgIGpvYkNsYXNzOiB0aGlzLFxuICAgICAgam9iTmFtZTogdGhpcy5qb2JOYW1lKCksXG4gICAgICBvcHRpb25zXG4gICAgfSlcbiAgICBjb25zdCBjb25jdXJyZW5jeUtleSA9IGpvYkluc3RhbmNlLmNvbmN1cnJlbmN5S2V5KClcblxuICAgIGlmIChjb25jdXJyZW5jeUtleSAhPT0gdW5kZWZpbmVkKSBvcHRpb25zLmNvbmN1cnJlbmN5S2V5ID0gY29uY3VycmVuY3lLZXlcblxuICAgIHJldHVybiBvcHRpb25zXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY29tcGxldGUgY29udGV4dCBhdmFpbGFibGUgdG8gdGhpcyBoeWRyYXRlZCBqb2IgaW5zdGFuY2UuXG4gICAqIEZyYW1ld29yayBlbnF1ZXVlL3J1bm5lciBib3VuZGFyaWVzIG93biB0aGlzIG1ldGhvZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JDb250ZXh0fSBjb250ZXh0IC0gSm9iIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3NldEJhY2tncm91bmRKb2JDb250ZXh0KGNvbnRleHQpIHtcbiAgICB0aGlzLl9iYWNrZ3JvdW5kSm9iQ29udGV4dCA9IGNvbnRleHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoaXMgaHlkcmF0ZWQgam9iJ3MgY29tcGxldGUgZW5xdWV1ZSBvciBydW5uZXIgY29udGV4dC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYkNvbnRleHR9IC0gSm9iIGNvbnRleHQuXG4gICAqL1xuICBiYWNrZ3JvdW5kSm9iQ29udGV4dCgpIHtcbiAgICBpZiAoIXRoaXMuX2JhY2tncm91bmRKb2JDb250ZXh0KSB0aHJvdyBuZXcgRXJyb3IoXCJCYWNrZ3JvdW5kIGpvYiBjb250ZXh0IGlzIG5vdCBoeWRyYXRlZFwiKVxuXG4gICAgcmV0dXJuIHRoaXMuX2JhY2tncm91bmRKb2JDb250ZXh0XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdG8gZGVyaXZlIGEgZHVyYWJsZSBjb25jdXJyZW5jeSBrZXkgZnJvbSBgYmFja2dyb3VuZEpvYkNvbnRleHQoKWAuXG4gICAqIFBhaXIgdGhlIGRlcml2ZWQga2V5IHdpdGggYG1heENvbmN1cnJlbmN5YCBpbiBlbnF1ZXVlIG9wdGlvbnMuIEFuIGV4cGxpY2l0XG4gICAqIHBlci1lbnF1ZXVlIGBjb25jdXJyZW5jeUtleWAgdGFrZXMgcHJlY2VkZW5jZSBhbmQgc2tpcHMgdGhpcyBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gRGVyaXZlZCBjb25jdXJyZW5jeSBrZXksIG9yIHVuZGVmaW5lZCBmb3Igbm9uZS5cbiAgICovXG4gIGNvbmN1cnJlbmN5S2V5KCkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHBlcmZvcm0gbGF0ZXIuXG4gICAqIEBwYXJhbSB7Li4uUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MgLSBKb2IgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBKb2IgaWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcGVyZm9ybUxhdGVyKC4uLmFyZ3MpIHtcbiAgICBjb25zdCB7am9iQXJncywgam9iT3B0aW9uc30gPSB0aGlzLl9zcGxpdEFyZ3NBbmRPcHRpb25zKGFyZ3MpXG4gICAgcmV0dXJuIGF3YWl0IGVucXVldWVCYWNrZ3JvdW5kSm9iKHtKb2JDbGFzczogdGhpcywgam9iQXJncywgam9iT3B0aW9uc30pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwZXJmb3JtIGxhdGVyIHdpdGggb3B0aW9ucy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5hcmdzIC0gSm9iIGFyZ3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc30gW2FyZ3Mub3B0aW9uc10gLSBKb2Igb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBKb2IgaWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcGVyZm9ybUxhdGVyV2l0aE9wdGlvbnMoe2FyZ3MsIG9wdGlvbnN9KSB7XG4gICAgcmV0dXJuIGF3YWl0IGVucXVldWVCYWNrZ3JvdW5kSm9iKHtKb2JDbGFzczogdGhpcywgam9iQXJnczogYXJncywgam9iT3B0aW9uczogb3B0aW9uc30pXG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSByZXBsYWNlcyB0aGlzIGpvYiBjbGFzcydzIHF1ZXVlZCBvd25lciBmb3IgYSBzdGFibGUgc2NoZWR1bGUga2V5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNjaGVkdWxlS2V5IC0gU3RhYmxlIGxvZ2ljYWwgc2NoZWR1bGUga2V5LlxuICAgKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5hcmdzIC0gSm9iIGFyZ3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc30gW2FyZ3Mub3B0aW9uc10gLSBKb2Igb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iUmVwbGFjZW1lbnRSZXN1bHQ+fSAtIFJlcGxhY2VtZW50IHJlc3VsdC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyByZXBsYWNlU2NoZWR1bGVkKHtzY2hlZHVsZUtleSwgYXJncywgb3B0aW9uc30pIHtcbiAgICByZXR1cm4gYXdhaXQgcmVwbGFjZVNjaGVkdWxlZEJhY2tncm91bmRKb2Ioe0pvYkNsYXNzOiB0aGlzLCBzY2hlZHVsZUtleSwgam9iQXJnczogYXJncywgam9iT3B0aW9uczogb3B0aW9uc30pXG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyBvciBkZXRhY2hlcyB0aGUgY3VycmVudCBvd25lciBvZiBhIHN0YWJsZSBzY2hlZHVsZSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlZHVsZUtleSAtIFN0YWJsZSBsb2dpY2FsIHNjaGVkdWxlIGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iQ2FuY2VsbGF0aW9uUmVzdWx0Pn0gLSBDYW5jZWxsYXRpb24gcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGNhbmNlbFNjaGVkdWxlZChzY2hlZHVsZUtleSkge1xuICAgIHJldHVybiBhd2FpdCBjYW5jZWxTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iKHNjaGVkdWxlS2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGN1cnJlbnQgb3duZXJzaGlwIGFuZCBvcHRpb25hbCB0ZXJtaW5hbCBoaXN0b3J5IGZvciBhIHN0YWJsZSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlZHVsZUtleSAtIFN0YWJsZSBsb2dpY2FsIHNjaGVkdWxlIGtleS5cbiAgICogQHBhcmFtIHt7aW5jbHVkZUxhdGVzdFRlcm1pbmFsPzogYm9vbGVhbn19IFtvcHRpb25zXSAtIExvb2t1cCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JTY2hlZHVsZWRMb29rdXBSZXN1bHQ+fSAtIE5vcm1hbGl6ZWQgc3RhYmxlIHNjaGVkdWxlIGpvYnMuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZ2V0U2NoZWR1bGVkSm9iKHNjaGVkdWxlS2V5LCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0U2NoZWR1bGVkQmFja2dyb3VuZEpvYihzY2hlZHVsZUtleSwgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBlZGl0ZXMgYSBmdXR1cmUgcXVldWVkIG93bmVyIHdpdGhvdXQgY3JlYXRpbmcgYW5vdGhlciBqb2IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlZHVsZUtleSAtIFN0YWJsZSBsb2dpY2FsIHNjaGVkdWxlIGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iV2FrZVJlc3VsdD59IC0gV2FrZSByZXN1bHQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgd2FrZVNjaGVkdWxlZChzY2hlZHVsZUtleSkge1xuICAgIHJldHVybiBhd2FpdCB3YWtlU2NoZWR1bGVkQmFja2dyb3VuZEpvYihzY2hlZHVsZUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNwbGl0IGFyZ3MgYW5kIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzIC0gSm9iIGFyZ3MuXG4gICAqIEByZXR1cm5zIHt7am9iQXJnczogQXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBqb2JPcHRpb25zOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JPcHRpb25zfX0gLSBTcGxpdCBhcmdzIGFuZCBvcHRpb25zLlxuICAgKi9cbiAgc3RhdGljIF9zcGxpdEFyZ3NBbmRPcHRpb25zKGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7am9iQXJnczogW10sIGpvYk9wdGlvbnM6IHt9fVxuICAgIH1cblxuICAgIGNvbnN0IGxhc3RBcmcgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV1cbiAgICBjb25zdCBpc09wdGlvbnNBcmcgPSBsYXN0QXJnICYmIHR5cGVvZiBsYXN0QXJnID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGxhc3RBcmcpICYmIFwiam9iT3B0aW9uc1wiIGluIGxhc3RBcmdcblxuICAgIGlmIChpc09wdGlvbnNBcmcpIHtcbiAgICAgIGNvbnN0IHtqb2JPcHRpb25zfSA9IC8qKiBAdHlwZSB7e2pvYk9wdGlvbnM6IGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9fSAqLyAobGFzdEFyZylcbiAgICAgIHJldHVybiB7am9iQXJnczogYXJncy5zbGljZSgwLCAtMSksIGpvYk9wdGlvbnM6IGpvYk9wdGlvbnMgfHwge319XG4gICAgfVxuXG4gICAgcmV0dXJuIHtqb2JBcmdzOiBhcmdzLCBqb2JPcHRpb25zOiB7fX1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzc2VzLlxuICAgKiBAcGFyYW0ge1RBcmdzfSBfYXJncyAtIEpvYiBhcmdzICh0aGUgdHVwbGUgdGhpcyBqb2IgY2xhc3Mgd2FzIHBhcmFtZXRlcml6ZWQgd2l0aCkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBwZXJmb3JtKC4uLl9hcmdzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwicGVyZm9ybSBub3QgaW1wbGVtZW50ZWRcIilcbiAgfVxufVxuIl19
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0tam9iLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy9wbGF0Zm9ybS1qb2IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sNkJBQTZCLE1BQU0sd0JBQXdCLENBQUE7QUFDbEUsT0FBTyxFQUNMLDRCQUE0QixFQUM1QixvQkFBb0IsRUFDcEIseUJBQXlCLEVBQ3pCLDZCQUE2QixFQUM3QiwwQkFBMEIsRUFDM0IsTUFBTSxjQUFjLENBQUE7QUFFckI7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxZQUFZO0lBQy9CO1FBQ0Usb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLENBQUE7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUE7SUFFdEM7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUE7SUFFeEI7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUE7SUFFL0I7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtJQUU1Qjs7Ozs7T0FLRztJQUNILFlBQVksQ0FBQyxPQUFPO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxNQUFNLElBQUksU0FBUyxDQUFDLHVFQUF1RSxDQUFDLENBQUE7UUFDOUYsQ0FBQztRQUVELE1BQU0sSUFBSSw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNsRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUE7SUFDbEIsQ0FBQztJQUVEOzs7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LEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksWUFBWSxJQUFJLE9BQU8sQ0FBQTtRQUVqSCxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sRUFBQyxVQUFVLEVBQUMsR0FBRyxzRUFBc0UsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3JHLE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxJQUFJLEVBQUUsRUFBQyxDQUFBO1FBQ25FLENBQUM7UUFFRCxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFDLENBQUE7SUFDeEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSztRQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUE7SUFDNUMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBCYWNrZ3JvdW5kSm9iUmVzY2hlZHVsZVNpZ25hbCBmcm9tIFwiLi9yZXNjaGVkdWxlLXNpZ25hbC5qc1wiXG5pbXBvcnQge1xuICBjYW5jZWxTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iLFxuICBlbnF1ZXVlQmFja2dyb3VuZEpvYixcbiAgZ2V0U2NoZWR1bGVkQmFja2dyb3VuZEpvYixcbiAgcmVwbGFjZVNjaGVkdWxlZEJhY2tncm91bmRKb2IsXG4gIHdha2VTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iXG59IGZyb20gXCIuL3J1bnRpbWUuanNcIlxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGJhY2tncm91bmQgam9icy5cbiAqXG4gKiBgVEFyZ3NgIGlzIHRoZSB0dXBsZSBvZiBhcmd1bWVudHMgdGhlIHN1YmNsYXNzJ3MgYHBlcmZvcm1gIGFjY2VwdHMsIHNvIGEgam9iIHRoYXRcbiAqIG5lZWRzIGFyZ3VtZW50cyBkZWNsYXJlcyB0aGVtIGFzIHJlcXVpcmVkIGFuZCB0eXBlZCDigJQgZm9yIGV4YW1wbGVcbiAqIGBjbGFzcyBSdW5CdWlsZEpvYiBleHRlbmRzIFZlbG9jaW91c0pvYjxbc3RyaW5nXT5gIHdpdGggYGFzeW5jIHBlcmZvcm0oYnVpbGRJZClgLlxuICogVGhlIGRlZmF1bHQgZW1wdHkgdHVwbGUga2VlcHMgYXJndW1lbnQtbGVzcyBqb2JzIChgZXh0ZW5kcyBWZWxvY2lvdXNKb2JgLFxuICogYGFzeW5jIHBlcmZvcm0oKWApIHdvcmtpbmcgdW5jaGFuZ2VkLlxuICogQHRlbXBsYXRlIHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFtUQXJncz1bXV1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzSm9iIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JDb250ZXh0IHwgdW5kZWZpbmVkfSAqL1xuICAgIHRoaXMuX2JhY2tncm91bmRKb2JDb250ZXh0ID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogRGF0YWJhc2UgaWRlbnRpZmllcnMgY2hlY2tlZCBvdXQgd2hpbGUgdGhpcyBqb2IgcGVyZm9ybXMuIFNldCBhbiBleHBsaWNpdFxuICAgKiBsaXN0IHRvIGF2b2lkIGhvbGRpbmcgdW5yZWxhdGVkIGNvbmZpZ3VyZWQgZGF0YWJhc2UgY29ubmVjdGlvbnMsIG9yIGBbXWBcbiAgICogd2hlbiB0aGUgam9iIGVzdGFibGlzaGVzIGFueSBjb25uZWN0aW9ucyBpdCBuZWVkcyBpdHNlbGYuIExlZnQgdW5kZWZpbmVkLFxuICAgKiBqb2JzIHJldGFpbiB0aGUgZXhpc3RpbmcgYmVoYXZpb3Igb2YgY2hlY2tpbmcgb3V0IGV2ZXJ5IGFjdGl2ZSBkYXRhYmFzZS5cbiAgICogQHR5cGUge3N0cmluZ1tdIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgc3RhdGljIGRhdGFiYXNlSWRlbnRpZmllcnMgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogUXVldWUgdGhpcyBqb2IgY2xhc3MgcnVucyBvbi4gU3ViY2xhc3NlcyBzZXQgZS5nLiBgc3RhdGljIHF1ZXVlID0gXCJidWlsZHNcImBcbiAgICogdG8gcm91dGUgb250byBhIHF1ZXVlIHdpdGggaXRzIG93biBjbHVzdGVyLXdpZGUgY29uY3VycmVuY3kgY2FwIChjb25maWd1cmVkXG4gICAqIHZpYSBgYmFja2dyb3VuZEpvYnMucXVldWVzYCkuIFRoZSBge3F1ZXVlfWAgZW5xdWV1ZSBvcHRpb24gb3ZlcnJpZGVzIGl0LlxuICAgKiBMZWZ0IHVuZGVmaW5lZCwgam9icyBydW4gb24gdGhlIGBcImRlZmF1bHRcImAgcXVldWUuXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgcXVldWUgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogT3B0aW9uYWwgcHJvY2VzcyB0aXRsZSBzaG93biBmb3IgdGhlIHJ1bm5lciB3aGlsZSB0aGlzIGpvYiBleGVjdXRlcy5cbiAgICogVmVsb2Npb3VzIHNldHMgYHByb2Nlc3MudGl0bGVgIHRvIHRoaXMgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgam9iIOKAlCBzb1xuICAgKiBgcHNgL2B0b3BgL2BodG9wYCBpZGVudGlmeSB3aGF0IGEgcnVubmVyIGlzIGRvaW5nIOKAlCBhbmQgcmVzdG9yZXMgdGhlXG4gICAqIHJ1bm5lcidzIGJhc2UgdGl0bGUgd2hlbiB0aGUgam9iIGZpbmlzaGVzLiBMZWZ0IHVuZGVmaW5lZCwgdGhlIHJ1bm5lciBmYWxsc1xuICAgKiBiYWNrIHRvIGB2ZWxvY2lvdXMgam9iLXJ1bm5lcjogPEpvYk5hbWU+YC4gU2V0IGUuZy5cbiAgICogYHN0YXRpYyBwcm9jZXNzVGl0bGUgPSBcInZlbG9jaW91cyBtZWRpYSB0cmFuc2NvZGVyXCJgIHRvIGdpdmUgYSBqb2IgYVxuICAgKiBjdXN0b20sIGh1bWFuLXJlYWRhYmxlIHRpdGxlLlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgc3RhdGljIHByb2Nlc3NUaXRsZSA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBXYWxsLWNsb2NrIGJvdW5kIHRoaXMgam9iIGNsYXNzIHJ1bnMgdW5kZXIsIGluIG1zLiBTZXQgZS5nLlxuICAgKiBgc3RhdGljIHRpbWVvdXRNcyA9IDYwICogNjAgKiAxMDAwYCBvbiBhIGpvYiB3aG9zZSB3b3JrIGxlZ2l0aW1hdGVseSB0YWtlc1xuICAgKiBob3VycyBzbyBpdHMgdHlwZSBjYXJyaWVzIGl0cyBvd24gYm91bmQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIG9uZSBnbG9iYWxcbiAgICogYGJhY2tncm91bmRKb2JzLmpvYlRpbWVvdXRNc2AgdHVuZWQgZm9yIHRoZSBzbG93ZXN0IGpvYiBpbiB0aGUgc3lzdGVtLiBUaGVcbiAgICogYHt0aW1lb3V0TXN9YCBlbnF1ZXVlIG9wdGlvbiBvdmVycmlkZXMgaXQuIEEgbm9uLXBvc2l0aXZlIHZhbHVlIGRpc2FibGVzIHRoZVxuICAgKiBib3VuZCBmb3IgdGhpcyBjbGFzcy4gTGVmdCB1bmRlZmluZWQsIHRoZSB3b3JrZXItbGV2ZWwgdmFsdWUgYXBwbGllcy5cbiAgICogQHR5cGUge251bWJlciB8IHVuZGVmaW5lZH1cbiAgICovXG4gIHN0YXRpYyB0aW1lb3V0TXMgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogU3RvcHMgdGhpcyBwZXJmb3JtYW5jZSBhbmQgcmVzY2hlZHVsZXMgdGhlIHNhbWUgbG9naWNhbCBqb2Igcm93LiBUaGlzIGlzXG4gICAqIG5vcm1hbCBjb250cm9sIGZsb3c6IGl0IGRvZXMgbm90IGNvdW50IGFzIGEgZmFpbHVyZSBvciBjb25zdW1lIGEgcmV0cnkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheU1zIC0gTm9uLW5lZ2F0aXZlIHNhZmUtaW50ZWdlciBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gICAqIEByZXR1cm5zIHtuZXZlcn0gLSBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zLlxuICAgKi9cbiAgcmVzY2hlZHVsZUluKGRlbGF5TXMpIHtcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGRlbGF5TXMpIHx8IGRlbGF5TXMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYmFja2dyb3VuZCBqb2IgcmVzY2hlZHVsZSBkZWxheU1zIG11c3QgYmUgYSBub24tbmVnYXRpdmUgc2FmZSBpbnRlZ2VyXCIpXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEJhY2tncm91bmRKb2JSZXNjaGVkdWxlU2lnbmFsKGRlbGF5TXMpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBqb2IgbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBKb2IgbmFtZS5cbiAgICovXG4gIHN0YXRpYyBqb2JOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWVcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2xkcyB0aGlzIGpvYiBjbGFzcydzIHN0YXRpYyBgcXVldWVgIGludG8gdGhlIGVucXVldWUgb3B0aW9ucyB1bmxlc3MgdGhlXG4gICAqIGNhbGxlciBhbHJlYWR5IHNwZWNpZmllZCBvbmUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9ucyB8IHVuZGVmaW5lZH0gb3B0aW9ucyAtIEpvYiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc30gLSBPcHRpb25zIGluY2x1ZGluZyB0aGUgcmVzb2x2ZWQgcXVldWUuXG4gICAqL1xuICBzdGF0aWMgX3dpdGhRdWV1ZShvcHRpb25zKSB7XG4gICAgY29uc3QgbWVyZ2VkID0gb3B0aW9ucyA/IHsuLi5vcHRpb25zfSA6IHt9XG5cbiAgICBpZiAobWVyZ2VkLnF1ZXVlID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHRoaXMucXVldWUgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBtZXJnZWQucXVldWUgPSB0aGlzLnF1ZXVlXG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZFxuICB9XG5cbiAgLyoqXG4gICAqIEZvbGRzIHRoaXMgam9iIGNsYXNzJ3Mgc3RhdGljIGB0aW1lb3V0TXNgIGludG8gdGhlIGVucXVldWUgb3B0aW9ucyB1bmxlc3MgdGhlXG4gICAqIGNhbGxlciBhbHJlYWR5IHNwZWNpZmllZCBvbmUsIHNvIGEgam9iIHR5cGUgY2FycmllcyBpdHMgb3duIHdhbGwtY2xvY2sgYm91bmRcbiAgICogaW5zdGVhZCBvZiBldmVyeSBqb2Igc2hhcmluZyBvbmUgd29ya2VyLWxldmVsIHZhbHVlLiBBIGNsYXNzIHRoYXQgZGVjbGFyZXNcbiAgICogbm90aGluZyBsZWF2ZXMgdGhlIG9wdGlvbiBhYnNlbnQsIGFuZCB0aGUgd29ya2VyIGZhbGxzIGJhY2sgdG8gaXRzIG93blxuICAgKiBkZWZhdWx0IOKAlCB0aGUgcHJpb3IgYmVoYXZpb3IuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9ucyB8IHVuZGVmaW5lZH0gb3B0aW9ucyAtIEpvYiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc30gLSBPcHRpb25zIGluY2x1ZGluZyB0aGUgcmVzb2x2ZWQgdGltZW91dC5cbiAgICovXG4gIHN0YXRpYyBfd2l0aFRpbWVvdXQob3B0aW9ucykge1xuICAgIGNvbnN0IG1lcmdlZCA9IG9wdGlvbnMgPyB7Li4ub3B0aW9uc30gOiB7fVxuXG4gICAgaWYgKG1lcmdlZC50aW1lb3V0TXMgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdGhpcy50aW1lb3V0TXMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG1lcmdlZC50aW1lb3V0TXMgPSB0aGlzLnRpbWVvdXRNc1xuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBjbGFzcy1kZXJpdmVkIGVucXVldWUgb3B0aW9ucyBvbiBhIGh5ZHJhdGVkIGpvYiBpbnN0YW5jZS4gRXhwbGljaXRcbiAgICogcGVyLWVucXVldWUgb3B0aW9ucyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgaW5zdGFuY2UgY29uY3VycmVuY3kga2V5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEpvYiBjb250ZXh0LlxuICAgKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5qb2JBcmdzIC0gSm9iIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JPcHRpb25zIHwgdW5kZWZpbmVkfSBhcmdzLmpvYk9wdGlvbnMgLSBKb2Igb3B0aW9ucy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9IC0gUmVzb2x2ZWQgam9iIG9wdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgX3dpdGhKb2JDb250ZXh0KHtqb2JBcmdzLCBqb2JPcHRpb25zfSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl93aXRoVGltZW91dCh0aGlzLl93aXRoUXVldWUoam9iT3B0aW9ucykpXG5cbiAgICBpZiAob3B0aW9ucy5jb25jdXJyZW5jeUtleSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gb3B0aW9uc1xuXG4gICAgY29uc3Qgam9iSW5zdGFuY2UgPSBuZXcgdGhpcygpXG4gICAgam9iSW5zdGFuY2UuX3NldEJhY2tncm91bmRKb2JDb250ZXh0KHtcbiAgICAgIGFyZ3M6IGpvYkFyZ3MsXG4gICAgICBqb2JDbGFzczogdGhpcyxcbiAgICAgIGpvYk5hbWU6IHRoaXMuam9iTmFtZSgpLFxuICAgICAgb3B0aW9uc1xuICAgIH0pXG4gICAgY29uc3QgY29uY3VycmVuY3lLZXkgPSBqb2JJbnN0YW5jZS5jb25jdXJyZW5jeUtleSgpXG5cbiAgICBpZiAoY29uY3VycmVuY3lLZXkgIT09IHVuZGVmaW5lZCkgb3B0aW9ucy5jb25jdXJyZW5jeUtleSA9IGNvbmN1cnJlbmN5S2V5XG5cbiAgICByZXR1cm4gb3B0aW9uc1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvbXBsZXRlIGNvbnRleHQgYXZhaWxhYmxlIHRvIHRoaXMgaHlkcmF0ZWQgam9iIGluc3RhbmNlLlxuICAgKiBGcmFtZXdvcmsgZW5xdWV1ZS9ydW5uZXIgYm91bmRhcmllcyBvd24gdGhpcyBtZXRob2QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iQ29udGV4dH0gY29udGV4dCAtIEpvYiBjb250ZXh0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zZXRCYWNrZ3JvdW5kSm9iQ29udGV4dChjb250ZXh0KSB7XG4gICAgdGhpcy5fYmFja2dyb3VuZEpvYkNvbnRleHQgPSBjb250ZXh0XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGlzIGh5ZHJhdGVkIGpvYidzIGNvbXBsZXRlIGVucXVldWUgb3IgcnVubmVyIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JDb250ZXh0fSAtIEpvYiBjb250ZXh0LlxuICAgKi9cbiAgYmFja2dyb3VuZEpvYkNvbnRleHQoKSB7XG4gICAgaWYgKCF0aGlzLl9iYWNrZ3JvdW5kSm9iQ29udGV4dCkgdGhyb3cgbmV3IEVycm9yKFwiQmFja2dyb3VuZCBqb2IgY29udGV4dCBpcyBub3QgaHlkcmF0ZWRcIilcblxuICAgIHJldHVybiB0aGlzLl9iYWNrZ3JvdW5kSm9iQ29udGV4dFxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRvIGRlcml2ZSBhIGR1cmFibGUgY29uY3VycmVuY3kga2V5IGZyb20gYGJhY2tncm91bmRKb2JDb250ZXh0KClgLlxuICAgKiBQYWlyIHRoZSBkZXJpdmVkIGtleSB3aXRoIGBtYXhDb25jdXJyZW5jeWAgaW4gZW5xdWV1ZSBvcHRpb25zLiBBbiBleHBsaWNpdFxuICAgKiBwZXItZW5xdWV1ZSBgY29uY3VycmVuY3lLZXlgIHRha2VzIHByZWNlZGVuY2UgYW5kIHNraXBzIHRoaXMgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIERlcml2ZWQgY29uY3VycmVuY3kga2V5LCBvciB1bmRlZmluZWQgZm9yIG5vbmUuXG4gICAqL1xuICBjb25jdXJyZW5jeUtleSgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUnVucyBwZXJmb3JtIGxhdGVyLlxuICAgKiBAcGFyYW0gey4uLlJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzIC0gSm9iIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gSm9iIGlkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHBlcmZvcm1MYXRlciguLi5hcmdzKSB7XG4gICAgY29uc3Qge2pvYkFyZ3MsIGpvYk9wdGlvbnN9ID0gdGhpcy5fc3BsaXRBcmdzQW5kT3B0aW9ucyhhcmdzKVxuICAgIHJldHVybiBhd2FpdCBlbnF1ZXVlQmFja2dyb3VuZEpvYih7Sm9iQ2xhc3M6IHRoaXMsIGpvYkFyZ3MsIGpvYk9wdGlvbnN9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcGVyZm9ybSBsYXRlciB3aXRoIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MuYXJncyAtIEpvYiBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9IFthcmdzLm9wdGlvbnNdIC0gSm9iIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gSm9iIGlkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHBlcmZvcm1MYXRlcldpdGhPcHRpb25zKHthcmdzLCBvcHRpb25zfSkge1xuICAgIHJldHVybiBhd2FpdCBlbnF1ZXVlQmFja2dyb3VuZEpvYih7Sm9iQ2xhc3M6IHRoaXMsIGpvYkFyZ3M6IGFyZ3MsIGpvYk9wdGlvbnM6IG9wdGlvbnN9KVxuICB9XG5cbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgcmVwbGFjZXMgdGhpcyBqb2IgY2xhc3MncyBxdWV1ZWQgb3duZXIgZm9yIGEgc3RhYmxlIHNjaGVkdWxlIGtleS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zY2hlZHVsZUtleSAtIFN0YWJsZSBsb2dpY2FsIHNjaGVkdWxlIGtleS5cbiAgICogQHBhcmFtIHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MuYXJncyAtIEpvYiBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9IFthcmdzLm9wdGlvbnNdIC0gSm9iIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYlJlcGxhY2VtZW50UmVzdWx0Pn0gLSBSZXBsYWNlbWVudCByZXN1bHQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVwbGFjZVNjaGVkdWxlZCh7c2NoZWR1bGVLZXksIGFyZ3MsIG9wdGlvbnN9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlcGxhY2VTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iKHtKb2JDbGFzczogdGhpcywgc2NoZWR1bGVLZXksIGpvYkFyZ3M6IGFyZ3MsIGpvYk9wdGlvbnM6IG9wdGlvbnN9KVxuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgb3IgZGV0YWNoZXMgdGhlIGN1cnJlbnQgb3duZXIgb2YgYSBzdGFibGUgc2NoZWR1bGUga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZWR1bGVLZXkgLSBTdGFibGUgbG9naWNhbCBzY2hlZHVsZSBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYkNhbmNlbGxhdGlvblJlc3VsdD59IC0gQ2FuY2VsbGF0aW9uIHJlc3VsdC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBjYW5jZWxTY2hlZHVsZWQoc2NoZWR1bGVLZXkpIHtcbiAgICByZXR1cm4gYXdhaXQgY2FuY2VsU2NoZWR1bGVkQmFja2dyb3VuZEpvYihzY2hlZHVsZUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBjdXJyZW50IG93bmVyc2hpcCBhbmQgb3B0aW9uYWwgdGVybWluYWwgaGlzdG9yeSBmb3IgYSBzdGFibGUga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZWR1bGVLZXkgLSBTdGFibGUgbG9naWNhbCBzY2hlZHVsZSBrZXkuXG4gICAqIEBwYXJhbSB7e2luY2x1ZGVMYXRlc3RUZXJtaW5hbD86IGJvb2xlYW59fSBbb3B0aW9uc10gLSBMb29rdXAgb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iU2NoZWR1bGVkTG9va3VwUmVzdWx0Pn0gLSBOb3JtYWxpemVkIHN0YWJsZSBzY2hlZHVsZSBqb2JzLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldFNjaGVkdWxlZEpvYihzY2hlZHVsZUtleSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IGdldFNjaGVkdWxlZEJhY2tncm91bmRKb2Ioc2NoZWR1bGVLZXksIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogRXhwZWRpdGVzIGEgZnV0dXJlIHF1ZXVlZCBvd25lciB3aXRob3V0IGNyZWF0aW5nIGFub3RoZXIgam9iLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NoZWR1bGVLZXkgLSBTdGFibGUgbG9naWNhbCBzY2hlZHVsZSBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYldha2VSZXN1bHQ+fSAtIFdha2UgcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHdha2VTY2hlZHVsZWQoc2NoZWR1bGVLZXkpIHtcbiAgICByZXR1cm4gYXdhaXQgd2FrZVNjaGVkdWxlZEJhY2tncm91bmRKb2Ioc2NoZWR1bGVLZXkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzcGxpdCBhcmdzIGFuZCBvcHRpb25zLlxuICAgKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncyAtIEpvYiBhcmdzLlxuICAgKiBAcmV0dXJucyB7e2pvYkFyZ3M6IEFycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Piwgam9iT3B0aW9uczogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc319IC0gU3BsaXQgYXJncyBhbmQgb3B0aW9ucy5cbiAgICovXG4gIHN0YXRpYyBfc3BsaXRBcmdzQW5kT3B0aW9ucyhhcmdzKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4ge2pvYkFyZ3M6IFtdLCBqb2JPcHRpb25zOiB7fX1cbiAgICB9XG5cbiAgICBjb25zdCBsYXN0QXJnID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdXG4gICAgY29uc3QgaXNPcHRpb25zQXJnID0gbGFzdEFyZyAmJiB0eXBlb2YgbGFzdEFyZyA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShsYXN0QXJnKSAmJiBcImpvYk9wdGlvbnNcIiBpbiBsYXN0QXJnXG5cbiAgICBpZiAoaXNPcHRpb25zQXJnKSB7XG4gICAgICBjb25zdCB7am9iT3B0aW9uc30gPSAvKiogQHR5cGUge3tqb2JPcHRpb25zOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JPcHRpb25zfX0gKi8gKGxhc3RBcmcpXG4gICAgICByZXR1cm4ge2pvYkFyZ3M6IGFyZ3Muc2xpY2UoMCwgLTEpLCBqb2JPcHRpb25zOiBqb2JPcHRpb25zIHx8IHt9fVxuICAgIH1cblxuICAgIHJldHVybiB7am9iQXJnczogYXJncywgam9iT3B0aW9uczoge319XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgaW4gc3ViY2xhc3Nlcy5cbiAgICogQHBhcmFtIHtUQXJnc30gX2FyZ3MgLSBKb2IgYXJncyAodGhlIHR1cGxlIHRoaXMgam9iIGNsYXNzIHdhcyBwYXJhbWV0ZXJpemVkIHdpdGgpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgcGVyZm9ybSguLi5fYXJncykge1xuICAgIHRocm93IG5ldyBFcnJvcihcInBlcmZvcm0gbm90IGltcGxlbWVudGVkXCIpXG4gIH1cbn1cbiJdfQ==
|
|
@@ -464,7 +464,7 @@ export type BackgroundJobOptions = {
|
|
|
464
464
|
*/
|
|
465
465
|
scheduledAtMs?: number;
|
|
466
466
|
/**
|
|
467
|
-
* - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
|
|
467
|
+
* - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides a job class's `static timeoutMs` and the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
|
|
468
468
|
*/
|
|
469
469
|
timeoutMs?: number;
|
|
470
470
|
};
|
|
@@ -1047,7 +1047,7 @@ export type BackgroundJobSocketMessage = BackgroundJobHelloMessage | BackgroundJ
|
|
|
1047
1047
|
* @property {boolean} [deduplicateWhileQueued] - When true, skip the enqueue if an identical still-queued job (same job name, args and queue) is scheduled no later than this enqueue, returning the earliest matching job's id. A future retry does not suppress earlier work. Deduplication is independent of `concurrencyKey`, so the job keeps its normal (e.g. queue-derived) concurrency cap. Keeps an interval-scheduled recurring job (e.g. retention pruning) from piling up redundant queued rows when it runs slower than its interval or no worker is free.
|
|
1048
1048
|
* @property {string} [idempotencyKey] - Durable enqueue identity scoped to the resolved job class name and queue. Exact replay returns the original job id across every state and after job pruning; reuse with different canonical arguments or behavior-affecting options fails. Ownership is independent of `deduplicateWhileQueued` and is retained until an explicit future retention policy removes it.
|
|
1049
1049
|
* @property {number} [scheduledAtMs] - Epoch timestamp in milliseconds when the job becomes eligible for dispatch. Defaults to enqueue time.
|
|
1050
|
-
* @property {number} [timeoutMs] - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
|
|
1050
|
+
* @property {number} [timeoutMs] - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides a job class's `static timeoutMs` and the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
|
|
1051
1051
|
*/
|
|
1052
1052
|
/**
|
|
1053
1053
|
* @typedef {object} BackgroundJobPayload
|
|
@@ -174,7 +174,7 @@
|
|
|
174
174
|
* @property {boolean} [deduplicateWhileQueued] - When true, skip the enqueue if an identical still-queued job (same job name, args and queue) is scheduled no later than this enqueue, returning the earliest matching job's id. A future retry does not suppress earlier work. Deduplication is independent of `concurrencyKey`, so the job keeps its normal (e.g. queue-derived) concurrency cap. Keeps an interval-scheduled recurring job (e.g. retention pruning) from piling up redundant queued rows when it runs slower than its interval or no worker is free.
|
|
175
175
|
* @property {string} [idempotencyKey] - Durable enqueue identity scoped to the resolved job class name and queue. Exact replay returns the original job id across every state and after job pruning; reuse with different canonical arguments or behavior-affecting options fails. Ownership is independent of `deduplicateWhileQueued` and is retained until an explicit future retention policy removes it.
|
|
176
176
|
* @property {number} [scheduledAtMs] - Epoch timestamp in milliseconds when the job becomes eligible for dispatch. Defaults to enqueue time.
|
|
177
|
-
* @property {number} [timeoutMs] - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
|
|
177
|
+
* @property {number} [timeoutMs] - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides a job class's `static timeoutMs` and the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
|
|
178
178
|
*/
|
|
179
179
|
/**
|
|
180
180
|
* @typedef {object} BackgroundJobPayload
|
|
@@ -303,4 +303,4 @@
|
|
|
303
303
|
* @typedef {BackgroundJobHelloMessage | BackgroundJobGenerationAcceptedMessage | BackgroundJobGenerationRejectedMessage | BackgroundJobReadyMessage | BackgroundJobDrainingMessage | BackgroundJobHeartbeatMessage | BackgroundJobEnqueueMessage | BackgroundJobEnqueuedMessage | BackgroundJobEnqueueErrorMessage | BackgroundJobReplaceScheduledMessage | BackgroundJobScheduleReplacedMessage | BackgroundJobReplaceScheduledErrorMessage | BackgroundJobCancelScheduledMessage | BackgroundJobScheduleCancelledMessage | BackgroundJobCancelScheduledErrorMessage | BackgroundJobGetScheduledMessage | BackgroundJobScheduledMessage | BackgroundJobGetScheduledErrorMessage | BackgroundJobWakeScheduledMessage | BackgroundJobScheduleWokenMessage | BackgroundJobWakeScheduledErrorMessage | BackgroundJobJobMessage | BackgroundJobAcceptedMessage | BackgroundJobCompleteMessage | BackgroundJobFailedMessage | BackgroundJobRescheduleMessage | BackgroundJobUpdatedMessage | BackgroundJobUpdateErrorMessage} BackgroundJobSocketMessage
|
|
304
304
|
*/
|
|
305
305
|
export const nothing = {};
|
|
306
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFja2dyb3VuZC1qb2JzL3R5cGVzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7R0FFRztBQUNILHlGQUF5RjtBQUN6RixpSUFBaUk7QUFDakksNk5BQTZOO0FBQzdOLG1FQUFtRTtBQUNuRSwrRkFBK0Y7QUFDL0YsNkZBQTZGO0FBQzdGLG1HQUFtRztBQUNuRyxnRkFBZ0Y7QUFDaEYsdVBBQXVQO0FBQ3ZQOzs7R0FHRztBQUNILHdGQUF3RjtBQUN4Rjs7Ozs7Ozs7R0FRRztBQUNIOzs7Ozs7O0dBT0c7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0g7Ozs7Ozs7Ozs7R0FVRztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSDs7Ozs7R0FLRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7Ozs7OztHQU9HO0FBQ0g7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0g7OztHQUdHO0FBQ0g7Ozs7Ozs7R0FPRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7OztHQU1HO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7Ozs7Ozs7Ozs7R0FXRztBQUNIOzs7Ozs7Ozs7R0FTRztBQUNIOzs7Ozs7O0dBT0c7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSDs7R0FFRztBQUNIOzs7OztHQUtHO0FBQ0g7O0dBRUc7QUFDSDs7OztHQUlHO0FBQ0g7Ozs7R0FJRztBQUNIOztHQUVHO0FBQ0g7Ozs7R0FJRztBQUNIOzs7Ozs7Ozs7OztHQVdHO0FBQ0g7O0dBRUc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSDs7R0FFRztBQUVILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAdHlwZWRlZiB7XCJpbmxpbmVcIiB8IFwiZm9ya2VkXCIgfCBcInBvb2xlZFwiIHwgXCJzcGF3bmVkXCJ9IEJhY2tncm91bmRKb2JFeGVjdXRpb25Nb2RlXG4gKi9cbi8qKiBAdHlwZWRlZiB7XCJjYW5kaWRhdGVcIiB8IFwiYWN0aXZlXCIgfCBcInJldGlyZWRcIn0gQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uSW5pdGlhbFN0YXRlICovXG4vKiogQHR5cGVkZWYge1wic3RhcnRpbmdcIiB8IFwiY2FuZGlkYXRlXCIgfCBcImFjdGl2ZVwiIHwgXCJyZXRpcmluZ1wiIHwgXCJyZXRpcmVkXCIgfCBcInN0b3BwZWRcIn0gQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uTGlmZWN5Y2xlU3RhdGUgKi9cbi8qKiBAdHlwZWRlZiB7XCJtaXNzaW5nLWdlbmVyYXRpb25cIiB8IFwidW5leHBlY3RlZC1nZW5lcmF0aW9uXCIgfCBcIm1hbGZvcm1lZC1nZW5lcmF0aW9uXCIgfCBcImdlbmVyYXRpb24tbWlzbWF0Y2hcIiB8IFwid29ya2VyLWFkbWlzc2lvbi1yZXRpcmVkXCIgfCBcIndvcmtlci1oYXMtbm8tcmVjb3ZlcmFibGUtaGFuZG9mZnNcIn0gQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uUmVqZWN0aW9uUmVhc29uICovXG4vKiogQHR5cGVkZWYge1wicXVldWVkXCIgfCBcImhhbmRlZF9vZmZcIn0gQmFja2dyb3VuZEpvYkFjdGl2ZVN0YXR1cyAqL1xuLyoqIEB0eXBlZGVmIHtcImNhbmNlbGxlZFwiIHwgXCJjb21wbGV0ZWRcIiB8IFwiZmFpbGVkXCIgfCBcIm9ycGhhbmVkXCJ9IEJhY2tncm91bmRKb2JUZXJtaW5hbFN0YXR1cyAqL1xuLyoqIEB0eXBlZGVmIHtCYWNrZ3JvdW5kSm9iQWN0aXZlU3RhdHVzIHwgQmFja2dyb3VuZEpvYlRlcm1pbmFsU3RhdHVzfSBCYWNrZ3JvdW5kSm9iU3RhdHVzICovXG4vKiogQHR5cGVkZWYge1wiZXhpdFwiIHwgXCJwcm9jZXNzLWVycm9yXCIgfCBcImlwYy1zZW5kXCIgfCBcImNoaWxkLXNpbGVuY2VcIn0gUG9vbGVkUnVubmVyRmFpbHVyZU9yaWdpbiAqL1xuLyoqIEB0eXBlZGVmIHtcInN0YXJ0aW5nXCIgfCBcInJ1bm5pbmdcIiB8IFwicmV0aXJpbmdcIn0gUG9vbGVkUnVubmVyTGlmZWN5Y2xlU3RhdGUgKi9cbi8qKiBAdHlwZWRlZiB7XCJwYXJlbnRfcmV0aXJlX2RyYWluZWRcIiB8IFwiam9iX3RpbWVvdXRcIiB8IFwid29ya2VyX3N0b3BcIiB8IFwiY2hpbGRfc2lsZW5jZVwiIHwgXCJzaWduYWxfc2lndGVybVwiIHwgXCJzaWduYWxfc2lnaW50XCIgfCBcInNpZ25hbF9zaWdraWxsXCIgfCBcInNpZ25hbF9vdGhlclwiIHwgXCJpcGNfZGlzY29ubmVjdFwiIHwgXCJwcm9jZXNzX2Vycm9yXCIgfCBcInVuZXhwZWN0ZWRfZXhpdFwifSBQb29sZWRDaGlsZFNodXRkb3duUmVhc29uICovXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBQb29sZWRDaGlsZFNodXRkb3duUmVhc29uIGZvciBleGFjdCBzaHV0ZG93biBwcm92ZW5hbmNlLlxuICogQHR5cGVkZWYge1widW5leHBlY3RlZFwiIHwgXCJqb2ItdGltZW91dFwiIHwgXCJ3b3JrZXItc2h1dGRvd24tdGltZW91dFwifSBQb29sZWRSdW5uZXJUZXJtaW5hdGlvblJlYXNvblxuICovXG4vKiogQHR5cGVkZWYge1wicnVubmluZ1wiIHwgXCJyZXRpcmluZ1wiIHwgXCJzdG9wcGluZ1wifSBCYWNrZ3JvdW5kSm9ic1dvcmtlckxpZmVjeWNsZVN0YXRlICovXG4vKipcbiAqIEV4YWN0IGR1cmFibGUgaGFuZG9mZiBvd25lcnNoaXAgY2FycmllZCBieSBhbiBleGVjdXRpbmcgam9iIHdoZW4gaXQgcHJvZHVjZXNcbiAqIGZvbGxvdy11cCB3b3JrLlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYlByb2R1Y2VyUHJvb2ZcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBqb2JJZCAtIFByb2R1Y2luZyBqb2IgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaGFuZG9mZklkIC0gUHJvZHVjaW5nIGhhbmRvZmYgbGVhc2UgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd29ya2VySWQgLSBXb3JrZXIgaWRlbnRpdHkgcGVyc2lzdGVkIHdpdGggdGhlIGhhbmRvZmYuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaGFuZGVkT2ZmQXRNcyAtIER1cmFibGUgaGFuZG9mZiB0aW1lc3RhbXAuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUG9vbGVkUnVubmVyQWN0aXZlSm9iXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGhhbmRvZmZJZCAtIER1cmFibGUgaGFuZG9mZiBsZWFzZSBpZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gaGFuZGVkT2ZmQXRNcyAtIER1cmFibGUgaGFuZG9mZiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gam9iSWQgLSBEdXJhYmxlIGJhY2tncm91bmQgam9iIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYk5hbWUgLSBSZWdpc3RlcmVkIGpvYiBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHdvcmtlcklkIC0gV29ya2VyIGlkZW50aXR5IHBlcnNpc3RlZCB3aXRoIHRoZSBoYW5kb2ZmLlxuICovXG4vKipcbiAqIE9uZSBwcm9jZXNzLWZhaWx1cmUgc25hcHNob3Qgc2hhcmVkIGJ5IGV2ZXJ5IGpvYiBsb3N0IHdpdGggYSBwb29sZWQgY2hpbGQuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQb29sZWRSdW5uZXJGYWlsdXJlXG4gKiBAcHJvcGVydHkge1Bvb2xlZFJ1bm5lckFjdGl2ZUpvYltdfSBhY3RpdmVKb2JzIC0gSm9icyB0aGF0IHdlcmUgaW4gZmxpZ2h0IHdoZW4gdGhlIGNoaWxkIGZhaWxlZCwgb3JkZXJlZCBieSBqb2IgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGNoaWxkSW5zdGFuY2VJZCAtIFN0YWJsZSBwb29sZWQtY2hpbGQgaWRlbnRpdHkgd2hlbiBpdHMgc3RhcnR1cCBvciBzaHV0ZG93biBvYnNlcnZhdGlvbiBhcnJpdmVkLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBleGl0Q29kZSAtIENoaWxkIGV4aXQgY29kZSwgb3IgbnVsbCBmb3Igc2lnbmFsL3Byb2Nlc3MgZXJyb3JzLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBnZW5lcmF0aW9uSWQgLSBSZWxlYXNlIGdlbmVyYXRpb24gaWRlbnRpdHksIG9yIG51bGwgaW4gbGVnYWN5IG1vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBpbmZsaWdodEpvYklkcyAtIEJvdW5kZWQgam9iIGlkcyBpbiBmbGlnaHQgd2hlbiBmYWlsdXJlIGhhbmRsaW5nIHN0YXJ0ZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5mbGlnaHRKb2JJZHNUcnVuY2F0ZWRDb3VudCAtIEluLWZsaWdodCBpZHMgb21pdHRlZCBmcm9tIHRoZSBib3VuZGVkIHNuYXBzaG90LlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gb29tS2lsbGVkIC0gRmFsc2Ugd2hlbiB0aGUgb2JzZXJ2ZWQgZXhpdCBydWxlcyBPT00gb3V0OyBudWxsIHdoZW4gYW4gdW5leHBlY3RlZCBTSUdLSUxMIGNhbm5vdCBiZSBkaXN0aW5ndWlzaGVkIGZyb20gYW4gT09NIGtpbGwgd2l0aG91dCBzdXBlcnZpc29yL2tlcm5lbCBldmlkZW5jZS5cbiAqIEBwcm9wZXJ0eSB7UG9vbGVkUnVubmVyRmFpbHVyZU9yaWdpbn0gb3JpZ2luIC0gV29ya2VyIG9ic2VydmF0aW9uIHRoYXQgaW5pdGlhdGVkIGZhaWx1cmUgaGFuZGxpbmcuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcnVubmVyQWdlTXMgLSBDaGlsZCBhZ2Ugd2hlbiBmYWlsdXJlIGhhbmRsaW5nIHN0YXJ0ZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcnVubmVyQ3JlYXRlZEF0TXMgLSBDaGlsZCBjcmVhdGlvbiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJ1bm5lckRldGFjaGVkIC0gV2hldGhlciB0aGUgcnVubmVyIG93bmVkIGEgZGV0YWNoZWQgcHJvY2VzcyBncm91cC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBydW5uZXJKb2JzUnVuIC0gUHJldmlvdXNseSBhY2tub3dsZWRnZWQgam9icyBoYW5kbGVkIGJ5IHRoZSBjaGlsZC5cbiAqIEBwcm9wZXJ0eSB7UG9vbGVkUnVubmVyTGlmZWN5Y2xlU3RhdGV9IHJ1bm5lckxpZmVjeWNsZSAtIENoaWxkIGxpZmVjeWNsZSBpbW1lZGlhdGVseSBiZWZvcmUgcmVjb3ZlcnkuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHJ1bm5lclBpZCAtIENoaWxkIHByb2Nlc3MgaWQgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKS5DaGlsZFByb2Nlc3NbXCJzaWduYWxDb2RlXCJdfSBzaWduYWwgLSBDaGlsZCB0ZXJtaW5hdGlvbiBzaWduYWwgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHNodXRkb3duT2JzZXJ2ZWRBdE1zIC0gVGltZSB0aGUgY2hpbGQgb3IgcGFyZW50IG9ic2VydmVkIHNodXRkb3duIGJlZ2lubmluZy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gc2h1dGRvd25SZXF1ZXN0ZWRBdE1zIC0gRXhhY3QgcGFyZW50IHJlcXVlc3QgdGltZXN0YW1wLCBvciBudWxsIGZvciBleHRlcm5hbC91bnJlcXVlc3RlZCBzaHV0ZG93bi5cbiAqIEBwcm9wZXJ0eSB7UG9vbGVkQ2hpbGRTaHV0ZG93blJlYXNvbn0gc2h1dGRvd25SZWFzb24gLSBFeGFjdCByZWNvcmRlZCBwYXJlbnQgcmVxdWVzdCBvciBvYnNlcnZlZCBjaGlsZCBzaHV0ZG93biBjYXVzZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLkNoaWxkUHJvY2Vzc1tcInNpZ25hbENvZGVcIl19IHNodXRkb3duU2lnbmFsIC0gUGFyZW50LXJlcXVlc3RlZCBvciBjaGlsZC1vYnNlcnZlZCBzaHV0ZG93biBzaWduYWwgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge1Bvb2xlZFJ1bm5lclRlcm1pbmF0aW9uUmVhc29ufSB0ZXJtaW5hdGlvblJlYXNvbiAtIERlcHJlY2F0ZWQgY29tcGF0aWJpbGl0eSBjYXRlZ29yeTsgdXNlIHNodXRkb3duUmVhc29uIGZvciBleGFjdCBwcm92ZW5hbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSB0aW1lb3V0Sm9iSWQgLSBKb2Igd2hvc2UgdGltZW91dCBpbml0aWF0ZWQgY2hpbGQgdGVybWluYXRpb24sIG9yIG51bGwuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd29ya2VySWQgLSBTdGFibGUgZ2VuZXJhdGlvbi1xdWFsaWZpZWQgd29ya2VyIGlkLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9ic1dvcmtlckxpZmVjeWNsZVN0YXRlfSB3b3JrZXJMaWZlY3ljbGUgLSBQYXJlbnQgd29ya2VyIGxpZmVjeWNsZSBpbW1lZGlhdGVseSBiZWZvcmUgcmVjb3ZlcnkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gd29ya2VyUGlkIC0gUGFyZW50IHdvcmtlciBwcm9jZXNzIGlkLlxuICovXG4vKipcbiAqIEJlc3QtZWZmb3J0IG9ic2VydmF0aW9uIHNlbnQgYmVmb3JlIGEgcG9vbGVkIGNoaWxkIGNsb3NlcyBpdHMgcmVzb3VyY2VzLlxuICogQHR5cGVkZWYge29iamVjdH0gUG9vbGVkQ2hpbGRTaHV0ZG93bk9ic2VydmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2hpbGRJbnN0YW5jZUlkIC0gU3RhYmxlIHBvb2xlZC1jaGlsZCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGluZmxpZ2h0Sm9iSWRzIC0gQm91bmRlZCBpbi1mbGlnaHQgZHVyYWJsZSBqb2IgaWRzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGluZmxpZ2h0Sm9iSWRzVHJ1bmNhdGVkQ291bnQgLSBJbi1mbGlnaHQgaWRzIG9taXR0ZWQgZnJvbSB0aGUgYm91bmRlZCBzbmFwc2hvdC5cbiAqIEBwcm9wZXJ0eSB7UG9vbGVkQ2hpbGRTaHV0ZG93blJlYXNvbn0gcmVhc29uIC0gU2h1dGRvd24gcmVhc29uIG9ic2VydmVkIGJ5IHRoZSBjaGlsZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaHV0ZG93bk9ic2VydmVkQXRNcyAtIENoaWxkIG9ic2VydmF0aW9uIHRpbWVzdGFtcC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gc2h1dGRvd25SZXF1ZXN0ZWRBdE1zIC0gUGFyZW50IHJlcXVlc3QgdGltZXN0YW1wIHdoZW4gc3VwcGxpZWQgb3ZlciBJUEMuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKS5DaGlsZFByb2Nlc3NbXCJzaWduYWxDb2RlXCJdfSBzaWduYWwgLSBSZXF1ZXN0ZWQgb3Igb2JzZXJ2ZWQgc2lnbmFsIHdoZW4gYXZhaWxhYmxlLlxuICovXG4vKipcbiAqIEJvdW5kZWQgcG9vbGVkLWNoaWxkIG1lbW9yeSBvYnNlcnZhdGlvbiBzZW50IG92ZXIgdGhlIGNoaWxkIElQQyBjaGFubmVsLlxuICogVGhlIHBvb2xlZCBjaGlsZCdzIHN0ZGlvIGlzIGlnbm9yZWQgYnkgdGhlIHdvcmtlciBmb3JrLCBzbyB0aGlzIG9ic2VydmF0aW9uXG4gKiAoc2VudCBwZXJpb2RpY2FsbHkgd2hpbGUgam9icyBydW4sIHBsdXMgb24gZGVtYW5kKSBpcyBob3cgYSBtZW1vcnkgcHJvYmxlbVxuICogaW4gYSBydW5uaW5nIGNoaWxkIG5hbWVzIGl0c2VsZi4gYGhlYXBTdGF0aXN0aWNzYCBhbmQgYG1lbW9yeVVzYWdlYFxuICogZGlzdGluZ3Vpc2ggVjgtaGVhcCBncm93dGggZnJvbSBleHRlcm5hbC9hcnJheS1idWZmZXIgKG5hdGl2ZSByZXNvdXJjZSlcbiAqIGdyb3d0aDsgYGFjdGl2ZUpvYklkc2AgdGllcyB0aGUgc2FtcGxlIHRvIHRoZSB3b3JrIHRoYXQgd2FzIGluIGZsaWdodC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBvb2xlZENoaWxkTWVtb3J5T2JzZXJ2YXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGFjdGl2ZUpvYklkcyAtIEluLWZsaWdodCBqb2IgaWRzLCBib3VuZGVkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGFjdGl2ZUpvYklkc1RydW5jYXRlZENvdW50IC0gSW4tZmxpZ2h0IGpvYiBpZHMgb21pdHRlZCBieSB0aGUgYm91bmQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2hpbGRJbnN0YW5jZUlkIC0gU3RhYmxlIGlkZW50aXR5IHJlcG9ydGVkIGJ5IHRoZSBjaGlsZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjaGlsZFBpZCAtIENoaWxkIHByb2Nlc3MgaWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gY2hpbGRVcHRpbWVNcyAtIENoaWxkIHByb2Nlc3MgdXB0aW1lIGluIG1zLlxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnQoXCJub2RlOnY4XCIpLmdldEhlYXBTdGF0aXN0aWNzPn0gaGVhcFN0YXRpc3RpY3MgLSBWOCBoZWFwLXN0YXQgYnJlYWtkb3duIGF0IHRoZSBzYW1wbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gam9iQ291bnQgLSBJbi1mbGlnaHQgam9iIGNvdW50LlxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnQoXCJub2RlOnByb2Nlc3NcIikubWVtb3J5VXNhZ2U+fSBtZW1vcnlVc2FnZSAtIFByb2Nlc3MgbWVtb3J5IGJyZWFrZG93biBhdCB0aGUgc2FtcGxlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG9ic2VydmVkQXRNcyAtIEVwb2NoIG1zIHRoZSBjaGlsZCBzYW1wbGVkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHBlYWtSc3NCeXRlcyAtIENoaWxkLXJlcG9ydGVkIHBlYWsgUlNTIChrZXJuZWwgYFZtSFdNYCBoaWdoLXdhdGVyIG1hcmspIGluIGJ5dGVzLCBtb25vdG9uaWMgZm9yIHRoZSBjaGlsZCdzIGxpZmUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcnNzQnl0ZXMgLSBSZXNpZGVudCBzZXQgc2l6ZSBpbiBieXRlcyBhdCB0aGUgc2FtcGxlLlxuICogQHByb3BlcnR5IHtcInBvb2xlZC1jaGlsZC1tZW1vcnlcIn0gdHlwZSAtIERpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdXB0aW1lTXMgLSBQcm9jZXNzIHVwdGltZSBpbiBtcy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2NhbEJhY2tncm91bmRKb2JzQ2xvY2tcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBub3cgLSBDdXJyZW50IGVwb2NoIG1pbGxpc2Vjb25kcy5cbiAqIEBwcm9wZXJ0eSB7KGNhbGxiYWNrOiAoKSA9PiB2b2lkLCBkZWxheU1zOiBudW1iZXIpID0+IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVtYmVyfSBzZXRUaW1lb3V0IC0gQXJtcyBhIHRpbWVyLlxuICogQHByb3BlcnR5IHsodGltZXJJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudW1iZXIpID0+IHZvaWR9IGNsZWFyVGltZW91dCAtIENsZWFycyBhIHRpbWVyLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlc29sdmVkQmFja2dyb3VuZEpvYkNvbmN1cnJlbmN5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29uY3VycmVuY3lLZXkgLSBEdXJhYmxlIGNhcCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhDb25jdXJyZW5jeSAtIFBvc2l0aXZlIGNhcC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcXVldWVEZXJpdmVkIC0gV2hldGhlciBxdWV1ZSBjb25maWd1cmF0aW9uIG93bnMgdGhlIGNhcC5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iQ29uY3VycmVuY3lSZXBhaXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBhY3RpdmVDb3VudCAtIEV4YWN0IGhhbmRlZC1vZmYgam9iIGNvdW50IHBlcnNpc3RlZCBieSB0aGUgcmVwYWlyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbmN1cnJlbmN5S2V5IC0gRHVyYWJsZSBjYXAgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcHJldmlvdXNBY3RpdmVDb3VudCAtIFBlcnNpc3RlZCBjb3VudCByZXBsYWNlZCBieSB0aGUgcmVwYWlyLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JDb25jdXJyZW5jeVJlY29uY2lsaWF0aW9uXG4gKiBAcHJvcGVydHkge251bWJlcn0gY2FuZGlkYXRlQ291bnQgLSBTbmFwc2hvdCBtaXNtYXRjaGVzIHJlY2hlY2tlZCB1bmRlciB0aGVpciBjb3VudGVyIGxvY2tzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNoZWNrZWRDb3VudCAtIEFjdGl2ZSBvciBub256ZXJvIGR1cmFibGUgY291bnRlcnMgY29tcGFyZWQgaW4gdGhlIGluaXRpYWwgc25hcHNob3QuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcmVwYWlyZWRDb3VudCAtIENvdW50ZXJzIHdob3NlIHBlcnNpc3RlZCB2YWx1ZXMgd2VyZSBjaGFuZ2VkLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iQ29uY3VycmVuY3lSZXBhaXJbXX0gcmVwYWlycyAtIEJvdW5kZWQgZGV0ZXJtaW5pc3RpYyBzYW1wbGUgb2YgYXBwbGllZCByZXBhaXJzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHJlcGFpcnNUcnVuY2F0ZWRDb3VudCAtIEFwcGxpZWQgcmVwYWlycyBvbWl0dGVkIGZyb20gdGhlIHNhbXBsZS5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmVwYXJlZExvY2FsQmFja2dyb3VuZEpvYlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFyZ3NEaWdlc3QgLSBGaXhlZC13aWR0aCBkaWdlc3Qgb2YgdGhlIHNlcmlhbGl6ZWQgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFyZ3NKc29uIC0gU2VyaWFsaXplZCBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge1Jlc29sdmVkQmFja2dyb3VuZEpvYkNvbmN1cnJlbmN5IHwgbnVsbH0gY29uY3VycmVuY3kgLSBSZXNvbHZlZCBjb25jdXJyZW5jeS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjcmVhdGVkQXRNcyAtIENyZWF0aW9uIHRpbWVzdGFtcC5cbiAqIEBwcm9wZXJ0eSB7XCJpbmxpbmVcIn0gZXhlY3V0aW9uTW9kZSAtIExvY2FsIGluLXByb2Nlc3MgZXhlY3V0aW9uIG1vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gam9iSWQgLSBEdXJhYmxlIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYk5hbWUgLSBSZWdpc3RlcmVkIG5hbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4UmV0cmllcyAtIFJldHJ5IGNhcC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWV1ZSAtIFF1ZXVlIG5hbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2NoZWR1bGVkQXRNcyAtIEVsaWdpYmlsaXR5IHRpbWVzdGFtcC5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9ic0hlYWx0aFxuICogQHByb3BlcnR5IHtib29sZWFufSByZWFkeSAtIFdoZXRoZXIgdGhlIGFkYXB0ZXIgY2FuIGFjY2VwdCBhbmQgcHJvY2VzcyB3b3JrLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JzUHJvZHVjZXJcbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHtqb2JOYW1lOiBzdHJpbmcsIGFyZ3M6IEFycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Piwgb3B0aW9ucz86IEJhY2tncm91bmRKb2JPcHRpb25zLCBwcm9kdWNlckludm9jYXRpb25JZD86IHN0cmluZywgcHJvZHVjZXJQcm9vZj86IEJhY2tncm91bmRKb2JQcm9kdWNlclByb29mfSkgPT4gUHJvbWlzZTxzdHJpbmc+fSBlbnF1ZXVlIC0gRW5xdWV1ZXMgYSBqb2IuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7c2NoZWR1bGVLZXk6IHN0cmluZywgam9iTmFtZTogc3RyaW5nLCBhcmdzOiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIG9wdGlvbnM/OiBCYWNrZ3JvdW5kSm9iT3B0aW9uc30pID0+IFByb21pc2U8QmFja2dyb3VuZEpvYlJlcGxhY2VtZW50UmVzdWx0Pn0gcmVwbGFjZVNjaGVkdWxlZCAtIFJlcGxhY2VzIGEgc3RhYmxlIHNjaGVkdWxlLlxuICogQHByb3BlcnR5IHsoYXJnczoge3NjaGVkdWxlS2V5OiBzdHJpbmd9KSA9PiBQcm9taXNlPEJhY2tncm91bmRKb2JDYW5jZWxsYXRpb25SZXN1bHQ+fSBjYW5jZWxTY2hlZHVsZWQgLSBDYW5jZWxzIGEgc3RhYmxlIHNjaGVkdWxlLlxuICogQHByb3BlcnR5IHsoYXJnczoge3NjaGVkdWxlS2V5OiBzdHJpbmcsIGluY2x1ZGVMYXRlc3RUZXJtaW5hbD86IGJvb2xlYW59KSA9PiBQcm9taXNlPEJhY2tncm91bmRKb2JTY2hlZHVsZWRMb29rdXBSZXN1bHQ+fSBnZXRTY2hlZHVsZWRKb2IgLSBSZWFkcyBzdGFibGUgc2NoZWR1bGUgb3duZXJzaGlwIGFuZCBoaXN0b3J5LlxuICogQHByb3BlcnR5IHsoYXJnczoge3NjaGVkdWxlS2V5OiBzdHJpbmd9KSA9PiBQcm9taXNlPEJhY2tncm91bmRKb2JXYWtlUmVzdWx0Pn0gd2FrZVNjaGVkdWxlZCAtIEV4cGVkaXRlcyBhIHN0YWJsZSBzY2hlZHVsZSBvd25lci5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iSGFuZG9mZlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGhhbmRvZmZJZCAtIFVuaXF1ZSBoYW5kb2ZmIGxlYXNlIGlkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhhbmRlZE9mZkF0TXMgLSBUaW1lIGhhbmRlZCB0byBhIHdvcmtlciBpbiBtcy5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYlJvd30gW2pvYl0gLSBFeGFjdCBjb21taXR0ZWQgam9iIHNuYXBzaG90IHdoZW4gdGhlIGFkYXB0ZXIgY2hhbmdlcyBkaXNwYXRjaCBkYXRhIGR1cmluZyB0aGUgY2xhaW0uXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYkhhbmRvZmZTbmFwc2hvdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYklkIC0gSm9iIGhvbGRpbmcgdGhlIGxlYXNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGhhbmRvZmZJZCAtIEV4YWN0IGR1cmFibGUgbGVhc2UgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd29ya2VySWQgLSBTdGFibGUgd29ya2VyIGlkIHRoYXQgcmVjZWl2ZWQgdGhlIGxlYXNlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhhbmRlZE9mZkF0TXMgLSBUaW1lIGhhbmRlZCB0byB0aGUgd29ya2VyIGluIG1zLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JIYW5kb2ZmUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYklkIC0gSm9iIHRvIGNsYWltLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtoYW5kb2ZmSWRdIC0gRXhhY3QgY2FsbGVyLXNlbGVjdGVkIGxlYXNlIGlkLiBBZGFwdGVycyBtdXN0IHBlcnNpc3QgYW5kIHJldHVybiB0aGlzIGlkIHdoZW4gc3VwcGxpZWQ7IGJ1aWx0LWluIGFkYXB0ZXJzIGdlbmVyYXRlIG9uZSB3aGVuIG9taXR0ZWQgZm9yIGxlZ2FjeSBkaXJlY3QgY2FsbGVycy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbd29ya2VySWRdIC0gV29ya2VyIGNsYWltaW5nIHRoZSBqb2IuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYkV4ZWN1dGlvbk1vZGV9IFtleGVjdXRpb25Nb2RlXSAtIEhvdyB0aGUgam9iIHNob3VsZCBydW4uIE5vZGUgZGVmYXVsdHMgdG8gYFwicG9vbGVkXCJgIChhIHdhcm0sIHJldXNlZCBsb2NhbCBydW5uZXIgcHJvY2VzcykuIEJyb3dzZXIvRXhwbyBsb2NhbCBkaXNwYXRjaCBkZWZhdWx0cyB0byBhbmQgb25seSBhY2NlcHRzIGBcImlubGluZVwiYC4gYFwiZm9ya2VkXCJgIHJ1bnMgYSBOb2RlIGpvYiBpbiBhIGZyZXNoIGBjaGlsZF9wcm9jZXNzLmZvcmsoKWAgY2hpbGQsIGFuZCBgXCJzcGF3bmVkXCJgIGluIGEgZGV0YWNoZWQgQ0xJIHJ1bm5lci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4UmV0cmllc10gLSBNYXggcmV0cmllcyBmb3IgYSBmYWlsZWQgam9iIGJlZm9yZSBpdCBpcyBtYXJrZWQgZmFpbGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtxdWV1ZV0gLSBRdWV1ZSBuYW1lLiBEZWZhdWx0cyB0byBgXCJkZWZhdWx0XCJgLiBXaGVuIHRoZSBxdWV1ZSBoYXMgYSBjb25maWd1cmVkIGNhcCBpbiBgYmFja2dyb3VuZEpvYnMucXVldWVzYCwgdGhhdCBjYXAgaXMgZW5mb3JjZWQgY2x1c3Rlci13aWRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb25jdXJyZW5jeUtleV0gLSBPcGFxdWUgbm9uLWVtcHR5IGtleSB1c2VkIHRvIHNoYXJlIGEgY29uY3VycmVuY3kgY2FwLiBPdmVycmlkZXMgYW55IHF1ZXVlLWRlcml2ZWQgY2FwLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhDb25jdXJyZW5jeV0gLSBQb3NpdGl2ZSBpbnRlZ2VyIGNhcDsgbXVzdCBiZSBwYWlyZWQgd2l0aCBgY29uY3VycmVuY3lLZXlgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVkdXBsaWNhdGVXaGlsZVF1ZXVlZF0gLSBXaGVuIHRydWUsIHNraXAgdGhlIGVucXVldWUgaWYgYW4gaWRlbnRpY2FsIHN0aWxsLXF1ZXVlZCBqb2IgKHNhbWUgam9iIG5hbWUsIGFyZ3MgYW5kIHF1ZXVlKSBpcyBzY2hlZHVsZWQgbm8gbGF0ZXIgdGhhbiB0aGlzIGVucXVldWUsIHJldHVybmluZyB0aGUgZWFybGllc3QgbWF0Y2hpbmcgam9iJ3MgaWQuIEEgZnV0dXJlIHJldHJ5IGRvZXMgbm90IHN1cHByZXNzIGVhcmxpZXIgd29yay4gRGVkdXBsaWNhdGlvbiBpcyBpbmRlcGVuZGVudCBvZiBgY29uY3VycmVuY3lLZXlgLCBzbyB0aGUgam9iIGtlZXBzIGl0cyBub3JtYWwgKGUuZy4gcXVldWUtZGVyaXZlZCkgY29uY3VycmVuY3kgY2FwLiBLZWVwcyBhbiBpbnRlcnZhbC1zY2hlZHVsZWQgcmVjdXJyaW5nIGpvYiAoZS5nLiByZXRlbnRpb24gcHJ1bmluZykgZnJvbSBwaWxpbmcgdXAgcmVkdW5kYW50IHF1ZXVlZCByb3dzIHdoZW4gaXQgcnVucyBzbG93ZXIgdGhhbiBpdHMgaW50ZXJ2YWwgb3Igbm8gd29ya2VyIGlzIGZyZWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkZW1wb3RlbmN5S2V5XSAtIER1cmFibGUgZW5xdWV1ZSBpZGVudGl0eSBzY29wZWQgdG8gdGhlIHJlc29sdmVkIGpvYiBjbGFzcyBuYW1lIGFuZCBxdWV1ZS4gRXhhY3QgcmVwbGF5IHJldHVybnMgdGhlIG9yaWdpbmFsIGpvYiBpZCBhY3Jvc3MgZXZlcnkgc3RhdGUgYW5kIGFmdGVyIGpvYiBwcnVuaW5nOyByZXVzZSB3aXRoIGRpZmZlcmVudCBjYW5vbmljYWwgYXJndW1lbnRzIG9yIGJlaGF2aW9yLWFmZmVjdGluZyBvcHRpb25zIGZhaWxzLiBPd25lcnNoaXAgaXMgaW5kZXBlbmRlbnQgb2YgYGRlZHVwbGljYXRlV2hpbGVRdWV1ZWRgIGFuZCBpcyByZXRhaW5lZCB1bnRpbCBhbiBleHBsaWNpdCBmdXR1cmUgcmV0ZW50aW9uIHBvbGljeSByZW1vdmVzIGl0LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzY2hlZHVsZWRBdE1zXSAtIEVwb2NoIHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMgd2hlbiB0aGUgam9iIGJlY29tZXMgZWxpZ2libGUgZm9yIGRpc3BhdGNoLiBEZWZhdWx0cyB0byBlbnF1ZXVlIHRpbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRNc10gLSBQZXItam9iIHdhbGwtY2xvY2sgdGltZW91dCBmb3IgZm9ya2VkIGFuZCBwb29sZWQgZXhlY3V0aW9uLiBBIHBvc2l0aXZlIGludGVnZXIgdXAgdG8gMiwxNDcsNDgzLDY0NyBvdmVycmlkZXMgdGhlIHdvcmtlci1sZXZlbCBgam9iVGltZW91dE1zYDsgYSBub24tcG9zaXRpdmUgZmluaXRlIHZhbHVlIGRpc2FibGVzIHRoZSB0aW1lb3V0IGZvciB0aGlzIGpvYi5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iUGF5bG9hZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBKb2IgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gam9iTmFtZSAtIEpvYiBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFthcmdzXSAtIFNlcmlhbGl6ZWQgam9iIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGFuZG9mZklkXSAtIFVuaXF1ZSBoYW5kb2ZmIGxlYXNlIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt3b3JrZXJJZF0gLSBXb3JrZXIgaWQgaGFuZGxpbmcgdGhlIGpvYi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaGFuZGVkT2ZmQXRNc10gLSBUaW1lIGhhbmRlZCB0byBhIHdvcmtlciBpbiBtcy5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYk9wdGlvbnN9IFtvcHRpb25zXSAtIFJ1bnRpbWUgb3B0aW9ucy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iQ29udGV4dFxuICogQHByb3BlcnR5IHt0eXBlb2YgaW1wb3J0KFwiLi9wbGF0Zm9ybS1qb2IuanNcIikuZGVmYXVsdH0gam9iQ2xhc3MgLSBDb25jcmV0ZSBqb2IgY2xhc3MuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gam9iTmFtZSAtIFJlZ2lzdGVyZWQgam9iIG5hbWUuXG4gKiBAcHJvcGVydHkge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncyAtIFNlcmlhbGl6ZWQgam9iIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYk9wdGlvbnN9IG9wdGlvbnMgLSBSZXNvbHZlZCBlbnF1ZXVlL3J1bnRpbWUgb3B0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYlBheWxvYWR9IFtwYXlsb2FkXSAtIENvbXBsZXRlIHBlcnNpc3RlZCBydW5uZXIgcGF5bG9hZCB3aGVuIHRoZSBqb2IgaXMgcGVyZm9ybWluZy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iUm93XG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBKb2IgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gam9iTmFtZSAtIEpvYiBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MgLSBTZXJpYWxpemVkIGpvYiBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JFeGVjdXRpb25Nb2RlfSBleGVjdXRpb25Nb2RlIC0gSG93IHRoZSBqb2Igc2hvdWxkIHJ1bi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWV1ZSAtIFF1ZXVlIG5hbWUgKGRlZmF1bHRzIHRvIGBcImRlZmF1bHRcImApLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBzY2hlZHVsZUtleSAtIFN0YWJsZSBsb2dpY2FsIHNjaGVkdWxlIGtleSByZXRhaW5lZCBmb3IgaGlzdG9yeS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gc2NoZWR1bGVPcmRlciAtIFRyYW5zYWN0aW9uLWFzc2lnbmVkIG1vbm90b25pYyBvd25lcnNoaXAgb3JkZXIgZm9yIHRoaXMgc2NoZWR1bGUga2V5OyBOb2RlIHByZXNlcnZlcyBpdHMgaGlnaC13YXRlciBtYXJrIGFjcm9zcyB0ZXJtaW5hbC1oaXN0b3J5IHBydW5pbmcuIE51bGwgZm9yIGxlZ2FjeS9ub24tc2NoZWR1bGVkIHJvd3MuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JTdGF0dXN9IHN0YXR1cyAtIEN1cnJlbnQgam9iIHN0YXR1cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gYXR0ZW1wdHMgLSBGYWlsdXJlIGF0dGVtcHRzIGNvdW50LlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBtYXhSZXRyaWVzIC0gTWF4IHJldHJ5IGF0dGVtcHRzLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBzY2hlZHVsZWRBdE1zIC0gTmV4dCBzY2hlZHVsZWQgdGltZSBpbiBtcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gY3JlYXRlZEF0TXMgLSBDcmVhdGlvbiB0aW1lIGluIG1zLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBoYW5kZWRPZmZBdE1zIC0gVGltZSBoYW5kZWQgdG8gd29ya2VyIGluIG1zLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBoYW5kb2ZmSWQgLSBVbmlxdWUgbGF0ZXN0IGhhbmRvZmYgbGVhc2UgaWQuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGNvbXBsZXRlZEF0TXMgLSBDb21wbGV0aW9uIHRpbWUgaW4gbXMuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGZhaWxlZEF0TXMgLSBGYWlsdXJlIHRpbWUgaW4gbXMuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IG9ycGhhbmVkQXRNcyAtIE9ycGhhbmVkIHRpbWUgaW4gbXMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHdvcmtlcklkIC0gV29ya2VyIGlkIGhhbmRsaW5nIHRoZSBqb2IuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGxhc3RFcnJvciAtIExhc3QgZmFpbHVyZSBtZXNzYWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBjb25jdXJyZW5jeUtleSAtIER1cmFibGUgY29uY3VycmVuY3kga2V5LlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBtYXhDb25jdXJyZW5jeSAtIER1cmFibGUgcGVyLWtleSBjYXAuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHRpbWVvdXRNcyAtIFBlci1qb2Igd2FsbC1jbG9jayB0aW1lb3V0IG92ZXJyaWRlLCBvciBudWxsIHdoZW4gb21pdHRlZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gY2hpbGRSZWNlaXZlZEF0TXMgLSBFcG9jaCBtcyB3aGVuIHRoZSBleGVjdXRpbmcgcG9vbGVkIGNoaWxkJ3MgZXZlbnQgbG9vcCBwcm9jZXNzZWQgdGhlIGpvYiBtZXNzYWdlLCBvciBudWxsIHdoZW4gbm8gcnVubmVyIGFjY2VwdGVkIGl0IHlldC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gY2hpbGRTdGFydGVkQXRNcyAtIEVwb2NoIG1zIHdoZW4gdGhlIGpvYidzIHBlcmZvcm0gc3RhcnRlZCBpbiB0aGUgcG9vbGVkIGNoaWxkLCBvciBudWxsIHdoZW4gaXQgbmV2ZXIgc3RhcnRlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gY2hpbGRJbnN0YW5jZUlkIC0gU3RhYmxlIGlkZW50aXR5IG9mIHRoZSBwb29sZWQgY2hpbGQgcHJvY2VzcyB0aGF0IGFjY2VwdGVkIHRoZSBqb2IsIG9yIG51bGwuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGNoaWxkUGlkIC0gT1MgcGlkIG9mIHRoZSBwb29sZWQgY2hpbGQgcHJvY2VzcyB0aGF0IGFjY2VwdGVkIHRoZSBqb2IsIG9yIG51bGwuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHJ1bm5lckhvc3RuYW1lIC0gSG9zdG5hbWUgcmVwb3J0ZWQgYnkgdGhlIHBvb2xlZCBjaGlsZCBwcm9jZXNzIHRoYXQgYWNjZXB0ZWQgdGhlIGpvYiwgb3IgbnVsbC5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7XCJxdWV1ZWRcIiB8IFwiaGFuZGVkX29mZlwiIHwgbnVsbH0gQmFja2dyb3VuZEpvYlJlcGxhY2VtZW50UHJldmlvdXNTdGF0dXNcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iUmVwbGFjZW1lbnRSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBqb2JJZCAtIE5ld2x5IHF1ZXVlZCBqb2IgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IHByZXZpb3VzSm9iSWQgLSBQcmV2aW91cyBhY3RpdmUgb3duZXIncyBqb2IgaWQuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JSZXBsYWNlbWVudFByZXZpb3VzU3RhdHVzfSBwcmV2aW91c1N0YXR1cyAtIFByZXZpb3VzIG93bmVyJ3Mgb2JzZXJ2ZWQgc3RhdGUuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge1wiY2FuY2VsbGVkXCIgfCBcImhhbmRlZF9vZmZcIiB8IFwibm90X2ZvdW5kXCJ9IEJhY2tncm91bmRKb2JDYW5jZWxsYXRpb25PdXRjb21lXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYkNhbmNlbGxhdGlvblJlc3VsdFxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBqb2JJZCAtIERldGFjaGVkIG93bmVyJ3Mgam9iIGlkLCB3aGVuIG9uZSB3YXMgYWN0aXZlLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iQ2FuY2VsbGF0aW9uT3V0Y29tZX0gb3V0Y29tZSAtIFRydXRoZnVsIGJlc3QtZWZmb3J0IG91dGNvbWUuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYlNjaGVkdWxlZExvb2t1cFJlc3VsdFxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iUm93IHwgbnVsbH0gY3VycmVudEpvYiAtIEN1cnJlbnQgcXVldWVkIG9yIGhhbmRlZC1vZmYgb3duZXIuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JSb3cgfCBudWxsfSBsYXRlc3RUZXJtaW5hbEpvYiAtIExhdGVzdCB0ZXJtaW5hbCBoaXN0b3J5IHdoZW4gcmVxdWVzdGVkLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtcIndva2VuXCIgfCBcImFscmVhZHlfZHVlXCIgfCBcImhhbmRlZF9vZmZcIiB8IFwibm90X2ZvdW5kXCJ9IEJhY2tncm91bmRKb2JXYWtlT3V0Y29tZVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JXYWtlUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGpvYklkIC0gQ3VycmVudCBvd25lcidzIGR1cmFibGUgam9iIGlkLCB3aGVuIGZvdW5kLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iV2FrZU91dGNvbWV9IG91dGNvbWUgLSBFeGFjdCB3YWtlIG91dGNvbWUuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYkZhaWx1cmVFdmVudFxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iUm93fSBqb2IgLSBVcGRhdGVkIGpvYiByb3cgYWZ0ZXIgZmFpbHVyZSBoYW5kbGluZy5cbiAqIEBwcm9wZXJ0eSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGVycm9yIC0gRmFpbHVyZSBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gYXR0ZW1wdHMgLSBVcGRhdGVkIGZhaWx1cmUgYXR0ZW1wdHMgY291bnQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRlcm1pbmFsIC0gV2hldGhlciB0aGlzIGZhaWx1cmUgZW5kZWQgdGhlIGpvYi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2lsbFJldHJ5IC0gV2hldGhlciB0aGUgam9iIHdhcyByZXR1cm5lZCB0byB0aGUgcXVldWUuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IHVuZGVmaW5lZH0gaGFuZG9mZklkIC0gSGFuZG9mZiBsZWFzZSBpZCBmcm9tIHRoZSB3b3JrZXIgcmVwb3J0LlxuICogQHByb3BlcnR5IHtudW1iZXIgfCB1bmRlZmluZWR9IGhhbmRlZE9mZkF0TXMgLSBIYW5kb2ZmIHRpbWVzdGFtcCBmcm9tIHRoZSB3b3JrZXIgcmVwb3J0LlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCB1bmRlZmluZWR9IHdvcmtlcklkIC0gV29ya2VyIGlkIGZyb20gdGhlIHdvcmtlciByZXBvcnQuXG4gKiBAcHJvcGVydHkge1Bvb2xlZFJ1bm5lckZhaWx1cmUgfCB1bmRlZmluZWR9IHJ1bm5lckZhaWx1cmUgLSBTaGFyZWQgcG9vbGVkLWNoaWxkIHByb2Nlc3MgZmFpbHVyZSBwcm92ZW5hbmNlLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtcIndvcmtlclwiIHwgXCJjbGllbnRcIiB8IFwicmVwb3J0ZXJcIn0gQmFja2dyb3VuZEpvYlNvY2tldFJvbGVcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiaGVsbG9cIiwgcm9sZTogQmFja2dyb3VuZEpvYlNvY2tldFJvbGUsIGdlbmVyYXRpb25JZD86IHN0cmluZywgc3VwcG9ydHNIYW5kb2ZmSWRSZXBvcnRpbmc/OiBib29sZWFuLCBzdXBwb3J0c0hlYXJ0YmVhdD86IGJvb2xlYW4sIHN1cHBvcnRzUG9vbGVkPzogYm9vbGVhbiwgd29ya2VySWQ/OiBzdHJpbmd9fSBCYWNrZ3JvdW5kSm9iSGVsbG9NZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiZ2VuZXJhdGlvbi1hY2NlcHRlZFwiLCBnZW5lcmF0aW9uSWQ6IHN0cmluZywgbGlmZWN5Y2xlU3RhdGU6IEJhY2tncm91bmRKb2JzR2VuZXJhdGlvbkxpZmVjeWNsZVN0YXRlfX0gQmFja2dyb3VuZEpvYkdlbmVyYXRpb25BY2NlcHRlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJnZW5lcmF0aW9uLXJlamVjdGVkXCIsIHJlYXNvbjogQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uUmVqZWN0aW9uUmVhc29ufX0gQmFja2dyb3VuZEpvYkdlbmVyYXRpb25SZWplY3RlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJyZWFkeVwiLCBhY2NlcHRzRm9ya2VkPzogYm9vbGVhbiwgYWNjZXB0c0lubGluZT86IGJvb2xlYW4sIGFjY2VwdHNQb29sZWQ/OiBib29sZWFuLCBhY2NlcHRzU3Bhd25lZD86IGJvb2xlYW4sIGF2YWlsYWJsZVBvb2xlZFNsb3RzPzogbnVtYmVyfX0gQmFja2dyb3VuZEpvYlJlYWR5TWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImRyYWluaW5nXCJ9fSBCYWNrZ3JvdW5kSm9iRHJhaW5pbmdNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiaGVhcnRiZWF0XCIsIHdvcmtlcklkPzogc3RyaW5nfX0gQmFja2dyb3VuZEpvYkhlYXJ0YmVhdE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJlbnF1ZXVlXCIsIGpvYk5hbWU6IHN0cmluZywgYXJncz86IEFycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Piwgb3B0aW9ucz86IEJhY2tncm91bmRKb2JPcHRpb25zLCBwcm9kdWNlckludm9jYXRpb25JZD86IHN0cmluZywgcHJvZHVjZXJQcm9vZj86IEJhY2tncm91bmRKb2JQcm9kdWNlclByb29mfX0gQmFja2dyb3VuZEpvYkVucXVldWVNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiZW5xdWV1ZWRcIiwgam9iSWQ6IHN0cmluZ319IEJhY2tncm91bmRKb2JFbnF1ZXVlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJlbnF1ZXVlLWVycm9yXCIsIGVycm9yPzogc3RyaW5nfX0gQmFja2dyb3VuZEpvYkVucXVldWVFcnJvck1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJyZXBsYWNlLXNjaGVkdWxlZFwiLCBzY2hlZHVsZUtleTogc3RyaW5nLCBqb2JOYW1lOiBzdHJpbmcsIGFyZ3M/OiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIG9wdGlvbnM/OiBCYWNrZ3JvdW5kSm9iT3B0aW9uc319IEJhY2tncm91bmRKb2JSZXBsYWNlU2NoZWR1bGVkTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcInNjaGVkdWxlLXJlcGxhY2VkXCIsIGpvYklkOiBzdHJpbmcsIHByZXZpb3VzSm9iSWQ6IHN0cmluZyB8IG51bGwsIHByZXZpb3VzU3RhdHVzOiBCYWNrZ3JvdW5kSm9iUmVwbGFjZW1lbnRQcmV2aW91c1N0YXR1c319IEJhY2tncm91bmRKb2JTY2hlZHVsZVJlcGxhY2VkTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcInJlcGxhY2Utc2NoZWR1bGVkLWVycm9yXCIsIGVycm9yPzogc3RyaW5nfX0gQmFja2dyb3VuZEpvYlJlcGxhY2VTY2hlZHVsZWRFcnJvck1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJjYW5jZWwtc2NoZWR1bGVkXCIsIHNjaGVkdWxlS2V5OiBzdHJpbmd9fSBCYWNrZ3JvdW5kSm9iQ2FuY2VsU2NoZWR1bGVkTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcInNjaGVkdWxlLWNhbmNlbGxlZFwiLCBqb2JJZDogc3RyaW5nIHwgbnVsbCwgb3V0Y29tZTogQmFja2dyb3VuZEpvYkNhbmNlbGxhdGlvbk91dGNvbWV9fSBCYWNrZ3JvdW5kSm9iU2NoZWR1bGVDYW5jZWxsZWRNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiY2FuY2VsLXNjaGVkdWxlZC1lcnJvclwiLCBlcnJvcj86IHN0cmluZ319IEJhY2tncm91bmRKb2JDYW5jZWxTY2hlZHVsZWRFcnJvck1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJnZXQtc2NoZWR1bGVkLWpvYlwiLCBzY2hlZHVsZUtleTogc3RyaW5nLCBpbmNsdWRlTGF0ZXN0VGVybWluYWw/OiBib29sZWFufX0gQmFja2dyb3VuZEpvYkdldFNjaGVkdWxlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJzY2hlZHVsZWQtam9iXCIsIGN1cnJlbnRKb2I6IEJhY2tncm91bmRKb2JSb3cgfCBudWxsLCBsYXRlc3RUZXJtaW5hbEpvYjogQmFja2dyb3VuZEpvYlJvdyB8IG51bGx9fSBCYWNrZ3JvdW5kSm9iU2NoZWR1bGVkTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImdldC1zY2hlZHVsZWQtam9iLWVycm9yXCIsIGVycm9yPzogc3RyaW5nfX0gQmFja2dyb3VuZEpvYkdldFNjaGVkdWxlZEVycm9yTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcIndha2Utc2NoZWR1bGVkXCIsIHNjaGVkdWxlS2V5OiBzdHJpbmd9fSBCYWNrZ3JvdW5kSm9iV2FrZVNjaGVkdWxlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJzY2hlZHVsZS13b2tlblwiLCBqb2JJZDogc3RyaW5nIHwgbnVsbCwgb3V0Y29tZTogQmFja2dyb3VuZEpvYldha2VPdXRjb21lfX0gQmFja2dyb3VuZEpvYlNjaGVkdWxlV29rZW5NZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwid2FrZS1zY2hlZHVsZWQtZXJyb3JcIiwgZXJyb3I/OiBzdHJpbmd9fSBCYWNrZ3JvdW5kSm9iV2FrZVNjaGVkdWxlZEVycm9yTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImpvYlwiLCBwYXlsb2FkOiBCYWNrZ3JvdW5kSm9iUGF5bG9hZH19IEJhY2tncm91bmRKb2JKb2JNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiam9iLWFjY2VwdGVkXCIsIGpvYklkOiBzdHJpbmcsIGhhbmRvZmZJZD86IHN0cmluZywgd29ya2VySWQ/OiBzdHJpbmcsIGhhbmRlZE9mZkF0TXM/OiBudW1iZXIsIHJlY2VpdmVkQXRNcz86IG51bWJlciwgc3RhcnRlZEF0TXM/OiBudW1iZXIsIGNoaWxkSW5zdGFuY2VJZD86IHN0cmluZywgY2hpbGRQaWQ/OiBudW1iZXIsIHJ1bm5lckhvc3RuYW1lPzogc3RyaW5nfX0gQmFja2dyb3VuZEpvYkFjY2VwdGVkTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImpvYi1jb21wbGV0ZVwiLCBqb2JJZDogc3RyaW5nLCBoYW5kb2ZmSWQ/OiBzdHJpbmcsIHdvcmtlcklkPzogc3RyaW5nLCBoYW5kZWRPZmZBdE1zPzogbnVtYmVyfX0gQmFja2dyb3VuZEpvYkNvbXBsZXRlTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImpvYi1mYWlsZWRcIiwgam9iSWQ6IHN0cmluZywgZXJyb3I/OiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgaGFuZG9mZklkPzogc3RyaW5nLCB3b3JrZXJJZD86IHN0cmluZywgaGFuZGVkT2ZmQXRNcz86IG51bWJlciwgcnVubmVyRmFpbHVyZT86IFBvb2xlZFJ1bm5lckZhaWx1cmV9fSBCYWNrZ3JvdW5kSm9iRmFpbGVkTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImpvYi1yZXNjaGVkdWxlXCIsIGpvYklkOiBzdHJpbmcsIGRlbGF5TXM6IG51bWJlciwgaGFuZG9mZklkPzogc3RyaW5nLCB3b3JrZXJJZD86IHN0cmluZywgaGFuZGVkT2ZmQXRNcz86IG51bWJlcn19IEJhY2tncm91bmRKb2JSZXNjaGVkdWxlTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImpvYi11cGRhdGVkXCIsIGpvYklkOiBzdHJpbmd9fSBCYWNrZ3JvdW5kSm9iVXBkYXRlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJqb2ItdXBkYXRlLWVycm9yXCIsIGpvYklkOiBzdHJpbmcsIGVycm9yPzogc3RyaW5nfX0gQmFja2dyb3VuZEpvYlVwZGF0ZUVycm9yTWVzc2FnZVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtCYWNrZ3JvdW5kSm9iSGVsbG9NZXNzYWdlIHwgQmFja2dyb3VuZEpvYkdlbmVyYXRpb25BY2NlcHRlZE1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iR2VuZXJhdGlvblJlamVjdGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JSZWFkeU1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iRHJhaW5pbmdNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkhlYXJ0YmVhdE1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iRW5xdWV1ZU1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iRW5xdWV1ZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkVucXVldWVFcnJvck1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iUmVwbGFjZVNjaGVkdWxlZE1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iU2NoZWR1bGVSZXBsYWNlZE1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iUmVwbGFjZVNjaGVkdWxlZEVycm9yTWVzc2FnZSB8IEJhY2tncm91bmRKb2JDYW5jZWxTY2hlZHVsZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYlNjaGVkdWxlQ2FuY2VsbGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JDYW5jZWxTY2hlZHVsZWRFcnJvck1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iR2V0U2NoZWR1bGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JTY2hlZHVsZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkdldFNjaGVkdWxlZEVycm9yTWVzc2FnZSB8IEJhY2tncm91bmRKb2JXYWtlU2NoZWR1bGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JTY2hlZHVsZVdva2VuTWVzc2FnZSB8IEJhY2tncm91bmRKb2JXYWtlU2NoZWR1bGVkRXJyb3JNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkpvYk1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iQWNjZXB0ZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkNvbXBsZXRlTWVzc2FnZSB8IEJhY2tncm91bmRKb2JGYWlsZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYlJlc2NoZWR1bGVNZXNzYWdlIHwgQmFja2dyb3VuZEpvYlVwZGF0ZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYlVwZGF0ZUVycm9yTWVzc2FnZX0gQmFja2dyb3VuZEpvYlNvY2tldE1lc3NhZ2VcbiAqL1xuXG5leHBvcnQgY29uc3Qgbm90aGluZyA9IHt9XG4iXX0=
|
|
306
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFja2dyb3VuZC1qb2JzL3R5cGVzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7R0FFRztBQUNILHlGQUF5RjtBQUN6RixpSUFBaUk7QUFDakksNk5BQTZOO0FBQzdOLG1FQUFtRTtBQUNuRSwrRkFBK0Y7QUFDL0YsNkZBQTZGO0FBQzdGLG1HQUFtRztBQUNuRyxnRkFBZ0Y7QUFDaEYsdVBBQXVQO0FBQ3ZQOzs7R0FHRztBQUNILHdGQUF3RjtBQUN4Rjs7Ozs7Ozs7R0FRRztBQUNIOzs7Ozs7O0dBT0c7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0g7Ozs7Ozs7Ozs7R0FVRztBQUNIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSDs7Ozs7R0FLRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7Ozs7OztHQU9HO0FBQ0g7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0g7OztHQUdHO0FBQ0g7Ozs7Ozs7R0FPRztBQUNIOzs7OztHQUtHO0FBQ0g7Ozs7OztHQU1HO0FBQ0g7Ozs7O0dBS0c7QUFDSDs7Ozs7Ozs7Ozs7R0FXRztBQUNIOzs7Ozs7Ozs7R0FTRztBQUNIOzs7Ozs7O0dBT0c7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSDs7R0FFRztBQUNIOzs7OztHQUtHO0FBQ0g7O0dBRUc7QUFDSDs7OztHQUlHO0FBQ0g7Ozs7R0FJRztBQUNIOztHQUVHO0FBQ0g7Ozs7R0FJRztBQUNIOzs7Ozs7Ozs7OztHQVdHO0FBQ0g7O0dBRUc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSDs7R0FFRztBQUVILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAdHlwZWRlZiB7XCJpbmxpbmVcIiB8IFwiZm9ya2VkXCIgfCBcInBvb2xlZFwiIHwgXCJzcGF3bmVkXCJ9IEJhY2tncm91bmRKb2JFeGVjdXRpb25Nb2RlXG4gKi9cbi8qKiBAdHlwZWRlZiB7XCJjYW5kaWRhdGVcIiB8IFwiYWN0aXZlXCIgfCBcInJldGlyZWRcIn0gQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uSW5pdGlhbFN0YXRlICovXG4vKiogQHR5cGVkZWYge1wic3RhcnRpbmdcIiB8IFwiY2FuZGlkYXRlXCIgfCBcImFjdGl2ZVwiIHwgXCJyZXRpcmluZ1wiIHwgXCJyZXRpcmVkXCIgfCBcInN0b3BwZWRcIn0gQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uTGlmZWN5Y2xlU3RhdGUgKi9cbi8qKiBAdHlwZWRlZiB7XCJtaXNzaW5nLWdlbmVyYXRpb25cIiB8IFwidW5leHBlY3RlZC1nZW5lcmF0aW9uXCIgfCBcIm1hbGZvcm1lZC1nZW5lcmF0aW9uXCIgfCBcImdlbmVyYXRpb24tbWlzbWF0Y2hcIiB8IFwid29ya2VyLWFkbWlzc2lvbi1yZXRpcmVkXCIgfCBcIndvcmtlci1oYXMtbm8tcmVjb3ZlcmFibGUtaGFuZG9mZnNcIn0gQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uUmVqZWN0aW9uUmVhc29uICovXG4vKiogQHR5cGVkZWYge1wicXVldWVkXCIgfCBcImhhbmRlZF9vZmZcIn0gQmFja2dyb3VuZEpvYkFjdGl2ZVN0YXR1cyAqL1xuLyoqIEB0eXBlZGVmIHtcImNhbmNlbGxlZFwiIHwgXCJjb21wbGV0ZWRcIiB8IFwiZmFpbGVkXCIgfCBcIm9ycGhhbmVkXCJ9IEJhY2tncm91bmRKb2JUZXJtaW5hbFN0YXR1cyAqL1xuLyoqIEB0eXBlZGVmIHtCYWNrZ3JvdW5kSm9iQWN0aXZlU3RhdHVzIHwgQmFja2dyb3VuZEpvYlRlcm1pbmFsU3RhdHVzfSBCYWNrZ3JvdW5kSm9iU3RhdHVzICovXG4vKiogQHR5cGVkZWYge1wiZXhpdFwiIHwgXCJwcm9jZXNzLWVycm9yXCIgfCBcImlwYy1zZW5kXCIgfCBcImNoaWxkLXNpbGVuY2VcIn0gUG9vbGVkUnVubmVyRmFpbHVyZU9yaWdpbiAqL1xuLyoqIEB0eXBlZGVmIHtcInN0YXJ0aW5nXCIgfCBcInJ1bm5pbmdcIiB8IFwicmV0aXJpbmdcIn0gUG9vbGVkUnVubmVyTGlmZWN5Y2xlU3RhdGUgKi9cbi8qKiBAdHlwZWRlZiB7XCJwYXJlbnRfcmV0aXJlX2RyYWluZWRcIiB8IFwiam9iX3RpbWVvdXRcIiB8IFwid29ya2VyX3N0b3BcIiB8IFwiY2hpbGRfc2lsZW5jZVwiIHwgXCJzaWduYWxfc2lndGVybVwiIHwgXCJzaWduYWxfc2lnaW50XCIgfCBcInNpZ25hbF9zaWdraWxsXCIgfCBcInNpZ25hbF9vdGhlclwiIHwgXCJpcGNfZGlzY29ubmVjdFwiIHwgXCJwcm9jZXNzX2Vycm9yXCIgfCBcInVuZXhwZWN0ZWRfZXhpdFwifSBQb29sZWRDaGlsZFNodXRkb3duUmVhc29uICovXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBQb29sZWRDaGlsZFNodXRkb3duUmVhc29uIGZvciBleGFjdCBzaHV0ZG93biBwcm92ZW5hbmNlLlxuICogQHR5cGVkZWYge1widW5leHBlY3RlZFwiIHwgXCJqb2ItdGltZW91dFwiIHwgXCJ3b3JrZXItc2h1dGRvd24tdGltZW91dFwifSBQb29sZWRSdW5uZXJUZXJtaW5hdGlvblJlYXNvblxuICovXG4vKiogQHR5cGVkZWYge1wicnVubmluZ1wiIHwgXCJyZXRpcmluZ1wiIHwgXCJzdG9wcGluZ1wifSBCYWNrZ3JvdW5kSm9ic1dvcmtlckxpZmVjeWNsZVN0YXRlICovXG4vKipcbiAqIEV4YWN0IGR1cmFibGUgaGFuZG9mZiBvd25lcnNoaXAgY2FycmllZCBieSBhbiBleGVjdXRpbmcgam9iIHdoZW4gaXQgcHJvZHVjZXNcbiAqIGZvbGxvdy11cCB3b3JrLlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYlByb2R1Y2VyUHJvb2ZcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBqb2JJZCAtIFByb2R1Y2luZyBqb2IgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaGFuZG9mZklkIC0gUHJvZHVjaW5nIGhhbmRvZmYgbGVhc2UgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd29ya2VySWQgLSBXb3JrZXIgaWRlbnRpdHkgcGVyc2lzdGVkIHdpdGggdGhlIGhhbmRvZmYuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaGFuZGVkT2ZmQXRNcyAtIER1cmFibGUgaGFuZG9mZiB0aW1lc3RhbXAuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUG9vbGVkUnVubmVyQWN0aXZlSm9iXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGhhbmRvZmZJZCAtIER1cmFibGUgaGFuZG9mZiBsZWFzZSBpZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gaGFuZGVkT2ZmQXRNcyAtIER1cmFibGUgaGFuZG9mZiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gam9iSWQgLSBEdXJhYmxlIGJhY2tncm91bmQgam9iIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYk5hbWUgLSBSZWdpc3RlcmVkIGpvYiBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHdvcmtlcklkIC0gV29ya2VyIGlkZW50aXR5IHBlcnNpc3RlZCB3aXRoIHRoZSBoYW5kb2ZmLlxuICovXG4vKipcbiAqIE9uZSBwcm9jZXNzLWZhaWx1cmUgc25hcHNob3Qgc2hhcmVkIGJ5IGV2ZXJ5IGpvYiBsb3N0IHdpdGggYSBwb29sZWQgY2hpbGQuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQb29sZWRSdW5uZXJGYWlsdXJlXG4gKiBAcHJvcGVydHkge1Bvb2xlZFJ1bm5lckFjdGl2ZUpvYltdfSBhY3RpdmVKb2JzIC0gSm9icyB0aGF0IHdlcmUgaW4gZmxpZ2h0IHdoZW4gdGhlIGNoaWxkIGZhaWxlZCwgb3JkZXJlZCBieSBqb2IgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGNoaWxkSW5zdGFuY2VJZCAtIFN0YWJsZSBwb29sZWQtY2hpbGQgaWRlbnRpdHkgd2hlbiBpdHMgc3RhcnR1cCBvciBzaHV0ZG93biBvYnNlcnZhdGlvbiBhcnJpdmVkLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBleGl0Q29kZSAtIENoaWxkIGV4aXQgY29kZSwgb3IgbnVsbCBmb3Igc2lnbmFsL3Byb2Nlc3MgZXJyb3JzLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBnZW5lcmF0aW9uSWQgLSBSZWxlYXNlIGdlbmVyYXRpb24gaWRlbnRpdHksIG9yIG51bGwgaW4gbGVnYWN5IG1vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBpbmZsaWdodEpvYklkcyAtIEJvdW5kZWQgam9iIGlkcyBpbiBmbGlnaHQgd2hlbiBmYWlsdXJlIGhhbmRsaW5nIHN0YXJ0ZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5mbGlnaHRKb2JJZHNUcnVuY2F0ZWRDb3VudCAtIEluLWZsaWdodCBpZHMgb21pdHRlZCBmcm9tIHRoZSBib3VuZGVkIHNuYXBzaG90LlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gb29tS2lsbGVkIC0gRmFsc2Ugd2hlbiB0aGUgb2JzZXJ2ZWQgZXhpdCBydWxlcyBPT00gb3V0OyBudWxsIHdoZW4gYW4gdW5leHBlY3RlZCBTSUdLSUxMIGNhbm5vdCBiZSBkaXN0aW5ndWlzaGVkIGZyb20gYW4gT09NIGtpbGwgd2l0aG91dCBzdXBlcnZpc29yL2tlcm5lbCBldmlkZW5jZS5cbiAqIEBwcm9wZXJ0eSB7UG9vbGVkUnVubmVyRmFpbHVyZU9yaWdpbn0gb3JpZ2luIC0gV29ya2VyIG9ic2VydmF0aW9uIHRoYXQgaW5pdGlhdGVkIGZhaWx1cmUgaGFuZGxpbmcuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcnVubmVyQWdlTXMgLSBDaGlsZCBhZ2Ugd2hlbiBmYWlsdXJlIGhhbmRsaW5nIHN0YXJ0ZWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcnVubmVyQ3JlYXRlZEF0TXMgLSBDaGlsZCBjcmVhdGlvbiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJ1bm5lckRldGFjaGVkIC0gV2hldGhlciB0aGUgcnVubmVyIG93bmVkIGEgZGV0YWNoZWQgcHJvY2VzcyBncm91cC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBydW5uZXJKb2JzUnVuIC0gUHJldmlvdXNseSBhY2tub3dsZWRnZWQgam9icyBoYW5kbGVkIGJ5IHRoZSBjaGlsZC5cbiAqIEBwcm9wZXJ0eSB7UG9vbGVkUnVubmVyTGlmZWN5Y2xlU3RhdGV9IHJ1bm5lckxpZmVjeWNsZSAtIENoaWxkIGxpZmVjeWNsZSBpbW1lZGlhdGVseSBiZWZvcmUgcmVjb3ZlcnkuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHJ1bm5lclBpZCAtIENoaWxkIHByb2Nlc3MgaWQgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKS5DaGlsZFByb2Nlc3NbXCJzaWduYWxDb2RlXCJdfSBzaWduYWwgLSBDaGlsZCB0ZXJtaW5hdGlvbiBzaWduYWwgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHNodXRkb3duT2JzZXJ2ZWRBdE1zIC0gVGltZSB0aGUgY2hpbGQgb3IgcGFyZW50IG9ic2VydmVkIHNodXRkb3duIGJlZ2lubmluZy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gc2h1dGRvd25SZXF1ZXN0ZWRBdE1zIC0gRXhhY3QgcGFyZW50IHJlcXVlc3QgdGltZXN0YW1wLCBvciBudWxsIGZvciBleHRlcm5hbC91bnJlcXVlc3RlZCBzaHV0ZG93bi5cbiAqIEBwcm9wZXJ0eSB7UG9vbGVkQ2hpbGRTaHV0ZG93blJlYXNvbn0gc2h1dGRvd25SZWFzb24gLSBFeGFjdCByZWNvcmRlZCBwYXJlbnQgcmVxdWVzdCBvciBvYnNlcnZlZCBjaGlsZCBzaHV0ZG93biBjYXVzZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpLkNoaWxkUHJvY2Vzc1tcInNpZ25hbENvZGVcIl19IHNodXRkb3duU2lnbmFsIC0gUGFyZW50LXJlcXVlc3RlZCBvciBjaGlsZC1vYnNlcnZlZCBzaHV0ZG93biBzaWduYWwgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge1Bvb2xlZFJ1bm5lclRlcm1pbmF0aW9uUmVhc29ufSB0ZXJtaW5hdGlvblJlYXNvbiAtIERlcHJlY2F0ZWQgY29tcGF0aWJpbGl0eSBjYXRlZ29yeTsgdXNlIHNodXRkb3duUmVhc29uIGZvciBleGFjdCBwcm92ZW5hbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSB0aW1lb3V0Sm9iSWQgLSBKb2Igd2hvc2UgdGltZW91dCBpbml0aWF0ZWQgY2hpbGQgdGVybWluYXRpb24sIG9yIG51bGwuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd29ya2VySWQgLSBTdGFibGUgZ2VuZXJhdGlvbi1xdWFsaWZpZWQgd29ya2VyIGlkLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9ic1dvcmtlckxpZmVjeWNsZVN0YXRlfSB3b3JrZXJMaWZlY3ljbGUgLSBQYXJlbnQgd29ya2VyIGxpZmVjeWNsZSBpbW1lZGlhdGVseSBiZWZvcmUgcmVjb3ZlcnkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gd29ya2VyUGlkIC0gUGFyZW50IHdvcmtlciBwcm9jZXNzIGlkLlxuICovXG4vKipcbiAqIEJlc3QtZWZmb3J0IG9ic2VydmF0aW9uIHNlbnQgYmVmb3JlIGEgcG9vbGVkIGNoaWxkIGNsb3NlcyBpdHMgcmVzb3VyY2VzLlxuICogQHR5cGVkZWYge29iamVjdH0gUG9vbGVkQ2hpbGRTaHV0ZG93bk9ic2VydmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2hpbGRJbnN0YW5jZUlkIC0gU3RhYmxlIHBvb2xlZC1jaGlsZCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGluZmxpZ2h0Sm9iSWRzIC0gQm91bmRlZCBpbi1mbGlnaHQgZHVyYWJsZSBqb2IgaWRzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGluZmxpZ2h0Sm9iSWRzVHJ1bmNhdGVkQ291bnQgLSBJbi1mbGlnaHQgaWRzIG9taXR0ZWQgZnJvbSB0aGUgYm91bmRlZCBzbmFwc2hvdC5cbiAqIEBwcm9wZXJ0eSB7UG9vbGVkQ2hpbGRTaHV0ZG93blJlYXNvbn0gcmVhc29uIC0gU2h1dGRvd24gcmVhc29uIG9ic2VydmVkIGJ5IHRoZSBjaGlsZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaHV0ZG93bk9ic2VydmVkQXRNcyAtIENoaWxkIG9ic2VydmF0aW9uIHRpbWVzdGFtcC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gc2h1dGRvd25SZXF1ZXN0ZWRBdE1zIC0gUGFyZW50IHJlcXVlc3QgdGltZXN0YW1wIHdoZW4gc3VwcGxpZWQgb3ZlciBJUEMuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiKS5DaGlsZFByb2Nlc3NbXCJzaWduYWxDb2RlXCJdfSBzaWduYWwgLSBSZXF1ZXN0ZWQgb3Igb2JzZXJ2ZWQgc2lnbmFsIHdoZW4gYXZhaWxhYmxlLlxuICovXG4vKipcbiAqIEJvdW5kZWQgcG9vbGVkLWNoaWxkIG1lbW9yeSBvYnNlcnZhdGlvbiBzZW50IG92ZXIgdGhlIGNoaWxkIElQQyBjaGFubmVsLlxuICogVGhlIHBvb2xlZCBjaGlsZCdzIHN0ZGlvIGlzIGlnbm9yZWQgYnkgdGhlIHdvcmtlciBmb3JrLCBzbyB0aGlzIG9ic2VydmF0aW9uXG4gKiAoc2VudCBwZXJpb2RpY2FsbHkgd2hpbGUgam9icyBydW4sIHBsdXMgb24gZGVtYW5kKSBpcyBob3cgYSBtZW1vcnkgcHJvYmxlbVxuICogaW4gYSBydW5uaW5nIGNoaWxkIG5hbWVzIGl0c2VsZi4gYGhlYXBTdGF0aXN0aWNzYCBhbmQgYG1lbW9yeVVzYWdlYFxuICogZGlzdGluZ3Vpc2ggVjgtaGVhcCBncm93dGggZnJvbSBleHRlcm5hbC9hcnJheS1idWZmZXIgKG5hdGl2ZSByZXNvdXJjZSlcbiAqIGdyb3d0aDsgYGFjdGl2ZUpvYklkc2AgdGllcyB0aGUgc2FtcGxlIHRvIHRoZSB3b3JrIHRoYXQgd2FzIGluIGZsaWdodC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBvb2xlZENoaWxkTWVtb3J5T2JzZXJ2YXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGFjdGl2ZUpvYklkcyAtIEluLWZsaWdodCBqb2IgaWRzLCBib3VuZGVkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGFjdGl2ZUpvYklkc1RydW5jYXRlZENvdW50IC0gSW4tZmxpZ2h0IGpvYiBpZHMgb21pdHRlZCBieSB0aGUgYm91bmQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2hpbGRJbnN0YW5jZUlkIC0gU3RhYmxlIGlkZW50aXR5IHJlcG9ydGVkIGJ5IHRoZSBjaGlsZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjaGlsZFBpZCAtIENoaWxkIHByb2Nlc3MgaWQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gY2hpbGRVcHRpbWVNcyAtIENoaWxkIHByb2Nlc3MgdXB0aW1lIGluIG1zLlxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnQoXCJub2RlOnY4XCIpLmdldEhlYXBTdGF0aXN0aWNzPn0gaGVhcFN0YXRpc3RpY3MgLSBWOCBoZWFwLXN0YXQgYnJlYWtkb3duIGF0IHRoZSBzYW1wbGUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gam9iQ291bnQgLSBJbi1mbGlnaHQgam9iIGNvdW50LlxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnQoXCJub2RlOnByb2Nlc3NcIikubWVtb3J5VXNhZ2U+fSBtZW1vcnlVc2FnZSAtIFByb2Nlc3MgbWVtb3J5IGJyZWFrZG93biBhdCB0aGUgc2FtcGxlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG9ic2VydmVkQXRNcyAtIEVwb2NoIG1zIHRoZSBjaGlsZCBzYW1wbGVkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHBlYWtSc3NCeXRlcyAtIENoaWxkLXJlcG9ydGVkIHBlYWsgUlNTIChrZXJuZWwgYFZtSFdNYCBoaWdoLXdhdGVyIG1hcmspIGluIGJ5dGVzLCBtb25vdG9uaWMgZm9yIHRoZSBjaGlsZCdzIGxpZmUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcnNzQnl0ZXMgLSBSZXNpZGVudCBzZXQgc2l6ZSBpbiBieXRlcyBhdCB0aGUgc2FtcGxlLlxuICogQHByb3BlcnR5IHtcInBvb2xlZC1jaGlsZC1tZW1vcnlcIn0gdHlwZSAtIERpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdXB0aW1lTXMgLSBQcm9jZXNzIHVwdGltZSBpbiBtcy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2NhbEJhY2tncm91bmRKb2JzQ2xvY2tcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBub3cgLSBDdXJyZW50IGVwb2NoIG1pbGxpc2Vjb25kcy5cbiAqIEBwcm9wZXJ0eSB7KGNhbGxiYWNrOiAoKSA9PiB2b2lkLCBkZWxheU1zOiBudW1iZXIpID0+IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVtYmVyfSBzZXRUaW1lb3V0IC0gQXJtcyBhIHRpbWVyLlxuICogQHByb3BlcnR5IHsodGltZXJJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudW1iZXIpID0+IHZvaWR9IGNsZWFyVGltZW91dCAtIENsZWFycyBhIHRpbWVyLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJlc29sdmVkQmFja2dyb3VuZEpvYkNvbmN1cnJlbmN5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29uY3VycmVuY3lLZXkgLSBEdXJhYmxlIGNhcCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhDb25jdXJyZW5jeSAtIFBvc2l0aXZlIGNhcC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcXVldWVEZXJpdmVkIC0gV2hldGhlciBxdWV1ZSBjb25maWd1cmF0aW9uIG93bnMgdGhlIGNhcC5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iQ29uY3VycmVuY3lSZXBhaXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBhY3RpdmVDb3VudCAtIEV4YWN0IGhhbmRlZC1vZmYgam9iIGNvdW50IHBlcnNpc3RlZCBieSB0aGUgcmVwYWlyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbmN1cnJlbmN5S2V5IC0gRHVyYWJsZSBjYXAgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcHJldmlvdXNBY3RpdmVDb3VudCAtIFBlcnNpc3RlZCBjb3VudCByZXBsYWNlZCBieSB0aGUgcmVwYWlyLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JDb25jdXJyZW5jeVJlY29uY2lsaWF0aW9uXG4gKiBAcHJvcGVydHkge251bWJlcn0gY2FuZGlkYXRlQ291bnQgLSBTbmFwc2hvdCBtaXNtYXRjaGVzIHJlY2hlY2tlZCB1bmRlciB0aGVpciBjb3VudGVyIGxvY2tzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNoZWNrZWRDb3VudCAtIEFjdGl2ZSBvciBub256ZXJvIGR1cmFibGUgY291bnRlcnMgY29tcGFyZWQgaW4gdGhlIGluaXRpYWwgc25hcHNob3QuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcmVwYWlyZWRDb3VudCAtIENvdW50ZXJzIHdob3NlIHBlcnNpc3RlZCB2YWx1ZXMgd2VyZSBjaGFuZ2VkLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iQ29uY3VycmVuY3lSZXBhaXJbXX0gcmVwYWlycyAtIEJvdW5kZWQgZGV0ZXJtaW5pc3RpYyBzYW1wbGUgb2YgYXBwbGllZCByZXBhaXJzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHJlcGFpcnNUcnVuY2F0ZWRDb3VudCAtIEFwcGxpZWQgcmVwYWlycyBvbWl0dGVkIGZyb20gdGhlIHNhbXBsZS5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmVwYXJlZExvY2FsQmFja2dyb3VuZEpvYlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFyZ3NEaWdlc3QgLSBGaXhlZC13aWR0aCBkaWdlc3Qgb2YgdGhlIHNlcmlhbGl6ZWQgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFyZ3NKc29uIC0gU2VyaWFsaXplZCBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge1Jlc29sdmVkQmFja2dyb3VuZEpvYkNvbmN1cnJlbmN5IHwgbnVsbH0gY29uY3VycmVuY3kgLSBSZXNvbHZlZCBjb25jdXJyZW5jeS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjcmVhdGVkQXRNcyAtIENyZWF0aW9uIHRpbWVzdGFtcC5cbiAqIEBwcm9wZXJ0eSB7XCJpbmxpbmVcIn0gZXhlY3V0aW9uTW9kZSAtIExvY2FsIGluLXByb2Nlc3MgZXhlY3V0aW9uIG1vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gam9iSWQgLSBEdXJhYmxlIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYk5hbWUgLSBSZWdpc3RlcmVkIG5hbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4UmV0cmllcyAtIFJldHJ5IGNhcC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWV1ZSAtIFF1ZXVlIG5hbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2NoZWR1bGVkQXRNcyAtIEVsaWdpYmlsaXR5IHRpbWVzdGFtcC5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9ic0hlYWx0aFxuICogQHByb3BlcnR5IHtib29sZWFufSByZWFkeSAtIFdoZXRoZXIgdGhlIGFkYXB0ZXIgY2FuIGFjY2VwdCBhbmQgcHJvY2VzcyB3b3JrLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JzUHJvZHVjZXJcbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IHtqb2JOYW1lOiBzdHJpbmcsIGFyZ3M6IEFycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Piwgb3B0aW9ucz86IEJhY2tncm91bmRKb2JPcHRpb25zLCBwcm9kdWNlckludm9jYXRpb25JZD86IHN0cmluZywgcHJvZHVjZXJQcm9vZj86IEJhY2tncm91bmRKb2JQcm9kdWNlclByb29mfSkgPT4gUHJvbWlzZTxzdHJpbmc+fSBlbnF1ZXVlIC0gRW5xdWV1ZXMgYSBqb2IuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7c2NoZWR1bGVLZXk6IHN0cmluZywgam9iTmFtZTogc3RyaW5nLCBhcmdzOiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIG9wdGlvbnM/OiBCYWNrZ3JvdW5kSm9iT3B0aW9uc30pID0+IFByb21pc2U8QmFja2dyb3VuZEpvYlJlcGxhY2VtZW50UmVzdWx0Pn0gcmVwbGFjZVNjaGVkdWxlZCAtIFJlcGxhY2VzIGEgc3RhYmxlIHNjaGVkdWxlLlxuICogQHByb3BlcnR5IHsoYXJnczoge3NjaGVkdWxlS2V5OiBzdHJpbmd9KSA9PiBQcm9taXNlPEJhY2tncm91bmRKb2JDYW5jZWxsYXRpb25SZXN1bHQ+fSBjYW5jZWxTY2hlZHVsZWQgLSBDYW5jZWxzIGEgc3RhYmxlIHNjaGVkdWxlLlxuICogQHByb3BlcnR5IHsoYXJnczoge3NjaGVkdWxlS2V5OiBzdHJpbmcsIGluY2x1ZGVMYXRlc3RUZXJtaW5hbD86IGJvb2xlYW59KSA9PiBQcm9taXNlPEJhY2tncm91bmRKb2JTY2hlZHVsZWRMb29rdXBSZXN1bHQ+fSBnZXRTY2hlZHVsZWRKb2IgLSBSZWFkcyBzdGFibGUgc2NoZWR1bGUgb3duZXJzaGlwIGFuZCBoaXN0b3J5LlxuICogQHByb3BlcnR5IHsoYXJnczoge3NjaGVkdWxlS2V5OiBzdHJpbmd9KSA9PiBQcm9taXNlPEJhY2tncm91bmRKb2JXYWtlUmVzdWx0Pn0gd2FrZVNjaGVkdWxlZCAtIEV4cGVkaXRlcyBhIHN0YWJsZSBzY2hlZHVsZSBvd25lci5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iSGFuZG9mZlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGhhbmRvZmZJZCAtIFVuaXF1ZSBoYW5kb2ZmIGxlYXNlIGlkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhhbmRlZE9mZkF0TXMgLSBUaW1lIGhhbmRlZCB0byBhIHdvcmtlciBpbiBtcy5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYlJvd30gW2pvYl0gLSBFeGFjdCBjb21taXR0ZWQgam9iIHNuYXBzaG90IHdoZW4gdGhlIGFkYXB0ZXIgY2hhbmdlcyBkaXNwYXRjaCBkYXRhIGR1cmluZyB0aGUgY2xhaW0uXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYkhhbmRvZmZTbmFwc2hvdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYklkIC0gSm9iIGhvbGRpbmcgdGhlIGxlYXNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGhhbmRvZmZJZCAtIEV4YWN0IGR1cmFibGUgbGVhc2UgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd29ya2VySWQgLSBTdGFibGUgd29ya2VyIGlkIHRoYXQgcmVjZWl2ZWQgdGhlIGxlYXNlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGhhbmRlZE9mZkF0TXMgLSBUaW1lIGhhbmRlZCB0byB0aGUgd29ya2VyIGluIG1zLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JIYW5kb2ZmUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYklkIC0gSm9iIHRvIGNsYWltLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtoYW5kb2ZmSWRdIC0gRXhhY3QgY2FsbGVyLXNlbGVjdGVkIGxlYXNlIGlkLiBBZGFwdGVycyBtdXN0IHBlcnNpc3QgYW5kIHJldHVybiB0aGlzIGlkIHdoZW4gc3VwcGxpZWQ7IGJ1aWx0LWluIGFkYXB0ZXJzIGdlbmVyYXRlIG9uZSB3aGVuIG9taXR0ZWQgZm9yIGxlZ2FjeSBkaXJlY3QgY2FsbGVycy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbd29ya2VySWRdIC0gV29ya2VyIGNsYWltaW5nIHRoZSBqb2IuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYkV4ZWN1dGlvbk1vZGV9IFtleGVjdXRpb25Nb2RlXSAtIEhvdyB0aGUgam9iIHNob3VsZCBydW4uIE5vZGUgZGVmYXVsdHMgdG8gYFwicG9vbGVkXCJgIChhIHdhcm0sIHJldXNlZCBsb2NhbCBydW5uZXIgcHJvY2VzcykuIEJyb3dzZXIvRXhwbyBsb2NhbCBkaXNwYXRjaCBkZWZhdWx0cyB0byBhbmQgb25seSBhY2NlcHRzIGBcImlubGluZVwiYC4gYFwiZm9ya2VkXCJgIHJ1bnMgYSBOb2RlIGpvYiBpbiBhIGZyZXNoIGBjaGlsZF9wcm9jZXNzLmZvcmsoKWAgY2hpbGQsIGFuZCBgXCJzcGF3bmVkXCJgIGluIGEgZGV0YWNoZWQgQ0xJIHJ1bm5lci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4UmV0cmllc10gLSBNYXggcmV0cmllcyBmb3IgYSBmYWlsZWQgam9iIGJlZm9yZSBpdCBpcyBtYXJrZWQgZmFpbGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtxdWV1ZV0gLSBRdWV1ZSBuYW1lLiBEZWZhdWx0cyB0byBgXCJkZWZhdWx0XCJgLiBXaGVuIHRoZSBxdWV1ZSBoYXMgYSBjb25maWd1cmVkIGNhcCBpbiBgYmFja2dyb3VuZEpvYnMucXVldWVzYCwgdGhhdCBjYXAgaXMgZW5mb3JjZWQgY2x1c3Rlci13aWRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb25jdXJyZW5jeUtleV0gLSBPcGFxdWUgbm9uLWVtcHR5IGtleSB1c2VkIHRvIHNoYXJlIGEgY29uY3VycmVuY3kgY2FwLiBPdmVycmlkZXMgYW55IHF1ZXVlLWRlcml2ZWQgY2FwLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhDb25jdXJyZW5jeV0gLSBQb3NpdGl2ZSBpbnRlZ2VyIGNhcDsgbXVzdCBiZSBwYWlyZWQgd2l0aCBgY29uY3VycmVuY3lLZXlgLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVkdXBsaWNhdGVXaGlsZVF1ZXVlZF0gLSBXaGVuIHRydWUsIHNraXAgdGhlIGVucXVldWUgaWYgYW4gaWRlbnRpY2FsIHN0aWxsLXF1ZXVlZCBqb2IgKHNhbWUgam9iIG5hbWUsIGFyZ3MgYW5kIHF1ZXVlKSBpcyBzY2hlZHVsZWQgbm8gbGF0ZXIgdGhhbiB0aGlzIGVucXVldWUsIHJldHVybmluZyB0aGUgZWFybGllc3QgbWF0Y2hpbmcgam9iJ3MgaWQuIEEgZnV0dXJlIHJldHJ5IGRvZXMgbm90IHN1cHByZXNzIGVhcmxpZXIgd29yay4gRGVkdXBsaWNhdGlvbiBpcyBpbmRlcGVuZGVudCBvZiBgY29uY3VycmVuY3lLZXlgLCBzbyB0aGUgam9iIGtlZXBzIGl0cyBub3JtYWwgKGUuZy4gcXVldWUtZGVyaXZlZCkgY29uY3VycmVuY3kgY2FwLiBLZWVwcyBhbiBpbnRlcnZhbC1zY2hlZHVsZWQgcmVjdXJyaW5nIGpvYiAoZS5nLiByZXRlbnRpb24gcHJ1bmluZykgZnJvbSBwaWxpbmcgdXAgcmVkdW5kYW50IHF1ZXVlZCByb3dzIHdoZW4gaXQgcnVucyBzbG93ZXIgdGhhbiBpdHMgaW50ZXJ2YWwgb3Igbm8gd29ya2VyIGlzIGZyZWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkZW1wb3RlbmN5S2V5XSAtIER1cmFibGUgZW5xdWV1ZSBpZGVudGl0eSBzY29wZWQgdG8gdGhlIHJlc29sdmVkIGpvYiBjbGFzcyBuYW1lIGFuZCBxdWV1ZS4gRXhhY3QgcmVwbGF5IHJldHVybnMgdGhlIG9yaWdpbmFsIGpvYiBpZCBhY3Jvc3MgZXZlcnkgc3RhdGUgYW5kIGFmdGVyIGpvYiBwcnVuaW5nOyByZXVzZSB3aXRoIGRpZmZlcmVudCBjYW5vbmljYWwgYXJndW1lbnRzIG9yIGJlaGF2aW9yLWFmZmVjdGluZyBvcHRpb25zIGZhaWxzLiBPd25lcnNoaXAgaXMgaW5kZXBlbmRlbnQgb2YgYGRlZHVwbGljYXRlV2hpbGVRdWV1ZWRgIGFuZCBpcyByZXRhaW5lZCB1bnRpbCBhbiBleHBsaWNpdCBmdXR1cmUgcmV0ZW50aW9uIHBvbGljeSByZW1vdmVzIGl0LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzY2hlZHVsZWRBdE1zXSAtIEVwb2NoIHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMgd2hlbiB0aGUgam9iIGJlY29tZXMgZWxpZ2libGUgZm9yIGRpc3BhdGNoLiBEZWZhdWx0cyB0byBlbnF1ZXVlIHRpbWUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRNc10gLSBQZXItam9iIHdhbGwtY2xvY2sgdGltZW91dCBmb3IgZm9ya2VkIGFuZCBwb29sZWQgZXhlY3V0aW9uLiBBIHBvc2l0aXZlIGludGVnZXIgdXAgdG8gMiwxNDcsNDgzLDY0NyBvdmVycmlkZXMgYSBqb2IgY2xhc3MncyBgc3RhdGljIHRpbWVvdXRNc2AgYW5kIHRoZSB3b3JrZXItbGV2ZWwgYGpvYlRpbWVvdXRNc2A7IGEgbm9uLXBvc2l0aXZlIGZpbml0ZSB2YWx1ZSBkaXNhYmxlcyB0aGUgdGltZW91dCBmb3IgdGhpcyBqb2IuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYlBheWxvYWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gSm9iIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYk5hbWUgLSBKb2IgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBbYXJnc10gLSBTZXJpYWxpemVkIGpvYiBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hhbmRvZmZJZF0gLSBVbmlxdWUgaGFuZG9mZiBsZWFzZSBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbd29ya2VySWRdIC0gV29ya2VyIGlkIGhhbmRsaW5nIHRoZSBqb2IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2hhbmRlZE9mZkF0TXNdIC0gVGltZSBoYW5kZWQgdG8gYSB3b3JrZXIgaW4gbXMuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JPcHRpb25zfSBbb3B0aW9uc10gLSBSdW50aW1lIG9wdGlvbnMuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYkNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4vcGxhdGZvcm0tam9iLmpzXCIpLmRlZmF1bHR9IGpvYkNsYXNzIC0gQ29uY3JldGUgam9iIGNsYXNzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYk5hbWUgLSBSZWdpc3RlcmVkIGpvYiBuYW1lLlxuICogQHByb3BlcnR5IHtBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3MgLSBTZXJpYWxpemVkIGpvYiBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JPcHRpb25zfSBvcHRpb25zIC0gUmVzb2x2ZWQgZW5xdWV1ZS9ydW50aW1lIG9wdGlvbnMuXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JQYXlsb2FkfSBbcGF5bG9hZF0gLSBDb21wbGV0ZSBwZXJzaXN0ZWQgcnVubmVyIHBheWxvYWQgd2hlbiB0aGUgam9iIGlzIHBlcmZvcm1pbmcuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYlJvd1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gSm9iIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGpvYk5hbWUgLSBKb2IgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzIC0gU2VyaWFsaXplZCBqb2IgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iRXhlY3V0aW9uTW9kZX0gZXhlY3V0aW9uTW9kZSAtIEhvdyB0aGUgam9iIHNob3VsZCBydW4uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcXVldWUgLSBRdWV1ZSBuYW1lIChkZWZhdWx0cyB0byBgXCJkZWZhdWx0XCJgKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gc2NoZWR1bGVLZXkgLSBTdGFibGUgbG9naWNhbCBzY2hlZHVsZSBrZXkgcmV0YWluZWQgZm9yIGhpc3RvcnkuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IHNjaGVkdWxlT3JkZXIgLSBUcmFuc2FjdGlvbi1hc3NpZ25lZCBtb25vdG9uaWMgb3duZXJzaGlwIG9yZGVyIGZvciB0aGlzIHNjaGVkdWxlIGtleTsgTm9kZSBwcmVzZXJ2ZXMgaXRzIGhpZ2gtd2F0ZXIgbWFyayBhY3Jvc3MgdGVybWluYWwtaGlzdG9yeSBwcnVuaW5nLiBOdWxsIGZvciBsZWdhY3kvbm9uLXNjaGVkdWxlZCByb3dzLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iU3RhdHVzfSBzdGF0dXMgLSBDdXJyZW50IGpvYiBzdGF0dXMuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGF0dGVtcHRzIC0gRmFpbHVyZSBhdHRlbXB0cyBjb3VudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gbWF4UmV0cmllcyAtIE1heCByZXRyeSBhdHRlbXB0cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gc2NoZWR1bGVkQXRNcyAtIE5leHQgc2NoZWR1bGVkIHRpbWUgaW4gbXMuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGNyZWF0ZWRBdE1zIC0gQ3JlYXRpb24gdGltZSBpbiBtcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gaGFuZGVkT2ZmQXRNcyAtIFRpbWUgaGFuZGVkIHRvIHdvcmtlciBpbiBtcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gaGFuZG9mZklkIC0gVW5pcXVlIGxhdGVzdCBoYW5kb2ZmIGxlYXNlIGlkLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBjb21wbGV0ZWRBdE1zIC0gQ29tcGxldGlvbiB0aW1lIGluIG1zLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBmYWlsZWRBdE1zIC0gRmFpbHVyZSB0aW1lIGluIG1zLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBvcnBoYW5lZEF0TXMgLSBPcnBoYW5lZCB0aW1lIGluIG1zLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSB3b3JrZXJJZCAtIFdvcmtlciBpZCBoYW5kbGluZyB0aGUgam9iLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBsYXN0RXJyb3IgLSBMYXN0IGZhaWx1cmUgbWVzc2FnZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gY29uY3VycmVuY3lLZXkgLSBEdXJhYmxlIGNvbmN1cnJlbmN5IGtleS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gbWF4Q29uY3VycmVuY3kgLSBEdXJhYmxlIHBlci1rZXkgY2FwLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSB0aW1lb3V0TXMgLSBQZXItam9iIHdhbGwtY2xvY2sgdGltZW91dCBvdmVycmlkZSwgb3IgbnVsbCB3aGVuIG9taXR0ZWQuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGNoaWxkUmVjZWl2ZWRBdE1zIC0gRXBvY2ggbXMgd2hlbiB0aGUgZXhlY3V0aW5nIHBvb2xlZCBjaGlsZCdzIGV2ZW50IGxvb3AgcHJvY2Vzc2VkIHRoZSBqb2IgbWVzc2FnZSwgb3IgbnVsbCB3aGVuIG5vIHJ1bm5lciBhY2NlcHRlZCBpdCB5ZXQuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGNoaWxkU3RhcnRlZEF0TXMgLSBFcG9jaCBtcyB3aGVuIHRoZSBqb2IncyBwZXJmb3JtIHN0YXJ0ZWQgaW4gdGhlIHBvb2xlZCBjaGlsZCwgb3IgbnVsbCB3aGVuIGl0IG5ldmVyIHN0YXJ0ZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGNoaWxkSW5zdGFuY2VJZCAtIFN0YWJsZSBpZGVudGl0eSBvZiB0aGUgcG9vbGVkIGNoaWxkIHByb2Nlc3MgdGhhdCBhY2NlcHRlZCB0aGUgam9iLCBvciBudWxsLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBjaGlsZFBpZCAtIE9TIHBpZCBvZiB0aGUgcG9vbGVkIGNoaWxkIHByb2Nlc3MgdGhhdCBhY2NlcHRlZCB0aGUgam9iLCBvciBudWxsLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBydW5uZXJIb3N0bmFtZSAtIEhvc3RuYW1lIHJlcG9ydGVkIGJ5IHRoZSBwb29sZWQgY2hpbGQgcHJvY2VzcyB0aGF0IGFjY2VwdGVkIHRoZSBqb2IsIG9yIG51bGwuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge1wicXVldWVkXCIgfCBcImhhbmRlZF9vZmZcIiB8IG51bGx9IEJhY2tncm91bmRKb2JSZXBsYWNlbWVudFByZXZpb3VzU3RhdHVzXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2dyb3VuZEpvYlJlcGxhY2VtZW50UmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gam9iSWQgLSBOZXdseSBxdWV1ZWQgam9iIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBwcmV2aW91c0pvYklkIC0gUHJldmlvdXMgYWN0aXZlIG93bmVyJ3Mgam9iIGlkLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iUmVwbGFjZW1lbnRQcmV2aW91c1N0YXR1c30gcHJldmlvdXNTdGF0dXMgLSBQcmV2aW91cyBvd25lcidzIG9ic2VydmVkIHN0YXRlLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtcImNhbmNlbGxlZFwiIHwgXCJoYW5kZWRfb2ZmXCIgfCBcIm5vdF9mb3VuZFwifSBCYWNrZ3JvdW5kSm9iQ2FuY2VsbGF0aW9uT3V0Y29tZVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JDYW5jZWxsYXRpb25SZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gam9iSWQgLSBEZXRhY2hlZCBvd25lcidzIGpvYiBpZCwgd2hlbiBvbmUgd2FzIGFjdGl2ZS5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYkNhbmNlbGxhdGlvbk91dGNvbWV9IG91dGNvbWUgLSBUcnV0aGZ1bCBiZXN0LWVmZm9ydCBvdXRjb21lLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JTY2hlZHVsZWRMb29rdXBSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYlJvdyB8IG51bGx9IGN1cnJlbnRKb2IgLSBDdXJyZW50IHF1ZXVlZCBvciBoYW5kZWQtb2ZmIG93bmVyLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9iUm93IHwgbnVsbH0gbGF0ZXN0VGVybWluYWxKb2IgLSBMYXRlc3QgdGVybWluYWwgaGlzdG9yeSB3aGVuIHJlcXVlc3RlZC5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7XCJ3b2tlblwiIHwgXCJhbHJlYWR5X2R1ZVwiIHwgXCJoYW5kZWRfb2ZmXCIgfCBcIm5vdF9mb3VuZFwifSBCYWNrZ3JvdW5kSm9iV2FrZU91dGNvbWVcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iV2FrZVJlc3VsdFxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBqb2JJZCAtIEN1cnJlbnQgb3duZXIncyBkdXJhYmxlIGpvYiBpZCwgd2hlbiBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYldha2VPdXRjb21lfSBvdXRjb21lIC0gRXhhY3Qgd2FrZSBvdXRjb21lLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JGYWlsdXJlRXZlbnRcbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYlJvd30gam9iIC0gVXBkYXRlZCBqb2Igcm93IGFmdGVyIGZhaWx1cmUgaGFuZGxpbmcuXG4gKiBAcHJvcGVydHkge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBlcnJvciAtIEZhaWx1cmUgZXJyb3IuXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IGF0dGVtcHRzIC0gVXBkYXRlZCBmYWlsdXJlIGF0dGVtcHRzIGNvdW50LlxuICogQHByb3BlcnR5IHtib29sZWFufSB0ZXJtaW5hbCAtIFdoZXRoZXIgdGhpcyBmYWlsdXJlIGVuZGVkIHRoZSBqb2IuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdpbGxSZXRyeSAtIFdoZXRoZXIgdGhlIGpvYiB3YXMgcmV0dXJuZWQgdG8gdGhlIHF1ZXVlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCB1bmRlZmluZWR9IGhhbmRvZmZJZCAtIEhhbmRvZmYgbGVhc2UgaWQgZnJvbSB0aGUgd29ya2VyIHJlcG9ydC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgdW5kZWZpbmVkfSBoYW5kZWRPZmZBdE1zIC0gSGFuZG9mZiB0aW1lc3RhbXAgZnJvbSB0aGUgd29ya2VyIHJlcG9ydC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB3b3JrZXJJZCAtIFdvcmtlciBpZCBmcm9tIHRoZSB3b3JrZXIgcmVwb3J0LlxuICogQHByb3BlcnR5IHtQb29sZWRSdW5uZXJGYWlsdXJlIHwgdW5kZWZpbmVkfSBydW5uZXJGYWlsdXJlIC0gU2hhcmVkIHBvb2xlZC1jaGlsZCBwcm9jZXNzIGZhaWx1cmUgcHJvdmVuYW5jZS5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7XCJ3b3JrZXJcIiB8IFwiY2xpZW50XCIgfCBcInJlcG9ydGVyXCJ9IEJhY2tncm91bmRKb2JTb2NrZXRSb2xlXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge3t0eXBlOiBcImhlbGxvXCIsIHJvbGU6IEJhY2tncm91bmRKb2JTb2NrZXRSb2xlLCBnZW5lcmF0aW9uSWQ/OiBzdHJpbmcsIHN1cHBvcnRzSGFuZG9mZklkUmVwb3J0aW5nPzogYm9vbGVhbiwgc3VwcG9ydHNIZWFydGJlYXQ/OiBib29sZWFuLCBzdXBwb3J0c1Bvb2xlZD86IGJvb2xlYW4sIHdvcmtlcklkPzogc3RyaW5nfX0gQmFja2dyb3VuZEpvYkhlbGxvTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImdlbmVyYXRpb24tYWNjZXB0ZWRcIiwgZ2VuZXJhdGlvbklkOiBzdHJpbmcsIGxpZmVjeWNsZVN0YXRlOiBCYWNrZ3JvdW5kSm9ic0dlbmVyYXRpb25MaWZlY3ljbGVTdGF0ZX19IEJhY2tncm91bmRKb2JHZW5lcmF0aW9uQWNjZXB0ZWRNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiZ2VuZXJhdGlvbi1yZWplY3RlZFwiLCByZWFzb246IEJhY2tncm91bmRKb2JzR2VuZXJhdGlvblJlamVjdGlvblJlYXNvbn19IEJhY2tncm91bmRKb2JHZW5lcmF0aW9uUmVqZWN0ZWRNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwicmVhZHlcIiwgYWNjZXB0c0ZvcmtlZD86IGJvb2xlYW4sIGFjY2VwdHNJbmxpbmU/OiBib29sZWFuLCBhY2NlcHRzUG9vbGVkPzogYm9vbGVhbiwgYWNjZXB0c1NwYXduZWQ/OiBib29sZWFuLCBhdmFpbGFibGVQb29sZWRTbG90cz86IG51bWJlcn19IEJhY2tncm91bmRKb2JSZWFkeU1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJkcmFpbmluZ1wifX0gQmFja2dyb3VuZEpvYkRyYWluaW5nTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImhlYXJ0YmVhdFwiLCB3b3JrZXJJZD86IHN0cmluZ319IEJhY2tncm91bmRKb2JIZWFydGJlYXRNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiZW5xdWV1ZVwiLCBqb2JOYW1lOiBzdHJpbmcsIGFyZ3M/OiBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIG9wdGlvbnM/OiBCYWNrZ3JvdW5kSm9iT3B0aW9ucywgcHJvZHVjZXJJbnZvY2F0aW9uSWQ/OiBzdHJpbmcsIHByb2R1Y2VyUHJvb2Y/OiBCYWNrZ3JvdW5kSm9iUHJvZHVjZXJQcm9vZn19IEJhY2tncm91bmRKb2JFbnF1ZXVlTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImVucXVldWVkXCIsIGpvYklkOiBzdHJpbmd9fSBCYWNrZ3JvdW5kSm9iRW5xdWV1ZWRNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiZW5xdWV1ZS1lcnJvclwiLCBlcnJvcj86IHN0cmluZ319IEJhY2tncm91bmRKb2JFbnF1ZXVlRXJyb3JNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwicmVwbGFjZS1zY2hlZHVsZWRcIiwgc2NoZWR1bGVLZXk6IHN0cmluZywgam9iTmFtZTogc3RyaW5nLCBhcmdzPzogQXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBvcHRpb25zPzogQmFja2dyb3VuZEpvYk9wdGlvbnN9fSBCYWNrZ3JvdW5kSm9iUmVwbGFjZVNjaGVkdWxlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJzY2hlZHVsZS1yZXBsYWNlZFwiLCBqb2JJZDogc3RyaW5nLCBwcmV2aW91c0pvYklkOiBzdHJpbmcgfCBudWxsLCBwcmV2aW91c1N0YXR1czogQmFja2dyb3VuZEpvYlJlcGxhY2VtZW50UHJldmlvdXNTdGF0dXN9fSBCYWNrZ3JvdW5kSm9iU2NoZWR1bGVSZXBsYWNlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJyZXBsYWNlLXNjaGVkdWxlZC1lcnJvclwiLCBlcnJvcj86IHN0cmluZ319IEJhY2tncm91bmRKb2JSZXBsYWNlU2NoZWR1bGVkRXJyb3JNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiY2FuY2VsLXNjaGVkdWxlZFwiLCBzY2hlZHVsZUtleTogc3RyaW5nfX0gQmFja2dyb3VuZEpvYkNhbmNlbFNjaGVkdWxlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJzY2hlZHVsZS1jYW5jZWxsZWRcIiwgam9iSWQ6IHN0cmluZyB8IG51bGwsIG91dGNvbWU6IEJhY2tncm91bmRKb2JDYW5jZWxsYXRpb25PdXRjb21lfX0gQmFja2dyb3VuZEpvYlNjaGVkdWxlQ2FuY2VsbGVkTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImNhbmNlbC1zY2hlZHVsZWQtZXJyb3JcIiwgZXJyb3I/OiBzdHJpbmd9fSBCYWNrZ3JvdW5kSm9iQ2FuY2VsU2NoZWR1bGVkRXJyb3JNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiZ2V0LXNjaGVkdWxlZC1qb2JcIiwgc2NoZWR1bGVLZXk6IHN0cmluZywgaW5jbHVkZUxhdGVzdFRlcm1pbmFsPzogYm9vbGVhbn19IEJhY2tncm91bmRKb2JHZXRTY2hlZHVsZWRNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwic2NoZWR1bGVkLWpvYlwiLCBjdXJyZW50Sm9iOiBCYWNrZ3JvdW5kSm9iUm93IHwgbnVsbCwgbGF0ZXN0VGVybWluYWxKb2I6IEJhY2tncm91bmRKb2JSb3cgfCBudWxsfX0gQmFja2dyb3VuZEpvYlNjaGVkdWxlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJnZXQtc2NoZWR1bGVkLWpvYi1lcnJvclwiLCBlcnJvcj86IHN0cmluZ319IEJhY2tncm91bmRKb2JHZXRTY2hlZHVsZWRFcnJvck1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJ3YWtlLXNjaGVkdWxlZFwiLCBzY2hlZHVsZUtleTogc3RyaW5nfX0gQmFja2dyb3VuZEpvYldha2VTY2hlZHVsZWRNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwic2NoZWR1bGUtd29rZW5cIiwgam9iSWQ6IHN0cmluZyB8IG51bGwsIG91dGNvbWU6IEJhY2tncm91bmRKb2JXYWtlT3V0Y29tZX19IEJhY2tncm91bmRKb2JTY2hlZHVsZVdva2VuTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcIndha2Utc2NoZWR1bGVkLWVycm9yXCIsIGVycm9yPzogc3RyaW5nfX0gQmFja2dyb3VuZEpvYldha2VTY2hlZHVsZWRFcnJvck1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJqb2JcIiwgcGF5bG9hZDogQmFja2dyb3VuZEpvYlBheWxvYWR9fSBCYWNrZ3JvdW5kSm9iSm9iTWVzc2FnZVxuICogQHR5cGVkZWYge3t0eXBlOiBcImpvYi1hY2NlcHRlZFwiLCBqb2JJZDogc3RyaW5nLCBoYW5kb2ZmSWQ/OiBzdHJpbmcsIHdvcmtlcklkPzogc3RyaW5nLCBoYW5kZWRPZmZBdE1zPzogbnVtYmVyLCByZWNlaXZlZEF0TXM/OiBudW1iZXIsIHN0YXJ0ZWRBdE1zPzogbnVtYmVyLCBjaGlsZEluc3RhbmNlSWQ/OiBzdHJpbmcsIGNoaWxkUGlkPzogbnVtYmVyLCBydW5uZXJIb3N0bmFtZT86IHN0cmluZ319IEJhY2tncm91bmRKb2JBY2NlcHRlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJqb2ItY29tcGxldGVcIiwgam9iSWQ6IHN0cmluZywgaGFuZG9mZklkPzogc3RyaW5nLCB3b3JrZXJJZD86IHN0cmluZywgaGFuZGVkT2ZmQXRNcz86IG51bWJlcn19IEJhY2tncm91bmRKb2JDb21wbGV0ZU1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJqb2ItZmFpbGVkXCIsIGpvYklkOiBzdHJpbmcsIGVycm9yPzogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4sIGhhbmRvZmZJZD86IHN0cmluZywgd29ya2VySWQ/OiBzdHJpbmcsIGhhbmRlZE9mZkF0TXM/OiBudW1iZXIsIHJ1bm5lckZhaWx1cmU/OiBQb29sZWRSdW5uZXJGYWlsdXJlfX0gQmFja2dyb3VuZEpvYkZhaWxlZE1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJqb2ItcmVzY2hlZHVsZVwiLCBqb2JJZDogc3RyaW5nLCBkZWxheU1zOiBudW1iZXIsIGhhbmRvZmZJZD86IHN0cmluZywgd29ya2VySWQ/OiBzdHJpbmcsIGhhbmRlZE9mZkF0TXM/OiBudW1iZXJ9fSBCYWNrZ3JvdW5kSm9iUmVzY2hlZHVsZU1lc3NhZ2VcbiAqIEB0eXBlZGVmIHt7dHlwZTogXCJqb2ItdXBkYXRlZFwiLCBqb2JJZDogc3RyaW5nfX0gQmFja2dyb3VuZEpvYlVwZGF0ZWRNZXNzYWdlXG4gKiBAdHlwZWRlZiB7e3R5cGU6IFwiam9iLXVwZGF0ZS1lcnJvclwiLCBqb2JJZDogc3RyaW5nLCBlcnJvcj86IHN0cmluZ319IEJhY2tncm91bmRKb2JVcGRhdGVFcnJvck1lc3NhZ2VcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7QmFja2dyb3VuZEpvYkhlbGxvTWVzc2FnZSB8IEJhY2tncm91bmRKb2JHZW5lcmF0aW9uQWNjZXB0ZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkdlbmVyYXRpb25SZWplY3RlZE1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iUmVhZHlNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkRyYWluaW5nTWVzc2FnZSB8IEJhY2tncm91bmRKb2JIZWFydGJlYXRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkVucXVldWVNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkVucXVldWVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JFbnF1ZXVlRXJyb3JNZXNzYWdlIHwgQmFja2dyb3VuZEpvYlJlcGxhY2VTY2hlZHVsZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYlNjaGVkdWxlUmVwbGFjZWRNZXNzYWdlIHwgQmFja2dyb3VuZEpvYlJlcGxhY2VTY2hlZHVsZWRFcnJvck1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iQ2FuY2VsU2NoZWR1bGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JTY2hlZHVsZUNhbmNlbGxlZE1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iQ2FuY2VsU2NoZWR1bGVkRXJyb3JNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkdldFNjaGVkdWxlZE1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iU2NoZWR1bGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JHZXRTY2hlZHVsZWRFcnJvck1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iV2FrZVNjaGVkdWxlZE1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iU2NoZWR1bGVXb2tlbk1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iV2FrZVNjaGVkdWxlZEVycm9yTWVzc2FnZSB8IEJhY2tncm91bmRKb2JKb2JNZXNzYWdlIHwgQmFja2dyb3VuZEpvYkFjY2VwdGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JDb21wbGV0ZU1lc3NhZ2UgfCBCYWNrZ3JvdW5kSm9iRmFpbGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JSZXNjaGVkdWxlTWVzc2FnZSB8IEJhY2tncm91bmRKb2JVcGRhdGVkTWVzc2FnZSB8IEJhY2tncm91bmRKb2JVcGRhdGVFcnJvck1lc3NhZ2V9IEJhY2tncm91bmRKb2JTb2NrZXRNZXNzYWdlXG4gKi9cblxuZXhwb3J0IGNvbnN0IG5vdGhpbmcgPSB7fVxuIl19
|
|
@@ -36,9 +36,10 @@ export default class SyncModelChangeFeedService {
|
|
|
36
36
|
});
|
|
37
37
|
/**
|
|
38
38
|
* Builds a stable change-feed page. The additive `total` is the scope's pending
|
|
39
|
-
* change count from the request cursor to the snapshot bound
|
|
40
|
-
*
|
|
41
|
-
*
|
|
39
|
+
* change count from the request cursor to the snapshot bound, so a client can
|
|
40
|
+
* render a "synced of total" progress bar; older clients ignore it. The count
|
|
41
|
+
* query only runs when the page read cannot answer it: a sequence cursor whose
|
|
42
|
+
* page is short of the limit has already materialized the whole remaining set.
|
|
42
43
|
* @returns {Promise<{status: string, nextCursor: {id: string, serverSequence: number, updatedAt: string} | null, syncs: Array<Record<string, unknown>>, total: number, upToCursor: {id: string, serverSequence: number, updatedAt: string} | null}>} Change-feed page result.
|
|
43
44
|
*/
|
|
44
45
|
changes(): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-model-change-feed-service.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-model-change-feed-service.js"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,0BAA0B;IAYtC,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,MAAM;IACN,UAAU,UAPC;QAAC,KAAK,EAAE,OAAO,wCAAwC,EAAE,OAAO,CAAA;KAAC,KAAK,IAAI;IAQrF,eAAe,WATF,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAP7E;;;;;;;;;OASG;IACH,YAAY,EAAC,YAAmB,EAAE,QAAe,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAC,EAPhG;QAAmE,UAAU,EAArE,cAAc,6BAA6B,EAAE,OAAO,CAC5D;QAAsC,MAAM,EAApC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC/B;QAAsB,YAAY,AAAlC,CACA,EADQ,MAAM,CACd;QAAsB,QAAQ,AAA9B,CACA,EADQ,MAAM,CACd;QAAkF,eAAe,AAAjG,CACA,EADQ,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC1E;QAAiG,UAAU,AAA3G,CACF,EADU,CAAC,IAAI,EAAE;YAAC,KAAK,EAAE,OAAO,wCAAwC,EAAE,OAAO,CAAA;SAAC,KAAK,IAAI,CAC3F;KACkG,EAOlG;IAED
|
|
1
|
+
{"version":3,"file":"sync-model-change-feed-service.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-model-change-feed-service.js"],"names":[],"mappings":"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"}
|
|
@@ -30,9 +30,10 @@ export default class SyncModelChangeFeedService {
|
|
|
30
30
|
}
|
|
31
31
|
/**
|
|
32
32
|
* Builds a stable change-feed page. The additive `total` is the scope's pending
|
|
33
|
-
* change count from the request cursor to the snapshot bound
|
|
34
|
-
*
|
|
35
|
-
*
|
|
33
|
+
* change count from the request cursor to the snapshot bound, so a client can
|
|
34
|
+
* render a "synced of total" progress bar; older clients ignore it. The count
|
|
35
|
+
* query only runs when the page read cannot answer it: a sequence cursor whose
|
|
36
|
+
* page is short of the limit has already materialized the whole remaining set.
|
|
36
37
|
* @returns {Promise<{status: string, nextCursor: {id: string, serverSequence: number, updatedAt: string} | null, syncs: Array<Record<string, unknown>>, total: number, upToCursor: {id: string, serverSequence: number, updatedAt: string} | null}>} Change-feed page result.
|
|
37
38
|
*/
|
|
38
39
|
async changes() {
|
|
@@ -40,10 +41,20 @@ export default class SyncModelChangeFeedService {
|
|
|
40
41
|
const upToCursor = await this.resolveUpToCursor();
|
|
41
42
|
if (!upToCursor)
|
|
42
43
|
return { status: "success", nextCursor: null, syncs: [], total: 0, upToCursor: null };
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
const afterServerSequence = this.optionalPositiveIntegerParam(this.params.afterServerSequence, "afterServerSequence");
|
|
45
|
+
// A cursor at or past the scope's snapshot bound cannot have pending rows.
|
|
46
|
+
// Answering here skips both the page read and the count, which would otherwise
|
|
47
|
+
// run against an empty sequence range on every caught-up poll. A multi-scope
|
|
48
|
+
// client sends its global cursor to each scope, so a scope whose own sequences
|
|
49
|
+
// are behind that cursor lands here on nearly every request.
|
|
50
|
+
if (afterServerSequence !== null && afterServerSequence >= upToCursor.serverSequence) {
|
|
51
|
+
return { status: "success", nextCursor: upToCursor, syncs: [], total: 0, upToCursor };
|
|
52
|
+
}
|
|
53
|
+
const records = await this.pageQuery({ limit, upToCursor }).toArray();
|
|
46
54
|
const nextCursor = records.length > 0 ? this.cursorForRecord(records[records.length - 1]) : upToCursor;
|
|
55
|
+
const total = afterServerSequence !== null && records.length < limit
|
|
56
|
+
? records.length
|
|
57
|
+
: await this.totalPendingChanges({ upToCursor });
|
|
47
58
|
return {
|
|
48
59
|
status: "success",
|
|
49
60
|
nextCursor,
|
|
@@ -246,4 +257,4 @@ export default class SyncModelChangeFeedService {
|
|
|
246
257
|
return date.toISOString();
|
|
247
258
|
}
|
|
248
259
|
}
|
|
249
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUVsRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQTtBQUN0RSxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV6RTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qzs7Ozs7Ozs7O09BU0c7SUFDSCxZQUFZLEVBQUMsWUFBWSxHQUFHLElBQUksRUFBRSxRQUFRLEdBQUcsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBQztRQUNqRyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUE7UUFDcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDN0YsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JELE1BQU0sVUFBVSxHQUFHLE1BQU0s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SUFBSSxFQUFFLDBCQUEwQixFQUFDLENBQUMsQ0FBQTtRQUNwSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDM0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBWZWxvY2lvdXNFcnJvciBmcm9tIFwiLi4vdmVsb2Npb3VzLWVycm9yLmpzXCJcblxuaW1wb3J0IHtkZWNsYXJlZFN5bmNTY29wZUF0dHJpYnV0ZXN9IGZyb20gXCIuL3N5bmMtc2NvcGUtYXR0cmlidXRlcy5qc1wiXG5pbXBvcnQge2RlY29kZVJlcGxheVBlcnNpc3RlZERhdGF9IGZyb20gXCIuL3N5bmMtcmVwbGF5LXBlcnNpc3RlZC1kYXRhLmpzXCJcblxuLyoqXG4gKiBHZW5lcmljIGN1cnNvci1wYWdpbmF0ZWQgY2hhbmdlIGZlZWQgb3ZlciBhbiBhcHAtb3duZWQgc3luYy9jaGFuZ2UgbW9kZWwuXG4gKlxuICogQXBwcyBwcm92aWRlIHRoZSBtb2RlbCBhbmQgb3B0aW9uYWwgc2NvcGluZy9zZXJpYWxpemF0aW9uIGhvb2tzLiBWZWxvY2lvdXMgb3duc1xuICogY3Vyc29yIHBhcnNpbmcsIHNuYXBzaG90IGhpZ2gtd2F0ZXIgcmVzb2x1dGlvbiwgc3RhYmxlIG9yZGVyaW5nLCBwYWdlIGxpbWl0cyxcbiAqIGFuZCByZXNwb25zZSBzaGFwZSBmb3IgYC92ZWxvY2lvdXMvc3luYy9jaGFuZ2VzYCBzdHlsZSBlbmRwb2ludHMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bmNNb2RlbENoYW5nZUZlZWRTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBnZW5lcmljIHN5bmMtbW9kZWwgY2hhbmdlLWZlZWQgc2VydmljZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTZXJ2aWNlIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWxDbGFzcyAtIFN5bmMvY2hhbmdlIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBhcmdzLnBhcmFtcyAtIFJlcXVlc3QgcGFyYW1zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuZGVmYXVsdExpbWl0XSAtIERlZmF1bHQgcGFnZSBzaXplLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MubWF4TGltaXRdIC0gTWF4aW11bSBwYWdlIHNpemUuXG4gICAqIEBwYXJhbSB7KHJlY29yZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBbYXJncy5zZXJpYWxpemVSZWNvcmRdIC0gUmVjb3JkIHNlcmlhbGl6ZXIuXG4gICAqIEBwYXJhbSB7KGFyZ3M6IHtxdWVyeTogaW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0pID0+IHZvaWR9IFthcmdzLnNjb3BlUXVlcnldIC0gQXBwbGllcyBhcHAtb3duZWQgdmlzaWJpbGl0eSBzY29wZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtkZWZhdWx0TGltaXQgPSAxMDAwLCBtYXhMaW1pdCA9IDEwMDAsIG1vZGVsQ2xhc3MsIHBhcmFtcywgc2NvcGVRdWVyeSwgc2VyaWFsaXplUmVjb3JkfSkge1xuICAgIHRoaXMuZGVmYXVsdExpbWl0ID0gZGVmYXVsdExpbWl0XG4gICAgdGhpcy5tYXhMaW1pdCA9IG1heExpbWl0XG4gICAgdGhpcy5tb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zXG4gICAgdGhpcy5zY29wZVF1ZXJ5ID0gc2NvcGVRdWVyeSB8fCBudWxsXG4gICAgdGhpcy5zZXJpYWxpemVSZWNvcmQgPSBzZXJpYWxpemVSZWNvcmQgfHwgKChyZWNvcmQpID0+IHRoaXMuZGVmYXVsdFNlcmlhbGl6ZVJlY29yZChyZWNvcmQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHN0YWJsZSBjaGFuZ2UtZmVlZCBwYWdlLiBUaGUgYWRkaXRpdmUgYHRvdGFsYCBpcyB0aGUgc2NvcGUncyBwZW5kaW5nXG4gICAqIGNoYW5nZSBjb3VudCBmcm9tIHRoZSByZXF1ZXN0IGN1cnNvciB0byB0aGUgc25hcHNob3QgYm91bmQgKGEgQ09VTlQsIG5vdCBhXG4gICAqIG1hdGVyaWFsaXplZCByZWFkKSwgc28gYSBjbGllbnQgY2FuIHJlbmRlciBhIFwic3luY2VkIG9mIHRvdGFsXCIgcHJvZ3Jlc3MgYmFyO1xuICAgKiBvbGRlciBjbGllbnRzIGlnbm9yZSBpdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8e3N0YXR1czogc3RyaW5nLCBuZXh0Q3Vyc29yOiB7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9IHwgbnVsbCwgc3luY3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiwgdG90YWw6IG51bWJlciwgdXBUb0N1cnNvcjoge2lkOiBzdHJpbmcsIHNlcnZlclNlcXVlbmNlOiBudW1iZXIsIHVwZGF0ZWRBdDogc3RyaW5nfSB8IG51bGx9Pn0gQ2hhbmdlLWZlZWQgcGFnZSByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjaGFuZ2VzKCkge1xuICAgIGNvbnN0IGxpbWl0ID0gdGhpcy5ub3JtYWxpemVkTGltaXQodGhpcy5wYXJhbXMubGltaXQpXG4gICAgY29uc3QgdXBUb0N1cnNvciA9IGF3YWl0IHRoaXMucmVzb2x2ZVVwVG9DdXJzb3IoKVxuXG4gICAgaWYgKCF1cFRvQ3Vyc29yKSByZXR1cm4ge3N0YXR1czogXCJzdWNjZXNzXCIsIG5leHRDdXJzb3I6IG51bGwsIHN5bmNzOiBbXSwgdG90YWw6IDAsIHVwVG9DdXJzb3I6IG51bGx9XG5cbiAgICBjb25zdCB0b3RhbCA9IGF3YWl0IHRoaXMudG90YWxQZW5kaW5nQ2hhbmdlcyh7dXBUb0N1cnNvcn0pXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnBhZ2VRdWVyeSh7bGltaXQsIHVwVG9DdXJzb3J9KVxuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBxdWVyeS50b0FycmF5KClcbiAgICBjb25zdCBuZXh0Q3Vyc29yID0gcmVjb3Jkcy5sZW5ndGggPiAwID8gdGhpcy5jdXJzb3JGb3JSZWNvcmQocmVjb3Jkc1tyZWNvcmRzLmxlbmd0aCAtIDFdKSA6IHVwVG9DdXJzb3JcblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgbmV4dEN1cnNvcixcbiAgICAgIHN5bmNzOiByZWNvcmRzLm1hcCgocmVjb3JkKSA9PiB0aGlzLnNlcmlhbGl6ZVJlY29yZChyZWNvcmQpKSxcbiAgICAgIHRvdGFsLFxuICAgICAgdXBUb0N1cnNvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIHRoZSByZXF1ZXN0ZWQgcGFnZSBsaW1pdC5cbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFJhdyBsaW1pdCBwYXJhbS5cbiAgICogQHJldHVybnMge251bWJlcn0gTm9ybWFsaXplZCBwYWdlIGxpbWl0LlxuICAgKi9cbiAgbm9ybWFsaXplZExpbWl0KHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiB0aGlzLmRlZmF1bHRMaW1pdFxuXG4gICAgY29uc3QgbGltaXQgPSBOdW1iZXIodmFsdWUpXG5cbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGxpbWl0KSB8fCBsaW1pdCA8PSAwKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKFwiU3luYyBjaGFuZ2VzIGxpbWl0IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLlwiLCB7Y29kZTogXCJzeW5jLWludmFsaWQtY2hhbmdlcy1saW1pdFwifSlcbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5taW4obGltaXQsIHRoaXMubWF4TGltaXQpXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuIG9wdGlvbmFsIHBvc2l0aXZlIGludGVnZXIgY3Vyc29yIGZpZWxkLlxuICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IGludGVnZXIgcGFyYW0uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gUGFyYW0gbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gICAqIEByZXR1cm5zIHtudW1iZXIgfCBudWxsfSBQb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlLCBvciBudWxsIHdoZW4gb21pdHRlZC5cbiAgICovXG4gIG9wdGlvbmFsUG9zaXRpdmVJbnRlZ2VyUGFyYW0odmFsdWUsIG5hbWUpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGludGVnZXIgPSBOdW1iZXIodmFsdWUpXG5cbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGludGVnZXIpIHx8IGludGVnZXIgPD0gMCkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShgJHtuYW1lfSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci5gLCB7Y29kZTogXCJzeW5jLWludmFsaWQtY2hhbmdlcy1jdXJzb3JcIn0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVnZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgaGlnaC13YXRlciBjdXJzb3IgdGhhdCBib3VuZHMgdGhlIGN1cnJlbnQgZmVlZCBwYWdlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9IHwgbnVsbD59IFNuYXBzaG90IHVwcGVyLWJvdW5kIGN1cnNvci5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVVcFRvQ3Vyc29yKCkge1xuICAgIGNvbnN0IHVwVG9TZXJ2ZXJTZXF1ZW5jZSA9IHRoaXMub3B0aW9uYWxQb3NpdGl2ZUludGVnZXJQYXJhbSh0aGlzLnBhcmFtcy51cFRvU2VydmVyU2VxdWVuY2UsIFwidXBUb1NlcnZlclNlcXVlbmNlXCIpXG5cbiAgICBpZiAodXBUb1NlcnZlclNlcXVlbmNlICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvVXBkYXRlZEF0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvSWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7aWQ6IHRoaXMucGFyYW1zLnVwVG9JZCwgc2VydmVyU2VxdWVuY2U6IHVwVG9TZXJ2ZXJTZXF1ZW5jZSwgdXBkYXRlZEF0OiB0aGlzLnBhcmFtcy51cFRvVXBkYXRlZEF0fVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5wYXJhbXMudXBUb1VwZGF0ZWRBdCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdGhpcy5wYXJhbXMudXBUb0lkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCB1cFRvUmVjb3JkID0gYXdhaXQgdGhpcy5tb2RlbENsYXNzLmZpbmRCeSh7aWQ6IHRoaXMucGFyYW1zLnVwVG9JZH0pXG5cbiAgICAgIGlmICh1cFRvUmVjb3JkKSByZXR1cm4gdGhpcy5jdXJzb3JGb3JSZWNvcmQodXBUb1JlY29yZClcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2NvcGVkUXVlcnkoKVxuICAgIGNvbnN0IHRhYmxlID0gcXVlcnkuZHJpdmVyLnF1b3RlVGFibGUodGhpcy5tb2RlbENsYXNzLnRhYmxlTmFtZSgpKVxuICAgIGNvbnN0IHNlcnZlclNlcXVlbmNlQ29sdW1uID0gcXVlcnkuZHJpdmVyLnF1b3RlQ29sdW1uKFwic2VydmVyX3NlcXVlbmNlXCIpXG4gICAgY29uc3QgbGF0ZXN0UmVjb3JkcyA9IGF3YWl0IHF1ZXJ5XG4gICAgICAub3JkZXIoYCR7dGFibGV9LiR7c2VydmVyU2VxdWVuY2VDb2x1bW59IERFU0NgKVxuICAgICAgLmxpbWl0KDEpXG4gICAgICAudG9BcnJheSgpXG5cbiAgICBpZiAobGF0ZXN0UmVjb3Jkcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4gdGhpcy5jdXJzb3JGb3JSZWNvcmQobGF0ZXN0UmVjb3Jkc1swXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG9yZGVyZWQgYW5kIGN1cnNvci1maWx0ZXJlZCBwYWdlIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3tsaW1pdDogbnVtYmVyLCB1cFRvQ3Vyc29yOiB7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9fX0gYXJncyAtIFBhZ2UgcXVlcnkgYXJncy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IFBhZ2UgcXVlcnkuXG4gICAqL1xuICBwYWdlUXVlcnkoe2xpbWl0LCB1cFRvQ3Vyc29yfSkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5jdXJzb3JGaWx0ZXJlZFF1ZXJ5KHt1cFRvQ3Vyc29yfSlcbiAgICBjb25zdCBkcml2ZXIgPSBxdWVyeS5kcml2ZXJcbiAgICBjb25zdCBzZXJ2ZXJTZXF1ZW5jZUNvbHVtbiA9IGAke2RyaXZlci5xdW90ZVRhYmxlKHRoaXMubW9kZWxDbGFzcy50YWJsZU5hbWUoKSl9LiR7ZHJpdmVyLnF1b3RlQ29sdW1uKFwic2VydmVyX3NlcXVlbmNlXCIpfWBcblxuICAgIHJldHVybiBxdWVyeVxuICAgICAgLm9yZGVyKGAke3NlcnZlclNlcXVlbmNlQ29sdW1ufSBBU0NgKVxuICAgICAgLmxpbWl0KGxpbWl0KVxuICB9XG5cbiAgLyoqXG4gICAqIENvdW50cyB0aGUgc2NvcGUncyBwZW5kaW5nIGNoYW5nZSByb3dzIGZyb20gdGhlIHJlcXVlc3QgY3Vyc29yIHRvIHRoZSBzbmFwc2hvdFxuICAgKiBib3VuZCB3aXRob3V0IG1hdGVyaWFsaXppbmcgdGhlbSwgc28gdGhlIGNsaWVudCBjYW4gcmVuZGVyIGEgc3RhYmxlIFwib2YgWVwiXG4gICAqIHByb2dyZXNzIGRlbm9taW5hdG9yLlxuICAgKiBAcGFyYW0ge3t1cFRvQ3Vyc29yOiB7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9fX0gYXJncyAtIENvdW50IGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IFBlbmRpbmcgY2hhbmdlIGNvdW50IGZyb20gdGhlIHJlcXVlc3QgY3Vyc29yLlxuICAgKi9cbiAgYXN5bmMgdG90YWxQZW5kaW5nQ2hhbmdlcyh7dXBUb0N1cnNvcn0pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jdXJzb3JGaWx0ZXJlZFF1ZXJ5KHt1cFRvQ3Vyc29yfSkuY291bnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNjb3BlZCBxdWVyeSB3aXRoIHRoZSBzbmFwc2hvdCB1cHBlciBib3VuZCBhbmQgYWZ0ZXItY3Vyc29yIGZpbHRlcnNcbiAgICogYXBwbGllZCwgYnV0IHdpdGhvdXQgb3JkZXJpbmcgb3IgYSBwYWdlIGxpbWl0LiBTaGFyZWQgYnkgdGhlIHBhZ2UgcmVhZCBhbmQgdGhlXG4gICAqIHRvdGFsLWNvdW50IHNvIGJvdGggY291bnQgdGhlIHNhbWUgc2V0IG9mIHJvd3MuXG4gICAqIEBwYXJhbSB7e3VwVG9DdXJzb3I6IHtpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ319fSBhcmdzIC0gRmlsdGVyIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBDdXJzb3ItZmlsdGVyZWQgcXVlcnkuXG4gICAqL1xuICBjdXJzb3JGaWx0ZXJlZFF1ZXJ5KHt1cFRvQ3Vyc29yfSkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zY29wZWRRdWVyeSgpXG4gICAgY29uc3QgZHJpdmVyID0gcXVlcnkuZHJpdmVyXG4gICAgY29uc3QgdGFibGUgPSBkcml2ZXIucXVvdGVUYWJsZSh0aGlzLm1vZGVsQ2xhc3MudGFibGVOYW1lKCkpXG4gICAgY29uc3Qgc2VydmVyU2VxdWVuY2VDb2x1bW4gPSBgJHt0YWJsZX0uJHtkcml2ZXIucXVvdGVDb2x1bW4oXCJzZXJ2ZXJfc2VxdWVuY2VcIil9YFxuICAgIGNvbnN0IHVwZGF0ZWRBdENvbHVtbiA9IGAke3RhYmxlfS4ke2RyaXZlci5xdW90ZUNvbHVtbihcInVwZGF0ZWRfYXRcIil9YFxuICAgIGNvbnN0IGlkQ29sdW1uID0gYCR7dGFibGV9LiR7ZHJpdmVyLnF1b3RlQ29sdW1uKFwiaWRcIil9YFxuXG4gICAgcXVlcnkud2hlcmUoYCR7c2VydmVyU2VxdWVuY2VDb2x1bW59IDw9ICR7ZHJpdmVyLnF1b3RlKHVwVG9DdXJzb3Iuc2VydmVyU2VxdWVuY2UpfWApXG5cbiAgICBjb25zdCBhZnRlclNlcnZlclNlcXVlbmNlID0gdGhpcy5vcHRpb25hbFBvc2l0aXZlSW50ZWdlclBhcmFtKHRoaXMucGFyYW1zLmFmdGVyU2VydmVyU2VxdWVuY2UsIFwiYWZ0ZXJTZXJ2ZXJTZXF1ZW5jZVwiKVxuXG4gICAgaWYgKGFmdGVyU2VydmVyU2VxdWVuY2UgIT09IG51bGwpIHtcbiAgICAgIHF1ZXJ5LndoZXJlKGAke3NlcnZlclNlcXVlbmNlQ29sdW1ufSA+ICR7ZHJpdmVyLnF1b3RlKGFmdGVyU2VydmVyU2VxdWVuY2UpfWApXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQgIT09IFwiXCIpIHtcbiAgICAgIGNvbnN0IGlzUGFnaW5nRXhpc3RpbmdTbmFwc2hvdCA9IHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvVXBkYXRlZEF0ID09PSBcInN0cmluZ1wiICYmIHRoaXMucGFyYW1zLnVwVG9VcGRhdGVkQXQgIT09IFwiXCIgJiYgdHlwZW9mIHRoaXMucGFyYW1zLnVwVG9JZCA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLnBhcmFtcy51cFRvSWQgIT09IFwiXCJcblxuICAgICAgaWYgKGlzUGFnaW5nRXhpc3RpbmdTbmFwc2hvdCAmJiB0eXBlb2YgdGhpcy5wYXJhbXMuYWZ0ZXJJZCA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLnBhcmFtcy5hZnRlcklkICE9PSBcIlwiKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlKGAoJHt1cGRhdGVkQXRDb2x1bW59ID4gJHtkcml2ZXIucXVvdGUodGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQpfSBPUiAoJHt1cGRhdGVkQXRDb2x1bW59ID0gJHtkcml2ZXIucXVvdGUodGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQpfSBBTkQgJHtpZENvbHVtbn0gPiAke2RyaXZlci5xdW90ZSh0aGlzLnBhcmFtcy5hZnRlcklkKX0pKWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeS53aGVyZShgJHt1cGRhdGVkQXRDb2x1bW59ID49ICR7ZHJpdmVyLnF1b3RlKHRoaXMucGFyYW1zLmFmdGVyVXBkYXRlZEF0KX1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWVyeVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIGJhc2UgcXVlcnkgd2l0aCBhcHAtb3duZWQgc2NvcGUgYXBwbGllZC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IFNjb3BlZCBiYXNlIHF1ZXJ5LlxuICAgKi9cbiAgc2NvcGVkUXVlcnkoKSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLm1vZGVsQ2xhc3Mud2hlcmUoe30pXG5cbiAgICBpZiAodGhpcy5zY29wZVF1ZXJ5KSB0aGlzLnNjb3BlUXVlcnkoe3F1ZXJ5fSlcblxuICAgIHJldHVybiBxdWVyeVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSByZWNvcmQgaW50byBhIHRyYW5zcG9ydCBjdXJzb3IuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHJlY29yZCAtIFN5bmMvY2hhbmdlIHJlY29yZC5cbiAgICogQHJldHVybnMge3tpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ319IEN1cnNvciBmb3Igcm93LlxuICAgKi9cbiAgY3Vyc29yRm9yUmVjb3JkKHJlY29yZCkge1xuICAgIHJldHVybiB7aWQ6IFN0cmluZyh0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJpZFwiKSksIHNlcnZlclNlcXVlbmNlOiBOdW1iZXIodGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwic2VydmVyU2VxdWVuY2VcIikpLCB1cGRhdGVkQXQ6IHRoaXMuaXNvRGF0ZSh0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJ1cGRhdGVkQXRcIikpfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSByZWNvcmQgdXNpbmcgdGhlIHN0YW5kYXJkIHN5bmMgZW52ZWxvcGUgc2hhcGUgcGx1cyB0aGUgc3luY1xuICAgKiBtb2RlbCdzIGRlY2xhcmVkIHNjb3BlLXBhcnRpdGlvbiBhdHRyaWJ1dGVzIChgc3RhdGljIHN5bmNTY29wZUF0dHJpYnV0ZXNgKSxcbiAgICogZWFjaCBlbWl0dGVkIHVuZGVyIGl0cyBvd24gYXR0cmlidXRlIG5hbWUuIE1vZGVscyBkZWNsYXJpbmcgbm8gc2NvcGVcbiAgICogYXR0cmlidXRlcyBrZWVwIHRoZSBkZXByZWNhdGVkIDEuMC41MDMgd2lyZSBhbmQgZW1pdCBgZXZlbnRJZGAuIEtleXMgYXJlXG4gICAqIHNvcnRlZCBzbyBhIGRlY2xhcmVkIGBbXCJldmVudElkXCJdYCBwYXJ0aXRpb24gc3RheXMgYnl0ZS1pZGVudGljYWwgd2l0aCB0aGVcbiAgICogMS4wLjUwMyB3aXJlLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSByZWNvcmQgLSBTeW5jL2NoYW5nZSByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gRGVmYXVsdCBzZXJpYWxpemVkIHJvdy5cbiAgICovXG4gIGRlZmF1bHRTZXJpYWxpemVSZWNvcmQocmVjb3JkKSB7XG4gICAgY29uc3Qgc2NvcGVBdHRyaWJ1dGVzID0gZGVjbGFyZWRTeW5jU2NvcGVBdHRyaWJ1dGVzKHRoaXMubW9kZWxDbGFzcylcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqL1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB7XG4gICAgICBkYXRhOiB0aGlzLnJlY29yZERhdGEocmVjb3JkKSxcbiAgICAgIGlkOiB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJpZFwiKSxcbiAgICAgIHJlc291cmNlSWQ6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInJlc291cmNlSWRcIiksXG4gICAgICByZXNvdXJjZVR5cGU6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInJlc291cmNlVHlwZVwiKSxcbiAgICAgIHNlcnZlclNlcXVlbmNlOiB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJzZXJ2ZXJTZXF1ZW5jZVwiKSxcbiAgICAgIHN5bmNUeXBlOiB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJzeW5jVHlwZVwiKSxcbiAgICAgIHVwZGF0ZWRBdDogdGhpcy5pc29EYXRlKHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInVwZGF0ZWRBdFwiKSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNjb3BlQXR0cmlidXRlIG9mIHNjb3BlQXR0cmlidXRlcyB8fCBbXCJldmVudElkXCJdKSB7XG4gICAgICBzZXJpYWxpemVkW3Njb3BlQXR0cmlidXRlXSA9IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBzY29wZUF0dHJpYnV0ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHNlcmlhbGl6ZWQpLnNvcnQoKFtsZWZ0S2V5XSwgW3JpZ2h0S2V5XSkgPT4gbGVmdEtleS5sb2NhbGVDb21wYXJlKHJpZ2h0S2V5KSkpXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW5kIHBhcnNlcyB0aGUgcmVjb3JkIGRhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcmVjb3JkIC0gU3luYy9jaGFuZ2UgcmVjb3JkLlxuICAgKiBAcmV0dXJucyB7dW5rbm93bn0gUGFyc2VkIGRhdGEgdmFsdWUuXG4gICAqL1xuICByZWNvcmREYXRhKHJlY29yZCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJkYXRhXCIpXG5cbiAgICBpZiAoZGF0YSA9PT0gXCJcIiB8fCBkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGxcbiAgICByZXR1cm4gZGVjb2RlUmVwbGF5UGVyc2lzdGVkRGF0YShkYXRhKS5wYXlsb2FkXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSB2YWx1ZSBmcm9tIGVpdGhlciBhIHJlY29yZCBhY2Nlc3NvciBtZXRob2Qgb3IgcGxhaW4gcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHJlY29yZCAtIFN5bmMvY2hhbmdlIHJlY29yZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBDYW1lbC1jYXNlZCB2YWx1ZS9tZXRob2QgbmFtZS5cbiAgICogQHJldHVybnMge3Vua25vd259IFJlY29yZCB2YWx1ZS5cbiAgICovXG4gIHJlY29yZFZhbHVlKHJlY29yZCwgbmFtZSkge1xuICAgIGlmICghcmVjb3JkIHx8IHR5cGVvZiByZWNvcmQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmMgY2hhbmdlcyByb3cgbXVzdCBiZSBhbiBvYmplY3QuXCIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3JkT2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChyZWNvcmQpXG4gICAgY29uc3QgbWV0aG9kID0gcmVjb3JkT2JqZWN0W25hbWVdXG4gICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgbWV0aG9kID09PSBcImZ1bmN0aW9uXCIgPyBtZXRob2QuY2FsbChyZWNvcmQpIDogbWV0aG9kXG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIGNoYW5nZXMgcm93IGlzIG1pc3NpbmcgJHtuYW1lfS5gKVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgZGF0ZS1saWtlIHZhbHVlIHRvIGFuIElTTyBzdHJpbmcuXG4gICAqIEBwYXJhbSB7RGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgfCB1bmtub3dufSB2YWx1ZSAtIERhdGUgdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IElTTyBkYXRlLlxuICAgKi9cbiAgaXNvRGF0ZSh2YWx1ZSkge1xuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyB2YWx1ZSA6IDApXG5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIlN5bmMgY2hhbmdlcyByb3cgaGFzIGFuIGludmFsaWQgdXBkYXRlZF9hdCB2YWx1ZS5cIiwge2NvZGU6IFwic3luYy1pbnZhbGlkLWNoYW5nZXMtcm93XCJ9KVxuICAgIH1cblxuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbiAgfVxufVxuIl19
|
|
260
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUVsRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQTtBQUN0RSxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUV6RTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qzs7Ozs7Ozs7O09BU0c7SUFDSCxZQUFZLEVBQUMsWUFBWSxHQUFHLElBQUksRUFBRSxRQUFRLEdBQUcsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBQztRQUNqRyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUE7UUFDcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDN0YsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyRCxNQUFNLFVBQVUsR0FBRyxNQUFN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QUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixJQUFJLEdBQUcsQ0FBQyxDQUFBO1FBQ3pELENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLEtBQUs7UUFDWCxNQUFNLElBQUksR0FBRyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFekgsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakMsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxFQUFFLEVBQUMsSUFBSSxFQUFFLDBCQUEwQixFQUFDLENBQUMsQ0FBQTtRQUNwSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDM0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBWZWxvY2lvdXNFcnJvciBmcm9tIFwiLi4vdmVsb2Npb3VzLWVycm9yLmpzXCJcblxuaW1wb3J0IHtkZWNsYXJlZFN5bmNTY29wZUF0dHJpYnV0ZXN9IGZyb20gXCIuL3N5bmMtc2NvcGUtYXR0cmlidXRlcy5qc1wiXG5pbXBvcnQge2RlY29kZVJlcGxheVBlcnNpc3RlZERhdGF9IGZyb20gXCIuL3N5bmMtcmVwbGF5LXBlcnNpc3RlZC1kYXRhLmpzXCJcblxuLyoqXG4gKiBHZW5lcmljIGN1cnNvci1wYWdpbmF0ZWQgY2hhbmdlIGZlZWQgb3ZlciBhbiBhcHAtb3duZWQgc3luYy9jaGFuZ2UgbW9kZWwuXG4gKlxuICogQXBwcyBwcm92aWRlIHRoZSBtb2RlbCBhbmQgb3B0aW9uYWwgc2NvcGluZy9zZXJpYWxpemF0aW9uIGhvb2tzLiBWZWxvY2lvdXMgb3duc1xuICogY3Vyc29yIHBhcnNpbmcsIHNuYXBzaG90IGhpZ2gtd2F0ZXIgcmVzb2x1dGlvbiwgc3RhYmxlIG9yZGVyaW5nLCBwYWdlIGxpbWl0cyxcbiAqIGFuZCByZXNwb25zZSBzaGFwZSBmb3IgYC92ZWxvY2lvdXMvc3luYy9jaGFuZ2VzYCBzdHlsZSBlbmRwb2ludHMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bmNNb2RlbENoYW5nZUZlZWRTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBnZW5lcmljIHN5bmMtbW9kZWwgY2hhbmdlLWZlZWQgc2VydmljZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTZXJ2aWNlIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IGFyZ3MubW9kZWxDbGFzcyAtIFN5bmMvY2hhbmdlIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBhcmdzLnBhcmFtcyAtIFJlcXVlc3QgcGFyYW1zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuZGVmYXVsdExpbWl0XSAtIERlZmF1bHQgcGFnZSBzaXplLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MubWF4TGltaXRdIC0gTWF4aW11bSBwYWdlIHNpemUuXG4gICAqIEBwYXJhbSB7KHJlY29yZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBbYXJncy5zZXJpYWxpemVSZWNvcmRdIC0gUmVjb3JkIHNlcmlhbGl6ZXIuXG4gICAqIEBwYXJhbSB7KGFyZ3M6IHtxdWVyeTogaW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0pID0+IHZvaWR9IFthcmdzLnNjb3BlUXVlcnldIC0gQXBwbGllcyBhcHAtb3duZWQgdmlzaWJpbGl0eSBzY29wZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtkZWZhdWx0TGltaXQgPSAxMDAwLCBtYXhMaW1pdCA9IDEwMDAsIG1vZGVsQ2xhc3MsIHBhcmFtcywgc2NvcGVRdWVyeSwgc2VyaWFsaXplUmVjb3JkfSkge1xuICAgIHRoaXMuZGVmYXVsdExpbWl0ID0gZGVmYXVsdExpbWl0XG4gICAgdGhpcy5tYXhMaW1pdCA9IG1heExpbWl0XG4gICAgdGhpcy5tb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zXG4gICAgdGhpcy5zY29wZVF1ZXJ5ID0gc2NvcGVRdWVyeSB8fCBudWxsXG4gICAgdGhpcy5zZXJpYWxpemVSZWNvcmQgPSBzZXJpYWxpemVSZWNvcmQgfHwgKChyZWNvcmQpID0+IHRoaXMuZGVmYXVsdFNlcmlhbGl6ZVJlY29yZChyZWNvcmQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHN0YWJsZSBjaGFuZ2UtZmVlZCBwYWdlLiBUaGUgYWRkaXRpdmUgYHRvdGFsYCBpcyB0aGUgc2NvcGUncyBwZW5kaW5nXG4gICAqIGNoYW5nZSBjb3VudCBmcm9tIHRoZSByZXF1ZXN0IGN1cnNvciB0byB0aGUgc25hcHNob3QgYm91bmQsIHNvIGEgY2xpZW50IGNhblxuICAgKiByZW5kZXIgYSBcInN5bmNlZCBvZiB0b3RhbFwiIHByb2dyZXNzIGJhcjsgb2xkZXIgY2xpZW50cyBpZ25vcmUgaXQuIFRoZSBjb3VudFxuICAgKiBxdWVyeSBvbmx5IHJ1bnMgd2hlbiB0aGUgcGFnZSByZWFkIGNhbm5vdCBhbnN3ZXIgaXQ6IGEgc2VxdWVuY2UgY3Vyc29yIHdob3NlXG4gICAqIHBhZ2UgaXMgc2hvcnQgb2YgdGhlIGxpbWl0IGhhcyBhbHJlYWR5IG1hdGVyaWFsaXplZCB0aGUgd2hvbGUgcmVtYWluaW5nIHNldC5cbiAgICogQHJldHVybnMge1Byb21pc2U8e3N0YXR1czogc3RyaW5nLCBuZXh0Q3Vyc29yOiB7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9IHwgbnVsbCwgc3luY3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiwgdG90YWw6IG51bWJlciwgdXBUb0N1cnNvcjoge2lkOiBzdHJpbmcsIHNlcnZlclNlcXVlbmNlOiBudW1iZXIsIHVwZGF0ZWRBdDogc3RyaW5nfSB8IG51bGx9Pn0gQ2hhbmdlLWZlZWQgcGFnZSByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjaGFuZ2VzKCkge1xuICAgIGNvbnN0IGxpbWl0ID0gdGhpcy5ub3JtYWxpemVkTGltaXQodGhpcy5wYXJhbXMubGltaXQpXG4gICAgY29uc3QgdXBUb0N1cnNvciA9IGF3YWl0IHRoaXMucmVzb2x2ZVVwVG9DdXJzb3IoKVxuXG4gICAgaWYgKCF1cFRvQ3Vyc29yKSByZXR1cm4ge3N0YXR1czogXCJzdWNjZXNzXCIsIG5leHRDdXJzb3I6IG51bGwsIHN5bmNzOiBbXSwgdG90YWw6IDAsIHVwVG9DdXJzb3I6IG51bGx9XG5cbiAgICBjb25zdCBhZnRlclNlcnZlclNlcXVlbmNlID0gdGhpcy5vcHRpb25hbFBvc2l0aXZlSW50ZWdlclBhcmFtKHRoaXMucGFyYW1zLmFmdGVyU2VydmVyU2VxdWVuY2UsIFwiYWZ0ZXJTZXJ2ZXJTZXF1ZW5jZVwiKVxuXG4gICAgLy8gQSBjdXJzb3IgYXQgb3IgcGFzdCB0aGUgc2NvcGUncyBzbmFwc2hvdCBib3VuZCBjYW5ub3QgaGF2ZSBwZW5kaW5nIHJvd3MuXG4gICAgLy8gQW5zd2VyaW5nIGhlcmUgc2tpcHMgYm90aCB0aGUgcGFnZSByZWFkIGFuZCB0aGUgY291bnQsIHdoaWNoIHdvdWxkIG90aGVyd2lzZVxuICAgIC8vIHJ1biBhZ2FpbnN0IGFuIGVtcHR5IHNlcXVlbmNlIHJhbmdlIG9uIGV2ZXJ5IGNhdWdodC11cCBwb2xsLiBBIG11bHRpLXNjb3BlXG4gICAgLy8gY2xpZW50IHNlbmRzIGl0cyBnbG9iYWwgY3Vyc29yIHRvIGVhY2ggc2NvcGUsIHNvIGEgc2NvcGUgd2hvc2Ugb3duIHNlcXVlbmNlc1xuICAgIC8vIGFyZSBiZWhpbmQgdGhhdCBjdXJzb3IgbGFuZHMgaGVyZSBvbiBuZWFybHkgZXZlcnkgcmVxdWVzdC5cbiAgICBpZiAoYWZ0ZXJTZXJ2ZXJTZXF1ZW5jZSAhPT0gbnVsbCAmJiBhZnRlclNlcnZlclNlcXVlbmNlID49IHVwVG9DdXJzb3Iuc2VydmVyU2VxdWVuY2UpIHtcbiAgICAgIHJldHVybiB7c3RhdHVzOiBcInN1Y2Nlc3NcIiwgbmV4dEN1cnNvcjogdXBUb0N1cnNvciwgc3luY3M6IFtdLCB0b3RhbDogMCwgdXBUb0N1cnNvcn1cbiAgICB9XG5cbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5wYWdlUXVlcnkoe2xpbWl0LCB1cFRvQ3Vyc29yfSkudG9BcnJheSgpXG4gICAgY29uc3QgbmV4dEN1cnNvciA9IHJlY29yZHMubGVuZ3RoID4gMCA/IHRoaXMuY3Vyc29yRm9yUmVjb3JkKHJlY29yZHNbcmVjb3Jkcy5sZW5ndGggLSAxXSkgOiB1cFRvQ3Vyc29yXG4gICAgY29uc3QgdG90YWwgPSBhZnRlclNlcnZlclNlcXVlbmNlICE9PSBudWxsICYmIHJlY29yZHMubGVuZ3RoIDwgbGltaXRcbiAgICAgID8gcmVjb3Jkcy5sZW5ndGhcbiAgICAgIDogYXdhaXQgdGhpcy50b3RhbFBlbmRpbmdDaGFuZ2VzKHt1cFRvQ3Vyc29yfSlcblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgbmV4dEN1cnNvcixcbiAgICAgIHN5bmNzOiByZWNvcmRzLm1hcCgocmVjb3JkKSA9PiB0aGlzLnNlcmlhbGl6ZVJlY29yZChyZWNvcmQpKSxcbiAgICAgIHRvdGFsLFxuICAgICAgdXBUb0N1cnNvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIHRoZSByZXF1ZXN0ZWQgcGFnZSBsaW1pdC5cbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFJhdyBsaW1pdCBwYXJhbS5cbiAgICogQHJldHVybnMge251bWJlcn0gTm9ybWFsaXplZCBwYWdlIGxpbWl0LlxuICAgKi9cbiAgbm9ybWFsaXplZExpbWl0KHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiB0aGlzLmRlZmF1bHRMaW1pdFxuXG4gICAgY29uc3QgbGltaXQgPSBOdW1iZXIodmFsdWUpXG5cbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGxpbWl0KSB8fCBsaW1pdCA8PSAwKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKFwiU3luYyBjaGFuZ2VzIGxpbWl0IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLlwiLCB7Y29kZTogXCJzeW5jLWludmFsaWQtY2hhbmdlcy1saW1pdFwifSlcbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5taW4obGltaXQsIHRoaXMubWF4TGltaXQpXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuIG9wdGlvbmFsIHBvc2l0aXZlIGludGVnZXIgY3Vyc29yIGZpZWxkLlxuICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IGludGVnZXIgcGFyYW0uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gUGFyYW0gbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gICAqIEByZXR1cm5zIHtudW1iZXIgfCBudWxsfSBQb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlLCBvciBudWxsIHdoZW4gb21pdHRlZC5cbiAgICovXG4gIG9wdGlvbmFsUG9zaXRpdmVJbnRlZ2VyUGFyYW0odmFsdWUsIG5hbWUpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IGludGVnZXIgPSBOdW1iZXIodmFsdWUpXG5cbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGludGVnZXIpIHx8IGludGVnZXIgPD0gMCkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShgJHtuYW1lfSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci5gLCB7Y29kZTogXCJzeW5jLWludmFsaWQtY2hhbmdlcy1jdXJzb3JcIn0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVnZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgaGlnaC13YXRlciBjdXJzb3IgdGhhdCBib3VuZHMgdGhlIGN1cnJlbnQgZmVlZCBwYWdlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9IHwgbnVsbD59IFNuYXBzaG90IHVwcGVyLWJvdW5kIGN1cnNvci5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVVcFRvQ3Vyc29yKCkge1xuICAgIGNvbnN0IHVwVG9TZXJ2ZXJTZXF1ZW5jZSA9IHRoaXMub3B0aW9uYWxQb3NpdGl2ZUludGVnZXJQYXJhbSh0aGlzLnBhcmFtcy51cFRvU2VydmVyU2VxdWVuY2UsIFwidXBUb1NlcnZlclNlcXVlbmNlXCIpXG5cbiAgICBpZiAodXBUb1NlcnZlclNlcXVlbmNlICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvVXBkYXRlZEF0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvSWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7aWQ6IHRoaXMucGFyYW1zLnVwVG9JZCwgc2VydmVyU2VxdWVuY2U6IHVwVG9TZXJ2ZXJTZXF1ZW5jZSwgdXBkYXRlZEF0OiB0aGlzLnBhcmFtcy51cFRvVXBkYXRlZEF0fVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5wYXJhbXMudXBUb1VwZGF0ZWRBdCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdGhpcy5wYXJhbXMudXBUb0lkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCB1cFRvUmVjb3JkID0gYXdhaXQgdGhpcy5tb2RlbENsYXNzLmZpbmRCeSh7aWQ6IHRoaXMucGFyYW1zLnVwVG9JZH0pXG5cbiAgICAgIGlmICh1cFRvUmVjb3JkKSByZXR1cm4gdGhpcy5jdXJzb3JGb3JSZWNvcmQodXBUb1JlY29yZClcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2NvcGVkUXVlcnkoKVxuICAgIGNvbnN0IHRhYmxlID0gcXVlcnkuZHJpdmVyLnF1b3RlVGFibGUodGhpcy5tb2RlbENsYXNzLnRhYmxlTmFtZSgpKVxuICAgIGNvbnN0IHNlcnZlclNlcXVlbmNlQ29sdW1uID0gcXVlcnkuZHJpdmVyLnF1b3RlQ29sdW1uKFwic2VydmVyX3NlcXVlbmNlXCIpXG4gICAgY29uc3QgbGF0ZXN0UmVjb3JkcyA9IGF3YWl0IHF1ZXJ5XG4gICAgICAub3JkZXIoYCR7dGFibGV9LiR7c2VydmVyU2VxdWVuY2VDb2x1bW59IERFU0NgKVxuICAgICAgLmxpbWl0KDEpXG4gICAgICAudG9BcnJheSgpXG5cbiAgICBpZiAobGF0ZXN0UmVjb3Jkcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4gdGhpcy5jdXJzb3JGb3JSZWNvcmQobGF0ZXN0UmVjb3Jkc1swXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG9yZGVyZWQgYW5kIGN1cnNvci1maWx0ZXJlZCBwYWdlIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3tsaW1pdDogbnVtYmVyLCB1cFRvQ3Vyc29yOiB7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9fX0gYXJncyAtIFBhZ2UgcXVlcnkgYXJncy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IFBhZ2UgcXVlcnkuXG4gICAqL1xuICBwYWdlUXVlcnkoe2xpbWl0LCB1cFRvQ3Vyc29yfSkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5jdXJzb3JGaWx0ZXJlZFF1ZXJ5KHt1cFRvQ3Vyc29yfSlcbiAgICBjb25zdCBkcml2ZXIgPSBxdWVyeS5kcml2ZXJcbiAgICBjb25zdCBzZXJ2ZXJTZXF1ZW5jZUNvbHVtbiA9IGAke2RyaXZlci5xdW90ZVRhYmxlKHRoaXMubW9kZWxDbGFzcy50YWJsZU5hbWUoKSl9LiR7ZHJpdmVyLnF1b3RlQ29sdW1uKFwic2VydmVyX3NlcXVlbmNlXCIpfWBcblxuICAgIHJldHVybiBxdWVyeVxuICAgICAgLm9yZGVyKGAke3NlcnZlclNlcXVlbmNlQ29sdW1ufSBBU0NgKVxuICAgICAgLmxpbWl0KGxpbWl0KVxuICB9XG5cbiAgLyoqXG4gICAqIENvdW50cyB0aGUgc2NvcGUncyBwZW5kaW5nIGNoYW5nZSByb3dzIGZyb20gdGhlIHJlcXVlc3QgY3Vyc29yIHRvIHRoZSBzbmFwc2hvdFxuICAgKiBib3VuZCB3aXRob3V0IG1hdGVyaWFsaXppbmcgdGhlbSwgc28gdGhlIGNsaWVudCBjYW4gcmVuZGVyIGEgc3RhYmxlIFwib2YgWVwiXG4gICAqIHByb2dyZXNzIGRlbm9taW5hdG9yLlxuICAgKiBAcGFyYW0ge3t1cFRvQ3Vyc29yOiB7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9fX0gYXJncyAtIENvdW50IGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IFBlbmRpbmcgY2hhbmdlIGNvdW50IGZyb20gdGhlIHJlcXVlc3QgY3Vyc29yLlxuICAgKi9cbiAgYXN5bmMgdG90YWxQZW5kaW5nQ2hhbmdlcyh7dXBUb0N1cnNvcn0pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jdXJzb3JGaWx0ZXJlZFF1ZXJ5KHt1cFRvQ3Vyc29yfSkuY291bnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNjb3BlZCBxdWVyeSB3aXRoIHRoZSBzbmFwc2hvdCB1cHBlciBib3VuZCBhbmQgYWZ0ZXItY3Vyc29yIGZpbHRlcnNcbiAgICogYXBwbGllZCwgYnV0IHdpdGhvdXQgb3JkZXJpbmcgb3IgYSBwYWdlIGxpbWl0LiBTaGFyZWQgYnkgdGhlIHBhZ2UgcmVhZCBhbmQgdGhlXG4gICAqIHRvdGFsLWNvdW50IHNvIGJvdGggY291bnQgdGhlIHNhbWUgc2V0IG9mIHJvd3MuXG4gICAqIEBwYXJhbSB7e3VwVG9DdXJzb3I6IHtpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ319fSBhcmdzIC0gRmlsdGVyIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBDdXJzb3ItZmlsdGVyZWQgcXVlcnkuXG4gICAqL1xuICBjdXJzb3JGaWx0ZXJlZFF1ZXJ5KHt1cFRvQ3Vyc29yfSkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zY29wZWRRdWVyeSgpXG4gICAgY29uc3QgZHJpdmVyID0gcXVlcnkuZHJpdmVyXG4gICAgY29uc3QgdGFibGUgPSBkcml2ZXIucXVvdGVUYWJsZSh0aGlzLm1vZGVsQ2xhc3MudGFibGVOYW1lKCkpXG4gICAgY29uc3Qgc2VydmVyU2VxdWVuY2VDb2x1bW4gPSBgJHt0YWJsZX0uJHtkcml2ZXIucXVvdGVDb2x1bW4oXCJzZXJ2ZXJfc2VxdWVuY2VcIil9YFxuICAgIGNvbnN0IHVwZGF0ZWRBdENvbHVtbiA9IGAke3RhYmxlfS4ke2RyaXZlci5xdW90ZUNvbHVtbihcInVwZGF0ZWRfYXRcIil9YFxuICAgIGNvbnN0IGlkQ29sdW1uID0gYCR7dGFibGV9LiR7ZHJpdmVyLnF1b3RlQ29sdW1uKFwiaWRcIil9YFxuXG4gICAgcXVlcnkud2hlcmUoYCR7c2VydmVyU2VxdWVuY2VDb2x1bW59IDw9ICR7ZHJpdmVyLnF1b3RlKHVwVG9DdXJzb3Iuc2VydmVyU2VxdWVuY2UpfWApXG5cbiAgICBjb25zdCBhZnRlclNlcnZlclNlcXVlbmNlID0gdGhpcy5vcHRpb25hbFBvc2l0aXZlSW50ZWdlclBhcmFtKHRoaXMucGFyYW1zLmFmdGVyU2VydmVyU2VxdWVuY2UsIFwiYWZ0ZXJTZXJ2ZXJTZXF1ZW5jZVwiKVxuXG4gICAgaWYgKGFmdGVyU2VydmVyU2VxdWVuY2UgIT09IG51bGwpIHtcbiAgICAgIHF1ZXJ5LndoZXJlKGAke3NlcnZlclNlcXVlbmNlQ29sdW1ufSA+ICR7ZHJpdmVyLnF1b3RlKGFmdGVyU2VydmVyU2VxdWVuY2UpfWApXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQgIT09IFwiXCIpIHtcbiAgICAgIGNvbnN0IGlzUGFnaW5nRXhpc3RpbmdTbmFwc2hvdCA9IHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvVXBkYXRlZEF0ID09PSBcInN0cmluZ1wiICYmIHRoaXMucGFyYW1zLnVwVG9VcGRhdGVkQXQgIT09IFwiXCIgJiYgdHlwZW9mIHRoaXMucGFyYW1zLnVwVG9JZCA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLnBhcmFtcy51cFRvSWQgIT09IFwiXCJcblxuICAgICAgaWYgKGlzUGFnaW5nRXhpc3RpbmdTbmFwc2hvdCAmJiB0eXBlb2YgdGhpcy5wYXJhbXMuYWZ0ZXJJZCA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLnBhcmFtcy5hZnRlcklkICE9PSBcIlwiKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlKGAoJHt1cGRhdGVkQXRDb2x1bW59ID4gJHtkcml2ZXIucXVvdGUodGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQpfSBPUiAoJHt1cGRhdGVkQXRDb2x1bW59ID0gJHtkcml2ZXIucXVvdGUodGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQpfSBBTkQgJHtpZENvbHVtbn0gPiAke2RyaXZlci5xdW90ZSh0aGlzLnBhcmFtcy5hZnRlcklkKX0pKWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeS53aGVyZShgJHt1cGRhdGVkQXRDb2x1bW59ID49ICR7ZHJpdmVyLnF1b3RlKHRoaXMucGFyYW1zLmFmdGVyVXBkYXRlZEF0KX1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWVyeVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIGJhc2UgcXVlcnkgd2l0aCBhcHAtb3duZWQgc2NvcGUgYXBwbGllZC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IFNjb3BlZCBiYXNlIHF1ZXJ5LlxuICAgKi9cbiAgc2NvcGVkUXVlcnkoKSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLm1vZGVsQ2xhc3Mud2hlcmUoe30pXG5cbiAgICBpZiAodGhpcy5zY29wZVF1ZXJ5KSB0aGlzLnNjb3BlUXVlcnkoe3F1ZXJ5fSlcblxuICAgIHJldHVybiBxdWVyeVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSByZWNvcmQgaW50byBhIHRyYW5zcG9ydCBjdXJzb3IuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHJlY29yZCAtIFN5bmMvY2hhbmdlIHJlY29yZC5cbiAgICogQHJldHVybnMge3tpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ319IEN1cnNvciBmb3Igcm93LlxuICAgKi9cbiAgY3Vyc29yRm9yUmVjb3JkKHJlY29yZCkge1xuICAgIHJldHVybiB7aWQ6IFN0cmluZyh0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJpZFwiKSksIHNlcnZlclNlcXVlbmNlOiBOdW1iZXIodGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwic2VydmVyU2VxdWVuY2VcIikpLCB1cGRhdGVkQXQ6IHRoaXMuaXNvRGF0ZSh0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJ1cGRhdGVkQXRcIikpfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSByZWNvcmQgdXNpbmcgdGhlIHN0YW5kYXJkIHN5bmMgZW52ZWxvcGUgc2hhcGUgcGx1cyB0aGUgc3luY1xuICAgKiBtb2RlbCdzIGRlY2xhcmVkIHNjb3BlLXBhcnRpdGlvbiBhdHRyaWJ1dGVzIChgc3RhdGljIHN5bmNTY29wZUF0dHJpYnV0ZXNgKSxcbiAgICogZWFjaCBlbWl0dGVkIHVuZGVyIGl0cyBvd24gYXR0cmlidXRlIG5hbWUuIE1vZGVscyBkZWNsYXJpbmcgbm8gc2NvcGVcbiAgICogYXR0cmlidXRlcyBrZWVwIHRoZSBkZXByZWNhdGVkIDEuMC41MDMgd2lyZSBhbmQgZW1pdCBgZXZlbnRJZGAuIEtleXMgYXJlXG4gICAqIHNvcnRlZCBzbyBhIGRlY2xhcmVkIGBbXCJldmVudElkXCJdYCBwYXJ0aXRpb24gc3RheXMgYnl0ZS1pZGVudGljYWwgd2l0aCB0aGVcbiAgICogMS4wLjUwMyB3aXJlLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSByZWNvcmQgLSBTeW5jL2NoYW5nZSByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gRGVmYXVsdCBzZXJpYWxpemVkIHJvdy5cbiAgICovXG4gIGRlZmF1bHRTZXJpYWxpemVSZWNvcmQocmVjb3JkKSB7XG4gICAgY29uc3Qgc2NvcGVBdHRyaWJ1dGVzID0gZGVjbGFyZWRTeW5jU2NvcGVBdHRyaWJ1dGVzKHRoaXMubW9kZWxDbGFzcylcbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqL1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB7XG4gICAgICBkYXRhOiB0aGlzLnJlY29yZERhdGEocmVjb3JkKSxcbiAgICAgIGlkOiB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJpZFwiKSxcbiAgICAgIHJlc291cmNlSWQ6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInJlc291cmNlSWRcIiksXG4gICAgICByZXNvdXJjZVR5cGU6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInJlc291cmNlVHlwZVwiKSxcbiAgICAgIHNlcnZlclNlcXVlbmNlOiB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJzZXJ2ZXJTZXF1ZW5jZVwiKSxcbiAgICAgIHN5bmNUeXBlOiB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJzeW5jVHlwZVwiKSxcbiAgICAgIHVwZGF0ZWRBdDogdGhpcy5pc29EYXRlKHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInVwZGF0ZWRBdFwiKSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNjb3BlQXR0cmlidXRlIG9mIHNjb3BlQXR0cmlidXRlcyB8fCBbXCJldmVudElkXCJdKSB7XG4gICAgICBzZXJpYWxpemVkW3Njb3BlQXR0cmlidXRlXSA9IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBzY29wZUF0dHJpYnV0ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHNlcmlhbGl6ZWQpLnNvcnQoKFtsZWZ0S2V5XSwgW3JpZ2h0S2V5XSkgPT4gbGVmdEtleS5sb2NhbGVDb21wYXJlKHJpZ2h0S2V5KSkpXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW5kIHBhcnNlcyB0aGUgcmVjb3JkIGRhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gcmVjb3JkIC0gU3luYy9jaGFuZ2UgcmVjb3JkLlxuICAgKiBAcmV0dXJucyB7dW5rbm93bn0gUGFyc2VkIGRhdGEgdmFsdWUuXG4gICAqL1xuICByZWNvcmREYXRhKHJlY29yZCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJkYXRhXCIpXG5cbiAgICBpZiAoZGF0YSA9PT0gXCJcIiB8fCBkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGxcbiAgICByZXR1cm4gZGVjb2RlUmVwbGF5UGVyc2lzdGVkRGF0YShkYXRhKS5wYXlsb2FkXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSB2YWx1ZSBmcm9tIGVpdGhlciBhIHJlY29yZCBhY2Nlc3NvciBtZXRob2Qgb3IgcGxhaW4gcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHJlY29yZCAtIFN5bmMvY2hhbmdlIHJlY29yZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBDYW1lbC1jYXNlZCB2YWx1ZS9tZXRob2QgbmFtZS5cbiAgICogQHJldHVybnMge3Vua25vd259IFJlY29yZCB2YWx1ZS5cbiAgICovXG4gIHJlY29yZFZhbHVlKHJlY29yZCwgbmFtZSkge1xuICAgIGlmICghcmVjb3JkIHx8IHR5cGVvZiByZWNvcmQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bmMgY2hhbmdlcyByb3cgbXVzdCBiZSBhbiBvYmplY3QuXCIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3JkT2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChyZWNvcmQpXG4gICAgY29uc3QgbWV0aG9kID0gcmVjb3JkT2JqZWN0W25hbWVdXG4gICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgbWV0aG9kID09PSBcImZ1bmN0aW9uXCIgPyBtZXRob2QuY2FsbChyZWNvcmQpIDogbWV0aG9kXG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIGNoYW5nZXMgcm93IGlzIG1pc3NpbmcgJHtuYW1lfS5gKVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgZGF0ZS1saWtlIHZhbHVlIHRvIGFuIElTTyBzdHJpbmcuXG4gICAqIEBwYXJhbSB7RGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgfCB1bmtub3dufSB2YWx1ZSAtIERhdGUgdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IElTTyBkYXRlLlxuICAgKi9cbiAgaXNvRGF0ZSh2YWx1ZSkge1xuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyB2YWx1ZSA6IDApXG5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIlN5bmMgY2hhbmdlcyByb3cgaGFzIGFuIGludmFsaWQgdXBkYXRlZF9hdCB2YWx1ZS5cIiwge2NvZGU6IFwic3luYy1pbnZhbGlkLWNoYW5nZXMtcm93XCJ9KVxuICAgIH1cblxuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbiAgfVxufVxuIl19
|
|
@@ -34,9 +34,10 @@ export default class SyncModelChangeFeedService {
|
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Builds a stable change-feed page. The additive `total` is the scope's pending
|
|
37
|
-
* change count from the request cursor to the snapshot bound
|
|
38
|
-
*
|
|
39
|
-
*
|
|
37
|
+
* change count from the request cursor to the snapshot bound, so a client can
|
|
38
|
+
* render a "synced of total" progress bar; older clients ignore it. The count
|
|
39
|
+
* query only runs when the page read cannot answer it: a sequence cursor whose
|
|
40
|
+
* page is short of the limit has already materialized the whole remaining set.
|
|
40
41
|
* @returns {Promise<{status: string, nextCursor: {id: string, serverSequence: number, updatedAt: string} | null, syncs: Array<Record<string, unknown>>, total: number, upToCursor: {id: string, serverSequence: number, updatedAt: string} | null}>} Change-feed page result.
|
|
41
42
|
*/
|
|
42
43
|
async changes() {
|
|
@@ -45,10 +46,22 @@ export default class SyncModelChangeFeedService {
|
|
|
45
46
|
|
|
46
47
|
if (!upToCursor) return {status: "success", nextCursor: null, syncs: [], total: 0, upToCursor: null}
|
|
47
48
|
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
const afterServerSequence = this.optionalPositiveIntegerParam(this.params.afterServerSequence, "afterServerSequence")
|
|
50
|
+
|
|
51
|
+
// A cursor at or past the scope's snapshot bound cannot have pending rows.
|
|
52
|
+
// Answering here skips both the page read and the count, which would otherwise
|
|
53
|
+
// run against an empty sequence range on every caught-up poll. A multi-scope
|
|
54
|
+
// client sends its global cursor to each scope, so a scope whose own sequences
|
|
55
|
+
// are behind that cursor lands here on nearly every request.
|
|
56
|
+
if (afterServerSequence !== null && afterServerSequence >= upToCursor.serverSequence) {
|
|
57
|
+
return {status: "success", nextCursor: upToCursor, syncs: [], total: 0, upToCursor}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const records = await this.pageQuery({limit, upToCursor}).toArray()
|
|
51
61
|
const nextCursor = records.length > 0 ? this.cursorForRecord(records[records.length - 1]) : upToCursor
|
|
62
|
+
const total = afterServerSequence !== null && records.length < limit
|
|
63
|
+
? records.length
|
|
64
|
+
: await this.totalPendingChanges({upToCursor})
|
|
52
65
|
|
|
53
66
|
return {
|
|
54
67
|
status: "success",
|
package/package.json
CHANGED
|
@@ -55,6 +55,17 @@ export default class VelociousJob {
|
|
|
55
55
|
*/
|
|
56
56
|
static processTitle = undefined
|
|
57
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Wall-clock bound this job class runs under, in ms. Set e.g.
|
|
60
|
+
* `static timeoutMs = 60 * 60 * 1000` on a job whose work legitimately takes
|
|
61
|
+
* hours so its type carries its own bound instead of relying on one global
|
|
62
|
+
* `backgroundJobs.jobTimeoutMs` tuned for the slowest job in the system. The
|
|
63
|
+
* `{timeoutMs}` enqueue option overrides it. A non-positive value disables the
|
|
64
|
+
* bound for this class. Left undefined, the worker-level value applies.
|
|
65
|
+
* @type {number | undefined}
|
|
66
|
+
*/
|
|
67
|
+
static timeoutMs = undefined
|
|
68
|
+
|
|
58
69
|
/**
|
|
59
70
|
* Stops this performance and reschedules the same logical job row. This is
|
|
60
71
|
* normal control flow: it does not count as a failure or consume a retry.
|
|
@@ -93,6 +104,25 @@ export default class VelociousJob {
|
|
|
93
104
|
return merged
|
|
94
105
|
}
|
|
95
106
|
|
|
107
|
+
/**
|
|
108
|
+
* Folds this job class's static `timeoutMs` into the enqueue options unless the
|
|
109
|
+
* caller already specified one, so a job type carries its own wall-clock bound
|
|
110
|
+
* instead of every job sharing one worker-level value. A class that declares
|
|
111
|
+
* nothing leaves the option absent, and the worker falls back to its own
|
|
112
|
+
* default — the prior behavior.
|
|
113
|
+
* @param {import("./types.js").BackgroundJobOptions | undefined} options - Job options.
|
|
114
|
+
* @returns {import("./types.js").BackgroundJobOptions} - Options including the resolved timeout.
|
|
115
|
+
*/
|
|
116
|
+
static _withTimeout(options) {
|
|
117
|
+
const merged = options ? {...options} : {}
|
|
118
|
+
|
|
119
|
+
if (merged.timeoutMs === undefined && typeof this.timeoutMs === "number") {
|
|
120
|
+
merged.timeoutMs = this.timeoutMs
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return merged
|
|
124
|
+
}
|
|
125
|
+
|
|
96
126
|
/**
|
|
97
127
|
* Resolves class-derived enqueue options on a hydrated job instance. Explicit
|
|
98
128
|
* per-enqueue options take precedence over the instance concurrency key.
|
|
@@ -102,7 +132,7 @@ export default class VelociousJob {
|
|
|
102
132
|
* @returns {import("./types.js").BackgroundJobOptions} - Resolved job options.
|
|
103
133
|
*/
|
|
104
134
|
static _withJobContext({jobArgs, jobOptions}) {
|
|
105
|
-
const options = this._withQueue(jobOptions)
|
|
135
|
+
const options = this._withTimeout(this._withQueue(jobOptions))
|
|
106
136
|
|
|
107
137
|
if (options.concurrencyKey !== undefined) return options
|
|
108
138
|
|
|
@@ -175,7 +175,7 @@
|
|
|
175
175
|
* @property {boolean} [deduplicateWhileQueued] - When true, skip the enqueue if an identical still-queued job (same job name, args and queue) is scheduled no later than this enqueue, returning the earliest matching job's id. A future retry does not suppress earlier work. Deduplication is independent of `concurrencyKey`, so the job keeps its normal (e.g. queue-derived) concurrency cap. Keeps an interval-scheduled recurring job (e.g. retention pruning) from piling up redundant queued rows when it runs slower than its interval or no worker is free.
|
|
176
176
|
* @property {string} [idempotencyKey] - Durable enqueue identity scoped to the resolved job class name and queue. Exact replay returns the original job id across every state and after job pruning; reuse with different canonical arguments or behavior-affecting options fails. Ownership is independent of `deduplicateWhileQueued` and is retained until an explicit future retention policy removes it.
|
|
177
177
|
* @property {number} [scheduledAtMs] - Epoch timestamp in milliseconds when the job becomes eligible for dispatch. Defaults to enqueue time.
|
|
178
|
-
* @property {number} [timeoutMs] - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
|
|
178
|
+
* @property {number} [timeoutMs] - Per-job wall-clock timeout for forked and pooled execution. A positive integer up to 2,147,483,647 overrides a job class's `static timeoutMs` and the worker-level `jobTimeoutMs`; a non-positive finite value disables the timeout for this job.
|
|
179
179
|
*/
|
|
180
180
|
/**
|
|
181
181
|
* @typedef {object} BackgroundJobPayload
|
|
@@ -34,9 +34,10 @@ export default class SyncModelChangeFeedService {
|
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Builds a stable change-feed page. The additive `total` is the scope's pending
|
|
37
|
-
* change count from the request cursor to the snapshot bound
|
|
38
|
-
*
|
|
39
|
-
*
|
|
37
|
+
* change count from the request cursor to the snapshot bound, so a client can
|
|
38
|
+
* render a "synced of total" progress bar; older clients ignore it. The count
|
|
39
|
+
* query only runs when the page read cannot answer it: a sequence cursor whose
|
|
40
|
+
* page is short of the limit has already materialized the whole remaining set.
|
|
40
41
|
* @returns {Promise<{status: string, nextCursor: {id: string, serverSequence: number, updatedAt: string} | null, syncs: Array<Record<string, unknown>>, total: number, upToCursor: {id: string, serverSequence: number, updatedAt: string} | null}>} Change-feed page result.
|
|
41
42
|
*/
|
|
42
43
|
async changes() {
|
|
@@ -45,10 +46,22 @@ export default class SyncModelChangeFeedService {
|
|
|
45
46
|
|
|
46
47
|
if (!upToCursor) return {status: "success", nextCursor: null, syncs: [], total: 0, upToCursor: null}
|
|
47
48
|
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
const afterServerSequence = this.optionalPositiveIntegerParam(this.params.afterServerSequence, "afterServerSequence")
|
|
50
|
+
|
|
51
|
+
// A cursor at or past the scope's snapshot bound cannot have pending rows.
|
|
52
|
+
// Answering here skips both the page read and the count, which would otherwise
|
|
53
|
+
// run against an empty sequence range on every caught-up poll. A multi-scope
|
|
54
|
+
// client sends its global cursor to each scope, so a scope whose own sequences
|
|
55
|
+
// are behind that cursor lands here on nearly every request.
|
|
56
|
+
if (afterServerSequence !== null && afterServerSequence >= upToCursor.serverSequence) {
|
|
57
|
+
return {status: "success", nextCursor: upToCursor, syncs: [], total: 0, upToCursor}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const records = await this.pageQuery({limit, upToCursor}).toArray()
|
|
51
61
|
const nextCursor = records.length > 0 ? this.cursorForRecord(records[records.length - 1]) : upToCursor
|
|
62
|
+
const total = afterServerSequence !== null && records.length < limit
|
|
63
|
+
? records.length
|
|
64
|
+
: await this.totalPendingChanges({upToCursor})
|
|
52
65
|
|
|
53
66
|
return {
|
|
54
67
|
status: "success",
|