speechrecorderng 2.21.9 → 2.22.0

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 (41) hide show
  1. package/esm2020/lib/media/utils.mjs +14 -0
  2. package/esm2020/lib/net/uploader.mjs +31 -5
  3. package/esm2020/lib/speechrecorder/recording.mjs +22 -6
  4. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +89 -16
  5. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +1144 -0
  6. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +9 -6
  7. package/esm2020/lib/speechrecorder/session/item.mjs +1 -1
  8. package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +75 -0
  9. package/esm2020/lib/speechrecorder/session/recording_list.mjs +109 -0
  10. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +57 -14
  11. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +3 -3
  12. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +48 -18
  13. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file.mjs +1 -1
  14. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +61 -1
  15. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +6 -6
  16. package/esm2020/lib/speechrecorderng.component.mjs +1 -1
  17. package/esm2020/lib/speechrecorderng.module.mjs +8 -4
  18. package/esm2020/lib/spr.module.version.mjs +2 -2
  19. package/esm2020/public-api.mjs +3 -2
  20. package/fesm2015/speechrecorderng.mjs +1622 -79
  21. package/fesm2015/speechrecorderng.mjs.map +1 -1
  22. package/fesm2020/speechrecorderng.mjs +1618 -79
  23. package/fesm2020/speechrecorderng.mjs.map +1 -1
  24. package/lib/media/utils.d.ts +3 -0
  25. package/lib/net/uploader.d.ts +4 -2
  26. package/lib/speechrecorder/recording.d.ts +14 -3
  27. package/lib/speechrecorder/recordings/recordings.service.d.ts +12 -5
  28. package/lib/speechrecorder/session/audiorecorder.d.ts +150 -0
  29. package/lib/speechrecorder/session/controlpanel.d.ts +2 -1
  30. package/lib/speechrecorder/session/item.d.ts +2 -2
  31. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +26 -0
  32. package/lib/speechrecorder/session/recording_list.d.ts +19 -0
  33. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +6 -2
  34. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +5 -4
  35. package/lib/speechrecorder/session/recordingfile/recording-file.d.ts +2 -2
  36. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +5 -3
  37. package/lib/speechrecorder/session/sessionmanager.d.ts +5 -5
  38. package/lib/speechrecorderng.module.d.ts +31 -28
  39. package/lib/spr.module.version.d.ts +1 -1
  40. package/package.json +1 -1
  41. package/public-api.d.ts +2 -1
