@blokjs/trigger-worker 1.1.0 → 1.3.0

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.
@@ -9,10 +9,18 @@
9
9
  * - **Ordering**: per-partition, not per-topic. Set the partition
10
10
  * key via the `dedupId` field on `addJob` to keep related
11
11
  * messages on the same partition.
12
- * - **Retries**: Kafka doesn't have a broker-side retry concept.
13
- * The adapter re-throws on handler failure; offset commit is
14
- * suppressed so the consumer re-polls the message on the next
15
- * cycle. For real retry semantics, layer a dead-letter topic.
12
+ * - **Retries / DLQ**: Kafka has no broker-side retry or dead-letter
13
+ * concept. The adapter emulates both at the application layer: on
14
+ * handler failure it re-produces the payload to the SOURCE topic
15
+ * with an incremented `x-blok-attempt` header (up to `config.retries`),
16
+ * then routes the exhausted payload to `config.deadLetterQueue`. The
17
+ * source offset always commits (the handler never re-throws), so a
18
+ * single poison message can never crash-loop the consumer and block
19
+ * every later job behind it.
20
+ * - **No native priority / delay**: Kafka is an ordered log, not a
21
+ * priority queue or a scheduler. `process` and `addJob` THROW a clear
22
+ * config error when `priority` or `delay` is set rather than silently
23
+ * dropping it — use a scheduler trigger for delayed work.
16
24
  * - **Stats**: KafkaJS exposes consumer-group lag via its admin
17
25
  * client; the lag count is reported as `waiting`. Other stats
18
26
  * are tracked locally per consumer.
