@dcl/sdk 7.0.6-3999809037.commit-0a47a3c → 7.0.6-4009020955.commit-08722f5

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.
Files changed (94) hide show
  1. package/cli/commands/build/helpers.d.ts +25 -0
  2. package/cli/commands/build/helpers.js +50 -0
  3. package/cli/commands/build/helpers.ts +95 -0
  4. package/cli/commands/build/index.d.ts +19 -0
  5. package/cli/commands/build/index.js +64 -0
  6. package/cli/commands/build/index.ts +91 -0
  7. package/cli/commands/init/index.d.ts +3 -1
  8. package/cli/commands/init/index.js +9 -15
  9. package/cli/commands/init/index.ts +12 -16
  10. package/cli/commands/init/repos.js +1 -1
  11. package/cli/commands/init/repos.ts +1 -2
  12. package/cli/commands/preview/bff.d.ts +3 -0
  13. package/cli/commands/preview/bff.js +50 -0
  14. package/cli/commands/preview/bff.ts +59 -0
  15. package/cli/commands/preview/catalyst.d.ts +5 -0
  16. package/cli/commands/preview/catalyst.js +24 -0
  17. package/cli/commands/preview/catalyst.ts +31 -0
  18. package/cli/commands/preview/coordinates.d.ts +20 -0
  19. package/cli/commands/preview/coordinates.js +90 -0
  20. package/cli/commands/preview/coordinates.ts +146 -0
  21. package/cli/commands/preview/endpoints.d.ts +10 -0
  22. package/cli/commands/preview/endpoints.js +500 -0
  23. package/cli/commands/preview/endpoints.ts +594 -0
  24. package/cli/commands/preview/eth.d.ts +2 -0
  25. package/cli/commands/preview/eth.js +6 -0
  26. package/cli/commands/preview/eth.ts +3 -0
  27. package/cli/commands/preview/index.d.ts +18 -0
  28. package/cli/commands/preview/index.js +75 -0
  29. package/cli/commands/preview/index.ts +88 -0
  30. package/cli/commands/preview/port.d.ts +1 -0
  31. package/cli/commands/preview/port.js +21 -0
  32. package/cli/commands/preview/port.ts +15 -0
  33. package/cli/commands/preview/project.d.ts +14 -0
  34. package/cli/commands/preview/project.js +77 -0
  35. package/cli/commands/preview/project.ts +112 -0
  36. package/cli/commands/preview/types.d.ts +13 -0
  37. package/cli/commands/preview/types.js +3 -0
  38. package/cli/commands/preview/types.ts +19 -0
  39. package/cli/commands/preview/wire.d.ts +14 -0
  40. package/cli/commands/preview/wire.js +28 -0
  41. package/cli/commands/preview/wire.ts +48 -0
  42. package/cli/commands/preview/ws.d.ts +7 -0
  43. package/cli/commands/preview/ws.js +16 -0
  44. package/cli/commands/preview/ws.ts +24 -0
  45. package/cli/commands/start/index.d.ts +29 -0
  46. package/cli/commands/start/index.js +121 -0
  47. package/cli/commands/start/index.ts +132 -0
  48. package/cli/components/fetch.d.ts +5 -0
  49. package/cli/components/fetch.js +34 -0
  50. package/cli/components/fetch.ts +11 -0
  51. package/cli/components/fs.d.ts +11 -0
  52. package/cli/components/fs.js +58 -0
  53. package/cli/components/fs.ts +48 -0
  54. package/cli/components/index.d.ts +7 -0
  55. package/cli/components/index.js +13 -0
  56. package/cli/components/index.ts +14 -0
  57. package/cli/index.d.ts +2 -0
  58. package/cli/index.js +8 -8
  59. package/cli/index.ts +15 -12
  60. package/cli/utils/args.js +2 -2
  61. package/cli/utils/args.ts +2 -8
  62. package/cli/utils/commands.d.ts +2 -1
  63. package/cli/utils/commands.js +8 -8
  64. package/cli/utils/commands.ts +11 -11
  65. package/cli/utils/exec.d.ts +8 -0
  66. package/cli/utils/exec.js +33 -0
  67. package/cli/utils/exec.ts +38 -0
  68. package/cli/utils/fs.d.ts +9 -8
  69. package/cli/utils/fs.js +7 -47
  70. package/cli/utils/fs.ts +11 -67
  71. package/cli/utils/handler.d.ts +6 -0
  72. package/cli/utils/handler.js +19 -0
  73. package/cli/utils/handler.ts +23 -0
  74. package/cli/utils/object.d.ts +9 -0
  75. package/cli/utils/object.js +45 -0
  76. package/cli/utils/object.ts +62 -0
  77. package/cli/utils/out-messages.d.ts +1 -0
  78. package/cli/utils/out-messages.js +8 -0
  79. package/cli/utils/out-messages.ts +3 -0
  80. package/internal/Observable.js +3 -7
  81. package/internal/provider.js +1 -1
  82. package/internal/transports/rendererTransport.js +2 -3
  83. package/messageBus.js +1 -1
  84. package/observables.js +1 -1
  85. package/package.json +18 -7
  86. package/src/internal/Observable.ts +9 -44
  87. package/src/internal/provider.ts +3 -11
  88. package/src/internal/transports/rendererTransport.ts +4 -12
  89. package/src/messageBus.ts +1 -4
  90. package/src/observables.ts +27 -63
  91. package/tsconfig.cli.json +10 -1
  92. package/cli/utils/spinner.d.ts +0 -15
  93. package/cli/utils/spinner.js +0 -41
  94. package/cli/utils/spinner.ts +0 -44
