ng2-rest 13.0.29 → 13.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/app.d.ts +1 -0
  2. package/app.js +6 -165
  3. package/app.js.map +1 -1
  4. package/index.js +1 -1
  5. package/lib/content-type.js +1 -1
  6. package/lib/cookie.js +1 -1
  7. package/lib/helpers.js +1 -1
  8. package/lib/index.js +1 -1
  9. package/lib/mapping.js +1 -1
  10. package/lib/models.js +1 -1
  11. package/lib/other/simple-resource.js +1 -1
  12. package/lib/params.js +1 -1
  13. package/lib/request-cache.js +1 -1
  14. package/lib/resource.service.js +1 -1
  15. package/lib/rest-headers.js +1 -1
  16. package/lib/rest-request.js +1 -1
  17. package/lib/rest.class.js +1 -1
  18. package/package.json +4 -4
  19. package/tmp-environment.json +30 -31
  20. package/websql/README.md +24 -0
  21. package/websql/esm2020/lib/content-type.mjs +12 -0
  22. package/websql/esm2020/lib/cookie.mjs +27 -0
  23. package/websql/esm2020/lib/helpers.mjs +22 -0
  24. package/websql/esm2020/lib/index.mjs +11 -0
  25. package/websql/esm2020/lib/mapping.mjs +271 -0
  26. package/websql/esm2020/lib/models.mjs +142 -0
  27. package/websql/esm2020/lib/other/simple-resource.mjs +117 -0
  28. package/websql/esm2020/lib/params.mjs +305 -0
  29. package/websql/esm2020/lib/request-cache.mjs +95 -0
  30. package/websql/esm2020/lib/resource.service.mjs +255 -0
  31. package/websql/esm2020/lib/rest-headers.mjs +129 -0
  32. package/websql/esm2020/lib/rest-request.mjs +354 -0
  33. package/websql/esm2020/lib/rest.class.mjs +125 -0
  34. package/websql/esm2020/ng2-rest.mjs +5 -0
  35. package/websql/esm2020/public-api.mjs +2 -0
  36. package/websql/fesm2015/ng2-rest.mjs +1826 -0
  37. package/websql/fesm2015/ng2-rest.mjs.map +1 -0
  38. package/websql/fesm2020/ng2-rest.mjs +1823 -0
  39. package/websql/fesm2020/ng2-rest.mjs.map +1 -0
  40. package/websql/lib/content-type.d.ts +5 -0
  41. package/websql/lib/cookie.d.ts +8 -0
  42. package/websql/lib/helpers.d.ts +11 -0
  43. package/websql/lib/index.d.ts +10 -0
  44. package/websql/lib/mapping.d.ts +13 -0
  45. package/websql/lib/models.d.ts +156 -0
  46. package/websql/lib/other/simple-resource.d.ts +30 -0
  47. package/websql/lib/params.d.ts +24 -0
  48. package/websql/lib/request-cache.d.ts +14 -0
  49. package/websql/lib/resource.service.d.ts +44 -0
  50. package/websql/lib/rest-headers.d.ts +58 -0
  51. package/websql/lib/rest-request.d.ts +22 -0
  52. package/websql/lib/rest.class.d.ts +37 -0
  53. package/websql/ng2-rest.d.ts +5 -0
  54. package/websql/package.json +31 -0
  55. package/websql/public-api.d.ts +1 -0
@@ -0,0 +1,354 @@
1
+ import { firstValueFrom, Observable } from 'rxjs';
2
+ import { Subject } from 'rxjs';
3
+ import { _ } from 'tnp-core/websql';
4
+ import { Models } from './models';
5
+ import { RestHeaders } from './rest-headers';
6
+ import { Helpers } from 'tnp-core/websql';
7
+ import { Level } from 'ng2-logger/websql';
8
+ import axios from 'axios';
9
+ import { Resource } from './resource.service';
10
+ import { Log } from 'ng2-logger/websql';
11
+ import { RequestCache } from './request-cache';
12
+ const log = Log.create('[ng2-rest] rest-request', Level.__NOTHING);
13
+ const jobIDkey = 'jobID';
14
+ const customObs = 'customObs';
15
+ const cancelFn = 'cancelFn';
16
+ const isCanceled = 'isCanceled';
17
+ //#region mock request
18
+ //#endregion
19
+ export class RestRequest {
20
+ constructor() {
21
+ this.subjectInuUse = {};
22
+ this.meta = {};
23
+ //#endregion
24
+ this.replaySubjects = {};
25
+ }
26
+ handlerResult(options, sourceRequest) {
27
+ if (_.isUndefined(options)) {
28
+ options = {};
29
+ }
30
+ // log.d(`HANDLE RESULT (jobid:${options.jobid}) ${sourceRequest.url}`);
31
+ const { res, jobid, isArray, method } = options;
32
+ if (typeof res !== 'object') {
33
+ throw new Error('No resposnse for request. ');
34
+ }
35
+ if (Helpers.isBrowser) {
36
+ res.headers = RestHeaders.from(res.headers);
37
+ }
38
+ // error no internet
39
+ if (res.error) {
40
+ this.subjectInuUse[jobid].error(new Models.HttpResponseError(res.error, res.data, res.headers, res.code, jobid));
41
+ return;
42
+ }
43
+ const entity = this.meta[jobid].entity;
44
+ const circular = this.meta[jobid].circular;
45
+ const success = Resource['_listenSuccess'];
46
+ const reqResp = new Models.HttpResponse(sourceRequest, res.data, res.headers, res.code, entity, circular, jobid, isArray);
47
+ success.next(reqResp);
48
+ this.subjectInuUse[jobid].next(reqResp);
49
+ this.meta[jobid] = void 0;
50
+ this.subjectInuUse[jobid].complete();
51
+ }
52
+ checkCache(sourceRequest, jobid) {
53
+ const existedInCache = RequestCache.findBy(sourceRequest);
54
+ if (existedInCache) {
55
+ log.i('cache exists', existedInCache);
56
+ const success = Resource['_listenSuccess'];
57
+ success.next(existedInCache.response);
58
+ this.subjectInuUse[jobid].next(existedInCache);
59
+ this.subjectInuUse[jobid].complete();
60
+ return true;
61
+ }
62
+ // log.i(`cache not exists for jobid ${jobid}`)
63
+ return false;
64
+ }
65
+ async req(url, method, headers, body, jobid, isArray = false, mockHttp) {
66
+ if (this.checkCache({
67
+ url,
68
+ body,
69
+ isArray,
70
+ method
71
+ }, jobid)) {
72
+ return;
73
+ }
74
+ const CancelToken = axios.CancelToken;
75
+ const source = CancelToken.source();
76
+ this.subjectInuUse[jobid][cancelFn] = source.cancel;
77
+ var response;
78
+ if (mockHttp) {
79
+ if (typeof mockHttp === 'object') {
80
+ response = {
81
+ data: mockHttp.data,
82
+ status: mockHttp.code,
83
+ headers: mockHttp.headers,
84
+ statusText: mockHttp.error,
85
+ config: {}
86
+ };
87
+ }
88
+ else if (typeof mockHttp === 'function') {
89
+ const r = mockHttp(url, method, headers, body);
90
+ response = {
91
+ data: r.data,
92
+ status: r.code,
93
+ headers: r.headers,
94
+ statusText: r.error,
95
+ config: {}
96
+ };
97
+ }
98
+ }
99
+ try {
100
+ if (!response) {
101
+ // console.log(`[${method}] (jobid=${jobid}) request to: ${url}`);
102
+ // console.log(headers.toJSON())
103
+ response = await axios({
104
+ url,
105
+ method,
106
+ data: body,
107
+ responseType: 'text',
108
+ headers: headers.toJSON(),
109
+ cancelToken: source.token,
110
+ // withCredentials: true, // this can be done manually
111
+ });
112
+ // log.d(`after response of jobid: ${jobid}`);
113
+ }
114
+ if (this.subjectInuUse[jobid][isCanceled]) {
115
+ return;
116
+ }
117
+ this.handlerResult({
118
+ res: {
119
+ code: response.status,
120
+ data: JSON.stringify(response.data),
121
+ isArray,
122
+ jobid,
123
+ headers: RestHeaders.from(response.headers)
124
+ },
125
+ method,
126
+ jobid,
127
+ isArray
128
+ }, {
129
+ url,
130
+ body,
131
+ method,
132
+ isArray,
133
+ });
134
+ }
135
+ catch (catchedError) {
136
+ if (this.subjectInuUse[jobid][isCanceled]) {
137
+ return;
138
+ }
139
+ // console.log('ERROR RESPONESE catchedError typeof ', typeof catchedError)
140
+ // console.log('ERROR RESPONESE catchedError', catchedError)
141
+ if (typeof catchedError === 'object' && catchedError.response && catchedError.response.data) {
142
+ const err = catchedError.response.data;
143
+ const msg = catchedError.response.data.message || '';
144
+ let stack = (err.stack || '').split('\n');
145
+ const errObs = Resource['_listenErrors'];
146
+ errObs.next({
147
+ msg,
148
+ stack,
149
+ data: catchedError.response.data
150
+ });
151
+ }
152
+ const error = (catchedError && catchedError.response) ? `[${catchedError.response.statusText}]: ` : '';
153
+ this.handlerResult({
154
+ res: {
155
+ code: (catchedError && catchedError.response) ? catchedError.response.status : void 0,
156
+ error: `${error}${catchedError.message}`,
157
+ data: (catchedError && catchedError.response) ? JSON.stringify(catchedError.response.data) : void 0,
158
+ isArray,
159
+ jobid,
160
+ headers: RestHeaders.from(catchedError && catchedError.response && catchedError.response.headers)
161
+ },
162
+ method,
163
+ jobid,
164
+ isArray
165
+ }, {
166
+ url,
167
+ body,
168
+ isArray,
169
+ method
170
+ });
171
+ }
172
+ }
173
+ getReplay(method, meta, onlyGetLastReplayForMethod) {
174
+ let replay;
175
+ //#region prevent empty tree
176
+ if (_.isUndefined(this.replaySubjects[meta.endpoint])) {
177
+ // log.i(`(${meta.endpoint}) `);
178
+ this.replaySubjects[meta.endpoint] = {};
179
+ }
180
+ if (_.isUndefined(this.replaySubjects[meta.endpoint][meta.path])) {
181
+ // log.i(`(${meta.endpoint})(${meta.path}) `);
182
+ this.replaySubjects[meta.endpoint][meta.path] = {};
183
+ }
184
+ if (_.isUndefined(this.replaySubjects[meta.endpoint][meta.path][method])) {
185
+ // log.i(`(${meta.endpoint})(${meta.path}) `);
186
+ this.replaySubjects[meta.endpoint][meta.path][method] = {};
187
+ }
188
+ //#endregion
189
+ const objectIDToCreateOrLast = (Object.keys(this.replaySubjects[meta.endpoint][meta.path][method]).length) +
190
+ (onlyGetLastReplayForMethod ? 0 : 1);
191
+ if (onlyGetLastReplayForMethod && (objectIDToCreateOrLast === 0)) {
192
+ return replay;
193
+ }
194
+ if (_.isUndefined(this.replaySubjects[meta.endpoint][meta.path][method][objectIDToCreateOrLast])) {
195
+ // log.i(`(${meta.endpoint})(${meta.path})(${method}) `);
196
+ this.replaySubjects[meta.endpoint][meta.path][method][objectIDToCreateOrLast] = {
197
+ subject: new Subject(),
198
+ data: void 0,
199
+ };
200
+ }
201
+ replay = this.replaySubjects[meta.endpoint][meta.path][method][objectIDToCreateOrLast];
202
+ if (!_.isNumber(replay.id)) {
203
+ if (RestRequest.jobId === Number.MAX_SAFE_INTEGER) {
204
+ RestRequest.jobId = 0;
205
+ }
206
+ const jobid = RestRequest.jobId++;
207
+ replay.id = jobid;
208
+ const subject = replay.subject;
209
+ subject[jobIDkey] = jobid; // modify internal rxjs subject obj
210
+ this.meta[jobid] = meta;
211
+ this.subjectInuUse[jobid] = subject;
212
+ this.subjectInuUse[jobid][customObs] = new Observable((observer) => {
213
+ // observer.remove(() => {
214
+ // });
215
+ observer.add(() => {
216
+ // console.log(`cancel observable job${jobid}`)
217
+ if (!this.subjectInuUse[jobid][isCanceled]) {
218
+ this.subjectInuUse[jobid][isCanceled] = true;
219
+ if (typeof this.subjectInuUse[jobid][cancelFn] === 'function') {
220
+ this.subjectInuUse[jobid][cancelFn]('[ng2-rest] on purpose canceled http request');
221
+ }
222
+ }
223
+ else {
224
+ // console.log(`somehow second time cancel ${jobid}`)
225
+ }
226
+ });
227
+ const sub = subject.subscribe({
228
+ next: a => observer.next(a),
229
+ error: a => observer.error(a),
230
+ complete: () => {
231
+ sub.unsubscribe();
232
+ observer.complete();
233
+ },
234
+ });
235
+ });
236
+ //#region DISPOSE @UNCOMMENT AFTER TESTS
237
+ // if (objectIDToCreateOrLast > 2) {
238
+ // const oldReq: Models.ReplayData = this.replaySubjects[meta.endpoint][meta.path][method][(objectIDToCreateOrLast - 2)];
239
+ // if (_.isUndefined(this.meta[oldReq.id])) {
240
+ // // cant delete this - for counter purpose
241
+ // this.replaySubjects[meta.endpoint][meta.path][method][(objectIDToCreateOrLast - 2)] = {};
242
+ // delete this.subjectInuUse[oldReq.id];
243
+ // delete this.meta[oldReq.id];
244
+ // }
245
+ // }
246
+ //#endregion
247
+ }
248
+ return replay;
249
+ }
250
+ //#region http methods
251
+ generalReq(method, url, body, headers, meta, isArray, mockHttp) {
252
+ const replay = this.getReplay(method, meta, false);
253
+ replay.data = { url, body, headers, isArray };
254
+ ((pthis, purl, pmethod, pheaders, pbody, pid, pisArray, pmockHttp) => {
255
+ // log.d(`for ${purl} jobid ${pid}`);
256
+ setTimeout(() => pthis.req(purl, pmethod, pheaders, pbody, pid, pisArray, pmockHttp));
257
+ })(this, url, method, headers, body, replay.id, isArray, mockHttp);
258
+ const resp = firstValueFrom(replay.subject[customObs]);
259
+ resp.observable = replay.subject[customObs];
260
+ resp.cache = RequestCache.findBy({
261
+ body,
262
+ isArray,
263
+ method,
264
+ url
265
+ });
266
+ return resp;
267
+ }
268
+ get(url, body, headers, meta, isArray, mockHttp) {
269
+ return this.generalReq('get', url, body, headers, meta, isArray, mockHttp);
270
+ }
271
+ head(url, body, headers, meta, isArray, mockHttp) {
272
+ return this.generalReq('head', url, body, headers, meta, isArray, mockHttp);
273
+ }
274
+ delete(url, body, headers, meta, isArray, mockHttp) {
275
+ return this.generalReq('delete', url, body, headers, meta, isArray, mockHttp);
276
+ }
277
+ post(url, body, headers, meta, isArray, mockHttp) {
278
+ return this.generalReq('post', url, body, headers, meta, isArray, mockHttp);
279
+ }
280
+ put(url, body, headers, meta, isArray, mockHttp) {
281
+ return this.generalReq('put', url, body, headers, meta, isArray, mockHttp);
282
+ }
283
+ patch(url, body, headers, meta, isArray, mockHttp) {
284
+ return this.generalReq('patch', url, body, headers, meta, isArray, mockHttp);
285
+ }
286
+ jsonp(url, body, headers, meta, isArray, mockHttp) {
287
+ const replay = this.getReplay('jsonp', meta, false);
288
+ const jobid = replay.id;
289
+ const method = 'jsonp';
290
+ setTimeout(() => {
291
+ if (url.endsWith('/'))
292
+ url = url.slice(0, url.length - 1);
293
+ let num = Math.round(10000 * Math.random());
294
+ let callbackMethodName = "cb_" + num;
295
+ window[callbackMethodName] = (data) => {
296
+ if (this.checkCache({
297
+ url,
298
+ body,
299
+ isArray,
300
+ method
301
+ }, jobid)) {
302
+ return;
303
+ }
304
+ this.handlerResult({
305
+ res: {
306
+ data, isArray
307
+ },
308
+ method,
309
+ jobid,
310
+ isArray
311
+ }, {
312
+ url,
313
+ body,
314
+ isArray,
315
+ method,
316
+ });
317
+ };
318
+ let sc = document.createElement('script');
319
+ sc.src = `${url}?callback=${callbackMethodName}`;
320
+ document.body.appendChild(sc);
321
+ document.body.removeChild(sc);
322
+ });
323
+ const resp = firstValueFrom(replay.subject[customObs]);
324
+ resp.observable = replay.subject[customObs];
325
+ console.log('assiging custom observable');
326
+ resp.cache = RequestCache.findBy({
327
+ body,
328
+ isArray,
329
+ method,
330
+ url
331
+ });
332
+ return resp;
333
+ }
334
+ replay(method, meta) {
335
+ const replay = this.getReplay(method, meta, true);
336
+ if (!replay || !replay.data) {
337
+ console.warn(`Canno replay first ${method} request from ${meta.endpoint}/${meta.path}`);
338
+ return;
339
+ }
340
+ ;
341
+ if (replay && replay.subject && Array.isArray(replay.subject.observers) &&
342
+ replay.subject.observers.length === 0) {
343
+ console.warn(`No observators for ${method} request from ${meta.endpoint}/${meta.path}`);
344
+ return;
345
+ }
346
+ const url = replay.data.url;
347
+ const headers = replay.data.headers;
348
+ const body = replay.data.body;
349
+ const isArray = replay.data.isArray;
350
+ setTimeout(() => this.req(url, method, headers, body, replay.id, isArray));
351
+ }
352
+ }
353
+ RestRequest.jobId = 0;
354
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1yZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWJ1bmRsZS13ZWJzcWwvbmcyLXJlc3QvcHJvamVjdHMvbmcyLXJlc3Qvc3JjL2xpYi9yZXN0LXJlcXVlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEtBQXdCLE1BQU0sT0FBTyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsR0FBRyxFQUFVLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMseUJBQXlCLEVBQzVDLEtBQUssQ0FBQyxTQUFTLENBQ2xCLENBQUE7QUFFRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUM7QUFDekIsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDO0FBQzlCLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQztBQUM1QixNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUM7QUFHaEMsc0JBQXNCO0FBQ3RCLFlBQVk7QUFFWixNQUFNLE9BQU8sV0FBVztJQUF4QjtR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TUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDcEMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUM1RSxDQUFDOztBQWpiYyxpQkFBSyxHQUFHLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IF8gfSBmcm9tICd0bnAtY29yZS93ZWJzcWwnO1xuXG5pbXBvcnQgeyBNb2RlbHMgfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBSZXN0SGVhZGVycyB9IGZyb20gJy4vcmVzdC1oZWFkZXJzJztcblxuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gJ3RucC1jb3JlL3dlYnNxbCc7XG5pbXBvcnQgeyBMZXZlbCB9IGZyb20gJ25nMi1sb2dnZXIvd2Vic3FsJztcbmltcG9ydCBheGlvcywgeyBBeGlvc1Jlc3BvbnNlIH0gZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgUmVzb3VyY2UgfSBmcm9tICcuL3Jlc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nLCBMb2dnZXIgfSBmcm9tICduZzItbG9nZ2VyL3dlYnNxbCc7XG5cbmltcG9ydCB7IFJlcXVlc3RDYWNoZSB9IGZyb20gJy4vcmVxdWVzdC1jYWNoZSc7XG5jb25zdCBsb2cgPSBMb2cuY3JlYXRlKCdbbmcyLXJlc3RdIHJlc3QtcmVxdWVzdCdcbiAgLCBMZXZlbC5fX05PVEhJTkdcbilcblxuY29uc3Qgam9iSURrZXkgPSAnam9iSUQnO1xuY29uc3QgY3VzdG9tT2JzID0gJ2N1c3RvbU9icyc7XG5jb25zdCBjYW5jZWxGbiA9ICdjYW5jZWxGbic7XG5jb25zdCBpc0NhbmNlbGVkID0gJ2lzQ2FuY2VsZWQnO1xuZGVjbGFyZSBjb25zdCBnbG9iYWw6IGFueTtcblxuLy8jcmVnaW9uIG1vY2sgcmVxdWVzdFxuLy8jZW5kcmVnaW9uXG5cbmV4cG9ydCBjbGFzcyBSZXN0UmVxdWVzdCB7XG5cbiAgcHVibGljIHN0YXRpYyB6b25lO1xuICBwcml2YXRlIHN0YXRpYyBqb2JJZCA9IDA7XG4gIHByaXZhdGUgc3ViamVjdEludVVzZTogeyBbaWQ6IG51bWJlcl06IFN1YmplY3Q8YW55PiB9ID0ge307XG4gIHByaXZhdGUgbWV0YTogeyBbaWQ6IG51bWJlcl06IE1vZGVscy5NZXRhUmVxdWVzdCB9ID0ge307XG5cblxuICBwcml2YXRlIGhhbmRsZXJSZXN1bHQob3B0aW9uczogTW9kZWxzLkhhbmRsZVJlc3VsdE9wdGlvbnMsXG4gICAgc291cmNlUmVxdWVzdDogTW9kZWxzLkhhbmRsZVJlc3VsdFNvdXJjZVJlcXVlc3RPcHRpb25zKSB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQob3B0aW9ucykpIHtcbiAgICAgIG9wdGlvbnMgPSB7fSBhcyBhbnk7XG4gICAgfVxuICAgIC8vIGxvZy5kKGBIQU5ETEUgUkVTVUxUIChqb2JpZDoke29wdGlvbnMuam9iaWR9KSAke3NvdXJjZVJlcXVlc3QudXJsfWApO1xuICAgIGNvbnN0IHsgcmVzLCBqb2JpZCwgaXNBcnJheSwgbWV0aG9kIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKHR5cGVvZiByZXMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHJlc3Bvc25zZSBmb3IgcmVxdWVzdC4gJyk7XG4gICAgfVxuXG4gICAgaWYgKEhlbHBlcnMuaXNCcm93c2VyKSB7XG4gICAgICByZXMuaGVhZGVycyA9IFJlc3RIZWFkZXJzLmZyb20ocmVzLmhlYWRlcnMpO1xuICAgIH1cblxuICAgIC8vIGVycm9yIG5vIGludGVybmV0XG4gICAgaWYgKHJlcy5lcnJvcikge1xuICAgICAgdGhpcy5zdWJqZWN0SW51VXNlW2pvYmlkXS5lcnJvcihuZXcgTW9kZWxzLkh0dHBSZXNwb25zZUVycm9yKHJlcy5lcnJvciwgcmVzLmRhdGEsIHJlcy5oZWFkZXJzLCByZXMuY29kZSwgam9iaWQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZW50aXR5ID0gdGhpcy5tZXRhW2pvYmlkXS5lbnRpdHk7XG4gICAgY29uc3QgY2lyY3VsYXIgPSB0aGlzLm1ldGFbam9iaWRdLmNpcmN1bGFyO1xuXG4gICAgY29uc3Qgc3VjY2VzcyA9IChSZXNvdXJjZVsnX2xpc3RlblN1Y2Nlc3MnXSBhcyBTdWJqZWN0PE1vZGVscy5IdHRwUmVzcG9uc2U8YW55Pj4pXG5cbiAgICBjb25zdCByZXFSZXNwID0gbmV3IE1vZGVscy5IdHRwUmVzcG9uc2Uoc291cmNlUmVxdWVzdCwgcmVzLmRhdGEsIHJlcy5oZWFkZXJzLCByZXMuY29kZSwgZW50aXR5LCBjaXJjdWxhciwgam9iaWQsIGlzQXJyYXkpO1xuICAgIHN1Y2Nlc3MubmV4dChyZXFSZXNwKTtcblxuICAgIHRoaXMuc3ViamVjdEludVVzZVtqb2JpZF0ubmV4dChyZXFSZXNwKTtcbiAgICB0aGlzLm1ldGFbam9iaWRdID0gdm9pZCAwO1xuICAgIHRoaXMuc3ViamVjdEludVVzZVtqb2JpZF0uY29tcGxldGUoKTtcbiAgfVxuICBjaGVja0NhY2hlKHNvdXJjZVJlcXVlc3Q6IE1vZGVscy5IYW5kbGVSZXN1bHRTb3VyY2VSZXF1ZXN0T3B0aW9ucywgam9iaWQ6IG51bWJlcikge1xuICAgIGNvbnN0IGV4aXN0ZWRJbkNhY2hlID0gUmVxdWVzdENhY2hlLmZpbmRCeShzb3VyY2VSZXF1ZXN0KTtcbiAgICBpZiAoZXhpc3RlZEluQ2FjaGUpIHtcbiAgICAgIGxvZy5pKCdjYWNoZSBleGlzdHMnLCBleGlzdGVkSW5DYWNoZSlcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSAoUmVzb3VyY2VbJ19saXN0ZW5TdWNjZXNzJ10gYXMgU3ViamVjdDxNb2RlbHMuSHR0cFJlc3BvbnNlPGFueT4+KTtcbiAgICAgIHN1Y2Nlc3MubmV4dChleGlzdGVkSW5DYWNoZS5yZXNwb25zZSk7XG4gICAgICB0aGlzLnN1YmplY3RJbnVVc2Vbam9iaWRdLm5leHQoZXhpc3RlZEluQ2FjaGUpO1xuICAgICAgdGhpcy5zdWJqZWN0SW51VXNlW2pvYmlkXS5jb21wbGV0ZSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIGxvZy5pKGBjYWNoZSBub3QgZXhpc3RzIGZvciBqb2JpZCAke2pvYmlkfWApXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXEoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgbWV0aG9kOiBNb2RlbHMuSHR0cE1ldGhvZCxcbiAgICBoZWFkZXJzPzogUmVzdEhlYWRlcnMsXG4gICAgYm9keT86IGFueSxcbiAgICBqb2JpZD86IG51bWJlcixcbiAgICBpc0FycmF5ID0gZmFsc2UsXG4gICAgbW9ja0h0dHA/OiBNb2RlbHMuTW9ja0h0dHBcbiAgKSB7XG4gICAgaWYgKHRoaXMuY2hlY2tDYWNoZSh7XG4gICAgICB1cmwsXG4gICAgICBib2R5LFxuICAgICAgaXNBcnJheSxcbiAgICAgIG1ldGhvZFxuICAgIH0sIGpvYmlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IENhbmNlbFRva2VuID0gYXhpb3MuQ2FuY2VsVG9rZW47XG4gICAgY29uc3Qgc291cmNlID0gQ2FuY2VsVG9rZW4uc291cmNlKCk7XG4gICAgdGhpcy5zdWJqZWN0SW51VXNlW2pvYmlkXVtjYW5jZWxGbl0gPSBzb3VyY2UuY2FuY2VsO1xuXG4gICAgdmFyIHJlc3BvbnNlOiBBeGlvc1Jlc3BvbnNlPGFueT47XG4gICAgaWYgKG1vY2tIdHRwKSB7XG5cbiAgICAgIGlmICh0eXBlb2YgbW9ja0h0dHAgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJlc3BvbnNlID0ge1xuICAgICAgICAgIGRhdGE6IG1vY2tIdHRwLmRhdGEsXG4gICAgICAgICAgc3RhdHVzOiBtb2NrSHR0cC5jb2RlLFxuICAgICAgICAgIGhlYWRlcnM6IG1vY2tIdHRwLmhlYWRlcnMsXG4gICAgICAgICAgc3RhdHVzVGV4dDogbW9ja0h0dHAuZXJyb3IsXG4gICAgICAgICAgY29uZmlnOiB7fVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2NrSHR0cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCByID0gbW9ja0h0dHAodXJsLCBtZXRob2QsIGhlYWRlcnMsIGJvZHkpO1xuICAgICAgICByZXNwb25zZSA9IHtcbiAgICAgICAgICBkYXRhOiByLmRhdGEsXG4gICAgICAgICAgc3RhdHVzOiByLmNvZGUsXG4gICAgICAgICAgaGVhZGVyczogci5oZWFkZXJzLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHIuZXJyb3IsXG4gICAgICAgICAgY29uZmlnOiB7fVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFske21ldGhvZH1dIChqb2JpZD0ke2pvYmlkfSkgcmVxdWVzdCB0bzogICR7dXJsfWApO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGhlYWRlcnMudG9KU09OKCkpXG5cbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBheGlvcyh7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBkYXRhOiBib2R5LFxuICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMudG9KU09OKCksXG4gICAgICAgICAgY2FuY2VsVG9rZW46IHNvdXJjZS50b2tlbixcbiAgICAgICAgICAvLyB3aXRoQ3JlZGVudGlhbHM6IHRydWUsIC8vIHRoaXMgY2FuIGJlIGRvbmUgbWFudWFsbHlcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGxvZy5kKGBhZnRlciByZXNwb25zZSBvZiBqb2JpZDogJHtqb2JpZH1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3ViamVjdEludVVzZVtqb2JpZF1baXNDYW5jZWxlZF0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmhhbmRsZXJSZXN1bHQoe1xuICAgICAgICByZXM6IHtcbiAgICAgICAgICBjb2RlOiByZXNwb25zZS5zdGF0dXMgYXMgYW55LFxuICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlLmRhdGEpLFxuICAgICAgICAgIGlzQXJyYXksXG4gICAgICAgICAgam9iaWQsXG4gICAgICAgICAgaGVhZGVyczogUmVzdEhlYWRlcnMuZnJvbShyZXNwb25zZS5oZWFkZXJzKVxuICAgICAgICB9LFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGpvYmlkLFxuICAgICAgICBpc0FycmF5XG4gICAgICB9LCB7XG4gICAgICAgIHVybCxcbiAgICAgICAgYm9keSxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBpc0FycmF5LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoY2F0Y2hlZEVycm9yKSB7XG4gICAgICBpZiAodGhpcy5zdWJqZWN0SW51VXNlW2pvYmlkXVtpc0NhbmNlbGVkXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBjb25zb2xlLmxvZygnRVJST1IgUkVTUE9ORVNFIGNhdGNoZWRFcnJvciB0eXBlb2YgJywgdHlwZW9mIGNhdGNoZWRFcnJvcilcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdFUlJPUiBSRVNQT05FU0UgY2F0Y2hlZEVycm9yJywgY2F0Y2hlZEVycm9yKVxuICAgICAgaWYgKHR5cGVvZiBjYXRjaGVkRXJyb3IgPT09ICdvYmplY3QnICYmIGNhdGNoZWRFcnJvci5yZXNwb25zZSAmJiBjYXRjaGVkRXJyb3IucmVzcG9uc2UuZGF0YSkge1xuICAgICAgICBjb25zdCBlcnIgPSBjYXRjaGVkRXJyb3IucmVzcG9uc2UuZGF0YTtcbiAgICAgICAgY29uc3QgbXNnOiBzdHJpbmcgPSBjYXRjaGVkRXJyb3IucmVzcG9uc2UuZGF0YS5tZXNzYWdlIHx8ICcnO1xuICAgICAgICBsZXQgc3RhY2s6IHN0cmluZ1tdID0gKGVyci5zdGFjayB8fCAnJykuc3BsaXQoJ1xcbicpO1xuXG4gICAgICAgIGNvbnN0IGVyck9icyA9IChSZXNvdXJjZVsnX2xpc3RlbkVycm9ycyddIGFzIFN1YmplY3Q8TW9kZWxzLkJhY2tlbmRFcnJvcj4pO1xuICAgICAgICBlcnJPYnMubmV4dCh7XG4gICAgICAgICAgbXNnLFxuICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgIGRhdGE6IGNhdGNoZWRFcnJvci5yZXNwb25zZS5kYXRhXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3IgPSAoY2F0Y2hlZEVycm9yICYmIGNhdGNoZWRFcnJvci5yZXNwb25zZSkgPyBgWyR7Y2F0Y2hlZEVycm9yLnJlc3BvbnNlLnN0YXR1c1RleHR9XTogYCA6ICcnO1xuICAgICAgdGhpcy5oYW5kbGVyUmVzdWx0KHtcbiAgICAgICAgcmVzOiB7XG4gICAgICAgICAgY29kZTogKGNhdGNoZWRFcnJvciAmJiBjYXRjaGVkRXJyb3IucmVzcG9uc2UpID8gY2F0Y2hlZEVycm9yLnJlc3BvbnNlLnN0YXR1cyBhcyBhbnkgOiB2b2lkIDAsXG4gICAgICAgICAgZXJyb3I6IGAke2Vycm9yfSR7Y2F0Y2hlZEVycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICBkYXRhOiAoY2F0Y2hlZEVycm9yICYmIGNhdGNoZWRFcnJvci5yZXNwb25zZSkgPyBKU09OLnN0cmluZ2lmeShjYXRjaGVkRXJyb3IucmVzcG9uc2UuZGF0YSkgOiB2b2lkIDAsXG4gICAgICAgICAgaXNBcnJheSxcbiAgICAgICAgICBqb2JpZCxcbiAgICAgICAgICBoZWFkZXJzOiBSZXN0SGVhZGVycy5mcm9tKGNhdGNoZWRFcnJvciAmJiBjYXRjaGVkRXJyb3IucmVzcG9uc2UgJiYgY2F0Y2hlZEVycm9yLnJlc3BvbnNlLmhlYWRlcnMpXG4gICAgICAgIH0sXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgam9iaWQsXG4gICAgICAgIGlzQXJyYXlcbiAgICAgIH0sIHtcbiAgICAgICAgdXJsLFxuICAgICAgICBib2R5LFxuICAgICAgICBpc0FycmF5LFxuICAgICAgICBtZXRob2RcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVwbGF5KG1ldGhvZDogTW9kZWxzLkh0dHBNZXRob2QsIG1ldGE6IE1vZGVscy5NZXRhUmVxdWVzdCwgb25seUdldExhc3RSZXBsYXlGb3JNZXRob2Q6IGJvb2xlYW4pOiBNb2RlbHMuUmVwbGF5RGF0YSB7XG4gICAgbGV0IHJlcGxheTogTW9kZWxzLlJlcGxheURhdGE7XG5cbiAgICAvLyNyZWdpb24gcHJldmVudCBlbXB0eSB0cmVlXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5yZXBsYXlTdWJqZWN0c1ttZXRhLmVuZHBvaW50XSkpIHtcbiAgICAgIC8vIGxvZy5pKGAoJHttZXRhLmVuZHBvaW50fSkgYCk7XG4gICAgICB0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdID0ge307XG4gICAgfVxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMucmVwbGF5U3ViamVjdHNbbWV0YS5lbmRwb2ludF1bbWV0YS5wYXRoXSkpIHtcbiAgICAgIC8vIGxvZy5pKGAoJHttZXRhLmVuZHBvaW50fSkoJHttZXRhLnBhdGh9KSBgKTtcbiAgICAgIHRoaXMucmVwbGF5U3ViamVjdHNbbWV0YS5lbmRwb2ludF1bbWV0YS5wYXRoXSA9IHt9O1xuICAgIH1cbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdW21ldGEucGF0aF1bbWV0aG9kXSkpIHtcbiAgICAgIC8vIGxvZy5pKGAoJHttZXRhLmVuZHBvaW50fSkoJHttZXRhLnBhdGh9KSBgKTtcbiAgICAgIHRoaXMucmVwbGF5U3ViamVjdHNbbWV0YS5lbmRwb2ludF1bbWV0YS5wYXRoXVttZXRob2RdID0ge307XG4gICAgfVxuICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgY29uc3Qgb2JqZWN0SURUb0NyZWF0ZU9yTGFzdCA9IChPYmplY3Qua2V5cyh0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdW21ldGEucGF0aF1bbWV0aG9kXSBhcyBPYmplY3QpLmxlbmd0aCkgK1xuICAgICAgKG9ubHlHZXRMYXN0UmVwbGF5Rm9yTWV0aG9kID8gMCA6IDEpO1xuICAgIGlmIChvbmx5R2V0TGFzdFJlcGxheUZvck1ldGhvZCAmJiAob2JqZWN0SURUb0NyZWF0ZU9yTGFzdCA9PT0gMCkpIHtcbiAgICAgIHJldHVybiByZXBsYXk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5yZXBsYXlTdWJqZWN0c1ttZXRhLmVuZHBvaW50XVttZXRhLnBhdGhdW21ldGhvZF1bb2JqZWN0SURUb0NyZWF0ZU9yTGFzdF0pKSB7XG4gICAgICAvLyBsb2cuaShgKCR7bWV0YS5lbmRwb2ludH0pKCR7bWV0YS5wYXRofSkoJHttZXRob2R9KSBgKTtcbiAgICAgIHRoaXMucmVwbGF5U3ViamVjdHNbbWV0YS5lbmRwb2ludF1bbWV0YS5wYXRoXVttZXRob2RdW29iamVjdElEVG9DcmVhdGVPckxhc3RdID0gPE1vZGVscy5SZXBsYXlEYXRhPntcbiAgICAgICAgc3ViamVjdDogbmV3IFN1YmplY3QoKSxcbiAgICAgICAgZGF0YTogdm9pZCAwLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXBsYXkgPSB0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdW21ldGEucGF0aF1bbWV0aG9kXVtvYmplY3RJRFRvQ3JlYXRlT3JMYXN0XTtcblxuICAgIGlmICghXy5pc051bWJlcihyZXBsYXkuaWQpKSB7XG4gICAgICBpZiAoUmVzdFJlcXVlc3Quam9iSWQgPT09IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIFJlc3RSZXF1ZXN0LmpvYklkID0gMDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgam9iaWQ6IG51bWJlciA9IFJlc3RSZXF1ZXN0LmpvYklkKys7XG4gICAgICByZXBsYXkuaWQgPSBqb2JpZDtcbiAgICAgIGNvbnN0IHN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IHJlcGxheS5zdWJqZWN0O1xuICAgICAgc3ViamVjdFtqb2JJRGtleV0gPSBqb2JpZDsgLy8gbW9kaWZ5IGludGVybmFsIHJ4anMgc3ViamVjdCBvYmpcblxuICAgICAgdGhpcy5tZXRhW2pvYmlkXSA9IG1ldGE7XG4gICAgICB0aGlzLnN1YmplY3RJbnVVc2Vbam9iaWRdID0gc3ViamVjdDtcblxuICAgICAgdGhpcy5zdWJqZWN0SW51VXNlW2pvYmlkXVtjdXN0b21PYnNdID0gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgICAgIC8vIG9ic2VydmVyLnJlbW92ZSgoKSA9PiB7XG5cbiAgICAgICAgLy8gfSk7XG4gICAgICAgIG9ic2VydmVyLmFkZCgoKSA9PiB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coYGNhbmNlbCBvYnNlcnZhYmxlIGpvYiR7am9iaWR9YClcbiAgICAgICAgICBpZiAoIXRoaXMuc3ViamVjdEludVVzZVtqb2JpZF1baXNDYW5jZWxlZF0pIHtcbiAgICAgICAgICAgIHRoaXMuc3ViamVjdEludVVzZVtqb2JpZF1baXNDYW5jZWxlZF0gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN1YmplY3RJbnVVc2Vbam9iaWRdW2NhbmNlbEZuXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICB0aGlzLnN1YmplY3RJbnVVc2Vbam9iaWRdW2NhbmNlbEZuXSgnW25nMi1yZXN0XSBvbiBwdXJwb3NlIGNhbmNlbGVkIGh0dHAgcmVxdWVzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgc29tZWhvdyBzZWNvbmQgdGltZSBjYW5jZWwgJHtqb2JpZH1gKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgY29uc3Qgc3ViID0gc3ViamVjdC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IGEgPT4gb2JzZXJ2ZXIubmV4dChhKSxcbiAgICAgICAgICBlcnJvcjogYSA9PiBvYnNlcnZlci5lcnJvcihhKSxcbiAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuXG4gICAgICAvLyNyZWdpb24gRElTUE9TRSAgQFVOQ09NTUVOVCBBRlRFUiBURVNUU1xuICAgICAgLy8gaWYgKG9iamVjdElEVG9DcmVhdGVPckxhc3QgPiAyKSB7XG4gICAgICAvLyAgIGNvbnN0IG9sZFJlcTogTW9kZWxzLlJlcGxheURhdGEgPSB0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdW21ldGEucGF0aF1bbWV0aG9kXVsob2JqZWN0SURUb0NyZWF0ZU9yTGFzdCAtIDIpXTtcbiAgICAgIC8vICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5tZXRhW29sZFJlcS5pZF0pKSB7XG4gICAgICAvLyAgICAgLy8gY2FudCBkZWxldGUgdGhpcyAtIGZvciBjb3VudGVyIHB1cnBvc2VcbiAgICAgIC8vICAgICB0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdW21ldGEucGF0aF1bbWV0aG9kXVsob2JqZWN0SURUb0NyZWF0ZU9yTGFzdCAtIDIpXSA9IHt9O1xuICAgICAgLy8gICAgIGRlbGV0ZSB0aGlzLnN1YmplY3RJbnVVc2Vbb2xkUmVxLmlkXTtcbiAgICAgIC8vICAgICBkZWxldGUgdGhpcy5tZXRhW29sZFJlcS5pZF07XG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH1cbiAgICAgIC8vI2VuZHJlZ2lvblxuICAgIH1cblxuICAgIHJldHVybiByZXBsYXk7XG4gIH1cblxuXG4gIC8vI3JlZ2lvbiBodHRwIG1ldGhvZHNcblxuICBwcml2YXRlIGdlbmVyYWxSZXEoXG4gICAgbWV0aG9kOiBNb2RlbHMuSHR0cE1ldGhvZCxcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgaGVhZGVyczogUmVzdEhlYWRlcnMsXG4gICAgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LFxuICAgIGlzQXJyYXk6IGJvb2xlYW4sXG4gICAgbW9ja0h0dHA6IE1vZGVscy5Nb2NrSHR0cCk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxhbnk+IHtcblxuICAgIGNvbnN0IHJlcGxheTogTW9kZWxzLlJlcGxheURhdGEgPSB0aGlzLmdldFJlcGxheShtZXRob2QsIG1ldGEsIGZhbHNlKTtcbiAgICByZXBsYXkuZGF0YSA9IHsgdXJsLCBib2R5LCBoZWFkZXJzLCBpc0FycmF5IH07XG5cbiAgICAoKHB0aGlzLCBwdXJsLCBwbWV0aG9kLCBwaGVhZGVycywgcGJvZHksIHBpZCwgcGlzQXJyYXksIHBtb2NrSHR0cCkgPT4ge1xuICAgICAgLy8gbG9nLmQoYGZvciAke3B1cmx9IGpvYmlkICR7cGlkfWApO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBwdGhpcy5yZXEocHVybCwgcG1ldGhvZCwgcGhlYWRlcnMsIHBib2R5LCBwaWQsIHBpc0FycmF5LCBwbW9ja0h0dHApKTtcbiAgICB9KSh0aGlzLCB1cmwsIG1ldGhvZCwgaGVhZGVycywgYm9keSwgcmVwbGF5LmlkLCBpc0FycmF5LCBtb2NrSHR0cClcblxuICAgIGNvbnN0IHJlc3A6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxhbnk+ID0gZmlyc3RWYWx1ZUZyb20ocmVwbGF5LnN1YmplY3RbY3VzdG9tT2JzXSkgYXMgYW55O1xuICAgIHJlc3Aub2JzZXJ2YWJsZSA9IHJlcGxheS5zdWJqZWN0W2N1c3RvbU9ic107XG4gICAgcmVzcC5jYWNoZSA9IFJlcXVlc3RDYWNoZS5maW5kQnkoe1xuICAgICAgYm9keSxcbiAgICAgIGlzQXJyYXksXG4gICAgICBtZXRob2QsXG4gICAgICB1cmxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcDtcbiAgfVxuXG4gIGdldChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgaGVhZGVyczogUmVzdEhlYWRlcnMsXG4gICAgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LFxuICAgIGlzQXJyYXk6IGJvb2xlYW4sIG1vY2tIdHRwOiBNb2RlbHMuTW9ja0h0dHBcbiAgKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYWxSZXEoJ2dldCcsIHVybCwgYm9keSwgaGVhZGVycywgbWV0YSwgaXNBcnJheSwgbW9ja0h0dHApO1xuICB9XG5cbiAgaGVhZChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgaGVhZGVyczogUmVzdEhlYWRlcnMsXG4gICAgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LFxuICAgIGlzQXJyYXk6IGJvb2xlYW4sIG1vY2tIdHRwOiBNb2RlbHMuTW9ja0h0dHBcbiAgKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYWxSZXEoJ2hlYWQnLCB1cmwsIGJvZHksIGhlYWRlcnMsIG1ldGEsIGlzQXJyYXksIG1vY2tIdHRwKTtcbiAgfVxuXG4gIGRlbGV0ZShcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgaGVhZGVyczogUmVzdEhlYWRlcnMsXG4gICAgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LFxuICAgIGlzQXJyYXk6IGJvb2xlYW4sXG4gICAgbW9ja0h0dHA6IE1vZGVscy5Nb2NrSHR0cCk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmFsUmVxKCdkZWxldGUnLCB1cmwsIGJvZHksIGhlYWRlcnMsIG1ldGEsIGlzQXJyYXksIG1vY2tIdHRwKTtcbiAgfVxuXG4gIHBvc3QoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYm9keTogc3RyaW5nLFxuICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzLFxuICAgIG1ldGE6IE1vZGVscy5NZXRhUmVxdWVzdCxcbiAgICBpc0FycmF5OiBib29sZWFuLFxuICAgIG1vY2tIdHRwOiBNb2RlbHMuTW9ja0h0dHBcbiAgKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYWxSZXEoJ3Bvc3QnLCB1cmwsIGJvZHksIGhlYWRlcnMsIG1ldGEsIGlzQXJyYXksIG1vY2tIdHRwKTtcbiAgfVxuXG4gIHB1dChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgaGVhZGVyczogUmVzdEhlYWRlcnMsXG4gICAgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LFxuICAgIGlzQXJyYXk6IGJvb2xlYW4sXG4gICAgbW9ja0h0dHA6IE1vZGVscy5Nb2NrSHR0cFxuICApOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhbFJlcSgncHV0JywgdXJsLCBib2R5LCBoZWFkZXJzLCBtZXRhLCBpc0FycmF5LCBtb2NrSHR0cCk7XG4gIH1cblxuICBwYXRjaChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgaGVhZGVyczogUmVzdEhlYWRlcnMsXG4gICAgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LFxuICAgIGlzQXJyYXk6IGJvb2xlYW4sXG4gICAgbW9ja0h0dHA6IE1vZGVscy5Nb2NrSHR0cFxuICApOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhbFJlcSgncGF0Y2gnLCB1cmwsIGJvZHksIGhlYWRlcnMsIG1ldGEsIGlzQXJyYXksIG1vY2tIdHRwKTtcbiAgfVxuXG4gIGpzb25wKFxuICAgIHVybDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZyxcbiAgICBoZWFkZXJzOiBSZXN0SGVhZGVycyxcbiAgICBtZXRhOiBNb2RlbHMuTWV0YVJlcXVlc3QsXG4gICAgaXNBcnJheTogYm9vbGVhbixcbiAgICBtb2NrSHR0cDogTW9kZWxzLk1vY2tIdHRwXG4gICk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxhbnk+IHtcblxuICAgIGNvbnN0IHJlcGxheTogTW9kZWxzLlJlcGxheURhdGEgPSB0aGlzLmdldFJlcGxheSgnanNvbnAnLCBtZXRhLCBmYWxzZSk7XG4gICAgY29uc3Qgam9iaWQgPSByZXBsYXkuaWQ7XG4gICAgY29uc3QgbWV0aG9kID0gJ2pzb25wJ1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHVybC5lbmRzV2l0aCgnLycpKSB1cmwgPSB1cmwuc2xpY2UoMCwgdXJsLmxlbmd0aCAtIDEpXG4gICAgICBsZXQgbnVtID0gTWF0aC5yb3VuZCgxMDAwMCAqIE1hdGgucmFuZG9tKCkpO1xuICAgICAgbGV0IGNhbGxiYWNrTWV0aG9kTmFtZSA9IFwiY2JfXCIgKyBudW07XG4gICAgICB3aW5kb3dbY2FsbGJhY2tNZXRob2ROYW1lXSA9IChkYXRhKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrQ2FjaGUoe1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIGlzQXJyYXksXG4gICAgICAgICAgbWV0aG9kXG4gICAgICAgIH0sIGpvYmlkKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhbmRsZXJSZXN1bHQoe1xuICAgICAgICAgIHJlczoge1xuICAgICAgICAgICAgZGF0YSwgaXNBcnJheVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIGpvYmlkLFxuICAgICAgICAgIGlzQXJyYXlcbiAgICAgICAgfSwge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIGlzQXJyYXksXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgbGV0IHNjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBzYy5zcmMgPSBgJHt1cmx9P2NhbGxiYWNrPSR7Y2FsbGJhY2tNZXRob2ROYW1lfWA7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2MpO1xuICAgIH0pXG5cbiAgICBjb25zdCByZXNwOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8YW55PiA9IGZpcnN0VmFsdWVGcm9tKHJlcGxheS5zdWJqZWN0W2N1c3RvbU9ic10pIGFzIGFueTtcbiAgICByZXNwLm9ic2VydmFibGUgPSByZXBsYXkuc3ViamVjdFtjdXN0b21PYnNdO1xuICAgIGNvbnNvbGUubG9nKCdhc3NpZ2luZyBjdXN0b20gb2JzZXJ2YWJsZScpXG4gICAgcmVzcC5jYWNoZSA9IFJlcXVlc3RDYWNoZS5maW5kQnkoe1xuICAgICAgYm9keSxcbiAgICAgIGlzQXJyYXksXG4gICAgICBtZXRob2QsXG4gICAgICB1cmxcbiAgICB9KVxuICAgIHJldHVybiByZXNwO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuICBwcml2YXRlIHJlcGxheVN1YmplY3RzID0ge307XG4gIHB1YmxpYyByZXBsYXkobWV0aG9kOiBNb2RlbHMuSHR0cE1ldGhvZCwgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0KSB7XG4gICAgY29uc3QgcmVwbGF5OiBNb2RlbHMuUmVwbGF5RGF0YSA9IHRoaXMuZ2V0UmVwbGF5KG1ldGhvZCwgbWV0YSwgdHJ1ZSk7XG4gICAgaWYgKCFyZXBsYXkgfHwgIXJlcGxheS5kYXRhKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbm5vIHJlcGxheSBmaXJzdCAke21ldGhvZH0gcmVxdWVzdCBmcm9tICR7bWV0YS5lbmRwb2ludH0vJHttZXRhLnBhdGh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfTtcbiAgICBpZiAocmVwbGF5ICYmIHJlcGxheS5zdWJqZWN0ICYmIEFycmF5LmlzQXJyYXkocmVwbGF5LnN1YmplY3Qub2JzZXJ2ZXJzKSAmJlxuICAgICAgcmVwbGF5LnN1YmplY3Qub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS53YXJuKGBObyBvYnNlcnZhdG9ycyBmb3IgJHttZXRob2R9IHJlcXVlc3QgZnJvbSAke21ldGEuZW5kcG9pbnR9LyR7bWV0YS5wYXRofWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSByZXBsYXkuZGF0YS51cmw7XG4gICAgY29uc3QgaGVhZGVycyA9IHJlcGxheS5kYXRhLmhlYWRlcnM7XG4gICAgY29uc3QgYm9keSA9IHJlcGxheS5kYXRhLmJvZHk7XG4gICAgY29uc3QgaXNBcnJheSA9IHJlcGxheS5kYXRhLmlzQXJyYXk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlcSh1cmwsIG1ldGhvZCwgaGVhZGVycywgYm9keSwgcmVwbGF5LmlkLCBpc0FycmF5KSlcbiAgfVxuXG59XG4iXX0=
@@ -0,0 +1,125 @@
1
+ import { getRestParams, getParamsUrl } from './params';
2
+ import { RestHeaders } from './rest-headers';
3
+ import { CONTENT_TYPE } from './content-type';
4
+ //#endregion
5
+ export class Rest {
6
+ constructor(endpoint, request, meta, customContentType) {
7
+ this.request = request;
8
+ this.meta = meta;
9
+ this.customContentType = customContentType;
10
+ //#endregion
11
+ //#region constructor
12
+ this._headers = RestHeaders.from(CONTENT_TYPE.APPLICATION_JSON);
13
+ //#endregion
14
+ this.array = {
15
+ get: (params = void 0, doNotSerializeParams) => {
16
+ return this.req('get', void 0, params, doNotSerializeParams, true);
17
+ },
18
+ head: (params = void 0, doNotSerializeParams) => {
19
+ return this.req('head', void 0, params, doNotSerializeParams, true);
20
+ },
21
+ post: (item, params, doNotSerializeParams) => {
22
+ return this.req('post', item, params, doNotSerializeParams, true);
23
+ },
24
+ put: (item, params, doNotSerializeParams) => {
25
+ return this.req('put', item, params, doNotSerializeParams, true);
26
+ },
27
+ patch: (item, params, doNotSerializeParams) => {
28
+ return this.req('patch', item, params, doNotSerializeParams, true);
29
+ },
30
+ delete: (params, doNotSerializeParams) => {
31
+ return this.req('delete', void 0, params, doNotSerializeParams, true);
32
+ },
33
+ jsonp: (params, doNotSerializeParams) => {
34
+ return this.req('jsonp', void 0, params, doNotSerializeParams, true);
35
+ }
36
+ };
37
+ this.__meta_endpoint = endpoint;
38
+ }
39
+ mock(mock) {
40
+ if ((typeof mock === 'function') || (typeof mock === 'object')) {
41
+ this.mockHttp = mock;
42
+ }
43
+ else {
44
+ throw `[ng2-rest]
45
+ .model(...)
46
+ .mock( < BAD MOCK DATA > )
47
+ ...
48
+ `;
49
+ }
50
+ return this;
51
+ }
52
+ get endpoint() {
53
+ let e = this.__meta_endpoint;
54
+ if (this.restQueryParams !== void 0 && this._endpointRest !== void 0
55
+ && typeof this._endpointRest === 'string' && this._endpointRest.trim() !== '')
56
+ e = this._endpointRest;
57
+ return e;
58
+ }
59
+ set __rest_endpoint(endpoint) {
60
+ this._endpointRest = endpoint;
61
+ if (endpoint === void 0) {
62
+ this.restQueryParams = void 0;
63
+ }
64
+ else {
65
+ this.restQueryParams = getRestParams(endpoint, this.__meta_endpoint);
66
+ }
67
+ }
68
+ creatUrl(params, doNotSerializeParams = false) {
69
+ return `${this.endpoint}${getParamsUrl(params, doNotSerializeParams)}`;
70
+ }
71
+ get headers() {
72
+ return this._headers;
73
+ }
74
+ //#endregion
75
+ //#region req
76
+ req(method, item, params, doNotSerializeParams = false, isArray = false) {
77
+ const modelUrl = this.creatUrl(params, doNotSerializeParams);
78
+ const body = item ? JSON.stringify(item) : void 0;
79
+ // console.log('this.customContentType', this.customContentType)
80
+ if (this.customContentType) {
81
+ const customHeaderKeys = this.customContentType.keys();
82
+ const currentHeaderKeys = this._headers.keys();
83
+ currentHeaderKeys
84
+ .filter(key => !customHeaderKeys.includes(key))
85
+ .forEach(key => {
86
+ this.customContentType.set(key, this._headers.get(key));
87
+ });
88
+ this._headers = this.customContentType;
89
+ }
90
+ else {
91
+ this._headers = RestHeaders.from(CONTENT_TYPE.APPLICATION_JSON);
92
+ }
93
+ const result = this.request[method.toLowerCase()](modelUrl, body, this.headers, this.meta, isArray, this.mockHttp);
94
+ this.mockHttp = void 0;
95
+ return result;
96
+ }
97
+ //#endregion
98
+ //#region http methods
99
+ //#region replay
100
+ replay(method) {
101
+ this.request.replay(method, this.meta);
102
+ }
103
+ get(params, doNotSerializeParams = false) {
104
+ return this.req('get', void 0, params, doNotSerializeParams);
105
+ }
106
+ head(params, doNotSerializeParams = false) {
107
+ return this.req('head', void 0, params, doNotSerializeParams);
108
+ }
109
+ post(item, params, doNotSerializeParams = false) {
110
+ return this.req('post', item, params, doNotSerializeParams);
111
+ }
112
+ put(item, params, doNotSerializeParams = false) {
113
+ return this.req('put', item, params, doNotSerializeParams);
114
+ }
115
+ patch(item, params, doNotSerializeParams = false) {
116
+ return this.req('patch', item, params, doNotSerializeParams);
117
+ }
118
+ delete(params, doNotSerializeParams = false) {
119
+ return this.req('delete', void 0, params, doNotSerializeParams);
120
+ }
121
+ jsonp(params, doNotSerializeParams = false) {
122
+ return this.req('jsonp', void 0, params, doNotSerializeParams);
123
+ }
124
+ }
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RtcC1saWJzLWZvci1idW5kbGUtd2Vic3FsL25nMi1yZXN0L3Byb2plY3RzL25nMi1yZXN0L3NyYy9saWIvcmVzdC5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLFlBQVk7QUFFWixNQUFNLE9BQU8sSUFBSTtJQWlEZixZQUNFLFFBQWdCLEVBQ1IsT0FBb0IsRUFDcEIsSUFBd0IsRUFDeEIsaUJBQThCO1FBRjlCLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFDcEIsU0FBSSxHQUFKLElBQUksQ0FBb0I7UUFDeEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFhO1FBWHhDLFlBQVk7UUFFWixzQkFBc0I7UUFDZCxhQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQTREbkUsWUFBWTtRQUVaLFVBQUssR0FBRztZQUNOLEdBQUcsRUFBRSxDQUFDLFNBQTZCLEtBQUssQ0FBQyxFQUFFLG9CQUE4QixFQUF3RCxFQUFFO2dCQUNqSSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxJQUFJLENBQVEsQ0FBQTtZQUMzRSxDQUFDO1lBQ0QsSUFBSSxFQUFFLENBQUMsU0FBNkIsS0FBSyxDQUFDLEVBQUUsb0JBQThCLEVBQXdELEVBQUU7Z0JBQ2xJLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixFQUFFLElBQUks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LG9CQUFvQixDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUEyQixFQUFFLHVCQUFnQyxLQUFLO1FBQ3ZFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUEyQixFQUFFLHVCQUFnQyxLQUFLO1FBQ3RFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDakUsQ0FBQztDQUdGIiwic291cmNlc0NvbnRlbnQiOlsiLy8jcmVnaW9uIGltcG9ydFxuaW1wb3J0IHsgTG9nLCBMZXZlbCB9IGZyb20gJ25nMi1sb2dnZXIvd2Vic3FsJztcbi8vIGNvbnN0IGxvZyA9IExvZy5jcmVhdGUoJ3Jlc3QuY2xhc3MnLCBMZXZlbC5fX05PVEhJTkcpXG4vLyBsb2NhbFxuaW1wb3J0IHsgTW9kZWxzIH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgZ2V0UmVzdFBhcmFtcywgZ2V0UGFyYW1zVXJsIH0gZnJvbSAnLi9wYXJhbXMnO1xuaW1wb3J0IHsgUmVzdFJlcXVlc3QgfSBmcm9tICcuL3Jlc3QtcmVxdWVzdCc7XG5pbXBvcnQgeyBSZXN0SGVhZGVycyB9IGZyb20gJy4vcmVzdC1oZWFkZXJzJztcbmltcG9ydCB7IENPTlRFTlRfVFlQRSB9IGZyb20gJy4vY29udGVudC10eXBlJztcbi8vI2VuZHJlZ2lvblxuXG5leHBvcnQgY2xhc3MgUmVzdDxULCBUQSA9IFRbXT4gaW1wbGVtZW50cyBNb2RlbHMuRm5NZXRob2RzSHR0cFdpdGhNb2NrPFQsIFRBPiB7XG5cbiAgcHJpdmF0ZSBtb2NrSHR0cDogTW9kZWxzLk1vY2tIdHRwO1xuICBtb2NrKG1vY2s6IE1vZGVscy5Nb2NrSHR0cCk6IE1vZGVscy5Gbk1ldGhvZHNIdHRwPFQsIFRBPiB7XG4gICAgaWYgKCh0eXBlb2YgbW9jayA9PT0gJ2Z1bmN0aW9uJykgfHwgKHR5cGVvZiBtb2NrID09PSAnb2JqZWN0JykpIHtcbiAgICAgIHRoaXMubW9ja0h0dHAgPSBtb2NrO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBgW25nMi1yZXN0XVxuICAgICAgLm1vZGVsKC4uLilcbiAgICAgIC5tb2NrKCA8IEJBRCBNT0NLIERBVEEgPiApXG4gICAgICAuLi5cbiAgICAgIGBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuXG5cbiAgLy8jcmVnaW9uICBwcml2YXRlIGZpZWxkc1xuICBwcml2YXRlIF9fbWV0YV9lbmRwb2ludDogc3RyaW5nO1xuICBwcml2YXRlIF9lbmRwb2ludFJlc3Q6IHN0cmluZztcbiAgcHJpdmF0ZSBnZXQgZW5kcG9pbnQoKSB7XG4gICAgbGV0IGUgPSB0aGlzLl9fbWV0YV9lbmRwb2ludDtcbiAgICBpZiAodGhpcy5yZXN0UXVlcnlQYXJhbXMgIT09IHZvaWQgMCAmJiB0aGlzLl9lbmRwb2ludFJlc3QgIT09IHZvaWQgMFxuICAgICAgJiYgdHlwZW9mIHRoaXMuX2VuZHBvaW50UmVzdCA9PT0gJ3N0cmluZycgJiYgdGhpcy5fZW5kcG9pbnRSZXN0LnRyaW0oKSAhPT0gJycpIGUgPSB0aGlzLl9lbmRwb2ludFJlc3Q7XG4gICAgcmV0dXJuIGU7XG4gIH1cbiAgcHJpdmF0ZSByZXN0UXVlcnlQYXJhbXM6IE9iamVjdDtcbiAgcHVibGljIHNldCBfX3Jlc3RfZW5kcG9pbnQoZW5kcG9pbnQpIHtcbiAgICB0aGlzLl9lbmRwb2ludFJlc3QgPSBlbmRwb2ludDtcbiAgICBpZiAoZW5kcG9pbnQgPT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5yZXN0UXVlcnlQYXJhbXMgPSB2b2lkIDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdFF1ZXJ5UGFyYW1zID0gZ2V0UmVzdFBhcmFtcyhlbmRwb2ludCwgdGhpcy5fX21ldGFfZW5kcG9pbnQpO1xuICAgIH1cblxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdFVybChwYXJhbXM6IGFueSwgZG9Ob3RTZXJpYWxpemVQYXJhbXM6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHJldHVybiBgJHt0aGlzLmVuZHBvaW50fSR7Z2V0UGFyYW1zVXJsKHBhcmFtcywgZG9Ob3RTZXJpYWxpemVQYXJhbXMpfWA7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gIGNvbnN0cnVjdG9yXG4gIHByaXZhdGUgX2hlYWRlcnMgPSBSZXN0SGVhZGVycy5mcm9tKENPTlRFTlRfVFlQRS5BUFBMSUNBVElPTl9KU09OKTtcbiAgZ2V0IGhlYWRlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlcnM7XG4gIH1cbiAgY29uc3RydWN0b3IoXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlcXVlc3Q6IFJlc3RSZXF1ZXN0LFxuICAgIHByaXZhdGUgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LFxuICAgIHByaXZhdGUgY3VzdG9tQ29udGVudFR5cGU6IFJlc3RIZWFkZXJzLFxuICApIHtcbiAgICB0aGlzLl9fbWV0YV9lbmRwb2ludCA9IGVuZHBvaW50O1xuXG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uICByZXFcblxuICBwcml2YXRlIHJlcShtZXRob2Q6IE1vZGVscy5IdHRwTWV0aG9kLFxuICAgIGl0ZW06IFQsXG4gICAgcGFyYW1zPzogTW9kZWxzLlVybFBhcmFtc1tdLFxuICAgIGRvTm90U2VyaWFsaXplUGFyYW1zOiBib29sZWFuID0gZmFsc2UsXG4gICAgaXNBcnJheTogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuXG4gICAgY29uc3QgbW9kZWxVcmwgPSB0aGlzLmNyZWF0VXJsKHBhcmFtcywgZG9Ob3RTZXJpYWxpemVQYXJhbXMpO1xuICAgIGNvbnN0IGJvZHkgPSBpdGVtID8gSlNPTi5zdHJpbmdpZnkoaXRlbSkgOiB2b2lkIDA7XG4gICAgLy8gY29uc29sZS5sb2coJ3RoaXMuY3VzdG9tQ29udGVudFR5cGUnLCB0aGlzLmN1c3RvbUNvbnRlbnRUeXBlKVxuICAgIGlmICh0aGlzLmN1c3RvbUNvbnRlbnRUeXBlKSB7XG4gICAgICBjb25zdCBjdXN0b21IZWFkZXJLZXlzID0gdGhpcy5jdXN0b21Db250ZW50VHlwZS5rZXlzKCk7XG4gICAgICBjb25zdCBjdXJyZW50SGVhZGVyS2V5cyA9IHRoaXMuX2hlYWRlcnMua2V5cygpO1xuICAgICAgY3VycmVudEhlYWRlcktleXNcbiAgICAgICAgLmZpbHRlcihrZXkgPT4gIWN1c3RvbUhlYWRlcktleXMuaW5jbHVkZXMoa2V5KSlcbiAgICAgICAgLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICB0aGlzLmN1c3RvbUNvbnRlbnRUeXBlLnNldChrZXksIHRoaXMuX2hlYWRlcnMuZ2V0KGtleSkpO1xuICAgICAgICB9KTtcbiAgICAgIHRoaXMuX2hlYWRlcnMgPSB0aGlzLmN1c3RvbUNvbnRlbnRUeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9oZWFkZXJzID0gUmVzdEhlYWRlcnMuZnJvbShDT05URU5UX1RZUEUuQVBQTElDQVRJT05fSlNPTik7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZXF1ZXN0W21ldGhvZC50b0xvd2VyQ2FzZSgpXShcbiAgICAgIG1vZGVsVXJsLFxuICAgICAgYm9keSxcbiAgICAgIHRoaXMuaGVhZGVycyxcbiAgICAgIHRoaXMubWV0YSxcbiAgICAgIGlzQXJyYXksXG4gICAgICB0aGlzLm1vY2tIdHRwXG4gICAgKTtcblxuICAgIHRoaXMubW9ja0h0dHAgPSB2b2lkIDA7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gaHR0cCBtZXRob2RzXG5cbiAgLy8jcmVnaW9uIHJlcGxheVxuICByZXBsYXkobWV0aG9kOiBNb2RlbHMuSHR0cE1ldGhvZCkge1xuICAgIHRoaXMucmVxdWVzdC5yZXBsYXkobWV0aG9kLCB0aGlzLm1ldGEpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIGFycmF5ID0ge1xuICAgIGdldDogKHBhcmFtczogTW9kZWxzLlVybFBhcmFtc1tdID0gdm9pZCAwLCBkb05vdFNlcmlhbGl6ZVBhcmFtcz86IGJvb2xlYW4pOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8TW9kZWxzLkh0dHBSZXNwb25zZTxUQT4+ID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJlcSgnZ2V0Jywgdm9pZCAwLCBwYXJhbXMsIGRvTm90U2VyaWFsaXplUGFyYW1zLCB0cnVlKSBhcyBhbnlcbiAgICB9LFxuICAgIGhlYWQ6IChwYXJhbXM6IE1vZGVscy5VcmxQYXJhbXNbXSA9IHZvaWQgMCwgZG9Ob3RTZXJpYWxpemVQYXJhbXM/OiBib29sZWFuKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PE1vZGVscy5IdHRwUmVzcG9uc2U8VEE+PiA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5yZXEoJ2hlYWQnLCB2b2lkIDAsIHBhcmFtcywgZG9Ob3RTZXJpYWxpemVQYXJhbXMsIHRydWUpIGFzIGFueVxuICAgIH0sXG4gICAgcG9zdDogKGl0ZW06IFRBLCBwYXJhbXM/OiBNb2RlbHMuVXJsUGFyYW1zW10sIGRvTm90U2VyaWFsaXplUGFyYW1zPzogYm9vbGVhbik6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxNb2RlbHMuSHR0cFJlc3BvbnNlPFRBPj4gPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucmVxKCdwb3N0JywgaXRlbSBhcyBhbnksIHBhcmFtcywgZG9Ob3RTZXJpYWxpemVQYXJhbXMsIHRydWUpIGFzIGFueTtcbiAgICB9LFxuICAgIHB1dDogKGl0ZW06IFRBLCBwYXJhbXM/OiBNb2RlbHMuVXJsUGFyYW1zW10sIGRvTm90U2VyaWFsaXplUGFyYW1zPzogYm9vbGVhbik6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxNb2RlbHMuSHR0cFJlc3BvbnNlPFRBPj4gPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucmVxKCdwdXQnLCBpdGVtIGFzIGFueSwgcGFyYW1zLCBkb05vdFNlcmlhbGl6ZVBhcmFtcywgdHJ1ZSkgYXMgYW55O1xuICAgIH0sXG4gICAgcGF0Y2g6IChpdGVtOiBUQSwgcGFyYW1zPzogTW9kZWxzLlVybFBhcmFtc1tdLCBkb05vdFNlcmlhbGl6ZVBhcmFtcz86IGJvb2xlYW4pOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8TW9kZWxzLkh0dHBSZXNwb25zZTxUQT4+ID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJlcSgncGF0Y2gnLCBpdGVtIGFzIGFueSwgcGFyYW1zLCBkb05vdFNlcmlhbGl6ZVBhcmFtcywgdHJ1ZSkgYXMgYW55O1xuICAgIH0sXG4gICAgZGVsZXRlOiAocGFyYW1zPzogTW9kZWxzLlVybFBhcmFtc1tdLCBkb05vdFNlcmlhbGl6ZVBhcmFtcz86IGJvb2xlYW4pOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8TW9kZWxzLkh0dHBSZXNwb25zZTxUQT4+ID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJlcSgnZGVsZXRlJywgdm9pZCAwLCBwYXJhbXMsIGRvTm90U2VyaWFsaXplUGFyYW1zLCB0cnVlKSBhcyBhbnk7XG4gICAgfSxcbiAgICBqc29ucDogKHBhcmFtcz86IE1vZGVscy5VcmxQYXJhbXNbXSwgZG9Ob3RTZXJpYWxpemVQYXJhbXM/OiBib29sZWFuKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PE1vZGVscy5IdHRwUmVzcG9uc2U8VEE+PiA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5yZXEoJ2pzb25wJywgdm9pZCAwLCBwYXJhbXMsIGRvTm90U2VyaWFsaXplUGFyYW1zLCB0cnVlKSBhcyBhbnk7XG4gICAgfVxuICB9XG5cbiAgZ2V0KHBhcmFtcz86IE1vZGVscy5VcmxQYXJhbXNbXSwgZG9Ob3RTZXJpYWxpemVQYXJhbXM6IGJvb2xlYW4gPSBmYWxzZSk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxNb2RlbHMuSHR0cFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxKCdnZXQnLCB2b2lkIDAsIHBhcmFtcywgZG9Ob3RTZXJpYWxpemVQYXJhbXMpIGFzIGFueTtcbiAgfVxuXG4gIGhlYWQocGFyYW1zPzogTW9kZWxzLlVybFBhcmFtc1tdLCBkb05vdFNlcmlhbGl6ZVBhcmFtczogYm9vbGVhbiA9IGZhbHNlKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PE1vZGVscy5IdHRwUmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXEoJ2hlYWQnLCB2b2lkIDAsIHBhcmFtcywgZG9Ob3RTZXJpYWxpemVQYXJhbXMpIGFzIGFueTtcbiAgfVxuXG4gIHBvc3QoaXRlbTogVCwgcGFyYW1zPzogTW9kZWxzLlVybFBhcmFtc1tdLCBkb05vdFNlcmlhbGl6ZVBhcmFtczogYm9vbGVhbiA9IGZhbHNlKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PE1vZGVscy5IdHRwUmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXEoJ3Bvc3QnLCBpdGVtLCBwYXJhbXMsIGRvTm90U2VyaWFsaXplUGFyYW1zKTtcbiAgfVxuXG4gIHB1dChpdGVtOiBULCBwYXJhbXM/OiBNb2RlbHMuVXJsUGFyYW1zW10sIGRvTm90U2VyaWFsaXplUGFyYW1zOiBib29sZWFuID0gZmFsc2UpOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8TW9kZWxzLkh0dHBSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcSgncHV0JywgaXRlbSwgcGFyYW1zLCBkb05vdFNlcmlhbGl6ZVBhcmFtcyk7XG4gIH1cblxuICBwYXRjaChpdGVtOiBULCBwYXJhbXM/OiBNb2RlbHMuVXJsUGFyYW1zW10sIGRvTm90U2VyaWFsaXplUGFyYW1zOiBib29sZWFuID0gZmFsc2UpOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8TW9kZWxzLkh0dHBSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcSgncGF0Y2gnLCBpdGVtLCBwYXJhbXMsIGRvTm90U2VyaWFsaXplUGFyYW1zKTtcbiAgfVxuXG4gIGRlbGV0ZShwYXJhbXM/OiBNb2RlbHMuVXJsUGFyYW1zW10sIGRvTm90U2VyaWFsaXplUGFyYW1zOiBib29sZWFuID0gZmFsc2UpOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8TW9kZWxzLkh0dHBSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcSgnZGVsZXRlJywgdm9pZCAwLCBwYXJhbXMsIGRvTm90U2VyaWFsaXplUGFyYW1zKTtcbiAgfVxuXG4gIGpzb25wKHBhcmFtcz86IE1vZGVscy5VcmxQYXJhbXNbXSwgZG9Ob3RTZXJpYWxpemVQYXJhbXM6IGJvb2xlYW4gPSBmYWxzZSk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxNb2RlbHMuSHR0cFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxKCdqc29ucCcsIHZvaWQgMCwgcGFyYW1zLCBkb05vdFNlcmlhbGl6ZVBhcmFtcyk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmcyLXJlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90bXAtbGlicy1mb3ItYnVuZGxlLXdlYnNxbC9uZzItcmVzdC9wcm9qZWN0cy9uZzItcmVzdC9zcmMvbmcyLXJlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export * from './lib';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RtcC1saWJzLWZvci1idW5kbGUtd2Vic3FsL25nMi1yZXN0L3Byb2plY3RzL25nMi1yZXN0L3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsT0FBTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWInO1xuIl19