@cloudbase/storage 3.1.1 → 3.1.3-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/index.js CHANGED
@@ -1,5 +1,719 @@
1
- import { CloudbaseStorage, COMPONENT_NAME } from './storage';
2
- import { SupabaseFileAPILikeStorage } from './supabase';
1
+ var __extends = (this && this.__extends) || (function () {
2
+ var extendStatics = function (d, b) {
3
+ extendStatics = Object.setPrototypeOf ||
4
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
5
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
6
+ return extendStatics(d, b);
7
+ };
8
+ return function (d, b) {
9
+ if (typeof b !== "function" && b !== null)
10
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
11
+ extendStatics(d, b);
12
+ function __() { this.constructor = d; }
13
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
14
+ };
15
+ })();
16
+ var __assign = (this && this.__assign) || function () {
17
+ __assign = Object.assign || function(t) {
18
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
19
+ s = arguments[i];
20
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
21
+ t[p] = s[p];
22
+ }
23
+ return t;
24
+ };
25
+ return __assign.apply(this, arguments);
26
+ };
27
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
28
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
29
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
30
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
31
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
32
+ };
33
+ var __metadata = (this && this.__metadata) || function (k, v) {
34
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
35
+ };
36
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
37
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
38
+ return new (P || (P = Promise))(function (resolve, reject) {
39
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
40
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
42
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
43
+ });
44
+ };
45
+ var __generator = (this && this.__generator) || function (thisArg, body) {
46
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
47
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
48
+ function verb(n) { return function (v) { return step([n, v]); }; }
49
+ function step(op) {
50
+ if (f) throw new TypeError("Generator is already executing.");
51
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
52
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
53
+ if (y = 0, t) op = [op[0] & 2, t.value];
54
+ switch (op[0]) {
55
+ case 0: case 1: t = op; break;
56
+ case 4: _.label++; return { value: op[1], done: false };
57
+ case 5: _.label++; y = op[1]; op = [0]; continue;
58
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
59
+ default:
60
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
61
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
62
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
63
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
64
+ if (t[2]) _.ops.pop();
65
+ _.trys.pop(); continue;
66
+ }
67
+ op = body.call(thisArg, _);
68
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
69
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
70
+ }
71
+ };
72
+ import { isStorageError, StorageError } from './supabase/errors';
73
+ import { constants, utils, helpers } from '@cloudbase/utilities';
74
+ var EUploadMethod;
75
+ (function (EUploadMethod) {
76
+ EUploadMethod["put"] = "put";
77
+ EUploadMethod["post"] = "post";
78
+ })(EUploadMethod || (EUploadMethod = {}));
79
+ var getSdkName = constants.getSdkName, ERRORS = constants.ERRORS, COMMUNITY_SITE_URL = constants.COMMUNITY_SITE_URL;
80
+ var isArray = utils.isArray, isString = utils.isString, isPalinObject = utils.isPalinObject, execCallback = utils.execCallback;
81
+ var catchErrorsDecorator = helpers.catchErrorsDecorator;
82
+ export var COMPONENT_NAME = 'storage';
83
+ var storageGateWay = {
84
+ getUploadInfo: function (request, params, customReqOpts) { return __awaiter(void 0, void 0, void 0, function () {
85
+ var res, data;
86
+ var _a;
87
+ return __generator(this, function (_b) {
88
+ switch (_b.label) {
89
+ case 0: return [4, request.gateWay({
90
+ path: 'storages',
91
+ name: 'get-objects-upload-info',
92
+ data: [
93
+ __assign({ objectId: params.path }, (params.headers ? { signedHeader: Object.keys(params.headers).reduce(function (res, v) {
94
+ var _a;
95
+ return (__assign(__assign({}, res), (_a = {}, _a[v] = [params.headers[v]], _a)));
96
+ }, {}) } : {})),
97
+ ],
98
+ }, customReqOpts)];
99
+ case 1:
100
+ res = _b.sent();
101
+ data = ((_a = res.data) === null || _a === void 0 ? void 0 : _a[0]) || {};
102
+ res = __assign(__assign({}, res), { data: __assign(__assign({}, (data.code ? __assign({}, data) : {})), { authorization: data.authorization, token: data.token, url: data.uploadUrl, fileId: data.cloudObjectId, cosFileId: data.cloudObjectMeta, download_url: data.downloadUrl }) });
103
+ return [2, res];
104
+ }
105
+ });
106
+ }); },
107
+ getDownLoadInfo: function (request, params, customReqOpts) { return __awaiter(void 0, void 0, void 0, function () {
108
+ var res;
109
+ var _a;
110
+ return __generator(this, function (_b) {
111
+ switch (_b.label) {
112
+ case 0: return [4, request.gateWay({
113
+ path: 'storages',
114
+ name: 'get-objects-download-info',
115
+ data: params.convertedFileList.map(function (v) { return ({ cloudObjectId: v.fileid }); }),
116
+ }, customReqOpts)];
117
+ case 1:
118
+ res = _b.sent();
119
+ res = __assign(__assign({}, res), { data: {
120
+ download_list: (_a = res.data) === null || _a === void 0 ? void 0 : _a.map(function (v) { return ({
121
+ code: v.code || 'SUCCESS',
122
+ message: v.message,
123
+ fileid: v.cloudObjectId,
124
+ download_url: v.downloadUrl,
125
+ fileID: v.cloudObjectId,
126
+ tempFileURL: v.downloadUrl,
127
+ }); }),
128
+ } });
129
+ return [2, res];
130
+ }
131
+ });
132
+ }); },
133
+ delete: function (request, params, customReqOpts) { return __awaiter(void 0, void 0, void 0, function () {
134
+ var res;
135
+ var _a;
136
+ return __generator(this, function (_b) {
137
+ switch (_b.label) {
138
+ case 0: return [4, request.gateWay({
139
+ path: 'storages',
140
+ name: 'delete-objects',
141
+ data: params.fileList.map(function (v) { return ({ cloudObjectId: v }); }),
142
+ }, customReqOpts)];
143
+ case 1:
144
+ res = _b.sent();
145
+ res = __assign(__assign({}, res), { data: {
146
+ delete_list: (_a = res.data) === null || _a === void 0 ? void 0 : _a.map(function (v) { return ({
147
+ code: v.code || 'SUCCESS',
148
+ fileID: v.cloudObjectId,
149
+ message: v.message,
150
+ }); }),
151
+ } });
152
+ return [2, res];
153
+ }
154
+ });
155
+ }); },
156
+ copyFile: function (request, params, customReqOpts) { return __awaiter(void 0, void 0, void 0, function () {
157
+ var res;
158
+ var _a;
159
+ return __generator(this, function (_b) {
160
+ switch (_b.label) {
161
+ case 0: return [4, request.gateWay({
162
+ path: 'storages',
163
+ name: 'copy-objects',
164
+ data: params.convertedFileList.map(function (v) { return ({
165
+ srcPath: v.src_path,
166
+ dstPath: v.dst_path,
167
+ overwrite: v.overwrite,
168
+ removeOriginal: v.remove_original,
169
+ }); }),
170
+ }, customReqOpts)];
171
+ case 1:
172
+ res = _b.sent();
173
+ res = __assign(__assign({}, res), { data: {
174
+ copy_list: (_a = res.data) === null || _a === void 0 ? void 0 : _a.map(function (v) { return ({
175
+ code: v.code || 'SUCCESS',
176
+ fileID: v.cloudObjectId,
177
+ message: v.message,
178
+ }); }),
179
+ } });
180
+ return [2, res];
181
+ }
182
+ });
183
+ }); },
184
+ };
185
+ export var CloudbaseStorage = (function () {
186
+ function CloudbaseStorage() {
187
+ }
188
+ CloudbaseStorage.prototype.isGateWay = function () {
189
+ var config = this.config;
190
+ var endPointMode = config.endPointMode || 'CLOUD_API';
191
+ return endPointMode === 'GATEWAY';
192
+ };
193
+ CloudbaseStorage.prototype.uploadFile = function (params, callback) {
194
+ return __awaiter(this, void 0, void 0, function () {
195
+ var cloudPath, filePath, onUploadProgress, method, headers, fileContent, uploadMethod, metadataResult, metadata, requestId, url, authorization, token, fileId, cosFileId, downloadUrl, commonParams, putParams, postParams, uploadConfig, res;
196
+ var _a, _b, _c;
197
+ return __generator(this, function (_d) {
198
+ switch (_d.label) {
199
+ case 0:
200
+ cloudPath = params.cloudPath, filePath = params.filePath, onUploadProgress = params.onUploadProgress, method = (_a = params.method, _a === void 0 ? 'put' : _a), headers = (_b = params.headers, _b === void 0 ? {} : _b), fileContent = params.fileContent;
201
+ if (!isString(cloudPath) || (!filePath && !fileContent)) {
202
+ throw new Error(JSON.stringify({
203
+ code: ERRORS.INVALID_PARAMS,
204
+ msg: "[".concat(COMPONENT_NAME, ".uploadFile] invalid params"),
205
+ }));
206
+ }
207
+ uploadMethod = { put: EUploadMethod.put, post: EUploadMethod.post }[method.toLocaleLowerCase()] || EUploadMethod.put;
208
+ return [4, this.getUploadMetadata({
209
+ cloudPath: cloudPath,
210
+ method: uploadMethod,
211
+ headers: uploadMethod === EUploadMethod.put ? headers : undefined,
212
+ customReqOpts: params.customReqOpts,
213
+ })];
214
+ case 1:
215
+ metadataResult = _d.sent();
216
+ metadata = metadataResult.data, requestId = metadataResult.requestId;
217
+ url = metadata.url, authorization = metadata.authorization, token = metadata.token, fileId = metadata.fileId, cosFileId = metadata.cosFileId, downloadUrl = metadata.download_url;
218
+ commonParams = {
219
+ url: url,
220
+ file: filePath,
221
+ name: cloudPath,
222
+ onUploadProgress: onUploadProgress,
223
+ fileContent: fileContent,
224
+ fileId: fileId,
225
+ requestId: requestId,
226
+ };
227
+ putParams = __assign(__assign({}, commonParams), { method: EUploadMethod.put, headers: __assign(__assign({}, headers), { authorization: authorization, 'x-cos-meta-fileid': cosFileId, 'x-cos-security-token': token }) });
228
+ postParams = __assign(__assign({}, commonParams), { method: EUploadMethod.post, data: {
229
+ key: cloudPath,
230
+ signature: authorization,
231
+ 'x-cos-meta-fileid': cosFileId,
232
+ success_action_status: '201',
233
+ 'x-cos-security-token': token,
234
+ } });
235
+ uploadConfig = (_c = {},
236
+ _c[EUploadMethod.put] = {
237
+ params: putParams,
238
+ isSuccess: function (code) { return code >= 200 && code < 300; },
239
+ },
240
+ _c[EUploadMethod.post] = {
241
+ params: postParams,
242
+ isSuccess: function (code) { return code === 201; },
243
+ },
244
+ _c);
245
+ return [4, this.request.upload(uploadConfig[uploadMethod].params)];
246
+ case 2:
247
+ res = _d.sent();
248
+ if (uploadConfig[uploadMethod].isSuccess(res.statusCode)) {
249
+ return [2, execCallback(callback, null, {
250
+ fileID: fileId,
251
+ download_url: downloadUrl,
252
+ requestId: requestId,
253
+ })];
254
+ }
255
+ return [2, execCallback(callback, new Error("[".concat(getSdkName(), "][").concat(ERRORS.OPERATION_FAIL, "][").concat(COMPONENT_NAME, "]:").concat(res.data)))];
256
+ }
257
+ });
258
+ });
259
+ };
260
+ CloudbaseStorage.prototype.getUploadMetadata = function (params, callback) {
261
+ return __awaiter(this, void 0, void 0, function () {
262
+ var cloudPath, method, headers, request, action, metaData, metaDataParam, err_1;
263
+ return __generator(this, function (_a) {
264
+ switch (_a.label) {
265
+ case 0:
266
+ cloudPath = params.cloudPath, method = params.method, headers = params.headers;
267
+ if (!isString(cloudPath)) {
268
+ throw new Error(JSON.stringify({
269
+ code: ERRORS.INVALID_PARAMS,
270
+ msg: "[".concat(COMPONENT_NAME, ".getUploadMetadata] invalid cloudPath"),
271
+ }));
272
+ }
273
+ request = this.request;
274
+ action = 'storage.getUploadMetadata';
275
+ _a.label = 1;
276
+ case 1:
277
+ _a.trys.push([1, 6, , 7]);
278
+ metaData = void 0;
279
+ metaDataParam = { path: cloudPath };
280
+ if (method) {
281
+ metaDataParam.method = method;
282
+ }
283
+ if (method === EUploadMethod.put && headers) {
284
+ metaDataParam.headers = headers;
285
+ }
286
+ if (!this.isGateWay()) return [3, 3];
287
+ return [4, storageGateWay.getUploadInfo(request, metaDataParam, params.customReqOpts)];
288
+ case 2:
289
+ metaData = _a.sent();
290
+ return [3, 5];
291
+ case 3: return [4, request.send(action, metaDataParam, params.customReqOpts)];
292
+ case 4:
293
+ metaData = _a.sent();
294
+ _a.label = 5;
295
+ case 5: return [2, execCallback(callback, null, metaData)];
296
+ case 6:
297
+ err_1 = _a.sent();
298
+ return [2, execCallback(callback, err_1)];
299
+ case 7: return [2];
300
+ }
301
+ });
302
+ });
303
+ };
304
+ CloudbaseStorage.prototype.deleteFile = function (params, callback) {
305
+ return __awaiter(this, void 0, void 0, function () {
306
+ var fileList, _i, fileList_1, fileId, action, request, res, data;
307
+ return __generator(this, function (_a) {
308
+ switch (_a.label) {
309
+ case 0:
310
+ fileList = params.fileList;
311
+ if (!fileList || !isArray(fileList) || fileList.length === 0) {
312
+ throw new Error(JSON.stringify({
313
+ code: ERRORS.INVALID_PARAMS,
314
+ msg: "[".concat(COMPONENT_NAME, ".deleteFile] fileList must not be empty"),
315
+ }));
316
+ }
317
+ for (_i = 0, fileList_1 = fileList; _i < fileList_1.length; _i++) {
318
+ fileId = fileList_1[_i];
319
+ if (!fileId || !isString(fileId)) {
320
+ throw new Error(JSON.stringify({
321
+ code: ERRORS.INVALID_PARAMS,
322
+ msg: "[".concat(COMPONENT_NAME, ".deleteFile] fileID must be string"),
323
+ }));
324
+ }
325
+ }
326
+ action = 'storage.batchDeleteFile';
327
+ request = this.request;
328
+ res = {};
329
+ if (!this.isGateWay()) return [3, 2];
330
+ return [4, storageGateWay.delete(request, { fileList: fileList }, params.customReqOpts)];
331
+ case 1:
332
+ res = _a.sent();
333
+ return [3, 4];
334
+ case 2: return [4, request.send(action, {
335
+ fileid_list: fileList,
336
+ }, params.customReqOpts)];
337
+ case 3:
338
+ res = _a.sent();
339
+ _a.label = 4;
340
+ case 4:
341
+ if (res.code) {
342
+ return [2, execCallback(callback, null, res)];
343
+ }
344
+ data = {
345
+ fileList: res.data.delete_list,
346
+ requestId: res.requestId,
347
+ };
348
+ return [2, execCallback(callback, null, data)];
349
+ }
350
+ });
351
+ });
352
+ };
353
+ CloudbaseStorage.prototype.getTempFileURL = function (params, callback) {
354
+ return __awaiter(this, void 0, void 0, function () {
355
+ var fileList, convertedFileList, _i, fileList_2, file, action, request, res;
356
+ return __generator(this, function (_a) {
357
+ switch (_a.label) {
358
+ case 0:
359
+ fileList = params.fileList;
360
+ if (!fileList || !isArray(fileList) || fileList.length === 0) {
361
+ throw new Error(JSON.stringify({
362
+ code: ERRORS.INVALID_PARAMS,
363
+ msg: "[".concat(COMPONENT_NAME, ".getTempFileURL] fileList must not be empty"),
364
+ }));
365
+ }
366
+ convertedFileList = [];
367
+ for (_i = 0, fileList_2 = fileList; _i < fileList_2.length; _i++) {
368
+ file = fileList_2[_i];
369
+ if (isPalinObject(file)) {
370
+ if (!Object.prototype.hasOwnProperty.call(file, 'fileID')) {
371
+ throw new Error(JSON.stringify({
372
+ code: ERRORS.INVALID_PARAMS,
373
+ msg: "[".concat(COMPONENT_NAME, ".getTempFileURL] file info must include fileID"),
374
+ }));
375
+ }
376
+ convertedFileList.push({
377
+ fileid: file.fileID,
378
+ max_age: file.maxAge || 7200,
379
+ });
380
+ }
381
+ else if (isString(file)) {
382
+ convertedFileList.push({
383
+ fileid: file,
384
+ });
385
+ }
386
+ else {
387
+ throw new Error(JSON.stringify({
388
+ code: ERRORS.INVALID_PARAMS,
389
+ msg: "[".concat(COMPONENT_NAME, ".getTempFileURL] invalid fileList"),
390
+ }));
391
+ }
392
+ }
393
+ action = 'storage.batchGetDownloadUrl';
394
+ request = this.request;
395
+ res = {};
396
+ if (!this.isGateWay()) return [3, 2];
397
+ return [4, storageGateWay.getDownLoadInfo(request, { convertedFileList: convertedFileList }, params.customReqOpts)];
398
+ case 1:
399
+ res = _a.sent();
400
+ return [3, 4];
401
+ case 2: return [4, request.send(action, { file_list: convertedFileList }, params.customReqOpts)];
402
+ case 3:
403
+ res = _a.sent();
404
+ _a.label = 4;
405
+ case 4:
406
+ if (res.code) {
407
+ return [2, execCallback(callback, null, res)];
408
+ }
409
+ return [2, execCallback(callback, null, {
410
+ fileList: res.data.download_list,
411
+ requestId: res.requestId,
412
+ })];
413
+ }
414
+ });
415
+ });
416
+ };
417
+ CloudbaseStorage.prototype.downloadFile = function (params, callback) {
418
+ return __awaiter(this, void 0, void 0, function () {
419
+ var fileID, tmpUrlRes, res, request, tmpUrl, result;
420
+ return __generator(this, function (_a) {
421
+ switch (_a.label) {
422
+ case 0:
423
+ fileID = params.fileID;
424
+ if (!isString(fileID)) {
425
+ throw new Error(JSON.stringify({
426
+ code: ERRORS.INVALID_PARAMS,
427
+ msg: "[".concat(COMPONENT_NAME, ".getTempFileURL] fileID must be string"),
428
+ }));
429
+ }
430
+ return [4, this.getTempFileURL.call(this, {
431
+ fileList: [
432
+ {
433
+ fileID: fileID,
434
+ maxAge: 600,
435
+ },
436
+ ],
437
+ customReqOpts: params.customReqOpts,
438
+ })];
439
+ case 1:
440
+ tmpUrlRes = _a.sent();
441
+ res = tmpUrlRes.fileList[0];
442
+ if (res.code !== 'SUCCESS') {
443
+ return [2, execCallback(callback, res)];
444
+ }
445
+ request = this.request;
446
+ tmpUrl = encodeURI(res.download_url);
447
+ return [4, request.download({ url: tmpUrl, tempFilePath: params.tempFilePath })];
448
+ case 2:
449
+ result = _a.sent();
450
+ return [2, execCallback(callback, null, result)];
451
+ }
452
+ });
453
+ });
454
+ };
455
+ CloudbaseStorage.prototype.copyFile = function (params, callback) {
456
+ return __awaiter(this, void 0, void 0, function () {
457
+ var fileList, convertedFileList, _i, fileList_3, file, srcPath, dstPath, request, res, action;
458
+ return __generator(this, function (_a) {
459
+ switch (_a.label) {
460
+ case 0:
461
+ fileList = params.fileList;
462
+ if (!fileList || !isArray(fileList) || fileList.length === 0) {
463
+ throw new Error(JSON.stringify({
464
+ code: ERRORS.INVALID_PARAMS,
465
+ msg: "[".concat(COMPONENT_NAME, ".copyFile] fileList must not be empty"),
466
+ }));
467
+ }
468
+ convertedFileList = [];
469
+ for (_i = 0, fileList_3 = fileList; _i < fileList_3.length; _i++) {
470
+ file = fileList_3[_i];
471
+ srcPath = file.srcPath, dstPath = file.dstPath;
472
+ if (!srcPath || !dstPath || typeof srcPath !== 'string' || typeof dstPath !== 'string') {
473
+ throw new Error(JSON.stringify({
474
+ code: ERRORS.INVALID_PARAMS,
475
+ msg: "[".concat(COMPONENT_NAME, ".copyFile] srcPath and dstPath may not be empty"),
476
+ }));
477
+ }
478
+ if (srcPath === dstPath) {
479
+ throw new Error(JSON.stringify({
480
+ code: ERRORS.INVALID_PARAMS,
481
+ msg: "[".concat(COMPONENT_NAME, ".copyFile] srcPath and dstPath can not be the same"),
482
+ }));
483
+ }
484
+ convertedFileList.push({
485
+ src_path: srcPath,
486
+ dst_path: dstPath,
487
+ overwrite: file.overwrite,
488
+ remove_original: file.removeOriginal,
489
+ });
490
+ }
491
+ request = this.request;
492
+ res = {};
493
+ if (!this.isGateWay()) return [3, 2];
494
+ return [4, storageGateWay.copyFile(request, { convertedFileList: convertedFileList }, params.customReqOpts)];
495
+ case 1:
496
+ res = _a.sent();
497
+ return [3, 4];
498
+ case 2:
499
+ action = 'storage.batchCopyFile';
500
+ return [4, request.send(action, { file_list: convertedFileList }, params.customReqOpts)];
501
+ case 3:
502
+ res = _a.sent();
503
+ _a.label = 4;
504
+ case 4:
505
+ if (res.code) {
506
+ return [2, execCallback(callback, null, res)];
507
+ }
508
+ return [2, execCallback(callback, null, {
509
+ fileList: res.data.copy_list,
510
+ requestId: res.requestId,
511
+ })];
512
+ }
513
+ });
514
+ });
515
+ };
516
+ CloudbaseStorage.prototype.getFileInfo = function (params) {
517
+ var _a;
518
+ return __awaiter(this, void 0, void 0, function () {
519
+ var fileInfo, fileList;
520
+ var _this = this;
521
+ return __generator(this, function (_b) {
522
+ switch (_b.label) {
523
+ case 0: return [4, this.getTempFileURL(params)];
524
+ case 1:
525
+ fileInfo = _b.sent();
526
+ if (!((fileInfo === null || fileInfo === void 0 ? void 0 : fileInfo.fileList) && ((_a = fileInfo === null || fileInfo === void 0 ? void 0 : fileInfo.fileList) === null || _a === void 0 ? void 0 : _a.length) > 0)) return [3, 3];
527
+ return [4, Promise.all(fileInfo.fileList.map(function (item) { return __awaiter(_this, void 0, void 0, function () {
528
+ var request, res, header, fileSize, contentType, fileInfo_1, e_1;
529
+ return __generator(this, function (_a) {
530
+ switch (_a.label) {
531
+ case 0:
532
+ if (item.code !== 'SUCCESS') {
533
+ return [2, {
534
+ code: item.code,
535
+ fileID: item.fileID,
536
+ tempFileURL: item.tempFileURL,
537
+ message: item.message,
538
+ }];
539
+ }
540
+ _a.label = 1;
541
+ case 1:
542
+ _a.trys.push([1, 3, , 4]);
543
+ request = this.request;
544
+ return [4, request.fetch({ url: item.tempFileURL, method: 'HEAD' })];
545
+ case 2:
546
+ res = _a.sent();
547
+ header = res.header;
548
+ if (Headers && header instanceof Headers) {
549
+ header = Object.fromEntries(res.header.entries());
550
+ }
551
+ fileSize = parseInt(header['content-length']) || 0;
552
+ contentType = header['content-type'] || '';
553
+ if ([400, 404].includes(Number(res.statusCode))) {
554
+ return [2, {
555
+ code: 'FILE_NOT_FOUND',
556
+ fileID: item.fileID,
557
+ tempFileURL: item.tempFileURL,
558
+ message: 'file not found',
559
+ }];
560
+ }
561
+ fileInfo_1 = {
562
+ code: item.code,
563
+ fileID: item.fileID,
564
+ tempFileURL: item.tempFileURL,
565
+ cloudId: item.fileID,
566
+ fileName: item.fileID.split('/').pop(),
567
+ contentType: contentType,
568
+ mime: contentType.split(';')[0].trim(),
569
+ size: fileSize,
570
+ etag: header.etag || '',
571
+ lastModified: header['last-modified'] || '',
572
+ cacheControl: header['cache-control'] || '',
573
+ };
574
+ return [2, fileInfo_1];
575
+ case 3:
576
+ e_1 = _a.sent();
577
+ return [2, {
578
+ code: 'FETCH_FILE_INFO_ERROR',
579
+ fileID: item.fileID,
580
+ tempFileURL: item.tempFileURL,
581
+ message: e_1.message,
582
+ }];
583
+ case 4: return [2];
584
+ }
585
+ });
586
+ }); }))];
587
+ case 2:
588
+ fileList = _b.sent();
589
+ return [2, {
590
+ fileList: fileList,
591
+ requestId: fileInfo.requestId,
592
+ }];
593
+ case 3: return [2, {
594
+ fileList: [],
595
+ requestId: fileInfo.requestId,
596
+ }];
597
+ }
598
+ });
599
+ });
600
+ };
601
+ __decorate([
602
+ catchErrorsDecorator({
603
+ customInfo: {
604
+ className: 'Cloudbase',
605
+ methodName: 'uploadFile',
606
+ },
607
+ title: '上传文件失败',
608
+ messages: [
609
+ '请确认以下各项:',
610
+ ' 1 - 调用 uploadFile() 的语法或参数是否正确',
611
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
612
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
613
+ "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
614
+ ],
615
+ }),
616
+ __metadata("design:type", Function),
617
+ __metadata("design:paramtypes", [Object, Function]),
618
+ __metadata("design:returntype", Promise)
619
+ ], CloudbaseStorage.prototype, "uploadFile", null);
620
+ __decorate([
621
+ catchErrorsDecorator({
622
+ customInfo: {
623
+ className: 'Cloudbase',
624
+ methodName: 'getUploadMetadata',
625
+ },
626
+ title: '获取上传元信息失败',
627
+ messages: [
628
+ '请确认以下各项:',
629
+ ' 1 - 调用 getUploadMetadata() 的语法或参数是否正确',
630
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
631
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
632
+ "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
633
+ ],
634
+ }),
635
+ __metadata("design:type", Function),
636
+ __metadata("design:paramtypes", [Object, Function]),
637
+ __metadata("design:returntype", Promise)
638
+ ], CloudbaseStorage.prototype, "getUploadMetadata", null);
639
+ __decorate([
640
+ catchErrorsDecorator({
641
+ customInfo: {
642
+ className: 'Cloudbase',
643
+ methodName: 'deleteFile',
644
+ },
645
+ title: '删除文件失败',
646
+ messages: [
647
+ '请确认以下各项:',
648
+ ' 1 - 调用 deleteFile() 的语法或参数是否正确',
649
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
650
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
651
+ "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
652
+ ],
653
+ }),
654
+ __metadata("design:type", Function),
655
+ __metadata("design:paramtypes", [Object, Function]),
656
+ __metadata("design:returntype", Promise)
657
+ ], CloudbaseStorage.prototype, "deleteFile", null);
658
+ __decorate([
659
+ catchErrorsDecorator({
660
+ customInfo: {
661
+ className: 'Cloudbase',
662
+ methodName: 'getTempFileURL',
663
+ },
664
+ title: '获取文件下载链接',
665
+ messages: [
666
+ '请确认以下各项:',
667
+ ' 1 - 调用 getTempFileURL() 的语法或参数是否正确',
668
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
669
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
670
+ "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
671
+ ],
672
+ }),
673
+ __metadata("design:type", Function),
674
+ __metadata("design:paramtypes", [Object, Function]),
675
+ __metadata("design:returntype", Promise)
676
+ ], CloudbaseStorage.prototype, "getTempFileURL", null);
677
+ __decorate([
678
+ catchErrorsDecorator({
679
+ customInfo: {
680
+ className: 'Cloudbase',
681
+ methodName: 'downloadFile',
682
+ },
683
+ title: '下载文件失败',
684
+ messages: [
685
+ '请确认以下各项:',
686
+ ' 1 - 调用 downloadFile() 的语法或参数是否正确',
687
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
688
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
689
+ "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
690
+ ],
691
+ }),
692
+ __metadata("design:type", Function),
693
+ __metadata("design:paramtypes", [Object, Function]),
694
+ __metadata("design:returntype", Promise)
695
+ ], CloudbaseStorage.prototype, "downloadFile", null);
696
+ __decorate([
697
+ catchErrorsDecorator({
698
+ customInfo: {
699
+ className: 'Cloudbase',
700
+ methodName: 'copyFile',
701
+ },
702
+ title: '批量复制文件',
703
+ messages: [
704
+ '请确认以下各项:',
705
+ ' 1 - 调用 copyFile() 的语法或参数是否正确',
706
+ ' 2 - 当前域名是否在安全域名列表中:https://console.cloud.tencent.com/tcb/env/safety',
707
+ ' 3 - 云存储安全规则是否限制了当前登录状态访问',
708
+ "\u5982\u679C\u95EE\u9898\u4F9D\u7136\u5B58\u5728\uFF0C\u5EFA\u8BAE\u5230\u5B98\u65B9\u95EE\u7B54\u793E\u533A\u63D0\u95EE\u6216\u5BFB\u627E\u5E2E\u52A9\uFF1A".concat(COMMUNITY_SITE_URL),
709
+ ],
710
+ }),
711
+ __metadata("design:type", Function),
712
+ __metadata("design:paramtypes", [Object, Function]),
713
+ __metadata("design:returntype", Promise)
714
+ ], CloudbaseStorage.prototype, "copyFile", null);
715
+ return CloudbaseStorage;
716
+ }());
3
717
  var storage = new CloudbaseStorage();
