ng2-rest 13.0.30 → 13.0.34
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/app.d.ts +1 -0
- package/app.js +6 -165
- package/app.js.map +1 -1
- package/index.js +1 -1
- package/lib/content-type.js +1 -1
- package/lib/cookie.js +1 -1
- package/lib/helpers.js +1 -1
- package/lib/index.js +1 -1
- package/lib/mapping.js +1 -1
- package/lib/models.js +1 -1
- package/lib/other/simple-resource.js +1 -1
- package/lib/params.js +1 -1
- package/lib/request-cache.js +1 -1
- package/lib/resource.service.js +1 -1
- package/lib/rest-headers.js +1 -1
- package/lib/rest-request.js +1 -1
- package/lib/rest.class.js +1 -1
- package/package.json +4 -4
- package/tmp-environment.json +30 -31
- package/websql/README.md +24 -0
- package/websql/esm2020/lib/content-type.mjs +12 -0
- package/websql/esm2020/lib/cookie.mjs +27 -0
- package/websql/esm2020/lib/helpers.mjs +22 -0
- package/websql/esm2020/lib/index.mjs +11 -0
- package/websql/esm2020/lib/mapping.mjs +271 -0
- package/websql/esm2020/lib/models.mjs +142 -0
- package/websql/esm2020/lib/other/simple-resource.mjs +117 -0
- package/websql/esm2020/lib/params.mjs +305 -0
- package/websql/esm2020/lib/request-cache.mjs +95 -0
- package/websql/esm2020/lib/resource.service.mjs +255 -0
- package/websql/esm2020/lib/rest-headers.mjs +129 -0
- package/websql/esm2020/lib/rest-request.mjs +354 -0
- package/websql/esm2020/lib/rest.class.mjs +125 -0
- package/websql/esm2020/ng2-rest.mjs +5 -0
- package/websql/esm2020/public-api.mjs +2 -0
- package/websql/fesm2015/ng2-rest.mjs +1826 -0
- package/websql/fesm2015/ng2-rest.mjs.map +1 -0
- package/websql/fesm2020/ng2-rest.mjs +1823 -0
- package/websql/fesm2020/ng2-rest.mjs.map +1 -0
- package/websql/lib/content-type.d.ts +5 -0
- package/websql/lib/cookie.d.ts +8 -0
- package/websql/lib/helpers.d.ts +11 -0
- package/websql/lib/index.d.ts +10 -0
- package/websql/lib/mapping.d.ts +13 -0
- package/websql/lib/models.d.ts +156 -0
- package/websql/lib/other/simple-resource.d.ts +30 -0
- package/websql/lib/params.d.ts +24 -0
- package/websql/lib/request-cache.d.ts +14 -0
- package/websql/lib/resource.service.d.ts +44 -0
- package/websql/lib/rest-headers.d.ts +58 -0
- package/websql/lib/rest-request.d.ts +22 -0
- package/websql/lib/rest.class.d.ts +37 -0
- package/websql/ng2-rest.d.ts +5 -0
- package/websql/package.json +31 -0
- package/websql/public-api.d.ts +1 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { diffChars } from 'diff';
|
|
2
|
+
import { _ } from 'tnp-core/websql';
|
|
3
|
+
import { Log, Level } from 'ng2-logger/websql';
|
|
4
|
+
import { Helpers } from './helpers';
|
|
5
|
+
const log = Log.create('[ng2-rest] params', Level.__NOTHING);
|
|
6
|
+
/** check if string is a valid pattern */
|
|
7
|
+
export function isValid(pattern) {
|
|
8
|
+
return (new RegExp('\/:[a-zA-Z]*', 'g')).test(pattern.replace('://', ''));
|
|
9
|
+
}
|
|
10
|
+
export function check(url, pattern) {
|
|
11
|
+
if (!Helpers.checkValidUrl(url)) {
|
|
12
|
+
log.error(`Incorrect url: ${url}`);
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
if (url.charAt(url.length - 1) === '/')
|
|
16
|
+
url = url.slice(0, url.length - 2);
|
|
17
|
+
if (pattern.charAt(pattern.length - 1) === '/')
|
|
18
|
+
pattern = pattern.slice(0, url.length - 2);
|
|
19
|
+
pattern = pattern.replace(/\//g, '\/');
|
|
20
|
+
pattern = pattern.replace(new RegExp('\/:[a-zA-Z]*', 'g'), '.+');
|
|
21
|
+
let reg = new RegExp(pattern, 'g');
|
|
22
|
+
return reg.test(url);
|
|
23
|
+
}
|
|
24
|
+
export function getModels(pattern) {
|
|
25
|
+
let m = pattern.match(new RegExp('[a-z-A-Z]*\/:', 'g'));
|
|
26
|
+
return m.map(p => p.replace('/:', ''));
|
|
27
|
+
}
|
|
28
|
+
export function getRestPramsNames(pattern) {
|
|
29
|
+
if (pattern.charAt(pattern.length - 1) !== '/')
|
|
30
|
+
pattern = `${pattern}/`;
|
|
31
|
+
let m = pattern.match(new RegExp(':[a-zA-Z]*\/', 'g'));
|
|
32
|
+
let res = m.map(p => p.replace(':', '').replace('/', ''));
|
|
33
|
+
return res.filter(p => p.trim() !== '');
|
|
34
|
+
}
|
|
35
|
+
export function containsModels(url, models) {
|
|
36
|
+
if (url.charAt(0) !== '/')
|
|
37
|
+
url = '/' + url;
|
|
38
|
+
// url = url.replace(new RegExp('\/', 'g'), '');
|
|
39
|
+
let res = models.filter(m => {
|
|
40
|
+
let word = '/' + m;
|
|
41
|
+
// log.d('word', word)
|
|
42
|
+
let iii = url.indexOf(word);
|
|
43
|
+
// log.d('iii', iii)
|
|
44
|
+
if (iii + word.length < url.length && url.charAt(iii + word.length) !== '/') {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
if (iii !== -1) {
|
|
48
|
+
url = url.replace(new RegExp('\/' + m, 'g'), '');
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}).length;
|
|
53
|
+
// log.d('containsModels', res);
|
|
54
|
+
return res === models.length;
|
|
55
|
+
}
|
|
56
|
+
export function stars(n) {
|
|
57
|
+
let res = '';
|
|
58
|
+
for (let i = 0; i < n; i++)
|
|
59
|
+
res += '*';
|
|
60
|
+
return res;
|
|
61
|
+
}
|
|
62
|
+
export function getRestParams(url, pattern) {
|
|
63
|
+
let res = {};
|
|
64
|
+
let models = getRestPramsNames(pattern);
|
|
65
|
+
// log.d('models', models);
|
|
66
|
+
models.forEach(m => {
|
|
67
|
+
pattern = pattern.replace(`:${m}`, stars(m.length));
|
|
68
|
+
});
|
|
69
|
+
let currentModel = void 0;
|
|
70
|
+
diffChars(pattern, url).forEach(d => {
|
|
71
|
+
// log.d('d', d);
|
|
72
|
+
if (d.added) {
|
|
73
|
+
if (!isNaN(Number(d.value)))
|
|
74
|
+
res[currentModel] = Number(d.value);
|
|
75
|
+
else if (d.value.trim() === 'true')
|
|
76
|
+
res[currentModel] = true;
|
|
77
|
+
else if (d.value.trim() === 'false')
|
|
78
|
+
res[currentModel] = false;
|
|
79
|
+
else
|
|
80
|
+
res[currentModel] = decodeURIComponent(d.value);
|
|
81
|
+
currentModel = void 0;
|
|
82
|
+
}
|
|
83
|
+
let m = d.value.replace(':', "");
|
|
84
|
+
// log.d('model m', m)
|
|
85
|
+
if (d.removed) {
|
|
86
|
+
currentModel = models.shift();
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
return res;
|
|
90
|
+
}
|
|
91
|
+
export const regexisPath = /[^\..]+(\.[^\..]+)+/g;
|
|
92
|
+
/**
|
|
93
|
+
* Models like books/:id
|
|
94
|
+
*/
|
|
95
|
+
function cutUrlModel(params, models, output) {
|
|
96
|
+
if (models.length === 0)
|
|
97
|
+
return output.join('\/');
|
|
98
|
+
let m = models.pop();
|
|
99
|
+
let param = m.match(/:[a-zA-Z0-9\.]+/)[0].replace(':', '');
|
|
100
|
+
const paramIsPath = regexisPath.test(param);
|
|
101
|
+
// log.i('cut param', param)
|
|
102
|
+
let model = m.match(/[a-zA-Z0-9]+\//)[0].replace('\/', '');
|
|
103
|
+
if (params === void 0 ||
|
|
104
|
+
(paramIsPath ? _.get(params, param) === void 0 : params[param] === void 0) ||
|
|
105
|
+
param === 'undefined') {
|
|
106
|
+
output.length = 0;
|
|
107
|
+
output.unshift(model);
|
|
108
|
+
return cutUrlModel(params, models, output);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
if (paramIsPath) {
|
|
112
|
+
// log.i('param is path', param)
|
|
113
|
+
let mrep = m.replace(new RegExp(`:${param}`, 'g'), `${_.get(params, param)}`);
|
|
114
|
+
output.unshift(mrep);
|
|
115
|
+
return cutUrlModel(params, models, output);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
// log.i('param is normal', param)
|
|
119
|
+
let mrep = m.replace(new RegExp(`:${param}`, 'g'), `${params[param]}`);
|
|
120
|
+
output.unshift(mrep);
|
|
121
|
+
return cutUrlModel(params, models, output);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
export function interpolateParamsToUrl(params, url) {
|
|
126
|
+
const regexInt = /\[\[([^\..]+\.[^\..]+)+\]\]/g;
|
|
127
|
+
url = url.split('/').map(p => {
|
|
128
|
+
// log.d('url parts', p)
|
|
129
|
+
let isParam = p.startsWith(':');
|
|
130
|
+
if (isParam) {
|
|
131
|
+
let part = p.slice(1);
|
|
132
|
+
// log.d('url param part', p)
|
|
133
|
+
if (regexInt.test(part)) {
|
|
134
|
+
// let level = (url.split('.').length - 1)
|
|
135
|
+
part = part.replace('[[', '');
|
|
136
|
+
part = part.replace(']]', '');
|
|
137
|
+
}
|
|
138
|
+
return `:${part}`;
|
|
139
|
+
}
|
|
140
|
+
return p;
|
|
141
|
+
}).join('/');
|
|
142
|
+
// log.i('URL TO EXPOSE', url)
|
|
143
|
+
// log.i('params', params)
|
|
144
|
+
let slash = {
|
|
145
|
+
start: url.charAt(0) === '\/',
|
|
146
|
+
end: url.charAt(url.length - 1) === '\/'
|
|
147
|
+
};
|
|
148
|
+
let morePramsOnEnd = url.match(/(\/:[a-zA-Z0-9\.]+){2,10}/g);
|
|
149
|
+
if (morePramsOnEnd && (Array.isArray(morePramsOnEnd) && morePramsOnEnd.length === 1)) {
|
|
150
|
+
// log.i('morePramsOnEnd', morePramsOnEnd)
|
|
151
|
+
let m = morePramsOnEnd[0];
|
|
152
|
+
let match = m.match(/\/:[a-zA-Z0-9\.]+/g);
|
|
153
|
+
// log.i('match', match)
|
|
154
|
+
match.forEach(e => {
|
|
155
|
+
let c = e.replace('\/:', '');
|
|
156
|
+
// log.i('c', c)
|
|
157
|
+
if (regexisPath.test(c)) {
|
|
158
|
+
url = url.replace(e, `/${_.get(params, c)}`);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
url = url.replace(e, `/${params[c]}`);
|
|
162
|
+
}
|
|
163
|
+
// log.i('prog url', url)
|
|
164
|
+
});
|
|
165
|
+
return url;
|
|
166
|
+
}
|
|
167
|
+
let nestedParams = url.match(/[a-zA-Z0-9]+\/:[a-zA-Z0-9\.]+/g);
|
|
168
|
+
if (!nestedParams || (Array.isArray(nestedParams) && nestedParams.length === 0))
|
|
169
|
+
return url;
|
|
170
|
+
// check alone params
|
|
171
|
+
if (!slash.end)
|
|
172
|
+
url = `${url}/`;
|
|
173
|
+
let addUndefinedForAlone = (!/:[a-zA-Z0-9\.]+\/$/g.test(url) && /[a-zA-Z0-9]+\/$/g.test(url));
|
|
174
|
+
let replace = (nestedParams.length > 1 ? nestedParams.join('\/') : nestedParams[0]) +
|
|
175
|
+
(addUndefinedForAlone ? '\/' + url.match(/[a-zA-Z0-9]+\/$/g)[0] : '\/');
|
|
176
|
+
let beginHref = url.replace(replace, '');
|
|
177
|
+
if (addUndefinedForAlone) {
|
|
178
|
+
url = url.replace(/\/$/g, '/:undefined');
|
|
179
|
+
nestedParams = url.match(/[a-zA-Z0-9]+\/:[a-zA-Z0-9\.]+/g);
|
|
180
|
+
url = cutUrlModel(params, nestedParams, []);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
url = cutUrlModel(params, nestedParams, []);
|
|
184
|
+
}
|
|
185
|
+
url = beginHref + url;
|
|
186
|
+
if (url.charAt(url.length - 1) !== '/' && slash.end)
|
|
187
|
+
url = `${url}/`;
|
|
188
|
+
if (url.charAt(0) !== '\/' && slash.start)
|
|
189
|
+
url = `/${url}`;
|
|
190
|
+
return url;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get query params from url, like 'ex' in /api/books?ex=value
|
|
194
|
+
*/
|
|
195
|
+
export function decodeUrl(url) {
|
|
196
|
+
let regex = /[?&]([^=#]+)=([^&#]*)/g, params = {}, match;
|
|
197
|
+
while (match = regex.exec(url)) {
|
|
198
|
+
params[decodeURIComponent(match[1])] = decodeURIComponent(match[2]);
|
|
199
|
+
}
|
|
200
|
+
let paramsObject = params;
|
|
201
|
+
for (let p in paramsObject) {
|
|
202
|
+
if (paramsObject[p] === void 0) {
|
|
203
|
+
delete paramsObject[p];
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
if (paramsObject.hasOwnProperty(p)) {
|
|
207
|
+
// chcek if property is number
|
|
208
|
+
let n = Number(params[p]);
|
|
209
|
+
if (!isNaN(n)) {
|
|
210
|
+
params[p] = n;
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
if (typeof params[p] === 'string') {
|
|
214
|
+
// check if property is object
|
|
215
|
+
let json;
|
|
216
|
+
try {
|
|
217
|
+
json = JSON.parse(params[p]);
|
|
218
|
+
}
|
|
219
|
+
catch (error) { }
|
|
220
|
+
if (json !== void 0) {
|
|
221
|
+
params[p] = json;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
// chcek if property value is like regular rexpression
|
|
225
|
+
// let regexExpression;
|
|
226
|
+
// try {
|
|
227
|
+
// regexExpression = new RegExp(params[p]);
|
|
228
|
+
// } catch (e) { }
|
|
229
|
+
// if (regexExpression !== undefined) params[p] = regexExpression;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return params;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Create query params string for url
|
|
237
|
+
*
|
|
238
|
+
* @export
|
|
239
|
+
* @param {UrlParams[]} params
|
|
240
|
+
* @returns {string}
|
|
241
|
+
*/
|
|
242
|
+
export function getParamsUrl(params, doNotSerialize = false) {
|
|
243
|
+
let urlparts = [];
|
|
244
|
+
if (!params)
|
|
245
|
+
return '';
|
|
246
|
+
if (!(params instanceof Array))
|
|
247
|
+
return '';
|
|
248
|
+
if (params.length === 0)
|
|
249
|
+
return '';
|
|
250
|
+
params.forEach(urlparam => {
|
|
251
|
+
if (JSON.stringify(urlparam) !== '{}') {
|
|
252
|
+
let parameters = [];
|
|
253
|
+
let paramObject = urlparam;
|
|
254
|
+
for (let p in paramObject) {
|
|
255
|
+
if (paramObject[p] === void 0)
|
|
256
|
+
delete paramObject[p];
|
|
257
|
+
if (paramObject.hasOwnProperty(p) && typeof p === 'string' && p !== 'regex' && !(paramObject[p] instanceof RegExp)) {
|
|
258
|
+
if (p.length > 0 && p[0] === '/') {
|
|
259
|
+
let newName = p.slice(1, p.length - 1);
|
|
260
|
+
urlparam[newName] = urlparam[p];
|
|
261
|
+
urlparam[p] = void 0;
|
|
262
|
+
p = newName;
|
|
263
|
+
}
|
|
264
|
+
if (p.length > 0 && p[p.length - 1] === '/') {
|
|
265
|
+
let newName = p.slice(0, p.length - 2);
|
|
266
|
+
urlparam[newName] = urlparam[p];
|
|
267
|
+
urlparam[p] = void 0;
|
|
268
|
+
p = newName;
|
|
269
|
+
}
|
|
270
|
+
let v = urlparam[p];
|
|
271
|
+
if (v instanceof Object) {
|
|
272
|
+
urlparam[p] = JSON.stringify(urlparam[p]);
|
|
273
|
+
}
|
|
274
|
+
urlparam[p] = doNotSerialize ? urlparam[p] : encodeURIComponent(urlparam[p]);
|
|
275
|
+
if (urlparam.regex !== void 0 && urlparam.regex instanceof RegExp) {
|
|
276
|
+
if (!urlparam.regex.test(urlparam[p])) {
|
|
277
|
+
console.warn(`Data: ${urlparam[p]} incostistent with regex ${urlparam.regex.source}`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
parameters.push(`${p}=${urlparam[p]}`);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
urlparts.push(parameters.join('&'));
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
let join = urlparts.join().trim();
|
|
287
|
+
if (join.trim() === '')
|
|
288
|
+
return '';
|
|
289
|
+
return `?${urlparts.join('&')}`;
|
|
290
|
+
}
|
|
291
|
+
function transform(o) {
|
|
292
|
+
if (typeof o === 'object') {
|
|
293
|
+
return encodeURIComponent(JSON.stringify(o));
|
|
294
|
+
}
|
|
295
|
+
return o;
|
|
296
|
+
}
|
|
297
|
+
export function prepareUrlOldWay(params) {
|
|
298
|
+
if (!params)
|
|
299
|
+
return this.endpoint;
|
|
300
|
+
if (typeof params === 'object') {
|
|
301
|
+
params = transform(params);
|
|
302
|
+
}
|
|
303
|
+
return this.endpoint + '/' + params;
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWJ1bmRsZS13ZWJzcWwvbmcyLXJlc3QvcHJvamVjdHMvbmcyLXJlc3Qvc3JjL2xpYi9wYXJhbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0FBSTVELHlDQUF5QztBQUN6QyxNQUFNLFVBQVUsT0FBTyxDQUFDLE9BQWU7SUFDckMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVFLENBQUM7QUFFRCxNQUFNLFVBQVUsS0FBSyxDQUFDLEdBQVcsRUFBRSxPQUFlO0lBQ2hELElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQy9CLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbkMsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUc7UUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0s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SUFDNUQsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDbEMsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7UUFDOUIsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUM1QjtJQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkaWZmQ2hhcnMgfSBmcm9tICdkaWZmJztcbmltcG9ydCB7IF8gfSBmcm9tICd0bnAtY29yZS93ZWJzcWwnO1xuaW1wb3J0IHsgTG9nLCBMZXZlbCB9IGZyb20gJ25nMi1sb2dnZXIvd2Vic3FsJztcbmltcG9ydCB7IE1vZGVscyB9IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5jb25zdCBsb2cgPSBMb2cuY3JlYXRlKCdbbmcyLXJlc3RdIHBhcmFtcycsIExldmVsLl9fTk9USElORylcblxuXG5cbi8qKiBjaGVjayBpZiBzdHJpbmcgaXMgYSB2YWxpZCBwYXR0ZXJuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZChwYXR0ZXJuOiBzdHJpbmcpIHtcbiAgcmV0dXJuIChuZXcgUmVnRXhwKCdcXC86W2EtekEtWl0qJywgJ2cnKSkudGVzdChwYXR0ZXJuLnJlcGxhY2UoJzovLycsICcnKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVjayh1cmw6IHN0cmluZywgcGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghSGVscGVycy5jaGVja1ZhbGlkVXJsKHVybCkpIHtcbiAgICBsb2cuZXJyb3IoYEluY29ycmVjdCB1cmw6ICR7dXJsfWApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodXJsLmNoYXJBdCh1cmwubGVuZ3RoIC0gMSkgPT09ICcvJykgdXJsID0gdXJsLnNsaWNlKDAsIHVybC5sZW5ndGggLSAyKTtcbiAgaWYgKHBhdHRlcm4uY2hhckF0KHBhdHRlcm4ubGVuZ3RoIC0gMSkgPT09ICcvJykgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UoMCwgdXJsLmxlbmd0aCAtIDIpO1xuICBwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKC9cXC8vZywgJ1xcLycpO1xuICBwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcLzpbYS16QS1aXSonLCAnZycpLCAnLisnKTtcbiAgbGV0IHJlZyA9IG5ldyBSZWdFeHAocGF0dGVybiwgJ2cnKTtcbiAgcmV0dXJuIHJlZy50ZXN0KHVybCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbHMocGF0dGVybjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBsZXQgbSA9IHBhdHRlcm4ubWF0Y2gobmV3IFJlZ0V4cCgnW2Etei1BLVpdKlxcLzonLCAnZycpKTtcbiAgcmV0dXJuIG0ubWFwKHAgPT4gcC5yZXBsYWNlKCcvOicsICcnKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXN0UHJhbXNOYW1lcyhwYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmIChwYXR0ZXJuLmNoYXJBdChwYXR0ZXJuLmxlbmd0aCAtIDEpICE9PSAnLycpIHBhdHRlcm4gPSBgJHtwYXR0ZXJufS9gO1xuICBsZXQgbSA9IHBhdHRlcm4ubWF0Y2gobmV3IFJlZ0V4cCgnOlthLXpBLVpdKlxcLycsICdnJykpO1xuICBsZXQgcmVzID0gbS5tYXAocCA9PiBwLnJlcGxhY2UoJzonLCAnJykucmVwbGFjZSgnLycsICcnKSk7XG4gIHJldHVybiByZXMuZmlsdGVyKHAgPT4gcC50cmltKCkgIT09ICcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zTW9kZWxzKHVybDogc3RyaW5nLCBtb2RlbHM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGlmICh1cmwuY2hhckF0KDApICE9PSAnLycpIHVybCA9ICcvJyArIHVybDtcbiAgLy8gdXJsID0gdXJsLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFwvJywgJ2cnKSwgJycpO1xuICBsZXQgcmVzID0gbW9kZWxzLmZpbHRlcihtID0+IHtcbiAgICBsZXQgd29yZCA9ICcvJyArIG07XG4gICAgLy8gbG9nLmQoJ3dvcmQnLCB3b3JkKVxuICAgIGxldCBpaWkgPSB1cmwuaW5kZXhPZih3b3JkKTtcbiAgICAvLyBsb2cuZCgnaWlpJywgaWlpKVxuICAgIGlmIChpaWkgKyB3b3JkLmxlbmd0aCA8IHVybC5sZW5ndGggJiYgdXJsLmNoYXJBdChpaWkgKyB3b3JkLmxlbmd0aCkgIT09ICcvJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaWlpICE9PSAtMSkge1xuICAgICAgdXJsID0gdXJsLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFwvJyArIG0sICdnJyksICcnKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pLmxlbmd0aDtcbiAgLy8gbG9nLmQoJ2NvbnRhaW5zTW9kZWxzJywgcmVzKTtcbiAgcmV0dXJuIHJlcyA9PT0gbW9kZWxzLmxlbmd0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJzKG46IG51bWJlcik6IHN0cmluZyB7XG4gIGxldCByZXMgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHJlcyArPSAnKic7XG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXN0UGFyYW1zKHVybDogc3RyaW5nLCBwYXR0ZXJuOiBzdHJpbmcpOiBPYmplY3Qge1xuICBsZXQgcmVzID0ge307XG4gIGxldCBtb2RlbHMgPSBnZXRSZXN0UHJhbXNOYW1lcyhwYXR0ZXJuKTtcbiAgLy8gbG9nLmQoJ21vZGVscycsIG1vZGVscyk7XG4gIG1vZGVscy5mb3JFYWNoKG0gPT4ge1xuICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UoYDoke219YCwgc3RhcnMobS5sZW5ndGgpKTtcbiAgfSlcblxuICBsZXQgY3VycmVudE1vZGVsOiBzdHJpbmcgPSB2b2lkIDA7XG4gIGRpZmZDaGFycyhwYXR0ZXJuLCB1cmwpLmZvckVhY2goZCA9PiB7XG4gICAgLy8gbG9nLmQoJ2QnLCBkKTtcbiAgICBpZiAoZC5hZGRlZCkge1xuICAgICAgaWYgKCFpc05hTihOdW1iZXIoZC52YWx1ZSkpKSByZXNbY3VycmVudE1vZGVsXSA9IE51bWJlcihkLnZhbHVlKTtcbiAgICAgIGVsc2UgaWYgKGQudmFsdWUudHJpbSgpID09PSAndHJ1ZScpIHJlc1tjdXJyZW50TW9kZWxdID0gdHJ1ZTtcbiAgICAgIGVsc2UgaWYgKGQudmFsdWUudHJpbSgpID09PSAnZmFsc2UnKSByZXNbY3VycmVudE1vZGVsXSA9IGZhbHNlO1xuICAgICAgZWxzZSByZXNbY3VycmVudE1vZGVsXSA9IGRlY29kZVVSSUNvbXBvbmVudChkLnZhbHVlKTtcbiAgICAgIGN1cnJlbnRNb2RlbCA9IHZvaWQgMDtcbiAgICB9XG4gICAgbGV0IG0gPSBkLnZhbHVlLnJlcGxhY2UoJzonLCBcIlwiKTtcbiAgICAvLyBsb2cuZCgnbW9kZWwgbScsIG0pXG4gICAgaWYgKGQucmVtb3ZlZCkge1xuICAgICAgY3VycmVudE1vZGVsID0gbW9kZWxzLnNoaWZ0KCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IHJlZ2V4aXNQYXRoID0gL1teXFwuLl0rKFxcLlteXFwuLl0rKSsvZztcblxuLyoqXG4gKiBNb2RlbHMgbGlrZSBib29rcy86aWRcbiAqL1xuZnVuY3Rpb24gY3V0VXJsTW9kZWwocGFyYW1zOiBPYmplY3QsIG1vZGVsczogc3RyaW5nW10sIG91dHB1dDogc3RyaW5nW10pIHtcbiAgaWYgKG1vZGVscy5sZW5ndGggPT09IDApIHJldHVybiBvdXRwdXQuam9pbignXFwvJyk7XG4gIGxldCBtID0gbW9kZWxzLnBvcCgpO1xuXG4gIGxldCBwYXJhbSA9IG0ubWF0Y2goLzpbYS16QS1aMC05XFwuXSsvKVswXS5yZXBsYWNlKCc6JywgJycpO1xuICBjb25zdCBwYXJhbUlzUGF0aCA9IHJlZ2V4aXNQYXRoLnRlc3QocGFyYW0pXG4gIC8vIGxvZy5pKCdjdXQgcGFyYW0nLCBwYXJhbSlcbiAgbGV0IG1vZGVsID0gbS5tYXRjaCgvW2EtekEtWjAtOV0rXFwvLylbMF0ucmVwbGFjZSgnXFwvJywgJycpO1xuICBpZiAocGFyYW1zID09PSB2b2lkIDAgfHxcbiAgICAocGFyYW1Jc1BhdGggPyBfLmdldChwYXJhbXMsIHBhcmFtKSA9PT0gdm9pZCAwIDogcGFyYW1zW3BhcmFtXSA9PT0gdm9pZCAwKSB8fFxuICAgIHBhcmFtID09PSAndW5kZWZpbmVkJykge1xuICAgIG91dHB1dC5sZW5ndGggPSAwO1xuICAgIG91dHB1dC51bnNoaWZ0KG1vZGVsKVxuICAgIHJldHVybiBjdXRVcmxNb2RlbChwYXJhbXMsIG1vZGVscywgb3V0cHV0KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAocGFyYW1Jc1BhdGgpIHtcbiAgICAgIC8vIGxvZy5pKCdwYXJhbSBpcyBwYXRoJywgcGFyYW0pXG4gICAgICBsZXQgbXJlcCA9IG0ucmVwbGFjZShuZXcgUmVnRXhwKGA6JHtwYXJhbX1gLCAnZycpLCBgJHtfLmdldChwYXJhbXMsIHBhcmFtKX1gKVxuICAgICAgb3V0cHV0LnVuc2hpZnQobXJlcClcbiAgICAgIHJldHVybiBjdXRVcmxNb2RlbChwYXJhbXMsIG1vZGVscywgb3V0cHV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbG9nLmkoJ3BhcmFtIGlzIG5vcm1hbCcsIHBhcmFtKVxuICAgICAgbGV0IG1yZXAgPSBtLnJlcGxhY2UobmV3IFJlZ0V4cChgOiR7cGFyYW19YCwgJ2cnKSwgYCR7cGFyYW1zW3BhcmFtXX1gKVxuICAgICAgb3V0cHV0LnVuc2hpZnQobXJlcClcbiAgICAgIHJldHVybiBjdXRVcmxNb2RlbChwYXJhbXMsIG1vZGVscywgb3V0cHV0KTtcbiAgICB9XG5cbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZVBhcmFtc1RvVXJsKHBhcmFtczogT2JqZWN0LCB1cmw6IHN0cmluZyk6IHN0cmluZyB7XG5cbiAgY29uc3QgcmVnZXhJbnQgPSAvXFxbXFxbKFteXFwuLl0rXFwuW15cXC4uXSspK1xcXVxcXS9nO1xuXG4gIHVybCA9IHVybC5zcGxpdCgnLycpLm1hcChwID0+IHtcbiAgICAvLyBsb2cuZCgndXJsIHBhcnRzJywgcClcbiAgICBsZXQgaXNQYXJhbSA9IHAuc3RhcnRzV2l0aCgnOicpXG4gICAgaWYgKGlzUGFyYW0pIHtcbiAgICAgIGxldCBwYXJ0ID0gcC5zbGljZSgxKTtcbiAgICAgIC8vIGxvZy5kKCd1cmwgcGFyYW0gcGFydCcsIHApXG4gICAgICBpZiAocmVnZXhJbnQudGVzdChwYXJ0KSkge1xuICAgICAgICAvLyBsZXQgbGV2ZWwgPSAodXJsLnNwbGl0KCcuJykubGVuZ3RoIC0gMSlcbiAgICAgICAgcGFydCA9IHBhcnQucmVwbGFjZSgnW1snLCAnJylcbiAgICAgICAgcGFydCA9IHBhcnQucmVwbGFjZSgnXV0nLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBgOiR7cGFydH1gXG4gICAgfVxuICAgIHJldHVybiBwO1xuICB9KS5qb2luKCcvJyk7XG5cbiAgLy8gbG9nLmkoJ1VSTCBUTyBFWFBPU0UnLCB1cmwpXG5cbiAgLy8gbG9nLmkoJ3BhcmFtcycsIHBhcmFtcylcblxuICBsZXQgc2xhc2ggPSB7XG4gICAgc3RhcnQ6IHVybC5jaGFyQXQoMCkgPT09ICdcXC8nLFxuICAgIGVuZDogdXJsLmNoYXJBdCh1cmwubGVuZ3RoIC0gMSkgPT09ICdcXC8nXG4gIH1cblxuICBsZXQgbW9yZVByYW1zT25FbmQgPSB1cmwubWF0Y2goLyhcXC86W2EtekEtWjAtOVxcLl0rKXsyLDEwfS9nKTtcbiAgaWYgKG1vcmVQcmFtc09uRW5kICYmIChBcnJheS5pc0FycmF5KG1vcmVQcmFtc09uRW5kKSAmJiBtb3JlUHJhbXNPbkVuZC5sZW5ndGggPT09IDEpKSB7XG4gICAgLy8gbG9nLmkoJ21vcmVQcmFtc09uRW5kJywgbW9yZVByYW1zT25FbmQpXG4gICAgbGV0IG0gPSBtb3JlUHJhbXNPbkVuZFswXTtcbiAgICBsZXQgbWF0Y2ggPSBtLm1hdGNoKC9cXC86W2EtekEtWjAtOVxcLl0rL2cpO1xuICAgIC8vIGxvZy5pKCdtYXRjaCcsIG1hdGNoKVxuICAgIG1hdGNoLmZvckVhY2goZSA9PiB7XG4gICAgICBsZXQgYyA9IGUucmVwbGFjZSgnXFwvOicsICcnKTtcbiAgICAgIC8vIGxvZy5pKCdjJywgYylcbiAgICAgIGlmIChyZWdleGlzUGF0aC50ZXN0KGMpKSB7XG4gICAgICAgIHVybCA9IHVybC5yZXBsYWNlKGUsIGAvJHtfLmdldChwYXJhbXMsIGMpfWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cmwgPSB1cmwucmVwbGFjZShlLCBgLyR7cGFyYW1zW2NdfWApXG4gICAgICB9XG5cblxuICAgICAgLy8gbG9nLmkoJ3Byb2cgdXJsJywgdXJsKVxuICAgIH0pXG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIGxldCBuZXN0ZWRQYXJhbXMgPSB1cmwubWF0Y2goL1thLXpBLVowLTldK1xcLzpbYS16QS1aMC05XFwuXSsvZyk7XG4gIGlmICghbmVzdGVkUGFyYW1zIHx8IChBcnJheS5pc0FycmF5KG5lc3RlZFBhcmFtcykgJiYgbmVzdGVkUGFyYW1zLmxlbmd0aCA9PT0gMCkpIHJldHVybiB1cmw7XG5cbiAgLy8gY2hlY2sgYWxvbmUgcGFyYW1zXG4gIGlmICghc2xhc2guZW5kKSB1cmwgPSBgJHt1cmx9L2A7XG4gIGxldCBhZGRVbmRlZmluZWRGb3JBbG9uZSA9ICghLzpbYS16QS1aMC05XFwuXStcXC8kL2cudGVzdCh1cmwpICYmIC9bYS16QS1aMC05XStcXC8kL2cudGVzdCh1cmwpKTtcblxuICBsZXQgcmVwbGFjZSA9IChuZXN0ZWRQYXJhbXMubGVuZ3RoID4gMSA/IG5lc3RlZFBhcmFtcy5qb2luKCdcXC8nKSA6IG5lc3RlZFBhcmFtc1swXSkgK1xuICAgIChhZGRVbmRlZmluZWRGb3JBbG9uZSA/ICdcXC8nICsgdXJsLm1hdGNoKC9bYS16QS1aMC05XStcXC8kL2cpWzBdIDogJ1xcLycpO1xuICBsZXQgYmVnaW5IcmVmID0gdXJsLnJlcGxhY2UocmVwbGFjZSwgJycpXG5cbiAgaWYgKGFkZFVuZGVmaW5lZEZvckFsb25lKSB7XG4gICAgdXJsID0gdXJsLnJlcGxhY2UoL1xcLyQvZywgJy86dW5kZWZpbmVkJylcbiAgICBuZXN0ZWRQYXJhbXMgPSB1cmwubWF0Y2goL1thLXpBLVowLTldK1xcLzpbYS16QS1aMC05XFwuXSsvZyk7XG4gICAgdXJsID0gY3V0VXJsTW9kZWwocGFyYW1zLCBuZXN0ZWRQYXJhbXMsIFtdKVxuICB9IGVsc2Uge1xuICAgIHVybCA9IGN1dFVybE1vZGVsKHBhcmFtcywgbmVzdGVkUGFyYW1zLCBbXSlcbiAgfVxuICB1cmwgPSBiZWdpbkhyZWYgKyB1cmw7XG5cbiAgaWYgKHVybC5jaGFyQXQodXJsLmxlbmd0aCAtIDEpICE9PSAnLycgJiYgc2xhc2guZW5kKSB1cmwgPSBgJHt1cmx9L2A7XG4gIGlmICh1cmwuY2hhckF0KDApICE9PSAnXFwvJyAmJiBzbGFzaC5zdGFydCkgdXJsID0gYC8ke3VybH1gO1xuXG4gIHJldHVybiB1cmw7XG59XG5cbi8qKlxuICogR2V0IHF1ZXJ5IHBhcmFtcyBmcm9tIHVybCwgbGlrZSAnZXgnIGluIC9hcGkvYm9va3M/ZXg9dmFsdWVcbiovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVXJsKHVybDogc3RyaW5nKTogT2JqZWN0IHtcbiAgbGV0IHJlZ2V4ID0gL1s/Jl0oW149I10rKT0oW14mI10qKS9nLFxuICAgIHBhcmFtcyA9IHt9LFxuICAgIG1hdGNoO1xuICB3aGlsZSAobWF0Y2ggPSByZWdleC5leGVjKHVybCkpIHtcbiAgICBwYXJhbXNbZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzFdKV0gPSBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbMl0pO1xuICB9XG4gIGxldCBwYXJhbXNPYmplY3QgPSA8T2JqZWN0PnBhcmFtcztcbiAgZm9yIChsZXQgcCBpbiBwYXJhbXNPYmplY3QpIHtcbiAgICBpZiAocGFyYW1zT2JqZWN0W3BdID09PSB2b2lkIDApIHtcbiAgICAgIGRlbGV0ZSBwYXJhbXNPYmplY3RbcF07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHBhcmFtc09iamVjdC5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgLy8gY2hjZWsgaWYgcHJvcGVydHkgaXMgbnVtYmVyXG4gICAgICBsZXQgbiA9IE51bWJlcihwYXJhbXNbcF0pO1xuICAgICAgaWYgKCFpc05hTihuKSkge1xuICAgICAgICBwYXJhbXNbcF0gPSBuO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcGFyYW1zW3BdID09PSAnc3RyaW5nJykge1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIHByb3BlcnR5IGlzIG9iamVjdFxuICAgICAgICBsZXQganNvbjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBqc29uID0gSlNPTi5wYXJzZShwYXJhbXNbcF0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgIGlmIChqc29uICE9PSB2b2lkIDApIHtcbiAgICAgICAgICBwYXJhbXNbcF0gPSBqc29uO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hjZWsgaWYgcHJvcGVydHkgdmFsdWUgaXMgbGlrZSByZWd1bGFyIHJleHByZXNzaW9uXG4gICAgICAgIC8vIGxldCByZWdleEV4cHJlc3Npb247XG4gICAgICAgIC8vIHRyeSB7XG4gICAgICAgIC8vICAgICByZWdleEV4cHJlc3Npb24gPSBuZXcgUmVnRXhwKHBhcmFtc1twXSk7XG4gICAgICAgIC8vIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAvLyBpZiAocmVnZXhFeHByZXNzaW9uICE9PSB1bmRlZmluZWQpIHBhcmFtc1twXSA9IHJlZ2V4RXhwcmVzc2lvbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhcmFtcztcbn1cblxuLyoqXG4gKiBDcmVhdGUgcXVlcnkgcGFyYW1zIHN0cmluZyBmb3IgdXJsXG4gKlxuICogQGV4cG9ydFxuICogQHBhcmFtIHtVcmxQYXJhbXNbXX0gcGFyYW1zXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFyYW1zVXJsKHBhcmFtczogTW9kZWxzLlVybFBhcmFtc1tdLCBkb05vdFNlcmlhbGl6ZTogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgbGV0IHVybHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoIXBhcmFtcykgcmV0dXJuICcnO1xuICBpZiAoIShwYXJhbXMgaW5zdGFuY2VvZiBBcnJheSkpIHJldHVybiAnJztcbiAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcblxuICBwYXJhbXMuZm9yRWFjaCh1cmxwYXJhbSA9PiB7XG4gICAgaWYgKEpTT04uc3RyaW5naWZ5KHVybHBhcmFtKSAhPT0gJ3t9Jykge1xuXG4gICAgICBsZXQgcGFyYW1ldGVyczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGxldCBwYXJhbU9iamVjdCA9IDxPYmplY3Q+dXJscGFyYW07XG5cblxuICAgICAgZm9yIChsZXQgcCBpbiBwYXJhbU9iamVjdCkge1xuICAgICAgICBpZiAocGFyYW1PYmplY3RbcF0gPT09IHZvaWQgMCkgZGVsZXRlIHBhcmFtT2JqZWN0W3BdO1xuICAgICAgICBpZiAocGFyYW1PYmplY3QuaGFzT3duUHJvcGVydHkocCkgJiYgdHlwZW9mIHAgPT09ICdzdHJpbmcnICYmIHAgIT09ICdyZWdleCcgJiYgIShwYXJhbU9iamVjdFtwXSBpbnN0YW5jZW9mIFJlZ0V4cCkpIHtcbiAgICAgICAgICBpZiAocC5sZW5ndGggPiAwICYmIHBbMF0gPT09ICcvJykge1xuICAgICAgICAgICAgbGV0IG5ld05hbWUgPSBwLnNsaWNlKDEsIHAubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB1cmxwYXJhbVtuZXdOYW1lXSA9IHVybHBhcmFtW3BdO1xuICAgICAgICAgICAgdXJscGFyYW1bcF0gPSB2b2lkIDA7XG4gICAgICAgICAgICBwID0gbmV3TmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHAubGVuZ3RoID4gMCAmJiBwW3AubGVuZ3RoIC0gMV0gPT09ICcvJykge1xuICAgICAgICAgICAgbGV0IG5ld05hbWUgPSBwLnNsaWNlKDAsIHAubGVuZ3RoIC0gMik7XG4gICAgICAgICAgICB1cmxwYXJhbVtuZXdOYW1lXSA9IHVybHBhcmFtW3BdO1xuICAgICAgICAgICAgdXJscGFyYW1bcF0gPSB2b2lkIDA7XG4gICAgICAgICAgICBwID0gbmV3TmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHY6IGFueSA9IHVybHBhcmFtW3BdO1xuICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgICB1cmxwYXJhbVtwXSA9IEpTT04uc3RyaW5naWZ5KHVybHBhcmFtW3BdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdXJscGFyYW1bcF0gPSBkb05vdFNlcmlhbGl6ZSA/IDxzdHJpbmc+dXJscGFyYW1bcF0gOiBlbmNvZGVVUklDb21wb25lbnQoPHN0cmluZz51cmxwYXJhbVtwXSk7XG4gICAgICAgICAgaWYgKHVybHBhcmFtLnJlZ2V4ICE9PSB2b2lkIDAgJiYgdXJscGFyYW0ucmVnZXggaW5zdGFuY2VvZiBSZWdFeHApIHtcblxuICAgICAgICAgICAgaWYgKCF1cmxwYXJhbS5yZWdleC50ZXN0KDxzdHJpbmc+dXJscGFyYW1bcF0pKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihgRGF0YTogJHt1cmxwYXJhbVtwXX0gaW5jb3N0aXN0ZW50IHdpdGggcmVnZXggJHt1cmxwYXJhbS5yZWdleC5zb3VyY2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhcmFtZXRlcnMucHVzaChgJHtwfT0ke3VybHBhcmFtW3BdfWApO1xuICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgICAgdXJscGFydHMucHVzaChwYXJhbWV0ZXJzLmpvaW4oJyYnKSk7XG5cblxuICAgIH1cblxuXG4gIH0pO1xuICBsZXQgam9pbiA9IHVybHBhcnRzLmpvaW4oKS50cmltKCk7XG4gIGlmIChqb2luLnRyaW0oKSA9PT0gJycpIHJldHVybiAnJztcbiAgcmV0dXJuIGA/JHt1cmxwYXJ0cy5qb2luKCcmJyl9YDtcbn1cblxuXG5mdW5jdGlvbiB0cmFuc2Zvcm0obykge1xuICBpZiAodHlwZW9mIG8gPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShvKSk7XG4gIH1cbiAgcmV0dXJuIG87XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVVcmxPbGRXYXkocGFyYW1zPzogVGVtcGxhdGVTdHJpbmdzQXJyYXkpOiBzdHJpbmcge1xuICBpZiAoIXBhcmFtcykgcmV0dXJuIHRoaXMuZW5kcG9pbnQ7XG4gIGlmICh0eXBlb2YgcGFyYW1zID09PSAnb2JqZWN0Jykge1xuICAgIHBhcmFtcyA9IHRyYW5zZm9ybShwYXJhbXMpO1xuICB9XG4gIHJldHVybiB0aGlzLmVuZHBvaW50ICsgJy8nICsgcGFyYW1zO1xufVxuXG4iXX0=
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Models } from './models';
|
|
2
|
+
import { Log, Level } from 'ng2-logger/websql';
|
|
3
|
+
import { Helpers } from 'tnp-core/websql';
|
|
4
|
+
import { RestHeaders } from './rest-headers';
|
|
5
|
+
const log = Log.create('request-cache', Level.__NOTHING);
|
|
6
|
+
export class RequestCache {
|
|
7
|
+
constructor(response) {
|
|
8
|
+
this.response = response;
|
|
9
|
+
}
|
|
10
|
+
static restoreFromLocalStorage() {
|
|
11
|
+
if (Helpers.isNode) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (!RequestCache.isRestoredFromLocalStorage) {
|
|
15
|
+
RequestCache.isRestoredFromLocalStorage = true;
|
|
16
|
+
const data = localStorage.getItem(RequestCache.LOCAL_STORAGE_KEY);
|
|
17
|
+
let requests = [];
|
|
18
|
+
if (data) {
|
|
19
|
+
try {
|
|
20
|
+
requests = JSON.parse(data);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
}
|
|
24
|
+
const restored = requests.map(r => {
|
|
25
|
+
let { sourceRequest, responseText, body, headers, circular, entity, isArray, cookies, statusCode } = r.response;
|
|
26
|
+
r.response = new Models.HttpResponse(sourceRequest, responseText, RestHeaders.from(headers), statusCode, entity, circular, -1, // jobid from local storage TODO
|
|
27
|
+
isArray);
|
|
28
|
+
r = new RequestCache(r.response);
|
|
29
|
+
r.response.rq = r;
|
|
30
|
+
return r;
|
|
31
|
+
});
|
|
32
|
+
log.i('RESTORED FROM LOCAL STORAGE', restored);
|
|
33
|
+
RequestCache.cached = restored;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
static findBy(sourceRequest) {
|
|
38
|
+
log.i('findby', sourceRequest);
|
|
39
|
+
log.i('RequestCache.cached', RequestCache.cached);
|
|
40
|
+
RequestCache.restoreFromLocalStorage();
|
|
41
|
+
return RequestCache.cached.find(c => {
|
|
42
|
+
const a = c.response.sourceRequest;
|
|
43
|
+
const b = sourceRequest;
|
|
44
|
+
return (a.isArray === b.isArray &&
|
|
45
|
+
a.url === b.url &&
|
|
46
|
+
a.method === b.method &&
|
|
47
|
+
a.body === b.body);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
get containsCache() {
|
|
51
|
+
RequestCache.restoreFromLocalStorage();
|
|
52
|
+
return RequestCache.cached.includes(this);
|
|
53
|
+
}
|
|
54
|
+
persistsInLocalStorage() {
|
|
55
|
+
localStorage.setItem(RequestCache.LOCAL_STORAGE_KEY, JSON.stringify(RequestCache.cached.map(r => {
|
|
56
|
+
return {
|
|
57
|
+
response: {
|
|
58
|
+
sourceRequest: r.response.sourceRequest,
|
|
59
|
+
responseText: r.response.responseText,
|
|
60
|
+
headers: r.response.headers,
|
|
61
|
+
statusCode: r.response.statusCode,
|
|
62
|
+
entity: r.response.entity,
|
|
63
|
+
circular: r.response.circular,
|
|
64
|
+
isArray: r.response.isArray,
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
})));
|
|
68
|
+
}
|
|
69
|
+
store() {
|
|
70
|
+
RequestCache.restoreFromLocalStorage();
|
|
71
|
+
if (!this.containsCache) {
|
|
72
|
+
RequestCache.cached.push(this);
|
|
73
|
+
this.persistsInLocalStorage();
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.log('already stored');
|
|
77
|
+
}
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
remove() {
|
|
81
|
+
RequestCache.restoreFromLocalStorage();
|
|
82
|
+
const index = RequestCache.cached.indexOf(this);
|
|
83
|
+
if (index !== -1) {
|
|
84
|
+
RequestCache.cached.splice(index, 1);
|
|
85
|
+
this.persistsInLocalStorage();
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.log('already removed');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
RequestCache.LOCAL_STORAGE_KEY = 'ng2restrequestcache';
|
|
93
|
+
RequestCache.cached = [];
|
|
94
|
+
RequestCache.isRestoredFromLocalStorage = false;
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RtcC1saWJzLWZvci1idW5kbGUtd2Vic3FsL25nMi1yZXN0L3Byb2plY3RzL25nMi1yZXN0L3NyYy9saWIvcmVxdWVzdC1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7QUFHeEQsTUFBTSxPQUFPLFlBQVk7SUFpRXZCLFlBQ1MsUUFBa0M7UUFBbEMsYUFBUSxHQUFSLFFBQVEsQ0FBMEI7SUFHM0MsQ0FBQztJQTlETyxNQUFNLENBQUMsdUJBQXVCO1FBQ3BDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNsQixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLDBCQUEwQixFQUFFO1lBQzVDLFlBQVksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7WUFDL0MsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNsRSxJQUFJLFFBQVEsR0FBbUIsRUFBRSxDQUFDO1lBQ2xDLElBQUksSUFBSSxFQUFFO2dCQUNSLElBQUk7b0JBQ0YsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFtQixDQUFDO2lCQUMvQztnQkFBQyxPQUFPLEtBQUssRUFBRTtpQkFFZjtnQkFDRCxNQUFNLFFBQVEsR0FBRyxR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QUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN2QixZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztTQUMvQjthQUFNO1lBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQy9CO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTTtRQUNKLFlBQVksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2hCLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztTQUMvQjthQUFNO1lBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQzs7QUEvR2UsOEJBQWlCLEdBQUcscUJBQXFCLENBQUM7QUFFM0MsbUJBQU0sR0FBbUIsRUFBRSxDQUFDO0FBQzVCLHVDQUEwQixHQUFHLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IF8gfSBmcm9tICd0bnAtY29yZS93ZWJzcWwnO1xuaW1wb3J0IHsgTW9kZWxzIH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgTG9nLCBMZXZlbCB9IGZyb20gJ25nMi1sb2dnZXIvd2Vic3FsJztcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tICd0bnAtY29yZS93ZWJzcWwnO1xuaW1wb3J0IHsgUmVzdEhlYWRlcnMgfSBmcm9tICcuL3Jlc3QtaGVhZGVycyc7XG5jb25zdCBsb2cgPSBMb2cuY3JlYXRlKCdyZXF1ZXN0LWNhY2hlJywgTGV2ZWwuX19OT1RISU5HKVxuXG5cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0Q2FjaGUge1xuXG4gIHN0YXRpYyByZWFkb25seSBMT0NBTF9TVE9SQUdFX0tFWSA9ICduZzJyZXN0cmVxdWVzdGNhY2hlJztcblxuICBwcml2YXRlIHN0YXRpYyBjYWNoZWQ6IFJlcXVlc3RDYWNoZVtdID0gW107XG4gIHByaXZhdGUgc3RhdGljIGlzUmVzdG9yZWRGcm9tTG9jYWxTdG9yYWdlID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVzdG9yZUZyb21Mb2NhbFN0b3JhZ2UoKSB7XG4gICAgaWYgKEhlbHBlcnMuaXNOb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghUmVxdWVzdENhY2hlLmlzUmVzdG9yZWRGcm9tTG9jYWxTdG9yYWdlKSB7XG4gICAgICBSZXF1ZXN0Q2FjaGUuaXNSZXN0b3JlZEZyb21Mb2NhbFN0b3JhZ2UgPSB0cnVlO1xuICAgICAgY29uc3QgZGF0YSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFJlcXVlc3RDYWNoZS5MT0NBTF9TVE9SQUdFX0tFWSk7XG4gICAgICBsZXQgcmVxdWVzdHM6IFJlcXVlc3RDYWNoZVtdID0gW107XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlcXVlc3RzID0gSlNPTi5wYXJzZShkYXRhKSBhcyBSZXF1ZXN0Q2FjaGVbXTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3RvcmVkID0gcmVxdWVzdHMubWFwKHIgPT4ge1xuICAgICAgICAgIGxldCB7IHNvdXJjZVJlcXVlc3QsIHJlc3BvbnNlVGV4dCwgYm9keSwgaGVhZGVycywgY2lyY3VsYXIsXG4gICAgICAgICAgICBlbnRpdHksIGlzQXJyYXksIGNvb2tpZXMsIHN0YXR1c0NvZGUgfSA9IHIucmVzcG9uc2U7XG4gICAgICAgICAgci5yZXNwb25zZSA9IG5ldyBNb2RlbHMuSHR0cFJlc3BvbnNlKFxuICAgICAgICAgICAgc291cmNlUmVxdWVzdCxcbiAgICAgICAgICAgIHJlc3BvbnNlVGV4dCxcbiAgICAgICAgICAgIFJlc3RIZWFkZXJzLmZyb20oaGVhZGVycyksXG4gICAgICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgY2lyY3VsYXIsXG4gICAgICAgICAgICAtMSwgLy8gam9iaWQgZnJvbSBsb2NhbCBzdG9yYWdlIFRPRE9cbiAgICAgICAgICAgIGlzQXJyYXksXG4gICAgICAgICAgKTtcbiAgICAgICAgICByID0gbmV3IFJlcXVlc3RDYWNoZShyLnJlc3BvbnNlKTtcbiAgICAgICAgICByLnJlc3BvbnNlLnJxID0gcjtcblxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9KTtcbiAgICAgICAgbG9nLmkoJ1JFU1RPUkVEIEZST00gTE9DQUwgU1RPUkFHRScsIHJlc3RvcmVkKTtcbiAgICAgICAgUmVxdWVzdENhY2hlLmNhY2hlZCA9IHJlc3RvcmVkO1xuICAgICAgfVxuXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmaW5kQnkoc291cmNlUmVxdWVzdDogTW9kZWxzLkhhbmRsZVJlc3VsdFNvdXJjZVJlcXVlc3RPcHRpb25zKSB7XG4gICAgbG9nLmkoJ2ZpbmRieScsIHNvdXJjZVJlcXVlc3QpXG4gICAgbG9nLmkoJ1JlcXVlc3RDYWNoZS5jYWNoZWQnLCBSZXF1ZXN0Q2FjaGUuY2FjaGVkKVxuICAgIFJlcXVlc3RDYWNoZS5yZXN0b3JlRnJvbUxvY2FsU3RvcmFnZSgpO1xuICAgIHJldHVybiBSZXF1ZXN0Q2FjaGUuY2FjaGVkLmZpbmQoYyA9PiB7XG4gICAgICBjb25zdCBhID0gYy5yZXNwb25zZS5zb3VyY2VSZXF1ZXN0O1xuICAgICAgY29uc3QgYiA9IHNvdXJjZVJlcXVlc3Q7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBhLmlzQXJyYXkgPT09IGIuaXNBcnJheSAmJlxuICAgICAgICBhLnVybCA9PT0gYi51cmwgJiZcbiAgICAgICAgYS5tZXRob2QgPT09IGIubWV0aG9kICYmXG4gICAgICAgIGEuYm9keSA9PT0gYi5ib2R5XG4gICAgICApXG4gICAgfSk7XG4gIH1cblxuXG5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVzcG9uc2U6IE1vZGVscy5IdHRwUmVzcG9uc2U8YW55PlxuICApIHtcblxuICB9XG5cbiAgZ2V0IGNvbnRhaW5zQ2FjaGUoKSB7XG4gICAgUmVxdWVzdENhY2hlLnJlc3RvcmVGcm9tTG9jYWxTdG9yYWdlKCk7XG4gICAgcmV0dXJuIFJlcXVlc3RDYWNoZS5jYWNoZWQuaW5jbHVkZXModGhpcyk7XG4gIH1cblxuICBwcml2YXRlIHBlcnNpc3RzSW5Mb2NhbFN0b3JhZ2UoKSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oUmVxdWVzdENhY2hlLkxPQ0FMX1NUT1JBR0VfS0VZLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoUmVxdWVzdENhY2hlLmNhY2hlZC5tYXAociA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICAgIHNvdXJjZVJlcXVlc3Q6IHIucmVzcG9uc2Uuc291cmNlUmVxdWVzdCxcbiAgICAgICAgICAgIHJlc3BvbnNlVGV4dDogci5yZXNwb25zZS5yZXNwb25zZVRleHQsXG4gICAgICAgICAgICBoZWFkZXJzOiByLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICBzdGF0dXNDb2RlOiByLnJlc3BvbnNlLnN0YXR1c0NvZGUsXG4gICAgICAgICAgICBlbnRpdHk6IHIucmVzcG9uc2UuZW50aXR5LFxuICAgICAgICAgICAgY2lyY3VsYXI6IHIucmVzcG9uc2UuY2lyY3VsYXIsXG4gICAgICAgICAgICBpc0FycmF5OiByLnJlc3BvbnNlLmlzQXJyYXksXG4gICAgICAgICAgfSBhcyBNb2RlbHMuSHR0cFJlc3BvbnNlPGFueT5cbiAgICAgICAgfTtcbiAgICAgIH0pKSk7XG4gIH1cblxuICBzdG9yZSgpIHtcbiAgICBSZXF1ZXN0Q2FjaGUucmVzdG9yZUZyb21Mb2NhbFN0b3JhZ2UoKTtcbiAgICBpZiAoIXRoaXMuY29udGFpbnNDYWNoZSkge1xuICAgICAgUmVxdWVzdENhY2hlLmNhY2hlZC5wdXNoKHRoaXMpO1xuICAgICAgdGhpcy5wZXJzaXN0c0luTG9jYWxTdG9yYWdlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdhbHJlYWR5IHN0b3JlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHJlbW92ZSgpIHtcbiAgICBSZXF1ZXN0Q2FjaGUucmVzdG9yZUZyb21Mb2NhbFN0b3JhZ2UoKTtcbiAgICBjb25zdCBpbmRleCA9IFJlcXVlc3RDYWNoZS5jYWNoZWQuaW5kZXhPZih0aGlzKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICBSZXF1ZXN0Q2FjaGUuY2FjaGVkLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB0aGlzLnBlcnNpc3RzSW5Mb2NhbFN0b3JhZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ2FscmVhZHkgcmVtb3ZlZCcpO1xuICAgIH1cbiAgfVxuXG59XG4iXX0=
|