@blokjs/trigger-pubsub 1.1.0 → 1.2.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.
- package/dist/adapters/AWSSNSAdapter.d.ts +3 -0
- package/dist/adapters/AWSSNSAdapter.js +24 -2
- package/dist/adapters/AzureServiceBusAdapter.d.ts +6 -2
- package/dist/adapters/AzureServiceBusAdapter.js +46 -12
- package/dist/adapters/GCPPubSubAdapter.d.ts +21 -0
- package/dist/adapters/GCPPubSubAdapter.js +77 -1
- package/dist/adapters/KafkaPubSubAdapter.d.ts +3 -4
- package/dist/adapters/KafkaPubSubAdapter.js +41 -9
- package/dist/adapters/NATSPubSubAdapter.js +34 -20
- package/dist/adapters/RedisStreamsPubSubAdapter.d.ts +10 -3
- package/dist/adapters/RedisStreamsPubSubAdapter.js +42 -9
- package/package.json +4 -4
|
@@ -98,6 +98,17 @@ export class GCPPubSubAdapter {
|
|
|
98
98
|
},
|
|
99
99
|
maxAckDeadline: Duration.from({ seconds: config.ackDeadline || 30 }),
|
|
100
100
|
});
|
|
101
|
+
// `deadLetterTopic` / `filter` are set at the GCP subscription
|
|
102
|
+
// resource level — they can only be provisioned at create time (or
|
|
103
|
+
// via setMetadata for the dead-letter policy). Reconcile them here:
|
|
104
|
+
// create the subscription with the requested policy, or if it
|
|
105
|
+
// already exists, verify it matches and throw on a mismatch rather
|
|
106
|
+
// than silently ignoring the author's intent.
|
|
107
|
+
await this.reconcileSubscriptionConfig(subscription, subscriptionName, config);
|
|
108
|
+
// Translate `startFrom` into a GCP seek BEFORE attaching listeners,
|
|
109
|
+
// so replay happens before the streaming pull starts delivering.
|
|
110
|
+
// GCP seeks by timestamp/snapshot; there is no sequence-number seek.
|
|
111
|
+
await this.applyStartFrom(subscription, config.startFrom);
|
|
101
112
|
// Message handler
|
|
102
113
|
const messageHandler = async (gcpMessage) => {
|
|
103
114
|
// Parse message data
|
|
@@ -144,6 +155,71 @@ export class GCPPubSubAdapter {
|
|
|
144
155
|
this.subscriptions.set(subscriptionName, subscription);
|
|
145
156
|
console.log(`[GCPPubSubAdapter] Subscribed to: ${subscriptionName}`);
|
|
146
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Translate `startFrom` into a GCP `subscription.seek()`.
|
|
160
|
+
*
|
|
161
|
+
* - `"latest"` / unset → no-op (streaming pull already delivers only
|
|
162
|
+
* messages published after the subscriber attaches).
|
|
163
|
+
* - `"earliest"` → seek to the epoch; GCP clamps to the retention floor
|
|
164
|
+
* and replays everything still retained.
|
|
165
|
+
* - `{ timestamp }` (unix seconds) → seek to that wall-clock instant.
|
|
166
|
+
* - `{ seq }` → rejected: GCP Pub/Sub has no sequence-number cursor.
|
|
167
|
+
*/
|
|
168
|
+
async applyStartFrom(subscription, startFrom) {
|
|
169
|
+
if (startFrom === undefined || startFrom === "latest")
|
|
170
|
+
return;
|
|
171
|
+
if (startFrom === "earliest") {
|
|
172
|
+
await subscription.seek(new Date(0));
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if ("timestamp" in startFrom) {
|
|
176
|
+
await subscription.seek(new Date(startFrom.timestamp * 1000));
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
// { seq } — GCP Pub/Sub seeks by timestamp or snapshot only; there is
|
|
180
|
+
// no offset/sequence cursor. Reject loudly instead of silently
|
|
181
|
+
// dropping the author's replay intent.
|
|
182
|
+
throw new Error("[GCPPubSubAdapter] startFrom `{seq}` is not supported — GCP Pub/Sub seeks by timestamp or snapshot only. Use `{timestamp}`, `earliest`, or `latest`.");
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Provision `deadLetterTopic` / `filter` on the subscription resource.
|
|
186
|
+
*
|
|
187
|
+
* These are create-time properties in GCP. When the subscription does
|
|
188
|
+
* not yet exist we create it with the requested policy/filter. When it
|
|
189
|
+
* already exists we verify the live metadata matches — `filter` is
|
|
190
|
+
* immutable so a mismatch throws; a dead-letter mismatch is patched via
|
|
191
|
+
* `setMetadata` (the one field GCP lets you change after creation).
|
|
192
|
+
*/
|
|
193
|
+
async reconcileSubscriptionConfig(subscription, subscriptionName, config) {
|
|
194
|
+
if (!config.deadLetterTopic && !config.filter)
|
|
195
|
+
return;
|
|
196
|
+
const deadLetterPolicy = config.deadLetterTopic
|
|
197
|
+
? { deadLetterTopic: this.requireClient().topic(config.deadLetterTopic).name }
|
|
198
|
+
: undefined;
|
|
199
|
+
const [exists] = await subscription.exists();
|
|
200
|
+
if (!exists) {
|
|
201
|
+
// A subscription obtained via `client.subscription(name)` is
|
|
202
|
+
// detached from its topic and the SDK refuses to `.create()` it
|
|
203
|
+
// ("Subscriptions can only be created when accessed through
|
|
204
|
+
// Topics"). Create through the topic instead.
|
|
205
|
+
await this.requireClient()
|
|
206
|
+
.topic(config.topic)
|
|
207
|
+
.createSubscription(subscriptionName, {
|
|
208
|
+
...(config.filter ? { filter: config.filter } : {}),
|
|
209
|
+
...(deadLetterPolicy ? { deadLetterPolicy } : {}),
|
|
210
|
+
});
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
const [metadata] = await subscription.getMetadata();
|
|
214
|
+
// `filter` is immutable after creation — a mismatch means the caller
|
|
215
|
+
// asked for a filter the pre-existing subscription can't honor.
|
|
216
|
+
if (config.filter && (metadata.filter || "") !== config.filter) {
|
|
217
|
+
throw new Error(`[GCPPubSubAdapter] subscription "${subscriptionName}" already exists with filter "${metadata.filter || ""}" which differs from the requested filter "${config.filter}". GCP filters are immutable; delete and recreate the subscription.`);
|
|
218
|
+
}
|
|
219
|
+
if (deadLetterPolicy && metadata.deadLetterPolicy?.deadLetterTopic !== deadLetterPolicy.deadLetterTopic) {
|
|
220
|
+
await subscription.setMetadata({ deadLetterPolicy });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
147
223
|
/**
|
|
148
224
|
* Unsubscribe from a GCP Pub/Sub subscription
|
|
149
225
|
*/
|
|
@@ -195,4 +271,4 @@ export class GCPPubSubAdapter {
|
|
|
195
271
|
}
|
|
196
272
|
}
|
|
197
273
|
export default GCPPubSubAdapter;
|
|
198
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR0NQUHViU3ViQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9HQ1BQdWJTdWJBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFJSCxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWNsQzs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDbkIsUUFBUSxHQUFHLEtBQWMsQ0FBQztJQUUzQixNQUFNLENBQXFCO0lBQzNCLGFBQWEsR0FBOEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNyRCxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLE1BQU0sQ0FBa0I7SUFFaEM7OztPQUdHO0lBQ0ssYUFBYTtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxZQUFZLE1BQXdCO1FBQ25DLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDYixTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQjtZQUNoRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFdBQVc7U0FDaEMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1osSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFFM0IsSUFBSSxDQUFDO1lBQ0oseUNBQXlDO1lBQ3pDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBRXhELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUM7Z0JBQ3hCLFNBQVMsRUFBRSxJQUFJLENBQUMs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LElBQUksRUFBRSxXQUFXLElBQUksSUFBSSxFQUFFLFlBQVk7U0FDcEQsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFdBQVc7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFbEMsSUFBSSxDQUFDO1lBQ0osdUNBQXVDO1lBQ3ZDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JGLE9BQU8sSUFBSSxDQUFDO1FBQ2IsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNSLE9BQU8sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNGLENBQUM7Q0FDRDtBQUVELGVBQWUsZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdDUFB1YlN1YkFkYXB0ZXIgLSBHb29nbGUgQ2xvdWQgUHViL1N1YiBhZGFwdGVyIGZvciBQdWJTdWJUcmlnZ2VyXG4gKlxuICogVXNlcyBAZ29vZ2xlLWNsb3VkL3B1YnN1YiBmb3IgR0NQIFB1Yi9TdWIgY29ubmVjdGl2aXR5LlxuICogUmVxdWlyZXM6IG5wbSBpbnN0YWxsIEBnb29nbGUtY2xvdWQvcHVic3ViXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBHT09HTEVfQ0xPVURfUFJPSkVDVDogR0NQIHByb2plY3QgSURcbiAqIC0gR09PR0xFX0FQUExJQ0FUSU9OX0NSRURFTlRJQUxTOiBQYXRoIHRvIHNlcnZpY2UgYWNjb3VudCBrZXkgZmlsZSAob3B0aW9uYWwgaWYgdXNpbmcgZGVmYXVsdCBjcmVkZW50aWFscylcbiAqIC0gUFVCU1VCX0VNVUxBVE9SX0hPU1Q6IFB1Yi9TdWIgZW11bGF0b3IgaG9zdCBmb3IgbG9jYWwgZGV2ZWxvcG1lbnQgKG9wdGlvbmFsKVxuICovXG5cbmltcG9ydCB0eXBlIHsgUHViU3ViVHJpZ2dlck9wdHMgfSBmcm9tIFwiQGJsb2tqcy9oZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgUHViU3ViLCBTdWJzY3JpcHRpb24gfSBmcm9tIFwiQGdvb2dsZS1jbG91ZC9wdWJzdWJcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHR5cGUgeyBQdWJTdWJBZGFwdGVyLCBQdWJTdWJNZXNzYWdlIH0gZnJvbSBcIi4uL1B1YlN1YlRyaWdnZXJcIjtcblxuLyoqXG4gKiBHQ1AgUHViL1N1YiBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR0NQUHViU3ViQ29uZmlnIHtcblx0cHJvamVjdElkPzogc3RyaW5nO1xuXHRjcmVkZW50aWFscz86IHtcblx0XHRjbGllbnRfZW1haWw6IHN0cmluZztcblx0XHRwcml2YXRlX2tleTogc3RyaW5nO1xuXHR9O1xufVxuXG4vKipcbiAqIEdDUFB1YlN1YkFkYXB0ZXIgLSBHb29nbGUgQ2xvdWQgUHViL1N1YiBpbXBsZW1lbnRhdGlvblxuICovXG5leHBvcnQgY2xhc3MgR0NQUHViU3ViQWRhcHRlciBpbXBsZW1lbnRzIFB1YlN1YkFkYXB0ZXIge1xuXHRyZWFkb25seSBwcm92aWRlciA9IFwiZ2NwXCIgYXMgY29uc3Q7XG5cblx0cHJpdmF0ZSBjbGllbnQ6IFB1YlN1YiB8IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBTdWJzY3JpcHRpb24+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGNvbmZpZzogR0NQUHViU3ViQ29uZmlnO1xuXG5cdC8qKlxuXHQgKiBUeXBlLW5hcnJvd2luZyBhY2Nlc3NvciBmb3IgYHRoaXMuY2xpZW50YC4gRmllbGQgaXMgdW5kZWZpbmVkIHVudGlsXG5cdCAqIGBjb25uZWN0KClgIHJ1bnMuXG5cdCAqL1xuXHRwcml2YXRlIHJlcXVpcmVDbGllbnQoKTogUHViU3ViIHtcblx0XHRpZiAoIXRoaXMuY2xpZW50KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJbR0NQUHViU3ViQWRhcHRlcl0gY2xpZW50IGlzIG5vdCBpbml0aWFsaXNlZCDigJQgY2FsbCBjb25uZWN0KCkgZmlyc3RcIik7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNsaWVudDtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKGNvbmZpZz86IEdDUFB1YlN1YkNvbmZpZykge1xuXHRcdHRoaXMuY29uZmlnID0ge1xuXHRcdFx0cHJvamVjdElkOiBjb25maWc/LnByb2plY3RJZCB8fCBwcm9jZXNzLmVudi5HT09HTEVfQ0xPVURfUFJPSkVDVCxcblx0XHRcdGNyZWRlbnRpYWxzOiBjb25maWc/LmNyZWRlbnRpYWxzLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQ29ubmVjdCB0byBHQ1AgUHViL1N1YlxuXHQgKi9cblx0YXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy5jb25uZWN0ZWQpIHJldHVybjtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBEeW5hbWljIGltcG9ydCBvZiBAZ29vZ2xlLWNsb3VkL3B1YnN1YlxuXHRcdFx0Y29uc3QgeyBQdWJTdWIgfSA9IGF3YWl0IGltcG9ydChcIkBnb29nbGUtY2xvdWQvcHVic3ViXCIpO1xuXG5cdFx0XHR0aGlzLmNsaWVudCA9IG5ldyBQdWJTdWIoe1xuXHRcdFx0XHRwcm9qZWN0SWQ6IHRoaXMuY29uZmlnLnByb2plY3RJZCxcblx0XHRcdFx0Y3JlZGVudGlhbHM6IHRoaXMuY29uZmlnLmNyZWRlbnRpYWxzLFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcblx0XHRcdGNvbnNvbGUubG9nKGBbR0NQUHViU3ViQWRhcHRlcl0gQ29ubmVjdGVkIHRvIEdDUCBQdWIvU3ViOiAke3RoaXMuY29uZmlnLnByb2plY3RJZH1gKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgRmFpbGVkIHRvIGNvbm5lY3QgdG8gR0NQIFB1Yi9TdWI6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS4gTWFrZSBzdXJlIEBnb29nbGUtY2xvdWQvcHVic3ViIGlzIGluc3RhbGxlZDogbnBtIGluc3RhbGwgQGdvb2dsZS1jbG91ZC9wdWJzdWJgLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGlzY29ubmVjdCBmcm9tIEdDUCBQdWIvU3ViXG5cdCAqL1xuXHRhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHJldHVybjtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBDbG9zZSBhbGwgc3Vic2NyaXB0aW9uc1xuXHRcdFx0Zm9yIChjb25zdCBbbmFtZSwgc3Vic2NyaXB0aW9uXSBvZiB0aGlzLnN1YnNjcmlwdGlvbnMpIHtcblx0XHRcdFx0YXdhaXQgc3Vic2NyaXB0aW9uLmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnN1YnNjcmlwdGlvbnMuY2xlYXIoKTtcblxuXHRcdFx0YXdhaXQgdGhpcy5yZXF1aXJlQ2xpZW50KCkuY2xvc2UoKTtcblx0XHRcdHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG5cdFx0XHRjb25zb2xlLmxvZyhcIltHQ1BQdWJTdWJBZGFwdGVyXSBEaXNjb25uZWN0ZWQgZnJvbSBHQ1AgUHViL1N1YlwiKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgW0dDUFB1YlN1YkFkYXB0ZXJdIEVycm9yIGRpc2Nvbm5lY3Rpbmc6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJzY3JpYmUgdG8gYSBHQ1AgUHViL1N1YiB0b3BpY1xuXHQgKi9cblx0YXN5bmMgc3Vic2NyaWJlKGNvbmZpZzogUHViU3ViVHJpZ2dlck9wdHMsIGhhbmRsZXI6IChtZXNzYWdlOiBQdWJTdWJNZXNzYWdlKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm90IGNvbm5lY3RlZCB0byBHQ1AgUHViL1N1Yi4gQ2FsbCBjb25uZWN0KCkgZmlyc3QuXCIpO1xuXHRcdH1cblxuXHRcdGlmICghY29uZmlnLnN1YnNjcmlwdGlvbikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiW0dDUFB1YlN1YkFkYXB0ZXJdIGBzdWJzY3JpcHRpb25gIGlzIHJlcXVpcmVkIOKAlCBtdXN0IGJlIHRoZSBHQ1Agc3Vic2NyaXB0aW9uIG5hbWUuXCIpO1xuXHRcdH1cblx0XHRjb25zdCBzdWJzY3JpcHRpb25OYW1lID0gY29uZmlnLnN1YnNjcmlwdGlvbjtcblxuXHRcdC8vIEdldCB0aGUgc3Vic2NyaXB0aW9uLiBUaGUgR0NQIFNESyBjYWxscyB0aGUgcGVyLXN1YnNjcmlwdGlvblxuXHRcdC8vIGRlYWRsaW5lIGBtYXhBY2tEZWFkbGluZWAgKGEgYER1cmF0aW9uYCk7IG91ciBhdXRob3ItZmFjaW5nXG5cdFx0Ly8gZmllbGQgaXMgYGFja0RlYWRsaW5lYCAoc2Vjb25kcykgZm9yIHBhcml0eSB3aXRoIG90aGVyXG5cdFx0Ly8gcHJvdmlkZXJzLiBgRHVyYXRpb25gIGlzIHRoZSBHQ1AgU0RLJ3MgdGMzOS1UZW1wb3JhbC1zaGFwZWRcblx0XHQvLyBzaGltIOKAlCBjb25zdHJ1Y3QgdmlhIGBEdXJhdGlvbi5mcm9tKHtzZWNvbmRzfSlgLlxuXHRcdGNvbnN0IHsgRHVyYXRpb24gfSA9IGF3YWl0IGltcG9ydChcIkBnb29nbGUtY2xvdWQvcHVic3ViXCIpO1xuXHRcdGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMucmVxdWlyZUNsaWVudCgpLnN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb25OYW1lLCB7XG5cdFx0XHRmbG93Q29udHJvbDoge1xuXHRcdFx0XHRtYXhNZXNzYWdlczogY29uZmlnLm1heE1lc3NhZ2VzIHx8IDEwLFxuXHRcdFx0fSxcblx0XHRcdG1heEFja0RlYWRsaW5lOiBEdXJhdGlvbi5mcm9tKHsgc2Vjb25kczogY29uZmlnLmFja0RlYWRsaW5lIHx8IDMwIH0pLFxuXHRcdH0pO1xuXG5cdFx0Ly8gTWVzc2FnZSBoYW5kbGVyXG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsZXIgPSBhc3luYyAoZ2NwTWVzc2FnZTogTWVzc2FnZSkgPT4ge1xuXHRcdFx0Ly8gUGFyc2UgbWVzc2FnZSBkYXRhXG5cdFx0XHRsZXQgYm9keTogdW5rbm93bjtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBnY3BNZXNzYWdlLmRhdGEudG9TdHJpbmcoKTtcblx0XHRcdFx0Ym9keSA9IEpTT04ucGFyc2UoZGF0YSk7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0Ym9keSA9IGdjcE1lc3NhZ2UuZGF0YS50b1N0cmluZygpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDcmVhdGUgcHViL3N1YiBtZXNzYWdlXG5cdFx0XHRjb25zdCBwdWJzdWJNZXNzYWdlOiBQdWJTdWJNZXNzYWdlID0ge1xuXHRcdFx0XHRpZDogZ2NwTWVzc2FnZS5pZCB8fCB1dWlkKCksXG5cdFx0XHRcdGJvZHksXG5cdFx0XHRcdGF0dHJpYnV0ZXM6IGdjcE1lc3NhZ2UuYXR0cmlidXRlcyB8fCB7fSxcblx0XHRcdFx0cmF3OiBnY3BNZXNzYWdlLFxuXHRcdFx0XHR0b3BpYzogY29uZmlnLnRvcGljLFxuXHRcdFx0XHRzdWJzY3JpcHRpb246IHN1YnNjcmlwdGlvbk5hbWUsXG5cdFx0XHRcdHB1Ymxpc2hUaW1lOiBnY3BNZXNzYWdlLnB1Ymxpc2hUaW1lID8gbmV3IERhdGUoZ2NwTWVzc2FnZS5wdWJsaXNoVGltZSkgOiBuZXcgRGF0ZSgpLFxuXHRcdFx0XHRhY2s6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRnY3BNZXNzYWdlLmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRuYWNrOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0Z2NwTWVzc2FnZS5uYWNrKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBQcm9jZXNzIG1lc3NhZ2Vcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGhhbmRsZXIocHVic3ViTWVzc2FnZSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBbR0NQUHViU3ViQWRhcHRlcl0gRXJyb3IgcHJvY2Vzc2luZyBtZXNzYWdlOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gRXJyb3IgaGFuZGxlclxuXHRcdGNvbnN0IGVycm9ySGFuZGxlciA9IChlcnJvcjogRXJyb3IpID0+IHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYFtHQ1BQdWJTdWJBZGFwdGVyXSBTdWJzY3JpcHRpb24gZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcblx0XHR9O1xuXG5cdFx0Ly8gQXR0YWNoIGxpc3RlbmVyc1xuXHRcdHN1YnNjcmlwdGlvbi5vbihcIm1lc3NhZ2VcIiwgbWVzc2FnZUhhbmRsZXIpO1xuXHRcdHN1YnNjcmlwdGlvbi5vbihcImVycm9yXCIsIGVycm9ySGFuZGxlcik7XG5cblx0XHQvLyBTdG9yZSBzdWJzY3JpcHRpb24gcmVmZXJlbmNlXG5cdFx0dGhpcy5zdWJzY3JpcHRpb25zLnNldChzdWJzY3JpcHRpb25OYW1lLCBzdWJzY3JpcHRpb24pO1xuXG5cdFx0Y29uc29sZS5sb2coYFtHQ1BQdWJTdWJBZGFwdGVyXSBTdWJzY3JpYmVkIHRvOiAke3N1YnNjcmlwdGlvbk5hbWV9YCk7XG5cdH1cblxuXHQvKipcblx0ICogVW5zdWJzY3JpYmUgZnJvbSBhIEdDUCBQdWIvU3ViIHN1YnNjcmlwdGlvblxuXHQgKi9cblx0YXN5bmMgdW5zdWJzY3JpYmUoc3Vic2NyaXB0aW9uTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5zdWJzY3JpcHRpb25zLmdldChzdWJzY3JpcHRpb25OYW1lKTtcblx0XHRpZiAoc3Vic2NyaXB0aW9uKSB7XG5cdFx0XHRhd2FpdCBzdWJzY3JpcHRpb24uY2xvc2UoKTtcblx0XHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uTmFtZSk7XG5cdFx0XHRjb25zb2xlLmxvZyhgW0dDUFB1YlN1YkFkYXB0ZXJdIFVuc3Vic2NyaWJlZCBmcm9tOiAke3N1YnNjcmlwdGlvbk5hbWV9YCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGNvbm5lY3RlZCB0byBHQ1AgUHViL1N1YlxuXHQgKi9cblx0aXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIHYwLjcgUFIgNiDigJQgcHVibGlzaCB0byBhIEdDUCBQdWIvU3ViIHRvcGljLlxuXHQgKlxuXHQgKiBgcGFydGl0aW9uS2V5YCAvIGBvcmRlcmluZ0tleWAgbWFwIHRvIEdDUCdzIGBvcmRlcmluZ0tleWAgKHRoZVxuXHQgKiB0b3BpYyBtdXN0IGhhdmUgbWVzc2FnZSBvcmRlcmluZyBlbmFibGVkIOKAlCBvdGhlcndpc2UgdGhlIGZpZWxkXG5cdCAqIGlzIGlnbm9yZWQgYnkgdGhlIGJyb2tlcikuXG5cdCAqL1xuXHRhc3luYyBwdWJsaXNoKFxuXHRcdHRvcGljOiBzdHJpbmcsXG5cdFx0cGF5bG9hZDogdW5rbm93bixcblx0XHRvcHRzPzogeyBwYXJ0aXRpb25LZXk/OiBzdHJpbmc7IG9yZGVyaW5nS2V5Pzogc3RyaW5nIH0sXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHRocm93IG5ldyBFcnJvcihcIltibG9rXVtwdWJzdWItZ2NwXSBub3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0Y29uc3QgYm9keSA9IHR5cGVvZiBwYXlsb2FkID09PSBcInN0cmluZ1wiID8gcGF5bG9hZCA6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuXHRcdGNvbnN0IHQgPSB0aGlzLnJlcXVpcmVDbGllbnQoKS50b3BpYyh0b3BpYyk7XG5cdFx0YXdhaXQgdC5wdWJsaXNoTWVzc2FnZSh7XG5cdFx0XHRkYXRhOiBCdWZmZXIuZnJvbShib2R5KSxcblx0XHRcdG9yZGVyaW5nS2V5OiBvcHRzPy5vcmRlcmluZ0tleSA/PyBvcHRzPy5wYXJ0aXRpb25LZXksXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGVhbHRoIGNoZWNrIC0gdmVyaWZ5IEdDUCBQdWIvU3ViIGNvbm5lY3Rpdml0eVxuXHQgKi9cblx0YXN5bmMgaGVhbHRoQ2hlY2soKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIExpc3Qgc3Vic2NyaXB0aW9ucyBhcyBhIGhlYWx0aCBjaGVja1xuXHRcdFx0Y29uc3QgW3N1YnNjcmlwdGlvbnNdID0gYXdhaXQgdGhpcy5yZXF1aXJlQ2xpZW50KCkuZ2V0U3Vic2NyaXB0aW9ucyh7IHBhZ2VTaXplOiAxIH0pO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdDUFB1YlN1YkFkYXB0ZXI7XG4iXX0=
|
|
274
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR0NQUHViU3ViQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9HQ1BQdWJTdWJBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFJSCxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWNsQzs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDbkIsUUFBUSxHQUFHLEtBQWMsQ0FBQztJQUUzQixNQUFNLENBQXFCO0lBQzNCLGFBQWEsR0FBOEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNyRCxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLE1BQU0sQ0FBa0I7SUFFaEM7OztPQUdHO0lBQ0ssYUFBYTtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxZQUFZLE1BQXdCO1FBQ25DLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDYixTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQjtZQUNoRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFdBQVc7U0FDaEMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1osSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFFM0IsSUFBSSxDQUFDO1lBQ0oseUNBQXlDO1lBQ3pDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBRXhELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUM7Z0JBQ3hCLFNBQVMsRUFBRSxJQUFJLENBQUMs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QUM3RSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxDQUFDLGNBQWMsQ0FBQztZQUN0QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdkIsV0FBVyxFQUFFLElBQUksRUFBRSxXQUFXLElBQUksSUFBSSxFQUFFLFlBQVk7U0FDcEQsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFdBQVc7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFbEMsSUFBSSxDQUFDO1lBQ0osdUNBQXVDO1lBQ3ZDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JGLE9BQU8sSUFBSSxDQUFDO1FBQ2IsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNSLE9BQU8sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNGLENBQUM7Q0FDRDtBQUVELGVBQWUsZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdDUFB1YlN1YkFkYXB0ZXIgLSBHb29nbGUgQ2xvdWQgUHViL1N1YiBhZGFwdGVyIGZvciBQdWJTdWJUcmlnZ2VyXG4gKlxuICogVXNlcyBAZ29vZ2xlLWNsb3VkL3B1YnN1YiBmb3IgR0NQIFB1Yi9TdWIgY29ubmVjdGl2aXR5LlxuICogUmVxdWlyZXM6IG5wbSBpbnN0YWxsIEBnb29nbGUtY2xvdWQvcHVic3ViXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBHT09HTEVfQ0xPVURfUFJPSkVDVDogR0NQIHByb2plY3QgSURcbiAqIC0gR09PR0xFX0FQUExJQ0FUSU9OX0NSRURFTlRJQUxTOiBQYXRoIHRvIHNlcnZpY2UgYWNjb3VudCBrZXkgZmlsZSAob3B0aW9uYWwgaWYgdXNpbmcgZGVmYXVsdCBjcmVkZW50aWFscylcbiAqIC0gUFVCU1VCX0VNVUxBVE9SX0hPU1Q6IFB1Yi9TdWIgZW11bGF0b3IgaG9zdCBmb3IgbG9jYWwgZGV2ZWxvcG1lbnQgKG9wdGlvbmFsKVxuICovXG5cbmltcG9ydCB0eXBlIHsgUHViU3ViVHJpZ2dlck9wdHMgfSBmcm9tIFwiQGJsb2tqcy9oZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgUHViU3ViLCBTdWJzY3JpcHRpb24gfSBmcm9tIFwiQGdvb2dsZS1jbG91ZC9wdWJzdWJcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHR5cGUgeyBQdWJTdWJBZGFwdGVyLCBQdWJTdWJNZXNzYWdlIH0gZnJvbSBcIi4uL1B1YlN1YlRyaWdnZXJcIjtcblxuLyoqXG4gKiBHQ1AgUHViL1N1YiBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR0NQUHViU3ViQ29uZmlnIHtcblx0cHJvamVjdElkPzogc3RyaW5nO1xuXHRjcmVkZW50aWFscz86IHtcblx0XHRjbGllbnRfZW1haWw6IHN0cmluZztcblx0XHRwcml2YXRlX2tleTogc3RyaW5nO1xuXHR9O1xufVxuXG4vKipcbiAqIEdDUFB1YlN1YkFkYXB0ZXIgLSBHb29nbGUgQ2xvdWQgUHViL1N1YiBpbXBsZW1lbnRhdGlvblxuICovXG5leHBvcnQgY2xhc3MgR0NQUHViU3ViQWRhcHRlciBpbXBsZW1lbnRzIFB1YlN1YkFkYXB0ZXIge1xuXHRyZWFkb25seSBwcm92aWRlciA9IFwiZ2NwXCIgYXMgY29uc3Q7XG5cblx0cHJpdmF0ZSBjbGllbnQ6IFB1YlN1YiB8IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBTdWJzY3JpcHRpb24+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGNvbmZpZzogR0NQUHViU3ViQ29uZmlnO1xuXG5cdC8qKlxuXHQgKiBUeXBlLW5hcnJvd2luZyBhY2Nlc3NvciBmb3IgYHRoaXMuY2xpZW50YC4gRmllbGQgaXMgdW5kZWZpbmVkIHVudGlsXG5cdCAqIGBjb25uZWN0KClgIHJ1bnMuXG5cdCAqL1xuXHRwcml2YXRlIHJlcXVpcmVDbGllbnQoKTogUHViU3ViIHtcblx0XHRpZiAoIXRoaXMuY2xpZW50KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJbR0NQUHViU3ViQWRhcHRlcl0gY2xpZW50IGlzIG5vdCBpbml0aWFsaXNlZCDigJQgY2FsbCBjb25uZWN0KCkgZmlyc3RcIik7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNsaWVudDtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKGNvbmZpZz86IEdDUFB1YlN1YkNvbmZpZykge1xuXHRcdHRoaXMuY29uZmlnID0ge1xuXHRcdFx0cHJvamVjdElkOiBjb25maWc/LnByb2plY3RJZCB8fCBwcm9jZXNzLmVudi5HT09HTEVfQ0xPVURfUFJPSkVDVCxcblx0XHRcdGNyZWRlbnRpYWxzOiBjb25maWc/LmNyZWRlbnRpYWxzLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQ29ubmVjdCB0byBHQ1AgUHViL1N1YlxuXHQgKi9cblx0YXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy5jb25uZWN0ZWQpIHJldHVybjtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBEeW5hbWljIGltcG9ydCBvZiBAZ29vZ2xlLWNsb3VkL3B1YnN1YlxuXHRcdFx0Y29uc3QgeyBQdWJTdWIgfSA9IGF3YWl0IGltcG9ydChcIkBnb29nbGUtY2xvdWQvcHVic3ViXCIpO1xuXG5cdFx0XHR0aGlzLmNsaWVudCA9IG5ldyBQdWJTdWIoe1xuXHRcdFx0XHRwcm9qZWN0SWQ6IHRoaXMuY29uZmlnLnByb2plY3RJZCxcblx0XHRcdFx0Y3JlZGVudGlhbHM6IHRoaXMuY29uZmlnLmNyZWRlbnRpYWxzLFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcblx0XHRcdGNvbnNvbGUubG9nKGBbR0NQUHViU3ViQWRhcHRlcl0gQ29ubmVjdGVkIHRvIEdDUCBQdWIvU3ViOiAke3RoaXMuY29uZmlnLnByb2plY3RJZH1gKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgRmFpbGVkIHRvIGNvbm5lY3QgdG8gR0NQIFB1Yi9TdWI6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS4gTWFrZSBzdXJlIEBnb29nbGUtY2xvdWQvcHVic3ViIGlzIGluc3RhbGxlZDogbnBtIGluc3RhbGwgQGdvb2dsZS1jbG91ZC9wdWJzdWJgLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGlzY29ubmVjdCBmcm9tIEdDUCBQdWIvU3ViXG5cdCAqL1xuXHRhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHJldHVybjtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBDbG9zZSBhbGwgc3Vic2NyaXB0aW9uc1xuXHRcdFx0Zm9yIChjb25zdCBbbmFtZSwgc3Vic2NyaXB0aW9uXSBvZiB0aGlzLnN1YnNjcmlwdGlvbnMpIHtcblx0XHRcdFx0YXdhaXQgc3Vic2NyaXB0aW9uLmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnN1YnNjcmlwdGlvbnMuY2xlYXIoKTtcblxuXHRcdFx0YXdhaXQgdGhpcy5yZXF1aXJlQ2xpZW50KCkuY2xvc2UoKTtcblx0XHRcdHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG5cdFx0XHRjb25zb2xlLmxvZyhcIltHQ1BQdWJTdWJBZGFwdGVyXSBEaXNjb25uZWN0ZWQgZnJvbSBHQ1AgUHViL1N1YlwiKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgW0dDUFB1YlN1YkFkYXB0ZXJdIEVycm9yIGRpc2Nvbm5lY3Rpbmc6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJzY3JpYmUgdG8gYSBHQ1AgUHViL1N1YiB0b3BpY1xuXHQgKi9cblx0YXN5bmMgc3Vic2NyaWJlKGNvbmZpZzogUHViU3ViVHJpZ2dlck9wdHMsIGhhbmRsZXI6IChtZXNzYWdlOiBQdWJTdWJNZXNzYWdlKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm90IGNvbm5lY3RlZCB0byBHQ1AgUHViL1N1Yi4gQ2FsbCBjb25uZWN0KCkgZmlyc3QuXCIpO1xuXHRcdH1cblxuXHRcdGlmICghY29uZmlnLnN1YnNjcmlwdGlvbikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiW0dDUFB1YlN1YkFkYXB0ZXJdIGBzdWJzY3JpcHRpb25gIGlzIHJlcXVpcmVkIOKAlCBtdXN0IGJlIHRoZSBHQ1Agc3Vic2NyaXB0aW9uIG5hbWUuXCIpO1xuXHRcdH1cblx0XHRjb25zdCBzdWJzY3JpcHRpb25OYW1lID0gY29uZmlnLnN1YnNjcmlwdGlvbjtcblxuXHRcdC8vIEdldCB0aGUgc3Vic2NyaXB0aW9uLiBUaGUgR0NQIFNESyBjYWxscyB0aGUgcGVyLXN1YnNjcmlwdGlvblxuXHRcdC8vIGRlYWRsaW5lIGBtYXhBY2tEZWFkbGluZWAgKGEgYER1cmF0aW9uYCk7IG91ciBhdXRob3ItZmFjaW5nXG5cdFx0Ly8gZmllbGQgaXMgYGFja0RlYWRsaW5lYCAoc2Vjb25kcykgZm9yIHBhcml0eSB3aXRoIG90aGVyXG5cdFx0Ly8gcHJvdmlkZXJzLiBgRHVyYXRpb25gIGlzIHRoZSBHQ1AgU0RLJ3MgdGMzOS1UZW1wb3JhbC1zaGFwZWRcblx0XHQvLyBzaGltIOKAlCBjb25zdHJ1Y3QgdmlhIGBEdXJhdGlvbi5mcm9tKHtzZWNvbmRzfSlgLlxuXHRcdGNvbnN0IHsgRHVyYXRpb24gfSA9IGF3YWl0IGltcG9ydChcIkBnb29nbGUtY2xvdWQvcHVic3ViXCIpO1xuXHRcdGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMucmVxdWlyZUNsaWVudCgpLnN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb25OYW1lLCB7XG5cdFx0XHRmbG93Q29udHJvbDoge1xuXHRcdFx0XHRtYXhNZXNzYWdlczogY29uZmlnLm1heE1lc3NhZ2VzIHx8IDEwLFxuXHRcdFx0fSxcblx0XHRcdG1heEFja0RlYWRsaW5lOiBEdXJhdGlvbi5mcm9tKHsgc2Vjb25kczogY29uZmlnLmFja0RlYWRsaW5lIHx8IDMwIH0pLFxuXHRcdH0pO1xuXG5cdFx0Ly8gYGRlYWRMZXR0ZXJUb3BpY2AgLyBgZmlsdGVyYCBhcmUgc2V0IGF0IHRoZSBHQ1Agc3Vic2NyaXB0aW9uXG5cdFx0Ly8gcmVzb3VyY2UgbGV2ZWwg4oCUIHRoZXkgY2FuIG9ubHkgYmUgcHJvdmlzaW9uZWQgYXQgY3JlYXRlIHRpbWUgKG9yXG5cdFx0Ly8gdmlhIHNldE1ldGFkYXRhIGZvciB0aGUgZGVhZC1sZXR0ZXIgcG9saWN5KS4gUmVjb25jaWxlIHRoZW0gaGVyZTpcblx0XHQvLyBjcmVhdGUgdGhlIHN1YnNjcmlwdGlvbiB3aXRoIHRoZSByZXF1ZXN0ZWQgcG9saWN5LCBvciBpZiBpdFxuXHRcdC8vIGFscmVhZHkgZXhpc3RzLCB2ZXJpZnkgaXQgbWF0Y2hlcyBhbmQgdGhyb3cgb24gYSBtaXNtYXRjaCByYXRoZXJcblx0XHQvLyB0aGFuIHNpbGVudGx5IGlnbm9yaW5nIHRoZSBhdXRob3IncyBpbnRlbnQuXG5cdFx0YXdhaXQgdGhpcy5yZWNvbmNpbGVTdWJzY3JpcHRpb25Db25maWcoc3Vic2NyaXB0aW9uLCBzdWJzY3JpcHRpb25OYW1lLCBjb25maWcpO1xuXG5cdFx0Ly8gVHJhbnNsYXRlIGBzdGFydEZyb21gIGludG8gYSBHQ1Agc2VlayBCRUZPUkUgYXR0YWNoaW5nIGxpc3RlbmVycyxcblx0XHQvLyBzbyByZXBsYXkgaGFwcGVucyBiZWZvcmUgdGhlIHN0cmVhbWluZyBwdWxsIHN0YXJ0cyBkZWxpdmVyaW5nLlxuXHRcdC8vIEdDUCBzZWVrcyBieSB0aW1lc3RhbXAvc25hcHNob3Q7IHRoZXJlIGlzIG5vIHNlcXVlbmNlLW51bWJlciBzZWVrLlxuXHRcdGF3YWl0IHRoaXMuYXBwbHlTdGFydEZyb20oc3Vic2NyaXB0aW9uLCBjb25maWcuc3RhcnRGcm9tKTtcblxuXHRcdC8vIE1lc3NhZ2UgaGFuZGxlclxuXHRcdGNvbnN0IG1lc3NhZ2VIYW5kbGVyID0gYXN5bmMgKGdjcE1lc3NhZ2U6IE1lc3NhZ2UpID0+IHtcblx0XHRcdC8vIFBhcnNlIG1lc3NhZ2UgZGF0YVxuXHRcdFx0bGV0IGJvZHk6IHVua25vd247XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBkYXRhID0gZ2NwTWVzc2FnZS5kYXRhLnRvU3RyaW5nKCk7XG5cdFx0XHRcdGJvZHkgPSBKU09OLnBhcnNlKGRhdGEpO1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdGJvZHkgPSBnY3BNZXNzYWdlLmRhdGEudG9TdHJpbmcoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ3JlYXRlIHB1Yi9zdWIgbWVzc2FnZVxuXHRcdFx0Y29uc3QgcHVic3ViTWVzc2FnZTogUHViU3ViTWVzc2FnZSA9IHtcblx0XHRcdFx0aWQ6IGdjcE1lc3NhZ2UuaWQgfHwgdXVpZCgpLFxuXHRcdFx0XHRib2R5LFxuXHRcdFx0XHRhdHRyaWJ1dGVzOiBnY3BNZXNzYWdlLmF0dHJpYnV0ZXMgfHwge30sXG5cdFx0XHRcdHJhdzogZ2NwTWVzc2FnZSxcblx0XHRcdFx0dG9waWM6IGNvbmZpZy50b3BpYyxcblx0XHRcdFx0c3Vic2NyaXB0aW9uOiBzdWJzY3JpcHRpb25OYW1lLFxuXHRcdFx0XHRwdWJsaXNoVGltZTogZ2NwTWVzc2FnZS5wdWJsaXNoVGltZSA/IG5ldyBEYXRlKGdjcE1lc3NhZ2UucHVibGlzaFRpbWUpIDogbmV3IERhdGUoKSxcblx0XHRcdFx0YWNrOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0Z2NwTWVzc2FnZS5hY2soKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0bmFjazogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGdjcE1lc3NhZ2UubmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gUHJvY2VzcyBtZXNzYWdlXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBoYW5kbGVyKHB1YnN1Yk1lc3NhZ2UpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcihgW0dDUFB1YlN1YkFkYXB0ZXJdIEVycm9yIHByb2Nlc3NpbmcgbWVzc2FnZTogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8vIEVycm9yIGhhbmRsZXJcblx0XHRjb25zdCBlcnJvckhhbmRsZXIgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGBbR0NQUHViU3ViQWRhcHRlcl0gU3Vic2NyaXB0aW9uIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG5cdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBsaXN0ZW5lcnNcblx0XHRzdWJzY3JpcHRpb24ub24oXCJtZXNzYWdlXCIsIG1lc3NhZ2VIYW5kbGVyKTtcblx0XHRzdWJzY3JpcHRpb24ub24oXCJlcnJvclwiLCBlcnJvckhhbmRsZXIpO1xuXG5cdFx0Ly8gU3RvcmUgc3Vic2NyaXB0aW9uIHJlZmVyZW5jZVxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5zZXQoc3Vic2NyaXB0aW9uTmFtZSwgc3Vic2NyaXB0aW9uKTtcblxuXHRcdGNvbnNvbGUubG9nKGBbR0NQUHViU3ViQWRhcHRlcl0gU3Vic2NyaWJlZCB0bzogJHtzdWJzY3JpcHRpb25OYW1lfWApO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyYW5zbGF0ZSBgc3RhcnRGcm9tYCBpbnRvIGEgR0NQIGBzdWJzY3JpcHRpb24uc2VlaygpYC5cblx0ICpcblx0ICogLSBgXCJsYXRlc3RcImAgLyB1bnNldCDihpIgbm8tb3AgKHN0cmVhbWluZyBwdWxsIGFscmVhZHkgZGVsaXZlcnMgb25seVxuXHQgKiAgIG1lc3NhZ2VzIHB1Ymxpc2hlZCBhZnRlciB0aGUgc3Vic2NyaWJlciBhdHRhY2hlcykuXG5cdCAqIC0gYFwiZWFybGllc3RcImAg4oaSIHNlZWsgdG8gdGhlIGVwb2NoOyBHQ1AgY2xhbXBzIHRvIHRoZSByZXRlbnRpb24gZmxvb3Jcblx0ICogICBhbmQgcmVwbGF5cyBldmVyeXRoaW5nIHN0aWxsIHJldGFpbmVkLlxuXHQgKiAtIGB7IHRpbWVzdGFtcCB9YCAodW5peCBzZWNvbmRzKSDihpIgc2VlayB0byB0aGF0IHdhbGwtY2xvY2sgaW5zdGFudC5cblx0ICogLSBgeyBzZXEgfWAg4oaSIHJlamVjdGVkOiBHQ1AgUHViL1N1YiBoYXMgbm8gc2VxdWVuY2UtbnVtYmVyIGN1cnNvci5cblx0ICovXG5cdHByaXZhdGUgYXN5bmMgYXBwbHlTdGFydEZyb20oc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24sIHN0YXJ0RnJvbTogUHViU3ViVHJpZ2dlck9wdHNbXCJzdGFydEZyb21cIl0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoc3RhcnRGcm9tID09PSB1bmRlZmluZWQgfHwgc3RhcnRGcm9tID09PSBcImxhdGVzdFwiKSByZXR1cm47XG5cdFx0aWYgKHN0YXJ0RnJvbSA9PT0gXCJlYXJsaWVzdFwiKSB7XG5cdFx0XHRhd2FpdCBzdWJzY3JpcHRpb24uc2VlayhuZXcgRGF0ZSgwKSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChcInRpbWVzdGFtcFwiIGluIHN0YXJ0RnJvbSkge1xuXHRcdFx0YXdhaXQgc3Vic2NyaXB0aW9uLnNlZWsobmV3IERhdGUoc3RhcnRGcm9tLnRpbWVzdGFtcCAqIDEwMDApKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Ly8geyBzZXEgfSDigJQgR0NQIFB1Yi9TdWIgc2Vla3MgYnkgdGltZXN0YW1wIG9yIHNuYXBzaG90IG9ubHk7IHRoZXJlIGlzXG5cdFx0Ly8gbm8gb2Zmc2V0L3NlcXVlbmNlIGN1cnNvci4gUmVqZWN0IGxvdWRseSBpbnN0ZWFkIG9mIHNpbGVudGx5XG5cdFx0Ly8gZHJvcHBpbmcgdGhlIGF1dGhvcidzIHJlcGxheSBpbnRlbnQuXG5cdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XCJbR0NQUHViU3ViQWRhcHRlcl0gc3RhcnRGcm9tIGB7c2VxfWAgaXMgbm90IHN1cHBvcnRlZCDigJQgR0NQIFB1Yi9TdWIgc2Vla3MgYnkgdGltZXN0YW1wIG9yIHNuYXBzaG90IG9ubHkuIFVzZSBge3RpbWVzdGFtcH1gLCBgZWFybGllc3RgLCBvciBgbGF0ZXN0YC5cIixcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb3Zpc2lvbiBgZGVhZExldHRlclRvcGljYCAvIGBmaWx0ZXJgIG9uIHRoZSBzdWJzY3JpcHRpb24gcmVzb3VyY2UuXG5cdCAqXG5cdCAqIFRoZXNlIGFyZSBjcmVhdGUtdGltZSBwcm9wZXJ0aWVzIGluIEdDUC4gV2hlbiB0aGUgc3Vic2NyaXB0aW9uIGRvZXNcblx0ICogbm90IHlldCBleGlzdCB3ZSBjcmVhdGUgaXQgd2l0aCB0aGUgcmVxdWVzdGVkIHBvbGljeS9maWx0ZXIuIFdoZW4gaXRcblx0ICogYWxyZWFkeSBleGlzdHMgd2UgdmVyaWZ5IHRoZSBsaXZlIG1ldGFkYXRhIG1hdGNoZXMg4oCUIGBmaWx0ZXJgIGlzXG5cdCAqIGltbXV0YWJsZSBzbyBhIG1pc21hdGNoIHRocm93czsgYSBkZWFkLWxldHRlciBtaXNtYXRjaCBpcyBwYXRjaGVkIHZpYVxuXHQgKiBgc2V0TWV0YWRhdGFgICh0aGUgb25lIGZpZWxkIEdDUCBsZXRzIHlvdSBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24pLlxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyByZWNvbmNpbGVTdWJzY3JpcHRpb25Db25maWcoXG5cdFx0c3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24sXG5cdFx0c3Vic2NyaXB0aW9uTmFtZTogc3RyaW5nLFxuXHRcdGNvbmZpZzogUHViU3ViVHJpZ2dlck9wdHMsXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghY29uZmlnLmRlYWRMZXR0ZXJUb3BpYyAmJiAhY29uZmlnLmZpbHRlcikgcmV0dXJuO1xuXG5cdFx0Y29uc3QgZGVhZExldHRlclBvbGljeSA9IGNvbmZpZy5kZWFkTGV0dGVyVG9waWNcblx0XHRcdD8geyBkZWFkTGV0dGVyVG9waWM6IHRoaXMucmVxdWlyZUNsaWVudCgpLnRvcGljKGNvbmZpZy5kZWFkTGV0dGVyVG9waWMpLm5hbWUgfVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBbZXhpc3RzXSA9IGF3YWl0IHN1YnNjcmlwdGlvbi5leGlzdHMoKTtcblx0XHRpZiAoIWV4aXN0cykge1xuXHRcdFx0Ly8gQSBzdWJzY3JpcHRpb24gb2J0YWluZWQgdmlhIGBjbGllbnQuc3Vic2NyaXB0aW9uKG5hbWUpYCBpc1xuXHRcdFx0Ly8gZGV0YWNoZWQgZnJvbSBpdHMgdG9waWMgYW5kIHRoZSBTREsgcmVmdXNlcyB0byBgLmNyZWF0ZSgpYCBpdFxuXHRcdFx0Ly8gKFwiU3Vic2NyaXB0aW9ucyBjYW4gb25seSBiZSBjcmVhdGVkIHdoZW4gYWNjZXNzZWQgdGhyb3VnaFxuXHRcdFx0Ly8gVG9waWNzXCIpLiBDcmVhdGUgdGhyb3VnaCB0aGUgdG9waWMgaW5zdGVhZC5cblx0XHRcdGF3YWl0IHRoaXMucmVxdWlyZUNsaWVudCgpXG5cdFx0XHRcdC50b3BpYyhjb25maWcudG9waWMpXG5cdFx0XHRcdC5jcmVhdGVTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uTmFtZSwge1xuXHRcdFx0XHRcdC4uLihjb25maWcuZmlsdGVyID8geyBmaWx0ZXI6IGNvbmZpZy5maWx0ZXIgfSA6IHt9KSxcblx0XHRcdFx0XHQuLi4oZGVhZExldHRlclBvbGljeSA/IHsgZGVhZExldHRlclBvbGljeSB9IDoge30pLFxuXHRcdFx0XHR9KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBbbWV0YWRhdGFdID0gYXdhaXQgc3Vic2NyaXB0aW9uLmdldE1ldGFkYXRhKCk7XG5cblx0XHQvLyBgZmlsdGVyYCBpcyBpbW11dGFibGUgYWZ0ZXIgY3JlYXRpb24g4oCUIGEgbWlzbWF0Y2ggbWVhbnMgdGhlIGNhbGxlclxuXHRcdC8vIGFza2VkIGZvciBhIGZpbHRlciB0aGUgcHJlLWV4aXN0aW5nIHN1YnNjcmlwdGlvbiBjYW4ndCBob25vci5cblx0XHRpZiAoY29uZmlnLmZpbHRlciAmJiAobWV0YWRhdGEuZmlsdGVyIHx8IFwiXCIpICE9PSBjb25maWcuZmlsdGVyKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdGBbR0NQUHViU3ViQWRhcHRlcl0gc3Vic2NyaXB0aW9uIFwiJHtzdWJzY3JpcHRpb25OYW1lfVwiIGFscmVhZHkgZXhpc3RzIHdpdGggZmlsdGVyIFwiJHttZXRhZGF0YS5maWx0ZXIgfHwgXCJcIn1cIiB3aGljaCBkaWZmZXJzIGZyb20gdGhlIHJlcXVlc3RlZCBmaWx0ZXIgXCIke2NvbmZpZy5maWx0ZXJ9XCIuIEdDUCBmaWx0ZXJzIGFyZSBpbW11dGFibGU7IGRlbGV0ZSBhbmQgcmVjcmVhdGUgdGhlIHN1YnNjcmlwdGlvbi5gLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAoZGVhZExldHRlclBvbGljeSAmJiBtZXRhZGF0YS5kZWFkTGV0dGVyUG9saWN5Py5kZWFkTGV0dGVyVG9waWMgIT09IGRlYWRMZXR0ZXJQb2xpY3kuZGVhZExldHRlclRvcGljKSB7XG5cdFx0XHRhd2FpdCBzdWJzY3JpcHRpb24uc2V0TWV0YWRhdGEoeyBkZWFkTGV0dGVyUG9saWN5IH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBVbnN1YnNjcmliZSBmcm9tIGEgR0NQIFB1Yi9TdWIgc3Vic2NyaXB0aW9uXG5cdCAqL1xuXHRhc3luYyB1bnN1YnNjcmliZShzdWJzY3JpcHRpb25OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbk5hbWUpO1xuXHRcdGlmIChzdWJzY3JpcHRpb24pIHtcblx0XHRcdGF3YWl0IHN1YnNjcmlwdGlvbi5jbG9zZSgpO1xuXHRcdFx0dGhpcy5zdWJzY3JpcHRpb25zLmRlbGV0ZShzdWJzY3JpcHRpb25OYW1lKTtcblx0XHRcdGNvbnNvbGUubG9nKGBbR0NQUHViU3ViQWRhcHRlcl0gVW5zdWJzY3JpYmVkIGZyb206ICR7c3Vic2NyaXB0aW9uTmFtZX1gKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgaWYgY29ubmVjdGVkIHRvIEdDUCBQdWIvU3ViXG5cdCAqL1xuXHRpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG5cdH1cblxuXHQvKipcblx0ICogdjAuNyBQUiA2IOKAlCBwdWJsaXNoIHRvIGEgR0NQIFB1Yi9TdWIgdG9waWMuXG5cdCAqXG5cdCAqIGBwYXJ0aXRpb25LZXlgIC8gYG9yZGVyaW5nS2V5YCBtYXAgdG8gR0NQJ3MgYG9yZGVyaW5nS2V5YCAodGhlXG5cdCAqIHRvcGljIG11c3QgaGF2ZSBtZXNzYWdlIG9yZGVyaW5nIGVuYWJsZWQg4oCUIG90aGVyd2lzZSB0aGUgZmllbGRcblx0ICogaXMgaWdub3JlZCBieSB0aGUgYnJva2VyKS5cblx0ICovXG5cdGFzeW5jIHB1Ymxpc2goXG5cdFx0dG9waWM6IHN0cmluZyxcblx0XHRwYXlsb2FkOiB1bmtub3duLFxuXHRcdG9wdHM/OiB7IHBhcnRpdGlvbktleT86IHN0cmluZzsgb3JkZXJpbmdLZXk/OiBzdHJpbmcgfSxcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgdGhyb3cgbmV3IEVycm9yKFwiW2Jsb2tdW3B1YnN1Yi1nY3BdIG5vdCBjb25uZWN0ZWQuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHRjb25zdCBib2R5ID0gdHlwZW9mIHBheWxvYWQgPT09IFwic3RyaW5nXCIgPyBwYXlsb2FkIDogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG5cdFx0Y29uc3QgdCA9IHRoaXMucmVxdWlyZUNsaWVudCgpLnRvcGljKHRvcGljKTtcblx0XHRhd2FpdCB0LnB1Ymxpc2hNZXNzYWdlKHtcblx0XHRcdGRhdGE6IEJ1ZmZlci5mcm9tKGJvZHkpLFxuXHRcdFx0b3JkZXJpbmdLZXk6IG9wdHM/Lm9yZGVyaW5nS2V5ID8/IG9wdHM/LnBhcnRpdGlvbktleSxcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIZWFsdGggY2hlY2sgLSB2ZXJpZnkgR0NQIFB1Yi9TdWIgY29ubmVjdGl2aXR5XG5cdCAqL1xuXHRhc3luYyBoZWFsdGhDaGVjaygpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSByZXR1cm4gZmFsc2U7XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gTGlzdCBzdWJzY3JpcHRpb25zIGFzIGEgaGVhbHRoIGNoZWNrXG5cdFx0XHRjb25zdCBbc3Vic2NyaXB0aW9uc10gPSBhd2FpdCB0aGlzLnJlcXVpcmVDbGllbnQoKS5nZXRTdWJzY3JpcHRpb25zKHsgcGFnZVNpemU6IDEgfSk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgR0NQUHViU3ViQWRhcHRlcjtcbiJdfQ==
|
|
@@ -10,10 +10,8 @@
|
|
|
10
10
|
* Replay cursors via `startFrom`:
|
|
11
11
|
* - `"earliest"` → `fromBeginning: true` on first subscribe.
|
|
12
12
|
* - `"latest"` (default) → only new messages.
|
|
13
|
-
* - `{seq: N}`
|
|
14
|
-
*
|
|
15
|
-
* subscribe; v1 honors `earliest` / `latest` and `{seq}` via
|
|
16
|
-
* `auto.offset.reset` only.
|
|
13
|
+
* - `{seq: N}` → `consumer.seek()` every assigned partition to offset N.
|
|
14
|
+
* - `{timestamp: ms}` → resolve broker offsets at that timestamp, then seek.
|
|
17
15
|
*
|
|
18
16
|
* Requires `kafkajs` as a peer dependency.
|
|
19
17
|
*
|
|
@@ -43,6 +41,7 @@ export declare class KafkaPubSubAdapter implements PubSubAdapter {
|
|
|
43
41
|
connect(): Promise<void>;
|
|
44
42
|
disconnect(): Promise<void>;
|
|
45
43
|
subscribe(config: PubSubTriggerOpts, handler: (message: PubSubMessage) => Promise<void>): Promise<void>;
|
|
44
|
+
private applyStartFrom;
|
|
46
45
|
unsubscribe(subscription: string): Promise<void>;
|
|
47
46
|
publish(topic: string, payload: unknown, opts?: {
|
|
48
47
|
partitionKey?: string;
|
|
@@ -10,10 +10,8 @@
|
|
|
10
10
|
* Replay cursors via `startFrom`:
|
|
11
11
|
* - `"earliest"` → `fromBeginning: true` on first subscribe.
|
|
12
12
|
* - `"latest"` (default) → only new messages.
|
|
13
|
-
* - `{seq: N}`
|
|
14
|
-
*
|
|
15
|
-
* subscribe; v1 honors `earliest` / `latest` and `{seq}` via
|
|
16
|
-
* `auto.offset.reset` only.
|
|
13
|
+
* - `{seq: N}` → `consumer.seek()` every assigned partition to offset N.
|
|
14
|
+
* - `{timestamp: ms}` → resolve broker offsets at that timestamp, then seek.
|
|
17
15
|
*
|
|
18
16
|
* Requires `kafkajs` as a peer dependency.
|
|
19
17
|
*
|
|
@@ -94,6 +92,7 @@ export class KafkaPubSubAdapter {
|
|
|
94
92
|
const groupId = config.consumerGroup ?? `blok-fanout-${uuid().slice(0, 8)}-${config.topic.replace(/[^a-zA-Z0-9_]/g, "_")}`;
|
|
95
93
|
const consumer = this.kafka.consumer({ groupId });
|
|
96
94
|
await consumer.connect();
|
|
95
|
+
const seekCursor = typeof config.startFrom === "object" ? config.startFrom : undefined;
|
|
97
96
|
const fromBeginning = config.startFrom === "earliest";
|
|
98
97
|
await consumer.subscribe({ topic: config.topic, fromBeginning });
|
|
99
98
|
this.consumers.set(`${config.topic}#${groupId}`, consumer);
|
|
@@ -113,6 +112,13 @@ export class KafkaPubSubAdapter {
|
|
|
113
112
|
for (const [k, v] of Object.entries(message.headers))
|
|
114
113
|
attributes[k] = v?.toString("utf8") ?? "";
|
|
115
114
|
}
|
|
115
|
+
// kafkajs has no per-message nack; the ONLY way to suppress the
|
|
116
|
+
// auto-commit of a failed offset is to throw out of eachMessage.
|
|
117
|
+
// PubSubTrigger.handleMessage catches handler errors and calls
|
|
118
|
+
// nack() (it never re-throws), so without this flag the offset
|
|
119
|
+
// would auto-commit and the failed message would be lost. We set
|
|
120
|
+
// a flag on nack() and throw after the handler returns.
|
|
121
|
+
let nacked = false;
|
|
116
122
|
const msg = {
|
|
117
123
|
id: `${config.topic}:${message.offset}`,
|
|
118
124
|
body,
|
|
@@ -125,15 +131,41 @@ export class KafkaPubSubAdapter {
|
|
|
125
131
|
/* autoCommit handles ack */
|
|
126
132
|
},
|
|
127
133
|
nack: async () => {
|
|
128
|
-
|
|
134
|
+
nacked = true;
|
|
129
135
|
},
|
|
130
136
|
};
|
|
131
|
-
// On handler failure: re-throw so kafkajs suppresses the
|
|
132
|
-
// offset commit; the consumer will re-poll the message
|
|
133
|
-
// on the next cycle. The throw is intentional.
|
|
134
137
|
await handler(msg);
|
|
138
|
+
// At-least-once (default): a nacked message must NOT be
|
|
139
|
+
// committed — throw so kafkajs redelivers it. At-most-once
|
|
140
|
+
// (ack:false) never commits per-message anyway, so a nack is a
|
|
141
|
+
// no-op there (the message is considered consumed once).
|
|
142
|
+
if (nacked && config.ack !== false) {
|
|
143
|
+
throw new Error(`[blok][pubsub-kafka] message ${msg.id} nacked — suppressing offset commit for redelivery`);
|
|
144
|
+
}
|
|
135
145
|
},
|
|
136
146
|
});
|
|
147
|
+
if (seekCursor)
|
|
148
|
+
await this.applyStartFrom(consumer, config.topic, seekCursor);
|
|
149
|
+
}
|
|
150
|
+
async applyStartFrom(consumer, topic, cursor) {
|
|
151
|
+
const admin = this.kafka.admin();
|
|
152
|
+
await admin.connect();
|
|
153
|
+
try {
|
|
154
|
+
if ("seq" in cursor) {
|
|
155
|
+
const offset = String(cursor.seq);
|
|
156
|
+
const metadata = await admin.fetchTopicMetadata({ topics: [topic] });
|
|
157
|
+
for (const partition of metadata.topics[0]?.partitions ?? []) {
|
|
158
|
+
consumer.seek({ topic, partition: partition.partitionId, offset });
|
|
159
|
+
}
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const offsets = await admin.fetchTopicOffsetsByTimestamp(topic, cursor.timestamp);
|
|
163
|
+
for (const { partition, offset } of offsets)
|
|
164
|
+
consumer.seek({ topic, partition, offset });
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
await admin.disconnect().catch(() => { });
|
|
168
|
+
}
|
|
137
169
|
}
|
|
138
170
|
async unsubscribe(subscription) {
|
|
139
171
|
const consumer = this.consumers.get(subscription);
|
|
@@ -165,4 +197,4 @@ export class KafkaPubSubAdapter {
|
|
|
165
197
|
return this.connected;
|
|
166
198
|
}
|
|
167
199
|
}
|
|
168
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2Fma2FQdWJTdWJBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXJzL0thZmthUHViU3ViQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBR0gsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFnQmxDLE1BQU0sT0FBTyxrQkFBa0I7SUFDckIsUUFBUSxHQUFHLE9BQWdCLENBQUM7SUFDcEIsTUFBTSxDQUFvQjtJQUMzQyx1R0FBdUc7SUFDL0YsS0FBSyxHQUFRLElBQUksQ0FBQztJQUMxQiw0RkFBNEY7SUFDcEYsUUFBUSxHQUFRLElBQUksQ0FBQztJQUNyQixTQUFTLEdBQXFDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDeEQsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUUxQixZQUFZLE1BQW1DO1FBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDYixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNHLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLGFBQWE7WUFDMUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUI7WUFDckUsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUI7WUFDckUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssTUFBTTtTQUNwRCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPO1FBQ1osSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFDM0IsSUFBSSxDQUFDO1lBQ0osNkVBQTZFO1lBQzdFLE1BQU0sT0FBTyxHQUFRLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sSUFBSSxHQUNULElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWTtnQkFDbkQsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFO2dCQUNoRyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQzlCLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7Z0JBQzlCLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87Z0JBQzVCLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUc7Z0JBQ3BCLElBQUk7YUFDSixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FDZCx3Q0FBeUMsR0FBYSxDQUFDLE9BQU8seURBQXlELENBQ3ZILENBQUM7UUFDSCxDQUFDO0lBQ0YsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTztRQUM1QixLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUM7Z0JBQ0osTUFBTSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUixZQUFZO1lBQ2IsQ0FBQztRQUNGLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQztZQUNKLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsQ0FBQztRQUNuQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1IsWUFBWTtRQUNiLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUF5QixFQUFFLE9BQWtEO1FBQzVGLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztRQUNsRyxpRUFBaUU7UUFDakUsa0VBQWtFO1FBQ2xFLE1BQU0sT0FBTyxHQUNaLE1BQU0sQ0FBQyxhQUFhLElBQUksZUFBZSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUcsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEtBQUssVUFBVSxDQUFDO1FBQ3RELE1BQU0sUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLE9BQU8sRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTNELE1BQU0sUUFBUSxDQUFDLEdBQUcsQ0FBQztZQUNsQixVQUFVLEVBQUUsTUFBTSxDQUFDLEdBQUcsS0FBSyxLQUFLO1lBQ2hDLFdBQVcsRUFBRSxLQUFLLEVBQUUsRUFDbkIsT0FBTyxHQUdQLEVBQUUsRUFBRTtnQkFDSixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25ELElBQUksSUFBSSxHQUFZLElBQUksQ0FBQztnQkFDekIsSUFBSSxDQUFDO29CQUNKLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNsRCxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUixtQkFBbUI7Z0JBQ3BCLENBQUM7Z0JBQ0QsTUFBTSxVQUFVLEdBQTJCLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3JCLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7d0JBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNqRyxDQUFDO2dCQUNELE1BQU0sR0FBRyxHQUFrQjtvQkFDMUIsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO29CQUN2QyxJQUFJO29CQUNKLFVBQVU7b0JBQ1YsR0FBRyxFQUFFLE9BQU87b0JBQ1osS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO29CQUNuQixZQUFZLEVBQUUsT0FBTztvQkFDckIsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDN0QsR0FBRyxFQUFFLEtBQUssSUFBSSxFQUFFO3dCQUNmLDRCQUE0QjtvQkFDN0IsQ0FBQztvQkFDRCxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUU7d0JBQ2hCLGtGQUFrRjtvQkFDbkYsQ0FBQztpQkFDRCxDQUFDO2dCQUNGLHlEQUF5RDtnQkFDekQsdURBQXVEO2dCQUN2RCwrQ0FBK0M7Z0JBQy9DLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLENBQUM7U0FDRCxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFvQjtRQUNyQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDdEIsSUFBSSxDQUFDO1lBQ0osTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdEIsTUFBTSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDN0IsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNSLFlBQVk7UUFDYixDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQ1osS0FBYSxFQUNiLE9BQWdCLEVBQ2hCLElBQXNEO1FBRXRELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7UUFDcEgsTUFBTSxJQUFJLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0UsTUFBTSxHQUFHLEdBQUcsSUFBSSxFQUFFLFlBQVksSUFBSSxJQUFJLEVBQUUsV0FBVyxDQUFDO1FBQ3BELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDeEIsS0FBSztZQUNMLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUNoQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVztRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3ZCLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogS2Fma2FQdWJTdWJBZGFwdGVyIOKAlCB2MC43IFBSIDYg4oCUIFB1Yi9TdWIgYWRhcHRlciBiYWNrZWQgYnkgQXBhY2hlXG4gKiBLYWZrYSB2aWEgYGthZmthanNgLlxuICpcbiAqIFB1Yi9TdWIgdnMgV29ya2VyIHNlbWFudGljczogdGhpcyBhZGFwdGVyIHVzZXMgKipwZXItc3Vic2NyaWJlclxuICogY29uc3VtZXIgZ3JvdXBzKiogc28gbXVsdGlwbGUgc3Vic2NyaWJlcnMgZWFjaCByZWNlaXZlIGV2ZXJ5IG1lc3NhZ2VcbiAqIChmYW4tb3V0KS4gV2hlbiBgY29uc3VtZXJHcm91cGAgaXMgZXhwbGljaXRseSBzZXQsIGFsbCBzdWJzY3JpYmVyc1xuICogc2hhcmUgdGhhdCBncm91cCBhbmQgY29tcGV0ZSAoMSBvZiBOIGdldHMgZWFjaCBtZXNzYWdlKS5cbiAqXG4gKiBSZXBsYXkgY3Vyc29ycyB2aWEgYHN0YXJ0RnJvbWA6XG4gKiAgIC0gYFwiZWFybGllc3RcImAg4oaSIGBmcm9tQmVnaW5uaW5nOiB0cnVlYCBvbiBmaXJzdCBzdWJzY3JpYmUuXG4gKiAgIC0gYFwibGF0ZXN0XCJgIChkZWZhdWx0KSDihpIgb25seSBuZXcgbWVzc2FnZXMuXG4gKiAgIC0gYHtzZXE6IE59YCAvIGB7dGltZXN0YW1wOiBtc31gIOKAlCBwcm92aWRlci1zcGVjaWZpYy4gQ2xlYW5lc3RcbiAqICAgICBsb25nLXRlcm0gcGF0aCBpcyBLYWZrYSdzIGBhZG1pbi5zZWVrKHtvZmZzZXR8dGltZXN0YW1wfSlgIHBvc3QtXG4gKiAgICAgc3Vic2NyaWJlOyB2MSBob25vcnMgYGVhcmxpZXN0YCAvIGBsYXRlc3RgIGFuZCBge3NlcX1gIHZpYVxuICogICAgIGBhdXRvLm9mZnNldC5yZXNldGAgb25seS5cbiAqXG4gKiBSZXF1aXJlcyBga2Fma2Fqc2AgYXMgYSBwZWVyIGRlcGVuZGVuY3kuXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogICAtIGBLQUZLQV9CUk9LRVJTYCAgICAgICAgICAg4oCUIGNvbW1hLXNlcGFyYXRlZCAoZGVmYXVsdCBgbG9jYWxob3N0OjkwOTJgKS5cbiAqICAgLSBgS0FGS0FfQ0xJRU5UX0lEYCAgICAgICAgIOKAlCBkZWZhdWx0IGBcImJsb2stcHVic3ViXCJgLlxuICogICAtIGBLQUZLQV9TQVNMX1VTRVJOQU1FYCAvIGBLQUZLQV9TQVNMX1BBU1NXT1JEYCAg4oCUIFNBU0wvUExBSU4uXG4gKiAgIC0gYEtBRktBX1NTTGAgICAgICAgICAgICAgICDigJQgYFwidHJ1ZVwiYCBlbmFibGVzIFRMUy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFB1YlN1YlRyaWdnZXJPcHRzIH0gZnJvbSBcIkBibG9ranMvaGVscGVyXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB0eXBlIHsgUHViU3ViQWRhcHRlciwgUHViU3ViTWVzc2FnZSB9IGZyb20gXCIuLi9QdWJTdWJUcmlnZ2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2Fma2FQdWJTdWJDb25maWcge1xuXHRicm9rZXJzOiBzdHJpbmdbXTtcblx0Y2xpZW50SWQ6IHN0cmluZztcblx0c2FzbFVzZXJuYW1lPzogc3RyaW5nO1xuXHRzYXNsUGFzc3dvcmQ/OiBzdHJpbmc7XG5cdHNzbDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEthZmthQ29uc3VtZXJIYW5kbGUge1xuXHRkaXNjb25uZWN0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRzdG9wOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgY2xhc3MgS2Fma2FQdWJTdWJBZGFwdGVyIGltcGxlbWVudHMgUHViU3ViQWRhcHRlciB7XG5cdHJlYWRvbmx5IHByb3ZpZGVyID0gXCJrYWZrYVwiIGFzIGNvbnN0O1xuXHRwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogS2Fma2FQdWJTdWJDb25maWc7XG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueToga2Fma2FqcydzIGV4cG9ydGVkIGBLYWZrYWAgY29uc3RydWN0b3IgaXMgbG9vc2VseSB0eXBlZC5cblx0cHJpdmF0ZSBrYWZrYTogYW55ID0gbnVsbDtcblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBwcm9kdWNlciBpcyBjcmVhdGVkIGxhemlseSBhbmQgdHlwZWQgbG9vc2VseS5cblx0cHJpdmF0ZSBwcm9kdWNlcjogYW55ID0gbnVsbDtcblx0cHJpdmF0ZSBjb25zdW1lcnM6IE1hcDxzdHJpbmcsIEthZmthQ29uc3VtZXJIYW5kbGU+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKGNvbmZpZz86IFBhcnRpYWw8S2Fma2FQdWJTdWJDb25maWc+KSB7XG5cdFx0dGhpcy5jb25maWcgPSB7XG5cdFx0XHRicm9rZXJzOiBjb25maWc/LmJyb2tlcnMgPz8gKHByb2Nlc3MuZW52LktBRktBX0JST0tFUlMgPz8gXCJsb2NhbGhvc3Q6OTA5MlwiKS5zcGxpdChcIixcIikubWFwKChzKSA9PiBzLnRyaW0oKSksXG5cdFx0XHRjbGllbnRJZDogY29uZmlnPy5jbGllbnRJZCA/PyBwcm9jZXNzLmVudi5LQUZLQV9DTElFTlRfSUQgPz8gXCJibG9rLXB1YnN1YlwiLFxuXHRcdFx0c2FzbFVzZXJuYW1lOiBjb25maWc/LnNhc2xVc2VybmFtZSA/PyBwcm9jZXNzLmVudi5LQUZLQV9TQVNMX1VTRVJOQU1FLFxuXHRcdFx0c2FzbFBhc3N3b3JkOiBjb25maWc/LnNhc2xQYXNzd29yZCA/PyBwcm9jZXNzLmVudi5LQUZLQV9TQVNMX1BBU1NXT1JELFxuXHRcdFx0c3NsOiBjb25maWc/LnNzbCA/PyBwcm9jZXNzLmVudi5LQUZLQV9TU0wgPT09IFwidHJ1ZVwiLFxuXHRcdH07XG5cdH1cblxuXHRhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IGthZmthanMgaXMgYSBydW50aW1lIHBlZXIgZGVwLlxuXHRcdFx0Y29uc3Qga2Fma2FqczogYW55ID0gYXdhaXQgaW1wb3J0KFwia2Fma2Fqc1wiKTtcblx0XHRcdGNvbnN0IHNhc2wgPVxuXHRcdFx0XHR0aGlzLmNvbmZpZy5zYXNsVXNlcm5hbWUgJiYgdGhpcy5jb25maWcuc2FzbFBhc3N3b3JkXG5cdFx0XHRcdFx0PyB7IG1lY2hhbmlzbTogXCJwbGFpblwiLCB1c2VybmFtZTogdGhpcy5jb25maWcuc2FzbFVzZXJuYW1lLCBwYXNzd29yZDogdGhpcy5jb25maWcuc2FzbFBhc3N3b3JkIH1cblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMua2Fma2EgPSBuZXcga2Fma2Fqcy5LYWZrYSh7XG5cdFx0XHRcdGNsaWVudElkOiB0aGlzLmNvbmZpZy5jbGllbnRJZCxcblx0XHRcdFx0YnJva2VyczogdGhpcy5jb25maWcuYnJva2Vycyxcblx0XHRcdFx0c3NsOiB0aGlzLmNvbmZpZy5zc2wsXG5cdFx0XHRcdHNhc2wsXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMucHJvZHVjZXIgPSB0aGlzLmthZmthLnByb2R1Y2VyKCk7XG5cdFx0XHRhd2FpdCB0aGlzLnByb2R1Y2VyLmNvbm5lY3QoKTtcblx0XHRcdHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YFtibG9rXVtwdWJzdWIta2Fma2FdIGNvbm5lY3QgZmFpbGVkOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9LiBJbnN0YWxsIGthZmthanMgYXMgYSBwZWVyIGRlcGVuZGVuY3k6IGJ1biBhZGQga2Fma2Fqc2AsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXHRcdGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5jb25zdW1lcnMudmFsdWVzKCkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGNvbnN1bWVyLmRpc2Nvbm5lY3QoKTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHQvKiBpZ25vcmUgKi9cblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5jb25zdW1lcnMuY2xlYXIoKTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5wcm9kdWNlcj8uZGlzY29ubmVjdCgpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0LyogaWdub3JlICovXG5cdFx0fVxuXHRcdHRoaXMucHJvZHVjZXIgPSBudWxsO1xuXHRcdHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG5cdH1cblxuXHRhc3luYyBzdWJzY3JpYmUoY29uZmlnOiBQdWJTdWJUcmlnZ2VyT3B0cywgaGFuZGxlcjogKG1lc3NhZ2U6IFB1YlN1Yk1lc3NhZ2UpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJbYmxva11bcHVic3ViLWthZmthXSBub3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0Ly8gRmFuLW91dDogZGlzdGluY3QgZ3JvdXAgaWQgcGVyIHN1YnNjcmliZXIgaW5zdGFuY2UuIENvbXBldGluZy1cblx0XHQvLyBjb25zdW1lcjogZXhwbGljaXQgY29uc3VtZXJHcm91cCBzaGFyZWQgYWNyb3NzIGFsbCBzdWJzY3JpYmVycy5cblx0XHRjb25zdCBncm91cElkID1cblx0XHRcdGNvbmZpZy5jb25zdW1lckdyb3VwID8/IGBibG9rLWZhbm91dC0ke3V1aWQoKS5zbGljZSgwLCA4KX0tJHtjb25maWcudG9waWMucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCBcIl9cIil9YDtcblx0XHRjb25zdCBjb25zdW1lciA9IHRoaXMua2Fma2EuY29uc3VtZXIoeyBncm91cElkIH0pO1xuXHRcdGF3YWl0IGNvbnN1bWVyLmNvbm5lY3QoKTtcblx0XHRjb25zdCBmcm9tQmVnaW5uaW5nID0gY29uZmlnLnN0YXJ0RnJvbSA9PT0gXCJlYXJsaWVzdFwiO1xuXHRcdGF3YWl0IGNvbnN1bWVyLnN1YnNjcmliZSh7IHRvcGljOiBjb25maWcudG9waWMsIGZyb21CZWdpbm5pbmcgfSk7XG5cdFx0dGhpcy5jb25zdW1lcnMuc2V0KGAke2NvbmZpZy50b3BpY30jJHtncm91cElkfWAsIGNvbnN1bWVyKTtcblxuXHRcdGF3YWl0IGNvbnN1bWVyLnJ1bih7XG5cdFx0XHRhdXRvQ29tbWl0OiBjb25maWcuYWNrICE9PSBmYWxzZSxcblx0XHRcdGVhY2hNZXNzYWdlOiBhc3luYyAoe1xuXHRcdFx0XHRtZXNzYWdlLFxuXHRcdFx0fToge1xuXHRcdFx0XHRtZXNzYWdlOiB7IGtleT86IEJ1ZmZlcjsgdmFsdWU/OiBCdWZmZXI7IG9mZnNldDogc3RyaW5nOyB0aW1lc3RhbXA6IHN0cmluZzsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gfTtcblx0XHRcdH0pID0+IHtcblx0XHRcdFx0Y29uc3QgdGV4dCA9IG1lc3NhZ2UudmFsdWU/LnRvU3RyaW5nKFwidXRmOFwiKSA/PyBcIlwiO1xuXHRcdFx0XHRsZXQgYm9keTogdW5rbm93biA9IHRleHQ7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Ym9keSA9IHRleHQubGVuZ3RoID4gMCA/IEpTT04ucGFyc2UodGV4dCkgOiBudWxsO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHQvKiBsZWF2ZSBhcyB0ZXh0ICovXG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXHRcdFx0XHRpZiAobWVzc2FnZS5oZWFkZXJzKSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMobWVzc2FnZS5oZWFkZXJzKSkgYXR0cmlidXRlc1trXSA9IHY/LnRvU3RyaW5nKFwidXRmOFwiKSA/PyBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IG1zZzogUHViU3ViTWVzc2FnZSA9IHtcblx0XHRcdFx0XHRpZDogYCR7Y29uZmlnLnRvcGljfToke21lc3NhZ2Uub2Zmc2V0fWAsXG5cdFx0XHRcdFx0Ym9keSxcblx0XHRcdFx0XHRhdHRyaWJ1dGVzLFxuXHRcdFx0XHRcdHJhdzogbWVzc2FnZSxcblx0XHRcdFx0XHR0b3BpYzogY29uZmlnLnRvcGljLFxuXHRcdFx0XHRcdHN1YnNjcmlwdGlvbjogZ3JvdXBJZCxcblx0XHRcdFx0XHRwdWJsaXNoVGltZTogbmV3IERhdGUoTnVtYmVyLnBhcnNlSW50KG1lc3NhZ2UudGltZXN0YW1wLCAxMCkpLFxuXHRcdFx0XHRcdGFjazogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0LyogYXV0b0NvbW1pdCBoYW5kbGVzIGFjayAqL1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bmFjazogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0Lyoga2Fma2FqcyBoYXMgbm8gcGVyLW1lc3NhZ2UgbmFjazsgdGhlIG9mZnNldCBjb21taXQgaXMgc3VwcHJlc3NlZCBieSB0aHJvd2luZyAqL1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH07XG5cdFx0XHRcdC8vIE9uIGhhbmRsZXIgZmFpbHVyZTogcmUtdGhyb3cgc28ga2Fma2FqcyBzdXBwcmVzc2VzIHRoZVxuXHRcdFx0XHQvLyBvZmZzZXQgY29tbWl0OyB0aGUgY29uc3VtZXIgd2lsbCByZS1wb2xsIHRoZSBtZXNzYWdlXG5cdFx0XHRcdC8vIG9uIHRoZSBuZXh0IGN5Y2xlLiBUaGUgdGhyb3cgaXMgaW50ZW50aW9uYWwuXG5cdFx0XHRcdGF3YWl0IGhhbmRsZXIobXNnKTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHRhc3luYyB1bnN1YnNjcmliZShzdWJzY3JpcHRpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGNvbnN1bWVyID0gdGhpcy5jb25zdW1lcnMuZ2V0KHN1YnNjcmlwdGlvbik7XG5cdFx0aWYgKCFjb25zdW1lcikgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCBjb25zdW1lci5zdG9wKCk7XG5cdFx0XHRhd2FpdCBjb25zdW1lci5kaXNjb25uZWN0KCk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHQvKiBpZ25vcmUgKi9cblx0XHR9XG5cdFx0dGhpcy5jb25zdW1lcnMuZGVsZXRlKHN1YnNjcmlwdGlvbik7XG5cdH1cblxuXHRhc3luYyBwdWJsaXNoKFxuXHRcdHRvcGljOiBzdHJpbmcsXG5cdFx0cGF5bG9hZDogdW5rbm93bixcblx0XHRvcHRzPzogeyBwYXJ0aXRpb25LZXk/OiBzdHJpbmc7IG9yZGVyaW5nS2V5Pzogc3RyaW5nIH0sXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQgfHwgIXRoaXMucHJvZHVjZXIpIHRocm93IG5ldyBFcnJvcihcIltibG9rXVtwdWJzdWIta2Fma2FdIG5vdCBjb25uZWN0ZWQuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHRjb25zdCBib2R5ID0gdHlwZW9mIHBheWxvYWQgPT09IFwic3RyaW5nXCIgPyBwYXlsb2FkIDogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG5cdFx0Y29uc3Qga2V5ID0gb3B0cz8ucGFydGl0aW9uS2V5ID8/IG9wdHM/Lm9yZGVyaW5nS2V5O1xuXHRcdGF3YWl0IHRoaXMucHJvZHVjZXIuc2VuZCh7XG5cdFx0XHR0b3BpYyxcblx0XHRcdG1lc3NhZ2VzOiBbeyBrZXksIHZhbHVlOiBib2R5IH1dLFxuXHRcdH0pO1xuXHR9XG5cblx0aXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuXHR9XG5cblx0YXN5bmMgaGVhbHRoQ2hlY2soKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuXHR9XG59XG4iXX0=
|
|
200
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2Fma2FQdWJTdWJBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXJzL0thZmthUHViU3ViQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUdILE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBdUNsQyxNQUFNLE9BQU8sa0JBQWtCO0lBQ3JCLFFBQVEsR0FBRyxPQUFnQixDQUFDO0lBQ3BCLE1BQU0sQ0FBb0I7SUFDM0MsdUdBQXVHO0lBQy9GLEtBQUssR0FBUSxJQUFJLENBQUM7SUFDMUIsNEZBQTRGO0lBQ3BGLFFBQVEsR0FBUSxJQUFJLENBQUM7SUFDckIsU0FBUyxHQUFxQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3hELFNBQVMsR0FBRyxLQUFLLENBQUM7SUFFMUIsWUFBWSxNQUFtQztRQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ2IsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMzRyxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsSUFBSSxhQUFhO1lBQzFFLFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CO1lBQ3JFLFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CO1lBQ3JFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FB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Ii8qKlxuICogS2Fma2FQdWJTdWJBZGFwdGVyIOKAlCB2MC43IFBSIDYg4oCUIFB1Yi9TdWIgYWRhcHRlciBiYWNrZWQgYnkgQXBhY2hlXG4gKiBLYWZrYSB2aWEgYGthZmthanNgLlxuICpcbiAqIFB1Yi9TdWIgdnMgV29ya2VyIHNlbWFudGljczogdGhpcyBhZGFwdGVyIHVzZXMgKipwZXItc3Vic2NyaWJlclxuICogY29uc3VtZXIgZ3JvdXBzKiogc28gbXVsdGlwbGUgc3Vic2NyaWJlcnMgZWFjaCByZWNlaXZlIGV2ZXJ5IG1lc3NhZ2VcbiAqIChmYW4tb3V0KS4gV2hlbiBgY29uc3VtZXJHcm91cGAgaXMgZXhwbGljaXRseSBzZXQsIGFsbCBzdWJzY3JpYmVyc1xuICogc2hhcmUgdGhhdCBncm91cCBhbmQgY29tcGV0ZSAoMSBvZiBOIGdldHMgZWFjaCBtZXNzYWdlKS5cbiAqXG4gKiBSZXBsYXkgY3Vyc29ycyB2aWEgYHN0YXJ0RnJvbWA6XG4gKiAgIC0gYFwiZWFybGllc3RcImAg4oaSIGBmcm9tQmVnaW5uaW5nOiB0cnVlYCBvbiBmaXJzdCBzdWJzY3JpYmUuXG4gKiAgIC0gYFwibGF0ZXN0XCJgIChkZWZhdWx0KSDihpIgb25seSBuZXcgbWVzc2FnZXMuXG4gKiAgIC0gYHtzZXE6IE59YCDihpIgYGNvbnN1bWVyLnNlZWsoKWAgZXZlcnkgYXNzaWduZWQgcGFydGl0aW9uIHRvIG9mZnNldCBOLlxuICogICAtIGB7dGltZXN0YW1wOiBtc31gIOKGkiByZXNvbHZlIGJyb2tlciBvZmZzZXRzIGF0IHRoYXQgdGltZXN0YW1wLCB0aGVuIHNlZWsuXG4gKlxuICogUmVxdWlyZXMgYGthZmthanNgIGFzIGEgcGVlciBkZXBlbmRlbmN5LlxuICpcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqICAgLSBgS0FGS0FfQlJPS0VSU2AgICAgICAgICAgIOKAlCBjb21tYS1zZXBhcmF0ZWQgKGRlZmF1bHQgYGxvY2FsaG9zdDo5MDkyYCkuXG4gKiAgIC0gYEtBRktBX0NMSUVOVF9JRGAgICAgICAgICDigJQgZGVmYXVsdCBgXCJibG9rLXB1YnN1YlwiYC5cbiAqICAgLSBgS0FGS0FfU0FTTF9VU0VSTkFNRWAgLyBgS0FGS0FfU0FTTF9QQVNTV09SRGAgIOKAlCBTQVNML1BMQUlOLlxuICogICAtIGBLQUZLQV9TU0xgICAgICAgICAgICAgICAg4oCUIGBcInRydWVcImAgZW5hYmxlcyBUTFMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQdWJTdWJUcmlnZ2VyT3B0cyB9IGZyb20gXCJAYmxva2pzL2hlbHBlclwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5pbXBvcnQgdHlwZSB7IFB1YlN1YkFkYXB0ZXIsIFB1YlN1Yk1lc3NhZ2UgfSBmcm9tIFwiLi4vUHViU3ViVHJpZ2dlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEthZmthUHViU3ViQ29uZmlnIHtcblx0YnJva2Vyczogc3RyaW5nW107XG5cdGNsaWVudElkOiBzdHJpbmc7XG5cdHNhc2xVc2VybmFtZT86IHN0cmluZztcblx0c2FzbFBhc3N3b3JkPzogc3RyaW5nO1xuXHRzc2w6IGJvb2xlYW47XG59XG5cbnR5cGUgS2Fma2FTZWVrQ3Vyc29yID0gRXh0cmFjdDxQdWJTdWJUcmlnZ2VyT3B0c1tcInN0YXJ0RnJvbVwiXSwgeyBzZXE6IG51bWJlciB9IHwgeyB0aW1lc3RhbXA6IG51bWJlciB9PjtcblxuaW50ZXJmYWNlIEthZmthQ29uc3VtZXJIYW5kbGUge1xuXHRjb25uZWN0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRkaXNjb25uZWN0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRydW46IChvcHRzOiB7XG5cdFx0YXV0b0NvbW1pdDogYm9vbGVhbjtcblx0XHRlYWNoTWVzc2FnZTogKHBheWxvYWQ6IHtcblx0XHRcdG1lc3NhZ2U6IHsga2V5PzogQnVmZmVyOyB2YWx1ZT86IEJ1ZmZlcjsgb2Zmc2V0OiBzdHJpbmc7IHRpbWVzdGFtcDogc3RyaW5nOyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgQnVmZmVyPiB9O1xuXHRcdH0pID0+IFByb21pc2U8dm9pZD47XG5cdH0pID0+IFByb21pc2U8dm9pZD47XG5cdHNlZWs6IChvcHRzOiB7IHRvcGljOiBzdHJpbmc7IHBhcnRpdGlvbjogbnVtYmVyOyBvZmZzZXQ6IHN0cmluZyB9KSA9PiB2b2lkO1xuXHRzdG9wOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRzdWJzY3JpYmU6IChvcHRzOiB7IHRvcGljOiBzdHJpbmc7IGZyb21CZWdpbm5pbmc6IGJvb2xlYW4gfSkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuaW50ZXJmYWNlIEthZmthQWRtaW5DbGllbnQge1xuXHRjb25uZWN0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRkaXNjb25uZWN0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRmZXRjaFRvcGljTWV0YWRhdGE6IChvcHRzOiB7IHRvcGljczogc3RyaW5nW10gfSkgPT4gUHJvbWlzZTx7XG5cdFx0dG9waWNzOiBBcnJheTx7IHBhcnRpdGlvbnM6IEFycmF5PHsgcGFydGl0aW9uSWQ6IG51bWJlciB9PiB9Pjtcblx0fT47XG5cdGZldGNoVG9waWNPZmZzZXRzQnlUaW1lc3RhbXA6IChcblx0XHR0b3BpYzogc3RyaW5nLFxuXHRcdHRpbWVzdGFtcDogbnVtYmVyLFxuXHQpID0+IFByb21pc2U8QXJyYXk8eyBwYXJ0aXRpb246IG51bWJlcjsgb2Zmc2V0OiBzdHJpbmcgfT4+O1xufVxuXG5leHBvcnQgY2xhc3MgS2Fma2FQdWJTdWJBZGFwdGVyIGltcGxlbWVudHMgUHViU3ViQWRhcHRlciB7XG5cdHJlYWRvbmx5IHByb3ZpZGVyID0gXCJrYWZrYVwiIGFzIGNvbnN0O1xuXHRwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogS2Fma2FQdWJTdWJDb25maWc7XG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueToga2Fma2FqcydzIGV4cG9ydGVkIGBLYWZrYWAgY29uc3RydWN0b3IgaXMgbG9vc2VseSB0eXBlZC5cblx0cHJpdmF0ZSBrYWZrYTogYW55ID0gbnVsbDtcblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBwcm9kdWNlciBpcyBjcmVhdGVkIGxhemlseSBhbmQgdHlwZWQgbG9vc2VseS5cblx0cHJpdmF0ZSBwcm9kdWNlcjogYW55ID0gbnVsbDtcblx0cHJpdmF0ZSBjb25zdW1lcnM6IE1hcDxzdHJpbmcsIEthZmthQ29uc3VtZXJIYW5kbGU+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKGNvbmZpZz86IFBhcnRpYWw8S2Fma2FQdWJTdWJDb25maWc+KSB7XG5cdFx0dGhpcy5jb25maWcgPSB7XG5cdFx0XHRicm9rZXJzOiBjb25maWc/LmJyb2tlcnMgPz8gKHByb2Nlc3MuZW52LktBRktBX0JST0tFUlMgPz8gXCJsb2NhbGhvc3Q6OTA5MlwiKS5zcGxpdChcIixcIikubWFwKChzKSA9PiBzLnRyaW0oKSksXG5cdFx0XHRjbGllbnRJZDogY29uZmlnPy5jbGllbnRJZCA/PyBwcm9jZXNzLmVudi5LQUZLQV9DTElFTlRfSUQgPz8gXCJibG9rLXB1YnN1YlwiLFxuXHRcdFx0c2FzbFVzZXJuYW1lOiBjb25maWc/LnNhc2xVc2VybmFtZSA/PyBwcm9jZXNzLmVudi5LQUZLQV9TQVNMX1VTRVJOQU1FLFxuXHRcdFx0c2FzbFBhc3N3b3JkOiBjb25maWc/LnNhc2xQYXNzd29yZCA/PyBwcm9jZXNzLmVudi5LQUZLQV9TQVNMX1BBU1NXT1JELFxuXHRcdFx0c3NsOiBjb25maWc/LnNzbCA/PyBwcm9jZXNzLmVudi5LQUZLQV9TU0wgPT09IFwidHJ1ZVwiLFxuXHRcdH07XG5cdH1cblxuXHRhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IGthZmthanMgaXMgYSBydW50aW1lIHBlZXIgZGVwLlxuXHRcdFx0Y29uc3Qga2Fma2FqczogYW55ID0gYXdhaXQgaW1wb3J0KFwia2Fma2Fqc1wiKTtcblx0XHRcdGNvbnN0IHNhc2wgPVxuXHRcdFx0XHR0aGlzLmNvbmZpZy5zYXNsVXNlcm5hbWUgJiYgdGhpcy5jb25maWcuc2FzbFBhc3N3b3JkXG5cdFx0XHRcdFx0PyB7IG1lY2hhbmlzbTogXCJwbGFpblwiLCB1c2VybmFtZTogdGhpcy5jb25maWcuc2FzbFVzZXJuYW1lLCBwYXNzd29yZDogdGhpcy5jb25maWcuc2FzbFBhc3N3b3JkIH1cblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMua2Fma2EgPSBuZXcga2Fma2Fqcy5LYWZrYSh7XG5cdFx0XHRcdGNsaWVudElkOiB0aGlzLmNvbmZpZy5jbGllbnRJZCxcblx0XHRcdFx0YnJva2VyczogdGhpcy5jb25maWcuYnJva2Vycyxcblx0XHRcdFx0c3NsOiB0aGlzLmNvbmZpZy5zc2wsXG5cdFx0XHRcdHNhc2wsXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMucHJvZHVjZXIgPSB0aGlzLmthZmthLnByb2R1Y2VyKCk7XG5cdFx0XHRhd2FpdCB0aGlzLnByb2R1Y2VyLmNvbm5lY3QoKTtcblx0XHRcdHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YFtibG9rXVtwdWJzdWIta2Fma2FdIGNvbm5lY3QgZmFpbGVkOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9LiBJbnN0YWxsIGthZmthanMgYXMgYSBwZWVyIGRlcGVuZGVuY3k6IGJ1biBhZGQga2Fma2Fqc2AsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXHRcdGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5jb25zdW1lcnMudmFsdWVzKCkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGNvbnN1bWVyLmRpc2Nvbm5lY3QoKTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHQvKiBpZ25vcmUgKi9cblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5jb25zdW1lcnMuY2xlYXIoKTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5wcm9kdWNlcj8uZGlzY29ubmVjdCgpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0LyogaWdub3JlICovXG5cdFx0fVxuXHRcdHRoaXMucHJvZHVjZXIgPSBudWxsO1xuXHRcdHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG5cdH1cblxuXHRhc3luYyBzdWJzY3JpYmUoY29uZmlnOiBQdWJTdWJUcmlnZ2VyT3B0cywgaGFuZGxlcjogKG1lc3NhZ2U6IFB1YlN1Yk1lc3NhZ2UpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJbYmxva11bcHVic3ViLWthZmthXSBub3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0Ly8gRmFuLW91dDogZGlzdGluY3QgZ3JvdXAgaWQgcGVyIHN1YnNjcmliZXIgaW5zdGFuY2UuIENvbXBldGluZy1cblx0XHQvLyBjb25zdW1lcjogZXhwbGljaXQgY29uc3VtZXJHcm91cCBzaGFyZWQgYWNyb3NzIGFsbCBzdWJzY3JpYmVycy5cblx0XHRjb25zdCBncm91cElkID1cblx0XHRcdGNvbmZpZy5jb25zdW1lckdyb3VwID8/IGBibG9rLWZhbm91dC0ke3V1aWQoKS5zbGljZSgwLCA4KX0tJHtjb25maWcudG9waWMucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCBcIl9cIil9YDtcblx0XHRjb25zdCBjb25zdW1lciA9IHRoaXMua2Fma2EuY29uc3VtZXIoeyBncm91cElkIH0pIGFzIEthZmthQ29uc3VtZXJIYW5kbGU7XG5cdFx0YXdhaXQgY29uc3VtZXIuY29ubmVjdCgpO1xuXHRcdGNvbnN0IHNlZWtDdXJzb3IgPSB0eXBlb2YgY29uZmlnLnN0YXJ0RnJvbSA9PT0gXCJvYmplY3RcIiA/IGNvbmZpZy5zdGFydEZyb20gOiB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgZnJvbUJlZ2lubmluZyA9IGNvbmZpZy5zdGFydEZyb20gPT09IFwiZWFybGllc3RcIjtcblx0XHRhd2FpdCBjb25zdW1lci5zdWJzY3JpYmUoeyB0b3BpYzogY29uZmlnLnRvcGljLCBmcm9tQmVnaW5uaW5nIH0pO1xuXHRcdHRoaXMuY29uc3VtZXJzLnNldChgJHtjb25maWcudG9waWN9IyR7Z3JvdXBJZH1gLCBjb25zdW1lcik7XG5cblx0XHRhd2FpdCBjb25zdW1lci5ydW4oe1xuXHRcdFx0YXV0b0NvbW1pdDogY29uZmlnLmFjayAhPT0gZmFsc2UsXG5cdFx0XHRlYWNoTWVzc2FnZTogYXN5bmMgKHtcblx0XHRcdFx0bWVzc2FnZSxcblx0XHRcdH06IHtcblx0XHRcdFx0bWVzc2FnZTogeyBrZXk/OiBCdWZmZXI7IHZhbHVlPzogQnVmZmVyOyBvZmZzZXQ6IHN0cmluZzsgdGltZXN0YW1wOiBzdHJpbmc7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBCdWZmZXI+IH07XG5cdFx0XHR9KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHRleHQgPSBtZXNzYWdlLnZhbHVlPy50b1N0cmluZyhcInV0ZjhcIikgPz8gXCJcIjtcblx0XHRcdFx0bGV0IGJvZHk6IHVua25vd24gPSB0ZXh0O1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGJvZHkgPSB0ZXh0Lmxlbmd0aCA+IDAgPyBKU09OLnBhcnNlKHRleHQpIDogbnVsbDtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0LyogbGVhdmUgYXMgdGV4dCAqL1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0XHRcdFx0aWYgKG1lc3NhZ2UuaGVhZGVycykge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG1lc3NhZ2UuaGVhZGVycykpIGF0dHJpYnV0ZXNba10gPSB2Py50b1N0cmluZyhcInV0ZjhcIikgPz8gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBrYWZrYWpzIGhhcyBubyBwZXItbWVzc2FnZSBuYWNrOyB0aGUgT05MWSB3YXkgdG8gc3VwcHJlc3MgdGhlXG5cdFx0XHRcdC8vIGF1dG8tY29tbWl0IG9mIGEgZmFpbGVkIG9mZnNldCBpcyB0byB0aHJvdyBvdXQgb2YgZWFjaE1lc3NhZ2UuXG5cdFx0XHRcdC8vIFB1YlN1YlRyaWdnZXIuaGFuZGxlTWVzc2FnZSBjYXRjaGVzIGhhbmRsZXIgZXJyb3JzIGFuZCBjYWxsc1xuXHRcdFx0XHQvLyBuYWNrKCkgKGl0IG5ldmVyIHJlLXRocm93cyksIHNvIHdpdGhvdXQgdGhpcyBmbGFnIHRoZSBvZmZzZXRcblx0XHRcdFx0Ly8gd291bGQgYXV0by1jb21taXQgYW5kIHRoZSBmYWlsZWQgbWVzc2FnZSB3b3VsZCBiZSBsb3N0LiBXZSBzZXRcblx0XHRcdFx0Ly8gYSBmbGFnIG9uIG5hY2soKSBhbmQgdGhyb3cgYWZ0ZXIgdGhlIGhhbmRsZXIgcmV0dXJucy5cblx0XHRcdFx0bGV0IG5hY2tlZCA9IGZhbHNlO1xuXHRcdFx0XHRjb25zdCBtc2c6IFB1YlN1Yk1lc3NhZ2UgPSB7XG5cdFx0XHRcdFx0aWQ6IGAke2NvbmZpZy50b3BpY306JHttZXNzYWdlLm9mZnNldH1gLFxuXHRcdFx0XHRcdGJvZHksXG5cdFx0XHRcdFx0YXR0cmlidXRlcyxcblx0XHRcdFx0XHRyYXc6IG1lc3NhZ2UsXG5cdFx0XHRcdFx0dG9waWM6IGNvbmZpZy50b3BpYyxcblx0XHRcdFx0XHRzdWJzY3JpcHRpb246IGdyb3VwSWQsXG5cdFx0XHRcdFx0cHVibGlzaFRpbWU6IG5ldyBEYXRlKE51bWJlci5wYXJzZUludChtZXNzYWdlLnRpbWVzdGFtcCwgMTApKSxcblx0XHRcdFx0XHRhY2s6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdC8qIGF1dG9Db21taXQgaGFuZGxlcyBhY2sgKi9cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG5hY2s6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRcdG5hY2tlZCA9IHRydWU7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fTtcblx0XHRcdFx0YXdhaXQgaGFuZGxlcihtc2cpO1xuXHRcdFx0XHQvLyBBdC1sZWFzdC1vbmNlIChkZWZhdWx0KTogYSBuYWNrZWQgbWVzc2FnZSBtdXN0IE5PVCBiZVxuXHRcdFx0XHQvLyBjb21taXR0ZWQg4oCUIHRocm93IHNvIGthZmthanMgcmVkZWxpdmVycyBpdC4gQXQtbW9zdC1vbmNlXG5cdFx0XHRcdC8vIChhY2s6ZmFsc2UpIG5ldmVyIGNvbW1pdHMgcGVyLW1lc3NhZ2UgYW55d2F5LCBzbyBhIG5hY2sgaXMgYVxuXHRcdFx0XHQvLyBuby1vcCB0aGVyZSAodGhlIG1lc3NhZ2UgaXMgY29uc2lkZXJlZCBjb25zdW1lZCBvbmNlKS5cblx0XHRcdFx0aWYgKG5hY2tlZCAmJiBjb25maWcuYWNrICE9PSBmYWxzZSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgW2Jsb2tdW3B1YnN1Yi1rYWZrYV0gbWVzc2FnZSAke21zZy5pZH0gbmFja2VkIOKAlCBzdXBwcmVzc2luZyBvZmZzZXQgY29tbWl0IGZvciByZWRlbGl2ZXJ5YCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0fSk7XG5cdFx0aWYgKHNlZWtDdXJzb3IpIGF3YWl0IHRoaXMuYXBwbHlTdGFydEZyb20oY29uc3VtZXIsIGNvbmZpZy50b3BpYywgc2Vla0N1cnNvcik7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGFwcGx5U3RhcnRGcm9tKGNvbnN1bWVyOiBLYWZrYUNvbnN1bWVySGFuZGxlLCB0b3BpYzogc3RyaW5nLCBjdXJzb3I6IEthZmthU2Vla0N1cnNvcik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGFkbWluID0gdGhpcy5rYWZrYS5hZG1pbigpIGFzIEthZmthQWRtaW5DbGllbnQ7XG5cdFx0YXdhaXQgYWRtaW4uY29ubmVjdCgpO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoXCJzZXFcIiBpbiBjdXJzb3IpIHtcblx0XHRcdFx0Y29uc3Qgb2Zmc2V0ID0gU3RyaW5nKGN1cnNvci5zZXEpO1xuXHRcdFx0XHRjb25zdCBtZXRhZGF0YSA9IGF3YWl0IGFkbWluLmZldGNoVG9waWNNZXRhZGF0YSh7IHRvcGljczogW3RvcGljXSB9KTtcblx0XHRcdFx0Zm9yIChjb25zdCBwYXJ0aXRpb24gb2YgbWV0YWRhdGEudG9waWNzWzBdPy5wYXJ0aXRpb25zID8/IFtdKSB7XG5cdFx0XHRcdFx0Y29uc3VtZXIuc2Vlayh7IHRvcGljLCBwYXJ0aXRpb246IHBhcnRpdGlvbi5wYXJ0aXRpb25JZCwgb2Zmc2V0IH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG9mZnNldHMgPSBhd2FpdCBhZG1pbi5mZXRjaFRvcGljT2Zmc2V0c0J5VGltZXN0YW1wKHRvcGljLCBjdXJzb3IudGltZXN0YW1wKTtcblx0XHRcdGZvciAoY29uc3QgeyBwYXJ0aXRpb24sIG9mZnNldCB9IG9mIG9mZnNldHMpIGNvbnN1bWVyLnNlZWsoeyB0b3BpYywgcGFydGl0aW9uLCBvZmZzZXQgfSk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGF3YWl0IGFkbWluLmRpc2Nvbm5lY3QoKS5jYXRjaCgoKSA9PiB7fSk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgdW5zdWJzY3JpYmUoc3Vic2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBjb25zdW1lciA9IHRoaXMuY29uc3VtZXJzLmdldChzdWJzY3JpcHRpb24pO1xuXHRcdGlmICghY29uc3VtZXIpIHJldHVybjtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgY29uc3VtZXIuc3RvcCgpO1xuXHRcdFx0YXdhaXQgY29uc3VtZXIuZGlzY29ubmVjdCgpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0LyogaWdub3JlICovXG5cdFx0fVxuXHRcdHRoaXMuY29uc3VtZXJzLmRlbGV0ZShzdWJzY3JpcHRpb24pO1xuXHR9XG5cblx0YXN5bmMgcHVibGlzaChcblx0XHR0b3BpYzogc3RyaW5nLFxuXHRcdHBheWxvYWQ6IHVua25vd24sXG5cdFx0b3B0cz86IHsgcGFydGl0aW9uS2V5Pzogc3RyaW5nOyBvcmRlcmluZ0tleT86IHN0cmluZyB9LFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkIHx8ICF0aGlzLnByb2R1Y2VyKSB0aHJvdyBuZXcgRXJyb3IoXCJbYmxva11bcHVic3ViLWthZmthXSBub3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0Y29uc3QgYm9keSA9IHR5cGVvZiBwYXlsb2FkID09PSBcInN0cmluZ1wiID8gcGF5bG9hZCA6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuXHRcdGNvbnN0IGtleSA9IG9wdHM/LnBhcnRpdGlvbktleSA/PyBvcHRzPy5vcmRlcmluZ0tleTtcblx0XHRhd2FpdCB0aGlzLnByb2R1Y2VyLnNlbmQoe1xuXHRcdFx0dG9waWMsXG5cdFx0XHRtZXNzYWdlczogW3sga2V5LCB2YWx1ZTogYm9keSB9XSxcblx0XHR9KTtcblx0fVxuXG5cdGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmNvbm5lY3RlZDtcblx0fVxuXG5cdGFzeW5jIGhlYWx0aENoZWNrKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHJldHVybiB0aGlzLmNvbm5lY3RlZDtcblx0fVxufVxuIl19
|
|
@@ -108,25 +108,39 @@ export class NATSPubSubAdapter {
|
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
110
|
const js = this.conn.jetstream();
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
111
|
+
// nats.js `js.subscribe` needs a ConsumerOptsBuilder, NOT a raw
|
|
112
|
+
// `{ config }` object — only the builder installs the push
|
|
113
|
+
// `deliver_subject` JetStream requires. A raw config throws
|
|
114
|
+
// "push consumer requires deliver_subject" at runtime (the typed
|
|
115
|
+
// API accepts it, so tsc never catches this).
|
|
116
|
+
// biome-ignore lint/suspicious/noExplicitAny: nats is a runtime peer dep.
|
|
117
|
+
const nats = await import("nats");
|
|
118
|
+
const durableName = config.consumerGroup ??
|
|
119
|
+
`blok-${(config.subscription ?? config.topic ?? "default").replace(/[^a-zA-Z0-9_]/g, "_")}`;
|
|
120
|
+
const opts = nats.consumerOpts();
|
|
121
|
+
opts.durable(durableName);
|
|
122
|
+
opts.deliverTo(nats.createInbox());
|
|
123
|
+
opts.manualAck(); // dispatchJsMessage ack/naks explicitly
|
|
124
|
+
if (config.ack === false)
|
|
125
|
+
opts.ackNone();
|
|
126
|
+
else
|
|
127
|
+
opts.ackExplicit();
|
|
128
|
+
// Replay position: `earliest` = full retained history; `{seq}` /
|
|
129
|
+
// `{timestamp}` resume from a cursor; `latest` (and the default,
|
|
130
|
+
// per the schema) = new messages only.
|
|
131
|
+
if (config.startFrom === "earliest") {
|
|
132
|
+
opts.deliverAll();
|
|
133
|
+
}
|
|
134
|
+
else if (typeof config.startFrom === "object" && config.startFrom && "seq" in config.startFrom) {
|
|
135
|
+
opts.startSequence(config.startFrom.seq);
|
|
136
|
+
}
|
|
137
|
+
else if (typeof config.startFrom === "object" && config.startFrom && "timestamp" in config.startFrom) {
|
|
138
|
+
opts.startTime(new Date(config.startFrom.timestamp));
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
opts.deliverNew();
|
|
142
|
+
}
|
|
143
|
+
const sub = await js.subscribe(config.topic, opts);
|
|
130
144
|
this.subscriptions.set(subKey, { unsubscribe: () => sub.unsubscribe() });
|
|
131
145
|
// Drive the async iterator in a background loop.
|
|
132
146
|
void (async () => {
|
|
@@ -257,4 +271,4 @@ export class NATSPubSubAdapter {
|
|
|
257
271
|
return this.connected;
|
|
258
272
|
}
|
|
259
273
|
}
|
|
260
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkFUU1B1YlN1YkFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlcnMvTkFUU1B1YlN1YkFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBR0gsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUEwRGxDLE1BQU0sWUFBWSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFDdkMsTUFBTSxZQUFZLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUV2QyxNQUFNLE9BQU8saUJBQWlCO0lBQ3BCLFFBQVEsR0FBRyxNQUFlLENBQUM7SUFDbkIsTUFBTSxDQUFtQjtJQUNsQyxJQUFJLEdBQTBCLElBQUksQ0FBQztJQUNuQyxhQUFhLEdBQWdGLElBQUksR0FBRyxFQUFFLENBQUM7SUFDdkcsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUUxQixZQUFZLE1BQWtDO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDYixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzFHLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVTtZQUM5QyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVM7WUFDM0MsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTO1NBQzNDLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU87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QztJQUNoQyxDQUFDO0lBRUQsV0FBVztRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3ZCLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTkFUU1B1YlN1YkFkYXB0ZXIg4oCUIHYwLjcgUFIgNiDigJQgUHViL1N1YiBhZGFwdGVyIGJhY2tlZCBieSBOQVRTLlxuICpcbiAqIFR3byBtb2RlczpcbiAqICAgLSAqKkZhbi1vdXQqKiAoZGVmYXVsdCwgd2hlbiBgY29uc3VtZXJHcm91cGAgaXMgYWJzZW50KTogZXZlcnlcbiAqICAgICBzdWJzY3JpYmVyIHJlY2VpdmVzIGV2ZXJ5IG1lc3NhZ2Ugb24gdGhlIHN1YmplY3QuIE5BVFMgQ29yZVxuICogICAgIHB1Ymxpc2gvc3Vic2NyaWJlIHNlbWFudGljcyDigJQgY2hlYXBlc3QgcGF0aCwgbm8gcGVyc2lzdGVuY2UuXG4gKiAgIC0gKipDb21wZXRpbmctY29uc3VtZXIqKiAod2hlbiBgY29uc3VtZXJHcm91cGAgaXMgc2V0KTogTkFUU1xuICogICAgIFF1ZXVlIEdyb3VwIOKAlCBleGFjdGx5IG9uZSBzdWJzY3JpYmVyIGluIHRoZSBuYW1lZCBncm91cFxuICogICAgIHJlY2VpdmVzIGVhY2ggbWVzc2FnZS4gUHVyZSBOQVRTIENvcmUuXG4gKiAgIC0gKipEdXJhYmxlKiogKHdoZW4gYGR1cmFibGU6IHRydWVgKTogc3Vic2NyaWJlIHZpYSBOQVRTXG4gKiAgICAgSmV0U3RyZWFtIGNvbnN1bWVyIHNvIHRoZSBzdWJzY3JpcHRpb24gc3Vydml2ZXMgcmVzdGFydHMgYW5kXG4gKiAgICAgcmVwbGF5cyBtaXNzZWQgbWVzc2FnZXMgZnJvbSBgc3RhcnRGcm9tYC4gUmVxdWlyZWQgZm9yIHRoZVxuICogICAgIGB7c2VxfWAgLyBge3RpbWVzdGFtcH1gIHJlcGxheSBjdXJzb3JzLlxuICpcbiAqIFN1YmplY3Qgd2lsZGNhcmRzIChgb3JkZXJzLiouY3JlYXRlZGAsIGBvcmRlcnMuPmApIGFyZSBob25vcmVkIGJ5XG4gKiBOQVRTIG5hdGl2ZWx5IGluIGJvdGggbW9kZXMuXG4gKlxuICogUmVxdWlyZXMgYG5hdHNgIGFzIGEgcGVlciBkZXBlbmRlbmN5OlxuICpcbiAqICAgICBidW4gYWRkIG5hdHNcbiAqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiAgIC0gYE5BVFNfU0VSVkVSU2AgICDigJQgY29tbWEtc2VwYXJhdGVkIFVSTHMgKGRlZmF1bHQgYGxvY2FsaG9zdDo0MjIyYCkuXG4gKiAgIC0gYE5BVFNfVE9LRU5gICAgICDigJQgYmVhcmVyIHRva2VuIGF1dGhlbnRpY2F0aW9uLlxuICogICAtIGBOQVRTX1VTRVJgIC8gYE5BVFNfUEFTU2AgIOKAlCB1c2VycGFzcyBhdXRoZW50aWNhdGlvbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFB1YlN1YlRyaWdnZXJPcHRzIH0gZnJvbSBcIkBibG9ranMvaGVscGVyXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB0eXBlIHsgUHViU3ViQWRhcHRlciwgUHViU3ViTWVzc2FnZSB9IGZyb20gXCIuLi9QdWJTdWJUcmlnZ2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTkFUU1B1YlN1YkNvbmZpZyB7XG5cdHNlcnZlcnM6IHN0cmluZ1tdO1xuXHR0b2tlbj86IHN0cmluZztcblx0dXNlcj86IHN0cmluZztcblx0cGFzcz86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE5hdHNTdWJzY3JpcHRpb24ge1xuXHR1bnN1YnNjcmliZTogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG59XG5cbmludGVyZmFjZSBOYXRzQ29ubmVjdGlvbiB7XG5cdGNsb3NlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRkcmFpbjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblx0c3Vic2NyaWJlOiAoXG5cdFx0c3ViamVjdDogc3RyaW5nLFxuXHRcdG9wdHM/OiB7IHF1ZXVlPzogc3RyaW5nOyBjYWxsYmFjaz86IChlcnI6IEVycm9yIHwgbnVsbCwgbXNnOiBOYXRzTXNnKSA9PiB2b2lkIH0sXG5cdCkgPT4gTmF0c1N1YnNjcmlwdGlvbjtcblx0cHVibGlzaDogKHN1YmplY3Q6IHN0cmluZywgcGF5bG9hZDogVWludDhBcnJheSkgPT4gdm9pZDtcblx0amV0c3RyZWFtPzogKCkgPT4gTmF0c0pldFN0cmVhbTtcblx0amV0c3RyZWFtTWFuYWdlcj86ICgpID0+IFByb21pc2U8TmF0c0pldFN0cmVhbU1hbmFnZXI+O1xufVxuXG5pbnRlcmZhY2UgTmF0c0pldFN0cmVhbSB7XG5cdHN1YnNjcmliZTogKFxuXHRcdHN1YmplY3Q6IHN0cmluZyxcblx0XHRvcHRzPzogdW5rbm93bixcblx0KSA9PiBQcm9taXNlPHtcblx0XHRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBBc3luY0l0ZXJhdG9yPE5hdHNKc01zZz47XG5cdFx0dW5zdWJzY3JpYmU6ICgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXHR9Pjtcblx0cHVibGlzaDogKHN1YmplY3Q6IHN0cmluZywgcGF5bG9hZDogVWludDhBcnJheSkgPT4gUHJvbWlzZTx1bmtub3duPjtcbn1cblxuaW50ZXJmYWNlIE5hdHNKZXRTdHJlYW1NYW5hZ2VyIHtcblx0c3RyZWFtczogeyBhZGQ6IChjb25maWc6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj47IGluZm86IChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8dW5rbm93bj4gfTtcblx0Y29uc3VtZXJzOiB7IGFkZDogKHN0cmVhbTogc3RyaW5nLCBjb25maWc6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj4gfTtcbn1cblxuaW50ZXJmYWNlIE5hdHNNc2cge1xuXHRzdWJqZWN0OiBzdHJpbmc7XG5cdGRhdGE6IFVpbnQ4QXJyYXk7XG5cdHNpZDogbnVtYmVyO1xuXHRyZXNwb25kPzogKGRhdGE/OiBVaW50OEFycmF5KSA9PiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgTmF0c0pzTXNnIHtcblx0c3ViamVjdDogc3RyaW5nO1xuXHRkYXRhOiBVaW50OEFycmF5O1xuXHRzZXE6IG51bWJlcjtcblx0YWNrOiAoKSA9PiB2b2lkO1xuXHRuYWs6IChtaWxsaXM/OiBudW1iZXIpID0+IHZvaWQ7XG5cdGluZm86IHsgc3RyZWFtOiBzdHJpbmc7IGNvbnN1bWVyOiBzdHJpbmc7IHJlZGVsaXZlcnlDb3VudDogbnVtYmVyOyB0aW1lc3RhbXBOYW5vcz86IG51bWJlciB9O1xufVxuXG5jb25zdCBURVhUX0RFQ09ERVIgPSBuZXcgVGV4dERlY29kZXIoKTtcbmNvbnN0IFRFWFRfRU5DT0RFUiA9IG5ldyBUZXh0RW5jb2RlcigpO1xuXG5leHBvcnQgY2xhc3MgTkFUU1B1YlN1YkFkYXB0ZXIgaW1wbGVtZW50cyBQdWJTdWJBZGFwdGVyIHtcblx0cmVhZG9ubHkgcHJvdmlkZXIgPSBcIm5hdHNcIiBhcyBjb25zdDtcblx0cHJpdmF0ZSByZWFkb25seSBjb25maWc6IE5BVFNQdWJTdWJDb25maWc7XG5cdHByaXZhdGUgY29ubjogTmF0c0Nvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBOYXRzU3Vic2NyaXB0aW9uIHwgeyB1bnN1YnNjcmliZTogKCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQgfT4gPSBuZXcgTWFwKCk7XG5cdHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG5cblx0Y29uc3RydWN0b3IoY29uZmlnPzogUGFydGlhbDxOQVRTUHViU3ViQ29uZmlnPikge1xuXHRcdHRoaXMuY29uZmlnID0ge1xuXHRcdFx0c2VydmVyczogY29uZmlnPy5zZXJ2ZXJzID8/IChwcm9jZXNzLmVudi5OQVRTX1NFUlZFUlMgPz8gXCJsb2NhbGhvc3Q6NDIyMlwiKS5zcGxpdChcIixcIikubWFwKChzKSA9PiBzLnRyaW0oKSksXG5cdFx0XHR0b2tlbjogY29uZmlnPy50b2tlbiA/PyBwcm9jZXNzLmVudi5OQVRTX1RPS0VOLFxuXHRcdFx0dXNlcjogY29uZmlnPy51c2VyID8/IHByb2Nlc3MuZW52Lk5BVFNfVVNFUixcblx0XHRcdHBhc3M6IGNvbmZpZz8ucGFzcyA/PyBwcm9jZXNzLmVudi5OQVRTX1BBU1MsXG5cdFx0fTtcblx0fVxuXG5cdGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGVkKSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogbmF0cyBpcyBhIHJ1bnRpbWUgcGVlciBkZXAuXG5cdFx0XHRjb25zdCBuYXRzOiBhbnkgPSBhd2FpdCBpbXBvcnQoXCJuYXRzXCIpO1xuXHRcdFx0dGhpcy5jb25uID0gKGF3YWl0IG5hdHMuY29ubmVjdCh7XG5cdFx0XHRcdHNlcnZlcnM6IHRoaXMuY29uZmlnLnNlcnZlcnMsXG5cdFx0XHRcdHRva2VuOiB0aGlzLmNvbmZpZy50b2tlbixcblx0XHRcdFx0dXNlcjogdGhpcy5jb25maWcudXNlcixcblx0XHRcdFx0cGFzczogdGhpcy5jb25maWcucGFzcyxcblx0XHRcdH0pKSBhcyBOYXRzQ29ubmVjdGlvbjtcblx0XHRcdHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YFtibG9rXVtwdWJzdWItbmF0c10gY29ubmVjdCBmYWlsZWQ6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX0uIEluc3RhbGwgbmF0cyBhcyBhIHBlZXIgZGVwZW5kZW5jeTogYnVuIGFkZCBuYXRzYCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSByZXR1cm47XG5cdFx0Zm9yIChjb25zdCBzdWIgb2YgdGhpcy5zdWJzY3JpcHRpb25zLnZhbHVlcygpKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBzdWIudW5zdWJzY3JpYmUoKTtcblx0XHRcdFx0aWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIGF3YWl0IHJlc3VsdDtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHQvKiBpZ25vcmUgKi9cblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5zdWJzY3JpcHRpb25zLmNsZWFyKCk7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuY29ubj8uZHJhaW4oKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdC8qIGlnbm9yZSAqL1xuXHRcdH1cblx0XHR0aGlzLmNvbm4gPSBudWxsO1xuXHRcdHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG5cdH1cblxuXHRhc3luYyBzdWJzY3JpYmUoY29uZmlnOiBQdWJTdWJUcmlnZ2VyT3B0cywgaGFuZGxlcjogKG1lc3NhZ2U6IFB1YlN1Yk1lc3NhZ2UpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkIHx8ICF0aGlzLmNvbm4pIHRocm93IG5ldyBFcnJvcihcIltibG9rXVtwdWJzdWItbmF0c10gbm90IGNvbm5lY3RlZC4gQ2FsbCBjb25uZWN0KCkgZmlyc3QuXCIpO1xuXHRcdGNvbnN0IHN1YktleSA9IGAke2NvbmZpZy50b3BpY30jJHtjb25maWcuY29uc3VtZXJHcm91cCA/PyBcIlwifWA7XG5cblx0XHRpZiAoY29uZmlnLmR1cmFibGUgPT09IHRydWUpIHtcblx0XHRcdC8vIEpldFN0cmVhbSBkdXJhYmxlIHN1YnNjcmlwdGlvbiDigJQgc3Vydml2ZXMgcmVzdGFydHMuXG5cdFx0XHRpZiAoIXRoaXMuY29ubi5qZXRzdHJlYW0pIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiW2Jsb2tdW3B1YnN1Yi1uYXRzXSBkdXJhYmxlIHN1YnNjcmlwdGlvbnMgcmVxdWlyZSBKZXRTdHJlYW0gc3VwcG9ydCBpbiB0aGUgbmF0cyBjbGllbnRcIik7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBqc20gPSBhd2FpdCB0aGlzLmNvbm4uamV0c3RyZWFtTWFuYWdlcj8uKCk7XG5cdFx0XHRpZiAoanNtKSB7XG5cdFx0XHRcdC8vIEF1dG8tY3JlYXRlIGEgc3RyZWFtIGNvdmVyaW5nIHRoZSBzdWJqZWN0IGlmIG9uZSBkb2Vzbid0XG5cdFx0XHRcdC8vIGV4aXN0LiBQcm9kdWN0aW9uIGRlcGxveW1lbnRzIHNob3VsZCBwcmUtcHJvdmlzaW9uIHZpYVxuXHRcdFx0XHQvLyBgbmF0cyBzdHJlYW0gYWRkYCB0byBjb250cm9sIHJldGVudGlvbi5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRhd2FpdCBqc20uc3RyZWFtcy5hZGQoe1xuXHRcdFx0XHRcdFx0bmFtZTogYGJsb2stJHsoY29uZmlnLnRvcGljID8/IFwiXCIpLnJlcGxhY2UoL1teYS16QS1aMC05X10vZywgXCJfXCIpfWAsXG5cdFx0XHRcdFx0XHRzdWJqZWN0czogW2NvbmZpZy50b3BpY10sXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRcdC8qIHN0cmVhbSBhbHJlYWR5IGV4aXN0cyDigJQgaWdub3JlICovXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnN0IGpzID0gdGhpcy5jb25uLmpldHN0cmVhbSgpO1xuXHRcdFx0Y29uc3Qgc3RhcnRTZXEgPVxuXHRcdFx0XHR0eXBlb2YgY29uZmlnLnN0YXJ0RnJvbSA9PT0gXCJvYmplY3RcIiAmJiBjb25maWcuc3RhcnRGcm9tICYmIFwic2VxXCIgaW4gY29uZmlnLnN0YXJ0RnJvbVxuXHRcdFx0XHRcdD8gY29uZmlnLnN0YXJ0RnJvbS5zZXFcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGRlbGl2ZXJQb2xpY3kgPVxuXHRcdFx0XHRjb25maWcuc3RhcnRGcm9tID09PSBcImVhcmxpZXN0XCJcblx0XHRcdFx0XHQ/IFwiYWxsXCJcblx0XHRcdFx0XHQ6IGNvbmZpZy5zdGFydEZyb20gPT09IFwibGF0ZXN0XCJcblx0XHRcdFx0XHRcdD8gXCJuZXdcIlxuXHRcdFx0XHRcdFx0OiBzdGFydFNlcSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdD8gXCJieV9zdGFydF9zZXF1ZW5jZVwiXG5cdFx0XHRcdFx0XHRcdDogXCJhbGxcIjtcblx0XHRcdGNvbnN0IHN1YiA9IGF3YWl0IGpzLnN1YnNjcmliZShjb25maWcudG9waWMsIHtcblx0XHRcdFx0Y29uZmlnOiB7XG5cdFx0XHRcdFx0ZHVyYWJsZV9uYW1lOlxuXHRcdFx0XHRcdFx0Y29uZmlnLmNvbnN1bWVyR3JvdXAgPz9cblx0XHRcdFx0XHRcdGBibG9rLSR7KGNvbmZpZy5zdWJzY3JpcHRpb24gPz8gY29uZmlnLnRvcGljID8/IFwiZGVmYXVsdFwiKS5yZXBsYWNlKC9bXmEtekEtWjAtOV9dL2csIFwiX1wiKX1gLFxuXHRcdFx0XHRcdGRlbGl2ZXJfcG9saWN5OiBkZWxpdmVyUG9saWN5LFxuXHRcdFx0XHRcdG9wdF9zdGFydF9zZXE6IHN0YXJ0U2VxLFxuXHRcdFx0XHRcdGFja19wb2xpY3k6IGNvbmZpZy5hY2sgPT09IGZhbHNlID8gXCJub25lXCIgOiBcImV4cGxpY2l0XCIsXG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5zZXQoc3ViS2V5LCB7IHVuc3Vic2NyaWJlOiAoKSA9PiBzdWIudW5zdWJzY3JpYmUoKSB9KTtcblx0XHRcdC8vIERyaXZlIHRoZSBhc3luYyBpdGVyYXRvciBpbiBhIGJhY2tncm91bmQgbG9vcC5cblx0XHRcdHZvaWQgKGFzeW5jICgpID0+IHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRmb3IgYXdhaXQgKGNvbnN0IG1zZyBvZiBzdWIgYXMgdW5rbm93biBhcyBBc3luY0l0ZXJhYmxlPE5hdHNKc01zZz4pIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuZGlzcGF0Y2hKc01lc3NhZ2UobXNnLCBjb25maWcsIGhhbmRsZXIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0Ly8gU3Vic2NyaXB0aW9uIGNsb3NlZCBvciBjb25uZWN0aW9uIGxvc3Qg4oCUIGxldCB0aGUgdHJpZ2dlclxuXHRcdFx0XHRcdC8vIHJlLWxpc3RlbiB2aWEgSE1SL3JlY29ubmVjdCBsb2dpYy4gTG9nIGZvciB2aXNpYmlsaXR5LlxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoYFtibG9rXVtwdWJzdWItbmF0c10gc3Vic2NyaXB0aW9uIGVycm9yOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ29yZSBOQVRTIHN1YnNjcmlwdGlvbiDigJQgZmlyZS1hbmQtZm9yZ2V0LCB3aXRoIG9wdGlvbmFsIHF1ZXVlXG5cdFx0Ly8gZ3JvdXAgZm9yIGNvbXBldGluZy1jb25zdW1lciBzZW1hbnRpY3MuXG5cdFx0Y29uc3Qgc3ViID0gdGhpcy5jb25uLnN1YnNjcmliZShjb25maWcudG9waWMsIHtcblx0XHRcdHF1ZXVlOiBjb25maWcuY29uc3VtZXJHcm91cCxcblx0XHRcdGNhbGxiYWNrOiAoZXJyLCBtc2cpID0+IHtcblx0XHRcdFx0aWYgKGVycikge1xuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoYFtibG9rXVtwdWJzdWItbmF0c10gc3Vic2NyaWJlIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHR2b2lkIHRoaXMuZGlzcGF0Y2hDb3JlTWVzc2FnZShtc2csIGNvbmZpZywgaGFuZGxlcik7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5zZXQoc3ViS2V5LCBzdWIpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwYXRjaEpzTWVzc2FnZShcblx0XHRtc2c6IE5hdHNKc01zZyxcblx0XHRjb25maWc6IFB1YlN1YlRyaWdnZXJPcHRzLFxuXHRcdGhhbmRsZXI6IChtZXNzYWdlOiBQdWJTdWJNZXNzYWdlKSA9PiBQcm9taXNlPHZvaWQ+LFxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCB0ZXh0ID0gVEVYVF9ERUNPREVSLmRlY29kZShtc2cuZGF0YSk7XG5cdFx0bGV0IGJvZHk6IHVua25vd24gPSB0ZXh0O1xuXHRcdHRyeSB7XG5cdFx0XHRib2R5ID0gdGV4dC5sZW5ndGggPiAwID8gSlNPTi5wYXJzZSh0ZXh0KSA6IG51bGw7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHQvKiBsZWF2ZSBhcyB0ZXh0ICovXG5cdFx0fVxuXHRcdGNvbnN0IG1lc3NhZ2U6IFB1YlN1Yk1lc3NhZ2UgPSB7XG5cdFx0XHRpZDogYCR7bXNnLmluZm8uc3RyZWFtfToke21zZy5zZXF9YCxcblx0XHRcdGJvZHksXG5cdFx0XHRhdHRyaWJ1dGVzOiB7IHN1YmplY3Q6IG1zZy5zdWJqZWN0IH0sXG5cdFx0XHRyYXc6IG1zZyxcblx0XHRcdHRvcGljOiBtc2cuc3ViamVjdCxcblx0XHRcdHN1YnNjcmlwdGlvbjogbXNnLmluZm8uY29uc3VtZXIsXG5cdFx0XHRwdWJsaXNoVGltZTogbXNnLmluZm8udGltZXN0YW1wTmFub3MgPyBuZXcgRGF0ZShtc2cuaW5mby50aW1lc3RhbXBOYW5vcyAvIDFlNikgOiB1bmRlZmluZWQsXG5cdFx0XHRhY2s6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0bXNnLmFjaygpO1xuXHRcdFx0fSxcblx0XHRcdG5hY2s6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0bXNnLm5haygpO1xuXHRcdFx0fSxcblx0XHR9O1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCBoYW5kbGVyKG1lc3NhZ2UpO1xuXHRcdFx0aWYgKGNvbmZpZy5hY2sgIT09IGZhbHNlKSBtc2cuYWNrKCk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRtc2cubmFrKCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwYXRjaENvcmVNZXNzYWdlKFxuXHRcdG1zZzogTmF0c01zZyxcblx0XHRfY29uZmlnOiBQdWJTdWJUcmlnZ2VyT3B0cyxcblx0XHRoYW5kbGVyOiAobWVzc2FnZTogUHViU3ViTWVzc2FnZSkgPT4gUHJvbWlzZTx2b2lkPixcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdGV4dCA9IFRFWFRfREVDT0RFUi5kZWNvZGUobXNnLmRhdGEpO1xuXHRcdGxldCBib2R5OiB1bmtub3duID0gdGV4dDtcblx0XHR0cnkge1xuXHRcdFx0Ym9keSA9IHRleHQubGVuZ3RoID4gMCA/IEpTT04ucGFyc2UodGV4dCkgOiBudWxsO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0LyogbGVhdmUgYXMgdGV4dCAqL1xuXHRcdH1cblx0XHRjb25zdCBtZXNzYWdlOiBQdWJTdWJNZXNzYWdlID0ge1xuXHRcdFx0aWQ6IGAke21zZy5zdWJqZWN0fToke21zZy5zaWR9OiR7dXVpZCgpfWAsXG5cdFx0XHRib2R5LFxuXHRcdFx0YXR0cmlidXRlczogeyBzdWJqZWN0OiBtc2cuc3ViamVjdCB9LFxuXHRcdFx0cmF3OiBtc2csXG5cdFx0XHR0b3BpYzogbXNnLnN1YmplY3QsXG5cdFx0XHRhY2s6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0LyogY29yZSBOQVRTIGhhcyBubyBleHBsaWNpdCBhY2sgKi9cblx0XHRcdH0sXG5cdFx0XHRuYWNrOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdC8qIGNvcmUgTkFUUyBoYXMgbm8gZXhwbGljaXQgbmFjayAqL1xuXHRcdFx0fSxcblx0XHR9O1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCBoYW5kbGVyKG1lc3NhZ2UpO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgW2Jsb2tdW3B1YnN1Yi1uYXRzXSBoYW5kbGVyIGVycm9yOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgdW5zdWJzY3JpYmUoc3Vic2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBzdWIgPSB0aGlzLnN1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbik7XG5cdFx0aWYgKCFzdWIpIHJldHVybjtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gc3ViLnVuc3Vic2NyaWJlKCk7XG5cdFx0XHRpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkgYXdhaXQgcmVzdWx0O1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0LyogaWdub3JlICovXG5cdFx0fVxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uKTtcblx0fVxuXG5cdGFzeW5jIHB1Ymxpc2godG9waWM6IHN0cmluZywgcGF5bG9hZDogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQgfHwgIXRoaXMuY29ubikgdGhyb3cgbmV3IEVycm9yKFwiW2Jsb2tdW3B1YnN1Yi1uYXRzXSBub3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0Y29uc3QgYm9keSA9IHR5cGVvZiBwYXlsb2FkID09PSBcInN0cmluZ1wiID8gcGF5bG9hZCA6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuXHRcdGNvbnN0IGRhdGEgPSBURVhUX0VOQ09ERVIuZW5jb2RlKGJvZHkpO1xuXHRcdC8vIFVzZSBjb3JlIE5BVFMgcHVibGlzaC4gV2hlbiBhIGR1cmFibGUgc3Vic2NyaWJlciBoYXMgYmVlblxuXHRcdC8vIGluc3RhbGxlZCBmb3IgdGhpcyBzdWJqZWN0LCB0aGUgc3Vic2NyaWJlKCkgcGF0aCBjcmVhdGVkIGFcblx0XHQvLyBKZXRTdHJlYW0gc3RyZWFtIHdpdGggYSBzdWJqZWN0IGZpbHRlciB0aGF0IGNhcHR1cmVzIGFueVxuXHRcdC8vIHB1Ymxpc2ggdG8gYHRvcGljYCDigJQgc28gZHVyYWJsZSBjb25zdW1lcnMgc2VlIHRoZSBtZXNzYWdlIHZpYVxuXHRcdC8vIHRoZSBzdHJlYW0gd2hpbGUgY29yZSBzdWJzY3JpYmVycyBzZWUgaXQgZGlyZWN0bHkuIFRoZSBlYXJsaWVyXG5cdFx0Ly8gXCJ0cnkganMucHVibGlzaCBmaXJzdCwgZmFsbCBiYWNrIHRvIGNvcmVcIiBsb2dpYyBjYXVzZWRcblx0XHQvLyAqKmRvdWJsZS1kZWxpdmVyeSoqOiBqcy5wdWJsaXNoIHRvIGEgc3ViamVjdCBjb3ZlcmVkIGJ5IGFcblx0XHQvLyBzdHJlYW0gZ29lcyB0byBCT1RIIHRoZSBzdHJlYW0gYW5kIGNvcmUgc3Vic2NyaWJlcnMsIHRoZW4gdGhlXG5cdFx0Ly8gZmFsbGJhY2sgd291bGQgcHVibGlzaCBBR0FJTiBpZiBqcy5wdWJsaXNoIHRpbWVkIG91dCAodnNcblx0XHQvLyByZXR1cm5pbmcgNTAzIGZhc3QpLiBTdGlja2luZyB0byBjb3JlIHB1Ymxpc2ggYXZvaWRzIHRoZSByYWNlLlxuXHRcdHRoaXMuY29ubi5wdWJsaXNoKHRvcGljLCBkYXRhKTtcblx0fVxuXG5cdGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmNvbm5lY3RlZDtcblx0fVxuXG5cdGFzeW5jIGhlYWx0aENoZWNrKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdHJldHVybiB0aGlzLmNvbm5lY3RlZDtcblx0fVxufVxuIl19
|
|
274
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkFUU1B1YlN1YkFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlcnMvTkFUU1B1YlN1YkFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBR0gsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUEwRGxDLE1BQU0sWUFBWSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFDdkMsTUFBTSxZQUFZLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUV2QyxNQUFNLE9BQU8saUJBQWlCO0lBQ3BCLFFBQVEsR0FBRyxNQUFlLENBQUM7SUFDbkIsTUFBTSxDQUFtQjtJQUNsQyxJQUFJLEdBQTBCLElBQUksQ0FBQztJQUNuQyxhQUFhLEdBQWdGLElBQUksR0FBRyxFQUFFLENBQUM7SUFDdkcsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUUxQixZQUFZLE1BQWtDO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDYixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzFHLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVTtZQUM5QyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVM7WUFDM0MsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTO1NBQzNDLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU87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Q0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7UUFDL0csTUFBTSxJQUFJLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0UsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2Qyw0REFBNEQ7UUFDNUQsNkRBQTZEO1FBQzdELDJEQUEyRDtRQUMzRCxnRUFBZ0U7UUFDaEUsaUVBQWlFO1FBQ2pFLHlEQUF5RDtRQUN6RCw0REFBNEQ7UUFDNUQsZ0VBQWdFO1FBQ2hFLDJEQUEyRDtRQUMzRCxpRUFBaUU7UUFDakUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxXQUFXO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDdkIsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBOQVRTUHViU3ViQWRhcHRlciDigJQgdjAuNyBQUiA2IOKAlCBQdWIvU3ViIGFkYXB0ZXIgYmFja2VkIGJ5IE5BVFMuXG4gKlxuICogVHdvIG1vZGVzOlxuICogICAtICoqRmFuLW91dCoqIChkZWZhdWx0LCB3aGVuIGBjb25zdW1lckdyb3VwYCBpcyBhYnNlbnQpOiBldmVyeVxuICogICAgIHN1YnNjcmliZXIgcmVjZWl2ZXMgZXZlcnkgbWVzc2FnZSBvbiB0aGUgc3ViamVjdC4gTkFUUyBDb3JlXG4gKiAgICAgcHVibGlzaC9zdWJzY3JpYmUgc2VtYW50aWNzIOKAlCBjaGVhcGVzdCBwYXRoLCBubyBwZXJzaXN0ZW5jZS5cbiAqICAgLSAqKkNvbXBldGluZy1jb25zdW1lcioqICh3aGVuIGBjb25zdW1lckdyb3VwYCBpcyBzZXQpOiBOQVRTXG4gKiAgICAgUXVldWUgR3JvdXAg4oCUIGV4YWN0bHkgb25lIHN1YnNjcmliZXIgaW4gdGhlIG5hbWVkIGdyb3VwXG4gKiAgICAgcmVjZWl2ZXMgZWFjaCBtZXNzYWdlLiBQdXJlIE5BVFMgQ29yZS5cbiAqICAgLSAqKkR1cmFibGUqKiAod2hlbiBgZHVyYWJsZTogdHJ1ZWApOiBzdWJzY3JpYmUgdmlhIE5BVFNcbiAqICAgICBKZXRTdHJlYW0gY29uc3VtZXIgc28gdGhlIHN1YnNjcmlwdGlvbiBzdXJ2aXZlcyByZXN0YXJ0cyBhbmRcbiAqICAgICByZXBsYXlzIG1pc3NlZCBtZXNzYWdlcyBmcm9tIGBzdGFydEZyb21gLiBSZXF1aXJlZCBmb3IgdGhlXG4gKiAgICAgYHtzZXF9YCAvIGB7dGltZXN0YW1wfWAgcmVwbGF5IGN1cnNvcnMuXG4gKlxuICogU3ViamVjdCB3aWxkY2FyZHMgKGBvcmRlcnMuKi5jcmVhdGVkYCwgYG9yZGVycy4+YCkgYXJlIGhvbm9yZWQgYnlcbiAqIE5BVFMgbmF0aXZlbHkgaW4gYm90aCBtb2Rlcy5cbiAqXG4gKiBSZXF1aXJlcyBgbmF0c2AgYXMgYSBwZWVyIGRlcGVuZGVuY3k6XG4gKlxuICogICAgIGJ1biBhZGQgbmF0c1xuICpcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqICAgLSBgTkFUU19TRVJWRVJTYCAgIOKAlCBjb21tYS1zZXBhcmF0ZWQgVVJMcyAoZGVmYXVsdCBgbG9jYWxob3N0OjQyMjJgKS5cbiAqICAgLSBgTkFUU19UT0tFTmAgICAgIOKAlCBiZWFyZXIgdG9rZW4gYXV0aGVudGljYXRpb24uXG4gKiAgIC0gYE5BVFNfVVNFUmAgLyBgTkFUU19QQVNTYCAg4oCUIHVzZXJwYXNzIGF1dGhlbnRpY2F0aW9uLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHViU3ViVHJpZ2dlck9wdHMgfSBmcm9tIFwiQGJsb2tqcy9oZWxwZXJcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHR5cGUgeyBQdWJTdWJBZGFwdGVyLCBQdWJTdWJNZXNzYWdlIH0gZnJvbSBcIi4uL1B1YlN1YlRyaWdnZXJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOQVRTUHViU3ViQ29uZmlnIHtcblx0c2VydmVyczogc3RyaW5nW107XG5cdHRva2VuPzogc3RyaW5nO1xuXHR1c2VyPzogc3RyaW5nO1xuXHRwYXNzPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTmF0c1N1YnNjcmlwdGlvbiB7XG5cdHVuc3Vic2NyaWJlOiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbn1cblxuaW50ZXJmYWNlIE5hdHNDb25uZWN0aW9uIHtcblx0Y2xvc2U6ICgpID0+IFByb21pc2U8dm9pZD47XG5cdGRyYWluOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRzdWJzY3JpYmU6IChcblx0XHRzdWJqZWN0OiBzdHJpbmcsXG5cdFx0b3B0cz86IHsgcXVldWU/OiBzdHJpbmc7IGNhbGxiYWNrPzogKGVycjogRXJyb3IgfCBudWxsLCBtc2c6IE5hdHNNc2cpID0+IHZvaWQgfSxcblx0KSA9PiBOYXRzU3Vic2NyaXB0aW9uO1xuXHRwdWJsaXNoOiAoc3ViamVjdDogc3RyaW5nLCBwYXlsb2FkOiBVaW50OEFycmF5KSA9PiB2b2lkO1xuXHRqZXRzdHJlYW0/OiAoKSA9PiBOYXRzSmV0U3RyZWFtO1xuXHRqZXRzdHJlYW1NYW5hZ2VyPzogKCkgPT4gUHJvbWlzZTxOYXRzSmV0U3RyZWFtTWFuYWdlcj47XG59XG5cbmludGVyZmFjZSBOYXRzSmV0U3RyZWFtIHtcblx0c3Vic2NyaWJlOiAoXG5cdFx0c3ViamVjdDogc3RyaW5nLFxuXHRcdG9wdHM/OiB1bmtub3duLFxuXHQpID0+IFByb21pc2U8e1xuXHRcdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IEFzeW5jSXRlcmF0b3I8TmF0c0pzTXNnPjtcblx0XHR1bnN1YnNjcmliZTogKCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cdH0+O1xuXHRwdWJsaXNoOiAoc3ViamVjdDogc3RyaW5nLCBwYXlsb2FkOiBVaW50OEFycmF5KSA9PiBQcm9taXNlPHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgTmF0c0pldFN0cmVhbU1hbmFnZXIge1xuXHRzdHJlYW1zOiB7IGFkZDogKGNvbmZpZzogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPjsgaW5mbzogKG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTx1bmtub3duPiB9O1xuXHRjb25zdW1lcnM6IHsgYWRkOiAoc3RyZWFtOiBzdHJpbmcsIGNvbmZpZzogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPiB9O1xufVxuXG5pbnRlcmZhY2UgTmF0c01zZyB7XG5cdHN1YmplY3Q6IHN0cmluZztcblx0ZGF0YTogVWludDhBcnJheTtcblx0c2lkOiBudW1iZXI7XG5cdHJlc3BvbmQ/OiAoZGF0YT86IFVpbnQ4QXJyYXkpID0+IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBOYXRzSnNNc2cge1xuXHRzdWJqZWN0OiBzdHJpbmc7XG5cdGRhdGE6IFVpbnQ4QXJyYXk7XG5cdHNlcTogbnVtYmVyO1xuXHRhY2s6ICgpID0+IHZvaWQ7XG5cdG5hazogKG1pbGxpcz86IG51bWJlcikgPT4gdm9pZDtcblx0aW5mbzogeyBzdHJlYW06IHN0cmluZzsgY29uc3VtZXI6IHN0cmluZzsgcmVkZWxpdmVyeUNvdW50OiBudW1iZXI7IHRpbWVzdGFtcE5hbm9zPzogbnVtYmVyIH07XG59XG5cbmNvbnN0IFRFWFRfREVDT0RFUiA9IG5ldyBUZXh0RGVjb2RlcigpO1xuY29uc3QgVEVYVF9FTkNPREVSID0gbmV3IFRleHRFbmNvZGVyKCk7XG5cbmV4cG9ydCBjbGFzcyBOQVRTUHViU3ViQWRhcHRlciBpbXBsZW1lbnRzIFB1YlN1YkFkYXB0ZXIge1xuXHRyZWFkb25seSBwcm92aWRlciA9IFwibmF0c1wiIGFzIGNvbnN0O1xuXHRwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTkFUU1B1YlN1YkNvbmZpZztcblx0cHJpdmF0ZSBjb25uOiBOYXRzQ29ubmVjdGlvbiB8IG51bGwgPSBudWxsO1xuXHRwcml2YXRlIHN1YnNjcmlwdGlvbnM6IE1hcDxzdHJpbmcsIE5hdHNTdWJzY3JpcHRpb24gfCB7IHVuc3Vic2NyaWJlOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCB9PiA9IG5ldyBNYXAoKTtcblx0cHJpdmF0ZSBjb25uZWN0ZWQgPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3Rvcihjb25maWc/OiBQYXJ0aWFsPE5BVFNQdWJTdWJDb25maWc+KSB7XG5cdFx0dGhpcy5jb25maWcgPSB7XG5cdFx0XHRzZXJ2ZXJzOiBjb25maWc/LnNlcnZlcnMgPz8gKHByb2Nlc3MuZW52Lk5BVFNfU0VSVkVSUyA/PyBcImxvY2FsaG9zdDo0MjIyXCIpLnNwbGl0KFwiLFwiKS5tYXAoKHMpID0+IHMudHJpbSgpKSxcblx0XHRcdHRva2VuOiBjb25maWc/LnRva2VuID8/IHByb2Nlc3MuZW52Lk5BVFNfVE9LRU4sXG5cdFx0XHR1c2VyOiBjb25maWc/LnVzZXIgPz8gcHJvY2Vzcy5lbnYuTkFUU19VU0VSLFxuXHRcdFx0cGFzczogY29uZmlnPy5wYXNzID8/IHByb2Nlc3MuZW52Lk5BVFNfUEFTUyxcblx0XHR9O1xuXHR9XG5cblx0YXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy5jb25uZWN0ZWQpIHJldHVybjtcblx0XHR0cnkge1xuXHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBuYXRzIGlzIGEgcnVudGltZSBwZWVyIGRlcC5cblx0XHRcdGNvbnN0IG5hdHM6IGFueSA9IGF3YWl0IGltcG9ydChcIm5hdHNcIik7XG5cdFx0XHR0aGlzLmNvbm4gPSAoYXdhaXQgbmF0cy5jb25uZWN0KHtcblx0XHRcdFx0c2VydmVyczogdGhpcy5jb25maWcuc2VydmVycyxcblx0XHRcdFx0dG9rZW46IHRoaXMuY29uZmlnLnRva2VuLFxuXHRcdFx0XHR1c2VyOiB0aGlzLmNvbmZpZy51c2VyLFxuXHRcdFx0XHRwYXNzOiB0aGlzLmNvbmZpZy5wYXNzLFxuXHRcdFx0fSkpIGFzIE5hdHNDb25uZWN0aW9uO1xuXHRcdFx0dGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgW2Jsb2tdW3B1YnN1Yi1uYXRzXSBjb25uZWN0IGZhaWxlZDogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfS4gSW5zdGFsbCBuYXRzIGFzIGEgcGVlciBkZXBlbmRlbmN5OiBidW4gYWRkIG5hdHNgLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHJldHVybjtcblx0XHRmb3IgKGNvbnN0IHN1YiBvZiB0aGlzLnN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IHN1Yi51bnN1YnNjcmliZSgpO1xuXHRcdFx0XHRpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkgYXdhaXQgcmVzdWx0O1xuXHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdC8qIGlnbm9yZSAqL1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMuY2xlYXIoKTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5jb25uPy5kcmFpbigpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0LyogaWdub3JlICovXG5cdFx0fVxuXHRcdHRoaXMuY29ubiA9IG51bGw7XG5cdFx0dGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcblx0fVxuXG5cdGFzeW5jIHN1YnNjcmliZShjb25maWc6IFB1YlN1YlRyaWdnZXJPcHRzLCBoYW5kbGVyOiAobWVzc2FnZTogUHViU3ViTWVzc2FnZSkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQgfHwgIXRoaXMuY29ubikgdGhyb3cgbmV3IEVycm9yKFwiW2Jsb2tdW3B1YnN1Yi1uYXRzXSBub3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0Y29uc3Qgc3ViS2V5ID0gYCR7Y29uZmlnLnRvcGljfSMke2NvbmZpZy5jb25zdW1lckdyb3VwID8/IFwiXCJ9YDtcblxuXHRcdGlmIChjb25maWcuZHVyYWJsZSA9PT0gdHJ1ZSkge1xuXHRcdFx0Ly8gSmV0U3RyZWFtIGR1cmFibGUgc3Vic2NyaXB0aW9uIOKAlCBzdXJ2aXZlcyByZXN0YXJ0cy5cblx0XHRcdGlmICghdGhpcy5jb25uLmpldHN0cmVhbSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJbYmxva11bcHVic3ViLW5hdHNdIGR1cmFibGUgc3Vic2NyaXB0aW9ucyByZXF1aXJlIEpldFN0cmVhbSBzdXBwb3J0IGluIHRoZSBuYXRzIGNsaWVudFwiKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGpzbSA9IGF3YWl0IHRoaXMuY29ubi5qZXRzdHJlYW1NYW5hZ2VyPy4oKTtcblx0XHRcdGlmIChqc20pIHtcblx0XHRcdFx0Ly8gQXV0by1jcmVhdGUgYSBzdHJlYW0gY292ZXJpbmcgdGhlIHN1YmplY3QgaWYgb25lIGRvZXNuJ3Rcblx0XHRcdFx0Ly8gZXhpc3QuIFByb2R1Y3Rpb24gZGVwbG95bWVudHMgc2hvdWxkIHByZS1wcm92aXNpb24gdmlhXG5cdFx0XHRcdC8vIGBuYXRzIHN0cmVhbSBhZGRgIHRvIGNvbnRyb2wgcmV0ZW50aW9uLlxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGF3YWl0IGpzbS5zdHJlYW1zLmFkZCh7XG5cdFx0XHRcdFx0XHRuYW1lOiBgYmxvay0keyhjb25maWcudG9waWMgPz8gXCJcIikucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCBcIl9cIil9YCxcblx0XHRcdFx0XHRcdHN1YmplY3RzOiBbY29uZmlnLnRvcGljXSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBjYXRjaCB7XG5cdFx0XHRcdFx0Lyogc3RyZWFtIGFscmVhZHkgZXhpc3RzIOKAlCBpZ25vcmUgKi9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Y29uc3QganMgPSB0aGlzLmNvbm4uamV0c3RyZWFtKCk7XG5cdFx0XHQvLyBuYXRzLmpzIGBqcy5zdWJzY3JpYmVgIG5lZWRzIGEgQ29uc3VtZXJPcHRzQnVpbGRlciwgTk9UIGEgcmF3XG5cdFx0XHQvLyBgeyBjb25maWcgfWAgb2JqZWN0IOKAlCBvbmx5IHRoZSBidWlsZGVyIGluc3RhbGxzIHRoZSBwdXNoXG5cdFx0XHQvLyBgZGVsaXZlcl9zdWJqZWN0YCBKZXRTdHJlYW0gcmVxdWlyZXMuIEEgcmF3IGNvbmZpZyB0aHJvd3Ncblx0XHRcdC8vIFwicHVzaCBjb25zdW1lciByZXF1aXJlcyBkZWxpdmVyX3N1YmplY3RcIiBhdCBydW50aW1lICh0aGUgdHlwZWRcblx0XHRcdC8vIEFQSSBhY2NlcHRzIGl0LCBzbyB0c2MgbmV2ZXIgY2F0Y2hlcyB0aGlzKS5cblx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogbmF0cyBpcyBhIHJ1bnRpbWUgcGVlciBkZXAuXG5cdFx0XHRjb25zdCBuYXRzOiBhbnkgPSBhd2FpdCBpbXBvcnQoXCJuYXRzXCIpO1xuXHRcdFx0Y29uc3QgZHVyYWJsZU5hbWUgPVxuXHRcdFx0XHRjb25maWcuY29uc3VtZXJHcm91cCA/P1xuXHRcdFx0XHRgYmxvay0keyhjb25maWcuc3Vic2NyaXB0aW9uID8/IGNvbmZpZy50b3BpYyA/PyBcImRlZmF1bHRcIikucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCBcIl9cIil9YDtcblx0XHRcdGNvbnN0IG9wdHMgPSBuYXRzLmNvbnN1bWVyT3B0cygpO1xuXHRcdFx0b3B0cy5kdXJhYmxlKGR1cmFibGVOYW1lKTtcblx0XHRcdG9wdHMuZGVsaXZlclRvKG5hdHMuY3JlYXRlSW5ib3goKSk7XG5cdFx0XHRvcHRzLm1hbnVhbEFjaygpOyAvLyBkaXNwYXRjaEpzTWVzc2FnZSBhY2svbmFrcyBleHBsaWNpdGx5XG5cdFx0XHRpZiAoY29uZmlnLmFjayA9PT0gZmFsc2UpIG9wdHMuYWNrTm9uZSgpO1xuXHRcdFx0ZWxzZSBvcHRzLmFja0V4cGxpY2l0KCk7XG5cdFx0XHQvLyBSZXBsYXkgcG9zaXRpb246IGBlYXJsaWVzdGAgPSBmdWxsIHJldGFpbmVkIGhpc3Rvcnk7IGB7c2VxfWAgL1xuXHRcdFx0Ly8gYHt0aW1lc3RhbXB9YCByZXN1bWUgZnJvbSBhIGN1cnNvcjsgYGxhdGVzdGAgKGFuZCB0aGUgZGVmYXVsdCxcblx0XHRcdC8vIHBlciB0aGUgc2NoZW1hKSA9IG5ldyBtZXNzYWdlcyBvbmx5LlxuXHRcdFx0aWYgKGNvbmZpZy5zdGFydEZyb20gPT09IFwiZWFybGllc3RcIikge1xuXHRcdFx0XHRvcHRzLmRlbGl2ZXJBbGwoKTtcblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIGNvbmZpZy5zdGFydEZyb20gPT09IFwib2JqZWN0XCIgJiYgY29uZmlnLnN0YXJ0RnJvbSAmJiBcInNlcVwiIGluIGNvbmZpZy5zdGFydEZyb20pIHtcblx0XHRcdFx0b3B0cy5zdGFydFNlcXVlbmNlKGNvbmZpZy5zdGFydEZyb20uc2VxKTtcblx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIGNvbmZpZy5zdGFydEZyb20gPT09IFwib2JqZWN0XCIgJiYgY29uZmlnLnN0YXJ0RnJvbSAmJiBcInRpbWVzdGFtcFwiIGluIGNvbmZpZy5zdGFydEZyb20pIHtcblx0XHRcdFx0b3B0cy5zdGFydFRpbWUobmV3IERhdGUoY29uZmlnLnN0YXJ0RnJvbS50aW1lc3RhbXApKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9wdHMuZGVsaXZlck5ldygpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgc3ViID0gYXdhaXQganMuc3Vic2NyaWJlKGNvbmZpZy50b3BpYywgb3B0cyk7XG5cdFx0XHR0aGlzLnN1YnNjcmlwdGlvbnMuc2V0KHN1YktleSwgeyB1bnN1YnNjcmliZTogKCkgPT4gc3ViLnVuc3Vic2NyaWJlKCkgfSk7XG5cdFx0XHQvLyBEcml2ZSB0aGUgYXN5bmMgaXRlcmF0b3IgaW4gYSBiYWNrZ3JvdW5kIGxvb3AuXG5cdFx0XHR2b2lkIChhc3luYyAoKSA9PiB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yIGF3YWl0IChjb25zdCBtc2cgb2Ygc3ViIGFzIHVua25vd24gYXMgQXN5bmNJdGVyYWJsZTxOYXRzSnNNc2c+KSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLmRpc3BhdGNoSnNNZXNzYWdlKG1zZywgY29uZmlnLCBoYW5kbGVyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRcdC8vIFN1YnNjcmlwdGlvbiBjbG9zZWQgb3IgY29ubmVjdGlvbiBsb3N0IOKAlCBsZXQgdGhlIHRyaWdnZXJcblx0XHRcdFx0XHQvLyByZS1saXN0ZW4gdmlhIEhNUi9yZWNvbm5lY3QgbG9naWMuIExvZyBmb3IgdmlzaWJpbGl0eS5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGBbYmxva11bcHVic3ViLW5hdHNdIHN1YnNjcmlwdGlvbiBlcnJvcjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdFx0XHR9XG5cdFx0XHR9KSgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIENvcmUgTkFUUyBzdWJzY3JpcHRpb24g4oCUIGZpcmUtYW5kLWZvcmdldCwgd2l0aCBvcHRpb25hbCBxdWV1ZVxuXHRcdC8vIGdyb3VwIGZvciBjb21wZXRpbmctY29uc3VtZXIgc2VtYW50aWNzLlxuXHRcdGNvbnN0IHN1YiA9IHRoaXMuY29ubi5zdWJzY3JpYmUoY29uZmlnLnRvcGljLCB7XG5cdFx0XHRxdWV1ZTogY29uZmlnLmNvbnN1bWVyR3JvdXAsXG5cdFx0XHRjYWxsYmFjazogKGVyciwgbXNnKSA9PiB7XG5cdFx0XHRcdGlmIChlcnIpIHtcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGBbYmxva11bcHVic3ViLW5hdHNdIHN1YnNjcmliZSBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0dm9pZCB0aGlzLmRpc3BhdGNoQ29yZU1lc3NhZ2UobXNnLCBjb25maWcsIGhhbmRsZXIpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMuc2V0KHN1YktleSwgc3ViKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hKc01lc3NhZ2UoXG5cdFx0bXNnOiBOYXRzSnNNc2csXG5cdFx0Y29uZmlnOiBQdWJTdWJUcmlnZ2VyT3B0cyxcblx0XHRoYW5kbGVyOiAobWVzc2FnZTogUHViU3ViTWVzc2FnZSkgPT4gUHJvbWlzZTx2b2lkPixcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdGV4dCA9IFRFWFRfREVDT0RFUi5kZWNvZGUobXNnLmRhdGEpO1xuXHRcdGxldCBib2R5OiB1bmtub3duID0gdGV4dDtcblx0XHR0cnkge1xuXHRcdFx0Ym9keSA9IHRleHQubGVuZ3RoID4gMCA/IEpTT04ucGFyc2UodGV4dCkgOiBudWxsO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0LyogbGVhdmUgYXMgdGV4dCAqL1xuXHRcdH1cblx0XHRjb25zdCBtZXNzYWdlOiBQdWJTdWJNZXNzYWdlID0ge1xuXHRcdFx0aWQ6IGAke21zZy5pbmZvLnN0cmVhbX06JHttc2cuc2VxfWAsXG5cdFx0XHRib2R5LFxuXHRcdFx0YXR0cmlidXRlczogeyBzdWJqZWN0OiBtc2cuc3ViamVjdCB9LFxuXHRcdFx0cmF3OiBtc2csXG5cdFx0XHR0b3BpYzogbXNnLnN1YmplY3QsXG5cdFx0XHRzdWJzY3JpcHRpb246IG1zZy5pbmZvLmNvbnN1bWVyLFxuXHRcdFx0cHVibGlzaFRpbWU6IG1zZy5pbmZvLnRpbWVzdGFtcE5hbm9zID8gbmV3IERhdGUobXNnLmluZm8udGltZXN0YW1wTmFub3MgLyAxZTYpIDogdW5kZWZpbmVkLFxuXHRcdFx0YWNrOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdG1zZy5hY2soKTtcblx0XHRcdH0sXG5cdFx0XHRuYWNrOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdG1zZy5uYWsoKTtcblx0XHRcdH0sXG5cdFx0fTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgaGFuZGxlcihtZXNzYWdlKTtcblx0XHRcdGlmIChjb25maWcuYWNrICE9PSBmYWxzZSkgbXNnLmFjaygpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0bXNnLm5haygpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hDb3JlTWVzc2FnZShcblx0XHRtc2c6IE5hdHNNc2csXG5cdFx0X2NvbmZpZzogUHViU3ViVHJpZ2dlck9wdHMsXG5cdFx0aGFuZGxlcjogKG1lc3NhZ2U6IFB1YlN1Yk1lc3NhZ2UpID0+IFByb21pc2U8dm9pZD4sXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHRleHQgPSBURVhUX0RFQ09ERVIuZGVjb2RlKG1zZy5kYXRhKTtcblx0XHRsZXQgYm9keTogdW5rbm93biA9IHRleHQ7XG5cdFx0dHJ5IHtcblx0XHRcdGJvZHkgPSB0ZXh0Lmxlbmd0aCA+IDAgPyBKU09OLnBhcnNlKHRleHQpIDogbnVsbDtcblx0XHR9IGNhdGNoIHtcblx0XHRcdC8qIGxlYXZlIGFzIHRleHQgKi9cblx0XHR9XG5cdFx0Y29uc3QgbWVzc2FnZTogUHViU3ViTWVzc2FnZSA9IHtcblx0XHRcdGlkOiBgJHttc2cuc3ViamVjdH06JHttc2cuc2lkfToke3V1aWQoKX1gLFxuXHRcdFx0Ym9keSxcblx0XHRcdGF0dHJpYnV0ZXM6IHsgc3ViamVjdDogbXNnLnN1YmplY3QgfSxcblx0XHRcdHJhdzogbXNnLFxuXHRcdFx0dG9waWM6IG1zZy5zdWJqZWN0LFxuXHRcdFx0YWNrOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdC8qIGNvcmUgTkFUUyBoYXMgbm8gZXhwbGljaXQgYWNrICovXG5cdFx0XHR9LFxuXHRcdFx0bmFjazogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHQvKiBjb3JlIE5BVFMgaGFzIG5vIGV4cGxpY2l0IG5hY2sgKi9cblx0XHRcdH0sXG5cdFx0fTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgaGFuZGxlcihtZXNzYWdlKTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYFtibG9rXVtwdWJzdWItbmF0c10gaGFuZGxlciBlcnJvcjogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIHVuc3Vic2NyaWJlKHN1YnNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc3ViID0gdGhpcy5zdWJzY3JpcHRpb25zLmdldChzdWJzY3JpcHRpb24pO1xuXHRcdGlmICghc3ViKSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IHN1Yi51bnN1YnNjcmliZSgpO1xuXHRcdFx0aWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIGF3YWl0IHJlc3VsdDtcblx0XHR9IGNhdGNoIHtcblx0XHRcdC8qIGlnbm9yZSAqL1xuXHRcdH1cblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMuZGVsZXRlKHN1YnNjcmlwdGlvbik7XG5cdH1cblxuXHRhc3luYyBwdWJsaXNoKHRvcGljOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkIHx8ICF0aGlzLmNvbm4pIHRocm93IG5ldyBFcnJvcihcIltibG9rXVtwdWJzdWItbmF0c10gbm90IGNvbm5lY3RlZC4gQ2FsbCBjb25uZWN0KCkgZmlyc3QuXCIpO1xuXHRcdGNvbnN0IGJvZHkgPSB0eXBlb2YgcGF5bG9hZCA9PT0gXCJzdHJpbmdcIiA/IHBheWxvYWQgOiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcblx0XHRjb25zdCBkYXRhID0gVEVYVF9FTkNPREVSLmVuY29kZShib2R5KTtcblx0XHQvLyBVc2UgY29yZSBOQVRTIHB1Ymxpc2guIFdoZW4gYSBkdXJhYmxlIHN1YnNjcmliZXIgaGFzIGJlZW5cblx0XHQvLyBpbnN0YWxsZWQgZm9yIHRoaXMgc3ViamVjdCwgdGhlIHN1YnNjcmliZSgpIHBhdGggY3JlYXRlZCBhXG5cdFx0Ly8gSmV0U3RyZWFtIHN0cmVhbSB3aXRoIGEgc3ViamVjdCBmaWx0ZXIgdGhhdCBjYXB0dXJlcyBhbnlcblx0XHQvLyBwdWJsaXNoIHRvIGB0b3BpY2Ag4oCUIHNvIGR1cmFibGUgY29uc3VtZXJzIHNlZSB0aGUgbWVzc2FnZSB2aWFcblx0XHQvLyB0aGUgc3RyZWFtIHdoaWxlIGNvcmUgc3Vic2NyaWJlcnMgc2VlIGl0IGRpcmVjdGx5LiBUaGUgZWFybGllclxuXHRcdC8vIFwidHJ5IGpzLnB1Ymxpc2ggZmlyc3QsIGZhbGwgYmFjayB0byBjb3JlXCIgbG9naWMgY2F1c2VkXG5cdFx0Ly8gKipkb3VibGUtZGVsaXZlcnkqKjoganMucHVibGlzaCB0byBhIHN1YmplY3QgY292ZXJlZCBieSBhXG5cdFx0Ly8gc3RyZWFtIGdvZXMgdG8gQk9USCB0aGUgc3RyZWFtIGFuZCBjb3JlIHN1YnNjcmliZXJzLCB0aGVuIHRoZVxuXHRcdC8vIGZhbGxiYWNrIHdvdWxkIHB1Ymxpc2ggQUdBSU4gaWYganMucHVibGlzaCB0aW1lZCBvdXQgKHZzXG5cdFx0Ly8gcmV0dXJuaW5nIDUwMyBmYXN0KS4gU3RpY2tpbmcgdG8gY29yZSBwdWJsaXNoIGF2b2lkcyB0aGUgcmFjZS5cblx0XHR0aGlzLmNvbm4ucHVibGlzaCh0b3BpYywgZGF0YSk7XG5cdH1cblxuXHRpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG5cdH1cblxuXHRhc3luYyBoZWFsdGhDaGVjaygpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG5cdH1cbn1cbiJdfQ==
|
|
@@ -7,10 +7,17 @@
|
|
|
7
7
|
* message (fan-out). When `consumerGroup` is explicitly set on the
|
|
8
8
|
* workflow, all subscribers in the group compete (1 of N gets each).
|
|
9
9
|
*
|
|
10
|
-
* Replay cursors:
|
|
11
|
-
* - `"
|
|
12
|
-
* - `"earliest"`
|
|
10
|
+
* Replay cursors (`startFrom`):
|
|
11
|
+
* - unset / `"latest"` → `$` (only new messages).
|
|
12
|
+
* - `"earliest"` → `0` (replay full retained stream).
|
|
13
13
|
* - `{seq: N}` → resume from stream id `N-0`.
|
|
14
|
+
* - `{timestamp: ms}` → resume from id `ms-0` (time cursor).
|
|
15
|
+
* When the consumer group already exists, `startFrom` is applied via
|
|
16
|
+
* `XGROUP SETID` so a reconnect / second subscribe still repositions it.
|
|
17
|
+
*
|
|
18
|
+
* Group lifecycle: an explicit `consumerGroup` (competing-consumer) or
|
|
19
|
+
* `durable: true` persists the group; an auto-generated fan-out group is
|
|
20
|
+
* non-durable and torn down (`XGROUP DESTROY`) on unsubscribe/disconnect.
|
|
14
21
|
*
|
|
15
22
|
* Requires `ioredis` as a peer dependency.
|
|
16
23
|
*
|