ng2-rest 13.0.12 → 13.0.16

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 (48) hide show
  1. package/README.md +13 -17
  2. package/app.js +97 -0
  3. package/app.js.map +1 -1
  4. package/browser/esm2020/lib/index.mjs +2 -2
  5. package/browser/esm2020/lib/models.mjs +8 -1
  6. package/browser/esm2020/lib/other/simple-resource.mjs +117 -0
  7. package/browser/esm2020/lib/resource.service.mjs +7 -2
  8. package/browser/esm2020/lib/rest-request.mjs +58 -16
  9. package/browser/fesm2015/ng2-rest.mjs +69 -16
  10. package/browser/fesm2015/ng2-rest.mjs.map +1 -1
  11. package/browser/fesm2020/ng2-rest.mjs +69 -16
  12. package/browser/fesm2020/ng2-rest.mjs.map +1 -1
  13. package/browser/lib/index.d.ts +1 -1
  14. package/browser/lib/models.d.ts +1 -0
  15. package/{lib → browser/lib/other}/simple-resource.d.ts +1 -1
  16. package/browser/lib/resource.service.d.ts +4 -1
  17. package/client/esm2020/lib/index.mjs +2 -2
  18. package/client/esm2020/lib/models.mjs +8 -1
  19. package/client/esm2020/lib/other/simple-resource.mjs +117 -0
  20. package/client/esm2020/lib/resource.service.mjs +7 -2
  21. package/client/esm2020/lib/rest-request.mjs +58 -16
  22. package/client/fesm2015/ng2-rest.mjs +69 -16
  23. package/client/fesm2015/ng2-rest.mjs.map +1 -1
  24. package/client/fesm2020/ng2-rest.mjs +69 -16
  25. package/client/fesm2020/ng2-rest.mjs.map +1 -1
  26. package/client/lib/index.d.ts +1 -1
  27. package/client/lib/models.d.ts +1 -0
  28. package/{browser/lib → client/lib/other}/simple-resource.d.ts +1 -1
  29. package/client/lib/resource.service.d.ts +4 -1
  30. package/lib/index.d.ts +1 -1
  31. package/lib/index.js +1 -1
  32. package/lib/index.js.map +1 -1
  33. package/lib/models.d.ts +1 -0
  34. package/lib/models.js +11 -0
  35. package/lib/models.js.map +1 -1
  36. package/{client/lib → lib/other}/simple-resource.d.ts +1 -1
  37. package/lib/{simple-resource.js → other/simple-resource.js} +1 -1
  38. package/lib/other/simple-resource.js.map +1 -0
  39. package/lib/resource.service.d.ts +4 -1
  40. package/lib/resource.service.js +10 -1
  41. package/lib/resource.service.js.map +1 -1
  42. package/lib/rest-request.js +65 -24
  43. package/lib/rest-request.js.map +1 -1
  44. package/package.json +5 -224
  45. package/tmp-environment.json +36 -35
  46. package/browser/esm2020/lib/simple-resource.mjs +0 -117
  47. package/client/esm2020/lib/simple-resource.mjs +0 -117
  48. package/lib/simple-resource.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { firstValueFrom } from 'rxjs';
1
+ import { firstValueFrom, Observable } from 'rxjs';
2
2
  import { Subject } from 'rxjs';
3
3
  import { _ } from 'tnp-core/browser';
4
4
  import { Models } from './models';
@@ -11,6 +11,9 @@ import { Log } from 'ng2-logger/browser';
11
11
  import { RequestCache } from './request-cache';
12
12
  const log = Log.create('[ng2-rest] rest-request', Level.__NOTHING);
13
13
  const jobIDkey = 'jobID';
14
+ const customObs = 'customObs';
15
+ const cancelFn = 'cancelFn';
16
+ const isCanceled = 'isCanceled';
14
17
  //#region mock request
15
18
  //#endregion
16
19
  export class RestRequest {
@@ -26,11 +29,6 @@ export class RestRequest {
26
29
  }
27
30
  // log.d(`HANDLE RESULT (jobid:${options.jobid}) ${sourceRequest.url}`);
28
31
  const { res, jobid, isArray, method } = options;
29
- // if (this.endedJobs[jobid]) {
30
- // debugger
31
- // }
32
- // this.endedJobs[jobid] = true;
33
- // log.i(`handle jobid ${jobid}`)
34
32
  if (typeof res !== 'object') {
35
33
  throw new Error('No resposnse for request. ');
36
34
  }
@@ -44,15 +42,21 @@ export class RestRequest {
44
42
  }
45
43
  const entity = this.meta[jobid].entity;
46
44
  const circular = this.meta[jobid].circular;
47
- this.subjectInuUse[jobid].next(new Models.HttpResponse(sourceRequest, res.data, res.headers, res.code, entity, circular, jobid, isArray));
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);
48
49
  this.meta[jobid] = void 0;
49
- return;
50
+ this.subjectInuUse[jobid].complete();
50
51
  }
51
52
  checkCache(sourceRequest, jobid) {
52
53
  const existedInCache = RequestCache.findBy(sourceRequest);
53
54
  if (existedInCache) {
54
55
  log.i('cache exists', existedInCache);
56
+ const success = Resource['_listenSuccess'];
57
+ success.next(existedInCache.response);
55
58
  this.subjectInuUse[jobid].next(existedInCache);
59
+ this.subjectInuUse[jobid].complete();
56
60
  return true;
57
61
  }
58
62
  // log.i(`cache not exists for jobid ${jobid}`)
@@ -67,6 +71,9 @@ export class RestRequest {
67
71
  }, jobid)) {
68
72
  return;
69
73
  }
74
+ const CancelToken = axios.CancelToken;
75
+ const source = CancelToken.source();
76
+ this.subjectInuUse[jobid][cancelFn] = source.cancel;
70
77
  var response;
71
78
  if (mockHttp) {
72
79
  if (typeof mockHttp === 'object') {
@@ -97,10 +104,14 @@ export class RestRequest {
97
104
  method,
98
105
  data: body,
99
106
  responseType: 'text',
100
- headers: headers.toJSON()
107
+ headers: headers.toJSON(),
108
+ cancelToken: source.token,
101
109
  });
102
110
  // log.d(`after response of jobid: ${jobid}`);
103
111
  }
112
+ if (this.subjectInuUse[jobid][isCanceled]) {
113
+ return;
114
+ }
104
115
  this.handlerResult({
105
116
  res: {
106
117
  code: response.status,
@@ -120,13 +131,17 @@ export class RestRequest {
120
131
  });
121
132
  }
122
133
  catch (catchedError) {
134
+ if (this.subjectInuUse[jobid][isCanceled]) {
135
+ return;
136
+ }
123
137
  // console.log('ERROR RESPONESE catchedError typeof ', typeof catchedError)
124
138
  // console.log('ERROR RESPONESE catchedError', catchedError)
125
139
  if (typeof catchedError === 'object' && catchedError.response && catchedError.response.data) {
126
140
  const err = catchedError.response.data;
127
141
  const msg = catchedError.response.data.message || '';
128
142
  let stack = (err.stack || '').split('\n');
129
- Resource['_listenErrors'].next({
143
+ const errObs = Resource['_listenErrors'];
144
+ errObs.next({
130
145
  msg,
131
146
  stack,
132
147
  data: catchedError.response.data
@@ -183,12 +198,39 @@ export class RestRequest {
183
198
  }
184
199
  replay = this.replaySubjects[meta.endpoint][meta.path][method][objectIDToCreateOrLast];
185
200
  if (!_.isNumber(replay.id)) {
201
+ if (RestRequest.jobId === Number.MAX_SAFE_INTEGER) {
202
+ RestRequest.jobId = 0;
203
+ }
186
204
  const jobid = RestRequest.jobId++;
187
205
  replay.id = jobid;
188
206
  const subject = replay.subject;
189
207
  subject[jobIDkey] = jobid; // modify internal rxjs subject obj
190
208
  this.meta[jobid] = meta;
191
209
  this.subjectInuUse[jobid] = subject;
210
+ this.subjectInuUse[jobid][customObs] = new Observable((observer) => {
211
+ // observer.remove(() => {
212
+ // });
213
+ observer.add(() => {
214
+ // console.log(`cancel observable job${jobid}`)
215
+ if (!this.subjectInuUse[jobid][isCanceled]) {
216
+ this.subjectInuUse[jobid][isCanceled] = true;
217
+ if (typeof this.subjectInuUse[jobid][cancelFn] === 'function') {
218
+ this.subjectInuUse[jobid][cancelFn]('[ng2-rest] on purpose canceled http request');
219
+ }
220
+ }
221
+ else {
222
+ // console.log(`somehow second time cancel ${jobid}`)
223
+ }
224
+ });
225
+ const sub = subject.subscribe({
226
+ next: a => observer.next(a),
227
+ error: a => observer.error(a),
228
+ complete: () => {
229
+ sub.unsubscribe();
230
+ observer.complete();
231
+ },
232
+ });
233
+ });
192
234
  //#region DISPOSE @UNCOMMENT AFTER TESTS
193
235
  // if (objectIDToCreateOrLast > 2) {
194
236
  // const oldReq: Models.ReplayData = this.replaySubjects[meta.endpoint][meta.path][method][(objectIDToCreateOrLast - 2)];
@@ -211,8 +253,8 @@ export class RestRequest {
211
253
  // log.d(`for ${purl} jobid ${pid}`);
212
254
  setTimeout(() => pthis.req(purl, pmethod, pheaders, pbody, pid, pisArray, pmockHttp));
213
255
  })(this, url, method, headers, body, replay.id, isArray, mockHttp);
214
- const resp = firstValueFrom(replay.subject.asObservable());
215
- resp.observable = replay.subject.asObservable();
256
+ const resp = firstValueFrom(replay.subject[customObs]);
257
+ resp.observable = replay.subject[customObs];
216
258
  resp.cache = RequestCache.findBy({
217
259
  body,
218
260
  isArray,
@@ -276,9 +318,9 @@ export class RestRequest {
276
318
  document.body.appendChild(sc);
277
319
  document.body.removeChild(sc);
278
320
  });
279
- // return replay.subject.asObservable();
280
- const resp = firstValueFrom(replay.subject.asObservable());
281
- resp.observable = replay.subject.asObservable();
321
+ const resp = firstValueFrom(replay.subject[customObs]);
322
+ resp.observable = replay.subject[customObs];
323
+ console.log('assiging custom observable');
282
324
  resp.cache = RequestCache.findBy({
283
325
  body,
284
326
  isArray,
@@ -307,4 +349,4 @@ export class RestRequest {
307
349
  }
308
350
  }
309
351
  RestRequest.jobId = 0;
310
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1yZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWJ1bmRsZS9uZzItcmVzdC9wcm9qZWN0cy9uZzItcmVzdC9zcmMvbGliL3Jlc3QtcmVxdWVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsY0FBYyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0IsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXJDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxLQUF3QixNQUFNLE9BQU8sQ0FBQztBQUM3QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFFLEdBQUcsRUFBVSxNQUFNLG9CQUFvQixDQUFDO0FBRWpELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHlCQUF5QixFQUM1QyxLQUFLLENBQUMsU0FBUyxDQUNsQixDQUFBO0FBRUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDO0FBSXpCLHNCQUFzQjtBQUN0QixZQUFZO0FBSVosTUFBTSxPQUFPLFdBQVc7SUFBeEI7UUFJVSxrQkFBYSxHQUFtQyxFQUFFLENBQUM7UUFDbkQsU0FBSSxHQUF5QyxFQUFFLENBQUM7UUE0V3hELFlBQVk7UUFDSixtQkFBYyxHQUFHLEVBQUUsQ0FBQztJQW1COUIsQ0FBQztJQTdYUyxh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RyxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3BDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFDNUUsQ0FBQzs7QUFoWWMsaUJBQUssR0FBRyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJkZWNsYXJlIHZhciByZXF1aXJlOiBhbnk7XG5cbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IF8gfSBmcm9tICd0bnAtY29yZS9icm93c2VyJztcblxuaW1wb3J0IHsgTW9kZWxzIH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgUmVzdEhlYWRlcnMgfSBmcm9tICcuL3Jlc3QtaGVhZGVycyc7XG5cbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tICd0bnAtY29yZS9icm93c2VyJztcbmltcG9ydCB7IExldmVsIH0gZnJvbSAnbmcyLWxvZ2dlci9icm93c2VyJztcbmltcG9ydCBheGlvcywgeyBBeGlvc1Jlc3BvbnNlIH0gZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgUmVzb3VyY2UgfSBmcm9tICcuL3Jlc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nLCBMb2dnZXIgfSBmcm9tICduZzItbG9nZ2VyL2Jyb3dzZXInO1xuXG5pbXBvcnQgeyBSZXF1ZXN0Q2FjaGUgfSBmcm9tICcuL3JlcXVlc3QtY2FjaGUnO1xuY29uc3QgbG9nID0gTG9nLmNyZWF0ZSgnW25nMi1yZXN0XSByZXN0LXJlcXVlc3QnXG4gICwgTGV2ZWwuX19OT1RISU5HXG4pXG5cbmNvbnN0IGpvYklEa2V5ID0gJ2pvYklEJztcbmRlY2xhcmUgY29uc3QgZ2xvYmFsOiBhbnk7XG5cblxuLy8jcmVnaW9uIG1vY2sgcmVxdWVzdFxuLy8jZW5kcmVnaW9uXG5cblxuXG5leHBvcnQgY2xhc3MgUmVzdFJlcXVlc3Qge1xuXG4gIHB1YmxpYyBzdGF0aWMgem9uZTtcbiAgcHJpdmF0ZSBzdGF0aWMgam9iSWQgPSAwO1xuICBwcml2YXRlIHN1YmplY3RJbnVVc2U6IHsgW2lkOiBudW1iZXJdOiBTdWJqZWN0PGFueT4gfSA9IHt9O1xuICBwcml2YXRlIG1ldGE6IHsgW2lkOiBudW1iZXJdOiBNb2RlbHMuTWV0YVJlcXVlc3QgfSA9IHt9O1xuXG5cbiAgcHJpdmF0ZSBoYW5kbGVyUmVzdWx0KG9wdGlvbnM6IE1vZGVscy5IYW5kbGVSZXN1bHRPcHRpb25zLFxuICAgIHNvdXJjZVJlcXVlc3Q6IE1vZGVscy5IYW5kbGVSZXN1bHRTb3VyY2VSZXF1ZXN0T3B0aW9ucykge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKG9wdGlvbnMpKSB7XG4gICAgICBvcHRpb25zID0ge30gYXMgYW55O1xuICAgIH1cbiAgICAvLyBsb2cuZChgSEFORExFIFJFU1VMVCAoam9iaWQ6JHtvcHRpb25zLmpvYmlkfSkgJHtzb3VyY2VSZXF1ZXN0LnVybH1gKTtcbiAgICBjb25zdCB7IHJlcywgam9iaWQsIGlzQXJyYXksIG1ldGhvZCB9ID0gb3B0aW9ucztcbiAgICAvLyBpZiAodGhpcy5lbmRlZEpvYnNbam9iaWRdKSB7XG4gICAgLy8gICBkZWJ1Z2dlclxuICAgIC8vIH1cbiAgICAvLyB0aGlzLmVuZGVkSm9ic1tqb2JpZF0gPSB0cnVlO1xuICAgIC8vIGxvZy5pKGBoYW5kbGUgam9iaWQgJHtqb2JpZH1gKVxuICAgIGlmICh0eXBlb2YgcmVzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZXNwb3Nuc2UgZm9yIHJlcXVlc3QuICcpO1xuICAgIH1cblxuICAgIGlmIChIZWxwZXJzLmlzQnJvd3Nlcikge1xuICAgICAgcmVzLmhlYWRlcnMgPSBSZXN0SGVhZGVycy5mcm9tKHJlcy5oZWFkZXJzKTtcbiAgICB9XG5cbiAgICAvLyBlcnJvciBubyBpbnRlcm5ldFxuICAgIGlmIChyZXMuZXJyb3IpIHtcbiAgICAgIHRoaXMuc3ViamVjdEludVVzZVtqb2JpZF0uZXJyb3IobmV3IE1vZGVscy5IdHRwUmVzcG9uc2VFcnJvcihyZXMuZXJyb3IsIHJlcy5kYXRhLCByZXMuaGVhZGVycywgcmVzLmNvZGUsIGpvYmlkKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMubWV0YVtqb2JpZF0uZW50aXR5O1xuICAgIGNvbnN0IGNpcmN1bGFyID0gdGhpcy5tZXRhW2pvYmlkXS5jaXJjdWxhcjtcblxuICAgIHRoaXMuc3ViamVjdEludVVzZVtqb2JpZF0ubmV4dChcbiAgICAgIG5ldyBNb2RlbHMuSHR0cFJlc3BvbnNlKHNvdXJjZVJlcXVlc3QsIHJlcy5kYXRhLCByZXMuaGVhZGVycywgcmVzLmNvZGUsIGVudGl0eSwgY2lyY3VsYXIsIGpvYmlkLCBpc0FycmF5KVxuICAgICk7XG4gICAgdGhpcy5tZXRhW2pvYmlkXSA9IHZvaWQgMDtcbiAgICByZXR1cm47XG4gIH1cbiAgY2hlY2tDYWNoZShzb3VyY2VSZXF1ZXN0OiBNb2RlbHMuSGFuZGxlUmVzdWx0U291cmNlUmVxdWVzdE9wdGlvbnMsIGpvYmlkOiBudW1iZXIpIHtcbiAgICBjb25zdCBleGlzdGVkSW5DYWNoZSA9IFJlcXVlc3RDYWNoZS5maW5kQnkoc291cmNlUmVxdWVzdCk7XG4gICAgaWYgKGV4aXN0ZWRJbkNhY2hlKSB7XG4gICAgICBsb2cuaSgnY2FjaGUgZXhpc3RzJywgZXhpc3RlZEluQ2FjaGUpXG4gICAgICB0aGlzLnN1YmplY3RJbnVVc2Vbam9iaWRdLm5leHQoZXhpc3RlZEluQ2FjaGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIGxvZy5pKGBjYWNoZSBub3QgZXhpc3RzIGZvciBqb2JpZCAke2pvYmlkfWApXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXEoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgbWV0aG9kOiBNb2RlbHMuSHR0cE1ldGhvZCxcbiAgICBoZWFkZXJzPzogUmVzdEhlYWRlcnMsXG4gICAgYm9keT86IGFueSxcbiAgICBqb2JpZD86IG51bWJlcixcbiAgICBpc0FycmF5ID0gZmFsc2UsXG4gICAgbW9ja0h0dHA/OiBNb2RlbHMuTW9ja0h0dHBcbiAgKSB7XG4gICAgaWYgKHRoaXMuY2hlY2tDYWNoZSh7XG4gICAgICB1cmwsXG4gICAgICBib2R5LFxuICAgICAgaXNBcnJheSxcbiAgICAgIG1ldGhvZFxuICAgIH0sIGpvYmlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByZXNwb25zZTogQXhpb3NSZXNwb25zZTxhbnk+O1xuICAgIGlmIChtb2NrSHR0cCkge1xuXG4gICAgICBpZiAodHlwZW9mIG1vY2tIdHRwID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXNwb25zZSA9IHtcbiAgICAgICAgICBkYXRhOiBtb2NrSHR0cC5kYXRhLFxuICAgICAgICAgIHN0YXR1czogbW9ja0h0dHAuY29kZSxcbiAgICAgICAgICBoZWFkZXJzOiBtb2NrSHR0cC5oZWFkZXJzLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IG1vY2tIdHRwLmVycm9yLFxuICAgICAgICAgIGNvbmZpZzoge31cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbW9ja0h0dHAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgciA9IG1vY2tIdHRwKHVybCwgbWV0aG9kLCBoZWFkZXJzLCBib2R5KTtcbiAgICAgICAgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgZGF0YTogci5kYXRhLFxuICAgICAgICAgIHN0YXR1czogci5jb2RlLFxuICAgICAgICAgIGhlYWRlcnM6IHIuaGVhZGVycyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiByLmVycm9yLFxuICAgICAgICAgIGNvbmZpZzoge31cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgIGxvZy5kKGBbJHttZXRob2R9XSAoam9iaWQ9JHtqb2JpZH0pIHJlcXVlc3QgdG86ICAke3VybH1gKVxuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGF4aW9zKHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIGRhdGE6IGJvZHksXG4gICAgICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCcsXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVycy50b0pTT04oKVxuICAgICAgICB9KVxuICAgICAgICAvLyBsb2cuZChgYWZ0ZXIgcmVzcG9uc2Ugb2Ygam9iaWQ6ICR7am9iaWR9YCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlclJlc3VsdCh7XG4gICAgICAgIHJlczoge1xuICAgICAgICAgIGNvZGU6IHJlc3BvbnNlLnN0YXR1cyBhcyBhbnksXG4gICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UuZGF0YSksXG4gICAgICAgICAgaXNBcnJheSxcbiAgICAgICAgICBqb2JpZCxcbiAgICAgICAgICBoZWFkZXJzOiBSZXN0SGVhZGVycy5mcm9tKHJlc3BvbnNlLmhlYWRlcnMpXG4gICAgICAgIH0sXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgam9iaWQsXG4gICAgICAgIGlzQXJyYXlcbiAgICAgIH0sIHtcbiAgICAgICAgdXJsLFxuICAgICAgICBib2R5LFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGlzQXJyYXksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChjYXRjaGVkRXJyb3IpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdFUlJPUiBSRVNQT05FU0UgY2F0Y2hlZEVycm9yIHR5cGVvZiAnLCB0eXBlb2YgY2F0Y2hlZEVycm9yKVxuICAgICAgLy8gY29uc29sZS5sb2coJ0VSUk9SIFJFU1BPTkVTRSBjYXRjaGVkRXJyb3InLCBjYXRjaGVkRXJyb3IpXG4gICAgICBpZiAodHlwZW9mIGNhdGNoZWRFcnJvciA9PT0gJ29iamVjdCcgJiYgY2F0Y2hlZEVycm9yLnJlc3BvbnNlICYmIGNhdGNoZWRFcnJvci5yZXNwb25zZS5kYXRhKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IGNhdGNoZWRFcnJvci5yZXNwb25zZS5kYXRhO1xuICAgICAgICBjb25zdCBtc2c6IHN0cmluZyA9IGNhdGNoZWRFcnJvci5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgfHwgJyc7XG4gICAgICAgIGxldCBzdGFjazogc3RyaW5nW10gPSAoZXJyLnN0YWNrIHx8ICcnKS5zcGxpdCgnXFxuJyk7XG5cbiAgICAgICAgKFJlc291cmNlWydfbGlzdGVuRXJyb3JzJ10gYXMgU3ViamVjdDxNb2RlbHMuQmFja2VuZEVycm9yPikubmV4dCh7XG4gICAgICAgICAgbXNnLFxuICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgIGRhdGE6IGNhdGNoZWRFcnJvci5yZXNwb25zZS5kYXRhXG4gICAgICAgIH0pO1xuXG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvciA9IChjYXRjaGVkRXJyb3IgJiYgY2F0Y2hlZEVycm9yLnJlc3BvbnNlKSA/IGBbJHtjYXRjaGVkRXJyb3IucmVzcG9uc2Uuc3RhdHVzVGV4dH1dOiBgIDogJyc7XG4gICAgICB0aGlzLmhhbmRsZXJSZXN1bHQoe1xuICAgICAgICByZXM6IHtcbiAgICAgICAgICBjb2RlOiAoY2F0Y2hlZEVycm9yICYmIGNhdGNoZWRFcnJvci5yZXNwb25zZSkgPyBjYXRjaGVkRXJyb3IucmVzcG9uc2Uuc3RhdHVzIGFzIGFueSA6IHZvaWQgMCxcbiAgICAgICAgICBlcnJvcjogYCR7ZXJyb3J9JHtjYXRjaGVkRXJyb3IubWVzc2FnZX1gLFxuICAgICAgICAgIGRhdGE6IChjYXRjaGVkRXJyb3IgJiYgY2F0Y2hlZEVycm9yLnJlc3BvbnNlKSA/IEpTT04uc3RyaW5naWZ5KGNhdGNoZWRFcnJvci5yZXNwb25zZS5kYXRhKSA6IHZvaWQgMCxcbiAgICAgICAgICBpc0FycmF5LFxuICAgICAgICAgIGpvYmlkLFxuICAgICAgICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzLmZyb20oY2F0Y2hlZEVycm9yICYmIGNhdGNoZWRFcnJvci5yZXNwb25zZSAmJiBjYXRjaGVkRXJyb3IucmVzcG9uc2UuaGVhZGVycylcbiAgICAgICAgfSxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBqb2JpZCxcbiAgICAgICAgaXNBcnJheVxuICAgICAgfSwge1xuICAgICAgICB1cmwsXG4gICAgICAgIGJvZHksXG4gICAgICAgIGlzQXJyYXksXG4gICAgICAgIG1ldGhvZFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZXBsYXkobWV0aG9kOiBNb2RlbHMuSHR0cE1ldGhvZCwgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LCBvbmx5R2V0TGFzdFJlcGxheUZvck1ldGhvZDogYm9vbGVhbik6IE1vZGVscy5SZXBsYXlEYXRhIHtcbiAgICBsZXQgcmVwbGF5OiBNb2RlbHMuUmVwbGF5RGF0YTtcblxuICAgIC8vI3JlZ2lvbiBwcmV2ZW50IGVtcHR5IHRyZWVcbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdKSkge1xuICAgICAgLy8gbG9nLmkoYCgke21ldGEuZW5kcG9pbnR9KSBgKTtcbiAgICAgIHRoaXMucmVwbGF5U3ViamVjdHNbbWV0YS5lbmRwb2ludF0gPSB7fTtcbiAgICB9XG4gICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5yZXBsYXlTdWJqZWN0c1ttZXRhLmVuZHBvaW50XVttZXRhLnBhdGhdKSkge1xuICAgICAgLy8gbG9nLmkoYCgke21ldGEuZW5kcG9pbnR9KSgke21ldGEucGF0aH0pIGApO1xuICAgICAgdGhpcy5yZXBsYXlTdWJqZWN0c1ttZXRhLmVuZHBvaW50XVttZXRhLnBhdGhdID0ge307XG4gICAgfVxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMucmVwbGF5U3ViamVjdHNbbWV0YS5lbmRwb2ludF1bbWV0YS5wYXRoXVttZXRob2RdKSkge1xuICAgICAgLy8gbG9nLmkoYCgke21ldGEuZW5kcG9pbnR9KSgke21ldGEucGF0aH0pIGApO1xuICAgICAgdGhpcy5yZXBsYXlTdWJqZWN0c1ttZXRhLmVuZHBvaW50XVttZXRhLnBhdGhdW21ldGhvZF0gPSB7fTtcbiAgICB9XG4gICAgLy8jZW5kcmVnaW9uXG5cbiAgICBjb25zdCBvYmplY3RJRFRvQ3JlYXRlT3JMYXN0ID0gKE9iamVjdC5rZXlzKHRoaXMucmVwbGF5U3ViamVjdHNbbWV0YS5lbmRwb2ludF1bbWV0YS5wYXRoXVttZXRob2RdIGFzIE9iamVjdCkubGVuZ3RoKSArXG4gICAgICAob25seUdldExhc3RSZXBsYXlGb3JNZXRob2QgPyAwIDogMSk7XG4gICAgaWYgKG9ubHlHZXRMYXN0UmVwbGF5Rm9yTWV0aG9kICYmIChvYmplY3RJRFRvQ3JlYXRlT3JMYXN0ID09PSAwKSkge1xuICAgICAgcmV0dXJuIHJlcGxheTtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdW21ldGEucGF0aF1bbWV0aG9kXVtvYmplY3RJRFRvQ3JlYXRlT3JMYXN0XSkpIHtcbiAgICAgIC8vIGxvZy5pKGAoJHttZXRhLmVuZHBvaW50fSkoJHttZXRhLnBhdGh9KSgke21ldGhvZH0pIGApO1xuICAgICAgdGhpcy5yZXBsYXlTdWJqZWN0c1ttZXRhLmVuZHBvaW50XVttZXRhLnBhdGhdW21ldGhvZF1bb2JqZWN0SURUb0NyZWF0ZU9yTGFzdF0gPSA8TW9kZWxzLlJlcGxheURhdGE+e1xuICAgICAgICBzdWJqZWN0OiBuZXcgU3ViamVjdCgpLFxuICAgICAgICBkYXRhOiB2b2lkIDAsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJlcGxheSA9IHRoaXMucmVwbGF5U3ViamVjdHNbbWV0YS5lbmRwb2ludF1bbWV0YS5wYXRoXVttZXRob2RdW29iamVjdElEVG9DcmVhdGVPckxhc3RdO1xuXG4gICAgaWYgKCFfLmlzTnVtYmVyKHJlcGxheS5pZCkpIHtcbiAgICAgIGNvbnN0IGpvYmlkOiBudW1iZXIgPSBSZXN0UmVxdWVzdC5qb2JJZCsrO1xuICAgICAgcmVwbGF5LmlkID0gam9iaWQ7XG4gICAgICBjb25zdCBzdWJqZWN0OiBTdWJqZWN0PGFueT4gPSByZXBsYXkuc3ViamVjdDtcbiAgICAgIHN1YmplY3Rbam9iSURrZXldID0gam9iaWQ7IC8vIG1vZGlmeSBpbnRlcm5hbCByeGpzIHN1YmplY3Qgb2JqXG5cbiAgICAgIHRoaXMubWV0YVtqb2JpZF0gPSBtZXRhO1xuICAgICAgdGhpcy5zdWJqZWN0SW51VXNlW2pvYmlkXSA9IHN1YmplY3Q7XG5cbiAgICAgIC8vI3JlZ2lvbiBESVNQT1NFICBAVU5DT01NRU5UIEFGVEVSIFRFU1RTXG4gICAgICAvLyBpZiAob2JqZWN0SURUb0NyZWF0ZU9yTGFzdCA+IDIpIHtcbiAgICAgIC8vICAgY29uc3Qgb2xkUmVxOiBNb2RlbHMuUmVwbGF5RGF0YSA9IHRoaXMucmVwbGF5U3ViamVjdHNbbWV0YS5lbmRwb2ludF1bbWV0YS5wYXRoXVttZXRob2RdWyhvYmplY3RJRFRvQ3JlYXRlT3JMYXN0IC0gMildO1xuICAgICAgLy8gICBpZiAoXy5pc1VuZGVmaW5lZCh0aGlzLm1ldGFbb2xkUmVxLmlkXSkpIHtcbiAgICAgIC8vICAgICAvLyBjYW50IGRlbGV0ZSB0aGlzIC0gZm9yIGNvdW50ZXIgcHVycG9zZVxuICAgICAgLy8gICAgIHRoaXMucmVwbGF5U3ViamVjdHNbbWV0YS5lbmRwb2ludF1bbWV0YS5wYXRoXVttZXRob2RdWyhvYmplY3RJRFRvQ3JlYXRlT3JMYXN0IC0gMildID0ge307XG4gICAgICAvLyAgICAgZGVsZXRlIHRoaXMuc3ViamVjdEludVVzZVtvbGRSZXEuaWRdO1xuICAgICAgLy8gICAgIGRlbGV0ZSB0aGlzLm1ldGFbb2xkUmVxLmlkXTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgICAgLy8jZW5kcmVnaW9uXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcGxheTtcbiAgfVxuXG5cbiAgLy8jcmVnaW9uIGh0dHAgbWV0aG9kc1xuXG4gIHByaXZhdGUgZ2VuZXJhbFJlcShcbiAgICBtZXRob2Q6IE1vZGVscy5IdHRwTWV0aG9kLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZyxcbiAgICBoZWFkZXJzOiBSZXN0SGVhZGVycyxcbiAgICBtZXRhOiBNb2RlbHMuTWV0YVJlcXVlc3QsXG4gICAgaXNBcnJheTogYm9vbGVhbixcbiAgICBtb2NrSHR0cDogTW9kZWxzLk1vY2tIdHRwKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PGFueT4ge1xuXG4gICAgY29uc3QgcmVwbGF5OiBNb2RlbHMuUmVwbGF5RGF0YSA9IHRoaXMuZ2V0UmVwbGF5KG1ldGhvZCwgbWV0YSwgZmFsc2UpO1xuICAgIHJlcGxheS5kYXRhID0geyB1cmwsIGJvZHksIGhlYWRlcnMsIGlzQXJyYXkgfTtcblxuICAgICgocHRoaXMsIHB1cmwsIHBtZXRob2QsIHBoZWFkZXJzLCBwYm9keSwgcGlkLCBwaXNBcnJheSwgcG1vY2tIdHRwKSA9PiB7XG4gICAgICAvLyBsb2cuZChgZm9yICR7cHVybH0gam9iaWQgJHtwaWR9YCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHB0aGlzLnJlcShwdXJsLCBwbWV0aG9kLCBwaGVhZGVycywgcGJvZHksIHBpZCwgcGlzQXJyYXksIHBtb2NrSHR0cCkpO1xuICAgIH0pKHRoaXMsIHVybCwgbWV0aG9kLCBoZWFkZXJzLCBib2R5LCByZXBsYXkuaWQsIGlzQXJyYXksIG1vY2tIdHRwKVxuXG4gICAgY29uc3QgcmVzcDogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PGFueT4gPSBmaXJzdFZhbHVlRnJvbShyZXBsYXkuc3ViamVjdC5hc09ic2VydmFibGUoKSkgYXMgYW55O1xuICAgIHJlc3Aub2JzZXJ2YWJsZSA9IHJlcGxheS5zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHJlc3AuY2FjaGUgPSBSZXF1ZXN0Q2FjaGUuZmluZEJ5KHtcbiAgICAgIGJvZHksXG4gICAgICBpc0FycmF5LFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3A7XG4gIH1cblxuICBnZXQoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYm9keTogc3RyaW5nLFxuICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzLFxuICAgIG1ldGE6IE1vZGVscy5NZXRhUmVxdWVzdCxcbiAgICBpc0FycmF5OiBib29sZWFuLCBtb2NrSHR0cDogTW9kZWxzLk1vY2tIdHRwXG4gICk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmFsUmVxKCdnZXQnLCB1cmwsIGJvZHksIGhlYWRlcnMsIG1ldGEsIGlzQXJyYXksIG1vY2tIdHRwKTtcbiAgfVxuXG4gIGhlYWQoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYm9keTogc3RyaW5nLFxuICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzLFxuICAgIG1ldGE6IE1vZGVscy5NZXRhUmVxdWVzdCxcbiAgICBpc0FycmF5OiBib29sZWFuLCBtb2NrSHR0cDogTW9kZWxzLk1vY2tIdHRwXG4gICk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmFsUmVxKCdoZWFkJywgdXJsLCBib2R5LCBoZWFkZXJzLCBtZXRhLCBpc0FycmF5LCBtb2NrSHR0cCk7XG4gIH1cblxuICBkZWxldGUoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYm9keTogc3RyaW5nLFxuICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzLFxuICAgIG1ldGE6IE1vZGVscy5NZXRhUmVxdWVzdCxcbiAgICBpc0FycmF5OiBib29sZWFuLFxuICAgIG1vY2tIdHRwOiBNb2RlbHMuTW9ja0h0dHApOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhbFJlcSgnZGVsZXRlJywgdXJsLCBib2R5LCBoZWFkZXJzLCBtZXRhLCBpc0FycmF5LCBtb2NrSHR0cCk7XG4gIH1cblxuICBwb3N0KFxuICAgIHVybDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZyxcbiAgICBoZWFkZXJzOiBSZXN0SGVhZGVycyxcbiAgICBtZXRhOiBNb2RlbHMuTWV0YVJlcXVlc3QsXG4gICAgaXNBcnJheTogYm9vbGVhbixcbiAgICBtb2NrSHR0cDogTW9kZWxzLk1vY2tIdHRwXG4gICk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmFsUmVxKCdwb3N0JywgdXJsLCBib2R5LCBoZWFkZXJzLCBtZXRhLCBpc0FycmF5LCBtb2NrSHR0cCk7XG4gIH1cblxuICBwdXQoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYm9keTogc3RyaW5nLFxuICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzLFxuICAgIG1ldGE6IE1vZGVscy5NZXRhUmVxdWVzdCxcbiAgICBpc0FycmF5OiBib29sZWFuLFxuICAgIG1vY2tIdHRwOiBNb2RlbHMuTW9ja0h0dHBcbiAgKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYWxSZXEoJ3B1dCcsIHVybCwgYm9keSwgaGVhZGVycywgbWV0YSwgaXNBcnJheSwgbW9ja0h0dHApO1xuICB9XG5cbiAgcGF0Y2goXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYm9keTogc3RyaW5nLFxuICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzLFxuICAgIG1ldGE6IE1vZGVscy5NZXRhUmVxdWVzdCxcbiAgICBpc0FycmF5OiBib29sZWFuLFxuICAgIG1vY2tIdHRwOiBNb2RlbHMuTW9ja0h0dHBcbiAgKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYWxSZXEoJ3BhdGNoJywgdXJsLCBib2R5LCBoZWFkZXJzLCBtZXRhLCBpc0FycmF5LCBtb2NrSHR0cCk7XG4gIH1cblxuICBqc29ucChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgaGVhZGVyczogUmVzdEhlYWRlcnMsXG4gICAgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LFxuICAgIGlzQXJyYXk6IGJvb2xlYW4sXG4gICAgbW9ja0h0dHA6IE1vZGVscy5Nb2NrSHR0cFxuICApOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8YW55PiB7XG5cbiAgICBjb25zdCByZXBsYXk6IE1vZGVscy5SZXBsYXlEYXRhID0gdGhpcy5nZXRSZXBsYXkoJ2pzb25wJywgbWV0YSwgZmFsc2UpO1xuICAgIGNvbnN0IGpvYmlkID0gcmVwbGF5LmlkO1xuICAgIGNvbnN0IG1ldGhvZCA9ICdqc29ucCdcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh1cmwuZW5kc1dpdGgoJy8nKSkgdXJsID0gdXJsLnNsaWNlKDAsIHVybC5sZW5ndGggLSAxKVxuICAgICAgbGV0IG51bSA9IE1hdGgucm91bmQoMTAwMDAgKiBNYXRoLnJhbmRvbSgpKTtcbiAgICAgIGxldCBjYWxsYmFja01ldGhvZE5hbWUgPSBcImNiX1wiICsgbnVtO1xuICAgICAgd2luZG93W2NhbGxiYWNrTWV0aG9kTmFtZV0gPSAoZGF0YSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja0NhY2hlKHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBpc0FycmF5LFxuICAgICAgICAgIG1ldGhvZFxuICAgICAgICB9LCBqb2JpZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYW5kbGVyUmVzdWx0KHtcbiAgICAgICAgICByZXM6IHtcbiAgICAgICAgICAgIGRhdGEsIGlzQXJyYXlcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBqb2JpZCxcbiAgICAgICAgICBpc0FycmF5XG4gICAgICAgIH0sIHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgYm9keSxcbiAgICAgICAgICBpc0FycmF5LFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGxldCBzYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgc2Muc3JjID0gYCR7dXJsfT9jYWxsYmFjaz0ke2NhbGxiYWNrTWV0aG9kTmFtZX1gO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzYyk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNjKTtcbiAgICB9KVxuICAgIC8vIHJldHVybiByZXBsYXkuc3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBjb25zdCByZXNwOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8YW55PiA9IGZpcnN0VmFsdWVGcm9tKHJlcGxheS5zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpKSBhcyBhbnk7XG4gICAgcmVzcC5vYnNlcnZhYmxlID0gcmVwbGF5LnN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcmVzcC5jYWNoZSA9IFJlcXVlc3RDYWNoZS5maW5kQnkoe1xuICAgICAgYm9keSxcbiAgICAgIGlzQXJyYXksXG4gICAgICBtZXRob2QsXG4gICAgICB1cmxcbiAgICB9KVxuICAgIHJldHVybiByZXNwO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuICBwcml2YXRlIHJlcGxheVN1YmplY3RzID0ge307XG4gIHB1YmxpYyByZXBsYXkobWV0aG9kOiBNb2RlbHMuSHR0cE1ldGhvZCwgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0KSB7XG4gICAgY29uc3QgcmVwbGF5OiBNb2RlbHMuUmVwbGF5RGF0YSA9IHRoaXMuZ2V0UmVwbGF5KG1ldGhvZCwgbWV0YSwgdHJ1ZSk7XG4gICAgaWYgKCFyZXBsYXkgfHwgIXJlcGxheS5kYXRhKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbm5vIHJlcGxheSBmaXJzdCAke21ldGhvZH0gcmVxdWVzdCBmcm9tICR7bWV0YS5lbmRwb2ludH0vJHttZXRhLnBhdGh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfTtcbiAgICBpZiAocmVwbGF5ICYmIHJlcGxheS5zdWJqZWN0ICYmIEFycmF5LmlzQXJyYXkocmVwbGF5LnN1YmplY3Qub2JzZXJ2ZXJzKSAmJlxuICAgICAgcmVwbGF5LnN1YmplY3Qub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS53YXJuKGBObyBvYnNlcnZhdG9ycyBmb3IgJHttZXRob2R9IHJlcXVlc3QgZnJvbSAke21ldGEuZW5kcG9pbnR9LyR7bWV0YS5wYXRofWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSByZXBsYXkuZGF0YS51cmw7XG4gICAgY29uc3QgaGVhZGVycyA9IHJlcGxheS5kYXRhLmhlYWRlcnM7XG4gICAgY29uc3QgYm9keSA9IHJlcGxheS5kYXRhLmJvZHk7XG4gICAgY29uc3QgaXNBcnJheSA9IHJlcGxheS5kYXRhLmlzQXJyYXk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlcSh1cmwsIG1ldGhvZCwgaGVhZGVycywgYm9keSwgcmVwbGF5LmlkLCBpc0FycmF5KSlcbiAgfVxuXG59XG4iXX0=
352
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1yZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWJ1bmRsZS9uZzItcmVzdC9wcm9qZWN0cy9uZzItcmVzdC9zcmMvbGliL3Jlc3QtcmVxdWVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9CLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sS0FBd0IsTUFBTSxPQUFPLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxHQUFHLEVBQVUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsRUFDNUMsS0FBSyxDQUFDLFNBQVMsQ0FDbEIsQ0FBQTtBQUVELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQztBQUN6QixNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUM7QUFDOUIsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDO0FBQzVCLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQztBQUdoQyxzQkFBc0I7QUFDdEIsWUFBWTtBQUVaLE1BQU0sT0FBTyxXQUFXO0lBQXhCO1FBSVUsa0JB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QUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3BDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFDNUUsQ0FBQzs7QUE3YWMsaUJBQUssR0FBRyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBfIH0gZnJvbSAndG5wLWNvcmUvYnJvd3Nlcic7XG5cbmltcG9ydCB7IE1vZGVscyB9IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IFJlc3RIZWFkZXJzIH0gZnJvbSAnLi9yZXN0LWhlYWRlcnMnO1xuXG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSAndG5wLWNvcmUvYnJvd3Nlcic7XG5pbXBvcnQgeyBMZXZlbCB9IGZyb20gJ25nMi1sb2dnZXIvYnJvd3Nlcic7XG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NSZXNwb25zZSB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IFJlc291cmNlIH0gZnJvbSAnLi9yZXNvdXJjZS5zZXJ2aWNlJztcbmltcG9ydCB7IExvZywgTG9nZ2VyIH0gZnJvbSAnbmcyLWxvZ2dlci9icm93c2VyJztcblxuaW1wb3J0IHsgUmVxdWVzdENhY2hlIH0gZnJvbSAnLi9yZXF1ZXN0LWNhY2hlJztcbmNvbnN0IGxvZyA9IExvZy5jcmVhdGUoJ1tuZzItcmVzdF0gcmVzdC1yZXF1ZXN0J1xuICAsIExldmVsLl9fTk9USElOR1xuKVxuXG5jb25zdCBqb2JJRGtleSA9ICdqb2JJRCc7XG5jb25zdCBjdXN0b21PYnMgPSAnY3VzdG9tT2JzJztcbmNvbnN0IGNhbmNlbEZuID0gJ2NhbmNlbEZuJztcbmNvbnN0IGlzQ2FuY2VsZWQgPSAnaXNDYW5jZWxlZCc7XG5kZWNsYXJlIGNvbnN0IGdsb2JhbDogYW55O1xuXG4vLyNyZWdpb24gbW9jayByZXF1ZXN0XG4vLyNlbmRyZWdpb25cblxuZXhwb3J0IGNsYXNzIFJlc3RSZXF1ZXN0IHtcblxuICBwdWJsaWMgc3RhdGljIHpvbmU7XG4gIHByaXZhdGUgc3RhdGljIGpvYklkID0gMDtcbiAgcHJpdmF0ZSBzdWJqZWN0SW51VXNlOiB7IFtpZDogbnVtYmVyXTogU3ViamVjdDxhbnk+IH0gPSB7fTtcbiAgcHJpdmF0ZSBtZXRhOiB7IFtpZDogbnVtYmVyXTogTW9kZWxzLk1ldGFSZXF1ZXN0IH0gPSB7fTtcblxuXG4gIHByaXZhdGUgaGFuZGxlclJlc3VsdChvcHRpb25zOiBNb2RlbHMuSGFuZGxlUmVzdWx0T3B0aW9ucyxcbiAgICBzb3VyY2VSZXF1ZXN0OiBNb2RlbHMuSGFuZGxlUmVzdWx0U291cmNlUmVxdWVzdE9wdGlvbnMpIHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChvcHRpb25zKSkge1xuICAgICAgb3B0aW9ucyA9IHt9IGFzIGFueTtcbiAgICB9XG4gICAgLy8gbG9nLmQoYEhBTkRMRSBSRVNVTFQgKGpvYmlkOiR7b3B0aW9ucy5qb2JpZH0pICR7c291cmNlUmVxdWVzdC51cmx9YCk7XG4gICAgY29uc3QgeyByZXMsIGpvYmlkLCBpc0FycmF5LCBtZXRob2QgfSA9IG9wdGlvbnM7XG5cbiAgICBpZiAodHlwZW9mIHJlcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcmVzcG9zbnNlIGZvciByZXF1ZXN0LiAnKTtcbiAgICB9XG5cbiAgICBpZiAoSGVscGVycy5pc0Jyb3dzZXIpIHtcbiAgICAgIHJlcy5oZWFkZXJzID0gUmVzdEhlYWRlcnMuZnJvbShyZXMuaGVhZGVycyk7XG4gICAgfVxuXG4gICAgLy8gZXJyb3Igbm8gaW50ZXJuZXRcbiAgICBpZiAocmVzLmVycm9yKSB7XG4gICAgICB0aGlzLnN1YmplY3RJbnVVc2Vbam9iaWRdLmVycm9yKG5ldyBNb2RlbHMuSHR0cFJlc3BvbnNlRXJyb3IocmVzLmVycm9yLCByZXMuZGF0YSwgcmVzLmhlYWRlcnMsIHJlcy5jb2RlLCBqb2JpZCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbnRpdHkgPSB0aGlzLm1ldGFbam9iaWRdLmVudGl0eTtcbiAgICBjb25zdCBjaXJjdWxhciA9IHRoaXMubWV0YVtqb2JpZF0uY2lyY3VsYXI7XG5cbiAgICBjb25zdCBzdWNjZXNzID0gKFJlc291cmNlWydfbGlzdGVuU3VjY2VzcyddIGFzIFN1YmplY3Q8TW9kZWxzLkh0dHBSZXNwb25zZTxhbnk+PilcblxuICAgIGNvbnN0IHJlcVJlc3AgPSBuZXcgTW9kZWxzLkh0dHBSZXNwb25zZShzb3VyY2VSZXF1ZXN0LCByZXMuZGF0YSwgcmVzLmhlYWRlcnMsIHJlcy5jb2RlLCBlbnRpdHksIGNpcmN1bGFyLCBqb2JpZCwgaXNBcnJheSk7XG4gICAgc3VjY2Vzcy5uZXh0KHJlcVJlc3ApO1xuXG4gICAgdGhpcy5zdWJqZWN0SW51VXNlW2pvYmlkXS5uZXh0KHJlcVJlc3ApO1xuICAgIHRoaXMubWV0YVtqb2JpZF0gPSB2b2lkIDA7XG4gICAgdGhpcy5zdWJqZWN0SW51VXNlW2pvYmlkXS5jb21wbGV0ZSgpO1xuICB9XG4gIGNoZWNrQ2FjaGUoc291cmNlUmVxdWVzdDogTW9kZWxzLkhhbmRsZVJlc3VsdFNvdXJjZVJlcXVlc3RPcHRpb25zLCBqb2JpZDogbnVtYmVyKSB7XG4gICAgY29uc3QgZXhpc3RlZEluQ2FjaGUgPSBSZXF1ZXN0Q2FjaGUuZmluZEJ5KHNvdXJjZVJlcXVlc3QpO1xuICAgIGlmIChleGlzdGVkSW5DYWNoZSkge1xuICAgICAgbG9nLmkoJ2NhY2hlIGV4aXN0cycsIGV4aXN0ZWRJbkNhY2hlKVxuICAgICAgY29uc3Qgc3VjY2VzcyA9IChSZXNvdXJjZVsnX2xpc3RlblN1Y2Nlc3MnXSBhcyBTdWJqZWN0PE1vZGVscy5IdHRwUmVzcG9uc2U8YW55Pj4pO1xuICAgICAgc3VjY2Vzcy5uZXh0KGV4aXN0ZWRJbkNhY2hlLnJlc3BvbnNlKTtcbiAgICAgIHRoaXMuc3ViamVjdEludVVzZVtqb2JpZF0ubmV4dChleGlzdGVkSW5DYWNoZSk7XG4gICAgICB0aGlzLnN1YmplY3RJbnVVc2Vbam9iaWRdLmNvbXBsZXRlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gbG9nLmkoYGNhY2hlIG5vdCBleGlzdHMgZm9yIGpvYmlkICR7am9iaWR9YClcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlcShcbiAgICB1cmw6IHN0cmluZyxcbiAgICBtZXRob2Q6IE1vZGVscy5IdHRwTWV0aG9kLFxuICAgIGhlYWRlcnM/OiBSZXN0SGVhZGVycyxcbiAgICBib2R5PzogYW55LFxuICAgIGpvYmlkPzogbnVtYmVyLFxuICAgIGlzQXJyYXkgPSBmYWxzZSxcbiAgICBtb2NrSHR0cD86IE1vZGVscy5Nb2NrSHR0cFxuICApIHtcbiAgICBpZiAodGhpcy5jaGVja0NhY2hlKHtcbiAgICAgIHVybCxcbiAgICAgIGJvZHksXG4gICAgICBpc0FycmF5LFxuICAgICAgbWV0aG9kXG4gICAgfSwgam9iaWQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgQ2FuY2VsVG9rZW4gPSBheGlvcy5DYW5jZWxUb2tlbjtcbiAgICBjb25zdCBzb3VyY2UgPSBDYW5jZWxUb2tlbi5zb3VyY2UoKTtcbiAgICB0aGlzLnN1YmplY3RJbnVVc2Vbam9iaWRdW2NhbmNlbEZuXSA9IHNvdXJjZS5jYW5jZWw7XG5cbiAgICB2YXIgcmVzcG9uc2U6IEF4aW9zUmVzcG9uc2U8YW55PjtcbiAgICBpZiAobW9ja0h0dHApIHtcblxuICAgICAgaWYgKHR5cGVvZiBtb2NrSHR0cCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgZGF0YTogbW9ja0h0dHAuZGF0YSxcbiAgICAgICAgICBzdGF0dXM6IG1vY2tIdHRwLmNvZGUsXG4gICAgICAgICAgaGVhZGVyczogbW9ja0h0dHAuaGVhZGVycyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiBtb2NrSHR0cC5lcnJvcixcbiAgICAgICAgICBjb25maWc6IHt9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vY2tIdHRwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IHIgPSBtb2NrSHR0cCh1cmwsIG1ldGhvZCwgaGVhZGVycywgYm9keSk7XG4gICAgICAgIHJlc3BvbnNlID0ge1xuICAgICAgICAgIGRhdGE6IHIuZGF0YSxcbiAgICAgICAgICBzdGF0dXM6IHIuY29kZSxcbiAgICAgICAgICBoZWFkZXJzOiByLmhlYWRlcnMsXG4gICAgICAgICAgc3RhdHVzVGV4dDogci5lcnJvcixcbiAgICAgICAgICBjb25maWc6IHt9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICBsb2cuZChgWyR7bWV0aG9kfV0gKGpvYmlkPSR7am9iaWR9KSByZXF1ZXN0IHRvOiAgJHt1cmx9YClcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBheGlvcyh7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBkYXRhOiBib2R5LFxuICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMudG9KU09OKCksXG4gICAgICAgICAgY2FuY2VsVG9rZW46IHNvdXJjZS50b2tlbixcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGxvZy5kKGBhZnRlciByZXNwb25zZSBvZiBqb2JpZDogJHtqb2JpZH1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3ViamVjdEludVVzZVtqb2JpZF1baXNDYW5jZWxlZF0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmhhbmRsZXJSZXN1bHQoe1xuICAgICAgICByZXM6IHtcbiAgICAgICAgICBjb2RlOiByZXNwb25zZS5zdGF0dXMgYXMgYW55LFxuICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlLmRhdGEpLFxuICAgICAgICAgIGlzQXJyYXksXG4gICAgICAgICAgam9iaWQsXG4gICAgICAgICAgaGVhZGVyczogUmVzdEhlYWRlcnMuZnJvbShyZXNwb25zZS5oZWFkZXJzKVxuICAgICAgICB9LFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGpvYmlkLFxuICAgICAgICBpc0FycmF5XG4gICAgICB9LCB7XG4gICAgICAgIHVybCxcbiAgICAgICAgYm9keSxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBpc0FycmF5LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoY2F0Y2hlZEVycm9yKSB7XG4gICAgICBpZiAodGhpcy5zdWJqZWN0SW51VXNlW2pvYmlkXVtpc0NhbmNlbGVkXSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBjb25zb2xlLmxvZygnRVJST1IgUkVTUE9ORVNFIGNhdGNoZWRFcnJvciB0eXBlb2YgJywgdHlwZW9mIGNhdGNoZWRFcnJvcilcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdFUlJPUiBSRVNQT05FU0UgY2F0Y2hlZEVycm9yJywgY2F0Y2hlZEVycm9yKVxuICAgICAgaWYgKHR5cGVvZiBjYXRjaGVkRXJyb3IgPT09ICdvYmplY3QnICYmIGNhdGNoZWRFcnJvci5yZXNwb25zZSAmJiBjYXRjaGVkRXJyb3IucmVzcG9uc2UuZGF0YSkge1xuICAgICAgICBjb25zdCBlcnIgPSBjYXRjaGVkRXJyb3IucmVzcG9uc2UuZGF0YTtcbiAgICAgICAgY29uc3QgbXNnOiBzdHJpbmcgPSBjYXRjaGVkRXJyb3IucmVzcG9uc2UuZGF0YS5tZXNzYWdlIHx8ICcnO1xuICAgICAgICBsZXQgc3RhY2s6IHN0cmluZ1tdID0gKGVyci5zdGFjayB8fCAnJykuc3BsaXQoJ1xcbicpO1xuXG4gICAgICAgIGNvbnN0IGVyck9icyA9IChSZXNvdXJjZVsnX2xpc3RlbkVycm9ycyddIGFzIFN1YmplY3Q8TW9kZWxzLkJhY2tlbmRFcnJvcj4pO1xuICAgICAgICBlcnJPYnMubmV4dCh7XG4gICAgICAgICAgbXNnLFxuICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgIGRhdGE6IGNhdGNoZWRFcnJvci5yZXNwb25zZS5kYXRhXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3IgPSAoY2F0Y2hlZEVycm9yICYmIGNhdGNoZWRFcnJvci5yZXNwb25zZSkgPyBgWyR7Y2F0Y2hlZEVycm9yLnJlc3BvbnNlLnN0YXR1c1RleHR9XTogYCA6ICcnO1xuICAgICAgdGhpcy5oYW5kbGVyUmVzdWx0KHtcbiAgICAgICAgcmVzOiB7XG4gICAgICAgICAgY29kZTogKGNhdGNoZWRFcnJvciAmJiBjYXRjaGVkRXJyb3IucmVzcG9uc2UpID8gY2F0Y2hlZEVycm9yLnJlc3BvbnNlLnN0YXR1cyBhcyBhbnkgOiB2b2lkIDAsXG4gICAgICAgICAgZXJyb3I6IGAke2Vycm9yfSR7Y2F0Y2hlZEVycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICBkYXRhOiAoY2F0Y2hlZEVycm9yICYmIGNhdGNoZWRFcnJvci5yZXNwb25zZSkgPyBKU09OLnN0cmluZ2lmeShjYXRjaGVkRXJyb3IucmVzcG9uc2UuZGF0YSkgOiB2b2lkIDAsXG4gICAgICAgICAgaXNBcnJheSxcbiAgICAgICAgICBqb2JpZCxcbiAgICAgICAgICBoZWFkZXJzOiBSZXN0SGVhZGVycy5mcm9tKGNhdGNoZWRFcnJvciAmJiBjYXRjaGVkRXJyb3IucmVzcG9uc2UgJiYgY2F0Y2hlZEVycm9yLnJlc3BvbnNlLmhlYWRlcnMpXG4gICAgICAgIH0sXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgam9iaWQsXG4gICAgICAgIGlzQXJyYXlcbiAgICAgIH0sIHtcbiAgICAgICAgdXJsLFxuICAgICAgICBib2R5LFxuICAgICAgICBpc0FycmF5LFxuICAgICAgICBtZXRob2RcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVwbGF5KG1ldGhvZDogTW9kZWxzLkh0dHBNZXRob2QsIG1ldGE6IE1vZGVscy5NZXRhUmVxdWVzdCwgb25seUdldExhc3RSZXBsYXlGb3JNZXRob2Q6IGJvb2xlYW4pOiBNb2RlbHMuUmVwbGF5RGF0YSB7XG4gICAgbGV0IHJlcGxheTogTW9kZWxzLlJlcGxheURhdGE7XG5cbiAgICAvLyNyZWdpb24gcHJldmVudCBlbXB0eSB0cmVlXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5yZXBsYXlTdWJqZWN0c1ttZXRhLmVuZHBvaW50XSkpIHtcbiAgICAgIC8vIGxvZy5pKGAoJHttZXRhLmVuZHBvaW50fSkgYCk7XG4gICAgICB0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdID0ge307XG4gICAgfVxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMucmVwbGF5U3ViamVjdHNbbWV0YS5lbmRwb2ludF1bbWV0YS5wYXRoXSkpIHtcbiAgICAgIC8vIGxvZy5pKGAoJHttZXRhLmVuZHBvaW50fSkoJHttZXRhLnBhdGh9KSBgKTtcbiAgICAgIHRoaXMucmVwbGF5U3ViamVjdHNbbWV0YS5lbmRwb2ludF1bbWV0YS5wYXRoXSA9IHt9O1xuICAgIH1cbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdW21ldGEucGF0aF1bbWV0aG9kXSkpIHtcbiAgICAgIC8vIGxvZy5pKGAoJHttZXRhLmVuZHBvaW50fSkoJHttZXRhLnBhdGh9KSBgKTtcbiAgICAgIHRoaXMucmVwbGF5U3ViamVjdHNbbWV0YS5lbmRwb2ludF1bbWV0YS5wYXRoXVttZXRob2RdID0ge307XG4gICAgfVxuICAgIC8vI2VuZHJlZ2lvblxuXG4gICAgY29uc3Qgb2JqZWN0SURUb0NyZWF0ZU9yTGFzdCA9IChPYmplY3Qua2V5cyh0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdW21ldGEucGF0aF1bbWV0aG9kXSBhcyBPYmplY3QpLmxlbmd0aCkgK1xuICAgICAgKG9ubHlHZXRMYXN0UmVwbGF5Rm9yTWV0aG9kID8gMCA6IDEpO1xuICAgIGlmIChvbmx5R2V0TGFzdFJlcGxheUZvck1ldGhvZCAmJiAob2JqZWN0SURUb0NyZWF0ZU9yTGFzdCA9PT0gMCkpIHtcbiAgICAgIHJldHVybiByZXBsYXk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5yZXBsYXlTdWJqZWN0c1ttZXRhLmVuZHBvaW50XVttZXRhLnBhdGhdW21ldGhvZF1bb2JqZWN0SURUb0NyZWF0ZU9yTGFzdF0pKSB7XG4gICAgICAvLyBsb2cuaShgKCR7bWV0YS5lbmRwb2ludH0pKCR7bWV0YS5wYXRofSkoJHttZXRob2R9KSBgKTtcbiAgICAgIHRoaXMucmVwbGF5U3ViamVjdHNbbWV0YS5lbmRwb2ludF1bbWV0YS5wYXRoXVttZXRob2RdW29iamVjdElEVG9DcmVhdGVPckxhc3RdID0gPE1vZGVscy5SZXBsYXlEYXRhPntcbiAgICAgICAgc3ViamVjdDogbmV3IFN1YmplY3QoKSxcbiAgICAgICAgZGF0YTogdm9pZCAwLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXBsYXkgPSB0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdW21ldGEucGF0aF1bbWV0aG9kXVtvYmplY3RJRFRvQ3JlYXRlT3JMYXN0XTtcblxuICAgIGlmICghXy5pc051bWJlcihyZXBsYXkuaWQpKSB7XG4gICAgICBpZiAoUmVzdFJlcXVlc3Quam9iSWQgPT09IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIFJlc3RSZXF1ZXN0LmpvYklkID0gMDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgam9iaWQ6IG51bWJlciA9IFJlc3RSZXF1ZXN0LmpvYklkKys7XG4gICAgICByZXBsYXkuaWQgPSBqb2JpZDtcbiAgICAgIGNvbnN0IHN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IHJlcGxheS5zdWJqZWN0O1xuICAgICAgc3ViamVjdFtqb2JJRGtleV0gPSBqb2JpZDsgLy8gbW9kaWZ5IGludGVybmFsIHJ4anMgc3ViamVjdCBvYmpcblxuICAgICAgdGhpcy5tZXRhW2pvYmlkXSA9IG1ldGE7XG4gICAgICB0aGlzLnN1YmplY3RJbnVVc2Vbam9iaWRdID0gc3ViamVjdDtcblxuICAgICAgdGhpcy5zdWJqZWN0SW51VXNlW2pvYmlkXVtjdXN0b21PYnNdID0gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgICAgIC8vIG9ic2VydmVyLnJlbW92ZSgoKSA9PiB7XG5cbiAgICAgICAgLy8gfSk7XG4gICAgICAgIG9ic2VydmVyLmFkZCgoKSA9PiB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coYGNhbmNlbCBvYnNlcnZhYmxlIGpvYiR7am9iaWR9YClcbiAgICAgICAgICBpZiAoIXRoaXMuc3ViamVjdEludVVzZVtqb2JpZF1baXNDYW5jZWxlZF0pIHtcbiAgICAgICAgICAgIHRoaXMuc3ViamVjdEludVVzZVtqb2JpZF1baXNDYW5jZWxlZF0gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN1YmplY3RJbnVVc2Vbam9iaWRdW2NhbmNlbEZuXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICB0aGlzLnN1YmplY3RJbnVVc2Vbam9iaWRdW2NhbmNlbEZuXSgnW25nMi1yZXN0XSBvbiBwdXJwb3NlIGNhbmNlbGVkIGh0dHAgcmVxdWVzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhgc29tZWhvdyBzZWNvbmQgdGltZSBjYW5jZWwgJHtqb2JpZH1gKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgY29uc3Qgc3ViID0gc3ViamVjdC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IGEgPT4gb2JzZXJ2ZXIubmV4dChhKSxcbiAgICAgICAgICBlcnJvcjogYSA9PiBvYnNlcnZlci5lcnJvcihhKSxcbiAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuXG4gICAgICAvLyNyZWdpb24gRElTUE9TRSAgQFVOQ09NTUVOVCBBRlRFUiBURVNUU1xuICAgICAgLy8gaWYgKG9iamVjdElEVG9DcmVhdGVPckxhc3QgPiAyKSB7XG4gICAgICAvLyAgIGNvbnN0IG9sZFJlcTogTW9kZWxzLlJlcGxheURhdGEgPSB0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdW21ldGEucGF0aF1bbWV0aG9kXVsob2JqZWN0SURUb0NyZWF0ZU9yTGFzdCAtIDIpXTtcbiAgICAgIC8vICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5tZXRhW29sZFJlcS5pZF0pKSB7XG4gICAgICAvLyAgICAgLy8gY2FudCBkZWxldGUgdGhpcyAtIGZvciBjb3VudGVyIHB1cnBvc2VcbiAgICAgIC8vICAgICB0aGlzLnJlcGxheVN1YmplY3RzW21ldGEuZW5kcG9pbnRdW21ldGEucGF0aF1bbWV0aG9kXVsob2JqZWN0SURUb0NyZWF0ZU9yTGFzdCAtIDIpXSA9IHt9O1xuICAgICAgLy8gICAgIGRlbGV0ZSB0aGlzLnN1YmplY3RJbnVVc2Vbb2xkUmVxLmlkXTtcbiAgICAgIC8vICAgICBkZWxldGUgdGhpcy5tZXRhW29sZFJlcS5pZF07XG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH1cbiAgICAgIC8vI2VuZHJlZ2lvblxuICAgIH1cblxuICAgIHJldHVybiByZXBsYXk7XG4gIH1cblxuXG4gIC8vI3JlZ2lvbiBodHRwIG1ldGhvZHNcblxuICBwcml2YXRlIGdlbmVyYWxSZXEoXG4gICAgbWV0aG9kOiBNb2RlbHMuSHR0cE1ldGhvZCxcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgaGVhZGVyczogUmVzdEhlYWRlcnMsXG4gICAgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LFxuICAgIGlzQXJyYXk6IGJvb2xlYW4sXG4gICAgbW9ja0h0dHA6IE1vZGVscy5Nb2NrSHR0cCk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxhbnk+IHtcblxuICAgIGNvbnN0IHJlcGxheTogTW9kZWxzLlJlcGxheURhdGEgPSB0aGlzLmdldFJlcGxheShtZXRob2QsIG1ldGEsIGZhbHNlKTtcbiAgICByZXBsYXkuZGF0YSA9IHsgdXJsLCBib2R5LCBoZWFkZXJzLCBpc0FycmF5IH07XG5cbiAgICAoKHB0aGlzLCBwdXJsLCBwbWV0aG9kLCBwaGVhZGVycywgcGJvZHksIHBpZCwgcGlzQXJyYXksIHBtb2NrSHR0cCkgPT4ge1xuICAgICAgLy8gbG9nLmQoYGZvciAke3B1cmx9IGpvYmlkICR7cGlkfWApO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBwdGhpcy5yZXEocHVybCwgcG1ldGhvZCwgcGhlYWRlcnMsIHBib2R5LCBwaWQsIHBpc0FycmF5LCBwbW9ja0h0dHApKTtcbiAgICB9KSh0aGlzLCB1cmwsIG1ldGhvZCwgaGVhZGVycywgYm9keSwgcmVwbGF5LmlkLCBpc0FycmF5LCBtb2NrSHR0cClcblxuICAgIGNvbnN0IHJlc3A6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxhbnk+ID0gZmlyc3RWYWx1ZUZyb20ocmVwbGF5LnN1YmplY3RbY3VzdG9tT2JzXSkgYXMgYW55O1xuICAgIHJlc3Aub2JzZXJ2YWJsZSA9IHJlcGxheS5zdWJqZWN0W2N1c3RvbU9ic107XG4gICAgcmVzcC5jYWNoZSA9IFJlcXVlc3RDYWNoZS5maW5kQnkoe1xuICAgICAgYm9keSxcbiAgICAgIGlzQXJyYXksXG4gICAgICBtZXRob2QsXG4gICAgICB1cmxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcDtcbiAgfVxuXG4gIGdldChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgaGVhZGVyczogUmVzdEhlYWRlcnMsXG4gICAgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LFxuICAgIGlzQXJyYXk6IGJvb2xlYW4sIG1vY2tIdHRwOiBNb2RlbHMuTW9ja0h0dHBcbiAgKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYWxSZXEoJ2dldCcsIHVybCwgYm9keSwgaGVhZGVycywgbWV0YSwgaXNBcnJheSwgbW9ja0h0dHApO1xuICB9XG5cbiAgaGVhZChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgaGVhZGVyczogUmVzdEhlYWRlcnMsXG4gICAgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LFxuICAgIGlzQXJyYXk6IGJvb2xlYW4sIG1vY2tIdHRwOiBNb2RlbHMuTW9ja0h0dHBcbiAgKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYWxSZXEoJ2hlYWQnLCB1cmwsIGJvZHksIGhlYWRlcnMsIG1ldGEsIGlzQXJyYXksIG1vY2tIdHRwKTtcbiAgfVxuXG4gIGRlbGV0ZShcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgaGVhZGVyczogUmVzdEhlYWRlcnMsXG4gICAgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LFxuICAgIGlzQXJyYXk6IGJvb2xlYW4sXG4gICAgbW9ja0h0dHA6IE1vZGVscy5Nb2NrSHR0cCk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmFsUmVxKCdkZWxldGUnLCB1cmwsIGJvZHksIGhlYWRlcnMsIG1ldGEsIGlzQXJyYXksIG1vY2tIdHRwKTtcbiAgfVxuXG4gIHBvc3QoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYm9keTogc3RyaW5nLFxuICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzLFxuICAgIG1ldGE6IE1vZGVscy5NZXRhUmVxdWVzdCxcbiAgICBpc0FycmF5OiBib29sZWFuLFxuICAgIG1vY2tIdHRwOiBNb2RlbHMuTW9ja0h0dHBcbiAgKTogTW9kZWxzLlByb21pc2VPYnNlcnZhYmxlTWl4PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYWxSZXEoJ3Bvc3QnLCB1cmwsIGJvZHksIGhlYWRlcnMsIG1ldGEsIGlzQXJyYXksIG1vY2tIdHRwKTtcbiAgfVxuXG4gIHB1dChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgaGVhZGVyczogUmVzdEhlYWRlcnMsXG4gICAgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LFxuICAgIGlzQXJyYXk6IGJvb2xlYW4sXG4gICAgbW9ja0h0dHA6IE1vZGVscy5Nb2NrSHR0cFxuICApOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhbFJlcSgncHV0JywgdXJsLCBib2R5LCBoZWFkZXJzLCBtZXRhLCBpc0FycmF5LCBtb2NrSHR0cCk7XG4gIH1cblxuICBwYXRjaChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBzdHJpbmcsXG4gICAgaGVhZGVyczogUmVzdEhlYWRlcnMsXG4gICAgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0LFxuICAgIGlzQXJyYXk6IGJvb2xlYW4sXG4gICAgbW9ja0h0dHA6IE1vZGVscy5Nb2NrSHR0cFxuICApOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhbFJlcSgncGF0Y2gnLCB1cmwsIGJvZHksIGhlYWRlcnMsIG1ldGEsIGlzQXJyYXksIG1vY2tIdHRwKTtcbiAgfVxuXG4gIGpzb25wKFxuICAgIHVybDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZyxcbiAgICBoZWFkZXJzOiBSZXN0SGVhZGVycyxcbiAgICBtZXRhOiBNb2RlbHMuTWV0YVJlcXVlc3QsXG4gICAgaXNBcnJheTogYm9vbGVhbixcbiAgICBtb2NrSHR0cDogTW9kZWxzLk1vY2tIdHRwXG4gICk6IE1vZGVscy5Qcm9taXNlT2JzZXJ2YWJsZU1peDxhbnk+IHtcblxuICAgIGNvbnN0IHJlcGxheTogTW9kZWxzLlJlcGxheURhdGEgPSB0aGlzLmdldFJlcGxheSgnanNvbnAnLCBtZXRhLCBmYWxzZSk7XG4gICAgY29uc3Qgam9iaWQgPSByZXBsYXkuaWQ7XG4gICAgY29uc3QgbWV0aG9kID0gJ2pzb25wJ1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHVybC5lbmRzV2l0aCgnLycpKSB1cmwgPSB1cmwuc2xpY2UoMCwgdXJsLmxlbmd0aCAtIDEpXG4gICAgICBsZXQgbnVtID0gTWF0aC5yb3VuZCgxMDAwMCAqIE1hdGgucmFuZG9tKCkpO1xuICAgICAgbGV0IGNhbGxiYWNrTWV0aG9kTmFtZSA9IFwiY2JfXCIgKyBudW07XG4gICAgICB3aW5kb3dbY2FsbGJhY2tNZXRob2ROYW1lXSA9IChkYXRhKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrQ2FjaGUoe1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIGlzQXJyYXksXG4gICAgICAgICAgbWV0aG9kXG4gICAgICAgIH0sIGpvYmlkKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhbmRsZXJSZXN1bHQoe1xuICAgICAgICAgIHJlczoge1xuICAgICAgICAgICAgZGF0YSwgaXNBcnJheVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIGpvYmlkLFxuICAgICAgICAgIGlzQXJyYXlcbiAgICAgICAgfSwge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIGlzQXJyYXksXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgbGV0IHNjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBzYy5zcmMgPSBgJHt1cmx9P2NhbGxiYWNrPSR7Y2FsbGJhY2tNZXRob2ROYW1lfWA7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2MpO1xuICAgIH0pXG5cbiAgICBjb25zdCByZXNwOiBNb2RlbHMuUHJvbWlzZU9ic2VydmFibGVNaXg8YW55PiA9IGZpcnN0VmFsdWVGcm9tKHJlcGxheS5zdWJqZWN0W2N1c3RvbU9ic10pIGFzIGFueTtcbiAgICByZXNwLm9ic2VydmFibGUgPSByZXBsYXkuc3ViamVjdFtjdXN0b21PYnNdO1xuICAgIGNvbnNvbGUubG9nKCdhc3NpZ2luZyBjdXN0b20gb2JzZXJ2YWJsZScpXG4gICAgcmVzcC5jYWNoZSA9IFJlcXVlc3RDYWNoZS5maW5kQnkoe1xuICAgICAgYm9keSxcbiAgICAgIGlzQXJyYXksXG4gICAgICBtZXRob2QsXG4gICAgICB1cmxcbiAgICB9KVxuICAgIHJldHVybiByZXNwO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuICBwcml2YXRlIHJlcGxheVN1YmplY3RzID0ge307XG4gIHB1YmxpYyByZXBsYXkobWV0aG9kOiBNb2RlbHMuSHR0cE1ldGhvZCwgbWV0YTogTW9kZWxzLk1ldGFSZXF1ZXN0KSB7XG4gICAgY29uc3QgcmVwbGF5OiBNb2RlbHMuUmVwbGF5RGF0YSA9IHRoaXMuZ2V0UmVwbGF5KG1ldGhvZCwgbWV0YSwgdHJ1ZSk7XG4gICAgaWYgKCFyZXBsYXkgfHwgIXJlcGxheS5kYXRhKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbm5vIHJlcGxheSBmaXJzdCAke21ldGhvZH0gcmVxdWVzdCBmcm9tICR7bWV0YS5lbmRwb2ludH0vJHttZXRhLnBhdGh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfTtcbiAgICBpZiAocmVwbGF5ICYmIHJlcGxheS5zdWJqZWN0ICYmIEFycmF5LmlzQXJyYXkocmVwbGF5LnN1YmplY3Qub2JzZXJ2ZXJzKSAmJlxuICAgICAgcmVwbGF5LnN1YmplY3Qub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS53YXJuKGBObyBvYnNlcnZhdG9ycyBmb3IgJHttZXRob2R9IHJlcXVlc3QgZnJvbSAke21ldGEuZW5kcG9pbnR9LyR7bWV0YS5wYXRofWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSByZXBsYXkuZGF0YS51cmw7XG4gICAgY29uc3QgaGVhZGVycyA9IHJlcGxheS5kYXRhLmhlYWRlcnM7XG4gICAgY29uc3QgYm9keSA9IHJlcGxheS5kYXRhLmJvZHk7XG4gICAgY29uc3QgaXNBcnJheSA9IHJlcGxheS5kYXRhLmlzQXJyYXk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlcSh1cmwsIG1ldGhvZCwgaGVhZGVycywgYm9keSwgcmVwbGF5LmlkLCBpc0FycmF5KSlcbiAgfVxuXG59XG4iXX0=
@@ -1,4 +1,4 @@
1
- import { Subject, firstValueFrom, Observable } from 'rxjs';
1
+ import { Subject, Observable, firstValueFrom } from 'rxjs';
2
2
  import { Log, Level } from 'ng2-logger/browser';
3
3
  import { diffChars } from 'diff';
4
4
  import { Helpers as Helpers$1, _, CoreHelpers } from 'tnp-core/browser';
@@ -989,6 +989,13 @@ var Models;
989
989
  get booleanValue() {
990
990
  return ['ok', 'true'].includes(this.body.trim());
991
991
  }
992
+ get rawJson() {
993
+ let res = this.toJSON(this.body, this.isArray);
994
+ if (this.circular && Array.isArray(this.circular)) {
995
+ res = JSON10.parse(JSON.stringify(res), this.circular);
996
+ }
997
+ return res;
998
+ }
992
999
  get json() {
993
1000
  if (this.entity && typeof this.entity === 'object') {
994
1001
  const json = this.toJSON(this.body, this.isArray);
@@ -1084,6 +1091,9 @@ var Models;
1084
1091
 
1085
1092
  const log$1 = Log.create('[ng2-rest] rest-request', Level.__NOTHING);
1086
1093
  const jobIDkey = 'jobID';
1094
+ const customObs = 'customObs';
1095
+ const cancelFn = 'cancelFn';
1096
+ const isCanceled = 'isCanceled';
1087
1097
  //#region mock request
1088
1098
  //#endregion
1089
1099
  class RestRequest {
@@ -1099,11 +1109,6 @@ class RestRequest {
1099
1109
  }
1100
1110
  // log.d(`HANDLE RESULT (jobid:${options.jobid}) ${sourceRequest.url}`);
1101
1111
  const { res, jobid, isArray, method } = options;
1102
- // if (this.endedJobs[jobid]) {
1103
- // debugger
1104
- // }
1105
- // this.endedJobs[jobid] = true;
1106
- // log.i(`handle jobid ${jobid}`)
1107
1112
  if (typeof res !== 'object') {
1108
1113
  throw new Error('No resposnse for request. ');
1109
1114
  }
@@ -1117,15 +1122,21 @@ class RestRequest {
1117
1122
  }
1118
1123
  const entity = this.meta[jobid].entity;
1119
1124
  const circular = this.meta[jobid].circular;
1120
- this.subjectInuUse[jobid].next(new Models.HttpResponse(sourceRequest, res.data, res.headers, res.code, entity, circular, jobid, isArray));
1125
+ const success = Resource['_listenSuccess'];
1126
+ const reqResp = new Models.HttpResponse(sourceRequest, res.data, res.headers, res.code, entity, circular, jobid, isArray);
1127
+ success.next(reqResp);
1128
+ this.subjectInuUse[jobid].next(reqResp);
1121
1129
  this.meta[jobid] = void 0;
1122
- return;
1130
+ this.subjectInuUse[jobid].complete();
1123
1131
  }
1124
1132
  checkCache(sourceRequest, jobid) {
1125
1133
  const existedInCache = RequestCache.findBy(sourceRequest);
1126
1134
  if (existedInCache) {
1127
1135
  log$1.i('cache exists', existedInCache);
1136
+ const success = Resource['_listenSuccess'];
1137
+ success.next(existedInCache.response);
1128
1138
  this.subjectInuUse[jobid].next(existedInCache);
1139
+ this.subjectInuUse[jobid].complete();
1129
1140
  return true;
1130
1141
  }
1131
1142
  // log.i(`cache not exists for jobid ${jobid}`)
@@ -1141,6 +1152,9 @@ class RestRequest {
1141
1152
  }, jobid)) {
1142
1153
  return;
1143
1154
  }
1155
+ const CancelToken = axios.CancelToken;
1156
+ const source = CancelToken.source();
1157
+ this.subjectInuUse[jobid][cancelFn] = source.cancel;
1144
1158
  var response;
1145
1159
  if (mockHttp) {
1146
1160
  if (typeof mockHttp === 'object') {
@@ -1171,10 +1185,14 @@ class RestRequest {
1171
1185
  method,
1172
1186
  data: body,
1173
1187
  responseType: 'text',
1174
- headers: headers.toJSON()
1188
+ headers: headers.toJSON(),
1189
+ cancelToken: source.token,
1175
1190
  });
1176
1191
  // log.d(`after response of jobid: ${jobid}`);
1177
1192
  }
1193
+ if (this.subjectInuUse[jobid][isCanceled]) {
1194
+ return;
1195
+ }
1178
1196
  this.handlerResult({
1179
1197
  res: {
1180
1198
  code: response.status,
@@ -1194,13 +1212,17 @@ class RestRequest {
1194
1212
  });
1195
1213
  }
1196
1214
  catch (catchedError) {
1215
+ if (this.subjectInuUse[jobid][isCanceled]) {
1216
+ return;
1217
+ }
1197
1218
  // console.log('ERROR RESPONESE catchedError typeof ', typeof catchedError)
1198
1219
  // console.log('ERROR RESPONESE catchedError', catchedError)
1199
1220
  if (typeof catchedError === 'object' && catchedError.response && catchedError.response.data) {
1200
1221
  const err = catchedError.response.data;
1201
1222
  const msg = catchedError.response.data.message || '';
1202
1223
  let stack = (err.stack || '').split('\n');
1203
- Resource['_listenErrors'].next({
1224
+ const errObs = Resource['_listenErrors'];
1225
+ errObs.next({
1204
1226
  msg,
1205
1227
  stack,
1206
1228
  data: catchedError.response.data
@@ -1258,12 +1280,39 @@ class RestRequest {
1258
1280
  }
1259
1281
  replay = this.replaySubjects[meta.endpoint][meta.path][method][objectIDToCreateOrLast];
1260
1282
  if (!_.isNumber(replay.id)) {
1283
+ if (RestRequest.jobId === Number.MAX_SAFE_INTEGER) {
1284
+ RestRequest.jobId = 0;
1285
+ }
1261
1286
  const jobid = RestRequest.jobId++;
1262
1287
  replay.id = jobid;
1263
1288
  const subject = replay.subject;
1264
1289
  subject[jobIDkey] = jobid; // modify internal rxjs subject obj
1265
1290
  this.meta[jobid] = meta;
1266
1291
  this.subjectInuUse[jobid] = subject;
1292
+ this.subjectInuUse[jobid][customObs] = new Observable((observer) => {
1293
+ // observer.remove(() => {
1294
+ // });
1295
+ observer.add(() => {
1296
+ // console.log(`cancel observable job${jobid}`)
1297
+ if (!this.subjectInuUse[jobid][isCanceled]) {
1298
+ this.subjectInuUse[jobid][isCanceled] = true;
1299
+ if (typeof this.subjectInuUse[jobid][cancelFn] === 'function') {
1300
+ this.subjectInuUse[jobid][cancelFn]('[ng2-rest] on purpose canceled http request');
1301
+ }
1302
+ }
1303
+ else {
1304
+ // console.log(`somehow second time cancel ${jobid}`)
1305
+ }
1306
+ });
1307
+ const sub = subject.subscribe({
1308
+ next: a => observer.next(a),
1309
+ error: a => observer.error(a),
1310
+ complete: () => {
1311
+ sub.unsubscribe();
1312
+ observer.complete();
1313
+ },
1314
+ });
1315
+ });
1267
1316
  //#region DISPOSE @UNCOMMENT AFTER TESTS
1268
1317
  // if (objectIDToCreateOrLast > 2) {
1269
1318
  // const oldReq: Models.ReplayData = this.replaySubjects[meta.endpoint][meta.path][method][(objectIDToCreateOrLast - 2)];
@@ -1286,8 +1335,8 @@ class RestRequest {
1286
1335
  // log.d(`for ${purl} jobid ${pid}`);
1287
1336
  setTimeout(() => pthis.req(purl, pmethod, pheaders, pbody, pid, pisArray, pmockHttp));
1288
1337
  })(this, url, method, headers, body, replay.id, isArray, mockHttp);
1289
- const resp = firstValueFrom(replay.subject.asObservable());
1290
- resp.observable = replay.subject.asObservable();
1338
+ const resp = firstValueFrom(replay.subject[customObs]);
1339
+ resp.observable = replay.subject[customObs];
1291
1340
  resp.cache = RequestCache.findBy({
1292
1341
  body,
1293
1342
  isArray,
@@ -1351,9 +1400,9 @@ class RestRequest {
1351
1400
  document.body.appendChild(sc);
1352
1401
  document.body.removeChild(sc);
1353
1402
  });
1354
- // return replay.subject.asObservable();
1355
- const resp = firstValueFrom(replay.subject.asObservable());
1356
- resp.observable = replay.subject.asObservable();
1403
+ const resp = firstValueFrom(replay.subject[customObs]);
1404
+ resp.observable = replay.subject[customObs];
1405
+ console.log('assiging custom observable');
1357
1406
  resp.cache = RequestCache.findBy({
1358
1407
  body,
1359
1408
  isArray,
@@ -1399,6 +1448,9 @@ class Resource {
1399
1448
  static get listenErrors() {
1400
1449
  return this._listenErrors.asObservable();
1401
1450
  }
1451
+ static get listenSuccessOperations() {
1452
+ return this._listenSuccess.asObservable();
1453
+ }
1402
1454
  //#region private mthods and fields
1403
1455
  getZone() {
1404
1456
  const isNode = (typeof window === 'undefined');
@@ -1511,7 +1563,7 @@ Instead use nested approach: /book/:bookid/author/:authorid
1511
1563
  url = url.slice(0, url.length - 1);
1512
1564
  log.i('url after', url);
1513
1565
  if (Resource.endpoints[e] !== void 0) {
1514
- !global.hideLog && console.warn('Cannot use map function at the same API endpoint again ('
1566
+ Helpers$1.log('Cannot use map function at the same API endpoint again ('
1515
1567
  + Resource.endpoints[e].url + ')');
1516
1568
  return false;
1517
1569
  }
@@ -1616,6 +1668,7 @@ Resource.DEFAULT_HEADERS = RestHeaders.from({
1616
1668
  'Accept': 'application/json'
1617
1669
  });
1618
1670
  Resource._listenErrors = new Subject();
1671
+ Resource._listenSuccess = new Subject();
1619
1672
  Resource.enableWarnings = true;
1620
1673
  Resource.instance = new Resource();
1621
1674
  Resource.endpoints = {};