@blokjs/trigger-worker 0.2.1 → 0.6.1
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/__tests__/integration/nats-adapter.real-nats.test.ts +116 -0
- package/__tests__/integration/pgboss-adapter.real-pg.test.ts +164 -0
- package/__tests__/integration/rabbitmq-adapter.real-rabbitmq.test.ts +179 -0
- package/__tests__/integration/sqs-adapter.real-sqs.test.ts +228 -0
- package/dist/WorkerTrigger.d.ts +40 -4
- package/dist/WorkerTrigger.js +272 -40
- package/dist/adapters/BullMQAdapter.d.ts +1 -1
- package/dist/adapters/BullMQAdapter.js +5 -42
- package/dist/adapters/InMemoryAdapter.d.ts +1 -1
- package/dist/adapters/InMemoryAdapter.js +13 -12
- package/dist/adapters/KafkaAdapter.d.ts +62 -0
- package/dist/adapters/KafkaAdapter.js +236 -0
- package/dist/adapters/NATSAdapter.d.ts +110 -0
- package/dist/adapters/NATSAdapter.js +394 -0
- package/dist/adapters/PgBossAdapter.d.ts +56 -0
- package/dist/adapters/PgBossAdapter.js +251 -0
- package/dist/adapters/RabbitMQAdapter.d.ts +51 -0
- package/dist/adapters/RabbitMQAdapter.js +241 -0
- package/dist/adapters/RedisStreamsAdapter.d.ts +64 -0
- package/dist/adapters/RedisStreamsAdapter.js +240 -0
- package/dist/adapters/SQSAdapter.d.ts +61 -0
- package/dist/adapters/SQSAdapter.js +269 -0
- package/dist/adapters/factory.d.ts +34 -0
- package/dist/adapters/factory.js +103 -0
- package/dist/index.d.ts +25 -7
- package/dist/index.js +31 -16
- package/package.json +27 -5
- package/src/WorkerTrigger.test.ts +44 -14
- package/src/WorkerTrigger.ts +299 -27
- package/src/adapters/InMemoryAdapter.ts +9 -5
- package/src/adapters/KafkaAdapter.ts +277 -0
- package/src/adapters/NATSAdapter.ts +454 -0
- package/src/adapters/PgBossAdapter.ts +293 -0
- package/src/adapters/RabbitMQAdapter.ts +285 -0
- package/src/adapters/RedisStreamsAdapter.ts +286 -0
- package/src/adapters/SQSAdapter.ts +306 -0
- package/src/adapters/factory.test.ts +89 -0
- package/src/adapters/factory.ts +111 -0
- package/src/adapters/new-adapters.test.ts +130 -0
- package/src/index.ts +31 -4
- package/template/.env.example +13 -0
- package/template/package.json +45 -0
- package/template/src/Nodes.ts +10 -0
- package/template/src/Workflows.ts +8 -0
- package/template/src/index.ts +41 -0
- package/template/src/runner/WorkerServer.ts +34 -0
- package/template/src/runner/types/Workflows.ts +7 -0
- package/template/src/workflows/jobs/process-job.ts +47 -0
- package/template/tsconfig.json +31 -0
- package/template/vitest.config.ts +39 -0
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* ```
|
|
21
21
|
*/
|
|
22
22
|
import type { WorkerAdapter, WorkerJob, WorkerQueueStats } from "../WorkerTrigger";
|
|
23
|
-
import type { WorkerTriggerOpts } from "@
|
|
23
|
+
import type { WorkerTriggerOpts } from "@blokjs/helper";
|
|
24
24
|
/**
|
|
25
25
|
* BullMQ adapter configuration
|
|
26
26
|
*/
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* BullMQAdapter - Worker adapter using BullMQ (Redis-backed)
|
|
4
3
|
*
|
|
@@ -20,48 +19,13 @@
|
|
|
20
19
|
* });
|
|
21
20
|
* ```
|
|
22
21
|
*/
|
|
23
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
24
|
-
if (k2 === undefined) k2 = k;
|
|
25
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
26
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
27
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
28
|
-
}
|
|
29
|
-
Object.defineProperty(o, k2, desc);
|
|
30
|
-
}) : (function(o, m, k, k2) {
|
|
31
|
-
if (k2 === undefined) k2 = k;
|
|
32
|
-
o[k2] = m[k];
|
|
33
|
-
}));
|
|
34
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
35
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
36
|
-
}) : function(o, v) {
|
|
37
|
-
o["default"] = v;
|
|
38
|
-
});
|
|
39
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
40
|
-
var ownKeys = function(o) {
|
|
41
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
42
|
-
var ar = [];
|
|
43
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
44
|
-
return ar;
|
|
45
|
-
};
|
|
46
|
-
return ownKeys(o);
|
|
47
|
-
};
|
|
48
|
-
return function (mod) {
|
|
49
|
-
if (mod && mod.__esModule) return mod;
|
|
50
|
-
var result = {};
|
|
51
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
52
|
-
__setModuleDefault(result, mod);
|
|
53
|
-
return result;
|
|
54
|
-
};
|
|
55
|
-
})();
|
|
56
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
57
|
-
exports.BullMQAdapter = void 0;
|
|
58
22
|
/**
|
|
59
23
|
* BullMQ Worker Adapter
|
|
60
24
|
*
|
|
61
25
|
* Uses BullMQ for robust, Redis-backed job processing with support for
|
|
62
26
|
* priority queues, delayed jobs, retries, and dead letter handling.
|
|
63
27
|
*/
|
|
64
|
-
class BullMQAdapter {
|
|
28
|
+
export class BullMQAdapter {
|
|
65
29
|
provider = "bullmq";
|
|
66
30
|
connection = null;
|
|
67
31
|
workers = new Map();
|
|
@@ -83,7 +47,7 @@ class BullMQAdapter {
|
|
|
83
47
|
if (this.connected)
|
|
84
48
|
return;
|
|
85
49
|
try {
|
|
86
|
-
const { default: IORedis } = await
|
|
50
|
+
const { default: IORedis } = await import("ioredis");
|
|
87
51
|
this.connection = new IORedis({
|
|
88
52
|
host: this.config.host,
|
|
89
53
|
port: this.config.port,
|
|
@@ -131,7 +95,7 @@ class BullMQAdapter {
|
|
|
131
95
|
}
|
|
132
96
|
try {
|
|
133
97
|
// Dynamic import to avoid hard dependency on bullmq
|
|
134
|
-
const bullmq = await
|
|
98
|
+
const bullmq = await import("bullmq");
|
|
135
99
|
const BullWorker = bullmq.Worker;
|
|
136
100
|
const BullQueue = bullmq.Queue;
|
|
137
101
|
// Build worker options
|
|
@@ -194,7 +158,7 @@ class BullMQAdapter {
|
|
|
194
158
|
try {
|
|
195
159
|
// Ensure queue exists
|
|
196
160
|
if (!this.queues.has(queue)) {
|
|
197
|
-
const { Queue } = await
|
|
161
|
+
const { Queue } = await import("bullmq");
|
|
198
162
|
const q = new Queue(queue, {
|
|
199
163
|
connection: this.connection,
|
|
200
164
|
prefix: this.config.prefix,
|
|
@@ -255,5 +219,4 @@ class BullMQAdapter {
|
|
|
255
219
|
return { waiting, active, completed, failed, delayed };
|
|
256
220
|
}
|
|
257
221
|
}
|
|
258
|
-
exports.BullMQAdapter = BullMQAdapter;
|
|
259
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVsbE1RQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9CdWxsTVFBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBCSDs7Ozs7R0FLRztBQUNILE1BQWEsYUFBYTtJQUNoQixRQUFRLEdBQUcsUUFBaUIsQ0FBQztJQUM5QixVQUFVLEdBQVksSUFBSSxDQUFDO0lBQzNCLE9BQU8sR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMxQyxNQUFNLEdBQXlCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDekMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNULE1BQU0sQ0FBZTtJQUV0QyxZQUFZLE1BQThCO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDYixJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxXQUFXO1lBQzNELElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUMzRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWM7WUFDeEQsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxJQUFJLGFBQWE7WUFDdkMsZUFBZSxFQUFFLE1BQU0sRUFBRSxlQUFlLElBQUksQ0FBQztZQUM3QyxlQUFlLEVBQUUsTUFBTSxFQUFFLGVBQWUsSUFBSSxJQUFJ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LEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN2RSxDQUFDO1FBRUQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQU05QixDQUFDO1FBRUYsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDdkUsQ0FBQyxDQUFDLGVBQWUsRUFBRTtZQUNuQixDQUFDLENBQUMsY0FBYyxFQUFFO1lBQ2xCLENBQUMsQ0FBQyxpQkFBaUIsRUFBRTtZQUNyQixDQUFDLENBQUMsY0FBYyxFQUFFO1lBQ2xCLENBQUMsQ0FBQyxlQUFlLEVBQUU7U0FDbkIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0NBQ0Q7QUFuUEQsc0NBbVBDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCdWxsTVFBZGFwdGVyIC0gV29ya2VyIGFkYXB0ZXIgdXNpbmcgQnVsbE1RIChSZWRpcy1iYWNrZWQpXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIFJlZGlzLWJhY2tlZCBwZXJzaXN0ZW50IGpvYiBxdWV1ZXNcbiAqIC0gQ29uZmlndXJhYmxlIGNvbmN1cnJlbmN5IHBlciBxdWV1ZVxuICogLSBKb2IgcHJpb3JpdHkgc3VwcG9ydFxuICogLSBEZWxheWVkIGpvYiBzY2hlZHVsaW5nXG4gKiAtIEF1dG9tYXRpYyByZXRyaWVzIHdpdGggY29uZmlndXJhYmxlIGJhY2tvZmZcbiAqIC0gUXVldWUgc3RhdGlzdGljc1xuICpcbiAqIFJlcXVpcmVzOiBidWxsbXEgYW5kIGlvcmVkaXMgYXMgcGVlciBkZXBlbmRlbmNpZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYWRhcHRlciA9IG5ldyBCdWxsTVFBZGFwdGVyKHtcbiAqICAgaG9zdDogXCJsb2NhbGhvc3RcIixcbiAqICAgcG9ydDogNjM3OSxcbiAqIH0pO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBXb3JrZXJBZGFwdGVyLCBXb3JrZXJKb2IsIFdvcmtlclF1ZXVlU3RhdHMgfSBmcm9tIFwiLi4vV29ya2VyVHJpZ2dlclwiO1xuXG5pbXBvcnQgdHlwZSB7IFdvcmtlclRyaWdnZXJPcHRzIH0gZnJvbSBcIkBibG9rL2hlbHBlclwiO1xuXG4vKipcbiAqIEJ1bGxNUSBhZGFwdGVyIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxsTVFDb25maWcge1xuXHQvKiogUmVkaXMgaG9zdCAoZGVmYXVsdDogZnJvbSBSRURJU19IT1NUIGVudiBvciBcImxvY2FsaG9zdFwiKSAqL1xuXHRob3N0OiBzdHJpbmc7XG5cdC8qKiBSZWRpcyBwb3J0IChkZWZhdWx0OiBmcm9tIFJFRElTX1BPUlQgZW52IG9yIDYzNzkpICovXG5cdHBvcnQ6IG51bWJlcjtcblx0LyoqIFJlZGlzIHBhc3N3b3JkIChkZWZhdWx0OiBmcm9tIFJFRElTX1BBU1NXT1JEIGVudikgKi9cblx0cGFzc3dvcmQ/OiBzdHJpbmc7XG5cdC8qKiBSZWRpcyBkYXRhYmFzZSAoZGVmYXVsdDogZnJvbSBSRURJU19EQiBlbnYgb3IgMCkgKi9cblx0ZGI/OiBudW1iZXI7XG5cdC8qKiBLZXkgcHJlZml4IGZvciBhbGwgQnVsbE1RIGtleXMgKi9cblx0cHJlZml4Pzogc3RyaW5nO1xuXHQvKiogTWF4IHN0YWxsZWQgY291bnQgYmVmb3JlIGpvYiBmYWlscyAqL1xuXHRtYXhTdGFsbGVkQ291bnQ/OiBudW1iZXI7XG5cdC8qKiBTdGFsbGVkIGludGVydmFsIGluIG1zICovXG5cdHN0YWxsZWRJbnRlcnZhbD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBCdWxsTVEgV29ya2VyIEFkYXB0ZXJcbiAqXG4gKiBVc2VzIEJ1bGxNUSBmb3Igcm9idXN0LCBSZWRpcy1iYWNrZWQgam9iIHByb2Nlc3Npbmcgd2l0aCBzdXBwb3J0IGZvclxuICogcHJpb3JpdHkgcXVldWVzLCBkZWxheWVkIGpvYnMsIHJldHJpZXMsIGFuZCBkZWFkIGxldHRlciBoYW5kbGluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1bGxNUUFkYXB0ZXIgaW1wbGVtZW50cyBXb3JrZXJBZGFwdGVyIHtcblx0cmVhZG9ubHkgcHJvdmlkZXIgPSBcImJ1bGxtcVwiIGFzIGNvbnN0O1xuXHRwcml2YXRlIGNvbm5lY3Rpb246IHVua25vd24gPSBudWxsO1xuXHRwcml2YXRlIHdvcmtlcnM6IE1hcDxzdHJpbmcsIHVua25vd24+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIHF1ZXVlczogTWFwPHN0cmluZywgdW5rbm93bj4gPSBuZXcgTWFwKCk7XG5cdHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG5cdHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBCdWxsTVFDb25maWc7XG5cblx0Y29uc3RydWN0b3IoY29uZmlnPzogUGFydGlhbDxCdWxsTVFDb25maWc+KSB7XG5cdFx0dGhpcy5jb25maWcgPSB7XG5cdFx0XHRob3N0OiBjb25maWc/Lmhvc3QgfHwgcHJvY2Vzcy5lbnYuUkVESVNfSE9TVCB8fCBcImxvY2FsaG9zdFwiLFxuXHRcdFx0cG9ydDogY29uZmlnPy5wb3J0ID8/IE51bWJlci5wYXJzZUludChwcm9jZXNzLmVudi5SRURJU19QT1JUIHx8IFwiNjM3OVwiLCAxMCksXG5cdFx0XHRwYXNzd29yZDogY29uZmlnPy5wYXNzd29yZCB8fCBwcm9jZXNzLmVudi5SRURJU19QQVNTV09SRCxcblx0XHRcdGRiOiBjb25maWc/LmRiID8/IE51bWJlci5wYXJzZUludChwcm9jZXNzLmVudi5SRURJU19EQiB8fCBcIjBcIiwgMTApLFxuXHRcdFx0cHJlZml4OiBjb25maWc/LnByZWZpeCB8fCBcImJsb2std29ya2VyXCIsXG5cdFx0XHRtYXhTdGFsbGVkQ291bnQ6IGNvbmZpZz8ubWF4U3RhbGxlZENvdW50ID8/IDIsXG5cdFx0XHRzdGFsbGVkSW50ZXJ2YWw6IGNvbmZpZz8uc3RhbGxlZEludGVydmFsID8/IDUwMDAsXG5cdFx0fTtcblx0fVxuXG5cdGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGVkKSByZXR1cm47XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgeyBkZWZhdWx0OiBJT1JlZGlzIH0gPSBhd2FpdCBpbXBvcnQoXCJpb3JlZGlzXCIpO1xuXHRcdFx0dGhpcy5jb25uZWN0aW9uID0gbmV3IElPUmVkaXMoe1xuXHRcdFx0XHRob3N0OiB0aGlzLmNvbmZpZy5ob3N0LFxuXHRcdFx0XHRwb3J0OiB0aGlzLmNvbmZpZy5wb3J0LFxuXHRcdFx0XHRwYXNzd29yZDogdGhpcy5jb25maWcucGFzc3dvcmQsXG5cdFx0XHRcdGRiOiB0aGlzLmNvbmZpZy5kYixcblx0XHRcdFx0bWF4UmV0cmllc1BlclJlcXVlc3Q6IG51bGwsIC8vIFJlcXVpcmVkIGZvciBCdWxsTVFcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBWZXJpZnkgY29ubmVjdGlvblxuXHRcdFx0YXdhaXQgKHRoaXMuY29ubmVjdGlvbiBhcyB7IHBpbmc6ICgpID0+IFByb21pc2U8c3RyaW5nPiB9KS5waW5nKCk7XG5cdFx0XHR0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLmxvZyhgW0J1bGxNUUFkYXB0ZXJdIENvbm5lY3RlZCB0byBSZWRpcyBhdCAke3RoaXMuY29uZmlnLmhvc3R9OiR7dGhpcy5jb25maWcucG9ydH1gKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgRmFpbGVkIHRvIGNvbm5lY3QgdG8gUmVkaXM6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS4gRW5zdXJlIGlvcmVkaXMgYW5kIGJ1bGxtcSBhcmUgaW5zdGFsbGVkOiBucG0gaW5zdGFsbCBpb3JlZGlzIGJ1bGxtcWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIENsb3NlIGFsbCB3b3JrZXJzXG5cdFx0XHRmb3IgKGNvbnN0IFssIHdvcmtlcl0gb2YgdGhpcy53b3JrZXJzKSB7XG5cdFx0XHRcdGF3YWl0ICh3b3JrZXIgYXMgeyBjbG9zZTogKCkgPT4gUHJvbWlzZTx2b2lkPiB9KS5jbG9zZSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy53b3JrZXJzLmNsZWFyKCk7XG5cblx0XHRcdC8vIENsb3NlIGFsbCBxdWV1ZXNcblx0XHRcdGZvciAoY29uc3QgWywgcXVldWVdIG9mIHRoaXMucXVldWVzKSB7XG5cdFx0XHRcdGF3YWl0IChxdWV1ZSBhcyB7IGNsb3NlOiAoKSA9PiBQcm9taXNlPHZvaWQ+IH0pLmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnF1ZXVlcy5jbGVhcigpO1xuXG5cdFx0XHQvLyBDbG9zZSBSZWRpcyBjb25uZWN0aW9uXG5cdFx0XHRpZiAodGhpcy5jb25uZWN0aW9uKSB7XG5cdFx0XHRcdGF3YWl0ICh0aGlzLmNvbm5lY3Rpb24gYXMgeyBxdWl0OiAoKSA9PiBQcm9taXNlPHN0cmluZz4gfSkucXVpdCgpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuXHRcdFx0Y29uc29sZS5sb2coXCJbQnVsbE1RQWRhcHRlcl0gRGlzY29ubmVjdGVkIGZyb20gUmVkaXNcIik7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYFtCdWxsTVFBZGFwdGVyXSBEaXNjb25uZWN0IGVycm9yOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBwcm9jZXNzKGNvbmZpZzogV29ya2VyVHJpZ2dlck9wdHMsIGhhbmRsZXI6IChqb2I6IFdvcmtlckpvYikgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vdCBjb25uZWN0ZWQuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gRHluYW1pYyBpbXBvcnQgdG8gYXZvaWQgaGFyZCBkZXBlbmRlbmN5IG9uIGJ1bGxtcVxuXHRcdFx0Y29uc3QgYnVsbG1xID0gYXdhaXQgaW1wb3J0KFwiYnVsbG1xXCIpO1xuXHRcdFx0Y29uc3QgQnVsbFdvcmtlciA9IGJ1bGxtcS5Xb3JrZXI7XG5cdFx0XHRjb25zdCBCdWxsUXVldWUgPSBidWxsbXEuUXVldWU7XG5cblx0XHRcdC8vIEJ1aWxkIHdvcmtlciBvcHRpb25zXG5cdFx0XHRjb25zdCB3b3JrZXJPcHRzID0ge1xuXHRcdFx0XHRjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24sXG5cdFx0XHRcdGNvbmN1cnJlbmN5OiBjb25maWcuY29uY3VycmVuY3kgPz8gMSxcblx0XHRcdFx0cHJlZml4OiB0aGlzLmNvbmZpZy5wcmVmaXgsXG5cdFx0XHRcdHN0YWxsZWRJbnRlcnZhbDogdGhpcy5jb25maWcuc3RhbGxlZEludGVydmFsID8/IDUwMDAsXG5cdFx0XHRcdG1heFN0YWxsZWRDb3VudDogdGhpcy5jb25maWcubWF4U3RhbGxlZENvdW50ID8/IDIsXG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCB3b3JrZXIgPSBuZXcgQnVsbFdvcmtlcihcblx0XHRcdFx0Y29uZmlnLnF1ZXVlLFxuXHRcdFx0XHQvLyBCdWxsTVEgcHJvY2Vzc29yIGNhbGxiYWNrXG5cdFx0XHRcdCgoYnVsbEpvYjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGpvYiA9IGJ1bGxKb2IgYXMge1xuXHRcdFx0XHRcdFx0aWQ/OiBzdHJpbmc7XG5cdFx0XHRcdFx0XHRkYXRhOiB1bmtub3duO1xuXHRcdFx0XHRcdFx0b3B0cz86IHsgcHJpb3JpdHk/OiBudW1iZXI7IGRlbGF5PzogbnVtYmVyIH07XG5cdFx0XHRcdFx0XHRhdHRlbXB0c01hZGU6IG51bWJlcjtcblx0XHRcdFx0XHRcdHRpbWVzdGFtcDogbnVtYmVyO1xuXHRcdFx0XHRcdFx0dG9rZW4/OiBzdHJpbmc7XG5cdFx0XHRcdFx0XHRtb3ZlVG9GYWlsZWQ6IChlcnI6IEVycm9yLCB0b2tlbjogc3RyaW5nLCBmZXRjaE5leHQ6IGJvb2xlYW4pID0+IFByb21pc2U8dm9pZD47XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCB3b3JrZXJKb2I6IFdvcmtlckpvYiA9IHtcblx0XHRcdFx0XHRcdGlkOiBqb2IuaWQgfHwgYGpvYi0ke0RhdGUubm93KCl9YCxcblx0XHRcdFx0XHRcdGRhdGE6IGpvYi5kYXRhLFxuXHRcdFx0XHRcdFx0aGVhZGVyczogKChqb2IuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/Ll9oZWFkZXJzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHx8IHt9LFxuXHRcdFx0XHRcdFx0cXVldWU6IGNvbmZpZy5xdWV1ZSxcblx0XHRcdFx0XHRcdHByaW9yaXR5OiBqb2Iub3B0cz8ucHJpb3JpdHkgPz8gY29uZmlnLnByaW9yaXR5ID8/IDAsXG5cdFx0XHRcdFx0XHRhdHRlbXB0czogam9iLmF0dGVtcHRzTWFkZSxcblx0XHRcdFx0XHRcdG1heFJldHJpZXM6IGNvbmZpZy5yZXRyaWVzID8/IDMsXG5cdFx0XHRcdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKGpvYi50aW1lc3RhbXApLFxuXHRcdFx0XHRcdFx0ZGVsYXk6IGpvYi5vcHRzPy5kZWxheSxcblx0XHRcdFx0XHRcdHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0LFxuXHRcdFx0XHRcdFx0cmF3OiBqb2IsXG5cdFx0XHRcdFx0XHRjb21wbGV0ZTogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyBCdWxsTVEgYXV0by1jb21wbGV0ZXMgd2hlbiBwcm9jZXNzb3IgcmVzb2x2ZXNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRmYWlsOiBhc3luYyAoZXJyb3I6IEVycm9yLCByZXF1ZXVlPzogYm9vbGVhbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoIXJlcXVldWUpIHtcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCBqb2IubW92ZVRvRmFpbGVkKGVycm9yLCBqb2IudG9rZW4gfHwgXCJcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhyb3cgZXJyb3I7IC8vIEJ1bGxNUSB3aWxsIGF1dG8tcmV0cnlcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdHJldHVybiBoYW5kbGVyKHdvcmtlckpvYik7XG5cdFx0XHRcdH0pIGFzIG5ldmVyLFxuXHRcdFx0XHR3b3JrZXJPcHRzIGFzIG5ldmVyLFxuXHRcdFx0KTtcblxuXHRcdFx0dGhpcy53b3JrZXJzLnNldChjb25maWcucXVldWUsIHdvcmtlcik7XG5cblx0XHRcdC8vIEVuc3VyZSBxdWV1ZSBvYmplY3QgZXhpc3RzIGZvciBqb2IgZGlzcGF0Y2hpbmdcblx0XHRcdGlmICghdGhpcy5xdWV1ZXMuaGFzKGNvbmZpZy5xdWV1ZSkpIHtcblx0XHRcdFx0Y29uc3QgcXVldWUgPSBuZXcgQnVsbFF1ZXVlKGNvbmZpZy5xdWV1ZSwge1xuXHRcdFx0XHRcdGNvbm5lY3Rpb246IHRoaXMuY29ubmVjdGlvbiBhcyB7IGhvc3Q6IHN0cmluZzsgcG9ydDogbnVtYmVyIH0sXG5cdFx0XHRcdFx0cHJlZml4OiB0aGlzLmNvbmZpZy5wcmVmaXgsXG5cdFx0XHRcdH0gYXMgbmV2ZXIpO1xuXHRcdFx0XHR0aGlzLnF1ZXVlcy5zZXQoY29uZmlnLnF1ZXVlLCBxdWV1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnNvbGUubG9nKGBbQnVsbE1RQWRhcHRlcl0gUHJvY2Vzc2luZyBxdWV1ZTogJHtjb25maWcucXVldWV9IChjb25jdXJyZW5jeT0ke2NvbmZpZy5jb25jdXJyZW5jeSA/PyAxfSlgKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZzogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgYWRkSm9iKFxuXHRcdHF1ZXVlOiBzdHJpbmcsXG5cdFx0ZGF0YTogdW5rbm93bixcblx0XHRvcHRzPzoge1xuXHRcdFx0cHJpb3JpdHk/OiBudW1iZXI7XG5cdFx0XHRkZWxheT86IG51bWJlcjtcblx0XHRcdHJldHJpZXM/OiBudW1iZXI7XG5cdFx0XHR0aW1lb3V0PzogbnVtYmVyO1xuXHRcdFx0am9iSWQ/OiBzdHJpbmc7XG5cdFx0fSxcblx0KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJOb3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIEVuc3VyZSBxdWV1ZSBleGlzdHNcblx0XHRcdGlmICghdGhpcy5xdWV1ZXMuaGFzKHF1ZXVlKSkge1xuXHRcdFx0XHRjb25zdCB7IFF1ZXVlIH0gPSBhd2FpdCBpbXBvcnQoXCJidWxsbXFcIik7XG5cdFx0XHRcdGNvbnN0IHEgPSBuZXcgUXVldWUocXVldWUsIHtcblx0XHRcdFx0XHRjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24gYXMgeyBob3N0OiBzdHJpbmc7IHBvcnQ6IG51bWJlciB9LFxuXHRcdFx0XHRcdHByZWZpeDogdGhpcy5jb25maWcucHJlZml4LFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5xdWV1ZXMuc2V0KHF1ZXVlLCBxKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcSA9IHRoaXMucXVldWVzLmdldChxdWV1ZSkgYXMge1xuXHRcdFx0XHRhZGQ6IChuYW1lOiBzdHJpbmcsIGRhdGE6IHVua25vd24sIG9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBQcm9taXNlPHsgaWQ6IHN0cmluZyB9Pjtcblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IGpvYiA9IGF3YWl0IHEuYWRkKFwicHJvY2Vzc1wiLCBkYXRhLCB7XG5cdFx0XHRcdHByaW9yaXR5OiBvcHRzPy5wcmlvcml0eSxcblx0XHRcdFx0ZGVsYXk6IG9wdHM/LmRlbGF5LFxuXHRcdFx0XHRhdHRlbXB0czogKG9wdHM/LnJldHJpZXMgPz8gMykgKyAxLFxuXHRcdFx0XHRqb2JJZDogb3B0cz8uam9iSWQsXG5cdFx0XHRcdGJhY2tvZmY6IHtcblx0XHRcdFx0XHR0eXBlOiBcImV4cG9uZW50aWFsXCIsXG5cdFx0XHRcdFx0ZGVsYXk6IDEwMDAsXG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIGpvYi5pZDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gYWRkIGpvYjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgc3RvcFByb2Nlc3NpbmcocXVldWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHdvcmtlciA9IHRoaXMud29ya2Vycy5nZXQocXVldWUpO1xuXHRcdGlmICh3b3JrZXIpIHtcblx0XHRcdGF3YWl0ICh3b3JrZXIgYXMgeyBjbG9zZTogKCkgPT4gUHJvbWlzZTx2b2lkPiB9KS5jbG9zZSgpO1xuXHRcdFx0dGhpcy53b3JrZXJzLmRlbGV0ZShxdWV1ZSk7XG5cdFx0XHRjb25zb2xlLmxvZyhgW0J1bGxNUUFkYXB0ZXJdIFN0b3BwZWQgcHJvY2Vzc2luZyBxdWV1ZTogJHtxdWV1ZX1gKTtcblx0XHR9XG5cdH1cblxuXHRpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG5cdH1cblxuXHRhc3luYyBoZWFsdGhDaGVjaygpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkIHx8ICF0aGlzLmNvbm5lY3Rpb24pIHJldHVybiBmYWxzZTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgKHRoaXMuY29ubmVjdGlvbiBhcyB7IHBpbmc6ICgpID0+IFByb21pc2U8c3RyaW5nPiB9KS5waW5nKCk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBnZXRRdWV1ZVN0YXRzKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPFdvcmtlclF1ZXVlU3RhdHM+IHtcblx0XHRpZiAoIXRoaXMucXVldWVzLmhhcyhxdWV1ZSkpIHtcblx0XHRcdHJldHVybiB7IHdhaXRpbmc6IDAsIGFjdGl2ZTogMCwgY29tcGxldGVkOiAwLCBmYWlsZWQ6IDAsIGRlbGF5ZWQ6IDAgfTtcblx0XHR9XG5cblx0XHRjb25zdCBxID0gdGhpcy5xdWV1ZXMuZ2V0KHF1ZXVlKSBhcyB7XG5cdFx0XHRnZXRXYWl0aW5nQ291bnQ6ICgpID0+IFByb21pc2U8bnVtYmVyPjtcblx0XHRcdGdldEFjdGl2ZUNvdW50OiAoKSA9PiBQcm9taXNlPG51bWJlcj47XG5cdFx0XHRnZXRDb21wbGV0ZWRDb3VudDogKCkgPT4gUHJvbWlzZTxudW1iZXI+O1xuXHRcdFx0Z2V0RmFpbGVkQ291bnQ6ICgpID0+IFByb21pc2U8bnVtYmVyPjtcblx0XHRcdGdldERlbGF5ZWRDb3VudDogKCkgPT4gUHJvbWlzZTxudW1iZXI+O1xuXHRcdH07XG5cblx0XHRjb25zdCBbd2FpdGluZywgYWN0aXZlLCBjb21wbGV0ZWQsIGZhaWxlZCwgZGVsYXllZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG5cdFx0XHRxLmdldFdhaXRpbmdDb3VudCgpLFxuXHRcdFx0cS5nZXRBY3RpdmVDb3VudCgpLFxuXHRcdFx0cS5nZXRDb21wbGV0ZWRDb3VudCgpLFxuXHRcdFx0cS5nZXRGYWlsZWRDb3VudCgpLFxuXHRcdFx0cS5nZXREZWxheWVkQ291bnQoKSxcblx0XHRdKTtcblxuXHRcdHJldHVybiB7IHdhaXRpbmcsIGFjdGl2ZSwgY29tcGxldGVkLCBmYWlsZWQsIGRlbGF5ZWQgfTtcblx0fVxufVxuIl19
|
|
222
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVsbE1RQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9CdWxsTVFBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQTBCSDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBQ2hCLFFBQVEsR0FBRyxRQUFpQixDQUFDO0lBQzlCLFVBQVUsR0FBWSxJQUFJLENBQUM7SUFDM0IsT0FBTyxHQUF5QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQzFDLE1BQU0sR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN6QyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ1QsTUFBTSxDQUFlO0lBRXRDLFlBQVksTUFBOEI7UUFDekMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNiLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLFdBQVc7WUFDM0QsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQzNFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYztZQUN4RCxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDbEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksYUFBYTtZQUN2QyxlQUFlLEVBQUUsTUFBTSxFQUFFLGVBQWUsSUFBSSxDQUFDO1lBQzdDLGVBQWUsRUFBRSxNQUFNLEVBQUUsZUFBZSxJQUFJLElBQUk7U0FDaEQsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFL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RSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3ZFLENBQUM7UUFFRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBTTlCLENBQUM7UUFFRixNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUN2RSxDQUFDLENBQUMsZUFBZSxFQUFFO1lBQ25CLENBQUMsQ0FBQyxjQUFjLEVBQUU7WUFDbEIsQ0FBQyxDQUFDLGlCQUFpQixFQUFFO1lBQ3JCLENBQUMsQ0FBQyxjQUFjLEVBQUU7WUFDbEIsQ0FBQyxDQUFDLGVBQWUsRUFBRTtTQUNuQixDQUFDLENBQUM7UUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3hELENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnVsbE1RQWRhcHRlciAtIFdvcmtlciBhZGFwdGVyIHVzaW5nIEJ1bGxNUSAoUmVkaXMtYmFja2VkKVxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBSZWRpcy1iYWNrZWQgcGVyc2lzdGVudCBqb2IgcXVldWVzXG4gKiAtIENvbmZpZ3VyYWJsZSBjb25jdXJyZW5jeSBwZXIgcXVldWVcbiAqIC0gSm9iIHByaW9yaXR5IHN1cHBvcnRcbiAqIC0gRGVsYXllZCBqb2Igc2NoZWR1bGluZ1xuICogLSBBdXRvbWF0aWMgcmV0cmllcyB3aXRoIGNvbmZpZ3VyYWJsZSBiYWNrb2ZmXG4gKiAtIFF1ZXVlIHN0YXRpc3RpY3NcbiAqXG4gKiBSZXF1aXJlczogYnVsbG1xIGFuZCBpb3JlZGlzIGFzIHBlZXIgZGVwZW5kZW5jaWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgQnVsbE1RQWRhcHRlcih7XG4gKiAgIGhvc3Q6IFwibG9jYWxob3N0XCIsXG4gKiAgIHBvcnQ6IDYzNzksXG4gKiB9KTtcbiAqIGBgYFxuICovXG5cbmltcG9ydCB0eXBlIHsgV29ya2VyQWRhcHRlciwgV29ya2VySm9iLCBXb3JrZXJRdWV1ZVN0YXRzIH0gZnJvbSBcIi4uL1dvcmtlclRyaWdnZXJcIjtcblxuaW1wb3J0IHR5cGUgeyBXb3JrZXJUcmlnZ2VyT3B0cyB9IGZyb20gXCJAYmxva2pzL2hlbHBlclwiO1xuXG4vKipcbiAqIEJ1bGxNUSBhZGFwdGVyIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxsTVFDb25maWcge1xuXHQvKiogUmVkaXMgaG9zdCAoZGVmYXVsdDogZnJvbSBSRURJU19IT1NUIGVudiBvciBcImxvY2FsaG9zdFwiKSAqL1xuXHRob3N0OiBzdHJpbmc7XG5cdC8qKiBSZWRpcyBwb3J0IChkZWZhdWx0OiBmcm9tIFJFRElTX1BPUlQgZW52IG9yIDYzNzkpICovXG5cdHBvcnQ6IG51bWJlcjtcblx0LyoqIFJlZGlzIHBhc3N3b3JkIChkZWZhdWx0OiBmcm9tIFJFRElTX1BBU1NXT1JEIGVudikgKi9cblx0cGFzc3dvcmQ/OiBzdHJpbmc7XG5cdC8qKiBSZWRpcyBkYXRhYmFzZSAoZGVmYXVsdDogZnJvbSBSRURJU19EQiBlbnYgb3IgMCkgKi9cblx0ZGI/OiBudW1iZXI7XG5cdC8qKiBLZXkgcHJlZml4IGZvciBhbGwgQnVsbE1RIGtleXMgKi9cblx0cHJlZml4Pzogc3RyaW5nO1xuXHQvKiogTWF4IHN0YWxsZWQgY291bnQgYmVmb3JlIGpvYiBmYWlscyAqL1xuXHRtYXhTdGFsbGVkQ291bnQ/OiBudW1iZXI7XG5cdC8qKiBTdGFsbGVkIGludGVydmFsIGluIG1zICovXG5cdHN0YWxsZWRJbnRlcnZhbD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBCdWxsTVEgV29ya2VyIEFkYXB0ZXJcbiAqXG4gKiBVc2VzIEJ1bGxNUSBmb3Igcm9idXN0LCBSZWRpcy1iYWNrZWQgam9iIHByb2Nlc3Npbmcgd2l0aCBzdXBwb3J0IGZvclxuICogcHJpb3JpdHkgcXVldWVzLCBkZWxheWVkIGpvYnMsIHJldHJpZXMsIGFuZCBkZWFkIGxldHRlciBoYW5kbGluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1bGxNUUFkYXB0ZXIgaW1wbGVtZW50cyBXb3JrZXJBZGFwdGVyIHtcblx0cmVhZG9ubHkgcHJvdmlkZXIgPSBcImJ1bGxtcVwiIGFzIGNvbnN0O1xuXHRwcml2YXRlIGNvbm5lY3Rpb246IHVua25vd24gPSBudWxsO1xuXHRwcml2YXRlIHdvcmtlcnM6IE1hcDxzdHJpbmcsIHVua25vd24+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIHF1ZXVlczogTWFwPHN0cmluZywgdW5rbm93bj4gPSBuZXcgTWFwKCk7XG5cdHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG5cdHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBCdWxsTVFDb25maWc7XG5cblx0Y29uc3RydWN0b3IoY29uZmlnPzogUGFydGlhbDxCdWxsTVFDb25maWc+KSB7XG5cdFx0dGhpcy5jb25maWcgPSB7XG5cdFx0XHRob3N0OiBjb25maWc/Lmhvc3QgfHwgcHJvY2Vzcy5lbnYuUkVESVNfSE9TVCB8fCBcImxvY2FsaG9zdFwiLFxuXHRcdFx0cG9ydDogY29uZmlnPy5wb3J0ID8/IE51bWJlci5wYXJzZUludChwcm9jZXNzLmVudi5SRURJU19QT1JUIHx8IFwiNjM3OVwiLCAxMCksXG5cdFx0XHRwYXNzd29yZDogY29uZmlnPy5wYXNzd29yZCB8fCBwcm9jZXNzLmVudi5SRURJU19QQVNTV09SRCxcblx0XHRcdGRiOiBjb25maWc/LmRiID8/IE51bWJlci5wYXJzZUludChwcm9jZXNzLmVudi5SRURJU19EQiB8fCBcIjBcIiwgMTApLFxuXHRcdFx0cHJlZml4OiBjb25maWc/LnByZWZpeCB8fCBcImJsb2std29ya2VyXCIsXG5cdFx0XHRtYXhTdGFsbGVkQ291bnQ6IGNvbmZpZz8ubWF4U3RhbGxlZENvdW50ID8/IDIsXG5cdFx0XHRzdGFsbGVkSW50ZXJ2YWw6IGNvbmZpZz8uc3RhbGxlZEludGVydmFsID8/IDUwMDAsXG5cdFx0fTtcblx0fVxuXG5cdGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGVkKSByZXR1cm47XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgeyBkZWZhdWx0OiBJT1JlZGlzIH0gPSBhd2FpdCBpbXBvcnQoXCJpb3JlZGlzXCIpO1xuXHRcdFx0dGhpcy5jb25uZWN0aW9uID0gbmV3IElPUmVkaXMoe1xuXHRcdFx0XHRob3N0OiB0aGlzLmNvbmZpZy5ob3N0LFxuXHRcdFx0XHRwb3J0OiB0aGlzLmNvbmZpZy5wb3J0LFxuXHRcdFx0XHRwYXNzd29yZDogdGhpcy5jb25maWcucGFzc3dvcmQsXG5cdFx0XHRcdGRiOiB0aGlzLmNvbmZpZy5kYixcblx0XHRcdFx0bWF4UmV0cmllc1BlclJlcXVlc3Q6IG51bGwsIC8vIFJlcXVpcmVkIGZvciBCdWxsTVFcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBWZXJpZnkgY29ubmVjdGlvblxuXHRcdFx0YXdhaXQgKHRoaXMuY29ubmVjdGlvbiBhcyB7IHBpbmc6ICgpID0+IFByb21pc2U8c3RyaW5nPiB9KS5waW5nKCk7XG5cdFx0XHR0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLmxvZyhgW0J1bGxNUUFkYXB0ZXJdIENvbm5lY3RlZCB0byBSZWRpcyBhdCAke3RoaXMuY29uZmlnLmhvc3R9OiR7dGhpcy5jb25maWcucG9ydH1gKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgRmFpbGVkIHRvIGNvbm5lY3QgdG8gUmVkaXM6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS4gRW5zdXJlIGlvcmVkaXMgYW5kIGJ1bGxtcSBhcmUgaW5zdGFsbGVkOiBucG0gaW5zdGFsbCBpb3JlZGlzIGJ1bGxtcWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIENsb3NlIGFsbCB3b3JrZXJzXG5cdFx0XHRmb3IgKGNvbnN0IFssIHdvcmtlcl0gb2YgdGhpcy53b3JrZXJzKSB7XG5cdFx0XHRcdGF3YWl0ICh3b3JrZXIgYXMgeyBjbG9zZTogKCkgPT4gUHJvbWlzZTx2b2lkPiB9KS5jbG9zZSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy53b3JrZXJzLmNsZWFyKCk7XG5cblx0XHRcdC8vIENsb3NlIGFsbCBxdWV1ZXNcblx0XHRcdGZvciAoY29uc3QgWywgcXVldWVdIG9mIHRoaXMucXVldWVzKSB7XG5cdFx0XHRcdGF3YWl0IChxdWV1ZSBhcyB7IGNsb3NlOiAoKSA9PiBQcm9taXNlPHZvaWQ+IH0pLmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnF1ZXVlcy5jbGVhcigpO1xuXG5cdFx0XHQvLyBDbG9zZSBSZWRpcyBjb25uZWN0aW9uXG5cdFx0XHRpZiAodGhpcy5jb25uZWN0aW9uKSB7XG5cdFx0XHRcdGF3YWl0ICh0aGlzLmNvbm5lY3Rpb24gYXMgeyBxdWl0OiAoKSA9PiBQcm9taXNlPHN0cmluZz4gfSkucXVpdCgpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuXHRcdFx0Y29uc29sZS5sb2coXCJbQnVsbE1RQWRhcHRlcl0gRGlzY29ubmVjdGVkIGZyb20gUmVkaXNcIik7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYFtCdWxsTVFBZGFwdGVyXSBEaXNjb25uZWN0IGVycm9yOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBwcm9jZXNzKGNvbmZpZzogV29ya2VyVHJpZ2dlck9wdHMsIGhhbmRsZXI6IChqb2I6IFdvcmtlckpvYikgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vdCBjb25uZWN0ZWQuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gRHluYW1pYyBpbXBvcnQgdG8gYXZvaWQgaGFyZCBkZXBlbmRlbmN5IG9uIGJ1bGxtcVxuXHRcdFx0Y29uc3QgYnVsbG1xID0gYXdhaXQgaW1wb3J0KFwiYnVsbG1xXCIpO1xuXHRcdFx0Y29uc3QgQnVsbFdvcmtlciA9IGJ1bGxtcS5Xb3JrZXI7XG5cdFx0XHRjb25zdCBCdWxsUXVldWUgPSBidWxsbXEuUXVldWU7XG5cblx0XHRcdC8vIEJ1aWxkIHdvcmtlciBvcHRpb25zXG5cdFx0XHRjb25zdCB3b3JrZXJPcHRzID0ge1xuXHRcdFx0XHRjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24sXG5cdFx0XHRcdGNvbmN1cnJlbmN5OiBjb25maWcuY29uY3VycmVuY3kgPz8gMSxcblx0XHRcdFx0cHJlZml4OiB0aGlzLmNvbmZpZy5wcmVmaXgsXG5cdFx0XHRcdHN0YWxsZWRJbnRlcnZhbDogdGhpcy5jb25maWcuc3RhbGxlZEludGVydmFsID8/IDUwMDAsXG5cdFx0XHRcdG1heFN0YWxsZWRDb3VudDogdGhpcy5jb25maWcubWF4U3RhbGxlZENvdW50ID8/IDIsXG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCB3b3JrZXIgPSBuZXcgQnVsbFdvcmtlcihcblx0XHRcdFx0Y29uZmlnLnF1ZXVlLFxuXHRcdFx0XHQvLyBCdWxsTVEgcHJvY2Vzc29yIGNhbGxiYWNrXG5cdFx0XHRcdCgoYnVsbEpvYjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGpvYiA9IGJ1bGxKb2IgYXMge1xuXHRcdFx0XHRcdFx0aWQ/OiBzdHJpbmc7XG5cdFx0XHRcdFx0XHRkYXRhOiB1bmtub3duO1xuXHRcdFx0XHRcdFx0b3B0cz86IHsgcHJpb3JpdHk/OiBudW1iZXI7IGRlbGF5PzogbnVtYmVyIH07XG5cdFx0XHRcdFx0XHRhdHRlbXB0c01hZGU6IG51bWJlcjtcblx0XHRcdFx0XHRcdHRpbWVzdGFtcDogbnVtYmVyO1xuXHRcdFx0XHRcdFx0dG9rZW4/OiBzdHJpbmc7XG5cdFx0XHRcdFx0XHRtb3ZlVG9GYWlsZWQ6IChlcnI6IEVycm9yLCB0b2tlbjogc3RyaW5nLCBmZXRjaE5leHQ6IGJvb2xlYW4pID0+IFByb21pc2U8dm9pZD47XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCB3b3JrZXJKb2I6IFdvcmtlckpvYiA9IHtcblx0XHRcdFx0XHRcdGlkOiBqb2IuaWQgfHwgYGpvYi0ke0RhdGUubm93KCl9YCxcblx0XHRcdFx0XHRcdGRhdGE6IGpvYi5kYXRhLFxuXHRcdFx0XHRcdFx0aGVhZGVyczogKChqb2IuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/Ll9oZWFkZXJzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHx8IHt9LFxuXHRcdFx0XHRcdFx0cXVldWU6IGNvbmZpZy5xdWV1ZSxcblx0XHRcdFx0XHRcdHByaW9yaXR5OiBqb2Iub3B0cz8ucHJpb3JpdHkgPz8gY29uZmlnLnByaW9yaXR5ID8/IDAsXG5cdFx0XHRcdFx0XHRhdHRlbXB0czogam9iLmF0dGVtcHRzTWFkZSxcblx0XHRcdFx0XHRcdG1heFJldHJpZXM6IGNvbmZpZy5yZXRyaWVzID8/IDMsXG5cdFx0XHRcdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKGpvYi50aW1lc3RhbXApLFxuXHRcdFx0XHRcdFx0ZGVsYXk6IGpvYi5vcHRzPy5kZWxheSxcblx0XHRcdFx0XHRcdHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0LFxuXHRcdFx0XHRcdFx0cmF3OiBqb2IsXG5cdFx0XHRcdFx0XHRjb21wbGV0ZTogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyBCdWxsTVEgYXV0by1jb21wbGV0ZXMgd2hlbiBwcm9jZXNzb3IgcmVzb2x2ZXNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRmYWlsOiBhc3luYyAoZXJyb3I6IEVycm9yLCByZXF1ZXVlPzogYm9vbGVhbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoIXJlcXVldWUpIHtcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCBqb2IubW92ZVRvRmFpbGVkKGVycm9yLCBqb2IudG9rZW4gfHwgXCJcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhyb3cgZXJyb3I7IC8vIEJ1bGxNUSB3aWxsIGF1dG8tcmV0cnlcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdHJldHVybiBoYW5kbGVyKHdvcmtlckpvYik7XG5cdFx0XHRcdH0pIGFzIG5ldmVyLFxuXHRcdFx0XHR3b3JrZXJPcHRzIGFzIG5ldmVyLFxuXHRcdFx0KTtcblxuXHRcdFx0dGhpcy53b3JrZXJzLnNldChjb25maWcucXVldWUsIHdvcmtlcik7XG5cblx0XHRcdC8vIEVuc3VyZSBxdWV1ZSBvYmplY3QgZXhpc3RzIGZvciBqb2IgZGlzcGF0Y2hpbmdcblx0XHRcdGlmICghdGhpcy5xdWV1ZXMuaGFzKGNvbmZpZy5xdWV1ZSkpIHtcblx0XHRcdFx0Y29uc3QgcXVldWUgPSBuZXcgQnVsbFF1ZXVlKGNvbmZpZy5xdWV1ZSwge1xuXHRcdFx0XHRcdGNvbm5lY3Rpb246IHRoaXMuY29ubmVjdGlvbiBhcyB7IGhvc3Q6IHN0cmluZzsgcG9ydDogbnVtYmVyIH0sXG5cdFx0XHRcdFx0cHJlZml4OiB0aGlzLmNvbmZpZy5wcmVmaXgsXG5cdFx0XHRcdH0gYXMgbmV2ZXIpO1xuXHRcdFx0XHR0aGlzLnF1ZXVlcy5zZXQoY29uZmlnLnF1ZXVlLCBxdWV1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnNvbGUubG9nKGBbQnVsbE1RQWRhcHRlcl0gUHJvY2Vzc2luZyBxdWV1ZTogJHtjb25maWcucXVldWV9IChjb25jdXJyZW5jeT0ke2NvbmZpZy5jb25jdXJyZW5jeSA/PyAxfSlgKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZzogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgYWRkSm9iKFxuXHRcdHF1ZXVlOiBzdHJpbmcsXG5cdFx0ZGF0YTogdW5rbm93bixcblx0XHRvcHRzPzoge1xuXHRcdFx0cHJpb3JpdHk/OiBudW1iZXI7XG5cdFx0XHRkZWxheT86IG51bWJlcjtcblx0XHRcdHJldHJpZXM/OiBudW1iZXI7XG5cdFx0XHR0aW1lb3V0PzogbnVtYmVyO1xuXHRcdFx0am9iSWQ/OiBzdHJpbmc7XG5cdFx0fSxcblx0KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJOb3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIEVuc3VyZSBxdWV1ZSBleGlzdHNcblx0XHRcdGlmICghdGhpcy5xdWV1ZXMuaGFzKHF1ZXVlKSkge1xuXHRcdFx0XHRjb25zdCB7IFF1ZXVlIH0gPSBhd2FpdCBpbXBvcnQoXCJidWxsbXFcIik7XG5cdFx0XHRcdGNvbnN0IHEgPSBuZXcgUXVldWUocXVldWUsIHtcblx0XHRcdFx0XHRjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24gYXMgeyBob3N0OiBzdHJpbmc7IHBvcnQ6IG51bWJlciB9LFxuXHRcdFx0XHRcdHByZWZpeDogdGhpcy5jb25maWcucHJlZml4LFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5xdWV1ZXMuc2V0KHF1ZXVlLCBxKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcSA9IHRoaXMucXVldWVzLmdldChxdWV1ZSkgYXMge1xuXHRcdFx0XHRhZGQ6IChuYW1lOiBzdHJpbmcsIGRhdGE6IHVua25vd24sIG9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBQcm9taXNlPHsgaWQ6IHN0cmluZyB9Pjtcblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IGpvYiA9IGF3YWl0IHEuYWRkKFwicHJvY2Vzc1wiLCBkYXRhLCB7XG5cdFx0XHRcdHByaW9yaXR5OiBvcHRzPy5wcmlvcml0eSxcblx0XHRcdFx0ZGVsYXk6IG9wdHM/LmRlbGF5LFxuXHRcdFx0XHRhdHRlbXB0czogKG9wdHM/LnJldHJpZXMgPz8gMykgKyAxLFxuXHRcdFx0XHRqb2JJZDogb3B0cz8uam9iSWQsXG5cdFx0XHRcdGJhY2tvZmY6IHtcblx0XHRcdFx0XHR0eXBlOiBcImV4cG9uZW50aWFsXCIsXG5cdFx0XHRcdFx0ZGVsYXk6IDEwMDAsXG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIGpvYi5pZDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gYWRkIGpvYjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgc3RvcFByb2Nlc3NpbmcocXVldWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHdvcmtlciA9IHRoaXMud29ya2Vycy5nZXQocXVldWUpO1xuXHRcdGlmICh3b3JrZXIpIHtcblx0XHRcdGF3YWl0ICh3b3JrZXIgYXMgeyBjbG9zZTogKCkgPT4gUHJvbWlzZTx2b2lkPiB9KS5jbG9zZSgpO1xuXHRcdFx0dGhpcy53b3JrZXJzLmRlbGV0ZShxdWV1ZSk7XG5cdFx0XHRjb25zb2xlLmxvZyhgW0J1bGxNUUFkYXB0ZXJdIFN0b3BwZWQgcHJvY2Vzc2luZyBxdWV1ZTogJHtxdWV1ZX1gKTtcblx0XHR9XG5cdH1cblxuXHRpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG5cdH1cblxuXHRhc3luYyBoZWFsdGhDaGVjaygpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkIHx8ICF0aGlzLmNvbm5lY3Rpb24pIHJldHVybiBmYWxzZTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgKHRoaXMuY29ubmVjdGlvbiBhcyB7IHBpbmc6ICgpID0+IFByb21pc2U8c3RyaW5nPiB9KS5waW5nKCk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBnZXRRdWV1ZVN0YXRzKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPFdvcmtlclF1ZXVlU3RhdHM+IHtcblx0XHRpZiAoIXRoaXMucXVldWVzLmhhcyhxdWV1ZSkpIHtcblx0XHRcdHJldHVybiB7IHdhaXRpbmc6IDAsIGFjdGl2ZTogMCwgY29tcGxldGVkOiAwLCBmYWlsZWQ6IDAsIGRlbGF5ZWQ6IDAgfTtcblx0XHR9XG5cblx0XHRjb25zdCBxID0gdGhpcy5xdWV1ZXMuZ2V0KHF1ZXVlKSBhcyB7XG5cdFx0XHRnZXRXYWl0aW5nQ291bnQ6ICgpID0+IFByb21pc2U8bnVtYmVyPjtcblx0XHRcdGdldEFjdGl2ZUNvdW50OiAoKSA9PiBQcm9taXNlPG51bWJlcj47XG5cdFx0XHRnZXRDb21wbGV0ZWRDb3VudDogKCkgPT4gUHJvbWlzZTxudW1iZXI+O1xuXHRcdFx0Z2V0RmFpbGVkQ291bnQ6ICgpID0+IFByb21pc2U8bnVtYmVyPjtcblx0XHRcdGdldERlbGF5ZWRDb3VudDogKCkgPT4gUHJvbWlzZTxudW1iZXI+O1xuXHRcdH07XG5cblx0XHRjb25zdCBbd2FpdGluZywgYWN0aXZlLCBjb21wbGV0ZWQsIGZhaWxlZCwgZGVsYXllZF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG5cdFx0XHRxLmdldFdhaXRpbmdDb3VudCgpLFxuXHRcdFx0cS5nZXRBY3RpdmVDb3VudCgpLFxuXHRcdFx0cS5nZXRDb21wbGV0ZWRDb3VudCgpLFxuXHRcdFx0cS5nZXRGYWlsZWRDb3VudCgpLFxuXHRcdFx0cS5nZXREZWxheWVkQ291bnQoKSxcblx0XHRdKTtcblxuXHRcdHJldHVybiB7IHdhaXRpbmcsIGFjdGl2ZSwgY29tcGxldGVkLCBmYWlsZWQsIGRlbGF5ZWQgfTtcblx0fVxufVxuIl19
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* const adapter = new InMemoryAdapter();
|
|
17
17
|
* ```
|
|
18
18
|
*/
|
|
19
|
-
import type { WorkerTriggerOpts } from "@
|
|
19
|
+
import type { WorkerTriggerOpts } from "@blokjs/helper";
|
|
20
20
|
import type { WorkerAdapter, WorkerJob, WorkerQueueStats } from "../WorkerTrigger";
|
|
21
21
|
/**
|
|
22
22
|
* InMemoryAdapter - Simple in-process worker queue
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* InMemoryAdapter - Worker adapter using in-process queues
|
|
4
3
|
*
|
|
@@ -17,13 +16,11 @@
|
|
|
17
16
|
* const adapter = new InMemoryAdapter();
|
|
18
17
|
* ```
|
|
19
18
|
*/
|
|
20
|
-
|
|
21
|
-
exports.InMemoryAdapter = void 0;
|
|
22
|
-
const uuid_1 = require("uuid");
|
|
19
|
+
import { v4 as uuid } from "uuid";
|
|
23
20
|
/**
|
|
24
21
|
* InMemoryAdapter - Simple in-process worker queue
|
|
25
22
|
*/
|
|
26
|
-
class InMemoryAdapter {
|
|
23
|
+
export class InMemoryAdapter {
|
|
27
24
|
provider = "in-memory";
|
|
28
25
|
connected = false;
|
|
29
26
|
jobs = new Map();
|
|
@@ -73,14 +70,20 @@ class InMemoryAdapter {
|
|
|
73
70
|
if (!this.connected) {
|
|
74
71
|
throw new Error("Not connected. Call connect() first.");
|
|
75
72
|
}
|
|
76
|
-
|
|
77
|
-
|
|
73
|
+
// Get-or-init the per-queue job list. Same pattern as `stats`
|
|
74
|
+
// below — the previous code used `set-if-absent` then `.get()!`,
|
|
75
|
+
// but that non-null assertion is what biome flags. Pulling the
|
|
76
|
+
// reference once and seeding when missing keeps the type exact.
|
|
77
|
+
let jobs = this.jobs.get(queue);
|
|
78
|
+
if (!jobs) {
|
|
79
|
+
jobs = [];
|
|
80
|
+
this.jobs.set(queue, jobs);
|
|
78
81
|
}
|
|
79
82
|
if (!this.stats.has(queue)) {
|
|
80
83
|
this.stats.set(queue, { completed: 0, failed: 0 });
|
|
81
84
|
}
|
|
82
85
|
const job = {
|
|
83
|
-
id: opts?.jobId || (
|
|
86
|
+
id: opts?.jobId || uuid(),
|
|
84
87
|
data,
|
|
85
88
|
queue,
|
|
86
89
|
priority: opts?.priority ?? 0,
|
|
@@ -94,7 +97,6 @@ class InMemoryAdapter {
|
|
|
94
97
|
if (job.status === "delayed") {
|
|
95
98
|
job.scheduledAt = new Date(Date.now() + job.delay);
|
|
96
99
|
}
|
|
97
|
-
const jobs = this.jobs.get(queue);
|
|
98
100
|
// Insert sorted by priority (higher first)
|
|
99
101
|
const insertIdx = jobs.findIndex((j) => j.status === "waiting" && j.priority < job.priority);
|
|
100
102
|
if (insertIdx >= 0) {
|
|
@@ -185,7 +187,7 @@ class InMemoryAdapter {
|
|
|
185
187
|
internalJob.error = error;
|
|
186
188
|
if (requeue && internalJob.attempts < internalJob.maxRetries) {
|
|
187
189
|
// Requeue with backoff
|
|
188
|
-
const backoff = Math.min(1000 *
|
|
190
|
+
const backoff = Math.min(1000 * 2 ** internalJob.attempts, 30000);
|
|
189
191
|
internalJob.status = "delayed";
|
|
190
192
|
internalJob.scheduledAt = new Date(Date.now() + backoff);
|
|
191
193
|
}
|
|
@@ -220,5 +222,4 @@ class InMemoryAdapter {
|
|
|
220
222
|
}
|
|
221
223
|
}
|
|
222
224
|
}
|
|
223
|
-
exports.InMemoryAdapter = InMemoryAdapter;
|
|
224
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5NZW1vcnlBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXJzL0luTWVtb3J5QWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHOzs7QUFHSCwrQkFBa0M7QUFnQ2xDOztHQUVHO0FBQ0gsTUFBYSxlQUFlO0lBQ2xCLFFBQVEsR0FBRyxXQUFvQixDQUFDO0lBQ2pDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIsSUFBSSxHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQzdDLFVBQVUsR0FBZ0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNwRCxLQUFLLEdBQXVELElBQUksR0FBRyxFQUFFLENBQUM7SUFFOUUsS0FBSyxDQUFDLE9BQU87UUFDWixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDZixzQkFBc0I7UUFDdEIsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsRCxTQUFTLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUMxQixJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDckIsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxDQUFDO1FBQ0YsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQXlCLEVBQUUsT0FBMEM7UUFDbEYsSUFBSSxDQUFDLElB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NE5DIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbk1lbW9yeUFkYXB0ZXIgLSBXb3JrZXIgYWRhcHRlciB1c2luZyBpbi1wcm9jZXNzIHF1ZXVlc1xuICpcbiAqIElkZWFsIGZvcjpcbiAqIC0gRGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmdcbiAqIC0gU2ltcGxlIGJhY2tncm91bmQgam9iIHByb2Nlc3NpbmdcbiAqIC0gU2luZ2xlLWluc3RhbmNlIGRlcGxveW1lbnRzXG4gKlxuICogTGltaXRhdGlvbnM6XG4gKiAtIEpvYnMgYXJlIGxvc3Qgb24gcHJvY2VzcyByZXN0YXJ0XG4gKiAtIE5vIGRpc3RyaWJ1dGVkIHByb2Nlc3NpbmdcbiAqIC0gTm8gcGVyc2lzdGVuY2VcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYWRhcHRlciA9IG5ldyBJbk1lbW9yeUFkYXB0ZXIoKTtcbiAqIGBgYFxuICovXG5cbmltcG9ydCB0eXBlIHsgV29ya2VyVHJpZ2dlck9wdHMgfSBmcm9tIFwiQGJsb2svaGVscGVyXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB0eXBlIHsgV29ya2VyQWRhcHRlciwgV29ya2VySm9iLCBXb3JrZXJRdWV1ZVN0YXRzIH0gZnJvbSBcIi4uL1dvcmtlclRyaWdnZXJcIjtcblxuLyoqXG4gKiBJbnRlcm5hbCBqb2IgcmVwcmVzZW50YXRpb25cbiAqL1xuaW50ZXJmYWNlIEludGVybmFsSm9iIHtcblx0aWQ6IHN0cmluZztcblx0ZGF0YTogdW5rbm93bjtcblx0cXVldWU6IHN0cmluZztcblx0cHJpb3JpdHk6IG51bWJlcjtcblx0YXR0ZW1wdHM6IG51bWJlcjtcblx0bWF4UmV0cmllczogbnVtYmVyO1xuXHRjcmVhdGVkQXQ6IERhdGU7XG5cdGRlbGF5OiBudW1iZXI7XG5cdHRpbWVvdXQ6IG51bWJlcjtcblx0c3RhdHVzOiBcIndhaXRpbmdcIiB8IFwiYWN0aXZlXCIgfCBcImNvbXBsZXRlZFwiIHwgXCJmYWlsZWRcIiB8IFwiZGVsYXllZFwiO1xuXHRzY2hlZHVsZWRBdD86IERhdGU7XG5cdGVycm9yPzogRXJyb3I7XG59XG5cbi8qKlxuICogUXVldWUgcHJvY2Vzc29yIGVudHJ5XG4gKi9cbmludGVyZmFjZSBRdWV1ZVByb2Nlc3NvciB7XG5cdGNvbmZpZzogV29ya2VyVHJpZ2dlck9wdHM7XG5cdGhhbmRsZXI6IChqb2I6IFdvcmtlckpvYikgPT4gUHJvbWlzZTx2b2lkPjtcblx0YWN0aXZlOiBudW1iZXI7XG5cdHJ1bm5pbmc6IGJvb2xlYW47XG5cdHRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xufVxuXG4vKipcbiAqIEluTWVtb3J5QWRhcHRlciAtIFNpbXBsZSBpbi1wcm9jZXNzIHdvcmtlciBxdWV1ZVxuICovXG5leHBvcnQgY2xhc3MgSW5NZW1vcnlBZGFwdGVyIGltcGxlbWVudHMgV29ya2VyQWRhcHRlciB7XG5cdHJlYWRvbmx5IHByb3ZpZGVyID0gXCJpbi1tZW1vcnlcIiBhcyBjb25zdDtcblx0cHJpdmF0ZSBjb25uZWN0ZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBqb2JzOiBNYXA8c3RyaW5nLCBJbnRlcm5hbEpvYltdPiA9IG5ldyBNYXAoKTtcblx0cHJpdmF0ZSBwcm9jZXNzb3JzOiBNYXA8c3RyaW5nLCBRdWV1ZVByb2Nlc3Nvcj4gPSBuZXcgTWFwKCk7XG5cdHByaXZhdGUgc3RhdHM6IE1hcDxzdHJpbmcsIHsgY29tcGxldGVkOiBudW1iZXI7IGZhaWxlZDogbnVtYmVyIH0+ID0gbmV3IE1hcCgpO1xuXG5cdGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuXHR9XG5cblx0YXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyBTdG9wIGFsbCBwcm9jZXNzb3JzXG5cdFx0Zm9yIChjb25zdCBbcXVldWUsIHByb2Nlc3Nvcl0gb2YgdGhpcy5wcm9jZXNzb3JzKSB7XG5cdFx0XHRwcm9jZXNzb3IucnVubmluZyA9IGZhbHNlO1xuXHRcdFx0aWYgKHByb2Nlc3Nvci50aW1lcikge1xuXHRcdFx0XHRjbGVhckludGVydmFsKHByb2Nlc3Nvci50aW1lcik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMucHJvY2Vzc29ycy5jbGVhcigpO1xuXHRcdHRoaXMuam9icy5jbGVhcigpO1xuXHRcdHRoaXMuc3RhdHMuY2xlYXIoKTtcblx0XHR0aGlzLmNvbm5lY3RlZCA9IGZhbHNlO1xuXHR9XG5cblx0YXN5bmMgcHJvY2Vzcyhjb25maWc6IFdvcmtlclRyaWdnZXJPcHRzLCBoYW5kbGVyOiAoam9iOiBXb3JrZXJKb2IpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJOb3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmpvYnMuaGFzKGNvbmZpZy5xdWV1ZSkpIHtcblx0XHRcdHRoaXMuam9icy5zZXQoY29uZmlnLnF1ZXVlLCBbXSk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5zdGF0cy5oYXMoY29uZmlnLnF1ZXVlKSkge1xuXHRcdFx0dGhpcy5zdGF0cy5zZXQoY29uZmlnLnF1ZXVlLCB7IGNvbXBsZXRlZDogMCwgZmFpbGVkOiAwIH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IHByb2Nlc3NvcjogUXVldWVQcm9jZXNzb3IgPSB7XG5cdFx0XHRjb25maWcsXG5cdFx0XHRoYW5kbGVyLFxuXHRcdFx0YWN0aXZlOiAwLFxuXHRcdFx0cnVubmluZzogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0dGhpcy5wcm9jZXNzb3JzLnNldChjb25maWcucXVldWUsIHByb2Nlc3Nvcik7XG5cblx0XHQvLyBTdGFydCBwb2xsaW5nIGZvciBqb2JzXG5cdFx0cHJvY2Vzc29yLnRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuXHRcdFx0dGhpcy5wcm9jZXNzTmV4dChjb25maWcucXVldWUpLmNhdGNoKChlcnIpID0+IHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcihgW0luTWVtb3J5QWRhcHRlcl0gRXJyb3IgcHJvY2Vzc2luZyAke2NvbmZpZy5xdWV1ZX06ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblx0XHRcdH0pO1xuXHRcdH0sIDUwKTsgLy8gUG9sbCBldmVyeSA1MG1zXG5cdH1cblxuXHRhc3luYyBhZGRKb2IoXG5cdFx0cXVldWU6IHN0cmluZyxcblx0XHRkYXRhOiB1bmtub3duLFxuXHRcdG9wdHM/OiB7XG5cdFx0XHRwcmlvcml0eT86IG51bWJlcjtcblx0XHRcdGRlbGF5PzogbnVtYmVyO1xuXHRcdFx0cmV0cmllcz86IG51bWJlcjtcblx0XHRcdHRpbWVvdXQ/OiBudW1iZXI7XG5cdFx0XHRqb2JJZD86IHN0cmluZztcblx0XHR9LFxuXHQpOiBQcm9taXNlPHN0cmluZz4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vdCBjb25uZWN0ZWQuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuam9icy5oYXMocXVldWUpKSB7XG5cdFx0XHR0aGlzLmpvYnMuc2V0KHF1ZXVlLCBbXSk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5zdGF0cy5oYXMocXVldWUpKSB7XG5cdFx0XHR0aGlzLnN0YXRzLnNldChxdWV1ZSwgeyBjb21wbGV0ZWQ6IDAsIGZhaWxlZDogMCB9KTtcblx0XHR9XG5cblx0XHRjb25zdCBqb2I6IEludGVybmFsSm9iID0ge1xuXHRcdFx0aWQ6IG9wdHM/LmpvYklkIHx8IHV1aWQoKSxcblx0XHRcdGRhdGEsXG5cdFx0XHRxdWV1ZSxcblx0XHRcdHByaW9yaXR5OiBvcHRzPy5wcmlvcml0eSA/PyAwLFxuXHRcdFx0YXR0ZW1wdHM6IDAsXG5cdFx0XHRtYXhSZXRyaWVzOiBvcHRzPy5yZXRyaWVzID8/IDMsXG5cdFx0XHRjcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG5cdFx0XHRkZWxheTogb3B0cz8uZGVsYXkgPz8gMCxcblx0XHRcdHRpbWVvdXQ6IG9wdHM/LnRpbWVvdXQgPz8gMCxcblx0XHRcdHN0YXR1czogb3B0cz8uZGVsYXkgJiYgb3B0cy5kZWxheSA+IDAgPyBcImRlbGF5ZWRcIiA6IFwid2FpdGluZ1wiLFxuXHRcdH07XG5cblx0XHRpZiAoam9iLnN0YXR1cyA9PT0gXCJkZWxheWVkXCIpIHtcblx0XHRcdGpvYi5zY2hlZHVsZWRBdCA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBqb2IuZGVsYXkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGpvYnMgPSB0aGlzLmpvYnMuZ2V0KHF1ZXVlKSE7XG5cblx0XHQvLyBJbnNlcnQgc29ydGVkIGJ5IHByaW9yaXR5IChoaWdoZXIgZmlyc3QpXG5cdFx0Y29uc3QgaW5zZXJ0SWR4ID0gam9icy5maW5kSW5kZXgoKGopID0+IGouc3RhdHVzID09PSBcIndhaXRpbmdcIiAmJiBqLnByaW9yaXR5IDwgam9iLnByaW9yaXR5KTtcblx0XHRpZiAoaW5zZXJ0SWR4ID49IDApIHtcblx0XHRcdGpvYnMuc3BsaWNlKGluc2VydElkeCwgMCwgam9iKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0am9icy5wdXNoKGpvYik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpvYi5pZDtcblx0fVxuXG5cdGFzeW5jIHN0b3BQcm9jZXNzaW5nKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBwcm9jZXNzb3IgPSB0aGlzLnByb2Nlc3NvcnMuZ2V0KHF1ZXVlKTtcblx0XHRpZiAocHJvY2Vzc29yKSB7XG5cdFx0XHRwcm9jZXNzb3IucnVubmluZyA9IGZhbHNlO1xuXHRcdFx0aWYgKHByb2Nlc3Nvci50aW1lcikge1xuXHRcdFx0XHRjbGVhckludGVydmFsKHByb2Nlc3Nvci50aW1lcik7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnByb2Nlc3NvcnMuZGVsZXRlKHF1ZXVlKTtcblx0XHR9XG5cdH1cblxuXHRpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG5cdH1cblxuXHRhc3luYyBoZWFsdGhDaGVjaygpOiBQcm9taXNlPGJvb2xlYW4+IHtcblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG5cdH1cblxuXHRhc3luYyBnZXRRdWV1ZVN0YXRzKHF1ZXVlOiBzdHJpbmcpOiBQcm9taXNlPFdvcmtlclF1ZXVlU3RhdHM+IHtcblx0XHRjb25zdCBqb2JzID0gdGhpcy5qb2JzLmdldChxdWV1ZSkgfHwgW107XG5cdFx0Y29uc3QgcXVldWVTdGF0cyA9IHRoaXMuc3RhdHMuZ2V0KHF1ZXVlKSB8fCB7IGNvbXBsZXRlZDogMCwgZmFpbGVkOiAwIH07XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0d2FpdGluZzogam9icy5maWx0ZXIoKGopID0+IGouc3RhdHVzID09PSBcIndhaXRpbmdcIikubGVuZ3RoLFxuXHRcdFx0YWN0aXZlOiBqb2JzLmZpbHRlcigoaikgPT4gai5zdGF0dXMgPT09IFwiYWN0aXZlXCIpLmxlbmd0aCxcblx0XHRcdGNvbXBsZXRlZDogcXVldWVTdGF0cy5jb21wbGV0ZWQsXG5cdFx0XHRmYWlsZWQ6IHF1ZXVlU3RhdHMuZmFpbGVkLFxuXHRcdFx0ZGVsYXllZDogam9icy5maWx0ZXIoKGopID0+IGouc3RhdHVzID09PSBcImRlbGF5ZWRcIikubGVuZ3RoLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2VzcyB0aGUgbmV4dCBhdmFpbGFibGUgam9iIGZyb20gYSBxdWV1ZVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBwcm9jZXNzTmV4dChxdWV1ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcHJvY2Vzc29yID0gdGhpcy5wcm9jZXNzb3JzLmdldChxdWV1ZSk7XG5cdFx0aWYgKCFwcm9jZXNzb3IgfHwgIXByb2Nlc3Nvci5ydW5uaW5nKSByZXR1cm47XG5cblx0XHRjb25zdCBjb25jdXJyZW5jeSA9IHByb2Nlc3Nvci5jb25maWcuY29uY3VycmVuY3kgPz8gMTtcblx0XHRpZiAocHJvY2Vzc29yLmFjdGl2ZSA+PSBjb25jdXJyZW5jeSkgcmV0dXJuO1xuXG5cdFx0Y29uc3Qgam9icyA9IHRoaXMuam9icy5nZXQocXVldWUpO1xuXHRcdGlmICgham9icyB8fCBqb2JzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGRlbGF5ZWQgam9icyB0aGF0IGFyZSByZWFkeVxuXHRcdGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cdFx0Zm9yIChjb25zdCBqb2Igb2Ygam9icykge1xuXHRcdFx0aWYgKGpvYi5zdGF0dXMgPT09IFwiZGVsYXllZFwiICYmIGpvYi5zY2hlZHVsZWRBdCAmJiBqb2Iuc2NoZWR1bGVkQXQuZ2V0VGltZSgpIDw9IG5vdykge1xuXHRcdFx0XHRqb2Iuc3RhdHVzID0gXCJ3YWl0aW5nXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmluZCBuZXh0IHdhaXRpbmcgam9iXG5cdFx0Y29uc3Qgam9iSWR4ID0gam9icy5maW5kSW5kZXgoKGopID0+IGouc3RhdHVzID09PSBcIndhaXRpbmdcIik7XG5cdFx0aWYgKGpvYklkeCA8IDApIHJldHVybjtcblxuXHRcdGNvbnN0IGludGVybmFsSm9iID0gam9ic1tqb2JJZHhdO1xuXHRcdGludGVybmFsSm9iLnN0YXR1cyA9IFwiYWN0aXZlXCI7XG5cdFx0cHJvY2Vzc29yLmFjdGl2ZSsrO1xuXG5cdFx0Y29uc3Qgd29ya2VySm9iOiBXb3JrZXJKb2IgPSB7XG5cdFx0XHRpZDogaW50ZXJuYWxKb2IuaWQsXG5cdFx0XHRkYXRhOiBpbnRlcm5hbEpvYi5kYXRhLFxuXHRcdFx0aGVhZGVyczoge30sXG5cdFx0XHRxdWV1ZTogaW50ZXJuYWxKb2IucXVldWUsXG5cdFx0XHRwcmlvcml0eTogaW50ZXJuYWxKb2IucHJpb3JpdHksXG5cdFx0XHRhdHRlbXB0czogaW50ZXJuYWxKb2IuYXR0ZW1wdHMsXG5cdFx0XHRtYXhSZXRyaWVzOiBpbnRlcm5hbEpvYi5tYXhSZXRyaWVzLFxuXHRcdFx0Y3JlYXRlZEF0OiBpbnRlcm5hbEpvYi5jcmVhdGVkQXQsXG5cdFx0XHRkZWxheTogaW50ZXJuYWxKb2IuZGVsYXksXG5cdFx0XHR0aW1lb3V0OiBpbnRlcm5hbEpvYi50aW1lb3V0LFxuXHRcdFx0cmF3OiBpbnRlcm5hbEpvYixcblx0XHRcdGNvbXBsZXRlOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdGludGVybmFsSm9iLnN0YXR1cyA9IFwiY29tcGxldGVkXCI7XG5cdFx0XHRcdGNvbnN0IGlkeCA9IGpvYnMuaW5kZXhPZihpbnRlcm5hbEpvYik7XG5cdFx0XHRcdGlmIChpZHggPj0gMCkgam9icy5zcGxpY2UoaWR4LCAxKTtcblx0XHRcdFx0Y29uc3QgcyA9IHRoaXMuc3RhdHMuZ2V0KHF1ZXVlKTtcblx0XHRcdFx0aWYgKHMpIHMuY29tcGxldGVkKys7XG5cdFx0XHR9LFxuXHRcdFx0ZmFpbDogYXN5bmMgKGVycm9yOiBFcnJvciwgcmVxdWV1ZT86IGJvb2xlYW4pID0+IHtcblx0XHRcdFx0aW50ZXJuYWxKb2IuYXR0ZW1wdHMrKztcblx0XHRcdFx0aW50ZXJuYWxKb2IuZXJyb3IgPSBlcnJvcjtcblxuXHRcdFx0XHRpZiAocmVxdWV1ZSAmJiBpbnRlcm5hbEpvYi5hdHRlbXB0cyA8IGludGVybmFsSm9iLm1heFJldHJpZXMpIHtcblx0XHRcdFx0XHQvLyBSZXF1ZXVlIHdpdGggYmFja29mZlxuXHRcdFx0XHRcdGNvbnN0IGJhY2tvZmYgPSBNYXRoLm1pbigxMDAwICogTWF0aC5wb3coMiwgaW50ZXJuYWxKb2IuYXR0ZW1wdHMpLCAzMDAwMCk7XG5cdFx0XHRcdFx0aW50ZXJuYWxKb2Iuc3RhdHVzID0gXCJkZWxheWVkXCI7XG5cdFx0XHRcdFx0aW50ZXJuYWxKb2Iuc2NoZWR1bGVkQXQgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgYmFja29mZik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aW50ZXJuYWxKb2Iuc3RhdHVzID0gXCJmYWlsZWRcIjtcblx0XHRcdFx0XHRjb25zdCBpZHggPSBqb2JzLmluZGV4T2YoaW50ZXJuYWxKb2IpO1xuXHRcdFx0XHRcdGlmIChpZHggPj0gMCkgam9icy5zcGxpY2UoaWR4LCAxKTtcblx0XHRcdFx0XHRjb25zdCBzID0gdGhpcy5zdGF0cy5nZXQocXVldWUpO1xuXHRcdFx0XHRcdGlmIChzKSBzLmZhaWxlZCsrO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgcHJvY2Vzc29yLmhhbmRsZXIod29ya2VySm9iKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdC8vIEhhbmRsZXIgdGhyZXcgLSB0cmVhdCBhcyBmYWlsdXJlXG5cdFx0XHRpZiAoaW50ZXJuYWxKb2Iuc3RhdHVzID09PSBcImFjdGl2ZVwiKSB7XG5cdFx0XHRcdGludGVybmFsSm9iLnN0YXR1cyA9IFwiZmFpbGVkXCI7XG5cdFx0XHRcdGNvbnN0IGlkeCA9IGpvYnMuaW5kZXhPZihpbnRlcm5hbEpvYik7XG5cdFx0XHRcdGlmIChpZHggPj0gMCkgam9icy5zcGxpY2UoaWR4LCAxKTtcblx0XHRcdFx0Y29uc3QgcyA9IHRoaXMuc3RhdHMuZ2V0KHF1ZXVlKTtcblx0XHRcdFx0aWYgKHMpIHMuZmFpbGVkKys7XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdHByb2Nlc3Nvci5hY3RpdmUtLTtcblx0XHR9XG5cdH1cbn1cbiJdfQ==
|
|
225
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5NZW1vcnlBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXJzL0luTWVtb3J5QWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFHSCxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWdDbEM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUNsQixRQUFRLEdBQUcsV0FBb0IsQ0FBQztJQUNqQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLElBQUksR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM3QyxVQUFVLEdBQWdDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDcEQsS0FBSyxHQUF1RCxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTlFLEtBQUssQ0FBQyxPQUFPO1FBQ1osSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVO1FBQ2Ysc0JBQXNCO1FBQ3RCLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEQsU0FBUyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3JCLGFBQWEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsQ0FBQztRQUNGLENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUF5QixFQUFFLE9BQTBDO1FBQ2xGLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBbUI7WUFDakMsTUFBTTtZQUNOLE9BQU87WUFDUCxNQUFNLEVBQUUsQ0FBQztZQUNULE9BQU8sRUFBRSxJQUFJO1NBQ2IsQ0FBQztRQUVGLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFN0MseUJBQXlCO1FBQ3pCLFNBQVMsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNsQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDNUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsTUFBTSxDQUFDLEtBQUssS0FBTSxHQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNoRyxDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGtCQUFrQjtJQUMzQixDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FDWCxLQUFhLEVBQ2IsSUFBYSxFQUNiLElBTUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBRUQsOERBQThEO1FBQzlELGlFQUFpRTtRQUNqRSwrREFBK0Q7UUFDL0QsZ0VBQWdFO1FBQ2hFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNYLElBQUksR0FBRyxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFnQjtZQUN4QixFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDekIsSUFBSTtZQUNKLEtBQUs7WUFDTCxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsSUFBSSxDQUFDO1lBQzdCLFFBQVEsRUFBRSxDQUFDO1lBQ1gsVUFBVSxFQUFFLElBQUksRUFBRSxPQUFPLElBQUksQ0FBQztZQUM5QixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDckIsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQztZQUN2QixPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sSUFBSSxDQUFDO1lBQzNCLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDN0QsQ0FBQztRQUVGLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM5QixHQUFHLENBQUMsV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUVELDJDQUEyQztRQUMzQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3RixJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEMsQ0FBQzthQUFNLENBQUM7WUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFhO1FBQ2pDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZixTQUFTLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUMxQixJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDckIsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNGLENBQUM7SUFFRCxXQUFXO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBYTtRQUNoQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUV4RSxPQUFPO1lBQ04sT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsTUFBTTtZQUMxRCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxNQUFNO1lBQ3hELFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztZQUMvQixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07WUFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsTUFBTTtTQUMxRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFhO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTztZQUFFLE9BQU87UUFFN0MsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO1FBQ3RELElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxXQUFXO1lBQUUsT0FBTztRQUU1QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFFdkMsd0NBQXdDO1FBQ3hDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNyRixHQUFHLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztZQUN4QixDQUFDO1FBQ0YsQ0FBQztRQUVELHdCQUF3QjtRQUN4QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQzdELElBQUksTUFBTSxHQUFHLENBQUM7WUFBRSxPQUFPO1FBRXZCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxXQUFXLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztRQUM5QixTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFbkIsTUFBTSxTQUFTLEdBQWM7WUFDNUIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO1lBQ2xCLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSTtZQUN0QixPQUFPLEVBQUUsRUFBRTtZQUNYLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSztZQUN4QixRQUFRLEVBQUUsV0FBVyxDQUFDLFFBQVE7WUFDOUIsUUFBUSxFQUFFLFdBQVcsQ0FBQyxRQUFRO1lBQzlCLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVTtZQUNsQyxTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVM7WUFDaEMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLO1lBQ3hCLE9BQU8sRUFBRSxXQUFXLENBQUMsT0FBTztZQUM1QixHQUFHLEVBQUUsV0FBVztZQUNoQixRQUFRLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLFdBQVcsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO2dCQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLEdBQUcsSUFBSSxDQUFDO29CQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDO29CQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0QixDQUFDO1lBQ0QsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFZLEVBQUUsT0FBaUIsRUFBRSxFQUFFO2dCQUMvQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3ZCLFdBQVcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUUxQixJQUFJLE9BQU8sSUFBSSxXQUFXLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDOUQsdUJBQXVCO29CQUN2QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksV0FBVyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDbEUsV0FBVyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7b0JBQy9CLFdBQVcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDO2dCQUMxRCxDQUFDO3FCQUFNLENBQUM7b0JBQ1AsV0FBVyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7b0JBQzlCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3RDLElBQUksR0FBRyxJQUFJLENBQUM7d0JBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2xDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUM7d0JBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuQixDQUFDO1lBQ0YsQ0FBQztTQUNELENBQUM7UUFFRixJQUFJLENBQUM7WUFDSixNQUFNLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNSLG1DQUFtQztZQUNuQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3JDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO2dCQUM5QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLEdBQUcsSUFBSSxDQUFDO29CQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDO29CQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixDQUFDO1FBQ0YsQ0FBQztnQkFBUyxDQUFDO1lBQ1YsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BCLENBQUM7SUFDRixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEluTWVtb3J5QWRhcHRlciAtIFdvcmtlciBhZGFwdGVyIHVzaW5nIGluLXByb2Nlc3MgcXVldWVzXG4gKlxuICogSWRlYWwgZm9yOlxuICogLSBEZXZlbG9wbWVudCBhbmQgdGVzdGluZ1xuICogLSBTaW1wbGUgYmFja2dyb3VuZCBqb2IgcHJvY2Vzc2luZ1xuICogLSBTaW5nbGUtaW5zdGFuY2UgZGVwbG95bWVudHNcbiAqXG4gKiBMaW1pdGF0aW9uczpcbiAqIC0gSm9icyBhcmUgbG9zdCBvbiBwcm9jZXNzIHJlc3RhcnRcbiAqIC0gTm8gZGlzdHJpYnV0ZWQgcHJvY2Vzc2luZ1xuICogLSBObyBwZXJzaXN0ZW5jZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IEluTWVtb3J5QWRhcHRlcigpO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBXb3JrZXJUcmlnZ2VyT3B0cyB9IGZyb20gXCJAYmxva2pzL2hlbHBlclwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtlckFkYXB0ZXIsIFdvcmtlckpvYiwgV29ya2VyUXVldWVTdGF0cyB9IGZyb20gXCIuLi9Xb3JrZXJUcmlnZ2VyXCI7XG5cbi8qKlxuICogSW50ZXJuYWwgam9iIHJlcHJlc2VudGF0aW9uXG4gKi9cbmludGVyZmFjZSBJbnRlcm5hbEpvYiB7XG5cdGlkOiBzdHJpbmc7XG5cdGRhdGE6IHVua25vd247XG5cdHF1ZXVlOiBzdHJpbmc7XG5cdHByaW9yaXR5OiBudW1iZXI7XG5cdGF0dGVtcHRzOiBudW1iZXI7XG5cdG1heFJldHJpZXM6IG51bWJlcjtcblx0Y3JlYXRlZEF0OiBEYXRlO1xuXHRkZWxheTogbnVtYmVyO1xuXHR0aW1lb3V0OiBudW1iZXI7XG5cdHN0YXR1czogXCJ3YWl0aW5nXCIgfCBcImFjdGl2ZVwiIHwgXCJjb21wbGV0ZWRcIiB8IFwiZmFpbGVkXCIgfCBcImRlbGF5ZWRcIjtcblx0c2NoZWR1bGVkQXQ/OiBEYXRlO1xuXHRlcnJvcj86IEVycm9yO1xufVxuXG4vKipcbiAqIFF1ZXVlIHByb2Nlc3NvciBlbnRyeVxuICovXG5pbnRlcmZhY2UgUXVldWVQcm9jZXNzb3Ige1xuXHRjb25maWc6IFdvcmtlclRyaWdnZXJPcHRzO1xuXHRoYW5kbGVyOiAoam9iOiBXb3JrZXJKb2IpID0+IFByb21pc2U8dm9pZD47XG5cdGFjdGl2ZTogbnVtYmVyO1xuXHRydW5uaW5nOiBib29sZWFuO1xuXHR0aW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPjtcbn1cblxuLyoqXG4gKiBJbk1lbW9yeUFkYXB0ZXIgLSBTaW1wbGUgaW4tcHJvY2VzcyB3b3JrZXIgcXVldWVcbiAqL1xuZXhwb3J0IGNsYXNzIEluTWVtb3J5QWRhcHRlciBpbXBsZW1lbnRzIFdvcmtlckFkYXB0ZXIge1xuXHRyZWFkb25seSBwcm92aWRlciA9IFwiaW4tbWVtb3J5XCIgYXMgY29uc3Q7XG5cdHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG5cdHByaXZhdGUgam9iczogTWFwPHN0cmluZywgSW50ZXJuYWxKb2JbXT4gPSBuZXcgTWFwKCk7XG5cdHByaXZhdGUgcHJvY2Vzc29yczogTWFwPHN0cmluZywgUXVldWVQcm9jZXNzb3I+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIHN0YXRzOiBNYXA8c3RyaW5nLCB7IGNvbXBsZXRlZDogbnVtYmVyOyBmYWlsZWQ6IG51bWJlciB9PiA9IG5ldyBNYXAoKTtcblxuXHRhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcblx0fVxuXG5cdGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gU3RvcCBhbGwgcHJvY2Vzc29yc1xuXHRcdGZvciAoY29uc3QgW3F1ZXVlLCBwcm9jZXNzb3JdIG9mIHRoaXMucHJvY2Vzc29ycykge1xuXHRcdFx0cHJvY2Vzc29yLnJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdGlmIChwcm9jZXNzb3IudGltZXIpIHtcblx0XHRcdFx0Y2xlYXJJbnRlcnZhbChwcm9jZXNzb3IudGltZXIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLnByb2Nlc3NvcnMuY2xlYXIoKTtcblx0XHR0aGlzLmpvYnMuY2xlYXIoKTtcblx0XHR0aGlzLnN0YXRzLmNsZWFyKCk7XG5cdFx0dGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcblx0fVxuXG5cdGFzeW5jIHByb2Nlc3MoY29uZmlnOiBXb3JrZXJUcmlnZ2VyT3B0cywgaGFuZGxlcjogKGpvYjogV29ya2VySm9iKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm90IGNvbm5lY3RlZC4gQ2FsbCBjb25uZWN0KCkgZmlyc3QuXCIpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5qb2JzLmhhcyhjb25maWcucXVldWUpKSB7XG5cdFx0XHR0aGlzLmpvYnMuc2V0KGNvbmZpZy5xdWV1ZSwgW10pO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuc3RhdHMuaGFzKGNvbmZpZy5xdWV1ZSkpIHtcblx0XHRcdHRoaXMuc3RhdHMuc2V0KGNvbmZpZy5xdWV1ZSwgeyBjb21wbGV0ZWQ6IDAsIGZhaWxlZDogMCB9KTtcblx0XHR9XG5cblx0XHRjb25zdCBwcm9jZXNzb3I6IFF1ZXVlUHJvY2Vzc29yID0ge1xuXHRcdFx0Y29uZmlnLFxuXHRcdFx0aGFuZGxlcixcblx0XHRcdGFjdGl2ZTogMCxcblx0XHRcdHJ1bm5pbmc6IHRydWUsXG5cdFx0fTtcblxuXHRcdHRoaXMucHJvY2Vzc29ycy5zZXQoY29uZmlnLnF1ZXVlLCBwcm9jZXNzb3IpO1xuXG5cdFx0Ly8gU3RhcnQgcG9sbGluZyBmb3Igam9ic1xuXHRcdHByb2Nlc3Nvci50aW1lciA9IHNldEludGVydmFsKCgpID0+IHtcblx0XHRcdHRoaXMucHJvY2Vzc05leHQoY29uZmlnLnF1ZXVlKS5jYXRjaCgoZXJyKSA9PiB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoYFtJbk1lbW9yeUFkYXB0ZXJdIEVycm9yIHByb2Nlc3NpbmcgJHtjb25maWcucXVldWV9OiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0XHR9KTtcblx0XHR9LCA1MCk7IC8vIFBvbGwgZXZlcnkgNTBtc1xuXHR9XG5cblx0YXN5bmMgYWRkSm9iKFxuXHRcdHF1ZXVlOiBzdHJpbmcsXG5cdFx0ZGF0YTogdW5rbm93bixcblx0XHRvcHRzPzoge1xuXHRcdFx0cHJpb3JpdHk/OiBudW1iZXI7XG5cdFx0XHRkZWxheT86IG51bWJlcjtcblx0XHRcdHJldHJpZXM/OiBudW1iZXI7XG5cdFx0XHR0aW1lb3V0PzogbnVtYmVyO1xuXHRcdFx0am9iSWQ/OiBzdHJpbmc7XG5cdFx0fSxcblx0KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJOb3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0fVxuXG5cdFx0Ly8gR2V0LW9yLWluaXQgdGhlIHBlci1xdWV1ZSBqb2IgbGlzdC4gU2FtZSBwYXR0ZXJuIGFzIGBzdGF0c2Bcblx0XHQvLyBiZWxvdyDigJQgdGhlIHByZXZpb3VzIGNvZGUgdXNlZCBgc2V0LWlmLWFic2VudGAgdGhlbiBgLmdldCgpIWAsXG5cdFx0Ly8gYnV0IHRoYXQgbm9uLW51bGwgYXNzZXJ0aW9uIGlzIHdoYXQgYmlvbWUgZmxhZ3MuIFB1bGxpbmcgdGhlXG5cdFx0Ly8gcmVmZXJlbmNlIG9uY2UgYW5kIHNlZWRpbmcgd2hlbiBtaXNzaW5nIGtlZXBzIHRoZSB0eXBlIGV4YWN0LlxuXHRcdGxldCBqb2JzID0gdGhpcy5qb2JzLmdldChxdWV1ZSk7XG5cdFx0aWYgKCFqb2JzKSB7XG5cdFx0XHRqb2JzID0gW107XG5cdFx0XHR0aGlzLmpvYnMuc2V0KHF1ZXVlLCBqb2JzKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLnN0YXRzLmhhcyhxdWV1ZSkpIHtcblx0XHRcdHRoaXMuc3RhdHMuc2V0KHF1ZXVlLCB7IGNvbXBsZXRlZDogMCwgZmFpbGVkOiAwIH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IGpvYjogSW50ZXJuYWxKb2IgPSB7XG5cdFx0XHRpZDogb3B0cz8uam9iSWQgfHwgdXVpZCgpLFxuXHRcdFx0ZGF0YSxcblx0XHRcdHF1ZXVlLFxuXHRcdFx0cHJpb3JpdHk6IG9wdHM/LnByaW9yaXR5ID8/IDAsXG5cdFx0XHRhdHRlbXB0czogMCxcblx0XHRcdG1heFJldHJpZXM6IG9wdHM/LnJldHJpZXMgPz8gMyxcblx0XHRcdGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcblx0XHRcdGRlbGF5OiBvcHRzPy5kZWxheSA/PyAwLFxuXHRcdFx0dGltZW91dDogb3B0cz8udGltZW91dCA/PyAwLFxuXHRcdFx0c3RhdHVzOiBvcHRzPy5kZWxheSAmJiBvcHRzLmRlbGF5ID4gMCA/IFwiZGVsYXllZFwiIDogXCJ3YWl0aW5nXCIsXG5cdFx0fTtcblxuXHRcdGlmIChqb2Iuc3RhdHVzID09PSBcImRlbGF5ZWRcIikge1xuXHRcdFx0am9iLnNjaGVkdWxlZEF0ID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIGpvYi5kZWxheSk7XG5cdFx0fVxuXG5cdFx0Ly8gSW5zZXJ0IHNvcnRlZCBieSBwcmlvcml0eSAoaGlnaGVyIGZpcnN0KVxuXHRcdGNvbnN0IGluc2VydElkeCA9IGpvYnMuZmluZEluZGV4KChqKSA9PiBqLnN0YXR1cyA9PT0gXCJ3YWl0aW5nXCIgJiYgai5wcmlvcml0eSA8IGpvYi5wcmlvcml0eSk7XG5cdFx0aWYgKGluc2VydElkeCA+PSAwKSB7XG5cdFx0XHRqb2JzLnNwbGljZShpbnNlcnRJZHgsIDAsIGpvYik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGpvYnMucHVzaChqb2IpO1xuXHRcdH1cblxuXHRcdHJldHVybiBqb2IuaWQ7XG5cdH1cblxuXHRhc3luYyBzdG9wUHJvY2Vzc2luZyhxdWV1ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcHJvY2Vzc29yID0gdGhpcy5wcm9jZXNzb3JzLmdldChxdWV1ZSk7XG5cdFx0aWYgKHByb2Nlc3Nvcikge1xuXHRcdFx0cHJvY2Vzc29yLnJ1bm5pbmcgPSBmYWxzZTtcblx0XHRcdGlmIChwcm9jZXNzb3IudGltZXIpIHtcblx0XHRcdFx0Y2xlYXJJbnRlcnZhbChwcm9jZXNzb3IudGltZXIpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5wcm9jZXNzb3JzLmRlbGV0ZShxdWV1ZSk7XG5cdFx0fVxuXHR9XG5cblx0aXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuXHR9XG5cblx0YXN5bmMgaGVhbHRoQ2hlY2soKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuXHR9XG5cblx0YXN5bmMgZ2V0UXVldWVTdGF0cyhxdWV1ZTogc3RyaW5nKTogUHJvbWlzZTxXb3JrZXJRdWV1ZVN0YXRzPiB7XG5cdFx0Y29uc3Qgam9icyA9IHRoaXMuam9icy5nZXQocXVldWUpIHx8IFtdO1xuXHRcdGNvbnN0IHF1ZXVlU3RhdHMgPSB0aGlzLnN0YXRzLmdldChxdWV1ZSkgfHwgeyBjb21wbGV0ZWQ6IDAsIGZhaWxlZDogMCB9O1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHdhaXRpbmc6IGpvYnMuZmlsdGVyKChqKSA9PiBqLnN0YXR1cyA9PT0gXCJ3YWl0aW5nXCIpLmxlbmd0aCxcblx0XHRcdGFjdGl2ZTogam9icy5maWx0ZXIoKGopID0+IGouc3RhdHVzID09PSBcImFjdGl2ZVwiKS5sZW5ndGgsXG5cdFx0XHRjb21wbGV0ZWQ6IHF1ZXVlU3RhdHMuY29tcGxldGVkLFxuXHRcdFx0ZmFpbGVkOiBxdWV1ZVN0YXRzLmZhaWxlZCxcblx0XHRcdGRlbGF5ZWQ6IGpvYnMuZmlsdGVyKChqKSA9PiBqLnN0YXR1cyA9PT0gXCJkZWxheWVkXCIpLmxlbmd0aCxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb2Nlc3MgdGhlIG5leHQgYXZhaWxhYmxlIGpvYiBmcm9tIGEgcXVldWVcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgcHJvY2Vzc05leHQocXVldWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHByb2Nlc3NvciA9IHRoaXMucHJvY2Vzc29ycy5nZXQocXVldWUpO1xuXHRcdGlmICghcHJvY2Vzc29yIHx8ICFwcm9jZXNzb3IucnVubmluZykgcmV0dXJuO1xuXG5cdFx0Y29uc3QgY29uY3VycmVuY3kgPSBwcm9jZXNzb3IuY29uZmlnLmNvbmN1cnJlbmN5ID8/IDE7XG5cdFx0aWYgKHByb2Nlc3Nvci5hY3RpdmUgPj0gY29uY3VycmVuY3kpIHJldHVybjtcblxuXHRcdGNvbnN0IGpvYnMgPSB0aGlzLmpvYnMuZ2V0KHF1ZXVlKTtcblx0XHRpZiAoIWpvYnMgfHwgam9icy5sZW5ndGggPT09IDApIHJldHVybjtcblxuXHRcdC8vIENoZWNrIGZvciBkZWxheWVkIGpvYnMgdGhhdCBhcmUgcmVhZHlcblx0XHRjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXHRcdGZvciAoY29uc3Qgam9iIG9mIGpvYnMpIHtcblx0XHRcdGlmIChqb2Iuc3RhdHVzID09PSBcImRlbGF5ZWRcIiAmJiBqb2Iuc2NoZWR1bGVkQXQgJiYgam9iLnNjaGVkdWxlZEF0LmdldFRpbWUoKSA8PSBub3cpIHtcblx0XHRcdFx0am9iLnN0YXR1cyA9IFwid2FpdGluZ1wiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpbmQgbmV4dCB3YWl0aW5nIGpvYlxuXHRcdGNvbnN0IGpvYklkeCA9IGpvYnMuZmluZEluZGV4KChqKSA9PiBqLnN0YXR1cyA9PT0gXCJ3YWl0aW5nXCIpO1xuXHRcdGlmIChqb2JJZHggPCAwKSByZXR1cm47XG5cblx0XHRjb25zdCBpbnRlcm5hbEpvYiA9IGpvYnNbam9iSWR4XTtcblx0XHRpbnRlcm5hbEpvYi5zdGF0dXMgPSBcImFjdGl2ZVwiO1xuXHRcdHByb2Nlc3Nvci5hY3RpdmUrKztcblxuXHRcdGNvbnN0IHdvcmtlckpvYjogV29ya2VySm9iID0ge1xuXHRcdFx0aWQ6IGludGVybmFsSm9iLmlkLFxuXHRcdFx0ZGF0YTogaW50ZXJuYWxKb2IuZGF0YSxcblx0XHRcdGhlYWRlcnM6IHt9LFxuXHRcdFx0cXVldWU6IGludGVybmFsSm9iLnF1ZXVlLFxuXHRcdFx0cHJpb3JpdHk6IGludGVybmFsSm9iLnByaW9yaXR5LFxuXHRcdFx0YXR0ZW1wdHM6IGludGVybmFsSm9iLmF0dGVtcHRzLFxuXHRcdFx0bWF4UmV0cmllczogaW50ZXJuYWxKb2IubWF4UmV0cmllcyxcblx0XHRcdGNyZWF0ZWRBdDogaW50ZXJuYWxKb2IuY3JlYXRlZEF0LFxuXHRcdFx0ZGVsYXk6IGludGVybmFsSm9iLmRlbGF5LFxuXHRcdFx0dGltZW91dDogaW50ZXJuYWxKb2IudGltZW91dCxcblx0XHRcdHJhdzogaW50ZXJuYWxKb2IsXG5cdFx0XHRjb21wbGV0ZTogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRpbnRlcm5hbEpvYi5zdGF0dXMgPSBcImNvbXBsZXRlZFwiO1xuXHRcdFx0XHRjb25zdCBpZHggPSBqb2JzLmluZGV4T2YoaW50ZXJuYWxKb2IpO1xuXHRcdFx0XHRpZiAoaWR4ID49IDApIGpvYnMuc3BsaWNlKGlkeCwgMSk7XG5cdFx0XHRcdGNvbnN0IHMgPSB0aGlzLnN0YXRzLmdldChxdWV1ZSk7XG5cdFx0XHRcdGlmIChzKSBzLmNvbXBsZXRlZCsrO1xuXHRcdFx0fSxcblx0XHRcdGZhaWw6IGFzeW5jIChlcnJvcjogRXJyb3IsIHJlcXVldWU/OiBib29sZWFuKSA9PiB7XG5cdFx0XHRcdGludGVybmFsSm9iLmF0dGVtcHRzKys7XG5cdFx0XHRcdGludGVybmFsSm9iLmVycm9yID0gZXJyb3I7XG5cblx0XHRcdFx0aWYgKHJlcXVldWUgJiYgaW50ZXJuYWxKb2IuYXR0ZW1wdHMgPCBpbnRlcm5hbEpvYi5tYXhSZXRyaWVzKSB7XG5cdFx0XHRcdFx0Ly8gUmVxdWV1ZSB3aXRoIGJhY2tvZmZcblx0XHRcdFx0XHRjb25zdCBiYWNrb2ZmID0gTWF0aC5taW4oMTAwMCAqIDIgKiogaW50ZXJuYWxKb2IuYXR0ZW1wdHMsIDMwMDAwKTtcblx0XHRcdFx0XHRpbnRlcm5hbEpvYi5zdGF0dXMgPSBcImRlbGF5ZWRcIjtcblx0XHRcdFx0XHRpbnRlcm5hbEpvYi5zY2hlZHVsZWRBdCA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBiYWNrb2ZmKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpbnRlcm5hbEpvYi5zdGF0dXMgPSBcImZhaWxlZFwiO1xuXHRcdFx0XHRcdGNvbnN0IGlkeCA9IGpvYnMuaW5kZXhPZihpbnRlcm5hbEpvYik7XG5cdFx0XHRcdFx0aWYgKGlkeCA+PSAwKSBqb2JzLnNwbGljZShpZHgsIDEpO1xuXHRcdFx0XHRcdGNvbnN0IHMgPSB0aGlzLnN0YXRzLmdldChxdWV1ZSk7XG5cdFx0XHRcdFx0aWYgKHMpIHMuZmFpbGVkKys7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCBwcm9jZXNzb3IuaGFuZGxlcih3b3JrZXJKb2IpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0Ly8gSGFuZGxlciB0aHJldyAtIHRyZWF0IGFzIGZhaWx1cmVcblx0XHRcdGlmIChpbnRlcm5hbEpvYi5zdGF0dXMgPT09IFwiYWN0aXZlXCIpIHtcblx0XHRcdFx0aW50ZXJuYWxKb2Iuc3RhdHVzID0gXCJmYWlsZWRcIjtcblx0XHRcdFx0Y29uc3QgaWR4ID0gam9icy5pbmRleE9mKGludGVybmFsSm9iKTtcblx0XHRcdFx0aWYgKGlkeCA+PSAwKSBqb2JzLnNwbGljZShpZHgsIDEpO1xuXHRcdFx0XHRjb25zdCBzID0gdGhpcy5zdGF0cy5nZXQocXVldWUpO1xuXHRcdFx0XHRpZiAocykgcy5mYWlsZWQrKztcblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0cHJvY2Vzc29yLmFjdGl2ZS0tO1xuXHRcdH1cblx0fVxufVxuIl19
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KafkaAdapter — v0.7 PR 5 — Worker adapter backed by Apache Kafka via
|
|
3
|
+
* `kafkajs`. Consumes from a topic (the `queue` field) with a
|
|
4
|
+
* consumer-group identifier; produces via the same client.
|
|
5
|
+
*
|
|
6
|
+
* Kafka is fundamentally a streaming platform — not a queue — so a
|
|
7
|
+
* few semantics differ from BullMQ/SQS/RabbitMQ:
|
|
8
|
+
*
|
|
9
|
+
* - **Ordering**: per-partition, not per-topic. Set the partition
|
|
10
|
+
* key via the `dedupId` field on `addJob` to keep related
|
|
11
|
+
* messages on the same partition.
|
|
12
|
+
* - **Retries**: Kafka doesn't have a broker-side retry concept.
|
|
13
|
+
* The adapter re-throws on handler failure; offset commit is
|
|
14
|
+
* suppressed so the consumer re-polls the message on the next
|
|
15
|
+
* cycle. For real retry semantics, layer a dead-letter topic.
|
|
16
|
+
* - **Stats**: KafkaJS exposes consumer-group lag via its admin
|
|
17
|
+
* client; the lag count is reported as `waiting`. Other stats
|
|
18
|
+
* are tracked locally per consumer.
|
|
19
|
+
*
|
|
20
|
+
* Requires `kafkajs` as a peer dependency:
|
|
21
|
+
*
|
|
22
|
+
* bun add kafkajs
|
|
23
|
+
*
|
|
24
|
+
* Environment variables (read at adapter construction):
|
|
25
|
+
* - `KAFKA_BROKERS` — comma-separated list (default `localhost:9092`).
|
|
26
|
+
* - `KAFKA_CLIENT_ID` — client.id (default `"blok-worker"`).
|
|
27
|
+
* - `KAFKA_SASL_USERNAME` — SASL/PLAIN username (optional).
|
|
28
|
+
* - `KAFKA_SASL_PASSWORD` — SASL/PLAIN password (optional).
|
|
29
|
+
* - `KAFKA_SSL` — when `"true"`, enable TLS.
|
|
30
|
+
*/
|
|
31
|
+
import type { WorkerTriggerOpts } from "@blokjs/helper";
|
|
32
|
+
import type { WorkerAdapter, WorkerJob, WorkerQueueStats } from "../WorkerTrigger";
|
|
33
|
+
export interface KafkaConfig {
|
|
34
|
+
brokers: string[];
|
|
35
|
+
clientId: string;
|
|
36
|
+
saslUsername?: string;
|
|
37
|
+
saslPassword?: string;
|
|
38
|
+
ssl: boolean;
|
|
39
|
+
}
|
|
40
|
+
export declare class KafkaAdapter implements WorkerAdapter {
|
|
41
|
+
readonly provider: "kafka";
|
|
42
|
+
private readonly config;
|
|
43
|
+
private kafka;
|
|
44
|
+
private handle;
|
|
45
|
+
private connected;
|
|
46
|
+
private stats;
|
|
47
|
+
constructor(config?: Partial<KafkaConfig>);
|
|
48
|
+
connect(): Promise<void>;
|
|
49
|
+
disconnect(): Promise<void>;
|
|
50
|
+
process(config: WorkerTriggerOpts, handler: (job: WorkerJob) => Promise<void>): Promise<void>;
|
|
51
|
+
addJob(queue: string, data: unknown, opts?: {
|
|
52
|
+
priority?: number;
|
|
53
|
+
delay?: number;
|
|
54
|
+
retries?: number;
|
|
55
|
+
timeout?: number;
|
|
56
|
+
jobId?: string;
|
|
57
|
+
}): Promise<string>;
|
|
58
|
+
stopProcessing(queue: string): Promise<void>;
|
|
59
|
+
isConnected(): boolean;
|
|
60
|
+
healthCheck(): Promise<boolean>;
|
|
61
|
+
getQueueStats(queue: string): Promise<WorkerQueueStats>;
|
|
62
|
+
}
|