@@ -53,6 +61,11 @@ export declare class KafkaAdapter implements WorkerAdapter {
53
61
  connect(): Promise<void>;
54
62
  disconnect(): Promise<void>;
55
63
  process(config: WorkerTriggerOpts, handler: (job: WorkerJob) => Promise<void>): Promise<void>;
64
+ /**
65
+ * Produce a single message to `topic` with optional string headers.
66
+ * Used for retry re-produce (to the source topic) and dead-lettering.
67
+ */
68
+ private produce;
56
69
  addJob(queue: string, data: unknown, opts?: {
57
70
  priority?: number;
58
71
  delay?: number;
@@ -9,10 +9,18 @@
9
9
  * - **Ordering**: per-partition, not per-topic. Set the partition
10
10
  * key via the `dedupId` field on `addJob` to keep related
11
11
  * messages on the same partition.
12
- * - **Retries**: Kafka doesn't have a broker-side retry concept.
13
- * The adapter re-throws on handler failure; offset commit is
14
- * suppressed so the consumer re-polls the message on the next
15
- * cycle. For real retry semantics, layer a dead-letter topic.
12
+ * - **Retries / DLQ**: Kafka has no broker-side retry or dead-letter
13
+ * concept. The adapter emulates both at the application layer: on
14
+ * handler failure it re-produces the payload to the SOURCE topic
15
+ * with an incremented `x-blok-attempt` header (up to `config.retries`),
16
+ * then routes the exhausted payload to `config.deadLetterQueue`. The
17
+ * source offset always commits (the handler never re-throws), so a
18
+ * single poison message can never crash-loop the consumer and block
19
+ * every later job behind it.
20
+ * - **No native priority / delay**: Kafka is an ordered log, not a
21
+ * priority queue or a scheduler. `process` and `addJob` THROW a clear
22
+ * config error when `priority` or `delay` is set rather than silently
23
+ * dropping it — use a scheduler trigger for delayed work.
16
24
  * - **Stats**: KafkaJS exposes consumer-group lag via its admin
17
25
  * client; the lag count is reported as `waiting`. Other stats
18
26
  * are tracked locally per consumer.
@@ -105,6 +113,15 @@ export class KafkaAdapter {
105
113
  async process(config, handler) {
106
114
  if (!this.connected)
107
115
  throw new Error("[blok][kafka] not connected. Call connect() first.");
116
+ // Kafka is an ordered log — no native priority or delayed delivery.
117
+ // Reject at startup rather than accepting config that silently does
118
+ // nothing (the pre-fix behavior: validated, logged, zero effect).
119
+ if (config.priority) {
120
+ throw new Error("[blok][kafka] Kafka has no native message priority — drop `priority`; messages are ordered per partition.");
121
+ }
122
+ if (config.delay) {
123
+ throw new Error("[blok][kafka] Kafka has no native delayed delivery — drop `delay` or use a scheduler trigger.");
124
+ }
108
125
  const groupId = config.consumerGroup ?? `${config.queue}-group`;
109
126
  const consumer = this.kafka.consumer({ groupId });
110
127
  await consumer.connect();
@@ -134,13 +151,34 @@ export class KafkaAdapter {
134
151
  for (const [k, v] of Object.entries(message.headers))
135
152
  headers[k] = v?.toString("utf8") ?? "";
136
153
  }
154
+ // Retry attempt rides on the message header (Kafka has no
155
+ // broker-side attempt counter). A re-produced retry carries
156
+ // `x-blok-attempt`; the first delivery has none → attempt 0.
157
+ const attempts = Number.parseInt(headers["x-blok-attempt"] ?? "0", 10) || 0;
158
+ const key = message.key?.toString("utf8") ?? `${config.queue}:${message.offset}`;
159
+ // Terminal (retries exhausted → DLQ) vs. retry (re-produce to
160
+ // source with attempt+1). Both COMMIT the source offset — the
161
+ // handler never re-throws, so one poison message can't crash-loop
162
+ // the consumer and starve every job queued behind it.
163
+ const settleFailure = async (requeue) => {
164
+ const willRetry = requeue && attempts < (config.retries ?? 0);
165
+ if (willRetry) {
166
+ await this.produce(config.queue, key, payloadString, { "x-blok-attempt": String(attempts + 1) });
167
+ }
168
+ else if (config.deadLetterQueue) {
169
+ await this.produce(config.deadLetterQueue, key, payloadString, {
170
+ "x-blok-attempt": String(attempts),
171
+ "x-blok-source-topic": config.queue,
172
+ });
173
+ }
174
+ };
137
175
  const job = {
138
- id: message.key?.toString("utf8") ?? `${config.queue}:${message.offset}`,
176
+ id: key,
139
177
  data,
140
178
  headers,
141
179
  queue: config.queue,
142
- priority: config.priority ?? 0,
143
- attempts: 0,
180
+ priority: 0,
181
+ attempts,
144
182
  maxRetries: config.retries ?? 0,
145
183
  createdAt: new Date(Number.parseInt(message.timestamp, 10)),
146
184
  timeout: config.timeout,
@@ -148,9 +186,9 @@ export class KafkaAdapter {
148
186
  complete: async () => {
149
187
  stats.completed += 1;
150
188
  },
151
- fail: async (_err) => {
189
+ fail: async (_err, requeue) => {
152
190
  stats.failed += 1;
153
- throw _err;
191
+ await settleFailure(requeue === true);
154
192
  },
155
193
  };
156
194
  stats.active += 1;
@@ -158,9 +196,19 @@ export class KafkaAdapter {
158
196
  await handler(job);
159
197
  stats.completed += 1;
160
198
  }
161
- catch (err) {
199
+ catch {
200
+ // A handler that THROWS (rather than calling job.fail) must not
201
+ // re-throw out of eachMessage — that suppresses the offset commit
202
+ // and kafkajs redelivers the SAME message forever, blocking the
203
+ // partition. Route the raw throw through the same retry/DLQ path
204
+ // and let the offset commit. ponytail: this is the crash-loop fix.
162
205
  stats.failed += 1;
163
- throw err;
206
+ try {
207
+ await settleFailure(attempts < (config.retries ?? 0));
208
+ }
209
+ catch {
210
+ /* DLQ/retry produce failed — still commit; don't crash-loop */
211
+ }
164
212
  }
165
213
  finally {
166
214
  stats.active = Math.max(0, stats.active - 1);
@@ -168,23 +216,32 @@ export class KafkaAdapter {
168
216
  },
169
217
  });
170
218
  }
219
+ /**
220
+ * Produce a single message to `topic` with optional string headers.
221
+ * Used for retry re-produce (to the source topic) and dead-lettering.
222
+ */
223
+ async produce(topic, key, value, headers) {
224
+ if (!this.handle.producer)
225
+ throw new Error("[blok][kafka] producer not initialized");
226
+ await this.handle.producer.send({ topic, messages: [{ key, value, headers }] });
227
+ }
171
228
  async addJob(queue, data, opts) {
172
229
  if (!this.connected)
173
230
  throw new Error("[blok][kafka] not connected. Call connect() first.");
174
231
  if (!this.handle.producer)
175
232
  throw new Error("[blok][kafka] producer not initialized");
233
+ // Kafka is an ordered log — no native priority or delayed delivery.
234
+ // Reject rather than silently drop the option (the pre-fix behavior
235
+ // stuffed `delay` into a header no consumer ever honored).
236
+ if (opts?.priority) {
237
+ throw new Error("[blok][kafka] Kafka has no native message priority — drop `priority`; messages are ordered per partition.");
238
+ }
239
+ if (opts?.delay) {
240
+ throw new Error("[blok][kafka] Kafka has no native delayed delivery — drop `delay` or use a scheduler trigger.");
241
+ }
176
242
  const key = opts?.jobId ?? uuid();
177
243
  const payload = typeof data === "string" ? data : JSON.stringify(data);
178
- await this.handle.producer.send({
179
- topic: queue,
180
- messages: [
181
- {
182
- key,
183
- value: payload,
184
- headers: opts?.delay ? { "x-blok-delay-ms": String(opts.delay) } : undefined,
185
- },
186
- ],
187
- });
244
+ await this.produce(queue, key, payload);
188
245
  return key;
189
246
  }
190
247
  async stopProcessing(queue) {
@@ -244,4 +301,4 @@ export class KafkaAdapter {
244
301
  };
245
302
  }
246
303
  }
247
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2Fma2FBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXJzL0thZmthQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDRztBQUdILE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBc0NsQyxNQUFNLE9BQU8sWUFBWTtJQUNmLFFBQVEsR0FBRyxPQUFnQixDQUFDO0lBQ3BCLE1BQU0sQ0FBYztJQUNyQyx1R0FBdUc7SUFDL0YsS0FBSyxHQUFRLElBQUksQ0FBQztJQUNsQixNQUFNLEdBQWtCLEVBQUUsU0FBUyxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztJQUNqRCxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLEtBQUssR0FBb0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUUzRCxZQUFZLE1BQTZCO1FBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDYixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNHLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLGFBQWE7WUFDMUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUI7WUFDckUsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUI7WUFDckUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksT0FBTyxDQUFD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RCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogS2Fma2FBZGFwdGVyIOKAlCB2MC43IFBSIDUg4oCUIFdvcmtlciBhZGFwdGVyIGJhY2tlZCBieSBBcGFjaGUgS2Fma2EgdmlhXG4gKiBga2Fma2Fqc2AuIENvbnN1bWVzIGZyb20gYSB0b3BpYyAodGhlIGBxdWV1ZWAgZmllbGQpIHdpdGggYVxuICogY29uc3VtZXItZ3JvdXAgaWRlbnRpZmllcjsgcHJvZHVjZXMgdmlhIHRoZSBzYW1lIGNsaWVudC5cbiAqXG4gKiBLYWZrYSBpcyBmdW5kYW1lbnRhbGx5IGEgc3RyZWFtaW5nIHBsYXRmb3JtIOKAlCBub3QgYSBxdWV1ZSDigJQgc28gYVxuICogZmV3IHNlbWFudGljcyBkaWZmZXIgZnJvbSBCdWxsTVEvU1FTL1JhYmJpdE1ROlxuICpcbiAqICAgLSAqKk9yZGVyaW5nKio6IHBlci1wYXJ0aXRpb24sIG5vdCBwZXItdG9waWMuIFNldCB0aGUgcGFydGl0aW9uXG4gKiAgICAga2V5IHZpYSB0aGUgYGRlZHVwSWRgIGZpZWxkIG9uIGBhZGRKb2JgIHRvIGtlZXAgcmVsYXRlZFxuICogICAgIG1lc3NhZ2VzIG9uIHRoZSBzYW1lIHBhcnRpdGlvbi5cbiAqICAgLSAqKlJldHJpZXMqKjogS2Fma2EgZG9lc24ndCBoYXZlIGEgYnJva2VyLXNpZGUgcmV0cnkgY29uY2VwdC5cbiAqICAgICBUaGUgYWRhcHRlciByZS10aHJvd3Mgb24gaGFuZGxlciBmYWlsdXJlOyBvZmZzZXQgY29tbWl0IGlzXG4gKiAgICAgc3VwcHJlc3NlZCBzbyB0aGUgY29uc3VtZXIgcmUtcG9sbHMgdGhlIG1lc3NhZ2Ugb24gdGhlIG5leHRcbiAqICAgICBjeWNsZS4gRm9yIHJlYWwgcmV0cnkgc2VtYW50aWNzLCBsYXllciBhIGRlYWQtbGV0dGVyIHRvcGljLlxuICogICAtICoqU3RhdHMqKjogS2Fma2FKUyBleHBvc2VzIGNvbnN1bWVyLWdyb3VwIGxhZyB2aWEgaXRzIGFkbWluXG4gKiAgICAgY2xpZW50OyB0aGUgbGFnIGNvdW50IGlzIHJlcG9ydGVkIGFzIGB3YWl0aW5nYC4gT3RoZXIgc3RhdHNcbiAqICAgICBhcmUgdHJhY2tlZCBsb2NhbGx5IHBlciBjb25zdW1lci5cbiAqICAgLSAqKkNvbmN1cnJlbmN5Kio6IHRoZSBgY29uY3VycmVuY3lgIGZpZWxkIG1hcHMgdG8gS2Fma2FKUydzXG4gKiAgICAgYHBhcnRpdGlvbnNDb25zdW1lZENvbmN1cnJlbnRseWAg4oCUIGl0IGNhcHMgaG93IG1hbnkgcGFydGl0aW9uc1xuICogICAgIGFyZSBwcm9jZXNzZWQgaW4gcGFyYWxsZWwsIHNvIGl0J3MgYm91bmRlZCBieSB0aGUgdG9waWMnc1xuICogICAgIHBhcnRpdGlvbiBjb3VudC4gQSBzaW5nbGUtcGFydGl0aW9uIHRvcGljIGlzIGVmZmVjdGl2ZWx5IHNlcmlhbFxuICogICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbmZpZ3VyZWQgdmFsdWUuXG4gKlxuICogUmVxdWlyZXMgYGthZmthanNgIGFzIGEgcGVlciBkZXBlbmRlbmN5OlxuICpcbiAqICAgICBidW4gYWRkIGthZmthanNcbiAqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgKHJlYWQgYXQgYWRhcHRlciBjb25zdHJ1Y3Rpb24pOlxuICogICAtIGBLQUZLQV9CUk9LRVJTYCAgICAgICAgICAg4oCUIGNvbW1hLXNlcGFyYXRlZCBsaXN0IChkZWZhdWx0IGBsb2NhbGhvc3Q6OTA5MmApLlxuICogICAtIGBLQUZLQV9DTElFTlRfSURgICAgICAgICAg4oCUIGNsaWVudC5pZCAoZGVmYXVsdCBgXCJibG9rLXdvcmtlclwiYCkuXG4gKiAgIC0gYEtBRktBX1NBU0xfVVNFUk5BTUVgICAgICDigJQgU0FTTC9QTEFJTiB1c2VybmFtZSAob3B0aW9uYWwpLlxuICogICAtIGBLQUZLQV9TQVNMX1BBU1NXT1JEYCAgICAg4oCUIFNBU0wvUExBSU4gcGFzc3dvcmQgKG9wdGlvbmFsKS5cbiAqICAgLSBgS0FGS0FfU1NMYCAgICAgICAgICAgICAgIOKAlCB3aGVuIGBcInRydWVcImAsIGVuYWJsZSBUTFMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBXb3JrZXJUcmlnZ2VyT3B0cyB9IGZyb20gXCJAYmxva2pzL2hlbHBlclwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlckFkYXB0ZXIsIFdvcmtlckpvYiwgV29ya2VyUXVldWVTdGF0cyB9IGZyb20gXCIuLi9Xb3JrZXJUcmlnZ2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2Fma2FDb25maWcge1xuXHRicm9rZXJzOiBzdHJpbmdbXTtcblx0Y2xpZW50SWQ6IHN0cmluZztcblx0c2FzbFVzZXJuYW1lPzogc3RyaW5nO1xuXHRzYXNsUGFzc3dvcmQ/OiBzdHJpbmc7XG5cdHNzbDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEthZmthSnNIYW5kbGUge1xuXHRwcm9kdWNlcj86IHtcblx0XHRjb25uZWN0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRcdGRpc2Nvbm5lY3Q6ICgpID0+IFByb21pc2U8dm9pZD47XG5cdFx0c2VuZDogKGFyZ3M6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj47XG5cdH07XG5cdGNvbnN1bWVyczogTWFwPFxuXHRcdHN0cmluZyxcblx0XHR7XG5cdFx0XHRkaXNjb25uZWN0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRcdFx0c3RvcDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblx0XHRcdHJ1bjogKG9wdHM6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG5cdFx0fVxuXHQ+O1xuXHRhZG1pbj86IHtcblx0XHRjb25uZWN0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRcdGRpc2Nvbm5lY3Q6ICgpID0+IFByb21pc2U8dm9pZD47XG5cdFx0ZmV0Y2hUb3BpY09mZnNldHM6ICh0b3BpYzogc3RyaW5nKSA9PiBQcm9taXNlPEFycmF5PHsgcGFydGl0aW9uOiBudW1iZXI7IG9mZnNldDogc3RyaW5nIH0+Pjtcblx0fTtcbn1cblxuaW50ZXJmYWNlIFF1ZXVlU3RhdHNDb3VudGVycyB7XG5cdGNvbXBsZXRlZDogbnVtYmVyO1xuXHRmYWlsZWQ6IG51bWJlcjtcblx0YWN0aXZlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBLYWZrYUFkYXB0ZXIgaW1wbGVtZW50cyBXb3JrZXJBZGFwdGVyIHtcblx0cmVhZG9ubHkgcHJvdmlkZXIgPSBcImthZmthXCIgYXMgY29uc3Q7XG5cdHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBLYWZrYUNvbmZpZztcblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBrYWZrYWpzJ3MgZXhwb3J0ZWQgYEthZmthYCBjb25zdHJ1Y3RvciBpcyBsb29zZWx5IHR5cGVkLlxuXHRwcml2YXRlIGthZmthOiBhbnkgPSBudWxsO1xuXHRwcml2YXRlIGhhbmRsZTogS2Fma2FKc0hhbmRsZSA9IHsgY29uc3VtZXJzOiBuZXcgTWFwKCkgfTtcblx0cHJpdmF0ZSBjb25uZWN0ZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBzdGF0czogTWFwPHN0cmluZywgUXVldWVTdGF0c0NvdW50ZXJzPiA9IG5ldyBNYXAoKTtcblxuXHRjb25zdHJ1Y3Rvcihjb25maWc/OiBQYXJ0aWFsPEthZmthQ29uZmlnPikge1xuXHRcdHRoaXMuY29uZmlnID0ge1xuXHRcdFx0YnJva2VyczogY29uZmlnPy5icm9rZXJzID8/IChwcm9jZXNzLmVudi5LQUZLQV9CUk9LRVJTID8/IFwibG9jYWxob3N0OjkwOTJcIikuc3BsaXQoXCIsXCIpLm1hcCgocykgPT4gcy50cmltKCkpLFxuXHRcdFx0Y2xpZW50SWQ6IGNvbmZpZz8uY2xpZW50SWQgPz8gcHJvY2Vzcy5lbnYuS0FGS0FfQ0xJRU5UX0lEID8/IFwiYmxvay13b3JrZXJcIixcblx0XHRcdHNhc2xVc2VybmFtZTogY29uZmlnPy5zYXNsVXNlcm5hbWUgPz8gcHJvY2Vzcy5lbnYuS0FGS0FfU0FTTF9VU0VSTkFNRSxcblx0XHRcdHNhc2xQYXNzd29yZDogY29uZmlnPy5zYXNsUGFzc3dvcmQgPz8gcHJvY2Vzcy5lbnYuS0FGS0FfU0FTTF9QQVNTV09SRCxcblx0XHRcdHNzbDogY29uZmlnPy5zc2wgPz8gcHJvY2Vzcy5lbnYuS0FGS0FfU1NMID09PSBcInRydWVcIixcblx0XHR9O1xuXHR9XG5cblx0YXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy5jb25uZWN0ZWQpIHJldHVybjtcblx0XHR0cnkge1xuXHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBrYWZrYWpzIGlzIGEgcnVudGltZS1sb2FkZWQgcGVlciBkZXAuXG5cdFx0XHRjb25zdCBrYWZrYWpzOiBhbnkgPSBhd2FpdCBpbXBvcnQoXCJrYWZrYWpzXCIpO1xuXHRcdFx0Y29uc3Qgc2FzbCA9XG5cdFx0XHRcdHRoaXMuY29uZmlnLnNhc2xVc2VybmFtZSAmJiB0aGlzLmNvbmZpZy5zYXNsUGFzc3dvcmRcblx0XHRcdFx0XHQ/IHsgbWVjaGFuaXNtOiBcInBsYWluXCIsIHVzZXJuYW1lOiB0aGlzLmNvbmZpZy5zYXNsVXNlcm5hbWUsIHBhc3N3b3JkOiB0aGlzLmNvbmZpZy5zYXNsUGFzc3dvcmQgfVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5rYWZrYSA9IG5ldyBrYWZrYWpzLkthZmthKHtcblx0XHRcdFx0Y2xpZW50SWQ6IHRoaXMuY29uZmlnLmNsaWVudElkLFxuXHRcdFx0XHRicm9rZXJzOiB0aGlzLmNvbmZpZy5icm9rZXJzLFxuXHRcdFx0XHRzc2w6IHRoaXMuY29uZmlnLnNzbCxcblx0XHRcdFx0c2FzbCxcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5oYW5kbGUucHJvZHVjZXIgPSB0aGlzLmthZmthLnByb2R1Y2VyKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmhhbmRsZS5wcm9kdWNlcj8uY29ubmVjdCgpO1xuXHRcdFx0dGhpcy5oYW5kbGUuYWRtaW4gPSB0aGlzLmthZmthLmFkbWluKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmhhbmRsZS5hZG1pbj8uY29ubmVjdCgpO1xuXHRcdFx0dGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgW2Jsb2tdW2thZmthXSBjb25uZWN0IGZhaWxlZDogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfS4gSW5zdGFsbCBrYWZrYWpzIGFzIGEgcGVlciBkZXBlbmRlbmN5OiBidW4gYWRkIGthZmthanNgLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHJldHVybjtcblx0XHRmb3IgKGNvbnN0IFssIGNvbnN1bWVyXSBvZiB0aGlzLmhhbmRsZS5jb25zdW1lcnMpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGNvbnN1bWVyLmRpc2Nvbm5lY3QoKTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHQvKiBpZ25vcmUgKi9cblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5oYW5kbGUuY29uc3VtZXJzLmNsZWFyKCk7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuaGFuZGxlLnByb2R1Y2VyPy5kaXNjb25uZWN0KCk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHQvKiBpZ25vcmUgKi9cblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuaGFuZGxlLmFkbWluPy5kaXNjb25uZWN0KCk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHQvKiBpZ25vcmUgKi9cblx0XHR9XG5cdFx0dGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcblx0fVxuXG5cdGFzeW5jIHByb2Nlc3MoY29uZmlnOiBXb3JrZXJUcmlnZ2VyT3B0cywgaGFuZGxlcjogKGpvYjogV29ya2VySm9iKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgdGhyb3cgbmV3IEVycm9yKFwiW2Jsb2tdW2thZmthXSBub3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0Y29uc3QgZ3JvdXBJZCA9IGNvbmZpZy5jb25zdW1lckdyb3VwID8/IGAke2NvbmZpZy5xdWV1ZX0tZ3JvdXBgO1xuXHRcdGNvbnN0IGNvbnN1bWVyID0gdGhpcy5rYWZrYS5jb25zdW1lcih7IGdyb3VwSWQgfSk7XG5cdFx0YXdhaXQgY29uc3VtZXIuY29ubmVjdCgpO1xuXHRcdGF3YWl0IGNvbnN1bWVyLnN1YnNjcmliZSh7IHRvcGljOiBjb25maWcucXVldWUsIGZyb21CZWdpbm5pbmc6IGNvbmZpZy5mcm9tQmVnaW5uaW5nID09PSB0cnVlIH0pO1xuXHRcdHRoaXMuaGFuZGxlLmNvbnN1bWVycy5zZXQoY29uZmlnLnF1ZXVlLCBjb25zdW1lcik7XG5cdFx0dGhpcy5zdGF0cy5zZXQoY29uZmlnLnF1ZXVlLCB7IGNvbXBsZXRlZDogMCwgZmFpbGVkOiAwLCBhY3RpdmU6IDAgfSk7XG5cdFx0Y29uc3Qgc3RhdHMgPSB0aGlzLnN0YXRzLmdldChjb25maWcucXVldWUpIGFzIFF1ZXVlU3RhdHNDb3VudGVycztcblxuXHRcdGF3YWl0IGNvbnN1bWVyLnJ1bih7XG5cdFx0XHRhdXRvQ29tbWl0OiBjb25maWcuYWNrICE9PSBmYWxzZSxcblx0XHRcdC8vIEYyNSDigJQgaG9ub3IgdGhlIGRvY3VtZW50ZWQgYGNvbmN1cnJlbmN5YCBrbm9iLiBLYWZrYSBwcm9jZXNzZXNcblx0XHRcdC8vIG1lc3NhZ2VzIHNlcmlhbGx5IHBlciBwYXJ0aXRpb24gYnkgZGVmYXVsdDsgYHBhcnRpdGlvbnNDb25zdW1lZENvbmN1cnJlbnRseWBcblx0XHRcdC8vIGlzIEthZmthSlMncyBuYXRpdmUgcGFyYWxsZWxpc20gY2FwIChib3VuZGVkIGJ5IHBhcnRpdGlvbiBjb3VudCkuXG5cdFx0XHQvLyBXaXRob3V0IHRoaXMgdGhlIGZpZWxkIHdhcyBzaWxlbnRseSBpZ25vcmVkIOKAlCB2YWxpZGF0ZWQsIGFjY2VwdGVkLFxuXHRcdFx0Ly8gZXZlbiBsb2dnZWQgYXQgc3RhcnR1cCwgYnV0IHdpdGggemVybyBydW50aW1lIGVmZmVjdC5cblx0XHRcdHBhcnRpdGlvbnNDb25zdW1lZENvbmN1cnJlbnRseTogTWF0aC5tYXgoMSwgY29uZmlnLmNvbmN1cnJlbmN5ID8/IDEpLFxuXHRcdFx0ZWFjaE1lc3NhZ2U6IGFzeW5jICh7XG5cdFx0XHRcdG1lc3NhZ2UsXG5cdFx0XHR9OiB7XG5cdFx0XHRcdG1lc3NhZ2U6IHsga2V5PzogQnVmZmVyOyB2YWx1ZT86IEJ1ZmZlcjsgb2Zmc2V0OiBzdHJpbmc7IHRpbWVzdGFtcDogc3RyaW5nOyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgQnVmZmVyPiB9O1xuXHRcdFx0fSkgPT4ge1xuXHRcdFx0XHRjb25zdCBwYXlsb2FkU3RyaW5nID0gbWVzc2FnZS52YWx1ZT8udG9TdHJpbmcoXCJ1dGY4XCIpID8/IFwiXCI7XG5cdFx0XHRcdGxldCBkYXRhOiB1bmtub3duO1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGRhdGEgPSBwYXlsb2FkU3RyaW5nLmxlbmd0aCA+IDAgPyBKU09OLnBhcnNlKHBheWxvYWRTdHJpbmcpIDogbnVsbDtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0ZGF0YSA9IHBheWxvYWRTdHJpbmc7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXHRcdFx0XHRpZiAobWVzc2FnZS5oZWFkZXJzKSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMobWVzc2FnZS5oZWFkZXJzKSkgaGVhZGVyc1trXSA9IHY/LnRvU3RyaW5nKFwidXRmOFwiKSA/PyBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGpvYjogV29ya2VySm9iID0ge1xuXHRcdFx0XHRcdGlkOiBtZXNzYWdlLmtleT8udG9TdHJpbmcoXCJ1dGY4XCIpID8/IGAke2NvbmZpZy5xdWV1ZX06JHttZXNzYWdlLm9mZnNldH1gLFxuXHRcdFx0XHRcdGRhdGEsXG5cdFx0XHRcdFx0aGVhZGVycyxcblx0XHRcdFx0XHRxdWV1ZTogY29uZmlnLnF1ZXVlLFxuXHRcdFx0XHRcdHByaW9yaXR5OiBjb25maWcucHJpb3JpdHkgPz8gMCxcblx0XHRcdFx0XHRhdHRlbXB0czogMCxcblx0XHRcdFx0XHRtYXhSZXRyaWVzOiBjb25maWcucmV0cmllcyA/PyAwLFxuXHRcdFx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUoTnVtYmVyLnBhcnNlSW50KG1lc3NhZ2UudGltZXN0YW1wLCAxMCkpLFxuXHRcdFx0XHRcdHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0LFxuXHRcdFx0XHRcdHJhdzogbWVzc2FnZSxcblx0XHRcdFx0XHRjb21wbGV0ZTogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0c3RhdHMuY29tcGxldGVkICs9IDE7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRmYWlsOiBhc3luYyAoX2VycjogRXJyb3IpID0+IHtcblx0XHRcdFx0XHRcdHN0YXRzLmZhaWxlZCArPSAxO1xuXHRcdFx0XHRcdFx0dGhyb3cgX2Vycjtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRzdGF0cy5hY3RpdmUgKz0gMTtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRhd2FpdCBoYW5kbGVyKGpvYik7XG5cdFx0XHRcdFx0c3RhdHMuY29tcGxldGVkICs9IDE7XG5cdFx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRcdHN0YXRzLmZhaWxlZCArPSAxO1xuXHRcdFx0XHRcdHRocm93IGVycjtcblx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRzdGF0cy5hY3RpdmUgPSBNYXRoLm1heCgwLCBzdGF0cy5hY3RpdmUgLSAxKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdGFzeW5jIGFkZEpvYihcblx0XHRxdWV1ZTogc3RyaW5nLFxuXHRcdGRhdGE6IHVua25vd24sXG5cdFx0b3B0cz86IHsgcHJpb3JpdHk/OiBudW1iZXI7IGRlbGF5PzogbnVtYmVyOyByZXRyaWVzPzogbnVtYmVyOyB0aW1lb3V0PzogbnVtYmVyOyBqb2JJZD86IHN0cmluZyB9LFxuXHQpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHRocm93IG5ldyBFcnJvcihcIltibG9rXVtrYWZrYV0gbm90IGNvbm5lY3RlZC4gQ2FsbCBjb25uZWN0KCkgZmlyc3QuXCIpO1xuXHRcdGlmICghdGhpcy5oYW5kbGUucHJvZHVjZXIpIHRocm93IG5ldyBFcnJvcihcIltibG9rXVtrYWZrYV0gcHJvZHVjZXIgbm90IGluaXRpYWxpemVkXCIpO1xuXHRcdGNvbnN0IGtleSA9IG9wdHM/LmpvYklkID8/IHV1aWQoKTtcblx0XHRjb25zdCBwYXlsb2FkID0gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgPyBkYXRhIDogSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG5cdFx0YXdhaXQgdGhpcy5oYW5kbGUucHJvZHVjZXIuc2VuZCh7XG5cdFx0XHR0b3BpYzogcXVldWUsXG5cdFx0XHRtZXNzYWdlczogW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0a2V5LFxuXHRcdFx0XHRcdHZhbHVlOiBwYXlsb2FkLFxuXHRcdFx0XHRcdGhlYWRlcnM6IG9wdHM/LmRlbGF5ID8geyBcIngtYmxvay1kZWxheS1tc1wiOiBTdHJpbmcob3B0cy5kZWxheSkgfSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0fSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0cmV0dXJuIGtleTtcblx0fVxuXG5cdGFzeW5jIHN0b3BQcm9jZXNzaW5nKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBjb25zdW1lciA9IHRoaXMuaGFuZGxlLmNvbnN1bWVycy5nZXQocXVldWUpO1xuXHRcdGlmIChjb25zdW1lcikge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgY29uc3VtZXIuc3RvcCgpO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdC8qIGlnbm9yZSAqL1xuXHRcdFx0fVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgY29uc3VtZXIuZGlzY29ubmVjdCgpO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdC8qIGlnbm9yZSAqL1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5oYW5kbGUuY29uc3VtZXJzLmRlbGV0ZShxdWV1ZSk7XG5cdFx0fVxuXHR9XG5cblx0aXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuXHR9XG5cblx0YXN5bmMgaGVhbHRoQ2hlY2soKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCB8fCAhdGhpcy5oYW5kbGUuYWRtaW4pIHJldHVybiBmYWxzZTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5oYW5kbGUuYWRtaW4uZmV0Y2hUb3BpY09mZnNldHMoXCJfX2NvbnN1bWVyX29mZnNldHNcIik7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBnZXRRdWV1ZVN0YXRzKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPFdvcmtlclF1ZXVlU3RhdHM+IHtcblx0XHRjb25zdCBjb3VudGVycyA9IHRoaXMuc3RhdHMuZ2V0KHF1ZXVlKSA/PyB7IGNvbXBsZXRlZDogMCwgZmFpbGVkOiAwLCBhY3RpdmU6IDAgfTtcblx0XHRsZXQgd2FpdGluZyA9IDA7XG5cdFx0aWYgKHRoaXMuaGFuZGxlLmFkbWluKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvZmZzZXRzID0gYXdhaXQgdGhpcy5oYW5kbGUuYWRtaW4uZmV0Y2hUb3BpY09mZnNldHMocXVldWUpO1xuXHRcdFx0XHQvLyBBcHByb3hpbWF0ZTogdG90YWwgY29tbWl0dGVkIG9mZnNldHMgYWNyb3NzIHBhcnRpdGlvbnMuIFJlYWwgbGFnXG5cdFx0XHRcdC8vIHJlcXVpcmVzIGFkbWluLmZldGNoT2Zmc2V0cyh7IGdyb3VwSWQgfSkg4oCUIHNraXBwZWQgaGVyZSB0byBrZWVwXG5cdFx0XHRcdC8vIHRoZSBjYWxsIGNoZWFwOyBwcm9kdWN0aW9uIGRlcGxveW1lbnRzIHNob3VsZCB1c2UgS2Fma2Enc1xuXHRcdFx0XHQvLyBkZWRpY2F0ZWQgbGFnIG1ldHJpY3MgYW55d2F5LlxuXHRcdFx0XHR3YWl0aW5nID0gb2Zmc2V0cy5yZWR1Y2UoKHN1bSwgcCkgPT4gc3VtICsgTnVtYmVyLnBhcnNlSW50KHAub2Zmc2V0LCAxMCksIDApO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdHdhaXRpbmcgPSAwO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0d2FpdGluZyxcblx0XHRcdGFjdGl2ZTogY291bnRlcnMuYWN0aXZlLFxuXHRcdFx0Y29tcGxldGVkOiBjb3VudGVycy5jb21wbGV0ZWQsXG5cdFx0XHRmYWlsZWQ6IGNvdW50ZXJzLmZhaWxlZCxcblx0XHRcdGRlbGF5ZWQ6IDAsXG5cdFx0fTtcblx0fVxufVxuIl19
304
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2Fma2FBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXJzL0thZmthQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMENHO0FBR0gsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFzQ2xDLE1BQU0sT0FBTyxZQUFZO0lBQ2YsUUFBUSxHQUFHLE9BQWdCLENBQUM7SUFDcEIsTUFBTSxDQUFjO0lBQ3JDLHVHQUF1RztJQUMvRixLQUFLLEdBQVEsSUFBSSxDQUFDO0lBQ2xCLE1BQU0sR0FBa0IsRUFBRSxTQUFTLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBQ2pELFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsS0FBSyxHQUFvQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTNELFlBQVksTUFBNkI7UUFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNiLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0csUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksYUFBYTtZQUMxRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFlBQVksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtZQUNyRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFlBQVksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQjtZQUNyRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxP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LENBQUMsQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDO2dCQUNKLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pFLG1FQUFtRTtnQkFDbkUsa0VBQWtFO2dCQUNsRSw0REFBNEQ7Z0JBQzVELGdDQUFnQztnQkFDaEMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzlFLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1IsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNiLENBQUM7UUFDRixDQUFDO1FBQ0QsT0FBTztZQUNOLE9BQU87WUFDUCxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDdkIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxTQUFTO1lBQzdCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtZQUN2QixPQUFPLEVBQUUsQ0FBQztTQUNWLENBQUM7SUFDSCxDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEthZmthQWRhcHRlciDigJQgdjAuNyBQUiA1IOKAlCBXb3JrZXIgYWRhcHRlciBiYWNrZWQgYnkgQXBhY2hlIEthZmthIHZpYVxuICogYGthZmthanNgLiBDb25zdW1lcyBmcm9tIGEgdG9waWMgKHRoZSBgcXVldWVgIGZpZWxkKSB3aXRoIGFcbiAqIGNvbnN1bWVyLWdyb3VwIGlkZW50aWZpZXI7IHByb2R1Y2VzIHZpYSB0aGUgc2FtZSBjbGllbnQuXG4gKlxuICogS2Fma2EgaXMgZnVuZGFtZW50YWxseSBhIHN0cmVhbWluZyBwbGF0Zm9ybSDigJQgbm90IGEgcXVldWUg4oCUIHNvIGFcbiAqIGZldyBzZW1hbnRpY3MgZGlmZmVyIGZyb20gQnVsbE1RL1NRUy9SYWJiaXRNUTpcbiAqXG4gKiAgIC0gKipPcmRlcmluZyoqOiBwZXItcGFydGl0aW9uLCBub3QgcGVyLXRvcGljLiBTZXQgdGhlIHBhcnRpdGlvblxuICogICAgIGtleSB2aWEgdGhlIGBkZWR1cElkYCBmaWVsZCBvbiBgYWRkSm9iYCB0byBrZWVwIHJlbGF0ZWRcbiAqICAgICBtZXNzYWdlcyBvbiB0aGUgc2FtZSBwYXJ0aXRpb24uXG4gKiAgIC0gKipSZXRyaWVzIC8gRExRKio6IEthZmthIGhhcyBubyBicm9rZXItc2lkZSByZXRyeSBvciBkZWFkLWxldHRlclxuICogICAgIGNvbmNlcHQuIFRoZSBhZGFwdGVyIGVtdWxhdGVzIGJvdGggYXQgdGhlIGFwcGxpY2F0aW9uIGxheWVyOiBvblxuICogICAgIGhhbmRsZXIgZmFpbHVyZSBpdCByZS1wcm9kdWNlcyB0aGUgcGF5bG9hZCB0byB0aGUgU09VUkNFIHRvcGljXG4gKiAgICAgd2l0aCBhbiBpbmNyZW1lbnRlZCBgeC1ibG9rLWF0dGVtcHRgIGhlYWRlciAodXAgdG8gYGNvbmZpZy5yZXRyaWVzYCksXG4gKiAgICAgdGhlbiByb3V0ZXMgdGhlIGV4aGF1c3RlZCBwYXlsb2FkIHRvIGBjb25maWcuZGVhZExldHRlclF1ZXVlYC4gVGhlXG4gKiAgICAgc291cmNlIG9mZnNldCBhbHdheXMgY29tbWl0cyAodGhlIGhhbmRsZXIgbmV2ZXIgcmUtdGhyb3dzKSwgc28gYVxuICogICAgIHNpbmdsZSBwb2lzb24gbWVzc2FnZSBjYW4gbmV2ZXIgY3Jhc2gtbG9vcCB0aGUgY29uc3VtZXIgYW5kIGJsb2NrXG4gKiAgICAgZXZlcnkgbGF0ZXIgam9iIGJlaGluZCBpdC5cbiAqICAgLSAqKk5vIG5hdGl2ZSBwcmlvcml0eSAvIGRlbGF5Kio6IEthZmthIGlzIGFuIG9yZGVyZWQgbG9nLCBub3QgYVxuICogICAgIHByaW9yaXR5IHF1ZXVlIG9yIGEgc2NoZWR1bGVyLiBgcHJvY2Vzc2AgYW5kIGBhZGRKb2JgIFRIUk9XIGEgY2xlYXJcbiAqICAgICBjb25maWcgZXJyb3Igd2hlbiBgcHJpb3JpdHlgIG9yIGBkZWxheWAgaXMgc2V0IHJhdGhlciB0aGFuIHNpbGVudGx5XG4gKiAgICAgZHJvcHBpbmcgaXQg4oCUIHVzZSBhIHNjaGVkdWxlciB0cmlnZ2VyIGZvciBkZWxheWVkIHdvcmsuXG4gKiAgIC0gKipTdGF0cyoqOiBLYWZrYUpTIGV4cG9zZXMgY29uc3VtZXItZ3JvdXAgbGFnIHZpYSBpdHMgYWRtaW5cbiAqICAgICBjbGllbnQ7IHRoZSBsYWcgY291bnQgaXMgcmVwb3J0ZWQgYXMgYHdhaXRpbmdgLiBPdGhlciBzdGF0c1xuICogICAgIGFyZSB0cmFja2VkIGxvY2FsbHkgcGVyIGNvbnN1bWVyLlxuICogICAtICoqQ29uY3VycmVuY3kqKjogdGhlIGBjb25jdXJyZW5jeWAgZmllbGQgbWFwcyB0byBLYWZrYUpTJ3NcbiAqICAgICBgcGFydGl0aW9uc0NvbnN1bWVkQ29uY3VycmVudGx5YCDigJQgaXQgY2FwcyBob3cgbWFueSBwYXJ0aXRpb25zXG4gKiAgICAgYXJlIHByb2Nlc3NlZCBpbiBwYXJhbGxlbCwgc28gaXQncyBib3VuZGVkIGJ5IHRoZSB0b3BpYydzXG4gKiAgICAgcGFydGl0aW9uIGNvdW50LiBBIHNpbmdsZS1wYXJ0aXRpb24gdG9waWMgaXMgZWZmZWN0aXZlbHkgc2VyaWFsXG4gKiAgICAgcmVnYXJkbGVzcyBvZiB0aGUgY29uZmlndXJlZCB2YWx1ZS5cbiAqXG4gKiBSZXF1aXJlcyBga2Fma2Fqc2AgYXMgYSBwZWVyIGRlcGVuZGVuY3k6XG4gKlxuICogICAgIGJ1biBhZGQga2Fma2Fqc1xuICpcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlcyAocmVhZCBhdCBhZGFwdGVyIGNvbnN0cnVjdGlvbik6XG4gKiAgIC0gYEtBRktBX0JST0tFUlNgICAgICAgICAgICDigJQgY29tbWEtc2VwYXJhdGVkIGxpc3QgKGRlZmF1bHQgYGxvY2FsaG9zdDo5MDkyYCkuXG4gKiAgIC0gYEtBRktBX0NMSUVOVF9JRGAgICAgICAgICDigJQgY2xpZW50LmlkIChkZWZhdWx0IGBcImJsb2std29ya2VyXCJgKS5cbiAqICAgLSBgS0FGS0FfU0FTTF9VU0VSTkFNRWAgICAgIOKAlCBTQVNML1BMQUlOIHVzZXJuYW1lIChvcHRpb25hbCkuXG4gKiAgIC0gYEtBRktBX1NBU0xfUEFTU1dPUkRgICAgICDigJQgU0FTTC9QTEFJTiBwYXNzd29yZCAob3B0aW9uYWwpLlxuICogICAtIGBLQUZLQV9TU0xgICAgICAgICAgICAgICAg4oCUIHdoZW4gYFwidHJ1ZVwiYCwgZW5hYmxlIFRMUy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFdvcmtlclRyaWdnZXJPcHRzIH0gZnJvbSBcIkBibG9ranMvaGVscGVyXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB0eXBlIHsgV29ya2VyQWRhcHRlciwgV29ya2VySm9iLCBXb3JrZXJRdWV1ZVN0YXRzIH0gZnJvbSBcIi4uL1dvcmtlclRyaWdnZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBLYWZrYUNvbmZpZyB7XG5cdGJyb2tlcnM6IHN0cmluZ1tdO1xuXHRjbGllbnRJZDogc3RyaW5nO1xuXHRzYXNsVXNlcm5hbWU/OiBzdHJpbmc7XG5cdHNhc2xQYXNzd29yZD86IHN0cmluZztcblx0c3NsOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgS2Fma2FKc0hhbmRsZSB7XG5cdHByb2R1Y2VyPzoge1xuXHRcdGNvbm5lY3Q6ICgpID0+IFByb21pc2U8dm9pZD47XG5cdFx0ZGlzY29ubmVjdDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblx0XHRzZW5kOiAoYXJnczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPjtcblx0fTtcblx0Y29uc3VtZXJzOiBNYXA8XG5cdFx0c3RyaW5nLFxuXHRcdHtcblx0XHRcdGRpc2Nvbm5lY3Q6ICgpID0+IFByb21pc2U8dm9pZD47XG5cdFx0XHRzdG9wOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRcdFx0cnVuOiAob3B0czogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcblx0XHR9XG5cdD47XG5cdGFkbWluPzoge1xuXHRcdGNvbm5lY3Q6ICgpID0+IFByb21pc2U8dm9pZD47XG5cdFx0ZGlzY29ubmVjdDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblx0XHRmZXRjaFRvcGljT2Zmc2V0czogKHRvcGljOiBzdHJpbmcpID0+IFByb21pc2U8QXJyYXk8eyBwYXJ0aXRpb246IG51bWJlcjsgb2Zmc2V0OiBzdHJpbmcgfT4+O1xuXHR9O1xufVxuXG5pbnRlcmZhY2UgUXVldWVTdGF0c0NvdW50ZXJzIHtcblx0Y29tcGxldGVkOiBudW1iZXI7XG5cdGZhaWxlZDogbnVtYmVyO1xuXHRhY3RpdmU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEthZmthQWRhcHRlciBpbXBsZW1lbnRzIFdvcmtlckFkYXB0ZXIge1xuXHRyZWFkb25seSBwcm92aWRlciA9IFwia2Fma2FcIiBhcyBjb25zdDtcblx0cHJpdmF0ZSByZWFkb25seSBjb25maWc6IEthZmthQ29uZmlnO1xuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IGthZmthanMncyBleHBvcnRlZCBgS2Fma2FgIGNvbnN0cnVjdG9yIGlzIGxvb3NlbHkgdHlwZWQuXG5cdHByaXZhdGUga2Fma2E6IGFueSA9IG51bGw7XG5cdHByaXZhdGUgaGFuZGxlOiBLYWZrYUpzSGFuZGxlID0geyBjb25zdW1lcnM6IG5ldyBNYXAoKSB9O1xuXHRwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuXHRwcml2YXRlIHN0YXRzOiBNYXA8c3RyaW5nLCBRdWV1ZVN0YXRzQ291bnRlcnM+ID0gbmV3IE1hcCgpO1xuXG5cdGNvbnN0cnVjdG9yKGNvbmZpZz86IFBhcnRpYWw8S2Fma2FDb25maWc+KSB7XG5cdFx0dGhpcy5jb25maWcgPSB7XG5cdFx0XHRicm9rZXJzOiBjb25maWc/LmJyb2tlcnMgPz8gKHByb2Nlc3MuZW52LktBRktBX0JST0tFUlMgPz8gXCJsb2NhbGhvc3Q6OTA5MlwiKS5zcGxpdChcIixcIikubWFwKChzKSA9PiBzLnRyaW0oKSksXG5cdFx0XHRjbGllbnRJZDogY29uZmlnPy5jbGllbnRJZCA/PyBwcm9jZXNzLmVudi5LQUZLQV9DTElFTlRfSUQgPz8gXCJibG9rLXdvcmtlclwiLFxuXHRcdFx0c2FzbFVzZXJuYW1lOiBjb25maWc/LnNhc2xVc2VybmFtZSA/PyBwcm9jZXNzLmVudi5LQUZLQV9TQVNMX1VTRVJOQU1FLFxuXHRcdFx0c2FzbFBhc3N3b3JkOiBjb25maWc/LnNhc2xQYXNzd29yZCA/PyBwcm9jZXNzLmVudi5LQUZLQV9TQVNMX1BBU1NXT1JELFxuXHRcdFx0c3NsOiBjb25maWc/LnNzbCA/PyBwcm9jZXNzLmVudi5LQUZLQV9TU0wgPT09IFwidHJ1ZVwiLFxuXHRcdH07XG5cdH1cblxuXHRhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IGthZmthanMgaXMgYSBydW50aW1lLWxvYWRlZCBwZWVyIGRlcC5cblx0XHRcdGNvbnN0IGthZmthanM6IGFueSA9IGF3YWl0IGltcG9ydChcImthZmthanNcIik7XG5cdFx0XHRjb25zdCBzYXNsID1cblx0XHRcdFx0dGhpcy5jb25maWcuc2FzbFVzZXJuYW1lICYmIHRoaXMuY29uZmlnLnNhc2xQYXNzd29yZFxuXHRcdFx0XHRcdD8geyBtZWNoYW5pc206IFwicGxhaW5cIiwgdXNlcm5hbWU6IHRoaXMuY29uZmlnLnNhc2xVc2VybmFtZSwgcGFzc3dvcmQ6IHRoaXMuY29uZmlnLnNhc2xQYXNzd29yZCB9XG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHR0aGlzLmthZmthID0gbmV3IGthZmthanMuS2Fma2Eoe1xuXHRcdFx0XHRjbGllbnRJZDogdGhpcy5jb25maWcuY2xpZW50SWQsXG5cdFx0XHRcdGJyb2tlcnM6IHRoaXMuY29uZmlnLmJyb2tlcnMsXG5cdFx0XHRcdHNzbDogdGhpcy5jb25maWcuc3NsLFxuXHRcdFx0XHRzYXNsLFxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmhhbmRsZS5wcm9kdWNlciA9IHRoaXMua2Fma2EucHJvZHVjZXIoKTtcblx0XHRcdGF3YWl0IHRoaXMuaGFuZGxlLnByb2R1Y2VyPy5jb25uZWN0KCk7XG5cdFx0XHR0aGlzLmhhbmRsZS5hZG1pbiA9IHRoaXMua2Fma2EuYWRtaW4oKTtcblx0XHRcdGF3YWl0IHRoaXMuaGFuZGxlLmFkbWluPy5jb25uZWN0KCk7XG5cdFx0XHR0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdGBbYmxva11ba2Fma2FdIGNvbm5lY3QgZmFpbGVkOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9LiBJbnN0YWxsIGthZmthanMgYXMgYSBwZWVyIGRlcGVuZGVuY3k6IGJ1biBhZGQga2Fma2Fqc2AsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXHRcdGZvciAoY29uc3QgWywgY29uc3VtZXJdIG9mIHRoaXMuaGFuZGxlLmNvbnN1bWVycykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgY29uc3VtZXIuZGlzY29ubmVjdCgpO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdC8qIGlnbm9yZSAqL1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmhhbmRsZS5jb25zdW1lcnMuY2xlYXIoKTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5oYW5kbGUucHJvZHVjZXI/LmRpc2Nvbm5lY3QoKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdC8qIGlnbm9yZSAqL1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5oYW5kbGUuYWRtaW4/LmRpc2Nvbm5lY3QoKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdC8qIGlnbm9yZSAqL1xuXHRcdH1cblx0XHR0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuXHR9XG5cblx0YXN5bmMgcHJvY2Vzcyhjb25maWc6IFdvcmtlclRyaWdnZXJPcHRzLCBoYW5kbGVyOiAoam9iOiBXb3JrZXJKb2IpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJbYmxva11ba2Fma2FdIG5vdCBjb25uZWN0ZWQuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHQvLyBLYWZrYSBpcyBhbiBvcmRlcmVkIGxvZyDigJQgbm8gbmF0aXZlIHByaW9yaXR5IG9yIGRlbGF5ZWQgZGVsaXZlcnkuXG5cdFx0Ly8gUmVqZWN0IGF0IHN0YXJ0dXAgcmF0aGVyIHRoYW4gYWNjZXB0aW5nIGNvbmZpZyB0aGF0IHNpbGVudGx5IGRvZXNcblx0XHQvLyBub3RoaW5nICh0aGUgcHJlLWZpeCBiZWhhdmlvcjogdmFsaWRhdGVkLCBsb2dnZWQsIHplcm8gZWZmZWN0KS5cblx0XHRpZiAoY29uZmlnLnByaW9yaXR5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFwiW2Jsb2tdW2thZmthXSBLYWZrYSBoYXMgbm8gbmF0aXZlIG1lc3NhZ2UgcHJpb3JpdHkg4oCUIGRyb3AgYHByaW9yaXR5YDsgbWVzc2FnZXMgYXJlIG9yZGVyZWQgcGVyIHBhcnRpdGlvbi5cIixcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGlmIChjb25maWcuZGVsYXkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIltibG9rXVtrYWZrYV0gS2Fma2EgaGFzIG5vIG5hdGl2ZSBkZWxheWVkIGRlbGl2ZXJ5IOKAlCBkcm9wIGBkZWxheWAgb3IgdXNlIGEgc2NoZWR1bGVyIHRyaWdnZXIuXCIpO1xuXHRcdH1cblx0XHRjb25zdCBncm91cElkID0gY29uZmlnLmNvbnN1bWVyR3JvdXAgPz8gYCR7Y29uZmlnLnF1ZXVlfS1ncm91cGA7XG5cdFx0Y29uc3QgY29uc3VtZXIgPSB0aGlzLmthZmthLmNvbnN1bWVyKHsgZ3JvdXBJZCB9KTtcblx0XHRhd2FpdCBjb25zdW1lci5jb25uZWN0KCk7XG5cdFx0YXdhaXQgY29uc3VtZXIuc3Vic2NyaWJlKHsgdG9waWM6IGNvbmZpZy5xdWV1ZSwgZnJvbUJlZ2lubmluZzogY29uZmlnLmZyb21CZWdpbm5pbmcgPT09IHRydWUgfSk7XG5cdFx0dGhpcy5oYW5kbGUuY29uc3VtZXJzLnNldChjb25maWcucXVldWUsIGNvbnN1bWVyKTtcblx0XHR0aGlzLnN0YXRzLnNldChjb25maWcucXVldWUsIHsgY29tcGxldGVkOiAwLCBmYWlsZWQ6IDAsIGFjdGl2ZTogMCB9KTtcblx0XHRjb25zdCBzdGF0cyA9IHRoaXMuc3RhdHMuZ2V0KGNvbmZpZy5xdWV1ZSkgYXMgUXVldWVTdGF0c0NvdW50ZXJzO1xuXG5cdFx0YXdhaXQgY29uc3VtZXIucnVuKHtcblx0XHRcdGF1dG9Db21taXQ6IGNvbmZpZy5hY2sgIT09IGZhbHNlLFxuXHRcdFx0Ly8gRjI1IOKAlCBob25vciB0aGUgZG9jdW1lbnRlZCBgY29uY3VycmVuY3lgIGtub2IuIEthZmthIHByb2Nlc3Nlc1xuXHRcdFx0Ly8gbWVzc2FnZXMgc2VyaWFsbHkgcGVyIHBhcnRpdGlvbiBieSBkZWZhdWx0OyBgcGFydGl0aW9uc0NvbnN1bWVkQ29uY3VycmVudGx5YFxuXHRcdFx0Ly8gaXMgS2Fma2FKUydzIG5hdGl2ZSBwYXJhbGxlbGlzbSBjYXAgKGJvdW5kZWQgYnkgcGFydGl0aW9uIGNvdW50KS5cblx0XHRcdC8vIFdpdGhvdXQgdGhpcyB0aGUgZmllbGQgd2FzIHNpbGVudGx5IGlnbm9yZWQg4oCUIHZhbGlkYXRlZCwgYWNjZXB0ZWQsXG5cdFx0XHQvLyBldmVuIGxvZ2dlZCBhdCBzdGFydHVwLCBidXQgd2l0aCB6ZXJvIHJ1bnRpbWUgZWZmZWN0LlxuXHRcdFx0cGFydGl0aW9uc0NvbnN1bWVkQ29uY3VycmVudGx5OiBNYXRoLm1heCgxLCBjb25maWcuY29uY3VycmVuY3kgPz8gMSksXG5cdFx0XHRlYWNoTWVzc2FnZTogYXN5bmMgKHtcblx0XHRcdFx0bWVzc2FnZSxcblx0XHRcdH06IHtcblx0XHRcdFx0bWVzc2FnZTogeyBrZXk/OiBCdWZmZXI7IHZhbHVlPzogQnVmZmVyOyBvZmZzZXQ6IHN0cmluZzsgdGltZXN0YW1wOiBzdHJpbmc7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBCdWZmZXI+IH07XG5cdFx0XHR9KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHBheWxvYWRTdHJpbmcgPSBtZXNzYWdlLnZhbHVlPy50b1N0cmluZyhcInV0ZjhcIikgPz8gXCJcIjtcblx0XHRcdFx0bGV0IGRhdGE6IHVua25vd247XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0ZGF0YSA9IHBheWxvYWRTdHJpbmcubGVuZ3RoID4gMCA/IEpTT04ucGFyc2UocGF5bG9hZFN0cmluZykgOiBudWxsO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRkYXRhID0gcGF5bG9hZFN0cmluZztcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdFx0XHRcdGlmIChtZXNzYWdlLmhlYWRlcnMpIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhtZXNzYWdlLmhlYWRlcnMpKSBoZWFkZXJzW2tdID0gdj8udG9TdHJpbmcoXCJ1dGY4XCIpID8/IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gUmV0cnkgYXR0ZW1wdCByaWRlcyBvbiB0aGUgbWVzc2FnZSBoZWFkZXIgKEthZmthIGhhcyBub1xuXHRcdFx0XHQvLyBicm9rZXItc2lkZSBhdHRlbXB0IGNvdW50ZXIpLiBBIHJlLXByb2R1Y2VkIHJldHJ5IGNhcnJpZXNcblx0XHRcdFx0Ly8gYHgtYmxvay1hdHRlbXB0YDsgdGhlIGZpcnN0IGRlbGl2ZXJ5IGhhcyBub25lIOKGkiBhdHRlbXB0IDAuXG5cdFx0XHRcdGNvbnN0IGF0dGVtcHRzID0gTnVtYmVyLnBhcnNlSW50KGhlYWRlcnNbXCJ4LWJsb2stYXR0ZW1wdFwiXSA/PyBcIjBcIiwgMTApIHx8IDA7XG5cdFx0XHRcdGNvbnN0IGtleSA9IG1lc3NhZ2Uua2V5Py50b1N0cmluZyhcInV0ZjhcIikgPz8gYCR7Y29uZmlnLnF1ZXVlfToke21lc3NhZ2Uub2Zmc2V0fWA7XG5cdFx0XHRcdC8vIFRlcm1pbmFsIChyZXRyaWVzIGV4aGF1c3RlZCDihpIgRExRKSB2cy4gcmV0cnkgKHJlLXByb2R1Y2UgdG9cblx0XHRcdFx0Ly8gc291cmNlIHdpdGggYXR0ZW1wdCsxKS4gQm90aCBDT01NSVQgdGhlIHNvdXJjZSBvZmZzZXQg4oCUIHRoZVxuXHRcdFx0XHQvLyBoYW5kbGVyIG5ldmVyIHJlLXRocm93cywgc28gb25lIHBvaXNvbiBtZXNzYWdlIGNhbid0IGNyYXNoLWxvb3Bcblx0XHRcdFx0Ly8gdGhlIGNvbnN1bWVyIGFuZCBzdGFydmUgZXZlcnkgam9iIHF1ZXVlZCBiZWhpbmQgaXQuXG5cdFx0XHRcdGNvbnN0IHNldHRsZUZhaWx1cmUgPSBhc3luYyAocmVxdWV1ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHdpbGxSZXRyeSA9IHJlcXVldWUgJiYgYXR0ZW1wdHMgPCAoY29uZmlnLnJldHJpZXMgPz8gMCk7XG5cdFx0XHRcdFx0aWYgKHdpbGxSZXRyeSkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5wcm9kdWNlKGNvbmZpZy5xdWV1ZSwga2V5LCBwYXlsb2FkU3RyaW5nLCB7IFwieC1ibG9rLWF0dGVtcHRcIjogU3RyaW5nKGF0dGVtcHRzICsgMSkgfSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChjb25maWcuZGVhZExldHRlclF1ZXVlKSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLnByb2R1Y2UoY29uZmlnLmRlYWRMZXR0ZXJRdWV1ZSwga2V5LCBwYXlsb2FkU3RyaW5nLCB7XG5cdFx0XHRcdFx0XHRcdFwieC1ibG9rLWF0dGVtcHRcIjogU3RyaW5nKGF0dGVtcHRzKSxcblx0XHRcdFx0XHRcdFx0XCJ4LWJsb2stc291cmNlLXRvcGljXCI6IGNvbmZpZy5xdWV1ZSxcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0Y29uc3Qgam9iOiBXb3JrZXJKb2IgPSB7XG5cdFx0XHRcdFx0aWQ6IGtleSxcblx0XHRcdFx0XHRkYXRhLFxuXHRcdFx0XHRcdGhlYWRlcnMsXG5cdFx0XHRcdFx0cXVldWU6IGNvbmZpZy5xdWV1ZSxcblx0XHRcdFx0XHRwcmlvcml0eTogMCxcblx0XHRcdFx0XHRhdHRlbXB0cyxcblx0XHRcdFx0XHRtYXhSZXRyaWVzOiBjb25maWcucmV0cmllcyA/PyAwLFxuXHRcdFx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUoTnVtYmVyLnBhcnNlSW50KG1lc3NhZ2UudGltZXN0YW1wLCAxMCkpLFxuXHRcdFx0XHRcdHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0LFxuXHRcdFx0XHRcdHJhdzogbWVzc2FnZSxcblx0XHRcdFx0XHRjb21wbGV0ZTogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0c3RhdHMuY29tcGxldGVkICs9IDE7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRmYWlsOiBhc3luYyAoX2VycjogRXJyb3IsIHJlcXVldWU/OiBib29sZWFuKSA9PiB7XG5cdFx0XHRcdFx0XHRzdGF0cy5mYWlsZWQgKz0gMTtcblx0XHRcdFx0XHRcdGF3YWl0IHNldHRsZUZhaWx1cmUocmVxdWV1ZSA9PT0gdHJ1ZSk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fTtcblx0XHRcdFx0c3RhdHMuYWN0aXZlICs9IDE7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0YXdhaXQgaGFuZGxlcihqb2IpO1xuXHRcdFx0XHRcdHN0YXRzLmNvbXBsZXRlZCArPSAxO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHQvLyBBIGhhbmRsZXIgdGhhdCBUSFJPV1MgKHJhdGhlciB0aGFuIGNhbGxpbmcgam9iLmZhaWwpIG11c3Qgbm90XG5cdFx0XHRcdFx0Ly8gcmUtdGhyb3cgb3V0IG9mIGVhY2hNZXNzYWdlIOKAlCB0aGF0IHN1cHByZXNzZXMgdGhlIG9mZnNldCBjb21taXRcblx0XHRcdFx0XHQvLyBhbmQga2Fma2FqcyByZWRlbGl2ZXJzIHRoZSBTQU1FIG1lc3NhZ2UgZm9yZXZlciwgYmxvY2tpbmcgdGhlXG5cdFx0XHRcdFx0Ly8gcGFydGl0aW9uLiBSb3V0ZSB0aGUgcmF3IHRocm93IHRocm91Z2ggdGhlIHNhbWUgcmV0cnkvRExRIHBhdGhcblx0XHRcdFx0XHQvLyBhbmQgbGV0IHRoZSBvZmZzZXQgY29tbWl0LiBwb255dGFpbDogdGhpcyBpcyB0aGUgY3Jhc2gtbG9vcCBmaXguXG5cdFx0XHRcdFx0c3RhdHMuZmFpbGVkICs9IDE7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGF3YWl0IHNldHRsZUZhaWx1cmUoYXR0ZW1wdHMgPCAoY29uZmlnLnJldHJpZXMgPz8gMCkpO1xuXHRcdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdFx0LyogRExRL3JldHJ5IHByb2R1Y2UgZmFpbGVkIOKAlCBzdGlsbCBjb21taXQ7IGRvbid0IGNyYXNoLWxvb3AgKi9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0c3RhdHMuYWN0aXZlID0gTWF0aC5tYXgoMCwgc3RhdHMuYWN0aXZlIC0gMSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvZHVjZSBhIHNpbmdsZSBtZXNzYWdlIHRvIGB0b3BpY2Agd2l0aCBvcHRpb25hbCBzdHJpbmcgaGVhZGVycy5cblx0ICogVXNlZCBmb3IgcmV0cnkgcmUtcHJvZHVjZSAodG8gdGhlIHNvdXJjZSB0b3BpYykgYW5kIGRlYWQtbGV0dGVyaW5nLlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBwcm9kdWNlKHRvcGljOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5oYW5kbGUucHJvZHVjZXIpIHRocm93IG5ldyBFcnJvcihcIltibG9rXVtrYWZrYV0gcHJvZHVjZXIgbm90IGluaXRpYWxpemVkXCIpO1xuXHRcdGF3YWl0IHRoaXMuaGFuZGxlLnByb2R1Y2VyLnNlbmQoeyB0b3BpYywgbWVzc2FnZXM6IFt7IGtleSwgdmFsdWUsIGhlYWRlcnMgfV0gfSk7XG5cdH1cblxuXHRhc3luYyBhZGRKb2IoXG5cdFx0cXVldWU6IHN0cmluZyxcblx0XHRkYXRhOiB1bmtub3duLFxuXHRcdG9wdHM/OiB7IHByaW9yaXR5PzogbnVtYmVyOyBkZWxheT86IG51bWJlcjsgcmV0cmllcz86IG51bWJlcjsgdGltZW91dD86IG51bWJlcjsgam9iSWQ/OiBzdHJpbmcgfSxcblx0KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJbYmxva11ba2Fma2FdIG5vdCBjb25uZWN0ZWQuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHRpZiAoIXRoaXMuaGFuZGxlLnByb2R1Y2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJbYmxva11ba2Fma2FdIHByb2R1Y2VyIG5vdCBpbml0aWFsaXplZFwiKTtcblx0XHQvLyBLYWZrYSBpcyBhbiBvcmRlcmVkIGxvZyDigJQgbm8gbmF0aXZlIHByaW9yaXR5IG9yIGRlbGF5ZWQgZGVsaXZlcnkuXG5cdFx0Ly8gUmVqZWN0IHJhdGhlciB0aGFuIHNpbGVudGx5IGRyb3AgdGhlIG9wdGlvbiAodGhlIHByZS1maXggYmVoYXZpb3Jcblx0XHQvLyBzdHVmZmVkIGBkZWxheWAgaW50byBhIGhlYWRlciBubyBjb25zdW1lciBldmVyIGhvbm9yZWQpLlxuXHRcdGlmIChvcHRzPy5wcmlvcml0eSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcIltibG9rXVtrYWZrYV0gS2Fma2EgaGFzIG5vIG5hdGl2ZSBtZXNzYWdlIHByaW9yaXR5IOKAlCBkcm9wIGBwcmlvcml0eWA7IG1lc3NhZ2VzIGFyZSBvcmRlcmVkIHBlciBwYXJ0aXRpb24uXCIsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRpZiAob3B0cz8uZGVsYXkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIltibG9rXVtrYWZrYV0gS2Fma2EgaGFzIG5vIG5hdGl2ZSBkZWxheWVkIGRlbGl2ZXJ5IOKAlCBkcm9wIGBkZWxheWAgb3IgdXNlIGEgc2NoZWR1bGVyIHRyaWdnZXIuXCIpO1xuXHRcdH1cblx0XHRjb25zdCBrZXkgPSBvcHRzPy5qb2JJZCA/PyB1dWlkKCk7XG5cdFx0Y29uc3QgcGF5bG9hZCA9IHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiID8gZGF0YSA6IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuXHRcdGF3YWl0IHRoaXMucHJvZHVjZShxdWV1ZSwga2V5LCBwYXlsb2FkKTtcblx0XHRyZXR1cm4ga2V5O1xuXHR9XG5cblx0YXN5bmMgc3RvcFByb2Nlc3NpbmcocXVldWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGNvbnN1bWVyID0gdGhpcy5oYW5kbGUuY29uc3VtZXJzLmdldChxdWV1ZSk7XG5cdFx0aWYgKGNvbnN1bWVyKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBjb25zdW1lci5zdG9wKCk7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0LyogaWdub3JlICovXG5cdFx0XHR9XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBjb25zdW1lci5kaXNjb25uZWN0KCk7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0LyogaWdub3JlICovXG5cdFx0XHR9XG5cdFx0XHR0aGlzLmhhbmRsZS5jb25zdW1lcnMuZGVsZXRlKHF1ZXVlKTtcblx0XHR9XG5cdH1cblxuXHRpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG5cdH1cblxuXHRhc3luYyBoZWFsdGhDaGVjaygpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkIHx8ICF0aGlzLmhhbmRsZS5hZG1pbikgcmV0dXJuIGZhbHNlO1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLmhhbmRsZS5hZG1pbi5mZXRjaFRvcGljT2Zmc2V0cyhcIl9fY29uc3VtZXJfb2Zmc2V0c1wiKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGdldFF1ZXVlU3RhdHMocXVldWU6IHN0cmluZyk6IFByb21pc2U8V29ya2VyUXVldWVTdGF0cz4ge1xuXHRcdGNvbnN0IGNvdW50ZXJzID0gdGhpcy5zdGF0cy5nZXQocXVldWUpID8/IHsgY29tcGxldGVkOiAwLCBmYWlsZWQ6IDAsIGFjdGl2ZTogMCB9O1xuXHRcdGxldCB3YWl0aW5nID0gMDtcblx0XHRpZiAodGhpcy5oYW5kbGUuYWRtaW4pIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IG9mZnNldHMgPSBhd2FpdCB0aGlzLmhhbmRsZS5hZG1pbi5mZXRjaFRvcGljT2Zmc2V0cyhxdWV1ZSk7XG5cdFx0XHRcdC8vIEFwcHJveGltYXRlOiB0b3RhbCBjb21taXR0ZWQgb2Zmc2V0cyBhY3Jvc3MgcGFydGl0aW9ucy4gUmVhbCBsYWdcblx0XHRcdFx0Ly8gcmVxdWlyZXMgYWRtaW4uZmV0Y2hPZmZzZXRzKHsgZ3JvdXBJZCB9KSDigJQgc2tpcHBlZCBoZXJlIHRvIGtlZXBcblx0XHRcdFx0Ly8gdGhlIGNhbGwgY2hlYXA7IHByb2R1Y3Rpb24gZGVwbG95bWVudHMgc2hvdWxkIHVzZSBLYWZrYSdzXG5cdFx0XHRcdC8vIGRlZGljYXRlZCBsYWcgbWV0cmljcyBhbnl3YXkuXG5cdFx0XHRcdHdhaXRpbmcgPSBvZmZzZXRzLnJlZHVjZSgoc3VtLCBwKSA9PiBzdW0gKyBOdW1iZXIucGFyc2VJbnQocC5vZmZzZXQsIDEwKSwgMCk7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0d2FpdGluZyA9IDA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHR3YWl0aW5nLFxuXHRcdFx0YWN0aXZlOiBjb3VudGVycy5hY3RpdmUsXG5cdFx0XHRjb21wbGV0ZWQ6IGNvdW50ZXJzLmNvbXBsZXRlZCxcblx0XHRcdGZhaWxlZDogY291bnRlcnMuZmFpbGVkLFxuXHRcdFx0ZGVsYXllZDogMCxcblx0XHR9O1xuXHR9XG59XG4iXX0=
@@ -102,6 +102,17 @@ export declare class NATSWorkerAdapter implements WorkerAdapter {
102
102
  * Get queue statistics from JetStream consumer info
103
103
  */
104
104
  getQueueStats(queue: string): Promise<WorkerQueueStats>;
105
+ /**
106
+ * v0.7 — dead-letter an exhausted message. Publishes the ORIGINAL payload
107
+ * and headers to the `worker.${deadLetterQueue}` subject so a downstream
108
+ * consumer can inspect/replay it. Plain core publish (not JetStream): the
109
+ * DLQ is a notification subject, not part of the workqueue stream, so we
110
+ * avoid coupling it to stream-subject management. No-op when DLQ is unset.
111
+ *
112
+ * ponytail: core publish, not a persisted DLQ stream. Upgrade to a
113
+ * dedicated DLQ JetStream stream if durable dead-letter storage is needed.
114
+ */
115
+ private deadLetter;
105
116
  /**
106
117
  * Ensure a JetStream stream exists with the given subjects
107
118
  */
@@ -133,12 +133,21 @@ export class NATSWorkerAdapter {
133
133
  const durableName = `blok-worker-${queue}`;
134
134
  // Ensure stream exists with worker subjects
135
135
  await this.ensureStream(streamName, [subject]);
136
+ // v0.7 — `ack: false` selects at-most-once delivery. JetStream PULL
137
+ // consumers reject AckPolicy.None ("consumer in pull mode requires ack
138
+ // policy"), so at-most-once is implemented as AckPolicy.Explicit +
139
+ // max_deliver:1 with the message ACKed on receipt (before the handler
140
+ // runs). The broker then treats the message as delivered+done, so a
141
+ // handler that throws is NOT redelivered — exactly-once delivery even
142
+ // on failure. The manual ack/nak/term path below is a no-op in this mode.
143
+ const atMostOnce = config.ack === false;
136
144
  // Create or update durable pull consumer with worker semantics
137
145
  const ackWaitNs = ((config.timeout ?? 30000) + 5000) * 1_000_000; // timeout + 5s buffer, in nanoseconds
138
146
  await this.jsm.consumers.add(streamName, {
139
147
  durable_name: durableName,
140
148
  ack_policy: nats.AckPolicy.Explicit,
141
- max_deliver: (config.retries ?? 3) + 1, // +1 because first attempt counts
149
+ // at-most-once: deliver exactly once, never redeliver.
150
+ max_deliver: atMostOnce ? 1 : (config.retries ?? 3) + 1, // +1 because first attempt counts
142
151
  ack_wait: ackWaitNs,
143
152
  filter_subjects: [subject],
144
153
  });
@@ -201,19 +210,35 @@ export class NATSWorkerAdapter {
201
210
  timeout: timeout || config.timeout || undefined,
202
211
  raw: msg,
203
212
  complete: async () => {
204
- msg.ack();
213
+ // Already ACKed on receipt under at-most-once; a second ack errors.
214
+ if (!atMostOnce)
215
+ msg.ack();
205
216
  },
206
217
  fail: async (error, requeue) => {
207
218
  if (requeue) {
208
- // nak() tells the server to redeliver
209
- msg.nak();
219
+ // nak() tells the server to redeliver. No-op under
220
+ // at-most-once — the message was already ACKed on receipt.
221
+ if (!atMostOnce)
222
+ msg.nak();
210
223
  }
211
224
  else {
212
- // term() terminates delivery no more retries
213
- msg.term();
225
+ // Terminal failure (retries exhausted / non-requeue).
226
+ // v0.7 — dead-letter the original payload+headers to
227
+ // `worker.${deadLetterQueue}` before terminating so the
228
+ // message isn't silently dropped. No-op when DLQ is unset.
229
+ await this.deadLetter(config.deadLetterQueue, msg.data, msg.headers);
230
+ // term() terminates delivery — no more retries. Already
231
+ // ACKed under at-most-once, so term() is skipped there.
232
+ if (!atMostOnce)
233
+ msg.term();
214
234
  }
215
235
  },
216
236
  };
237
+ // at-most-once — ACK before running the handler so the broker
238
+ // considers the message done. max_deliver:1 already prevents
239
+ // redelivery; this also releases the ack_wait timer immediately.
240
+ if (atMostOnce)
241
+ msg.ack();
217
242
  // Tier 2 polish — enforce `x-delay` header on the consumer side.
218
243
  // NATS JetStream stores `x-delay` as opaque metadata; the broker
219
244
  // does NOT defer delivery on it. We implement consumer-side
@@ -230,7 +255,10 @@ export class NATSWorkerAdapter {
230
255
  catch (error) {
231
256
  console.error(`[NATSWorkerAdapter] Error processing job from ${queue}: ${error.message}`);
232
257
  try {
233
- msg.nak();
258
+ // Under at-most-once there's nothing to nak — the broker isn't
259
+ // tracking delivery, so a handler throw must NOT trigger redelivery.
260
+ if (!atMostOnce)
261
+ msg.nak();
234
262
  }
235
263
  catch {
236
264
  // Already acked/nacked
@@ -332,6 +360,28 @@ export class NATSWorkerAdapter {
332
360
  return { waiting: 0, active: 0, completed: 0, failed: 0, delayed: 0 };
333
361
  }
334
362
  }
363
+ /**
364
+ * v0.7 — dead-letter an exhausted message. Publishes the ORIGINAL payload
365
+ * and headers to the `worker.${deadLetterQueue}` subject so a downstream
366
+ * consumer can inspect/replay it. Plain core publish (not JetStream): the
367
+ * DLQ is a notification subject, not part of the workqueue stream, so we
368
+ * avoid coupling it to stream-subject management. No-op when DLQ is unset.
369
+ *
370
+ * ponytail: core publish, not a persisted DLQ stream. Upgrade to a
371
+ * dedicated DLQ JetStream stream if durable dead-letter storage is needed.
372
+ */
373
+ async deadLetter(deadLetterQueue, data,
374
+ // biome-ignore lint/suspicious/noExplicitAny: NATS MsgHdrs type is dynamically imported
375
+ headers) {
376
+ if (!deadLetterQueue)
377
+ return;
378
+ try {
379
+ this.nc.publish(`worker.${deadLetterQueue}`, data, headers ? { headers } : undefined);
380
+ }
381
+ catch (error) {
382
+ console.error(`[NATSWorkerAdapter] Failed to dead-letter to worker.${deadLetterQueue}: ${error.message}`);
383
+ }
384
+ }
335
385
  /**
336
386
  * Ensure a JetStream stream exists with the given subjects
337
387
  */
@@ -391,4 +441,4 @@ class Semaphore {
391
441
  }
392
442
  }
393
443
  export default NATSWorkerAdapter;
394
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkFUU0FkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlcnMvTkFUU0FkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFHSCxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdsQzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUFhLEVBQUUsU0FBaUIsRUFBRSxLQUFhO0lBQ2xGLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxJQUFJLENBQUM7UUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuQyxNQUFNLFVBQVUsR0FBRyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3JDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFrQkQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBQ3BCLFFBQVEsR0FBRyxNQUFlLENBQUM7SUFFcEMsNkdBQTZHO0lBQ3JHLEVBQUUsR0FBUSxJQUFJLENBQUM7SUFDdkIsa0ZBQWtGO0lBQzFFLEVBQUUsR0FBUSxJQUFJLENBQUM7SUFDdkIsa0ZBQWtGO0lBQzFFLEdBQUcsR0FBUSxJQUFJLENBQUM7SUFDaEIsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixNQUFNLENBQW1CO0lBQ2pDLHNFQUFzRTtJQUM5RCxTQUFTLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDaEQscUVBQXFFO0lBQzdELGdCQUFnQixHQUFxQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRXZELFlBQVksTUFBa0M7UUFDN0MsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNiLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUksZ0JBQWdC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LENBQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPO1FBQ04sTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1YsSUFBSSxFQUFFLENBQUM7UUFDUixDQUFDO2FBQU0sQ0FBQztZQUNQLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoQixDQUFDO0lBQ0YsQ0FBQztDQUNEO0FBRUQsZUFBZSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTkFUU0FkYXB0ZXIgLSBOQVRTIEpldFN0cmVhbSB3b3JrZXIgYWRhcHRlciBmb3IgV29ya2VyVHJpZ2dlclxuICpcbiAqIFVzZXMgTkFUUyBKZXRTdHJlYW0gZm9yIHBlcnNpc3RlbnQgYmFja2dyb3VuZCBqb2IgcHJvY2Vzc2luZyB3aXRoOlxuICogLSBQdWxsLWJhc2VkIGNvbnN1bWVycyB3aXRoIGNvbmZpZ3VyYWJsZSBjb25jdXJyZW5jeVxuICogLSBTZXJ2ZXItc2lkZSByZXRyeSBjb25maWcgKG1heF9kZWxpdmVyKVxuICogLSBBY2sgd2FpdCBmb3Igam9iIHRpbWVvdXRzXG4gKiAtIFByaW9yaXR5IHZpYSBtZXNzYWdlIGhlYWRlcnNcbiAqIC0gRGVsYXllZCBqb2Igc2NoZWR1bGluZ1xuICogLSBRdWV1ZSBzdGF0aXN0aWNzIHZpYSBjb25zdW1lciBpbmZvXG4gKlxuICogUmVxdWlyZXM6IG5wbSBpbnN0YWxsIG5hdHNcbiAqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiAtIE5BVFNfU0VSVkVSUzogQ29tbWEtc2VwYXJhdGVkIE5BVFMgc2VydmVyIFVSTHMgKGRlZmF1bHQ6IGxvY2FsaG9zdDo0MjIyKVxuICogLSBOQVRTX1RPS0VOOiBBdXRoZW50aWNhdGlvbiB0b2tlbiAob3B0aW9uYWwpXG4gKiAtIE5BVFNfVVNFUjogVXNlcm5hbWUgZm9yIGF1dGggKG9wdGlvbmFsKVxuICogLSBOQVRTX1BBU1M6IFBhc3N3b3JkIGZvciBhdXRoIChvcHRpb25hbClcbiAqIC0gTkFUU19TVFJFQU1fTkFNRTogSmV0U3RyZWFtIHN0cmVhbSBuYW1lIChkZWZhdWx0OiBibG9rLXdvcmtlcilcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFdvcmtlclRyaWdnZXJPcHRzIH0gZnJvbSBcIkBibG9ranMvaGVscGVyXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB0eXBlIHsgV29ya2VyQWRhcHRlciwgV29ya2VySm9iLCBXb3JrZXJRdWV1ZVN0YXRzIH0gZnJvbSBcIi4uL1dvcmtlclRyaWdnZXJcIjtcblxuLyoqXG4gKiBUaWVyIDIgcG9saXNoIOKAlCBjb21wdXRlIHRoZSBjb25zdW1lci1zaWRlIGhvbGQgdGltZSBmb3IgYSBOQVRTIG1lc3NhZ2VcbiAqIHdpdGggYW4gYHgtZGVsYXlgIGhlYWRlci4gTkFUUyBKZXRTdHJlYW0gc3RvcmVzIGB4LWRlbGF5YCBhcyBvcGFxdWVcbiAqIG1ldGFkYXRhOyB0aGUgYnJva2VyIGRvZXMgTk9UIGRlZmVyIGRlbGl2ZXJ5IG9uIGl0LiBUaGUgY29uc3VtZXIgaXNcbiAqIHJlc3BvbnNpYmxlIGZvciBob25vdXJpbmcgdGhlIGRlbGF5IGJldHdlZW4gdGhlIG1lc3NhZ2UncyBmaXJzdC1wdWJsaXNoXG4gKiB0aW1lc3RhbXAgYW5kIGBjcmVhdGVkTXMgKyBkZWxheWAuXG4gKlxuICogUmV0dXJucyB0aGUgbWlsbGlzZWNvbmRzIHRvIHdhaXQuIENsYW1wcyB0byA+PSAwOyByZXR1cm5zIDAgd2hlbiB0aGVcbiAqIGRlbGF5IGhhcyBhbHJlYWR5IGVsYXBzZWQgKHRoZSBtZXNzYWdlIHdhcyBxdWV1ZWQgZm9yIGxvbmdlciB0aGFuIHRoZVxuICogZGVsYXkpIG9yIHdoZW4gbm8gZGVsYXkgd2FzIHNldC5cbiAqXG4gKiBFeHBvcnRlZCBmb3IgdW5pdCB0ZXN0YWJpbGl0eSDigJQgdGhlIGNvbnN1bWVyIG1lc3NhZ2UgaGFuZGxlciBpblxuICogYE5BVFNXb3JrZXJBZGFwdGVyLnByb2Nlc3MoKWAgbW9ja3MgdGhlIE5BVFMgY2xpZW50IGV4dGVuc2l2ZWx5LCBzb1xuICogaXNvbGF0aW5nIHRoZSBtYXRoIGhlcmUga2VlcHMgdGhlIHN1cmZhY2UgZWFzeSB0byB2ZXJpZnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlWERlbGF5SG9sZE1zKGRlbGF5OiBudW1iZXIsIGNyZWF0ZWRNczogbnVtYmVyLCBub3dNczogbnVtYmVyKTogbnVtYmVyIHtcblx0aWYgKCFkZWxheSB8fCBkZWxheSA8PSAwKSByZXR1cm4gMDtcblx0Y29uc3QgZGlzcGF0Y2hBdCA9IGNyZWF0ZWRNcyArIGRlbGF5O1xuXHRyZXR1cm4gTWF0aC5tYXgoMCwgZGlzcGF0Y2hBdCAtIG5vd01zKTtcbn1cblxuLyoqXG4gKiBOQVRTIHdvcmtlciBhZGFwdGVyIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOQVRTV29ya2VyQ29uZmlnIHtcblx0LyoqIE5BVFMgc2VydmVyIFVSTHMgKi9cblx0c2VydmVyczogc3RyaW5nW107XG5cdC8qKiBBdXRoZW50aWNhdGlvbiB0b2tlbiAqL1xuXHR0b2tlbj86IHN0cmluZztcblx0LyoqIFVzZXJuYW1lICovXG5cdHVzZXI/OiBzdHJpbmc7XG5cdC8qKiBQYXNzd29yZCAqL1xuXHRwYXNzPzogc3RyaW5nO1xuXHQvKiogSmV0U3RyZWFtIHN0cmVhbSBuYW1lIChkZWZhdWx0OiBcImJsb2std29ya2VyXCIpICovXG5cdHN0cmVhbU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTkFUU1dvcmtlckFkYXB0ZXIgLSBOQVRTIEpldFN0cmVhbSBpbXBsZW1lbnRhdGlvbiBvZiBXb3JrZXJBZGFwdGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBOQVRTV29ya2VyQWRhcHRlciBpbXBsZW1lbnRzIFdvcmtlckFkYXB0ZXIge1xuXHRyZWFkb25seSBwcm92aWRlciA9IFwibmF0c1wiIGFzIGNvbnN0O1xuXG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTkFUUyB0eXBlcyBhcmUgZHluYW1pY2FsbHkgaW1wb3J0ZWQgKG9wdGlvbmFsIHBlZXIgZGVwZW5kZW5jeSlcblx0cHJpdmF0ZSBuYzogYW55ID0gbnVsbDtcblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOQVRTIHR5cGVzIGFyZSBkeW5hbWljYWxseSBpbXBvcnRlZFxuXHRwcml2YXRlIGpzOiBhbnkgPSBudWxsO1xuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5BVFMgdHlwZXMgYXJlIGR5bmFtaWNhbGx5IGltcG9ydGVkXG5cdHByaXZhdGUganNtOiBhbnkgPSBudWxsO1xuXHRwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGNvbmZpZzogTkFUU1dvcmtlckNvbmZpZztcblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOQVRTIGNvbnN1bWVyIGluc3RhbmNlc1xuXHRwcml2YXRlIGNvbnN1bWVyczogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOQVRTIGNvbnN1bWUgaXRlcmF0b3JzXG5cdHByaXZhdGUgY29uc3VtZUl0ZXJhdG9yczogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcblxuXHRjb25zdHJ1Y3Rvcihjb25maWc/OiBQYXJ0aWFsPE5BVFNXb3JrZXJDb25maWc+KSB7XG5cdFx0dGhpcy5jb25maWcgPSB7XG5cdFx0XHRzZXJ2ZXJzOiBjb25maWc/LnNlcnZlcnMgfHwgKHByb2Nlc3MuZW52Lk5BVFNfU0VSVkVSUyB8fCBcImxvY2FsaG9zdDo0MjIyXCIpLnNwbGl0KFwiLFwiKSxcblx0XHRcdHRva2VuOiBjb25maWc/LnRva2VuIHx8IHByb2Nlc3MuZW52Lk5BVFNfVE9LRU4sXG5cdFx0XHR1c2VyOiBjb25maWc/LnVzZXIgfHwgcHJvY2Vzcy5lbnYuTkFUU19VU0VSLFxuXHRcdFx0cGFzczogY29uZmlnPy5wYXNzIHx8IHByb2Nlc3MuZW52Lk5BVFNfUEFTUyxcblx0XHRcdHN0cmVhbU5hbWU6IGNvbmZpZz8uc3RyZWFtTmFtZSB8fCBwcm9jZXNzLmVudi5OQVRTX1NUUkVBTV9OQU1FIHx8IFwiYmxvay13b3JrZXJcIixcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbm5lY3QgdG8gTkFUUyBhbmQgaW5pdGlhbGl6ZSBKZXRTdHJlYW1cblx0ICovXG5cdGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGVkKSByZXR1cm47XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbmF0cyA9IGF3YWl0IGltcG9ydChcIm5hdHNcIik7XG5cblx0XHRcdGNvbnN0IGNvbm5lY3RPcHRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcblx0XHRcdFx0c2VydmVyczogdGhpcy5jb25maWcuc2VydmVycyxcblx0XHRcdH07XG5cblx0XHRcdGlmICh0aGlzLmNvbmZpZy50b2tlbikgY29ubmVjdE9wdHMudG9rZW4gPSB0aGlzLmNvbmZpZy50b2tlbjtcblx0XHRcdGlmICh0aGlzLmNvbmZpZy51c2VyKSBjb25uZWN0T3B0cy51c2VyID0gdGhpcy5jb25maWcudXNlcjtcblx0XHRcdGlmICh0aGlzLmNvbmZpZy5wYXNzKSBjb25uZWN0T3B0cy5wYXNzID0gdGhpcy5jb25maWcucGFzcztcblxuXHRcdFx0dGhpcy5uYyA9IGF3YWl0IG5hdHMuY29ubmVjdChjb25uZWN0T3B0cyk7XG5cdFx0XHR0aGlzLmpzID0gdGhpcy5uYy5qZXRzdHJlYW0oKTtcblx0XHRcdHRoaXMuanNtID0gYXdhaXQgdGhpcy5uYy5qZXRzdHJlYW1NYW5hZ2VyKCk7XG5cblx0XHRcdHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcblx0XHRcdGNvbnNvbGUubG9nKGBbTkFUU1dvcmtlckFkYXB0ZXJdIENvbm5lY3RlZCB0byBOQVRTOiAke3RoaXMuY29uZmlnLnNlcnZlcnMuam9pbihcIiwgXCIpfWApO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdGBGYWlsZWQgdG8gY29ubmVjdCB0byBOQVRTOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX0uIE1ha2Ugc3VyZSBuYXRzIGlzIGluc3RhbGxlZDogbnBtIGluc3RhbGwgbmF0c2AsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNjb25uZWN0IGZyb20gTkFUU1xuXHQgKi9cblx0YXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSByZXR1cm47XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gU3RvcCBhbGwgY29uc3VtZSBpdGVyYXRvcnNcblx0XHRcdGZvciAoY29uc3QgWywgaXRlcl0gb2YgdGhpcy5jb25zdW1lSXRlcmF0b3JzKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0aXRlci5zdG9wKCk7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdC8vIEl0ZXJhdG9yIG1heSBhbHJlYWR5IGJlIHN0b3BwZWRcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5jb25zdW1lSXRlcmF0b3JzLmNsZWFyKCk7XG5cdFx0XHR0aGlzLmNvbnN1bWVycy5jbGVhcigpO1xuXG5cdFx0XHRhd2FpdCB0aGlzLm5jLmRyYWluKCk7XG5cdFx0XHR0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuXHRcdFx0Y29uc29sZS5sb2coXCJbTkFUU1dvcmtlckFkYXB0ZXJdIERpc2Nvbm5lY3RlZCBmcm9tIE5BVFNcIik7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYFtOQVRTV29ya2VyQWRhcHRlcl0gRGlzY29ubmVjdCBlcnJvcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN0YXJ0IHByb2Nlc3Npbmcgam9icyBmcm9tIGEgcXVldWVcblx0ICovXG5cdGFzeW5jIHByb2Nlc3MoY29uZmlnOiBXb3JrZXJUcmlnZ2VyT3B0cywgaGFuZGxlcjogKGpvYjogV29ya2VySm9iKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm90IGNvbm5lY3RlZC4gQ2FsbCBjb25uZWN0KCkgZmlyc3QuXCIpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG5hdHMgPSBhd2FpdCBpbXBvcnQoXCJuYXRzXCIpO1xuXHRcdGNvbnN0IHF1ZXVlID0gY29uZmlnLnF1ZXVlO1xuXHRcdGNvbnN0IHN0cmVhbU5hbWUgPSB0aGlzLmNvbmZpZy5zdHJlYW1OYW1lIHx8IFwiYmxvay13b3JrZXJcIjtcblx0XHRjb25zdCBzdWJqZWN0ID0gYHdvcmtlci4ke3F1ZXVlfWA7XG5cdFx0Y29uc3QgZHVyYWJsZU5hbWUgPSBgYmxvay13b3JrZXItJHtxdWV1ZX1gO1xuXG5cdFx0Ly8gRW5zdXJlIHN0cmVhbSBleGlzdHMgd2l0aCB3b3JrZXIgc3ViamVjdHNcblx0XHRhd2FpdCB0aGlzLmVuc3VyZVN0cmVhbShzdHJlYW1OYW1lLCBbc3ViamVjdF0pO1xuXG5cdFx0Ly8gQ3JlYXRlIG9yIHVwZGF0ZSBkdXJhYmxlIHB1bGwgY29uc3VtZXIgd2l0aCB3b3JrZXIgc2VtYW50aWNzXG5cdFx0Y29uc3QgYWNrV2FpdE5zID0gKChjb25maWcudGltZW91dCA/PyAzMDAwMCkgKyA1MDAwKSAqIDFfMDAwXzAwMDsgLy8gdGltZW91dCArIDVzIGJ1ZmZlciwgaW4gbmFub3NlY29uZHNcblx0XHRhd2FpdCB0aGlzLmpzbS5jb25zdW1lcnMuYWRkKHN0cmVhbU5hbWUsIHtcblx0XHRcdGR1cmFibGVfbmFtZTogZHVyYWJsZU5hbWUsXG5cdFx0XHRhY2tfcG9saWN5OiBuYXRzLkFja1BvbGljeS5FeHBsaWNpdCxcblx0XHRcdG1heF9kZWxpdmVyOiAoY29uZmlnLnJldHJpZXMgPz8gMykgKyAxLCAvLyArMSBiZWNhdXNlIGZpcnN0IGF0dGVtcHQgY291bnRzXG5cdFx0XHRhY2tfd2FpdDogYWNrV2FpdE5zLFxuXHRcdFx0ZmlsdGVyX3N1YmplY3RzOiBbc3ViamVjdF0sXG5cdFx0fSk7XG5cblx0XHQvLyBHZXQgY29uc3VtZXIgaGFuZGxlXG5cdFx0Y29uc3QgY29uc3VtZXIgPSBhd2FpdCB0aGlzLmpzLmNvbnN1bWVycy5nZXQoc3RyZWFtTmFtZSwgZHVyYWJsZU5hbWUpO1xuXHRcdHRoaXMuY29uc3VtZXJzLnNldChxdWV1ZSwgY29uc3VtZXIpO1xuXG5cdFx0Ly8gU3RhcnQgY29uc3VtaW5nXG5cdFx0Y29uc3QgaXRlciA9IGF3YWl0IGNvbnN1bWVyLmNvbnN1bWUoKTtcblx0XHR0aGlzLmNvbnN1bWVJdGVyYXRvcnMuc2V0KHF1ZXVlLCBpdGVyKTtcblxuXHRcdC8vIFByb2Nlc3Mgam9icyBpbiBiYWNrZ3JvdW5kXG5cdFx0KGFzeW5jICgpID0+IHtcblx0XHRcdGNvbnN0IHNlbWFwaG9yZSA9IG5ldyBTZW1hcGhvcmUoY29uZmlnLmNvbmN1cnJlbmN5ID8/IDEpO1xuXG5cdFx0XHRmb3IgYXdhaXQgKGNvbnN0IG1zZyBvZiBpdGVyKSB7XG5cdFx0XHRcdGF3YWl0IHNlbWFwaG9yZS5hY3F1aXJlKCk7XG5cblx0XHRcdFx0Ly8gUHJvY2VzcyBlYWNoIGpvYiBjb25jdXJyZW50bHkgdXAgdG8gY29uY3VycmVuY3kgbGltaXRcblx0XHRcdFx0KGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Ly8gUGFyc2Ugam9iIGRhdGFcblx0XHRcdFx0XHRcdGxldCBkYXRhOiB1bmtub3duO1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY29kZWMgPSBuYXRzLkpTT05Db2RlYygpO1xuXHRcdFx0XHRcdFx0XHRkYXRhID0gY29kZWMuZGVjb2RlKG1zZy5kYXRhKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNjID0gbmF0cy5TdHJpbmdDb2RlYygpO1xuXHRcdFx0XHRcdFx0XHRcdGRhdGEgPSBKU09OLnBhcnNlKHNjLmRlY29kZShtc2cuZGF0YSkpO1xuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRcdFx0XHRkYXRhID0gbXNnLmRhdGE7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gRXh0cmFjdCBoZWFkZXJzXG5cdFx0XHRcdFx0XHRjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cdFx0XHRcdFx0XHRpZiAobXNnLmhlYWRlcnMpIHtcblx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZXNdIG9mIG1zZy5oZWFkZXJzKSB7XG5cdFx0XHRcdFx0XHRcdFx0aGVhZGVyc1trZXldID0gQXJyYXkuaXNBcnJheSh2YWx1ZXMpID8gdmFsdWVzWzBdIDogdmFsdWVzO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEV4dHJhY3Qgam9iIG1ldGFkYXRhIGZyb20gaGVhZGVyc1xuXHRcdFx0XHRcdFx0Y29uc3Qgam9iSWQgPSBoZWFkZXJzW1wieC1qb2ItaWRcIl0gfHwgbXNnLmhlYWRlcnM/LmdldChcIk5hdHMtTXNnLUlkXCIpIHx8IHV1aWQoKTtcblx0XHRcdFx0XHRcdGNvbnN0IHByaW9yaXR5ID0gTnVtYmVyLnBhcnNlSW50KGhlYWRlcnNbXCJ4LXByaW9yaXR5XCJdIHx8IFwiMFwiLCAxMCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkZWxheSA9IE51bWJlci5wYXJzZUludChoZWFkZXJzW1wieC1kZWxheVwiXSB8fCBcIjBcIiwgMTApO1xuXHRcdFx0XHRcdFx0Y29uc3QgdGltZW91dCA9IE51bWJlci5wYXJzZUludChoZWFkZXJzW1wieC10aW1lb3V0XCJdIHx8IFwiMFwiLCAxMCk7XG5cblx0XHRcdFx0XHRcdC8vIEdldCByZWRlbGl2ZXJ5IGNvdW50IChhdHRlbXB0cylcblx0XHRcdFx0XHRcdGNvbnN0IGluZm8gPSBtc2cuaW5mbztcblx0XHRcdFx0XHRcdGNvbnN0IGF0dGVtcHRzID0gaW5mby5yZWRlbGl2ZXJ5Q291bnQgPz8gMDtcblx0XHRcdFx0XHRcdGNvbnN0IG1heFJldHJpZXMgPSBjb25maWcucmV0cmllcyA/PyAzO1xuXG5cdFx0XHRcdFx0XHQvLyBDcmVhdGUgV29ya2VySm9iXG5cdFx0XHRcdFx0XHRjb25zdCB3b3JrZXJKb2I6IFdvcmtlckpvYiA9IHtcblx0XHRcdFx0XHRcdFx0aWQ6IGpvYklkLFxuXHRcdFx0XHRcdFx0XHRkYXRhLFxuXHRcdFx0XHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRcdFx0XHRxdWV1ZSxcblx0XHRcdFx0XHRcdFx0cHJpb3JpdHksXG5cdFx0XHRcdFx0XHRcdGF0dGVtcHRzLFxuXHRcdFx0XHRcdFx0XHRtYXhSZXRyaWVzLFxuXHRcdFx0XHRcdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKFxuXHRcdFx0XHRcdFx0XHRcdGluZm8udGltZXN0YW1wTmFub3MgPyBNYXRoLmZsb29yKE51bWJlcihpbmZvLnRpbWVzdGFtcE5hbm9zKSAvIDFfMDAwXzAwMCkgOiBEYXRlLm5vdygpLFxuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRkZWxheTogZGVsYXkgfHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHR0aW1lb3V0OiB0aW1lb3V0IHx8IGNvbmZpZy50aW1lb3V0IHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0cmF3OiBtc2csXG5cdFx0XHRcdFx0XHRcdGNvbXBsZXRlOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0bXNnLmFjaygpO1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRmYWlsOiBhc3luYyAoZXJyb3I6IEVycm9yLCByZXF1ZXVlPzogYm9vbGVhbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChyZXF1ZXVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBuYWsoKSB0ZWxscyB0aGUgc2VydmVyIHRvIHJlZGVsaXZlclxuXHRcdFx0XHRcdFx0XHRcdFx0bXNnLm5haygpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyB0ZXJtKCkgdGVybWluYXRlcyBkZWxpdmVyeSDigJQgbm8gbW9yZSByZXRyaWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRtc2cudGVybSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdC8vIFRpZXIgMiBwb2xpc2gg4oCUIGVuZm9yY2UgYHgtZGVsYXlgIGhlYWRlciBvbiB0aGUgY29uc3VtZXIgc2lkZS5cblx0XHRcdFx0XHRcdC8vIE5BVFMgSmV0U3RyZWFtIHN0b3JlcyBgeC1kZWxheWAgYXMgb3BhcXVlIG1ldGFkYXRhOyB0aGUgYnJva2VyXG5cdFx0XHRcdFx0XHQvLyBkb2VzIE5PVCBkZWZlciBkZWxpdmVyeSBvbiBpdC4gV2UgaW1wbGVtZW50IGNvbnN1bWVyLXNpZGVcblx0XHRcdFx0XHRcdC8vIGhvbGRpbmcgaGVyZS4gY3JlYXRlZE1zIGlzIHRoZSBtZXNzYWdlJ3MgZmlyc3QtcHVibGlzaCB0aW1lc3RhbXA7XG5cdFx0XHRcdFx0XHQvLyBob2xkIHVudGlsIGNyZWF0ZWRNcyArIGRlbGF5LiBTaW5nbGUtcHJvY2VzcyBzZW1hbnRpY3Mg4oCUIGZvclxuXHRcdFx0XHRcdFx0Ly8gbG9uZyBkZWZlcnJhbHMsIHByZWZlciB0cmlnZ2VyLWxldmVsIGBkZWxheWAgKERlZmVycmVkUnVuU2NoZWR1bGVyKS5cblx0XHRcdFx0XHRcdGNvbnN0IGNyZWF0ZWRNcyA9IGluZm8udGltZXN0YW1wTmFub3MgPyBNYXRoLmZsb29yKE51bWJlcihpbmZvLnRpbWVzdGFtcE5hbm9zKSAvIDFfMDAwXzAwMCkgOiBEYXRlLm5vdygpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgd2FpdE1zID0gY29tcHV0ZVhEZWxheUhvbGRNcyhkZWxheSwgY3JlYXRlZE1zLCBEYXRlLm5vdygpKTtcblx0XHRcdFx0XHRcdGlmICh3YWl0TXMgPiAwKSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHdhaXRNcykpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRhd2FpdCBoYW5kbGVyKHdvcmtlckpvYik7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoYFtOQVRTV29ya2VyQWRhcHRlcl0gRXJyb3IgcHJvY2Vzc2luZyBqb2IgZnJvbSAke3F1ZXVlfTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRtc2cubmFrKCk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHRcdFx0Ly8gQWxyZWFkeSBhY2tlZC9uYWNrZWRcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0c2VtYXBob3JlLnJlbGVhc2UoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pKCk7XG5cdFx0XHR9XG5cdFx0fSkoKTtcblxuXHRcdGNvbnNvbGUubG9nKFxuXHRcdFx0YFtOQVRTV29ya2VyQWRhcHRlcl0gUHJvY2Vzc2luZyBxdWV1ZTogJHtxdWV1ZX0gKGNvbmN1cnJlbmN5PSR7Y29uZmlnLmNvbmN1cnJlbmN5ID8/IDF9LCByZXRyaWVzPSR7Y29uZmlnLnJldHJpZXMgPz8gM30pYCxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGpvYiB0byBhIHdvcmtlciBxdWV1ZVxuXHQgKi9cblx0YXN5bmMgYWRkSm9iKFxuXHRcdHF1ZXVlOiBzdHJpbmcsXG5cdFx0ZGF0YTogdW5rbm93bixcblx0XHRvcHRzPzoge1xuXHRcdFx0cHJpb3JpdHk/OiBudW1iZXI7XG5cdFx0XHRkZWxheT86IG51bWJlcjtcblx0XHRcdHJldHJpZXM/OiBudW1iZXI7XG5cdFx0XHR0aW1lb3V0PzogbnVtYmVyO1xuXHRcdFx0am9iSWQ/OiBzdHJpbmc7XG5cdFx0fSxcblx0KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJOb3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbmF0cyA9IGF3YWl0IGltcG9ydChcIm5hdHNcIik7XG5cdFx0Y29uc3Qgc3ViamVjdCA9IGB3b3JrZXIuJHtxdWV1ZX1gO1xuXHRcdGNvbnN0IHN0cmVhbU5hbWUgPSB0aGlzLmNvbmZpZy5zdHJlYW1OYW1lIHx8IFwiYmxvay13b3JrZXJcIjtcblxuXHRcdC8vIEVuc3VyZSBzdHJlYW0gaGFzIHRoaXMgc3ViamVjdFxuXHRcdGF3YWl0IHRoaXMuZW5zdXJlU3RyZWFtKHN0cmVhbU5hbWUsIFtzdWJqZWN0XSk7XG5cblx0XHQvLyBCdWlsZCBoZWFkZXJzIHdpdGggam9iIG1ldGFkYXRhXG5cdFx0Y29uc3QgaGRycyA9IG5hdHMuaGVhZGVycygpO1xuXHRcdGNvbnN0IGpvYklkID0gb3B0cz8uam9iSWQgfHwgdXVpZCgpO1xuXHRcdGhkcnMuc2V0KFwieC1qb2ItaWRcIiwgam9iSWQpO1xuXHRcdGhkcnMuc2V0KFwiTmF0cy1Nc2ctSWRcIiwgam9iSWQpOyAvLyBEZWR1cGxpY2F0aW9uXG5cdFx0aWYgKG9wdHM/LnByaW9yaXR5KSBoZHJzLnNldChcIngtcHJpb3JpdHlcIiwgU3RyaW5nKG9wdHMucHJpb3JpdHkpKTtcblx0XHRpZiAob3B0cz8uZGVsYXkpIGhkcnMuc2V0KFwieC1kZWxheVwiLCBTdHJpbmcob3B0cy5kZWxheSkpO1xuXHRcdGlmIChvcHRzPy50aW1lb3V0KSBoZHJzLnNldChcIngtdGltZW91dFwiLCBTdHJpbmcob3B0cy50aW1lb3V0KSk7XG5cblx0XHQvLyBFbmNvZGUgYW5kIHB1Ymxpc2hcblx0XHRjb25zdCBjb2RlYyA9IG5hdHMuSlNPTkNvZGVjKCk7XG5cdFx0YXdhaXQgdGhpcy5qcy5wdWJsaXNoKHN1YmplY3QsIGNvZGVjLmVuY29kZShkYXRhKSwgeyBoZWFkZXJzOiBoZHJzIH0pO1xuXG5cdFx0cmV0dXJuIGpvYklkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFN0b3AgcHJvY2Vzc2luZyBhIHNwZWNpZmljIHF1ZXVlXG5cdCAqL1xuXHRhc3luYyBzdG9wUHJvY2Vzc2luZyhxdWV1ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgaXRlciA9IHRoaXMuY29uc3VtZUl0ZXJhdG9ycy5nZXQocXVldWUpO1xuXHRcdGlmIChpdGVyKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpdGVyLnN0b3AoKTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHQvLyBBbHJlYWR5IHN0b3BwZWRcblx0XHRcdH1cblx0XHRcdHRoaXMuY29uc3VtZUl0ZXJhdG9ycy5kZWxldGUocXVldWUpO1xuXHRcdH1cblx0XHR0aGlzLmNvbnN1bWVycy5kZWxldGUocXVldWUpO1xuXHRcdGNvbnNvbGUubG9nKGBbTkFUU1dvcmtlckFkYXB0ZXJdIFN0b3BwZWQgcHJvY2Vzc2luZyBxdWV1ZTogJHtxdWV1ZX1gKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVjayBpZiBjb25uZWN0ZWRcblx0ICovXG5cdGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmNvbm5lY3RlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBIZWFsdGggY2hlY2tcblx0ICovXG5cdGFzeW5jIGhlYWx0aENoZWNrKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQgfHwgIXRoaXMubmMpIHJldHVybiBmYWxzZTtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgaW5mbyA9IHRoaXMubmMuaW5mbztcblx0XHRcdHJldHVybiBpbmZvICE9PSB1bmRlZmluZWQ7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBxdWV1ZSBzdGF0aXN0aWNzIGZyb20gSmV0U3RyZWFtIGNvbnN1bWVyIGluZm9cblx0ICovXG5cdGFzeW5jIGdldFF1ZXVlU3RhdHMocXVldWU6IHN0cmluZyk6IFByb21pc2U8V29ya2VyUXVldWVTdGF0cz4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHtcblx0XHRcdHJldHVybiB7IHdhaXRpbmc6IDAsIGFjdGl2ZTogMCwgY29tcGxldGVkOiAwLCBmYWlsZWQ6IDAsIGRlbGF5ZWQ6IDAgfTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgc3RyZWFtTmFtZSA9IHRoaXMuY29uZmlnLnN0cmVhbU5hbWUgfHwgXCJibG9rLXdvcmtlclwiO1xuXHRcdFx0Y29uc3QgZHVyYWJsZU5hbWUgPSBgYmxvay13b3JrZXItJHtxdWV1ZX1gO1xuXG5cdFx0XHRjb25zdCBpbmZvID0gYXdhaXQgdGhpcy5qc20uY29uc3VtZXJzLmluZm8oc3RyZWFtTmFtZSwgZHVyYWJsZU5hbWUpO1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR3YWl0aW5nOiBpbmZvLm51bV9wZW5kaW5nID8/IDAsXG5cdFx0XHRcdGFjdGl2ZTogaW5mby5udW1fYWNrX3BlbmRpbmcgPz8gMCxcblx0XHRcdFx0Y29tcGxldGVkOiBpbmZvLmRlbGl2ZXJlZD8uY29uc3VtZXJfc2VxID8/IDAsXG5cdFx0XHRcdGZhaWxlZDogaW5mby5udW1fcmVkZWxpdmVyZWQgPz8gMCxcblx0XHRcdFx0ZGVsYXllZDogMCwgLy8gTkFUUyBkb2Vzbid0IGhhdmUgYSBuYXRpdmUgZGVsYXllZCBjb3VudFxuXHRcdFx0fTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiB7IHdhaXRpbmc6IDAsIGFjdGl2ZTogMCwgY29tcGxldGVkOiAwLCBmYWlsZWQ6IDAsIGRlbGF5ZWQ6IDAgfTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRW5zdXJlIGEgSmV0U3RyZWFtIHN0cmVhbSBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gc3ViamVjdHNcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZW5zdXJlU3RyZWFtKG5hbWU6IHN0cmluZywgc3ViamVjdHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGluZm8gPSBhd2FpdCB0aGlzLmpzbS5zdHJlYW1zLmluZm8obmFtZSk7XG5cblx0XHRcdC8vIE1lcmdlIG5ldyBzdWJqZWN0cyB3aXRoIGV4aXN0aW5nXG5cdFx0XHRjb25zdCBleGlzdGluZ1N1YmplY3RzID0gaW5mby5jb25maWcuc3ViamVjdHMgfHwgW107XG5cdFx0XHRjb25zdCBhbGxTdWJqZWN0cyA9IFsuLi5uZXcgU2V0KFsuLi5leGlzdGluZ1N1YmplY3RzLCAuLi5zdWJqZWN0c10pXTtcblxuXHRcdFx0aWYgKGFsbFN1YmplY3RzLmxlbmd0aCAhPT0gZXhpc3RpbmdTdWJqZWN0cy5sZW5ndGgpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5qc20uc3RyZWFtcy51cGRhdGUobmFtZSwge1xuXHRcdFx0XHRcdC4uLmluZm8uY29uZmlnLFxuXHRcdFx0XHRcdHN1YmplY3RzOiBhbGxTdWJqZWN0cyxcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHQvLyBTdHJlYW0gZG9lc24ndCBleGlzdCwgY3JlYXRlIGl0XG5cdFx0XHRhd2FpdCB0aGlzLmpzbS5zdHJlYW1zLmFkZCh7XG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdHN1YmplY3RzLFxuXHRcdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IG5hdHMgSmV0U3RyZWFtIHJldGVudGlvbiBwb2xpY3kgZW51bVxuXHRcdFx0XHRyZXRlbnRpb246IFwid29ya3F1ZXVlXCIgYXMgYW55LFxuXHRcdFx0XHRtYXhfZGVsaXZlcjogNCwgLy8gZGVmYXVsdDogMyByZXRyaWVzICsgMSBpbml0aWFsIGF0dGVtcHRcblx0XHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBuYXRzIEpldFN0cmVhbSBzdG9yYWdlIHR5cGUgZW51bVxuXHRcdFx0XHRzdG9yYWdlOiBcImZpbGVcIiBhcyBhbnksXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBTaW1wbGUgc2VtYXBob3JlIGZvciBjb25jdXJyZW5jeSBjb250cm9sXG4gKi9cbmNsYXNzIFNlbWFwaG9yZSB7XG5cdHByaXZhdGUgcGVybWl0czogbnVtYmVyO1xuXHRwcml2YXRlIHdhaXRpbmc6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cblx0Y29uc3RydWN0b3IocGVybWl0czogbnVtYmVyKSB7XG5cdFx0dGhpcy5wZXJtaXRzID0gcGVybWl0cztcblx0fVxuXG5cdGFzeW5jIGFjcXVpcmUoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMucGVybWl0cyA+IDApIHtcblx0XHRcdHRoaXMucGVybWl0cy0tO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdHRoaXMud2FpdGluZy5wdXNoKHJlc29sdmUpO1xuXHRcdH0pO1xuXHR9XG5cblx0cmVsZWFzZSgpOiB2b2lkIHtcblx0XHRjb25zdCBuZXh0ID0gdGhpcy53YWl0aW5nLnNoaWZ0KCk7XG5cdFx0aWYgKG5leHQpIHtcblx0XHRcdG5leHQoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5wZXJtaXRzKys7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE5BVFNXb3JrZXJBZGFwdGVyO1xuIl19
444
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkFUU0FkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlcnMvTkFUU0FkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFHSCxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdsQzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUFhLEVBQUUsU0FBaUIsRUFBRSxLQUFhO0lBQ2xGLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxJQUFJLENBQUM7UUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuQyxNQUFNLFVBQVUsR0FBRyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3JDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFrQkQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBQ3BCLFFBQVEsR0FBRyxNQUFlLENBQUM7SUFFcEMsNkdBQTZHO0lBQ3JHLEVBQUUsR0FBUSxJQUFJLENBQUM7SUFDdkIsa0ZBQWtGO0lBQzFFLEVBQUUsR0FBUSxJQUFJLENBQUM7SUFDdkIsa0ZBQWtGO0lBQzFFLEdBQUcsR0FBUSxJQUFJLENBQUM7SUFDaEIsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixNQUFNLENBQW1CO0lBQ2pDLHNFQUFzRTtJQUM5RCxTQUFTLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDaEQscUVBQXFFO0lBQzdELGdCQUFnQixHQUFxQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRXZELFlBQVksTUFBa0M7UUFDN0MsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNiLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUksZ0JBQWdC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QUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsT0FBTztRQUNSLENBQUM7UUFDRCxPQUFPLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDcEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTztRQUNOLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNWLElBQUksRUFBRSxDQUFDO1FBQ1IsQ0FBQzthQUFNLENBQUM7WUFDUCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEIsQ0FBQztJQUNGLENBQUM7Q0FDRDtBQUVELGVBQWUsaUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE5BVFNBZGFwdGVyIC0gTkFUUyBKZXRTdHJlYW0gd29ya2VyIGFkYXB0ZXIgZm9yIFdvcmtlclRyaWdnZXJcbiAqXG4gKiBVc2VzIE5BVFMgSmV0U3RyZWFtIGZvciBwZXJzaXN0ZW50IGJhY2tncm91bmQgam9iIHByb2Nlc3Npbmcgd2l0aDpcbiAqIC0gUHVsbC1iYXNlZCBjb25zdW1lcnMgd2l0aCBjb25maWd1cmFibGUgY29uY3VycmVuY3lcbiAqIC0gU2VydmVyLXNpZGUgcmV0cnkgY29uZmlnIChtYXhfZGVsaXZlcilcbiAqIC0gQWNrIHdhaXQgZm9yIGpvYiB0aW1lb3V0c1xuICogLSBQcmlvcml0eSB2aWEgbWVzc2FnZSBoZWFkZXJzXG4gKiAtIERlbGF5ZWQgam9iIHNjaGVkdWxpbmdcbiAqIC0gUXVldWUgc3RhdGlzdGljcyB2aWEgY29uc3VtZXIgaW5mb1xuICpcbiAqIFJlcXVpcmVzOiBucG0gaW5zdGFsbCBuYXRzXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBOQVRTX1NFUlZFUlM6IENvbW1hLXNlcGFyYXRlZCBOQVRTIHNlcnZlciBVUkxzIChkZWZhdWx0OiBsb2NhbGhvc3Q6NDIyMilcbiAqIC0gTkFUU19UT0tFTjogQXV0aGVudGljYXRpb24gdG9rZW4gKG9wdGlvbmFsKVxuICogLSBOQVRTX1VTRVI6IFVzZXJuYW1lIGZvciBhdXRoIChvcHRpb25hbClcbiAqIC0gTkFUU19QQVNTOiBQYXNzd29yZCBmb3IgYXV0aCAob3B0aW9uYWwpXG4gKiAtIE5BVFNfU1RSRUFNX05BTUU6IEpldFN0cmVhbSBzdHJlYW0gbmFtZSAoZGVmYXVsdDogYmxvay13b3JrZXIpXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBXb3JrZXJUcmlnZ2VyT3B0cyB9IGZyb20gXCJAYmxva2pzL2hlbHBlclwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlckFkYXB0ZXIsIFdvcmtlckpvYiwgV29ya2VyUXVldWVTdGF0cyB9IGZyb20gXCIuLi9Xb3JrZXJUcmlnZ2VyXCI7XG5cbi8qKlxuICogVGllciAyIHBvbGlzaCDigJQgY29tcHV0ZSB0aGUgY29uc3VtZXItc2lkZSBob2xkIHRpbWUgZm9yIGEgTkFUUyBtZXNzYWdlXG4gKiB3aXRoIGFuIGB4LWRlbGF5YCBoZWFkZXIuIE5BVFMgSmV0U3RyZWFtIHN0b3JlcyBgeC1kZWxheWAgYXMgb3BhcXVlXG4gKiBtZXRhZGF0YTsgdGhlIGJyb2tlciBkb2VzIE5PVCBkZWZlciBkZWxpdmVyeSBvbiBpdC4gVGhlIGNvbnN1bWVyIGlzXG4gKiByZXNwb25zaWJsZSBmb3IgaG9ub3VyaW5nIHRoZSBkZWxheSBiZXR3ZWVuIHRoZSBtZXNzYWdlJ3MgZmlyc3QtcHVibGlzaFxuICogdGltZXN0YW1wIGFuZCBgY3JlYXRlZE1zICsgZGVsYXlgLlxuICpcbiAqIFJldHVybnMgdGhlIG1pbGxpc2Vjb25kcyB0byB3YWl0LiBDbGFtcHMgdG8gPj0gMDsgcmV0dXJucyAwIHdoZW4gdGhlXG4gKiBkZWxheSBoYXMgYWxyZWFkeSBlbGFwc2VkICh0aGUgbWVzc2FnZSB3YXMgcXVldWVkIGZvciBsb25nZXIgdGhhbiB0aGVcbiAqIGRlbGF5KSBvciB3aGVuIG5vIGRlbGF5IHdhcyBzZXQuXG4gKlxuICogRXhwb3J0ZWQgZm9yIHVuaXQgdGVzdGFiaWxpdHkg4oCUIHRoZSBjb25zdW1lciBtZXNzYWdlIGhhbmRsZXIgaW5cbiAqIGBOQVRTV29ya2VyQWRhcHRlci5wcm9jZXNzKClgIG1vY2tzIHRoZSBOQVRTIGNsaWVudCBleHRlbnNpdmVseSwgc29cbiAqIGlzb2xhdGluZyB0aGUgbWF0aCBoZXJlIGtlZXBzIHRoZSBzdXJmYWNlIGVhc3kgdG8gdmVyaWZ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVhEZWxheUhvbGRNcyhkZWxheTogbnVtYmVyLCBjcmVhdGVkTXM6IG51bWJlciwgbm93TXM6IG51bWJlcik6IG51bWJlciB7XG5cdGlmICghZGVsYXkgfHwgZGVsYXkgPD0gMCkgcmV0dXJuIDA7XG5cdGNvbnN0IGRpc3BhdGNoQXQgPSBjcmVhdGVkTXMgKyBkZWxheTtcblx0cmV0dXJuIE1hdGgubWF4KDAsIGRpc3BhdGNoQXQgLSBub3dNcyk7XG59XG5cbi8qKlxuICogTkFUUyB3b3JrZXIgYWRhcHRlciBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTkFUU1dvcmtlckNvbmZpZyB7XG5cdC8qKiBOQVRTIHNlcnZlciBVUkxzICovXG5cdHNlcnZlcnM6IHN0cmluZ1tdO1xuXHQvKiogQXV0aGVudGljYXRpb24gdG9rZW4gKi9cblx0dG9rZW4/OiBzdHJpbmc7XG5cdC8qKiBVc2VybmFtZSAqL1xuXHR1c2VyPzogc3RyaW5nO1xuXHQvKiogUGFzc3dvcmQgKi9cblx0cGFzcz86IHN0cmluZztcblx0LyoqIEpldFN0cmVhbSBzdHJlYW0gbmFtZSAoZGVmYXVsdDogXCJibG9rLXdvcmtlclwiKSAqL1xuXHRzdHJlYW1OYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE5BVFNXb3JrZXJBZGFwdGVyIC0gTkFUUyBKZXRTdHJlYW0gaW1wbGVtZW50YXRpb24gb2YgV29ya2VyQWRhcHRlclxuICovXG5leHBvcnQgY2xhc3MgTkFUU1dvcmtlckFkYXB0ZXIgaW1wbGVtZW50cyBXb3JrZXJBZGFwdGVyIHtcblx0cmVhZG9ubHkgcHJvdmlkZXIgPSBcIm5hdHNcIiBhcyBjb25zdDtcblxuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IE5BVFMgdHlwZXMgYXJlIGR5bmFtaWNhbGx5IGltcG9ydGVkIChvcHRpb25hbCBwZWVyIGRlcGVuZGVuY3kpXG5cdHByaXZhdGUgbmM6IGFueSA9IG51bGw7XG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTkFUUyB0eXBlcyBhcmUgZHluYW1pY2FsbHkgaW1wb3J0ZWRcblx0cHJpdmF0ZSBqczogYW55ID0gbnVsbDtcblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOQVRTIHR5cGVzIGFyZSBkeW5hbWljYWxseSBpbXBvcnRlZFxuXHRwcml2YXRlIGpzbTogYW55ID0gbnVsbDtcblx0cHJpdmF0ZSBjb25uZWN0ZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBjb25maWc6IE5BVFNXb3JrZXJDb25maWc7XG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTkFUUyBjb25zdW1lciBpbnN0YW5jZXNcblx0cHJpdmF0ZSBjb25zdW1lcnM6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTkFUUyBjb25zdW1lIGl0ZXJhdG9yc1xuXHRwcml2YXRlIGNvbnN1bWVJdGVyYXRvcnM6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XG5cblx0Y29uc3RydWN0b3IoY29uZmlnPzogUGFydGlhbDxOQVRTV29ya2VyQ29uZmlnPikge1xuXHRcdHRoaXMuY29uZmlnID0ge1xuXHRcdFx0c2VydmVyczogY29uZmlnPy5zZXJ2ZXJzIHx8IChwcm9jZXNzLmVudi5OQVRTX1NFUlZFUlMgfHwgXCJsb2NhbGhvc3Q6NDIyMlwiKS5zcGxpdChcIixcIiksXG5cdFx0XHR0b2tlbjogY29uZmlnPy50b2tlbiB8fCBwcm9jZXNzLmVudi5OQVRTX1RPS0VOLFxuXHRcdFx0dXNlcjogY29uZmlnPy51c2VyIHx8IHByb2Nlc3MuZW52Lk5BVFNfVVNFUixcblx0XHRcdHBhc3M6IGNvbmZpZz8ucGFzcyB8fCBwcm9jZXNzLmVudi5OQVRTX1BBU1MsXG5cdFx0XHRzdHJlYW1OYW1lOiBjb25maWc/LnN0cmVhbU5hbWUgfHwgcHJvY2Vzcy5lbnYuTkFUU19TVFJFQU1fTkFNRSB8fCBcImJsb2std29ya2VyXCIsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25uZWN0IHRvIE5BVFMgYW5kIGluaXRpYWxpemUgSmV0U3RyZWFtXG5cdCAqL1xuXHRhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG5hdHMgPSBhd2FpdCBpbXBvcnQoXCJuYXRzXCIpO1xuXG5cdFx0XHRjb25zdCBjb25uZWN0T3B0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG5cdFx0XHRcdHNlcnZlcnM6IHRoaXMuY29uZmlnLnNlcnZlcnMsXG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAodGhpcy5jb25maWcudG9rZW4pIGNvbm5lY3RPcHRzLnRva2VuID0gdGhpcy5jb25maWcudG9rZW47XG5cdFx0XHRpZiAodGhpcy5jb25maWcudXNlcikgY29ubmVjdE9wdHMudXNlciA9IHRoaXMuY29uZmlnLnVzZXI7XG5cdFx0XHRpZiAodGhpcy5jb25maWcucGFzcykgY29ubmVjdE9wdHMucGFzcyA9IHRoaXMuY29uZmlnLnBhc3M7XG5cblx0XHRcdHRoaXMubmMgPSBhd2FpdCBuYXRzLmNvbm5lY3QoY29ubmVjdE9wdHMpO1xuXHRcdFx0dGhpcy5qcyA9IHRoaXMubmMuamV0c3RyZWFtKCk7XG5cdFx0XHR0aGlzLmpzbSA9IGF3YWl0IHRoaXMubmMuamV0c3RyZWFtTWFuYWdlcigpO1xuXG5cdFx0XHR0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLmxvZyhgW05BVFNXb3JrZXJBZGFwdGVyXSBDb25uZWN0ZWQgdG8gTkFUUzogJHt0aGlzLmNvbmZpZy5zZXJ2ZXJzLmpvaW4oXCIsIFwiKX1gKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgRmFpbGVkIHRvIGNvbm5lY3QgdG8gTkFUUzogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9LiBNYWtlIHN1cmUgbmF0cyBpcyBpbnN0YWxsZWQ6IG5wbSBpbnN0YWxsIG5hdHNgLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGlzY29ubmVjdCBmcm9tIE5BVFNcblx0ICovXG5cdGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFN0b3AgYWxsIGNvbnN1bWUgaXRlcmF0b3JzXG5cdFx0XHRmb3IgKGNvbnN0IFssIGl0ZXJdIG9mIHRoaXMuY29uc3VtZUl0ZXJhdG9ycykge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGl0ZXIuc3RvcCgpO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHQvLyBJdGVyYXRvciBtYXkgYWxyZWFkeSBiZSBzdG9wcGVkXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuY29uc3VtZUl0ZXJhdG9ycy5jbGVhcigpO1xuXHRcdFx0dGhpcy5jb25zdW1lcnMuY2xlYXIoKTtcblxuXHRcdFx0YXdhaXQgdGhpcy5uYy5kcmFpbigpO1xuXHRcdFx0dGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcblx0XHRcdGNvbnNvbGUubG9nKFwiW05BVFNXb3JrZXJBZGFwdGVyXSBEaXNjb25uZWN0ZWQgZnJvbSBOQVRTXCIpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGBbTkFUU1dvcmtlckFkYXB0ZXJdIERpc2Nvbm5lY3QgZXJyb3I6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTdGFydCBwcm9jZXNzaW5nIGpvYnMgZnJvbSBhIHF1ZXVlXG5cdCAqL1xuXHRhc3luYyBwcm9jZXNzKGNvbmZpZzogV29ya2VyVHJpZ2dlck9wdHMsIGhhbmRsZXI6IChqb2I6IFdvcmtlckpvYikgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vdCBjb25uZWN0ZWQuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHR9XG5cblx0XHRjb25zdCBuYXRzID0gYXdhaXQgaW1wb3J0KFwibmF0c1wiKTtcblx0XHRjb25zdCBxdWV1ZSA9IGNvbmZpZy5xdWV1ZTtcblx0XHRjb25zdCBzdHJlYW1OYW1lID0gdGhpcy5jb25maWcuc3RyZWFtTmFtZSB8fCBcImJsb2std29ya2VyXCI7XG5cdFx0Y29uc3Qgc3ViamVjdCA9IGB3b3JrZXIuJHtxdWV1ZX1gO1xuXHRcdGNvbnN0IGR1cmFibGVOYW1lID0gYGJsb2std29ya2VyLSR7cXVldWV9YDtcblxuXHRcdC8vIEVuc3VyZSBzdHJlYW0gZXhpc3RzIHdpdGggd29ya2VyIHN1YmplY3RzXG5cdFx0YXdhaXQgdGhpcy5lbnN1cmVTdHJlYW0oc3RyZWFtTmFtZSwgW3N1YmplY3RdKTtcblxuXHRcdC8vIHYwLjcg4oCUIGBhY2s6IGZhbHNlYCBzZWxlY3RzIGF0LW1vc3Qtb25jZSBkZWxpdmVyeS4gSmV0U3RyZWFtIFBVTExcblx0XHQvLyBjb25zdW1lcnMgcmVqZWN0IEFja1BvbGljeS5Ob25lIChcImNvbnN1bWVyIGluIHB1bGwgbW9kZSByZXF1aXJlcyBhY2tcblx0XHQvLyBwb2xpY3lcIiksIHNvIGF0LW1vc3Qtb25jZSBpcyBpbXBsZW1lbnRlZCBhcyBBY2tQb2xpY3kuRXhwbGljaXQgK1xuXHRcdC8vIG1heF9kZWxpdmVyOjEgd2l0aCB0aGUgbWVzc2FnZSBBQ0tlZCBvbiByZWNlaXB0IChiZWZvcmUgdGhlIGhhbmRsZXJcblx0XHQvLyBydW5zKS4gVGhlIGJyb2tlciB0aGVuIHRyZWF0cyB0aGUgbWVzc2FnZSBhcyBkZWxpdmVyZWQrZG9uZSwgc28gYVxuXHRcdC8vIGhhbmRsZXIgdGhhdCB0aHJvd3MgaXMgTk9UIHJlZGVsaXZlcmVkIOKAlCBleGFjdGx5LW9uY2UgZGVsaXZlcnkgZXZlblxuXHRcdC8vIG9uIGZhaWx1cmUuIFRoZSBtYW51YWwgYWNrL25hay90ZXJtIHBhdGggYmVsb3cgaXMgYSBuby1vcCBpbiB0aGlzIG1vZGUuXG5cdFx0Y29uc3QgYXRNb3N0T25jZSA9IGNvbmZpZy5hY2sgPT09IGZhbHNlO1xuXG5cdFx0Ly8gQ3JlYXRlIG9yIHVwZGF0ZSBkdXJhYmxlIHB1bGwgY29uc3VtZXIgd2l0aCB3b3JrZXIgc2VtYW50aWNzXG5cdFx0Y29uc3QgYWNrV2FpdE5zID0gKChjb25maWcudGltZW91dCA/PyAzMDAwMCkgKyA1MDAwKSAqIDFfMDAwXzAwMDsgLy8gdGltZW91dCArIDVzIGJ1ZmZlciwgaW4gbmFub3NlY29uZHNcblx0XHRhd2FpdCB0aGlzLmpzbS5jb25zdW1lcnMuYWRkKHN0cmVhbU5hbWUsIHtcblx0XHRcdGR1cmFibGVfbmFtZTogZHVyYWJsZU5hbWUsXG5cdFx0XHRhY2tfcG9saWN5OiBuYXRzLkFja1BvbGljeS5FeHBsaWNpdCxcblx0XHRcdC8vIGF0LW1vc3Qtb25jZTogZGVsaXZlciBleGFjdGx5IG9uY2UsIG5ldmVyIHJlZGVsaXZlci5cblx0XHRcdG1heF9kZWxpdmVyOiBhdE1vc3RPbmNlID8gMSA6IChjb25maWcucmV0cmllcyA/PyAzKSArIDEsIC8vICsxIGJlY2F1c2UgZmlyc3QgYXR0ZW1wdCBjb3VudHNcblx0XHRcdGFja193YWl0OiBhY2tXYWl0TnMsXG5cdFx0XHRmaWx0ZXJfc3ViamVjdHM6IFtzdWJqZWN0XSxcblx0XHR9KTtcblxuXHRcdC8vIEdldCBjb25zdW1lciBoYW5kbGVcblx0XHRjb25zdCBjb25zdW1lciA9IGF3YWl0IHRoaXMuanMuY29uc3VtZXJzLmdldChzdHJlYW1OYW1lLCBkdXJhYmxlTmFtZSk7XG5cdFx0dGhpcy5jb25zdW1lcnMuc2V0KHF1ZXVlLCBjb25zdW1lcik7XG5cblx0XHQvLyBTdGFydCBjb25zdW1pbmdcblx0XHRjb25zdCBpdGVyID0gYXdhaXQgY29uc3VtZXIuY29uc3VtZSgpO1xuXHRcdHRoaXMuY29uc3VtZUl0ZXJhdG9ycy5zZXQocXVldWUsIGl0ZXIpO1xuXG5cdFx0Ly8gUHJvY2VzcyBqb2JzIGluIGJhY2tncm91bmRcblx0XHQoYXN5bmMgKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc2VtYXBob3JlID0gbmV3IFNlbWFwaG9yZShjb25maWcuY29uY3VycmVuY3kgPz8gMSk7XG5cblx0XHRcdGZvciBhd2FpdCAoY29uc3QgbXNnIG9mIGl0ZXIpIHtcblx0XHRcdFx0YXdhaXQgc2VtYXBob3JlLmFjcXVpcmUoKTtcblxuXHRcdFx0XHQvLyBQcm9jZXNzIGVhY2ggam9iIGNvbmN1cnJlbnRseSB1cCB0byBjb25jdXJyZW5jeSBsaW1pdFxuXHRcdFx0XHQoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHQvLyBQYXJzZSBqb2IgZGF0YVxuXHRcdFx0XHRcdFx0bGV0IGRhdGE6IHVua25vd247XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjb2RlYyA9IG5hdHMuSlNPTkNvZGVjKCk7XG5cdFx0XHRcdFx0XHRcdGRhdGEgPSBjb2RlYy5kZWNvZGUobXNnLmRhdGEpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc2MgPSBuYXRzLlN0cmluZ0NvZGVjKCk7XG5cdFx0XHRcdFx0XHRcdFx0ZGF0YSA9IEpTT04ucGFyc2Uoc2MuZGVjb2RlKG1zZy5kYXRhKSk7XG5cdFx0XHRcdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdFx0XHRcdGRhdGEgPSBtc2cuZGF0YTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBFeHRyYWN0IGhlYWRlcnNcblx0XHRcdFx0XHRcdGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0XHRcdFx0XHRcdGlmIChtc2cuaGVhZGVycykge1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlc10gb2YgbXNnLmhlYWRlcnMpIHtcblx0XHRcdFx0XHRcdFx0XHRoZWFkZXJzW2tleV0gPSBBcnJheS5pc0FycmF5KHZhbHVlcykgPyB2YWx1ZXNbMF0gOiB2YWx1ZXM7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gRXh0cmFjdCBqb2IgbWV0YWRhdGEgZnJvbSBoZWFkZXJzXG5cdFx0XHRcdFx0XHRjb25zdCBqb2JJZCA9IGhlYWRlcnNbXCJ4LWpvYi1pZFwiXSB8fCBtc2cuaGVhZGVycz8uZ2V0KFwiTmF0cy1Nc2ctSWRcIikgfHwgdXVpZCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgcHJpb3JpdHkgPSBOdW1iZXIucGFyc2VJbnQoaGVhZGVyc1tcIngtcHJpb3JpdHlcIl0gfHwgXCIwXCIsIDEwKTtcblx0XHRcdFx0XHRcdGNvbnN0IGRlbGF5ID0gTnVtYmVyLnBhcnNlSW50KGhlYWRlcnNbXCJ4LWRlbGF5XCJdIHx8IFwiMFwiLCAxMCk7XG5cdFx0XHRcdFx0XHRjb25zdCB0aW1lb3V0ID0gTnVtYmVyLnBhcnNlSW50KGhlYWRlcnNbXCJ4LXRpbWVvdXRcIl0gfHwgXCIwXCIsIDEwKTtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHJlZGVsaXZlcnkgY291bnQgKGF0dGVtcHRzKVxuXHRcdFx0XHRcdFx0Y29uc3QgaW5mbyA9IG1zZy5pbmZvO1xuXHRcdFx0XHRcdFx0Y29uc3QgYXR0ZW1wdHMgPSBpbmZvLnJlZGVsaXZlcnlDb3VudCA/PyAwO1xuXHRcdFx0XHRcdFx0Y29uc3QgbWF4UmV0cmllcyA9IGNvbmZpZy5yZXRyaWVzID8/IDM7XG5cblx0XHRcdFx0XHRcdC8vIENyZWF0ZSBXb3JrZXJKb2Jcblx0XHRcdFx0XHRcdGNvbnN0IHdvcmtlckpvYjogV29ya2VySm9iID0ge1xuXHRcdFx0XHRcdFx0XHRpZDogam9iSWQsXG5cdFx0XHRcdFx0XHRcdGRhdGEsXG5cdFx0XHRcdFx0XHRcdGhlYWRlcnMsXG5cdFx0XHRcdFx0XHRcdHF1ZXVlLFxuXHRcdFx0XHRcdFx0XHRwcmlvcml0eSxcblx0XHRcdFx0XHRcdFx0YXR0ZW1wdHMsXG5cdFx0XHRcdFx0XHRcdG1heFJldHJpZXMsXG5cdFx0XHRcdFx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUoXG5cdFx0XHRcdFx0XHRcdFx0aW5mby50aW1lc3RhbXBOYW5vcyA/IE1hdGguZmxvb3IoTnVtYmVyKGluZm8udGltZXN0YW1wTmFub3MpIC8gMV8wMDBfMDAwKSA6IERhdGUubm93KCksXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdGRlbGF5OiBkZWxheSB8fCB1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdHRpbWVvdXQ6IHRpbWVvdXQgfHwgY29uZmlnLnRpbWVvdXQgfHwgdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRyYXc6IG1zZyxcblx0XHRcdFx0XHRcdFx0Y29tcGxldGU6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHQvLyBBbHJlYWR5IEFDS2VkIG9uIHJlY2VpcHQgdW5kZXIgYXQtbW9zdC1vbmNlOyBhIHNlY29uZCBhY2sgZXJyb3JzLlxuXHRcdFx0XHRcdFx0XHRcdGlmICghYXRNb3N0T25jZSkgbXNnLmFjaygpO1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRmYWlsOiBhc3luYyAoZXJyb3I6IEVycm9yLCByZXF1ZXVlPzogYm9vbGVhbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChyZXF1ZXVlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBuYWsoKSB0ZWxscyB0aGUgc2VydmVyIHRvIHJlZGVsaXZlci4gTm8tb3AgdW5kZXJcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGF0LW1vc3Qtb25jZSDigJQgdGhlIG1lc3NhZ2Ugd2FzIGFscmVhZHkgQUNLZWQgb24gcmVjZWlwdC5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICghYXRNb3N0T25jZSkgbXNnLm5haygpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBUZXJtaW5hbCBmYWlsdXJlIChyZXRyaWVzIGV4aGF1c3RlZCAvIG5vbi1yZXF1ZXVlKS5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIHYwLjcg4oCUIGRlYWQtbGV0dGVyIHRoZSBvcmlnaW5hbCBwYXlsb2FkK2hlYWRlcnMgdG9cblx0XHRcdFx0XHRcdFx0XHRcdC8vIGB3b3JrZXIuJHtkZWFkTGV0dGVyUXVldWV9YCBiZWZvcmUgdGVybWluYXRpbmcgc28gdGhlXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBtZXNzYWdlIGlzbid0IHNpbGVudGx5IGRyb3BwZWQuIE5vLW9wIHdoZW4gRExRIGlzIHVuc2V0LlxuXHRcdFx0XHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5kZWFkTGV0dGVyKGNvbmZpZy5kZWFkTGV0dGVyUXVldWUsIG1zZy5kYXRhLCBtc2cuaGVhZGVycyk7XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyB0ZXJtKCkgdGVybWluYXRlcyBkZWxpdmVyeSDigJQgbm8gbW9yZSByZXRyaWVzLiBBbHJlYWR5XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBBQ0tlZCB1bmRlciBhdC1tb3N0LW9uY2UsIHNvIHRlcm0oKSBpcyBza2lwcGVkIHRoZXJlLlxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFhdE1vc3RPbmNlKSBtc2cudGVybSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdC8vIGF0LW1vc3Qtb25jZSDigJQgQUNLIGJlZm9yZSBydW5uaW5nIHRoZSBoYW5kbGVyIHNvIHRoZSBicm9rZXJcblx0XHRcdFx0XHRcdC8vIGNvbnNpZGVycyB0aGUgbWVzc2FnZSBkb25lLiBtYXhfZGVsaXZlcjoxIGFscmVhZHkgcHJldmVudHNcblx0XHRcdFx0XHRcdC8vIHJlZGVsaXZlcnk7IHRoaXMgYWxzbyByZWxlYXNlcyB0aGUgYWNrX3dhaXQgdGltZXIgaW1tZWRpYXRlbHkuXG5cdFx0XHRcdFx0XHRpZiAoYXRNb3N0T25jZSkgbXNnLmFjaygpO1xuXG5cdFx0XHRcdFx0XHQvLyBUaWVyIDIgcG9saXNoIOKAlCBlbmZvcmNlIGB4LWRlbGF5YCBoZWFkZXIgb24gdGhlIGNvbnN1bWVyIHNpZGUuXG5cdFx0XHRcdFx0XHQvLyBOQVRTIEpldFN0cmVhbSBzdG9yZXMgYHgtZGVsYXlgIGFzIG9wYXF1ZSBtZXRhZGF0YTsgdGhlIGJyb2tlclxuXHRcdFx0XHRcdFx0Ly8gZG9lcyBOT1QgZGVmZXIgZGVsaXZlcnkgb24gaXQuIFdlIGltcGxlbWVudCBjb25zdW1lci1zaWRlXG5cdFx0XHRcdFx0XHQvLyBob2xkaW5nIGhlcmUuIGNyZWF0ZWRNcyBpcyB0aGUgbWVzc2FnZSdzIGZpcnN0LXB1Ymxpc2ggdGltZXN0YW1wO1xuXHRcdFx0XHRcdFx0Ly8gaG9sZCB1bnRpbCBjcmVhdGVkTXMgKyBkZWxheS4gU2luZ2xlLXByb2Nlc3Mgc2VtYW50aWNzIOKAlCBmb3Jcblx0XHRcdFx0XHRcdC8vIGxvbmcgZGVmZXJyYWxzLCBwcmVmZXIgdHJpZ2dlci1sZXZlbCBgZGVsYXlgIChEZWZlcnJlZFJ1blNjaGVkdWxlcikuXG5cdFx0XHRcdFx0XHRjb25zdCBjcmVhdGVkTXMgPSBpbmZvLnRpbWVzdGFtcE5hbm9zID8gTWF0aC5mbG9vcihOdW1iZXIoaW5mby50aW1lc3RhbXBOYW5vcykgLyAxXzAwMF8wMDApIDogRGF0ZS5ub3coKTtcblx0XHRcdFx0XHRcdGNvbnN0IHdhaXRNcyA9IGNvbXB1dGVYRGVsYXlIb2xkTXMoZGVsYXksIGNyZWF0ZWRNcywgRGF0ZS5ub3coKSk7XG5cdFx0XHRcdFx0XHRpZiAod2FpdE1zID4gMCkge1xuXHRcdFx0XHRcdFx0XHRhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCB3YWl0TXMpKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0YXdhaXQgaGFuZGxlcih3b3JrZXJKb2IpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGBbTkFUU1dvcmtlckFkYXB0ZXJdIEVycm9yIHByb2Nlc3Npbmcgam9iIGZyb20gJHtxdWV1ZX06ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0Ly8gVW5kZXIgYXQtbW9zdC1vbmNlIHRoZXJlJ3Mgbm90aGluZyB0byBuYWsg4oCUIHRoZSBicm9rZXIgaXNuJ3Rcblx0XHRcdFx0XHRcdFx0Ly8gdHJhY2tpbmcgZGVsaXZlcnksIHNvIGEgaGFuZGxlciB0aHJvdyBtdXN0IE5PVCB0cmlnZ2VyIHJlZGVsaXZlcnkuXG5cdFx0XHRcdFx0XHRcdGlmICghYXRNb3N0T25jZSkgbXNnLm5haygpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0XHRcdC8vIEFscmVhZHkgYWNrZWQvbmFja2VkXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdHNlbWFwaG9yZS5yZWxlYXNlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSgpO1xuXHRcdFx0fVxuXHRcdH0pKCk7XG5cblx0XHRjb25zb2xlLmxvZyhcblx0XHRcdGBbTkFUU1dvcmtlckFkYXB0ZXJdIFByb2Nlc3NpbmcgcXVldWU6ICR7cXVldWV9IChjb25jdXJyZW5jeT0ke2NvbmZpZy5jb25jdXJyZW5jeSA/PyAxfSwgcmV0cmllcz0ke2NvbmZpZy5yZXRyaWVzID8/IDN9KWAsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSBqb2IgdG8gYSB3b3JrZXIgcXVldWVcblx0ICovXG5cdGFzeW5jIGFkZEpvYihcblx0XHRxdWV1ZTogc3RyaW5nLFxuXHRcdGRhdGE6IHVua25vd24sXG5cdFx0b3B0cz86IHtcblx0XHRcdHByaW9yaXR5PzogbnVtYmVyO1xuXHRcdFx0ZGVsYXk/OiBudW1iZXI7XG5cdFx0XHRyZXRyaWVzPzogbnVtYmVyO1xuXHRcdFx0dGltZW91dD86IG51bWJlcjtcblx0XHRcdGpvYklkPzogc3RyaW5nO1xuXHRcdH0sXG5cdCk6IFByb21pc2U8c3RyaW5nPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm90IGNvbm5lY3RlZC4gQ2FsbCBjb25uZWN0KCkgZmlyc3QuXCIpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG5hdHMgPSBhd2FpdCBpbXBvcnQoXCJuYXRzXCIpO1xuXHRcdGNvbnN0IHN1YmplY3QgPSBgd29ya2VyLiR7cXVldWV9YDtcblx0XHRjb25zdCBzdHJlYW1OYW1lID0gdGhpcy5jb25maWcuc3RyZWFtTmFtZSB8fCBcImJsb2std29ya2VyXCI7XG5cblx0XHQvLyBFbnN1cmUgc3RyZWFtIGhhcyB0aGlzIHN1YmplY3Rcblx0XHRhd2FpdCB0aGlzLmVuc3VyZVN0cmVhbShzdHJlYW1OYW1lLCBbc3ViamVjdF0pO1xuXG5cdFx0Ly8gQnVpbGQgaGVhZGVycyB3aXRoIGpvYiBtZXRhZGF0YVxuXHRcdGNvbnN0IGhkcnMgPSBuYXRzLmhlYWRlcnMoKTtcblx0XHRjb25zdCBqb2JJZCA9IG9wdHM/LmpvYklkIHx8IHV1aWQoKTtcblx0XHRoZHJzLnNldChcIngtam9iLWlkXCIsIGpvYklkKTtcblx0XHRoZHJzLnNldChcIk5hdHMtTXNnLUlkXCIsIGpvYklkKTsgLy8gRGVkdXBsaWNhdGlvblxuXHRcdGlmIChvcHRzPy5wcmlvcml0eSkgaGRycy5zZXQoXCJ4LXByaW9yaXR5XCIsIFN0cmluZyhvcHRzLnByaW9yaXR5KSk7XG5cdFx0aWYgKG9wdHM/LmRlbGF5KSBoZHJzLnNldChcIngtZGVsYXlcIiwgU3RyaW5nKG9wdHMuZGVsYXkpKTtcblx0XHRpZiAob3B0cz8udGltZW91dCkgaGRycy5zZXQoXCJ4LXRpbWVvdXRcIiwgU3RyaW5nKG9wdHMudGltZW91dCkpO1xuXG5cdFx0Ly8gRW5jb2RlIGFuZCBwdWJsaXNoXG5cdFx0Y29uc3QgY29kZWMgPSBuYXRzLkpTT05Db2RlYygpO1xuXHRcdGF3YWl0IHRoaXMuanMucHVibGlzaChzdWJqZWN0LCBjb2RlYy5lbmNvZGUoZGF0YSksIHsgaGVhZGVyczogaGRycyB9KTtcblxuXHRcdHJldHVybiBqb2JJZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdG9wIHByb2Nlc3NpbmcgYSBzcGVjaWZpYyBxdWV1ZVxuXHQgKi9cblx0YXN5bmMgc3RvcFByb2Nlc3NpbmcocXVldWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGl0ZXIgPSB0aGlzLmNvbnN1bWVJdGVyYXRvcnMuZ2V0KHF1ZXVlKTtcblx0XHRpZiAoaXRlcikge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aXRlci5zdG9wKCk7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0Ly8gQWxyZWFkeSBzdG9wcGVkXG5cdFx0XHR9XG5cdFx0XHR0aGlzLmNvbnN1bWVJdGVyYXRvcnMuZGVsZXRlKHF1ZXVlKTtcblx0XHR9XG5cdFx0dGhpcy5jb25zdW1lcnMuZGVsZXRlKHF1ZXVlKTtcblx0XHRjb25zb2xlLmxvZyhgW05BVFNXb3JrZXJBZGFwdGVyXSBTdG9wcGVkIHByb2Nlc3NpbmcgcXVldWU6ICR7cXVldWV9YCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgaWYgY29ubmVjdGVkXG5cdCAqL1xuXHRpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG5cdH1cblxuXHQvKipcblx0ICogSGVhbHRoIGNoZWNrXG5cdCAqL1xuXHRhc3luYyBoZWFsdGhDaGVjaygpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkIHx8ICF0aGlzLm5jKSByZXR1cm4gZmFsc2U7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGluZm8gPSB0aGlzLm5jLmluZm87XG5cdFx0XHRyZXR1cm4gaW5mbyAhPT0gdW5kZWZpbmVkO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgcXVldWUgc3RhdGlzdGljcyBmcm9tIEpldFN0cmVhbSBjb25zdW1lciBpbmZvXG5cdCAqL1xuXHRhc3luYyBnZXRRdWV1ZVN0YXRzKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPFdvcmtlclF1ZXVlU3RhdHM+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG5cdFx0XHRyZXR1cm4geyB3YWl0aW5nOiAwLCBhY3RpdmU6IDAsIGNvbXBsZXRlZDogMCwgZmFpbGVkOiAwLCBkZWxheWVkOiAwIH07XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHN0cmVhbU5hbWUgPSB0aGlzLmNvbmZpZy5zdHJlYW1OYW1lIHx8IFwiYmxvay13b3JrZXJcIjtcblx0XHRcdGNvbnN0IGR1cmFibGVOYW1lID0gYGJsb2std29ya2VyLSR7cXVldWV9YDtcblxuXHRcdFx0Y29uc3QgaW5mbyA9IGF3YWl0IHRoaXMuanNtLmNvbnN1bWVycy5pbmZvKHN0cmVhbU5hbWUsIGR1cmFibGVOYW1lKTtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0d2FpdGluZzogaW5mby5udW1fcGVuZGluZyA/PyAwLFxuXHRcdFx0XHRhY3RpdmU6IGluZm8ubnVtX2Fja19wZW5kaW5nID8/IDAsXG5cdFx0XHRcdGNvbXBsZXRlZDogaW5mby5kZWxpdmVyZWQ/LmNvbnN1bWVyX3NlcSA/PyAwLFxuXHRcdFx0XHRmYWlsZWQ6IGluZm8ubnVtX3JlZGVsaXZlcmVkID8/IDAsXG5cdFx0XHRcdGRlbGF5ZWQ6IDAsIC8vIE5BVFMgZG9lc24ndCBoYXZlIGEgbmF0aXZlIGRlbGF5ZWQgY291bnRcblx0XHRcdH07XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4geyB3YWl0aW5nOiAwLCBhY3RpdmU6IDAsIGNvbXBsZXRlZDogMCwgZmFpbGVkOiAwLCBkZWxheWVkOiAwIH07XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIHYwLjcg4oCUIGRlYWQtbGV0dGVyIGFuIGV4aGF1c3RlZCBtZXNzYWdlLiBQdWJsaXNoZXMgdGhlIE9SSUdJTkFMIHBheWxvYWRcblx0ICogYW5kIGhlYWRlcnMgdG8gdGhlIGB3b3JrZXIuJHtkZWFkTGV0dGVyUXVldWV9YCBzdWJqZWN0IHNvIGEgZG93bnN0cmVhbVxuXHQgKiBjb25zdW1lciBjYW4gaW5zcGVjdC9yZXBsYXkgaXQuIFBsYWluIGNvcmUgcHVibGlzaCAobm90IEpldFN0cmVhbSk6IHRoZVxuXHQgKiBETFEgaXMgYSBub3RpZmljYXRpb24gc3ViamVjdCwgbm90IHBhcnQgb2YgdGhlIHdvcmtxdWV1ZSBzdHJlYW0sIHNvIHdlXG5cdCAqIGF2b2lkIGNvdXBsaW5nIGl0IHRvIHN0cmVhbS1zdWJqZWN0IG1hbmFnZW1lbnQuIE5vLW9wIHdoZW4gRExRIGlzIHVuc2V0LlxuXHQgKlxuXHQgKiBwb255dGFpbDogY29yZSBwdWJsaXNoLCBub3QgYSBwZXJzaXN0ZWQgRExRIHN0cmVhbS4gVXBncmFkZSB0byBhXG5cdCAqIGRlZGljYXRlZCBETFEgSmV0U3RyZWFtIHN0cmVhbSBpZiBkdXJhYmxlIGRlYWQtbGV0dGVyIHN0b3JhZ2UgaXMgbmVlZGVkLlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkZWFkTGV0dGVyKFxuXHRcdGRlYWRMZXR0ZXJRdWV1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdGRhdGE6IFVpbnQ4QXJyYXksXG5cdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBOQVRTIE1zZ0hkcnMgdHlwZSBpcyBkeW5hbWljYWxseSBpbXBvcnRlZFxuXHRcdGhlYWRlcnM6IGFueSxcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCFkZWFkTGV0dGVyUXVldWUpIHJldHVybjtcblx0XHR0cnkge1xuXHRcdFx0dGhpcy5uYy5wdWJsaXNoKGB3b3JrZXIuJHtkZWFkTGV0dGVyUXVldWV9YCwgZGF0YSwgaGVhZGVycyA/IHsgaGVhZGVycyB9IDogdW5kZWZpbmVkKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcblx0XHRcdFx0YFtOQVRTV29ya2VyQWRhcHRlcl0gRmFpbGVkIHRvIGRlYWQtbGV0dGVyIHRvIHdvcmtlci4ke2RlYWRMZXR0ZXJRdWV1ZX06ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBFbnN1cmUgYSBKZXRTdHJlYW0gc3RyZWFtIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBzdWJqZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBlbnN1cmVTdHJlYW0obmFtZTogc3RyaW5nLCBzdWJqZWN0czogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgaW5mbyA9IGF3YWl0IHRoaXMuanNtLnN0cmVhbXMuaW5mbyhuYW1lKTtcblxuXHRcdFx0Ly8gTWVyZ2UgbmV3IHN1YmplY3RzIHdpdGggZXhpc3Rpbmdcblx0XHRcdGNvbnN0IGV4aXN0aW5nU3ViamVjdHMgPSBpbmZvLmNvbmZpZy5zdWJqZWN0cyB8fCBbXTtcblx0XHRcdGNvbnN0IGFsbFN1YmplY3RzID0gWy4uLm5ldyBTZXQoWy4uLmV4aXN0aW5nU3ViamVjdHMsIC4uLnN1YmplY3RzXSldO1xuXG5cdFx0XHRpZiAoYWxsU3ViamVjdHMubGVuZ3RoICE9PSBleGlzdGluZ1N1YmplY3RzLmxlbmd0aCkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmpzbS5zdHJlYW1zLnVwZGF0ZShuYW1lLCB7XG5cdFx0XHRcdFx0Li4uaW5mby5jb25maWcsXG5cdFx0XHRcdFx0c3ViamVjdHM6IGFsbFN1YmplY3RzLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIHtcblx0XHRcdC8vIFN0cmVhbSBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgaXRcblx0XHRcdGF3YWl0IHRoaXMuanNtLnN0cmVhbXMuYWRkKHtcblx0XHRcdFx0bmFtZSxcblx0XHRcdFx0c3ViamVjdHMsXG5cdFx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogbmF0cyBKZXRTdHJlYW0gcmV0ZW50aW9uIHBvbGljeSBlbnVtXG5cdFx0XHRcdHJldGVudGlvbjogXCJ3b3JrcXVldWVcIiBhcyBhbnksXG5cdFx0XHRcdG1heF9kZWxpdmVyOiA0LCAvLyBkZWZhdWx0OiAzIHJldHJpZXMgKyAxIGluaXRpYWwgYXR0ZW1wdFxuXHRcdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IG5hdHMgSmV0U3RyZWFtIHN0b3JhZ2UgdHlwZSBlbnVtXG5cdFx0XHRcdHN0b3JhZ2U6IFwiZmlsZVwiIGFzIGFueSxcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFNpbXBsZSBzZW1hcGhvcmUgZm9yIGNvbmN1cnJlbmN5IGNvbnRyb2xcbiAqL1xuY2xhc3MgU2VtYXBob3JlIHtcblx0cHJpdmF0ZSBwZXJtaXRzOiBudW1iZXI7XG5cdHByaXZhdGUgd2FpdGluZzogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuXHRjb25zdHJ1Y3RvcihwZXJtaXRzOiBudW1iZXIpIHtcblx0XHR0aGlzLnBlcm1pdHMgPSBwZXJtaXRzO1xuXHR9XG5cblx0YXN5bmMgYWNxdWlyZSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy5wZXJtaXRzID4gMCkge1xuXHRcdFx0dGhpcy5wZXJtaXRzLS07XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuXHRcdFx0dGhpcy53YWl0aW5nLnB1c2gocmVzb2x2ZSk7XG5cdFx0fSk7XG5cdH1cblxuXHRyZWxlYXNlKCk6IHZvaWQge1xuXHRcdGNvbnN0IG5leHQgPSB0aGlzLndhaXRpbmcuc2hpZnQoKTtcblx0XHRpZiAobmV4dCkge1xuXHRcdFx0bmV4dCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnBlcm1pdHMrKztcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTkFUU1dvcmtlckFkYXB0ZXI7XG4iXX0=