@@ -0,0 +1,500 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.getFilesFromFolder = exports.setupEcs6Endpoints = void 0;
30
+ const path = __importStar(require("path"));
31
+ const fs = __importStar(require("fs"));
32
+ const glob_1 = require("glob");
33
+ const sdk_1 = require("@dcl/schemas/dist/sdk");
34
+ const schemas_1 = require("@dcl/schemas");
35
+ const ignore_1 = __importDefault(require("ignore"));
36
+ const node_fetch_1 = __importStar(require("node-fetch"));
37
+ const catalyst_1 = require("./catalyst");
38
+ function getCatalystUrl() {
39
+ return new URL('https://peer.decentraland.org');
40
+ }
41
+ function smartWearableNameToId(name) {
42
+ return name.toLocaleLowerCase().replace(/ /g, '-');
43
+ }
44
+ function setupEcs6Endpoints(dir, router) {
45
+ const baseFolders = [dir];
46
+ router.get('/scene.json', async () => {
47
+ return {
48
+ headers: { 'content-type': 'application/json' },
49
+ body: fs.createReadStream(path.join(dir, 'scene.json'))
50
+ };
51
+ });
52
+ router.get('/lambdas/explore/realms', async (ctx) => {
53
+ return {
54
+ body: [
55
+ {
56
+ serverName: 'localhost',
57
+ url: `http://${ctx.url.host}`,
58
+ layer: 'stub',
59
+ usersCount: 0,
60
+ maxUsers: 100,
61
+ userParcels: []
62
+ }
63
+ ]
64
+ };
65
+ });
66
+ router.get('/lambdas/contracts/servers', async (ctx) => {
67
+ return {
68
+ body: [
69
+ {
70
+ address: `http://${ctx.url.host}`,
71
+ owner: '0x0000000000000000000000000000000000000000',
72
+ id: '0x0000000000000000000000000000000000000000000000000000000000000000'
73
+ }
74
+ ]
75
+ };
76
+ });
77
+ router.get('/lambdas/profiles', async (ctx, next) => {
78
+ const baseUrl = `${ctx.url.protocol}//${ctx.url.host}/content/contents`;
79
+ try {
80
+ const previewWearables = getAllPreviewWearables({
81
+ baseFolders,
82
+ baseUrl
83
+ }).map((wearable) => wearable.id);
84
+ if (previewWearables.length === 1) {
85
+ const catalystUrl = getCatalystUrl();
86
+ const u = new URL(ctx.url.toString());
87
+ u.host = catalystUrl.host;
88
+ u.protocol = catalystUrl.protocol;
89
+ u.port = catalystUrl.port;
90
+ const req = await (0, node_fetch_1.default)(u.toString(), {
91
+ headers: {
92
+ connection: 'close'
93
+ },
94
+ method: ctx.request.method,
95
+ body: ctx.request.method === 'get' ? undefined : ctx.request.body
96
+ });
97
+ const deployedProfile = (await req.json());
98
+ if ((deployedProfile === null || deployedProfile === void 0 ? void 0 : deployedProfile.length) === 1) {
99
+ deployedProfile[0].avatars[0].avatar.wearables.push(...previewWearables);
100
+ return {
101
+ headers: {
102
+ 'content-type': req.headers.get('content-type') || 'application/binary'
103
+ },
104
+ body: deployedProfile
105
+ };
106
+ }
107
+ }
108
+ }
109
+ catch (err) {
110
+ console.warn(`Failed to catch profile and fill with preview wearables.`, err);
111
+ }
112
+ return next();
113
+ });
114
+ router.all('/lambdas/:path+', async (ctx) => {
115
+ const catalystUrl = getCatalystUrl();
116
+ const u = new URL(ctx.url.toString());
117
+ u.host = catalystUrl.host;
118
+ u.protocol = catalystUrl.protocol;
119
+ u.port = catalystUrl.port;
120
+ const req = await (0, node_fetch_1.default)(u.toString(), {
121
+ headers: {
122
+ connection: 'close'
123
+ },
124
+ method: ctx.request.method,
125
+ body: ctx.request.method === 'get' ? undefined : ctx.request.body
126
+ });
127
+ return {
128
+ headers: {
129
+ 'content-type': req.headers.get('content-type') || 'application/binary'
130
+ },
131
+ body: req.body
132
+ };
133
+ });
134
+ router.post('/content/entities', async (ctx) => {
135
+ const catalystUrl = getCatalystUrl();
136
+ const headers = new node_fetch_1.Headers();
137
+ console.log(ctx.request.headers);
138
+ const res = await (0, node_fetch_1.default)(`${catalystUrl.toString()}/content/entities`, {
139
+ method: 'post',
140
+ headers,
141
+ body: ctx.request.body
142
+ });
143
+ return res;
144
+ });
145
+ serveStatic(dir, router);
146
+ serveFolders(router, baseFolders);
147
+ }
148
+ exports.setupEcs6Endpoints = setupEcs6Endpoints;
149
+ function serveFolders(router, baseFolders) {
150
+ router.get('/content/contents/:hash', async (ctx, next) => {
151
+ if (ctx.params.hash && ctx.params.hash.startsWith('b64-')) {
152
+ const fullPath = path.resolve(Buffer.from(ctx.params.hash.replace(/^b64-/, ''), 'base64').toString('utf8'));
153
+ if (!baseFolders.find((folder) => fullPath.startsWith(folder))) {
154
+ return next();
155
+ }
156
+ return {
157
+ headers: {
158
+ 'x-timestamp': Date.now(),
159
+ 'x-sent': true,
160
+ 'cache-control': 'no-cache,private,max-age=1'
161
+ },
162
+ body: fs.createReadStream(fullPath)
163
+ };
164
+ }
165
+ return next();
166
+ });
167
+ async function pointerRequestHandler(pointers) {
168
+ if (!pointers || pointers.length === 0) {
169
+ return [];
170
+ }
171
+ const requestedPointers = new Set(pointers && typeof pointers === 'string' ? [pointers] : pointers);
172
+ const resultEntities = getSceneJson({
173
+ baseFolders,
174
+ pointers: Array.from(requestedPointers)
175
+ });
176
+ const catalystUrl = getCatalystUrl();
177
+ const remote = (0, catalyst_1.fetchEntityByPointer)(catalystUrl.toString(), pointers.filter(($) => !$.match(/-?\d+,-?\d+/)));
178
+ const serverEntities = Array.isArray(remote) ? remote : [];
179
+ return [...resultEntities, ...serverEntities];
180
+ }
181
+ router.get('/content/entities/scene', async (ctx) => {
182
+ return {
183
+ body: await pointerRequestHandler(ctx.url.searchParams.getAll('pointer'))
184
+ };
185
+ });
186
+ router.post('/content/entities/active', async (ctx) => {
187
+ const body = await ctx.request.json();
188
+ return {
189
+ body: await pointerRequestHandler(body.pointers)
190
+ };
191
+ });
192
+ router.get('/preview-wearables/:id', async (ctx) => {
193
+ const baseUrl = `${ctx.url.protocol}//${ctx.url.host}/content/contents`;
194
+ const wearables = getAllPreviewWearables({
195
+ baseUrl,
196
+ baseFolders
197
+ });
198
+ const wearableId = ctx.params.id;
199
+ return {
200
+ body: {
201
+ ok: true,
202
+ data: wearables.filter((wearable) => smartWearableNameToId(wearable === null || wearable === void 0 ? void 0 : wearable.name) === wearableId)
203
+ }
204
+ };
205
+ });
206
+ router.get('/preview-wearables', async (ctx) => {
207
+ const baseUrl = `${ctx.url.protocol}//${ctx.url.host}/content/contents`;
208
+ return {
209
+ body: {
210
+ ok: true,
211
+ data: getAllPreviewWearables({ baseUrl, baseFolders })
212
+ }
213
+ };
214
+ });
215
+ }
216
+ const defaultHashMaker = (str) => 'b64-' + Buffer.from(str).toString('base64');
217
+ function getAllPreviewWearables({ baseFolders, baseUrl }) {
218
+ const wearablePathArray = [];
219
+ for (const wearableDir of baseFolders) {
220
+ const wearableJsonPath = path.resolve(wearableDir, 'wearable.json');
221
+ if (fs.existsSync(wearableJsonPath)) {
222
+ wearablePathArray.push(wearableJsonPath);
223
+ }
224
+ }
225
+ const ret = [];
226
+ for (const wearableJsonPath of wearablePathArray) {
227
+ try {
228
+ ret.push(serveWearable({ wearableJsonPath, baseUrl }));
229
+ }
230
+ catch (err) {
231
+ console.error(`Couldn't mock the wearable ${wearableJsonPath}. Please verify the correct format and scheme.`, err);
232
+ }
233
+ }
234
+ return ret;
235
+ }
236
+ function serveWearable({ wearableJsonPath, baseUrl }) {
237
+ var _a;
238
+ const wearableDir = path.dirname(wearableJsonPath);
239
+ const wearableJson = JSON.parse(fs.readFileSync(wearableJsonPath).toString());
240
+ if (!sdk_1.WearableJson.validate(wearableJson)) {
241
+ const errors = (sdk_1.WearableJson.validate.errors || []).map((a) => `${a.data} ${a.message}`).join('');
242
+ console.error(`Unable to validate wearable.json properly, please check it.`, errors);
243
+ throw new Error(`Invalid wearable.json (${wearableJsonPath})`);
244
+ }
245
+ const dclIgnorePath = path.resolve(wearableDir, '.dclignore');
246
+ let ignoreFileContent = '';
247
+ if (fs.existsSync(dclIgnorePath)) {
248
+ ignoreFileContent = fs.readFileSync(path.resolve(wearableDir, '.dclignore'), 'utf-8');
249
+ }
250
+ const hashedFiles = getFilesFromFolder({
251
+ folder: wearableDir,
252
+ addOriginalPath: false,
253
+ ignorePattern: ignoreFileContent
254
+ });
255
+ const thumbnailFiltered = hashedFiles.filter(($) => ($ === null || $ === void 0 ? void 0 : $.file) === 'thumbnail.png');
256
+ const thumbnail = thumbnailFiltered.length > 0 && ((_a = thumbnailFiltered[0]) === null || _a === void 0 ? void 0 : _a.hash) && `${baseUrl}/${thumbnailFiltered[0].hash}`;
257
+ const wearableId = 'urn:8dc2d7ad-97e3-44d0-ba89-e8305d795a6a';
258
+ const representations = wearableJson.data.representations.map((representation) => (Object.assign(Object.assign({}, representation), { mainFile: `male/${representation.mainFile}`, contents: hashedFiles.map(($) => ({
259
+ key: `male/${$ === null || $ === void 0 ? void 0 : $.file}`,
260
+ url: `${baseUrl}/${$ === null || $ === void 0 ? void 0 : $.hash}`,
261
+ hash: $ === null || $ === void 0 ? void 0 : $.hash
262
+ })) })));
263
+ return {
264
+ id: wearableId,
265
+ rarity: wearableJson.rarity,
266
+ i18n: [{ code: 'en', text: wearableJson.name }],
267
+ description: wearableJson.description,
268
+ thumbnail: thumbnail || '',
269
+ baseUrl: `${baseUrl}/`,
270
+ name: wearableJson.name || '',
271
+ data: {
272
+ category: wearableJson.data.category,
273
+ replaces: [],
274
+ hides: [],
275
+ tags: [],
276
+ scene: hashedFiles,
277
+ representations: representations
278
+ }
279
+ };
280
+ }
281
+ function getSceneJson({ baseFolders, pointers, customHashMaker }) {
282
+ const requestedPointers = new Set(pointers);
283
+ const resultEntities = [];
284
+ const allDeployments = baseFolders.map((folder) => {
285
+ const dclIgnorePath = path.resolve(folder, '.dclignore');
286
+ let ignoreFileContent = '';
287
+ if (fs.existsSync(dclIgnorePath)) {
288
+ ignoreFileContent = fs.readFileSync(path.resolve(folder, '.dclignore'), 'utf-8');
289
+ }
290
+ return entityV3FromFolder({
291
+ folder,
292
+ addOriginalPath: false,
293
+ ignorePattern: ignoreFileContent,
294
+ customHashMaker
295
+ });
296
+ });
297
+ for (const pointer of Array.from(requestedPointers)) {
298
+ const theDeployment = allDeployments.find(($) => $ && $.pointers.includes(pointer));
299
+ if (theDeployment) {
300
+ theDeployment.pointers.forEach(($) => requestedPointers.delete($));
301
+ resultEntities.push(theDeployment);
302
+ }
303
+ }
304
+ return resultEntities;
305
+ }
306
+ function getEcsPath(workingDir) {
307
+ try {
308
+ return require.resolve('decentraland-ecs/package.json', {
309
+ paths: [workingDir]
310
+ });
311
+ }
312
+ catch (e) {
313
+ return require.resolve('@dcl/sdk/package.json', {
314
+ paths: [workingDir]
315
+ });
316
+ }
317
+ }
318
+ function serveStatic(dir, router) {
319
+ const ecsPath = path.dirname(getEcsPath(dir));
320
+ const dclKernelPath = path.dirname(require.resolve('@dcl/kernel/package.json', {
321
+ paths: [dir, ecsPath]
322
+ }));
323
+ const dclKernelDefaultProfilePath = path.resolve(dclKernelPath, 'default-profile');
324
+ const dclKernelImagesDecentralandConnect = path.resolve(dclKernelPath, 'images', 'decentraland-connect');
325
+ const dclKernelLoaderPath = path.resolve(dclKernelPath, 'loader');
326
+ const dclUnityRenderer = path.dirname(require.resolve('@dcl/unity-renderer/package.json', {
327
+ paths: [dir, ecsPath]
328
+ }));
329
+ const routes = [
330
+ {
331
+ route: '/',
332
+ path: path.resolve(dclKernelPath, 'preview.html'),
333
+ type: 'text/html'
334
+ },
335
+ {
336
+ route: '/favicon.ico',
337
+ path: path.resolve(dclKernelPath, 'favicon.ico'),
338
+ type: 'text/html'
339
+ },
340
+ {
341
+ route: '/@/artifacts/index.js',
342
+ path: path.resolve(dclKernelPath, 'index.js'),
343
+ type: 'text/javascript'
344
+ }
345
+ ];
346
+ for (const route of routes) {
347
+ router.get(route.route, async (_ctx) => {
348
+ return {
349
+ headers: { 'Content-Type': route.type },
350
+ body: fs.createReadStream(route.path)
351
+ };
352
+ });
353
+ }
354
+ function createStaticRoutes(route, folder, transform = (str) => str) {
355
+ router.get(route, async (ctx, next) => {
356
+ const file = ctx.params.path;
357
+ const fullPath = path.resolve(folder, transform(file));
358
+ if (!fs.existsSync(fullPath)) {
359
+ return next();
360
+ }
361
+ const headers = {
362
+ 'x-timestamp': Date.now(),
363
+ 'x-sent': true,
364
+ 'cache-control': 'no-cache,private,max-age=1'
365
+ };
366
+ if (fullPath.endsWith('.wasm')) {
367
+ headers['content-type'] = 'application/wasm';
368
+ }
369
+ return {
370
+ headers,
371
+ body: fs.createReadStream(fullPath)
372
+ };
373
+ });
374
+ }
375
+ createStaticRoutes('/images/decentraland-connect/:path+', dclKernelImagesDecentralandConnect);
376
+ createStaticRoutes('/@/artifacts/unity-renderer/:path+', dclUnityRenderer, (filePath) => filePath.replace(/.br+$/, ''));
377
+ createStaticRoutes('/@/artifacts/loader/:path+', dclKernelLoaderPath);
378
+ createStaticRoutes('/default-profile/:path+', dclKernelDefaultProfilePath);
379
+ router.get('/feature-flags/:file', async (ctx) => {
380
+ const res = await (0, node_fetch_1.default)(`https://feature-flags.decentraland.zone/${ctx.params.file}`, {
381
+ headers: {
382
+ connection: 'close'
383
+ }
384
+ });
385
+ return {
386
+ body: await res.arrayBuffer()
387
+ };
388
+ });
389
+ }
390
+ function entityV3FromFolder({ folder, addOriginalPath, ignorePattern, customHashMaker }) {
391
+ const sceneJsonPath = path.resolve(folder, './scene.json');
392
+ let isParcelScene = true;
393
+ const wearableJsonPath = path.resolve(folder, './wearable.json');
394
+ if (fs.existsSync(wearableJsonPath)) {
395
+ try {
396
+ const wearableJson = JSON.parse(fs.readFileSync(wearableJsonPath).toString());
397
+ if (!sdk_1.WearableJson.validate(wearableJson)) {
398
+ const errors = (sdk_1.WearableJson.validate.errors || []).map((a) => `${a.data} ${a.message}`).join('');
399
+ console.error(`Unable to validate wearable.json properly, please check it.`, errors);
400
+ console.error(`Invalid wearable.json (${wearableJsonPath})`);
401
+ }
402
+ else {
403
+ isParcelScene = false;
404
+ }
405
+ }
406
+ catch (err) {
407
+ console.error(`Unable to load wearable.json properly`, err);
408
+ }
409
+ }
410
+ const hashMaker = customHashMaker ? customHashMaker : defaultHashMaker;
411
+ if (fs.existsSync(sceneJsonPath) && isParcelScene) {
412
+ const sceneJson = JSON.parse(fs.readFileSync(sceneJsonPath).toString());
413
+ const { base, parcels } = sceneJson.scene;
414
+ const pointers = new Set();
415
+ pointers.add(base);
416
+ parcels.forEach(($) => pointers.add($));
417
+ const mappedFiles = getFilesFromFolder({
418
+ folder,
419
+ addOriginalPath,
420
+ ignorePattern,
421
+ customHashMaker
422
+ });
423
+ return {
424
+ version: 'v3',
425
+ type: schemas_1.EntityType.SCENE,
426
+ id: hashMaker(folder),
427
+ pointers: Array.from(pointers),
428
+ timestamp: Date.now(),
429
+ metadata: sceneJson,
430
+ content: mappedFiles
431
+ };
432
+ }
433
+ return null;
434
+ }
435
+ const defaultDclIgnore = () => [
436
+ '.*',
437
+ 'package.json',
438
+ 'package-lock.json',
439
+ 'yarn-lock.json',
440
+ 'build.json',
441
+ 'export',
442
+ 'tsconfig.json',
443
+ 'tslint.json',
444
+ 'node_modules',
445
+ '*.ts',
446
+ '*.tsx',
447
+ 'Dockerfile',
448
+ 'dist',
449
+ 'README.md',
450
+ '*.blend',
451
+ '*.fbx',
452
+ '*.zip',
453
+ '*.rar'
454
+ ].join('\n');
455
+ function getFilesFromFolder({ folder, addOriginalPath, ignorePattern, customHashMaker }) {
456
+ const hashMaker = customHashMaker ? customHashMaker : defaultHashMaker;
457
+ const allFiles = (0, glob_1.sync)('**/*', {
458
+ cwd: folder,
459
+ dot: false,
460
+ absolute: true
461
+ })
462
+ .map((file) => {
463
+ try {
464
+ if (!fs.statSync(file).isFile())
465
+ return;
466
+ }
467
+ catch (err) {
468
+ return;
469
+ }
470
+ const _folder = folder.replace(/\\/gi, '/');
471
+ const key = file.replace(_folder, '').replace(/^\/+/, '');
472
+ return key;
473
+ })
474
+ .filter(($) => !!$);
475
+ const ensureIgnorePattern = ignorePattern && ignorePattern !== '' ? ignorePattern : defaultDclIgnore();
476
+ const ig = (0, ignore_1.default)().add(ensureIgnorePattern);
477
+ const filteredFiles = ig.filter(allFiles);
478
+ const ret = [];
479
+ for (const file of filteredFiles) {
480
+ const absolutePath = path.resolve(folder, file);
481
+ try {
482
+ if (!fs.statSync(absolutePath).isFile())
483
+ continue;
484
+ }
485
+ catch (err) {
486
+ console.log(err);
487
+ continue;
488
+ }
489
+ const absoluteFolder = folder.replace(/\\/gi, '/');
490
+ const relativeFilePathToFolder = file.replace(absoluteFolder, '').replace(/^\/+/, '');
491
+ ret.push({
492
+ file: relativeFilePathToFolder.toLowerCase(),
493
+ original_path: addOriginalPath ? absolutePath : undefined,
494
+ hash: hashMaker(absolutePath)
495
+ });
496
+ }
497
+ return ret;
498
+ }
499
+ exports.getFilesFromFolder = getFilesFromFolder;
500
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZW5kcG9pbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsMkNBQTRCO0FBQzVCLHVDQUF3QjtBQUN4QiwrQkFBdUM7QUFDdkMsK0NBQW9EO0FBQ3BELDBDQUFpRTtBQUNqRSxvREFBMkI7QUFDM0IseURBQTJDO0FBQzNDLHlDQUFpRDtBQUVqRCxTQUFTLGNBQWM7SUFDckIsT0FBTyxJQUFJLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO0FBQ2pELENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLElBQVk7SUFDekMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFBO0FBQ3BELENBQUM7QUFFRCxTQUFnQixrQkFBa0IsQ0FBQyxHQUFXLEVBQUUsTUFBaUM7SUFDL0UsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUV6QixNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNuQyxPQUFPO1lBQ0wsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1lBQy9DLElBQUksRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDeEQsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0lBRUYsTUFBTSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDbEQsT0FBTztZQUNMLElBQUksRUFBRTtnQkFDSjtvQkFDRSxVQUFVLEVBQUUsV0FBVztvQkFDdkIsR0FBRyxFQUFFLFVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7b0JBQzdCLEtBQUssRUFBRSxNQUFN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QWMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUVsRCxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFckYsR0FBRyxDQUFDLElBQUksQ0FBQztZQUNQLElBQUksRUFBRSx3QkFBd0IsQ0FBQyxXQUFXLEVBQUU7WUFDNUMsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3pELElBQUksRUFBRSxTQUFTLENBQUMsWUFBWSxDQUFDO1NBQzlCLENBQUMsQ0FBQTtLQUNIO0lBRUQsT0FBTyxHQUFHLENBQUE7QUFDWixDQUFDO0FBekRELGdEQXlEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0B3ZWxsLWtub3duLWNvbXBvbmVudHMvaHR0cC1zZXJ2ZXInXG5pbXBvcnQgeyBQcmV2aWV3Q29tcG9uZW50cyB9IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcydcbmltcG9ydCB7IHN5bmMgYXMgZ2xvYlN5bmMgfSBmcm9tICdnbG9iJ1xuaW1wb3J0IHsgV2VhcmFibGVKc29uIH0gZnJvbSAnQGRjbC9zY2hlbWFzL2Rpc3Qvc2RrJ1xuaW1wb3J0IHsgQ29udGVudE1hcHBpbmcsIEVudGl0eSwgRW50aXR5VHlwZSB9IGZyb20gJ0BkY2wvc2NoZW1hcydcbmltcG9ydCBpZ25vcmUgZnJvbSAnaWdub3JlJ1xuaW1wb3J0IGZldGNoLCB7IEhlYWRlcnMgfSBmcm9tICdub2RlLWZldGNoJ1xuaW1wb3J0IHsgZmV0Y2hFbnRpdHlCeVBvaW50ZXIgfSBmcm9tICcuL2NhdGFseXN0J1xuXG5mdW5jdGlvbiBnZXRDYXRhbHlzdFVybCgpOiBVUkwge1xuICByZXR1cm4gbmV3IFVSTCgnaHR0cHM6Ly9wZWVyLmRlY2VudHJhbGFuZC5vcmcnKVxufVxuXG5mdW5jdGlvbiBzbWFydFdlYXJhYmxlTmFtZVRvSWQobmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnLScpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cEVjczZFbmRwb2ludHMoZGlyOiBzdHJpbmcsIHJvdXRlcjogUm91dGVyPFByZXZpZXdDb21wb25lbnRzPikge1xuICBjb25zdCBiYXNlRm9sZGVycyA9IFtkaXJdXG4gIC8vIGhhbmRsZSBvbGQgcHJldmlldyBzY2VuZS5qc29uXG4gIHJvdXRlci5nZXQoJy9zY2VuZS5qc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IGZzLmNyZWF0ZVJlYWRTdHJlYW0ocGF0aC5qb2luKGRpciwgJ3NjZW5lLmpzb24nKSlcbiAgICB9XG4gIH0pXG5cbiAgcm91dGVyLmdldCgnL2xhbWJkYXMvZXhwbG9yZS9yZWFsbXMnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJvZHk6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNlcnZlck5hbWU6ICdsb2NhbGhvc3QnLFxuICAgICAgICAgIHVybDogYGh0dHA6Ly8ke2N0eC51cmwuaG9zdH1gLFxuICAgICAgICAgIGxheWVyOiAnc3R1YicsXG4gICAgICAgICAgdXNlcnNDb3VudDogMCxcbiAgICAgICAgICBtYXhVc2VyczogMTAwLFxuICAgICAgICAgIHVzZXJQYXJjZWxzOiBbXVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5nZXQoJy9sYW1iZGFzL2NvbnRyYWN0cy9zZXJ2ZXJzJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBib2R5OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBgaHR0cDovLyR7Y3R4LnVybC5ob3N0fWAsXG4gICAgICAgICAgb3duZXI6ICcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICAgIGlkOiAnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJ1xuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5nZXQoJy9sYW1iZGFzL3Byb2ZpbGVzJywgYXN5bmMgKGN0eCwgbmV4dCkgPT4ge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtjdHgudXJsLnByb3RvY29sfS8vJHtjdHgudXJsLmhvc3R9L2NvbnRlbnQvY29udGVudHNgXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJldmlld1dlYXJhYmxlcyA9IGdldEFsbFByZXZpZXdXZWFyYWJsZXMoe1xuICAgICAgICBiYXNlRm9sZGVycyxcbiAgICAgICAgYmFzZVVybFxuICAgICAgfSkubWFwKCh3ZWFyYWJsZSkgPT4gd2VhcmFibGUuaWQpXG5cbiAgICAgIGlmIChwcmV2aWV3V2VhcmFibGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBjYXRhbHlzdFVybCA9IGdldENhdGFseXN0VXJsKClcblxuICAgICAgICBjb25zdCB1ID0gbmV3IFVSTChjdHgudXJsLnRvU3RyaW5nKCkpXG4gICAgICAgIHUuaG9zdCA9IGNhdGFseXN0VXJsLmhvc3RcbiAgICAgICAgdS5wcm90b2NvbCA9IGNhdGFseXN0VXJsLnByb3RvY29sXG4gICAgICAgIHUucG9ydCA9IGNhdGFseXN0VXJsLnBvcnRcbiAgICAgICAgY29uc3QgcmVxID0gYXdhaXQgZmV0Y2godS50b1N0cmluZygpLCB7XG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgY29ubmVjdGlvbjogJ2Nsb3NlJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbWV0aG9kOiBjdHgucmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgYm9keTogY3R4LnJlcXVlc3QubWV0aG9kID09PSAnZ2V0JyA/IHVuZGVmaW5lZCA6IGN0eC5yZXF1ZXN0LmJvZHlcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBkZXBsb3llZFByb2ZpbGUgPSAoYXdhaXQgcmVxLmpzb24oKSkgYXMgYW55W11cblxuICAgICAgICBpZiAoZGVwbG95ZWRQcm9maWxlPy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBkZXBsb3llZFByb2ZpbGVbMF0uYXZhdGFyc1swXS5hdmF0YXIud2VhcmFibGVzLnB1c2goLi4ucHJldmlld1dlYXJhYmxlcylcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogcmVxLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSB8fCAnYXBwbGljYXRpb24vYmluYXJ5J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IGRlcGxveWVkUHJvZmlsZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gY2F0Y2ggcHJvZmlsZSBhbmQgZmlsbCB3aXRoIHByZXZpZXcgd2VhcmFibGVzLmAsIGVycilcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dCgpXG4gIH0pXG5cbiAgcm91dGVyLmFsbCgnL2xhbWJkYXMvOnBhdGgrJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIGNvbnN0IGNhdGFseXN0VXJsID0gZ2V0Q2F0YWx5c3RVcmwoKVxuICAgIGNvbnN0IHUgPSBuZXcgVVJMKGN0eC51cmwudG9TdHJpbmcoKSlcbiAgICB1Lmhvc3QgPSBjYXRhbHlzdFVybC5ob3N0XG4gICAgdS5wcm90b2NvbCA9IGNhdGFseXN0VXJsLnByb3RvY29sXG4gICAgdS5wb3J0ID0gY2F0YWx5c3RVcmwucG9ydFxuICAgIGNvbnN0IHJlcSA9IGF3YWl0IGZldGNoKHUudG9TdHJpbmcoKSwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBjb25uZWN0aW9uOiAnY2xvc2UnXG4gICAgICB9LFxuICAgICAgbWV0aG9kOiBjdHgucmVxdWVzdC5tZXRob2QsXG4gICAgICBib2R5OiBjdHgucmVxdWVzdC5tZXRob2QgPT09ICdnZXQnID8gdW5kZWZpbmVkIDogY3R4LnJlcXVlc3QuYm9keVxuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnY29udGVudC10eXBlJzogcmVxLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSB8fCAnYXBwbGljYXRpb24vYmluYXJ5J1xuICAgICAgfSxcbiAgICAgIGJvZHk6IHJlcS5ib2R5XG4gICAgfVxuICB9KVxuXG4gIHJvdXRlci5wb3N0KCcvY29udGVudC9lbnRpdGllcycsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCBjYXRhbHlzdFVybCA9IGdldENhdGFseXN0VXJsKClcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICAgIGNvbnNvbGUubG9nKGN0eC5yZXF1ZXN0LmhlYWRlcnMpXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7Y2F0YWx5c3RVcmwudG9TdHJpbmcoKX0vY29udGVudC9lbnRpdGllc2AsIHtcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHk6IGN0eC5yZXF1ZXN0LmJvZHlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHJlc1xuICB9KVxuXG4gIHNlcnZlU3RhdGljKGRpciwgcm91dGVyKVxuXG4gIC8vIFRPRE86IGdldCB3b3Jrc3BhY2Ugc2NlbmVzICYgd2VhcmFibGVzLi4uXG5cbiAgc2VydmVGb2xkZXJzKHJvdXRlciwgYmFzZUZvbGRlcnMpXG59XG5cbmZ1bmN0aW9uIHNlcnZlRm9sZGVycyhyb3V0ZXI6IFJvdXRlcjxQcmV2aWV3Q29tcG9uZW50cz4sIGJhc2VGb2xkZXJzOiBzdHJpbmdbXSkge1xuICByb3V0ZXIuZ2V0KCcvY29udGVudC9jb250ZW50cy86aGFzaCcsIGFzeW5jIChjdHg6IGFueSwgbmV4dDogYW55KSA9PiB7XG4gICAgaWYgKGN0eC5wYXJhbXMuaGFzaCAmJiBjdHgucGFyYW1zLmhhc2guc3RhcnRzV2l0aCgnYjY0LScpKSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShCdWZmZXIuZnJvbShjdHgucGFyYW1zLmhhc2gucmVwbGFjZSgvXmI2NC0vLCAnJyksICdiYXNlNjQnKS50b1N0cmluZygndXRmOCcpKVxuXG4gICAgICAvLyBvbmx5IHJldHVybiBmaWxlcyBJRiB0aGUgZmlsZSBpcyB3aXRoaW4gYSBiYXNlRm9sZGVyXG4gICAgICBpZiAoIWJhc2VGb2xkZXJzLmZpbmQoKGZvbGRlcjogc3RyaW5nKSA9PiBmdWxsUGF0aC5zdGFydHNXaXRoKGZvbGRlcikpKSB7XG4gICAgICAgIHJldHVybiBuZXh0KClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICd4LXRpbWVzdGFtcCc6IERhdGUubm93KCksXG4gICAgICAgICAgJ3gtc2VudCc6IHRydWUsXG4gICAgICAgICAgJ2NhY2hlLWNvbnRyb2wnOiAnbm8tY2FjaGUscHJpdmF0ZSxtYXgtYWdlPTEnXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IGZzLmNyZWF0ZVJlYWRTdHJlYW0oZnVsbFBhdGgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQoKVxuICB9KVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHBvaW50ZXJSZXF1ZXN0SGFuZGxlcihwb2ludGVyczogc3RyaW5nW10pIHtcbiAgICBpZiAoIXBvaW50ZXJzIHx8IHBvaW50ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdGVkUG9pbnRlcnMgPSBuZXcgU2V0PHN0cmluZz4oXG4gICAgICBwb2ludGVycyAmJiB0eXBlb2YgcG9pbnRlcnMgPT09ICdzdHJpbmcnID8gW3BvaW50ZXJzIGFzIHN0cmluZ10gOiAocG9pbnRlcnMgYXMgc3RyaW5nW10pXG4gICAgKVxuXG4gICAgY29uc3QgcmVzdWx0RW50aXRpZXMgPSBnZXRTY2VuZUpzb24oe1xuICAgICAgYmFzZUZvbGRlcnMsXG4gICAgICBwb2ludGVyczogQXJyYXkuZnJvbShyZXF1ZXN0ZWRQb2ludGVycylcbiAgICB9KVxuICAgIGNvbnN0IGNhdGFseXN0VXJsID0gZ2V0Q2F0YWx5c3RVcmwoKVxuICAgIGNvbnN0IHJlbW90ZSA9IGZldGNoRW50aXR5QnlQb2ludGVyKFxuICAgICAgY2F0YWx5c3RVcmwudG9TdHJpbmcoKSxcbiAgICAgIHBvaW50ZXJzLmZpbHRlcigoJDogc3RyaW5nKSA9PiAhJC5tYXRjaCgvLT9cXGQrLC0/XFxkKy8pKVxuICAgIClcblxuICAgIGNvbnN0IHNlcnZlckVudGl0aWVzID0gQXJyYXkuaXNBcnJheShyZW1vdGUpID8gcmVtb3RlIDogW11cblxuICAgIHJldHVybiBbLi4ucmVzdWx0RW50aXRpZXMsIC4uLnNlcnZlckVudGl0aWVzXVxuICB9XG5cbiAgLy8gUkVWSUVXIFJFU1BPTlNFIEZPUk1BVFxuICByb3V0ZXIuZ2V0KCcvY29udGVudC9lbnRpdGllcy9zY2VuZScsIGFzeW5jIChjdHgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9keTogYXdhaXQgcG9pbnRlclJlcXVlc3RIYW5kbGVyKGN0eC51cmwuc2VhcmNoUGFyYW1zLmdldEFsbCgncG9pbnRlcicpKVxuICAgIH1cbiAgfSlcblxuICAvLyBSRVZJRVcgUkVTUE9OU0UgRk9STUFUXG4gIHJvdXRlci5wb3N0KCcvY29udGVudC9lbnRpdGllcy9hY3RpdmUnLCBhc3luYyAoY3R4KSA9PiB7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IGN0eC5yZXF1ZXN0Lmpzb24oKVxuICAgIHJldHVybiB7XG4gICAgICBib2R5OiBhd2FpdCBwb2ludGVyUmVxdWVzdEhhbmRsZXIoYm9keS5wb2ludGVycylcbiAgICB9XG4gIH0pXG5cbiAgcm91dGVyLmdldCgnL3ByZXZpZXctd2VhcmFibGVzLzppZCcsIGFzeW5jIChjdHgpID0+IHtcbiAgICBjb25zdCBiYXNlVXJsID0gYCR7Y3R4LnVybC5wcm90b2NvbH0vLyR7Y3R4LnVybC5ob3N0fS9jb250ZW50L2NvbnRlbnRzYFxuICAgIGNvbnN0IHdlYXJhYmxlcyA9IGdldEFsbFByZXZpZXdXZWFyYWJsZXMoe1xuICAgICAgYmFzZVVybCxcbiAgICAgIGJhc2VGb2xkZXJzXG4gICAgfSlcbiAgICBjb25zdCB3ZWFyYWJsZUlkID0gY3R4LnBhcmFtcy5pZFxuICAgIHJldHVybiB7XG4gICAgICBib2R5OiB7XG4gICAgICAgIG9rOiB0cnVlLFxuICAgICAgICBkYXRhOiB3ZWFyYWJsZXMuZmlsdGVyKCh3ZWFyYWJsZSkgPT4gc21hcnRXZWFyYWJsZU5hbWVUb0lkKHdlYXJhYmxlPy5uYW1lKSA9PT0gd2VhcmFibGVJZClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcm91dGVyLmdldCgnL3ByZXZpZXctd2VhcmFibGVzJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIGNvbnN0IGJhc2VVcmwgPSBgJHtjdHgudXJsLnByb3RvY29sfS8vJHtjdHgudXJsLmhvc3R9L2NvbnRlbnQvY29udGVudHNgXG4gICAgcmV0dXJuIHtcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIGRhdGE6IGdldEFsbFByZXZpZXdXZWFyYWJsZXMoeyBiYXNlVXJsLCBiYXNlRm9sZGVycyB9KVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgZGVmYXVsdEhhc2hNYWtlciA9IChzdHI6IHN0cmluZykgPT4gJ2I2NC0nICsgQnVmZmVyLmZyb20oc3RyKS50b1N0cmluZygnYmFzZTY0JylcblxuZnVuY3Rpb24gZ2V0QWxsUHJldmlld1dlYXJhYmxlcyh7IGJhc2VGb2xkZXJzLCBiYXNlVXJsIH06IHsgYmFzZUZvbGRlcnM6IHN0cmluZ1tdOyBiYXNlVXJsOiBzdHJpbmcgfSkge1xuICBjb25zdCB3ZWFyYWJsZVBhdGhBcnJheTogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IHdlYXJhYmxlRGlyIG9mIGJhc2VGb2xkZXJzKSB7XG4gICAgY29uc3Qgd2VhcmFibGVKc29uUGF0aCA9IHBhdGgucmVzb2x2ZSh3ZWFyYWJsZURpciwgJ3dlYXJhYmxlLmpzb24nKVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHdlYXJhYmxlSnNvblBhdGgpKSB7XG4gICAgICB3ZWFyYWJsZVBhdGhBcnJheS5wdXNoKHdlYXJhYmxlSnNvblBhdGgpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmV0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXJ2ZVdlYXJhYmxlPltdID0gW11cbiAgZm9yIChjb25zdCB3ZWFyYWJsZUpzb25QYXRoIG9mIHdlYXJhYmxlUGF0aEFycmF5KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldC5wdXNoKHNlcnZlV2VhcmFibGUoeyB3ZWFyYWJsZUpzb25QYXRoLCBiYXNlVXJsIH0pKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihgQ291bGRuJ3QgbW9jayB0aGUgd2VhcmFibGUgJHt3ZWFyYWJsZUpzb25QYXRofS4gUGxlYXNlIHZlcmlmeSB0aGUgY29ycmVjdCBmb3JtYXQgYW5kIHNjaGVtZS5gLCBlcnIpXG4gICAgfVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gc2VydmVXZWFyYWJsZSh7IHdlYXJhYmxlSnNvblBhdGgsIGJhc2VVcmwgfTogeyB3ZWFyYWJsZUpzb25QYXRoOiBzdHJpbmc7IGJhc2VVcmw6IHN0cmluZyB9KSB7XG4gIGNvbnN0IHdlYXJhYmxlRGlyID0gcGF0aC5kaXJuYW1lKHdlYXJhYmxlSnNvblBhdGgpXG4gIGNvbnN0IHdlYXJhYmxlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHdlYXJhYmxlSnNvblBhdGgpLnRvU3RyaW5nKCkpXG5cbiAgaWYgKCFXZWFyYWJsZUpzb24udmFsaWRhdGUod2VhcmFibGVKc29uKSkge1xuICAgIGNvbnN0IGVycm9ycyA9IChXZWFyYWJsZUpzb24udmFsaWRhdGUuZXJyb3JzIHx8IFtdKS5tYXAoKGEpID0+IGAke2EuZGF0YX0gJHthLm1lc3NhZ2V9YCkuam9pbignJylcblxuICAgIGNvbnNvbGUuZXJyb3IoYFVuYWJsZSB0byB2YWxpZGF0ZSB3ZWFyYWJsZS5qc29uIHByb3Blcmx5LCBwbGVhc2UgY2hlY2sgaXQuYCwgZXJyb3JzKVxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB3ZWFyYWJsZS5qc29uICgke3dlYXJhYmxlSnNvblBhdGh9KWApXG4gIH1cblxuICBjb25zdCBkY2xJZ25vcmVQYXRoID0gcGF0aC5yZXNvbHZlKHdlYXJhYmxlRGlyLCAnLmRjbGlnbm9yZScpXG4gIGxldCBpZ25vcmVGaWxlQ29udGVudCA9ICcnXG4gIGlmIChmcy5leGlzdHNTeW5jKGRjbElnbm9yZVBhdGgpKSB7XG4gICAgaWdub3JlRmlsZUNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHdlYXJhYmxlRGlyLCAnLmRjbGlnbm9yZScpLCAndXRmLTgnKVxuICB9XG5cbiAgY29uc3QgaGFzaGVkRmlsZXMgPSBnZXRGaWxlc0Zyb21Gb2xkZXIoe1xuICAgIGZvbGRlcjogd2VhcmFibGVEaXIsXG4gICAgYWRkT3JpZ2luYWxQYXRoOiBmYWxzZSxcbiAgICBpZ25vcmVQYXR0ZXJuOiBpZ25vcmVGaWxlQ29udGVudFxuICB9KVxuXG4gIGNvbnN0IHRodW1ibmFpbEZpbHRlcmVkID0gaGFzaGVkRmlsZXMuZmlsdGVyKCgkKSA9PiAkPy5maWxlID09PSAndGh1bWJuYWlsLnBuZycpXG4gIGNvbnN0IHRodW1ibmFpbCA9XG4gICAgdGh1bWJuYWlsRmlsdGVyZWQubGVuZ3RoID4gMCAmJiB0aHVtYm5haWxGaWx0ZXJlZFswXT8uaGFzaCAmJiBgJHtiYXNlVXJsfS8ke3RodW1ibmFpbEZpbHRlcmVkWzBdLmhhc2h9YFxuXG4gIGNvbnN0IHdlYXJhYmxlSWQgPSAndXJuOjhkYzJkN2FkLTk3ZTMtNDRkMC1iYTg5LWU4MzA1ZDc5NWE2YSdcblxuICBjb25zdCByZXByZXNlbnRhdGlvbnMgPSB3ZWFyYWJsZUpzb24uZGF0YS5yZXByZXNlbnRhdGlvbnMubWFwKChyZXByZXNlbnRhdGlvbikgPT4gKHtcbiAgICAuLi5yZXByZXNlbnRhdGlvbixcbiAgICBtYWluRmlsZTogYG1hbGUvJHtyZXByZXNlbnRhdGlvbi5tYWluRmlsZX1gLFxuICAgIGNvbnRlbnRzOiBoYXNoZWRGaWxlcy5tYXAoKCQpID0+ICh7XG4gICAgICBrZXk6IGBtYWxlLyR7JD8uZmlsZX1gLFxuICAgICAgdXJsOiBgJHtiYXNlVXJsfS8keyQ/Lmhhc2h9YCxcbiAgICAgIGhhc2g6ICQ/Lmhhc2hcbiAgICB9KSlcbiAgfSkpXG5cbiAgcmV0dXJuIHtcbiAgICBpZDogd2VhcmFibGVJZCxcbiAgICByYXJpdHk6IHdlYXJhYmxlSnNvbi5yYXJpdHksXG4gICAgaTE4bjogW3sgY29kZTogJ2VuJywgdGV4dDogd2VhcmFibGVKc29uLm5hbWUgfV0sXG4gICAgZGVzY3JpcHRpb246IHdlYXJhYmxlSnNvbi5kZXNjcmlwdGlvbixcbiAgICB0aHVtYm5haWw6IHRodW1ibmFpbCB8fCAnJyxcbiAgICBiYXNlVXJsOiBgJHtiYXNlVXJsfS9gLFxuICAgIG5hbWU6IHdlYXJhYmxlSnNvbi5uYW1lIHx8ICcnLFxuICAgIGRhdGE6IHtcbiAgICAgIGNhdGVnb3J5OiB3ZWFyYWJsZUpzb24uZGF0YS5jYXRlZ29yeSxcbiAgICAgIHJlcGxhY2VzOiBbXSxcbiAgICAgIGhpZGVzOiBbXSxcbiAgICAgIHRhZ3M6IFtdLFxuICAgICAgc2NlbmU6IGhhc2hlZEZpbGVzLFxuICAgICAgcmVwcmVzZW50YXRpb25zOiByZXByZXNlbnRhdGlvbnMgYXMgYW55XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFNjZW5lSnNvbih7XG4gIGJhc2VGb2xkZXJzLFxuICBwb2ludGVycyxcbiAgY3VzdG9tSGFzaE1ha2VyXG59OiB7XG4gIGJhc2VGb2xkZXJzOiBzdHJpbmdbXVxuICBwb2ludGVyczogc3RyaW5nW11cbiAgY3VzdG9tSGFzaE1ha2VyPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmdcbn0pOiBFbnRpdHlbXSB7XG4gIGNvbnN0IHJlcXVlc3RlZFBvaW50ZXJzID0gbmV3IFNldDxzdHJpbmc+KHBvaW50ZXJzKVxuICBjb25zdCByZXN1bHRFbnRpdGllczogRW50aXR5W10gPSBbXVxuXG4gIGNvbnN0IGFsbERlcGxveW1lbnRzID0gYmFzZUZvbGRlcnMubWFwKChmb2xkZXIpID0+IHtcbiAgICBjb25zdCBkY2xJZ25vcmVQYXRoID0gcGF0aC5yZXNvbHZlKGZvbGRlciwgJy5kY2xpZ25vcmUnKVxuICAgIGxldCBpZ25vcmVGaWxlQ29udGVudCA9ICcnXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGNsSWdub3JlUGF0aCkpIHtcbiAgICAgIGlnbm9yZUZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShmb2xkZXIsICcuZGNsaWdub3JlJyksICd1dGYtOCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVudGl0eVYzRnJvbUZvbGRlcih7XG4gICAgICBmb2xkZXIsXG4gICAgICBhZGRPcmlnaW5hbFBhdGg6IGZhbHNlLFxuICAgICAgaWdub3JlUGF0dGVybjogaWdub3JlRmlsZUNvbnRlbnQsXG4gICAgICBjdXN0b21IYXNoTWFrZXJcbiAgICB9KVxuICB9KVxuXG4gIGZvciAoY29uc3QgcG9pbnRlciBvZiBBcnJheS5mcm9tKHJlcXVlc3RlZFBvaW50ZXJzKSkge1xuICAgIC8vIGdldCBkZXBsb3ltZW50IGJ5IHBvaW50ZXJcbiAgICBjb25zdCB0aGVEZXBsb3ltZW50ID0gYWxsRGVwbG95bWVudHMuZmluZCgoJCkgPT4gJCAmJiAkLnBvaW50ZXJzLmluY2x1ZGVzKHBvaW50ZXIpKVxuICAgIGlmICh0aGVEZXBsb3ltZW50KSB7XG4gICAgICAvLyByZW1vdmUgYWxsIHRoZSByZXF1aXJlZCBwb2ludGVycyBmcm9tIHRoZSByZXF1ZXN0ZWRQb2ludGVycyBzZXRcbiAgICAgIC8vIHRvIHByZXZlbnQgc2VuZGluZyBkdXBsaWNhdGVkIGVudGl0aWVzXG4gICAgICB0aGVEZXBsb3ltZW50LnBvaW50ZXJzLmZvckVhY2goKCQpID0+IHJlcXVlc3RlZFBvaW50ZXJzLmRlbGV0ZSgkKSlcblxuICAgICAgLy8gYWRkIHRoZSBkZXBsb3ltZW50IHRvIHRoZSByZXN1bHRzXG4gICAgICByZXN1bHRFbnRpdGllcy5wdXNoKHRoZURlcGxveW1lbnQpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdEVudGl0aWVzXG59XG5cbmZ1bmN0aW9uIGdldEVjc1BhdGgod29ya2luZ0Rpcjogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUucmVzb2x2ZSgnZGVjZW50cmFsYW5kLWVjcy9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW3dvcmtpbmdEaXJdXG4gICAgfSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiByZXF1aXJlLnJlc29sdmUoJ0BkY2wvc2RrL3BhY2thZ2UuanNvbicsIHtcbiAgICAgIHBhdGhzOiBbd29ya2luZ0Rpcl1cbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIHNlcnZlU3RhdGljKGRpcjogc3RyaW5nLCByb3V0ZXI6IFJvdXRlcjxQcmV2aWV3Q29tcG9uZW50cz4pIHtcbiAgY29uc3QgZWNzUGF0aCA9IHBhdGguZGlybmFtZShnZXRFY3NQYXRoKGRpcikpXG4gIGNvbnN0IGRjbEtlcm5lbFBhdGggPSBwYXRoLmRpcm5hbWUoXG4gICAgcmVxdWlyZS5yZXNvbHZlKCdAZGNsL2tlcm5lbC9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW2RpciwgZWNzUGF0aF1cbiAgICB9KVxuICApXG4gIGNvbnN0IGRjbEtlcm5lbERlZmF1bHRQcm9maWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkY2xLZXJuZWxQYXRoLCAnZGVmYXVsdC1wcm9maWxlJylcbiAgY29uc3QgZGNsS2VybmVsSW1hZ2VzRGVjZW50cmFsYW5kQ29ubmVjdCA9IHBhdGgucmVzb2x2ZShkY2xLZXJuZWxQYXRoLCAnaW1hZ2VzJywgJ2RlY2VudHJhbGFuZC1jb25uZWN0JylcbiAgY29uc3QgZGNsS2VybmVsTG9hZGVyUGF0aCA9IHBhdGgucmVzb2x2ZShkY2xLZXJuZWxQYXRoLCAnbG9hZGVyJylcbiAgY29uc3QgZGNsVW5pdHlSZW5kZXJlciA9IHBhdGguZGlybmFtZShcbiAgICByZXF1aXJlLnJlc29sdmUoJ0BkY2wvdW5pdHktcmVuZGVyZXIvcGFja2FnZS5qc29uJywge1xuICAgICAgcGF0aHM6IFtkaXIsIGVjc1BhdGhdXG4gICAgfSlcbiAgKVxuXG4gIGNvbnN0IHJvdXRlcyA9IFtcbiAgICB7XG4gICAgICByb3V0ZTogJy8nLFxuICAgICAgcGF0aDogcGF0aC5yZXNvbHZlKGRjbEtlcm5lbFBhdGgsICdwcmV2aWV3Lmh0bWwnKSxcbiAgICAgIHR5cGU6ICd0ZXh0L2h0bWwnXG4gICAgfSxcbiAgICB7XG4gICAgICByb3V0ZTogJy9mYXZpY29uLmljbycsXG4gICAgICBwYXRoOiBwYXRoLnJlc29sdmUoZGNsS2VybmVsUGF0aCwgJ2Zhdmljb24uaWNvJyksXG4gICAgICB0eXBlOiAndGV4dC9odG1sJ1xuICAgIH0sXG4gICAge1xuICAgICAgcm91dGU6ICcvQC9hcnRpZmFjdHMvaW5kZXguanMnLFxuICAgICAgcGF0aDogcGF0aC5yZXNvbHZlKGRjbEtlcm5lbFBhdGgsICdpbmRleC5qcycpLFxuICAgICAgdHlwZTogJ3RleHQvamF2YXNjcmlwdCdcbiAgICB9XG4gIF1cblxuICBmb3IgKGNvbnN0IHJvdXRlIG9mIHJvdXRlcykge1xuICAgIHJvdXRlci5nZXQocm91dGUucm91dGUsIGFzeW5jIChfY3R4KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiByb3V0ZS50eXBlIH0sXG4gICAgICAgIGJvZHk6IGZzLmNyZWF0ZVJlYWRTdHJlYW0ocm91dGUucGF0aClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RhdGljUm91dGVzKHJvdXRlOiBzdHJpbmcsIGZvbGRlcjogc3RyaW5nLCB0cmFuc2Zvcm0gPSAoc3RyOiBzdHJpbmcpID0+IHN0cikge1xuICAgIHJvdXRlci5nZXQocm91dGUsIGFzeW5jIChjdHgsIG5leHQpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBjdHgucGFyYW1zLnBhdGhcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKGZvbGRlciwgdHJhbnNmb3JtKGZpbGUpKVxuXG4gICAgICAvLyBvbmx5IHJldHVybiBmaWxlcyBJRiB0aGUgZmlsZSBpcyB3aXRoaW4gYSBiYXNlRm9sZGVyXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZnVsbFBhdGgpKSB7XG4gICAgICAgIHJldHVybiBuZXh0KClcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgICAgJ3gtdGltZXN0YW1wJzogRGF0ZS5ub3coKSxcbiAgICAgICAgJ3gtc2VudCc6IHRydWUsXG4gICAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLWNhY2hlLHByaXZhdGUsbWF4LWFnZT0xJ1xuICAgICAgfVxuXG4gICAgICBpZiAoZnVsbFBhdGguZW5kc1dpdGgoJy53YXNtJykpIHtcbiAgICAgICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSAnYXBwbGljYXRpb24vd2FzbSdcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgYm9keTogZnMuY3JlYXRlUmVhZFN0cmVhbShmdWxsUGF0aClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY3JlYXRlU3RhdGljUm91dGVzKCcvaW1hZ2VzL2RlY2VudHJhbGFuZC1jb25uZWN0LzpwYXRoKycsIGRjbEtlcm5lbEltYWdlc0RlY2VudHJhbGFuZENvbm5lY3QpXG4gIGNyZWF0ZVN0YXRpY1JvdXRlcygnL0AvYXJ0aWZhY3RzL3VuaXR5LXJlbmRlcmVyLzpwYXRoKycsIGRjbFVuaXR5UmVuZGVyZXIsIChmaWxlUGF0aCkgPT5cbiAgICBmaWxlUGF0aC5yZXBsYWNlKC8uYnIrJC8sICcnKVxuICApXG4gIGNyZWF0ZVN0YXRpY1JvdXRlcygnL0AvYXJ0aWZhY3RzL2xvYWRlci86cGF0aCsnLCBkY2xLZXJuZWxMb2FkZXJQYXRoKVxuICBjcmVhdGVTdGF0aWNSb3V0ZXMoJy9kZWZhdWx0LXByb2ZpbGUvOnBhdGgrJywgZGNsS2VybmVsRGVmYXVsdFByb2ZpbGVQYXRoKVxuXG4gIHJvdXRlci5nZXQoJy9mZWF0dXJlLWZsYWdzLzpmaWxlJywgYXN5bmMgKGN0eCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGBodHRwczovL2ZlYXR1cmUtZmxhZ3MuZGVjZW50cmFsYW5kLnpvbmUvJHtjdHgucGFyYW1zLmZpbGV9YCwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBjb25uZWN0aW9uOiAnY2xvc2UnXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4ge1xuICAgICAgYm9keTogYXdhaXQgcmVzLmFycmF5QnVmZmVyKClcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIGVudGl0eVYzRnJvbUZvbGRlcih7XG4gIGZvbGRlcixcbiAgYWRkT3JpZ2luYWxQYXRoLFxuICBpZ25vcmVQYXR0ZXJuLFxuICBjdXN0b21IYXNoTWFrZXJcbn06IHtcbiAgZm9sZGVyOiBzdHJpbmdcbiAgYWRkT3JpZ2luYWxQYXRoPzogYm9vbGVhblxuICBpZ25vcmVQYXR0ZXJuPzogc3RyaW5nXG4gIGN1c3RvbUhhc2hNYWtlcj86IChzdHI6IHN0cmluZykgPT4gc3RyaW5nXG59KTogRW50aXR5IHwgbnVsbCB7XG4gIGNvbnN0IHNjZW5lSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZm9sZGVyLCAnLi9zY2VuZS5qc29uJylcbiAgbGV0IGlzUGFyY2VsU2NlbmUgPSB0cnVlXG5cbiAgY29uc3Qgd2VhcmFibGVKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShmb2xkZXIsICcuL3dlYXJhYmxlLmpzb24nKVxuICBpZiAoZnMuZXhpc3RzU3luYyh3ZWFyYWJsZUpzb25QYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3ZWFyYWJsZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh3ZWFyYWJsZUpzb25QYXRoKS50b1N0cmluZygpKVxuICAgICAgaWYgKCFXZWFyYWJsZUpzb24udmFsaWRhdGUod2VhcmFibGVKc29uKSkge1xuICAgICAgICBjb25zdCBlcnJvcnMgPSAoV2VhcmFibGVKc29uLnZhbGlkYXRlLmVycm9ycyB8fCBbXSkubWFwKChhKSA9PiBgJHthLmRhdGF9ICR7YS5tZXNzYWdlfWApLmpvaW4oJycpXG5cbiAgICAgICAgY29uc29sZS5lcnJvcihgVW5hYmxlIHRvIHZhbGlkYXRlIHdlYXJhYmxlLmpzb24gcHJvcGVybHksIHBsZWFzZSBjaGVjayBpdC5gLCBlcnJvcnMpXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgd2VhcmFibGUuanNvbiAoJHt3ZWFyYWJsZUpzb25QYXRofSlgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNQYXJjZWxTY2VuZSA9IGZhbHNlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBVbmFibGUgdG8gbG9hZCB3ZWFyYWJsZS5qc29uIHByb3Blcmx5YCwgZXJyKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGhhc2hNYWtlciA9IGN1c3RvbUhhc2hNYWtlciA/IGN1c3RvbUhhc2hNYWtlciA6IGRlZmF1bHRIYXNoTWFrZXJcblxuICBpZiAoZnMuZXhpc3RzU3luYyhzY2VuZUpzb25QYXRoKSAmJiBpc1BhcmNlbFNjZW5lKSB7XG4gICAgY29uc3Qgc2NlbmVKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoc2NlbmVKc29uUGF0aCkudG9TdHJpbmcoKSlcbiAgICBjb25zdCB7IGJhc2UsIHBhcmNlbHMgfTogeyBiYXNlOiBzdHJpbmc7IHBhcmNlbHM6IHN0cmluZ1tdIH0gPSBzY2VuZUpzb24uc2NlbmVcbiAgICBjb25zdCBwb2ludGVycyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgcG9pbnRlcnMuYWRkKGJhc2UpXG4gICAgcGFyY2Vscy5mb3JFYWNoKCgkKSA9PiBwb2ludGVycy5hZGQoJCkpXG5cbiAgICBjb25zdCBtYXBwZWRGaWxlcyA9IGdldEZpbGVzRnJvbUZvbGRlcih7XG4gICAgICBmb2xkZXIsXG4gICAgICBhZGRPcmlnaW5hbFBhdGgsXG4gICAgICBpZ25vcmVQYXR0ZXJuLFxuICAgICAgY3VzdG9tSGFzaE1ha2VyXG4gICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiAndjMnLFxuICAgICAgdHlwZTogRW50aXR5VHlwZS5TQ0VORSxcbiAgICAgIGlkOiBoYXNoTWFrZXIoZm9sZGVyKSxcbiAgICAgIHBvaW50ZXJzOiBBcnJheS5mcm9tKHBvaW50ZXJzKSxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1ldGFkYXRhOiBzY2VuZUpzb24sXG4gICAgICBjb250ZW50OiBtYXBwZWRGaWxlc1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IGRlZmF1bHREY2xJZ25vcmUgPSAoKSA9PlxuICBbXG4gICAgJy4qJyxcbiAgICAncGFja2FnZS5qc29uJyxcbiAgICAncGFja2FnZS1sb2NrLmpzb24nLFxuICAgICd5YXJuLWxvY2suanNvbicsXG4gICAgJ2J1aWxkLmpzb24nLFxuICAgICdleHBvcnQnLFxuICAgICd0c2NvbmZpZy5qc29uJyxcbiAgICAndHNsaW50Lmpzb24nLFxuICAgICdub2RlX21vZHVsZXMnLFxuICAgICcqLnRzJyxcbiAgICAnKi50c3gnLFxuICAgICdEb2NrZXJmaWxlJyxcbiAgICAnZGlzdCcsXG4gICAgJ1JFQURNRS5tZCcsXG4gICAgJyouYmxlbmQnLFxuICAgICcqLmZieCcsXG4gICAgJyouemlwJyxcbiAgICAnKi5yYXInXG4gIF0uam9pbignXFxuJylcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVzRnJvbUZvbGRlcih7XG4gIGZvbGRlcixcbiAgYWRkT3JpZ2luYWxQYXRoLFxuICBpZ25vcmVQYXR0ZXJuLFxuICBjdXN0b21IYXNoTWFrZXJcbn06IHtcbiAgZm9sZGVyOiBzdHJpbmdcbiAgYWRkT3JpZ2luYWxQYXRoPzogYm9vbGVhblxuICBpZ25vcmVQYXR0ZXJuPzogc3RyaW5nXG4gIGN1c3RvbUhhc2hNYWtlcj86IChzdHI6IHN0cmluZykgPT4gc3RyaW5nXG59KTogQ29udGVudE1hcHBpbmdbXSB7XG4gIGNvbnN0IGhhc2hNYWtlciA9IGN1c3RvbUhhc2hNYWtlciA/IGN1c3RvbUhhc2hNYWtlciA6IGRlZmF1bHRIYXNoTWFrZXJcblxuICBjb25zdCBhbGxGaWxlcyA9IGdsb2JTeW5jKCcqKi8qJywge1xuICAgIGN3ZDogZm9sZGVyLFxuICAgIGRvdDogZmFsc2UsXG4gICAgYWJzb2x1dGU6IHRydWVcbiAgfSlcbiAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKGZpbGUpLmlzRmlsZSgpKSByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IF9mb2xkZXIgPSBmb2xkZXIucmVwbGFjZSgvXFxcXC9naSwgJy8nKVxuICAgICAgY29uc3Qga2V5ID0gZmlsZS5yZXBsYWNlKF9mb2xkZXIsICcnKS5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgICAgcmV0dXJuIGtleVxuICAgIH0pXG4gICAgLmZpbHRlcigoJCkgPT4gISEkKSBhcyBzdHJpbmdbXVxuXG4gIGNvbnN0IGVuc3VyZUlnbm9yZVBhdHRlcm4gPSBpZ25vcmVQYXR0ZXJuICYmIGlnbm9yZVBhdHRlcm4gIT09ICcnID8gaWdub3JlUGF0dGVybiA6IGRlZmF1bHREY2xJZ25vcmUoKVxuICBjb25zdCBpZyA9IGlnbm9yZSgpLmFkZChlbnN1cmVJZ25vcmVQYXR0ZXJuKVxuICBjb25zdCBmaWx0ZXJlZEZpbGVzID0gaWcuZmlsdGVyKGFsbEZpbGVzKVxuXG4gIGNvbnN0IHJldDogKENvbnRlbnRNYXBwaW5nICYgeyBvcmlnaW5hbF9wYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgfSlbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbHRlcmVkRmlsZXMpIHtcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZm9sZGVyLCBmaWxlKVxuICAgIHRyeSB7XG4gICAgICBpZiAoIWZzLnN0YXRTeW5jKGFic29sdXRlUGF0aCkuaXNGaWxlKCkpIGNvbnRpbnVlXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnIpXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGFic29sdXRlRm9sZGVyID0gZm9sZGVyLnJlcGxhY2UoL1xcXFwvZ2ksICcvJylcblxuICAgIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGhUb0ZvbGRlciA9IGZpbGUucmVwbGFjZShhYnNvbHV0ZUZvbGRlciwgJycpLnJlcGxhY2UoL15cXC8rLywgJycpXG5cbiAgICByZXQucHVzaCh7XG4gICAgICBmaWxlOiByZWxhdGl2ZUZpbGVQYXRoVG9Gb2xkZXIudG9Mb3dlckNhc2UoKSxcbiAgICAgIG9yaWdpbmFsX3BhdGg6IGFkZE9yaWdpbmFsUGF0aCA/IGFic29sdXRlUGF0aCA6IHVuZGVmaW5lZCxcbiAgICAgIGhhc2g6IGhhc2hNYWtlcihhYnNvbHV0ZVBhdGgpXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiByZXRcbn1cbiJdfQ==