@stemy/backend 6.0.2 → 6.0.4

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.
@@ -0,0 +1,34 @@
1
+ import { PassThrough } from 'stream';
2
+ export function createFallbackReadable(primary, fallbackFactory) {
3
+ const proxy = new PassThrough();
4
+ let hasSwitched = false;
5
+ const switchToFallback = () => {
6
+ if (hasSwitched)
7
+ return;
8
+ hasSwitched = true;
9
+ // 1. Cleanup the failing primary
10
+ primary.unpipe(proxy);
11
+ primary.destroy();
12
+ // 2. Initialize and pipe the fallback
13
+ const fallback = fallbackFactory();
14
+ // On the fallback, we allow it to end the proxy naturally
15
+ fallback.pipe(proxy);
16
+ fallback.on('error', (err) => {
17
+ proxy.emit('error', err); // If fallback fails too, it's a hard error
18
+ });
19
+ };
20
+ // Pipe primary but prevent it from closing the proxy automatically
21
+ primary.pipe(proxy, { end: false });
22
+ primary.on('error', () => {
23
+ switchToFallback();
24
+ });
25
+ // Handle the "Early End" case (e.g., stream closed before data finished)
26
+ primary.on('end', () => {
27
+ if (!hasSwitched) {
28
+ // If we finished successfully without erroring, close the proxy
29
+ proxy.end();
30
+ }
31
+ });
32
+ return proxy;
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFsbGJhY2stcmVhZGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZHJpdmVycy9mYWxsYmFjay1yZWFkYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVksV0FBVyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRS9DLE1BQU0sVUFBVSxzQkFBc0IsQ0FDbEMsT0FBaUIsRUFDakIsZUFBK0I7SUFFL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNoQyxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFeEIsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLEVBQUU7UUFDMUIsSUFBSSxXQUFXO1lBQUUsT0FBTztRQUN4QixXQUFXLEdBQUcsSUFBSSxDQUFDO1FBRW5CLGlDQUFpQztRQUNqQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUVsQixzQ0FBc0M7UUFDdEMsTUFBTSxRQUFRLEdBQUcsZUFBZSxFQUFFLENBQUM7UUFFbkMsMERBQTBEO1FBQzFELFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckIsUUFBUSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLDJDQUEyQztRQUN6RSxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQztJQUVGLG1FQUFtRTtJQUNuRSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRXBDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtRQUNyQixnQkFBZ0IsRUFBRSxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBRUgseUVBQXlFO0lBQ3pFLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtRQUNuQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDZixnRUFBZ0U7WUFDaEUsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWFkYWJsZSwgUGFzc1Rocm91Z2ggfSBmcm9tICdzdHJlYW0nO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZhbGxiYWNrUmVhZGFibGUoXHJcbiAgICBwcmltYXJ5OiBSZWFkYWJsZSxcclxuICAgIGZhbGxiYWNrRmFjdG9yeTogKCkgPT4gUmVhZGFibGVcclxuKTogUmVhZGFibGUge1xyXG4gICAgY29uc3QgcHJveHkgPSBuZXcgUGFzc1Rocm91Z2goKTtcclxuICAgIGxldCBoYXNTd2l0Y2hlZCA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IHN3aXRjaFRvRmFsbGJhY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKGhhc1N3aXRjaGVkKSByZXR1cm47XHJcbiAgICAgICAgaGFzU3dpdGNoZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyAxLiBDbGVhbnVwIHRoZSBmYWlsaW5nIHByaW1hcnlcclxuICAgICAgICBwcmltYXJ5LnVucGlwZShwcm94eSk7XHJcbiAgICAgICAgcHJpbWFyeS5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgIC8vIDIuIEluaXRpYWxpemUgYW5kIHBpcGUgdGhlIGZhbGxiYWNrXHJcbiAgICAgICAgY29uc3QgZmFsbGJhY2sgPSBmYWxsYmFja0ZhY3RvcnkoKTtcclxuXHJcbiAgICAgICAgLy8gT24gdGhlIGZhbGxiYWNrLCB3ZSBhbGxvdyBpdCB0byBlbmQgdGhlIHByb3h5IG5hdHVyYWxseVxyXG4gICAgICAgIGZhbGxiYWNrLnBpcGUocHJveHkpO1xyXG5cclxuICAgICAgICBmYWxsYmFjay5vbignZXJyb3InLCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIHByb3h5LmVtaXQoJ2Vycm9yJywgZXJyKTsgLy8gSWYgZmFsbGJhY2sgZmFpbHMgdG9vLCBpdCdzIGEgaGFyZCBlcnJvclxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBQaXBlIHByaW1hcnkgYnV0IHByZXZlbnQgaXQgZnJvbSBjbG9zaW5nIHRoZSBwcm94eSBhdXRvbWF0aWNhbGx5XHJcbiAgICBwcmltYXJ5LnBpcGUocHJveHksIHsgZW5kOiBmYWxzZSB9KTtcclxuXHJcbiAgICBwcmltYXJ5Lm9uKCdlcnJvcicsICgpID0+IHtcclxuICAgICAgICBzd2l0Y2hUb0ZhbGxiYWNrKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBIYW5kbGUgdGhlIFwiRWFybHkgRW5kXCIgY2FzZSAoZS5nLiwgc3RyZWFtIGNsb3NlZCBiZWZvcmUgZGF0YSBmaW5pc2hlZClcclxuICAgIHByaW1hcnkub24oJ2VuZCcsICgpID0+IHtcclxuICAgICAgICBpZiAoIWhhc1N3aXRjaGVkKSB7XHJcbiAgICAgICAgICAgIC8vIElmIHdlIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseSB3aXRob3V0IGVycm9yaW5nLCBjbG9zZSB0aGUgcHJveHlcclxuICAgICAgICAgICAgcHJveHkuZW5kKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHByb3h5O1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,72 @@
1
+ import { PassThrough } from 'stream';
2
+ export function createFallbackReadable(primary, fallbackFactory) {
3
+ const proxy = new PassThrough();
4
+ let hasSwitched = false;
5
+ const switchToFallback = () => {
6
+ if (hasSwitched)
7
+ return;
8
+ hasSwitched = true;
9
+ // 1. Cleanup the failing primary
10
+ primary.unpipe(proxy);
11
+ primary.destroy();
12
+ // 2. Initialize and pipe the fallback
13
+ const fallback = fallbackFactory();
14
+ // On the fallback, we allow it to end the proxy naturally
15
+ fallback.pipe(proxy);
16
+ fallback.on('error', (err) => {
17
+ proxy.emit('error', err); // If fallback fails too, it's a hard error
18
+ });
19
+ };
20
+ // Pipe primary but prevent it from closing the proxy automatically
21
+ primary.pipe(proxy, { end: false });
22
+ primary.on('error', () => {
23
+ switchToFallback();
24
+ });
25
+ // Handle the "Early End" case (e.g., stream closed before data finished)
26
+ primary.on('end', () => {
27
+ if (!hasSwitched) {
28
+ // If we finished successfully without erroring, close the proxy
29
+ proxy.end();
30
+ }
31
+ });
32
+ return proxy;
33
+ }
34
+ /**
35
+ * Creates a Writable proxy that switches to a fallback destination on error.
36
+ * @param primary The initial Writable destination.
37
+ * @param fallbackFactory A function that returns a new Writable destination.
38
+ */
39
+ export function createFallbackWritable(primary, fallbackFactory) {
40
+ // 1. The Proxy acts as the stable "entry point" for your data
41
+ const proxy = new PassThrough();
42
+ let currentDestination = primary;
43
+ let hasSwitched = false;
44
+ // Function to handle the swap
45
+ const handleSwitch = (err) => {
46
+ if (hasSwitched)
47
+ return; // Prevent infinite loops if fallback also fails
48
+ hasSwitched = true;
49
+ // 2. Unpipe from the failed stream and destroy it
50
+ proxy.unpipe(currentDestination);
51
+ currentDestination.destroy();
52
+ // 3. Create the new destination and pipe the remaining data to it
53
+ const fallback = fallbackFactory();
54
+ currentDestination = fallback;
55
+ // Pipe the proxy into the fallback
56
+ proxy.pipe(fallback);
57
+ // Ensure errors on the fallback are bubbled up
58
+ fallback.on('error', (fallbackErr) => {
59
+ proxy.emit('error', fallbackErr);
60
+ });
61
+ };
62
+ // Initial setup
63
+ primary.on('error', handleSwitch);
64
+ proxy.on('finish', () => {
65
+ const final = proxy;
66
+ final.id = currentDestination.id;
67
+ final.done = true;
68
+ });
69
+ proxy.pipe(primary);
70
+ return proxy;
71
+ }
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFsbGJhY2stc3RyZWFtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9kcml2ZXJzL2ZhbGxiYWNrLXN0cmVhbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFZLFdBQVcsRUFBWSxNQUFNLFFBQVEsQ0FBQztBQUd6RCxNQUFNLFVBQVUsc0JBQXNCLENBQ2xDLE9BQWlCLEVBQ2pCLGVBQStCO0lBRS9CLE1BQU0sS0FBSyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDaEMsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBRXhCLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxFQUFFO1FBQzFCLElBQUksV0FBVztZQUFFLE9BQU87UUFDeEIsV0FBVyxHQUFHLElBQUksQ0FBQztRQUVuQixpQ0FBaUM7UUFDakMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFbEIsc0NBQXNDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLGVBQWUsRUFBRSxDQUFDO1FBRW5DLDBEQUEwRDtRQUMxRCxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJCLFFBQVEsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDekIsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQywyQ0FBMkM7UUFDekUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUM7SUFFRixtRUFBbUU7SUFDbkUsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUVwQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDckIsZ0JBQWdCLEVBQUUsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztJQUVILHlFQUF5RTtJQUN6RSxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7UUFDbkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2YsZ0VBQWdFO1lBQ2hFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDbEMsT0FBMkIsRUFDM0IsZUFBeUM7SUFFekMsOERBQThEO0lBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFFaEMsSUFBSSxrQkFBa0IsR0FBRyxPQUFPLENBQUM7SUFDakMsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBRXhCLDhCQUE4QjtJQUM5QixNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVUsRUFBRSxFQUFFO1FBQ2hDLElBQUksV0FBVztZQUFFLE9BQU8sQ0FBQyxnREFBZ0Q7UUFDekUsV0FBVyxHQUFHLElBQUksQ0FBQztRQUVuQixrREFBa0Q7UUFDbEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2pDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRTdCLGtFQUFrRTtRQUNsRSxNQUFNLFFBQVEsR0FBRyxlQUFlLEVBQUUsQ0FBQztRQUNuQyxrQkFBa0IsR0FBRyxRQUFRLENBQUM7UUFFOUIsbUNBQW1DO1FBQ25DLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFckIsK0NBQStDO1FBQy9DLFFBQVEsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFDakMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUM7SUFFRixnQkFBZ0I7SUFDaEIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbEMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1FBQ3BCLE1BQU0sS0FBSyxHQUFHLEtBQTJCLENBQUM7UUFDMUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7UUFDakMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXBCLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWFkYWJsZSwgUGFzc1Rocm91Z2gsIFdyaXRhYmxlIH0gZnJvbSAnc3RyZWFtJztcclxuaW1wb3J0IHtJQXNzZXRVcGxvYWRTdHJlYW19IGZyb20gXCIuLi8uLi9jb21tb24tdHlwZXNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGYWxsYmFja1JlYWRhYmxlKFxyXG4gICAgcHJpbWFyeTogUmVhZGFibGUsXHJcbiAgICBmYWxsYmFja0ZhY3Rvcnk6ICgpID0+IFJlYWRhYmxlXHJcbik6IFJlYWRhYmxlIHtcclxuICAgIGNvbnN0IHByb3h5ID0gbmV3IFBhc3NUaHJvdWdoKCk7XHJcbiAgICBsZXQgaGFzU3dpdGNoZWQgPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdCBzd2l0Y2hUb0ZhbGxiYWNrID0gKCkgPT4ge1xyXG4gICAgICAgIGlmIChoYXNTd2l0Y2hlZCkgcmV0dXJuO1xyXG4gICAgICAgIGhhc1N3aXRjaGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gMS4gQ2xlYW51cCB0aGUgZmFpbGluZyBwcmltYXJ5XHJcbiAgICAgICAgcHJpbWFyeS51bnBpcGUocHJveHkpO1xyXG4gICAgICAgIHByaW1hcnkuZGVzdHJveSgpO1xyXG5cclxuICAgICAgICAvLyAyLiBJbml0aWFsaXplIGFuZCBwaXBlIHRoZSBmYWxsYmFja1xyXG4gICAgICAgIGNvbnN0IGZhbGxiYWNrID0gZmFsbGJhY2tGYWN0b3J5KCk7XHJcblxyXG4gICAgICAgIC8vIE9uIHRoZSBmYWxsYmFjaywgd2UgYWxsb3cgaXQgdG8gZW5kIHRoZSBwcm94eSBuYXR1cmFsbHlcclxuICAgICAgICBmYWxsYmFjay5waXBlKHByb3h5KTtcclxuXHJcbiAgICAgICAgZmFsbGJhY2sub24oJ2Vycm9yJywgKGVycikgPT4ge1xyXG4gICAgICAgICAgICBwcm94eS5lbWl0KCdlcnJvcicsIGVycik7IC8vIElmIGZhbGxiYWNrIGZhaWxzIHRvbywgaXQncyBhIGhhcmQgZXJyb3JcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gUGlwZSBwcmltYXJ5IGJ1dCBwcmV2ZW50IGl0IGZyb20gY2xvc2luZyB0aGUgcHJveHkgYXV0b21hdGljYWxseVxyXG4gICAgcHJpbWFyeS5waXBlKHByb3h5LCB7IGVuZDogZmFsc2UgfSk7XHJcblxyXG4gICAgcHJpbWFyeS5vbignZXJyb3InLCAoKSA9PiB7XHJcbiAgICAgICAgc3dpdGNoVG9GYWxsYmFjaygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gSGFuZGxlIHRoZSBcIkVhcmx5IEVuZFwiIGNhc2UgKGUuZy4sIHN0cmVhbSBjbG9zZWQgYmVmb3JlIGRhdGEgZmluaXNoZWQpXHJcbiAgICBwcmltYXJ5Lm9uKCdlbmQnLCAoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFoYXNTd2l0Y2hlZCkge1xyXG4gICAgICAgICAgICAvLyBJZiB3ZSBmaW5pc2hlZCBzdWNjZXNzZnVsbHkgd2l0aG91dCBlcnJvcmluZywgY2xvc2UgdGhlIHByb3h5XHJcbiAgICAgICAgICAgIHByb3h5LmVuZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBwcm94eTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBXcml0YWJsZSBwcm94eSB0aGF0IHN3aXRjaGVzIHRvIGEgZmFsbGJhY2sgZGVzdGluYXRpb24gb24gZXJyb3IuXHJcbiAqIEBwYXJhbSBwcmltYXJ5IFRoZSBpbml0aWFsIFdyaXRhYmxlIGRlc3RpbmF0aW9uLlxyXG4gKiBAcGFyYW0gZmFsbGJhY2tGYWN0b3J5IEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IFdyaXRhYmxlIGRlc3RpbmF0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZhbGxiYWNrV3JpdGFibGUoXHJcbiAgICBwcmltYXJ5OiBJQXNzZXRVcGxvYWRTdHJlYW0sXHJcbiAgICBmYWxsYmFja0ZhY3Rvcnk6ICgpID0+IElBc3NldFVwbG9hZFN0cmVhbVxyXG4pOiBXcml0YWJsZSB7XHJcbiAgICAvLyAxLiBUaGUgUHJveHkgYWN0cyBhcyB0aGUgc3RhYmxlIFwiZW50cnkgcG9pbnRcIiBmb3IgeW91ciBkYXRhXHJcbiAgICBjb25zdCBwcm94eSA9IG5ldyBQYXNzVGhyb3VnaCgpO1xyXG5cclxuICAgIGxldCBjdXJyZW50RGVzdGluYXRpb24gPSBwcmltYXJ5O1xyXG4gICAgbGV0IGhhc1N3aXRjaGVkID0gZmFsc2U7XHJcblxyXG4gICAgLy8gRnVuY3Rpb24gdG8gaGFuZGxlIHRoZSBzd2FwXHJcbiAgICBjb25zdCBoYW5kbGVTd2l0Y2ggPSAoZXJyOiBFcnJvcikgPT4ge1xyXG4gICAgICAgIGlmIChoYXNTd2l0Y2hlZCkgcmV0dXJuOyAvLyBQcmV2ZW50IGluZmluaXRlIGxvb3BzIGlmIGZhbGxiYWNrIGFsc28gZmFpbHNcclxuICAgICAgICBoYXNTd2l0Y2hlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vIDIuIFVucGlwZSBmcm9tIHRoZSBmYWlsZWQgc3RyZWFtIGFuZCBkZXN0cm95IGl0XHJcbiAgICAgICAgcHJveHkudW5waXBlKGN1cnJlbnREZXN0aW5hdGlvbik7XHJcbiAgICAgICAgY3VycmVudERlc3RpbmF0aW9uLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgLy8gMy4gQ3JlYXRlIHRoZSBuZXcgZGVzdGluYXRpb24gYW5kIHBpcGUgdGhlIHJlbWFpbmluZyBkYXRhIHRvIGl0XHJcbiAgICAgICAgY29uc3QgZmFsbGJhY2sgPSBmYWxsYmFja0ZhY3RvcnkoKTtcclxuICAgICAgICBjdXJyZW50RGVzdGluYXRpb24gPSBmYWxsYmFjaztcclxuXHJcbiAgICAgICAgLy8gUGlwZSB0aGUgcHJveHkgaW50byB0aGUgZmFsbGJhY2tcclxuICAgICAgICBwcm94eS5waXBlKGZhbGxiYWNrKTtcclxuXHJcbiAgICAgICAgLy8gRW5zdXJlIGVycm9ycyBvbiB0aGUgZmFsbGJhY2sgYXJlIGJ1YmJsZWQgdXBcclxuICAgICAgICBmYWxsYmFjay5vbignZXJyb3InLCAoZmFsbGJhY2tFcnIpID0+IHtcclxuICAgICAgICAgICAgcHJveHkuZW1pdCgnZXJyb3InLCBmYWxsYmFja0Vycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEluaXRpYWwgc2V0dXBcclxuICAgIHByaW1hcnkub24oJ2Vycm9yJywgaGFuZGxlU3dpdGNoKTtcclxuICAgIHByb3h5Lm9uKCdmaW5pc2gnLCAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmluYWwgPSBwcm94eSBhcyBJQXNzZXRVcGxvYWRTdHJlYW07XHJcbiAgICAgICAgZmluYWwuaWQgPSBjdXJyZW50RGVzdGluYXRpb24uaWQ7XHJcbiAgICAgICAgZmluYWwuZG9uZSA9IHRydWU7XHJcbiAgICB9KTtcclxuICAgIHByb3h5LnBpcGUocHJpbWFyeSk7XHJcblxyXG4gICAgcmV0dXJuIHByb3h5O1xyXG59XHJcbiJdfQ==
@@ -1,4 +1,4 @@
1
- import { isString, streamToBuffer, toImage } from "../../utils";
1
+ import { streamToBuffer, toImage } from "../../utils";
2
2
  import { BaseEntity } from "./base-entity";
3
3
  export class Asset extends BaseEntity {
4
4
  driver;
@@ -21,17 +21,11 @@ export class Asset extends BaseEntity {
21
21
  async unlink() {
22
22
  try {
23
23
  await this.driver.delete(this.oid);
24
- await this.collection.deleteOne({ _id: this.oid });
25
24
  }
26
25
  catch (error) {
27
- let err = error;
28
- if (error) {
29
- err = error.message || error || "";
30
- if (!isString(err) || !err.startsWith("FileNotFound")) {
31
- throw err;
32
- }
33
- }
26
+ console.log("Failed to unlink", error?.message);
34
27
  }
28
+ await this.collection.deleteOne({ _id: this.oid });
35
29
  return this.id;
36
30
  }
37
31
  async setMeta(metadata) {
@@ -58,4 +52,4 @@ export class Asset extends BaseEntity {
58
52
  return toImage(await this.download(metadata), params, this.metadata);
59
53
  }
60
54
  }
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZW50aXRpZXMvYXNzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzlELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFekMsTUFBTSxPQUFPLEtBQU0sU0FBUSxVQUFrQjtJQXFCbkI7SUFuQnRCLElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELFlBQVksRUFBWSxFQUNaLElBQXFCLEVBQ3JCLFVBQXNCLEVBQ1osTUFBb0I7UUFDdEMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFEVixXQUFNLEdBQU4sTUFBTSxDQUFjO0lBRTFDLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTTtRQUNSLElBQUksQ0FBQztZQUNELE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixJQUFJLEdBQUcsR0FBRyxLQUFZLENBQUM7WUFDdkIsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDUixHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO29CQUNwRCxNQUFNLEdBQUcsQ0FBQztnQkFDZCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBNkI7UUFDdkMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEQsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsRUFBQyxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELFNBQVM7UUFDTCxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBcUI7UUFDaEMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEQsUUFBUSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWE7WUFDN0UsQ0FBQyxDQUFDLENBQUM7WUFDSCxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDakMsUUFBUSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDOUQsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLEVBQUMsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUE0QixJQUFJO1FBQzNDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUEwQixFQUFFLFFBQXFCO1FBQ2pFLE9BQU8sT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UmVhZGFibGV9IGZyb20gXCJzdHJlYW1cIjtcclxuaW1wb3J0IHtDb2xsZWN0aW9ufSBmcm9tIFwibW9uZ29kYlwiO1xyXG5pbXBvcnQge09iamVjdElkfSBmcm9tIFwiYnNvblwiO1xyXG5cclxuaW1wb3J0IHtJQXNzZXQsIElBc3NldERyaXZlciwgSUFzc2V0SW1hZ2VQYXJhbXMsIElBc3NldE1ldGF9IGZyb20gXCIuLi8uLi9jb21tb24tdHlwZXNcIjtcclxuaW1wb3J0IHtpc1N0cmluZywgc3RyZWFtVG9CdWZmZXIsIHRvSW1hZ2V9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xyXG5pbXBvcnQge0Jhc2VFbnRpdHl9IGZyb20gXCIuL2Jhc2UtZW50aXR5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQXNzZXQgZXh0ZW5kcyBCYXNlRW50aXR5PElBc3NldD4gaW1wbGVtZW50cyBJQXNzZXQge1xyXG5cclxuICAgIGdldCBmaWxlbmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuZmlsZW5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbnRlbnRUeXBlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5jb250ZW50VHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbWV0YWRhdGEoKTogSUFzc2V0TWV0YSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5tZXRhZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc3RyZWFtKCk6IFJlYWRhYmxlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kcml2ZXIub3BlbkRvd25sb2FkU3RyZWFtKHRoaXMub2lkKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogT2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBQYXJ0aWFsPElBc3NldD4sXHJcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIGRyaXZlcjogSUFzc2V0RHJpdmVyKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsIGRhdGEsIGNvbGxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVubGluaygpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLmRlbGV0ZSh0aGlzLm9pZCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdGlvbi5kZWxldGVPbmUoe19pZDogdGhpcy5vaWR9KTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBsZXQgZXJyID0gZXJyb3IgYXMgYW55O1xyXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGVyciA9IGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IgfHwgXCJcIjtcclxuICAgICAgICAgICAgICAgIGlmICghaXNTdHJpbmcoZXJyKSB8fCAhZXJyLnN0YXJ0c1dpdGgoXCJGaWxlTm90Rm91bmRcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0TWV0YShtZXRhZGF0YTogUGFydGlhbDxJQXNzZXRNZXRhPik6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgbWV0YWRhdGEgPSBPYmplY3QuYXNzaWduKHRoaXMubWV0YWRhdGEsIG1ldGFkYXRhIHx8IHt9KTtcclxuICAgICAgICBhd2FpdCB0aGlzLmNvbGxlY3Rpb24udXBkYXRlT25lKHtfaWQ6IHRoaXMub2lkfSwgeyRzZXQ6IHttZXRhZGF0YX19KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRCdWZmZXIoKTogUHJvbWlzZTxCdWZmZXI+IHtcclxuICAgICAgICByZXR1cm4gc3RyZWFtVG9CdWZmZXIodGhpcy5zdHJlYW0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRvd25sb2FkKG1ldGFkYXRhPzogSUFzc2V0TWV0YSk6IFByb21pc2U8UmVhZGFibGU+IHtcclxuICAgICAgICBtZXRhZGF0YSA9IE9iamVjdC5hc3NpZ24odGhpcy5tZXRhZGF0YSwgbWV0YWRhdGEgfHwge30pO1xyXG4gICAgICAgIG1ldGFkYXRhLmRvd25sb2FkQ291bnQgPSBpc05hTihtZXRhZGF0YS5kb3dubG9hZENvdW50KSB8fCAhbWV0YWRhdGEuZmlyc3REb3dubG9hZFxyXG4gICAgICAgICAgICA/IDFcclxuICAgICAgICAgICAgOiBtZXRhZGF0YS5kb3dubG9hZENvdW50ICsgMTtcclxuICAgICAgICBtZXRhZGF0YS5maXJzdERvd25sb2FkID0gbWV0YWRhdGEuZmlyc3REb3dubG9hZCB8fCBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIG1ldGFkYXRhLmxhc3REb3dubG9hZCA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0aW9uLnVwZGF0ZU9uZSh7X2lkOiB0aGlzLm9pZH0sIHskc2V0OiB7bWV0YWRhdGF9fSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEltYWdlKHBhcmFtczogSUFzc2V0SW1hZ2VQYXJhbXMgPSBudWxsKTogUHJvbWlzZTxSZWFkYWJsZT4ge1xyXG4gICAgICAgIHJldHVybiB0b0ltYWdlKHRoaXMuc3RyZWFtLCBwYXJhbXMsIHRoaXMubWV0YWRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRvd25sb2FkSW1hZ2UocGFyYW1zPzogSUFzc2V0SW1hZ2VQYXJhbXMsIG1ldGFkYXRhPzogSUFzc2V0TWV0YSk6IFByb21pc2U8UmVhZGFibGU+IHtcclxuICAgICAgICByZXR1cm4gdG9JbWFnZShhd2FpdCB0aGlzLmRvd25sb2FkKG1ldGFkYXRhKSwgcGFyYW1zLCB0aGlzLm1ldGFkYXRhKTtcclxuICAgIH1cclxufVxyXG4iXX0=
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvZW50aXRpZXMvYXNzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFXLGNBQWMsRUFBRSxPQUFPLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDOUQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxNQUFNLE9BQU8sS0FBTSxTQUFRLFVBQWtCO0lBcUJuQjtJQW5CdEIsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsWUFBWSxFQUFZLEVBQ1osSUFBcUIsRUFDckIsVUFBc0IsRUFDWixNQUFvQjtRQUN0QyxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQURWLFdBQU0sR0FBTixNQUFNLENBQWM7SUFFMUMsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNO1FBQ1IsSUFBSSxDQUFDO1lBQ0QsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBNkI7UUFDdkMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEQsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsRUFBQyxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELFNBQVM7UUFDTCxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBcUI7UUFDaEMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEQsUUFBUSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWE7WUFDN0UsQ0FBQyxDQUFDLENBQUM7WUFDSCxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDakMsUUFBUSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDOUQsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLEVBQUMsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUE0QixJQUFJO1FBQzNDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUEwQixFQUFFLFFBQXFCO1FBQ2pFLE9BQU8sT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UmVhZGFibGV9IGZyb20gXCJzdHJlYW1cIjtcclxuaW1wb3J0IHtDb2xsZWN0aW9ufSBmcm9tIFwibW9uZ29kYlwiO1xyXG5pbXBvcnQge09iamVjdElkfSBmcm9tIFwiYnNvblwiO1xyXG5cclxuaW1wb3J0IHtJQXNzZXQsIElBc3NldERyaXZlciwgSUFzc2V0SW1hZ2VQYXJhbXMsIElBc3NldE1ldGF9IGZyb20gXCIuLi8uLi9jb21tb24tdHlwZXNcIjtcclxuaW1wb3J0IHtpc1N0cmluZywgc3RyZWFtVG9CdWZmZXIsIHRvSW1hZ2V9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xyXG5pbXBvcnQge0Jhc2VFbnRpdHl9IGZyb20gXCIuL2Jhc2UtZW50aXR5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQXNzZXQgZXh0ZW5kcyBCYXNlRW50aXR5PElBc3NldD4gaW1wbGVtZW50cyBJQXNzZXQge1xyXG5cclxuICAgIGdldCBmaWxlbmFtZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuZmlsZW5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbnRlbnRUeXBlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5jb250ZW50VHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbWV0YWRhdGEoKTogSUFzc2V0TWV0YSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5tZXRhZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc3RyZWFtKCk6IFJlYWRhYmxlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kcml2ZXIub3BlbkRvd25sb2FkU3RyZWFtKHRoaXMub2lkKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpZDogT2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBQYXJ0aWFsPElBc3NldD4sXHJcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIGRyaXZlcjogSUFzc2V0RHJpdmVyKSB7XHJcbiAgICAgICAgc3VwZXIoaWQsIGRhdGEsIGNvbGxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVubGluaygpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLmRlbGV0ZSh0aGlzLm9pZCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGYWlsZWQgdG8gdW5saW5rXCIsIGVycm9yPy5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0aW9uLmRlbGV0ZU9uZSh7X2lkOiB0aGlzLm9pZH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmlkO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNldE1ldGEobWV0YWRhdGE6IFBhcnRpYWw8SUFzc2V0TWV0YT4pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIG1ldGFkYXRhID0gT2JqZWN0LmFzc2lnbih0aGlzLm1ldGFkYXRhLCBtZXRhZGF0YSB8fCB7fSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb2xsZWN0aW9uLnVwZGF0ZU9uZSh7X2lkOiB0aGlzLm9pZH0sIHskc2V0OiB7bWV0YWRhdGF9fSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QnVmZmVyKCk6IFByb21pc2U8QnVmZmVyPiB7XHJcbiAgICAgICAgcmV0dXJuIHN0cmVhbVRvQnVmZmVyKHRoaXMuc3RyZWFtKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkb3dubG9hZChtZXRhZGF0YT86IElBc3NldE1ldGEpOiBQcm9taXNlPFJlYWRhYmxlPiB7XHJcbiAgICAgICAgbWV0YWRhdGEgPSBPYmplY3QuYXNzaWduKHRoaXMubWV0YWRhdGEsIG1ldGFkYXRhIHx8IHt9KTtcclxuICAgICAgICBtZXRhZGF0YS5kb3dubG9hZENvdW50ID0gaXNOYU4obWV0YWRhdGEuZG93bmxvYWRDb3VudCkgfHwgIW1ldGFkYXRhLmZpcnN0RG93bmxvYWRcclxuICAgICAgICAgICAgPyAxXHJcbiAgICAgICAgICAgIDogbWV0YWRhdGEuZG93bmxvYWRDb3VudCArIDE7XHJcbiAgICAgICAgbWV0YWRhdGEuZmlyc3REb3dubG9hZCA9IG1ldGFkYXRhLmZpcnN0RG93bmxvYWQgfHwgbmV3IERhdGUoKTtcclxuICAgICAgICBtZXRhZGF0YS5sYXN0RG93bmxvYWQgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdGlvbi51cGRhdGVPbmUoe19pZDogdGhpcy5vaWR9LCB7JHNldDoge21ldGFkYXRhfX0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRJbWFnZShwYXJhbXM6IElBc3NldEltYWdlUGFyYW1zID0gbnVsbCk6IFByb21pc2U8UmVhZGFibGU+IHtcclxuICAgICAgICByZXR1cm4gdG9JbWFnZSh0aGlzLnN0cmVhbSwgcGFyYW1zLCB0aGlzLm1ldGFkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkb3dubG9hZEltYWdlKHBhcmFtcz86IElBc3NldEltYWdlUGFyYW1zLCBtZXRhZGF0YT86IElBc3NldE1ldGEpOiBQcm9taXNlPFJlYWRhYmxlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRvSW1hZ2UoYXdhaXQgdGhpcy5kb3dubG9hZChtZXRhZGF0YSksIHBhcmFtcywgdGhpcy5tZXRhZGF0YSk7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -16,7 +16,6 @@ let JobManager = class JobManager {
16
16
  jobTypes;
17
17
  jobs;
18
18
  messages;
19
- processing;
20
19
  apiPush;
21
20
  apiPull;
22
21
  workerPush;
@@ -34,7 +33,9 @@ let JobManager = class JobManager {
34
33
  const messageBridge = {
35
34
  sendMessage: (message, params) => {
36
35
  params.uniqueId = uniqueId;
37
- this.workerPush.send([message, JSON.stringify(params)]);
36
+ this.workerPush.then(sock => {
37
+ sock.send([message, JSON.stringify(params)]);
38
+ });
38
39
  }
39
40
  };
40
41
  messageBridge.sendMessage(`job-started`, { name: jobName });
@@ -43,7 +44,6 @@ let JobManager = class JobManager {
43
44
  return res;
44
45
  }, {});
45
46
  this.messages = new Subject();
46
- this.processing = null;
47
47
  this.maxTimeout = this.config.resolve("jobTimeout");
48
48
  }
49
49
  on(message, cb) {
@@ -90,40 +90,46 @@ let JobManager = class JobManager {
90
90
  });
91
91
  });
92
92
  }
