tnp-core 13.2.13 → 13.2.14
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/README.md +20 -20
- package/assets/shared/shared_folder_info.txt +1 -1
- package/browser/README.md +24 -24
- package/browser/esm2020/lib/core-config.mjs +6 -6
- package/browser/esm2020/lib/core-imports.mjs +68 -68
- package/browser/esm2020/lib/core-models.mjs +3 -3
- package/browser/esm2020/lib/framework-name.mjs +9 -9
- package/browser/esm2020/lib/helpers-isomorphic.mjs +35 -35
- package/browser/esm2020/lib/helpers-messages.mjs +493 -493
- package/browser/esm2020/lib/helpers.mjs +1179 -1179
- package/browser/esm2020/lib/index.mjs +10 -10
- package/browser/esm2020/lib/node-path-mock.mjs +414 -414
- package/browser/esm2020/lib/progress-data.mjs +51 -51
- package/browser/esm2020/public-api.mjs +1 -1
- package/browser/esm2020/tnp-core.mjs +4 -4
- package/browser/fesm2015/tnp-core.mjs +2195 -2195
- package/browser/fesm2020/tnp-core.mjs +2193 -2193
- package/browser/lib/core-config.d.ts +4 -4
- package/browser/lib/core-imports.d.ts +7 -7
- package/browser/lib/core-models.d.ts +41 -41
- package/browser/lib/framework-name.d.ts +1 -1
- package/browser/lib/helpers-isomorphic.d.ts +5 -5
- package/browser/lib/helpers-messages.d.ts +16 -16
- package/browser/lib/helpers.d.ts +49 -49
- package/browser/lib/index.d.ts +7 -7
- package/browser/lib/node-path-mock.d.ts +24 -24
- package/browser/lib/progress-data.d.ts +17 -17
- package/browser/tnp-core.d.ts +4 -4
- package/cli.backend.js +3 -3
- package/client/README.md +24 -24
- package/client/esm2020/lib/core-config.mjs +6 -6
- package/client/esm2020/lib/core-imports.mjs +68 -68
- package/client/esm2020/lib/core-models.mjs +3 -3
- package/client/esm2020/lib/framework-name.mjs +9 -9
- package/client/esm2020/lib/helpers-isomorphic.mjs +35 -35
- package/client/esm2020/lib/helpers-messages.mjs +493 -493
- package/client/esm2020/lib/helpers.mjs +1179 -1179
- package/client/esm2020/lib/index.mjs +10 -10
- package/client/esm2020/lib/node-path-mock.mjs +414 -414
- package/client/esm2020/lib/progress-data.mjs +51 -51
- package/client/esm2020/public-api.mjs +1 -1
- package/client/esm2020/tnp-core.mjs +4 -4
- package/client/fesm2015/tnp-core.mjs +2195 -2195
- package/client/fesm2020/tnp-core.mjs +2193 -2193
- package/client/lib/core-config.d.ts +4 -4
- package/client/lib/core-imports.d.ts +7 -7
- package/client/lib/core-models.d.ts +41 -41
- package/client/lib/framework-name.d.ts +1 -1
- package/client/lib/helpers-isomorphic.d.ts +5 -5
- package/client/lib/helpers-messages.d.ts +16 -16
- package/client/lib/helpers.d.ts +49 -49
- package/client/lib/index.d.ts +7 -7
- package/client/lib/node-path-mock.d.ts +24 -24
- package/client/lib/progress-data.d.ts +17 -17
- package/client/package.json +30 -31
- package/client/tnp-core.d.ts +4 -4
- package/index.d.ts +1 -1
- package/lib/core-config.d.ts +5 -5
- package/lib/core-imports.d.ts +30 -30
- package/lib/core-models.d.ts +42 -42
- package/lib/framework-name.d.ts +2 -2
- package/lib/helpers-isomorphic.d.ts +6 -6
- package/lib/helpers-messages.d.ts +33 -33
- package/lib/helpers.d.ts +128 -128
- package/lib/index.d.ts +8 -8
- package/lib/node-path-mock.d.ts +24 -24
- package/lib/node-path-mock.js +3 -3
- package/lib/progress-data.d.ts +18 -18
- package/lib/public-api.d.ts +7 -7
- package/package.json +3 -224
- package/package.json_devDependencies.json +202 -202
- package/package.json_tnp.json5 +65 -65
- package/tmp-environment.json +34 -35
- package/websql/README.md +24 -24
- package/websql/esm2020/lib/core-config.mjs +6 -6
- package/websql/esm2020/lib/core-imports.mjs +68 -68
- package/websql/esm2020/lib/core-models.mjs +3 -3
- package/websql/esm2020/lib/framework-name.mjs +9 -9
- package/websql/esm2020/lib/helpers-isomorphic.mjs +34 -34
- package/websql/esm2020/lib/helpers-messages.mjs +493 -493
- package/websql/esm2020/lib/helpers.mjs +1177 -1177
- package/websql/esm2020/lib/index.mjs +10 -10
- package/websql/esm2020/lib/node-path-mock.mjs +414 -414
- package/websql/esm2020/lib/progress-data.mjs +51 -51
- package/websql/esm2020/public-api.mjs +1 -1
- package/websql/esm2020/tnp-core.mjs +4 -4
- package/websql/fesm2015/tnp-core.mjs +2192 -2192
- package/websql/fesm2020/tnp-core.mjs +2190 -2190
- package/websql/lib/core-config.d.ts +4 -4
- package/websql/lib/core-imports.d.ts +7 -7
- package/websql/lib/core-models.d.ts +41 -41
- package/websql/lib/framework-name.d.ts +1 -1
- package/websql/lib/helpers-isomorphic.d.ts +5 -5
- package/websql/lib/helpers-messages.d.ts +16 -16
- package/websql/lib/helpers.d.ts +49 -49
- package/websql/lib/index.d.ts +7 -7
- package/websql/lib/node-path-mock.d.ts +24 -24
- package/websql/lib/progress-data.d.ts +17 -17
- package/websql/tnp-core.d.ts +4 -4
@@ -1,415 +1,415 @@
|
|
1
|
-
function assertPath(path) {
|
2
|
-
if (typeof path !== 'string') {
|
3
|
-
throw new TypeError('[firedev-core] Path must be a string. Received ' + JSON.stringify(path));
|
4
|
-
}
|
5
|
-
}
|
6
|
-
function normalizeStringPosix(path, allowAboveRoot) {
|
7
|
-
var res = '';
|
8
|
-
var lastSegmentLength = 0;
|
9
|
-
var lastSlash = -1;
|
10
|
-
var dots = 0;
|
11
|
-
var code;
|
12
|
-
for (var i = 0; i <= path.length; ++i) {
|
13
|
-
if (i < path.length)
|
14
|
-
code = path.charCodeAt(i);
|
15
|
-
else if (code === 47 /*/*/)
|
16
|
-
break;
|
17
|
-
else
|
18
|
-
code = 47 /*/*/;
|
19
|
-
if (code === 47 /*/*/) {
|
20
|
-
if (lastSlash === i - 1 || dots === 1) {
|
21
|
-
}
|
22
|
-
else if (lastSlash !== i - 1 && dots === 2) {
|
23
|
-
if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {
|
24
|
-
if (res.length > 2) {
|
25
|
-
var lastSlashIndex = res.lastIndexOf('/');
|
26
|
-
if (lastSlashIndex !== res.length - 1) {
|
27
|
-
if (lastSlashIndex === -1) {
|
28
|
-
res = '';
|
29
|
-
lastSegmentLength = 0;
|
30
|
-
}
|
31
|
-
else {
|
32
|
-
res = res.slice(0, lastSlashIndex);
|
33
|
-
lastSegmentLength = res.length - 1 - res.lastIndexOf('/');
|
34
|
-
}
|
35
|
-
lastSlash = i;
|
36
|
-
dots = 0;
|
37
|
-
continue;
|
38
|
-
}
|
39
|
-
}
|
40
|
-
else if (res.length === 2 || res.length === 1) {
|
41
|
-
res = '';
|
42
|
-
lastSegmentLength = 0;
|
43
|
-
lastSlash = i;
|
44
|
-
dots = 0;
|
45
|
-
continue;
|
46
|
-
}
|
47
|
-
}
|
48
|
-
if (allowAboveRoot) {
|
49
|
-
if (res.length > 0)
|
50
|
-
res += '/..';
|
51
|
-
else
|
52
|
-
res = '..';
|
53
|
-
lastSegmentLength = 2;
|
54
|
-
}
|
55
|
-
}
|
56
|
-
else {
|
57
|
-
if (res.length > 0)
|
58
|
-
res += '/' + path.slice(lastSlash + 1, i);
|
59
|
-
else
|
60
|
-
res = path.slice(lastSlash + 1, i);
|
61
|
-
lastSegmentLength = i - lastSlash - 1;
|
62
|
-
}
|
63
|
-
lastSlash = i;
|
64
|
-
dots = 0;
|
65
|
-
}
|
66
|
-
else if (code === 46 /*.*/ && dots !== -1) {
|
67
|
-
++dots;
|
68
|
-
}
|
69
|
-
else {
|
70
|
-
dots = -1;
|
71
|
-
}
|
72
|
-
}
|
73
|
-
return res;
|
74
|
-
}
|
75
|
-
function _format(sep, pathObject) {
|
76
|
-
var dir = pathObject.dir || pathObject.root;
|
77
|
-
var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');
|
78
|
-
if (!dir) {
|
79
|
-
return base;
|
80
|
-
}
|
81
|
-
if (dir === pathObject.root) {
|
82
|
-
return dir + base;
|
83
|
-
}
|
84
|
-
return dir + sep + base;
|
85
|
-
}
|
86
|
-
export const path = {
|
87
|
-
resolve: function resolve(pathToResovle) {
|
88
|
-
return pathToResovle;
|
89
|
-
},
|
90
|
-
normalize: function normalize(pathArg) {
|
91
|
-
assertPath(pathArg);
|
92
|
-
if (pathArg.length === 0)
|
93
|
-
return '.';
|
94
|
-
var isAbsolute = pathArg.charCodeAt(0) === 47 /*/*/;
|
95
|
-
var trailingSeparator = pathArg.charCodeAt(pathArg.length - 1) === 47 /*/*/;
|
96
|
-
pathArg = normalizeStringPosix(pathArg, !isAbsolute);
|
97
|
-
if (pathArg.length === 0 && !isAbsolute)
|
98
|
-
pathArg = '.';
|
99
|
-
if (pathArg.length > 0 && trailingSeparator)
|
100
|
-
pathArg += '/';
|
101
|
-
if (isAbsolute)
|
102
|
-
return '/' + pathArg;
|
103
|
-
return pathArg;
|
104
|
-
},
|
105
|
-
isAbsolute: function isAbsolute(pathArg) {
|
106
|
-
assertPath(pathArg);
|
107
|
-
return pathArg.length > 0 && pathArg.charCodeAt(0) === 47 /*/*/;
|
108
|
-
},
|
109
|
-
join: function join() {
|
110
|
-
if (arguments.length === 0)
|
111
|
-
return '.';
|
112
|
-
var joined;
|
113
|
-
for (var i = 0; i < arguments.length; ++i) {
|
114
|
-
var arg = arguments[i];
|
115
|
-
assertPath(arg);
|
116
|
-
if (arg.length > 0) {
|
117
|
-
if (joined === undefined)
|
118
|
-
joined = arg;
|
119
|
-
else
|
120
|
-
joined += '/' + arg;
|
121
|
-
}
|
122
|
-
}
|
123
|
-
if (joined === undefined)
|
124
|
-
return '.';
|
125
|
-
return path.normalize(joined);
|
126
|
-
},
|
127
|
-
relative: function relative(from, to) {
|
128
|
-
assertPath(from);
|
129
|
-
assertPath(to);
|
130
|
-
if (from === to)
|
131
|
-
return '';
|
132
|
-
from = path.resolve(from);
|
133
|
-
to = path.resolve(to);
|
134
|
-
if (from === to)
|
135
|
-
return '';
|
136
|
-
var fromStart = 1;
|
137
|
-
for (; fromStart < from.length; ++fromStart) {
|
138
|
-
if (from.charCodeAt(fromStart) !== 47 /*/*/)
|
139
|
-
break;
|
140
|
-
}
|
141
|
-
var fromEnd = from.length;
|
142
|
-
var fromLen = fromEnd - fromStart;
|
143
|
-
var toStart = 1;
|
144
|
-
for (; toStart < to.length; ++toStart) {
|
145
|
-
if (to.charCodeAt(toStart) !== 47 /*/*/)
|
146
|
-
break;
|
147
|
-
}
|
148
|
-
var toEnd = to.length;
|
149
|
-
var toLen = toEnd - toStart;
|
150
|
-
var length = fromLen < toLen ? fromLen : toLen;
|
151
|
-
var lastCommonSep = -1;
|
152
|
-
var i = 0;
|
153
|
-
for (; i <= length; ++i) {
|
154
|
-
if (i === length) {
|
155
|
-
if (toLen > length) {
|
156
|
-
if (to.charCodeAt(toStart + i) === 47 /*/*/) {
|
157
|
-
return to.slice(toStart + i + 1);
|
158
|
-
}
|
159
|
-
else if (i === 0) {
|
160
|
-
return to.slice(toStart + i);
|
161
|
-
}
|
162
|
-
}
|
163
|
-
else if (fromLen > length) {
|
164
|
-
if (from.charCodeAt(fromStart + i) === 47 /*/*/) {
|
165
|
-
lastCommonSep = i;
|
166
|
-
}
|
167
|
-
else if (i === 0) {
|
168
|
-
lastCommonSep = 0;
|
169
|
-
}
|
170
|
-
}
|
171
|
-
break;
|
172
|
-
}
|
173
|
-
var fromCode = from.charCodeAt(fromStart + i);
|
174
|
-
var toCode = to.charCodeAt(toStart + i);
|
175
|
-
if (fromCode !== toCode)
|
176
|
-
break;
|
177
|
-
else if (fromCode === 47 /*/*/)
|
178
|
-
lastCommonSep = i;
|
179
|
-
}
|
180
|
-
var out = '';
|
181
|
-
for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {
|
182
|
-
if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {
|
183
|
-
if (out.length === 0)
|
184
|
-
out += '..';
|
185
|
-
else
|
186
|
-
out += '/..';
|
187
|
-
}
|
188
|
-
}
|
189
|
-
if (out.length > 0)
|
190
|
-
return out + to.slice(toStart + lastCommonSep);
|
191
|
-
else {
|
192
|
-
toStart += lastCommonSep;
|
193
|
-
if (to.charCodeAt(toStart) === 47 /*/*/)
|
194
|
-
++toStart;
|
195
|
-
return to.slice(toStart);
|
196
|
-
}
|
197
|
-
},
|
198
|
-
_makeLong: function _makeLong(path) {
|
199
|
-
return path;
|
200
|
-
},
|
201
|
-
dirname: function dirname(path) {
|
202
|
-
assertPath(path);
|
203
|
-
if (path.length === 0)
|
204
|
-
return '.';
|
205
|
-
var code = path.charCodeAt(0);
|
206
|
-
var hasRoot = code === 47 /*/*/;
|
207
|
-
var end = -1;
|
208
|
-
var matchedSlash = true;
|
209
|
-
for (var i = path.length - 1; i >= 1; --i) {
|
210
|
-
code = path.charCodeAt(i);
|
211
|
-
if (code === 47 /*/*/) {
|
212
|
-
if (!matchedSlash) {
|
213
|
-
end = i;
|
214
|
-
break;
|
215
|
-
}
|
216
|
-
}
|
217
|
-
else {
|
218
|
-
matchedSlash = false;
|
219
|
-
}
|
220
|
-
}
|
221
|
-
if (end === -1)
|
222
|
-
return hasRoot ? '/' : '.';
|
223
|
-
if (hasRoot && end === 1)
|
224
|
-
return '//';
|
225
|
-
return path.slice(0, end);
|
226
|
-
},
|
227
|
-
basename: function basename(pathArg, ext) {
|
228
|
-
if (ext !== undefined && typeof ext !== 'string')
|
229
|
-
throw new TypeError('"ext" argument must be a string');
|
230
|
-
assertPath(pathArg);
|
231
|
-
var start = 0;
|
232
|
-
var end = -1;
|
233
|
-
var matchedSlash = true;
|
234
|
-
var i;
|
235
|
-
if (ext !== undefined && ext.length > 0 && ext.length <= pathArg.length) {
|
236
|
-
if (ext.length === pathArg.length && ext === pathArg)
|
237
|
-
return '';
|
238
|
-
var extIdx = ext.length - 1;
|
239
|
-
var firstNonSlashEnd = -1;
|
240
|
-
for (i = pathArg.length - 1; i >= 0; --i) {
|
241
|
-
var code = pathArg.charCodeAt(i);
|
242
|
-
if (code === 47 /*/*/) {
|
243
|
-
if (!matchedSlash) {
|
244
|
-
start = i + 1;
|
245
|
-
break;
|
246
|
-
}
|
247
|
-
}
|
248
|
-
else {
|
249
|
-
if (firstNonSlashEnd === -1) {
|
250
|
-
matchedSlash = false;
|
251
|
-
firstNonSlashEnd = i + 1;
|
252
|
-
}
|
253
|
-
if (extIdx >= 0) {
|
254
|
-
if (code === ext.charCodeAt(extIdx)) {
|
255
|
-
if (--extIdx === -1) {
|
256
|
-
end = i;
|
257
|
-
}
|
258
|
-
}
|
259
|
-
else {
|
260
|
-
extIdx = -1;
|
261
|
-
end = firstNonSlashEnd;
|
262
|
-
}
|
263
|
-
}
|
264
|
-
}
|
265
|
-
}
|
266
|
-
if (start === end)
|
267
|
-
end = firstNonSlashEnd;
|
268
|
-
else if (end === -1)
|
269
|
-
end = pathArg.length;
|
270
|
-
return pathArg.slice(start, end);
|
271
|
-
}
|
272
|
-
else {
|
273
|
-
for (i = pathArg.length - 1; i >= 0; --i) {
|
274
|
-
if (pathArg.charCodeAt(i) === 47 /*/*/) {
|
275
|
-
if (!matchedSlash) {
|
276
|
-
start = i + 1;
|
277
|
-
break;
|
278
|
-
}
|
279
|
-
}
|
280
|
-
else if (end === -1) {
|
281
|
-
matchedSlash = false;
|
282
|
-
end = i + 1;
|
283
|
-
}
|
284
|
-
}
|
285
|
-
if (end === -1)
|
286
|
-
return '';
|
287
|
-
return pathArg.slice(start, end);
|
288
|
-
}
|
289
|
-
},
|
290
|
-
extname: function extname(pathArg) {
|
291
|
-
assertPath(pathArg);
|
292
|
-
var startDot = -1;
|
293
|
-
var startPart = 0;
|
294
|
-
var end = -1;
|
295
|
-
var matchedSlash = true;
|
296
|
-
var preDotState = 0;
|
297
|
-
for (var i = pathArg.length - 1; i >= 0; --i) {
|
298
|
-
var code = pathArg.charCodeAt(i);
|
299
|
-
if (code === 47 /*/*/) {
|
300
|
-
if (!matchedSlash) {
|
301
|
-
startPart = i + 1;
|
302
|
-
break;
|
303
|
-
}
|
304
|
-
continue;
|
305
|
-
}
|
306
|
-
if (end === -1) {
|
307
|
-
matchedSlash = false;
|
308
|
-
end = i + 1;
|
309
|
-
}
|
310
|
-
if (code === 46 /*.*/) {
|
311
|
-
if (startDot === -1)
|
312
|
-
startDot = i;
|
313
|
-
else if (preDotState !== 1)
|
314
|
-
preDotState = 1;
|
315
|
-
}
|
316
|
-
else if (startDot !== -1) {
|
317
|
-
preDotState = -1;
|
318
|
-
}
|
319
|
-
}
|
320
|
-
if (startDot === -1 || end === -1 ||
|
321
|
-
preDotState === 0 ||
|
322
|
-
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
323
|
-
return '';
|
324
|
-
}
|
325
|
-
return pathArg.slice(startDot, end);
|
326
|
-
},
|
327
|
-
format: function format(pathObject) {
|
328
|
-
if (pathObject === null || typeof pathObject !== 'object') {
|
329
|
-
throw new TypeError('The "pathObject" argument must be of type Object. Received type ' + typeof pathObject);
|
330
|
-
}
|
331
|
-
return _format('/', pathObject);
|
332
|
-
},
|
333
|
-
parse: function parse(pathArg) {
|
334
|
-
assertPath(pathArg);
|
335
|
-
var ret = { root: '', dir: '', base: '', ext: '', name: '' };
|
336
|
-
if (pathArg.length === 0)
|
337
|
-
return ret;
|
338
|
-
var code = pathArg.charCodeAt(0);
|
339
|
-
var isAbsolute = code === 47 /*/*/;
|
340
|
-
var start;
|
341
|
-
if (isAbsolute) {
|
342
|
-
ret.root = '/';
|
343
|
-
start = 1;
|
344
|
-
}
|
345
|
-
else {
|
346
|
-
start = 0;
|
347
|
-
}
|
348
|
-
var startDot = -1;
|
349
|
-
var startPart = 0;
|
350
|
-
var end = -1;
|
351
|
-
var matchedSlash = true;
|
352
|
-
var i = pathArg.length - 1;
|
353
|
-
var preDotState = 0;
|
354
|
-
for (; i >= start; --i) {
|
355
|
-
code = pathArg.charCodeAt(i);
|
356
|
-
if (code === 47 /*/*/) {
|
357
|
-
if (!matchedSlash) {
|
358
|
-
startPart = i + 1;
|
359
|
-
break;
|
360
|
-
}
|
361
|
-
continue;
|
362
|
-
}
|
363
|
-
if (end === -1) {
|
364
|
-
matchedSlash = false;
|
365
|
-
end = i + 1;
|
366
|
-
}
|
367
|
-
if (code === 46 /*.*/) {
|
368
|
-
if (startDot === -1)
|
369
|
-
startDot = i;
|
370
|
-
else if (preDotState !== 1)
|
371
|
-
preDotState = 1;
|
372
|
-
}
|
373
|
-
else if (startDot !== -1) {
|
374
|
-
preDotState = -1;
|
375
|
-
}
|
376
|
-
}
|
377
|
-
if (startDot === -1 || end === -1 ||
|
378
|
-
preDotState === 0 ||
|
379
|
-
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
380
|
-
if (end !== -1) {
|
381
|
-
if (startPart === 0 && isAbsolute)
|
382
|
-
ret.base = ret.name = pathArg.slice(1, end);
|
383
|
-
else
|
384
|
-
ret.base = ret.name = pathArg.slice(startPart, end);
|
385
|
-
}
|
386
|
-
}
|
387
|
-
else {
|
388
|
-
if (startPart === 0 && isAbsolute) {
|
389
|
-
ret.name = pathArg.slice(1, startDot);
|
390
|
-
ret.base = pathArg.slice(1, end);
|
391
|
-
}
|
392
|
-
else {
|
393
|
-
ret.name = pathArg.slice(startPart, startDot);
|
394
|
-
ret.base = pathArg.slice(startPart, end);
|
395
|
-
}
|
396
|
-
ret.ext = pathArg.slice(startDot, end);
|
397
|
-
}
|
398
|
-
if (startPart > 0)
|
399
|
-
ret.dir = pathArg.slice(0, startPart - 1);
|
400
|
-
else if (isAbsolute)
|
401
|
-
ret.dir = '/';
|
402
|
-
return ret;
|
403
|
-
},
|
404
|
-
sep: '/',
|
405
|
-
delimiter: ':',
|
406
|
-
win32: {
|
407
|
-
normalize: (p) => {
|
408
|
-
return p;
|
409
|
-
}
|
410
|
-
},
|
411
|
-
posix: null
|
412
|
-
};
|
413
|
-
;
|
414
|
-
({}); // @--end-of-file-for-module=tnp-core lib/node-path-mock.ts
|
1
|
+
function assertPath(path) {
|
2
|
+
if (typeof path !== 'string') {
|
3
|
+
throw new TypeError('[firedev-core] Path must be a string. Received ' + JSON.stringify(path));
|
4
|
+
}
|
5
|
+
}
|
6
|
+
function normalizeStringPosix(path, allowAboveRoot) {
|
7
|
+
var res = '';
|
8
|
+
var lastSegmentLength = 0;
|
9
|
+
var lastSlash = -1;
|
10
|
+
var dots = 0;
|
11
|
+
var code;
|
12
|
+
for (var i = 0; i <= path.length; ++i) {
|
13
|
+
if (i < path.length)
|
14
|
+
code = path.charCodeAt(i);
|
15
|
+
else if (code === 47 /*/*/)
|
16
|
+
break;
|
17
|
+
else
|
18
|
+
code = 47 /*/*/;
|
19
|
+
if (code === 47 /*/*/) {
|
20
|
+
if (lastSlash === i - 1 || dots === 1) {
|
21
|
+
}
|
22
|
+
else if (lastSlash !== i - 1 && dots === 2) {
|
23
|
+
if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {
|
24
|
+
if (res.length > 2) {
|
25
|
+
var lastSlashIndex = res.lastIndexOf('/');
|
26
|
+
if (lastSlashIndex !== res.length - 1) {
|
27
|
+
if (lastSlashIndex === -1) {
|
28
|
+
res = '';
|
29
|
+
lastSegmentLength = 0;
|
30
|
+
}
|
31
|
+
else {
|
32
|
+
res = res.slice(0, lastSlashIndex);
|
33
|
+
lastSegmentLength = res.length - 1 - res.lastIndexOf('/');
|
34
|
+
}
|
35
|
+
lastSlash = i;
|
36
|
+
dots = 0;
|
37
|
+
continue;
|
38
|
+
}
|
39
|
+
}
|
40
|
+
else if (res.length === 2 || res.length === 1) {
|
41
|
+
res = '';
|
42
|
+
lastSegmentLength = 0;
|
43
|
+
lastSlash = i;
|
44
|
+
dots = 0;
|
45
|
+
continue;
|
46
|
+
}
|
47
|
+
}
|
48
|
+
if (allowAboveRoot) {
|
49
|
+
if (res.length > 0)
|
50
|
+
res += '/..';
|
51
|
+
else
|
52
|
+
res = '..';
|
53
|
+
lastSegmentLength = 2;
|
54
|
+
}
|
55
|
+
}
|
56
|
+
else {
|
57
|
+
if (res.length > 0)
|
58
|
+
res += '/' + path.slice(lastSlash + 1, i);
|
59
|
+
else
|
60
|
+
res = path.slice(lastSlash + 1, i);
|
61
|
+
lastSegmentLength = i - lastSlash - 1;
|
62
|
+
}
|
63
|
+
lastSlash = i;
|
64
|
+
dots = 0;
|
65
|
+
}
|
66
|
+
else if (code === 46 /*.*/ && dots !== -1) {
|
67
|
+
++dots;
|
68
|
+
}
|
69
|
+
else {
|
70
|
+
dots = -1;
|
71
|
+
}
|
72
|
+
}
|
73
|
+
return res;
|
74
|
+
}
|
75
|
+
function _format(sep, pathObject) {
|
76
|
+
var dir = pathObject.dir || pathObject.root;
|
77
|
+
var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');
|
78
|
+
if (!dir) {
|
79
|
+
return base;
|
80
|
+
}
|
81
|
+
if (dir === pathObject.root) {
|
82
|
+
return dir + base;
|
83
|
+
}
|
84
|
+
return dir + sep + base;
|
85
|
+
}
|
86
|
+
export const path = {
|
87
|
+
resolve: function resolve(pathToResovle) {
|
88
|
+
return pathToResovle;
|
89
|
+
},
|
90
|
+
normalize: function normalize(pathArg) {
|
91
|
+
assertPath(pathArg);
|
92
|
+
if (pathArg.length === 0)
|
93
|
+
return '.';
|
94
|
+
var isAbsolute = pathArg.charCodeAt(0) === 47 /*/*/;
|
95
|
+
var trailingSeparator = pathArg.charCodeAt(pathArg.length - 1) === 47 /*/*/;
|
96
|
+
pathArg = normalizeStringPosix(pathArg, !isAbsolute);
|
97
|
+
if (pathArg.length === 0 && !isAbsolute)
|
98
|
+
pathArg = '.';
|
99
|
+
if (pathArg.length > 0 && trailingSeparator)
|
100
|
+
pathArg += '/';
|
101
|
+
if (isAbsolute)
|
102
|
+
return '/' + pathArg;
|
103
|
+
return pathArg;
|
104
|
+
},
|
105
|
+
isAbsolute: function isAbsolute(pathArg) {
|
106
|
+
assertPath(pathArg);
|
107
|
+
return pathArg.length > 0 && pathArg.charCodeAt(0) === 47 /*/*/;
|
108
|
+
},
|
109
|
+
join: function join() {
|
110
|
+
if (arguments.length === 0)
|
111
|
+
return '.';
|
112
|
+
var joined;
|
113
|
+
for (var i = 0; i < arguments.length; ++i) {
|
114
|
+
var arg = arguments[i];
|
115
|
+
assertPath(arg);
|
116
|
+
if (arg.length > 0) {
|
117
|
+
if (joined === undefined)
|
118
|
+
joined = arg;
|
119
|
+
else
|
120
|
+
joined += '/' + arg;
|
121
|
+
}
|
122
|
+
}
|
123
|
+
if (joined === undefined)
|
124
|
+
return '.';
|
125
|
+
return path.normalize(joined);
|
126
|
+
},
|
127
|
+
relative: function relative(from, to) {
|
128
|
+
assertPath(from);
|
129
|
+
assertPath(to);
|
130
|
+
if (from === to)
|
131
|
+
return '';
|
132
|
+
from = path.resolve(from);
|
133
|
+
to = path.resolve(to);
|
134
|
+
if (from === to)
|
135
|
+
return '';
|
136
|
+
var fromStart = 1;
|
137
|
+
for (; fromStart < from.length; ++fromStart) {
|
138
|
+
if (from.charCodeAt(fromStart) !== 47 /*/*/)
|
139
|
+
break;
|
140
|
+
}
|
141
|
+
var fromEnd = from.length;
|
142
|
+
var fromLen = fromEnd - fromStart;
|
143
|
+
var toStart = 1;
|
144
|
+
for (; toStart < to.length; ++toStart) {
|
145
|
+
if (to.charCodeAt(toStart) !== 47 /*/*/)
|
146
|
+
break;
|
147
|
+
}
|
148
|
+
var toEnd = to.length;
|
149
|
+
var toLen = toEnd - toStart;
|
150
|
+
var length = fromLen < toLen ? fromLen : toLen;
|
151
|
+
var lastCommonSep = -1;
|
152
|
+
var i = 0;
|
153
|
+
for (; i <= length; ++i) {
|
154
|
+
if (i === length) {
|
155
|
+
if (toLen > length) {
|
156
|
+
if (to.charCodeAt(toStart + i) === 47 /*/*/) {
|
157
|
+
return to.slice(toStart + i + 1);
|
158
|
+
}
|
159
|
+
else if (i === 0) {
|
160
|
+
return to.slice(toStart + i);
|
161
|
+
}
|
162
|
+
}
|
163
|
+
else if (fromLen > length) {
|
164
|
+
if (from.charCodeAt(fromStart + i) === 47 /*/*/) {
|
165
|
+
lastCommonSep = i;
|
166
|
+
}
|
167
|
+
else if (i === 0) {
|
168
|
+
lastCommonSep = 0;
|
169
|
+
}
|
170
|
+
}
|
171
|
+
break;
|
172
|
+
}
|
173
|
+
var fromCode = from.charCodeAt(fromStart + i);
|
174
|
+
var toCode = to.charCodeAt(toStart + i);
|
175
|
+
if (fromCode !== toCode)
|
176
|
+
break;
|
177
|
+
else if (fromCode === 47 /*/*/)
|
178
|
+
lastCommonSep = i;
|
179
|
+
}
|
180
|
+
var out = '';
|
181
|
+
for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {
|
182
|
+
if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {
|
183
|
+
if (out.length === 0)
|
184
|
+
out += '..';
|
185
|
+
else
|
186
|
+
out += '/..';
|
187
|
+
}
|
188
|
+
}
|
189
|
+
if (out.length > 0)
|
190
|
+
return out + to.slice(toStart + lastCommonSep);
|
191
|
+
else {
|
192
|
+
toStart += lastCommonSep;
|
193
|
+
if (to.charCodeAt(toStart) === 47 /*/*/)
|
194
|
+
++toStart;
|
195
|
+
return to.slice(toStart);
|
196
|
+
}
|
197
|
+
},
|
198
|
+
_makeLong: function _makeLong(path) {
|
199
|
+
return path;
|
200
|
+
},
|
201
|
+
dirname: function dirname(path) {
|
202
|
+
assertPath(path);
|
203
|
+
if (path.length === 0)
|
204
|
+
return '.';
|
205
|
+
var code = path.charCodeAt(0);
|
206
|
+
var hasRoot = code === 47 /*/*/;
|
207
|
+
var end = -1;
|
208
|
+
var matchedSlash = true;
|
209
|
+
for (var i = path.length - 1; i >= 1; --i) {
|
210
|
+
code = path.charCodeAt(i);
|
211
|
+
if (code === 47 /*/*/) {
|
212
|
+
if (!matchedSlash) {
|
213
|
+
end = i;
|
214
|
+
break;
|
215
|
+
}
|
216
|
+
}
|
217
|
+
else {
|
218
|
+
matchedSlash = false;
|
219
|
+
}
|
220
|
+
}
|
221
|
+
if (end === -1)
|
222
|
+
return hasRoot ? '/' : '.';
|
223
|
+
if (hasRoot && end === 1)
|
224
|
+
return '//';
|
225
|
+
return path.slice(0, end);
|
226
|
+
},
|
227
|
+
basename: function basename(pathArg, ext) {
|
228
|
+
if (ext !== undefined && typeof ext !== 'string')
|
229
|
+
throw new TypeError('"ext" argument must be a string');
|
230
|
+
assertPath(pathArg);
|
231
|
+
var start = 0;
|
232
|
+
var end = -1;
|
233
|
+
var matchedSlash = true;
|
234
|
+
var i;
|
235
|
+
if (ext !== undefined && ext.length > 0 && ext.length <= pathArg.length) {
|
236
|
+
if (ext.length === pathArg.length && ext === pathArg)
|
237
|
+
return '';
|
238
|
+
var extIdx = ext.length - 1;
|
239
|
+
var firstNonSlashEnd = -1;
|
240
|
+
for (i = pathArg.length - 1; i >= 0; --i) {
|
241
|
+
var code = pathArg.charCodeAt(i);
|
242
|
+
if (code === 47 /*/*/) {
|
243
|
+
if (!matchedSlash) {
|
244
|
+
start = i + 1;
|
245
|
+
break;
|
246
|
+
}
|
247
|
+
}
|
248
|
+
else {
|
249
|
+
if (firstNonSlashEnd === -1) {
|
250
|
+
matchedSlash = false;
|
251
|
+
firstNonSlashEnd = i + 1;
|
252
|
+
}
|
253
|
+
if (extIdx >= 0) {
|
254
|
+
if (code === ext.charCodeAt(extIdx)) {
|
255
|
+
if (--extIdx === -1) {
|
256
|
+
end = i;
|
257
|
+
}
|
258
|
+
}
|
259
|
+
else {
|
260
|
+
extIdx = -1;
|
261
|
+
end = firstNonSlashEnd;
|
262
|
+
}
|
263
|
+
}
|
264
|
+
}
|
265
|
+
}
|
266
|
+
if (start === end)
|
267
|
+
end = firstNonSlashEnd;
|
268
|
+
else if (end === -1)
|
269
|
+
end = pathArg.length;
|
270
|
+
return pathArg.slice(start, end);
|
271
|
+
}
|
272
|
+
else {
|
273
|
+
for (i = pathArg.length - 1; i >= 0; --i) {
|
274
|
+
if (pathArg.charCodeAt(i) === 47 /*/*/) {
|
275
|
+
if (!matchedSlash) {
|
276
|
+
start = i + 1;
|
277
|
+
break;
|
278
|
+
}
|
279
|
+
}
|
280
|
+
else if (end === -1) {
|
281
|
+
matchedSlash = false;
|
282
|
+
end = i + 1;
|
283
|
+
}
|
284
|
+
}
|
285
|
+
if (end === -1)
|
286
|
+
return '';
|
287
|
+
return pathArg.slice(start, end);
|
288
|
+
}
|
289
|
+
},
|
290
|
+
extname: function extname(pathArg) {
|
291
|
+
assertPath(pathArg);
|
292
|
+
var startDot = -1;
|
293
|
+
var startPart = 0;
|
294
|
+
var end = -1;
|
295
|
+
var matchedSlash = true;
|
296
|
+
var preDotState = 0;
|
297
|
+
for (var i = pathArg.length - 1; i >= 0; --i) {
|
298
|
+
var code = pathArg.charCodeAt(i);
|
299
|
+
if (code === 47 /*/*/) {
|
300
|
+
if (!matchedSlash) {
|
301
|
+
startPart = i + 1;
|
302
|
+
break;
|
303
|
+
}
|
304
|
+
continue;
|
305
|
+
}
|
306
|
+
if (end === -1) {
|
307
|
+
matchedSlash = false;
|
308
|
+
end = i + 1;
|
309
|
+
}
|
310
|
+
if (code === 46 /*.*/) {
|
311
|
+
if (startDot === -1)
|
312
|
+
startDot = i;
|
313
|
+
else if (preDotState !== 1)
|
314
|
+
preDotState = 1;
|
315
|
+
}
|
316
|
+
else if (startDot !== -1) {
|
317
|
+
preDotState = -1;
|
318
|
+
}
|
319
|
+
}
|
320
|
+
if (startDot === -1 || end === -1 ||
|
321
|
+
preDotState === 0 ||
|
322
|
+
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
323
|
+
return '';
|
324
|
+
}
|
325
|
+
return pathArg.slice(startDot, end);
|
326
|
+
},
|
327
|
+
format: function format(pathObject) {
|
328
|
+
if (pathObject === null || typeof pathObject !== 'object') {
|
329
|
+
throw new TypeError('The "pathObject" argument must be of type Object. Received type ' + typeof pathObject);
|
330
|
+
}
|
331
|
+
return _format('/', pathObject);
|
332
|
+
},
|
333
|
+
parse: function parse(pathArg) {
|
334
|
+
assertPath(pathArg);
|
335
|
+
var ret = { root: '', dir: '', base: '', ext: '', name: '' };
|
336
|
+
if (pathArg.length === 0)
|
337
|
+
return ret;
|
338
|
+
var code = pathArg.charCodeAt(0);
|
339
|
+
var isAbsolute = code === 47 /*/*/;
|
340
|
+
var start;
|
341
|
+
if (isAbsolute) {
|
342
|
+
ret.root = '/';
|
343
|
+
start = 1;
|
344
|
+
}
|
345
|
+
else {
|
346
|
+
start = 0;
|
347
|
+
}
|
348
|
+
var startDot = -1;
|
349
|
+
var startPart = 0;
|
350
|
+
var end = -1;
|
351
|
+
var matchedSlash = true;
|
352
|
+
var i = pathArg.length - 1;
|
353
|
+
var preDotState = 0;
|
354
|
+
for (; i >= start; --i) {
|
355
|
+
code = pathArg.charCodeAt(i);
|
356
|
+
if (code === 47 /*/*/) {
|
357
|
+
if (!matchedSlash) {
|
358
|
+
startPart = i + 1;
|
359
|
+
break;
|
360
|
+
}
|
361
|
+
continue;
|
362
|
+
}
|
363
|
+
if (end === -1) {
|
364
|
+
matchedSlash = false;
|
365
|
+
end = i + 1;
|
366
|
+
}
|
367
|
+
if (code === 46 /*.*/) {
|
368
|
+
if (startDot === -1)
|
369
|
+
startDot = i;
|
370
|
+
else if (preDotState !== 1)
|
371
|
+
preDotState = 1;
|
372
|
+
}
|
373
|
+
else if (startDot !== -1) {
|
374
|
+
preDotState = -1;
|
375
|
+
}
|
376
|
+
}
|
377
|
+
if (startDot === -1 || end === -1 ||
|
378
|
+
preDotState === 0 ||
|
379
|
+
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
|
380
|
+
if (end !== -1) {
|
381
|
+
if (startPart === 0 && isAbsolute)
|
382
|
+
ret.base = ret.name = pathArg.slice(1, end);
|
383
|
+
else
|
384
|
+
ret.base = ret.name = pathArg.slice(startPart, end);
|
385
|
+
}
|
386
|
+
}
|
387
|
+
else {
|
388
|
+
if (startPart === 0 && isAbsolute) {
|
389
|
+
ret.name = pathArg.slice(1, startDot);
|
390
|
+
ret.base = pathArg.slice(1, end);
|
391
|
+
}
|
392
|
+
else {
|
393
|
+
ret.name = pathArg.slice(startPart, startDot);
|
394
|
+
ret.base = pathArg.slice(startPart, end);
|
395
|
+
}
|
396
|
+
ret.ext = pathArg.slice(startDot, end);
|
397
|
+
}
|
398
|
+
if (startPart > 0)
|
399
|
+
ret.dir = pathArg.slice(0, startPart - 1);
|
400
|
+
else if (isAbsolute)
|
401
|
+
ret.dir = '/';
|
402
|
+
return ret;
|
403
|
+
},
|
404
|
+
sep: '/',
|
405
|
+
delimiter: ':',
|
406
|
+
win32: {
|
407
|
+
normalize: (p) => {
|
408
|
+
return p;
|
409
|
+
}
|
410
|
+
},
|
411
|
+
posix: null
|
412
|
+
};
|
413
|
+
;
|
414
|
+
({}); // @--end-of-file-for-module=tnp-core lib/node-path-mock.ts
|
415
415
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1wYXRoLW1vY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90bXAtbGlicy1mb3ItYnVuZGxlLXdlYnNxbC90bnAtY29yZS9wcm9qZWN0cy90bnAtY29yZS9zcmMvbGliL25vZGUtcGF0aC1tb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLFNBQVMsVUFBVSxDQUFDLElBQUk7SUFDdEIsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7UUFDNUIsTUFBTSxJQUFJLFNBQVMsQ0FBQyxpREFBaUQsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDL0Y7QUFDSCxDQUFDO0FBR0QsU0FBUyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsY0FBYztJQUNoRCxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDYixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQztJQUMxQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuQixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixJQUFJLElBQUksQ0FBQztJQUNULEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3JDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNO1lBQ2pCLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3ZCLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQyxLQUFLO1lBQ3hCLE1BQU07O1lBRU4sSUFBSSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDbEIsSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRTtZQUNyQixJQUFJLFNBQVMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7YUFFdEM7aUJBQU0sSUFBSSxTQUFT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UyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUM5QyxHQUFHLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQzFDO1lBQ0QsR0FBRyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUN4QztRQUVELElBQUksU0FBUyxHQUFHLENBQUM7WUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUFNLElBQUksVUFBVTtZQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBRWpHLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELEdBQUcsRUFBRSxHQUFHO0lBQ1IsU0FBUyxFQUFFLEdBQUc7SUFDZCxLQUFLLEVBQUU7UUFDTCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNmLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztLQUNGO0lBQ0QsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBR0QsQ0FBQztBQUFBLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQywyREFBMkQiLCJzb3VyY2VzQ29udGVudCI6WyJcbmZ1bmN0aW9uIGFzc2VydFBhdGgocGF0aCkge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignW2ZpcmVkZXYtY29yZV0gUGF0aCBtdXN0IGJlIGEgc3RyaW5nLiBSZWNlaXZlZCAnICsgSlNPTi5zdHJpbmdpZnkocGF0aCkpO1xuICB9XG59XG5cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nUG9zaXgocGF0aCwgYWxsb3dBYm92ZVJvb3QpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICB2YXIgbGFzdFNlZ21lbnRMZW5ndGggPSAwO1xuICB2YXIgbGFzdFNsYXNoID0gLTE7XG4gIHZhciBkb3RzID0gMDtcbiAgdmFyIGNvZGU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDw9IHBhdGgubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoaSA8IHBhdGgubGVuZ3RoKVxuICAgICAgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICBlbHNlIGlmIChjb2RlID09PSA0NyAvKi8qLylcbiAgICAgIGJyZWFrO1xuICAgIGVsc2VcbiAgICAgIGNvZGUgPSA0NyAvKi8qLztcbiAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgIGlmIChsYXN0U2xhc2ggPT09IGkgLSAxIHx8IGRvdHMgPT09IDEpIHtcblxuICAgICAgfSBlbHNlIGlmIChsYXN0U2xhc2ggIT09IGkgLSAxICYmIGRvdHMgPT09IDIpIHtcbiAgICAgICAgaWYgKHJlcy5sZW5ndGggPCAyIHx8IGxhc3RTZWdtZW50TGVuZ3RoICE9PSAyIHx8IHJlcy5jaGFyQ29kZUF0KHJlcy5sZW5ndGggLSAxKSAhPT0gNDYgLyouKi8gfHwgcmVzLmNoYXJDb2RlQXQocmVzLmxlbmd0aCAtIDIpICE9PSA0NiAvKi4qLykge1xuICAgICAgICAgIGlmIChyZXMubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgdmFyIGxhc3RTbGFzaEluZGV4ID0gcmVzLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggIT09IHJlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGlmIChsYXN0U2xhc2hJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXMgPSAnJztcbiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzID0gcmVzLnNsaWNlKDAsIGxhc3RTbGFzaEluZGV4KTtcbiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IHJlcy5sZW5ndGggLSAxIC0gcmVzLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGFzdFNsYXNoID0gaTtcbiAgICAgICAgICAgICAgZG90cyA9IDA7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmxlbmd0aCA9PT0gMiB8fCByZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXMgPSAnJztcbiAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGxhc3RTbGFzaCA9IGk7XG4gICAgICAgICAgICBkb3RzID0gMDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxsb3dBYm92ZVJvb3QpIHtcbiAgICAgICAgICBpZiAocmVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXMgKz0gJy8uLic7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVzID0gJy4uJztcbiAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChyZXMubGVuZ3RoID4gMClcbiAgICAgICAgICByZXMgKz0gJy8nICsgcGF0aC5zbGljZShsYXN0U2xhc2ggKyAxLCBpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJlcyA9IHBhdGguc2xpY2UobGFzdFNsYXNoICsgMSwgaSk7XG4gICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gaSAtIGxhc3RTbGFzaCAtIDE7XG4gICAgICB9XG4gICAgICBsYXN0U2xhc2ggPSBpO1xuICAgICAgZG90cyA9IDA7XG4gICAgfSBlbHNlIGlmIChjb2RlID09PSA0NiAvKi4qLyAmJiBkb3RzICE9PSAtMSkge1xuICAgICAgKytkb3RzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb3RzID0gLTE7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIF9mb3JtYXQoc2VwLCBwYXRoT2JqZWN0KSB7XG4gIHZhciBkaXIgPSBwYXRoT2JqZWN0LmRpciB8fCBwYXRoT2JqZWN0LnJvb3Q7XG4gIHZhciBiYXNlID0gcGF0aE9iamVjdC5iYXNlIHx8IChwYXRoT2JqZWN0Lm5hbWUgfHwgJycpICsgKHBhdGhPYmplY3QuZXh0IHx8ICcnKTtcbiAgaWYgKCFkaXIpIHtcbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuICBpZiAoZGlyID09PSBwYXRoT2JqZWN0LnJvb3QpIHtcbiAgICByZXR1cm4gZGlyICsgYmFzZTtcbiAgfVxuICByZXR1cm4gZGlyICsgc2VwICsgYmFzZTtcbn1cblxuZXhwb3J0IGNvbnN0IHBhdGggPSB7XG5cbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZShwYXRoVG9SZXNvdmxlKSB7XG4gICAgcmV0dXJuIHBhdGhUb1Jlc292bGU7XG4gIH0sXG5cbiAgbm9ybWFsaXplOiBmdW5jdGlvbiBub3JtYWxpemUocGF0aEFyZykge1xuICAgIGFzc2VydFBhdGgocGF0aEFyZyk7XG5cbiAgICBpZiAocGF0aEFyZy5sZW5ndGggPT09IDApIHJldHVybiAnLic7XG5cbiAgICB2YXIgaXNBYnNvbHV0ZSA9IHBhdGhBcmcuY2hhckNvZGVBdCgwKSA9PT0gNDcgLyovKi87XG4gICAgdmFyIHRyYWlsaW5nU2VwYXJhdG9yID0gcGF0aEFyZy5jaGFyQ29kZUF0KHBhdGhBcmcubGVuZ3RoIC0gMSkgPT09IDQ3IC8qLyovO1xuXG5cbiAgICBwYXRoQXJnID0gbm9ybWFsaXplU3RyaW5nUG9zaXgocGF0aEFyZywgIWlzQWJzb2x1dGUpO1xuXG4gICAgaWYgKHBhdGhBcmcubGVuZ3RoID09PSAwICYmICFpc0Fic29sdXRlKSBwYXRoQXJnID0gJy4nO1xuICAgIGlmIChwYXRoQXJnLmxlbmd0aCA+IDAgJiYgdHJhaWxpbmdTZXBhcmF0b3IpIHBhdGhBcmcgKz0gJy8nO1xuXG4gICAgaWYgKGlzQWJzb2x1dGUpIHJldHVybiAnLycgKyBwYXRoQXJnO1xuICAgIHJldHVybiBwYXRoQXJnO1xuICB9LFxuXG4gIGlzQWJzb2x1dGU6IGZ1bmN0aW9uIGlzQWJzb2x1dGUocGF0aEFyZykge1xuICAgIGFzc2VydFBhdGgocGF0aEFyZyk7XG4gICAgcmV0dXJuIHBhdGhBcmcubGVuZ3RoID4gMCAmJiBwYXRoQXJnLmNoYXJDb2RlQXQoMCkgPT09IDQ3IC8qLyovO1xuICB9LFxuXG4gIGpvaW46IGZ1bmN0aW9uIGpvaW4oKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm4gJy4nO1xuICAgIHZhciBqb2luZWQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBhcmcgPSBhcmd1bWVudHNbaV07XG4gICAgICBhc3NlcnRQYXRoKGFyZyk7XG4gICAgICBpZiAoYXJnLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGpvaW5lZCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgIGpvaW5lZCA9IGFyZztcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGpvaW5lZCArPSAnLycgKyBhcmc7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChqb2luZWQgPT09IHVuZGVmaW5lZClcbiAgICAgIHJldHVybiAnLic7XG4gICAgcmV0dXJuIHBhdGgubm9ybWFsaXplKGpvaW5lZCk7XG4gIH0sXG5cbiAgcmVsYXRpdmU6IGZ1bmN0aW9uIHJlbGF0aXZlKGZyb20sIHRvKSB7XG4gICAgYXNzZXJ0UGF0aChmcm9tKTtcbiAgICBhc3NlcnRQYXRoKHRvKTtcblxuICAgIGlmIChmcm9tID09PSB0bykgcmV0dXJuICcnO1xuXG4gICAgZnJvbSA9IHBhdGgucmVzb2x2ZShmcm9tKTtcbiAgICB0byA9IHBhdGgucmVzb2x2ZSh0byk7XG5cbiAgICBpZiAoZnJvbSA9PT0gdG8pIHJldHVybiAnJztcblxuXG4gICAgdmFyIGZyb21TdGFydCA9IDE7XG4gICAgZm9yICg7IGZyb21TdGFydCA8IGZyb20ubGVuZ3RoOyArK2Zyb21TdGFydCkge1xuICAgICAgaWYgKGZyb20uY2hhckNvZGVBdChmcm9tU3RhcnQpICE9PSA0NyAvKi8qLylcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHZhciBmcm9tRW5kID0gZnJvbS5sZW5ndGg7XG4gICAgdmFyIGZyb21MZW4gPSBmcm9tRW5kIC0gZnJvbVN0YXJ0O1xuXG5cbiAgICB2YXIgdG9TdGFydCA9IDE7XG4gICAgZm9yICg7IHRvU3RhcnQgPCB0by5sZW5ndGg7ICsrdG9TdGFydCkge1xuICAgICAgaWYgKHRvLmNoYXJDb2RlQXQodG9TdGFydCkgIT09IDQ3IC8qLyovKVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIHRvRW5kID0gdG8ubGVuZ3RoO1xuICAgIHZhciB0b0xlbiA9IHRvRW5kIC0gdG9TdGFydDtcblxuXG4gICAgdmFyIGxlbmd0aCA9IGZyb21MZW4gPCB0b0xlbiA/IGZyb21MZW4gOiB0b0xlbjtcbiAgICB2YXIgbGFzdENvbW1vblNlcCA9IC0xO1xuICAgIHZhciBpID0gMDtcbiAgICBmb3IgKDsgaSA8PSBsZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGkgPT09IGxlbmd0aCkge1xuICAgICAgICBpZiAodG9MZW4gPiBsZW5ndGgpIHtcbiAgICAgICAgICBpZiAodG8uY2hhckNvZGVBdCh0b1N0YXJ0ICsgaSkgPT09IDQ3IC8qLyovKSB7XG5cblxuICAgICAgICAgICAgcmV0dXJuIHRvLnNsaWNlKHRvU3RhcnQgKyBpICsgMSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpID09PSAwKSB7XG5cblxuICAgICAgICAgICAgcmV0dXJuIHRvLnNsaWNlKHRvU3RhcnQgKyBpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZnJvbUxlbiA+IGxlbmd0aCkge1xuICAgICAgICAgIGlmIChmcm9tLmNoYXJDb2RlQXQoZnJvbVN0YXJ0ICsgaSkgPT09IDQ3IC8qLyovKSB7XG5cblxuICAgICAgICAgICAgbGFzdENvbW1vblNlcCA9IGk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpID09PSAwKSB7XG5cblxuICAgICAgICAgICAgbGFzdENvbW1vblNlcCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIGZyb21Db2RlID0gZnJvbS5jaGFyQ29kZUF0KGZyb21TdGFydCArIGkpO1xuICAgICAgdmFyIHRvQ29kZSA9IHRvLmNoYXJDb2RlQXQodG9TdGFydCArIGkpO1xuICAgICAgaWYgKGZyb21Db2RlICE9PSB0b0NvZGUpXG4gICAgICAgIGJyZWFrO1xuICAgICAgZWxzZSBpZiAoZnJvbUNvZGUgPT09IDQ3IC8qLyovKVxuICAgICAgICBsYXN0Q29tbW9uU2VwID0gaTtcbiAgICB9XG5cbiAgICB2YXIgb3V0ID0gJyc7XG5cblxuICAgIGZvciAoaSA9IGZyb21TdGFydCArIGxhc3RDb21tb25TZXAgKyAxOyBpIDw9IGZyb21FbmQ7ICsraSkge1xuICAgICAgaWYgKGkgPT09IGZyb21FbmQgfHwgZnJvbS5jaGFyQ29kZUF0KGkpID09PSA0NyAvKi8qLykge1xuICAgICAgICBpZiAob3V0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICBvdXQgKz0gJy4uJztcbiAgICAgICAgZWxzZVxuICAgICAgICAgIG91dCArPSAnLy4uJztcbiAgICAgIH1cbiAgICB9XG5cblxuXG4gICAgaWYgKG91dC5sZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIG91dCArIHRvLnNsaWNlKHRvU3RhcnQgKyBsYXN0Q29tbW9uU2VwKTtcbiAgICBlbHNlIHtcbiAgICAgIHRvU3RhcnQgKz0gbGFzdENvbW1vblNlcDtcbiAgICAgIGlmICh0by5jaGFyQ29kZUF0KHRvU3RhcnQpID09PSA0NyAvKi8qLylcbiAgICAgICAgKyt0b1N0YXJ0O1xuICAgICAgcmV0dXJuIHRvLnNsaWNlKHRvU3RhcnQpO1xuICAgIH1cbiAgfSxcblxuICBfbWFrZUxvbmc6IGZ1bmN0aW9uIF9tYWtlTG9uZyhwYXRoKSB7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH0sXG5cbiAgZGlybmFtZTogZnVuY3Rpb24gZGlybmFtZShwYXRoKSB7XG4gICAgYXNzZXJ0UGF0aChwYXRoKTtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiAnLic7XG4gICAgdmFyIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoMCk7XG4gICAgdmFyIGhhc1Jvb3QgPSBjb2RlID09PSA0NyAvKi8qLztcbiAgICB2YXIgZW5kID0gLTE7XG4gICAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gICAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAxOyAtLWkpIHtcbiAgICAgIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7XG4gICAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICBlbmQgPSBpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbmQgPT09IC0xKSByZXR1cm4gaGFzUm9vdCA/ICcvJyA6ICcuJztcbiAgICBpZiAoaGFzUm9vdCAmJiBlbmQgPT09IDEpIHJldHVybiAnLy8nO1xuICAgIHJldHVybiBwYXRoLnNsaWNlKDAsIGVuZCk7XG4gIH0sXG5cbiAgYmFzZW5hbWU6IGZ1bmN0aW9uIGJhc2VuYW1lKHBhdGhBcmcsIGV4dCkge1xuICAgIGlmIChleHQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZXh0ICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJleHRcIiBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgYXNzZXJ0UGF0aChwYXRoQXJnKTtcblxuICAgIHZhciBzdGFydCA9IDA7XG4gICAgdmFyIGVuZCA9IC0xO1xuICAgIHZhciBtYXRjaGVkU2xhc2ggPSB0cnVlO1xuICAgIHZhciBpO1xuXG4gICAgaWYgKGV4dCAhPT0gdW5kZWZpbmVkICYmIGV4dC5sZW5ndGggPiAwICYmIGV4dC5sZW5ndGggPD0gcGF0aEFyZy5sZW5ndGgpIHtcbiAgICAgIGlmIChleHQubGVuZ3RoID09PSBwYXRoQXJnLmxlbmd0aCAmJiBleHQgPT09IHBhdGhBcmcpIHJldHVybiAnJztcbiAgICAgIHZhciBleHRJZHggPSBleHQubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBmaXJzdE5vblNsYXNoRW5kID0gLTE7XG4gICAgICBmb3IgKGkgPSBwYXRoQXJnLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBjb2RlID0gcGF0aEFyZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcblxuXG4gICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGZpcnN0Tm9uU2xhc2hFbmQgPT09IC0xKSB7XG5cblxuICAgICAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICAgICAgICBmaXJzdE5vblNsYXNoRW5kID0gaSArIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChleHRJZHggPj0gMCkge1xuXG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gZXh0LmNoYXJDb2RlQXQoZXh0SWR4KSkge1xuICAgICAgICAgICAgICBpZiAoLS1leHRJZHggPT09IC0xKSB7XG5cblxuICAgICAgICAgICAgICAgIGVuZCA9IGk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cblxuICAgICAgICAgICAgICBleHRJZHggPSAtMTtcbiAgICAgICAgICAgICAgZW5kID0gZmlyc3ROb25TbGFzaEVuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIGVuZCA9IGZpcnN0Tm9uU2xhc2hFbmQ7IGVsc2UgaWYgKGVuZCA9PT0gLTEpIGVuZCA9IHBhdGhBcmcubGVuZ3RoO1xuICAgICAgcmV0dXJuIHBhdGhBcmcuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSA9IHBhdGhBcmcubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgaWYgKHBhdGhBcmcuY2hhckNvZGVBdChpKSA9PT0gNDcgLyovKi8pIHtcblxuXG4gICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZW5kID09PSAtMSkge1xuXG5cbiAgICAgICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTtcbiAgICAgICAgICBlbmQgPSBpICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZW5kID09PSAtMSkgcmV0dXJuICcnO1xuICAgICAgcmV0dXJuIHBhdGhBcmcuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgfVxuICB9LFxuXG4gIGV4dG5hbWU6IGZ1bmN0aW9uIGV4dG5hbWUocGF0aEFyZykge1xuICAgIGFzc2VydFBhdGgocGF0aEFyZyk7XG4gICAgdmFyIHN0YXJ0RG90ID0gLTE7XG4gICAgdmFyIHN0YXJ0UGFydCA9IDA7XG4gICAgdmFyIGVuZCA9IC0xO1xuICAgIHZhciBtYXRjaGVkU2xhc2ggPSB0cnVlO1xuXG5cbiAgICB2YXIgcHJlRG90U3RhdGUgPSAwO1xuICAgIGZvciAodmFyIGkgPSBwYXRoQXJnLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB2YXIgY29kZSA9IHBhdGhBcmcuY2hhckNvZGVBdChpKTtcbiAgICAgIGlmIChjb2RlID09PSA0NyAvKi8qLykge1xuXG5cbiAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICBzdGFydFBhcnQgPSBpICsgMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgPT09IC0xKSB7XG5cblxuICAgICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTtcbiAgICAgICAgZW5kID0gaSArIDE7XG4gICAgICB9XG4gICAgICBpZiAoY29kZSA9PT0gNDYgLyouKi8pIHtcblxuICAgICAgICBpZiAoc3RhcnREb3QgPT09IC0xKVxuICAgICAgICAgIHN0YXJ0RG90ID0gaTtcbiAgICAgICAgZWxzZSBpZiAocHJlRG90U3RhdGUgIT09IDEpXG4gICAgICAgICAgcHJlRG90U3RhdGUgPSAxO1xuICAgICAgfSBlbHNlIGlmIChzdGFydERvdCAhPT0gLTEpIHtcblxuXG4gICAgICAgIHByZURvdFN0YXRlID0gLTE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0RG90ID09PSAtMSB8fCBlbmQgPT09IC0xIHx8XG5cbiAgICAgIHByZURvdFN0YXRlID09PSAwIHx8XG5cbiAgICAgIHByZURvdFN0YXRlID09PSAxICYmIHN0YXJ0RG90ID09PSBlbmQgLSAxICYmIHN0YXJ0RG90ID09PSBzdGFydFBhcnQgKyAxKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBwYXRoQXJnLnNsaWNlKHN0YXJ0RG90LCBlbmQpO1xuICB9LFxuXG4gIGZvcm1hdDogZnVuY3Rpb24gZm9ybWF0KHBhdGhPYmplY3QpIHtcbiAgICBpZiAocGF0aE9iamVjdCA9PT0gbnVsbCB8fCB0eXBlb2YgcGF0aE9iamVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInBhdGhPYmplY3RcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgcGF0aE9iamVjdCk7XG4gICAgfVxuICAgIHJldHVybiBfZm9ybWF0KCcvJywgcGF0aE9iamVjdCk7XG4gIH0sXG5cbiAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKHBhdGhBcmcpIHtcbiAgICBhc3NlcnRQYXRoKHBhdGhBcmcpO1xuXG4gICAgdmFyIHJldCA9IHsgcm9vdDogJycsIGRpcjogJycsIGJhc2U6ICcnLCBleHQ6ICcnLCBuYW1lOiAnJyB9O1xuICAgIGlmIChwYXRoQXJnLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHJldDtcbiAgICB2YXIgY29kZSA9IHBhdGhBcmcuY2hhckNvZGVBdCgwKTtcbiAgICB2YXIgaXNBYnNvbHV0ZSA9IGNvZGUgPT09IDQ3IC8qLyovO1xuICAgIHZhciBzdGFydDtcbiAgICBpZiAoaXNBYnNvbHV0ZSkge1xuICAgICAgcmV0LnJvb3QgPSAnLyc7XG4gICAgICBzdGFydCA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9XG4gICAgdmFyIHN0YXJ0RG90ID0gLTE7XG4gICAgdmFyIHN0YXJ0UGFydCA9IDA7XG4gICAgdmFyIGVuZCA9IC0xO1xuICAgIHZhciBtYXRjaGVkU2xhc2ggPSB0cnVlO1xuICAgIHZhciBpID0gcGF0aEFyZy5sZW5ndGggLSAxO1xuXG5cblxuICAgIHZhciBwcmVEb3RTdGF0ZSA9IDA7XG5cblxuICAgIGZvciAoOyBpID49IHN0YXJ0OyAtLWkpIHtcbiAgICAgIGNvZGUgPSBwYXRoQXJnLmNoYXJDb2RlQXQoaSk7XG4gICAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcblxuXG4gICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgc3RhcnRQYXJ0ID0gaSArIDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZW5kID09PSAtMSkge1xuXG5cbiAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICAgIGVuZCA9IGkgKyAxO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGUgPT09IDQ2IC8qLiovKSB7XG5cbiAgICAgICAgaWYgKHN0YXJ0RG90ID09PSAtMSkgc3RhcnREb3QgPSBpOyBlbHNlIGlmIChwcmVEb3RTdGF0ZSAhPT0gMSkgcHJlRG90U3RhdGUgPSAxO1xuICAgICAgfSBlbHNlIGlmIChzdGFydERvdCAhPT0gLTEpIHtcblxuXG4gICAgICAgIHByZURvdFN0YXRlID0gLTE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0RG90ID09PSAtMSB8fCBlbmQgPT09IC0xIHx8XG5cbiAgICAgIHByZURvdFN0YXRlID09PSAwIHx8XG5cbiAgICAgIHByZURvdFN0YXRlID09PSAxICYmIHN0YXJ0RG90ID09PSBlbmQgLSAxICYmIHN0YXJ0RG90ID09PSBzdGFydFBhcnQgKyAxKSB7XG4gICAgICBpZiAoZW5kICE9PSAtMSkge1xuICAgICAgICBpZiAoc3RhcnRQYXJ0ID09PSAwICYmIGlzQWJzb2x1dGUpIHJldC5iYXNlID0gcmV0Lm5hbWUgPSBwYXRoQXJnLnNsaWNlKDEsIGVuZCk7IGVsc2UgcmV0LmJhc2UgPSByZXQubmFtZSA9IHBhdGhBcmcuc2xpY2Uoc3RhcnRQYXJ0LCBlbmQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhcnRQYXJ0ID09PSAwICYmIGlzQWJzb2x1dGUpIHtcbiAgICAgICAgcmV0Lm5hbWUgPSBwYXRoQXJnLnNsaWNlKDEsIHN0YXJ0RG90KTtcbiAgICAgICAgcmV0LmJhc2UgPSBwYXRoQXJnLnNsaWNlKDEsIGVuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQubmFtZSA9IHBhdGhBcmcuc2xpY2Uoc3RhcnRQYXJ0LCBzdGFydERvdCk7XG4gICAgICAgIHJldC5iYXNlID0gcGF0aEFyZy5zbGljZShzdGFydFBhcnQsIGVuZCk7XG4gICAgICB9XG4gICAgICByZXQuZXh0ID0gcGF0aEFyZy5zbGljZShzdGFydERvdCwgZW5kKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnRQYXJ0ID4gMCkgcmV0LmRpciA9IHBhdGhBcmcuc2xpY2UoMCwgc3RhcnRQYXJ0IC0gMSk7IGVsc2UgaWYgKGlzQWJzb2x1dGUpIHJldC5kaXIgPSAnLyc7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuXG4gIHNlcDogJy8nLFxuICBkZWxpbWl0ZXI6ICc6JyxcbiAgd2luMzI6IHsgLy8gQHRzLWlnbm9yZVxuICAgIG5vcm1hbGl6ZTogKHApID0+IHtcbiAgICAgIHJldHVybiBwO1xuICAgIH1cbiAgfSxcbiAgcG9zaXg6IG51bGxcbn07XG5cblxuIDsoe30pOyAvLyBALS1lbmQtb2YtZmlsZS1mb3ItbW9kdWxlPXRucC1jb3JlIGxpYi9ub2RlLXBhdGgtbW9jay50cyJdfQ==
|