4
718
  var component = {
5
719
  name: COMPONENT_NAME,
@@ -14,6 +728,648 @@ var component = {
14
728
  isGateWay: storage.isGateWay,
15
729
  },
16
730
  };
731
+ var SupabaseFileAPILikeStorage = (function (_super) {
732
+ __extends(SupabaseFileAPILikeStorage, _super);
733
+ function SupabaseFileAPILikeStorage(context) {
734
+ var _this = _super.call(this) || this;
735
+ _this.shouldThrowOnError = false;
736
+ _this.bucketId = '';
737
+ _this.context = context;
738
+ return _this;
739
+ }
740
+ Object.defineProperty(SupabaseFileAPILikeStorage.prototype, "config", {
741
+ get: function () {
742
+ var _a;
743
+ return (_a = this.context) === null || _a === void 0 ? void 0 : _a.config;
744
+ },
745
+ enumerable: false,
746
+ configurable: true
747
+ });
748
+ Object.defineProperty(SupabaseFileAPILikeStorage.prototype, "request", {
749
+ get: function () {
750
+ var _a;
751
+ return (_a = this.context) === null || _a === void 0 ? void 0 : _a.request;
752
+ },
753
+ enumerable: false,
754
+ configurable: true
755
+ });
756
+ SupabaseFileAPILikeStorage.prototype.throwOnError = function () {
757
+ this.shouldThrowOnError = true;
758
+ return this;
759
+ };
760
+ SupabaseFileAPILikeStorage.prototype.from = function (bucket) {
761
+ this.bucketId = bucket || '';
762
+ return this;
763
+ };
764
+ SupabaseFileAPILikeStorage.prototype.upload = function (path, fileBody, fileOptions) {
765
+ return __awaiter(this, void 0, void 0, function () {
766
+ var options, cacheControl, contentType, metadata, cloudPath, uploadFileParams, headers, result, error_1;
767
+ return __generator(this, function (_a) {
768
+ switch (_a.label) {
769
+ case 0:
770
+ options = __assign({ upsert: true }, fileOptions);
771
+ cacheControl = options.cacheControl, contentType = options.contentType, metadata = options.metadata;
772
+ _a.label = 1;
773
+ case 1:
774
+ _a.trys.push([1, 3, , 4]);
775
+ cloudPath = this._getCloudPath(path);
776
+ uploadFileParams = {
777
+ cloudPath: cloudPath,
778
+ filePath: fileBody,
779
+ };
780
+ if (cacheControl || contentType || metadata) {
781
+ headers = {};
782
+ if (cacheControl) {
783
+ headers['cache-control'] = cacheControl;
784
+ }
785
+ if (contentType) {
786
+ headers['content-type'] = contentType;
787
+ }
788
+ if (metadata) {
789
+ headers['x-cos-metadata-metadata'] = this.toBase64(JSON.stringify(metadata));
790
+ }
791
+ uploadFileParams.headers = headers;
792
+ }
793
+ return [4, this.uploadFile(uploadFileParams)];
794
+ case 2:
795
+ result = _a.sent();
796
+ if (!result.fileID) {
797
+ throw new Error(JSON.stringify({
798
+ code: ERRORS.OPERATION_FAIL,
799
+ msg: "[".concat(COMPONENT_NAME, ".update] no fileID returned"),
800
+ }));
801
+ }
802
+ return [2, {
803
+ data: {
804
+ id: result.fileID,
805
+ path: path,
806
+ fullPath: path,
807
+ },
808
+ error: null,
809
+ }];
810
+ case 3:
811
+ error_1 = _a.sent();
812
+ if (this.shouldThrowOnError)
813
+ throw error_1;
814
+ if (isStorageError(error_1)) {
815
+ return [2, {
816
+ data: null,
817
+ error: error_1,
818
+ }];
819
+ }
820
+ throw error_1;
821
+ case 4: return [2];
822
+ }
823
+ });
824
+ });
825
+ };
826
+ SupabaseFileAPILikeStorage.prototype.uploadToSignedUrl = function (path, _token, fileBody, fileOptions) {
827
+ return __awaiter(this, void 0, void 0, function () {
828
+ return __generator(this, function (_a) {
829
+ return [2, this.upload(path, fileBody, fileOptions)];
830
+ });
831
+ });
832
+ };
833
+ SupabaseFileAPILikeStorage.prototype.createSignedUploadUrl = function (path) {
834
+ return __awaiter(this, void 0, void 0, function () {
835
+ var cloudPath, metadata, error_2;
836
+ return __generator(this, function (_a) {
837
+ switch (_a.label) {
838
+ case 0:
839
+ _a.trys.push([0, 2, , 3]);
840
+ cloudPath = this._getCloudPath(path);
841
+ return [4, this.getUploadMetadata({ cloudPath: cloudPath })];
842
+ case 1:
843
+ metadata = (_a.sent()).data;
844
+ return [2, {
845
+ data: {
846
+ signedUrl: metadata.url,
847
+ token: metadata.token,
848
+ path: path,
849
+ authorization: metadata.authorization,
850
+ id: metadata.fileId,
851
+ cosFileId: metadata.cosFileId,
852
+ downloadUrl: metadata.download_url,
853
+ },
854
+ error: null,
855
+ }];
856
+ case 2:
857
+ error_2 = _a.sent();
858
+ if (this.shouldThrowOnError)
859
+ throw error_2;
860
+ return [2, {
861
+ data: null,
862
+ error: error_2 instanceof StorageError ? error_2 : new StorageError(error_2.message),
863
+ }];
864
+ case 3: return [2];
865
+ }
866
+ });
867
+ });
868
+ };
869
+ SupabaseFileAPILikeStorage.prototype.update = function (path, fileBody, fileOptions) {
870
+ return __awaiter(this, void 0, void 0, function () {
871
+ return __generator(this, function (_a) {
872
+ return [2, this.upload(path, fileBody, __assign(__assign({}, fileOptions), { upsert: true }))];
873
+ });
874
+ });
875
+ };
876
+ SupabaseFileAPILikeStorage.prototype.move = function (fromPath, toPath) {
877
+ return __awaiter(this, void 0, void 0, function () {
878
+ var result, error_3;
879
+ return __generator(this, function (_a) {
880
+ switch (_a.label) {
881
+ case 0:
882
+ _a.trys.push([0, 2, , 3]);
883
+ return [4, this.copyFile({
884
+ fileList: [
885
+ {
886
+ srcPath: this._getCloudPath(fromPath),
887
+ dstPath: this._getCloudPath(toPath),
888
+ overwrite: true,
889
+ removeOriginal: true,
890
+ },
891
+ ],
892
+ })];
893
+ case 1:
894
+ result = _a.sent();
895
+ if (result.fileList[0].code && result.fileList[0].code !== 'SUCCESS') {
896
+ throw new StorageError(result.fileList[0].message || 'Move failed');
897
+ }
898
+ return [2, {
899
+ data: { message: "File moved from ".concat(fromPath, " to ").concat(toPath) },
900
+ error: null,
901
+ }];
902
+ case 2:
903
+ error_3 = _a.sent();
904
+ if (this.shouldThrowOnError)
905
+ throw error_3;
906
+ if (isStorageError(error_3)) {
907
+ return [2, {
908
+ data: null,
909
+ error: error_3,
910
+ }];
911
+ }
912
+ throw error_3;
913
+ case 3: return [2];
914
+ }
915
+ });
916
+ });
917
+ };
918
+ SupabaseFileAPILikeStorage.prototype.copy = function (fromPath, toPath) {
919
+ return __awaiter(this, void 0, void 0, function () {
920
+ var result, error_4;
921
+ return __generator(this, function (_a) {
922
+ switch (_a.label) {
923
+ case 0:
924
+ _a.trys.push([0, 2, , 3]);
925
+ return [4, this.copyFile({
926
+ fileList: [
927
+ {
928
+ srcPath: this._getCloudPath(fromPath),
929
+ dstPath: this._getCloudPath(toPath),
930
+ overwrite: true,
931
+ removeOriginal: false,
932
+ },
933
+ ],
934
+ })];
935
+ case 1:
936
+ result = _a.sent();
937
+ if (result.fileList[0].code && result.fileList[0].code !== 'SUCCESS') {
938
+ throw new StorageError(result.fileList[0].message || 'Copy failed');
939
+ }
940
+ return [2, {
941
+ data: { path: this._getCloudPath(toPath) },
942
+ error: null,
943
+ }];
944
+ case 2:
945
+ error_4 = _a.sent();
946
+ if (this.shouldThrowOnError)
947
+ throw error_4;
948
+ if (isStorageError(error_4)) {
949
+ return [2, { data: null, error: error_4 }];
950
+ }
951
+ throw error_4;
952
+ case 3: return [2];
953
+ }
954
+ });
955
+ });
956
+ };
957
+ SupabaseFileAPILikeStorage.prototype.createSignedUrl = function (path, expiresIn, options) {
958
+ return __awaiter(this, void 0, void 0, function () {
959
+ var cloudPath, result, signedUrl, queryParams, transformQuery, separator, error_5;
960
+ return __generator(this, function (_a) {
961
+ switch (_a.label) {
962
+ case 0:
963
+ _a.trys.push([0, 2, , 3]);
964
+ cloudPath = this._normalizeCloudId(path);
965
+ return [4, this.getTempFileURL({
966
+ fileList: [
967
+ {
968
+ fileID: cloudPath,
969
+ maxAge: expiresIn,
970
+ },
971
+ ],
972
+ })];
973
+ case 1:
974
+ result = _a.sent();
975
+ if (result.fileList[0].code !== 'SUCCESS') {
976
+ throw new StorageError("Failed to create signed URL: [".concat(result.fileList[0].code, "] ").concat(result.fileList[0].fileID));
977
+ }
978
+ signedUrl = result.fileList[0].download_url;
979
+ queryParams = [];
980
+ if ((options === null || options === void 0 ? void 0 : options.download) !== undefined) {
981
+ if (typeof options.download === 'string') {
982
+ queryParams.push("download=".concat(encodeURIComponent(options.download)));
983
+ }
984
+ else if (options.download === true) {
985
+ queryParams.push('download=true');
986
+ }
987
+ }
988
+ if (options === null || options === void 0 ? void 0 : options.transform) {
989
+ transformQuery = this._transformOptsToQueryString(options.transform);
990
+ if (transformQuery) {
991
+ queryParams.push(transformQuery);
992
+ }
993
+ }
994
+ if (queryParams.length > 0) {
995
+ separator = signedUrl.includes('?') ? '&' : '?';
996
+ signedUrl = "".concat(signedUrl).concat(separator).concat(queryParams.join('&'));
997
+ }
998
+ return [2, {
999
+ data: { signedUrl: signedUrl },
1000
+ error: null,
1001
+ }];
1002
+ case 2:
1003
+ error_5 = _a.sent();
1004
+ if (this.shouldThrowOnError)
1005
+ throw error_5;
1006
+ if (isStorageError(error_5)) {
1007
+ return [2, {
1008
+ data: null,
1009
+ error: error_5,
1010
+ }];
1011
+ }
1012
+ throw error_5;
1013
+ case 3: return [2];
1014
+ }
1015
+ });
1016
+ });
1017
+ };
1018
+ SupabaseFileAPILikeStorage.prototype.createSignedUrls = function (paths, expiresIn) {
1019
+ return __awaiter(this, void 0, void 0, function () {
1020
+ var fileList, result, error_6;
1021
+ var _this = this;
1022
+ return __generator(this, function (_a) {
1023
+ switch (_a.label) {
1024
+ case 0:
1025
+ _a.trys.push([0, 2, , 3]);
1026
+ fileList = paths.map(function (p) { return ({
1027
+ fileID: _this._normalizeCloudId(p),
1028
+ maxAge: expiresIn,
1029
+ }); });
1030
+ return [4, this.getTempFileURL({ fileList: fileList })];
1031
+ case 1:
1032
+ result = _a.sent();
1033
+ return [2, {
1034
+ data: result.fileList.map(function (item, index) { return ({
1035
+ path: paths[index],
1036
+ signedUrl: item.tempFileURL || '',
1037
+ error: item.code === 'SUCCESS' ? null : item.message,
1038
+ }); }),
1039
+ error: null,
1040
+ }];
1041
+ case 2:
1042
+ error_6 = _a.sent();
1043
+ if (this.shouldThrowOnError)
1044
+ throw error_6;
1045
+ if (isStorageError(error_6)) {
1046
+ return [2, {
1047
+ data: null,
1048
+ error: error_6,
1049
+ }];
1050
+ }
1051
+ throw error_6;
1052
+ case 3: return [2];
1053
+ }
1054
+ });
1055
+ });
1056
+ };
1057
+ SupabaseFileAPILikeStorage.prototype.download = function (path, options) {
1058
+ return __awaiter(this, void 0, void 0, function () {
1059
+ var error_7;
1060
+ var _a;
1061
+ var _this = this;
1062
+ return __generator(this, function (_b) {
1063
+ switch (_b.label) {
1064
+ case 0:
1065
+ _b.trys.push([0, 2, , 3]);
1066
+ _a = {};
1067
+ return [4, (function () { return __awaiter(_this, void 0, void 0, function () {
1068
+ var signedUrlResult, tmpUrl, data;
1069
+ var _a;
1070
+ return __generator(this, function (_b) {
1071
+ switch (_b.label) {
1072
+ case 0: return [4, this.createSignedUrl(path, 600, { transform: options })];
1073
+ case 1:
1074
+ signedUrlResult = _b.sent();
1075
+ if (signedUrlResult.error) {
1076
+ throw signedUrlResult.error;
1077
+ }
1078
+ tmpUrl = encodeURI((_a = signedUrlResult.data) === null || _a === void 0 ? void 0 : _a.signedUrl);
1079
+ return [4, this.request.reqClass.get({
1080
+ url: tmpUrl,
1081
+ headers: {},
1082
+ responseType: 'blob',
1083
+ })];
1084
+ case 2:
1085
+ data = (_b.sent()).data;
1086
+ if (!data) {
1087
+ throw new StorageError('Download failed: no file content');
1088
+ }
1089
+ return [2, new Blob([data])];
1090
+ }
1091
+ });
1092
+ }); })()];
1093
+ case 1: return [2, (_a.data = _b.sent(),
1094
+ _a.error = null,
1095
+ _a)];
1096
+ case 2:
1097
+ error_7 = _b.sent();
1098
+ if (this.shouldThrowOnError)
1099
+ throw error_7;
1100
+ if (isStorageError(error_7)) {
1101
+ return [2, {
1102
+ data: null,
1103
+ error: error_7,
1104
+ }];
1105
+ }
1106
+ throw error_7;
1107
+ case 3: return [2];
1108
+ }
1109
+ });
1110
+ });
1111
+ };
1112
+ SupabaseFileAPILikeStorage.prototype.info = function (pathOrFileId) {
1113
+ return __awaiter(this, void 0, void 0, function () {
1114
+ var isFileId, displayName, bucketId, fileInfo, item, now, lastModified, error_8;
1115
+ return __generator(this, function (_a) {
1116
+ switch (_a.label) {
1117
+ case 0:
1118
+ _a.trys.push([0, 2, , 3]);
1119
+ isFileId = pathOrFileId.startsWith('cloud://');
1120
+ displayName = isFileId ? this._extractPathFromFileId(pathOrFileId) : pathOrFileId;
1121
+ bucketId = isFileId ? this._extractBucketFromFileId(pathOrFileId) : this.bucketId;
1122
+ return [4, this.getFileInfo({
1123
+ fileList: [this._normalizeCloudId(pathOrFileId)],
1124
+ })];
1125
+ case 1:
1126
+ fileInfo = _a.sent();
1127
+ item = fileInfo.fileList[0];
1128
+ if (item.code !== 'SUCCESS') {
1129
+ throw new StorageError(item.message);
1130
+ }
1131
+ now = new Date().toISOString();
1132
+ lastModified = (item.lastModified ? new Date(item.lastModified) : new Date()).toISOString();
1133
+ return [2, {
1134
+ data: {
1135
+ id: item.fileID,
1136
+ version: '1',
1137
+ name: displayName,
1138
+ bucketId: bucketId,
1139
+ updatedAt: lastModified,
1140
+ createdAt: lastModified,
1141
+ lastAccessedAt: now,
1142
+ size: item.size,
1143
+ cacheControl: item.cacheControl,
1144
+ contentType: item.contentType,
1145
+ etag: item.etag,
1146
+ lastModified: lastModified,
1147
+ metadata: {},
1148
+ },
1149
+ error: null,
1150
+ }];
1151
+ case 2:
1152
+ error_8 = _a.sent();
1153
+ if (this.shouldThrowOnError)
1154
+ throw error_8;
1155
+ return [2, {
1156
+ data: null,
1157
+ error: error_8 instanceof StorageError ? error_8 : new StorageError(error_8.message),
1158
+ }];
1159
+ case 3: return [2];
1160
+ }
1161
+ });
1162
+ });
1163
+ };
1164
+ SupabaseFileAPILikeStorage.prototype.exists = function (pathOrFileId) {
1165
+ return __awaiter(this, void 0, void 0, function () {
1166
+ var fileInfo, item, error_9;
1167
+ return __generator(this, function (_a) {
1168
+ switch (_a.label) {
1169
+ case 0:
1170
+ _a.trys.push([0, 2, , 3]);
1171
+ return [4, this.getFileInfo({
1172
+ fileList: [this._normalizeCloudId(pathOrFileId)],
1173
+ })];
1174
+ case 1:
1175
+ fileInfo = _a.sent();
1176
+ item = fileInfo.fileList[0];
1177
+ if (item.code === 'FILE_NOT_FOUND') {
1178
+ return [2, {
1179
+ data: false,
1180
+ error: null,
1181
+ }];
1182
+ }
1183
+ if (item.code !== 'SUCCESS') {
1184
+ throw new StorageError(item.message);
1185
+ }
1186
+ return [2, { data: true, error: null }];
1187
+ case 2:
1188
+ error_9 = _a.sent();
1189
+ if (this.shouldThrowOnError)
1190
+ throw error_9;
1191
+ if (isStorageError(error_9)) {
1192
+ return [2, {
1193
+ data: null,
1194
+ error: error_9,
1195
+ }];
1196
+ }
1197
+ throw error_9;
1198
+ case 3: return [2];
1199
+ }
1200
+ });
1201
+ });
1202
+ };
1203
+ SupabaseFileAPILikeStorage.prototype.getPublicUrl = function (path, options) {
1204
+ return __awaiter(this, void 0, void 0, function () {
1205
+ var res;
1206
+ return __generator(this, function (_a) {
1207
+ switch (_a.label) {
1208
+ case 0: return [4, this.createSignedUrl(path, 600, options)];
1209
+ case 1:
1210
+ res = _a.sent();
1211
+ if (res.data) {
1212
+ return [2, {
1213
+ data: { publicUrl: res.data.signedUrl },
1214
+ }];
1215
+ }
1216
+ return [2, { data: null, error: res.error }];
1217
+ }
1218
+ });
1219
+ });
1220
+ };
1221
+ SupabaseFileAPILikeStorage.prototype.remove = function (paths) {
1222
+ return __awaiter(this, void 0, void 0, function () {
1223
+ var chunkSize_1, pathChunks, i, fileInfoResults, fileInfoMap_1, fileList, result, failedFiles, now_1, error_10;
1224
+ var _this = this;
1225
+ return __generator(this, function (_a) {
1226
+ switch (_a.label) {
1227
+ case 0:
1228
+ _a.trys.push([0, 3, , 4]);
1229
+ chunkSize_1 = 10;
1230
+ pathChunks = [];
1231
+ for (i = 0; i < paths.length; i += chunkSize_1) {
1232
+ pathChunks.push(paths.slice(i, i + chunkSize_1));
1233
+ }
1234
+ return [4, Promise.all(pathChunks.map(function (chunk) { return Promise.all(chunk.map(function (path) { return _this.info(path); })); }))];
1235
+ case 1:
1236
+ fileInfoResults = _a.sent();
1237
+ fileInfoMap_1 = new Map();
1238
+ fileInfoResults.flat().forEach(function (result, index) {
1239
+ if (result.data) {
1240
+ fileInfoMap_1.set(paths[Math.floor(index / chunkSize_1) * chunkSize_1 + (index % chunkSize_1)], result.data);
1241
+ }
1242
+ });
1243
+ fileList = paths.map(function (p) { return _this._normalizeCloudId(p); });
1244
+ return [4, this.deleteFile({ fileList: fileList })];
1245
+ case 2:
1246
+ result = _a.sent();
1247
+ failedFiles = result.fileList.filter(function (item) { return item.code !== 'SUCCESS'; });
1248
+ if (failedFiles.length > 0) {
1249
+ throw new StorageError("Delete failed for ".concat(failedFiles.length, " file(s)"));
1250
+ }
1251
+ now_1 = new Date().toISOString();
1252
+ return [2, {
1253
+ data: paths.map(function (p) {
1254
+ var info = fileInfoMap_1.get(p);
1255
+ return {
1256
+ name: info === null || info === void 0 ? void 0 : info.name,
1257
+ id: info === null || info === void 0 ? void 0 : info.id,
1258
+ bucket_id: info === null || info === void 0 ? void 0 : info.bucketId,
1259
+ owner: undefined,
1260
+ updated_at: (info === null || info === void 0 ? void 0 : info.updatedAt) || now_1,
1261
+ created_at: info === null || info === void 0 ? void 0 : info.createdAt,
1262
+ last_accessed_at: (info === null || info === void 0 ? void 0 : info.lastAccessedAt) || now_1,
1263
+ metadata: (info === null || info === void 0 ? void 0 : info.metadata) || {},
1264
+ buckets: {
1265
+ id: info === null || info === void 0 ? void 0 : info.bucketId,
1266
+ name: info === null || info === void 0 ? void 0 : info.bucketId,
1267
+ owner: undefined,
1268
+ public: false,
1269
+ created_at: '',
1270
+ updated_at: now_1,
1271
+ },
1272
+ };
1273
+ }),
1274
+ error: null,
1275
+ }];
1276
+ case 3:
1277
+ error_10 = _a.sent();
1278
+ if (this.shouldThrowOnError)
1279
+ throw error_10;
1280
+ if (isStorageError(error_10)) {
1281
+ return [2, {
1282
+ data: null,
1283
+ error: error_10,
1284
+ }];
1285
+ }
1286
+ throw error_10;
1287
+ case 4: return [2];
1288
+ }
1289
+ });
1290
+ });
1291
+ };
1292
+ SupabaseFileAPILikeStorage.prototype.list = function () {
1293
+ return __awaiter(this, void 0, void 0, function () {
1294
+ return __generator(this, function (_a) {
1295
+ throw new StorageError('Not implemented');
1296
+ });
1297
+ });
1298
+ };
1299
+ SupabaseFileAPILikeStorage.prototype._getCloudPath = function (path) {
1300
+ var cleanPath = path.replace(/^\/|\/$/g, '').replace(/\/+/g, '/');
1301
+ return cleanPath;
1302
+ };
1303
+ SupabaseFileAPILikeStorage.prototype._normalizeCloudId = function (path) {
1304
+ var _a;
1305
+ if (/^cloud:\/\//.test(path)) {
1306
+ return path;
1307
+ }
1308
+ var cleanPath = this._getCloudPath(path);
1309
+ if (this.bucketId) {
1310
+ var envId = ((_a = this.config) === null || _a === void 0 ? void 0 : _a.env) || '';
1311
+ if (envId) {
1312
+ return "cloud://".concat(envId, ".").concat(this.bucketId, "/").concat(cleanPath);
1313
+ }
1314
+ }
1315
+ else {
1316
+ throw new StorageError('bucketId is not set');
1317
+ }
1318
+ };
1319
+ SupabaseFileAPILikeStorage.prototype.toBase64 = function (data) {
1320
+ if (typeof Buffer !== 'undefined') {
1321
+ return Buffer.from(data).toString('base64');
1322
+ }
1323
+ return btoa(data);
1324
+ };
1325
+ SupabaseFileAPILikeStorage.prototype._transformOptsToQueryString = function (transform) {
1326
+ var params = ['imageMogr2'];
1327
+ if (transform.width || transform.height) {
1328
+ var width = transform.width || '';
1329
+ var height = transform.height || '';
1330
+ if (transform.resize === 'fill') {
1331
+ params.push("thumbnail/".concat(width, "x").concat(height, "!"));
1332
+ }
1333
+ else if (transform.resize === 'contain') {
1334
+ params.push("thumbnail/".concat(width, "x").concat(height));
1335
+ }
1336
+ else {
1337
+ params.push("thumbnail/".concat(width, "x").concat(height, "^"));
1338
+ }
1339
+ }
1340
+ if (transform.format && transform.format !== 'origin') {
1341
+ params.push("format/".concat(transform.format));
1342
+ }
1343
+ if (transform.quality !== undefined) {
1344
+ var quality = Math.max(1, Math.min(100, transform.quality));
1345
+ params.push("quality/".concat(quality));
1346
+ }
1347
+ return params.join('/');
1348
+ };
1349
+ SupabaseFileAPILikeStorage.prototype._extractPathFromFileId = function (fileId) {
1350
+ var withoutProtocol = fileId.replace(/^cloud:\/\//, '');
1351
+ var parts = withoutProtocol.split('/');
1352
+ if (parts.length < 2) {
1353
+ return fileId;
1354
+ }
1355
+ return parts.slice(1).join('/');
1356
+ };
1357
+ SupabaseFileAPILikeStorage.prototype._extractBucketFromFileId = function (fileId) {
1358
+ var withoutProtocol = fileId.replace(/^cloud:\/\//, '');
1359
+ var parts = withoutProtocol.split('/');
1360
+ if (parts.length < 1) {
1361
+ return '';
1362
+ }
1363
+ var envAndBucket = parts[0];
1364
+ var dotIndex = envAndBucket.indexOf('.');
1365
+ if (dotIndex === -1) {
1366
+ return envAndBucket;
1367
+ }
1368
+ return envAndBucket.substring(dotIndex + 1);
1369
+ };
1370
+ return SupabaseFileAPILikeStorage;
1371
+ }(CloudbaseStorage));
1372
+ export { SupabaseFileAPILikeStorage };
17
1373
  var supabaseComponent = {
18
1374
  name: "".concat(COMPONENT_NAME, "/supabase"),
19
1375
  IIFE: true,
@@ -63,4 +1419,4 @@ try {
63
1419
  window.registerStorage = registerStorage;
64
1420
  }
65
1421
  catch (e) { }
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBcUIsTUFBTSxXQUFXLENBQUE7QUFDL0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sWUFBWSxDQUFBO0FBSXZELElBQU0sT0FBTyxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQTtBQUN0QyxJQUFNLFNBQVMsR0FBd0I7SUFDckMsSUFBSSxFQUFFLGNBQWM7SUFDcEIsTUFBTSxFQUFFO1FBQ04sVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO1FBQzlCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtRQUM5QixjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7UUFDdEMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1FBQ2xDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxpQkFBaUI7UUFDNUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztRQUNoQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7S0FDN0I7Q0FDRixDQUFBO0FBRUQsSUFBTSxpQkFBaUIsR0FBd0I7SUFDN0MsSUFBSSxFQUFFLFVBQUcsY0FBYyxjQUFXO0lBQ2xDLElBQUksRUFBRSxJQUFJO0lBQ1YsTUFBTTtRQUtKLElBQU0sWUFBWSxHQUFHLElBQUksT0FBTyxFQUFtQyxDQUFBO1FBR25FLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUU7WUFDL0MsR0FBRztnQkFJRCxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzFCLE9BQU8sWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtpQkFDOUI7Z0JBSUQsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFBO2dCQUVyQixJQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBb0IsRUFBdUIsRUFBRTtvQkFDcEUsR0FBRyxFQUFFLFVBQUMsT0FBTyxFQUFFLElBQUk7d0JBQ2pCLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRTs0QkFDckIsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFBO3lCQUN2Qjt3QkFDRCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7NEJBQ3RCLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQTt5QkFDeEI7d0JBQ0QsT0FBTyxTQUFTLENBQUE7b0JBQ2xCLENBQUM7aUJBQ0YsQ0FBQyxDQUFBO2dCQUdGLElBQU0sT0FBTyxHQUFHLElBQUksMEJBQTBCLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBQ3ZELFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO2dCQUMvQixPQUFPLE9BQU8sQ0FBQTtZQUNoQixDQUFDO1lBQ0QsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGLENBQUE7QUFFRCxJQUFJO0lBQ0YsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3RDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0NBQy9DO0FBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRTtBQUVkLE1BQU0sVUFBVSxlQUFlLENBQUMsR0FBMEM7SUFDeEUsSUFBSTtRQUNGLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNoQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtLQUN6QztJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtLQUNoQjtBQUNILENBQUM7QUFFRCxJQUFJO0lBQ0QsTUFBYyxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUE7Q0FDbEQ7QUFBQyxPQUFPLENBQUMsRUFBRSxHQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNsb3VkYmFzZSB9IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMnXG5pbXBvcnQgeyBJQ2xvdWRiYXNlQ29tcG9uZW50IH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9jb21wb25lbnQnXG5pbXBvcnQgeyBDbG91ZGJhc2VTdG9yYWdlLCBDT01QT05FTlRfTkFNRSwgSUNsb3VkYmFzZUNvbnRleHQgfSBmcm9tICcuL3N0b3JhZ2UnXG5pbXBvcnQgeyBTdXBhYmFzZUZpbGVBUElMaWtlU3RvcmFnZSB9IGZyb20gJy4vc3VwYWJhc2UnXG5cbmRlY2xhcmUgY29uc3QgY2xvdWRiYXNlOiBJQ2xvdWRiYXNlXG5cbmNvbnN0IHN0b3JhZ2UgPSBuZXcgQ2xvdWRiYXNlU3RvcmFnZSgpXG5jb25zdCBjb21wb25lbnQ6IElDbG91ZGJhc2VDb21wb25lbnQgPSB7XG4gIG5hbWU6IENPTVBPTkVOVF9OQU1FLFxuICBlbnRpdHk6IHtcbiAgICB1cGxvYWRGaWxlOiBzdG9yYWdlLnVwbG9hZEZpbGUsXG4gICAgZGVsZXRlRmlsZTogc3RvcmFnZS5kZWxldGVGaWxlLFxuICAgIGdldFRlbXBGaWxlVVJMOiBzdG9yYWdlLmdldFRlbXBGaWxlVVJMLFxuICAgIGRvd25sb2FkRmlsZTogc3RvcmFnZS5kb3dubG9hZEZpbGUsXG4gICAgZ2V0VXBsb2FkTWV0YWRhdGE6IHN0b3JhZ2UuZ2V0VXBsb2FkTWV0YWRhdGEsXG4gICAgY29weUZpbGU6IHN0b3JhZ2UuY29weUZpbGUsXG4gICAgZ2V0RmlsZUluZm86IHN0b3JhZ2UuZ2V0RmlsZUluZm8sXG4gICAgaXNHYXRlV2F5OiBzdG9yYWdlLmlzR2F0ZVdheSxcbiAgfSxcbn1cblxuY29uc3Qgc3VwYWJhc2VDb21wb25lbnQ6IElDbG91ZGJhc2VDb21wb25lbnQgPSB7XG4gIG5hbWU6IGAke0NPTVBPTkVOVF9OQU1FfS9zdXBhYmFzZWAsXG4gIElJRkU6IHRydWUsXG4gIGVudGl0eSgpIHtcbiAgICAvLyDlnKggSUlGRSDkuK3vvIx0aGlzIOaYryBDbG91ZGJhc2Ug57G777yI5p6E6YCg5Ye95pWw77yJ77yM5LiN5piv5a6e5L6LXG4gICAgLy8g5omA5Lul5oiR5Lus6ZyA6KaB5L2/55SoIGdldHRlciDmnaXlu7bov5/ojrflj5blrp7kvovnmoQgY29uZmlnIOWSjCByZXF1ZXN0XG5cbiAgICAvLyDkvb/nlKggV2Vha01hcCDnvJPlrZjmr4/kuKrlrp7kvovnmoQgc3RvcmFnZSDlr7nosaFcbiAgICBjb25zdCBzdG9yYWdlQ2FjaGUgPSBuZXcgV2Vha01hcDxhbnksIFN1cGFiYXNlRmlsZUFQSUxpa2VTdG9yYWdlPigpXG5cbiAgICAvLyDlrprkuYkgc3RvcmFnZSDlsZ7mgKfnmoQgZ2V0dGVy77yM5q+P5Liq5a6e5L6L5Y+q5Yib5bu65LiA5qyhXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMucHJvdG90eXBlLCAnc3RvcmFnZScsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgLy8g6L+Z6YeM55qEIHRoaXMg5pivIGNsb3VkYmFzZSDlrp7kvotcblxuICAgICAgICAvLyDlpoLmnpzlt7Lnu4/liJvlu7rov4fvvIznm7TmjqXov5Tlm57nvJPlrZjnmoTlrp7kvotcbiAgICAgICAgaWYgKHN0b3JhZ2VDYWNoZS5oYXModGhpcykpIHtcbiAgICAgICAgICByZXR1cm4gc3RvcmFnZUNhY2hlLmdldCh0aGlzKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g5Yib5bu65Yqo5oCBIGNvbnRleHTvvIzku47lvZPliY3lrp7kvovojrflj5YgY29uZmlnIOWSjCByZXF1ZXN0XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXNcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtYXNzZXJ0aW9uc1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gbmV3IFByb3h5PElDbG91ZGJhc2VDb250ZXh0Pih7fSBhcyBJQ2xvdWRiYXNlQ29udGV4dCwge1xuICAgICAgICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnY29uZmlnJykge1xuICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuY29uZmlnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gJ3JlcXVlc3QnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXF1ZXN0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyDliJvlu7rmlrDnmoQgc3RvcmFnZSDlrp7kvovlubbnvJPlrZhcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IG5ldyBTdXBhYmFzZUZpbGVBUElMaWtlU3RvcmFnZShjb250ZXh0KVxuICAgICAgICBzdG9yYWdlQ2FjaGUuc2V0KHRoaXMsIHN0b3JhZ2UpXG4gICAgICAgIHJldHVybiBzdG9yYWdlXG4gICAgICB9LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB9KVxuICB9LFxufVxuXG50cnkge1xuICBjbG91ZGJhc2UucmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50KVxuICBjbG91ZGJhc2UucmVnaXN0ZXJDb21wb25lbnQoc3VwYWJhc2VDb21wb25lbnQpXG59IGNhdGNoIChlKSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTdG9yYWdlKGFwcDogUGljazxJQ2xvdWRiYXNlLCAncmVnaXN0ZXJDb21wb25lbnQnPikge1xuICB0cnkge1xuICAgIGFwcC5yZWdpc3RlckNvbXBvbmVudChjb21wb25lbnQpXG4gICAgYXBwLnJlZ2lzdGVyQ29tcG9uZW50KHN1cGFiYXNlQ29tcG9uZW50KVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS53YXJuKGUpXG4gIH1cbn1cblxudHJ5IHtcbiAgKHdpbmRvdyBhcyBhbnkpLnJlZ2lzdGVyU3RvcmFnZSA9IHJlZ2lzdGVyU3RvcmFnZVxufSBjYXRjaCAoZSkge31cbiJdfQ==
1422
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBaUJoRSxJQUFLLGFBR0o7QUFIRCxXQUFLLGFBQWE7SUFDaEIsNEJBQVcsQ0FBQTtJQUNYLDhCQUFhLENBQUE7QUFDZixDQUFDLEVBSEksYUFBYSxLQUFiLGFBQWEsUUFHakI7QUFXTyxJQUFBLFVBQVUsR0FBaUMsU0FBUyxXQUExQyxFQUFFLE1BQU0sR0FBeUIsU0FBUyxPQUFsQyxFQUFFLGtCQUFrQixHQUFLLFNBQVMsbUJBQWQsQ0FBYztBQUNwRCxJQUFBLE9BQU8sR0FBNEMsS0FBSyxRQUFqRCxFQUFFLFFBQVEsR0FBa0MsS0FBSyxTQUF2QyxFQUFFLGFBQWEsR0FBbUIsS0FBSyxjQUF4QixFQUFFLFlBQVksR0FBSyxLQUFLLGFBQVYsQ0FBVTtBQUV4RCxJQUFBLG9CQUFvQixHQUFLLE9BQU8scUJBQVosQ0FBWTtBQUV4QyxNQUFNLENBQUMsSUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFBO0FBRXZDLElBQU0sY0FBYyxHQUFHO0lBQ3JCLGFBQWEsRUFBRSxVQUNiLE9BQU8sRUFDUCxNQUEwRCxFQUMxRCxhQUEwRDs7Ozs7d0JBRWhELFdBQU0sT0FBTyxDQUFDLE9BQU8sQ0FDN0I7d0JBQ0UsSUFBSSxFQUFFLFVBQVU7d0JBQ2hCLElBQUksRUFBRSx5QkFBeUI7d0JBQy9CLElBQUksRUFBRTt1Q0FFRixRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksSUFDbEIsQ0FBQyxNQUFNLENBQUMs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QUFBO3lCQUN4Qjt3QkFDRCxPQUFPLFNBQVMsQ0FBQTtvQkFDbEIsQ0FBQztpQkFDRixDQUFDLENBQUE7Z0JBR0YsSUFBTSxPQUFPLEdBQUcsSUFBSSwwQkFBMEIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFDdkQsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7Z0JBQy9CLE9BQU8sT0FBTyxDQUFBO1lBQ2hCLENBQUM7WUFDRCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUE7SUFDSixDQUFDO0NBQ0YsQ0FBQTtBQUVELElBQUk7SUFDRixTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDdEMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUE7Q0FDL0M7QUFBQyxPQUFPLENBQUMsRUFBRSxHQUFFO0FBRWQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxHQUEwQztJQUN4RSxJQUFJO1FBQ0YsR0FBRyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2hDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0tBQ3pDO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ2hCO0FBQ0gsQ0FBQztBQUVELElBQUk7SUFDRCxNQUFjLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQTtDQUNsRDtBQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQ2xvdWRiYXNlIH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcydcbmltcG9ydCB7IElDbG91ZGJhc2VDb21wb25lbnQgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2NvbXBvbmVudCdcbmltcG9ydCB7IENhbWVsaXplLCBGaWxlQm9keSwgRmlsZU9iamVjdCwgRmlsZU9iamVjdFYyLCBGaWxlT3B0aW9ucywgVHJhbnNmb3JtT3B0aW9ucyB9IGZyb20gJy4vc3VwYWJhc2UvdHlwZXMnXG5pbXBvcnQgeyBpc1N0b3JhZ2VFcnJvciwgU3RvcmFnZUVycm9yIH0gZnJvbSAnLi9zdXBhYmFzZS9lcnJvcnMnXG5pbXBvcnQgeyBjb25zdGFudHMsIHV0aWxzLCBoZWxwZXJzIH0gZnJvbSAnQGNsb3VkYmFzZS91dGlsaXRpZXMnXG5pbXBvcnQge1xuICBJQ2xvdWRiYXNlRmlsZU1ldGFEYXRhUmVzLFxuICBJQ2xvdWRiYXNlRmlsZUluZm8sXG4gIElDbG91ZGJhc2VVcGxvYWRGaWxlUGFyYW1zLFxuICBJQ2xvdWRiYXNlVXBsb2FkRmlsZVJlc3VsdCxcbiAgSUNsb3VkYmFzZUdldFVwbG9hZE1ldGFkYXRhUGFyYW1zLFxuICBJQ2xvdWRiYXNlRGVsZXRlRmlsZVBhcmFtcyxcbiAgSUNsb3VkYmFzZURlbGV0ZUZpbGVSZXN1bHQsXG4gIElDbG91ZGJhc2VHZXRUZW1wRmlsZVVSTFJlc3VsdCxcbiAgSUNsb3VkYmFzZUdldFRlbXBGaWxlVVJMUGFyYW1zLFxuICBJQ2xvdWRiYXNlRG93bmxvYWRGaWxlUmVzdWx0LFxuICBJQ2xvdWRiYXNlRG93bmxvYWRGaWxlUGFyYW1zLFxuICBJQ2xvdWRiYXNlQ29weUZpbGVQYXJhbXMsXG4gIElDbG91ZGJhc2VDb3B5RmlsZVJlc3VsdCxcbn0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9zdG9yYWdlJ1xuXG5lbnVtIEVVcGxvYWRNZXRob2Qge1xuICBwdXQgPSAncHV0JyxcbiAgcG9zdCA9ICdwb3N0Jyxcbn1cblxuaW50ZXJmYWNlIElVcGxvYWRNZXRhZGF0YSB7XG4gIHVybDogc3RyaW5nXG4gIHRva2VuOiBzdHJpbmdcbiAgYXV0aG9yaXphdGlvbjogc3RyaW5nXG4gIGZpbGVJZDogc3RyaW5nXG4gIGNvc0ZpbGVJZDogc3RyaW5nXG4gIGRvd25sb2FkX3VybD86IHN0cmluZ1xufVxuXG5jb25zdCB7IGdldFNka05hbWUsIEVSUk9SUywgQ09NTVVOSVRZX1NJVEVfVVJMIH0gPSBjb25zdGFudHNcbmNvbnN0IHsgaXNBcnJheSwgaXNTdHJpbmcsIGlzUGFsaW5PYmplY3QsIGV4ZWNDYWxsYmFjayB9ID0gdXRpbHNcbi8qKiBjYXRjaEVycm9yc0RlY29yYXRvciDoo4XppbDlmajopoHmlL7lnKhpbmRleOWFpeWPo+aWh+S7tu+8jOaEj+mdouacieeahOe8luivkeaJvuS4jeWIsOWFtnNvdXJjZW1hcO+8jOS+i+WmgkhCdWlsZGVyWCAqL1xuY29uc3QgeyBjYXRjaEVycm9yc0RlY29yYXRvciB9ID0gaGVscGVyc1xuXG5leHBvcnQgY29uc3QgQ09NUE9ORU5UX05BTUUgPSAnc3RvcmFnZSdcblxuY29uc3Qgc3RvcmFnZUdhdGVXYXkgPSB7XG4gIGdldFVwbG9hZEluZm86IGFzeW5jIChcbiAgICByZXF1ZXN0LFxuICAgIHBhcmFtczogeyBwYXRoOiBzdHJpbmc7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0sXG4gICAgY3VzdG9tUmVxT3B0czogSUNsb3VkYmFzZVVwbG9hZEZpbGVQYXJhbXNbJ2N1c3RvbVJlcU9wdHMnXSxcbiAgKSA9PiB7XG4gICAgbGV0IHJlcyA9IGF3YWl0IHJlcXVlc3QuZ2F0ZVdheShcbiAgICAgIHtcbiAgICAgICAgcGF0aDogJ3N0b3JhZ2VzJyxcbiAgICAgICAgbmFtZTogJ2dldC1vYmplY3RzLXVwbG9hZC1pbmZvJyxcbiAgICAgICAgZGF0YTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9iamVjdElkOiBwYXJhbXMucGF0aCxcbiAgICAgICAgICAgIC4uLihwYXJhbXMuaGVhZGVycyA/IHsgc2lnbmVkSGVhZGVyOiBPYmplY3Qua2V5cyhwYXJhbXMuaGVhZGVycykucmVkdWNlKChyZXMsIHYpID0+ICh7IC4uLnJlcywgW3ZdOiBbcGFyYW1zLmhlYWRlcnNbdl1dIH0pLCB7fSkgfSA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbVJlcU9wdHMsXG4gICAgKVxuICAgIGNvbnN0IGRhdGEgPSByZXMuZGF0YT8uWzBdIHx8IHt9XG5cbiAgICByZXMgPSB7XG4gICAgICAuLi5yZXMsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIC4uLihkYXRhLmNvZGUgPyB7IC4uLmRhdGEgfSA6IHt9KSxcbiAgICAgICAgYXV0aG9yaXphdGlvbjogZGF0YS5hdXRob3JpemF0aW9uLFxuICAgICAgICB0b2tlbjogZGF0YS50b2tlbixcbiAgICAgICAgdXJsOiBkYXRhLnVwbG9hZFVybCxcbiAgICAgICAgZmlsZUlkOiBkYXRhLmNsb3VkT2JqZWN0SWQsXG4gICAgICAgIGNvc0ZpbGVJZDogZGF0YS5jbG91ZE9iamVjdE1ldGEsXG4gICAgICAgIGRvd25sb2FkX3VybDogZGF0YS5kb3dubG9hZFVybCxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc1xuICB9LFxuICBnZXREb3duTG9hZEluZm86IGFzeW5jIChcbiAgICByZXF1ZXN0LFxuICAgIHBhcmFtczogeyBjb252ZXJ0ZWRGaWxlTGlzdDogQXJyYXk8eyBmaWxlaWQ6IHN0cmluZyB9PiB9LFxuICAgIGN1c3RvbVJlcU9wdHM6IElDbG91ZGJhc2VVcGxvYWRGaWxlUGFyYW1zWydjdXN0b21SZXFPcHRzJ10sXG4gICkgPT4ge1xuICAgIGxldCByZXMgPSBhd2FpdCByZXF1ZXN0LmdhdGVXYXkoXG4gICAgICB7XG4gICAgICAgIHBhdGg6ICdzdG9yYWdlcycsXG4gICAgICAgIG5hbWU6ICdnZXQtb2JqZWN0cy1kb3dubG9hZC1pbmZvJyxcbiAgICAgICAgZGF0YTogcGFyYW1zLmNvbnZlcnRlZEZpbGVMaXN0Lm1hcCgodjogYW55KSA9PiAoeyBjbG91ZE9iamVjdElkOiB2LmZpbGVpZCB9KSksXG4gICAgICB9LFxuICAgICAgY3VzdG9tUmVxT3B0cyxcbiAgICApXG4gICAgcmVzID0ge1xuICAgICAgLi4ucmVzLFxuICAgICAgZGF0YToge1xuICAgICAgICBkb3dubG9hZF9saXN0OiByZXMuZGF0YT8ubWFwKHYgPT4gKHtcbiAgICAgICAgICBjb2RlOiB2LmNvZGUgfHwgJ1NVQ0NFU1MnLFxuICAgICAgICAgIG1lc3NhZ2U6IHYubWVzc2FnZSxcbiAgICAgICAgICBmaWxlaWQ6IHYuY2xvdWRPYmplY3RJZCxcbiAgICAgICAgICBkb3dubG9hZF91cmw6IHYuZG93bmxvYWRVcmwsXG4gICAgICAgICAgZmlsZUlEOiB2LmNsb3VkT2JqZWN0SWQsXG4gICAgICAgICAgdGVtcEZpbGVVUkw6IHYuZG93bmxvYWRVcmwsXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc1xuICB9LFxuICBkZWxldGU6IGFzeW5jIChcbiAgICByZXF1ZXN0LFxuICAgIHBhcmFtczogeyBmaWxlTGlzdDogQXJyYXk8c3RyaW5nPiB9LFxuICAgIGN1c3RvbVJlcU9wdHM6IElDbG91ZGJhc2VVcGxvYWRGaWxlUGFyYW1zWydjdXN0b21SZXFPcHRzJ10sXG4gICkgPT4ge1xuICAgIGxldCByZXMgPSBhd2FpdCByZXF1ZXN0LmdhdGVXYXkoXG4gICAgICB7XG4gICAgICAgIHBhdGg6ICdzdG9yYWdlcycsXG4gICAgICAgIG5hbWU6ICdkZWxldGUtb2JqZWN0cycsXG4gICAgICAgIGRhdGE6IHBhcmFtcy5maWxlTGlzdC5tYXAodiA9PiAoeyBjbG91ZE9iamVjdElkOiB2IH0pKSxcbiAgICAgIH0sXG4gICAgICBjdXN0b21SZXFPcHRzLFxuICAgIClcbiAgICByZXMgPSB7XG4gICAgICAuLi5yZXMsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGRlbGV0ZV9saXN0OiByZXMuZGF0YT8ubWFwKHYgPT4gKHtcbiAgICAgICAgICBjb2RlOiB2LmNvZGUgfHwgJ1NVQ0NFU1MnLFxuICAgICAgICAgIGZpbGVJRDogdi5jbG91ZE9iamVjdElkLFxuICAgICAgICAgIG1lc3NhZ2U6IHYubWVzc2FnZSxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzXG4gIH0sXG4gIGNvcHlGaWxlOiBhc3luYyAoXG4gICAgcmVxdWVzdCxcbiAgICBwYXJhbXM6IHtcbiAgICAgIGNvbnZlcnRlZEZpbGVMaXN0OiBBcnJheTx7IHNyY19wYXRoOiBzdHJpbmc7IGRzdF9wYXRoOiBzdHJpbmc7IG92ZXJ3cml0ZTogYm9vbGVhbjsgcmVtb3ZlX29yaWdpbmFsOiBib29sZWFuIH0+XG4gICAgfSxcbiAgICBjdXN0b21SZXFPcHRzOiBJQ2xvdWRiYXNlVXBsb2FkRmlsZVBhcmFtc1snY3VzdG9tUmVxT3B0cyddLFxuICApID0+IHtcbiAgICBsZXQgcmVzID0gYXdhaXQgcmVxdWVzdC5nYXRlV2F5KFxuICAgICAge1xuICAgICAgICBwYXRoOiAnc3RvcmFnZXMnLFxuICAgICAgICBuYW1lOiAnY29weS1vYmplY3RzJyxcbiAgICAgICAgZGF0YTogcGFyYW1zLmNvbnZlcnRlZEZpbGVMaXN0Lm1hcCgodjogYW55KSA9PiAoe1xuICAgICAgICAgIHNyY1BhdGg6IHYuc3JjX3BhdGgsXG4gICAgICAgICAgZHN0UGF0aDogdi5kc3RfcGF0aCxcbiAgICAgICAgICBvdmVyd3JpdGU6IHYub3ZlcndyaXRlLFxuICAgICAgICAgIHJlbW92ZU9yaWdpbmFsOiB2LnJlbW92ZV9vcmlnaW5hbCxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbVJlcU9wdHMsXG4gICAgKVxuICAgIHJlcyA9IHtcbiAgICAgIC4uLnJlcyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgY29weV9saXN0OiByZXMuZGF0YT8ubWFwKHYgPT4gKHtcbiAgICAgICAgICBjb2RlOiB2LmNvZGUgfHwgJ1NVQ0NFU1MnLFxuICAgICAgICAgIGZpbGVJRDogdi5jbG91ZE9iamVjdElkLFxuICAgICAgICAgIG1lc3NhZ2U6IHYubWVzc2FnZSxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzXG4gIH0sXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNsb3VkYmFzZUNvbnRleHQge1xuICBjb25maWc6IGFueVxuICByZXF1ZXN0OiBhbnlcbn1cblxuZXhwb3J0IGNsYXNzIENsb3VkYmFzZVN0b3JhZ2Uge1xuICBwdWJsaWMgaXNHYXRlV2F5KCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7IGNvbmZpZyB9ID0gdGhpc1xuICAgIGNvbnN0IGVuZFBvaW50TW9kZSA9IGNvbmZpZy5lbmRQb2ludE1vZGUgfHwgJ0NMT1VEX0FQSSdcblxuICAgIHJldHVybiBlbmRQb2ludE1vZGUgPT09ICdHQVRFV0FZJ1xuICB9XG5cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICBjdXN0b21JbmZvOiB7XG4gICAgICBjbGFzc05hbWU6ICdDbG91ZGJhc2UnLFxuICAgICAgbWV0aG9kTmFtZTogJ3VwbG9hZEZpbGUnLFxuICAgIH0sXG4gICAgdGl0bGU6ICfkuIrkvKDmlofku7blpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggdXBsb2FkRmlsZSgpIOeahOivreazleaIluWPguaVsOaYr+WQpuato+ehricsXG4gICAgICAnICAyIC0g5b2T5YmN5Z+f5ZCN5piv5ZCm5Zyo5a6J5YWo5Z+f5ZCN5YiX6KGo5Lit77yaaHR0cHM6Ly9jb25zb2xlLmNsb3VkLnRlbmNlbnQuY29tL3RjYi9lbnYvc2FmZXR5JyxcbiAgICAgICcgIDMgLSDkupHlrZjlgqjlronlhajop4TliJnmmK/lkKbpmZDliLbkuoblvZPliY3nmbvlvZXnirbmgIHorr/pl64nLFxuICAgICAgYOWmguaenOmXrumimOS+neeEtuWtmOWcqO+8jOW7uuiuruWIsOWumOaWuemXruetlOekvuWMuuaPkOmXruaIluWvu+aJvuW4ruWKqe+8miR7Q09NTVVOSVRZX1NJVEVfVVJMfWAsXG4gICAgXSxcbiAgfSlcbiAgcHVibGljIGFzeW5jIHVwbG9hZEZpbGUoXG4gICAgcGFyYW1zOiBPbWl0PElDbG91ZGJhc2VVcGxvYWRGaWxlUGFyYW1zLCAnZmlsZVBhdGgnPiAmIHsgZmlsZVBhdGg/OiBzdHJpbmcgfSxcbiAgICBjYWxsYmFjaz86IEZ1bmN0aW9uLFxuICApOiBQcm9taXNlPElDbG91ZGJhc2VVcGxvYWRGaWxlUmVzdWx0PiB7XG4gICAgY29uc3QgeyBjbG91ZFBhdGgsIGZpbGVQYXRoLCBvblVwbG9hZFByb2dyZXNzLCBtZXRob2QgPSAncHV0JywgaGVhZGVycyA9IHt9LCBmaWxlQ29udGVudCB9ID0gcGFyYW1zXG4gICAgaWYgKCFpc1N0cmluZyhjbG91ZFBhdGgpIHx8ICghZmlsZVBhdGggJiYgIWZpbGVDb250ZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY29kZTogRVJST1JTLklOVkFMSURfUEFSQU1TLFxuICAgICAgICBtc2c6IGBbJHtDT01QT05FTlRfTkFNRX0udXBsb2FkRmlsZV0gaW52YWxpZCBwYXJhbXNgLFxuICAgICAgfSksKVxuICAgIH1cbiAgICBjb25zdCB1cGxvYWRNZXRob2QgPSAgICAgIHsgcHV0OiBFVXBsb2FkTWV0aG9kLnB1dCwgcG9zdDogRVVwbG9hZE1ldGhvZC5wb3N0IH1bbWV0aG9kLnRvTG9jYWxlTG93ZXJDYXNlKCldIHx8IEVVcGxvYWRNZXRob2QucHV0XG5cbiAgICAvLyDosIPnlKggZ2V0VXBsb2FkTWV0YWRhdGEg6I635Y+W5LiK5Lyg5YWD5pWw5o2uXG4gICAgY29uc3QgbWV0YWRhdGFSZXN1bHQgPSBhd2FpdCB0aGlzLmdldFVwbG9hZE1ldGFkYXRhKHtcbiAgICAgIGNsb3VkUGF0aCxcbiAgICAgIG1ldGhvZDogdXBsb2FkTWV0aG9kLFxuICAgICAgaGVhZGVyczogdXBsb2FkTWV0aG9kID09PSBFVXBsb2FkTWV0aG9kLnB1dCA/IGhlYWRlcnMgOiB1bmRlZmluZWQsXG4gICAgICBjdXN0b21SZXFPcHRzOiBwYXJhbXMuY3VzdG9tUmVxT3B0cyxcbiAgICB9KVxuXG4gICAgY29uc3QgeyBkYXRhOiBtZXRhZGF0YSwgcmVxdWVzdElkIH0gPSBtZXRhZGF0YVJlc3VsdFxuICAgIGNvbnN0IHsgdXJsLCBhdXRob3JpemF0aW9uLCB0b2tlbiwgZmlsZUlkLCBjb3NGaWxlSWQsIGRvd25sb2FkX3VybDogZG93bmxvYWRVcmwgfSA9IG1ldGFkYXRhXG5cbiAgICBjb25zdCBjb21tb25QYXJhbXMgPSB7XG4gICAgICB1cmwsXG4gICAgICBmaWxlOiBmaWxlUGF0aCxcbiAgICAgIG5hbWU6IGNsb3VkUGF0aCxcbiAgICAgIG9uVXBsb2FkUHJvZ3Jlc3MsXG4gICAgICBmaWxlQ29udGVudCxcbiAgICAgIGZpbGVJZCxcbiAgICAgIHJlcXVlc3RJZCxcbiAgICB9XG5cbiAgICBjb25zdCBwdXRQYXJhbXMgPSB7XG4gICAgICAuLi5jb21tb25QYXJhbXMsXG4gICAgICBtZXRob2Q6IEVVcGxvYWRNZXRob2QucHV0LFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgICBhdXRob3JpemF0aW9uLFxuICAgICAgICAneC1jb3MtbWV0YS1maWxlaWQnOiBjb3NGaWxlSWQsXG4gICAgICAgICd4LWNvcy1zZWN1cml0eS10b2tlbic6IHRva2VuLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCBwb3N0UGFyYW1zID0ge1xuICAgICAgLi4uY29tbW9uUGFyYW1zLFxuICAgICAgbWV0aG9kOiBFVXBsb2FkTWV0aG9kLnBvc3QsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGtleTogY2xvdWRQYXRoLFxuICAgICAgICBzaWduYXR1cmU6IGF1dGhvcml6YXRpb24sXG4gICAgICAgICd4LWNvcy1tZXRhLWZpbGVpZCc6IGNvc0ZpbGVJZCxcbiAgICAgICAgc3VjY2Vzc19hY3Rpb25fc3RhdHVzOiAnMjAxJyxcbiAgICAgICAgJ3gtY29zLXNlY3VyaXR5LXRva2VuJzogdG9rZW4sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHVwbG9hZENvbmZpZyA9IHtcbiAgICAgIFtFVXBsb2FkTWV0aG9kLnB1dF06IHtcbiAgICAgICAgcGFyYW1zOiBwdXRQYXJhbXMsXG4gICAgICAgIGlzU3VjY2VzczogKGNvZGU6IG51bWJlcikgPT4gY29kZSA+PSAyMDAgJiYgY29kZSA8IDMwMCxcbiAgICAgIH0sXG4gICAgICBbRVVwbG9hZE1ldGhvZC5wb3N0XToge1xuICAgICAgICBwYXJhbXM6IHBvc3RQYXJhbXMsXG4gICAgICAgIGlzU3VjY2VzczogKGNvZGU6IG51bWJlcikgPT4gY29kZSA9PT0gMjAxLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5yZXF1ZXN0LnVwbG9hZCh1cGxvYWRDb25maWdbdXBsb2FkTWV0aG9kXS5wYXJhbXMpXG5cbiAgICBpZiAodXBsb2FkQ29uZmlnW3VwbG9hZE1ldGhvZF0uaXNTdWNjZXNzKHJlcy5zdGF0dXNDb2RlKSkge1xuICAgICAgcmV0dXJuIGV4ZWNDYWxsYmFjayhjYWxsYmFjaywgbnVsbCwge1xuICAgICAgICBmaWxlSUQ6IGZpbGVJZCxcbiAgICAgICAgZG93bmxvYWRfdXJsOiBkb3dubG9hZFVybCxcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGV4ZWNDYWxsYmFjayhcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgbmV3IEVycm9yKGBbJHtnZXRTZGtOYW1lKCl9XVske0VSUk9SUy5PUEVSQVRJT05fRkFJTH1dWyR7Q09NUE9ORU5UX05BTUV9XToke3Jlcy5kYXRhfWApLFxuICAgIClcbiAgfVxuICBAY2F0Y2hFcnJvcnNEZWNvcmF0b3Ioe1xuICAgIGN1c3RvbUluZm86IHtcbiAgICAgIGNsYXNzTmFtZTogJ0Nsb3VkYmFzZScsXG4gICAgICBtZXRob2ROYW1lOiAnZ2V0VXBsb2FkTWV0YWRhdGEnLFxuICAgIH0sXG4gICAgdGl0bGU6ICfojrflj5bkuIrkvKDlhYPkv6Hmga/lpLHotKUnLFxuICAgIG1lc3NhZ2VzOiBbXG4gICAgICAn6K+356Gu6K6k5Lul5LiL5ZCE6aG577yaJyxcbiAgICAgICcgIDEgLSDosIPnlKggZ2V0VXBsb2FkTWV0YWRhdGEoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOW9k+WJjeWfn+WQjeaYr+WQpuWcqOWuieWFqOWfn+WQjeWIl+ihqOS4re+8mmh0dHBzOi8vY29uc29sZS5jbG91ZC50ZW5jZW50LmNvbS90Y2IvZW52L3NhZmV0eScsXG4gICAgICAnICAzIC0g5LqR5a2Y5YKo5a6J5YWo6KeE5YiZ5piv5ZCm6ZmQ5Yi25LqG5b2T5YmN55m75b2V54q25oCB6K6/6ZeuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBnZXRVcGxvYWRNZXRhZGF0YShcbiAgICBwYXJhbXM6IElDbG91ZGJhc2VHZXRVcGxvYWRNZXRhZGF0YVBhcmFtcyAmIHtcbiAgICAgIG1ldGhvZD86IEVVcGxvYWRNZXRob2RcbiAgICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgfSxcbiAgICBjYWxsYmFjaz86IEZ1bmN0aW9uLFxuICApOiBQcm9taXNlPHsgZGF0YTogSVVwbG9hZE1ldGFkYXRhOyByZXF1ZXN0SWQ6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgeyBjbG91ZFBhdGgsIG1ldGhvZCwgaGVhZGVycyB9ID0gcGFyYW1zXG4gICAgaWYgKCFpc1N0cmluZyhjbG91ZFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjb2RlOiBFUlJPUlMuSU5WQUxJRF9QQVJBTVMsXG4gICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS5nZXRVcGxvYWRNZXRhZGF0YV0gaW52YWxpZCBjbG91ZFBhdGhgLFxuICAgICAgfSksKVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgeyByZXF1ZXN0IH0gPSB0aGlzXG4gICAgY29uc3QgYWN0aW9uID0gJ3N0b3JhZ2UuZ2V0VXBsb2FkTWV0YWRhdGEnXG5cbiAgICB0cnkge1xuICAgICAgbGV0IG1ldGFEYXRhOiBJQ2xvdWRiYXNlRmlsZU1ldGFEYXRhUmVzXG5cbiAgICAgIGNvbnN0IG1ldGFEYXRhUGFyYW06IHtcbiAgICAgICAgcGF0aDogc3RyaW5nXG4gICAgICAgIG1ldGhvZD86IEVVcGxvYWRNZXRob2RcbiAgICAgICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICAgIH0gPSB7IHBhdGg6IGNsb3VkUGF0aCB9XG5cbiAgICAgIGlmIChtZXRob2QpIHtcbiAgICAgICAgbWV0YURhdGFQYXJhbS5tZXRob2QgPSBtZXRob2RcbiAgICAgIH1cbiAgICAgIGlmIChtZXRob2QgPT09IEVVcGxvYWRNZXRob2QucHV0ICYmIGhlYWRlcnMpIHtcbiAgICAgICAgbWV0YURhdGFQYXJhbS5oZWFkZXJzID0gaGVhZGVyc1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc0dhdGVXYXkoKSkge1xuICAgICAgICBtZXRhRGF0YSA9IGF3YWl0IHN0b3JhZ2VHYXRlV2F5LmdldFVwbG9hZEluZm8ocmVxdWVzdCwgbWV0YURhdGFQYXJhbSwgcGFyYW1zLmN1c3RvbVJlcU9wdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRhRGF0YSA9IGF3YWl0IHJlcXVlc3Quc2VuZChhY3Rpb24sIG1ldGFEYXRhUGFyYW0sIHBhcmFtcy5jdXN0b21SZXFPcHRzKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGV4ZWNDYWxsYmFjayhjYWxsYmFjaywgbnVsbCwgbWV0YURhdGEpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gZXhlY0NhbGxiYWNrKGNhbGxiYWNrLCBlcnIpXG4gICAgfVxuICB9XG4gIEBjYXRjaEVycm9yc0RlY29yYXRvcih7XG4gICAgY3VzdG9tSW5mbzoge1xuICAgICAgY2xhc3NOYW1lOiAnQ2xvdWRiYXNlJyxcbiAgICAgIG1ldGhvZE5hbWU6ICdkZWxldGVGaWxlJyxcbiAgICB9LFxuICAgIHRpdGxlOiAn5Yig6Zmk5paH5Lu25aSx6LSlJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGRlbGV0ZUZpbGUoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOW9k+WJjeWfn+WQjeaYr+WQpuWcqOWuieWFqOWfn+WQjeWIl+ihqOS4re+8mmh0dHBzOi8vY29uc29sZS5jbG91ZC50ZW5jZW50LmNvbS90Y2IvZW52L3NhZmV0eScsXG4gICAgICAnICAzIC0g5LqR5a2Y5YKo5a6J5YWo6KeE5YiZ5piv5ZCm6ZmQ5Yi25LqG5b2T5YmN55m75b2V54q25oCB6K6/6ZeuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBkZWxldGVGaWxlKFxuICAgIHBhcmFtczogSUNsb3VkYmFzZURlbGV0ZUZpbGVQYXJhbXMsXG4gICAgY2FsbGJhY2s/OiBGdW5jdGlvbixcbiAgKTogUHJvbWlzZTxJQ2xvdWRiYXNlRGVsZXRlRmlsZVJlc3VsdD4ge1xuICAgIGNvbnN0IHsgZmlsZUxpc3QgfSA9IHBhcmFtc1xuXG4gICAgaWYgKCFmaWxlTGlzdCB8fCAhaXNBcnJheShmaWxlTGlzdCkgfHwgZmlsZUxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjb2RlOiBFUlJPUlMuSU5WQUxJRF9QQVJBTVMsXG4gICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS5kZWxldGVGaWxlXSBmaWxlTGlzdCBtdXN0IG5vdCBiZSBlbXB0eWAsXG4gICAgICB9KSwpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWxlSWQgb2YgZmlsZUxpc3QpIHtcbiAgICAgIGlmICghZmlsZUlkIHx8ICFpc1N0cmluZyhmaWxlSWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY29kZTogRVJST1JTLklOVkFMSURfUEFSQU1TLFxuICAgICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS5kZWxldGVGaWxlXSBmaWxlSUQgbXVzdCBiZSBzdHJpbmdgLFxuICAgICAgICB9KSwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uID0gJ3N0b3JhZ2UuYmF0Y2hEZWxldGVGaWxlJ1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7IHJlcXVlc3QgfSA9IHRoaXNcbiAgICBsZXQgcmVzOiBhbnkgPSB7fVxuXG4gICAgaWYgKHRoaXMuaXNHYXRlV2F5KCkpIHtcbiAgICAgIHJlcyA9IGF3YWl0IHN0b3JhZ2VHYXRlV2F5LmRlbGV0ZShyZXF1ZXN0LCB7IGZpbGVMaXN0IH0sIHBhcmFtcy5jdXN0b21SZXFPcHRzKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSBhd2FpdCByZXF1ZXN0LnNlbmQoXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAge1xuICAgICAgICAgIGZpbGVpZF9saXN0OiBmaWxlTGlzdCxcbiAgICAgICAgfSxcbiAgICAgICAgcGFyYW1zLmN1c3RvbVJlcU9wdHMsXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKHJlcy5jb2RlKSB7XG4gICAgICByZXR1cm4gZXhlY0NhbGxiYWNrKGNhbGxiYWNrLCBudWxsLCByZXMpXG4gICAgfVxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBmaWxlTGlzdDogcmVzLmRhdGEuZGVsZXRlX2xpc3QsXG4gICAgICByZXF1ZXN0SWQ6IHJlcy5yZXF1ZXN0SWQsXG4gICAgfVxuICAgIHJldHVybiBleGVjQ2FsbGJhY2soY2FsbGJhY2ssIG51bGwsIGRhdGEpXG4gIH1cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICBjdXN0b21JbmZvOiB7XG4gICAgICBjbGFzc05hbWU6ICdDbG91ZGJhc2UnLFxuICAgICAgbWV0aG9kTmFtZTogJ2dldFRlbXBGaWxlVVJMJyxcbiAgICB9LFxuICAgIHRpdGxlOiAn6I635Y+W5paH5Lu25LiL6L296ZO+5o6lJyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGdldFRlbXBGaWxlVVJMKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3ln5/lkI3mmK/lkKblnKjlronlhajln5/lkI3liJfooajkuK3vvJpodHRwczovL2NvbnNvbGUuY2xvdWQudGVuY2VudC5jb20vdGNiL2Vudi9zYWZldHknLFxuICAgICAgJyAgMyAtIOS6keWtmOWCqOWuieWFqOinhOWImeaYr+WQpumZkOWItuS6huW9k+WJjeeZu+W9leeKtuaAgeiuv+mXricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgZ2V0VGVtcEZpbGVVUkwoXG4gICAgcGFyYW1zOiBJQ2xvdWRiYXNlR2V0VGVtcEZpbGVVUkxQYXJhbXMsXG4gICAgY2FsbGJhY2s/OiBGdW5jdGlvbixcbiAgKTogUHJvbWlzZTxJQ2xvdWRiYXNlR2V0VGVtcEZpbGVVUkxSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGZpbGVMaXN0IH0gPSBwYXJhbXNcblxuICAgIGlmICghZmlsZUxpc3QgfHwgIWlzQXJyYXkoZmlsZUxpc3QpIHx8IGZpbGVMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY29kZTogRVJST1JTLklOVkFMSURfUEFSQU1TLFxuICAgICAgICBtc2c6IGBbJHtDT01QT05FTlRfTkFNRX0uZ2V0VGVtcEZpbGVVUkxdIGZpbGVMaXN0IG11c3Qgbm90IGJlIGVtcHR5YCxcbiAgICAgIH0pLClcbiAgICB9XG5cbiAgICBjb25zdCBjb252ZXJ0ZWRGaWxlTGlzdCA9IFtdXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVMaXN0KSB7XG4gICAgICBpZiAoaXNQYWxpbk9iamVjdChmaWxlKSkge1xuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWxlLCAnZmlsZUlEJykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgY29kZTogRVJST1JTLklOVkFMSURfUEFSQU1TLFxuICAgICAgICAgICAgbXNnOiBgWyR7Q09NUE9ORU5UX05BTUV9LmdldFRlbXBGaWxlVVJMXSBmaWxlIGluZm8gbXVzdCBpbmNsdWRlIGZpbGVJRGAsXG4gICAgICAgICAgfSksKVxuICAgICAgICB9XG5cbiAgICAgICAgY29udmVydGVkRmlsZUxpc3QucHVzaCh7XG4gICAgICAgICAgZmlsZWlkOiAoZmlsZSBhcyBJQ2xvdWRiYXNlRmlsZUluZm8pLmZpbGVJRCxcbiAgICAgICAgICBtYXhfYWdlOiAoZmlsZSBhcyBJQ2xvdWRiYXNlRmlsZUluZm8pLm1heEFnZSB8fCA3MjAwLFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChpc1N0cmluZyhmaWxlKSkge1xuICAgICAgICBjb252ZXJ0ZWRGaWxlTGlzdC5wdXNoKHtcbiAgICAgICAgICBmaWxlaWQ6IGZpbGUsXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGNvZGU6IEVSUk9SUy5JTlZBTElEX1BBUkFNUyxcbiAgICAgICAgICBtc2c6IGBbJHtDT01QT05FTlRfTkFNRX0uZ2V0VGVtcEZpbGVVUkxdIGludmFsaWQgZmlsZUxpc3RgLFxuICAgICAgICB9KSwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uID0gJ3N0b3JhZ2UuYmF0Y2hHZXREb3dubG9hZFVybCdcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgeyByZXF1ZXN0IH0gPSB0aGlzXG4gICAgbGV0IHJlczogYW55ID0ge31cblxuICAgIGlmICh0aGlzLmlzR2F0ZVdheSgpKSB7XG4gICAgICByZXMgPSBhd2FpdCBzdG9yYWdlR2F0ZVdheS5nZXREb3duTG9hZEluZm8ocmVxdWVzdCwgeyBjb252ZXJ0ZWRGaWxlTGlzdCB9LCBwYXJhbXMuY3VzdG9tUmVxT3B0cylcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0gYXdhaXQgcmVxdWVzdC5zZW5kKGFjdGlvbiwgeyBmaWxlX2xpc3Q6IGNvbnZlcnRlZEZpbGVMaXN0IH0sIHBhcmFtcy5jdXN0b21SZXFPcHRzKVxuICAgIH1cblxuICAgIGlmIChyZXMuY29kZSkge1xuICAgICAgcmV0dXJuIGV4ZWNDYWxsYmFjayhjYWxsYmFjaywgbnVsbCwgcmVzKVxuICAgIH1cblxuICAgIHJldHVybiBleGVjQ2FsbGJhY2soY2FsbGJhY2ssIG51bGwsIHtcbiAgICAgIGZpbGVMaXN0OiByZXMuZGF0YS5kb3dubG9hZF9saXN0LFxuICAgICAgcmVxdWVzdElkOiByZXMucmVxdWVzdElkLFxuICAgIH0pXG4gIH1cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICBjdXN0b21JbmZvOiB7XG4gICAgICBjbGFzc05hbWU6ICdDbG91ZGJhc2UnLFxuICAgICAgbWV0aG9kTmFtZTogJ2Rvd25sb2FkRmlsZScsXG4gICAgfSxcbiAgICB0aXRsZTogJ+S4i+i9veaWh+S7tuWksei0pScsXG4gICAgbWVzc2FnZXM6IFtcbiAgICAgICfor7fnoa7orqTku6XkuIvlkITpobnvvJonLFxuICAgICAgJyAgMSAtIOiwg+eUqCBkb3dubG9hZEZpbGUoKSDnmoTor63ms5XmiJblj4LmlbDmmK/lkKbmraPnoa4nLFxuICAgICAgJyAgMiAtIOW9k+WJjeWfn+WQjeaYr+WQpuWcqOWuieWFqOWfn+WQjeWIl+ihqOS4re+8mmh0dHBzOi8vY29uc29sZS5jbG91ZC50ZW5jZW50LmNvbS90Y2IvZW52L3NhZmV0eScsXG4gICAgICAnICAzIC0g5LqR5a2Y5YKo5a6J5YWo6KeE5YiZ5piv5ZCm6ZmQ5Yi25LqG5b2T5YmN55m75b2V54q25oCB6K6/6ZeuJyxcbiAgICAgIGDlpoLmnpzpl67popjkvp3nhLblrZjlnKjvvIzlu7rorq7liLDlrpjmlrnpl67nrZTnpL7ljLrmj5Dpl67miJblr7vmib7luK7liqnvvJoke0NPTU1VTklUWV9TSVRFX1VSTH1gLFxuICAgIF0sXG4gIH0pXG4gIHB1YmxpYyBhc3luYyBkb3dubG9hZEZpbGUoXG4gICAgcGFyYW1zOiBJQ2xvdWRiYXNlRG93bmxvYWRGaWxlUGFyYW1zLFxuICAgIGNhbGxiYWNrPzogRnVuY3Rpb24sXG4gICk6IFByb21pc2U8SUNsb3VkYmFzZURvd25sb2FkRmlsZVJlc3VsdD4ge1xuICAgIGNvbnN0IHsgZmlsZUlEIH0gPSBwYXJhbXNcbiAgICBpZiAoIWlzU3RyaW5nKGZpbGVJRCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGNvZGU6IEVSUk9SUy5JTlZBTElEX1BBUkFNUyxcbiAgICAgICAgbXNnOiBgWyR7Q09NUE9ORU5UX05BTUV9LmdldFRlbXBGaWxlVVJMXSBmaWxlSUQgbXVzdCBiZSBzdHJpbmdgLFxuICAgICAgfSksKVxuICAgIH1cblxuICAgIGNvbnN0IHRtcFVybFJlcyA9IGF3YWl0IHRoaXMuZ2V0VGVtcEZpbGVVUkwuY2FsbCh0aGlzLCB7XG4gICAgICBmaWxlTGlzdDogW1xuICAgICAgICB7XG4gICAgICAgICAgZmlsZUlELFxuICAgICAgICAgIG1heEFnZTogNjAwLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGN1c3RvbVJlcU9wdHM6IHBhcmFtcy5jdXN0b21SZXFPcHRzLFxuICAgIH0pXG5cbiAgICBjb25zdCByZXMgPSB0bXBVcmxSZXMuZmlsZUxpc3RbMF1cblxuICAgIGlmIChyZXMuY29kZSAhPT0gJ1NVQ0NFU1MnKSB7XG4gICAgICByZXR1cm4gZXhlY0NhbGxiYWNrKGNhbGxiYWNrLCByZXMpXG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7IHJlcXVlc3QgfSA9IHRoaXNcblxuICAgIGNvbnN0IHRtcFVybCA9IGVuY29kZVVSSShyZXMuZG93bmxvYWRfdXJsKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxdWVzdC5kb3dubG9hZCh7IHVybDogdG1wVXJsLCB0ZW1wRmlsZVBhdGg6IHBhcmFtcy50ZW1wRmlsZVBhdGggfSlcbiAgICByZXR1cm4gZXhlY0NhbGxiYWNrKGNhbGxiYWNrLCBudWxsLCByZXN1bHQpXG4gIH1cbiAgQGNhdGNoRXJyb3JzRGVjb3JhdG9yKHtcbiAgICBjdXN0b21JbmZvOiB7XG4gICAgICBjbGFzc05hbWU6ICdDbG91ZGJhc2UnLFxuICAgICAgbWV0aG9kTmFtZTogJ2NvcHlGaWxlJyxcbiAgICB9LFxuICAgIHRpdGxlOiAn5om56YeP5aSN5Yi25paH5Lu2JyxcbiAgICBtZXNzYWdlczogW1xuICAgICAgJ+ivt+ehruiupOS7peS4i+WQhOmhue+8micsXG4gICAgICAnICAxIC0g6LCD55SoIGNvcHlGaWxlKCkg55qE6K+t5rOV5oiW5Y+C5pWw5piv5ZCm5q2j56GuJyxcbiAgICAgICcgIDIgLSDlvZPliY3ln5/lkI3mmK/lkKblnKjlronlhajln5/lkI3liJfooajkuK3vvJpodHRwczovL2NvbnNvbGUuY2xvdWQudGVuY2VudC5jb20vdGNiL2Vudi9zYWZldHknLFxuICAgICAgJyAgMyAtIOS6keWtmOWCqOWuieWFqOinhOWImeaYr+WQpumZkOWItuS6huW9k+WJjeeZu+W9leeKtuaAgeiuv+mXricsXG4gICAgICBg5aaC5p6c6Zeu6aKY5L6d54S25a2Y5Zyo77yM5bu66K6u5Yiw5a6Y5pa56Zeu562U56S+5Yy65o+Q6Zeu5oiW5a+75om+5biu5Yqp77yaJHtDT01NVU5JVFlfU0lURV9VUkx9YCxcbiAgICBdLFxuICB9KVxuICBwdWJsaWMgYXN5bmMgY29weUZpbGUocGFyYW1zOiBJQ2xvdWRiYXNlQ29weUZpbGVQYXJhbXMsIGNhbGxiYWNrPzogRnVuY3Rpb24pOiBQcm9taXNlPElDbG91ZGJhc2VDb3B5RmlsZVJlc3VsdD4ge1xuICAgIGNvbnN0IHsgZmlsZUxpc3QgfSA9IHBhcmFtc1xuXG4gICAgaWYgKCFmaWxlTGlzdCB8fCAhaXNBcnJheShmaWxlTGlzdCkgfHwgZmlsZUxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBjb2RlOiBFUlJPUlMuSU5WQUxJRF9QQVJBTVMsXG4gICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS5jb3B5RmlsZV0gZmlsZUxpc3QgbXVzdCBub3QgYmUgZW1wdHlgLFxuICAgICAgfSksKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnZlcnRlZEZpbGVMaXN0ID0gW11cblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlTGlzdCkge1xuICAgICAgY29uc3QgeyBzcmNQYXRoLCBkc3RQYXRoIH0gPSBmaWxlXG4gICAgICBpZiAoIXNyY1BhdGggfHwgIWRzdFBhdGggfHwgdHlwZW9mIHNyY1BhdGggIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBkc3RQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGNvZGU6IEVSUk9SUy5JTlZBTElEX1BBUkFNUyxcbiAgICAgICAgICBtc2c6IGBbJHtDT01QT05FTlRfTkFNRX0uY29weUZpbGVdIHNyY1BhdGggYW5kIGRzdFBhdGggbWF5IG5vdCBiZSBlbXB0eWAsXG4gICAgICAgIH0pLClcbiAgICAgIH1cbiAgICAgIGlmIChzcmNQYXRoID09PSBkc3RQYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY29kZTogRVJST1JTLklOVkFMSURfUEFSQU1TLFxuICAgICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS5jb3B5RmlsZV0gc3JjUGF0aCBhbmQgZHN0UGF0aCBjYW4gbm90IGJlIHRoZSBzYW1lYCxcbiAgICAgICAgfSksKVxuICAgICAgfVxuICAgICAgLy8gICBpZiAoYmFzZW5hbWUoc3JjUGF0aCkgIT09IGJhc2VuYW1lKGRzdFBhdGgpKSB7XG4gICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIC8vICAgICAgIGNvZGU6IEVSUk9SUy5JTlZBTElEX1BBUkFNUyxcbiAgICAgIC8vICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS5jb3B5RmlsZV0gc3JjUGF0aCBhbmQgZHN0UGF0aCBmaWxlIG5hbWUgbXVzdCBiZSB0aGUgc2FtZWAsXG4gICAgICAvLyAgICAgfSksKVxuICAgICAgLy8gICB9XG4gICAgICBjb252ZXJ0ZWRGaWxlTGlzdC5wdXNoKHtcbiAgICAgICAgc3JjX3BhdGg6IHNyY1BhdGgsXG4gICAgICAgIGRzdF9wYXRoOiBkc3RQYXRoLFxuICAgICAgICBvdmVyd3JpdGU6IGZpbGUub3ZlcndyaXRlLFxuICAgICAgICByZW1vdmVfb3JpZ2luYWw6IGZpbGUucmVtb3ZlT3JpZ2luYWwsXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCB7IHJlcXVlc3QgfSA9IHRoaXNcbiAgICBsZXQgcmVzOiBhbnkgPSB7fVxuXG4gICAgaWYgKHRoaXMuaXNHYXRlV2F5KCkpIHtcbiAgICAgIHJlcyA9IGF3YWl0IHN0b3JhZ2VHYXRlV2F5LmNvcHlGaWxlKHJlcXVlc3QsIHsgY29udmVydGVkRmlsZUxpc3QgfSwgcGFyYW1zLmN1c3RvbVJlcU9wdHMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9ICdzdG9yYWdlLmJhdGNoQ29weUZpbGUnXG4gICAgICByZXMgPSBhd2FpdCByZXF1ZXN0LnNlbmQoYWN0aW9uLCB7IGZpbGVfbGlzdDogY29udmVydGVkRmlsZUxpc3QgfSwgcGFyYW1zLmN1c3RvbVJlcU9wdHMpXG4gICAgfVxuXG4gICAgaWYgKHJlcy5jb2RlKSB7XG4gICAgICByZXR1cm4gZXhlY0NhbGxiYWNrKGNhbGxiYWNrLCBudWxsLCByZXMpXG4gICAgfVxuXG4gICAgcmV0dXJuIGV4ZWNDYWxsYmFjayhjYWxsYmFjaywgbnVsbCwge1xuICAgICAgZmlsZUxpc3Q6IHJlcy5kYXRhLmNvcHlfbGlzdCxcbiAgICAgIHJlcXVlc3RJZDogcmVzLnJlcXVlc3RJZCxcbiAgICB9KVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEZpbGVJbmZvKHBhcmFtczogSUNsb3VkYmFzZUdldFRlbXBGaWxlVVJMUGFyYW1zKTogUHJvbWlzZTx7XG4gICAgZmlsZUxpc3Q6IChQaWNrPElDbG91ZGJhc2VHZXRUZW1wRmlsZVVSTFJlc3VsdFsnZmlsZUxpc3QnXVswXSwgJ2NvZGUnIHwgJ2ZpbGVJRCcgfCAndGVtcEZpbGVVUkwnIHwgJ21lc3NhZ2UnPiAmIHtcbiAgICAgIGZpbGVOYW1lPzogc3RyaW5nXG4gICAgICBjbG91ZElkPzogSUNsb3VkYmFzZUdldFRlbXBGaWxlVVJMUmVzdWx0WydmaWxlTGlzdCddWzBdWydmaWxlSUQnXVxuICAgICAgY29udGVudFR5cGU/OiBzdHJpbmdcbiAgICAgIG1pbWU/OiBzdHJpbmdcbiAgICAgIHNpemU/OiBudW1iZXJcbiAgICAgIGNhY2hlQ29udHJvbD86IHN0cmluZ1xuICAgICAgbGFzdE1vZGlmaWVkPzogc3RyaW5nXG4gICAgICBldGFnPzogc3RyaW5nXG4gICAgfSlbXVxuICAgIHJlcXVlc3RJZDogc3RyaW5nXG4gIH0+IHtcbiAgICBjb25zdCBmaWxlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0VGVtcEZpbGVVUkwocGFyYW1zKVxuXG4gICAgaWYgKGZpbGVJbmZvPy5maWxlTGlzdCAmJiBmaWxlSW5mbz8uZmlsZUxpc3Q/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpbGVMaXN0ID0gYXdhaXQgUHJvbWlzZS5hbGwoZmlsZUluZm8uZmlsZUxpc3QubWFwKGFzeW5jIChpdGVtOiBJQ2xvdWRiYXNlR2V0VGVtcEZpbGVVUkxSZXN1bHRbJ2ZpbGVMaXN0J11bMF0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uY29kZSAhPT0gJ1NVQ0NFU1MnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IGl0ZW0uY29kZSxcbiAgICAgICAgICAgIGZpbGVJRDogaXRlbS5maWxlSUQsXG4gICAgICAgICAgICB0ZW1wRmlsZVVSTDogaXRlbS50ZW1wRmlsZVVSTCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGl0ZW0ubWVzc2FnZSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjb25zdCB7IHJlcXVlc3QgfSA9IHRoaXNcbiAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCByZXF1ZXN0LmZldGNoKHsgdXJsOiBpdGVtLnRlbXBGaWxlVVJMLCBtZXRob2Q6ICdIRUFEJyB9KVxuICAgICAgICAgIGxldCB7IGhlYWRlciB9ID0gcmVzXG5cbiAgICAgICAgICBpZiAoSGVhZGVycyAmJiBoZWFkZXIgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgICAgICAgICBoZWFkZXIgPSBPYmplY3QuZnJvbUVudHJpZXMocmVzLmhlYWRlci5lbnRyaWVzKCkpXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByYWRpeFxuICAgICAgICAgIGNvbnN0IGZpbGVTaXplID0gcGFyc2VJbnQoaGVhZGVyWydjb250ZW50LWxlbmd0aCddKSB8fCAwXG4gICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBoZWFkZXJbJ2NvbnRlbnQtdHlwZSddIHx8ICcnXG5cbiAgICAgICAgICBpZiAoWzQwMCwgNDA0XS5pbmNsdWRlcyhOdW1iZXIocmVzLnN0YXR1c0NvZGUpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29kZTogJ0ZJTEVfTk9UX0ZPVU5EJyxcbiAgICAgICAgICAgICAgZmlsZUlEOiBpdGVtLmZpbGVJRCxcbiAgICAgICAgICAgICAgdGVtcEZpbGVVUkw6IGl0ZW0udGVtcEZpbGVVUkwsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdmaWxlIG5vdCBmb3VuZCcsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZmlsZUluZm8gPSB7XG4gICAgICAgICAgICBjb2RlOiBpdGVtLmNvZGUsXG4gICAgICAgICAgICBmaWxlSUQ6IGl0ZW0uZmlsZUlELFxuICAgICAgICAgICAgdGVtcEZpbGVVUkw6IGl0ZW0udGVtcEZpbGVVUkwsXG4gICAgICAgICAgICBjbG91ZElkOiBpdGVtLmZpbGVJRCxcbiAgICAgICAgICAgIGZpbGVOYW1lOiBpdGVtLmZpbGVJRC5zcGxpdCgnLycpLnBvcCgpLFxuICAgICAgICAgICAgY29udGVudFR5cGUsXG4gICAgICAgICAgICBtaW1lOiBjb250ZW50VHlwZS5zcGxpdCgnOycpWzBdLnRyaW0oKSxcbiAgICAgICAgICAgIHNpemU6IGZpbGVTaXplLFxuICAgICAgICAgICAgZXRhZzogaGVhZGVyLmV0YWcgfHwgJycsXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IGhlYWRlclsnbGFzdC1tb2RpZmllZCddIHx8ICcnLFxuICAgICAgICAgICAgY2FjaGVDb250cm9sOiBoZWFkZXJbJ2NhY2hlLWNvbnRyb2wnXSB8fCAnJyxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmlsZUluZm9cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiAnRkVUQ0hfRklMRV9JTkZPX0VSUk9SJyxcbiAgICAgICAgICAgIGZpbGVJRDogaXRlbS5maWxlSUQsXG4gICAgICAgICAgICB0ZW1wRmlsZVVSTDogaXRlbS50ZW1wRmlsZVVSTCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLClcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZUxpc3QsXG4gICAgICAgIHJlcXVlc3RJZDogZmlsZUluZm8ucmVxdWVzdElkLFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBmaWxlTGlzdDogW10sXG4gICAgICByZXF1ZXN0SWQ6IGZpbGVJbmZvLnJlcXVlc3RJZCxcbiAgICB9XG4gIH1cbn1cblxuXG5kZWNsYXJlIGNvbnN0IGNsb3VkYmFzZTogSUNsb3VkYmFzZVxuXG5jb25zdCBzdG9yYWdlID0gbmV3IENsb3VkYmFzZVN0b3JhZ2UoKVxuY29uc3QgY29tcG9uZW50OiBJQ2xvdWRiYXNlQ29tcG9uZW50ID0ge1xuICBuYW1lOiBDT01QT05FTlRfTkFNRSxcbiAgZW50aXR5OiB7XG4gICAgdXBsb2FkRmlsZTogc3RvcmFnZS51cGxvYWRGaWxlLFxuICAgIGRlbGV0ZUZpbGU6IHN0b3JhZ2UuZGVsZXRlRmlsZSxcbiAgICBnZXRUZW1wRmlsZVVSTDogc3RvcmFnZS5nZXRUZW1wRmlsZVVSTCxcbiAgICBkb3dubG9hZEZpbGU6IHN0b3JhZ2UuZG93bmxvYWRGaWxlLFxuICAgIGdldFVwbG9hZE1ldGFkYXRhOiBzdG9yYWdlLmdldFVwbG9hZE1ldGFkYXRhLFxuICAgIGNvcHlGaWxlOiBzdG9yYWdlLmNvcHlGaWxlLFxuICAgIGdldEZpbGVJbmZvOiBzdG9yYWdlLmdldEZpbGVJbmZvLFxuICAgIGlzR2F0ZVdheTogc3RvcmFnZS5pc0dhdGVXYXksXG4gIH0sXG59XG5cbmV4cG9ydCBjbGFzcyBTdXBhYmFzZUZpbGVBUElMaWtlU3RvcmFnZSBleHRlbmRzIENsb3VkYmFzZVN0b3JhZ2Uge1xuICBwcml2YXRlIHNob3VsZFRocm93T25FcnJvciA9IGZhbHNlXG4gIHByaXZhdGUgYnVja2V0SWQgPSAnJ1xuICBwcml2YXRlIGNvbnRleHQ6IElDbG91ZGJhc2VDb250ZXh0XG5cbiAgY29uc3RydWN0b3IoY29udGV4dD86IElDbG91ZGJhc2VDb250ZXh0KSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRcbiAgfVxuXG4gIGdldCBjb25maWcoKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiB0aGlzLmNvbnRleHQ/LmNvbmZpZ1xuICB9XG5cbiAgZ2V0IHJlcXVlc3QoKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiB0aGlzLmNvbnRleHQ/LnJlcXVlc3RcbiAgfVxuXG4gIHRocm93T25FcnJvcigpOiB0aGlzIHtcbiAgICB0aGlzLnNob3VsZFRocm93T25FcnJvciA9IHRydWVcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgZnJvbShidWNrZXQ/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmJ1Y2tldElkID0gYnVja2V0IHx8ICcnXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGFzeW5jIHVwbG9hZChcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgZmlsZUJvZHk6IEZpbGVCb2R5LFxuICAgIGZpbGVPcHRpb25zPzogRmlsZU9wdGlvbnMsXG4gICk6IFByb21pc2U8XG4gICAgeyBkYXRhOiB7IGlkOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgZnVsbFBhdGg6IHN0cmluZyB9OyBlcnJvcjogbnVsbCB9IHwgeyBkYXRhOiBudWxsOyBlcnJvcjogU3RvcmFnZUVycm9yIH1cbiAgICA+IHtcbiAgICBjb25zdCBvcHRpb25zID0geyB1cHNlcnQ6IHRydWUsIC4uLmZpbGVPcHRpb25zIH1cbiAgICBjb25zdCB7IGNhY2hlQ29udHJvbCwgY29udGVudFR5cGUsIG1ldGFkYXRhIH0gPSBvcHRpb25zXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsb3VkUGF0aCA9IHRoaXMuX2dldENsb3VkUGF0aChwYXRoKVxuICAgICAgY29uc3QgdXBsb2FkRmlsZVBhcmFtczogUGFyYW1ldGVyczxDbG91ZGJhc2VTdG9yYWdlWyd1cGxvYWRGaWxlJ10+WzBdID0ge1xuICAgICAgICBjbG91ZFBhdGgsXG4gICAgICAgIGZpbGVQYXRoOiBmaWxlQm9keSBhcyBhbnksXG4gICAgICB9XG5cbiAgICAgIGlmIChjYWNoZUNvbnRyb2wgfHwgY29udGVudFR5cGUgfHwgbWV0YWRhdGEpIHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9XG4gICAgICAgIGlmIChjYWNoZUNvbnRyb2wpIHtcbiAgICAgICAgICBoZWFkZXJzWydjYWNoZS1jb250cm9sJ10gPSBjYWNoZUNvbnRyb2xcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udGVudFR5cGUpIHtcbiAgICAgICAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9IGNvbnRlbnRUeXBlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgICAgICBoZWFkZXJzWyd4LWNvcy1tZXRhZGF0YS1tZXRhZGF0YSddID0gdGhpcy50b0Jhc2U2NChKU09OLnN0cmluZ2lmeShtZXRhZGF0YSkpXG4gICAgICAgIH1cblxuICAgICAgICB1cGxvYWRGaWxlUGFyYW1zLmhlYWRlcnMgPSBoZWFkZXJzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudXBsb2FkRmlsZSh1cGxvYWRGaWxlUGFyYW1zKVxuXG4gICAgICAvLyBJVXBsb2FkRmlsZVJlcyDmsqHmnIkgY29kZSDlrZfmrrXvvIzlpoLmnpzmsqHmnIkgZmlsZUlEIOWImeihqOekuuWksei0pVxuICAgICAgaWYgKCFyZXN1bHQuZmlsZUlEKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY29kZTogRVJST1JTLk9QRVJBVElPTl9GQUlMLFxuICAgICAgICAgIG1zZzogYFske0NPTVBPTkVOVF9OQU1FfS51cGRhdGVdIG5vIGZpbGVJRCByZXR1cm5lZGAsXG4gICAgICAgIH0pLClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIGlkOiByZXN1bHQuZmlsZUlELFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgZnVsbFBhdGg6IHBhdGgsXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3JcbiAgICAgIGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwbG9hZFRvU2lnbmVkVXJsKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBfdG9rZW46IHN0cmluZyxcbiAgICBmaWxlQm9keTogRmlsZUJvZHksXG4gICAgZmlsZU9wdGlvbnM/OiBGaWxlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxcbiAgICB7IGRhdGE6IHsgaWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBmdWxsUGF0aDogc3RyaW5nIH07IGVycm9yOiBudWxsIH0gfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfVxuICAgID4ge1xuICAgIHJldHVybiB0aGlzLnVwbG9hZChwYXRoLCBmaWxlQm9keSwgZmlsZU9wdGlvbnMpXG4gIH1cblxuICBhc3luYyBjcmVhdGVTaWduZWRVcGxvYWRVcmwocGF0aDogc3RyaW5nKTogUHJvbWlzZTxcbiAgfCB7XG4gICAgZGF0YToge1xuICAgICAgc2lnbmVkVXJsOiBzdHJpbmdcbiAgICAgIHRva2VuOiBzdHJpbmdcbiAgICAgIHBhdGg6IHN0cmluZ1xuICAgICAgLy8gQ2xvdWRCYXNlIOmineWklueahOWFg+aVsOaNruWtl+autVxuICAgICAgYXV0aG9yaXphdGlvbj86IHN0cmluZ1xuICAgICAgaWQ/OiBzdHJpbmdcbiAgICAgIGNvc0ZpbGVJZD86IHN0cmluZ1xuICAgICAgZG93bmxvYWRVcmw/OiBzdHJpbmdcbiAgICB9XG4gICAgZXJyb3I6IG51bGxcbiAgfVxuICB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9XG4gID4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjbG91ZFBhdGggPSB0aGlzLl9nZXRDbG91ZFBhdGgocGF0aClcblxuICAgICAgY29uc3QgeyBkYXRhOiBtZXRhZGF0YSB9ID0gYXdhaXQgdGhpcy5nZXRVcGxvYWRNZXRhZGF0YSh7IGNsb3VkUGF0aCB9KVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgc2lnbmVkVXJsOiBtZXRhZGF0YS51cmwsXG4gICAgICAgICAgdG9rZW46IG1ldGFkYXRhLnRva2VuLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgLy8g6L+U5ZueIENsb3VkQmFzZSDnmoTpop3lpJblhYPmlbDmja7vvIzkvpsgdXBsb2FkVG9TaWduZWRVcmwg5L2/55SoXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogbWV0YWRhdGEuYXV0aG9yaXphdGlvbixcbiAgICAgICAgICBpZDogbWV0YWRhdGEuZmlsZUlkLFxuICAgICAgICAgIGNvc0ZpbGVJZDogbWV0YWRhdGEuY29zRmlsZUlkLFxuICAgICAgICAgIGRvd25sb2FkVXJsOiBtZXRhZGF0YS5kb3dubG9hZF91cmwsXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3JcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvciA/IGVycm9yIDogbmV3IFN0b3JhZ2VFcnJvcihlcnJvci5tZXNzYWdlKSxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGUoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGZpbGVCb2R5OiBGaWxlQm9keSxcbiAgICBmaWxlT3B0aW9ucz86IEZpbGVPcHRpb25zLFxuICApOiBQcm9taXNlPFxuICAgIHsgZGF0YTogeyBpZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGZ1bGxQYXRoOiBzdHJpbmcgfTsgZXJyb3I6IG51bGwgfSB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9XG4gICAgPiB7XG4gICAgcmV0dXJuIHRoaXMudXBsb2FkKHBhdGgsIGZpbGVCb2R5LCB7IC4uLmZpbGVPcHRpb25zLCB1cHNlcnQ6IHRydWUgfSlcbiAgfVxuXG4gIGFzeW5jIG1vdmUoXG4gICAgZnJvbVBhdGg6IHN0cmluZyxcbiAgICB0b1BhdGg6IHN0cmluZyxcbiAgICAvLyBvcHRpb25zPzogRGVzdGluYXRpb25PcHRpb25zLFxuICApOiBQcm9taXNlPHsgZGF0YTogeyBtZXNzYWdlOiBzdHJpbmcgfTsgZXJyb3I6IG51bGwgfSB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29weUZpbGUoe1xuICAgICAgICBmaWxlTGlzdDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNyY1BhdGg6IHRoaXMuX2dldENsb3VkUGF0aChmcm9tUGF0aCksXG4gICAgICAgICAgICBkc3RQYXRoOiB0aGlzLl9nZXRDbG91ZFBhdGgodG9QYXRoKSxcbiAgICAgICAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlbW92ZU9yaWdpbmFsOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KVxuXG4gICAgICBpZiAocmVzdWx0LmZpbGVMaXN0WzBdLmNvZGUgJiYgcmVzdWx0LmZpbGVMaXN0WzBdLmNvZGUgIT09ICdTVUNDRVNTJykge1xuICAgICAgICB0aHJvdyBuZXcgU3RvcmFnZUVycm9yKHJlc3VsdC5maWxlTGlzdFswXS5tZXNzYWdlIHx8ICdNb3ZlIGZhaWxlZCcpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHsgbWVzc2FnZTogYEZpbGUgbW92ZWQgZnJvbSAke2Zyb21QYXRofSB0byAke3RvUGF0aH1gIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3JcbiAgICAgIGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNvcHkoXG4gICAgZnJvbVBhdGg6IHN0cmluZyxcbiAgICB0b1BhdGg6IHN0cmluZyxcbiAgICAvLyBvcHRpb25zPzogRGVzdGluYXRpb25PcHRpb25zLFxuICApOiBQcm9taXNlPHsgZGF0YTogeyBwYXRoOiBzdHJpbmcgfTsgZXJyb3I6IG51bGwgfSB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29weUZpbGUoe1xuICAgICAgICBmaWxlTGlzdDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNyY1BhdGg6IHRoaXMuX2dldENsb3VkUGF0aChmcm9tUGF0aCksXG4gICAgICAgICAgICBkc3RQYXRoOiB0aGlzLl9nZXRDbG91ZFBhdGgodG9QYXRoKSxcbiAgICAgICAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICAgICAgICAgIHJlbW92ZU9yaWdpbmFsOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSlcblxuICAgICAgaWYgKHJlc3VsdC5maWxlTGlzdFswXS5jb2RlICYmIHJlc3VsdC5maWxlTGlzdFswXS5jb2RlICE9PSAnU1VDQ0VTUycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcihyZXN1bHQuZmlsZUxpc3RbMF0ubWVzc2FnZSB8fCAnQ29weSBmYWlsZWQnKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7IHBhdGg6IHRoaXMuX2dldENsb3VkUGF0aCh0b1BhdGgpIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3JcbiAgICAgIGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHtcbiAgICAgICAgcmV0dXJuIHsgZGF0YTogbnVsbCwgZXJyb3IgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVTaWduZWRVcmwoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGV4cGlyZXNJbjogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBkb3dubG9hZD86IHN0cmluZyB8IGJvb2xlYW5cbiAgICAgIHRyYW5zZm9ybT86IFRyYW5zZm9ybU9wdGlvbnNcbiAgICB9LFxuICApOiBQcm9taXNlPHsgZGF0YTogeyBzaWduZWRVcmw6IHN0cmluZyB9OyBlcnJvcjogbnVsbCB9IHwgeyBkYXRhOiBudWxsOyBlcnJvcjogU3RvcmFnZUVycm9yIH0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xvdWRQYXRoID0gdGhpcy5fbm9ybWFsaXplQ2xvdWRJZChwYXRoKVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRUZW1wRmlsZVVSTCh7XG4gICAgICAgIGZpbGVMaXN0OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmlsZUlEOiBjbG91ZFBhdGgsXG4gICAgICAgICAgICBtYXhBZ2U6IGV4cGlyZXNJbixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSlcblxuICAgICAgLy8gSUdldEZpbGVVcmxJdGVtIOaciSBjb2RlIOWtl+auteS9huayoeaciSBtZXNzYWdlIOWtl+autVxuICAgICAgaWYgKHJlc3VsdC5maWxlTGlzdFswXS5jb2RlICE9PSAnU1VDQ0VTUycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBzaWduZWQgVVJMOiBbJHtyZXN1bHQuZmlsZUxpc3RbMF0uY29kZX1dICR7cmVzdWx0LmZpbGVMaXN0WzBdLmZpbGVJRH1gKVxuICAgICAgfVxuXG4gICAgICBsZXQgc2lnbmVkVXJsID0gcmVzdWx0LmZpbGVMaXN0WzBdLmRvd25sb2FkX3VybFxuXG4gICAgICAvLyDmnoTlu7rmn6Xor6Llj4LmlbBcbiAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBzdHJpbmdbXSA9IFtdXG5cbiAgICAgIC8vIOWmguaenOaciSBkb3dubG9hZCDlj4LmlbDvvIzmt7vliqDliLAgVVJMIOS4rVxuICAgICAgaWYgKG9wdGlvbnM/LmRvd25sb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmRvd25sb2FkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIC8vIGRvd25sb2FkIOaYr+aWh+S7tuWQjVxuICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2goYGRvd25sb2FkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KG9wdGlvbnMuZG93bmxvYWQpfWApXG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kb3dubG9hZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIC8vIGRvd25sb2FkIOaYryB0cnVl77yM5L2/55So5Y6f5paH5Lu25ZCN5oiW6buY6K6k5YC8XG4gICAgICAgICAgcXVlcnlQYXJhbXMucHVzaCgnZG93bmxvYWQ9dHJ1ZScpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g5aaC5p6c5pyJ5Zu+54mH6L2s5o2i5Y+C5pWw77yM5re75Yqg5YiwIFVSTCDkuK1cbiAgICAgIGlmIChvcHRpb25zPy50cmFuc2Zvcm0pIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtUXVlcnkgPSB0aGlzLl90cmFuc2Zvcm1PcHRzVG9RdWVyeVN0cmluZyhvcHRpb25zLnRyYW5zZm9ybSlcbiAgICAgICAgaWYgKHRyYW5zZm9ybVF1ZXJ5KSB7XG4gICAgICAgICAgcXVlcnlQYXJhbXMucHVzaCh0cmFuc2Zvcm1RdWVyeSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDmi7zmjqXmiYDmnInmn6Xor6Llj4LmlbBcbiAgICAgIGlmIChxdWVyeVBhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IHNpZ25lZFVybC5pbmNsdWRlcygnPycpID8gJyYnIDogJz8nXG4gICAgICAgIHNpZ25lZFVybCA9IGAke3NpZ25lZFVybH0ke3NlcGFyYXRvcn0ke3F1ZXJ5UGFyYW1zLmpvaW4oJyYnKX1gXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHsgc2lnbmVkVXJsIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3JcbiAgICAgIGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNpZ25lZFVybHMoXG4gICAgcGF0aHM6IHN0cmluZ1tdLFxuICAgIGV4cGlyZXNJbjogbnVtYmVyLFxuICAgIC8vIG9wdGlvbnM/OiB7XG4gICAgLy8gICBkb3dubG9hZD86IHN0cmluZyB8IGJvb2xlYW5cbiAgICAvLyB9LFxuICApOiBQcm9taXNlPFxuICAgIHwgeyBkYXRhOiBBcnJheTx7IHBhdGg6IHN0cmluZzsgc2lnbmVkVXJsOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfCBudWxsIH0+OyBlcnJvcjogbnVsbCB9XG4gICAgfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfVxuICAgID4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlTGlzdCA9IHBhdGhzLm1hcChwID0+ICh7XG4gICAgICAgIGZpbGVJRDogdGhpcy5fbm9ybWFsaXplQ2xvdWRJZChwKSxcbiAgICAgICAgbWF4QWdlOiBleHBpcmVzSW4sXG4gICAgICB9KSlcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRUZW1wRmlsZVVSTCh7IGZpbGVMaXN0IH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHJlc3VsdC5maWxlTGlzdC5tYXAoKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4gKHtcbiAgICAgICAgICBwYXRoOiBwYXRoc1tpbmRleF0sXG4gICAgICAgICAgc2lnbmVkVXJsOiBpdGVtLnRlbXBGaWxlVVJMIHx8ICcnLFxuICAgICAgICAgIGVycm9yOiBpdGVtLmNvZGUgPT09ICdTVUNDRVNTJyA/IG51bGwgOiBpdGVtLm1lc3NhZ2UsXG4gICAgICAgIH0pKSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvclxuICAgICAgaWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZG93bmxvYWQoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBUcmFuc2Zvcm1PcHRpb25zLFxuICApOiBQcm9taXNlPHtcbiAgICAgIGRhdGE6IEJsb2JcbiAgICAgIGVycm9yOiBTdG9yYWdlRXJyb3IgfCBudWxsXG4gICAgfT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNpZ25lZFVybFJlc3VsdCA9IGF3YWl0IHRoaXMuY3JlYXRlU2lnbmVkVXJsKHBhdGgsIDYwMCwgeyB0cmFuc2Zvcm06IG9wdGlvbnMgfSlcbiAgICAgICAgICBpZiAoc2lnbmVkVXJsUmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBzaWduZWRVcmxSZXN1bHQuZXJyb3JcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdG1wVXJsID0gZW5jb2RlVVJJKHNpZ25lZFVybFJlc3VsdC5kYXRhPy5zaWduZWRVcmwpXG5cbiAgICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0ICh0aGlzIGFzIGFueSkucmVxdWVzdC5yZXFDbGFzcy5nZXQoe1xuICAgICAgICAgICAgdXJsOiB0bXBVcmwsXG4gICAgICAgICAgICBoZWFkZXJzOiB7fSwgLy8g5LiL6L296LWE5rqQ6K+35rGC5LiN57uP6L+Hc2VydmljZe+8jGhlYWRlcua4heepulxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYicsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFN0b3JhZ2VFcnJvcignRG93bmxvYWQgZmFpbGVkOiBubyBmaWxlIGNvbnRlbnQnKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIOWwhiBCdWZmZXIg6L2s5o2i5Li6IFVpbnQ4QXJyYXkg5Lul5YW85a65IEJsb2JcbiAgICAgICAgICByZXR1cm4gbmV3IEJsb2IoW2RhdGFdKVxuICAgICAgICB9KSgpLFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRUaHJvd09uRXJyb3IpIHRocm93IGVycm9yXG4gICAgICBpZiAoaXNTdG9yYWdlRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5paH5Lu25L+h5oGvXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlSWQgLSDnm7jlr7not6/lvoTvvIjlpoIgJ2ltYWdlcy9waG90by5qcGcn77yJ5oiWIENsb3VkQmFzZSBmaWxlSUTvvIjku6UgJ2Nsb3VkOi8vJyDlvIDlpLTvvIlcbiAgICogQHJldHVybnMg5paH5Lu25L+h5oGv5a+56LGhXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8g5L2/55So55u45a+56Lev5b6EXG4gICAqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYnVja2V0LmluZm8oJ2ltYWdlcy9waG90by5qcGcnKVxuICAgKlxuICAgKiAvLyDkvb/nlKggQ2xvdWRCYXNlIGZpbGVJRFxuICAgKiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGJ1Y2tldC5pbmZvKCdjbG91ZDovL2Vudi1pZC54eHh4LXh4eHgvaW1hZ2VzL3Bob3RvLmpwZycpXG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgaW5mbyhwYXRoT3JGaWxlSWQ6IHN0cmluZywpOiBQcm9taXNlPHsgZGF0YTogQ2FtZWxpemU8RmlsZU9iamVjdFYyPjsgZXJyb3I6IG51bGwgfSB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWIpOaWreaYryBmaWxlSUQg6L+Y5piv55u45a+56Lev5b6EXG4gICAgICBjb25zdCBpc0ZpbGVJZCA9IHBhdGhPckZpbGVJZC5zdGFydHNXaXRoKCdjbG91ZDovLycpXG4gICAgICBjb25zdCBkaXNwbGF5TmFtZSA9IGlzRmlsZUlkID8gdGhpcy5fZXh0cmFjdFBhdGhGcm9tRmlsZUlkKHBhdGhPckZpbGVJZCkgOiBwYXRoT3JGaWxlSWRcbiAgICAgIGNvbnN0IGJ1Y2tldElkID0gaXNGaWxlSWQgPyB0aGlzLl9leHRyYWN0QnVja2V0RnJvbUZpbGVJZChwYXRoT3JGaWxlSWQpIDogdGhpcy5idWNrZXRJZFxuXG4gICAgICBjb25zdCBmaWxlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0RmlsZUluZm8oe1xuICAgICAgICBmaWxlTGlzdDogW3RoaXMuX25vcm1hbGl6ZUNsb3VkSWQocGF0aE9yRmlsZUlkKV0sXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBpdGVtID0gZmlsZUluZm8uZmlsZUxpc3RbMF1cblxuICAgICAgaWYgKGl0ZW0uY29kZSAhPT0gJ1NVQ0NFU1MnKSB7XG4gICAgICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoaXRlbS5tZXNzYWdlKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgIGNvbnN0IGxhc3RNb2RpZmllZCA9IChpdGVtLmxhc3RNb2RpZmllZCA/IG5ldyBEYXRlKGl0ZW0ubGFzdE1vZGlmaWVkKSA6IG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBpZDogaXRlbS5maWxlSUQsXG4gICAgICAgICAgdmVyc2lvbjogJzEnLFxuICAgICAgICAgIG5hbWU6IGRpc3BsYXlOYW1lLFxuICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICAgIHVwZGF0ZWRBdDogbGFzdE1vZGlmaWVkLFxuICAgICAgICAgIGNyZWF0ZWRBdDogbGFzdE1vZGlmaWVkLFxuICAgICAgICAgIGxhc3RBY2Nlc3NlZEF0OiBub3csXG4gICAgICAgICAgc2l6ZTogaXRlbS5zaXplLFxuICAgICAgICAgIGNhY2hlQ29udHJvbDogaXRlbS5jYWNoZUNvbnRyb2wsXG4gICAgICAgICAgY29udGVudFR5cGU6IGl0ZW0uY29udGVudFR5cGUsXG4gICAgICAgICAgZXRhZzogaXRlbS5ldGFnLFxuICAgICAgICAgIGxhc3RNb2RpZmllZCxcbiAgICAgICAgICBtZXRhZGF0YToge30sXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3JcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIFN0b3JhZ2VFcnJvciA/IGVycm9yIDogbmV3IFN0b3JhZ2VFcnJvcihlcnJvci5tZXNzYWdlKSxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBleGlzdHMocGF0aE9yRmlsZUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgZGF0YTogYm9vbGVhbjsgZXJyb3I6IG51bGwgfSB8IHsgZGF0YTogbnVsbDsgZXJyb3I6IFN0b3JhZ2VFcnJvciB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWIpOaWreaYryBmaWxlSUQg6L+Y5piv55u45a+56Lev5b6EXG4gICAgICBjb25zdCBmaWxlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0RmlsZUluZm8oe1xuICAgICAgICBmaWxlTGlzdDogW3RoaXMuX25vcm1hbGl6ZUNsb3VkSWQocGF0aE9yRmlsZUlkKV0sXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBpdGVtID0gZmlsZUluZm8uZmlsZUxpc3RbMF1cblxuICAgICAgaWYgKGl0ZW0uY29kZSA9PT0gJ0ZJTEVfTk9UX0ZPVU5EJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtLmNvZGUgIT09ICdTVUNDRVNTJykge1xuICAgICAgICB0aHJvdyBuZXcgU3RvcmFnZUVycm9yKGl0ZW0ubWVzc2FnZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgZGF0YTogdHJ1ZSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZFRocm93T25FcnJvcikgdGhyb3cgZXJyb3JcbiAgICAgIGlmIChpc1N0b3JhZ2VFcnJvcihlcnJvcikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFB1YmxpY1VybChcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGRvd25sb2FkPzogc3RyaW5nIHwgYm9vbGVhblxuICAgICAgdHJhbnNmb3JtPzogVHJhbnNmb3JtT3B0aW9uc1xuICAgIH0sXG4gICk6IFByb21pc2U8XG4gICAgfCB7XG4gICAgICBkYXRhOiB7IHB1YmxpY1VybDogc3RyaW5nIH1cbiAgICB9XG4gICAgfCB7IGRhdGE6IG51bGw7IGVycm9yOiBTdG9yYWdlRXJyb3IgfVxuICAgID4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY3JlYXRlU2lnbmVkVXJsKHBhdGgsIDYwMCwgb3B0aW9ucylcblxuICAgIGlmIChyZXMuZGF0YSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogeyBwdWJsaWNVcmw6IHJlcy5kYXRhLnNpZ25lZFVybCB9LFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGRhdGE6IG51bGwsIGVycm9yOiByZXMuZXJyb3IgYXMgU3RvcmFnZUVycm9yIH1cbiAgfVxuXG4gIGFzeW5jIHJlbW92ZShwYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHsgZGF0YTogRmlsZU9iamVjdFtdOyBlcnJvcjogbnVsbCB9IHwgeyBkYXRhOiBudWxsOyBlcnJvcjogU3RvcmFnZUVycm9yIH0+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5YiG57uE6I635Y+W5paH5Lu25L+h5oGv77yM5q+P57uE5pyA5aSaMTDkuKpcbiAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IDEwXG4gICAgICBjb25zdCBwYXRoQ2h1bmtzOiBzdHJpbmdbXVtdID0gW11cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpICs9IGNodW5rU2l6ZSkge1xuICAgICAgICBwYXRoQ2h1bmtzLnB1c2gocGF0aHMuc2xpY2UoaSwgaSArIGNodW5rU2l6ZSkpXG4gICAgICB9XG5cbiAgICAgIC8vIOW5tuihjOiOt+WPluaJgOacieWIhue7hOeahOaWh+S7tuS/oeaBr1xuICAgICAgY29uc3QgZmlsZUluZm9SZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocGF0aENodW5rcy5tYXAoY2h1bmsgPT4gUHJvbWlzZS5hbGwoY2h1bmsubWFwKHBhdGggPT4gdGhpcy5pbmZvKHBhdGgpKSkpLClcblxuICAgICAgLy8g5ZCI5bm25omA5pyJ5paH5Lu25L+h5oGv5bm25p6E5bu65pig5bCE6KGo77yIcGF0aCAtPiBmaWxlSW5mb++8iVxuICAgICAgY29uc3QgZmlsZUluZm9NYXAgPSBuZXcgTWFwPHN0cmluZywgQ2FtZWxpemU8RmlsZU9iamVjdFYyPj4oKVxuICAgICAgZmlsZUluZm9SZXN1bHRzLmZsYXQoKS5mb3JFYWNoKChyZXN1bHQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuZGF0YSkge1xuICAgICAgICAgIGZpbGVJbmZvTWFwLnNldChwYXRoc1tNYXRoLmZsb29yKGluZGV4IC8gY2h1bmtTaXplKSAqIGNodW5rU2l6ZSArIChpbmRleCAlIGNodW5rU2l6ZSldLCByZXN1bHQuZGF0YSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8g5omn6KGM5Yig6Zmk5pON5L2cXG4gICAgICBjb25zdCBmaWxlTGlzdCA9IHBhdGhzLm1hcChwID0+IHRoaXMuX25vcm1hbGl6ZUNsb3VkSWQocCkpXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRlbGV0ZUZpbGUoeyBmaWxlTGlzdCB9KVxuXG4gICAgICAvLyBJRGVsZXRlRmlsZVJlcyDnmoQgZmlsZUxpc3Qg5pWw57uE5Lit5q+P5Liq6aG55pyJIGNvZGUg5a2X5q61XG4gICAgICBjb25zdCBmYWlsZWRGaWxlcyA9IHJlc3VsdC5maWxlTGlzdC5maWx0ZXIoaXRlbSA9PiBpdGVtLmNvZGUgIT09ICdTVUNDRVNTJylcbiAgICAgIGlmIChmYWlsZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoYERlbGV0ZSBmYWlsZWQgZm9yICR7ZmFpbGVkRmlsZXMubGVuZ3RofSBmaWxlKHMpYClcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG5cbiAgICAgIC8vIOS9v+eUqOiOt+WPluWIsOeahOaWh+S7tuS/oeaBr+aehOW7uui/lOWbnuaVsOaNrlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogcGF0aHMubWFwKChwKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5mbyA9IGZpbGVJbmZvTWFwLmdldChwKVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGluZm8/Lm5hbWUsXG4gICAgICAgICAgICBpZDogaW5mbz8uaWQsXG4gICAgICAgICAgICBidWNrZXRfaWQ6IGluZm8/LmJ1Y2tldElkLFxuICAgICAgICAgICAgb3duZXI6IHVuZGVmaW5lZCwgLy8g5peg5rOV6K6h566Xb3duZXJcbiAgICAgICAgICAgIHVwZGF0ZWRfYXQ6IGluZm8/LnVwZGF0ZWRBdCB8fCBub3csXG4gICAgICAgICAgICBjcmVhdGVkX2F0OiBpbmZvPy5jcmVhdGVkQXQsXG4gICAgICAgICAgICBsYXN0X2FjY2Vzc2VkX2F0OiBpbmZvPy5sYXN0QWNjZXNzZWRBdCB8fCBub3csXG4gICAgICAgICAgICBtZXRhZGF0YTogaW5mbz8ubWV0YWRhdGEgfHwge30sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRPRE86IOiOt+WPluihpeWFqCBCdWNrZXQg5L+h5oGvXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGJ1Y2tldHM6IHtcbiAgICAgICAgICAgICAgaWQ6IGluZm8/LmJ1Y2tldElkLFxuICAgICAgICAgICAgICBuYW1lOiBpbmZvPy5idWNrZXRJZCxcbiAgICAgICAgICAgICAgb3duZXI6IHVuZGVmaW5lZCwgLy8g5peg5rOV6K6h566Xb3duZXJcbiAgICAgICAgICAgICAgcHVibGljOiBmYWxzZSwgLy8g5pyq55+lXG4gICAgICAgICAgICAgIGNyZWF0ZWRfYXQ6ICcnLCAvLyDmnKrnn6VcbiAgICAgICAgICAgICAgdXBkYXRlZF9hdDogbm93LCAvLyDmnKrnn6VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkVGhyb3dPbkVycm9yKSB0aHJvdyBlcnJvclxuICAgICAgaWYgKGlzU3RvcmFnZUVycm9yKGVycm9yKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbGlzdCgpIHtcbiAgICB0aHJvdyBuZXcgU3RvcmFnZUVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q2xvdWRQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8g5riF55CG6Lev5b6E77ya56e76Zmk6aaW5bC+5pac5p2g77yM5ZCI5bm25aSa5Liq5pac5p2gXG4gICAgY29uc3QgY2xlYW5QYXRoID0gcGF0aC5yZXBsYWNlKC9eXFwvfFxcLyQvZywgJycpLnJlcGxhY2UoL1xcLysvZywgJy8nKVxuXG4gICAgLy8g5ZCm5YiZ6L+U5Zue5riF55CG5ZCO55qE55u45a+56Lev5b6EXG4gICAgcmV0dXJuIGNsZWFuUGF0aFxuICB9XG5cbiAgcHJpdmF0ZSBfbm9ybWFsaXplQ2xvdWRJZChwYXRoOiBzdHJpbmcpIHtcbiAgICAvLyDlpoLmnpzlt7Lnu4/mmK8gY2xvdWQ6Ly8g5qC85byP77yM55u05o6l6L+U5ZueXG4gICAgaWYgKC9eY2xvdWQ6XFwvXFwvLy50ZXN0KHBhdGgpKSB7XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgICBjb25zdCBjbGVhblBhdGggPSB0aGlzLl9nZXRDbG91ZFBhdGgocGF0aClcblxuICAgIC8vIOWmguaenOiuvue9ruS6hiBidWNrZXRJZO+8jOaehOW7uuWujOaVtOeahCBjbG91ZDovLyDot6/lvoRcbiAgICBpZiAodGhpcy5idWNrZXRJZCkge1xuICAgICAgLy8g6I635Y+W546v5aKDIElEXG4gICAgICBjb25zdCBlbnZJZCA9IHRoaXMuY29uZmlnPy5lbnYgfHwgJydcbiAgICAgIGlmIChlbnZJZCkge1xuICAgICAgICByZXR1cm4gYGNsb3VkOi8vJHtlbnZJZH0uJHt0aGlzLmJ1Y2tldElkfS8ke2NsZWFuUGF0aH1gXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBTdG9yYWdlRXJyb3IoJ2J1Y2tldElkIGlzIG5vdCBzZXQnKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdG9CYXNlNjQoZGF0YTogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oZGF0YSkudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgfVxuICAgIHJldHVybiBidG9hKGRhdGEpXG4gIH1cblxuICAvKipcbiAgICog5bCGIFRyYW5zZm9ybU9wdGlvbnMg6L2s5o2i5Li66IW+6K6v5LqR5pWw5o2u5LiH6LGh55qEIGltYWdlTW9ncjIg5p+l6K+i5a2X56ym5LiyXG4gICAqXG4gICAqIOiFvuiur+S6keaVsOaNruS4h+ixoeS9v+eUqCBpbWFnZU1vZ3IyIOaOpeWPo+i/m+ihjOWbvueJh+WkhOeQhu+8jOaUr+aMgeS7peS4i+WPguaVsO+8mlxuICAgKiAtIC90aHVtYm5haWwvPFdpZHRoPng8SGVpZ2h0PiAtIOe8qeaUvlxuICAgKiAtIC9mb3JtYXQvPEZvcm1hdD4gLSDmoLzlvI/ovazmjaJcbiAgICogLSAvcXVhbGl0eS88UXVhbGl0eT4gLSDotKjph4/osIPmlbRcbiAgICogLSAvcnF1YWxpdHkvPFF1YWxpdHk+IC0g55u45a+56LSo6YePXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc2Zvcm0gLSBTdXBhYmFzZSBUcmFuc2Zvcm1PcHRpb25zXG4gICAqIEByZXR1cm5zIOiFvuiur+S6keaVsOaNruS4h+ixoeeahOafpeivouWtl+espuS4slxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIF90cmFuc2Zvcm1PcHRzVG9RdWVyeVN0cmluZyh7IHdpZHRoOiAzMDAsIGhlaWdodDogMjAwLCBxdWFsaXR5OiA4MCwgZm9ybWF0OiAnb3JpZ2luJyB9KVxuICAgKiAvLyDov5Tlm546ICdpbWFnZU1vZ3IyL3RodW1ibmFpbC8zMDB4MjAwL3F1YWxpdHkvODAnXG4gICAqIGBgYFxuICAgKi9cbiAgcHJpdmF0ZSBfdHJhbnNmb3JtT3B0c1RvUXVlcnlTdHJpbmcodHJhbnNmb3JtOiBUcmFuc2Zvcm1PcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJhbXM6IHN0cmluZ1tdID0gWydpbWFnZU1vZ3IyJ11cblxuICAgIC8vIOWkhOeQhue8qeaUvuWPguaVsFxuICAgIGlmICh0cmFuc2Zvcm0ud2lkdGggfHwgdHJhbnNmb3JtLmhlaWdodCkge1xuICAgICAgY29uc3Qgd2lkdGggPSB0cmFuc2Zvcm0ud2lkdGggfHwgJydcbiAgICAgIGNvbnN0IGhlaWdodCA9IHRyYW5zZm9ybS5oZWlnaHQgfHwgJydcblxuICAgICAgLy8g5qC55o2uIHJlc2l6ZSDmqKHlvI/pgInmi6nkuI3lkIznmoTnvKnmlL7mlrnlvI9cbiAgICAgIGlmICh0cmFuc2Zvcm0ucmVzaXplID09PSAnZmlsbCcpIHtcbiAgICAgICAgLy8gZmlsbDog5by65Yi257yp5pS+5Yiw5oyH5a6a5bC65a+477yM5Y+v6IO95Y+Y5b2iXG4gICAgICAgIHBhcmFtcy5wdXNoKGB0aHVtYm5haWwvJHt3aWR0aH14JHtoZWlnaHR9IWApXG4gICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybS5yZXNpemUgPT09ICdjb250YWluJykge1xuICAgICAgICAvLyBjb250YWluOiDnrYnmr5TnvKnmlL7vvIzlrozmlbTmmL7npLrlnKjmjIflrprlsLrlr7jlhoVcbiAgICAgICAgcGFyYW1zLnB1c2goYHRodW1ibmFpbC8ke3dpZHRofXgke2hlaWdodH1gKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY292ZXIgKOm7mOiupCk6IOetieavlOe8qeaUvu+8jOWhq+WFheaMh+WumuWwuuWvuO+8jOWPr+iDveijgeWJqlxuICAgICAgICAvLyDkvb/nlKggL3RodW1ibmFpbC88V2lkdGg+eDxIZWlnaHQ+XiDooajnpLrloavlhYXmqKHlvI9cbiAgICAgICAgcGFyYW1zLnB1c2goYHRodW1ibmFpbC8ke3dpZHRofXgke2hlaWdodH1eYClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDlpITnkIbmoLzlvI/ovazmjaJcbiAgICAvLyBmb3JtYXQ6ICdvcmlnaW4nIOihqOekuuS/neaMgeWOn+agvOW8j++8jOS4jeS8oOatpOWPguaVsFxuICAgIGlmICh0cmFuc2Zvcm0uZm9ybWF0ICYmIHRyYW5zZm9ybS5mb3JtYXQgIT09ICdvcmlnaW4nKSB7XG4gICAgICBwYXJhbXMucHVzaChgZm9ybWF0LyR7dHJhbnNmb3JtLmZvcm1hdH1gKVxuICAgIH1cblxuICAgIC8vIOWkhOeQhui0qOmHj+WPguaVsFxuICAgIGlmICh0cmFuc2Zvcm0ucXVhbGl0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyDohb7orq/kupHmlbDmja7kuIfosaHnmoQgcXVhbGl0eSDlj4LmlbDojIPlm7TmmK8gMS0xMDBcbiAgICAgIGNvbnN0IHF1YWxpdHkgPSBNYXRoLm1heCgxLCBNYXRoLm1pbigxMDAsIHRyYW5zZm9ybS5xdWFsaXR5KSlcbiAgICAgIHBhcmFtcy5wdXNoKGBxdWFsaXR5LyR7cXVhbGl0eX1gKVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXMuam9pbignLycpXG4gIH1cblxuICAvKipcbiAgICog5LuOIENsb3VkQmFzZSBmaWxlSUQg5Lit5o+Q5Y+W5paH5Lu26Lev5b6EXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlSWQgLSBDbG91ZEJhc2UgZmlsZUlEICjmoLzlvI86IGNsb3VkOi8vZW52LWlkLmJ1Y2tldC9wYXRoL3RvL2ZpbGUuanBnKVxuICAgKiBAcmV0dXJucyDmj5Dlj5bnmoTmlofku7bot6/lvoRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBfZXh0cmFjdFBhdGhGcm9tRmlsZUlkKCdjbG91ZDovL3Rlc3QtZW52LnRlc3QtYnVja2V0L2ltYWdlcy9waG90by5qcGcnKVxuICAgKiAvLyDov5Tlm546ICdpbWFnZXMvcGhvdG8uanBnJ1xuICAgKlxuICAgKiBfZXh0cmFjdFBhdGhGcm9tRmlsZUlkKCdjbG91ZDovL3Rlc3QtZW52LnRlc3QtYnVja2V0L2ZpbGUudHh0JylcbiAgICogLy8g6L+U5ZueOiAnZmlsZS50eHQnXG4gICAqIGBgYFxuICAgKi9cbiAgcHJpdmF0ZSBfZXh0cmFjdFBhdGhGcm9tRmlsZUlkKGZpbGVJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBmaWxlSUQg5qC85byPOiBjbG91ZDovL2Vudi1pZC5idWNrZXQvcGF0aC90by9maWxlLmpwZ1xuICAgIC8vIOmcgOimgeaPkOWPluesrOS4gOS4qiAvIOWQjumdoueahOaJgOacieWGheWuue+8iOWMheaLrCBidWNrZXQg5ZKM6Lev5b6E77yJXG4gICAgLy8g54S25ZCO5YaN5o+Q5Y+WIGJ1Y2tldCDlkI7pnaLnmoTot6/lvoTpg6jliIZcblxuICAgIC8vIOenu+mZpCBjbG91ZDovLyDliY3nvIBcbiAgICBjb25zdCB3aXRob3V0UHJvdG9jb2wgPSBmaWxlSWQucmVwbGFjZSgvXmNsb3VkOlxcL1xcLy8sICcnKVxuXG4gICAgLy8g5YiG5Ymy5Li6IFtlbnYtaWQuYnVja2V0LCBwYXRoLCB0bywgZmlsZS5qcGddXG4gICAgY29uc3QgcGFydHMgPSB3aXRob3V0UHJvdG9jb2wuc3BsaXQoJy8nKVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIC8vIOWmguaenOaXoOazleino+aekO+8jOi/lOWbnuWujOaVtOeahCBmaWxlSURcbiAgICAgIHJldHVybiBmaWxlSWRcbiAgICB9XG5cbiAgICAvLyDnp7vpmaTnrKzkuIDpg6jliIbvvIhlbnYtaWQuYnVja2V077yJ77yM6L+U5Zue5Ymp5L2Z6Lev5b6EXG4gICAgcmV0dXJuIHBhcnRzLnNsaWNlKDEpLmpvaW4oJy8nKVxuICB9XG5cbiAgLyoqXG4gICAqIOS7jiBDbG91ZEJhc2UgZmlsZUlEIOS4reaPkOWPliBidWNrZXQg5ZCN56ewXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlSWQgLSBDbG91ZEJhc2UgZmlsZUlEICjmoLzlvI86IGNsb3VkOi8vZW52LWlkLmJ1Y2tldC9wYXRoL3RvL2ZpbGUuanBnKVxuICAgKiBAcmV0dXJucyDmj5Dlj5bnmoQgYnVja2V0IOWQjeensFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIF9leHRyYWN0QnVja2V0RnJvbUZpbGVJZCgnY2xvdWQ6Ly90ZXN0LWVudi50ZXN0LWJ1Y2tldC9pbWFnZXMvcGhvdG8uanBnJylcbiAgICogLy8g6L+U5ZueOiAndGVzdC1idWNrZXQnXG4gICAqXG4gICAqIF9leHRyYWN0QnVja2V0RnJvbUZpbGVJZCgnY2xvdWQ6Ly9wcm9kLWVudi5teS1idWNrZXQvZmlsZS50eHQnKVxuICAgKiAvLyDov5Tlm546ICdteS1idWNrZXQnXG4gICAqIGBgYFxuICAgKi9cbiAgcHJpdmF0ZSBfZXh0cmFjdEJ1Y2tldEZyb21GaWxlSWQoZmlsZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGZpbGVJRCDmoLzlvI86IGNsb3VkOi8vZW52LWlkLmJ1Y2tldC9wYXRoL3RvL2ZpbGUuanBnXG4gICAgLy8g6ZyA6KaB5o+Q5Y+WIGVudi1pZC5idWNrZXQg5Lit55qEIGJ1Y2tldCDpg6jliIZcblxuICAgIC8vIOenu+mZpCBjbG91ZDovLyDliY3nvIBcbiAgICBjb25zdCB3aXRob3V0UHJvdG9jb2wgPSBmaWxlSWQucmVwbGFjZSgvXmNsb3VkOlxcL1xcLy8sICcnKVxuXG4gICAgLy8g5YiG5Ymy5Li6IFtlbnYtaWQuYnVja2V0LCBwYXRoLCB0bywgZmlsZS5qcGddXG4gICAgY29uc3QgcGFydHMgPSB3aXRob3V0UHJvdG9jb2wuc3BsaXQoJy8nKVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDEpIHtcbiAgICAgIC8vIOWmguaenOaXoOazleino+aekO+8jOi/lOWbnum7mOiupCBidWNrZXRcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIC8vIOesrOS4gOmDqOWIhuaYryBlbnYtaWQuYnVja2V077yM5o+Q5Y+WIGJ1Y2tldCDpg6jliIZcbiAgICAvLyDmoLzlvI86IGVudi1pZC5idWNrZXQg5oiWIGVudi1pZC5idWNrZXQtbmFtZVxuICAgIGNvbnN0IGVudkFuZEJ1Y2tldCA9IHBhcnRzWzBdXG5cbiAgICAvLyDmn6Xmib7nrKzkuIDkuKrngrnnmoTkvY3nva5cbiAgICBjb25zdCBkb3RJbmRleCA9IGVudkFuZEJ1Y2tldC5pbmRleE9mKCcuJylcblxuICAgIGlmIChkb3RJbmRleCA9PT0gLTEpIHtcbiAgICAgIC8vIOWmguaenOayoeacieeCue+8jOi/lOWbnuaVtOS4quWtl+espuS4slxuICAgICAgcmV0dXJuIGVudkFuZEJ1Y2tldFxuICAgIH1cblxuICAgIC8vIOi/lOWbnueCueWQjumdoueahOmDqOWIhu+8iGJ1Y2tldCDlkI3np7DvvIlcbiAgICByZXR1cm4gZW52QW5kQnVja2V0LnN1YnN0cmluZyhkb3RJbmRleCArIDEpXG4gIH1cbn1cblxuY29uc3Qgc3VwYWJhc2VDb21wb25lbnQ6IElDbG91ZGJhc2VDb21wb25lbnQgPSB7XG4gIG5hbWU6IGAke0NPTVBPTkVOVF9OQU1FfS9zdXBhYmFzZWAsXG4gIElJRkU6IHRydWUsXG4gIGVudGl0eSgpIHtcbiAgICAvLyDlnKggSUlGRSDkuK3vvIx0aGlzIOaYryBDbG91ZGJhc2Ug57G777yI5p6E6YCg5Ye95pWw77yJ77yM5LiN5piv5a6e5L6LXG4gICAgLy8g5omA5Lul5oiR5Lus6ZyA6KaB5L2/55SoIGdldHRlciDmnaXlu7bov5/ojrflj5blrp7kvovnmoQgY29uZmlnIOWSjCByZXF1ZXN0XG5cbiAgICAvLyDkvb/nlKggV2Vha01hcCDnvJPlrZjmr4/kuKrlrp7kvovnmoQgc3RvcmFnZSDlr7nosaFcbiAgICBjb25zdCBzdG9yYWdlQ2FjaGUgPSBuZXcgV2Vha01hcDxhbnksIFN1cGFiYXNlRmlsZUFQSUxpa2VTdG9yYWdlPigpXG5cbiAgICAvLyDlrprkuYkgc3RvcmFnZSDlsZ7mgKfnmoQgZ2V0dGVy77yM5q+P5Liq5a6e5L6L5Y+q5Yib5bu65LiA5qyhXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMucHJvdG90eXBlLCAnc3RvcmFnZScsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgLy8g6L+Z6YeM55qEIHRoaXMg5pivIGNsb3VkYmFzZSDlrp7kvotcblxuICAgICAgICAvLyDlpoLmnpzlt7Lnu4/liJvlu7rov4fvvIznm7TmjqXov5Tlm57nvJPlrZjnmoTlrp7kvotcbiAgICAgICAgaWYgKHN0b3JhZ2VDYWNoZS5oYXModGhpcykpIHtcbiAgICAgICAgICByZXR1cm4gc3RvcmFnZUNhY2hlLmdldCh0aGlzKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g5Yib5bu65Yqo5oCBIGNvbnRleHTvvIzku47lvZPliY3lrp7kvovojrflj5YgY29uZmlnIOWSjCByZXF1ZXN0XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXNcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtYXNzZXJ0aW9uc1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gbmV3IFByb3h5PElDbG91ZGJhc2VDb250ZXh0Pih7fSBhcyBJQ2xvdWRiYXNlQ29udGV4dCwge1xuICAgICAgICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnY29uZmlnJykge1xuICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuY29uZmlnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gJ3JlcXVlc3QnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXF1ZXN0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyDliJvlu7rmlrDnmoQgc3RvcmFnZSDlrp7kvovlubbnvJPlrZhcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IG5ldyBTdXBhYmFzZUZpbGVBUElMaWtlU3RvcmFnZShjb250ZXh0KVxuICAgICAgICBzdG9yYWdlQ2FjaGUuc2V0KHRoaXMsIHN0b3JhZ2UpXG4gICAgICAgIHJldHVybiBzdG9yYWdlXG4gICAgICB9LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB9KVxuICB9LFxufVxuXG50cnkge1xuICBjbG91ZGJhc2UucmVnaXN0ZXJDb21wb25lbnQoY29tcG9uZW50KVxuICBjbG91ZGJhc2UucmVnaXN0ZXJDb21wb25lbnQoc3VwYWJhc2VDb21wb25lbnQpXG59IGNhdGNoIChlKSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTdG9yYWdlKGFwcDogUGljazxJQ2xvdWRiYXNlLCAncmVnaXN0ZXJDb21wb25lbnQnPikge1xuICB0cnkge1xuICAgIGFwcC5yZWdpc3RlckNvbXBvbmVudChjb21wb25lbnQpXG4gICAgYXBwLnJlZ2lzdGVyQ29tcG9uZW50KHN1cGFiYXNlQ29tcG9uZW50KVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS53YXJuKGUpXG4gIH1cbn1cblxudHJ5IHtcbiAgKHdpbmRvdyBhcyBhbnkpLnJlZ2lzdGVyU3RvcmFnZSA9IHJlZ2lzdGVyU3RvcmFnZVxufSBjYXRjaCAoZSkge31cbiJdfQ==