93
- async initProcessing() {
93
+ async startProcessing() {
94
94
  const host = this.config.resolve("zmqRemoteHost");
95
95
  const pushHost = `${host}:${this.config.resolve("zmqBackPort")}`;
96
- this.workerPush = socket("push");
97
- this.workerPush.connect(pushHost);
98
- this.logger.log("job-manager", `Worker producer connected to: ${pushHost}`);
99
96
  const pullHost = `${host}:${this.config.resolve("zmqPort")}`;
100
- this.workerPull = socket("pull");
101
- this.workerPull.connect(pullHost);
102
- this.logger.log("job-manager", `Worker consumer connected to: ${pullHost}`);
103
- this.workerPull.on("message", async (name, args, uniqId) => {
104
- try {
105
- const jobName = name.toString("utf8");
106
- const jobParams = JSON.parse(args.toString("utf8"));
107
- const uniqueId = uniqId?.toString("utf8");
108
- console.time(uniqueId);
109
- console.timeLog(uniqueId, `Started working on background job: ${colorize(jobName, ConsoleColor.FgCyan)} with args: \n${jsonHighlight(jobParams)}\n\n`);
97
+ this.workerPush = this.workerPush || new Promise(resolve => {
98
+ const sock = socket("push");
99
+ sock.connect(pushHost);
100
+ this.logger.log("job-manager", `Worker producer connected to: ${pushHost}`);
101
+ resolve(sock);
102
+ });
103
+ this.workerPull = this.workerPull || new Promise(resolve => {
104
+ const sock = socket("pull");
105
+ sock.connect(pullHost);
106
+ sock.on("message", async (name, args, uniqId) => {
110
107
  try {
111
- await Promise.race([this.jobs[jobName](jobParams, uniqueId), promiseTimeout(this.maxTimeout, true)]);
112
- console.timeLog(uniqueId, `Finished working on background job: ${colorize(jobName, ConsoleColor.FgCyan)}\n\n`);
108
+ const jobName = name.toString("utf8");
109
+ const jobParams = JSON.parse(args.toString("utf8"));
110
+ const uniqueId = uniqId?.toString("utf8");
111
+ console.time(uniqueId);
112
+ console.timeLog(uniqueId, `Started working on background job: ${colorize(jobName, ConsoleColor.FgCyan)} with args: \n${jsonHighlight(jobParams)}\n\n`);
113
+ try {
114
+ await Promise.race([this.jobs[jobName](jobParams, uniqueId), promiseTimeout(this.maxTimeout, true)]);
115
+ console.timeLog(uniqueId, `Finished working on background job: ${colorize(jobName, ConsoleColor.FgCyan)}\n\n`);
116
+ }
117
+ catch (e) {
118
+ console.timeLog(uniqueId, `Background job failed: ${colorize(jobName, ConsoleColor.FgRed)}\n${e}\n\n`);
119
+ }
120
+ console.timeEnd(uniqueId);
113
121
  }
114
122
  catch (e) {
115
- console.timeLog(uniqueId, `Background job failed: ${colorize(jobName, ConsoleColor.FgRed)}\n${e}\n\n`);
123
+ this.logger.log("job-manager", `Failed to start job: ${e.message}`);
116
124
  }
117
- console.timeEnd(uniqueId);
118
- }
119
- catch (e) {
120
- this.logger.log("job-manager", `Failed to start job: ${e.message}`);
121
- }
125
+ });
126
+ this.logger.log("job-manager", `Worker consumer connected to: ${pullHost}`);
127
+ resolve(sock);
122
128
  });
123
- }
124
- startProcessing() {
125
- this.processing = this.processing || this.initProcessing();
126
- return this.processing;
129
+ await Promise.allSettled([
130
+ this.workerPush,
131
+ this.workerPull,
132
+ ]);
127
133
  }
128
134
  tryResolve(jobType, params) {
129
135
  const jobName = getConstructorName(jobType);
@@ -148,28 +154,32 @@ let JobManager = class JobManager {
148
154
  return this.tryResolveAndInit(jobType, params);
149
155
  }
150
156
  tryResolveAndInit(jobType, params) {
151
- if (!this.apiPush) {
157
+ this.apiPush = this.apiPush || new Promise(resolve => {
152
158
  const port = this.config.resolve("zmqPort");
153
- this.apiPush = socket("push");
154
- this.apiPush.bind(`tcp://0.0.0.0:${port}`);
155
- this.logger.log("job-manager", `API producer bound to port: ${port}`);
156
- }
157
- if (!this.apiPull) {
159
+ const sock = socket("push");
160
+ sock.bind(`tcp://0.0.0.0:${port}`, () => {
161
+ this.logger.log("job-manager", `API producer bound to port: ${port}`);
162
+ resolve(sock);
163
+ });
164
+ });
165
+ this.apiPull = this.apiPush || new Promise(resolve => {
158
166
  const backPort = this.config.resolve("zmqBackPort");
159
- this.apiPull = socket("pull");
160
- this.apiPull.bind(`tcp://0.0.0.0:${backPort}`);
161
- this.apiPull.on("message", (name, args) => {
162
- const message = name.toString("utf8");
163
- const params = JSON.parse(args?.toString("utf8") || "{}");
164
- const paramTypes = Object.keys(params).reduce((res, key) => {
165
- res[key] = getType(params[key]);
166
- return res;
167
- }, {});
168
- this.logger.log("job-manager", `Received a message from worker: "${colorize(message, ConsoleColor.FgCyan)}" with args: ${jsonHighlight(paramTypes)}\n\n`);
169
- this.messages.next({ message, params });
167
+ const sock = socket("pull");
168
+ sock.bind(`tcp://0.0.0.0:${backPort}`, () => {
169
+ sock.on("message", (name, args) => {
170
+ const message = name.toString("utf8");
171
+ const params = JSON.parse(args?.toString("utf8") || "{}");
172
+ const paramTypes = Object.keys(params).reduce((res, key) => {
173
+ res[key] = getType(params[key]);
174
+ return res;
175
+ }, {});
176
+ this.logger.log("job-manager", `Received a message from worker: "${colorize(message, ConsoleColor.FgCyan)}" with args: ${jsonHighlight(paramTypes)}\n\n`);
177
+ this.messages.next({ message, params });
178
+ });
179
+ this.logger.log("job-manager", `API consumer bound to port: ${backPort}`);
180
+ resolve(sock);
170
181
  });
171
- this.logger.log("job-manager", `API consumer bound to port: ${backPort}`);
172
- }
182
+ });
173
183
  return this.tryResolve(jobType, params);
174
184
  }
175
185
  resolveJobInstance(jobType, params, uniqueId = "") {
@@ -183,7 +193,8 @@ let JobManager = class JobManager {
183
193
  }
184
194
  async sendToWorkers(jobName, params) {
185
195
  const uniqueId = new ObjectId().toHexString();
186
- this.apiPush.send([jobName, JSON.stringify(params), uniqueId]);
196
+ const sock = await this.apiPush;
197
+ sock.send([jobName, JSON.stringify(params), uniqueId]);
187
198
  return uniqueId;
188
199
  }
189
200
  };
@@ -195,4 +206,4 @@ JobManager = __decorate([
195
206
  Logger, Object, Array])
196
207
  ], JobManager);
197
208
  export { JobManager };
198
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvam9iLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBc0IsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDM0UsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBQyxNQUFNLEVBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5QixPQUFPLEVBQ0gsWUFBWSxFQUtaLEdBQUcsRUFNTixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDSCxRQUFRLEVBQ1IsWUFBWSxFQUNaLGtCQUFrQixFQUNsQixPQUFPLEVBQ1AsT0FBTyxFQUNQLFFBQVEsRUFDUixhQUFhLEVBQ2IsY0FBYyxFQUNqQixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUd6QixJQUFNLFVBQVUsR0FBaEIsTUFBTSxVQUFVO0lBY0U7SUFDQTtJQUNzQjtJQWRqQyxRQUFRLENBQWU7SUFDdkIsSUFBSSxDQUErRTtJQUNuRixRQUFRLENBQTBCO0lBQ2xDLFVBQVUsQ0FBZTtJQUV6QixPQUFPLENBQVM7SUFDaEIsT0FBTyxDQUFTO0lBQ2hCLFVBQVUsQ0FBUztJQUNuQixVQUFVLENBQVM7SUFFcEIsVUFBVSxDQUFTO0lBRTVCLFlBQXFCLE1BQXFCLEVBQ3JCLE1BQWMsRUFDUSxTQUE4QixFQUM3QyxRQUFzQjtRQUg3QixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDUSxjQUFTLEdBQVQsU0FBUyxDQUFxQjtRQUVyRSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUM5QyxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFvQixFQUFFLFFBQWdCLEVBQUUsRUFBRTtnQkFDdEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ2xFLE1BQU0sYUFBYSxHQUFtQjtvQkFDbEMsV0FBVyxFQUFFLENBQUMsT0FBZSxFQUFFLE1BQXFCLEVBQUUsRUFBRTt3QkFDcEQsTUFBTSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7d0JBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM1RCxDQUFDO2lCQUNKLENBQUM7Z0JBQ0YsYUFBYSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztnQkFDMUQsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQTtZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1AsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBa0IsQ0FBQztRQUM5QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxFQUFFLENBQUMsT0FBZSxFQUFFLEVBQWlDO1FBQ2pELE9BQU8sSUFBSSxDQUFDLFFBQVE7YUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQzthQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQW1CLEVBQUUsU0FBb0IsRUFBRTtRQUNyRCxJQUFJLFFBQVEsR0FBUyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDO1lBQ0QsUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDVCxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxPQUFPLGtCQUFrQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEgsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLElBQVksRUFBRSxTQUFvQixFQUFFO1FBQ3RELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQW1CLEVBQUUsU0FBb0IsRUFBRTtRQUNyRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsUUFBUSxDQUFDLE1BQXVCLEVBQUUsSUFBcUIsRUFBRSxVQUEyQixFQUFFLEtBQXNCLEVBQUUsU0FBMEIsRUFBRSxPQUFtQixFQUFFLFNBQW9CLEVBQUU7UUFDakwsTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3BFLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxLQUFLLEdBQUcsQ0FBcUIsQ0FBQztnQkFDcEMsT0FBTyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDakQsQ0FBQztZQUNELElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsNkJBQTZCLE9BQU8sdUNBQXVDLENBQUMsQ0FBQztZQUM1RyxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7WUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsdUJBQXVCLE9BQU8sY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BGLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRVMsS0FBSyxDQUFDLGNBQWM7UUFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbEQsTUFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUNqRSxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsaUNBQWlDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFNUUsTUFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUM3RCxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsaUNBQWlDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFZLEVBQUUsSUFBWSxFQUFFLE1BQWMsRUFBRSxFQUFFO1lBQy9FLElBQUksQ0FBQztnQkFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQWMsQ0FBQztnQkFDakUsTUFBTSxRQUFRLEdBQUcsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFMUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsc0NBQXNDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFdkosSUFBSSxDQUFDO29CQUNELE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDckcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsdUNBQXVDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbkgsQ0FBQztnQkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNULE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLDBCQUEwQixRQUFRLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMzRyxDQUFDO2dCQUNELE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUIsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLHdCQUF3QixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN4RSxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDM0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBbUIsRUFBRSxNQUFpQjtRQUM3QyxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sNkJBQTZCLE9BQU8sMkJBQTJCLENBQUM7UUFDMUUsQ0FBQztRQUNELElBQUksQ0FBQztZQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDVCxNQUFNLGlDQUFpQyxPQUFPLGtCQUFrQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQzNHLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRVMsa0JBQWtCLENBQUMsT0FBZSxFQUFFLE1BQWlCO1FBQzNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RDLE9BQU8sa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ1gsTUFBTSxrQ0FBa0MsT0FBTywyQkFBMkIsQ0FBQztRQUMvRSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxPQUFtQixFQUFFLE1BQWlCO1FBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLCtCQUErQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQVksRUFBRSxJQUFhLEVBQUUsRUFBRTtnQkFDdkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBYyxDQUFDO2dCQUN2RSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtvQkFDdkQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDaEMsT0FBTyxHQUFHLENBQUM7Z0JBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNQLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxvQ0FBb0MsUUFBUSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLGdCQUFnQixhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMxSixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDO1lBQzFDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLCtCQUErQixRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxPQUFtQixFQUFFLE1BQWlCLEVBQUUsV0FBbUIsRUFBRTtRQUN0RixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDeEQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM3QixTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQztRQUNyRCxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyQyxPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFTLENBQUM7SUFDOUMsQ0FBQztJQUVTLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBZSxFQUFFLE1BQWlCO1FBQzVELE1BQU0sUUFBUSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7Q0FDSixDQUFBO0FBOUxZLFVBQVU7SUFEdEIsU0FBUyxFQUFFO0lBaUJLLFdBQUEsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQ3BCLFdBQUEsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFBO3FDQUhFLGFBQWE7UUFDYixNQUFNO0dBZjFCLFVBQVUsQ0E4THRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEZXBlbmRlbmN5Q29udGFpbmVyLCBpbmplY3QsIGluamVjdEFsbCwgc2luZ2xldG9ufSBmcm9tIFwidHN5cmluZ2VcIjtcbmltcG9ydCBjcm9uIGZyb20gXCJub2RlLWNyb25cIjtcbmltcG9ydCB7c29ja2V0LCBTb2NrZXR9IGZyb20gXCJ6ZXJvbXEvdjUtY29tcGF0XCI7XG5pbXBvcnQge1N1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7ZmlsdGVyLCBtYXB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHtPYmplY3RJZH0gZnJvbSBcImJzb25cIjtcbmltcG9ydCB7XG4gICAgRElfQ09OVEFJTkVSLFxuICAgIElKb2IsXG4gICAgSUpvYlRhc2ssXG4gICAgSU1lc3NhZ2VCcmlkZ2UsXG4gICAgSVNvY2tldE1lc3NhZ2UsXG4gICAgSk9CLFxuICAgIEpvYlBhcmFtcyxcbiAgICBKb2JTY2hlZHVsZVJhbmdlLFxuICAgIEpvYlNjaGVkdWxlVGltZSxcbiAgICBTb2NrZXRQYXJhbXMsXG4gICAgVHlwZVxufSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XG5pbXBvcnQge1xuICAgIGNvbG9yaXplLFxuICAgIENvbnNvbGVDb2xvcixcbiAgICBnZXRDb25zdHJ1Y3Rvck5hbWUsXG4gICAgZ2V0VHlwZSxcbiAgICBpc0FycmF5LFxuICAgIGlzT2JqZWN0LFxuICAgIGpzb25IaWdobGlnaHQsXG4gICAgcHJvbWlzZVRpbWVvdXRcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge0NvbmZpZ3VyYXRpb259IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB7TG9nZ2VyfSBmcm9tIFwiLi9sb2dnZXJcIjtcblxuQHNpbmdsZXRvbigpXG5leHBvcnQgY2xhc3MgSm9iTWFuYWdlciB7XG5cbiAgICBwcm90ZWN0ZWQgam9iVHlwZXM6IFR5cGU8SUpvYj5bXTtcbiAgICBwcm90ZWN0ZWQgam9iczogeyBbbmFtZTogc3RyaW5nXTogKGpvYlBhcmFtczogSm9iUGFyYW1zLCB1bmlxdWVJZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT4gfTtcbiAgICBwcm90ZWN0ZWQgbWVzc2FnZXM6IFN1YmplY3Q8SVNvY2tldE1lc3NhZ2U+O1xuICAgIHByb3RlY3RlZCBwcm9jZXNzaW5nOiBQcm9taXNlPGFueT47XG5cbiAgICBwcm90ZWN0ZWQgYXBpUHVzaDogU29ja2V0O1xuICAgIHByb3RlY3RlZCBhcGlQdWxsOiBTb2NrZXQ7XG4gICAgcHJvdGVjdGVkIHdvcmtlclB1c2g6IFNvY2tldDtcbiAgICBwcm90ZWN0ZWQgd29ya2VyUHVsbDogU29ja2V0O1xuXG4gICAgcmVhZG9ubHkgbWF4VGltZW91dDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgY29uZmlnOiBDb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgICAgIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyLFxuICAgICAgICAgICAgICAgIEBpbmplY3QoRElfQ09OVEFJTkVSKSByZWFkb25seSBjb250YWluZXI6IERlcGVuZGVuY3lDb250YWluZXIsXG4gICAgICAgICAgICAgICAgQGluamVjdEFsbChKT0IpIGpvYlR5cGVzOiBUeXBlPElKb2I+W10pIHtcbiAgICAgICAgdGhpcy5qb2JUeXBlcyA9IGpvYlR5cGVzIHx8IFtdO1xuICAgICAgICB0aGlzLmpvYnMgPSB0aGlzLmpvYlR5cGVzLnJlZHVjZSgocmVzLCBqb2JUeXBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBqb2JOYW1lID0gZ2V0Q29uc3RydWN0b3JOYW1lKGpvYlR5cGUpO1xuICAgICAgICAgICAgcmVzW2pvYk5hbWVdID0gKGpvYlBhcmFtczogSm9iUGFyYW1zLCB1bmlxdWVJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgam9iID0gdGhpcy5yZXNvbHZlSm9iSW5zdGFuY2Uoam9iVHlwZSwgam9iUGFyYW1zLCB1bmlxdWVJZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUJyaWRnZTogSU1lc3NhZ2VCcmlkZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlOiAobWVzc2FnZTogc3RyaW5nLCBwYXJhbXM/OiBTb2NrZXRQYXJhbXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy51bmlxdWVJZCA9IHVuaXF1ZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrZXJQdXNoLnNlbmQoW21lc3NhZ2UsIEpTT04uc3RyaW5naWZ5KHBhcmFtcyldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWVzc2FnZUJyaWRnZS5zZW5kTWVzc2FnZShgam9iLXN0YXJ0ZWRgLCB7bmFtZTogam9iTmFtZX0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBqb2IucHJvY2VzcyhtZXNzYWdlQnJpZGdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgdGhpcy5tZXNzYWdlcyA9IG5ldyBTdWJqZWN0PElTb2NrZXRNZXNzYWdlPigpO1xuICAgICAgICB0aGlzLnByb2Nlc3NpbmcgPSBudWxsO1xuICAgICAgICB0aGlzLm1heFRpbWVvdXQgPSB0aGlzLmNvbmZpZy5yZXNvbHZlKFwiam9iVGltZW91dFwiKTtcbiAgICB9XG5cbiAgICBvbihtZXNzYWdlOiBzdHJpbmcsIGNiOiAocGFyYW1zOiBTb2NrZXRQYXJhbXMpID0+IGFueSk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2VzXG4gICAgICAgICAgICAucGlwZShmaWx0ZXIodCA9PiB0Lm1lc3NhZ2UgPT09IG1lc3NhZ2UpKVxuICAgICAgICAgICAgLnBpcGUobWFwKHQgPT4gdC5wYXJhbXMpKS5zdWJzY3JpYmUoY2IpO1xuICAgIH1cblxuICAgIGFzeW5jIHByb2Nlc3Moam9iVHlwZTogVHlwZTxJSm9iPiwgcGFyYW1zOiBKb2JQYXJhbXMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGxldCBpbnN0YW5jZTogSUpvYiA9IG51bGw7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IHRoaXMucmVzb2x2ZUpvYkluc3RhbmNlKGpvYlR5cGUsIHBhcmFtcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGpvYk5hbWUgPSBnZXRDb25zdHJ1Y3Rvck5hbWUoam9iVHlwZSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHJlc29sdmUgcGFyYW1zIGZvciBqb2I6ICR7am9iTmFtZX0sIHdpdGggcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KHBhcmFtcyl9LiBSZWFzb246ICR7ZX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zdGFuY2UucHJvY2VzcygpO1xuICAgIH1cblxuICAgIGFzeW5jIGVucXVldWVXaXRoTmFtZShuYW1lOiBzdHJpbmcsIHBhcmFtczogSm9iUGFyYW1zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kVG9Xb3JrZXJzKHRoaXMudHJ5UmVzb2x2ZUZyb21OYW1lKG5hbWUsIHBhcmFtcyksIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgYXN5bmMgZW5xdWV1ZShqb2JUeXBlOiBUeXBlPElKb2I+LCBwYXJhbXM6IEpvYlBhcmFtcyA9IHt9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvV29ya2Vycyh0aGlzLnRyeVJlc29sdmVBbmRJbml0KGpvYlR5cGUsIHBhcmFtcyksIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgc2NoZWR1bGUobWludXRlOiBKb2JTY2hlZHVsZVRpbWUsIGhvdXI6IEpvYlNjaGVkdWxlVGltZSwgZGF5T2ZNb250aDogSm9iU2NoZWR1bGVUaW1lLCBtb250aDogSm9iU2NoZWR1bGVUaW1lLCBkYXlPZldlZWs6IEpvYlNjaGVkdWxlVGltZSwgam9iVHlwZTogVHlwZTxJSm9iPiwgcGFyYW1zOiBKb2JQYXJhbXMgPSB7fSk6IElKb2JUYXNrIHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IFttaW51dGUsIGhvdXIsIGRheU9mTW9udGgsIG1vbnRoLCBkYXlPZldlZWtdLm1hcCh0ID0+IHtcbiAgICAgICAgICAgIGlmIChpc09iamVjdCh0KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdCBhcyBKb2JTY2hlZHVsZVJhbmdlO1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHtyYW5nZS5taW4gfHwgMH0tJHtyYW5nZS5tYXggfHwgMH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQXJyYXkodCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5qb2luKFwiLFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBgJHt0fWA7XG4gICAgICAgIH0pLmpvaW4oXCIgXCIpO1xuICAgICAgICBjb25zdCBqb2JOYW1lID0gZ2V0Q29uc3RydWN0b3JOYW1lKGpvYlR5cGUpO1xuICAgICAgICBpZiAoIWNyb24udmFsaWRhdGUoZXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhcImpvYi1tYW5hZ2VyXCIsIGBDYW4ndCBzY2hlZHVsZSB0aGUgdGFzazogJyR7am9iTmFtZX0nIGJlY2F1c2UgdGltZSBleHByZXNzaW9uIGlzIGludmFsaWQuYCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3Jvbi5zY2hlZHVsZShleHByZXNzaW9uLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVucXVldWUoam9iVHlwZSwgcGFyYW1zKS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJqb2ItbWFuYWdlclwiLCBgQ2FuJ3QgZW5xdWV1ZSBqb2I6ICcke2pvYk5hbWV9JyBiZWNhdXNlOiAke2V9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGluaXRQcm9jZXNzaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBob3N0ID0gdGhpcy5jb25maWcucmVzb2x2ZShcInptcVJlbW90ZUhvc3RcIik7XG4gICAgICAgIGNvbnN0IHB1c2hIb3N0ID0gYCR7aG9zdH06JHt0aGlzLmNvbmZpZy5yZXNvbHZlKFwiem1xQmFja1BvcnRcIil9YDtcbiAgICAgICAgdGhpcy53b3JrZXJQdXNoID0gc29ja2V0KFwicHVzaFwiKTtcbiAgICAgICAgdGhpcy53b3JrZXJQdXNoLmNvbm5lY3QocHVzaEhvc3QpO1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJqb2ItbWFuYWdlclwiLCBgV29ya2VyIHByb2R1Y2VyIGNvbm5lY3RlZCB0bzogJHtwdXNoSG9zdH1gKTtcblxuICAgICAgICBjb25zdCBwdWxsSG9zdCA9IGAke2hvc3R9OiR7dGhpcy5jb25maWcucmVzb2x2ZShcInptcVBvcnRcIil9YDtcbiAgICAgICAgdGhpcy53b3JrZXJQdWxsID0gc29ja2V0KFwicHVsbFwiKTtcbiAgICAgICAgdGhpcy53b3JrZXJQdWxsLmNvbm5lY3QocHVsbEhvc3QpO1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJqb2ItbWFuYWdlclwiLCBgV29ya2VyIGNvbnN1bWVyIGNvbm5lY3RlZCB0bzogJHtwdWxsSG9zdH1gKTtcblxuICAgICAgICB0aGlzLndvcmtlclB1bGwub24oXCJtZXNzYWdlXCIsIGFzeW5jIChuYW1lOiBCdWZmZXIsIGFyZ3M6IEJ1ZmZlciwgdW5pcUlkOiBCdWZmZXIpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgam9iTmFtZSA9IG5hbWUudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGpvYlBhcmFtcyA9IEpTT04ucGFyc2UoYXJncy50b1N0cmluZyhcInV0ZjhcIikpIGFzIEpvYlBhcmFtcztcbiAgICAgICAgICAgICAgICBjb25zdCB1bmlxdWVJZCA9IHVuaXFJZD8udG9TdHJpbmcoXCJ1dGY4XCIpO1xuXG4gICAgICAgICAgICAgICAgY29uc29sZS50aW1lKHVuaXF1ZUlkKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVMb2codW5pcXVlSWQsIGBTdGFydGVkIHdvcmtpbmcgb24gYmFja2dyb3VuZCBqb2I6ICR7Y29sb3JpemUoam9iTmFtZSwgQ29uc29sZUNvbG9yLkZnQ3lhbil9IHdpdGggYXJnczogXFxuJHtqc29uSGlnaGxpZ2h0KGpvYlBhcmFtcyl9XFxuXFxuYCk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW3RoaXMuam9ic1tqb2JOYW1lXShqb2JQYXJhbXMsIHVuaXF1ZUlkKSwgcHJvbWlzZVRpbWVvdXQodGhpcy5tYXhUaW1lb3V0LCB0cnVlKV0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVMb2codW5pcXVlSWQsIGBGaW5pc2hlZCB3b3JraW5nIG9uIGJhY2tncm91bmQgam9iOiAke2NvbG9yaXplKGpvYk5hbWUsIENvbnNvbGVDb2xvci5GZ0N5YW4pfVxcblxcbmApO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lTG9nKHVuaXF1ZUlkLCBgQmFja2dyb3VuZCBqb2IgZmFpbGVkOiAke2NvbG9yaXplKGpvYk5hbWUsIENvbnNvbGVDb2xvci5GZ1JlZCl9XFxuJHtlfVxcblxcbmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVFbmQodW5pcXVlSWQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhcImpvYi1tYW5hZ2VyXCIsIGBGYWlsZWQgdG8gc3RhcnQgam9iOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhcnRQcm9jZXNzaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnByb2Nlc3NpbmcgPSB0aGlzLnByb2Nlc3NpbmcgfHwgdGhpcy5pbml0UHJvY2Vzc2luZygpO1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzaW5nO1xuICAgIH1cblxuICAgIHRyeVJlc29sdmUoam9iVHlwZTogVHlwZTxJSm9iPiwgcGFyYW1zOiBKb2JQYXJhbXMpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBqb2JOYW1lID0gZ2V0Q29uc3RydWN0b3JOYW1lKGpvYlR5cGUpO1xuICAgICAgICBpZiAoIXRoaXMuam9ic1tqb2JOYW1lXSkge1xuICAgICAgICAgICAgdGhyb3cgYENhbid0IGZpbmQgam9iIHdpdGggbmFtZTogJHtqb2JOYW1lfSBzbyBpdCBjYW4ndCBiZSBlbnF1ZXVlZCFgO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVKb2JJbnN0YW5jZShqb2JUeXBlLCBwYXJhbXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBgQ2FuJ3QgcmVzb2x2ZSBwYXJhbXMgZm9yIGpvYjogJHtqb2JOYW1lfSwgd2l0aCBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX0uIFJlYXNvbjogJHtlfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpvYk5hbWU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRyeVJlc29sdmVGcm9tTmFtZShqb2JOYW1lOiBzdHJpbmcsIHBhcmFtczogSm9iUGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IGpvYlR5cGUgPSB0aGlzLmpvYlR5cGVzLmZpbmQodHlwZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29uc3RydWN0b3JOYW1lKHR5cGUpID09IGpvYk5hbWU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWpvYlR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IGBDYW4ndCBmaW5kIGpvYiB0eXBlIHdpdGggbmFtZTogJHtqb2JOYW1lfSBzbyBpdCBjYW4ndCBiZSBlbnF1ZXVlZCFgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRyeVJlc29sdmVBbmRJbml0KGpvYlR5cGUsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRyeVJlc29sdmVBbmRJbml0KGpvYlR5cGU6IFR5cGU8SUpvYj4sIHBhcmFtczogSm9iUGFyYW1zKSB7XG4gICAgICAgIGlmICghdGhpcy5hcGlQdXNoKSB7XG4gICAgICAgICAgICBjb25zdCBwb3J0ID0gdGhpcy5jb25maWcucmVzb2x2ZShcInptcVBvcnRcIik7XG4gICAgICAgICAgICB0aGlzLmFwaVB1c2ggPSBzb2NrZXQoXCJwdXNoXCIpO1xuICAgICAgICAgICAgdGhpcy5hcGlQdXNoLmJpbmQoYHRjcDovLzAuMC4wLjA6JHtwb3J0fWApO1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKFwiam9iLW1hbmFnZXJcIiwgYEFQSSBwcm9kdWNlciBib3VuZCB0byBwb3J0OiAke3BvcnR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmFwaVB1bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhY2tQb3J0ID0gdGhpcy5jb25maWcucmVzb2x2ZShcInptcUJhY2tQb3J0XCIpO1xuICAgICAgICAgICAgdGhpcy5hcGlQdWxsID0gc29ja2V0KFwicHVsbFwiKTtcbiAgICAgICAgICAgIHRoaXMuYXBpUHVsbC5iaW5kKGB0Y3A6Ly8wLjAuMC4wOiR7YmFja1BvcnR9YCk7XG4gICAgICAgICAgICB0aGlzLmFwaVB1bGwub24oXCJtZXNzYWdlXCIsIChuYW1lOiBCdWZmZXIsIGFyZ3M/OiBCdWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gbmFtZS50b1N0cmluZyhcInV0ZjhcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gSlNPTi5wYXJzZShhcmdzPy50b1N0cmluZyhcInV0ZjhcIikgfHwgXCJ7fVwiKSBhcyBKb2JQYXJhbXM7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1UeXBlcyA9IE9iamVjdC5rZXlzKHBhcmFtcykucmVkdWNlKChyZXMsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNba2V5XSA9IGdldFR5cGUocGFyYW1zW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJqb2ItbWFuYWdlclwiLCBgUmVjZWl2ZWQgYSBtZXNzYWdlIGZyb20gd29ya2VyOiBcIiR7Y29sb3JpemUobWVzc2FnZSwgQ29uc29sZUNvbG9yLkZnQ3lhbil9XCIgd2l0aCBhcmdzOiAke2pzb25IaWdobGlnaHQocGFyYW1UeXBlcyl9XFxuXFxuYCk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlcy5uZXh0KHttZXNzYWdlLCBwYXJhbXN9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKFwiam9iLW1hbmFnZXJcIiwgYEFQSSBjb25zdW1lciBib3VuZCB0byBwb3J0OiAke2JhY2tQb3J0fWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRyeVJlc29sdmUoam9iVHlwZSwgcGFyYW1zKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVzb2x2ZUpvYkluc3RhbmNlKGpvYlR5cGU6IFR5cGU8SUpvYj4sIHBhcmFtczogSm9iUGFyYW1zLCB1bmlxdWVJZDogc3RyaW5nID0gXCJcIikge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5jcmVhdGVDaGlsZENvbnRhaW5lcigpO1xuICAgICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLm1hcCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKG5hbWUsIHt1c2VWYWx1ZTogcGFyYW1zW25hbWVdfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb250YWluZXIucmVnaXN0ZXIoXCJ1bmlxdWVJZFwiLCB7dXNlVmFsdWU6IHVuaXF1ZUlkfSk7XG4gICAgICAgIGNvbnRhaW5lci5yZWdpc3Rlcihqb2JUeXBlLCBqb2JUeXBlKTtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5yZXNvbHZlKGpvYlR5cGUpIGFzIElKb2I7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIHNlbmRUb1dvcmtlcnMoam9iTmFtZTogc3RyaW5nLCBwYXJhbXM6IEpvYlBhcmFtcykge1xuICAgICAgICBjb25zdCB1bmlxdWVJZCA9IG5ldyBPYmplY3RJZCgpLnRvSGV4U3RyaW5nKCk7XG4gICAgICAgIHRoaXMuYXBpUHVzaC5zZW5kKFtqb2JOYW1lLCBKU09OLnN0cmluZ2lmeShwYXJhbXMpLCB1bmlxdWVJZF0pO1xuICAgICAgICByZXR1cm4gdW5pcXVlSWQ7XG4gICAgfVxufVxuIl19
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvam9iLW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBc0IsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDM0UsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBQyxNQUFNLEVBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5QixPQUFPLEVBQ0gsWUFBWSxFQUtaLEdBQUcsRUFNTixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDSCxRQUFRLEVBQ1IsWUFBWSxFQUNaLGtCQUFrQixFQUNsQixPQUFPLEVBQ1AsT0FBTyxFQUNQLFFBQVEsRUFDUixhQUFhLEVBQ2IsY0FBYyxFQUNqQixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUd6QixJQUFNLFVBQVUsR0FBaEIsTUFBTSxVQUFVO0lBYUU7SUFDQTtJQUNzQjtJQWJqQyxRQUFRLENBQWU7SUFDdkIsSUFBSSxDQUErRTtJQUNuRixRQUFRLENBQTBCO0lBRWxDLE9BQU8sQ0FBa0I7SUFDekIsT0FBTyxDQUFrQjtJQUN6QixVQUFVLENBQWtCO0lBQzVCLFVBQVUsQ0FBa0I7SUFFN0IsVUFBVSxDQUFTO0lBRTVCLFlBQXFCLE1BQXFCLEVBQ3JCLE1BQWMsRUFDUSxTQUE4QixFQUM3QyxRQUFzQjtRQUg3QixXQUFNLEdBQU4s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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEZXBlbmRlbmN5Q29udGFpbmVyLCBpbmplY3QsIGluamVjdEFsbCwgc2luZ2xldG9ufSBmcm9tIFwidHN5cmluZ2VcIjtcbmltcG9ydCBjcm9uIGZyb20gXCJub2RlLWNyb25cIjtcbmltcG9ydCB7c29ja2V0LCBTb2NrZXR9IGZyb20gXCJ6ZXJvbXEvdjUtY29tcGF0XCI7XG5pbXBvcnQge1N1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7ZmlsdGVyLCBtYXB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHtPYmplY3RJZH0gZnJvbSBcImJzb25cIjtcbmltcG9ydCB7XG4gICAgRElfQ09OVEFJTkVSLFxuICAgIElKb2IsXG4gICAgSUpvYlRhc2ssXG4gICAgSU1lc3NhZ2VCcmlkZ2UsXG4gICAgSVNvY2tldE1lc3NhZ2UsXG4gICAgSk9CLFxuICAgIEpvYlBhcmFtcyxcbiAgICBKb2JTY2hlZHVsZVJhbmdlLFxuICAgIEpvYlNjaGVkdWxlVGltZSxcbiAgICBTb2NrZXRQYXJhbXMsXG4gICAgVHlwZVxufSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XG5pbXBvcnQge1xuICAgIGNvbG9yaXplLFxuICAgIENvbnNvbGVDb2xvcixcbiAgICBnZXRDb25zdHJ1Y3Rvck5hbWUsXG4gICAgZ2V0VHlwZSxcbiAgICBpc0FycmF5LFxuICAgIGlzT2JqZWN0LFxuICAgIGpzb25IaWdobGlnaHQsXG4gICAgcHJvbWlzZVRpbWVvdXRcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge0NvbmZpZ3VyYXRpb259IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB7TG9nZ2VyfSBmcm9tIFwiLi9sb2dnZXJcIjtcblxuQHNpbmdsZXRvbigpXG5leHBvcnQgY2xhc3MgSm9iTWFuYWdlciB7XG5cbiAgICBwcm90ZWN0ZWQgam9iVHlwZXM6IFR5cGU8SUpvYj5bXTtcbiAgICBwcm90ZWN0ZWQgam9iczogeyBbbmFtZTogc3RyaW5nXTogKGpvYlBhcmFtczogSm9iUGFyYW1zLCB1bmlxdWVJZDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT4gfTtcbiAgICBwcm90ZWN0ZWQgbWVzc2FnZXM6IFN1YmplY3Q8SVNvY2tldE1lc3NhZ2U+O1xuXG4gICAgcHJvdGVjdGVkIGFwaVB1c2g6IFByb21pc2U8U29ja2V0PjtcbiAgICBwcm90ZWN0ZWQgYXBpUHVsbDogUHJvbWlzZTxTb2NrZXQ+O1xuICAgIHByb3RlY3RlZCB3b3JrZXJQdXNoOiBQcm9taXNlPFNvY2tldD47XG4gICAgcHJvdGVjdGVkIHdvcmtlclB1bGw6IFByb21pc2U8U29ja2V0PjtcblxuICAgIHJlYWRvbmx5IG1heFRpbWVvdXQ6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbmZpZzogQ29uZmlndXJhdGlvbixcbiAgICAgICAgICAgICAgICByZWFkb25seSBsb2dnZXI6IExvZ2dlcixcbiAgICAgICAgICAgICAgICBAaW5qZWN0KERJX0NPTlRBSU5FUikgcmVhZG9ubHkgY29udGFpbmVyOiBEZXBlbmRlbmN5Q29udGFpbmVyLFxuICAgICAgICAgICAgICAgIEBpbmplY3RBbGwoSk9CKSBqb2JUeXBlczogVHlwZTxJSm9iPltdKSB7XG4gICAgICAgIHRoaXMuam9iVHlwZXMgPSBqb2JUeXBlcyB8fCBbXTtcbiAgICAgICAgdGhpcy5qb2JzID0gdGhpcy5qb2JUeXBlcy5yZWR1Y2UoKHJlcywgam9iVHlwZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgam9iTmFtZSA9IGdldENvbnN0cnVjdG9yTmFtZShqb2JUeXBlKTtcbiAgICAgICAgICAgIHJlc1tqb2JOYW1lXSA9IChqb2JQYXJhbXM6IEpvYlBhcmFtcywgdW5pcXVlSWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGpvYiA9IHRoaXMucmVzb2x2ZUpvYkluc3RhbmNlKGpvYlR5cGUsIGpvYlBhcmFtcywgdW5pcXVlSWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VCcmlkZ2U6IElNZXNzYWdlQnJpZGdlID0ge1xuICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZTogKG1lc3NhZ2U6IHN0cmluZywgcGFyYW1zPzogU29ja2V0UGFyYW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMudW5pcXVlSWQgPSB1bmlxdWVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud29ya2VyUHVzaC50aGVuKHNvY2sgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2suc2VuZChbbWVzc2FnZSwgSlNPTi5zdHJpbmdpZnkocGFyYW1zKV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VCcmlkZ2Uuc2VuZE1lc3NhZ2UoYGpvYi1zdGFydGVkYCwge25hbWU6IGpvYk5hbWV9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gam9iLnByb2Nlc3MobWVzc2FnZUJyaWRnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIHRoaXMubWVzc2FnZXMgPSBuZXcgU3ViamVjdDxJU29ja2V0TWVzc2FnZT4oKTtcbiAgICAgICAgdGhpcy5tYXhUaW1lb3V0ID0gdGhpcy5jb25maWcucmVzb2x2ZShcImpvYlRpbWVvdXRcIik7XG4gICAgfVxuXG4gICAgb24obWVzc2FnZTogc3RyaW5nLCBjYjogKHBhcmFtczogU29ja2V0UGFyYW1zKSA9PiBhbnkpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlc1xuICAgICAgICAgICAgLnBpcGUoZmlsdGVyKHQgPT4gdC5tZXNzYWdlID09PSBtZXNzYWdlKSlcbiAgICAgICAgICAgIC5waXBlKG1hcCh0ID0+IHQucGFyYW1zKSkuc3Vic2NyaWJlKGNiKTtcbiAgICB9XG5cbiAgICBhc3luYyBwcm9jZXNzKGpvYlR5cGU6IFR5cGU8SUpvYj4sIHBhcmFtczogSm9iUGFyYW1zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBsZXQgaW5zdGFuY2U6IElKb2IgPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5zdGFuY2UgPSB0aGlzLnJlc29sdmVKb2JJbnN0YW5jZShqb2JUeXBlLCBwYXJhbXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zdCBqb2JOYW1lID0gZ2V0Q29uc3RydWN0b3JOYW1lKGpvYlR5cGUpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCByZXNvbHZlIHBhcmFtcyBmb3Igam9iOiAke2pvYk5hbWV9LCB3aXRoIHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShwYXJhbXMpfS4gUmVhc29uOiAke2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnByb2Nlc3MoKTtcbiAgICB9XG5cbiAgICBhc3luYyBlbnF1ZXVlV2l0aE5hbWUobmFtZTogc3RyaW5nLCBwYXJhbXM6IEpvYlBhcmFtcyA9IHt9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFRvV29ya2Vycyh0aGlzLnRyeVJlc29sdmVGcm9tTmFtZShuYW1lLCBwYXJhbXMpLCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGFzeW5jIGVucXVldWUoam9iVHlwZTogVHlwZTxJSm9iPiwgcGFyYW1zOiBKb2JQYXJhbXMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmRUb1dvcmtlcnModGhpcy50cnlSZXNvbHZlQW5kSW5pdChqb2JUeXBlLCBwYXJhbXMpLCBwYXJhbXMpO1xuICAgIH1cblxuICAgIHNjaGVkdWxlKG1pbnV0ZTogSm9iU2NoZWR1bGVUaW1lLCBob3VyOiBKb2JTY2hlZHVsZVRpbWUsIGRheU9mTW9udGg6IEpvYlNjaGVkdWxlVGltZSwgbW9udGg6IEpvYlNjaGVkdWxlVGltZSwgZGF5T2ZXZWVrOiBKb2JTY2hlZHVsZVRpbWUsIGpvYlR5cGU6IFR5cGU8SUpvYj4sIHBhcmFtczogSm9iUGFyYW1zID0ge30pOiBJSm9iVGFzayB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBbbWludXRlLCBob3VyLCBkYXlPZk1vbnRoLCBtb250aCwgZGF5T2ZXZWVrXS5tYXAodCA9PiB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QodCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IHQgYXMgSm9iU2NoZWR1bGVSYW5nZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7cmFuZ2UubWluIHx8IDB9LSR7cmFuZ2UubWF4IHx8IDB9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0FycmF5KHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQuam9pbihcIixcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYCR7dH1gO1xuICAgICAgICB9KS5qb2luKFwiIFwiKTtcbiAgICAgICAgY29uc3Qgam9iTmFtZSA9IGdldENvbnN0cnVjdG9yTmFtZShqb2JUeXBlKTtcbiAgICAgICAgaWYgKCFjcm9uLnZhbGlkYXRlKGV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJqb2ItbWFuYWdlclwiLCBgQ2FuJ3Qgc2NoZWR1bGUgdGhlIHRhc2s6ICcke2pvYk5hbWV9JyBiZWNhdXNlIHRpbWUgZXhwcmVzc2lvbiBpcyBpbnZhbGlkLmApO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNyb24uc2NoZWR1bGUoZXhwcmVzc2lvbiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbnF1ZXVlKGpvYlR5cGUsIHBhcmFtcykuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKFwiam9iLW1hbmFnZXJcIiwgYENhbid0IGVucXVldWUgam9iOiAnJHtqb2JOYW1lfScgYmVjYXVzZTogJHtlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIHN0YXJ0UHJvY2Vzc2luZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgaG9zdCA9IHRoaXMuY29uZmlnLnJlc29sdmUoXCJ6bXFSZW1vdGVIb3N0XCIpO1xuICAgICAgICBjb25zdCBwdXNoSG9zdCA9IGAke2hvc3R9OiR7dGhpcy5jb25maWcucmVzb2x2ZShcInptcUJhY2tQb3J0XCIpfWA7XG4gICAgICAgIGNvbnN0IHB1bGxIb3N0ID0gYCR7aG9zdH06JHt0aGlzLmNvbmZpZy5yZXNvbHZlKFwiem1xUG9ydFwiKX1gO1xuICAgICAgICB0aGlzLndvcmtlclB1c2ggPSB0aGlzLndvcmtlclB1c2ggfHwgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb2NrID0gc29ja2V0KFwicHVzaFwiKTtcbiAgICAgICAgICAgIHNvY2suY29ubmVjdChwdXNoSG9zdCk7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJqb2ItbWFuYWdlclwiLCBgV29ya2VyIHByb2R1Y2VyIGNvbm5lY3RlZCB0bzogJHtwdXNoSG9zdH1gKTtcbiAgICAgICAgICAgIHJlc29sdmUoc29jayk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLndvcmtlclB1bGwgPSB0aGlzLndvcmtlclB1bGwgfHwgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb2NrID0gc29ja2V0KFwicHVsbFwiKTtcbiAgICAgICAgICAgIHNvY2suY29ubmVjdChwdWxsSG9zdCk7XG4gICAgICAgICAgICBzb2NrLm9uKFwibWVzc2FnZVwiLCBhc3luYyAobmFtZTogQnVmZmVyLCBhcmdzOiBCdWZmZXIsIHVuaXFJZDogQnVmZmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgam9iTmFtZSA9IG5hbWUudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBqb2JQYXJhbXMgPSBKU09OLnBhcnNlKGFyZ3MudG9TdHJpbmcoXCJ1dGY4XCIpKSBhcyBKb2JQYXJhbXM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUlkID0gdW5pcUlkPy50b1N0cmluZyhcInV0ZjhcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lKHVuaXF1ZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lTG9nKHVuaXF1ZUlkLCBgU3RhcnRlZCB3b3JraW5nIG9uIGJhY2tncm91bmQgam9iOiAke2NvbG9yaXplKGpvYk5hbWUsIENvbnNvbGVDb2xvci5GZ0N5YW4pfSB3aXRoIGFyZ3M6IFxcbiR7anNvbkhpZ2hsaWdodChqb2JQYXJhbXMpfVxcblxcbmApO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW3RoaXMuam9ic1tqb2JOYW1lXShqb2JQYXJhbXMsIHVuaXF1ZUlkKSwgcHJvbWlzZVRpbWVvdXQodGhpcy5tYXhUaW1lb3V0LCB0cnVlKV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lTG9nKHVuaXF1ZUlkLCBgRmluaXNoZWQgd29ya2luZyBvbiBiYWNrZ3JvdW5kIGpvYjogJHtjb2xvcml6ZShqb2JOYW1lLCBDb25zb2xlQ29sb3IuRmdDeWFuKX1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lTG9nKHVuaXF1ZUlkLCBgQmFja2dyb3VuZCBqb2IgZmFpbGVkOiAke2NvbG9yaXplKGpvYk5hbWUsIENvbnNvbGVDb2xvci5GZ1JlZCl9XFxuJHtlfVxcblxcbmApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZUVuZCh1bmlxdWVJZCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJqb2ItbWFuYWdlclwiLCBgRmFpbGVkIHRvIHN0YXJ0IGpvYjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJqb2ItbWFuYWdlclwiLCBgV29ya2VyIGNvbnN1bWVyIGNvbm5lY3RlZCB0bzogJHtwdWxsSG9zdH1gKTtcbiAgICAgICAgICAgIHJlc29sdmUoc29jayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgICAgICB0aGlzLndvcmtlclB1c2gsXG4gICAgICAgICAgICB0aGlzLndvcmtlclB1bGwsXG4gICAgICAgIF0pO1xuICAgIH1cblxuICAgIHRyeVJlc29sdmUoam9iVHlwZTogVHlwZTxJSm9iPiwgcGFyYW1zOiBKb2JQYXJhbXMpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBqb2JOYW1lID0gZ2V0Q29uc3RydWN0b3JOYW1lKGpvYlR5cGUpO1xuICAgICAgICBpZiAoIXRoaXMuam9ic1tqb2JOYW1lXSkge1xuICAgICAgICAgICAgdGhyb3cgYENhbid0IGZpbmQgam9iIHdpdGggbmFtZTogJHtqb2JOYW1lfSBzbyBpdCBjYW4ndCBiZSBlbnF1ZXVlZCFgO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVKb2JJbnN0YW5jZShqb2JUeXBlLCBwYXJhbXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBgQ2FuJ3QgcmVzb2x2ZSBwYXJhbXMgZm9yIGpvYjogJHtqb2JOYW1lfSwgd2l0aCBwYXJhbXM6ICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX0uIFJlYXNvbjogJHtlfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpvYk5hbWU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRyeVJlc29sdmVGcm9tTmFtZShqb2JOYW1lOiBzdHJpbmcsIHBhcmFtczogSm9iUGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IGpvYlR5cGUgPSB0aGlzLmpvYlR5cGVzLmZpbmQodHlwZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29uc3RydWN0b3JOYW1lKHR5cGUpID09IGpvYk5hbWU7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWpvYlR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IGBDYW4ndCBmaW5kIGpvYiB0eXBlIHdpdGggbmFtZTogJHtqb2JOYW1lfSBzbyBpdCBjYW4ndCBiZSBlbnF1ZXVlZCFgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRyeVJlc29sdmVBbmRJbml0KGpvYlR5cGUsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRyeVJlc29sdmVBbmRJbml0KGpvYlR5cGU6IFR5cGU8SUpvYj4sIHBhcmFtczogSm9iUGFyYW1zKSB7XG4gICAgICAgIHRoaXMuYXBpUHVzaCA9IHRoaXMuYXBpUHVzaCB8fCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBvcnQgPSB0aGlzLmNvbmZpZy5yZXNvbHZlKFwiem1xUG9ydFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHNvY2sgPSBzb2NrZXQoXCJwdXNoXCIpO1xuICAgICAgICAgICAgc29jay5iaW5kKGB0Y3A6Ly8wLjAuMC4wOiR7cG9ydH1gLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKFwiam9iLW1hbmFnZXJcIiwgYEFQSSBwcm9kdWNlciBib3VuZCB0byBwb3J0OiAke3BvcnR9YCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShzb2NrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hcGlQdWxsID0gdGhpcy5hcGlQdXNoIHx8IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmFja1BvcnQgPSB0aGlzLmNvbmZpZy5yZXNvbHZlKFwiem1xQmFja1BvcnRcIik7XG4gICAgICAgICAgICBjb25zdCBzb2NrID0gc29ja2V0KFwicHVsbFwiKTtcbiAgICAgICAgICAgIHNvY2suYmluZChgdGNwOi8vMC4wLjAuMDoke2JhY2tQb3J0fWAsICgpID0+IHtcbiAgICAgICAgICAgICAgICBzb2NrLm9uKFwibWVzc2FnZVwiLCAobmFtZTogQnVmZmVyLCBhcmdzPzogQnVmZmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuYW1lLnRvU3RyaW5nKFwidXRmOFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gSlNPTi5wYXJzZShhcmdzPy50b1N0cmluZyhcInV0ZjhcIikgfHwgXCJ7fVwiKSBhcyBKb2JQYXJhbXM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtVHlwZXMgPSBPYmplY3Qua2V5cyhwYXJhbXMpLnJlZHVjZSgocmVzLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1trZXldID0gZ2V0VHlwZShwYXJhbXNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhcImpvYi1tYW5hZ2VyXCIsIGBSZWNlaXZlZCBhIG1lc3NhZ2UgZnJvbSB3b3JrZXI6IFwiJHtjb2xvcml6ZShtZXNzYWdlLCBDb25zb2xlQ29sb3IuRmdDeWFuKX1cIiB3aXRoIGFyZ3M6ICR7anNvbkhpZ2hsaWdodChwYXJhbVR5cGVzKX1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlcy5uZXh0KHttZXNzYWdlLCBwYXJhbXN9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coXCJqb2ItbWFuYWdlclwiLCBgQVBJIGNvbnN1bWVyIGJvdW5kIHRvIHBvcnQ6ICR7YmFja1BvcnR9YCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShzb2NrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJ5UmVzb2x2ZShqb2JUeXBlLCBwYXJhbXMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZXNvbHZlSm9iSW5zdGFuY2Uoam9iVHlwZTogVHlwZTxJSm9iPiwgcGFyYW1zOiBKb2JQYXJhbXMsIHVuaXF1ZUlkOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLmNyZWF0ZUNoaWxkQ29udGFpbmVyKCk7XG4gICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKChuYW1lKSA9PiB7XG4gICAgICAgICAgICBjb250YWluZXIucmVnaXN0ZXIobmFtZSwge3VzZVZhbHVlOiBwYXJhbXNbbmFtZV19KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRhaW5lci5yZWdpc3RlcihcInVuaXF1ZUlkXCIsIHt1c2VWYWx1ZTogdW5pcXVlSWR9KTtcbiAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyKGpvYlR5cGUsIGpvYlR5cGUpO1xuICAgICAgICByZXR1cm4gY29udGFpbmVyLnJlc29sdmUoam9iVHlwZSkgYXMgSUpvYjtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgc2VuZFRvV29ya2Vycyhqb2JOYW1lOiBzdHJpbmcsIHBhcmFtczogSm9iUGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHVuaXF1ZUlkID0gbmV3IE9iamVjdElkKCkudG9IZXhTdHJpbmcoKTtcbiAgICAgICAgY29uc3Qgc29jayA9IGF3YWl0IHRoaXMuYXBpUHVzaDtcbiAgICAgICAgc29jay5zZW5kKFtqb2JOYW1lLCBKU09OLnN0cmluZ2lmeShwYXJhbXMpLCB1bmlxdWVJZF0pO1xuICAgICAgICByZXR1cm4gdW5pcXVlSWQ7XG4gICAgfVxufVxuIl19