@@ -0,0 +1,14 @@
1
+ export class MediaUtils {
2
+ static toMediaTime(timeInSeconds) {
3
+ let rest = timeInSeconds;
4
+ let hours = Math.floor(timeInSeconds / 3600);
5
+ rest -= hours * 3600;
6
+ let minutes = Math.floor(rest / 60);
7
+ rest -= minutes * 60;
8
+ let seconds = Math.floor(rest);
9
+ rest -= seconds;
10
+ let millis = Math.round(rest * 1000);
11
+ return hours.toString().padStart(2, '0') + ':' + minutes.toString().padStart(2, '0') + ':' + seconds.toString().padStart(2, '0') + '.' + millis.toString().padStart(3, '0');
12
+ }
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvbWVkaWEvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0ksTUFBTSxPQUFPLFVBQVU7SUFFbkIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFvQjtRQUNuQyxJQUFJLElBQUksR0FBQyxhQUFhLENBQUM7UUFDdkIsSUFBSSxLQUFLLEdBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxJQUFFLEtBQUssR0FBQyxJQUFJLENBQUM7UUFDakIsSUFBSSxPQUFPLEdBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEMsSUFBSSxJQUFFLE9BQU8sR0FBQyxFQUFFLENBQUM7UUFDakIsSUFBSSxPQUFPLEdBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixJQUFJLElBQUUsT0FBTyxDQUFDO1FBQ2QsSUFBSSxNQUFNLEdBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBQyxHQUFHLENBQUMsR0FBQyxHQUFHLEdBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUMsR0FBRyxDQUFDLEdBQUMsR0FBRyxHQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFDLEdBQUcsQ0FBQyxHQUFDLEdBQUcsR0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUNoSyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuICAgIGV4cG9ydCBjbGFzcyBNZWRpYVV0aWxzIHtcclxuXHJcbiAgICAgICAgc3RhdGljIHRvTWVkaWFUaW1lKHRpbWVJblNlY29uZHM6bnVtYmVyKTpzdHJpbmd7XHJcbiAgICAgICAgICAgIGxldCByZXN0PXRpbWVJblNlY29uZHM7XHJcbiAgICAgICAgICAgIGxldCBob3Vycz1NYXRoLmZsb29yKHRpbWVJblNlY29uZHMvMzYwMCk7XHJcbiAgICAgICAgICAgIHJlc3QtPWhvdXJzKjM2MDA7XHJcbiAgICAgICAgICAgIGxldCBtaW51dGVzPU1hdGguZmxvb3IocmVzdC82MCk7XHJcbiAgICAgICAgICAgIHJlc3QtPW1pbnV0ZXMqNjA7XHJcbiAgICAgICAgICAgIGxldCBzZWNvbmRzPU1hdGguZmxvb3IocmVzdCk7XHJcbiAgICAgICAgICAgIHJlc3QtPXNlY29uZHM7XHJcbiAgICAgICAgICAgIGxldCBtaWxsaXM9TWF0aC5yb3VuZChyZXN0KjEwMDApO1xyXG4gICAgICAgICAgICByZXR1cm4gaG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCcwJykrJzonK21pbnV0ZXMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCcwJykrJzonK3NlY29uZHMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCcwJykrJy4nK21pbGxpcy50b1N0cmluZygpLnBhZFN0YXJ0KDMsJzAnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiJdfQ==
@@ -49,7 +49,14 @@ export class UploaderStatusChangeEvent {
49
49
  export class Upload {
50
50
  constructor(blob, url) {
51
51
  this.toString = () => {
52
- return `Upload: Status: ${this.status}, URL: ${this._url}, Size: ${this._data.size}`;
52
+ let s = `Upload: Status: ${this.status}, URL: ${this._url}`;
53
+ if (this._data instanceof Blob) {
54
+ s = s + `, Size: ${this._data.size}`;
55
+ }
56
+ else if (this._data instanceof FormData) {
57
+ // TODO (iterate through parts ??)
58
+ }
59
+ return s;
53
60
  };
54
61
  this._data = blob;
55
62
  this._url = url;
@@ -77,8 +84,27 @@ export class Uploader {
77
84
  this._sizeDone = 0;
78
85
  this.retryTimerRunning = false;
79
86
  this.retryTimerId = null;
87
+ this.te = new TextEncoder();
80
88
  this.que = new Array();
81
89
  }
90
+ dataSize(dt) {
91
+ let si = 0;
92
+ if (dt instanceof Blob) {
93
+ si = dt.size;
94
+ }
95
+ else if (dt instanceof FormData) {
96
+ dt.forEach((v, k) => {
97
+ if (v instanceof File) {
98
+ si += v.size;
99
+ }
100
+ else if (typeof v === 'string') {
101
+ // encode to UT-f8 to get upload size
102
+ si += this.te.encode().length;
103
+ }
104
+ });
105
+ }
106
+ return si;
107
+ }
82
108
  uploadDone(ul) {
83
109
  ul.status = UploadStatus.DONE;
84
110
  // remove upload from queue
@@ -86,7 +112,7 @@ export class Uploader {
86
112
  if (this.que[i] === ul) {
87
113
  // found, remove
88
114
  this.que.splice(i, 1);
89
- let ulSize = ul.data.size;
115
+ let ulSize = this.dataSize(ul.data);
90
116
  this._sizeDone += ulSize;
91
117
  break;
92
118
  }
@@ -104,7 +130,7 @@ export class Uploader {
104
130
  else {
105
131
  this.status = UploaderStatus.UPLOADING;
106
132
  }
107
- let dSize = ul.data.size;
133
+ let dSize = this.dataSize(ul.data);
108
134
  let timeoutForDataSize = dSize * this.POST_TIMEOUT_PER_KB / 1000;
109
135
  let timeoVal = Math.round(this.POST_MIN_TIMEOUT + timeoutForDataSize);
110
136
  // pipe(timeout()) is not the same as xhr.timeout
@@ -210,11 +236,11 @@ export class Uploader {
210
236
  }
211
237
  queueUpload(ul) {
212
238
  if (ul) {
213
- let ulSize = ul.data.size;
239
+ let ulSize = this.dataSize(ul.data);
214
240
  this.que.push(ul);
215
241
  this._sizeQueued += ulSize;
216
242
  this.process();
217
243
  }
218
244
  }
219
245
  }
220
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvbmV0L3VwbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVJLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUV4QyxxQkFBcUI7QUFDckIsTUFBTSxDQUFOLElBQVksWUFBc0U7QUFBbEYsV0FBWSxZQUFZO0lBQUUsK0NBQVEsQ0FBQTtJQUFFLHlEQUFhLENBQUE7SUFBRyxpREFBUyxDQUFBO0lBQUUsK0NBQVEsQ0FBQTtJQUFFLDhDQUFRLENBQUE7QUFBQSxDQUFDLEVBQXRFLFlBQVksS0FBWixZQUFZLFFBQTBEO0FBRWxGLHdCQUF3QjtBQUN4Qiw0RkFBNEY7QUFDNUYsTUFBTSxDQUFOLElBQVksY0FBK0U7QUFBM0YsV0FBWSxjQUFjO0lBQUcsbURBQVEsQ0FBQTtJQUFFLDZEQUFhLENBQUE7SUFBRSxxRUFBaUIsQ0FBQTtJQUFDLG1EQUFRLENBQUE7SUFBRSxrREFBUSxDQUFBO0FBQUEsQ0FBQyxFQUEvRSxjQUFjLEtBQWQsY0FBYyxRQUFpRTtBQUUzRixNQUFNLE9BQU8seUJBQXlCO0lBTWxDLFlBQVksVUFBa0IsRUFBRSxRQUFnQixFQUFFLE1BQXNCO1FBQ3BFLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENB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ZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbiAgICBpbXBvcnQgeyB0aW1lb3V0IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXHJcblxyXG4gICAgLy8gc3RhdGUgb2YgYW4gdXBsb2FkXHJcbiAgICBleHBvcnQgZW51bSBVcGxvYWRTdGF0dXMge0lETEUgPSAxLCBVUExPQURJTkcgPSAyLCAgQUJPUlQgPSAzLCBET05FID0gMCwgRVJSID0gLTF9XHJcblxyXG4gICAgLy8gc3RhdGUgb2YgdGhlIHVwbG9hZGVyXHJcbiAgICAvLyBUUllfVVBMT0FESU5HIGlzIHVwbG9hZGluZyBzdGF0ZSBhZnRlciBhbiBlcnJvciAoZm9yIGV4YW1wbGUgaWYgZGlzY29ubmVjdGVkIGZyb20gc2VydmVyKVxyXG4gICAgZXhwb3J0IGVudW0gVXBsb2FkZXJTdGF0dXMgeyBET05FID0gMCwgVVBMT0FESU5HID0gMSwgVFJZX1VQTE9BRElORyA9IDIsTkVYVCA9IDMsIEVSUiA9IC0xfVxyXG5cclxuICAgIGV4cG9ydCBjbGFzcyBVcGxvYWRlclN0YXR1c0NoYW5nZUV2ZW50IHtcclxuICAgICAgICBwcml2YXRlIF9zaXplUXVldWVkOm51bWJlcjtcclxuICAgICAgICBwcml2YXRlIF9zaXplRG9uZTpudW1iZXI7XHJcbiAgICAgICAgcHJpdmF0ZSBfc3RhdHVzOiBVcGxvYWRlclN0YXR1cztcclxuXHJcblxyXG4gICAgICAgIGNvbnN0cnVjdG9yKHNpemVRdWV1ZWQ6IG51bWJlciwgc2l6ZURvbmU6IG51bWJlciwgc3RhdHVzOiBVcGxvYWRlclN0YXR1cykge1xyXG4gICAgICAgICAgICB0aGlzLl9zaXplUXVldWVkID0gc2l6ZVF1ZXVlZDtcclxuICAgICAgICAgICAgdGhpcy5fc2l6ZURvbmUgPSBzaXplRG9uZTtcclxuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0IHNpemVRdWV1ZWQoKTpudW1iZXIge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZVF1ZXVlZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldCBzaXplRG9uZSgpOm51bWJlciB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaXplRG9uZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldCBzdGF0dXMoKTogVXBsb2FkZXJTdGF0dXMge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdXBsb2FkRG9uZSgpOiBib29sZWFuIHtcclxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9zaXplRG9uZSA+PSB0aGlzLl9zaXplUXVldWVkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHBlcmNlbnREb25lKCk6IG51bWJlciB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zaXplUXVldWVkID09IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIG5vIGRhdGEgcXVldWVkLCB3ZSBhcmUgXCJkb25lXCJcclxuICAgICAgICAgICAgICAgIHJldHVybiAxMDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IHBlcmNlbnQgPSBNYXRoLmZsb29yKHRoaXMuX3NpemVEb25lICogMTAwIC8gdGhpcy5fc2l6ZVF1ZXVlZCk7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJVcGxvYWQgc3RhdHVzOiBxdWV1ZWQ6IFwiK3RoaXMuX3NpemVRdWV1ZWQrXCIsIGRvbmU6IFwiK3RoaXMuX3NpemVEb25lK1wiLCBcIitwZXJjZW50K1wiJVwiKVxyXG4gICAgICAgICAgICByZXR1cm4gcGVyY2VudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBjbGFzcyBVcGxvYWQge1xyXG5cclxuICAgICAgICBwcml2YXRlIF9kYXRhOkJsb2I7XHJcbiAgICAgICAgcHJpdmF0ZSBfdXJsOnN0cmluZztcclxuICAgICAgICBzdGF0dXM6IFVwbG9hZFN0YXR1cztcclxuXHJcbiAgICAgICAgY29uc3RydWN0b3IoYmxvYjpCbG9iLCB1cmw6c3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RhdGEgPSBibG9iO1xyXG4gICAgICAgICAgICB0aGlzLl91cmwgPSB1cmw7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gVXBsb2FkU3RhdHVzLklETEU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXQgdXJsKCk6c3RyaW5nIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VybDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldCBkYXRhKCk6QmxvYiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIHB1YmxpYyB0b1N0cmluZyA9ICgpIDogc3RyaW5nID0+IHtcclxuXHJcbiAgICAgICAgcmV0dXJuIGBVcGxvYWQ6IFN0YXR1czogJHt0aGlzLnN0YXR1c30sIFVSTDogJHt0aGlzLl91cmx9LCBTaXplOiAke3RoaXMuX2RhdGEuc2l6ZX1gO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIFVwbG9hZGVyIHtcclxuICAgICAgICBQT1NUX01JTl9USU1FT1VUPTEyMDAwMDsgLy8gMm1pbiBwbHVzIC4uLlxyXG4gICAgICAgIFBPU1RfVElNRU9VVF9QRVJfS0I9MTAwMDsgIC8vIC4uLiAxcyBwZXIga0JcclxuXHJcbiAgICAgICAgUkVUUllfREVMQVk6IG51bWJlciA9IDMwMDAwOyAvLyByZXRyeSBldmVyeSAzMHNcclxuICAgICAgICBERUJVR19ERUxBWTogbnVtYmVyID0gMDtcclxuICAgICAgICAvL0RFQlVHX0RFTEFZOm51bWJlcj0wO1xyXG4gICAgICAgIHByaXZhdGUgc3RhdHVzOiBVcGxvYWRlclN0YXR1cyA9IFVwbG9hZGVyU3RhdHVzLkRPTkU7XHJcbiAgICAgICAgcHJpdmF0ZSBxdWU6QXJyYXk8VXBsb2FkPjtcclxuICAgICAgICBsaXN0ZW5lcjogKCh1ZTogVXBsb2FkZXJTdGF0dXNDaGFuZ2VFdmVudCkgPT4gdm9pZCkgfCBudWxsPW51bGw7XHJcbiAgICAgICAgcHJpdmF0ZSBfc2l6ZVF1ZXVlZDogbnVtYmVyID0gMDtcclxuICAgICAgICBwcml2YXRlIF9zaXplRG9uZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgICAgcHJpdmF0ZSByZXRyeVRpbWVyUnVubmluZz1mYWxzZTtcclxuICAgICAgICBwcml2YXRlIHJldHJ5VGltZXJJZDogbnVtYmVyfG51bGw9bnVsbDtcclxuXHJcbiAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LHByaXZhdGUgd2l0aENyZWRlbnRpYWxzOmJvb2xlYW49ZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5xdWUgPSBuZXcgQXJyYXk8VXBsb2FkPigpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIHByaXZhdGUgIHVwbG9hZERvbmUodWw6VXBsb2FkKSB7XHJcblxyXG4gICAgICAgICAgICB1bC5zdGF0dXMgPSBVcGxvYWRTdGF0dXMuRE9ORTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlbW92ZSB1cGxvYWQgZnJvbSBxdWV1ZVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucXVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWVbaV0gPT09IHVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQsIHJlbW92ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdWxTaXplID0gdWwuZGF0YS5zaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NpemVEb25lICs9IHVsU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBzZXQgdG8gZG9uZSBmb3Igbm93Li4uXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gVXBsb2FkZXJTdGF0dXMuTkVYVDtcclxuICAgICAgICAgICAgLy8gY29udGludWVcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcml2YXRlIHN0YXJ0VXBsb2FkKHVsOlVwbG9hZCkge1xyXG5cclxuICAgICAgICAgICAgdWwuc3RhdHVzID0gVXBsb2FkU3RhdHVzLlVQTE9BRElORztcclxuICAgICAgICAgICAgaWYgKFVwbG9hZGVyU3RhdHVzLkVSUiA9PT0gdGhpcy5zdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gVXBsb2FkZXJTdGF0dXMuVFJZX1VQTE9BRElORztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gVXBsb2FkZXJTdGF0dXMuVVBMT0FESU5HO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgZFNpemU9dWwuZGF0YS5zaXplXHJcbiAgICAgICAgICAgIGxldCB0aW1lb3V0Rm9yRGF0YVNpemU9ZFNpemUqdGhpcy5QT1NUX1RJTUVPVVRfUEVSX0tCLzEwMDA7XHJcbiAgICAgICAgICAgIGxldCB0aW1lb1ZhbDpudW1iZXI9TWF0aC5yb3VuZCh0aGlzLlBPU1RfTUlOX1RJTUVPVVQrdGltZW91dEZvckRhdGFTaXplKVxyXG4gICAgICAgICAgICAvLyBwaXBlKHRpbWVvdXQoKSkgaXMgbm90IHRoZSBzYW1lIGFzIHhoci50aW1lb3V0XHJcblxyXG4gICAgICAgICAgbGV0IHVwbG9hZGVkVXBsb2FkOlVwbG9hZHxudWxsPW51bGw7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlBvc3QgdXBsb2FkOiBcIit1bClcclxuICAgICAgICAgIHRoaXMuaHR0cC5wb3N0KHVsLnVybCx1bC5kYXRhLHt3aXRoQ3JlZGVudGlhbHM6dGhpcy53aXRoQ3JlZGVudGlhbHN9KS5waXBlKHRpbWVvdXQodGltZW9WYWwpKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgIGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgIHVwbG9hZGVkVXBsb2FkID0gdWw7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdOZXh0IG1ldGhvZCBjYWxsZWQgZm9yIHVwbG9hZDogJyt1cGxvYWRlZFVwbG9hZClcclxuICAgICAgICAgICAgfSwoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlcnIuZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgLy8gQSBjbGllbnQtc2lkZSBvciBuZXR3b3JrIGVycm9yIG9jY3VycmVkLiBIYW5kbGUgaXQgYWNjb3JkaW5nbHkuXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVcGxvYWQgZXJyb3Igb2NjdXJyZWQ6JywgZXJyLmVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUaGUgYmFja2VuZCByZXR1cm5lZCBhbiB1bnN1Y2Nlc3NmdWwgcmVzcG9uc2UgY29kZS5cclxuICAgICAgICAgICAgICAgIC8vIFRoZSByZXNwb25zZSBib2R5IG1heSBjb250YWluIGNsdWVzIGFzIHRvIHdoYXQgd2VudCB3cm9uZyxcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFVwbG9hZCBlcnJvcjogU2VydmVyIHJldHVybmVkIGNvZGUgJHtlcnIuc3RhdHVzfWApO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcih1bClcclxuICAgICAgICAgICAgfSwoKT0+e1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZygnVXBsb2FkIGNvbXBsZXRlIG1ldGhvZCBjYWxsZWQnKVxyXG4gICAgICAgICAgICAgIGlmKHVwbG9hZGVkVXBsb2FkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ERUJVR19ERUxBWT4wKSB7XHJcbiAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZERvbmUodWwpO1xyXG4gICAgICAgICAgICAgICAgICB9LCB0aGlzLkRFQlVHX0RFTEFZKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRG9uZSh1cGxvYWRlZFVwbG9hZClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VwbG9hZCBwb3N0IGNvbXBsZXRlLCBidXQgdXBsb2FkIG5vdCBzZXQgaW4gbmV4dCBtZXRob2QhJylcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJpdmF0ZSBwcm9jZXNzRXJyb3IodWw6VXBsb2FkKSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlByb2Nlc3MgdXBsb2FkIGVycm9yLi4uXCIpXHJcbiAgICAgICAgICAgIHVsLnN0YXR1cz1VcGxvYWRTdGF0dXMuRVJSXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gVXBsb2FkZXJTdGF0dXMuRVJSO1xyXG5cclxuICAgICAgICAgICAgbGV0IHVlID0gbmV3IFVwbG9hZGVyU3RhdHVzQ2hhbmdlRXZlbnQodGhpcy5fc2l6ZVF1ZXVlZCwgdGhpcy5fc2l6ZURvbmUsIHRoaXMuc3RhdHVzKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIodWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgcmV0cnkgdGltZXJcclxuICAgICAgICAgICAgdGhpcy5yZXRyeVRpbWVySWQ9d2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXRyeVRpbWVyUnVubmluZz1mYWxzZTtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlVwbG9hZCByZXRyeSB0aW1lciBleHByaXJlZC4gQ29udGludWUgcHJvY2Vzc2luZy4uLlwiKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzKCk7XHJcbiAgICAgICAgICAgIH0sIHRoaXMuUkVUUllfREVMQVkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZXRyeVRpbWVyUnVubmluZz10cnVlO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTdGFydGVkIHVwbG9hZCByZXRyeSB0aW1lciBcIit0aGlzLlJFVFJZX0RFTEFZK1wibXMgLi4uXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgcHJpdmF0ZSBwcm9jZXNzKCkge1xyXG4gICAgICAgIC8vIGNsZWFyIHJldHJ5IHRpbWVyIGlmIHNldFxyXG4gICAgICAgIGlmKHRoaXMucmV0cnlUaW1lclJ1bm5pbmcpe1xyXG4gICAgICAgICAgICBpZih0aGlzLnJldHJ5VGltZXJJZCkge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJldHJ5VGltZXJJZClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5yZXRyeVRpbWVyUnVubmluZz1mYWxzZVxyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQ2xlYXJlZCByZXRyeSB0aW1lci5cIilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwdWw6IFVwbG9hZCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJVcGxvYWRlciBzdGF0dXM6IFwiK3RoaXMuc3RhdHVzKVxyXG5cclxuICAgICAgICBsZXQgcyA9IHRoaXMucXVlLmxlbmd0aDtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcocytcIiB1cGxvYWRzIGFyZSBpbiB0aGUgcXVldWUuXCIpXHJcblxyXG4gICAgICAgIGlmIChzPjAgJiYgVXBsb2FkZXJTdGF0dXMuVVBMT0FESU5HICE9IHRoaXMuc3RhdHVzICYmIFVwbG9hZGVyU3RhdHVzLlRSWV9VUExPQURJTkcgIT0gdGhpcy5zdGF0dXMpIHtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHM7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdWwgPSB0aGlzLnF1ZVtpXTtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlVwbG9hZCBcIit1bCtcIiBzdGF0dXM6XCIrdWwuc3RhdHVzKVxyXG4gICAgICAgICAgICBpZiAodWwuc3RhdHVzID09PSBVcGxvYWRTdGF0dXMuSURMRSkge1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJVcGxvYWQgXCIrdWwrXCIgc3RhcnRVcGxvYWRcIilcclxuICAgICAgICAgICAgICB0aGlzLnN0YXJ0VXBsb2FkKHVsKTtcclxuICAgICAgICAgICAgICBwdWwgPSB1bDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKCFwdWwpIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkNoZWNrIEVSUiB1cGxvYWRzLi4uXCIpXHJcbiAgICAgICAgICAgIC8vIG5vdyBmYWlsZWQgdXBsb2Fkc1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJObyByZWd1bGFyIHVwbG9hZCBmb3VuZC4gTG9va2luZyBmb3IgZXJyb3Igc3RhdGUgdXBsb2Fkcy5cIilcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzOyBpKyspIHtcclxuICAgICAgICAgICAgICBsZXQgdWwgPSB0aGlzLnF1ZVtpXTtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiVXBsb2FkIFwiK3VsK1wiIHN0YXR1czpcIit1bC5zdGF0dXMpXHJcbiAgICAgICAgICAgICAgaWYgKHVsLnN0YXR1cyA9PT0gVXBsb2FkU3RhdHVzLkVSUikge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlVwbG9hZCAoRVJSKSBcIit1bCtcIiBzdGFydFVwbG9hZFwiKVxyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU3RhcnQgZXJyb3Igc3RhdGUgdXBsb2FkIFwiK3VsKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFVwbG9hZCh1bCk7XHJcbiAgICAgICAgICAgICAgICBwdWwgPSB1bDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihzPT0wKXtcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlVwbG9hZCBkb25lLlwiKVxyXG4gICAgICAgICAgdGhpcy5zdGF0dXM9VXBsb2FkZXJTdGF0dXMuRE9ORVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdWUgPSBuZXcgVXBsb2FkZXJTdGF0dXNDaGFuZ2VFdmVudCh0aGlzLl9zaXplUXVldWVkLCB0aGlzLl9zaXplRG9uZSwgdGhpcy5zdGF0dXMpO1xyXG4gICAgICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgICAgICB0aGlzLmxpc3RlbmVyKHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICAgcXVldWVVcGxvYWQodWw6IFVwbG9hZCkge1xyXG4gICAgICAgICAgICBpZiAodWwpIHtcclxuICAgICAgICAgICAgICAgIGxldCB1bFNpemUgPSB1bC5kYXRhLnNpemU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZS5wdXNoKHVsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NpemVRdWV1ZWQgKz0gdWxTaXplO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuIl19
246
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvbmV0L3VwbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVJLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUV4QyxxQkFBcUI7QUFDckIsTUFBTSxDQUFOLElBQVksWUFBc0U7QUFBbEYsV0FBWSxZQUFZO0lBQUUsK0NBQVEsQ0FBQTtJQUFFLHlEQUFhLENBQUE7SUFBRyxpREFBUyxDQUFBO0lBQUUsK0NBQVEsQ0FBQTtJQUFFLDhDQUFRLENBQUE7QUFBQSxDQUFDLEVBQXRFLFlBQVksS0FBWixZQUFZLFFBQTBEO0FBRWxGLHdCQUF3QjtBQUN4Qiw0RkFBNEY7QUFDNUYsTUFBTSxDQUFOLElBQVksY0FBK0U7QUFBM0YsV0FBWSxjQUFjO0lBQUcsbURBQVEsQ0FBQTtJQUFFLDZEQUFhLENBQUE7SUFBRSxxRUFBaUIsQ0FBQTtJQUFDLG1EQUFRLENBQUE7SUFBRSxrREFBUSxDQUFBO0FBQUEsQ0FBQyxFQUEvRSxjQUFjLEtBQWQsY0FBYyxRQUFpRTtBQUUzRixNQUFNLE9BQU8seUJBQXlCO0lBTWxDLFlBQVksVUFBa0IsRUFBRSxRQUFnQixFQUFFLE1BQXNCO1FBQ3BFLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENB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QWdEO3dCQUNoRCwrQ0FBK0M7d0JBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ3JCLEdBQUcsR0FBRyxFQUFFLENBQUM7d0JBQ1QsTUFBTTtxQkFDUDtpQkFDRjthQUNGO1NBQ0Y7UUFDRCxJQUFHLENBQUMsSUFBRSxDQUFDLEVBQUM7WUFDTiwrQkFBK0I7WUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBQyxjQUFjLENBQUMsSUFBSSxDQUFBO1NBQ2hDO1FBQ0QsSUFBSSxFQUFFLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RGLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ25CO0lBQ0gsQ0FBQztJQUVDLFdBQVcsQ0FBQyxFQUFVO1FBQ2xCLElBQUksRUFBRSxFQUFFO1lBQ0osSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUM7WUFDM0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2xCO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbiAgICBpbXBvcnQge0h0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuICAgIGltcG9ydCB7IHRpbWVvdXQgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcclxuXHJcbiAgICAvLyBzdGF0ZSBvZiBhbiB1cGxvYWRcclxuICAgIGV4cG9ydCBlbnVtIFVwbG9hZFN0YXR1cyB7SURMRSA9IDEsIFVQTE9BRElORyA9IDIsICBBQk9SVCA9IDMsIERPTkUgPSAwLCBFUlIgPSAtMX1cclxuXHJcbiAgICAvLyBzdGF0ZSBvZiB0aGUgdXBsb2FkZXJcclxuICAgIC8vIFRSWV9VUExPQURJTkcgaXMgdXBsb2FkaW5nIHN0YXRlIGFmdGVyIGFuIGVycm9yIChmb3IgZXhhbXBsZSBpZiBkaXNjb25uZWN0ZWQgZnJvbSBzZXJ2ZXIpXHJcbiAgICBleHBvcnQgZW51bSBVcGxvYWRlclN0YXR1cyB7IERPTkUgPSAwLCBVUExPQURJTkcgPSAxLCBUUllfVVBMT0FESU5HID0gMixORVhUID0gMywgRVJSID0gLTF9XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIFVwbG9hZGVyU3RhdHVzQ2hhbmdlRXZlbnQge1xyXG4gICAgICAgIHByaXZhdGUgX3NpemVRdWV1ZWQ6bnVtYmVyO1xyXG4gICAgICAgIHByaXZhdGUgX3NpemVEb25lOm51bWJlcjtcclxuICAgICAgICBwcml2YXRlIF9zdGF0dXM6IFVwbG9hZGVyU3RhdHVzO1xyXG5cclxuXHJcbiAgICAgICAgY29uc3RydWN0b3Ioc2l6ZVF1ZXVlZDogbnVtYmVyLCBzaXplRG9uZTogbnVtYmVyLCBzdGF0dXM6IFVwbG9hZGVyU3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NpemVRdWV1ZWQgPSBzaXplUXVldWVkO1xyXG4gICAgICAgICAgICB0aGlzLl9zaXplRG9uZSA9IHNpemVEb25lO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBzdGF0dXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXQgc2l6ZVF1ZXVlZCgpOm51bWJlciB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaXplUXVldWVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0IHNpemVEb25lKCk6bnVtYmVyIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpemVEb25lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0IHN0YXR1cygpOiBVcGxvYWRlclN0YXR1cyB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB1cGxvYWREb25lKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuX3NpemVEb25lID49IHRoaXMuX3NpemVRdWV1ZWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcGVyY2VudERvbmUoKTogbnVtYmVyIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NpemVRdWV1ZWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gbm8gZGF0YSBxdWV1ZWQsIHdlIGFyZSBcImRvbmVcIlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEwMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgcGVyY2VudCA9IE1hdGguZmxvb3IodGhpcy5fc2l6ZURvbmUgKiAxMDAgLyB0aGlzLl9zaXplUXVldWVkKTtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlVwbG9hZCBzdGF0dXM6IHF1ZXVlZDogXCIrdGhpcy5fc2l6ZVF1ZXVlZCtcIiwgZG9uZTogXCIrdGhpcy5fc2l6ZURvbmUrXCIsIFwiK3BlcmNlbnQrXCIlXCIpXHJcbiAgICAgICAgICAgIHJldHVybiBwZXJjZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIFVwbG9hZCB7XHJcblxyXG4gICAgICAgIHByaXZhdGUgX2RhdGE6QmxvYnxGb3JtRGF0YTtcclxuICAgICAgICBwcml2YXRlIF91cmw6c3RyaW5nO1xyXG4gICAgICAgIHN0YXR1czogVXBsb2FkU3RhdHVzO1xyXG5cclxuICAgICAgICBjb25zdHJ1Y3RvcihibG9iOkJsb2J8Rm9ybURhdGEsIHVybDpzdHJpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGF0YSA9IGJsb2I7XHJcbiAgICAgICAgICAgIHRoaXMuX3VybCA9IHVybDtcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBVcGxvYWRTdGF0dXMuSURMRTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldCB1cmwoKTpzdHJpbmcge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXJsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0IGRhdGEoKTpCbG9ifEZvcm1EYXRhIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgcHVibGljIHRvU3RyaW5nID0gKCkgOiBzdHJpbmcgPT4ge1xyXG4gICAgICAgIGxldCBzPWBVcGxvYWQ6IFN0YXR1czogJHt0aGlzLnN0YXR1c30sIFVSTDogJHt0aGlzLl91cmx9YDtcclxuICAgICAgICBpZih0aGlzLl9kYXRhIGluc3RhbmNlb2YgQmxvYil7XHJcbiAgICAgICAgICAgIHM9cytgLCBTaXplOiAke3RoaXMuX2RhdGEuc2l6ZX1gO1xyXG4gICAgICAgIH1lbHNlIGlmKHRoaXMuX2RhdGEgaW5zdGFuY2VvZiAgRm9ybURhdGEpe1xyXG4gICAgICAgICAgIC8vIFRPRE8gKGl0ZXJhdGUgdGhyb3VnaCBwYXJ0cyA/PylcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgVXBsb2FkZXIge1xyXG4gICAgICAgIFBPU1RfTUlOX1RJTUVPVVQgPSAxMjAwMDA7IC8vIDJtaW4gcGx1cyAuLi5cclxuICAgICAgICBQT1NUX1RJTUVPVVRfUEVSX0tCID0gMTAwMDsgIC8vIC4uLiAxcyBwZXIga0JcclxuXHJcbiAgICAgICAgUkVUUllfREVMQVk6IG51bWJlciA9IDMwMDAwOyAvLyByZXRyeSBldmVyeSAzMHNcclxuICAgICAgICBERUJVR19ERUxBWTogbnVtYmVyID0gMDtcclxuICAgICAgICAvL0RFQlVHX0RFTEFZOm51bWJlcj0wO1xyXG4gICAgICAgIHByaXZhdGUgc3RhdHVzOiBVcGxvYWRlclN0YXR1cyA9IFVwbG9hZGVyU3RhdHVzLkRPTkU7XHJcbiAgICAgICAgcHJpdmF0ZSBxdWU6IEFycmF5PFVwbG9hZD47XHJcbiAgICAgICAgbGlzdGVuZXI6ICgodWU6IFVwbG9hZGVyU3RhdHVzQ2hhbmdlRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgcHJpdmF0ZSBfc2l6ZVF1ZXVlZDogbnVtYmVyID0gMDtcclxuICAgICAgICBwcml2YXRlIF9zaXplRG9uZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgICAgcHJpdmF0ZSByZXRyeVRpbWVyUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHByaXZhdGUgcmV0cnlUaW1lcklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgICAgcHJpdmF0ZSB0ZTpUZXh0RW5jb2Rlcj1uZXcgVGV4dEVuY29kZXIoKTtcclxuXHJcbiAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIHdpdGhDcmVkZW50aWFsczogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucXVlID0gbmV3IEFycmF5PFVwbG9hZD4oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByaXZhdGUgZGF0YVNpemUoZHQ6QmxvYnxGb3JtRGF0YSl7XHJcbiAgICAgICAgICAgIGxldCBzaT0wO1xyXG4gICAgICAgICAgICBpZihkdCBpbnN0YW5jZW9mIEJsb2Ipe1xyXG4gICAgICAgICAgICAgICAgc2k9ZHQuc2l6ZTtcclxuICAgICAgICAgICAgfWVsc2UgaWYoZHQgaW5zdGFuY2VvZiAgRm9ybURhdGEpe1xyXG4gICAgICAgICAgICAgICAgZHQuZm9yRWFjaCgodixrKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHYgaW5zdGFuY2VvZiBGaWxlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2krPXYuc2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdiA9PT0nc3RyaW5nJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY29kZSB0byBVVC1mOCB0byBnZXQgdXBsb2FkIHNpemVcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2krPSB0aGlzLnRlLmVuY29kZSgpLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBzaTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByaXZhdGUgIHVwbG9hZERvbmUodWw6VXBsb2FkKSB7XHJcblxyXG4gICAgICAgICAgICB1bC5zdGF0dXMgPSBVcGxvYWRTdGF0dXMuRE9ORTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlbW92ZSB1cGxvYWQgZnJvbSBxdWV1ZVxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucXVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWVbaV0gPT09IHVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQsIHJlbW92ZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdWxTaXplID0gdGhpcy5kYXRhU2l6ZSh1bC5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaXplRG9uZSArPSB1bFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gc2V0IHRvIGRvbmUgZm9yIG5vdy4uLlxyXG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9IFVwbG9hZGVyU3RhdHVzLk5FWFQ7XHJcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIHRoaXMucHJvY2VzcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJpdmF0ZSBzdGFydFVwbG9hZCh1bDpVcGxvYWQpIHtcclxuXHJcbiAgICAgICAgICAgIHVsLnN0YXR1cyA9IFVwbG9hZFN0YXR1cy5VUExPQURJTkc7XHJcbiAgICAgICAgICAgIGlmIChVcGxvYWRlclN0YXR1cy5FUlIgPT09IHRoaXMuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IFVwbG9hZGVyU3RhdHVzLlRSWV9VUExPQURJTkc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IFVwbG9hZGVyU3RhdHVzLlVQTE9BRElORztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGRTaXplPXRoaXMuZGF0YVNpemUodWwuZGF0YSk7XHJcbiAgICAgICAgICAgIGxldCB0aW1lb3V0Rm9yRGF0YVNpemU9ZFNpemUqdGhpcy5QT1NUX1RJTUVPVVRfUEVSX0tCLzEwMDA7XHJcbiAgICAgICAgICAgIGxldCB0aW1lb1ZhbDpudW1iZXI9TWF0aC5yb3VuZCh0aGlzLlBPU1RfTUlOX1RJTUVPVVQrdGltZW91dEZvckRhdGFTaXplKVxyXG4gICAgICAgICAgICAvLyBwaXBlKHRpbWVvdXQoKSkgaXMgbm90IHRoZSBzYW1lIGFzIHhoci50aW1lb3V0XHJcblxyXG4gICAgICAgICAgbGV0IHVwbG9hZGVkVXBsb2FkOlVwbG9hZHxudWxsPW51bGw7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlBvc3QgdXBsb2FkOiBcIit1bClcclxuICAgICAgICAgIHRoaXMuaHR0cC5wb3N0KHVsLnVybCx1bC5kYXRhLHt3aXRoQ3JlZGVudGlhbHM6dGhpcy53aXRoQ3JlZGVudGlhbHN9KS5waXBlKHRpbWVvdXQodGltZW9WYWwpKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgIGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgIHVwbG9hZGVkVXBsb2FkID0gdWw7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdOZXh0IG1ldGhvZCBjYWxsZWQgZm9yIHVwbG9hZDogJyt1cGxvYWRlZFVwbG9hZClcclxuICAgICAgICAgICAgfSwoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlcnIuZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgLy8gQSBjbGllbnQtc2lkZSBvciBuZXR3b3JrIGVycm9yIG9jY3VycmVkLiBIYW5kbGUgaXQgYWNjb3JkaW5nbHkuXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVcGxvYWQgZXJyb3Igb2NjdXJyZWQ6JywgZXJyLmVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUaGUgYmFja2VuZCByZXR1cm5lZCBhbiB1bnN1Y2Nlc3NmdWwgcmVzcG9uc2UgY29kZS5cclxuICAgICAgICAgICAgICAgIC8vIFRoZSByZXNwb25zZSBib2R5IG1heSBjb250YWluIGNsdWVzIGFzIHRvIHdoYXQgd2VudCB3cm9uZyxcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFVwbG9hZCBlcnJvcjogU2VydmVyIHJldHVybmVkIGNvZGUgJHtlcnIuc3RhdHVzfWApO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcih1bClcclxuICAgICAgICAgICAgfSwoKT0+e1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZygnVXBsb2FkIGNvbXBsZXRlIG1ldGhvZCBjYWxsZWQnKVxyXG4gICAgICAgICAgICAgIGlmKHVwbG9hZGVkVXBsb2FkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ERUJVR19ERUxBWT4wKSB7XHJcbiAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZERvbmUodWwpO1xyXG4gICAgICAgICAgICAgICAgICB9LCB0aGlzLkRFQlVHX0RFTEFZKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRG9uZSh1cGxvYWRlZFVwbG9hZClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VwbG9hZCBwb3N0IGNvbXBsZXRlLCBidXQgdXBsb2FkIG5vdCBzZXQgaW4gbmV4dCBtZXRob2QhJylcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJpdmF0ZSBwcm9jZXNzRXJyb3IodWw6VXBsb2FkKSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlByb2Nlc3MgdXBsb2FkIGVycm9yLi4uXCIpXHJcbiAgICAgICAgICAgIHVsLnN0YXR1cz1VcGxvYWRTdGF0dXMuRVJSXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gVXBsb2FkZXJTdGF0dXMuRVJSO1xyXG5cclxuICAgICAgICAgICAgbGV0IHVlID0gbmV3IFVwbG9hZGVyU3RhdHVzQ2hhbmdlRXZlbnQodGhpcy5fc2l6ZVF1ZXVlZCwgdGhpcy5fc2l6ZURvbmUsIHRoaXMuc3RhdHVzKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIodWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgcmV0cnkgdGltZXJcclxuICAgICAgICAgICAgdGhpcy5yZXRyeVRpbWVySWQ9d2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXRyeVRpbWVyUnVubmluZz1mYWxzZTtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlVwbG9hZCByZXRyeSB0aW1lciBleHByaXJlZC4gQ29udGludWUgcHJvY2Vzc2luZy4uLlwiKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzKCk7XHJcbiAgICAgICAgICAgIH0sIHRoaXMuUkVUUllfREVMQVkpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yZXRyeVRpbWVyUnVubmluZz10cnVlO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTdGFydGVkIHVwbG9hZCByZXRyeSB0aW1lciBcIit0aGlzLlJFVFJZX0RFTEFZK1wibXMgLi4uXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgcHJpdmF0ZSBwcm9jZXNzKCkge1xyXG4gICAgICAgIC8vIGNsZWFyIHJldHJ5IHRpbWVyIGlmIHNldFxyXG4gICAgICAgIGlmKHRoaXMucmV0cnlUaW1lclJ1bm5pbmcpe1xyXG4gICAgICAgICAgICBpZih0aGlzLnJldHJ5VGltZXJJZCkge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJldHJ5VGltZXJJZClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5yZXRyeVRpbWVyUnVubmluZz1mYWxzZVxyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQ2xlYXJlZCByZXRyeSB0aW1lci5cIilcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBwdWw6IFVwbG9hZCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJVcGxvYWRlciBzdGF0dXM6IFwiK3RoaXMuc3RhdHVzKVxyXG5cclxuICAgICAgICBsZXQgcyA9IHRoaXMucXVlLmxlbmd0aDtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcocytcIiB1cGxvYWRzIGFyZSBpbiB0aGUgcXVldWUuXCIpXHJcblxyXG4gICAgICAgIGlmIChzPjAgJiYgVXBsb2FkZXJTdGF0dXMuVVBMT0FESU5HICE9IHRoaXMuc3RhdHVzICYmIFVwbG9hZGVyU3RhdHVzLlRSWV9VUExPQURJTkcgIT0gdGhpcy5zdGF0dXMpIHtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHM7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdWwgPSB0aGlzLnF1ZVtpXTtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlVwbG9hZCBcIit1bCtcIiBzdGF0dXM6XCIrdWwuc3RhdHVzKVxyXG4gICAgICAgICAgICBpZiAodWwuc3RhdHVzID09PSBVcGxvYWRTdGF0dXMuSURMRSkge1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJVcGxvYWQgXCIrdWwrXCIgc3RhcnRVcGxvYWRcIilcclxuICAgICAgICAgICAgICB0aGlzLnN0YXJ0VXBsb2FkKHVsKTtcclxuICAgICAgICAgICAgICBwdWwgPSB1bDtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKCFwdWwpIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkNoZWNrIEVSUiB1cGxvYWRzLi4uXCIpXHJcbiAgICAgICAgICAgIC8vIG5vdyBmYWlsZWQgdXBsb2Fkc1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJObyByZWd1bGFyIHVwbG9hZCBmb3VuZC4gTG9va2luZyBmb3IgZXJyb3Igc3RhdGUgdXBsb2Fkcy5cIilcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzOyBpKyspIHtcclxuICAgICAgICAgICAgICBsZXQgdWwgPSB0aGlzLnF1ZVtpXTtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiVXBsb2FkIFwiK3VsK1wiIHN0YXR1czpcIit1bC5zdGF0dXMpXHJcbiAgICAgICAgICAgICAgaWYgKHVsLnN0YXR1cyA9PT0gVXBsb2FkU3RhdHVzLkVSUikge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlVwbG9hZCAoRVJSKSBcIit1bCtcIiBzdGFydFVwbG9hZFwiKVxyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU3RhcnQgZXJyb3Igc3RhdGUgdXBsb2FkIFwiK3VsKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGFydFVwbG9hZCh1bCk7XHJcbiAgICAgICAgICAgICAgICBwdWwgPSB1bDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihzPT0wKXtcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlVwbG9hZCBkb25lLlwiKVxyXG4gICAgICAgICAgdGhpcy5zdGF0dXM9VXBsb2FkZXJTdGF0dXMuRE9ORVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdWUgPSBuZXcgVXBsb2FkZXJTdGF0dXNDaGFuZ2VFdmVudCh0aGlzLl9zaXplUXVldWVkLCB0aGlzLl9zaXplRG9uZSwgdGhpcy5zdGF0dXMpO1xyXG4gICAgICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgICAgICB0aGlzLmxpc3RlbmVyKHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICAgcXVldWVVcGxvYWQodWw6IFVwbG9hZCkge1xyXG4gICAgICAgICAgICBpZiAodWwpIHtcclxuICAgICAgICAgICAgICAgIGxldCB1bFNpemUgPSB0aGlzLmRhdGFTaXplKHVsLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5xdWUucHVzaCh1bCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zaXplUXVldWVkICs9IHVsU2l6ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiJdfQ==
@@ -1,14 +1,14 @@
1
1
  import { UUID } from '../utils/utils';
2
- export class RecordingFileDescriptor {
2
+ export class RecordingFileDescriptorImpl {
3
3
  constructor() { }
4
4
  }
5
- export class RecordingFile extends RecordingFileDescriptor {
6
- constructor(sessionId, itemcode, version, audioBuffer) {
7
- super();
5
+ export class RecordingFile {
6
+ constructor(uuid, sessionId, audioBuffer) {
8
7
  this.recordingFileId = null;
9
8
  this.uuid = null;
10
9
  this.date = null;
11
10
  this._dateAsDateObj = null;
11
+ this.startedDate = null;
12
12
  this.audioBuffer = null;
13
13
  this.session = null;
14
14
  this.frames = null;
@@ -16,10 +16,26 @@ export class RecordingFile extends RecordingFileDescriptor {
16
16
  this.editStartFrame = null;
17
17
  this.editEndFrame = null;
18
18
  this.session = sessionId;
19
+ this.audioBuffer = audioBuffer;
20
+ this.uuid = uuid;
21
+ }
22
+ filenameString() {
23
+ let fns = '';
24
+ if (this.session) {
25
+ fns += this.session;
26
+ fns += '_';
27
+ }
28
+ fns += this.uuid;
29
+ return fns;
30
+ }
31
+ }
32
+ export class SprRecordingFile extends RecordingFile {
33
+ constructor(sessionId, itemcode, version, audioBuffer) {
34
+ super(UUID.generate(), sessionId, audioBuffer);
35
+ this.session = sessionId;
19
36
  this.itemCode = itemcode;
20
37
  this.version = version;
21
38
  this.audioBuffer = audioBuffer;
22
- this.uuid = UUID.generate();
23
39
  }
24
40
  filenameString() {
25
41
  let fns = '';
@@ -35,4 +51,4 @@ export class RecordingFile extends RecordingFileDescriptor {
35
51
  return fns;
36
52
  }
37
53
  }
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3JlY29yZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFJckMsTUFBTSxPQUFPLHVCQUF1QjtJQUdsQyxnQkFBZSxDQUFDO0NBQ2pCO0FBRUcsTUFBTSxPQUFPLGFBQWMsU0FBUSx1QkFBdUI7SUFheEQsWUFBWSxTQUF1QixFQUFDLFFBQWUsRUFBQyxPQUFjLEVBQUMsV0FBNEI7UUFDM0YsS0FBSyxFQUFFLENBQUE7UUFiWCxvQkFBZSxHQUEwQixJQUFJLENBQUM7UUFDOUMsU0FBSSxHQUFhLElBQUksQ0FBQztRQUN0QixTQUFJLEdBQWMsSUFBSSxDQUFDO1FBQ3ZCLG1CQUFjLEdBQVcsSUFBSSxDQUFDO1FBQzlCLGdCQUFXLEdBQWtCLElBQUksQ0FBQztRQUNsQyxZQUFPLEdBQW9CLElBQUksQ0FBQztRQUVoQyxXQUFNLEdBQWEsSUFBSSxDQUFDO1FBQ3hCLG1CQUFjLEdBQWEsSUFBSSxDQUFDO1FBQ2hDLG1CQUFjLEdBQWEsSUFBSSxDQUFBO1FBQy9CLGlCQUFZLEdBQWEsSUFBSSxDQUFBO1FBSXpCLElBQUksQ0FBQyxPQUFPLEdBQUMsU0FBUyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUMsUUFBUSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUMsT0FBTyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUMsV0FBVyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLEdBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxHQUFHLEdBQVEsRUFBRSxDQUFDO1FBQ2xCLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBQztZQUNaLEdBQUcsSUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2xCLEdBQUcsSUFBRSxHQUFHLENBQUM7U0FDWjtRQUNELElBQUcsSUFBSSxDQUFDLFFBQVEsRUFBQztZQUNmLEdBQUcsSUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ25CLEdBQUcsSUFBRSxHQUFHLENBQUM7U0FDVjtRQUNELEdBQUcsSUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2YsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBVVUlEIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnXHJcbmltcG9ydCB7UHJvbXB0SXRlbX0gZnJvbSBcIi4vc2NyaXB0L3NjcmlwdFwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBSZWNvcmRpbmdGaWxlRGVzY3JpcHRvciB7XHJcbiAgcmVjb3JkaW5nITpQcm9tcHRJdGVtO1xyXG4gIHZlcnNpb24hOm51bWJlcjtcclxuICBjb25zdHJ1Y3RvcigpIHt9XHJcbn1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgUmVjb3JkaW5nRmlsZSBleHRlbmRzIFJlY29yZGluZ0ZpbGVEZXNjcmlwdG9ye1xyXG4gICAgICByZWNvcmRpbmdGaWxlSWQ6IHN0cmluZyB8IG51bWJlciB8IG51bGw9IG51bGw7XHJcbiAgICAgIHV1aWQ6c3RyaW5nfG51bGw9bnVsbDtcclxuICAgICAgZGF0ZTogc3RyaW5nfG51bGw9bnVsbDtcclxuICAgICAgX2RhdGVBc0RhdGVPYmo6RGF0ZXxudWxsPW51bGw7XHJcbiAgICAgIGF1ZGlvQnVmZmVyOkF1ZGlvQnVmZmVyfG51bGw9bnVsbDtcclxuICAgICAgc2Vzc2lvbjpzdHJpbmd8bnVtYmVyfG51bGw9bnVsbDtcclxuICAgICAgaXRlbUNvZGU6c3RyaW5nO1xyXG4gICAgICBmcmFtZXM6bnVtYmVyfG51bGw9bnVsbDtcclxuICAgICAgZWRpdFNhbXBsZVJhdGU6bnVtYmVyfG51bGw9bnVsbDtcclxuICAgICAgZWRpdFN0YXJ0RnJhbWU6bnVtYmVyfG51bGw9bnVsbFxyXG4gICAgICBlZGl0RW5kRnJhbWU6bnVtYmVyfG51bGw9bnVsbFxyXG5cclxuICAgICAgY29uc3RydWN0b3Ioc2Vzc2lvbklkOnN0cmluZ3xudW1iZXIsaXRlbWNvZGU6c3RyaW5nLHZlcnNpb246bnVtYmVyLGF1ZGlvQnVmZmVyOkF1ZGlvQnVmZmVyfG51bGwpIHtcclxuICAgICAgICAgIHN1cGVyKClcclxuICAgICAgICAgIHRoaXMuc2Vzc2lvbj1zZXNzaW9uSWQ7XHJcbiAgICAgICAgICB0aGlzLml0ZW1Db2RlPWl0ZW1jb2RlO1xyXG4gICAgICAgICAgdGhpcy52ZXJzaW9uPXZlcnNpb247XHJcbiAgICAgICAgICB0aGlzLmF1ZGlvQnVmZmVyPWF1ZGlvQnVmZmVyO1xyXG4gICAgICAgICAgdGhpcy51dWlkPVVVSUQuZ2VuZXJhdGUoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZmlsZW5hbWVTdHJpbmcoKTpzdHJpbmd7XHJcbiAgICAgICAgbGV0IGZuczpzdHJpbmc9Jyc7XHJcbiAgICAgICAgaWYodGhpcy5zZXNzaW9uKXtcclxuICAgICAgICAgICAgZm5zKz10aGlzLnNlc3Npb247XHJcbiAgICAgICAgICAgIGZucys9J18nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLml0ZW1Db2RlKXtcclxuICAgICAgICAgIGZucys9dGhpcy5pdGVtQ29kZTtcclxuICAgICAgICAgIGZucys9J18nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmbnMrPXRoaXMudXVpZDtcclxuICAgICAgICByZXR1cm4gZm5zO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4iXX0=
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3JlY29yZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFRckMsTUFBTSxPQUFPLDJCQUEyQjtJQUd0QyxnQkFBZSxDQUFDO0NBQ2pCO0FBRUQsTUFBTSxPQUFPLGFBQWE7SUFheEIsWUFBWSxJQUFXLEVBQUMsU0FBdUIsRUFBQyxXQUE0QjtRQVo1RSxvQkFBZSxHQUEwQixJQUFJLENBQUM7UUFDOUMsU0FBSSxHQUFhLElBQUksQ0FBQztRQUN0QixTQUFJLEdBQWMsSUFBSSxDQUFDO1FBQ3ZCLG1CQUFjLEdBQVcsSUFBSSxDQUFDO1FBQzlCLGdCQUFXLEdBQVksSUFBSSxDQUFDO1FBQzVCLGdCQUFXLEdBQWtCLElBQUksQ0FBQztRQUNsQyxZQUFPLEdBQW9CLElBQUksQ0FBQztRQUNoQyxXQUFNLEdBQWEsSUFBSSxDQUFDO1FBQ3hCLG1CQUFjLEdBQWEsSUFBSSxDQUFDO1FBQ2hDLG1CQUFjLEdBQWEsSUFBSSxDQUFBO1FBQy9CLGlCQUFZLEdBQWEsSUFBSSxDQUFBO1FBRzNCLElBQUksQ0FBQyxPQUFPLEdBQUMsU0FBUyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUMsV0FBVyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLEdBQUMsSUFBSSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxHQUFHLEdBQVEsRUFBRSxDQUFDO1FBQ2xCLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBQztZQUNkLEdBQUcsSUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2xCLEdBQUcsSUFBRSxHQUFHLENBQUM7U0FDVjtRQUNELEdBQUcsSUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2YsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0Y7QUFFRyxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsYUFBYTtJQU9qRCxZQUFZLFNBQXVCLEVBQUMsUUFBZSxFQUFDLE9BQWMsRUFBQyxXQUE0QjtRQUMzRixLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFDLFNBQVMsRUFBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFDLFNBQVMsQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFDLFFBQVEsQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFDLE9BQU8sQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFDLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksR0FBRyxHQUFRLEVBQUUsQ0FBQztRQUNsQixJQUFHLElBQUksQ0FBQyxPQUFPLEVBQUM7WUFDWixHQUFHLElBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUNsQixHQUFHLElBQUUsR0FBRyxDQUFDO1NBQ1o7UUFDRCxJQUFHLElBQUksQ0FBQyxRQUFRLEVBQUM7WUFDZixHQUFHLElBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNuQixHQUFHLElBQUUsR0FBRyxDQUFDO1NBQ1Y7UUFDRCxHQUFHLElBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNmLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVVVJRCB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJ1xyXG5pbXBvcnQge1Byb21wdEl0ZW19IGZyb20gXCIuL3NjcmlwdC9zY3JpcHRcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkaW5nRmlsZURlc2NyaXB0b3Ige1xyXG4gIHJlY29yZGluZzpQcm9tcHRJdGVtO1xyXG4gIHZlcnNpb246bnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmVjb3JkaW5nRmlsZURlc2NyaXB0b3JJbXBsIHtcclxuICByZWNvcmRpbmchOlByb21wdEl0ZW07XHJcbiAgdmVyc2lvbiE6bnVtYmVyO1xyXG4gIGNvbnN0cnVjdG9yKCkge31cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJlY29yZGluZ0ZpbGUge1xyXG4gIHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbD0gbnVsbDtcclxuICB1dWlkOnN0cmluZ3xudWxsPW51bGw7XHJcbiAgZGF0ZTogc3RyaW5nfG51bGw9bnVsbDtcclxuICBfZGF0ZUFzRGF0ZU9iajpEYXRlfG51bGw9bnVsbDtcclxuICBzdGFydGVkRGF0ZT86RGF0ZXxudWxsPW51bGw7XHJcbiAgYXVkaW9CdWZmZXI6QXVkaW9CdWZmZXJ8bnVsbD1udWxsO1xyXG4gIHNlc3Npb246c3RyaW5nfG51bWJlcnxudWxsPW51bGw7XHJcbiAgZnJhbWVzOm51bWJlcnxudWxsPW51bGw7XHJcbiAgZWRpdFNhbXBsZVJhdGU6bnVtYmVyfG51bGw9bnVsbDtcclxuICBlZGl0U3RhcnRGcmFtZTpudW1iZXJ8bnVsbD1udWxsXHJcbiAgZWRpdEVuZEZyYW1lOm51bWJlcnxudWxsPW51bGxcclxuXHJcbiAgY29uc3RydWN0b3IodXVpZDpzdHJpbmcsc2Vzc2lvbklkOnN0cmluZ3xudW1iZXIsYXVkaW9CdWZmZXI6QXVkaW9CdWZmZXJ8bnVsbCkge1xyXG4gICAgdGhpcy5zZXNzaW9uPXNlc3Npb25JZDtcclxuICAgIHRoaXMuYXVkaW9CdWZmZXI9YXVkaW9CdWZmZXI7XHJcbiAgICB0aGlzLnV1aWQ9dXVpZDtcclxuICB9XHJcblxyXG4gIGZpbGVuYW1lU3RyaW5nKCk6c3RyaW5ne1xyXG4gICAgbGV0IGZuczpzdHJpbmc9Jyc7XHJcbiAgICBpZih0aGlzLnNlc3Npb24pe1xyXG4gICAgICBmbnMrPXRoaXMuc2Vzc2lvbjtcclxuICAgICAgZm5zKz0nXyc7XHJcbiAgICB9XHJcbiAgICBmbnMrPXRoaXMudXVpZDtcclxuICAgIHJldHVybiBmbnM7XHJcbiAgfVxyXG59XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIFNwclJlY29yZGluZ0ZpbGUgZXh0ZW5kcyBSZWNvcmRpbmdGaWxlIGltcGxlbWVudHMgIFJlY29yZGluZ0ZpbGVEZXNjcmlwdG9ye1xyXG5cclxuICAgICAgaXRlbUNvZGU6c3RyaW5nO1xyXG5cclxuICAgICAgcmVjb3JkaW5nITpQcm9tcHRJdGVtO1xyXG4gICAgICB2ZXJzaW9uITpudW1iZXI7XHJcblxyXG4gICAgICBjb25zdHJ1Y3RvcihzZXNzaW9uSWQ6c3RyaW5nfG51bWJlcixpdGVtY29kZTpzdHJpbmcsdmVyc2lvbjpudW1iZXIsYXVkaW9CdWZmZXI6QXVkaW9CdWZmZXJ8bnVsbCkge1xyXG4gICAgICAgICAgc3VwZXIoVVVJRC5nZW5lcmF0ZSgpLHNlc3Npb25JZCxhdWRpb0J1ZmZlcik7XHJcbiAgICAgICAgICB0aGlzLnNlc3Npb249c2Vzc2lvbklkO1xyXG4gICAgICAgICAgdGhpcy5pdGVtQ29kZT1pdGVtY29kZTtcclxuICAgICAgICAgIHRoaXMudmVyc2lvbj12ZXJzaW9uO1xyXG4gICAgICAgICAgdGhpcy5hdWRpb0J1ZmZlcj1hdWRpb0J1ZmZlcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgZmlsZW5hbWVTdHJpbmcoKTpzdHJpbmd7XHJcbiAgICAgICAgbGV0IGZuczpzdHJpbmc9Jyc7XHJcbiAgICAgICAgaWYodGhpcy5zZXNzaW9uKXtcclxuICAgICAgICAgICAgZm5zKz10aGlzLnNlc3Npb247XHJcbiAgICAgICAgICAgIGZucys9J18nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLml0ZW1Db2RlKXtcclxuICAgICAgICAgIGZucys9dGhpcy5pdGVtQ29kZTtcclxuICAgICAgICAgIGZucys9J18nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmbnMrPXRoaXMudXVpZDtcclxuICAgICAgICByZXR1cm4gZm5zO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4iXX0=
@@ -5,7 +5,7 @@ import { Inject, Injectable } from '@angular/core';
5
5
  import { HttpHeaders } from "@angular/common/http";
6
6
  import { ApiType, SPEECHRECORDER_CONFIG } from "../../spr.config";
7
7
  import { UUID } from "../../utils/utils";
8
- import { RecordingFile } from "../recording";
8
+ import { SprRecordingFile } from "../recording";
9
9
  import { ProjectService } from "../project/project.service";
10
10
  import { SessionService } from "../session/session.service";
11
11
  import { Observable } from "rxjs";
@@ -31,15 +31,26 @@ export class RecordingService {
31
31
  this.withCredentials = config.withCredentials;
32
32
  }
33
33
  }
34
- recFilesUrl(projectName, sessId) {
34
+ recordingFilesUrl() {
35
+ let recFilesUrl = this.apiEndPoint + RecordingService.RECORDING_API_CTX;
36
+ return recFilesUrl;
37
+ }
38
+ sessionRecordingFilesUrl(projectName, sessId) {
39
+ let encPrjName = encodeURIComponent(projectName);
40
+ let encSessId = encodeURIComponent(sessId);
41
+ let recFilesUrl = this.apiEndPoint + ProjectService.PROJECT_API_CTX + '/' + encPrjName + '/' +
42
+ SessionService.SESSION_API_CTX + '/' + encSessId + '/' + RecordingService.RECORDING_API_CTX;
43
+ return recFilesUrl;
44
+ }
45
+ sessionRecFilesUrl(projectName, sessId) {
35
46
  let encPrjName = encodeURIComponent(projectName);
36
47
  let encSessId = encodeURIComponent(sessId);
37
48
  let recFilesUrl = this.apiEndPoint + ProjectService.PROJECT_API_CTX + '/' + encPrjName + '/' +
38
49
  SessionService.SESSION_API_CTX + '/' + encSessId + '/' + RecordingService.REC_API_CTX;
39
50
  return recFilesUrl;
40
51
  }
41
- recFilesReqUrl(projectName, sessId) {
42
- let recFilesUrl = this.recFilesUrl(projectName, sessId);
52
+ sessionRecFilesReqUrl(projectName, sessId) {
53
+ let recFilesUrl = this.sessionRecFilesUrl(projectName, sessId);
43
54
  if (this.config && this.config.apiType === ApiType.FILES) {
44
55
  // for development and demo
45
56
  // append UUID to make request URL unique to avoid localhost server caching
@@ -48,37 +59,98 @@ export class RecordingService {
48
59
  return recFilesUrl;
49
60
  }
50
61
  recordingFileDescrList(projectName, sessId) {
51
- let recFilesReqUrl = this.recFilesReqUrl(projectName, sessId);
62
+ let recFilesReqUrl = this.sessionRecFilesReqUrl(projectName, sessId);
52
63
  let wobs = this.http.get(recFilesReqUrl, { withCredentials: this.withCredentials });
53
64
  return wobs;
54
65
  }
55
66
  recordingFileList(projectName, sessId) {
56
- let recFilesReqUrl = this.recFilesReqUrl(projectName, sessId);
67
+ let recFilesReqUrl = this.sessionRecFilesReqUrl(projectName, sessId);
57
68
  let wobs = this.http.get(recFilesReqUrl, { withCredentials: this.withCredentials });
58
69
  return wobs;
59
70
  }
60
- fetchAudiofile(projectName, sessId, itemcode, version) {
61
- let recFilesUrl = this.recFilesUrl(projectName, sessId);
62
- let encItemcode = encodeURIComponent(itemcode);
63
- let recUrl = recFilesUrl + '/' + encItemcode + '/' + version;
71
+ sprRecordingFileList(projectName, sessId) {
72
+ let recFilesReqUrl = this.sessionRecFilesReqUrl(projectName, sessId);
73
+ let wobs = this.http.get(recFilesReqUrl, { withCredentials: this.withCredentials });
74
+ return wobs;
75
+ }
76
+ audioRequest(audioUrl) {
64
77
  if (this.config && this.config.apiType === ApiType.FILES) {
65
78
  // for development and demo
66
79
  // append UUID to make request URL unique to avoid localhost server caching
67
- recUrl = recUrl + '.wav?requestUUID=' + UUID.generate();
80
+ audioUrl = audioUrl + '.wav?requestUUID=' + UUID.generate();
68
81
  }
69
82
  let headers = new HttpHeaders();
70
83
  headers = headers.set('Accept', 'audio/wav');
71
- return this.http.get(recUrl, {
84
+ return this.http.get(audioUrl, {
72
85
  headers: headers,
73
86
  observe: 'response',
74
87
  responseType: 'arraybuffer',
75
88
  withCredentials: this.withCredentials
76
89
  });
77
90
  }
91
+ fetchAudiofile(projectName, sessId, recFileId) {
92
+ let recFilesUrl = this.sessionRecordingFilesUrl(projectName, sessId);
93
+ let encRecFileId = encodeURIComponent(recFileId);
94
+ let recUrl = recFilesUrl + '/' + encRecFileId;
95
+ return this.audioRequest(recUrl);
96
+ }
97
+ fetchSprAudiofile(projectName, sessId, itemcode, version) {
98
+ let recFilesUrl = this.sessionRecFilesUrl(projectName, sessId);
99
+ let encItemcode = encodeURIComponent(itemcode);
100
+ let recUrl = recFilesUrl + '/' + encItemcode + '/' + version;
101
+ return this.audioRequest(recUrl);
102
+ }
78
103
  fetchAndApplyRecordingFile(aCtx, projectName, recordingFile) {
104
+ let wobs = new Observable(observer => {
105
+ if (recordingFile.session && recordingFile.recordingFileId) {
106
+ let obs = this.fetchAudiofile(projectName, recordingFile.session, recordingFile.recordingFileId);
107
+ obs.subscribe(resp => {
108
+ //console.log("Fetched audio file. HTTP response status: "+resp.status+", type: "+resp.type+", byte length: "+ resp.body.byteLength);
109
+ // Do not use Promise version, which does not work with Safari 13 (13.0.5)
110
+ if (resp.body) {
111
+ aCtx.decodeAudioData(resp.body, ab => {
112
+ recordingFile.audioBuffer = ab;
113
+ if (this.debugDelay > 0) {
114
+ window.setTimeout(() => {
115
+ observer.next(recordingFile);
116
+ observer.complete();
117
+ }, this.debugDelay);
118
+ }
119
+ else {
120
+ observer.next(recordingFile);
121
+ observer.complete();
122
+ }
123
+ }, error => {
124
+ observer.error(error);
125
+ observer.complete();
126
+ });
127
+ }
128
+ else {
129
+ observer.error('Fetching audio file: response has no body');
130
+ }
131
+ }, (error) => {
132
+ if (error.status == 404) {
133
+ // Interpret not as an error, the file ist not recorded yet
134
+ observer.next(null);
135
+ observer.complete();
136
+ }
137
+ else {
138
+ // all other states are errors
139
+ observer.error(error);
140
+ observer.complete();
141
+ }
142
+ });
143
+ }
144
+ else {
145
+ observer.error();
146
+ }
147
+ });
148
+ return wobs;
149
+ }
150
+ fetchAndApplySprRecordingFile(aCtx, projectName, recordingFile) {
79
151
  let wobs = new Observable(observer => {
80
152
  if (recordingFile.session) {
81
- let obs = this.fetchAudiofile(projectName, recordingFile.session, recordingFile.itemCode, recordingFile.version);
153
+ let obs = this.fetchSprAudiofile(projectName, recordingFile.session, recordingFile.itemCode, recordingFile.version);
82
154
  obs.subscribe(resp => {
83
155
  //console.log("Fetched audio file. HTTP response status: "+resp.status+", type: "+resp.type+", byte length: "+ resp.body.byteLength);
84
156
  // Do not use Promise version, which does not work with Safari 13 (13.0.5)
@@ -124,12 +196,12 @@ export class RecordingService {
124
196
  }
125
197
  fetchRecordingFile(aCtx, projectName, sessId, itemcode, version) {
126
198
  let wobs = new Observable(observer => {
127
- let obs = this.fetchAudiofile(projectName, sessId, itemcode, version);
199
+ let obs = this.fetchSprAudiofile(projectName, sessId, itemcode, version);
128
200
  obs.subscribe(resp => {
129
201
  // Do not use Promise version, which does not work with Safari 13
130
202
  if (resp.body) {
131
203
  aCtx.decodeAudioData(resp.body, ab => {
132
- let rf = new RecordingFile(sessId, itemcode, version, ab);
204
+ let rf = new SprRecordingFile(sessId, itemcode, version, ab);
133
205
  if (this.debugDelay > 0) {
134
206
  window.setTimeout(() => {
135
207
  observer.next(rf);
@@ -162,6 +234,7 @@ export class RecordingService {
162
234
  }
163
235
  }
164
236
  RecordingService.REC_API_CTX = 'recfile';
237
+ RecordingService.RECORDING_API_CTX = 'recordingfile';
165
238
  RecordingService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: RecordingService, deps: [{ token: i1.HttpClient }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
166
239
  RecordingService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: RecordingService });
167
240
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: RecordingService, decorators: [{
@@ -170,4 +243,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImpor
170
243
  type: Inject,
171
244
  args: [SPEECHRECORDER_CONFIG]
172
245
  }] }]; } });
173
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5ncy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3JlY29yZGluZ3MvcmVjb3JkaW5ncy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFnQyxXQUFXLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RixPQUFPLEVBQUMsT0FBTyxFQUFFLHFCQUFxQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBRXRGLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUN2QyxPQUFPLEVBQUMsYUFBYSxFQUEwQixNQUFNLGNBQWMsQ0FBQztBQUNwRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7Ozs7QUFHaEMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFDLFNBQVMsQ0FBQTtBQUtsQyxNQUFNLE9BQU8sZ0JBQWdCO0lBUzNCLFlBQW9CLElBQWdCLEVBQXlDLE1BQTZCO1FBQXRGLFNBQUksR0FBSixJQUFJLENBQVk7UUFBeUMsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUFMbEcsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFFekMsa0NBQWtDO1FBQzFCLGVBQVUsR0FBUSxDQUFDLENBQUM7UUFJMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUE7UUFFckIsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtZQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxX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UyxDQUFBOzZHQUZuQyxnQkFBZ0IsNENBU21CLHFCQUFxQjtpSEFUeEQsZ0JBQWdCOzJGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVU7OzBCQVU4QixNQUFNOzJCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGtsYXVzaiBvbiAxNy4wNi4yMDE3LlxyXG4gKi9cclxuaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHtBcGlUeXBlLCBTUEVFQ0hSRUNPUkRFUl9DT05GSUcsIFNwZWVjaFJlY29yZGVyQ29uZmlnfSBmcm9tIFwiLi4vLi4vc3ByLmNvbmZpZ1wiO1xyXG5cclxuaW1wb3J0IHtVVUlEfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcclxuaW1wb3J0IHtSZWNvcmRpbmdGaWxlLCBSZWNvcmRpbmdGaWxlRGVzY3JpcHRvcn0gZnJvbSBcIi4uL3JlY29yZGluZ1wiO1xyXG5pbXBvcnQge1Byb2plY3RTZXJ2aWNlfSBmcm9tIFwiLi4vcHJvamVjdC9wcm9qZWN0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHtTZXNzaW9uU2VydmljZX0gZnJvbSBcIi4uL3Nlc3Npb24vc2Vzc2lvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSBcInJ4anNcIjtcclxuXHJcblxyXG5leHBvcnQgY29uc3QgUkVDX0FQSV9DVFg9J3JlY2ZpbGUnXHJcblxyXG5cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFJlY29yZGluZ1NlcnZpY2Uge1xyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJFQ19BUElfQ1RYID0gJ3JlY2ZpbGUnXHJcbiAgcHJpdmF0ZSBhcGlFbmRQb2ludDogc3RyaW5nO1xyXG4gIHByaXZhdGUgd2l0aENyZWRlbnRpYWxzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vcHJpdmF0ZSBkZWJ1Z0RlbGF5Om51bWJlcj0xMDAwMDtcclxuICBwcml2YXRlIGRlYnVnRGVsYXk6bnVtYmVyPTA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIHByaXZhdGUgY29uZmlnPzogU3BlZWNoUmVjb3JkZXJDb25maWcpIHtcclxuXHJcbiAgICB0aGlzLmFwaUVuZFBvaW50ID0gJydcclxuXHJcbiAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5hcGlFbmRQb2ludCkge1xyXG4gICAgICB0aGlzLmFwaUVuZFBvaW50ID0gY29uZmlnLmFwaUVuZFBvaW50O1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYXBpRW5kUG9pbnQgIT09ICcnKSB7XHJcbiAgICAgIHRoaXMuYXBpRW5kUG9pbnQgPSB0aGlzLmFwaUVuZFBvaW50ICsgJy8nXHJcbiAgICB9XHJcbiAgICBpZiAoY29uZmlnICE9IG51bGwgJiYgY29uZmlnLndpdGhDcmVkZW50aWFscyAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gY29uZmlnLndpdGhDcmVkZW50aWFscztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVjRmlsZXNVcmwocHJvamVjdE5hbWU6IHN0cmluZywgc2Vzc0lkOiBzdHJpbmcgfCBudW1iZXIpOnN0cmluZ3tcclxuICAgIGxldCBlbmNQcmpOYW1lPWVuY29kZVVSSUNvbXBvbmVudChwcm9qZWN0TmFtZSk7XHJcbiAgICBsZXQgZW5jU2Vzc0lkPWVuY29kZVVSSUNvbXBvbmVudChzZXNzSWQpO1xyXG4gICAgbGV0IHJlY0ZpbGVzVXJsID0gdGhpcy5hcGlFbmRQb2ludCArIFByb2plY3RTZXJ2aWNlLlBST0pFQ1RfQVBJX0NUWCArICcvJyArIGVuY1Byak5hbWUgKyAnLycgK1xyXG4gICAgICAgIFNlc3Npb25TZXJ2aWNlLlNFU1NJT05fQVBJX0NUWCArICcvJyArIGVuY1Nlc3NJZCArICcvJyArIFJlY29yZGluZ1NlcnZpY2UuUkVDX0FQSV9DVFg7XHJcbiAgICByZXR1cm4gcmVjRmlsZXNVcmw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlY0ZpbGVzUmVxVXJsKHByb2plY3ROYW1lOiBzdHJpbmcsIHNlc3NJZDogc3RyaW5nIHwgbnVtYmVyKTpzdHJpbmd7XHJcbiAgICBsZXQgcmVjRmlsZXNVcmw9dGhpcy5yZWNGaWxlc1VybChwcm9qZWN0TmFtZSxzZXNzSWQpO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgICByZWNGaWxlc1VybCA9IHJlY0ZpbGVzVXJsICsgJy5qc29uP3JlcXVlc3RVVUlEPScgKyBVVUlELmdlbmVyYXRlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVjRmlsZXNVcmw7XHJcbiAgfVxyXG5cclxuICByZWNvcmRpbmdGaWxlRGVzY3JMaXN0KHByb2plY3ROYW1lOiBzdHJpbmcsIHNlc3NJZDogc3RyaW5nIHwgbnVtYmVyKTpPYnNlcnZhYmxlPEFycmF5PFJlY29yZGluZ0ZpbGVEZXNjcmlwdG9yPj4ge1xyXG4gICAgbGV0IHJlY0ZpbGVzUmVxVXJsID0gdGhpcy5yZWNGaWxlc1JlcVVybChwcm9qZWN0TmFtZSxzZXNzSWQpO1xyXG4gICAgbGV0IHdvYnMgPSB0aGlzLmh0dHAuZ2V0PEFycmF5PFJlY29yZGluZ0ZpbGVEZXNjcmlwdG9yPj4ocmVjRmlsZXNSZXFVcmwse3dpdGhDcmVkZW50aWFsczp0aGlzLndpdGhDcmVkZW50aWFsc30pO1xyXG4gICAgcmV0dXJuIHdvYnM7XHJcbiAgfVxyXG5cclxuICByZWNvcmRpbmdGaWxlTGlzdChwcm9qZWN0TmFtZTogc3RyaW5nLCBzZXNzSWQ6IHN0cmluZyB8IG51bWJlcik6T2JzZXJ2YWJsZTxBcnJheTxSZWNvcmRpbmdGaWxlPj4ge1xyXG4gICAgbGV0IHJlY0ZpbGVzUmVxVXJsID0gdGhpcy5yZWNGaWxlc1JlcVVybChwcm9qZWN0TmFtZSxzZXNzSWQpO1xyXG4gICAgbGV0IHdvYnMgPSB0aGlzLmh0dHAuZ2V0PEFycmF5PFJlY29yZGluZ0ZpbGU+PihyZWNGaWxlc1JlcVVybCx7d2l0aENyZWRlbnRpYWxzOnRoaXMud2l0aENyZWRlbnRpYWxzfSk7XHJcbiAgICByZXR1cm4gd29icztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmV0Y2hBdWRpb2ZpbGUocHJvamVjdE5hbWU6IHN0cmluZywgc2Vzc0lkOiBzdHJpbmcgfCBudW1iZXIsIGl0ZW1jb2RlOiBzdHJpbmcsdmVyc2lvbjpudW1iZXIpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4+IHtcclxuICAgIGxldCByZWNGaWxlc1VybD10aGlzLnJlY0ZpbGVzVXJsKHByb2plY3ROYW1lLHNlc3NJZCk7XHJcbiAgICBsZXQgZW5jSXRlbWNvZGU9ZW5jb2RlVVJJQ29tcG9uZW50KGl0ZW1jb2RlKTtcclxuICAgIGxldCByZWNVcmwgPSByZWNGaWxlc1VybCArICcvJyArIGVuY0l0ZW1jb2RlICsnLycrdmVyc2lvbjtcclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgICAgcmVjVXJsID0gcmVjVXJsICsgJy53YXY/cmVxdWVzdFVVSUQ9JyArIFVVSUQuZ2VuZXJhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCAnYXVkaW8vd2F2Jyk7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChyZWNVcmwsIHtcclxuICAgICAgaGVhZGVyczogaGVhZGVycyxcclxuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyxcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInLFxyXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMud2l0aENyZWRlbnRpYWxzXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBmZXRjaEFuZEFwcGx5UmVjb3JkaW5nRmlsZShhQ3R4OiBBdWRpb0NvbnRleHQsIHByb2plY3ROYW1lOiBzdHJpbmcscmVjb3JkaW5nRmlsZTpSZWNvcmRpbmdGaWxlKTpPYnNlcnZhYmxlPFJlY29yZGluZ0ZpbGV8bnVsbD4ge1xyXG5cclxuICAgIGxldCB3b2JzID0gbmV3IE9ic2VydmFibGU8UmVjb3JkaW5nRmlsZXxudWxsPihvYnNlcnZlcj0+e1xyXG4gICAgICBpZihyZWNvcmRpbmdGaWxlLnNlc3Npb24pIHtcclxuICAgICAgICBsZXQgb2JzID0gdGhpcy5mZXRjaEF1ZGlvZmlsZShwcm9qZWN0TmFtZSwgcmVjb3JkaW5nRmlsZS5zZXNzaW9uLCByZWNvcmRpbmdGaWxlLml0ZW1Db2RlLCByZWNvcmRpbmdGaWxlLnZlcnNpb24pO1xyXG4gICAgICAgIG9icy5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkZldGNoZWQgYXVkaW8gZmlsZS4gSFRUUCByZXNwb25zZSBzdGF0dXM6IFwiK3Jlc3Auc3RhdHVzK1wiLCB0eXBlOiBcIityZXNwLnR5cGUrXCIsIGJ5dGUgbGVuZ3RoOiBcIisgcmVzcC5ib2R5LmJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBEbyBub3QgdXNlIFByb21pc2UgdmVyc2lvbiwgd2hpY2ggZG9lcyBub3Qgd29yayB3aXRoIFNhZmFyaSAxMyAoMTMuMC41KVxyXG4gICAgICAgICAgICAgIGlmIChyZXNwLmJvZHkpIHtcclxuICAgICAgICAgICAgICAgIGFDdHguZGVjb2RlQXVkaW9EYXRhKHJlc3AuYm9keSwgYWIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICByZWNvcmRpbmdGaWxlLmF1ZGlvQnVmZmVyID0gYWI7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnRGVsYXkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVjb3JkaW5nRmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZGVidWdEZWxheSk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZWNvcmRpbmdGaWxlKTtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKCdGZXRjaGluZyBhdWRpbyBmaWxlOiByZXNwb25zZSBoYXMgbm8gYm9keScpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJbnRlcnByZXQgbm90IGFzIGFuIGVycm9yLCB0aGUgZmlsZSBpc3Qgbm90IHJlY29yZGVkIHlldFxyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKClcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIHN0YXRlcyBhcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIG9ic2VydmVyLmVycm9yKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB3b2JzO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hSZWNvcmRpbmdGaWxlKGFDdHg6IEF1ZGlvQ29udGV4dCwgcHJvamVjdE5hbWU6IHN0cmluZywgc2Vzc0lkOiBzdHJpbmcgfCBudW1iZXIsIGl0ZW1jb2RlOiBzdHJpbmcsdmVyc2lvbjpudW1iZXIpOk9ic2VydmFibGU8UmVjb3JkaW5nRmlsZXxudWxsPiB7XHJcblxyXG4gICAgbGV0IHdvYnMgPSBuZXcgT2JzZXJ2YWJsZTxSZWNvcmRpbmdGaWxlIHwgbnVsbD4ob2JzZXJ2ZXI9PntcclxuICAgICAgbGV0IG9icyA9IHRoaXMuZmV0Y2hBdWRpb2ZpbGUocHJvamVjdE5hbWUsIHNlc3NJZCwgaXRlbWNvZGUsdmVyc2lvbik7XHJcblxyXG5cclxuICAgICAgb2JzLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBQcm9taXNlIHZlcnNpb24sIHdoaWNoIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgMTNcclxuICAgICAgICAgIGlmKHJlc3AuYm9keSkge1xyXG4gICAgICAgICAgICBhQ3R4LmRlY29kZUF1ZGlvRGF0YShyZXNwLmJvZHksIGFiID0+IHtcclxuICAgICAgICAgICAgICBsZXQgcmYgPSBuZXcgUmVjb3JkaW5nRmlsZShzZXNzSWQsIGl0ZW1jb2RlLCB2ZXJzaW9uLCBhYik7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZGVidWdEZWxheSA+IDApIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmYpO1xyXG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSwgdGhpcy5kZWJ1Z0RlbGF5KTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZik7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICAgIC8vIEludGVycHJldCBub3QgYXMgYW4gZXJyb3IsIHRoZSBmaWxlIGlzdCBub3QgcmVjb3JkZWQgeWV0XHJcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKClcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAvLyBhbGwgb3RoZXIgc3RhdGVzIGFyZSBlcnJvcnNcclxuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHdvYnM7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuXHJcbiJdfQ==
246
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5ncy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3JlY29yZGluZ3MvcmVjb3JkaW5ncy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFnQyxXQUFXLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RixPQUFPLEVBQUMsT0FBTyxFQUFFLHFCQUFxQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBRXRGLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUN2QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQTZDLE1BQU0sY0FBYyxDQUFDO0FBQzFGLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQzs7OztBQUdoQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUMsU0FBUyxDQUFBO0FBS2xDLE1BQU0sT0FBTyxnQkFBZ0I7SUFVM0IsWUFBb0IsSUFBZ0IsRUFBeUMsTUFBNkI7UUFBdEYsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUF5QyxXQUFNLEdBQU4sTUFBTSxDQUF1QjtRQUxsRyxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUV6QyxrQ0FBa0M7UUFDMUIsZUFBVSxHQUFRLENBQUMsQ0FBQztRQUkxQixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQTtRQUVyQixJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFD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QUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3lCQUNyQjs2QkFBTTs0QkFDTCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNsQixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7eUJBQ3JCO29CQUNILENBQUMsQ0FBQyxDQUFDO2lCQUNKO3FCQUFJO29CQUNILFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDbEI7WUFDSCxDQUFDLEVBQ0QsQ0FBQyxLQUF3QixFQUFFLEVBQUU7Z0JBQzNCLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUU7b0JBQ3ZCLDJEQUEyRDtvQkFDM0QsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDcEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFBO2lCQUNwQjtxQkFBSTtvQkFDSCw4QkFBOEI7b0JBQzlCLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3RCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQkFDckI7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOztBQWpQc0IsNEJBQVcsR0FBRyxTQUFTLENBQUE7QUFDdkIsa0NBQWlCLEdBQUMsZUFBZSxDQUFBOzZHQUg3QyxnQkFBZ0IsNENBVW1CLHFCQUFxQjtpSEFWeEQsZ0JBQWdCOzJGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVU7OzBCQVc4QixNQUFNOzJCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGtsYXVzaiBvbiAxNy4wNi4yMDE3LlxyXG4gKi9cclxuaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHtBcGlUeXBlLCBTUEVFQ0hSRUNPUkRFUl9DT05GSUcsIFNwZWVjaFJlY29yZGVyQ29uZmlnfSBmcm9tIFwiLi4vLi4vc3ByLmNvbmZpZ1wiO1xyXG5cclxuaW1wb3J0IHtVVUlEfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcclxuaW1wb3J0IHtTcHJSZWNvcmRpbmdGaWxlLCBSZWNvcmRpbmdGaWxlRGVzY3JpcHRvckltcGwsIFJlY29yZGluZ0ZpbGV9IGZyb20gXCIuLi9yZWNvcmRpbmdcIjtcclxuaW1wb3J0IHtQcm9qZWN0U2VydmljZX0gZnJvbSBcIi4uL3Byb2plY3QvcHJvamVjdC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7U2Vzc2lvblNlcnZpY2V9IGZyb20gXCIuLi9zZXNzaW9uL3Nlc3Npb24uc2VydmljZVwiO1xyXG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IFJFQ19BUElfQ1RYPSdyZWNmaWxlJ1xyXG5cclxuXHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBSZWNvcmRpbmdTZXJ2aWNlIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBSRUNfQVBJX0NUWCA9ICdyZWNmaWxlJ1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUkVDT1JESU5HX0FQSV9DVFg9J3JlY29yZGluZ2ZpbGUnXHJcbiAgcHJpdmF0ZSBhcGlFbmRQb2ludDogc3RyaW5nO1xyXG4gIHByaXZhdGUgd2l0aENyZWRlbnRpYWxzOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vcHJpdmF0ZSBkZWJ1Z0RlbGF5Om51bWJlcj0xMDAwMDtcclxuICBwcml2YXRlIGRlYnVnRGVsYXk6bnVtYmVyPTA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIHByaXZhdGUgY29uZmlnPzogU3BlZWNoUmVjb3JkZXJDb25maWcpIHtcclxuXHJcbiAgICB0aGlzLmFwaUVuZFBvaW50ID0gJydcclxuXHJcbiAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5hcGlFbmRQb2ludCkge1xyXG4gICAgICB0aGlzLmFwaUVuZFBvaW50ID0gY29uZmlnLmFwaUVuZFBvaW50O1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYXBpRW5kUG9pbnQgIT09ICcnKSB7XHJcbiAgICAgIHRoaXMuYXBpRW5kUG9pbnQgPSB0aGlzLmFwaUVuZFBvaW50ICsgJy8nXHJcbiAgICB9XHJcbiAgICBpZiAoY29uZmlnICE9IG51bGwgJiYgY29uZmlnLndpdGhDcmVkZW50aWFscyAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gY29uZmlnLndpdGhDcmVkZW50aWFscztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVjb3JkaW5nRmlsZXNVcmwoKTpzdHJpbmd7XHJcbiAgICBsZXQgcmVjRmlsZXNVcmwgPSB0aGlzLmFwaUVuZFBvaW50ICArIFJlY29yZGluZ1NlcnZpY2UuUkVDT1JESU5HX0FQSV9DVFg7XHJcbiAgICByZXR1cm4gcmVjRmlsZXNVcmw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlc3Npb25SZWNvcmRpbmdGaWxlc1VybChwcm9qZWN0TmFtZTogc3RyaW5nLCBzZXNzSWQ6IHN0cmluZyB8IG51bWJlcik6c3RyaW5ne1xyXG4gICAgbGV0IGVuY1Byak5hbWU9ZW5jb2RlVVJJQ29tcG9uZW50KHByb2plY3ROYW1lKTtcclxuICAgIGxldCBlbmNTZXNzSWQ9ZW5jb2RlVVJJQ29tcG9uZW50KHNlc3NJZCk7XHJcbiAgICBsZXQgcmVjRmlsZXNVcmwgPSB0aGlzLmFwaUVuZFBvaW50ICsgUHJvamVjdFNlcnZpY2UuUFJPSkVDVF9BUElfQ1RYICsgJy8nICsgZW5jUHJqTmFtZSArICcvJyArXHJcbiAgICAgIFNlc3Npb25TZXJ2aWNlLlNFU1NJT05fQVBJX0NUWCArICcvJyArIGVuY1Nlc3NJZCArICcvJyArIFJlY29yZGluZ1NlcnZpY2UuUkVDT1JESU5HX0FQSV9DVFg7XHJcbiAgICByZXR1cm4gcmVjRmlsZXNVcmw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlc3Npb25SZWNGaWxlc1VybChwcm9qZWN0TmFtZTogc3RyaW5nLCBzZXNzSWQ6IHN0cmluZyB8IG51bWJlcik6c3RyaW5ne1xyXG4gICAgbGV0IGVuY1Byak5hbWU9ZW5jb2RlVVJJQ29tcG9uZW50KHByb2plY3ROYW1lKTtcclxuICAgIGxldCBlbmNTZXNzSWQ9ZW5jb2RlVVJJQ29tcG9uZW50KHNlc3NJZCk7XHJcbiAgICBsZXQgcmVjRmlsZXNVcmwgPSB0aGlzLmFwaUVuZFBvaW50ICsgUHJvamVjdFNlcnZpY2UuUFJPSkVDVF9BUElfQ1RYICsgJy8nICsgZW5jUHJqTmFtZSArICcvJyArXHJcbiAgICAgICAgU2Vzc2lvblNlcnZpY2UuU0VTU0lPTl9BUElfQ1RYICsgJy8nICsgZW5jU2Vzc0lkICsgJy8nICsgUmVjb3JkaW5nU2VydmljZS5SRUNfQVBJX0NUWDtcclxuICAgIHJldHVybiByZWNGaWxlc1VybDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2Vzc2lvblJlY0ZpbGVzUmVxVXJsKHByb2plY3ROYW1lOiBzdHJpbmcsIHNlc3NJZDogc3RyaW5nIHwgbnVtYmVyKTpzdHJpbmd7XHJcbiAgICBsZXQgcmVjRmlsZXNVcmw9dGhpcy5zZXNzaW9uUmVjRmlsZXNVcmwocHJvamVjdE5hbWUsc2Vzc0lkKTtcclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgICAgcmVjRmlsZXNVcmwgPSByZWNGaWxlc1VybCArICcuanNvbj9yZXF1ZXN0VVVJRD0nICsgVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlY0ZpbGVzVXJsO1xyXG4gIH1cclxuXHJcbiAgcmVjb3JkaW5nRmlsZURlc2NyTGlzdChwcm9qZWN0TmFtZTogc3RyaW5nLCBzZXNzSWQ6IHN0cmluZyB8IG51bWJlcik6T2JzZXJ2YWJsZTxBcnJheTxSZWNvcmRpbmdGaWxlRGVzY3JpcHRvckltcGw+PiB7XHJcbiAgICBsZXQgcmVjRmlsZXNSZXFVcmwgPSB0aGlzLnNlc3Npb25SZWNGaWxlc1JlcVVybChwcm9qZWN0TmFtZSxzZXNzSWQpO1xyXG4gICAgbGV0IHdvYnMgPSB0aGlzLmh0dHAuZ2V0PEFycmF5PFJlY29yZGluZ0ZpbGVEZXNjcmlwdG9ySW1wbD4+KHJlY0ZpbGVzUmVxVXJsLHt3aXRoQ3JlZGVudGlhbHM6dGhpcy53aXRoQ3JlZGVudGlhbHN9KTtcclxuICAgIHJldHVybiB3b2JzO1xyXG4gIH1cclxuXHJcbiAgcmVjb3JkaW5nRmlsZUxpc3QocHJvamVjdE5hbWU6IHN0cmluZywgc2Vzc0lkOiBzdHJpbmcgfCBudW1iZXIpOk9ic2VydmFibGU8QXJyYXk8UmVjb3JkaW5nRmlsZT4+IHtcclxuICAgIGxldCByZWNGaWxlc1JlcVVybCA9IHRoaXMuc2Vzc2lvblJlY0ZpbGVzUmVxVXJsKHByb2plY3ROYW1lLHNlc3NJZCk7XHJcbiAgICBsZXQgd29icyA9IHRoaXMuaHR0cC5nZXQ8QXJyYXk8UmVjb3JkaW5nRmlsZT4+KHJlY0ZpbGVzUmVxVXJsLHt3aXRoQ3JlZGVudGlhbHM6dGhpcy53aXRoQ3JlZGVudGlhbHN9KTtcclxuICAgIHJldHVybiB3b2JzO1xyXG4gIH1cclxuXHJcbiAgc3ByUmVjb3JkaW5nRmlsZUxpc3QocHJvamVjdE5hbWU6IHN0cmluZywgc2Vzc0lkOiBzdHJpbmcgfCBudW1iZXIpOk9ic2VydmFibGU8QXJyYXk8U3ByUmVjb3JkaW5nRmlsZT4+IHtcclxuICAgIGxldCByZWNGaWxlc1JlcVVybCA9IHRoaXMuc2Vzc2lvblJlY0ZpbGVzUmVxVXJsKHByb2plY3ROYW1lLHNlc3NJZCk7XHJcbiAgICBsZXQgd29icyA9IHRoaXMuaHR0cC5nZXQ8QXJyYXk8U3ByUmVjb3JkaW5nRmlsZT4+KHJlY0ZpbGVzUmVxVXJsLHt3aXRoQ3JlZGVudGlhbHM6dGhpcy53aXRoQ3JlZGVudGlhbHN9KTtcclxuICAgIHJldHVybiB3b2JzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhdWRpb1JlcXVlc3QoYXVkaW9Vcmw6c3RyaW5nKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXJyYXlCdWZmZXI+PiB7XHJcbiAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuYXBpVHlwZSA9PT0gQXBpVHlwZS5GSUxFUykge1xyXG4gICAgICAvLyBmb3IgZGV2ZWxvcG1lbnQgYW5kIGRlbW9cclxuICAgICAgLy8gYXBwZW5kIFVVSUQgdG8gbWFrZSByZXF1ZXN0IFVSTCB1bmlxdWUgdG8gYXZvaWQgbG9jYWxob3N0IHNlcnZlciBjYWNoaW5nXHJcbiAgICAgIGF1ZGlvVXJsID0gYXVkaW9VcmwgKyAnLndhdj9yZXF1ZXN0VVVJRD0nICsgVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgfVxyXG4gICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgJ2F1ZGlvL3dhdicpO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYXVkaW9VcmwsIHtcclxuICAgICAgaGVhZGVyczogaGVhZGVycyxcclxuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyxcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInLFxyXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMud2l0aENyZWRlbnRpYWxzXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZldGNoQXVkaW9maWxlKHByb2plY3ROYW1lOiBzdHJpbmcsIHNlc3NJZDogc3RyaW5nIHwgbnVtYmVyLCByZWNGaWxlSWQ6IHN0cmluZ3xudW1iZXIpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4+IHtcclxuICAgIGxldCByZWNGaWxlc1VybD10aGlzLnNlc3Npb25SZWNvcmRpbmdGaWxlc1VybChwcm9qZWN0TmFtZSxzZXNzSWQpO1xyXG4gICAgbGV0IGVuY1JlY0ZpbGVJZD1lbmNvZGVVUklDb21wb25lbnQocmVjRmlsZUlkKTtcclxuICAgIGxldCByZWNVcmwgPSByZWNGaWxlc1VybCArICcvJyArIGVuY1JlY0ZpbGVJZDtcclxuICAgIHJldHVybiB0aGlzLmF1ZGlvUmVxdWVzdChyZWNVcmwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmZXRjaFNwckF1ZGlvZmlsZShwcm9qZWN0TmFtZTogc3RyaW5nLCBzZXNzSWQ6IHN0cmluZyB8IG51bWJlciwgaXRlbWNvZGU6IHN0cmluZyx2ZXJzaW9uOm51bWJlcik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFycmF5QnVmZmVyPj4ge1xyXG4gICAgbGV0IHJlY0ZpbGVzVXJsPXRoaXMuc2Vzc2lvblJlY0ZpbGVzVXJsKHByb2plY3ROYW1lLHNlc3NJZCk7XHJcbiAgICBsZXQgZW5jSXRlbWNvZGU9ZW5jb2RlVVJJQ29tcG9uZW50KGl0ZW1jb2RlKTtcclxuICAgIGxldCByZWNVcmwgPSByZWNGaWxlc1VybCArICcvJyArIGVuY0l0ZW1jb2RlICsnLycrdmVyc2lvbjtcclxuICAgIHJldHVybiB0aGlzLmF1ZGlvUmVxdWVzdChyZWNVcmwpO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hBbmRBcHBseVJlY29yZGluZ0ZpbGUoYUN0eDogQXVkaW9Db250ZXh0LCBwcm9qZWN0TmFtZTogc3RyaW5nLCByZWNvcmRpbmdGaWxlOlJlY29yZGluZ0ZpbGUpOk9ic2VydmFibGU8UmVjb3JkaW5nRmlsZXxudWxsPiB7XHJcblxyXG4gICAgbGV0IHdvYnMgPSBuZXcgT2JzZXJ2YWJsZTxSZWNvcmRpbmdGaWxlfG51bGw+KG9ic2VydmVyPT57XHJcbiAgICAgIGlmKHJlY29yZGluZ0ZpbGUuc2Vzc2lvbiAmJiByZWNvcmRpbmdGaWxlLnJlY29yZGluZ0ZpbGVJZCkge1xyXG4gICAgICAgIGxldCBvYnMgPSB0aGlzLmZldGNoQXVkaW9maWxlKHByb2plY3ROYW1lLCByZWNvcmRpbmdGaWxlLnNlc3Npb24sIHJlY29yZGluZ0ZpbGUucmVjb3JkaW5nRmlsZUlkKTtcclxuICAgICAgICBvYnMuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiRmV0Y2hlZCBhdWRpbyBmaWxlLiBIVFRQIHJlc3BvbnNlIHN0YXR1czogXCIrcmVzcC5zdGF0dXMrXCIsIHR5cGU6IFwiK3Jlc3AudHlwZStcIiwgYnl0ZSBsZW5ndGg6IFwiKyByZXNwLmJvZHkuYnl0ZUxlbmd0aCk7XHJcblxyXG4gICAgICAgICAgICAvLyBEbyBub3QgdXNlIFByb21pc2UgdmVyc2lvbiwgd2hpY2ggZG9lcyBub3Qgd29yayB3aXRoIFNhZmFyaSAxMyAoMTMuMC41KVxyXG4gICAgICAgICAgICBpZiAocmVzcC5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgYUN0eC5kZWNvZGVBdWRpb0RhdGEocmVzcC5ib2R5LCBhYiA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWNvcmRpbmdGaWxlLmF1ZGlvQnVmZmVyID0gYWI7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Z0RlbGF5ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVjb3JkaW5nRmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgfSwgdGhpcy5kZWJ1Z0RlbGF5KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVjb3JkaW5nRmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKCdGZXRjaGluZyBhdWRpbyBmaWxlOiByZXNwb25zZSBoYXMgbm8gYm9keScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwNCkge1xyXG4gICAgICAgICAgICAgIC8vIEludGVycHJldCBub3QgYXMgYW4gZXJyb3IsIHRoZSBmaWxlIGlzdCBub3QgcmVjb3JkZWQgeWV0XHJcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcclxuICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIHN0YXRlcyBhcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBvYnNlcnZlci5lcnJvcigpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gd29icztcclxuICB9XHJcblxyXG4gIGZldGNoQW5kQXBwbHlTcHJSZWNvcmRpbmdGaWxlKGFDdHg6IEF1ZGlvQ29udGV4dCwgcHJvamVjdE5hbWU6IHN0cmluZywgcmVjb3JkaW5nRmlsZTpTcHJSZWNvcmRpbmdGaWxlKTpPYnNlcnZhYmxlPFNwclJlY29yZGluZ0ZpbGV8bnVsbD4ge1xyXG5cclxuICAgIGxldCB3b2JzID0gbmV3IE9ic2VydmFibGU8U3ByUmVjb3JkaW5nRmlsZXxudWxsPihvYnNlcnZlcj0+e1xyXG4gICAgICBpZihyZWNvcmRpbmdGaWxlLnNlc3Npb24pIHtcclxuICAgICAgICBsZXQgb2JzID0gdGhpcy5mZXRjaFNwckF1ZGlvZmlsZShwcm9qZWN0TmFtZSwgcmVjb3JkaW5nRmlsZS5zZXNzaW9uLCByZWNvcmRpbmdGaWxlLml0ZW1Db2RlLCByZWNvcmRpbmdGaWxlLnZlcnNpb24pO1xyXG4gICAgICAgIG9icy5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIkZldGNoZWQgYXVkaW8gZmlsZS4gSFRUUCByZXNwb25zZSBzdGF0dXM6IFwiK3Jlc3Auc3RhdHVzK1wiLCB0eXBlOiBcIityZXNwLnR5cGUrXCIsIGJ5dGUgbGVuZ3RoOiBcIisgcmVzcC5ib2R5LmJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgICAvLyBEbyBub3QgdXNlIFByb21pc2UgdmVyc2lvbiwgd2hpY2ggZG9lcyBub3Qgd29yayB3aXRoIFNhZmFyaSAxMyAoMTMuMC41KVxyXG4gICAgICAgICAgICAgIGlmIChyZXNwLmJvZHkpIHtcclxuICAgICAgICAgICAgICAgIGFDdHguZGVjb2RlQXVkaW9EYXRhKHJlc3AuYm9keSwgYWIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICByZWNvcmRpbmdGaWxlLmF1ZGlvQnVmZmVyID0gYWI7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnRGVsYXkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVjb3JkaW5nRmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZGVidWdEZWxheSk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZWNvcmRpbmdGaWxlKTtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKCdGZXRjaGluZyBhdWRpbyBmaWxlOiByZXNwb25zZSBoYXMgbm8gYm9keScpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJbnRlcnByZXQgbm90IGFzIGFuIGVycm9yLCB0aGUgZmlsZSBpc3Qgbm90IHJlY29yZGVkIHlldFxyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKClcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIHN0YXRlcyBhcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIG9ic2VydmVyLmVycm9yKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB3b2JzO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hSZWNvcmRpbmdGaWxlKGFDdHg6IEF1ZGlvQ29udGV4dCwgcHJvamVjdE5hbWU6IHN0cmluZywgc2Vzc0lkOiBzdHJpbmcgfCBudW1iZXIsIGl0ZW1jb2RlOiBzdHJpbmcsdmVyc2lvbjpudW1iZXIpOk9ic2VydmFibGU8U3ByUmVjb3JkaW5nRmlsZXxudWxsPiB7XHJcblxyXG4gICAgbGV0IHdvYnMgPSBuZXcgT2JzZXJ2YWJsZTxTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbD4ob2JzZXJ2ZXI9PntcclxuICAgICAgbGV0IG9icyA9IHRoaXMuZmV0Y2hTcHJBdWRpb2ZpbGUocHJvamVjdE5hbWUsIHNlc3NJZCwgaXRlbWNvZGUsdmVyc2lvbik7XHJcblxyXG5cclxuICAgICAgb2JzLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBQcm9taXNlIHZlcnNpb24sIHdoaWNoIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgMTNcclxuICAgICAgICAgIGlmKHJlc3AuYm9keSkge1xyXG4gICAgICAgICAgICBhQ3R4LmRlY29kZUF1ZGlvRGF0YShyZXNwLmJvZHksIGFiID0+IHtcclxuICAgICAgICAgICAgICBsZXQgcmYgPSBuZXcgU3ByUmVjb3JkaW5nRmlsZShzZXNzSWQsIGl0ZW1jb2RlLCB2ZXJzaW9uLCBhYik7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZGVidWdEZWxheSA+IDApIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmYpO1xyXG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSwgdGhpcy5kZWJ1Z0RlbGF5KTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZik7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICAgIC8vIEludGVycHJldCBub3QgYXMgYW4gZXJyb3IsIHRoZSBmaWxlIGlzdCBub3QgcmVjb3JkZWQgeWV0XHJcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XHJcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKClcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAvLyBhbGwgb3RoZXIgc3RhdGVzIGFyZSBlcnJvcnNcclxuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHdvYnM7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuXHJcbiJdfQ==