velocious 1.0.665 → 1.0.667

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.
Files changed (108) hide show
  1. package/README.md +14 -5
  2. package/build/background-jobs/adapter-client.js +22 -0
  3. package/build/background-jobs/adapter.js +15 -0
  4. package/build/background-jobs/client.js +206 -14
  5. package/build/background-jobs/enqueue-acknowledgement-timeout-error.js +50 -0
  6. package/build/background-jobs/job-semantics.js +30 -0
  7. package/build/background-jobs/job.js +26 -1
  8. package/build/background-jobs/local-adapter.js +36 -8
  9. package/build/background-jobs/local-store.js +410 -39
  10. package/build/background-jobs/main.js +69 -2
  11. package/build/background-jobs/platform-job.js +26 -1
  12. package/build/background-jobs/runtime.js +58 -0
  13. package/build/background-jobs/store.js +374 -6
  14. package/build/background-jobs/types.js +27 -2
  15. package/build/background-jobs/web/controller.js +1 -0
  16. package/build/configuration.js +7 -5
  17. package/build/database/drivers/mssql/column.js +2 -2
  18. package/build/database/drivers/mssql/table.js +19 -5
  19. package/build/database/pool/async-tracked-multi-connection.js +2 -1
  20. package/build/database/query/alter-table-base.js +8 -1
  21. package/build/database/record/attachments/store.js +2 -2
  22. package/build/frontend-model-controller.js +22 -2
  23. package/build/http-server/websocket-events-host.js +3 -1
  24. package/build/src/background-jobs/adapter-client.d.ts +17 -0
  25. package/build/src/background-jobs/adapter-client.d.ts.map +1 -1
  26. package/build/src/background-jobs/adapter-client.js +19 -1
  27. package/build/src/background-jobs/adapter.d.ts +15 -0
  28. package/build/src/background-jobs/adapter.d.ts.map +1 -1
  29. package/build/src/background-jobs/adapter.js +14 -1
  30. package/build/src/background-jobs/client.d.ts +17 -0
  31. package/build/src/background-jobs/client.d.ts.map +1 -1
  32. package/build/src/background-jobs/client.js +186 -15
  33. package/build/src/background-jobs/enqueue-acknowledgement-timeout-error.d.ts +81 -0
  34. package/build/src/background-jobs/enqueue-acknowledgement-timeout-error.d.ts.map +1 -0
  35. package/build/src/background-jobs/enqueue-acknowledgement-timeout-error.js +47 -0
  36. package/build/src/background-jobs/job-semantics.d.ts +18 -0
  37. package/build/src/background-jobs/job-semantics.d.ts.map +1 -1
  38. package/build/src/background-jobs/job-semantics.js +28 -1
  39. package/build/src/background-jobs/job.d.ts +15 -0
  40. package/build/src/background-jobs/job.d.ts.map +1 -1
  41. package/build/src/background-jobs/job.js +21 -2
  42. package/build/src/background-jobs/local-adapter.d.ts +23 -8
  43. package/build/src/background-jobs/local-adapter.d.ts.map +1 -1
  44. package/build/src/background-jobs/local-adapter.js +35 -9
  45. package/build/src/background-jobs/local-store.d.ts +120 -5
  46. package/build/src/background-jobs/local-store.d.ts.map +1 -1
  47. package/build/src/background-jobs/local-store.js +366 -40
  48. package/build/src/background-jobs/main.d.ts +24 -2
  49. package/build/src/background-jobs/main.d.ts.map +1 -1
  50. package/build/src/background-jobs/main.js +68 -3
  51. package/build/src/background-jobs/platform-job.d.ts +15 -0
  52. package/build/src/background-jobs/platform-job.d.ts.map +1 -1
  53. package/build/src/background-jobs/platform-job.js +19 -2
  54. package/build/src/background-jobs/runtime.d.ts +39 -0
  55. package/build/src/background-jobs/runtime.d.ts.map +1 -1
  56. package/build/src/background-jobs/runtime.js +49 -1
  57. package/build/src/background-jobs/store.d.ts +100 -1
  58. package/build/src/background-jobs/store.d.ts.map +1 -1
  59. package/build/src/background-jobs/store.js +334 -8
  60. package/build/src/background-jobs/types.d.ts +97 -4
  61. package/build/src/background-jobs/types.d.ts.map +1 -1
  62. package/build/src/background-jobs/types.js +28 -3
  63. package/build/src/background-jobs/web/controller.d.ts.map +1 -1
  64. package/build/src/background-jobs/web/controller.js +2 -1
  65. package/build/src/configuration.d.ts.map +1 -1
  66. package/build/src/configuration.js +7 -5
  67. package/build/src/database/drivers/mssql/column.d.ts.map +1 -1
  68. package/build/src/database/drivers/mssql/column.js +2 -2
  69. package/build/src/database/drivers/mssql/table.d.ts.map +1 -1
  70. package/build/src/database/drivers/mssql/table.js +19 -5
  71. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  72. package/build/src/database/pool/async-tracked-multi-connection.js +3 -2
  73. package/build/src/database/query/alter-table-base.d.ts.map +1 -1
  74. package/build/src/database/query/alter-table-base.js +9 -2
  75. package/build/src/database/record/attachments/store.js +3 -3
  76. package/build/src/frontend-model-controller.d.ts.map +1 -1
  77. package/build/src/frontend-model-controller.js +18 -3
  78. package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
  79. package/build/src/http-server/websocket-events-host.js +4 -2
  80. package/build/src/testing/test-files-finder.d.ts +4 -1
  81. package/build/src/testing/test-files-finder.d.ts.map +1 -1
  82. package/build/src/testing/test-files-finder.js +8 -3
  83. package/build/testing/test-files-finder.js +6 -1
  84. package/package.json +1 -1
  85. package/scripts/test-browser.js +1 -0
  86. package/src/background-jobs/adapter-client.js +22 -0
  87. package/src/background-jobs/adapter.js +15 -0
  88. package/src/background-jobs/client.js +206 -14
  89. package/src/background-jobs/enqueue-acknowledgement-timeout-error.js +50 -0
  90. package/src/background-jobs/job-semantics.js +30 -0
  91. package/src/background-jobs/job.js +26 -1
  92. package/src/background-jobs/local-adapter.js +36 -8
  93. package/src/background-jobs/local-store.js +410 -39
  94. package/src/background-jobs/main.js +69 -2
  95. package/src/background-jobs/platform-job.js +26 -1
  96. package/src/background-jobs/runtime.js +58 -0
  97. package/src/background-jobs/store.js +374 -6
  98. package/src/background-jobs/types.js +27 -2
  99. package/src/background-jobs/web/controller.js +1 -0
  100. package/src/configuration.js +7 -5
  101. package/src/database/drivers/mssql/column.js +2 -2
  102. package/src/database/drivers/mssql/table.js +19 -5
  103. package/src/database/pool/async-tracked-multi-connection.js +2 -1
  104. package/src/database/query/alter-table-base.js +8 -1
  105. package/src/database/record/attachments/store.js +2 -2
  106. package/src/frontend-model-controller.js +22 -2
  107. package/src/http-server/websocket-events-host.js +3 -1
  108. package/src/testing/test-files-finder.js +6 -1
@@ -1,9 +1,74 @@
1
1
  // @ts-check
2
- import timeout from "awaitery/build/timeout.js";
2
+ import timeout, { TimeoutError } from "awaitery/build/timeout.js";
3
3
  import configurationResolver from "../configuration-resolver.js";
4
+ import isPlainObject from "../utils/plain-object.js";
5
+ import BackgroundJobEnqueueAcknowledgementTimeoutError from "./enqueue-acknowledgement-timeout-error.js";
4
6
  import BackgroundJobsSocketRequest from "./socket-request.js";
5
7
  import { DEFAULT_GENERATION_HANDSHAKE_TIMEOUT_MS, validateGenerationHandshakeTimeoutMs } from "./generation-handshake-timeout-error.js";
8
+ import { BACKGROUND_JOB_ACTIVE_STATUSES, BACKGROUND_JOB_EXECUTION_MODES, BACKGROUND_JOB_STATUSES, BACKGROUND_JOB_TERMINAL_STATUSES } from "./job-semantics.js";
6
9
  const DEFAULT_ENQUEUE_TIMEOUT_MS = 5000;
10
+ const BACKGROUND_JOB_WAKE_OUTCOMES = ["woken", "already_due", "handed_off", "not_found"];
11
+ const BACKGROUND_JOB_NULLABLE_NUMBER_FIELDS = [
12
+ "attempts",
13
+ "childPid",
14
+ "childReceivedAtMs",
15
+ "childStartedAtMs",
16
+ "completedAtMs",
17
+ "createdAtMs",
18
+ "failedAtMs",
19
+ "handedOffAtMs",
20
+ "maxConcurrency",
21
+ "maxRetries",
22
+ "orphanedAtMs",
23
+ "scheduleOrder",
24
+ "scheduledAtMs",
25
+ "timeoutMs"
26
+ ];
27
+ const BACKGROUND_JOB_NULLABLE_STRING_FIELDS = ["childInstanceId", "concurrencyKey", "handoffId", "lastError", "scheduleKey", "workerId"];
28
+ /**
29
+ * Checks a required nullable number from a normalized wire row.
30
+ * @param {ReturnType<typeof JSON.parse>} value - Field value.
31
+ * @returns {boolean} - Whether the field is null or a finite number.
32
+ */
33
+ function isNullableBackgroundJobNumber(value) {
34
+ return value === null || (typeof value === "number" && Number.isFinite(value));
35
+ }
36
+ /**
37
+ * Checks a required nullable string from a normalized wire row.
38
+ * @param {ReturnType<typeof JSON.parse>} value - Field value.
39
+ * @returns {boolean} - Whether the field is null or a string.
40
+ */
41
+ function isNullableBackgroundJobString(value) {
42
+ return value === null || typeof value === "string";
43
+ }
44
+ /**
45
+ * Checks that a transport job uses the normalized public camel-case shape.
46
+ * @param {ReturnType<typeof JSON.parse>} value - Transport value.
47
+ * @returns {value is import("./types.js").BackgroundJobRow} - Whether normalized.
48
+ */
49
+ function isNormalizedBackgroundJob(value) {
50
+ if (!isPlainObject(value))
51
+ return false;
52
+ const job = value;
53
+ return typeof job.id === "string"
54
+ && typeof job.jobName === "string"
55
+ && Array.isArray(job.args)
56
+ && BACKGROUND_JOB_EXECUTION_MODES.some((executionMode) => executionMode === job.executionMode)
57
+ && typeof job.queue === "string"
58
+ && BACKGROUND_JOB_STATUSES.some((status) => status === job.status)
59
+ && BACKGROUND_JOB_NULLABLE_NUMBER_FIELDS.every((field) => isNullableBackgroundJobNumber(job[field]))
60
+ && BACKGROUND_JOB_NULLABLE_STRING_FIELDS.every((field) => isNullableBackgroundJobString(job[field]));
61
+ }
62
+ /**
63
+ * Describes an unexpected protocol response without echoing its payload.
64
+ * @param {string} operation - Public operation name.
65
+ * @param {import("./types.js").BackgroundJobSocketMessage} message - Response.
66
+ * @returns {Error} - Protocol error.
67
+ */
68
+ function unexpectedResponseError(operation, message) {
69
+ const responseType = message && typeof message.type === "string" ? message.type : "missing type";
70
+ return new Error(`Unexpected ${operation} response: ${responseType}`);
71
+ }
7
72
  export default class BackgroundJobsClient {
8
73
  /**
9
74
  * Runs constructor.
@@ -51,17 +116,36 @@ export default class BackgroundJobsClient {
51
116
  ...(producerInvocationId ? { producerInvocationId } : {}),
52
117
  ...(producerProof ? { producerProof } : {})
53
118
  };
54
- const acknowledgement = { explicitlyRejected: false, generationFenced: false, requestSent: false };
119
+ /**
120
+ * Creates safe observations for one attempt without retaining request data.
121
+ * @param {object} args - Attempt identity.
122
+ * @param {"initial" | "owned_replay"} args.attemptKind - Initial attempt or owned replay.
123
+ * @param {number} args.attemptNumber - One-based attempt number.
124
+ * @returns {import("./enqueue-acknowledgement-timeout-error.js").BackgroundJobEnqueueAttempt} - Mutable attempt observations.
125
+ */
126
+ const newAttemptObservation = ({ attemptKind, attemptNumber }) => ({
127
+ acknowledgementWaitElapsedMs: 0,
128
+ attemptElapsedMs: 0,
129
+ attemptKind,
130
+ attemptNumber,
131
+ explicitlyRejected: false,
132
+ generationFenced: false,
133
+ requestSent: false
134
+ });
55
135
  /**
56
136
  * Sends one enqueue attempt. An owned caller may replay this exact message
57
137
  * once when transport acknowledgement remains ambiguous after send.
58
- * @param {{explicitlyRejected: boolean, generationFenced: boolean, requestSent: boolean} | undefined} attemptAcknowledgement - First-attempt observations.
138
+ * @param {import("./enqueue-acknowledgement-timeout-error.js").BackgroundJobEnqueueAttempt} attemptObservation - Mutable attempt observations.
139
+ * @param {Readonly<Array<import("./enqueue-acknowledgement-timeout-error.js").BackgroundJobEnqueueAttempt>>} previousAttempts - Earlier timed-out attempts.
59
140
  * @returns {Promise<string>} - Job id.
60
141
  */
61
- const enqueueAttempt = async (attemptAcknowledgement) => {
142
+ const enqueueAttempt = async (attemptObservation, previousAttempts) => {
143
+ const attemptStartedAtMs = Date.now();
62
144
  const request = await this._request();
63
145
  const requestAbortController = new AbortController();
64
146
  const timeoutErrorMessage = `Background job enqueue acknowledgement timed out after ${this.enqueueTimeoutMs}ms`;
147
+ /** @type {number | undefined} */
148
+ let requestSentAtMs;
65
149
  /**
66
150
  * Resolves the pre-send phase when the mutation has entered the socket.
67
151
  * @type {() => void}
@@ -93,10 +177,9 @@ export default class BackgroundJobsClient {
93
177
  signal: requestAbortController.signal,
94
178
  onConnect: (jsonSocket) => {
95
179
  jsonSocket.send(message);
96
- if (attemptAcknowledgement) {
97
- attemptAcknowledgement.generationFenced = Boolean(request.generationId);
98
- attemptAcknowledgement.requestSent = true;
99
- }
180
+ attemptObservation.generationFenced = Boolean(request.generationId);
181
+ attemptObservation.requestSent = true;
182
+ requestSentAtMs = Date.now();
100
183
  markRequestSent();
101
184
  },
102
185
  onMessage: ({ message, resolve, reject }) => {
@@ -105,23 +188,47 @@ export default class BackgroundJobsClient {
105
188
  return;
106
189
  }
107
190
  if (message?.type === "enqueue-error") {
108
- if (attemptAcknowledgement)
109
- attemptAcknowledgement.explicitlyRejected = true;
191
+ attemptObservation.explicitlyRejected = true;
110
192
  reject(new Error(message.error || "Failed to enqueue job"));
111
193
  }
112
194
  }
113
195
  });
114
196
  await withEnqueueTimeout(async () => await Promise.race([requestSent, requestPromise]));
115
- return await withEnqueueTimeout(async () => await requestPromise);
197
+ try {
198
+ return await withEnqueueTimeout(async () => await requestPromise);
199
+ }
200
+ catch (error) {
201
+ if (!(error instanceof TimeoutError))
202
+ throw error;
203
+ if (requestSentAtMs === undefined)
204
+ throw new Error("Background job enqueue acknowledgement wait started before the request was sent", { cause: error });
205
+ const timedOutAtMs = Date.now();
206
+ // The fired timer proves its logical deadline even when the adjustable wall clock reports a shorter interval.
207
+ const acknowledgementWaitElapsedMs = Math.max(this.enqueueTimeoutMs, timedOutAtMs - requestSentAtMs);
208
+ attemptObservation.acknowledgementWaitElapsedMs = acknowledgementWaitElapsedMs;
209
+ attemptObservation.attemptElapsedMs = Math.max(acknowledgementWaitElapsedMs, timedOutAtMs - attemptStartedAtMs);
210
+ throw new BackgroundJobEnqueueAcknowledgementTimeoutError({
211
+ acknowledgementTimeoutMs: this.enqueueTimeoutMs,
212
+ attemptHistory: [...previousAttempts, attemptObservation],
213
+ cause: error,
214
+ generationId: request.generationId,
215
+ jobName,
216
+ producerInvocationId,
217
+ producerProofPresent: Boolean(producerProof)
218
+ });
219
+ }
116
220
  };
221
+ const initialAttempt = newAttemptObservation({ attemptKind: "initial", attemptNumber: 1 });
117
222
  try {
118
- return await enqueueAttempt(acknowledgement);
223
+ return await enqueueAttempt(initialAttempt, []);
119
224
  }
120
225
  catch (error) {
121
- if (!producerInvocationId || !producerProof || !acknowledgement.generationFenced || !acknowledgement.requestSent || acknowledgement.explicitlyRejected)
226
+ if (!producerInvocationId || !producerProof || !initialAttempt.generationFenced || !initialAttempt.requestSent || initialAttempt.explicitlyRejected)
122
227
  throw error;
228
+ const previousAttempts = error instanceof BackgroundJobEnqueueAcknowledgementTimeoutError ? error.attemptHistory : [];
229
+ const replayAttempt = newAttemptObservation({ attemptKind: "owned_replay", attemptNumber: 2 });
230
+ return await enqueueAttempt(replayAttempt, previousAttempts);
123
231
  }
124
- return await enqueueAttempt(undefined);
125
232
  }
126
233
  /**
127
234
  * Atomically replaces the queued owner of a stable schedule key.
@@ -176,5 +283,69 @@ export default class BackgroundJobsClient {
176
283
  }
177
284
  });
178
285
  }
286
+ /**
287
+ * Reads current stable ownership and optional terminal history.
288
+ * @param {{scheduleKey: string, includeLatestTerminal?: boolean}} args - Lookup request.
289
+ * @returns {Promise<import("./types.js").BackgroundJobScheduledLookupResult>} - Normalized stable schedule jobs.
290
+ */
291
+ async getScheduledJob({ scheduleKey, includeLatestTerminal }) {
292
+ const request = await this._request();
293
+ return await request.run({
294
+ onConnect: (jsonSocket) => {
295
+ jsonSocket.send({ type: "get-scheduled-job", scheduleKey, includeLatestTerminal });
296
+ },
297
+ onMessage: ({ message, resolve, reject }) => {
298
+ if (message?.type === "scheduled-job") {
299
+ const { currentJob, latestTerminalJob } = message;
300
+ const currentJobValid = currentJob === null
301
+ || (isNormalizedBackgroundJob(currentJob) && BACKGROUND_JOB_ACTIVE_STATUSES.some((status) => status === currentJob.status));
302
+ const latestTerminalJobValid = latestTerminalJob === null
303
+ || (isNormalizedBackgroundJob(latestTerminalJob) && BACKGROUND_JOB_TERMINAL_STATUSES.some((status) => status === latestTerminalJob.status));
304
+ if (!currentJobValid || !latestTerminalJobValid) {
305
+ reject(new Error("Invalid getScheduledJob response: expected normalized public job values"));
306
+ return;
307
+ }
308
+ resolve({ currentJob, latestTerminalJob });
309
+ return;
310
+ }
311
+ if (message?.type === "get-scheduled-job-error") {
312
+ reject(new Error(message.error || "Failed to read scheduled job"));
313
+ return;
314
+ }
315
+ reject(unexpectedResponseError("getScheduledJob", message));
316
+ }
317
+ });
318
+ }
319
+ /**
320
+ * Expedites a future queued stable owner without changing job identity.
321
+ * @param {{scheduleKey: string}} args - Wake request.
322
+ * @returns {Promise<import("./types.js").BackgroundJobWakeResult>} - Wake result.
323
+ */
324
+ async wakeScheduled({ scheduleKey }) {
325
+ const request = await this._request();
326
+ return await request.run({
327
+ onConnect: (jsonSocket) => {
328
+ jsonSocket.send({ type: "wake-scheduled", scheduleKey });
329
+ },
330
+ onMessage: ({ message, resolve, reject }) => {
331
+ if (message?.type === "schedule-woken") {
332
+ const outcome = message.outcome;
333
+ const knownOutcome = BACKGROUND_JOB_WAKE_OUTCOMES.includes(outcome);
334
+ const validJobId = outcome === "not_found" ? message.jobId === null : typeof message.jobId === "string" && message.jobId.length > 0;
335
+ if (!knownOutcome || !validJobId) {
336
+ reject(new Error("Invalid wakeScheduled response"));
337
+ return;
338
+ }
339
+ resolve({ jobId: message.jobId, outcome });
340
+ return;
341
+ }
342
+ if (message?.type === "wake-scheduled-error") {
343
+ reject(new Error(message.error || "Failed to wake scheduled job"));
344
+ return;
345
+ }
346
+ reject(unexpectedResponseError("wakeScheduled", message));
347
+ }
348
+ });
349
+ }
179
350
  }
180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy9jbGllbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sT0FBTyxNQUFNLDJCQUEyQixDQUFBO0FBQy9DLE9BQU8scUJBQXFCLE1BQU0sOEJBQThCLENBQUE7QUFDaEUsT0FBTywyQkFBMkIsTUFBTSxxQkFBcUIsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsdUNBQXVDLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQTtBQUV2SSxNQUFNLDBCQUEwQixHQUFHLElBQUksQ0FBQTtBQUV2QyxNQUFNLENBQUMsT0FBTyxPQUFPLG9CQUFvQjtJQUN2Qzs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxnQkFBZ0IsR0FBRywwQkFBMEIsRUFBRSw0QkFBNEIsR0FBRyx1Q0FBdUMsRUFBRSxZQUFZLEVBQUMsR0FBRyxFQUFFO1FBQ25LLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixFQUFFLENBQUE7UUFDcEcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFBO1FBQ3hDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxvQ0FBb0MsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO1FBQ3RHLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxZQUFZLENBQUE7SUFDMUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxRQUFRO1FBQ1osTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUE7UUFDckQsTUFBTSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsR0FBRyxhQUFhLENBQUMsdUJBQXVCLEVBQUUsQ0FBQTtRQUM1RCxNQUFNLEVBQUMsWUFBWSxFQUFDLEdB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Q0FBQyxFQUFDLFdBQVcsRUFBQztRQUNqQyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUVyQyxPQUFPLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUN2QixTQUFTLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFDeEIsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFBO1lBQzFELENBQUM7WUFDRCxTQUFTLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFDLEVBQUUsRUFBRTtnQkFDeEMsSUFBSSxPQUFPLEVBQUUsSUFBSSxLQUFLLG9CQUFvQixFQUFFLENBQUM7b0JBQzNDLE9BQU8sQ0FBQyxFQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQTtvQkFDekQsT0FBTTtnQkFDUixDQUFDO2dCQUVELElBQUksT0FBTyxFQUFFLElBQUksS0FBSyx3QkFBd0IsRUFBRSxDQUFDO29CQUMvQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUE7Z0JBQ3RFLENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCBjb25maWd1cmF0aW9uUmVzb2x2ZXIgZnJvbSBcIi4uL2NvbmZpZ3VyYXRpb24tcmVzb2x2ZXIuanNcIlxuaW1wb3J0IEJhY2tncm91bmRKb2JzU29ja2V0UmVxdWVzdCBmcm9tIFwiLi9zb2NrZXQtcmVxdWVzdC5qc1wiXG5pbXBvcnQgeyBERUZBVUxUX0dFTkVSQVRJT05fSEFORFNIQUtFX1RJTUVPVVRfTVMsIHZhbGlkYXRlR2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNcyB9IGZyb20gXCIuL2dlbmVyYXRpb24taGFuZHNoYWtlLXRpbWVvdXQtZXJyb3IuanNcIlxuXG5jb25zdCBERUZBVUxUX0VOUVVFVUVfVElNRU9VVF9NUyA9IDUwMDBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFja2dyb3VuZEpvYnNDbGllbnQge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBbYXJncy5jb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5lbnF1ZXVlVGltZW91dE1zXSAtIE1heGltdW0gdGltZSB0byB3YWl0IGZvciBhbiBlbnF1ZXVlIGFja25vd2xlZGdlbWVudCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDUwMDApLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuZ2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNc10gLSBNYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgZ2VuZXJhdGlvbiBhY2tub3dsZWRnZW1lbnQgKGRlZmF1bHQ6IDQwMDApLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZ2VuZXJhdGlvbklkXSAtIEV4cGxpY2l0IHJlbGVhc2UgZ2VuZXJhdGlvbiBpZGVudGl0eS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBlbnF1ZXVlVGltZW91dE1zID0gREVGQVVMVF9FTlFVRVVFX1RJTUVPVVRfTVMsIGdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXMgPSBERUZBVUxUX0dFTkVSQVRJT05fSEFORFNIQUtFX1RJTUVPVVRfTVMsIGdlbmVyYXRpb25JZH0gPSB7fSkge1xuICAgIHRoaXMuY29uZmlndXJhdGlvblByb21pc2UgPSBjb25maWd1cmF0aW9uID8gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZ3VyYXRpb24pIDogY29uZmlndXJhdGlvblJlc29sdmVyKClcbiAgICB0aGlzLmVucXVldWVUaW1lb3V0TXMgPSBlbnF1ZXVlVGltZW91dE1zXG4gICAgdGhpcy5nZW5lcmF0aW9uSGFuZHNoYWtlVGltZW91dE1zID0gdmFsaWRhdGVHZW5lcmF0aW9uSGFuZHNoYWtlVGltZW91dE1zKGdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXMpXG4gICAgdGhpcy5leHBsaWNpdEdlbmVyYXRpb25JZCA9IGdlbmVyYXRpb25JZFxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIG9uZS1zaG90IGNsaWVudCBzb2NrZXQgcmVxdWVzdCBmcm9tIHRoZSByZXNvbHZlZCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCYWNrZ3JvdW5kSm9ic1NvY2tldFJlcXVlc3Q+fSAtIFNvY2tldCByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgX3JlcXVlc3QoKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IGF3YWl0IHRoaXMuY29uZmlndXJhdGlvblByb21pc2VcbiAgICBjb25zdCB7aG9zdCwgcG9ydH0gPSBjb25maWd1cmF0aW9uLmdldEJhY2tncm91bmRKb2JzQ29uZmlnKClcbiAgICBjb25zdCB7Z2VuZXJhdGlvbklkfSA9IGNvbmZpZ3VyYXRpb24ucmVzb2x2ZUJhY2tncm91bmRKb2JzR2VuZXJhdGlvbkNvbmZpZyh7XG4gICAgICBnZW5lcmF0aW9uSWQ6IHRoaXMuZXhwbGljaXRHZW5lcmF0aW9uSWQsXG4gICAgICBzb3VyY2VOYW1lOiBcIkJhY2tncm91bmRKb2JzQ2xpZW50XCJcbiAgICB9KVxuXG4gICAgcmV0dXJuIG5ldyBCYWNrZ3JvdW5kSm9ic1NvY2tldFJlcXVlc3Qoe2hvc3QsIHBvcnQsIHJvbGU6IFwiY2xpZW50XCIsIGdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXM6IHRoaXMuZ2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNcywgZ2VuZXJhdGlvbklkfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGVucXVldWUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muam9iTmFtZSAtIEpvYiBuYW1lLlxuICAgKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5hcmdzIC0gSm9iIGFyZ3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc30gW2FyZ3Mub3B0aW9uc10gLSBKb2Igb3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnByb2R1Y2VySW52b2NhdGlvbklkXSAtIFN0YWJsZSBpZGVudGl0eSBmb3Igb25lIG93bmVkIGVucXVldWUgaW52b2NhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JQcm9kdWNlclByb29mfSBbYXJncy5wcm9kdWNlclByb29mXSAtIEV4YWN0IGludGVybmFsIHByb2R1Y2VyIGhhbmRvZmYuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gSm9iIGlkLlxuICAgKi9cbiAgYXN5bmMgZW5xdWV1ZSh7am9iTmFtZSwgYXJncywgb3B0aW9ucywgcHJvZHVjZXJJbnZvY2F0aW9uSWQsIHByb2R1Y2VyUHJvb2Z9KSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgIHR5cGU6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcImVucXVldWVcIiksXG4gICAgICBqb2JOYW1lLFxuICAgICAgYXJncyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICAuLi4ocHJvZHVjZXJJbnZvY2F0aW9uSWQgPyB7cHJvZHVjZXJJbnZvY2F0aW9uSWR9IDoge30pLFxuICAgICAgLi4uKHByb2R1Y2VyUHJvb2YgPyB7cHJvZHVjZXJQcm9vZn0gOiB7fSlcbiAgICB9XG4gICAgY29uc3QgYWNrbm93bGVkZ2VtZW50ID0ge2V4cGxpY2l0bHlSZWplY3RlZDogZmFsc2UsIGdlbmVyYXRpb25GZW5jZWQ6IGZhbHNlLCByZXF1ZXN0U2VudDogZmFsc2V9XG4gICAgLyoqXG4gICAgICogU2VuZHMgb25lIGVucXVldWUgYXR0ZW1wdC4gQW4gb3duZWQgY2FsbGVyIG1heSByZXBsYXkgdGhpcyBleGFjdCBtZXNzYWdlXG4gICAgICogb25jZSB3aGVuIHRyYW5zcG9ydCBhY2tub3dsZWRnZW1lbnQgcmVtYWlucyBhbWJpZ3VvdXMgYWZ0ZXIgc2VuZC5cbiAgICAgKiBAcGFyYW0ge3tleHBsaWNpdGx5UmVqZWN0ZWQ6IGJvb2xlYW4sIGdlbmVyYXRpb25GZW5jZWQ6IGJvb2xlYW4sIHJlcXVlc3RTZW50OiBib29sZWFufSB8IHVuZGVmaW5lZH0gYXR0ZW1wdEFja25vd2xlZGdlbWVudCAtIEZpcnN0LWF0dGVtcHQgb2JzZXJ2YXRpb25zLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gSm9iIGlkLlxuICAgICAqL1xuICAgIGNvbnN0IGVucXVldWVBdHRlbXB0ID0gYXN5bmMgKGF0dGVtcHRBY2tub3dsZWRnZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCB0aGlzLl9yZXF1ZXN0KClcbiAgICAgIGNvbnN0IHJlcXVlc3RBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICAgIGNvbnN0IHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBgQmFja2dyb3VuZCBqb2IgZW5xdWV1ZSBhY2tub3dsZWRnZW1lbnQgdGltZWQgb3V0IGFmdGVyICR7dGhpcy5lbnF1ZXVlVGltZW91dE1zfW1zYFxuICAgICAgLyoqXG4gICAgICAgKiBSZXNvbHZlcyB0aGUgcHJlLXNlbmQgcGhhc2Ugd2hlbiB0aGUgbXV0YXRpb24gaGFzIGVudGVyZWQgdGhlIHNvY2tldC5cbiAgICAgICAqIEB0eXBlIHsoKSA9PiB2b2lkfVxuICAgICAgICovXG4gICAgICBsZXQgbWFya1JlcXVlc3RTZW50ID0gKCkgPT4ge31cbiAgICAgIGNvbnN0IHJlcXVlc3RTZW50ID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgbWFya1JlcXVlc3RTZW50ID0gKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICB9KVxuICAgICAgLyoqXG4gICAgICAgKiBBcHBsaWVzIHRoZSBjb25maWd1cmVkIGRlYWRsaW5lIGluZGVwZW5kZW50bHkgdG8gb25lIHJlcXVlc3QgcGhhc2UuXG4gICAgICAgKiBAdGVtcGxhdGUgVFxuICAgICAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIFBoYXNlIHdvcmsuXG4gICAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBQaGFzZSByZXN1bHQuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHdpdGhFbnF1ZXVlVGltZW91dCA9IGFzeW5jIChjYWxsYmFjaykgPT4gYXdhaXQgdGltZW91dCh7XG4gICAgICAgIGVycm9yTWVzc2FnZTogdGltZW91dEVycm9yTWVzc2FnZSxcbiAgICAgICAgdGltZW91dDogdGhpcy5lbnF1ZXVlVGltZW91dE1zXG4gICAgICB9LCBhc3luYyAoe2NvbnRyb2x9KSA9PiB7XG4gICAgICAgIGNvbnN0IGFib3J0UmVxdWVzdCA9ICgpID0+IHJlcXVlc3RBYm9ydENvbnRyb2xsZXIuYWJvcnQoY29udHJvbC5zaWduYWwucmVhc29uKVxuXG4gICAgICAgIGNvbnRyb2wuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydFJlcXVlc3QpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBjb250cm9sLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRSZXF1ZXN0KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgY29uc3QgcmVxdWVzdFByb21pc2UgPSByZXF1ZXN0LnJ1bih7XG4gICAgICAgIHNpZ25hbDogcmVxdWVzdEFib3J0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIG9uQ29ubmVjdDogKGpzb25Tb2NrZXQpID0+IHtcbiAgICAgICAgICBqc29uU29ja2V0LnNlbmQobWVzc2FnZSlcbiAgICAgICAgICBpZiAoYXR0ZW1wdEFja25vd2xlZGdlbWVudCkge1xuICAgICAgICAgICAgYXR0ZW1wdEFja25vd2xlZGdlbWVudC5nZW5lcmF0aW9uRmVuY2VkID0gQm9vbGVhbihyZXF1ZXN0LmdlbmVyYXRpb25JZClcbiAgICAgICAgICAgIGF0dGVtcHRBY2tub3dsZWRnZW1lbnQucmVxdWVzdFNlbnQgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIG1hcmtSZXF1ZXN0U2VudCgpXG4gICAgICAgIH0sXG4gICAgICAgIG9uTWVzc2FnZTogKHttZXNzYWdlLCByZXNvbHZlLCByZWplY3R9KSA9PiB7XG4gICAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwiZW5xdWV1ZWRcIikge1xuICAgICAgICAgICAgcmVzb2x2ZShtZXNzYWdlLmpvYklkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwiZW5xdWV1ZS1lcnJvclwiKSB7XG4gICAgICAgICAgICBpZiAoYXR0ZW1wdEFja25vd2xlZGdlbWVudCkgYXR0ZW1wdEFja25vd2xlZGdlbWVudC5leHBsaWNpdGx5UmVqZWN0ZWQgPSB0cnVlXG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKG1lc3NhZ2UuZXJyb3IgfHwgXCJGYWlsZWQgdG8gZW5xdWV1ZSBqb2JcIikpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB3aXRoRW5xdWV1ZVRpbWVvdXQoYXN5bmMgKCkgPT4gYXdhaXQgUHJvbWlzZS5yYWNlKFtyZXF1ZXN0U2VudCwgcmVxdWVzdFByb21pc2VdKSlcblxuICAgICAgcmV0dXJuIGF3YWl0IHdpdGhFbnF1ZXVlVGltZW91dChhc3luYyAoKSA9PiBhd2FpdCByZXF1ZXN0UHJvbWlzZSlcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGVucXVldWVBdHRlbXB0KGFja25vd2xlZGdlbWVudClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFwcm9kdWNlckludm9jYXRpb25JZCB8fCAhcHJvZHVjZXJQcm9vZiB8fCAhYWNrbm93bGVkZ2VtZW50LmdlbmVyYXRpb25GZW5jZWQgfHwgIWFja25vd2xlZGdlbWVudC5yZXF1ZXN0U2VudCB8fCBhY2tub3dsZWRnZW1lbnQuZXhwbGljaXRseVJlamVjdGVkKSB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBlbnF1ZXVlQXR0ZW1wdCh1bmRlZmluZWQpXG4gIH1cblxuICAvKipcbiAgICogQXRvbWljYWxseSByZXBsYWNlcyB0aGUgcXVldWVkIG93bmVyIG9mIGEgc3RhYmxlIHNjaGVkdWxlIGtleS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zY2hlZHVsZUtleSAtIFN0YWJsZSBsb2dpY2FsIHNjaGVkdWxlIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muam9iTmFtZSAtIEpvYiBuYW1lLlxuICAgKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5hcmdzIC0gSm9iIGFyZ3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iT3B0aW9uc30gW2FyZ3Mub3B0aW9uc10gLSBKb2Igb3B0aW9ucy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iUmVwbGFjZW1lbnRSZXN1bHQ+fSAtIFJlcGxhY2VtZW50IHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHJlcGxhY2VTY2hlZHVsZWQoe3NjaGVkdWxlS2V5LCBqb2JOYW1lLCBhcmdzLCBvcHRpb25zfSkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCB0aGlzLl9yZXF1ZXN0KClcblxuICAgIHJldHVybiBhd2FpdCByZXF1ZXN0LnJ1bih7XG4gICAgICBvbkNvbm5lY3Q6IChqc29uU29ja2V0KSA9PiB7XG4gICAgICAgIGpzb25Tb2NrZXQuc2VuZCh7dHlwZTogXCJyZXBsYWNlLXNjaGVkdWxlZFwiLCBzY2hlZHVsZUtleSwgam9iTmFtZSwgYXJncywgb3B0aW9uc30pXG4gICAgICB9LFxuICAgICAgb25NZXNzYWdlOiAoe21lc3NhZ2UsIHJlc29sdmUsIHJlamVjdH0pID0+IHtcbiAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwic2NoZWR1bGUtcmVwbGFjZWRcIikge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgam9iSWQ6IG1lc3NhZ2Uuam9iSWQsXG4gICAgICAgICAgICBwcmV2aW91c0pvYklkOiBtZXNzYWdlLnByZXZpb3VzSm9iSWQsXG4gICAgICAgICAgICBwcmV2aW91c1N0YXR1czogbWVzc2FnZS5wcmV2aW91c1N0YXR1c1xuICAgICAgICAgIH0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZT8udHlwZSA9PT0gXCJyZXBsYWNlLXNjaGVkdWxlZC1lcnJvclwiKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlLmVycm9yIHx8IFwiRmFpbGVkIHRvIHJlcGxhY2Ugc2NoZWR1bGVkIGpvYlwiKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VscyBvciBkZXRhY2hlcyB0aGUgY3VycmVudCBvd25lciBvZiBhIHN0YWJsZSBzY2hlZHVsZSBrZXkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc2NoZWR1bGVLZXkgLSBTdGFibGUgbG9naWNhbCBzY2hlZHVsZSBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYkNhbmNlbGxhdGlvblJlc3VsdD59IC0gQ2FuY2VsbGF0aW9uIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNhbmNlbFNjaGVkdWxlZCh7c2NoZWR1bGVLZXl9KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHRoaXMuX3JlcXVlc3QoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QucnVuKHtcbiAgICAgIG9uQ29ubmVjdDogKGpzb25Tb2NrZXQpID0+IHtcbiAgICAgICAganNvblNvY2tldC5zZW5kKHt0eXBlOiBcImNhbmNlbC1zY2hlZHVsZWRcIiwgc2NoZWR1bGVLZXl9KVxuICAgICAgfSxcbiAgICAgIG9uTWVzc2FnZTogKHttZXNzYWdlLCByZXNvbHZlLCByZWplY3R9KSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlPy50eXBlID09PSBcInNjaGVkdWxlLWNhbmNlbGxlZFwiKSB7XG4gICAgICAgICAgcmVzb2x2ZSh7am9iSWQ6IG1lc3NhZ2Uuam9iSWQsIG91dGNvbWU6IG1lc3NhZ2Uub3V0Y29tZX0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZT8udHlwZSA9PT0gXCJjYW5jZWwtc2NoZWR1bGVkLWVycm9yXCIpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKG1lc3NhZ2UuZXJyb3IgfHwgXCJGYWlsZWQgdG8gY2FuY2VsIHNjaGVkdWxlZCBqb2JcIikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG4iXX0=
351
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tncm91bmQtam9icy9jbGllbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sT0FBTyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDakUsT0FBTyxxQkFBcUIsTUFBTSw4QkFBOEIsQ0FBQTtBQUNoRSxPQUFPLGFBQWEsTUFBTSwwQkFBMEIsQ0FBQTtBQUNwRCxPQUFPLCtDQUErQyxNQUFNLDRDQUE0QyxDQUFBO0FBQ3hHLE9BQU8sMkJBQTJCLE1BQU0scUJBQXFCLENBQUE7QUFDN0QsT0FBTyxFQUFFLHVDQUF1QyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0seUNBQXlDLENBQUE7QUFDdkksT0FBTyxFQUFFLDhCQUE4QixFQUFFLDhCQUE4QixFQUFFLHVCQUF1QixFQUFFLGdDQUFnQyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFFOUosTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUE7QUFDdkMsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0FBQ3hGLE1BQU0scUNBQXFDLEdBQUc7SUFDNUMsVUFBVTtJQUNWLFVBQVU7SUFDVixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixhQUFhO0lBQ2IsWUFBWTtJQUNaLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLGNBQWM7SUFDZCxlQUFlO0lBQ2YsZUFBZTtJQUNmLFdBQVc7Q0FDWixDQUFBO0FBQ0QsTUFBTSxxQ0FBcUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFBO0FBRXhJOzs7O0dBSUc7QUFDSCxTQUFTLDZCQUE2QixDQUFDLEtBQUs7SUFDMUMsT0FBTyxL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SUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7b0JBRW5JLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFDakMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQTt3QkFDbkQsT0FBTTtvQkFDUixDQUFDO29CQUVELE9BQU8sQ0FBQyxFQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7b0JBQ3hDLE9BQU07Z0JBQ1IsQ0FBQztnQkFFRCxJQUFJLE9BQU8sRUFBRSxJQUFJLEtBQUssc0JBQXNCLEVBQUUsQ0FBQztvQkFDN0MsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksOEJBQThCLENBQUMsQ0FBQyxDQUFBO29CQUNsRSxPQUFNO2dCQUNSLENBQUM7Z0JBRUQsTUFBTSxDQUFDLHVCQUF1QixDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO1lBQzNELENBQUM7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHRpbWVvdXQsIHsgVGltZW91dEVycm9yIH0gZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIlxuaW1wb3J0IGNvbmZpZ3VyYXRpb25SZXNvbHZlciBmcm9tIFwiLi4vY29uZmlndXJhdGlvbi1yZXNvbHZlci5qc1wiXG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tIFwiLi4vdXRpbHMvcGxhaW4tb2JqZWN0LmpzXCJcbmltcG9ydCBCYWNrZ3JvdW5kSm9iRW5xdWV1ZUFja25vd2xlZGdlbWVudFRpbWVvdXRFcnJvciBmcm9tIFwiLi9lbnF1ZXVlLWFja25vd2xlZGdlbWVudC10aW1lb3V0LWVycm9yLmpzXCJcbmltcG9ydCBCYWNrZ3JvdW5kSm9ic1NvY2tldFJlcXVlc3QgZnJvbSBcIi4vc29ja2V0LXJlcXVlc3QuanNcIlxuaW1wb3J0IHsgREVGQVVMVF9HRU5FUkFUSU9OX0hBTkRTSEFLRV9USU1FT1VUX01TLCB2YWxpZGF0ZUdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXMgfSBmcm9tIFwiLi9nZW5lcmF0aW9uLWhhbmRzaGFrZS10aW1lb3V0LWVycm9yLmpzXCJcbmltcG9ydCB7IEJBQ0tHUk9VTkRfSk9CX0FDVElWRV9TVEFUVVNFUywgQkFDS0dST1VORF9KT0JfRVhFQ1VUSU9OX01PREVTLCBCQUNLR1JPVU5EX0pPQl9TVEFUVVNFUywgQkFDS0dST1VORF9KT0JfVEVSTUlOQUxfU1RBVFVTRVMgfSBmcm9tIFwiLi9qb2Itc2VtYW50aWNzLmpzXCJcblxuY29uc3QgREVGQVVMVF9FTlFVRVVFX1RJTUVPVVRfTVMgPSA1MDAwXG5jb25zdCBCQUNLR1JPVU5EX0pPQl9XQUtFX09VVENPTUVTID0gW1wid29rZW5cIiwgXCJhbHJlYWR5X2R1ZVwiLCBcImhhbmRlZF9vZmZcIiwgXCJub3RfZm91bmRcIl1cbmNvbnN0IEJBQ0tHUk9VTkRfSk9CX05VTExBQkxFX05VTUJFUl9GSUVMRFMgPSBbXG4gIFwiYXR0ZW1wdHNcIixcbiAgXCJjaGlsZFBpZFwiLFxuICBcImNoaWxkUmVjZWl2ZWRBdE1zXCIsXG4gIFwiY2hpbGRTdGFydGVkQXRNc1wiLFxuICBcImNvbXBsZXRlZEF0TXNcIixcbiAgXCJjcmVhdGVkQXRNc1wiLFxuICBcImZhaWxlZEF0TXNcIixcbiAgXCJoYW5kZWRPZmZBdE1zXCIsXG4gIFwibWF4Q29uY3VycmVuY3lcIixcbiAgXCJtYXhSZXRyaWVzXCIsXG4gIFwib3JwaGFuZWRBdE1zXCIsXG4gIFwic2NoZWR1bGVPcmRlclwiLFxuICBcInNjaGVkdWxlZEF0TXNcIixcbiAgXCJ0aW1lb3V0TXNcIlxuXVxuY29uc3QgQkFDS0dST1VORF9KT0JfTlVMTEFCTEVfU1RSSU5HX0ZJRUxEUyA9IFtcImNoaWxkSW5zdGFuY2VJZFwiLCBcImNvbmN1cnJlbmN5S2V5XCIsIFwiaGFuZG9mZklkXCIsIFwibGFzdEVycm9yXCIsIFwic2NoZWR1bGVLZXlcIiwgXCJ3b3JrZXJJZFwiXVxuXG4vKipcbiAqIENoZWNrcyBhIHJlcXVpcmVkIG51bGxhYmxlIG51bWJlciBmcm9tIGEgbm9ybWFsaXplZCB3aXJlIHJvdy5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gRmllbGQgdmFsdWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBmaWVsZCBpcyBudWxsIG9yIGEgZmluaXRlIG51bWJlci5cbiAqL1xuZnVuY3Rpb24gaXNOdWxsYWJsZUJhY2tncm91bmRKb2JOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSlcbn1cblxuLyoqXG4gKiBDaGVja3MgYSByZXF1aXJlZCBudWxsYWJsZSBzdHJpbmcgZnJvbSBhIG5vcm1hbGl6ZWQgd2lyZSByb3cuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIEZpZWxkIHZhbHVlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0aGUgZmllbGQgaXMgbnVsbCBvciBhIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gaXNOdWxsYWJsZUJhY2tncm91bmRKb2JTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIlxufVxuXG4vKipcbiAqIENoZWNrcyB0aGF0IGEgdHJhbnNwb3J0IGpvYiB1c2VzIHRoZSBub3JtYWxpemVkIHB1YmxpYyBjYW1lbC1jYXNlIHNoYXBlLlxuICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gdmFsdWUgLSBUcmFuc3BvcnQgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iUm93fSAtIFdoZXRoZXIgbm9ybWFsaXplZC5cbiAqL1xuZnVuY3Rpb24gaXNOb3JtYWxpemVkQmFja2dyb3VuZEpvYih2YWx1ZSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSByZXR1cm4gZmFsc2VcblxuICBjb25zdCBqb2IgPSB2YWx1ZVxuXG4gIHJldHVybiB0eXBlb2Ygam9iLmlkID09PSBcInN0cmluZ1wiXG4gICAgJiYgdHlwZW9mIGpvYi5qb2JOYW1lID09PSBcInN0cmluZ1wiXG4gICAgJiYgQXJyYXkuaXNBcnJheShqb2IuYXJncylcbiAgICAmJiBCQUNLR1JPVU5EX0pPQl9FWEVDVVRJT05fTU9ERVMuc29tZSgoZXhlY3V0aW9uTW9kZSkgPT4gZXhlY3V0aW9uTW9kZSA9PT0gam9iLmV4ZWN1dGlvbk1vZGUpXG4gICAgJiYgdHlwZW9mIGpvYi5xdWV1ZSA9PT0gXCJzdHJpbmdcIlxuICAgICYmIEJBQ0tHUk9VTkRfSk9CX1NUQVRVU0VTLnNvbWUoKHN0YXR1cykgPT4gc3RhdHVzID09PSBqb2Iuc3RhdHVzKVxuICAgICYmIEJBQ0tHUk9VTkRfSk9CX05VTExBQkxFX05VTUJFUl9GSUVMRFMuZXZlcnkoKGZpZWxkKSA9PiBpc051bGxhYmxlQmFja2dyb3VuZEpvYk51bWJlcihqb2JbZmllbGRdKSlcbiAgICAmJiBCQUNLR1JPVU5EX0pPQl9OVUxMQUJMRV9TVFJJTkdfRklFTERTLmV2ZXJ5KChmaWVsZCkgPT4gaXNOdWxsYWJsZUJhY2tncm91bmRKb2JTdHJpbmcoam9iW2ZpZWxkXSkpXG59XG5cbi8qKlxuICogRGVzY3JpYmVzIGFuIHVuZXhwZWN0ZWQgcHJvdG9jb2wgcmVzcG9uc2Ugd2l0aG91dCBlY2hvaW5nIGl0cyBwYXlsb2FkLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wZXJhdGlvbiAtIFB1YmxpYyBvcGVyYXRpb24gbmFtZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iU29ja2V0TWVzc2FnZX0gbWVzc2FnZSAtIFJlc3BvbnNlLlxuICogQHJldHVybnMge0Vycm9yfSAtIFByb3RvY29sIGVycm9yLlxuICovXG5mdW5jdGlvbiB1bmV4cGVjdGVkUmVzcG9uc2VFcnJvcihvcGVyYXRpb24sIG1lc3NhZ2UpIHtcbiAgY29uc3QgcmVzcG9uc2VUeXBlID0gbWVzc2FnZSAmJiB0eXBlb2YgbWVzc2FnZS50eXBlID09PSBcInN0cmluZ1wiID8gbWVzc2FnZS50eXBlIDogXCJtaXNzaW5nIHR5cGVcIlxuXG4gIHJldHVybiBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgJHtvcGVyYXRpb259IHJlc3BvbnNlOiAke3Jlc3BvbnNlVHlwZX1gKVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYWNrZ3JvdW5kSm9ic0NsaWVudCB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmVucXVldWVUaW1lb3V0TXNdIC0gTWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGFuIGVucXVldWUgYWNrbm93bGVkZ2VtZW50IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogNTAwMCkuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5nZW5lcmF0aW9uSGFuZHNoYWtlVGltZW91dE1zXSAtIE1heGltdW0gdGltZSB0byB3YWl0IGZvciBnZW5lcmF0aW9uIGFja25vd2xlZGdlbWVudCAoZGVmYXVsdDogNDAwMCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5nZW5lcmF0aW9uSWRdIC0gRXhwbGljaXQgcmVsZWFzZSBnZW5lcmF0aW9uIGlkZW50aXR5LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIGVucXVldWVUaW1lb3V0TXMgPSBERUZBVUxUX0VOUVVFVUVfVElNRU9VVF9NUywgZ2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNcyA9IERFRkFVTFRfR0VORVJBVElPTl9IQU5EU0hBS0VfVElNRU9VVF9NUywgZ2VuZXJhdGlvbklkfSA9IHt9KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uUHJvbWlzZSA9IGNvbmZpZ3VyYXRpb24gPyBQcm9taXNlLnJlc29sdmUoY29uZmlndXJhdGlvbikgOiBjb25maWd1cmF0aW9uUmVzb2x2ZXIoKVxuICAgIHRoaXMuZW5xdWV1ZVRpbWVvdXRNcyA9IGVucXVldWVUaW1lb3V0TXNcbiAgICB0aGlzLmdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXMgPSB2YWxpZGF0ZUdlbmVyYXRpb25IYW5kc2hha2VUaW1lb3V0TXMoZ2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNcylcbiAgICB0aGlzLmV4cGxpY2l0R2VuZXJhdGlvbklkID0gZ2VuZXJhdGlvbklkXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgb25lLXNob3QgY2xpZW50IHNvY2tldCByZXF1ZXN0IGZyb20gdGhlIHJlc29sdmVkIGNvbmZpZ3VyYXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEJhY2tncm91bmRKb2JzU29ja2V0UmVxdWVzdD59IC0gU29ja2V0IHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyBfcmVxdWVzdCgpIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uUHJvbWlzZVxuICAgIGNvbnN0IHtob3N0LCBwb3J0fSA9IGNvbmZpZ3VyYXRpb24uZ2V0QmFja2dyb3VuZEpvYnNDb25maWcoKVxuICAgIGNvbnN0IHtnZW5lcmF0aW9uSWR9ID0gY29uZmlndXJhdGlvbi5yZXNvbHZlQmFja2dyb3VuZEpvYnNHZW5lcmF0aW9uQ29uZmlnKHtcbiAgICAgIGdlbmVyYXRpb25JZDogdGhpcy5leHBsaWNpdEdlbmVyYXRpb25JZCxcbiAgICAgIHNvdXJjZU5hbWU6IFwiQmFja2dyb3VuZEpvYnNDbGllbnRcIlxuICAgIH0pXG5cbiAgICByZXR1cm4gbmV3IEJhY2tncm91bmRKb2JzU29ja2V0UmVxdWVzdCh7aG9zdCwgcG9ydCwgcm9sZTogXCJjbGllbnRcIiwgZ2VuZXJhdGlvbkhhbmRzaGFrZVRpbWVvdXRNczogdGhpcy5nZW5lcmF0aW9uSGFuZHNoYWtlVGltZW91dE1zLCBnZW5lcmF0aW9uSWR9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5xdWV1ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qb2JOYW1lIC0gSm9iIG5hbWUuXG4gICAqIEBwYXJhbSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzLmFyZ3MgLSBKb2IgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JPcHRpb25zfSBbYXJncy5vcHRpb25zXSAtIEpvYiBvcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MucHJvZHVjZXJJbnZvY2F0aW9uSWRdIC0gU3RhYmxlIGlkZW50aXR5IGZvciBvbmUgb3duZWQgZW5xdWV1ZSBpbnZvY2F0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYlByb2R1Y2VyUHJvb2Z9IFthcmdzLnByb2R1Y2VyUHJvb2ZdIC0gRXhhY3QgaW50ZXJuYWwgcHJvZHVjZXIgaGFuZG9mZi5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBKb2IgaWQuXG4gICAqL1xuICBhc3luYyBlbnF1ZXVlKHtqb2JOYW1lLCBhcmdzLCBvcHRpb25zLCBwcm9kdWNlckludm9jYXRpb25JZCwgcHJvZHVjZXJQcm9vZn0pIHtcbiAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgdHlwZTogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiZW5xdWV1ZVwiKSxcbiAgICAgIGpvYk5hbWUsXG4gICAgICBhcmdzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIC4uLihwcm9kdWNlckludm9jYXRpb25JZCA/IHtwcm9kdWNlckludm9jYXRpb25JZH0gOiB7fSksXG4gICAgICAuLi4ocHJvZHVjZXJQcm9vZiA/IHtwcm9kdWNlclByb29mfSA6IHt9KVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHNhZmUgb2JzZXJ2YXRpb25zIGZvciBvbmUgYXR0ZW1wdCB3aXRob3V0IHJldGFpbmluZyByZXF1ZXN0IGRhdGEuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBdHRlbXB0IGlkZW50aXR5LlxuICAgICAqIEBwYXJhbSB7XCJpbml0aWFsXCIgfCBcIm93bmVkX3JlcGxheVwifSBhcmdzLmF0dGVtcHRLaW5kIC0gSW5pdGlhbCBhdHRlbXB0IG9yIG93bmVkIHJlcGxheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5hdHRlbXB0TnVtYmVyIC0gT25lLWJhc2VkIGF0dGVtcHQgbnVtYmVyLlxuICAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2VucXVldWUtYWNrbm93bGVkZ2VtZW50LXRpbWVvdXQtZXJyb3IuanNcIikuQmFja2dyb3VuZEpvYkVucXVldWVBdHRlbXB0fSAtIE11dGFibGUgYXR0ZW1wdCBvYnNlcnZhdGlvbnMuXG4gICAgICovXG4gICAgY29uc3QgbmV3QXR0ZW1wdE9ic2VydmF0aW9uID0gKHthdHRlbXB0S2luZCwgYXR0ZW1wdE51bWJlcn0pID0+ICh7XG4gICAgICBhY2tub3dsZWRnZW1lbnRXYWl0RWxhcHNlZE1zOiAwLFxuICAgICAgYXR0ZW1wdEVsYXBzZWRNczogMCxcbiAgICAgIGF0dGVtcHRLaW5kLFxuICAgICAgYXR0ZW1wdE51bWJlcixcbiAgICAgIGV4cGxpY2l0bHlSZWplY3RlZDogZmFsc2UsXG4gICAgICBnZW5lcmF0aW9uRmVuY2VkOiBmYWxzZSxcbiAgICAgIHJlcXVlc3RTZW50OiBmYWxzZVxuICAgIH0pXG4gICAgLyoqXG4gICAgICogU2VuZHMgb25lIGVucXVldWUgYXR0ZW1wdC4gQW4gb3duZWQgY2FsbGVyIG1heSByZXBsYXkgdGhpcyBleGFjdCBtZXNzYWdlXG4gICAgICogb25jZSB3aGVuIHRyYW5zcG9ydCBhY2tub3dsZWRnZW1lbnQgcmVtYWlucyBhbWJpZ3VvdXMgYWZ0ZXIgc2VuZC5cbiAgICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZW5xdWV1ZS1hY2tub3dsZWRnZW1lbnQtdGltZW91dC1lcnJvci5qc1wiKS5CYWNrZ3JvdW5kSm9iRW5xdWV1ZUF0dGVtcHR9IGF0dGVtcHRPYnNlcnZhdGlvbiAtIE11dGFibGUgYXR0ZW1wdCBvYnNlcnZhdGlvbnMuXG4gICAgICogQHBhcmFtIHtSZWFkb25seTxBcnJheTxpbXBvcnQoXCIuL2VucXVldWUtYWNrbm93bGVkZ2VtZW50LXRpbWVvdXQtZXJyb3IuanNcIikuQmFja2dyb3VuZEpvYkVucXVldWVBdHRlbXB0Pj59IHByZXZpb3VzQXR0ZW1wdHMgLSBFYXJsaWVyIHRpbWVkLW91dCBhdHRlbXB0cy5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIEpvYiBpZC5cbiAgICAgKi9cbiAgICBjb25zdCBlbnF1ZXVlQXR0ZW1wdCA9IGFzeW5jIChhdHRlbXB0T2JzZXJ2YXRpb24sIHByZXZpb3VzQXR0ZW1wdHMpID0+IHtcbiAgICAgIGNvbnN0IGF0dGVtcHRTdGFydGVkQXRNcyA9IERhdGUubm93KClcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCB0aGlzLl9yZXF1ZXN0KClcbiAgICAgIGNvbnN0IHJlcXVlc3RBYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICAgIGNvbnN0IHRpbWVvdXRFcnJvck1lc3NhZ2UgPSBgQmFja2dyb3VuZCBqb2IgZW5xdWV1ZSBhY2tub3dsZWRnZW1lbnQgdGltZWQgb3V0IGFmdGVyICR7dGhpcy5lbnF1ZXVlVGltZW91dE1zfW1zYFxuICAgICAgLyoqIEB0eXBlIHtudW1iZXIgfCB1bmRlZmluZWR9ICovXG4gICAgICBsZXQgcmVxdWVzdFNlbnRBdE1zXG4gICAgICAvKipcbiAgICAgICAqIFJlc29sdmVzIHRoZSBwcmUtc2VuZCBwaGFzZSB3aGVuIHRoZSBtdXRhdGlvbiBoYXMgZW50ZXJlZCB0aGUgc29ja2V0LlxuICAgICAgICogQHR5cGUgeygpID0+IHZvaWR9XG4gICAgICAgKi9cbiAgICAgIGxldCBtYXJrUmVxdWVzdFNlbnQgPSAoKSA9PiB7fVxuICAgICAgY29uc3QgcmVxdWVzdFNlbnQgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBtYXJrUmVxdWVzdFNlbnQgPSAoKSA9PiByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH0pXG4gICAgICAvKipcbiAgICAgICAqIEFwcGxpZXMgdGhlIGNvbmZpZ3VyZWQgZGVhZGxpbmUgaW5kZXBlbmRlbnRseSB0byBvbmUgcmVxdWVzdCBwaGFzZS5cbiAgICAgICAqIEB0ZW1wbGF0ZSBUXG4gICAgICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gUGhhc2Ugd29yay5cbiAgICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIFBoYXNlIHJlc3VsdC5cbiAgICAgICAqL1xuICAgICAgY29uc3Qgd2l0aEVucXVldWVUaW1lb3V0ID0gYXN5bmMgKGNhbGxiYWNrKSA9PiBhd2FpdCB0aW1lb3V0KHtcbiAgICAgICAgZXJyb3JNZXNzYWdlOiB0aW1lb3V0RXJyb3JNZXNzYWdlLFxuICAgICAgICB0aW1lb3V0OiB0aGlzLmVucXVldWVUaW1lb3V0TXNcbiAgICAgIH0sIGFzeW5jICh7Y29udHJvbH0pID0+IHtcbiAgICAgICAgY29uc3QgYWJvcnRSZXF1ZXN0ID0gKCkgPT4gcmVxdWVzdEFib3J0Q29udHJvbGxlci5hYm9ydChjb250cm9sLnNpZ25hbC5yZWFzb24pXG5cbiAgICAgICAgY29udHJvbC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0UmVxdWVzdClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGNvbnRyb2wuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydFJlcXVlc3QpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBjb25zdCByZXF1ZXN0UHJvbWlzZSA9IHJlcXVlc3QucnVuKHtcbiAgICAgICAgc2lnbmFsOiByZXF1ZXN0QWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgb25Db25uZWN0OiAoanNvblNvY2tldCkgPT4ge1xuICAgICAgICAgIGpzb25Tb2NrZXQuc2VuZChtZXNzYWdlKVxuICAgICAgICAgIGF0dGVtcHRPYnNlcnZhdGlvbi5nZW5lcmF0aW9uRmVuY2VkID0gQm9vbGVhbihyZXF1ZXN0LmdlbmVyYXRpb25JZClcbiAgICAgICAgICBhdHRlbXB0T2JzZXJ2YXRpb24ucmVxdWVzdFNlbnQgPSB0cnVlXG4gICAgICAgICAgcmVxdWVzdFNlbnRBdE1zID0gRGF0ZS5ub3coKVxuICAgICAgICAgIG1hcmtSZXF1ZXN0U2VudCgpXG4gICAgICAgIH0sXG4gICAgICAgIG9uTWVzc2FnZTogKHttZXNzYWdlLCByZXNvbHZlLCByZWplY3R9KSA9PiB7XG4gICAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwiZW5xdWV1ZWRcIikge1xuICAgICAgICAgICAgcmVzb2x2ZShtZXNzYWdlLmpvYklkKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwiZW5xdWV1ZS1lcnJvclwiKSB7XG4gICAgICAgICAgICBhdHRlbXB0T2JzZXJ2YXRpb24uZXhwbGljaXRseVJlamVjdGVkID0gdHJ1ZVxuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlLmVycm9yIHx8IFwiRmFpbGVkIHRvIGVucXVldWUgam9iXCIpKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgYXdhaXQgd2l0aEVucXVldWVUaW1lb3V0KGFzeW5jICgpID0+IGF3YWl0IFByb21pc2UucmFjZShbcmVxdWVzdFNlbnQsIHJlcXVlc3RQcm9taXNlXSkpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3aXRoRW5xdWV1ZVRpbWVvdXQoYXN5bmMgKCkgPT4gYXdhaXQgcmVxdWVzdFByb21pc2UpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFRpbWVvdXRFcnJvcikpIHRocm93IGVycm9yXG4gICAgICAgIGlmIChyZXF1ZXN0U2VudEF0TXMgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKFwiQmFja2dyb3VuZCBqb2IgZW5xdWV1ZSBhY2tub3dsZWRnZW1lbnQgd2FpdCBzdGFydGVkIGJlZm9yZSB0aGUgcmVxdWVzdCB3YXMgc2VudFwiLCB7Y2F1c2U6IGVycm9yfSlcblxuICAgICAgICBjb25zdCB0aW1lZE91dEF0TXMgPSBEYXRlLm5vdygpXG4gICAgICAgIC8vIFRoZSBmaXJlZCB0aW1lciBwcm92ZXMgaXRzIGxvZ2ljYWwgZGVhZGxpbmUgZXZlbiB3aGVuIHRoZSBhZGp1c3RhYmxlIHdhbGwgY2xvY2sgcmVwb3J0cyBhIHNob3J0ZXIgaW50ZXJ2YWwuXG4gICAgICAgIGNvbnN0IGFja25vd2xlZGdlbWVudFdhaXRFbGFwc2VkTXMgPSBNYXRoLm1heCh0aGlzLmVucXVldWVUaW1lb3V0TXMsIHRpbWVkT3V0QXRNcyAtIHJlcXVlc3RTZW50QXRNcylcblxuICAgICAgICBhdHRlbXB0T2JzZXJ2YXRpb24uYWNrbm93bGVkZ2VtZW50V2FpdEVsYXBzZWRNcyA9IGFja25vd2xlZGdlbWVudFdhaXRFbGFwc2VkTXNcbiAgICAgICAgYXR0ZW1wdE9ic2VydmF0aW9uLmF0dGVtcHRFbGFwc2VkTXMgPSBNYXRoLm1heChhY2tub3dsZWRnZW1lbnRXYWl0RWxhcHNlZE1zLCB0aW1lZE91dEF0TXMgLSBhdHRlbXB0U3RhcnRlZEF0TXMpXG5cbiAgICAgICAgdGhyb3cgbmV3IEJhY2tncm91bmRKb2JFbnF1ZXVlQWNrbm93bGVkZ2VtZW50VGltZW91dEVycm9yKHtcbiAgICAgICAgICBhY2tub3dsZWRnZW1lbnRUaW1lb3V0TXM6IHRoaXMuZW5xdWV1ZVRpbWVvdXRNcyxcbiAgICAgICAgICBhdHRlbXB0SGlzdG9yeTogWy4uLnByZXZpb3VzQXR0ZW1wdHMsIGF0dGVtcHRPYnNlcnZhdGlvbl0sXG4gICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgIGdlbmVyYXRpb25JZDogcmVxdWVzdC5nZW5lcmF0aW9uSWQsXG4gICAgICAgICAgam9iTmFtZSxcbiAgICAgICAgICBwcm9kdWNlckludm9jYXRpb25JZCxcbiAgICAgICAgICBwcm9kdWNlclByb29mUHJlc2VudDogQm9vbGVhbihwcm9kdWNlclByb29mKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxBdHRlbXB0ID0gbmV3QXR0ZW1wdE9ic2VydmF0aW9uKHthdHRlbXB0S2luZDogXCJpbml0aWFsXCIsIGF0dGVtcHROdW1iZXI6IDF9KVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBlbnF1ZXVlQXR0ZW1wdChpbml0aWFsQXR0ZW1wdCwgW10pXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghcHJvZHVjZXJJbnZvY2F0aW9uSWQgfHwgIXByb2R1Y2VyUHJvb2YgfHwgIWluaXRpYWxBdHRlbXB0LmdlbmVyYXRpb25GZW5jZWQgfHwgIWluaXRpYWxBdHRlbXB0LnJlcXVlc3RTZW50IHx8IGluaXRpYWxBdHRlbXB0LmV4cGxpY2l0bHlSZWplY3RlZCkgdGhyb3cgZXJyb3JcblxuICAgICAgY29uc3QgcHJldmlvdXNBdHRlbXB0cyA9IGVycm9yIGluc3RhbmNlb2YgQmFja2dyb3VuZEpvYkVucXVldWVBY2tub3dsZWRnZW1lbnRUaW1lb3V0RXJyb3IgPyBlcnJvci5hdHRlbXB0SGlzdG9yeSA6IFtdXG4gICAgICBjb25zdCByZXBsYXlBdHRlbXB0ID0gbmV3QXR0ZW1wdE9ic2VydmF0aW9uKHthdHRlbXB0S2luZDogXCJvd25lZF9yZXBsYXlcIiwgYXR0ZW1wdE51bWJlcjogMn0pXG5cbiAgICAgIHJldHVybiBhd2FpdCBlbnF1ZXVlQXR0ZW1wdChyZXBsYXlBdHRlbXB0LCBwcmV2aW91c0F0dGVtcHRzKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IHJlcGxhY2VzIHRoZSBxdWV1ZWQgb3duZXIgb2YgYSBzdGFibGUgc2NoZWR1bGUga2V5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNjaGVkdWxlS2V5IC0gU3RhYmxlIGxvZ2ljYWwgc2NoZWR1bGUga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5qb2JOYW1lIC0gSm9iIG5hbWUuXG4gICAqIEBwYXJhbSB7QXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzLmFyZ3MgLSBKb2IgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JPcHRpb25zfSBbYXJncy5vcHRpb25zXSAtIEpvYiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JSZXBsYWNlbWVudFJlc3VsdD59IC0gUmVwbGFjZW1lbnQgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgcmVwbGFjZVNjaGVkdWxlZCh7c2NoZWR1bGVLZXksIGpvYk5hbWUsIGFyZ3MsIG9wdGlvbnN9KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHRoaXMuX3JlcXVlc3QoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QucnVuKHtcbiAgICAgIG9uQ29ubmVjdDogKGpzb25Tb2NrZXQpID0+IHtcbiAgICAgICAganNvblNvY2tldC5zZW5kKHt0eXBlOiBcInJlcGxhY2Utc2NoZWR1bGVkXCIsIHNjaGVkdWxlS2V5LCBqb2JOYW1lLCBhcmdzLCBvcHRpb25zfSlcbiAgICAgIH0sXG4gICAgICBvbk1lc3NhZ2U6ICh7bWVzc2FnZSwgcmVzb2x2ZSwgcmVqZWN0fSkgPT4ge1xuICAgICAgICBpZiAobWVzc2FnZT8udHlwZSA9PT0gXCJzY2hlZHVsZS1yZXBsYWNlZFwiKSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBqb2JJZDogbWVzc2FnZS5qb2JJZCxcbiAgICAgICAgICAgIHByZXZpb3VzSm9iSWQ6IG1lc3NhZ2UucHJldmlvdXNKb2JJZCxcbiAgICAgICAgICAgIHByZXZpb3VzU3RhdHVzOiBtZXNzYWdlLnByZXZpb3VzU3RhdHVzXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXNzYWdlPy50eXBlID09PSBcInJlcGxhY2Utc2NoZWR1bGVkLWVycm9yXCIpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKG1lc3NhZ2UuZXJyb3IgfHwgXCJGYWlsZWQgdG8gcmVwbGFjZSBzY2hlZHVsZWQgam9iXCIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIG9yIGRldGFjaGVzIHRoZSBjdXJyZW50IG93bmVyIG9mIGEgc3RhYmxlIHNjaGVkdWxlIGtleS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zY2hlZHVsZUtleSAtIFN0YWJsZSBsb2dpY2FsIHNjaGVkdWxlIGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZ3JvdW5kSm9iQ2FuY2VsbGF0aW9uUmVzdWx0Pn0gLSBDYW5jZWxsYXRpb24gcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgY2FuY2VsU2NoZWR1bGVkKHtzY2hlZHVsZUtleX0pIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gYXdhaXQgdGhpcy5fcmVxdWVzdCgpXG5cbiAgICByZXR1cm4gYXdhaXQgcmVxdWVzdC5ydW4oe1xuICAgICAgb25Db25uZWN0OiAoanNvblNvY2tldCkgPT4ge1xuICAgICAgICBqc29uU29ja2V0LnNlbmQoe3R5cGU6IFwiY2FuY2VsLXNjaGVkdWxlZFwiLCBzY2hlZHVsZUtleX0pXG4gICAgICB9LFxuICAgICAgb25NZXNzYWdlOiAoe21lc3NhZ2UsIHJlc29sdmUsIHJlamVjdH0pID0+IHtcbiAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwic2NoZWR1bGUtY2FuY2VsbGVkXCIpIHtcbiAgICAgICAgICByZXNvbHZlKHtqb2JJZDogbWVzc2FnZS5qb2JJZCwgb3V0Y29tZTogbWVzc2FnZS5vdXRjb21lfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXNzYWdlPy50eXBlID09PSBcImNhbmNlbC1zY2hlZHVsZWQtZXJyb3JcIikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IobWVzc2FnZS5lcnJvciB8fCBcIkZhaWxlZCB0byBjYW5jZWwgc2NoZWR1bGVkIGpvYlwiKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgY3VycmVudCBzdGFibGUgb3duZXJzaGlwIGFuZCBvcHRpb25hbCB0ZXJtaW5hbCBoaXN0b3J5LlxuICAgKiBAcGFyYW0ge3tzY2hlZHVsZUtleTogc3RyaW5nLCBpbmNsdWRlTGF0ZXN0VGVybWluYWw/OiBib29sZWFufX0gYXJncyAtIExvb2t1cCByZXF1ZXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JTY2hlZHVsZWRMb29rdXBSZXN1bHQ+fSAtIE5vcm1hbGl6ZWQgc3RhYmxlIHNjaGVkdWxlIGpvYnMuXG4gICAqL1xuICBhc3luYyBnZXRTY2hlZHVsZWRKb2Ioe3NjaGVkdWxlS2V5LCBpbmNsdWRlTGF0ZXN0VGVybWluYWx9KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHRoaXMuX3JlcXVlc3QoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QucnVuKHtcbiAgICAgIG9uQ29ubmVjdDogKGpzb25Tb2NrZXQpID0+IHtcbiAgICAgICAganNvblNvY2tldC5zZW5kKHt0eXBlOiBcImdldC1zY2hlZHVsZWQtam9iXCIsIHNjaGVkdWxlS2V5LCBpbmNsdWRlTGF0ZXN0VGVybWluYWx9KVxuICAgICAgfSxcbiAgICAgIG9uTWVzc2FnZTogKHttZXNzYWdlLCByZXNvbHZlLCByZWplY3R9KSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlPy50eXBlID09PSBcInNjaGVkdWxlZC1qb2JcIikge1xuICAgICAgICAgIGNvbnN0IHtjdXJyZW50Sm9iLCBsYXRlc3RUZXJtaW5hbEpvYn0gPSBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgY3VycmVudEpvYlZhbGlkID0gY3VycmVudEpvYiA9PT0gbnVsbFxuICAgICAgICAgICAgfHwgKGlzTm9ybWFsaXplZEJhY2tncm91bmRKb2IoY3VycmVudEpvYikgJiYgQkFDS0dST1VORF9KT0JfQUNUSVZFX1NUQVRVU0VTLnNvbWUoKHN0YXR1cykgPT4gc3RhdHVzID09PSBjdXJyZW50Sm9iLnN0YXR1cykpXG4gICAgICAgICAgY29uc3QgbGF0ZXN0VGVybWluYWxKb2JWYWxpZCA9IGxhdGVzdFRlcm1pbmFsSm9iID09PSBudWxsXG4gICAgICAgICAgICB8fCAoaXNOb3JtYWxpemVkQmFja2dyb3VuZEpvYihsYXRlc3RUZXJtaW5hbEpvYikgJiYgQkFDS0dST1VORF9KT0JfVEVSTUlOQUxfU1RBVFVTRVMuc29tZSgoc3RhdHVzKSA9PiBzdGF0dXMgPT09IGxhdGVzdFRlcm1pbmFsSm9iLnN0YXR1cykpXG5cbiAgICAgICAgICBpZiAoIWN1cnJlbnRKb2JWYWxpZCB8fCAhbGF0ZXN0VGVybWluYWxKb2JWYWxpZCkge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkludmFsaWQgZ2V0U2NoZWR1bGVkSm9iIHJlc3BvbnNlOiBleHBlY3RlZCBub3JtYWxpemVkIHB1YmxpYyBqb2IgdmFsdWVzXCIpKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSh7Y3VycmVudEpvYiwgbGF0ZXN0VGVybWluYWxKb2J9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwiZ2V0LXNjaGVkdWxlZC1qb2ItZXJyb3JcIikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IobWVzc2FnZS5lcnJvciB8fCBcIkZhaWxlZCB0byByZWFkIHNjaGVkdWxlZCBqb2JcIikpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICByZWplY3QodW5leHBlY3RlZFJlc3BvbnNlRXJyb3IoXCJnZXRTY2hlZHVsZWRKb2JcIiwgbWVzc2FnZSkpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBlZGl0ZXMgYSBmdXR1cmUgcXVldWVkIHN0YWJsZSBvd25lciB3aXRob3V0IGNoYW5naW5nIGpvYiBpZGVudGl0eS5cbiAgICogQHBhcmFtIHt7c2NoZWR1bGVLZXk6IHN0cmluZ319IGFyZ3MgLSBXYWtlIHJlcXVlc3QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYldha2VSZXN1bHQ+fSAtIFdha2UgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgd2FrZVNjaGVkdWxlZCh7c2NoZWR1bGVLZXl9KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGF3YWl0IHRoaXMuX3JlcXVlc3QoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QucnVuKHtcbiAgICAgIG9uQ29ubmVjdDogKGpzb25Tb2NrZXQpID0+IHtcbiAgICAgICAganNvblNvY2tldC5zZW5kKHt0eXBlOiBcIndha2Utc2NoZWR1bGVkXCIsIHNjaGVkdWxlS2V5fSlcbiAgICAgIH0sXG4gICAgICBvbk1lc3NhZ2U6ICh7bWVzc2FnZSwgcmVzb2x2ZSwgcmVqZWN0fSkgPT4ge1xuICAgICAgICBpZiAobWVzc2FnZT8udHlwZSA9PT0gXCJzY2hlZHVsZS13b2tlblwiKSB7XG4gICAgICAgICAgY29uc3Qgb3V0Y29tZSA9IG1lc3NhZ2Uub3V0Y29tZVxuICAgICAgICAgIGNvbnN0IGtub3duT3V0Y29tZSA9IEJBQ0tHUk9VTkRfSk9CX1dBS0VfT1VUQ09NRVMuaW5jbHVkZXMob3V0Y29tZSlcbiAgICAgICAgICBjb25zdCB2YWxpZEpvYklkID0gb3V0Y29tZSA9PT0gXCJub3RfZm91bmRcIiA/IG1lc3NhZ2Uuam9iSWQgPT09IG51bGwgOiB0eXBlb2YgbWVzc2FnZS5qb2JJZCA9PT0gXCJzdHJpbmdcIiAmJiBtZXNzYWdlLmpvYklkLmxlbmd0aCA+IDBcblxuICAgICAgICAgIGlmICgha25vd25PdXRjb21lIHx8ICF2YWxpZEpvYklkKSB7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCB3YWtlU2NoZWR1bGVkIHJlc3BvbnNlXCIpKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSh7am9iSWQ6IG1lc3NhZ2Uuam9iSWQsIG91dGNvbWV9KVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09IFwid2FrZS1zY2hlZHVsZWQtZXJyb3JcIikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IobWVzc2FnZS5lcnJvciB8fCBcIkZhaWxlZCB0byB3YWtlIHNjaGVkdWxlZCBqb2JcIikpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICByZWplY3QodW5leHBlY3RlZFJlc3BvbnNlRXJyb3IoXCJ3YWtlU2NoZWR1bGVkXCIsIG1lc3NhZ2UpKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,81 @@
1
+ import { TimeoutError } from "awaitery/build/timeout.js";
2
+ export type BackgroundJobEnqueueAttempt = {
3
+ /**
4
+ * - Time spent waiting for the acknowledgement after send.
5
+ */
6
+ acknowledgementWaitElapsedMs: number;
7
+ /**
8
+ * - Total attempt time including connection and generation fencing.
9
+ */
10
+ attemptElapsedMs: number;
11
+ /**
12
+ * - Initial attempt or the one eligible owned replay.
13
+ */
14
+ attemptKind: "initial" | "owned_replay";
15
+ /**
16
+ * - One-based attempt number.
17
+ */
18
+ attemptNumber: number;
19
+ /**
20
+ * - Whether the main explicitly rejected the enqueue.
21
+ */
22
+ explicitlyRejected: boolean;
23
+ /**
24
+ * - Whether the configured generation accepted the connection before send.
25
+ */
26
+ generationFenced: boolean;
27
+ /**
28
+ * - Whether the enqueue request entered the socket.
29
+ */
30
+ requestSent: boolean;
31
+ };
32
+ /**
33
+ * @typedef {object} BackgroundJobEnqueueAttempt
34
+ * @property {number} acknowledgementWaitElapsedMs - Time spent waiting for the acknowledgement after send.
35
+ * @property {number} attemptElapsedMs - Total attempt time including connection and generation fencing.
36
+ * @property {"initial" | "owned_replay"} attemptKind - Initial attempt or the one eligible owned replay.
37
+ * @property {number} attemptNumber - One-based attempt number.
38
+ * @property {boolean} explicitlyRejected - Whether the main explicitly rejected the enqueue.
39
+ * @property {boolean} generationFenced - Whether the configured generation accepted the connection before send.
40
+ * @property {boolean} requestSent - Whether the enqueue request entered the socket.
41
+ */
42
+ /** Safe typed failure for an ambiguous post-send enqueue acknowledgement timeout. */
43
+ export default class BackgroundJobEnqueueAcknowledgementTimeoutError extends TimeoutError {
44
+ /** @type {"BACKGROUND_JOB_ENQUEUE_ACKNOWLEDGEMENT_TIMEOUT"} */
45
+ code: "BACKGROUND_JOB_ENQUEUE_ACKNOWLEDGEMENT_TIMEOUT";
46
+ acknowledgementTimeoutMs: number;
47
+ attemptHistory: readonly Readonly<{
48
+ acknowledgementWaitElapsedMs: number;
49
+ attemptElapsedMs: number;
50
+ attemptKind: "initial" | "owned_replay";
51
+ attemptNumber: number;
52
+ explicitlyRejected: boolean;
53
+ generationFenced: boolean;
54
+ requestSent: boolean;
55
+ }>[];
56
+ generationId: string | undefined;
57
+ jobName: string;
58
+ producerInvocationId: string | undefined;
59
+ producerProofPresent: boolean;
60
+ /**
61
+ * Builds an enqueue acknowledgement timeout error without request payload or connection details.
62
+ * @param {object} args - Safe timeout context.
63
+ * @param {number} args.acknowledgementTimeoutMs - Configured post-send acknowledgement deadline.
64
+ * @param {Array<BackgroundJobEnqueueAttempt>} args.attemptHistory - Safe observations for timed-out attempts.
65
+ * @param {TimeoutError} [args.cause] - Original Awaitery timeout.
66
+ * @param {string} [args.generationId] - Accepted release generation identity.
67
+ * @param {string} args.jobName - Resolved job class name.
68
+ * @param {string} [args.producerInvocationId] - Owned enqueue invocation identity.
69
+ * @param {boolean} args.producerProofPresent - Whether the request carried an internal producer proof.
70
+ */
71
+ constructor({ acknowledgementTimeoutMs, attemptHistory, cause, generationId, jobName, producerInvocationId, producerProofPresent }: {
72
+ acknowledgementTimeoutMs: number;
73
+ attemptHistory: Array<BackgroundJobEnqueueAttempt>;
74
+ cause?: TimeoutError;
75
+ generationId?: string;
76
+ jobName: string;
77
+ producerInvocationId?: string;
78
+ producerProofPresent: boolean;
79
+ });
80
+ }
81
+ //# sourceMappingURL=enqueue-acknowledgement-timeout-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enqueue-acknowledgement-timeout-error.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/enqueue-acknowledgement-timeout-error.js"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAC,MAAM,2BAA2B,CAAA;AAGnD,YAAkB,2BAA2B,GAC7C;;;;IAAmB,4BAA4B,EAApC,MAAM,CACjB;;;;IAAmB,gBAAgB,EAAxB,MAAM,CACjB;;;;IAAuC,WAAW,EAAvC,SAAS,GAAG,cAAc,CACrC;;;;IAAmB,aAAa,EAArB,MAAM,CACjB;;;;IAAoB,kBAAkB,EAA3B,OAAO,CAClB;;;;IAAoB,gBAAgB,EAAzB,OAAO,CAClB;;;;IAAoB,WAAW,EAApB,OAAO,CACpB;CAAA,CAAA;AATD;;;;;;;;;GASG;AAEH,qFAAqF;AACrF,MAAM,CAAC,OAAO,OAAO,+CAAgD,SAAQ,YAAY;IAgBrF,+DAA+D;IAC1D,IAAI,EADE,gDAAgD;IAEtD,wBAAwB;IACxB,cAAc;;;;;;;;;IASd,YAAY;IACZ,OAAO;IACP,oBAAoB;IACpB,oBAAoB;IA9B3B;;;;;;;;;;OAUG;IACH,YAAY,EAAC,wBAAwB,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAC,EAR7H;QAAqB,wBAAwB,EAArC,MAAM,CACd;QAAiD,cAAc,EAAvD,KAAK,CAAC,2BAA2B,CAAC,CAC1C;QAA4B,KAAK,AAAjC,CACA,EADQ,YAAY,CACpB;QAAsB,YAAY,AAAlC,CACA,EADQ,MAAM,CACd;QAAqB,OAAO,EAApB,MAAM,CACd;QAAsB,oBAAoB,AAA1C,CACA,EADQ,MAAM,CACd;QAAsB,oBAAoB,EAAlC,OAAO,CACjB;KAC+H,EAoB/H;CACF"}
@@ -0,0 +1,47 @@
1
+ // @ts-check
2
+ import { TimeoutError } from "awaitery/build/timeout.js";
3
+ /**
4
+ * @typedef {object} BackgroundJobEnqueueAttempt
5
+ * @property {number} acknowledgementWaitElapsedMs - Time spent waiting for the acknowledgement after send.
6
+ * @property {number} attemptElapsedMs - Total attempt time including connection and generation fencing.
7
+ * @property {"initial" | "owned_replay"} attemptKind - Initial attempt or the one eligible owned replay.
8
+ * @property {number} attemptNumber - One-based attempt number.
9
+ * @property {boolean} explicitlyRejected - Whether the main explicitly rejected the enqueue.
10
+ * @property {boolean} generationFenced - Whether the configured generation accepted the connection before send.
11
+ * @property {boolean} requestSent - Whether the enqueue request entered the socket.
12
+ */
13
+ /** Safe typed failure for an ambiguous post-send enqueue acknowledgement timeout. */
14
+ export default class BackgroundJobEnqueueAcknowledgementTimeoutError extends TimeoutError {
15
+ /**
16
+ * Builds an enqueue acknowledgement timeout error without request payload or connection details.
17
+ * @param {object} args - Safe timeout context.
18
+ * @param {number} args.acknowledgementTimeoutMs - Configured post-send acknowledgement deadline.
19
+ * @param {Array<BackgroundJobEnqueueAttempt>} args.attemptHistory - Safe observations for timed-out attempts.
20
+ * @param {TimeoutError} [args.cause] - Original Awaitery timeout.
21
+ * @param {string} [args.generationId] - Accepted release generation identity.
22
+ * @param {string} args.jobName - Resolved job class name.
23
+ * @param {string} [args.producerInvocationId] - Owned enqueue invocation identity.
24
+ * @param {boolean} args.producerProofPresent - Whether the request carried an internal producer proof.
25
+ */
26
+ constructor({ acknowledgementTimeoutMs, attemptHistory, cause, generationId, jobName, producerInvocationId, producerProofPresent }) {
27
+ super(`Background job enqueue acknowledgement timed out after ${acknowledgementTimeoutMs}ms`, cause ? { cause } : undefined);
28
+ this.name = "BackgroundJobEnqueueAcknowledgementTimeoutError";
29
+ /** @type {"BACKGROUND_JOB_ENQUEUE_ACKNOWLEDGEMENT_TIMEOUT"} */
30
+ this.code = "BACKGROUND_JOB_ENQUEUE_ACKNOWLEDGEMENT_TIMEOUT";
31
+ this.acknowledgementTimeoutMs = acknowledgementTimeoutMs;
32
+ this.attemptHistory = Object.freeze(attemptHistory.map((attempt) => Object.freeze({
33
+ acknowledgementWaitElapsedMs: attempt.acknowledgementWaitElapsedMs,
34
+ attemptElapsedMs: attempt.attemptElapsedMs,
35
+ attemptKind: attempt.attemptKind,
36
+ attemptNumber: attempt.attemptNumber,
37
+ explicitlyRejected: attempt.explicitlyRejected,
38
+ generationFenced: attempt.generationFenced,
39
+ requestSent: attempt.requestSent
40
+ })));
41
+ this.generationId = generationId;
42
+ this.jobName = jobName;
43
+ this.producerInvocationId = producerInvocationId;
44
+ this.producerProofPresent = producerProofPresent;
45
+ }
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5xdWV1ZS1hY2tub3dsZWRnZW1lbnQtdGltZW91dC1lcnJvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZ3JvdW5kLWpvYnMvZW5xdWV1ZS1hY2tub3dsZWRnZW1lbnQtdGltZW91dC1lcnJvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDJCQUEyQixDQUFBO0FBRXREOzs7Ozs7Ozs7R0FTRztBQUVILHFGQUFxRjtBQUNyRixNQUFNLENBQUMsT0FBTyxPQUFPLCtDQUFnRCxTQUFRLFlBQVk7SUFDdkY7Ozs7Ozs7Ozs7T0FVRztJQUNILFlBQVksRUFBQyx3QkFBd0IsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUM7UUFDOUgsS0FBSyxDQUFDLDBEQUEwRCx3QkFBd0IsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFMUgsSUFBSSxDQUFDLElBQUksR0FBRyxpREFBaUQsQ0FBQTtRQUM3RCwrREFBK0Q7UUFDL0QsSUFBSSxDQUFDLElBQUksR0FBRyxnREFBZ0QsQ0FBQTtRQUM1RCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsd0JBQXdCLENBQUE7UUFDeEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDaEYsNEJBQTRCLEVBQUUsT0FBTyxDQUFDLDRCQUE0QjtZQUNsRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1lBQzFDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztZQUNoQyxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7WUFDcEMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQjtZQUM5QyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCO1lBQzFDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztTQUNqQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ0osSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUE7UUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFBO1FBQ2hELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQTtJQUNsRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtUaW1lb3V0RXJyb3J9IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9iRW5xdWV1ZUF0dGVtcHRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBhY2tub3dsZWRnZW1lbnRXYWl0RWxhcHNlZE1zIC0gVGltZSBzcGVudCB3YWl0aW5nIGZvciB0aGUgYWNrbm93bGVkZ2VtZW50IGFmdGVyIHNlbmQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gYXR0ZW1wdEVsYXBzZWRNcyAtIFRvdGFsIGF0dGVtcHQgdGltZSBpbmNsdWRpbmcgY29ubmVjdGlvbiBhbmQgZ2VuZXJhdGlvbiBmZW5jaW5nLlxuICogQHByb3BlcnR5IHtcImluaXRpYWxcIiB8IFwib3duZWRfcmVwbGF5XCJ9IGF0dGVtcHRLaW5kIC0gSW5pdGlhbCBhdHRlbXB0IG9yIHRoZSBvbmUgZWxpZ2libGUgb3duZWQgcmVwbGF5LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGF0dGVtcHROdW1iZXIgLSBPbmUtYmFzZWQgYXR0ZW1wdCBudW1iZXIuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGV4cGxpY2l0bHlSZWplY3RlZCAtIFdoZXRoZXIgdGhlIG1haW4gZXhwbGljaXRseSByZWplY3RlZCB0aGUgZW5xdWV1ZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZ2VuZXJhdGlvbkZlbmNlZCAtIFdoZXRoZXIgdGhlIGNvbmZpZ3VyZWQgZ2VuZXJhdGlvbiBhY2NlcHRlZCB0aGUgY29ubmVjdGlvbiBiZWZvcmUgc2VuZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVxdWVzdFNlbnQgLSBXaGV0aGVyIHRoZSBlbnF1ZXVlIHJlcXVlc3QgZW50ZXJlZCB0aGUgc29ja2V0LlxuICovXG5cbi8qKiBTYWZlIHR5cGVkIGZhaWx1cmUgZm9yIGFuIGFtYmlndW91cyBwb3N0LXNlbmQgZW5xdWV1ZSBhY2tub3dsZWRnZW1lbnQgdGltZW91dC4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhY2tncm91bmRKb2JFbnF1ZXVlQWNrbm93bGVkZ2VtZW50VGltZW91dEVycm9yIGV4dGVuZHMgVGltZW91dEVycm9yIHtcbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiBlbnF1ZXVlIGFja25vd2xlZGdlbWVudCB0aW1lb3V0IGVycm9yIHdpdGhvdXQgcmVxdWVzdCBwYXlsb2FkIG9yIGNvbm5lY3Rpb24gZGV0YWlscy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTYWZlIHRpbWVvdXQgY29udGV4dC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYWNrbm93bGVkZ2VtZW50VGltZW91dE1zIC0gQ29uZmlndXJlZCBwb3N0LXNlbmQgYWNrbm93bGVkZ2VtZW50IGRlYWRsaW5lLlxuICAgKiBAcGFyYW0ge0FycmF5PEJhY2tncm91bmRKb2JFbnF1ZXVlQXR0ZW1wdD59IGFyZ3MuYXR0ZW1wdEhpc3RvcnkgLSBTYWZlIG9ic2VydmF0aW9ucyBmb3IgdGltZWQtb3V0IGF0dGVtcHRzLlxuICAgKiBAcGFyYW0ge1RpbWVvdXRFcnJvcn0gW2FyZ3MuY2F1c2VdIC0gT3JpZ2luYWwgQXdhaXRlcnkgdGltZW91dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmdlbmVyYXRpb25JZF0gLSBBY2NlcHRlZCByZWxlYXNlIGdlbmVyYXRpb24gaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmpvYk5hbWUgLSBSZXNvbHZlZCBqb2IgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnByb2R1Y2VySW52b2NhdGlvbklkXSAtIE93bmVkIGVucXVldWUgaW52b2NhdGlvbiBpZGVudGl0eS5cbiAgICogQHBhcmFtIHtib29sZWFufSBhcmdzLnByb2R1Y2VyUHJvb2ZQcmVzZW50IC0gV2hldGhlciB0aGUgcmVxdWVzdCBjYXJyaWVkIGFuIGludGVybmFsIHByb2R1Y2VyIHByb29mLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2Fja25vd2xlZGdlbWVudFRpbWVvdXRNcywgYXR0ZW1wdEhpc3RvcnksIGNhdXNlLCBnZW5lcmF0aW9uSWQsIGpvYk5hbWUsIHByb2R1Y2VySW52b2NhdGlvbklkLCBwcm9kdWNlclByb29mUHJlc2VudH0pIHtcbiAgICBzdXBlcihgQmFja2dyb3VuZCBqb2IgZW5xdWV1ZSBhY2tub3dsZWRnZW1lbnQgdGltZWQgb3V0IGFmdGVyICR7YWNrbm93bGVkZ2VtZW50VGltZW91dE1zfW1zYCwgY2F1c2UgPyB7Y2F1c2V9IDogdW5kZWZpbmVkKVxuXG4gICAgdGhpcy5uYW1lID0gXCJCYWNrZ3JvdW5kSm9iRW5xdWV1ZUFja25vd2xlZGdlbWVudFRpbWVvdXRFcnJvclwiXG4gICAgLyoqIEB0eXBlIHtcIkJBQ0tHUk9VTkRfSk9CX0VOUVVFVUVfQUNLTk9XTEVER0VNRU5UX1RJTUVPVVRcIn0gKi9cbiAgICB0aGlzLmNvZGUgPSBcIkJBQ0tHUk9VTkRfSk9CX0VOUVVFVUVfQUNLTk9XTEVER0VNRU5UX1RJTUVPVVRcIlxuICAgIHRoaXMuYWNrbm93bGVkZ2VtZW50VGltZW91dE1zID0gYWNrbm93bGVkZ2VtZW50VGltZW91dE1zXG4gICAgdGhpcy5hdHRlbXB0SGlzdG9yeSA9IE9iamVjdC5mcmVlemUoYXR0ZW1wdEhpc3RvcnkubWFwKChhdHRlbXB0KSA9PiBPYmplY3QuZnJlZXplKHtcbiAgICAgIGFja25vd2xlZGdlbWVudFdhaXRFbGFwc2VkTXM6IGF0dGVtcHQuYWNrbm93bGVkZ2VtZW50V2FpdEVsYXBzZWRNcyxcbiAgICAgIGF0dGVtcHRFbGFwc2VkTXM6IGF0dGVtcHQuYXR0ZW1wdEVsYXBzZWRNcyxcbiAgICAgIGF0dGVtcHRLaW5kOiBhdHRlbXB0LmF0dGVtcHRLaW5kLFxuICAgICAgYXR0ZW1wdE51bWJlcjogYXR0ZW1wdC5hdHRlbXB0TnVtYmVyLFxuICAgICAgZXhwbGljaXRseVJlamVjdGVkOiBhdHRlbXB0LmV4cGxpY2l0bHlSZWplY3RlZCxcbiAgICAgIGdlbmVyYXRpb25GZW5jZWQ6IGF0dGVtcHQuZ2VuZXJhdGlvbkZlbmNlZCxcbiAgICAgIHJlcXVlc3RTZW50OiBhdHRlbXB0LnJlcXVlc3RTZW50XG4gICAgfSkpKVxuICAgIHRoaXMuZ2VuZXJhdGlvbklkID0gZ2VuZXJhdGlvbklkXG4gICAgdGhpcy5qb2JOYW1lID0gam9iTmFtZVxuICAgIHRoaXMucHJvZHVjZXJJbnZvY2F0aW9uSWQgPSBwcm9kdWNlckludm9jYXRpb25JZFxuICAgIHRoaXMucHJvZHVjZXJQcm9vZlByZXNlbnQgPSBwcm9kdWNlclByb29mUHJlc2VudFxuICB9XG59XG4iXX0=
@@ -4,6 +4,24 @@ export declare const DEFAULT_BACKGROUND_JOB_QUEUE = "default";
4
4
  export declare const QUEUE_CONCURRENCY_KEY_PREFIX = "queue:";
5
5
  /** @type {import("./types.js").BackgroundJobExecutionMode[]} */
6
6
  export declare const BACKGROUND_JOB_EXECUTION_MODES: import("./types.js").BackgroundJobExecutionMode[];
7
+ /** @type {import("./types.js").BackgroundJobActiveStatus[]} */
8
+ export declare const BACKGROUND_JOB_ACTIVE_STATUSES: import("./types.js").BackgroundJobActiveStatus[];
9
+ /** @type {import("./types.js").BackgroundJobTerminalStatus[]} */
10
+ export declare const BACKGROUND_JOB_TERMINAL_STATUSES: import("./types.js").BackgroundJobTerminalStatus[];
11
+ /** @type {import("./types.js").BackgroundJobStatus[]} */
12
+ export declare const BACKGROUND_JOB_STATUSES: import("./types.js").BackgroundJobStatus[];
13
+ /**
14
+ * Normalizes persisted or transported job status vocabulary.
15
+ * @param {string} value - Candidate status.
16
+ * @returns {import("./types.js").BackgroundJobStatus} - Known status.
17
+ */
18
+ export declare function normalizeBackgroundJobStatus(value: string): import("./types.js").BackgroundJobStatus;
19
+ /**
20
+ * Validates a stable logical schedule key at every persistence boundary.
21
+ * @param {string} scheduleKey - Stable schedule key.
22
+ * @returns {string} - Validated key.
23
+ */
24
+ export declare function normalizeBackgroundJobScheduleKey(scheduleKey: string): string;
7
25
  /**
8
26
  * Normalizes a job queue.
9
27
  * @param {import("./types.js").BackgroundJobOptions} [options] - Job options.
@@ -1 +1 @@
1
- {"version":3,"file":"job-semantics.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/job-semantics.js"],"names":[],"mappings":"AAIA,eAAO,MAAM,qCAAqC,WAAW,CAAA;AAC7D,eAAO,MAAM,kCAAkC,KAAK,CAAA;AACpD,eAAO,MAAM,4BAA4B,YAAY,CAAA;AACrD,eAAO,MAAM,4BAA4B,WAAW,CAAA;AACpD,gEAAgE;AAChE,eAAO,MAAM,8BAA8B,EADhC,OAAO,YAAY,EAAE,0BAA0B,EAC6B,CAAA;AAEvF;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,AAHhD,CACA,EADQ,OAAO,YAAY,EAAE,oBAGmB,GAFtC,MAAM,CAQlB;AAED;;;;;;GAMG;AACH,wBAAgB,mCAAmC,CAAC,OAAO,GALhD,IAAI,CAAC,OAAO,YAAY,EAAE,oBAAoB,EAAE,eAAe,CAAC,GAAG;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAKrC,EAAE,oBAAoB,AAJnF,CACA,EADQ,OAAO,YAAY,EAAE,0BAI8F,EAAE,uBAAuB,AAHpJ,CACA,EADQ,OAAO,YAAY,EAAE,0BAA0B,EAG8H,GAF3K,OAAO,YAAY,EAAE,0BAA0B,CAsB3D;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,UAAU,EAHhD,MAAM,GAAG,IAAI,GAAG,SAGgC,GAF9C,MAAM,CAQlB;AAED;;;;;GAKG;AACH,wBAAgB,mCAAmC,CAAC,aAAa,EAJtD,MAAM,GAAG,SAI6C,EAAE,oBAAoB,EAH5E,MAG4E,GAF1E,MAAM,CAOlB;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAJzC,MAIyC,EAAE,KAAK,EAHhD,MAGgD,GAF9C,MAAM,CAclB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAH5B,MAG4B,GAF1B,MAAM,CAQlB;AAED;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAAC,EAAC,OAAY,EAAE,KAAK,EAAE,MAAM,EAAC,EAL5E;IAAwD,OAAO,EAAvD,OAAO,YAAY,EAAE,oBAAoB,CACjD;IAAqB,KAAK,EAAlB,MAAM,CACd;IAA0E,MAAM,EAAxE,MAAM,CAAC,MAAM,EAAE;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC,CACnE;CAE4E,GAFlE,OAAO,YAAY,EAAE,gCAAgC,GAAG,IAAI,CA0BxE"}
1
+ {"version":3,"file":"job-semantics.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/job-semantics.js"],"names":[],"mappings":"AAIA,eAAO,MAAM,qCAAqC,WAAW,CAAA;AAC7D,eAAO,MAAM,kCAAkC,KAAK,CAAA;AACpD,eAAO,MAAM,4BAA4B,YAAY,CAAA;AACrD,eAAO,MAAM,4BAA4B,WAAW,CAAA;AACpD,gEAAgE;AAChE,eAAO,MAAM,8BAA8B,EADhC,OAAO,YAAY,EAAE,0BAA0B,EAC6B,CAAA;AACvF,+DAA+D;AAC/D,eAAO,MAAM,8BAA8B,EADhC,OAAO,YAAY,EAAE,yBAAyB,EACa,CAAA;AACtE,iEAAiE;AACjE,eAAO,MAAM,gCAAgC,EADlC,OAAO,YAAY,EAAE,2BAA2B,EACqC,CAAA;AAChG,yDAAyD;AACzD,eAAO,MAAM,uBAAuB,EADzB,OAAO,YAAY,EAAE,mBAAmB,EAC4D,CAAA;AAE/G;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAHvC,MAGuC,GAFrC,OAAO,YAAY,EAAE,mBAAmB,CAQpD;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,WAAW,EAHlD,MAGkD,GAFhD,MAAM,CAMlB;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,AAHhD,CACA,EADQ,OAAO,YAAY,EAAE,oBAGmB,GAFtC,MAAM,CAQlB;AAED;;;;;;GAMG;AACH,wBAAgB,mCAAmC,CAAC,OAAO,GALhD,IAAI,CAAC,OAAO,YAAY,EAAE,oBAAoB,EAAE,eAAe,CAAC,GAAG;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAKrC,EAAE,oBAAoB,AAJnF,CACA,EADQ,OAAO,YAAY,EAAE,0BAI8F,EAAE,uBAAuB,AAHpJ,CACA,EADQ,OAAO,YAAY,EAAE,0BAA0B,EAG8H,GAF3K,OAAO,YAAY,EAAE,0BAA0B,CAsB3D;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,UAAU,EAHhD,MAAM,GAAG,IAAI,GAAG,SAGgC,GAF9C,MAAM,CAQlB;AAED;;;;;GAKG;AACH,wBAAgB,mCAAmC,CAAC,aAAa,EAJtD,MAAM,GAAG,SAI6C,EAAE,oBAAoB,EAH5E,MAG4E,GAF1E,MAAM,CAOlB;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAJzC,MAIyC,EAAE,KAAK,EAHhD,MAGgD,GAF9C,MAAM,CAclB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAH5B,MAG4B,GAF1B,MAAM,CAQlB;AAED;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAAC,EAAC,OAAY,EAAE,KAAK,EAAE,MAAM,EAAC,EAL5E;IAAwD,OAAO,EAAvD,OAAO,YAAY,EAAE,oBAAoB,CACjD;IAAqB,KAAK,EAAlB,MAAM,CACd;IAA0E,MAAM,EAAxE,MAAM,CAAC,MAAM,EAAE;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC,CACnE;CAE4E,GAFlE,OAAO,YAAY,EAAE,gCAAgC,GAAG,IAAI,CA0BxE"}