@projectcor/maia-components 2.11.97 → 2.11.99

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,313 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
3
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
4
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
5
+ /* eslint-disable import/no-extraneous-dependencies */
6
+ /* eslint-disable react/no-array-index-key */
7
+ import React, { useEffect, useState } from 'react';
8
+ import JSZip from 'jszip';
9
+ import { useTranslation } from 'react-i18next';
10
+ import { downloadFileFromUrl } from '../../../utils/fileDownloadHelper';
11
+ import { SCAPMFileName, SCAPMLoadingContainer, SCAPMMarkdownContainer, SCAPMPptSlides, SCAPMPptSlide, SCAPMPptSlideNumber, SCAPMPptSlideBody, SCAPMPptSlideText, SCAPMPptSlideImage } from './AttachmentPreviewModal.styles';
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ var IMAGE_EXTENSIONS = /\.(png|jpe?g|gif|webp|bmp)$/i;
14
+ var isLegacyPptFile = function isLegacyPptFile(fileName) {
15
+ return fileName.toLowerCase().endsWith('.ppt') && !fileName.toLowerCase().endsWith('.pptx');
16
+ };
17
+ var decodeXml = function decodeXml(value) {
18
+ return value.replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&apos;/g, "'");
19
+ };
20
+ var resolveZipPath = function resolveZipPath(fromFile, target) {
21
+ if (target.startsWith('/')) {
22
+ return target.replace(/^\//, '');
23
+ }
24
+ var fromDir = fromFile.split('/').slice(0, -1);
25
+ target.split('/').forEach(function (segment) {
26
+ if (segment === '..') {
27
+ fromDir.pop();
28
+ } else if (segment && segment !== '.') {
29
+ fromDir.push(segment);
30
+ }
31
+ });
32
+ return fromDir.join('/');
33
+ };
34
+ var extractSlideLines = function extractSlideLines(xml) {
35
+ return xml.split(/<a:p[\s>]/).slice(1).map(function (paragraph) {
36
+ var texts = _toConsumableArray(paragraph.matchAll(/<a:t(?:\s[^>]*)?>([^<]*)<\/a:t>/g)).map(function (match) {
37
+ return decodeXml(match[1]);
38
+ });
39
+ return texts.join('').trim();
40
+ }).filter(Boolean);
41
+ };
42
+ var parsePptx = /*#__PURE__*/function () {
43
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(arrayBuffer) {
44
+ var zip, slidePathPattern, slidePaths, objectUrls, slides;
45
+ return _regeneratorRuntime.wrap(function (_context3) {
46
+ while (1) switch (_context3.prev = _context3.next) {
47
+ case 0:
48
+ _context3.next = 1;
49
+ return JSZip.loadAsync(arrayBuffer);
50
+ case 1:
51
+ zip = _context3.sent;
52
+ slidePathPattern = /^ppt\/slides\/slide(\d+)\.xml$/i;
53
+ slidePaths = Object.keys(zip.files).filter(function (name) {
54
+ return slidePathPattern.test(name) && !zip.files[name].dir;
55
+ }).sort(function (a, b) {
56
+ var aMatch = a.match(slidePathPattern);
57
+ var bMatch = b.match(slidePathPattern);
58
+ return Number((aMatch === null || aMatch === void 0 ? void 0 : aMatch[1]) || 0) - Number((bMatch === null || bMatch === void 0 ? void 0 : bMatch[1]) || 0);
59
+ });
60
+ objectUrls = [];
61
+ slides = [];
62
+ _context3.next = 2;
63
+ return Promise.all(slidePaths.map(/*#__PURE__*/function () {
64
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(slidePath, index) {
65
+ var slideFile, xml, lines, images, relsPath, relsFile, relsXml, targets, _t;
66
+ return _regeneratorRuntime.wrap(function (_context2) {
67
+ while (1) switch (_context2.prev = _context2.next) {
68
+ case 0:
69
+ slideFile = zip.file(slidePath);
70
+ if (!slideFile) {
71
+ _context2.next = 2;
72
+ break;
73
+ }
74
+ _context2.next = 1;
75
+ return slideFile.async('string');
76
+ case 1:
77
+ _t = _context2.sent;
78
+ _context2.next = 3;
79
+ break;
80
+ case 2:
81
+ _t = '';
82
+ case 3:
83
+ xml = _t;
84
+ lines = xml ? extractSlideLines(xml) : [];
85
+ images = [];
86
+ relsPath = "".concat(slidePath.replace('ppt/slides/', 'ppt/slides/_rels/'), ".rels");
87
+ relsFile = zip.file(relsPath);
88
+ if (!relsFile) {
89
+ _context2.next = 5;
90
+ break;
91
+ }
92
+ _context2.next = 4;
93
+ return relsFile.async('string');
94
+ case 4:
95
+ relsXml = _context2.sent;
96
+ targets = _toConsumableArray(relsXml.matchAll(/Target="([^"]+)"/g)).map(function (match) {
97
+ return match[1];
98
+ });
99
+ _context2.next = 5;
100
+ return Promise.all(targets.map(/*#__PURE__*/function () {
101
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(target) {
102
+ var mediaPath, mediaFile, blob, url;
103
+ return _regeneratorRuntime.wrap(function (_context) {
104
+ while (1) switch (_context.prev = _context.next) {
105
+ case 0:
106
+ mediaPath = resolveZipPath(slidePath, target.split('?')[0]);
107
+ if (IMAGE_EXTENSIONS.test(mediaPath)) {
108
+ _context.next = 1;
109
+ break;
110
+ }
111
+ return _context.abrupt("return");
112
+ case 1:
113
+ mediaFile = zip.file(mediaPath);
114
+ if (mediaFile) {
115
+ _context.next = 2;
116
+ break;
117
+ }
118
+ return _context.abrupt("return");
119
+ case 2:
120
+ _context.next = 3;
121
+ return mediaFile.async('blob');
122
+ case 3:
123
+ blob = _context.sent;
124
+ url = URL.createObjectURL(blob);
125
+ objectUrls.push(url);
126
+ images.push(url);
127
+ case 4:
128
+ case "end":
129
+ return _context.stop();
130
+ }
131
+ }, _callee);
132
+ }));
133
+ return function (_x4) {
134
+ return _ref3.apply(this, arguments);
135
+ };
136
+ }()));
137
+ case 5:
138
+ slides[index] = {
139
+ index: index + 1,
140
+ lines: lines,
141
+ images: images
142
+ };
143
+ case 6:
144
+ case "end":
145
+ return _context2.stop();
146
+ }
147
+ }, _callee2);
148
+ }));
149
+ return function (_x2, _x3) {
150
+ return _ref2.apply(this, arguments);
151
+ };
152
+ }()));
153
+ case 2:
154
+ return _context3.abrupt("return", {
155
+ slides: slides.filter(Boolean),
156
+ objectUrls: objectUrls
157
+ });
158
+ case 3:
159
+ case "end":
160
+ return _context3.stop();
161
+ }
162
+ }, _callee3);
163
+ }));
164
+ return function parsePptx(_x) {
165
+ return _ref.apply(this, arguments);
166
+ };
167
+ }();
168
+ export var PptPreview = function PptPreview(_ref4) {
169
+ var file = _ref4.file,
170
+ fileUrl = _ref4.fileUrl,
171
+ fileName = _ref4.fileName;
172
+ var _useTranslation = useTranslation(['chat_ai_section']),
173
+ t = _useTranslation.t;
174
+ var _useState = useState([]),
175
+ _useState2 = _slicedToArray(_useState, 2),
176
+ slides = _useState2[0],
177
+ setSlides = _useState2[1];
178
+ var _useState3 = useState(true),
179
+ _useState4 = _slicedToArray(_useState3, 2),
180
+ isLoading = _useState4[0],
181
+ setIsLoading = _useState4[1];
182
+ var _useState5 = useState(null),
183
+ _useState6 = _slicedToArray(_useState5, 2),
184
+ error = _useState6[0],
185
+ setError = _useState6[1];
186
+ useEffect(function () {
187
+ if (isLegacyPptFile(fileName)) {
188
+ setError(t('chat.attachmentPreviewModal.ppt.legacyPptUnsupported'));
189
+ setIsLoading(false);
190
+ return undefined;
191
+ }
192
+ var isCancelled = false;
193
+ var createdUrls = [];
194
+ var loadPptx = /*#__PURE__*/function () {
195
+ var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
196
+ var sourceFile, arrayBuffer, parsed, _t2;
197
+ return _regeneratorRuntime.wrap(function (_context4) {
198
+ while (1) switch (_context4.prev = _context4.next) {
199
+ case 0:
200
+ _context4.prev = 0;
201
+ setIsLoading(true);
202
+ setError(null);
203
+ sourceFile = file;
204
+ if (!(!sourceFile && fileUrl)) {
205
+ _context4.next = 2;
206
+ break;
207
+ }
208
+ _context4.next = 1;
209
+ return downloadFileFromUrl(fileUrl, fileName);
210
+ case 1:
211
+ sourceFile = _context4.sent;
212
+ case 2:
213
+ if (sourceFile) {
214
+ _context4.next = 3;
215
+ break;
216
+ }
217
+ throw new Error('missing-file');
218
+ case 3:
219
+ _context4.next = 4;
220
+ return sourceFile.arrayBuffer();
221
+ case 4:
222
+ arrayBuffer = _context4.sent;
223
+ _context4.next = 5;
224
+ return parsePptx(arrayBuffer);
225
+ case 5:
226
+ parsed = _context4.sent;
227
+ createdUrls.push.apply(createdUrls, _toConsumableArray(parsed.objectUrls));
228
+ if (!isCancelled) {
229
+ _context4.next = 6;
230
+ break;
231
+ }
232
+ parsed.objectUrls.forEach(function (url) {
233
+ return URL.revokeObjectURL(url);
234
+ });
235
+ return _context4.abrupt("return");
236
+ case 6:
237
+ if (!(parsed.slides.length === 0)) {
238
+ _context4.next = 7;
239
+ break;
240
+ }
241
+ throw new Error('empty-pptx');
242
+ case 7:
243
+ setSlides(parsed.slides);
244
+ setIsLoading(false);
245
+ _context4.next = 9;
246
+ break;
247
+ case 8:
248
+ _context4.prev = 8;
249
+ _t2 = _context4["catch"](0);
250
+ if (!isCancelled) {
251
+ setError(t('chat.attachmentPreviewModal.ppt.loadError'));
252
+ setIsLoading(false);
253
+ }
254
+ case 9:
255
+ case "end":
256
+ return _context4.stop();
257
+ }
258
+ }, _callee4, null, [[0, 8]]);
259
+ }));
260
+ return function loadPptx() {
261
+ return _ref5.apply(this, arguments);
262
+ };
263
+ }();
264
+ loadPptx();
265
+ return function () {
266
+ isCancelled = true;
267
+ createdUrls.forEach(function (url) {
268
+ return URL.revokeObjectURL(url);
269
+ });
270
+ };
271
+ }, [file, fileUrl, fileName, t]);
272
+ if (isLoading) {
273
+ return /*#__PURE__*/_jsx(SCAPMLoadingContainer, {
274
+ children: /*#__PURE__*/_jsx("span", {
275
+ children: t('chat.attachmentPreviewModal.loading')
276
+ })
277
+ });
278
+ }
279
+ if (error || slides.length === 0) {
280
+ return /*#__PURE__*/_jsxs(SCAPMMarkdownContainer, {
281
+ children: [/*#__PURE__*/_jsx(SCAPMFileName, {
282
+ children: fileName
283
+ }), /*#__PURE__*/_jsx("p", {
284
+ children: error || t('chat.attachmentPreviewModal.ppt.loadError')
285
+ })]
286
+ });
287
+ }
288
+ return /*#__PURE__*/_jsx(SCAPMPptSlides, {
289
+ children: slides.map(function (slide) {
290
+ return /*#__PURE__*/_jsxs(SCAPMPptSlide, {
291
+ children: [/*#__PURE__*/_jsx(SCAPMPptSlideNumber, {
292
+ children: t('chat.attachmentPreviewModal.ppt.slideLabel', {
293
+ number: slide.index
294
+ })
295
+ }), /*#__PURE__*/_jsxs(SCAPMPptSlideBody, {
296
+ children: [slide.lines.map(function (line, lineIndex) {
297
+ return /*#__PURE__*/_jsx(SCAPMPptSlideText, {
298
+ children: line
299
+ }, "".concat(slide.index, "-text-").concat(lineIndex));
300
+ }), slide.images.map(function (src, imageIndex) {
301
+ return /*#__PURE__*/_jsx(SCAPMPptSlideImage, {
302
+ src: src,
303
+ alt: ""
304
+ }, "".concat(slide.index, "-image-").concat(imageIndex));
305
+ }), slide.lines.length === 0 && slide.images.length === 0 && /*#__PURE__*/_jsx(SCAPMPptSlideText, {
306
+ children: t('chat.attachmentPreviewModal.ppt.emptySlide')
307
+ })]
308
+ })]
309
+ }, slide.index);
310
+ })
311
+ });
312
+ };
313
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwiSlNaaXAiLCJ1c2VUcmFuc2xhdGlvbiIsImRvd25sb2FkRmlsZUZyb21VcmwiLCJTQ0FQTUZpbGVOYW1lIiwiU0NBUE1Mb2FkaW5nQ29udGFpbmVyIiwiU0NBUE1NYXJrZG93bkNvbnRhaW5lciIsIlNDQVBNUHB0U2xpZGVzIiwiU0NBUE1QcHRTbGlkZSIsIlNDQVBNUHB0U2xpZGVOdW1iZXIiLCJTQ0FQTVBwdFNsaWRlQm9keSIsIlNDQVBNUHB0U2xpZGVUZXh0IiwiU0NBUE1QcHRTbGlkZUltYWdlIiwianN4IiwiX2pzeCIsImpzeHMiLCJfanN4cyIsIklNQUdFX0VYVEVOU0lPTlMiLCJpc0xlZ2FjeVBwdEZpbGUiLCJmaWxlTmFtZSIsInRvTG93ZXJDYXNlIiwiZW5kc1dpdGgiLCJkZWNvZGVYbWwiLCJ2YWx1ZSIsInJlcGxhY2UiLCJyZXNvbHZlWmlwUGF0aCIsImZyb21GaWxlIiwidGFyZ2V0Iiwic3RhcnRzV2l0aCIsImZyb21EaXIiLCJzcGxpdCIsInNsaWNlIiwiZm9yRWFjaCIsInNlZ21lbnQiLCJwb3AiLCJwdXNoIiwiam9pbiIsImV4dHJhY3RTbGlkZUxpbmVzIiwieG1sIiwibWFwIiwicGFyYWdyYXBoIiwidGV4dHMiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJtYXRjaEFsbCIsIm1hdGNoIiwidHJpbSIsImZpbHRlciIsIkJvb2xlYW4iLCJwYXJzZVBwdHgiLCJfcmVmIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUzIiwiYXJyYXlCdWZmZXIiLCJ6aXAiLCJzbGlkZVBhdGhQYXR0ZXJuIiwic2xpZGVQYXRocyIsIm9iamVjdFVybHMiLCJzbGlkZXMiLCJ3cmFwIiwiX2NvbnRleHQzIiwicHJldiIsIm5leHQiLCJsb2FkQXN5bmMiLCJzZW50IiwiT2JqZWN0Iiwia2V5cyIsImZpbGVzIiwibmFtZSIsInRlc3QiLCJkaXIiLCJzb3J0IiwiYSIsImIiLCJhTWF0Y2giLCJiTWF0Y2giLCJOdW1iZXIiLCJQcm9taXNlIiwiYWxsIiwiX3JlZjIiLCJfY2FsbGVlMiIsInNsaWRlUGF0aCIsImluZGV4Iiwic2xpZGVGaWxlIiwibGluZXMiLCJpbWFnZXMiLCJyZWxzUGF0aCIsInJlbHNGaWxlIiwicmVsc1htbCIsInRhcmdldHMiLCJfdCIsIl9jb250ZXh0MiIsImZpbGUiLCJhc3luYyIsImNvbmNhdCIsIl9yZWYzIiwiX2NhbGxlZSIsIm1lZGlhUGF0aCIsIm1lZGlhRmlsZSIsImJsb2IiLCJ1cmwiLCJfY29udGV4dCIsImFicnVwdCIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsInN0b3AiLCJfeDQiLCJhcHBseSIsImFyZ3VtZW50cyIsIl94MiIsIl94MyIsIl94IiwiUHB0UHJldmlldyIsIl9yZWY0IiwiZmlsZVVybCIsIl91c2VUcmFuc2xhdGlvbiIsInQiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzZXRTbGlkZXMiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImlzTG9hZGluZyIsInNldElzTG9hZGluZyIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2IiwiZXJyb3IiLCJzZXRFcnJvciIsInVuZGVmaW5lZCIsImlzQ2FuY2VsbGVkIiwiY3JlYXRlZFVybHMiLCJsb2FkUHB0eCIsIl9yZWY1IiwiX2NhbGxlZTQiLCJzb3VyY2VGaWxlIiwicGFyc2VkIiwiX3QyIiwiX2NvbnRleHQ0IiwiRXJyb3IiLCJyZXZva2VPYmplY3RVUkwiLCJsZW5ndGgiLCJjaGlsZHJlbiIsInNsaWRlIiwibnVtYmVyIiwibGluZSIsImxpbmVJbmRleCIsInNyYyIsImltYWdlSW5kZXgiLCJhbHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9hdG9tcy9BdHRhY2htZW50UHJldmlld01vZGFsL1BwdFByZXZpZXcudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5ICovXG5pbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IEpTWmlwIGZyb20gJ2pzemlwJ1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0J1xuaW1wb3J0IHsgZG93bmxvYWRGaWxlRnJvbVVybCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2ZpbGVEb3dubG9hZEhlbHBlcidcbmltcG9ydCB7XG4gIFNDQVBNRmlsZU5hbWUsXG4gIFNDQVBNTG9hZGluZ0NvbnRhaW5lcixcbiAgU0NBUE1NYXJrZG93bkNvbnRhaW5lcixcbiAgU0NBUE1QcHRTbGlkZXMsXG4gIFNDQVBNUHB0U2xpZGUsXG4gIFNDQVBNUHB0U2xpZGVOdW1iZXIsXG4gIFNDQVBNUHB0U2xpZGVCb2R5LFxuICBTQ0FQTVBwdFNsaWRlVGV4dCxcbiAgU0NBUE1QcHRTbGlkZUltYWdlLFxufSBmcm9tICcuL0F0dGFjaG1lbnRQcmV2aWV3TW9kYWwuc3R5bGVzJ1xuXG50eXBlIFBwdFByZXZpZXdQcm9wcyA9IHtcbiAgZmlsZT86IEZpbGVcbiAgZmlsZVVybD86IHN0cmluZ1xuICBmaWxlTmFtZTogc3RyaW5nXG59XG5cbnR5cGUgUHB0U2xpZGUgPSB7XG4gIGluZGV4OiBudW1iZXJcbiAgbGluZXM6IHN0cmluZ1tdXG4gIGltYWdlczogc3RyaW5nW11cbn1cblxuY29uc3QgSU1BR0VfRVhURU5TSU9OUyA9IC9cXC4ocG5nfGpwZT9nfGdpZnx3ZWJwfGJtcCkkL2lcblxuY29uc3QgaXNMZWdhY3lQcHRGaWxlID0gKGZpbGVOYW1lOiBzdHJpbmcpID0+XG4gIGZpbGVOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy5wcHQnKSAmJiAhZmlsZU5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnLnBwdHgnKVxuXG5jb25zdCBkZWNvZGVYbWwgPSAodmFsdWU6IHN0cmluZykgPT5cbiAgdmFsdWVcbiAgICAucmVwbGFjZSgvJmFtcDsvZywgJyYnKVxuICAgIC5yZXBsYWNlKC8mbHQ7L2csICc8JylcbiAgICAucmVwbGFjZSgvJmd0Oy9nLCAnPicpXG4gICAgLnJlcGxhY2UoLyZxdW90Oy9nLCAnXCInKVxuICAgIC5yZXBsYWNlKC8mYXBvczsvZywgXCInXCIpXG5cbmNvbnN0IHJlc29sdmVaaXBQYXRoID0gKGZyb21GaWxlOiBzdHJpbmcsIHRhcmdldDogc3RyaW5nKSA9PiB7XG4gIGlmICh0YXJnZXQuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIHRhcmdldC5yZXBsYWNlKC9eXFwvLywgJycpXG4gIH1cbiAgY29uc3QgZnJvbURpciA9IGZyb21GaWxlLnNwbGl0KCcvJykuc2xpY2UoMCwgLTEpXG4gIHRhcmdldC5zcGxpdCgnLycpLmZvckVhY2goc2VnbWVudCA9PiB7XG4gICAgaWYgKHNlZ21lbnQgPT09ICcuLicpIHtcbiAgICAgIGZyb21EaXIucG9wKClcbiAgICB9IGVsc2UgaWYgKHNlZ21lbnQgJiYgc2VnbWVudCAhPT0gJy4nKSB7XG4gICAgICBmcm9tRGlyLnB1c2goc2VnbWVudClcbiAgICB9XG4gIH0pXG4gIHJldHVybiBmcm9tRGlyLmpvaW4oJy8nKVxufVxuXG5jb25zdCBleHRyYWN0U2xpZGVMaW5lcyA9ICh4bWw6IHN0cmluZyk6IHN0cmluZ1tdID0+XG4gIHhtbFxuICAgIC5zcGxpdCgvPGE6cFtcXHM+XS8pXG4gICAgLnNsaWNlKDEpXG4gICAgLm1hcChwYXJhZ3JhcGggPT4ge1xuICAgICAgY29uc3QgdGV4dHMgPSBbLi4ucGFyYWdyYXBoLm1hdGNoQWxsKC88YTp0KD86XFxzW14+XSopPz4oW148XSopPFxcL2E6dD4vZyldLm1hcChtYXRjaCA9PiBkZWNvZGVYbWwobWF0Y2hbMV0pKVxuICAgICAgcmV0dXJuIHRleHRzLmpvaW4oJycpLnRyaW0oKVxuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKVxuXG5jb25zdCBwYXJzZVBwdHggPSBhc3luYyAoYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyKTogUHJvbWlzZTx7IHNsaWRlczogUHB0U2xpZGVbXTsgb2JqZWN0VXJsczogc3RyaW5nW10gfT4gPT4ge1xuICBjb25zdCB6aXAgPSBhd2FpdCBKU1ppcC5sb2FkQXN5bmMoYXJyYXlCdWZmZXIpXG4gIGNvbnN0IHNsaWRlUGF0aFBhdHRlcm4gPSAvXnBwdFxcL3NsaWRlc1xcL3NsaWRlKFxcZCspXFwueG1sJC9pXG4gIGNvbnN0IHNsaWRlUGF0aHMgPSBPYmplY3Qua2V5cyh6aXAuZmlsZXMpXG4gICAgLmZpbHRlcihuYW1lID0+IHNsaWRlUGF0aFBhdHRlcm4udGVzdChuYW1lKSAmJiAhemlwLmZpbGVzW25hbWVdLmRpcilcbiAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYU1hdGNoID0gYS5tYXRjaChzbGlkZVBhdGhQYXR0ZXJuKVxuICAgICAgY29uc3QgYk1hdGNoID0gYi5tYXRjaChzbGlkZVBhdGhQYXR0ZXJuKVxuICAgICAgcmV0dXJuIE51bWJlcihhTWF0Y2g/LlsxXSB8fCAwKSAtIE51bWJlcihiTWF0Y2g/LlsxXSB8fCAwKVxuICAgIH0pXG5cbiAgY29uc3Qgb2JqZWN0VXJsczogc3RyaW5nW10gPSBbXVxuICBjb25zdCBzbGlkZXM6IFBwdFNsaWRlW10gPSBbXVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHNsaWRlUGF0aHMubWFwKGFzeW5jIChzbGlkZVBhdGgsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBzbGlkZUZpbGUgPSB6aXAuZmlsZShzbGlkZVBhdGgpXG4gICAgICBjb25zdCB4bWwgPSBzbGlkZUZpbGUgPyBhd2FpdCBzbGlkZUZpbGUuYXN5bmMoJ3N0cmluZycpIDogJydcbiAgICAgIGNvbnN0IGxpbmVzID0geG1sID8gZXh0cmFjdFNsaWRlTGluZXMoeG1sKSA6IFtdXG4gICAgICBjb25zdCBpbWFnZXM6IHN0cmluZ1tdID0gW11cblxuICAgICAgY29uc3QgcmVsc1BhdGggPSBgJHtzbGlkZVBhdGgucmVwbGFjZSgncHB0L3NsaWRlcy8nLCAncHB0L3NsaWRlcy9fcmVscy8nKX0ucmVsc2BcbiAgICAgIGNvbnN0IHJlbHNGaWxlID0gemlwLmZpbGUocmVsc1BhdGgpXG4gICAgICBpZiAocmVsc0ZpbGUpIHtcbiAgICAgICAgY29uc3QgcmVsc1htbCA9IGF3YWl0IHJlbHNGaWxlLmFzeW5jKCdzdHJpbmcnKVxuICAgICAgICBjb25zdCB0YXJnZXRzID0gWy4uLnJlbHNYbWwubWF0Y2hBbGwoL1RhcmdldD1cIihbXlwiXSspXCIvZyldLm1hcChtYXRjaCA9PiBtYXRjaFsxXSlcblxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICB0YXJnZXRzLm1hcChhc3luYyB0YXJnZXQgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVkaWFQYXRoID0gcmVzb2x2ZVppcFBhdGgoc2xpZGVQYXRoLCB0YXJnZXQuc3BsaXQoJz8nKVswXSlcbiAgICAgICAgICAgIGlmICghSU1BR0VfRVhURU5TSU9OUy50ZXN0KG1lZGlhUGF0aCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtZWRpYUZpbGUgPSB6aXAuZmlsZShtZWRpYVBhdGgpXG4gICAgICAgICAgICBpZiAoIW1lZGlhRmlsZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBtZWRpYUZpbGUuYXN5bmMoJ2Jsb2InKVxuICAgICAgICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxuICAgICAgICAgICAgb2JqZWN0VXJscy5wdXNoKHVybClcbiAgICAgICAgICAgIGltYWdlcy5wdXNoKHVybClcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHNsaWRlc1tpbmRleF0gPSB7IGluZGV4OiBpbmRleCArIDEsIGxpbmVzLCBpbWFnZXMgfVxuICAgIH0pXG4gIClcblxuICByZXR1cm4geyBzbGlkZXM6IHNsaWRlcy5maWx0ZXIoQm9vbGVhbiksIG9iamVjdFVybHMgfVxufVxuXG5leHBvcnQgY29uc3QgUHB0UHJldmlldzogUmVhY3QuRkM8UHB0UHJldmlld1Byb3BzPiA9ICh7IGZpbGUsIGZpbGVVcmwsIGZpbGVOYW1lIH0pID0+IHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUcmFuc2xhdGlvbihbJ2NoYXRfYWlfc2VjdGlvbiddKVxuICBjb25zdCBbc2xpZGVzLCBzZXRTbGlkZXNdID0gdXNlU3RhdGU8UHB0U2xpZGVbXT4oW10pXG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKVxuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNMZWdhY3lQcHRGaWxlKGZpbGVOYW1lKSkge1xuICAgICAgc2V0RXJyb3IodCgnY2hhdC5hdHRhY2htZW50UHJldmlld01vZGFsLnBwdC5sZWdhY3lQcHRVbnN1cHBvcnRlZCcpKVxuICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpc0NhbmNlbGxlZCA9IGZhbHNlXG4gICAgY29uc3QgY3JlYXRlZFVybHM6IHN0cmluZ1tdID0gW11cblxuICAgIGNvbnN0IGxvYWRQcHR4ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nKHRydWUpXG4gICAgICAgIHNldEVycm9yKG51bGwpXG5cbiAgICAgICAgbGV0IHNvdXJjZUZpbGUgPSBmaWxlXG5cbiAgICAgICAgaWYgKCFzb3VyY2VGaWxlICYmIGZpbGVVcmwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gYXdhaXQgZG93bmxvYWRGaWxlRnJvbVVybChmaWxlVXJsLCBmaWxlTmFtZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc291cmNlRmlsZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZy1maWxlJylcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgc291cmNlRmlsZS5hcnJheUJ1ZmZlcigpXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGF3YWl0IHBhcnNlUHB0eChhcnJheUJ1ZmZlcilcbiAgICAgICAgY3JlYXRlZFVybHMucHVzaCguLi5wYXJzZWQub2JqZWN0VXJscylcblxuICAgICAgICBpZiAoaXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICBwYXJzZWQub2JqZWN0VXJscy5mb3JFYWNoKHVybCA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCkpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyc2VkLnNsaWRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VtcHR5LXBwdHgnKVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0U2xpZGVzKHBhcnNlZC5zbGlkZXMpXG4gICAgICAgIHNldElzTG9hZGluZyhmYWxzZSlcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBpZiAoIWlzQ2FuY2VsbGVkKSB7XG4gICAgICAgICAgc2V0RXJyb3IodCgnY2hhdC5hdHRhY2htZW50UHJldmlld01vZGFsLnBwdC5sb2FkRXJyb3InKSlcbiAgICAgICAgICBzZXRJc0xvYWRpbmcoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkUHB0eCgpXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaXNDYW5jZWxsZWQgPSB0cnVlXG4gICAgICBjcmVhdGVkVXJscy5mb3JFYWNoKHVybCA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCkpXG4gICAgfVxuICB9LCBbZmlsZSwgZmlsZVVybCwgZmlsZU5hbWUsIHRdKVxuXG4gIGlmIChpc0xvYWRpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPFNDQVBNTG9hZGluZ0NvbnRhaW5lcj5cbiAgICAgICAgPHNwYW4+e3QoJ2NoYXQuYXR0YWNobWVudFByZXZpZXdNb2RhbC5sb2FkaW5nJyl9PC9zcGFuPlxuICAgICAgPC9TQ0FQTUxvYWRpbmdDb250YWluZXI+XG4gICAgKVxuICB9XG5cbiAgaWYgKGVycm9yIHx8IHNsaWRlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKFxuICAgICAgPFNDQVBNTWFya2Rvd25Db250YWluZXI+XG4gICAgICAgIDxTQ0FQTUZpbGVOYW1lPntmaWxlTmFtZX08L1NDQVBNRmlsZU5hbWU+XG4gICAgICAgIDxwPntlcnJvciB8fCB0KCdjaGF0LmF0dGFjaG1lbnRQcmV2aWV3TW9kYWwucHB0LmxvYWRFcnJvcicpfTwvcD5cbiAgICAgIDwvU0NBUE1NYXJrZG93bkNvbnRhaW5lcj5cbiAgICApXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxTQ0FQTVBwdFNsaWRlcz5cbiAgICAgIHtzbGlkZXMubWFwKHNsaWRlID0+IChcbiAgICAgICAgPFNDQVBNUHB0U2xpZGUga2V5PXtzbGlkZS5pbmRleH0+XG4gICAgICAgICAgPFNDQVBNUHB0U2xpZGVOdW1iZXI+XG4gICAgICAgICAgICB7dCgnY2hhdC5hdHRhY2htZW50UHJldmlld01vZGFsLnBwdC5zbGlkZUxhYmVsJywgeyBudW1iZXI6IHNsaWRlLmluZGV4IH0pfVxuICAgICAgICAgIDwvU0NBUE1QcHRTbGlkZU51bWJlcj5cbiAgICAgICAgICA8U0NBUE1QcHRTbGlkZUJvZHk+XG4gICAgICAgICAgICB7c2xpZGUubGluZXMubWFwKChsaW5lLCBsaW5lSW5kZXgpID0+IChcbiAgICAgICAgICAgICAgPFNDQVBNUHB0U2xpZGVUZXh0IGtleT17YCR7c2xpZGUuaW5kZXh9LXRleHQtJHtsaW5lSW5kZXh9YH0+e2xpbmV9PC9TQ0FQTVBwdFNsaWRlVGV4dD5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgICAge3NsaWRlLmltYWdlcy5tYXAoKHNyYywgaW1hZ2VJbmRleCkgPT4gKFxuICAgICAgICAgICAgICA8U0NBUE1QcHRTbGlkZUltYWdlIGtleT17YCR7c2xpZGUuaW5kZXh9LWltYWdlLSR7aW1hZ2VJbmRleH1gfSBzcmM9e3NyY30gYWx0PVwiXCIgLz5cbiAgICAgICAgICAgICkpfVxuICAgICAgICAgICAge3NsaWRlLmxpbmVzLmxlbmd0aCA9PT0gMCAmJiBzbGlkZS5pbWFnZXMubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgICAgICAgPFNDQVBNUHB0U2xpZGVUZXh0Pnt0KCdjaGF0LmF0dGFjaG1lbnRQcmV2aWV3TW9kYWwucHB0LmVtcHR5U2xpZGUnKX08L1NDQVBNUHB0U2xpZGVUZXh0PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L1NDQVBNUHB0U2xpZGVCb2R5PlxuICAgICAgICA8L1NDQVBNUHB0U2xpZGU+XG4gICAgICApKX1cbiAgICA8L1NDQVBNUHB0U2xpZGVzPlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0EsT0FBT0EsS0FBSyxJQUFJQyxTQUFTLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBQ2xELE9BQU9DLEtBQUssTUFBTSxPQUFPO0FBQ3pCLFNBQVNDLGNBQWMsUUFBUSxlQUFlO0FBQzlDLFNBQVNDLG1CQUFtQixRQUFRLG1DQUFtQztBQUN2RSxTQUNFQyxhQUFhLEVBQ2JDLHFCQUFxQixFQUNyQkMsc0JBQXNCLEVBQ3RCQyxjQUFjLEVBQ2RDLGFBQWEsRUFDYkMsbUJBQW1CLEVBQ25CQyxpQkFBaUIsRUFDakJDLGlCQUFpQixFQUNqQkMsa0JBQWtCLFFBQ2IsaUNBQWlDO0FBQUEsU0FBQUMsR0FBQSxJQUFBQyxJQUFBLEVBQUFDLElBQUEsSUFBQUMsS0FBQTtBQWN4QyxJQUFNQyxnQkFBZ0IsR0FBRyw4QkFBOEI7QUFFdkQsSUFBTUMsZUFBZSxHQUFHLFNBQWxCQSxlQUFlQSxDQUFJQyxR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