@stemy/backend 5.2.2 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commands/clear-command.d.ts +6 -6
- package/commands/fixtures-command.d.ts +9 -9
- package/commands/index.d.ts +2 -2
- package/common-types.d.ts +325 -326
- package/esm2022/commands/clear-command.mjs +15 -0
- package/esm2022/commands/fixtures-command.mjs +26 -0
- package/esm2022/commands/index.mjs +7 -0
- package/esm2022/common-types.mjs +26 -0
- package/esm2022/fixtures/index.mjs +5 -0
- package/esm2022/fixtures/ttl.fixture.mjs +23 -0
- package/esm2022/public_api.mjs +378 -0
- package/esm2022/requests/asset-image-params.mjs +60 -0
- package/esm2022/rest-controllers/assets.controller.mjs +177 -0
- package/esm2022/rest-controllers/auth.controller.mjs +57 -0
- package/esm2022/rest-controllers/gallery.controller.mjs +27 -0
- package/esm2022/rest-controllers/progresses.controller.mjs +38 -0
- package/esm2022/rest-controllers/terminal-styles.mjs +67 -0
- package/esm2022/rest-controllers/terminal.controller.mjs +132 -0
- package/esm2022/rest-middlewares/container.middleware.mjs +22 -0
- package/esm2022/rest-middlewares/error-handler.middleware.mjs +79 -0
- package/esm2022/rest-middlewares/language.middleware.mjs +21 -0
- package/esm2022/rest-middlewares/request-ended.middleware.mjs +26 -0
- package/esm2022/rest-middlewares/request-started.middleware.mjs +25 -0
- package/esm2022/services/asset-processor.mjs +90 -0
- package/esm2022/services/asset-resolver.mjs +36 -0
- package/esm2022/services/assets.mjs +154 -0
- package/esm2022/services/backend-provider.mjs +83 -0
- package/esm2022/services/cache-processor.mjs +16 -0
- package/esm2022/services/cache.mjs +70 -0
- package/esm2022/services/configuration.mjs +68 -0
- package/esm2022/services/drivers/asset-grid.driver.mjs +27 -0
- package/esm2022/services/drivers/asset-local.driver.mjs +41 -0
- package/esm2022/services/endpoint-provider.mjs +13 -0
- package/esm2022/services/entities/asset.mjs +61 -0
- package/esm2022/services/entities/base-entity.mjs +32 -0
- package/esm2022/services/entities/lazy-asset.mjs +87 -0
- package/esm2022/services/entities/progress.mjs +182 -0
- package/esm2022/services/entities/temp-asset.mjs +53 -0
- package/esm2022/services/fixtures.mjs +38 -0
- package/esm2022/services/gallery-cache.mjs +29 -0
- package/esm2022/services/gallery-image.mjs +42 -0
- package/esm2022/services/gallery.mjs +124 -0
- package/esm2022/services/id-generator.mjs +49 -0
- package/esm2022/services/job-manager.mjs +198 -0
- package/esm2022/services/lazy-assets.mjs +68 -0
- package/esm2022/services/logger.mjs +26 -0
- package/esm2022/services/mail-sender.mjs +42 -0
- package/esm2022/services/memory-cache.mjs +61 -0
- package/esm2022/services/mongo-connector.mjs +36 -0
- package/esm2022/services/open-api.mjs +124 -0
- package/esm2022/services/progresses.mjs +93 -0
- package/esm2022/services/template-renderer.mjs +71 -0
- package/esm2022/services/terminal-manager.mjs +88 -0
- package/esm2022/services/token-generator.mjs +37 -0
- package/esm2022/services/translation-provider.mjs +39 -0
- package/esm2022/services/translator.mjs +67 -0
- package/esm2022/services/user-manager.mjs +27 -0
- package/esm2022/socket-controllers/progress.controller.mjs +63 -0
- package/esm2022/socket-controllers/terminal.controller.mjs +61 -0
- package/esm2022/socket-controllers/terminal.mjs +89 -0
- package/esm2022/socket-middlewares/compression.middleware.mjs +14 -0
- package/esm2022/static.mjs +23 -0
- package/esm2022/stemy-backend.mjs +5 -0
- package/esm2022/utilities/base-doc.mjs +33 -0
- package/esm2022/utilities/decorators.mjs +51 -0
- package/esm2022/utilities/di-container.mjs +88 -0
- package/esm2022/utilities/empty-job.mjs +13 -0
- package/esm2022/utilities/lazy-asset-generator.mjs +38 -0
- package/esm2022/utilities/mongoose.mjs +216 -0
- package/esm2022/utilities/tree.mjs +119 -0
- package/esm2022/utils.mjs +726 -0
- package/esm2022/validators.mjs +46 -0
- package/fesm2022/stemy-backend.mjs +4690 -0
- package/fesm2022/stemy-backend.mjs.map +1 -0
- package/fixtures/index.d.ts +2 -2
- package/fixtures/ttl.fixture.d.ts +7 -7
- package/index.d.ts +5 -5
- package/package.json +43 -49
- package/public_api.d.ts +44 -44
- package/requests/asset-image-params.d.ts +12 -12
- package/rest-controllers/assets.controller.d.ts +25 -27
- package/rest-controllers/auth.controller.d.ts +14 -14
- package/rest-controllers/gallery.controller.d.ts +6 -7
- package/rest-controllers/progresses.controller.d.ts +9 -9
- package/rest-controllers/terminal-styles.d.ts +2 -2
- package/rest-controllers/terminal.controller.d.ts +10 -10
- package/rest-middlewares/container.middleware.d.ts +8 -8
- package/rest-middlewares/error-handler.middleware.d.ts +13 -13
- package/rest-middlewares/language.middleware.d.ts +8 -8
- package/rest-middlewares/request-ended.middleware.d.ts +8 -8
- package/rest-middlewares/request-started.middleware.d.ts +8 -8
- package/services/asset-processor.d.ts +10 -11
- package/services/asset-resolver.d.ts +10 -10
- package/services/assets.d.ts +24 -26
- package/services/backend-provider.d.ts +19 -20
- package/services/cache-processor.d.ts +4 -4
- package/services/cache.d.ts +23 -23
- package/services/configuration.d.ts +15 -15
- package/services/drivers/asset-grid.driver.d.ts +11 -11
- package/services/drivers/asset-local.driver.d.ts +10 -11
- package/services/endpoint-provider.d.ts +4 -4
- package/services/entities/asset.d.ts +19 -21
- package/services/entities/base-entity.d.ts +13 -13
- package/services/entities/lazy-asset.d.ts +25 -25
- package/services/entities/progress.d.ts +49 -49
- package/services/entities/temp-asset.d.ts +20 -22
- package/services/fixtures.d.ts +8 -8
- package/services/gallery-cache.d.ts +8 -9
- package/services/gallery-image.d.ts +10 -11
- package/services/gallery.d.ts +13 -13
- package/services/id-generator.d.ts +11 -11
- package/services/job-manager.d.ts +35 -35
- package/services/lazy-assets.d.ts +22 -22
- package/services/logger.d.ts +8 -8
- package/services/mail-sender.d.ts +20 -20
- package/services/memory-cache.d.ts +10 -10
- package/services/mongo-connector.d.ts +12 -12
- package/services/open-api.d.ts +13 -13
- package/services/progresses.d.ts +20 -20
- package/services/template-renderer.d.ts +14 -14
- package/services/terminal-manager.d.ts +15 -15
- package/services/token-generator.d.ts +6 -6
- package/services/translation-provider.d.ts +9 -9
- package/services/translator.d.ts +15 -15
- package/services/user-manager.d.ts +6 -6
- package/socket-controllers/progress.controller.d.ts +10 -10
- package/socket-controllers/terminal.controller.d.ts +13 -13
- package/socket-controllers/terminal.d.ts +19 -20
- package/socket-middlewares/compression.middleware.d.ts +4 -4
- package/static.d.ts +2 -2
- package/utilities/base-doc.d.ts +40 -40
- package/utilities/decorators.d.ts +10 -10
- package/utilities/di-container.d.ts +43 -43
- package/utilities/empty-job.d.ts +4 -4
- package/utilities/lazy-asset-generator.d.ts +15 -15
- package/utilities/mongoose.d.ts +36 -36
- package/utilities/tree.d.ts +15 -15
- package/utils.d.ts +120 -123
- package/validators.d.ts +7 -7
|
@@ -0,0 +1,726 @@
|
|
|
1
|
+
import { mkdir, readFile as fsReadFile, unlink, writeFile as fsWriteFile } from "fs";
|
|
2
|
+
import { gzip, gunzip } from "zlib";
|
|
3
|
+
import { basename, dirname } from "path";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
import { exec as execChildProcess } from "child_process";
|
|
6
|
+
import { createHash } from "crypto";
|
|
7
|
+
import { from, Observable, Subject, Subscription } from "rxjs";
|
|
8
|
+
import { ObjectId } from "mongodb";
|
|
9
|
+
import mongoose from "mongoose";
|
|
10
|
+
import { PassThrough, Readable } from "stream";
|
|
11
|
+
import sharp_ from "sharp";
|
|
12
|
+
import { HttpError } from "routing-controllers";
|
|
13
|
+
import axios from "axios";
|
|
14
|
+
import { fileTypeFromStream as ftFromStream, fileTypeFromBuffer as ftFromBuffer } from "file-type/core";
|
|
15
|
+
const sharp = sharp_;
|
|
16
|
+
export const diContainers = {
|
|
17
|
+
appContainer: null
|
|
18
|
+
};
|
|
19
|
+
export function isNullOrUndefined(value) {
|
|
20
|
+
return value == null || typeof value == "undefined";
|
|
21
|
+
}
|
|
22
|
+
export function isDefined(value) {
|
|
23
|
+
return !isNullOrUndefined(value);
|
|
24
|
+
}
|
|
25
|
+
export function getType(obj) {
|
|
26
|
+
const regex = new RegExp("\\s([a-zA-Z]+)");
|
|
27
|
+
return Object.prototype.toString.call(obj).match(regex)[1].toLowerCase();
|
|
28
|
+
}
|
|
29
|
+
export function isObject(value) {
|
|
30
|
+
return getType(value) == "object";
|
|
31
|
+
}
|
|
32
|
+
export function isArray(value) {
|
|
33
|
+
return Array.isArray(value);
|
|
34
|
+
}
|
|
35
|
+
export function isBuffer(value) {
|
|
36
|
+
return value instanceof Buffer;
|
|
37
|
+
}
|
|
38
|
+
export function isBoolean(value) {
|
|
39
|
+
return typeof value === "boolean";
|
|
40
|
+
}
|
|
41
|
+
export function isDate(value) {
|
|
42
|
+
return !!value && value[Symbol.toPrimitive] && !isNaN(value) && "undefined" !== typeof value.getDate;
|
|
43
|
+
}
|
|
44
|
+
export function isPrimitive(value) {
|
|
45
|
+
const type = typeof value;
|
|
46
|
+
return value == null || (type !== "object" && type !== "function");
|
|
47
|
+
}
|
|
48
|
+
export function isString(value) {
|
|
49
|
+
return typeof value === "string";
|
|
50
|
+
}
|
|
51
|
+
export function isFunction(value) {
|
|
52
|
+
return typeof value === "function";
|
|
53
|
+
}
|
|
54
|
+
export function isConstructor(value) {
|
|
55
|
+
return (value && typeof value === "function" && value.prototype && value.prototype.constructor) === value && value.name !== "Object";
|
|
56
|
+
}
|
|
57
|
+
export function isType(value) {
|
|
58
|
+
return isConstructor(value);
|
|
59
|
+
}
|
|
60
|
+
export function isInterface(obj, interFaceObject) {
|
|
61
|
+
if (!obj || typeof obj !== "object" || isArray(obj) || !isObject(interFaceObject))
|
|
62
|
+
return false;
|
|
63
|
+
const keys = Object.keys(interFaceObject);
|
|
64
|
+
for (const key of keys) {
|
|
65
|
+
let type = interFaceObject[key] || "";
|
|
66
|
+
if (type.startsWith("*")) {
|
|
67
|
+
type = type.substr(1);
|
|
68
|
+
if (obj.hasOwnProperty(key) && getType(obj[key]) !== type)
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
else if (!obj.hasOwnProperty(key) || getType(obj[key]) !== type) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
export function ucFirst(value) {
|
|
78
|
+
if (!value)
|
|
79
|
+
return "";
|
|
80
|
+
return value[0].toUpperCase() + value.substr(1);
|
|
81
|
+
}
|
|
82
|
+
export function lcFirst(value) {
|
|
83
|
+
if (!value)
|
|
84
|
+
return "";
|
|
85
|
+
return value[0].toLowerCase() + value.substr(1);
|
|
86
|
+
}
|
|
87
|
+
export function isObjectId(id) {
|
|
88
|
+
return typeof id === "string" && id.length == 24 && !isNaN(Number("0x" + id));
|
|
89
|
+
}
|
|
90
|
+
export function firstItem(value) {
|
|
91
|
+
return value[0];
|
|
92
|
+
}
|
|
93
|
+
export function lastItem(value) {
|
|
94
|
+
return value[value.length - 1];
|
|
95
|
+
}
|
|
96
|
+
export function regroup(value, comparator) {
|
|
97
|
+
const result = [];
|
|
98
|
+
if (!isArray(value) || value.length == 0)
|
|
99
|
+
return result;
|
|
100
|
+
value = Array.from(value);
|
|
101
|
+
result.push([value.shift()]);
|
|
102
|
+
value.forEach(item => {
|
|
103
|
+
const group = result.find(g => g.some(a => comparator(a, item)));
|
|
104
|
+
if (group) {
|
|
105
|
+
group.push(item);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
result.push([item]);
|
|
109
|
+
});
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
export function uniqueItems(value) {
|
|
113
|
+
return value.filter((v, ix) => value.indexOf(v) === ix);
|
|
114
|
+
}
|
|
115
|
+
export function getValue(obj, key, defaultValue, treeFallback = false) {
|
|
116
|
+
key = key || "";
|
|
117
|
+
const keys = key.split(".");
|
|
118
|
+
let curKey = "";
|
|
119
|
+
do {
|
|
120
|
+
curKey += keys.shift();
|
|
121
|
+
if (isDefined(obj) && isDefined(obj[curKey]) && (typeof obj[curKey] === "object" || !keys.length)) {
|
|
122
|
+
obj = obj[curKey];
|
|
123
|
+
curKey = "";
|
|
124
|
+
}
|
|
125
|
+
else if (!keys.length) {
|
|
126
|
+
defaultValue = typeof defaultValue == "undefined" ? key.replace(new RegExp(`${curKey}$`), `{${curKey}}`) : defaultValue;
|
|
127
|
+
obj = treeFallback ? obj || defaultValue : defaultValue;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
curKey += ".";
|
|
131
|
+
}
|
|
132
|
+
} while (keys.length);
|
|
133
|
+
return obj;
|
|
134
|
+
}
|
|
135
|
+
export function groupBy(items, cb) {
|
|
136
|
+
return items.reduce((res, item) => {
|
|
137
|
+
const group = cb(item);
|
|
138
|
+
res[group] = res[group] || [];
|
|
139
|
+
res[group].push(item);
|
|
140
|
+
return res;
|
|
141
|
+
}, {});
|
|
142
|
+
}
|
|
143
|
+
export function convertValue(value, type) {
|
|
144
|
+
switch (type) {
|
|
145
|
+
case "boolean":
|
|
146
|
+
value = typeof value == "string" ? value.toLowerCase() : value;
|
|
147
|
+
return (value == "no" || value == "false" || value == "0") ? false : !!value;
|
|
148
|
+
case "number":
|
|
149
|
+
const val = parseFloat(value);
|
|
150
|
+
return isNaN(val) ? 0 : val;
|
|
151
|
+
case "array":
|
|
152
|
+
try {
|
|
153
|
+
return JSON.parse(value);
|
|
154
|
+
}
|
|
155
|
+
catch (e) {
|
|
156
|
+
return `${value}`.split(", ");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return value;
|
|
160
|
+
}
|
|
161
|
+
const cropInterface = {
|
|
162
|
+
x: "number",
|
|
163
|
+
y: "number",
|
|
164
|
+
w: "number",
|
|
165
|
+
h: "number"
|
|
166
|
+
};
|
|
167
|
+
function toCropRegion(cropInfo) {
|
|
168
|
+
let crop = cropInfo;
|
|
169
|
+
if (isString(cropInfo)) {
|
|
170
|
+
try {
|
|
171
|
+
crop = JSON.parse(cropInfo);
|
|
172
|
+
}
|
|
173
|
+
catch (e) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (!isInterface(crop, cropInterface))
|
|
178
|
+
return null;
|
|
179
|
+
return {
|
|
180
|
+
width: Math.round(crop.w),
|
|
181
|
+
height: Math.round(crop.h),
|
|
182
|
+
top: Math.round(crop.y),
|
|
183
|
+
left: Math.round(crop.x)
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
export async function toImage(src, params, meta) {
|
|
187
|
+
// Default params and meta
|
|
188
|
+
params = params || {};
|
|
189
|
+
meta = meta || {};
|
|
190
|
+
// Get default crop info
|
|
191
|
+
const crop = toCropRegion(meta.crop);
|
|
192
|
+
// Return the src if there are no params and no default crop exists
|
|
193
|
+
if (meta.extension === "svg" || (Object.keys(params).length == 0 && !crop)) {
|
|
194
|
+
return src;
|
|
195
|
+
}
|
|
196
|
+
// Parse params
|
|
197
|
+
params.rotation = isNaN(params.rotation) ? 0 : Math.round(params.rotation / 90) * 90;
|
|
198
|
+
params.canvasScaleX = isNaN(params.canvasScaleX) ? 1 : Number(params.canvasScaleX);
|
|
199
|
+
params.canvasScaleY = isNaN(params.canvasScaleY) ? 1 : Number(params.canvasScaleY);
|
|
200
|
+
params.scaleX = isNaN(params.scaleX) ? 1 : Number(params.scaleX);
|
|
201
|
+
params.scaleY = isNaN(params.scaleY) ? 1 : Number(params.scaleY);
|
|
202
|
+
params.crop = isBoolean(params.crop) ? params.crop : params.crop == "true";
|
|
203
|
+
let buffer = src instanceof Readable ? await streamToBuffer(src) : src;
|
|
204
|
+
try {
|
|
205
|
+
// Get crop info
|
|
206
|
+
const cropBefore = toCropRegion(params.cropBefore || (params.crop ? meta.cropBefore : null));
|
|
207
|
+
const cropAfter = toCropRegion(params.cropAfter || (params.crop ? meta.cropAfter : null));
|
|
208
|
+
// Get metadata
|
|
209
|
+
let img = sharp(buffer);
|
|
210
|
+
let { width, height } = await img.metadata();
|
|
211
|
+
// Crop before resize
|
|
212
|
+
if (cropBefore) {
|
|
213
|
+
width = cropBefore.width;
|
|
214
|
+
height = cropBefore.height;
|
|
215
|
+
img = img.extract(cropBefore);
|
|
216
|
+
}
|
|
217
|
+
else if (crop) {
|
|
218
|
+
width = crop.width;
|
|
219
|
+
height = crop.height;
|
|
220
|
+
img = img.extract(crop);
|
|
221
|
+
}
|
|
222
|
+
// Resize canvas
|
|
223
|
+
const canvasScaleX = meta?.canvasScaleX || 1;
|
|
224
|
+
const canvasScaleY = meta?.canvasScaleY || 1;
|
|
225
|
+
if (params.canvasScaleX !== canvasScaleX || params.canvasScaleY !== canvasScaleY) {
|
|
226
|
+
width = Math.round(width * params.canvasScaleX);
|
|
227
|
+
height = Math.round(height * params.canvasScaleY);
|
|
228
|
+
img = img.resize({ width, height, background: "#00000000", fit: "contain" });
|
|
229
|
+
}
|
|
230
|
+
// Resize image
|
|
231
|
+
if (params.scaleX !== 1 || params.scaleY !== 1) {
|
|
232
|
+
width = Math.round(width * params.scaleX);
|
|
233
|
+
height = Math.round(height * params.scaleY);
|
|
234
|
+
img = img.resize({ width, height, background: "#00000000", fit: "fill" });
|
|
235
|
+
}
|
|
236
|
+
// Crop after resize
|
|
237
|
+
if (cropAfter) {
|
|
238
|
+
img = img.extract(cropAfter);
|
|
239
|
+
}
|
|
240
|
+
// Rotate
|
|
241
|
+
if (params.rotation !== 0) {
|
|
242
|
+
buffer = await img.toBuffer();
|
|
243
|
+
img = sharp(buffer).rotate(params.rotation);
|
|
244
|
+
}
|
|
245
|
+
buffer = await img.toBuffer();
|
|
246
|
+
src = src instanceof Readable ? bufferToStream(buffer) : buffer;
|
|
247
|
+
return src;
|
|
248
|
+
}
|
|
249
|
+
catch (e) {
|
|
250
|
+
console.log("Image conversion error", e);
|
|
251
|
+
src = src instanceof Readable ? bufferToStream(buffer) : buffer;
|
|
252
|
+
return src;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
export function bufferToStream(buffer) {
|
|
256
|
+
const readStream = new PassThrough();
|
|
257
|
+
readStream.end(buffer);
|
|
258
|
+
return readStream;
|
|
259
|
+
}
|
|
260
|
+
export function streamToBuffer(stream) {
|
|
261
|
+
return new Promise((resolve, reject) => {
|
|
262
|
+
const concat = [];
|
|
263
|
+
stream.on("data", data => {
|
|
264
|
+
concat.push(data);
|
|
265
|
+
});
|
|
266
|
+
stream.on("error", reject);
|
|
267
|
+
stream.on("end", () => resolve(Buffer.concat(concat)));
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
class ReadableStreamClone extends Readable {
|
|
271
|
+
constructor(readableStream, opts) {
|
|
272
|
+
super(opts);
|
|
273
|
+
readableStream?.on("data", chunk => {
|
|
274
|
+
this.push(chunk);
|
|
275
|
+
});
|
|
276
|
+
readableStream?.on("end", () => {
|
|
277
|
+
this.push(null);
|
|
278
|
+
});
|
|
279
|
+
readableStream?.on("error", err => {
|
|
280
|
+
this.emit("error", err);
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
_read(size) {
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
export function copyStream(stream, opts) {
|
|
287
|
+
return new ReadableStreamClone(stream, opts);
|
|
288
|
+
}
|
|
289
|
+
export function mkdirRecursive(path, mode = null) {
|
|
290
|
+
return new Promise((resolve, reject) => {
|
|
291
|
+
mkdir(path, { mode: mode || 0o777, recursive: true }, err => {
|
|
292
|
+
if (err) {
|
|
293
|
+
reject(err);
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
resolve();
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
export function deleteFile(path) {
|
|
301
|
+
return new Promise((resolve, reject) => {
|
|
302
|
+
unlink(path, err => {
|
|
303
|
+
if (err) {
|
|
304
|
+
reject(err);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
resolve();
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
export function readFile(path) {
|
|
312
|
+
return new Promise((res, rej) => {
|
|
313
|
+
fsReadFile(path, (err, data) => {
|
|
314
|
+
if (err) {
|
|
315
|
+
rej(err);
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
res(data);
|
|
319
|
+
});
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
export async function readAndDeleteFile(path, timeout = 5000) {
|
|
323
|
+
const data = await readFile(path);
|
|
324
|
+
setTimeout(() => {
|
|
325
|
+
unlink(path, () => {
|
|
326
|
+
});
|
|
327
|
+
}, timeout);
|
|
328
|
+
return data;
|
|
329
|
+
}
|
|
330
|
+
export async function writeFile(path, data) {
|
|
331
|
+
await mkdirRecursive(dirname(path));
|
|
332
|
+
return new Promise((res, rej) => {
|
|
333
|
+
fsWriteFile(path, data, err => {
|
|
334
|
+
if (err) {
|
|
335
|
+
rej(err);
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
res(data);
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
export function valueToPromise(value) {
|
|
343
|
+
return value instanceof Promise ? value : Promise.resolve(value);
|
|
344
|
+
}
|
|
345
|
+
export function promiseTimeout(timeout = 1000, error = false) {
|
|
346
|
+
return new Promise((resolve, reject) => {
|
|
347
|
+
setTimeout(() => {
|
|
348
|
+
if (error) {
|
|
349
|
+
reject(`Timeout exceeded: ${timeout}ms`);
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
resolve(`Timeout: ${timeout}ms`);
|
|
353
|
+
}, timeout);
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
export function getConstructorName(type) {
|
|
357
|
+
return type.prototype.constructor.name;
|
|
358
|
+
}
|
|
359
|
+
export function getFunctionParams(func) {
|
|
360
|
+
// Remove comments of the form /* ... */
|
|
361
|
+
// Removing comments of the form //
|
|
362
|
+
// Remove body of the function { ... }
|
|
363
|
+
// removing "=>" if func is arrow function
|
|
364
|
+
const str = func.toString()
|
|
365
|
+
.replace(/\/\*[\s\S]*?\*\//g, "")
|
|
366
|
+
.replace(/\/\/(.)*/g, "")
|
|
367
|
+
.replace(/{[\s\S]*}/, "")
|
|
368
|
+
.replace(/=>/g, "")
|
|
369
|
+
.trim();
|
|
370
|
+
// Start parameter names after first "("
|
|
371
|
+
const start = str.indexOf("(") + 1;
|
|
372
|
+
// End parameter names is just before last ")"
|
|
373
|
+
const end = str.length - 1;
|
|
374
|
+
const result = str.substring(start, end).split(", ");
|
|
375
|
+
const params = [];
|
|
376
|
+
result.forEach(element => {
|
|
377
|
+
// Removing any default value
|
|
378
|
+
element = element.replace(/=[\s\S]*/g, "").trim();
|
|
379
|
+
if (element.length > 0)
|
|
380
|
+
params.push(element);
|
|
381
|
+
});
|
|
382
|
+
return params;
|
|
383
|
+
}
|
|
384
|
+
export function getFileName(path, withExtension = false) {
|
|
385
|
+
const name = basename(path || "");
|
|
386
|
+
return withExtension ? name : name.split(".").slice(0, -1).join(".");
|
|
387
|
+
}
|
|
388
|
+
export function getExtension(path) {
|
|
389
|
+
const name = basename(path || "");
|
|
390
|
+
return name.split(".").pop();
|
|
391
|
+
}
|
|
392
|
+
export function createIdString() {
|
|
393
|
+
return new ObjectId().toHexString();
|
|
394
|
+
}
|
|
395
|
+
export function idToString(value) {
|
|
396
|
+
if (Array.isArray(value)) {
|
|
397
|
+
return value.map(idToString);
|
|
398
|
+
}
|
|
399
|
+
return value instanceof ObjectId || value instanceof mongoose.Types.ObjectId
|
|
400
|
+
? value.toHexString()
|
|
401
|
+
: (isString(value) ? value : value || null);
|
|
402
|
+
}
|
|
403
|
+
export function createTransformer(transform) {
|
|
404
|
+
return (doc, ret, options) => {
|
|
405
|
+
ret.id = idToString(ret.id) || ret.id;
|
|
406
|
+
if (doc._id) {
|
|
407
|
+
ret._id = idToString(doc._id);
|
|
408
|
+
ret.id = ret.id || ret._id;
|
|
409
|
+
}
|
|
410
|
+
delete ret.__v;
|
|
411
|
+
return isFunction(transform) ? transform(doc, ret, options) || ret : ret;
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
export function broadcast(socketServer, cb) {
|
|
415
|
+
socketServer.sockets.sockets.forEach((client) => {
|
|
416
|
+
cb(client);
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
export function rand(min, max) {
|
|
420
|
+
return Math.round(random(min, max));
|
|
421
|
+
}
|
|
422
|
+
export function random(min, max) {
|
|
423
|
+
return min + Math.random() * (max - min);
|
|
424
|
+
}
|
|
425
|
+
export function multiSubscription(...subscriptions) {
|
|
426
|
+
return new Subscription(() => {
|
|
427
|
+
subscriptions.forEach(s => {
|
|
428
|
+
s.unsubscribe();
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
export function observableFromFunction(callbackFunc) {
|
|
433
|
+
let subject;
|
|
434
|
+
return new Observable((subscriber) => {
|
|
435
|
+
if (!subject) {
|
|
436
|
+
subject = new Subject();
|
|
437
|
+
try {
|
|
438
|
+
subject = from(callbackFunc());
|
|
439
|
+
}
|
|
440
|
+
catch (err) {
|
|
441
|
+
subject.error(err);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
return subject.subscribe(subscriber);
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
export function padLeft(value, count = 3, padWith = "0") {
|
|
448
|
+
return `${value}`.padStart(count, padWith);
|
|
449
|
+
}
|
|
450
|
+
export function padRight(value, count = 3, padWith = "0") {
|
|
451
|
+
return `${value}`.padEnd(count, padWith);
|
|
452
|
+
}
|
|
453
|
+
export function camelCaseToDash(str) {
|
|
454
|
+
return str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
|
|
455
|
+
}
|
|
456
|
+
export function gzipPromised(data, opts) {
|
|
457
|
+
return new Promise((resolve, reject) => {
|
|
458
|
+
gzip(data, opts, (err, result) => {
|
|
459
|
+
if (err) {
|
|
460
|
+
reject(err);
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
resolve(result.toString("base64"));
|
|
464
|
+
});
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
export function gunzipPromised(data, opts) {
|
|
468
|
+
return new Promise((resolve, reject) => {
|
|
469
|
+
gunzip(Buffer.from(data, "base64"), opts, (err, result) => {
|
|
470
|
+
if (err) {
|
|
471
|
+
reject(err);
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
resolve(result.toString("utf8"));
|
|
475
|
+
});
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
export function deleteFromBucket(bucket, id) {
|
|
479
|
+
const fileId = id instanceof ObjectId ? id : new ObjectId(id);
|
|
480
|
+
return new Promise(((resolve, reject) => {
|
|
481
|
+
if (!id) {
|
|
482
|
+
// We don't care about empty id
|
|
483
|
+
resolve(null);
|
|
484
|
+
return;
|
|
485
|
+
}
|
|
486
|
+
bucket.delete(fileId, error => {
|
|
487
|
+
let err = error;
|
|
488
|
+
if (error) {
|
|
489
|
+
err = error.message || error || "";
|
|
490
|
+
if (!isString(err) || !err.startsWith("FileNotFound")) {
|
|
491
|
+
reject(err);
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
resolve(fileId.toHexString());
|
|
496
|
+
});
|
|
497
|
+
}));
|
|
498
|
+
}
|
|
499
|
+
const defaultPredicate = () => true;
|
|
500
|
+
function copyRecursive(target, source, predicate, copies) {
|
|
501
|
+
if (isPrimitive(source) || isDate(source) || isFunction(source))
|
|
502
|
+
return source;
|
|
503
|
+
if (copies.has(source))
|
|
504
|
+
return copies.get(source);
|
|
505
|
+
if (isArray(source)) {
|
|
506
|
+
target = isArray(target) ? Array.from(target) : [];
|
|
507
|
+
source.forEach((item, index) => {
|
|
508
|
+
if (!predicate(item, index, target, source))
|
|
509
|
+
return;
|
|
510
|
+
if (target.length > index)
|
|
511
|
+
target[index] = copyRecursive(target[index], item, predicate, copies);
|
|
512
|
+
else
|
|
513
|
+
target.push(copyRecursive(null, item, predicate, copies));
|
|
514
|
+
});
|
|
515
|
+
copies.set(source, target);
|
|
516
|
+
return target;
|
|
517
|
+
}
|
|
518
|
+
if (isBuffer(source))
|
|
519
|
+
return Buffer.from(source);
|
|
520
|
+
// If object defines __shouldCopy as false, then don't copy it
|
|
521
|
+
if (source.__shouldCopy === false)
|
|
522
|
+
return source;
|
|
523
|
+
// Copy object
|
|
524
|
+
const shouldCopy = isFunction(source.__shouldCopy) ? source.__shouldCopy : () => true;
|
|
525
|
+
if (isConstructor(source.constructor)) {
|
|
526
|
+
if (!target) {
|
|
527
|
+
try {
|
|
528
|
+
target = new source.constructor();
|
|
529
|
+
}
|
|
530
|
+
catch (e) {
|
|
531
|
+
const proto = source.constructor.prototype || source.prototype;
|
|
532
|
+
target = Object.create(proto);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
else {
|
|
537
|
+
target = Object.assign({}, target || {});
|
|
538
|
+
}
|
|
539
|
+
// Set to copies to prevent circular references
|
|
540
|
+
copies.set(source, target);
|
|
541
|
+
// Copy map entries
|
|
542
|
+
if (target instanceof Map) {
|
|
543
|
+
if (source instanceof Map) {
|
|
544
|
+
for (let [key, value] of source.entries()) {
|
|
545
|
+
if (!predicate(value, key, target, source))
|
|
546
|
+
continue;
|
|
547
|
+
target.set(key, !shouldCopy(key, value) ? value : copyRecursive(target.get(key), value, predicate, copies));
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
return target;
|
|
551
|
+
}
|
|
552
|
+
// Copy object members
|
|
553
|
+
let keys = Object.keys(source);
|
|
554
|
+
keys.forEach(key => {
|
|
555
|
+
if (!predicate(source[key], key, target, source))
|
|
556
|
+
return;
|
|
557
|
+
target[key] = !shouldCopy(key, source[key]) ? source[key] : copyRecursive(target[key], source[key], predicate, copies);
|
|
558
|
+
}, target);
|
|
559
|
+
// Copy object properties
|
|
560
|
+
const descriptors = Object.getOwnPropertyDescriptors(source);
|
|
561
|
+
keys = Object.keys(descriptors).filter(k => keys.indexOf(k) < 0);
|
|
562
|
+
keys.forEach(key => {
|
|
563
|
+
Object.defineProperty(target, key, descriptors[key]);
|
|
564
|
+
});
|
|
565
|
+
return target;
|
|
566
|
+
}
|
|
567
|
+
export function filter(obj, predicate) {
|
|
568
|
+
return copyRecursive(null, obj, predicate || defaultPredicate, new Map());
|
|
569
|
+
}
|
|
570
|
+
export function copy(obj) {
|
|
571
|
+
return copyRecursive(null, obj, defaultPredicate, new Map());
|
|
572
|
+
}
|
|
573
|
+
export function assign(target, source, predicate) {
|
|
574
|
+
return copyRecursive(target, source, predicate, new Map());
|
|
575
|
+
}
|
|
576
|
+
export function md5(data) {
|
|
577
|
+
if (isObject(data)) {
|
|
578
|
+
data = JSON.stringify(data);
|
|
579
|
+
}
|
|
580
|
+
if (!isString(data)) {
|
|
581
|
+
throw `Can't md5 other that raw object or string`;
|
|
582
|
+
}
|
|
583
|
+
return createHash("md5").update(data).digest("hex");
|
|
584
|
+
}
|
|
585
|
+
export function runCommand(scriptPath, expectedCode = 0) {
|
|
586
|
+
return new Promise((resolve, reject) => {
|
|
587
|
+
const cp = execChildProcess(scriptPath, (error, stdout) => {
|
|
588
|
+
if (error && expectedCode !== error.code) {
|
|
589
|
+
console.log(error);
|
|
590
|
+
reject(error);
|
|
591
|
+
return;
|
|
592
|
+
}
|
|
593
|
+
const lines = (stdout || "").split("\n");
|
|
594
|
+
let line = null;
|
|
595
|
+
while (!line && lines.length > 0) {
|
|
596
|
+
line = lines.pop();
|
|
597
|
+
}
|
|
598
|
+
resolve(line);
|
|
599
|
+
});
|
|
600
|
+
cp.stdout.on("data", function (data) {
|
|
601
|
+
console.log(data.toString());
|
|
602
|
+
});
|
|
603
|
+
cp.stderr.on("data", function (data) {
|
|
604
|
+
console.error(data.toString());
|
|
605
|
+
});
|
|
606
|
+
});
|
|
607
|
+
}
|
|
608
|
+
export var ConsoleColor;
|
|
609
|
+
(function (ConsoleColor) {
|
|
610
|
+
ConsoleColor["Reset"] = "\u001B[0m";
|
|
611
|
+
ConsoleColor["Bright"] = "\u001B[1m";
|
|
612
|
+
ConsoleColor["Dim"] = "\u001B[2m";
|
|
613
|
+
ConsoleColor["Underscore"] = "\u001B[4m";
|
|
614
|
+
ConsoleColor["Blink"] = "\u001B[5m";
|
|
615
|
+
ConsoleColor["Reverse"] = "\u001B[7m";
|
|
616
|
+
ConsoleColor["Hidden"] = "\u001B[8m";
|
|
617
|
+
ConsoleColor["FgBlack"] = "\u001B[30m";
|
|
618
|
+
ConsoleColor["FgRed"] = "\u001B[31m";
|
|
619
|
+
ConsoleColor["FgGreen"] = "\u001B[32m";
|
|
620
|
+
ConsoleColor["FgYellow"] = "\u001B[33m";
|
|
621
|
+
ConsoleColor["FgBlue"] = "\u001B[34m";
|
|
622
|
+
ConsoleColor["FgMagenta"] = "\u001B[35m";
|
|
623
|
+
ConsoleColor["FgCyan"] = "\u001B[36m";
|
|
624
|
+
ConsoleColor["FgWhite"] = "\u001B[37m";
|
|
625
|
+
ConsoleColor["FgDefault"] = "\u001B[38m";
|
|
626
|
+
ConsoleColor["BgBlack"] = "\u001B[40m";
|
|
627
|
+
ConsoleColor["BgRed"] = "\u001B[41m";
|
|
628
|
+
ConsoleColor["BgGreen"] = "\u001B[42m";
|
|
629
|
+
ConsoleColor["BgYellow"] = "\u001B[43m";
|
|
630
|
+
ConsoleColor["BgBlue"] = "\u001B[44m";
|
|
631
|
+
ConsoleColor["BgMagenta"] = "\u001B[45m";
|
|
632
|
+
ConsoleColor["BgCyan"] = "\u001B[46m";
|
|
633
|
+
ConsoleColor["BgWhite"] = "\u001B[47m";
|
|
634
|
+
ConsoleColor["BgDefault"] = "\u001B[48m";
|
|
635
|
+
})(ConsoleColor || (ConsoleColor = {}));
|
|
636
|
+
const defaultColors = {
|
|
637
|
+
keyColor: ConsoleColor.FgWhite,
|
|
638
|
+
numberColor: ConsoleColor.FgBlue,
|
|
639
|
+
stringColor: ConsoleColor.FgYellow,
|
|
640
|
+
trueColor: ConsoleColor.FgGreen,
|
|
641
|
+
falseColor: ConsoleColor.FgRed,
|
|
642
|
+
nullColor: ConsoleColor.BgMagenta
|
|
643
|
+
};
|
|
644
|
+
export function colorize(input, color) {
|
|
645
|
+
return `${color}${input}${ConsoleColor.Reset}`;
|
|
646
|
+
}
|
|
647
|
+
export function jsonHighlight(input, colorOptions) {
|
|
648
|
+
const colors = Object.assign({}, defaultColors, colorOptions);
|
|
649
|
+
const json = (isString(input) ? input : JSON.stringify(input, null, 2)).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
650
|
+
return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+]?\d+)?)/g, (match) => {
|
|
651
|
+
let color = colors.numberColor;
|
|
652
|
+
if (/^"/.test(match)) {
|
|
653
|
+
if (/:$/.test(match)) {
|
|
654
|
+
color = colors.keyColor;
|
|
655
|
+
}
|
|
656
|
+
else {
|
|
657
|
+
color = colors.stringColor;
|
|
658
|
+
match = '"' + match.substr(1, match.length - 2) + '"';
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
else {
|
|
662
|
+
color = /true/.test(match)
|
|
663
|
+
? colors.trueColor
|
|
664
|
+
: /false/.test(match)
|
|
665
|
+
? colors.falseColor
|
|
666
|
+
: /null/.test(match)
|
|
667
|
+
? colors.nullColor
|
|
668
|
+
: color;
|
|
669
|
+
}
|
|
670
|
+
return `${color}${match}${ConsoleColor.Reset}`;
|
|
671
|
+
});
|
|
672
|
+
}
|
|
673
|
+
export function replaceSpecialChars(str, to = "-") {
|
|
674
|
+
return `${str}`.replace(/[&\/\\#, +()$~%.@'":*?<>{}]/g, to);
|
|
675
|
+
}
|
|
676
|
+
export function regexEscape(str) {
|
|
677
|
+
return `${str}`.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
|
|
678
|
+
}
|
|
679
|
+
export function flatten(arr) {
|
|
680
|
+
return arr.reduce((flat, toFlatten) => {
|
|
681
|
+
return flat.concat(isArray(toFlatten) ? flatten(toFlatten) : toFlatten);
|
|
682
|
+
}, []);
|
|
683
|
+
}
|
|
684
|
+
export function wrapError(e, message, httpCode = 500) {
|
|
685
|
+
if (axios.isAxiosError(e)) {
|
|
686
|
+
e.message = message;
|
|
687
|
+
return e;
|
|
688
|
+
}
|
|
689
|
+
return new HttpError(httpCode, `${message}: ${e}`);
|
|
690
|
+
}
|
|
691
|
+
export function getDirName() {
|
|
692
|
+
if (typeof __dirname === "undefined") {
|
|
693
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
694
|
+
return dirname(__filename);
|
|
695
|
+
}
|
|
696
|
+
return __dirname;
|
|
697
|
+
}
|
|
698
|
+
export function prepareUrl(ending = "/") {
|
|
699
|
+
return url => {
|
|
700
|
+
return url ? `${url.replace(/\/+$/, "")}${ending}` : ending;
|
|
701
|
+
};
|
|
702
|
+
}
|
|
703
|
+
export const prepareUrlSlash = prepareUrl("/");
|
|
704
|
+
export const prepareUrlEmpty = prepareUrl("");
|
|
705
|
+
function checkTextFileType(type) {
|
|
706
|
+
return type.mime.indexOf("text") >= 0 || type.mime.indexOf("xml") >= 0;
|
|
707
|
+
}
|
|
708
|
+
function fixTextFileType(type, buffer) {
|
|
709
|
+
const text = buffer.toString("utf8");
|
|
710
|
+
if (text.indexOf("<svg") >= 0) {
|
|
711
|
+
return { ext: "svg", mime: "image/svg+xml" };
|
|
712
|
+
}
|
|
713
|
+
return type;
|
|
714
|
+
}
|
|
715
|
+
export async function fileTypeFromBuffer(buffer) {
|
|
716
|
+
const stream = bufferToStream(buffer);
|
|
717
|
+
const type = (await ftFromBuffer(buffer) ?? { ext: "txt", mime: "text/plain" });
|
|
718
|
+
if (checkTextFileType(type)) {
|
|
719
|
+
return fixTextFileType(type, buffer);
|
|
720
|
+
}
|
|
721
|
+
return type;
|
|
722
|
+
}
|
|
723
|
+
export async function fileTypeFromStream(stream) {
|
|
724
|
+
return (await ftFromStream(stream) ?? { ext: "txt", mime: "text/plain" });
|
|
725
|
+
}
|
|
726
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLEtBQUssRUFBRSxRQUFRLElBQUksVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLElBQUksV0FBVyxFQUFDLE1BQU0sSUFBSSxDQUFDO0FBQ25GLE9BQU8sRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxLQUFLLENBQUM7QUFDbEMsT0FBTyxFQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFN0QsT0FBTyxFQUFlLFFBQVEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUUvQyxPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQWtCLE1BQU0sUUFBUSxDQUFDO0FBQzlELE9BQU8sTUFBZ0IsTUFBTSxPQUFPLENBQUM7QUFDckMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUxQixPQUFPLEVBQUMsa0JBQWtCLElBQUksWUFBWSxFQUFFLGtCQUFrQixJQUFJLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBV3RHLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQztBQU1yQixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWtCO0lBQ3ZDLFlBQVksRUFBRSxJQUFJO0NBQ3JCLENB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SUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM1QixPQUFPLEVBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUFDLE1BQWM7SUFDbkQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksRUFBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUMsQ0FBYyxDQUFDO0lBQzNGLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLGVBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUFDLE1BQXdCO0lBQzdELE9BQU8sQ0FBQyxNQUFNLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBQyxDQUFjLENBQUM7QUFDekYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7bWtkaXIsIHJlYWRGaWxlIGFzIGZzUmVhZEZpbGUsIHVubGluaywgd3JpdGVGaWxlIGFzIGZzV3JpdGVGaWxlfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7Z3ppcCwgZ3VuemlwLCBabGliT3B0aW9uc30gZnJvbSBcInpsaWJcIjtcbmltcG9ydCB7YmFzZW5hbWUsIGRpcm5hbWV9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gXCJ1cmxcIjtcbmltcG9ydCB7ZXhlYyBhcyBleGVjQ2hpbGRQcm9jZXNzfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHtjcmVhdGVIYXNofSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQge2Zyb20sIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7U2VydmVyfSBmcm9tIFwic29ja2V0LmlvXCI7XG5pbXBvcnQge0dyaWRGU0J1Y2tldCwgT2JqZWN0SWR9IGZyb20gXCJtb25nb2RiXCI7XG5pbXBvcnQge0RvY3VtZW50fSBmcm9tIFwibW9uZ29vc2VcIjtcbmltcG9ydCBtb25nb29zZSBmcm9tIFwibW9uZ29vc2VcIjtcbmltcG9ydCB7UGFzc1Rocm91Z2gsIFJlYWRhYmxlLCBSZWFkYWJsZU9wdGlvbnN9IGZyb20gXCJzdHJlYW1cIjtcbmltcG9ydCBzaGFycF8sIHtSZWdpb259IGZyb20gXCJzaGFycFwiO1xuaW1wb3J0IHtIdHRwRXJyb3J9IGZyb20gXCJyb3V0aW5nLWNvbnRyb2xsZXJzXCI7XG5pbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQge0FueVdlYkJ5dGVTdHJlYW19IGZyb20gXCJzdHJ0b2szXCI7XG5pbXBvcnQge2ZpbGVUeXBlRnJvbVN0cmVhbSBhcyBmdEZyb21TdHJlYW0sIGZpbGVUeXBlRnJvbUJ1ZmZlciBhcyBmdEZyb21CdWZmZXJ9IGZyb20gXCJmaWxlLXR5cGUvY29yZVwiO1xuaW1wb3J0IHtcbiAgICBJQXNzZXRDcm9wSW5mbyxcbiAgICBJQXNzZXRJbWFnZVBhcmFtcyxcbiAgICBJQXNzZXRNZXRhLFxuICAgIElDbGllbnRTb2NrZXQsIElEZXBlbmRlbmN5Q29udGFpbmVyLFxuICAgIElGaWxlVHlwZSxcbiAgICBQYXJhbVJlc29sdmVyLFxuICAgIFR5cGVcbn0gZnJvbSBcIi4vY29tbW9uLXR5cGVzXCI7XG5cbmNvbnN0IHNoYXJwID0gc2hhcnBfO1xuXG5leHBvcnQgaW50ZXJmYWNlIElESUNvbnRhaW5lcnMge1xuICAgIGFwcENvbnRhaW5lcjogSURlcGVuZGVuY3lDb250YWluZXJcbn1cblxuZXhwb3J0IGNvbnN0IGRpQ29udGFpbmVyczogSURJQ29udGFpbmVycyA9IHtcbiAgICBhcHBDb250YWluZXI6IG51bGxcbn07XG5cbmV4cG9ydCB0eXBlIEZpbHRlclByZWRpY2F0ZSA9ICh2YWx1ZTogYW55LCBrZXk/OiBhbnksIHRhcmdldD86IGFueSwgc291cmNlPzogYW55KSA9PiBib29sZWFuO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PSBcInVuZGVmaW5lZFwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZpbmVkKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGUob2JqOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChcIlxcXFxzKFthLXpBLVpdKylcIik7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLm1hdGNoKHJlZ2V4KVsxXS50b0xvd2VyQ2FzZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRUeXBlKHZhbHVlKSA9PSBcIm9iamVjdFwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheSh2YWx1ZTogYW55KTogdmFsdWUgaXMgQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCdWZmZXIodmFsdWU6IGFueSk6IHZhbHVlIGlzIEJ1ZmZlciB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgQnVmZmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgRGF0ZSB7XG4gICAgcmV0dXJuICEhdmFsdWUgJiYgdmFsdWVbU3ltYm9sLnRvUHJpbWl0aXZlXSAmJiAhaXNOYU4odmFsdWUpICYmIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiB2YWx1ZS5nZXREYXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgKHR5cGUgIT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gXCJmdW5jdGlvblwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBGdW5jdGlvbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb25zdHJ1Y3Rvcih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiAmJiB2YWx1ZS5wcm90b3R5cGUgJiYgdmFsdWUucHJvdG90eXBlLmNvbnN0cnVjdG9yKSA9PT0gdmFsdWUgJiYgdmFsdWUubmFtZSAhPT0gXCJPYmplY3RcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgVHlwZTxhbnk+IHtcbiAgICByZXR1cm4gaXNDb25zdHJ1Y3Rvcih2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVyZmFjZShvYmo6IGFueSwgaW50ZXJGYWNlT2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogYm9vbGVhbiB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiB8fCBpc0FycmF5KG9iaikgfHwgIWlzT2JqZWN0KGludGVyRmFjZU9iamVjdCkpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW50ZXJGYWNlT2JqZWN0KTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGxldCB0eXBlID0gaW50ZXJGYWNlT2JqZWN0W2tleV0gfHwgXCJcIjtcbiAgICAgICAgaWYgKHR5cGUuc3RhcnRzV2l0aChcIipcIikpIHtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlLnN1YnN0cigxKTtcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSAmJiBnZXRUeXBlKG9ialtrZXldKSAhPT0gdHlwZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKCFvYmouaGFzT3duUHJvcGVydHkoa2V5KSB8fCBnZXRUeXBlKG9ialtrZXldKSAhPT0gdHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdWNGaXJzdCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gdmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnN1YnN0cigxKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxjRmlyc3QodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIHZhbHVlWzBdLnRvTG93ZXJDYXNlKCkgKyB2YWx1ZS5zdWJzdHIoMSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdElkKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSBcInN0cmluZ1wiICYmIGlkLmxlbmd0aCA9PSAyNCAmJiAhaXNOYU4oTnVtYmVyKFwiMHhcIiArIGlkKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXJzdEl0ZW08VD4odmFsdWU6IFRbXSk6IFQge1xuICAgIHJldHVybiB2YWx1ZVswXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxhc3RJdGVtPFQ+KHZhbHVlOiBUW10pOiBUIHtcbiAgICByZXR1cm4gdmFsdWVbdmFsdWUubGVuZ3RoIC0gMV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdyb3VwPFQ+KHZhbHVlOiBUW10sIGNvbXBhcmF0b3I6IChhOiBULCBiOiBUKSA9PiBib29sZWFuKTogQXJyYXk8VFtdPiB7XG4gICAgY29uc3QgcmVzdWx0OiBBcnJheTxUW10+ID0gW107XG4gICAgaWYgKCFpc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkgcmV0dXJuIHJlc3VsdDtcbiAgICB2YWx1ZSA9IEFycmF5LmZyb20odmFsdWUpO1xuICAgIHJlc3VsdC5wdXNoKFt2YWx1ZS5zaGlmdCgpXSk7XG4gICAgdmFsdWUuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSByZXN1bHQuZmluZChnID0+IGcuc29tZShhID0+IGNvbXBhcmF0b3IoYSwgaXRlbSkpKTtcbiAgICAgICAgaWYgKGdyb3VwKSB7XG4gICAgICAgICAgICBncm91cC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKFtpdGVtXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZUl0ZW1zPFQ+KHZhbHVlOiBUW10pOiBUW10ge1xuICAgIHJldHVybiB2YWx1ZS5maWx0ZXIoKHYsIGl4KSA9PiB2YWx1ZS5pbmRleE9mKHYpID09PSBpeCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZShvYmo6IGFueSwga2V5OiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IGFueSwgdHJlZUZhbGxiYWNrOiBib29sZWFuID0gZmFsc2UpOiBhbnkge1xuICAgIGtleSA9IGtleSB8fCBcIlwiO1xuICAgIGNvbnN0IGtleXMgPSBrZXkuc3BsaXQoXCIuXCIpO1xuICAgIGxldCBjdXJLZXkgPSBcIlwiO1xuICAgIGRvIHtcbiAgICAgICAgY3VyS2V5ICs9IGtleXMuc2hpZnQoKTtcbiAgICAgICAgaWYgKGlzRGVmaW5lZChvYmopICYmIGlzRGVmaW5lZChvYmpbY3VyS2V5XSkgJiYgKHR5cGVvZiBvYmpbY3VyS2V5XSA9PT0gXCJvYmplY3RcIiB8fCAha2V5cy5sZW5ndGgpKSB7XG4gICAgICAgICAgICBvYmogPSBvYmpbY3VyS2V5XTtcbiAgICAgICAgICAgIGN1cktleSA9IFwiXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSB0eXBlb2YgZGVmYXVsdFZhbHVlID09IFwidW5kZWZpbmVkXCIgPyBrZXkucmVwbGFjZShuZXcgUmVnRXhwKGAke2N1cktleX0kYCksIGB7JHtjdXJLZXl9fWApIDogZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgb2JqID0gdHJlZUZhbGxiYWNrID8gb2JqIHx8IGRlZmF1bHRWYWx1ZSA6IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cktleSArPSBcIi5cIjtcbiAgICAgICAgfVxuICAgIH0gd2hpbGUgKGtleXMubGVuZ3RoKTtcbiAgICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBCeTxUPihpdGVtczogVFtdLCBjYjogKGl0ZW06IFQpID0+IHN0cmluZykge1xuICAgIHJldHVybiBpdGVtcy5yZWR1Y2UoKHJlcywgaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IGNiKGl0ZW0pO1xuICAgICAgICByZXNbZ3JvdXBdID0gcmVzW2dyb3VwXSB8fCBbXTtcbiAgICAgICAgcmVzW2dyb3VwXS5wdXNoKGl0ZW0pO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH0sIHt9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRWYWx1ZSh2YWx1ZTogYW55LCB0eXBlOiBzdHJpbmcpOiBhbnkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgdmFsdWUgPSB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiAodmFsdWUgPT0gXCJub1wiIHx8IHZhbHVlID09IFwiZmFsc2VcIiB8fCB2YWx1ZSA9PSBcIjBcIikgPyBmYWxzZSA6ICEhdmFsdWU7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIGlzTmFOKHZhbCkgPyAwIDogdmFsO1xuICAgICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHt2YWx1ZX1gLnNwbGl0KFwiLCBcIik7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuY29uc3QgY3JvcEludGVyZmFjZSA9IHtcbiAgICB4OiBcIm51bWJlclwiLFxuICAgIHk6IFwibnVtYmVyXCIsXG4gICAgdzogXCJudW1iZXJcIixcbiAgICBoOiBcIm51bWJlclwiXG59O1xuXG5mdW5jdGlvbiB0b0Nyb3BSZWdpb24oY3JvcEluZm86IHN0cmluZyB8IGJvb2xlYW4gfCBJQXNzZXRDcm9wSW5mbyk6IFJlZ2lvbiB7XG4gICAgbGV0IGNyb3AgPSBjcm9wSW5mbyBhcyBJQXNzZXRDcm9wSW5mbztcbiAgICBpZiAoaXNTdHJpbmcoY3JvcEluZm8pKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjcm9wID0gSlNPTi5wYXJzZShjcm9wSW5mbyBhcyBzdHJpbmcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWlzSW50ZXJmYWNlKGNyb3AsIGNyb3BJbnRlcmZhY2UpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogTWF0aC5yb3VuZChjcm9wLncpLFxuICAgICAgICBoZWlnaHQ6IE1hdGgucm91bmQoY3JvcC5oKSxcbiAgICAgICAgdG9wOiBNYXRoLnJvdW5kKGNyb3AueSksXG4gICAgICAgIGxlZnQ6IE1hdGgucm91bmQoY3JvcC54KVxuICAgIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0b0ltYWdlPFQgPSBCdWZmZXIgfCBSZWFkYWJsZT4oc3JjOiBULCBwYXJhbXM/OiBJQXNzZXRJbWFnZVBhcmFtcywgbWV0YT86IElBc3NldE1ldGEpOiBQcm9taXNlPFQ+IHtcblxuICAgIC8vIERlZmF1bHQgcGFyYW1zIGFuZCBtZXRhXG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIG1ldGEgPSBtZXRhIHx8IHt9O1xuXG4gICAgLy8gR2V0IGRlZmF1bHQgY3JvcCBpbmZvXG4gICAgY29uc3QgY3JvcCA9IHRvQ3JvcFJlZ2lvbihtZXRhLmNyb3ApO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBzcmMgaWYgdGhlcmUgYXJlIG5vIHBhcmFtcyBhbmQgbm8gZGVmYXVsdCBjcm9wIGV4aXN0c1xuICAgIGlmIChtZXRhLmV4dGVuc2lvbiA9PT0gXCJzdmdcIiB8fCAoT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGggPT0gMCAmJiAhY3JvcCkpIHtcbiAgICAgICAgcmV0dXJuIHNyYztcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBwYXJhbXNcbiAgICBwYXJhbXMucm90YXRpb24gPSBpc05hTihwYXJhbXMucm90YXRpb24pID8gMCA6IE1hdGgucm91bmQocGFyYW1zLnJvdGF0aW9uIC8gOTApICogOTA7XG4gICAgcGFyYW1zLmNhbnZhc1NjYWxlWCA9IGlzTmFOKHBhcmFtcy5jYW52YXNTY2FsZVgpID8gMSA6IE51bWJlcihwYXJhbXMuY2FudmFzU2NhbGVYKTtcbiAgICBwYXJhbXMuY2FudmFzU2NhbGVZID0gaXNOYU4ocGFyYW1zLmNhbnZhc1NjYWxlWSkgPyAxIDogTnVtYmVyKHBhcmFtcy5jYW52YXNTY2FsZVkpO1xuICAgIHBhcmFtcy5zY2FsZVggPSBpc05hTihwYXJhbXMuc2NhbGVYKSA/IDEgOiBOdW1iZXIocGFyYW1zLnNjYWxlWCk7XG4gICAgcGFyYW1zLnNjYWxlWSA9IGlzTmFOKHBhcmFtcy5zY2FsZVkpID8gMSA6IE51bWJlcihwYXJhbXMuc2NhbGVZKTtcbiAgICBwYXJhbXMuY3JvcCA9IGlzQm9vbGVhbihwYXJhbXMuY3JvcCkgPyBwYXJhbXMuY3JvcCA6IHBhcmFtcy5jcm9wID09IFwidHJ1ZVwiO1xuXG4gICAgbGV0IGJ1ZmZlciA9IHNyYyBpbnN0YW5jZW9mIFJlYWRhYmxlID8gYXdhaXQgc3RyZWFtVG9CdWZmZXIoc3JjKSA6IHNyYyBhcyBhbnk7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IGNyb3AgaW5mb1xuICAgICAgICBjb25zdCBjcm9wQmVmb3JlID0gdG9Dcm9wUmVnaW9uKHBhcmFtcy5jcm9wQmVmb3JlIHx8IChwYXJhbXMuY3JvcCA/IG1ldGEuY3JvcEJlZm9yZSA6IG51bGwpKTtcbiAgICAgICAgY29uc3QgY3JvcEFmdGVyID0gdG9Dcm9wUmVnaW9uKHBhcmFtcy5jcm9wQWZ0ZXIgfHwgKHBhcmFtcy5jcm9wID8gbWV0YS5jcm9wQWZ0ZXIgOiBudWxsKSk7XG4gICAgICAgIC8vIEdldCBtZXRhZGF0YVxuICAgICAgICBsZXQgaW1nID0gc2hhcnAoYnVmZmVyKTtcbiAgICAgICAgbGV0IHt3aWR0aCwgaGVpZ2h0fSA9IGF3YWl0IGltZy5tZXRhZGF0YSgpO1xuICAgICAgICAvLyBDcm9wIGJlZm9yZSByZXNpemVcbiAgICAgICAgaWYgKGNyb3BCZWZvcmUpIHtcbiAgICAgICAgICAgIHdpZHRoID0gY3JvcEJlZm9yZS53aWR0aDtcbiAgICAgICAgICAgIGhlaWdodCA9IGNyb3BCZWZvcmUuaGVpZ2h0O1xuICAgICAgICAgICAgaW1nID0gaW1nLmV4dHJhY3QoY3JvcEJlZm9yZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY3JvcCkge1xuICAgICAgICAgICAgd2lkdGggPSBjcm9wLndpZHRoO1xuICAgICAgICAgICAgaGVpZ2h0ID0gY3JvcC5oZWlnaHQ7XG4gICAgICAgICAgICBpbWcgPSBpbWcuZXh0cmFjdChjcm9wKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXNpemUgY2FudmFzXG4gICAgICAgIGNvbnN0IGNhbnZhc1NjYWxlWCA9IG1ldGE/LmNhbnZhc1NjYWxlWCB8fCAxO1xuICAgICAgICBjb25zdCBjYW52YXNTY2FsZVkgPSBtZXRhPy5jYW52YXNTY2FsZVkgfHwgMTtcbiAgICAgICAgaWYgKHBhcmFtcy5jYW52YXNTY2FsZVggIT09IGNhbnZhc1NjYWxlWCB8fCBwYXJhbXMuY2FudmFzU2NhbGVZICE9PSBjYW52YXNTY2FsZVkpIHtcbiAgICAgICAgICAgIHdpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCAqIHBhcmFtcy5jYW52YXNTY2FsZVgpO1xuICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQgKiBwYXJhbXMuY2FudmFzU2NhbGVZKTtcbiAgICAgICAgICAgIGltZyA9IGltZy5yZXNpemUoe3dpZHRoLCBoZWlnaHQsIGJhY2tncm91bmQ6IFwiIzAwMDAwMDAwXCIsIGZpdDogXCJjb250YWluXCJ9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXNpemUgaW1hZ2VcbiAgICAgICAgaWYgKHBhcmFtcy5zY2FsZVggIT09IDEgfHwgcGFyYW1zLnNjYWxlWSAhPT0gMSkge1xuICAgICAgICAgICAgd2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoICogcGFyYW1zLnNjYWxlWCk7XG4gICAgICAgICAgICBoZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCAqIHBhcmFtcy5zY2FsZVkpO1xuICAgICAgICAgICAgaW1nID0gaW1nLnJlc2l6ZSh7d2lkdGgsIGhlaWdodCwgYmFja2dyb3VuZDogXCIjMDAwMDAwMDBcIiwgZml0OiBcImZpbGxcIn0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIENyb3AgYWZ0ZXIgcmVzaXplXG4gICAgICAgIGlmIChjcm9wQWZ0ZXIpIHtcbiAgICAgICAgICAgIGltZyA9IGltZy5leHRyYWN0KGNyb3BBZnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUm90YXRlXG4gICAgICAgIGlmIChwYXJhbXMucm90YXRpb24gIT09IDApIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IGF3YWl0IGltZy50b0J1ZmZlcigpO1xuICAgICAgICAgICAgaW1nID0gc2hhcnAoYnVmZmVyKS5yb3RhdGUocGFyYW1zLnJvdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBidWZmZXIgPSBhd2FpdCBpbWcudG9CdWZmZXIoKTtcbiAgICAgICAgc3JjID0gc3JjIGluc3RhbmNlb2YgUmVhZGFibGUgPyBidWZmZXJUb1N0cmVhbShidWZmZXIpIDogYnVmZmVyO1xuICAgICAgICByZXR1cm4gc3JjO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJJbWFnZSBjb252ZXJzaW9uIGVycm9yXCIsIGUpO1xuICAgICAgICBzcmMgPSBzcmMgaW5zdGFuY2VvZiBSZWFkYWJsZSA/IGJ1ZmZlclRvU3RyZWFtKGJ1ZmZlcikgOiBidWZmZXI7XG4gICAgICAgIHJldHVybiBzcmM7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVmZmVyVG9TdHJlYW0oYnVmZmVyOiBCdWZmZXIpOiBSZWFkYWJsZSB7XG4gICAgY29uc3QgcmVhZFN0cmVhbSA9IG5ldyBQYXNzVGhyb3VnaCgpO1xuICAgIHJlYWRTdHJlYW0uZW5kKGJ1ZmZlcik7XG4gICAgcmV0dXJuIHJlYWRTdHJlYW1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmVhbVRvQnVmZmVyKHN0cmVhbTogUmVhZGFibGUpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxCdWZmZXI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgY29uY2F0ID0gW107XG4gICAgICAgIHN0cmVhbS5vbihcImRhdGFcIiwgZGF0YSA9PiB7XG4gICAgICAgICAgICBjb25jYXQucHVzaChkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0cmVhbS5vbihcImVycm9yXCIsIHJlamVjdCk7XG4gICAgICAgIHN0cmVhbS5vbihcImVuZFwiLCAoKSA9PiByZXNvbHZlKEJ1ZmZlci5jb25jYXQoY29uY2F0KSkpO1xuICAgIH0pXG59XG5cbmNsYXNzIFJlYWRhYmxlU3RyZWFtQ2xvbmUgZXh0ZW5kcyBSZWFkYWJsZSB7XG5cbiAgICBjb25zdHJ1Y3RvcihyZWFkYWJsZVN0cmVhbTogUmVhZGFibGUsIG9wdHM/OiBSZWFkYWJsZU9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHJlYWRhYmxlU3RyZWFtPy5vbihcImRhdGFcIiwgY2h1bmsgPT4ge1xuICAgICAgICAgICAgdGhpcy5wdXNoKGNodW5rKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlYWRhYmxlU3RyZWFtPy5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnB1c2gobnVsbCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZWFkYWJsZVN0cmVhbT8ub24oXCJlcnJvclwiLCBlcnIgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3JlYWQoc2l6ZTogbnVtYmVyKSB7XG5cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5U3RyZWFtKHN0cmVhbTogUmVhZGFibGUsIG9wdHM/OiBSZWFkYWJsZU9wdGlvbnMpOiBSZWFkYWJsZSB7XG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZVN0cmVhbUNsb25lKHN0cmVhbSwgb3B0cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBta2RpclJlY3Vyc2l2ZShwYXRoOiBzdHJpbmcsIG1vZGU6IG51bWJlciA9IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBta2RpcihwYXRoLCB7bW9kZTogbW9kZSB8fCAwbzc3NywgcmVjdXJzaXZlOiB0cnVlfSwgZXJyID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlRmlsZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB1bmxpbmsocGF0aCwgZXJyID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZpbGUocGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8QnVmZmVyPigocmVzLCByZWopID0+IHtcbiAgICAgICAgZnNSZWFkRmlsZShwYXRoLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVqKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBbmREZWxldGVGaWxlKHBhdGg6IHN0cmluZywgdGltZW91dDogbnVtYmVyID0gNTAwMCk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlYWRGaWxlKHBhdGgpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB1bmxpbmsocGF0aCwgKCkgPT4ge1xuICAgICAgICB9KTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgICByZXR1cm4gZGF0YTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlRmlsZShwYXRoOiBzdHJpbmcsIGRhdGE6IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgYXdhaXQgbWtkaXJSZWN1cnNpdmUoZGlybmFtZShwYXRoKSk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPEJ1ZmZlcj4oKHJlcywgcmVqKSA9PiB7XG4gICAgICAgIGZzV3JpdGVGaWxlKHBhdGgsIGRhdGEsIGVyciA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVqKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlVG9Qcm9taXNlKHZhbHVlOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UgPyB2YWx1ZSA6IFByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9taXNlVGltZW91dCh0aW1lb3V0OiBudW1iZXIgPSAxMDAwLCBlcnJvcjogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGBUaW1lb3V0IGV4Y2VlZGVkOiAke3RpbWVvdXR9bXNgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKGBUaW1lb3V0OiAke3RpbWVvdXR9bXNgKTtcbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25zdHJ1Y3Rvck5hbWUodHlwZTogVHlwZTxhbnk+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZS5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bmN0aW9uUGFyYW1zKGZ1bmM6IEZ1bmN0aW9uKTogc3RyaW5nW10ge1xuICAgIC8vIFJlbW92ZSBjb21tZW50cyBvZiB0aGUgZm9ybSAvKiAuLi4gKi9cbiAgICAvLyBSZW1vdmluZyBjb21tZW50cyBvZiB0aGUgZm9ybSAvL1xuICAgIC8vIFJlbW92ZSBib2R5IG9mIHRoZSBmdW5jdGlvbiB7IC4uLiB9XG4gICAgLy8gcmVtb3ZpbmcgXCI9PlwiIGlmIGZ1bmMgaXMgYXJyb3cgZnVuY3Rpb25cbiAgICBjb25zdCBzdHIgPSBmdW5jLnRvU3RyaW5nKClcbiAgICAgICAgLnJlcGxhY2UoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgXCJcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcL1xcLyguKSovZywgXCJcIilcbiAgICAgICAgLnJlcGxhY2UoL3tbXFxzXFxTXSp9LywgXCJcIilcbiAgICAgICAgLnJlcGxhY2UoLz0+L2csIFwiXCIpXG4gICAgICAgIC50cmltKCk7XG5cbiAgICAvLyBTdGFydCBwYXJhbWV0ZXIgbmFtZXMgYWZ0ZXIgZmlyc3QgXCIoXCJcbiAgICBjb25zdCBzdGFydCA9IHN0ci5pbmRleE9mKFwiKFwiKSArIDE7XG5cbiAgICAvLyBFbmQgcGFyYW1ldGVyIG5hbWVzIGlzIGp1c3QgYmVmb3JlIGxhc3QgXCIpXCJcbiAgICBjb25zdCBlbmQgPSBzdHIubGVuZ3RoIC0gMTtcbiAgICBjb25zdCByZXN1bHQgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLnNwbGl0KFwiLCBcIik7XG4gICAgY29uc3QgcGFyYW1zID0gW107XG5cbiAgICByZXN1bHQuZm9yRWFjaChlbGVtZW50ID0+IHtcblxuICAgICAgICAvLyBSZW1vdmluZyBhbnkgZGVmYXVsdCB2YWx1ZVxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5yZXBsYWNlKC89W1xcc1xcU10qL2csIFwiXCIpLnRyaW0oKTtcblxuICAgICAgICBpZiAoZWxlbWVudC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcGFyYW1zLnB1c2goZWxlbWVudCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGFyYW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZU5hbWUocGF0aDogc3RyaW5nLCB3aXRoRXh0ZW5zaW9uOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShwYXRoIHx8IFwiXCIpO1xuICAgIHJldHVybiB3aXRoRXh0ZW5zaW9uID8gbmFtZSA6IG5hbWUuc3BsaXQoXCIuXCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiLlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuc2lvbihwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShwYXRoIHx8IFwiXCIpO1xuICAgIHJldHVybiBuYW1lLnNwbGl0KFwiLlwiKS5wb3AoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlkU3RyaW5nKCk6IGFueSB7XG4gICAgcmV0dXJuIG5ldyBPYmplY3RJZCgpLnRvSGV4U3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZFRvU3RyaW5nKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUubWFwKGlkVG9TdHJpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBPYmplY3RJZCB8fCB2YWx1ZSBpbnN0YW5jZW9mIG1vbmdvb3NlLlR5cGVzLk9iamVjdElkXG4gICAgICAgID8gdmFsdWUudG9IZXhTdHJpbmcoKVxuICAgICAgICA6IChpc1N0cmluZyh2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlIHx8IG51bGwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHJhbnNmb3JtZXIodHJhbnNmb3JtPzogKGRvYzogRG9jdW1lbnQsIHJldDogYW55LCBvcHRpb25zPzogYW55KSA9PiBhbnkpIHtcbiAgICByZXR1cm4gKGRvYzogRG9jdW1lbnQsIHJldDogYW55LCBvcHRpb25zPzogYW55KSA9PiB7XG4gICAgICAgIHJldC5pZCA9IGlkVG9TdHJpbmcocmV0LmlkKSB8fCByZXQuaWQ7XG4gICAgICAgIGlmIChkb2MuX2lkKSB7XG4gICAgICAgICAgICByZXQuX2lkID0gaWRUb1N0cmluZyhkb2MuX2lkKTtcbiAgICAgICAgICAgIHJldC5pZCA9IHJldC5pZCB8fCByZXQuX2lkO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSByZXQuX192O1xuICAgICAgICByZXR1cm4gaXNGdW5jdGlvbih0cmFuc2Zvcm0pID8gdHJhbnNmb3JtKGRvYywgcmV0LCBvcHRpb25zKSB8fCByZXQgOiByZXQ7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJyb2FkY2FzdChzb2NrZXRTZXJ2ZXI6IFNlcnZlciwgY2I6IChjbGllbnQ6IElDbGllbnRTb2NrZXQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBzb2NrZXRTZXJ2ZXIuc29ja2V0cy5zb2NrZXRzLmZvckVhY2goKGNsaWVudDogSUNsaWVudFNvY2tldCkgPT4ge1xuICAgICAgICBjYihjbGllbnQpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmFuZChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHJhbmRvbShtaW4sIG1heCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIG1pbiArIE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpU3Vic2NyaXB0aW9uKC4uLnN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdKTogU3Vic2NyaXB0aW9uIHtcbiAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbigoKSA9PiB7XG4gICAgICAgIHN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHtcbiAgICAgICAgICAgIHMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvYnNlcnZhYmxlRnJvbUZ1bmN0aW9uKGNhbGxiYWNrRnVuYzogKCkgPT4gYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgc3ViamVjdDogYW55O1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxhbnk+KChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICAgIGlmICghc3ViamVjdCkge1xuICAgICAgICAgICAgc3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN1YmplY3QgPSBmcm9tKGNhbGxiYWNrRnVuYygpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHN1YmplY3QuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3ViamVjdC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWRMZWZ0KHZhbHVlOiBhbnksIGNvdW50OiBudW1iZXIgPSAzLCBwYWRXaXRoOiBzdHJpbmcgPSBcIjBcIik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWAucGFkU3RhcnQoY291bnQsIHBhZFdpdGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFkUmlnaHQodmFsdWU6IGFueSwgY291bnQ6IG51bWJlciA9IDMsIHBhZFdpdGg6IHN0cmluZyA9IFwiMFwiKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dmFsdWV9YC5wYWRFbmQoY291bnQsIHBhZFdpdGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FtZWxDYXNlVG9EYXNoKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csIFwiJDEtJDJcIikudG9Mb3dlckNhc2UoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGd6aXBQcm9taXNlZChkYXRhOiBzdHJpbmcsIG9wdHM/OiBabGliT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgZ3ppcChkYXRhLCBvcHRzLCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdC50b1N0cmluZyhcImJhc2U2NFwiKSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ3VuemlwUHJvbWlzZWQoZGF0YTogc3RyaW5nLCBvcHRzPzogWmxpYk9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGd1bnppcChCdWZmZXIuZnJvbShkYXRhLCBcImJhc2U2NFwiKSwgb3B0cywgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVGcm9tQnVja2V0KGJ1Y2tldDogR3JpZEZTQnVja2V0LCBpZDogT2JqZWN0SWQgfCBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGZpbGVJZCA9IGlkIGluc3RhbmNlb2YgT2JqZWN0SWQgPyBpZCA6IG5ldyBPYmplY3RJZChpZCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3QgY2FyZSBhYm91dCBlbXB0eSBpZFxuICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBidWNrZXQuZGVsZXRlKGZpbGVJZCwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgbGV0IGVyciA9IGVycm9yIGFzIGFueTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGVyciA9IGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IgfHwgXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoIWlzU3RyaW5nKGVycikgfHwgIWVyci5zdGFydHNXaXRoKFwiRmlsZU5vdEZvdW5kXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShmaWxlSWQudG9IZXhTdHJpbmcoKSk7XG4gICAgICAgIH0pO1xuICAgIH0pKTtcbn1cblxuY29uc3QgZGVmYXVsdFByZWRpY2F0ZTogRmlsdGVyUHJlZGljYXRlID0gKCkgPT4gdHJ1ZTtcblxuZnVuY3Rpb24gY29weVJlY3Vyc2l2ZSh0YXJnZXQ6IGFueSwgc291cmNlOiBhbnksIHByZWRpY2F0ZTogRmlsdGVyUHJlZGljYXRlLCBjb3BpZXM6IE1hcDxhbnksIGFueT4pOiBhbnkge1xuICAgIGlmIChpc1ByaW1pdGl2ZShzb3VyY2UpIHx8IGlzRGF0ZShzb3VyY2UpIHx8IGlzRnVuY3Rpb24oc291cmNlKSkgcmV0dXJuIHNvdXJjZTtcbiAgICBpZiAoY29waWVzLmhhcyhzb3VyY2UpKSByZXR1cm4gY29waWVzLmdldChzb3VyY2UpO1xuICAgIGlmIChpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgdGFyZ2V0ID0gaXNBcnJheSh0YXJnZXQpID8gQXJyYXkuZnJvbSh0YXJnZXQpIDogW107XG4gICAgICAgIHNvdXJjZS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFwcmVkaWNhdGUoaXRlbSwgaW5kZXgsIHRhcmdldCwgc291cmNlKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHRhcmdldC5sZW5ndGggPiBpbmRleClcbiAgICAgICAgICAgICAgICB0YXJnZXRbaW5kZXhdID0gY29weVJlY3Vyc2l2ZSh0YXJnZXRbaW5kZXhdLCBpdGVtLCBwcmVkaWNhdGUsIGNvcGllcyk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goY29weVJlY3Vyc2l2ZShudWxsLCBpdGVtLCBwcmVkaWNhdGUsIGNvcGllcykpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29waWVzLnNldChzb3VyY2UsIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIGlmIChpc0J1ZmZlcihzb3VyY2UpKSByZXR1cm4gQnVmZmVyLmZyb20oc291cmNlKTtcblxuICAgIC8vIElmIG9iamVjdCBkZWZpbmVzIF9fc2hvdWxkQ29weSBhcyBmYWxzZSwgdGhlbiBkb24ndCBjb3B5IGl0XG4gICAgaWYgKHNvdXJjZS5fX3Nob3VsZENvcHkgPT09IGZhbHNlKSByZXR1cm4gc291cmNlO1xuICAgIC8vIENvcHkgb2JqZWN0XG4gICAgY29uc3Qgc2hvdWxkQ29weSA9IGlzRnVuY3Rpb24oc291cmNlLl9fc2hvdWxkQ29weSkgPyBzb3VyY2UuX19zaG91bGRDb3B5IDogKCkgPT4gdHJ1ZTtcbiAgICBpZiAoaXNDb25zdHJ1Y3Rvcihzb3VyY2UuY29uc3RydWN0b3IpKSB7XG4gICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IG5ldyBzb3VyY2UuY29uc3RydWN0b3IoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm90byA9IHNvdXJjZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgfHwgc291cmNlLnByb3RvdHlwZTtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBPYmplY3QuY3JlYXRlKHByb3RvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldCA9IE9iamVjdC5hc3NpZ24oe30sIHRhcmdldCB8fCB7fSk7XG4gICAgfVxuICAgIC8vIFNldCB0byBjb3BpZXMgdG8gcHJldmVudCBjaXJjdWxhciByZWZlcmVuY2VzXG4gICAgY29waWVzLnNldChzb3VyY2UsIHRhcmdldCk7XG5cbiAgICAvLyBDb3B5IG1hcCBlbnRyaWVzXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmICghcHJlZGljYXRlKHZhbHVlLCBrZXksIHRhcmdldCwgc291cmNlKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LnNldChrZXksICFzaG91bGRDb3B5KGtleSwgdmFsdWUpID8gdmFsdWUgOiBjb3B5UmVjdXJzaXZlKHRhcmdldC5nZXQoa2V5KSwgdmFsdWUsIHByZWRpY2F0ZSwgY29waWVzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICAvLyBDb3B5IG9iamVjdCBtZW1iZXJzXG4gICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoIXByZWRpY2F0ZShzb3VyY2Vba2V5XSwga2V5LCB0YXJnZXQsIHNvdXJjZSkpIHJldHVybjtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSAhc2hvdWxkQ29weShrZXksIHNvdXJjZVtrZXldKSA/IHNvdXJjZVtrZXldIDogY29weVJlY3Vyc2l2ZSh0YXJnZXRba2V5XSwgc291cmNlW2tleV0sIHByZWRpY2F0ZSwgY29waWVzKTtcbiAgICB9LCB0YXJnZXQpO1xuXG4gICAgLy8gQ29weSBvYmplY3QgcHJvcGVydGllc1xuICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKTtcbiAgICBrZXlzID0gT2JqZWN0LmtleXMoZGVzY3JpcHRvcnMpLmZpbHRlcihrID0+IGtleXMuaW5kZXhPZihrKSA8IDApO1xuICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3JzW2tleV0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXI8VD4ob2JqOiBULCBwcmVkaWNhdGU6IEZpbHRlclByZWRpY2F0ZSk6IFBhcnRpYWw8VD4ge1xuICAgIHJldHVybiBjb3B5UmVjdXJzaXZlKG51bGwsIG9iaiwgcHJlZGljYXRlIHx8IGRlZmF1bHRQcmVkaWNhdGUsIG5ldyBNYXAoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5PFQ+KG9iajogVCk6IFQge1xuICAgIHJldHVybiBjb3B5UmVjdXJzaXZlKG51bGwsIG9iaiwgZGVmYXVsdFByZWRpY2F0ZSwgbmV3IE1hcCgpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2lnbjxUPih0YXJnZXQ6IFQsIHNvdXJjZTogYW55LCBwcmVkaWNhdGU/OiBGaWx0ZXJQcmVkaWNhdGUpOiBUIHtcbiAgICByZXR1cm4gY29weVJlY3Vyc2l2ZSh0YXJnZXQsIHNvdXJjZSwgcHJlZGljYXRlLCBuZXcgTWFwKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWQ1KGRhdGE6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKGlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAgIGRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICB9XG4gICAgaWYgKCFpc1N0cmluZyhkYXRhKSkge1xuICAgICAgICB0aHJvdyBgQ2FuJ3QgbWQ1IG90aGVyIHRoYXQgcmF3IG9iamVjdCBvciBzdHJpbmdgO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlSGFzaChcIm1kNVwiKS51cGRhdGUoZGF0YSkuZGlnZXN0KFwiaGV4XCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuQ29tbWFuZChzY3JpcHRQYXRoOiBzdHJpbmcsIGV4cGVjdGVkQ29kZTogbnVtYmVyID0gMCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgY3AgPSBleGVjQ2hpbGRQcm9jZXNzKHNjcmlwdFBhdGgsIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgJiYgZXhwZWN0ZWRDb2RlICE9PSBlcnJvci5jb2RlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbGluZXMgPSAoc3Rkb3V0IHx8IFwiXCIpLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBudWxsO1xuICAgICAgICAgICAgd2hpbGUgKCFsaW5lICYmIGxpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsaW5lID0gbGluZXMucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKGxpbmUpO1xuICAgICAgICB9KTtcbiAgICAgICAgY3Auc3Rkb3V0Lm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YS50b1N0cmluZygpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNwLnN0ZGVyci5vbihcImRhdGFcIiwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZGF0YS50b1N0cmluZygpKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBlbnVtIENvbnNvbGVDb2xvciB7XG4gICAgUmVzZXQgPSBcIlxceDFiWzBtXCIsXG4gICAgQnJpZ2h0ID0gXCJcXHgxYlsxbVwiLFxuICAgIERpbSA9IFwiXFx4MWJbMm1cIixcbiAgICBVbmRlcnNjb3JlID0gXCJcXHgxYls0bVwiLFxuICAgIEJsaW5rID0gXCJcXHgxYls1bVwiLFxuICAgIFJldmVyc2UgPSBcIlxceDFiWzdtXCIsXG4gICAgSGlkZGVuID0gXCJcXHgxYls4bVwiLFxuXG4gICAgRmdCbGFjayA9IFwiXFx4MWJbMzBtXCIsXG4gICAgRmdSZWQgPSBcIlxceDFiWzMxbVwiLFxuICAgIEZnR3JlZW4gPSBcIlxceDFiWzMybVwiLFxuICAgIEZnWWVsbG93ID0gXCJcXHgxYlszM21cIixcbiAgICBGZ0JsdWUgPSBcIlxceDFiWzM0bVwiLFxuICAgIEZnTWFnZW50YSA9IFwiXFx4MWJbMzVtXCIsXG4gICAgRmdDeWFuID0gXCJcXHgxYlszNm1cIixcbiAgICBGZ1doaXRlID0gXCJcXHgxYlszN21cIixcbiAgICBGZ0RlZmF1bHQgPSBcIlxceDFiWzM4bVwiLFxuXG4gICAgQmdCbGFjayA9IFwiXFx4MWJbNDBtXCIsXG4gICAgQmdSZWQgPSBcIlxceDFiWzQxbVwiLFxuICAgIEJnR3JlZW4gPSBcIlxceDFiWzQybVwiLFxuICAgIEJnWWVsbG93ID0gXCJcXHgxYls0M21cIixcbiAgICBCZ0JsdWUgPSBcIlxceDFiWzQ0bVwiLFxuICAgIEJnTWFnZW50YSA9IFwiXFx4MWJbNDVtXCIsXG4gICAgQmdDeWFuID0gXCJcXHgxYls0Nm1cIixcbiAgICBCZ1doaXRlID0gXCJcXHgxYls0N21cIixcbiAgICBCZ0RlZmF1bHQgPSBcIlxceDFiWzQ4bVwiXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUpzb25Db2xvcnMge1xuICAgIGtleUNvbG9yPzogQ29uc29sZUNvbG9yO1xuICAgIG51bWJlckNvbG9yPzogQ29uc29sZUNvbG9yO1xuICAgIHN0cmluZ0NvbG9yPzogQ29uc29sZUNvbG9yO1xuICAgIHRydWVDb2xvcj86IENvbnNvbGVDb2xvcjtcbiAgICBmYWxzZUNvbG9yPzogQ29uc29sZUNvbG9yO1xuICAgIG51bGxDb2xvcj86IENvbnNvbGVDb2xvcjtcbn1cblxuY29uc3QgZGVmYXVsdENvbG9yczogSUpzb25Db2xvcnMgPSB7XG4gICAga2V5Q29sb3I6IENvbnNvbGVDb2xvci5GZ1doaXRlLFxuICAgIG51bWJlckNvbG9yOiBDb25zb2xlQ29sb3IuRmdCbHVlLFxuICAgIHN0cmluZ0NvbG9yOiBDb25zb2xlQ29sb3IuRmdZZWxsb3csXG4gICAgdHJ1ZUNvbG9yOiBDb25zb2xlQ29sb3IuRmdHcmVlbixcbiAgICBmYWxzZUNvbG9yOiBDb25zb2xlQ29sb3IuRmdSZWQsXG4gICAgbnVsbENvbG9yOiBDb25zb2xlQ29sb3IuQmdNYWdlbnRhXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xvcml6ZShpbnB1dDogYW55LCBjb2xvcjogQ29uc29sZUNvbG9yKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7Y29sb3J9JHtpbnB1dH0ke0NvbnNvbGVDb2xvci5SZXNldH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganNvbkhpZ2hsaWdodChpbnB1dDogc3RyaW5nIHwgb2JqZWN0LCBjb2xvck9wdGlvbnM/OiBJSnNvbkNvbG9ycyk6IHN0cmluZyB7XG4gICAgY29uc3QgY29sb3JzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdENvbG9ycywgY29sb3JPcHRpb25zKVxuICAgIGNvbnN0IGpzb24gPSAoaXNTdHJpbmcoaW5wdXQpID8gaW5wdXQgOiBKU09OLnN0cmluZ2lmeShpbnB1dCwgbnVsbCwgMikpLnJlcGxhY2UoLyYvZywgJyYnKS5yZXBsYWNlKC88L2csICc8JykucmVwbGFjZSgvPi9nLCAnPicpXG4gICAgcmV0dXJuIGpzb24ucmVwbGFjZSgvKFwiKFxcXFx1W2EtekEtWjAtOV17NH18XFxcXFtedV18W15cXFxcXCJdKSpcIihcXHMqOik/fFxcYih0cnVlfGZhbHNlfG51bGwpXFxifC0/XFxkKyg/OlxcLlxcZCopPyg/OltlRV1bK10/XFxkKyk/KS9nLCAobWF0Y2gpID0+IHtcbiAgICAgICAgbGV0IGNvbG9yID0gY29sb3JzLm51bWJlckNvbG9yXG4gICAgICAgIGlmICgvXlwiLy50ZXN0KG1hdGNoKSkge1xuICAgICAgICAgICAgaWYgKC86JC8udGVzdChtYXRjaCkpIHtcbiAgICAgICAgICAgICAgICBjb2xvciA9IGNvbG9ycy5rZXlDb2xvclxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2xvciA9IGNvbG9ycy5zdHJpbmdDb2xvcjtcbiAgICAgICAgICAgICAgICBtYXRjaCA9ICdcIicgKyBtYXRjaC5zdWJzdHIoMSwgbWF0Y2gubGVuZ3RoIC0gMikgKyAnXCInO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29sb3IgPSAvdHJ1ZS8udGVzdChtYXRjaClcbiAgICAgICAgICAgICAgICA/IGNvbG9ycy50cnVlQ29sb3JcbiAgICAgICAgICAgICAgICA6IC9mYWxzZS8udGVzdChtYXRjaClcbiAgICAgICAgICAgICAgICAgICAgPyBjb2xvcnMuZmFsc2VDb2xvclxuICAgICAgICAgICAgICAgICAgICA6IC9udWxsLy50ZXN0KG1hdGNoKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjb2xvcnMubnVsbENvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGNvbG9yXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2NvbG9yfSR7bWF0Y2h9JHtDb25zb2xlQ29sb3IuUmVzZXR9YFxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlU3BlY2lhbENoYXJzKHN0cjogc3RyaW5nLCB0bzogc3RyaW5nID0gXCItXCIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtzdHJ9YC5yZXBsYWNlKC9bJlxcL1xcXFwjLCArKCkkfiUuQCdcIjoqPzw+e31dL2csIHRvKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2V4RXNjYXBlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7c3RyfWAucmVwbGFjZSgvWy1cXC9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKGFycjogYW55W10pOiBhbnlbXSB7XG4gICAgcmV0dXJuIGFyci5yZWR1Y2UoKGZsYXQsIHRvRmxhdHRlbikgPT4ge1xuICAgICAgICByZXR1cm4gZmxhdC5jb25jYXQoaXNBcnJheSh0b0ZsYXR0ZW4pID8gZmxhdHRlbih0b0ZsYXR0ZW4pIDogdG9GbGF0dGVuKTtcbiAgICB9LCBbXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwRXJyb3IoZTogYW55LCBtZXNzYWdlOiBzdHJpbmcsIGh0dHBDb2RlOiBudW1iZXIgPSA1MDApOiBFcnJvciB7XG4gICAgaWYgKGF4aW9zLmlzQXhpb3NFcnJvcihlKSkge1xuICAgICAgICBlLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICByZXR1cm4gZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBIdHRwRXJyb3IoaHR0cENvZGUsIGAke21lc3NhZ2V9OiAke2V9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaXJOYW1lKCk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiBfX2Rpcm5hbWUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbiAgICAgICAgcmV0dXJuIGRpcm5hbWUoX19maWxlbmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBfX2Rpcm5hbWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlVXJsKGVuZGluZzogc3RyaW5nID0gXCIvXCIpOiBQYXJhbVJlc29sdmVyIHtcbiAgICByZXR1cm4gdXJsID0+IHtcbiAgICAgICAgcmV0dXJuIHVybCA/IGAke3VybC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpfSR7ZW5kaW5nfWAgOiBlbmRpbmc7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgcHJlcGFyZVVybFNsYXNoID0gcHJlcGFyZVVybChcIi9cIik7XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlVXJsRW1wdHkgPSBwcmVwYXJlVXJsKFwiXCIpO1xuXG5mdW5jdGlvbiBjaGVja1RleHRGaWxlVHlwZSh0eXBlOiBJRmlsZVR5cGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZS5taW1lLmluZGV4T2YoXCJ0ZXh0XCIpID49IDAgfHwgdHlwZS5taW1lLmluZGV4T2YoXCJ4bWxcIikgPj0gMDtcbn1cblxuZnVuY3Rpb24gZml4VGV4dEZpbGVUeXBlKHR5cGU6IElGaWxlVHlwZSwgYnVmZmVyOiBCdWZmZXIpOiBJRmlsZVR5cGUge1xuICAgIGNvbnN0IHRleHQgPSBidWZmZXIudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgIGlmICh0ZXh0LmluZGV4T2YoXCI8c3ZnXCIpID49IDApIHtcbiAgICAgICAgcmV0dXJuIHtleHQ6IFwic3ZnXCIsIG1pbWU6IFwiaW1hZ2Uvc3ZnK3htbFwifTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGU7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaWxlVHlwZUZyb21CdWZmZXIoYnVmZmVyOiBCdWZmZXIpOiBQcm9taXNlPElGaWxlVHlwZT4ge1xuICAgIGNvbnN0IHN0cmVhbSA9IGJ1ZmZlclRvU3RyZWFtKGJ1ZmZlcik7XG4gICAgY29uc3QgdHlwZSA9IChhd2FpdCBmdEZyb21CdWZmZXIoYnVmZmVyKSA/PyB7ZXh0OiBcInR4dFwiLCBtaW1lOiBcInRleHQvcGxhaW5cIn0pIGFzIElGaWxlVHlwZTtcbiAgICBpZiAoY2hlY2tUZXh0RmlsZVR5cGUodHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGZpeFRleHRGaWxlVHlwZSh0eXBlLCBidWZmZXIpO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbGVUeXBlRnJvbVN0cmVhbShzdHJlYW06IEFueVdlYkJ5dGVTdHJlYW0pOiBQcm9taXNlPElGaWxlVHlwZT4ge1xuICAgIHJldHVybiAoYXdhaXQgZnRGcm9tU3RyZWFtKHN0cmVhbSkgPz8ge2V4dDogXCJ0eHRcIiwgbWltZTogXCJ0ZXh0L3BsYWluXCJ9KSBhcyBJRmlsZVR5cGU7XG59XG4iXX0=
|