@wireio/shared 1.0.47 → 1.0.49

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.
@@ -67,6 +67,10 @@ export declare class PushLogRecordsAppender<Record extends LogRecord = LogRecord
67
67
  * Force an immediate flush
68
68
  */
69
69
  forceFlush(): Promise<void>;
70
+ /**
71
+ * Enforce the pending queue cap by dropping the oldest records.
72
+ */
73
+ private trimPendingRecordsToQueueCap;
70
74
  /**
71
75
  * Clean up resources
72
76
  */
@@ -1 +1 @@
1
- {"version":3,"file":"PushLogRecordsAppender.d.ts","sourceRoot":"","sources":["../../../../../src/logging/appenders/push/PushLogRecordsAppender.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,eAAe,CAAA;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAa5C,UAAU,uCAAuC;IAC/C,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED;;;GAGG;AACH,qBAAa,+BAAgC,SAAQ,aAAa,CAAC,uCAAuC,CAAC;aAK7E,WAAW,EAAE,MAAM;IAJ/C,OAAO,CAAC,YAAY,CAA6C;IACjE,OAAO,CAAC,kBAAkB,CAA8B;IACxD,OAAO,CAAC,oBAAoB,CAAsB;gBAEtB,WAAW,EAAE,MAAM;IAI/C;;OAEG;IACH,cAAc,IAAI,OAAO;IAczB;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAoB3C;;OAEG;IACH,YAAY,IAAI,IAAI;IAkBpB;;OAEG;YACW,gBAAgB;IAoC9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,OAAO,IAAI,IAAI;CAahB;AAED;;;GAGG;AACH,qBAAa,sBAAsB,CAAC,MAAM,SAAS,SAAS,GAAG,SAAS,CAAE,YAAW,QAAQ,CAAC,MAAM,CAAC;aAOvE,WAAW,EAAE,MAAM;IAN/C,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,UAAU,CAA6C;IAE/D,SAAgB,iBAAiB,EAAE,+BAA+B,CAAA;gBAEtC,WAAW,EAAE,MAAM;IAa/C;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IA6B5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;YACW,KAAK;IAyDnB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC;;OAEG;IACH,OAAO,IAAI,IAAI;CAehB;AAED,eAAe,sBAAsB,CAAA"}
1
+ {"version":3,"file":"PushLogRecordsAppender.d.ts","sourceRoot":"","sources":["../../../../../src/logging/appenders/push/PushLogRecordsAppender.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,eAAe,CAAA;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAa5C,UAAU,uCAAuC;IAC/C,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED;;;GAGG;AACH,qBAAa,+BAAgC,SAAQ,aAAa,CAAC,uCAAuC,CAAC;aAK7E,WAAW,EAAE,MAAM;IAJ/C,OAAO,CAAC,YAAY,CAA6C;IACjE,OAAO,CAAC,kBAAkB,CAA8B;IACxD,OAAO,CAAC,oBAAoB,CAAsB;gBAEtB,WAAW,EAAE,MAAM;IAI/C;;OAEG;IACH,cAAc,IAAI,OAAO;IAczB;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAoB3C;;OAEG;IACH,YAAY,IAAI,IAAI;IAkBpB;;OAEG;YACW,gBAAgB;IAsC9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,OAAO,IAAI,IAAI;CAahB;AAED;;;GAGG;AACH,qBAAa,sBAAsB,CACjC,MAAM,SAAS,SAAS,GAAG,SAAS,CACpC,YAAW,QAAQ,CAAC,MAAM,CAAC;aAOC,WAAW,EAAE,MAAM;IAN/C,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,UAAU,CAA6C;IAE/D,SAAgB,iBAAiB,EAAE,+BAA+B,CAAA;gBAEtC,WAAW,EAAE,MAAM;IAa/C;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAsB5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;YACW,KAAK;IA0DnB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAQpC;;OAEG;IACH,OAAO,IAAI,IAAI;CAehB;AAED,eAAe,sBAAsB,CAAA"}
@@ -92,9 +92,9 @@ class PushLogRecordsCredentialManager extends eventemitter3_1.default {
92
92
  mode: "cors",
93
93
  credentials: "include",
94
94
  headers: {
95
- "Content-Type": "application/json",
95
+ "Content-Type": "application/json"
96
96
  },
97
- body: JSON.stringify({}),
97
+ body: JSON.stringify({})
98
98
  });
99
99
  if (!response.ok) {
100
100
  throw new Error(`Credential request failed with status ${response.status}`);
@@ -172,20 +172,15 @@ class PushLogRecordsAppender {
172
172
  * Append a log record to the queue
173
173
  */
174
174
  append(record) {
175
- // Enforce max queue size by removing oldest records
176
- const pendingCount = this.pendingRecords.length + 1;
177
- const removeCount = pendingCount - LOG_QUEUE_MAX_RECORDS;
178
- if (removeCount > 0) {
179
- this.pendingRecords.splice(0, removeCount);
180
- }
181
175
  // Add the record with enriched metadata
182
176
  this.pendingRecords.push({
183
177
  timestamp: Date.now(),
184
178
  ...record,
185
179
  app: record.app && record.app.length > 0 ? record.app : "UNKNOWN",
186
180
  env: record.env && record.env.length > 0 ? record.env : "UNKNOWN",
187
- url: typeof window === "undefined" ? "local://" : window.location.href,
181
+ url: typeof window === "undefined" ? "local://" : window.location.href
188
182
  });
183
+ this.trimPendingRecordsToQueueCap();
189
184
  // Check if we should flush immediately due to queue depth
190
185
  if (this.pendingRecords.length >= FLUSH_QUEUE_DEPTH) {
191
186
  this.flush().catch(() => {
@@ -241,11 +236,12 @@ class PushLogRecordsAppender {
241
236
  headers: {
242
237
  "Content-Type": "application/json"
243
238
  },
244
- body: JSON.stringify(payload),
239
+ body: JSON.stringify(payload)
245
240
  });
246
241
  if (!response.ok) {
247
242
  // Re-queue records on failure
248
243
  this.pendingRecords.unshift(...records);
244
+ this.trimPendingRecordsToQueueCap();
249
245
  throw new Error(`Push failed with status ${response.status}`);
250
246
  }
251
247
  deferred.resolve();
@@ -273,6 +269,15 @@ class PushLogRecordsAppender {
273
269
  }
274
270
  return this.flush();
275
271
  }
272
+ /**
273
+ * Enforce the pending queue cap by dropping the oldest records.
274
+ */
275
+ trimPendingRecordsToQueueCap() {
276
+ const removeCount = this.pendingRecords.length - LOG_QUEUE_MAX_RECORDS;
277
+ if (removeCount > 0) {
278
+ this.pendingRecords.splice(0, removeCount);
279
+ }
280
+ }
276
281
  /**
277
282
  * Clean up resources
278
283
  */
@@ -291,4 +296,4 @@ class PushLogRecordsAppender {
291
296
  }
292
297
  exports.PushLogRecordsAppender = PushLogRecordsAppender;
293
298
  exports.default = PushLogRecordsAppender;
294
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHVzaExvZ1JlY29yZHNBcHBlbmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sb2dnaW5nL2FwcGVuZGVycy9wdXNoL1B1c2hMb2dSZWNvcmRzQXBwZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsK0NBQStDO0FBQy9DLGtFQUF5QztBQUN6Qyx3REFBb0Q7QUFHcEQsK0RBQTJEO0FBRTNELG1EQUFtRDtBQUNuRCxNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFBLENBQUMsYUFBYTtBQUN4RCxNQUFNLHdCQUF3QixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFBLENBQUMsc0NBQXNDO0FBQ3JGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFBO0FBQzlCLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQSxDQUFDLGFBQWE7QUFDaEQsTUFBTSxxQkFBcUIsR0FBRyxLQUFLLENBQUE7QUFDbkMsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFBO0FBRWxDLE1BQU0sR0FBRyxHQUFHLElBQUEscUNBQWlCLEdBQUUsQ0FBQTtBQU8vQjs7O0dBR0c7QUFDSCxNQUFhLCtCQUFnQyxTQUFRLHVCQUFzRDtJQUs3RTtJQUpwQixZQUFZLEdBQXlDLElBQUksQ0FBQTtJQUN6RCxrQkFBa0IsR0FBMEIsSUFBSSxDQUFBO0lBQ2hELG9CQUFvQixHQUFrQixJQUFJLENBQUE7SUFFbEQsWUFBNEIsV0FBbUI7UUFDN0MsS0FBSyxFQUFFLENBQUE7UUFEbUIsZ0JBQVcsR0FBWCxXQUFXLENBQVE7SUFFL0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMvQixPQUFPLEtBQUssQ0FBQTtRQUNkLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJ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LEVBQUUsQ0FBQztZQUNwQixZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFBO1FBQ3hCLENBQUM7UUFFRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUE7UUFFaEMsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQTtRQUM1RCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7UUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUE7SUFDMUIsQ0FBQztDQUNGO0FBOUpELHdEQThKQztBQUVELGtCQUFlLHNCQUFzQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgdHlwZXNjcmlwdC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCBFdmVudEVtaXR0ZXIzIGZyb20gXCJldmVudGVtaXR0ZXIzXCJcbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSBcIi4uLy4uLy4uL2hlbHBlcnMvaW5kZXguanNcIlxuaW1wb3J0IHsgTG9nUmVjb3JkIH0gZnJvbSBcIi4uLy4uL0xvZ1JlY29yZC5qc1wiXG5pbXBvcnQgeyBBcHBlbmRlciB9IGZyb20gXCIuLi8uLi9BcHBlbmRlci5qc1wiXG5pbXBvcnQgeyBnZXRJbnRlcm5hbExvZ2dlciB9IGZyb20gXCIuLi8uLi9JbnRlcm5hbExvZ2dlci5qc1wiXG5cbi8vIENvbnN0YW50cyBmb3IgdHVuaW5nIChhZGp1c3RhYmxlIGluIGRldmVsb3BtZW50KVxuY29uc3QgQ09PS0lFX0VYUElSQVRJT05fTVMgPSA1ICogNjAgKiAxMDAwIC8vIDMwIG1pbnV0ZXNcbmNvbnN0IENPT0tJRV9SRUZSRVNIX0JVRkZFUl9NUyA9IDIgKiA2MCAqIDEwMDAgLy8gUmVmcmVzaCAyIG1pbnV0ZXMgYmVmb3JlIGV4cGlyYXRpb25cbmNvbnN0IEZMVVNIX1FVRVVFX0RFUFRIID0gMTAwMFxuY29uc3QgRkxVU0hfSU5URVJWQUxfTVMgPSA1ICogMTAwMCAvLyAxMCBzZWNvbmRzXG5jb25zdCBMT0dfUVVFVUVfTUFYX1JFQ09SRFMgPSAxMDAwMFxuY29uc3QgQ09PS0lFX05BTUUgPSBcIndpcmVfbG9nc19pZFwiXG5cbmNvbnN0IGxvZyA9IGdldEludGVybmFsTG9nZ2VyKClcblxuaW50ZXJmYWNlIFB1c2hMb2dSZWNvcmRzQ3JlZGVudGlhbE1hbmFnZXJFdmVudE1hcCB7XG4gIHJlY2VpdmVkOiAoKSA9PiB2b2lkXG4gIGV4cGlyZWQ6ICgpID0+IHZvaWRcbn1cblxuLyoqXG4gKiBNYW5hZ2VzIGNyZWRlbnRpYWwgY29va2llIGZvciBQdXNoTG9nUmVjb3Jkc0FwcGVuZGVyLlxuICogSW52b2tlcyB0aGUgZW5kcG9pbnQgdmlhIFBPU1QgdG8gb2J0YWluIGEgc2Vzc2lvbiBjb29raWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBQdXNoTG9nUmVjb3Jkc0NyZWRlbnRpYWxNYW5hZ2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyMzxQdXNoTG9nUmVjb3Jkc0NyZWRlbnRpYWxNYW5hZ2VyRXZlbnRNYXA+IHtcbiAgcHJpdmF0ZSByZWZyZXNoVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBjcmVkZW50aWFsRGVmZXJyZWQ6IERlZmVycmVkPHZvaWQ+IHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBjb29raWVFeHBpcmF0aW9uVGltZTogbnVtYmVyIHwgbnVsbCA9IG51bGxcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnRVcmw6IHN0cmluZykge1xuICAgIHN1cGVyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB2YWxpZCBjcmVkZW50aWFscyBleGlzdFxuICAgKi9cbiAgaGFzQ3JlZGVudGlhbHMoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvb2tpZUV4cGlyYXRpb25UaW1lKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoRGF0ZS5ub3coKSA+PSB0aGlzLmNvb2tpZUV4cGlyYXRpb25UaW1lKSB7XG4gICAgICB0aGlzLmNvb2tpZUV4cGlyYXRpb25UaW1lID0gbnVsbFxuICAgICAgdGhpcy5lbWl0KFwiZXhwaXJlZFwiKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3JlZGVudGlhbHMsIGZldGNoaW5nIHRoZW0gaWYgbmVjZXNzYXJ5XG4gICAqL1xuICBhc3luYyBlbnN1cmVDcmVkZW50aWFscygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBJZiB3ZSBoYXZlIHZhbGlkIGNyZWRlbnRpYWxzLCByZXR1cm4gaW1tZWRpYXRlbHlcbiAgICBpZiAodGhpcy5oYXNDcmVkZW50aWFscygpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIElmIGEgZmV0Y2ggaXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2FpdCBmb3IgaXRcbiAgICBpZiAodGhpcy5jcmVkZW50aWFsRGVmZXJyZWQgJiYgIXRoaXMuY3JlZGVudGlhbERlZmVycmVkLmlzU2V0dGxlZCgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZC5wcm9taXNlXG4gICAgICAgIHJldHVybiB0aGlzLmhhc0NyZWRlbnRpYWxzKClcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGZXRjaCBuZXcgY3JlZGVudGlhbHNcbiAgICByZXR1cm4gdGhpcy5mZXRjaENyZWRlbnRpYWxzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSByZWZyZXNoIG9mIGNyZWRlbnRpYWxzXG4gICAqL1xuICBmb3JjZVJlZnJlc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVmcmVzaFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWZyZXNoVGltZXIpXG4gICAgICB0aGlzLnJlZnJlc2hUaW1lciA9IG51bGxcbiAgICB9XG5cbiAgICB0aGlzLmNvb2tpZUV4cGlyYXRpb25UaW1lID0gbnVsbFxuXG4gICAgaWYgKHRoaXMuY3JlZGVudGlhbERlZmVycmVkICYmICF0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZC5pc1NldHRsZWQoKSkge1xuICAgICAgdGhpcy5jcmVkZW50aWFsRGVmZXJyZWQucmVqZWN0KG5ldyBFcnJvcihcIkZvcmNlIHJlZnJlc2ggcmVxdWVzdGVkXCIpKVxuICAgIH1cbiAgICB0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZCA9IG51bGxcblxuICAgIHRoaXMuZmV0Y2hDcmVkZW50aWFscygpLmNhdGNoKCgpID0+IHtcbiAgICAgIC8vIElnbm9yZSBlcnJvcnMgZHVyaW5nIGZvcmNlIHJlZnJlc2gsIHRoZXknbGwgYmUgaGFuZGxlZCBvbiBuZXh0IHJlcXVlc3RcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGNyZWRlbnRpYWxzIGZyb20gdGhlIGVuZHBvaW50XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoQ3JlZGVudGlhbHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZGVmZXJyZWQgPSAodGhpcy5jcmVkZW50aWFsRGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQ8dm9pZD4oKSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHRoaXMuZW5kcG9pbnRVcmwsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgbW9kZTogXCJjb3JzXCIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7fSksXG4gICAgICB9KVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ3JlZGVudGlhbCByZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgICAgfVxuXG4gICAgICAvLyBDb29raWUgaXMgc2V0IGJ5IFNldC1Db29raWUgaGVhZGVyLCB3ZSBqdXN0IG5lZWQgdG8gdHJhY2sgZXhwaXJhdGlvblxuICAgICAgdGhpcy5jb29raWVFeHBpcmF0aW9uVGltZSA9IERhdGUubm93KCkgKyBDT09LSUVfRVhQSVJBVElPTl9NU1xuXG4gICAgICAvLyBTY2hlZHVsZSByZWZyZXNoIGJlZm9yZSBleHBpcmF0aW9uXG4gICAgICB0aGlzLnNjaGVkdWxlUmVmcmVzaCgpXG5cbiAgICAgIGRlZmVycmVkLnJlc29sdmUoKVxuICAgICAgdGhpcy5lbWl0KFwicmVjZWl2ZWRcIilcblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKFwiRmFpbGVkIHRvIGZldGNoIHB1c2ggbG9nIGNyZWRlbnRpYWxzXCIsIGVycilcbiAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpXG4gICAgICB0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZCA9IG51bGxcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY2hlZHVsZSBhIGNyZWRlbnRpYWwgcmVmcmVzaCBiZWZvcmUgZXhwaXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlZnJlc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVmcmVzaFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWZyZXNoVGltZXIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVmcmVzaEluID0gQ09PS0lFX0VYUElSQVRJT05fTVMgLSBDT09LSUVfUkVGUkVTSF9CVUZGRVJfTVNcbiAgICB0aGlzLnJlZnJlc2hUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jcmVkZW50aWFsRGVmZXJyZWQgPSBudWxsXG4gICAgICB0aGlzLmZldGNoQ3JlZGVudGlhbHMoKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIExvZyBidXQgZG9uJ3QgdGhyb3cgLSB3aWxsIHJldHJ5IG9uIG5leHQgcmVxdWVzdFxuICAgICAgICBsb2cuZGVidWcoXCJTY2hlZHVsZWQgY3JlZGVudGlhbCByZWZyZXNoIGZhaWxlZFwiKVxuICAgICAgfSlcbiAgICB9LCByZWZyZXNoSW4pXG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgcmVzb3VyY2VzXG4gICAqL1xuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVmcmVzaFRpbWVyKVxuICAgICAgdGhpcy5yZWZyZXNoVGltZXIgPSBudWxsXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY3JlZGVudGlhbERlZmVycmVkICYmICF0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZC5pc1NldHRsZWQoKSkge1xuICAgICAgdGhpcy5jcmVkZW50aWFsRGVmZXJyZWQucmVqZWN0KG5ldyBFcnJvcihcIkNyZWRlbnRpYWwgbWFuYWdlciBkZXN0cm95ZWRcIikpXG4gICAgfVxuXG4gICAgdGhpcy5jcmVkZW50aWFsRGVmZXJyZWQgPSBudWxsXG4gICAgdGhpcy5jb29raWVFeHBpcmF0aW9uVGltZSA9IG51bGxcbiAgfVxufVxuXG4vKipcbiAqIEFwcGVuZGVyIHRoYXQgcHVzaGVzIGxvZyByZWNvcmRzIHRvIGEgcmVtb3RlIGVuZHBvaW50IHZpYSBIVFRQIFBVVC5cbiAqIEJhdGNoZXMgcmVjb3JkcyBhbmQgc2VuZHMgd2hlbiBxdWV1ZSByZWFjaGVzIEZMVVNIX1FVRVVFX0RFUFRIIG9yIEZMVVNIX0lOVEVSVkFMX01TIGhhcyBlbGFwc2VkLlxuICovXG5leHBvcnQgY2xhc3MgUHVzaExvZ1JlY29yZHNBcHBlbmRlcjxSZWNvcmQgZXh0ZW5kcyBMb2dSZWNvcmQgPSBMb2dSZWNvcmQ+IGltcGxlbWVudHMgQXBwZW5kZXI8UmVjb3JkPiB7XG4gIHByaXZhdGUgcGVuZGluZ1JlY29yZHM6IExvZ1JlY29yZFtdID0gW11cbiAgcHJpdmF0ZSBmbHVzaERlZmVycmVkOiBEZWZlcnJlZDx2b2lkPiB8IG51bGwgPSBudWxsXG4gIHByaXZhdGUgZmx1c2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbFxuXG4gIHB1YmxpYyByZWFkb25seSBjcmVkZW50aWFsTWFuYWdlcjogUHVzaExvZ1JlY29yZHNDcmVkZW50aWFsTWFuYWdlclxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBlbmRwb2ludFVybDogc3RyaW5nKSB7XG4gICAgdGhpcy5jcmVkZW50aWFsTWFuYWdlciA9IG5ldyBQdXNoTG9nUmVjb3Jkc0NyZWRlbnRpYWxNYW5hZ2VyKGVuZHBvaW50VXJsKVxuXG4gICAgdGhpcy5jcmVkZW50aWFsTWFuYWdlci5vbihcInJlY2VpdmVkXCIsICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5wZW5kaW5nUmVjb3Jkcy5sZW5ndGggfHwgdGhpcy5mbHVzaERlZmVycmVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgdGhpcy5mbHVzaCgpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gRXJyb3JzIGhhbmRsZWQgaW4gZmx1c2hcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmQgYSBsb2cgcmVjb3JkIHRvIHRoZSBxdWV1ZVxuICAgKi9cbiAgYXBwZW5kKHJlY29yZDogUmVjb3JkKTogdm9pZCB7XG4gICAgLy8gRW5mb3JjZSBtYXggcXVldWUgc2l6ZSBieSByZW1vdmluZyBvbGRlc3QgcmVjb3Jkc1xuICAgIGNvbnN0IHBlbmRpbmdDb3VudCA9IHRoaXMucGVuZGluZ1JlY29yZHMubGVuZ3RoICsgMVxuICAgIGNvbnN0IHJlbW92ZUNvdW50ID0gcGVuZGluZ0NvdW50IC0gTE9HX1FVRVVFX01BWF9SRUNPUkRTXG5cbiAgICBpZiAocmVtb3ZlQ291bnQgPiAwKSB7XG4gICAgICB0aGlzLnBlbmRpbmdSZWNvcmRzLnNwbGljZSgwLCByZW1vdmVDb3VudClcbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIHJlY29yZCB3aXRoIGVucmljaGVkIG1ldGFkYXRhXG4gICAgdGhpcy5wZW5kaW5nUmVjb3Jkcy5wdXNoKHtcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIC4uLnJlY29yZCxcbiAgICAgIGFwcDogcmVjb3JkLmFwcCAmJiByZWNvcmQuYXBwLmxlbmd0aCA+IDAgPyByZWNvcmQuYXBwIDogXCJVTktOT1dOXCIsXG4gICAgICBlbnY6IHJlY29yZC5lbnYgJiYgcmVjb3JkLmVudi5sZW5ndGggPiAwID8gcmVjb3JkLmVudiA6IFwiVU5LTk9XTlwiLFxuICAgICAgdXJsOiB0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiID8gXCJsb2NhbDovL1wiIDogd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgfSlcblxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBmbHVzaCBpbW1lZGlhdGVseSBkdWUgdG8gcXVldWUgZGVwdGhcbiAgICBpZiAodGhpcy5wZW5kaW5nUmVjb3Jkcy5sZW5ndGggPj0gRkxVU0hfUVVFVUVfREVQVEgpIHtcbiAgICAgIHRoaXMuZmx1c2goKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIEVycm9ycyBoYW5kbGVkIGluIGZsdXNoXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTY2hlZHVsZSBhIGZsdXNoIGlmIG5vdCBhbHJlYWR5IHNjaGVkdWxlZFxuICAgICAgdGhpcy5zY2hlZHVsZUZsdXNoKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2NoZWR1bGUgYSBmbHVzaCBhZnRlciB0aGUgaW50ZXJ2YWxcbiAgICovXG4gIHByaXZhdGUgc2NoZWR1bGVGbHVzaCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mbHVzaFRpbWVyKSB7XG4gICAgICByZXR1cm4gLy8gQWxyZWFkeSBzY2hlZHVsZWRcbiAgICB9XG5cbiAgICB0aGlzLmZsdXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZmx1c2hUaW1lciA9IG51bGxcbiAgICAgIHRoaXMuZmx1c2goKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIEVycm9ycyBoYW5kbGVkIGluIGZsdXNoXG4gICAgICB9KVxuICAgIH0sIEZMVVNIX0lOVEVSVkFMX01TKVxuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHBlbmRpbmcgcmVjb3JkcyB0byB0aGUgZW5kcG9pbnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gUHJldmVudCBjb25jdXJyZW50IGZsdXNoZXNcbiAgICBpZiAodGhpcy5mbHVzaERlZmVycmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5mbHVzaERlZmVycmVkLnByb21pc2VcbiAgICB9XG5cbiAgICAvLyBOb3RoaW5nIHRvIGZsdXNoXG4gICAgaWYgKCF0aGlzLnBlbmRpbmdSZWNvcmRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHdlIGhhdmUgdmFsaWQgY3JlZGVudGlhbHNcbiAgICBjb25zdCBoYXNDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuY3JlZGVudGlhbE1hbmFnZXIuZW5zdXJlQ3JlZGVudGlhbHMoKVxuICAgIGlmICghaGFzQ3JlZGVudGlhbHMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhcIkZhaWxlZCB0byBwdXNoIGxvZyByZWNvcmRzXCIsIFwiTm8gdmFsaWQgY3JlZGVudGlhbHMgYXZhaWxhYmxlXCIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBkZWZlcnJlZCA9ICh0aGlzLmZsdXNoRGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQ8dm9pZD4oKSlcblxuICAgIHRyeSB7XG4gICAgICAvLyBUYWtlIGFsbCBwZW5kaW5nIHJlY29yZHMgZm9yIHRoaXMgZmx1c2hcbiAgICAgIGNvbnN0IHJlY29yZHMgPSB0aGlzLnBlbmRpbmdSZWNvcmRzLnNwbGljZSgwLCB0aGlzLnBlbmRpbmdSZWNvcmRzLmxlbmd0aClcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7IHJlY29yZHM6IHJlY29yZHMubWFwKHJlY29yZCA9PiBKU09OLnN0cmluZ2lmeShyZWNvcmQpKSB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhpcy5lbmRwb2ludFVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIG1vZGU6IFwiY29yc1wiLFxuICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICAgIH0pXG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgLy8gUmUtcXVldWUgcmVjb3JkcyBvbiBmYWlsdXJlXG4gICAgICAgIHRoaXMucGVuZGluZ1JlY29yZHMudW5zaGlmdCguLi5yZWNvcmRzKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFB1c2ggZmFpbGVkIHdpdGggc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICB9XG5cbiAgICAgIGRlZmVycmVkLnJlc29sdmUoKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmRlYnVnKFwiRmFpbGVkIHRvIHB1c2ggbG9nIHJlY29yZHNcIiwgZXJyKVxuICAgICAgZGVmZXJyZWQucmVqZWN0KGVycilcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5mbHVzaERlZmVycmVkID0gbnVsbFxuXG4gICAgICAvLyBJZiBtb3JlIHJlY29yZHMgYWNjdW11bGF0ZWQgZHVyaW5nIGZsdXNoLCBzY2hlZHVsZSBhbm90aGVyXG4gICAgICBpZiAodGhpcy5wZW5kaW5nUmVjb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVGbHVzaCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSBhbiBpbW1lZGlhdGUgZmx1c2hcbiAgICovXG4gIGFzeW5jIGZvcmNlRmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZmx1c2hUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZmx1c2hUaW1lcilcbiAgICAgIHRoaXMuZmx1c2hUaW1lciA9IG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mbHVzaCgpXG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgcmVzb3VyY2VzXG4gICAqL1xuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZsdXNoVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZsdXNoVGltZXIpXG4gICAgICB0aGlzLmZsdXNoVGltZXIgPSBudWxsXG4gICAgfVxuXG4gICAgdGhpcy5jcmVkZW50aWFsTWFuYWdlci5kZXN0cm95KClcblxuICAgIGlmICh0aGlzLmZsdXNoRGVmZXJyZWQgJiYgIXRoaXMuZmx1c2hEZWZlcnJlZC5pc1NldHRsZWQoKSkge1xuICAgICAgdGhpcy5mbHVzaERlZmVycmVkLnJlamVjdChuZXcgRXJyb3IoXCJBcHBlbmRlciBkZXN0cm95ZWRcIikpXG4gICAgfVxuXG4gICAgdGhpcy5mbHVzaERlZmVycmVkID0gbnVsbFxuICAgIHRoaXMucGVuZGluZ1JlY29yZHMgPSBbXVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFB1c2hMb2dSZWNvcmRzQXBwZW5kZXJcbiJdfQ==
299
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHVzaExvZ1JlY29yZHNBcHBlbmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sb2dnaW5nL2FwcGVuZGVycy9wdXNoL1B1c2hMb2dSZWNvcmRzQXBwZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsK0NBQStDO0FBQy9DLGtFQUF5QztBQUN6Qyx3REFBb0Q7QUFHcEQsK0RBQTJEO0FBRTNELG1EQUFtRDtBQUNuRCxNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFBLENBQUMsYUFBYTtBQUN4RCxNQUFNLHdCQUF3QixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFBLENBQUMsc0NBQXNDO0FBQ3JGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFBO0FBQzlCLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQSxDQUFDLGFBQWE7QUFDaEQsTUFBTSxxQkFBcUIsR0FBRyxLQUFLLENBQUE7QUFDbkMsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFBO0FBRWxDLE1BQU0sR0FBRyxHQUFHLElBQUEscUNBQWlCLEdBQUUsQ0FBQTtBQU8vQjs7O0dBR0c7QUFDSCxNQUFhLCtCQUFnQyxTQUFRLHVCQUFzRDtJQUs3RTtJQUpwQixZQUFZLEdBQXlDLElBQUksQ0FBQTtJQUN6RCxrQkFBa0IsR0FBMEIsSUFBSSxDQUFBO0lBQ2hELG9CQUFvQixHQUFrQixJQUFJLENBQUE7SUFFbEQsWUFBNEIsV0FBbUI7UUFDN0MsS0FBSyxFQUFFLENBQUE7UUFEbUIsZ0JBQVcsR0FBWCxXQUFXLENBQVE7SUFFL0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMvQixPQUFPLEtBQUssQ0FBQTtRQUNkLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJ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QztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7UUFDeEIsQ0FBQztRQUVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUVoQyxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFBO1FBQzVELENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQTtJQUMxQixDQUFDO0NBQ0Y7QUFyS0Qsd0RBcUtDO0FBRUQsa0JBQWUsc0JBQXNCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSB0eXBlc2NyaXB0L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IEV2ZW50RW1pdHRlcjMgZnJvbSBcImV2ZW50ZW1pdHRlcjNcIlxuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tIFwiLi4vLi4vLi4vaGVscGVycy9pbmRleC5qc1wiXG5pbXBvcnQgeyBMb2dSZWNvcmQgfSBmcm9tIFwiLi4vLi4vTG9nUmVjb3JkLmpzXCJcbmltcG9ydCB7IEFwcGVuZGVyIH0gZnJvbSBcIi4uLy4uL0FwcGVuZGVyLmpzXCJcbmltcG9ydCB7IGdldEludGVybmFsTG9nZ2VyIH0gZnJvbSBcIi4uLy4uL0ludGVybmFsTG9nZ2VyLmpzXCJcblxuLy8gQ29uc3RhbnRzIGZvciB0dW5pbmcgKGFkanVzdGFibGUgaW4gZGV2ZWxvcG1lbnQpXG5jb25zdCBDT09LSUVfRVhQSVJBVElPTl9NUyA9IDUgKiA2MCAqIDEwMDAgLy8gMzAgbWludXRlc1xuY29uc3QgQ09PS0lFX1JFRlJFU0hfQlVGRkVSX01TID0gMiAqIDYwICogMTAwMCAvLyBSZWZyZXNoIDIgbWludXRlcyBiZWZvcmUgZXhwaXJhdGlvblxuY29uc3QgRkxVU0hfUVVFVUVfREVQVEggPSAxMDAwXG5jb25zdCBGTFVTSF9JTlRFUlZBTF9NUyA9IDUgKiAxMDAwIC8vIDEwIHNlY29uZHNcbmNvbnN0IExPR19RVUVVRV9NQVhfUkVDT1JEUyA9IDEwMDAwXG5jb25zdCBDT09LSUVfTkFNRSA9IFwid2lyZV9sb2dzX2lkXCJcblxuY29uc3QgbG9nID0gZ2V0SW50ZXJuYWxMb2dnZXIoKVxuXG5pbnRlcmZhY2UgUHVzaExvZ1JlY29yZHNDcmVkZW50aWFsTWFuYWdlckV2ZW50TWFwIHtcbiAgcmVjZWl2ZWQ6ICgpID0+IHZvaWRcbiAgZXhwaXJlZDogKCkgPT4gdm9pZFxufVxuXG4vKipcbiAqIE1hbmFnZXMgY3JlZGVudGlhbCBjb29raWUgZm9yIFB1c2hMb2dSZWNvcmRzQXBwZW5kZXIuXG4gKiBJbnZva2VzIHRoZSBlbmRwb2ludCB2aWEgUE9TVCB0byBvYnRhaW4gYSBzZXNzaW9uIGNvb2tpZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFB1c2hMb2dSZWNvcmRzQ3JlZGVudGlhbE1hbmFnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIzPFB1c2hMb2dSZWNvcmRzQ3JlZGVudGlhbE1hbmFnZXJFdmVudE1hcD4ge1xuICBwcml2YXRlIHJlZnJlc2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbFxuICBwcml2YXRlIGNyZWRlbnRpYWxEZWZlcnJlZDogRGVmZXJyZWQ8dm9pZD4gfCBudWxsID0gbnVsbFxuICBwcml2YXRlIGNvb2tpZUV4cGlyYXRpb25UaW1lOiBudW1iZXIgfCBudWxsID0gbnVsbFxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBlbmRwb2ludFVybDogc3RyaW5nKSB7XG4gICAgc3VwZXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHZhbGlkIGNyZWRlbnRpYWxzIGV4aXN0XG4gICAqL1xuICBoYXNDcmVkZW50aWFscygpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY29va2llRXhwaXJhdGlvblRpbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChEYXRlLm5vdygpID49IHRoaXMuY29va2llRXhwaXJhdGlvblRpbWUpIHtcbiAgICAgIHRoaXMuY29va2llRXhwaXJhdGlvblRpbWUgPSBudWxsXG4gICAgICB0aGlzLmVtaXQoXCJleHBpcmVkXCIpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjcmVkZW50aWFscywgZmV0Y2hpbmcgdGhlbSBpZiBuZWNlc3NhcnlcbiAgICovXG4gIGFzeW5jIGVuc3VyZUNyZWRlbnRpYWxzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIElmIHdlIGhhdmUgdmFsaWQgY3JlZGVudGlhbHMsIHJldHVybiBpbW1lZGlhdGVseVxuICAgIGlmICh0aGlzLmhhc0NyZWRlbnRpYWxzKCkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gSWYgYSBmZXRjaCBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3YWl0IGZvciBpdFxuICAgIGlmICh0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZCAmJiAhdGhpcy5jcmVkZW50aWFsRGVmZXJyZWQuaXNTZXR0bGVkKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY3JlZGVudGlhbERlZmVycmVkLnByb21pc2VcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzQ3JlZGVudGlhbHMoKVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZldGNoIG5ldyBjcmVkZW50aWFsc1xuICAgIHJldHVybiB0aGlzLmZldGNoQ3JlZGVudGlhbHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIHJlZnJlc2ggb2YgY3JlZGVudGlhbHNcbiAgICovXG4gIGZvcmNlUmVmcmVzaCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWZyZXNoVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlZnJlc2hUaW1lcilcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVyID0gbnVsbFxuICAgIH1cblxuICAgIHRoaXMuY29va2llRXhwaXJhdGlvblRpbWUgPSBudWxsXG5cbiAgICBpZiAodGhpcy5jcmVkZW50aWFsRGVmZXJyZWQgJiYgIXRoaXMuY3JlZGVudGlhbERlZmVycmVkLmlzU2V0dGxlZCgpKSB7XG4gICAgICB0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZC5yZWplY3QobmV3IEVycm9yKFwiRm9yY2UgcmVmcmVzaCByZXF1ZXN0ZWRcIikpXG4gICAgfVxuICAgIHRoaXMuY3JlZGVudGlhbERlZmVycmVkID0gbnVsbFxuXG4gICAgdGhpcy5mZXRjaENyZWRlbnRpYWxzKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgLy8gSWdub3JlIGVycm9ycyBkdXJpbmcgZm9yY2UgcmVmcmVzaCwgdGhleSdsbCBiZSBoYW5kbGVkIG9uIG5leHQgcmVxdWVzdFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggY3JlZGVudGlhbHMgZnJvbSB0aGUgZW5kcG9pbnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hDcmVkZW50aWFscygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBkZWZlcnJlZCA9ICh0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZCA9IG5ldyBEZWZlcnJlZDx2b2lkPigpKVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhpcy5lbmRwb2ludFVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBtb2RlOiBcImNvcnNcIixcbiAgICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe30pXG4gICAgICB9KVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ3JlZGVudGlhbCByZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c31gXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gQ29va2llIGlzIHNldCBieSBTZXQtQ29va2llIGhlYWRlciwgd2UganVzdCBuZWVkIHRvIHRyYWNrIGV4cGlyYXRpb25cbiAgICAgIHRoaXMuY29va2llRXhwaXJhdGlvblRpbWUgPSBEYXRlLm5vdygpICsgQ09PS0lFX0VYUElSQVRJT05fTVNcblxuICAgICAgLy8gU2NoZWR1bGUgcmVmcmVzaCBiZWZvcmUgZXhwaXJhdGlvblxuICAgICAgdGhpcy5zY2hlZHVsZVJlZnJlc2goKVxuXG4gICAgICBkZWZlcnJlZC5yZXNvbHZlKClcbiAgICAgIHRoaXMuZW1pdChcInJlY2VpdmVkXCIpXG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cud2FybihcIkZhaWxlZCB0byBmZXRjaCBwdXNoIGxvZyBjcmVkZW50aWFsc1wiLCBlcnIpXG4gICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKVxuICAgICAgdGhpcy5jcmVkZW50aWFsRGVmZXJyZWQgPSBudWxsXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2NoZWR1bGUgYSBjcmVkZW50aWFsIHJlZnJlc2ggYmVmb3JlIGV4cGlyYXRpb25cbiAgICovXG4gIHByaXZhdGUgc2NoZWR1bGVSZWZyZXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVmcmVzaFRpbWVyKVxuICAgIH1cblxuICAgIGNvbnN0IHJlZnJlc2hJbiA9IENPT0tJRV9FWFBJUkFUSU9OX01TIC0gQ09PS0lFX1JFRlJFU0hfQlVGRkVSX01TXG4gICAgdGhpcy5yZWZyZXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY3JlZGVudGlhbERlZmVycmVkID0gbnVsbFxuICAgICAgdGhpcy5mZXRjaENyZWRlbnRpYWxzKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBMb2cgYnV0IGRvbid0IHRocm93IC0gd2lsbCByZXRyeSBvbiBuZXh0IHJlcXVlc3RcbiAgICAgICAgbG9nLmRlYnVnKFwiU2NoZWR1bGVkIGNyZWRlbnRpYWwgcmVmcmVzaCBmYWlsZWRcIilcbiAgICAgIH0pXG4gICAgfSwgcmVmcmVzaEluKVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHJlc291cmNlc1xuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWZyZXNoVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlZnJlc2hUaW1lcilcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVyID0gbnVsbFxuICAgIH1cblxuICAgIGlmICh0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZCAmJiAhdGhpcy5jcmVkZW50aWFsRGVmZXJyZWQuaXNTZXR0bGVkKCkpIHtcbiAgICAgIHRoaXMuY3JlZGVudGlhbERlZmVycmVkLnJlamVjdChuZXcgRXJyb3IoXCJDcmVkZW50aWFsIG1hbmFnZXIgZGVzdHJveWVkXCIpKVxuICAgIH1cblxuICAgIHRoaXMuY3JlZGVudGlhbERlZmVycmVkID0gbnVsbFxuICAgIHRoaXMuY29va2llRXhwaXJhdGlvblRpbWUgPSBudWxsXG4gIH1cbn1cblxuLyoqXG4gKiBBcHBlbmRlciB0aGF0IHB1c2hlcyBsb2cgcmVjb3JkcyB0byBhIHJlbW90ZSBlbmRwb2ludCB2aWEgSFRUUCBQVVQuXG4gKiBCYXRjaGVzIHJlY29yZHMgYW5kIHNlbmRzIHdoZW4gcXVldWUgcmVhY2hlcyBGTFVTSF9RVUVVRV9ERVBUSCBvciBGTFVTSF9JTlRFUlZBTF9NUyBoYXMgZWxhcHNlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFB1c2hMb2dSZWNvcmRzQXBwZW5kZXI8XG4gIFJlY29yZCBleHRlbmRzIExvZ1JlY29yZCA9IExvZ1JlY29yZFxuPiBpbXBsZW1lbnRzIEFwcGVuZGVyPFJlY29yZD4ge1xuICBwcml2YXRlIHBlbmRpbmdSZWNvcmRzOiBMb2dSZWNvcmRbXSA9IFtdXG4gIHByaXZhdGUgZmx1c2hEZWZlcnJlZDogRGVmZXJyZWQ8dm9pZD4gfCBudWxsID0gbnVsbFxuICBwcml2YXRlIGZsdXNoVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGxcblxuICBwdWJsaWMgcmVhZG9ubHkgY3JlZGVudGlhbE1hbmFnZXI6IFB1c2hMb2dSZWNvcmRzQ3JlZGVudGlhbE1hbmFnZXJcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnRVcmw6IHN0cmluZykge1xuICAgIHRoaXMuY3JlZGVudGlhbE1hbmFnZXIgPSBuZXcgUHVzaExvZ1JlY29yZHNDcmVkZW50aWFsTWFuYWdlcihlbmRwb2ludFVybClcblxuICAgIHRoaXMuY3JlZGVudGlhbE1hbmFnZXIub24oXCJyZWNlaXZlZFwiLCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMucGVuZGluZ1JlY29yZHMubGVuZ3RoIHx8IHRoaXMuZmx1c2hEZWZlcnJlZCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHRoaXMuZmx1c2goKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIEVycm9ycyBoYW5kbGVkIGluIGZsdXNoXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kIGEgbG9nIHJlY29yZCB0byB0aGUgcXVldWVcbiAgICovXG4gIGFwcGVuZChyZWNvcmQ6IFJlY29yZCk6IHZvaWQge1xuICAgIC8vIEFkZCB0aGUgcmVjb3JkIHdpdGggZW5yaWNoZWQgbWV0YWRhdGFcbiAgICB0aGlzLnBlbmRpbmdSZWNvcmRzLnB1c2goe1xuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgLi4ucmVjb3JkLFxuICAgICAgYXBwOiByZWNvcmQuYXBwICYmIHJlY29yZC5hcHAubGVuZ3RoID4gMCA/IHJlY29yZC5hcHAgOiBcIlVOS05PV05cIixcbiAgICAgIGVudjogcmVjb3JkLmVudiAmJiByZWNvcmQuZW52Lmxlbmd0aCA+IDAgPyByZWNvcmQuZW52IDogXCJVTktOT1dOXCIsXG4gICAgICB1cmw6IHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgPyBcImxvY2FsOi8vXCIgOiB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgIH0pXG4gICAgdGhpcy50cmltUGVuZGluZ1JlY29yZHNUb1F1ZXVlQ2FwKClcblxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBmbHVzaCBpbW1lZGlhdGVseSBkdWUgdG8gcXVldWUgZGVwdGhcbiAgICBpZiAodGhpcy5wZW5kaW5nUmVjb3Jkcy5sZW5ndGggPj0gRkxVU0hfUVVFVUVfREVQVEgpIHtcbiAgICAgIHRoaXMuZmx1c2goKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIEVycm9ycyBoYW5kbGVkIGluIGZsdXNoXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTY2hlZHVsZSBhIGZsdXNoIGlmIG5vdCBhbHJlYWR5IHNjaGVkdWxlZFxuICAgICAgdGhpcy5zY2hlZHVsZUZsdXNoKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2NoZWR1bGUgYSBmbHVzaCBhZnRlciB0aGUgaW50ZXJ2YWxcbiAgICovXG4gIHByaXZhdGUgc2NoZWR1bGVGbHVzaCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mbHVzaFRpbWVyKSB7XG4gICAgICByZXR1cm4gLy8gQWxyZWFkeSBzY2hlZHVsZWRcbiAgICB9XG5cbiAgICB0aGlzLmZsdXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZmx1c2hUaW1lciA9IG51bGxcbiAgICAgIHRoaXMuZmx1c2goKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIEVycm9ycyBoYW5kbGVkIGluIGZsdXNoXG4gICAgICB9KVxuICAgIH0sIEZMVVNIX0lOVEVSVkFMX01TKVxuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHBlbmRpbmcgcmVjb3JkcyB0byB0aGUgZW5kcG9pbnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gUHJldmVudCBjb25jdXJyZW50IGZsdXNoZXNcbiAgICBpZiAodGhpcy5mbHVzaERlZmVycmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5mbHVzaERlZmVycmVkLnByb21pc2VcbiAgICB9XG5cbiAgICAvLyBOb3RoaW5nIHRvIGZsdXNoXG4gICAgaWYgKCF0aGlzLnBlbmRpbmdSZWNvcmRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHdlIGhhdmUgdmFsaWQgY3JlZGVudGlhbHNcbiAgICBjb25zdCBoYXNDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuY3JlZGVudGlhbE1hbmFnZXIuZW5zdXJlQ3JlZGVudGlhbHMoKVxuICAgIGlmICghaGFzQ3JlZGVudGlhbHMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhcIkZhaWxlZCB0byBwdXNoIGxvZyByZWNvcmRzXCIsIFwiTm8gdmFsaWQgY3JlZGVudGlhbHMgYXZhaWxhYmxlXCIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBkZWZlcnJlZCA9ICh0aGlzLmZsdXNoRGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQ8dm9pZD4oKSlcblxuICAgIHRyeSB7XG4gICAgICAvLyBUYWtlIGFsbCBwZW5kaW5nIHJlY29yZHMgZm9yIHRoaXMgZmx1c2hcbiAgICAgIGNvbnN0IHJlY29yZHMgPSB0aGlzLnBlbmRpbmdSZWNvcmRzLnNwbGljZSgwLCB0aGlzLnBlbmRpbmdSZWNvcmRzLmxlbmd0aClcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7IHJlY29yZHM6IHJlY29yZHMubWFwKHJlY29yZCA9PiBKU09OLnN0cmluZ2lmeShyZWNvcmQpKSB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godGhpcy5lbmRwb2ludFVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIG1vZGU6IFwiY29yc1wiLFxuICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKVxuICAgICAgfSlcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAvLyBSZS1xdWV1ZSByZWNvcmRzIG9uIGZhaWx1cmVcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVjb3Jkcy51bnNoaWZ0KC4uLnJlY29yZHMpXG4gICAgICAgIHRoaXMudHJpbVBlbmRpbmdSZWNvcmRzVG9RdWV1ZUNhcCgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHVzaCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgIH1cblxuICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cuZGVidWcoXCJGYWlsZWQgdG8gcHVzaCBsb2cgcmVjb3Jkc1wiLCBlcnIpXG4gICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmZsdXNoRGVmZXJyZWQgPSBudWxsXG5cbiAgICAgIC8vIElmIG1vcmUgcmVjb3JkcyBhY2N1bXVsYXRlZCBkdXJpbmcgZmx1c2gsIHNjaGVkdWxlIGFub3RoZXJcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdSZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZUZsdXNoKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIGFuIGltbWVkaWF0ZSBmbHVzaFxuICAgKi9cbiAgYXN5bmMgZm9yY2VGbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5mbHVzaFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5mbHVzaFRpbWVyKVxuICAgICAgdGhpcy5mbHVzaFRpbWVyID0gbnVsbFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZsdXNoKClcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmZvcmNlIHRoZSBwZW5kaW5nIHF1ZXVlIGNhcCBieSBkcm9wcGluZyB0aGUgb2xkZXN0IHJlY29yZHMuXG4gICAqL1xuICBwcml2YXRlIHRyaW1QZW5kaW5nUmVjb3Jkc1RvUXVldWVDYXAoKTogdm9pZCB7XG4gICAgY29uc3QgcmVtb3ZlQ291bnQgPSB0aGlzLnBlbmRpbmdSZWNvcmRzLmxlbmd0aCAtIExPR19RVUVVRV9NQVhfUkVDT1JEU1xuXG4gICAgaWYgKHJlbW92ZUNvdW50ID4gMCkge1xuICAgICAgdGhpcy5wZW5kaW5nUmVjb3Jkcy5zcGxpY2UoMCwgcmVtb3ZlQ291bnQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHJlc291cmNlc1xuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mbHVzaFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5mbHVzaFRpbWVyKVxuICAgICAgdGhpcy5mbHVzaFRpbWVyID0gbnVsbFxuICAgIH1cblxuICAgIHRoaXMuY3JlZGVudGlhbE1hbmFnZXIuZGVzdHJveSgpXG5cbiAgICBpZiAodGhpcy5mbHVzaERlZmVycmVkICYmICF0aGlzLmZsdXNoRGVmZXJyZWQuaXNTZXR0bGVkKCkpIHtcbiAgICAgIHRoaXMuZmx1c2hEZWZlcnJlZC5yZWplY3QobmV3IEVycm9yKFwiQXBwZW5kZXIgZGVzdHJveWVkXCIpKVxuICAgIH1cblxuICAgIHRoaXMuZmx1c2hEZWZlcnJlZCA9IG51bGxcbiAgICB0aGlzLnBlbmRpbmdSZWNvcmRzID0gW11cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQdXNoTG9nUmVjb3Jkc0FwcGVuZGVyXG4iXX0=
@@ -67,6 +67,10 @@ export declare class PushLogRecordsAppender<Record extends LogRecord = LogRecord
67
67
  * Force an immediate flush
68
68
  */
69
69
  forceFlush(): Promise<void>;
70
+ /**
71
+ * Enforce the pending queue cap by dropping the oldest records.
72
+ */
73
+ private trimPendingRecordsToQueueCap;
70
74
  /**
71
75
  * Clean up resources
72
76
  */
@@ -1 +1 @@
1
- {"version":3,"file":"PushLogRecordsAppender.d.ts","sourceRoot":"","sources":["../../../../../src/logging/appenders/push/PushLogRecordsAppender.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,eAAe,CAAA;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAa5C,UAAU,uCAAuC;IAC/C,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED;;;GAGG;AACH,qBAAa,+BAAgC,SAAQ,aAAa,CAAC,uCAAuC,CAAC;aAK7E,WAAW,EAAE,MAAM;IAJ/C,OAAO,CAAC,YAAY,CAA6C;IACjE,OAAO,CAAC,kBAAkB,CAA8B;IACxD,OAAO,CAAC,oBAAoB,CAAsB;gBAEtB,WAAW,EAAE,MAAM;IAI/C;;OAEG;IACH,cAAc,IAAI,OAAO;IAczB;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAoB3C;;OAEG;IACH,YAAY,IAAI,IAAI;IAkBpB;;OAEG;YACW,gBAAgB;IAoC9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,OAAO,IAAI,IAAI;CAahB;AAED;;;GAGG;AACH,qBAAa,sBAAsB,CAAC,MAAM,SAAS,SAAS,GAAG,SAAS,CAAE,YAAW,QAAQ,CAAC,MAAM,CAAC;aAOvE,WAAW,EAAE,MAAM;IAN/C,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,UAAU,CAA6C;IAE/D,SAAgB,iBAAiB,EAAE,+BAA+B,CAAA;gBAEtC,WAAW,EAAE,MAAM;IAa/C;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IA6B5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;YACW,KAAK;IAyDnB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC;;OAEG;IACH,OAAO,IAAI,IAAI;CAehB;AAED,eAAe,sBAAsB,CAAA"}
1
+ {"version":3,"file":"PushLogRecordsAppender.d.ts","sourceRoot":"","sources":["../../../../../src/logging/appenders/push/PushLogRecordsAppender.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,eAAe,CAAA;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAa5C,UAAU,uCAAuC;IAC/C,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED;;;GAGG;AACH,qBAAa,+BAAgC,SAAQ,aAAa,CAAC,uCAAuC,CAAC;aAK7E,WAAW,EAAE,MAAM;IAJ/C,OAAO,CAAC,YAAY,CAA6C;IACjE,OAAO,CAAC,kBAAkB,CAA8B;IACxD,OAAO,CAAC,oBAAoB,CAAsB;gBAEtB,WAAW,EAAE,MAAM;IAI/C;;OAEG;IACH,cAAc,IAAI,OAAO;IAczB;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAoB3C;;OAEG;IACH,YAAY,IAAI,IAAI;IAkBpB;;OAEG;YACW,gBAAgB;IAsC9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,OAAO,IAAI,IAAI;CAahB;AAED;;;GAGG;AACH,qBAAa,sBAAsB,CACjC,MAAM,SAAS,SAAS,GAAG,SAAS,CACpC,YAAW,QAAQ,CAAC,MAAM,CAAC;aAOC,WAAW,EAAE,MAAM;IAN/C,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,UAAU,CAA6C;IAE/D,SAAgB,iBAAiB,EAAE,+BAA+B,CAAA;gBAEtC,WAAW,EAAE,MAAM;IAa/C;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAsB5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;YACW,KAAK;IA0DnB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAQpC;;OAEG;IACH,OAAO,IAAI,IAAI;CAehB;AAED,eAAe,sBAAsB,CAAA"}
@@ -86,9 +86,9 @@ export class PushLogRecordsCredentialManager extends EventEmitter3 {
86
86
  mode: "cors",
87
87
  credentials: "include",
88
88
  headers: {
89
- "Content-Type": "application/json",
89
+ "Content-Type": "application/json"
90
90
  },
91
- body: JSON.stringify({}),
91
+ body: JSON.stringify({})
92
92
  });
93
93
  if (!response.ok) {
94
94
  throw new Error(`Credential request failed with status ${response.status}`);
@@ -165,20 +165,15 @@ export class PushLogRecordsAppender {
165
165
  * Append a log record to the queue
166
166
  */
167
167
  append(record) {
168
- // Enforce max queue size by removing oldest records
169
- const pendingCount = this.pendingRecords.length + 1;
170
- const removeCount = pendingCount - LOG_QUEUE_MAX_RECORDS;
171
- if (removeCount > 0) {
172
- this.pendingRecords.splice(0, removeCount);
173
- }
174
168
  // Add the record with enriched metadata
175
169
  this.pendingRecords.push({
176
170
  timestamp: Date.now(),
177
171
  ...record,
178
172
  app: record.app && record.app.length > 0 ? record.app : "UNKNOWN",
179
173
  env: record.env && record.env.length > 0 ? record.env : "UNKNOWN",
180
- url: typeof window === "undefined" ? "local://" : window.location.href,
174
+ url: typeof window === "undefined" ? "local://" : window.location.href
181
175
  });
176
+ this.trimPendingRecordsToQueueCap();
182
177
  // Check if we should flush immediately due to queue depth
183
178
  if (this.pendingRecords.length >= FLUSH_QUEUE_DEPTH) {
184
179
  this.flush().catch(() => {
@@ -234,11 +229,12 @@ export class PushLogRecordsAppender {
234
229
  headers: {
235
230
  "Content-Type": "application/json"
236
231
  },
237
- body: JSON.stringify(payload),
232
+ body: JSON.stringify(payload)
238
233
  });
239
234
  if (!response.ok) {
240
235
  // Re-queue records on failure
241
236
  this.pendingRecords.unshift(...records);
237
+ this.trimPendingRecordsToQueueCap();
242
238
  throw new Error(`Push failed with status ${response.status}`);
243
239
  }
244
240
  deferred.resolve();
@@ -266,6 +262,15 @@ export class PushLogRecordsAppender {
266
262
  }
267
263
  return this.flush();
268
264
  }
265
+ /**
266
+ * Enforce the pending queue cap by dropping the oldest records.
267
+ */
268
+ trimPendingRecordsToQueueCap() {
269
+ const removeCount = this.pendingRecords.length - LOG_QUEUE_MAX_RECORDS;
270
+ if (removeCount > 0) {
271
+ this.pendingRecords.splice(0, removeCount);
272
+ }
273
+ }
269
274
  /**
270
275
  * Clean up resources
271
276
  */
@@ -283,4 +288,4 @@ export class PushLogRecordsAppender {
283
288
  }
284
289
  }
285
290
  export default PushLogRecordsAppender;
286
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHVzaExvZ1JlY29yZHNBcHBlbmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sb2dnaW5nL2FwcGVuZGVycy9wdXNoL1B1c2hMb2dSZWNvcmRzQXBwZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLE9BQU8sYUFBYSxNQUFNLGVBQWUsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFHcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFFM0QsbURBQW1EO0FBQ25ELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUEsQ0FBQyxhQUFhO0FBQ3hELE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUEsQ0FBQyxzQ0FBc0M7QUFDckYsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUE7QUFDOUIsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFBLENBQUMsYUFBYTtBQUNoRCxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQTtBQUNuQyxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUE7QUFFbEMsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQTtBQU8vQjs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sK0JBQWdDLFNBQVEsYUFBc0Q7SUFLN0U7SUFKcEIsWUFBWSxHQUF5QyxJQUFJLENBQUE7SUFDekQsa0JBQWtCLEdBQTBCLElBQUksQ0FBQTtJQUNoRCxvQkFBb0IsR0FBa0IsSUFBSSxDQUFBO0lBRWxELFlBQTRCLFdBQW1CO1FBQzdDLEtBQUssRUFBRSxDQUFBO1FBRG1CLGdCQUFXLEdBQVgsV0FBVyxDQUFRO0lBRS9DLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFF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RSxDQUFBO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU87UUFDTCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFBO1FBQ3hCLENBQUM7UUFFRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUE7UUFFaEMsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQTtRQUM1RCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7UUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUE7SUFDMUIsQ0FBQztDQUNGO0FBRUQsZUFBZSxzQkFBc0IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIHR5cGVzY3JpcHQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgRXZlbnRFbWl0dGVyMyBmcm9tIFwiZXZlbnRlbWl0dGVyM1wiXG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gXCIuLi8uLi8uLi9oZWxwZXJzL2luZGV4LmpzXCJcbmltcG9ydCB7IExvZ1JlY29yZCB9IGZyb20gXCIuLi8uLi9Mb2dSZWNvcmQuanNcIlxuaW1wb3J0IHsgQXBwZW5kZXIgfSBmcm9tIFwiLi4vLi4vQXBwZW5kZXIuanNcIlxuaW1wb3J0IHsgZ2V0SW50ZXJuYWxMb2dnZXIgfSBmcm9tIFwiLi4vLi4vSW50ZXJuYWxMb2dnZXIuanNcIlxuXG4vLyBDb25zdGFudHMgZm9yIHR1bmluZyAoYWRqdXN0YWJsZSBpbiBkZXZlbG9wbWVudClcbmNvbnN0IENPT0tJRV9FWFBJUkFUSU9OX01TID0gNSAqIDYwICogMTAwMCAvLyAzMCBtaW51dGVzXG5jb25zdCBDT09LSUVfUkVGUkVTSF9CVUZGRVJfTVMgPSAyICogNjAgKiAxMDAwIC8vIFJlZnJlc2ggMiBtaW51dGVzIGJlZm9yZSBleHBpcmF0aW9uXG5jb25zdCBGTFVTSF9RVUVVRV9ERVBUSCA9IDEwMDBcbmNvbnN0IEZMVVNIX0lOVEVSVkFMX01TID0gNSAqIDEwMDAgLy8gMTAgc2Vjb25kc1xuY29uc3QgTE9HX1FVRVVFX01BWF9SRUNPUkRTID0gMTAwMDBcbmNvbnN0IENPT0tJRV9OQU1FID0gXCJ3aXJlX2xvZ3NfaWRcIlxuXG5jb25zdCBsb2cgPSBnZXRJbnRlcm5hbExvZ2dlcigpXG5cbmludGVyZmFjZSBQdXNoTG9nUmVjb3Jkc0NyZWRlbnRpYWxNYW5hZ2VyRXZlbnRNYXAge1xuICByZWNlaXZlZDogKCkgPT4gdm9pZFxuICBleHBpcmVkOiAoKSA9PiB2b2lkXG59XG5cbi8qKlxuICogTWFuYWdlcyBjcmVkZW50aWFsIGNvb2tpZSBmb3IgUHVzaExvZ1JlY29yZHNBcHBlbmRlci5cbiAqIEludm9rZXMgdGhlIGVuZHBvaW50IHZpYSBQT1NUIHRvIG9idGFpbiBhIHNlc3Npb24gY29va2llLlxuICovXG5leHBvcnQgY2xhc3MgUHVzaExvZ1JlY29yZHNDcmVkZW50aWFsTWFuYWdlciBleHRlbmRzIEV2ZW50RW1pdHRlcjM8UHVzaExvZ1JlY29yZHNDcmVkZW50aWFsTWFuYWdlckV2ZW50TWFwPiB7XG4gIHByaXZhdGUgcmVmcmVzaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsXG4gIHByaXZhdGUgY3JlZGVudGlhbERlZmVycmVkOiBEZWZlcnJlZDx2b2lkPiB8IG51bGwgPSBudWxsXG4gIHByaXZhdGUgY29va2llRXhwaXJhdGlvblRpbWU6IG51bWJlciB8IG51bGwgPSBudWxsXG5cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGVuZHBvaW50VXJsOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdmFsaWQgY3JlZGVudGlhbHMgZXhpc3RcbiAgICovXG4gIGhhc0NyZWRlbnRpYWxzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jb29raWVFeHBpcmF0aW9uVGltZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKERhdGUubm93KCkgPj0gdGhpcy5jb29raWVFeHBpcmF0aW9uVGltZSkge1xuICAgICAgdGhpcy5jb29raWVFeHBpcmF0aW9uVGltZSA9IG51bGxcbiAgICAgIHRoaXMuZW1pdChcImV4cGlyZWRcIilcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogR2V0IGNyZWRlbnRpYWxzLCBmZXRjaGluZyB0aGVtIGlmIG5lY2Vzc2FyeVxuICAgKi9cbiAgYXN5bmMgZW5zdXJlQ3JlZGVudGlhbHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gSWYgd2UgaGF2ZSB2YWxpZCBjcmVkZW50aWFscywgcmV0dXJuIGltbWVkaWF0ZWx5XG4gICAgaWYgKHRoaXMuaGFzQ3JlZGVudGlhbHMoKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBJZiBhIGZldGNoIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdhaXQgZm9yIGl0XG4gICAgaWYgKHRoaXMuY3JlZGVudGlhbERlZmVycmVkICYmICF0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZC5pc1NldHRsZWQoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVkZW50aWFsRGVmZXJyZWQucHJvbWlzZVxuICAgICAgICByZXR1cm4gdGhpcy5oYXNDcmVkZW50aWFscygpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmV0Y2ggbmV3IGNyZWRlbnRpYWxzXG4gICAgcmV0dXJuIHRoaXMuZmV0Y2hDcmVkZW50aWFscygpXG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgcmVmcmVzaCBvZiBjcmVkZW50aWFsc1xuICAgKi9cbiAgZm9yY2VSZWZyZXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVmcmVzaFRpbWVyKVxuICAgICAgdGhpcy5yZWZyZXNoVGltZXIgPSBudWxsXG4gICAgfVxuXG4gICAgdGhpcy5jb29raWVFeHBpcmF0aW9uVGltZSA9IG51bGxcblxuICAgIGlmICh0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZCAmJiAhdGhpcy5jcmVkZW50aWFsRGVmZXJyZWQuaXNTZXR0bGVkKCkpIHtcbiAgICAgIHRoaXMuY3JlZGVudGlhbERlZmVycmVkLnJlamVjdChuZXcgRXJyb3IoXCJGb3JjZSByZWZyZXNoIHJlcXVlc3RlZFwiKSlcbiAgICB9XG4gICAgdGhpcy5jcmVkZW50aWFsRGVmZXJyZWQgPSBudWxsXG5cbiAgICB0aGlzLmZldGNoQ3JlZGVudGlhbHMoKS5jYXRjaCgoKSA9PiB7XG4gICAgICAvLyBJZ25vcmUgZXJyb3JzIGR1cmluZyBmb3JjZSByZWZyZXNoLCB0aGV5J2xsIGJlIGhhbmRsZWQgb24gbmV4dCByZXF1ZXN0XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBjcmVkZW50aWFscyBmcm9tIHRoZSBlbmRwb2ludFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaENyZWRlbnRpYWxzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGRlZmVycmVkID0gKHRoaXMuY3JlZGVudGlhbERlZmVycmVkID0gbmV3IERlZmVycmVkPHZvaWQ+KCkpXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh0aGlzLmVuZHBvaW50VXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIG1vZGU6IFwiY29yc1wiLFxuICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe30pLFxuICAgICAgfSlcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENyZWRlbnRpYWwgcmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtyZXNwb25zZS5zdGF0dXN9YClcbiAgICAgIH1cblxuICAgICAgLy8gQ29va2llIGlzIHNldCBieSBTZXQtQ29va2llIGhlYWRlciwgd2UganVzdCBuZWVkIHRvIHRyYWNrIGV4cGlyYXRpb25cbiAgICAgIHRoaXMuY29va2llRXhwaXJhdGlvblRpbWUgPSBEYXRlLm5vdygpICsgQ09PS0lFX0VYUElSQVRJT05fTVNcblxuICAgICAgLy8gU2NoZWR1bGUgcmVmcmVzaCBiZWZvcmUgZXhwaXJhdGlvblxuICAgICAgdGhpcy5zY2hlZHVsZVJlZnJlc2goKVxuXG4gICAgICBkZWZlcnJlZC5yZXNvbHZlKClcbiAgICAgIHRoaXMuZW1pdChcInJlY2VpdmVkXCIpXG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2cud2FybihcIkZhaWxlZCB0byBmZXRjaCBwdXNoIGxvZyBjcmVkZW50aWFsc1wiLCBlcnIpXG4gICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKVxuICAgICAgdGhpcy5jcmVkZW50aWFsRGVmZXJyZWQgPSBudWxsXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2NoZWR1bGUgYSBjcmVkZW50aWFsIHJlZnJlc2ggYmVmb3JlIGV4cGlyYXRpb25cbiAgICovXG4gIHByaXZhdGUgc2NoZWR1bGVSZWZyZXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVmcmVzaFRpbWVyKVxuICAgIH1cblxuICAgIGNvbnN0IHJlZnJlc2hJbiA9IENPT0tJRV9FWFBJUkFUSU9OX01TIC0gQ09PS0lFX1JFRlJFU0hfQlVGRkVSX01TXG4gICAgdGhpcy5yZWZyZXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY3JlZGVudGlhbERlZmVycmVkID0gbnVsbFxuICAgICAgdGhpcy5mZXRjaENyZWRlbnRpYWxzKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBMb2cgYnV0IGRvbid0IHRocm93IC0gd2lsbCByZXRyeSBvbiBuZXh0IHJlcXVlc3RcbiAgICAgICAgbG9nLmRlYnVnKFwiU2NoZWR1bGVkIGNyZWRlbnRpYWwgcmVmcmVzaCBmYWlsZWRcIilcbiAgICAgIH0pXG4gICAgfSwgcmVmcmVzaEluKVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHJlc291cmNlc1xuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWZyZXNoVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlZnJlc2hUaW1lcilcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVyID0gbnVsbFxuICAgIH1cblxuICAgIGlmICh0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZCAmJiAhdGhpcy5jcmVkZW50aWFsRGVmZXJyZWQuaXNTZXR0bGVkKCkpIHtcbiAgICAgIHRoaXMuY3JlZGVudGlhbERlZmVycmVkLnJlamVjdChuZXcgRXJyb3IoXCJDcmVkZW50aWFsIG1hbmFnZXIgZGVzdHJveWVkXCIpKVxuICAgIH1cblxuICAgIHRoaXMuY3JlZGVudGlhbERlZmVycmVkID0gbnVsbFxuICAgIHRoaXMuY29va2llRXhwaXJhdGlvblRpbWUgPSBudWxsXG4gIH1cbn1cblxuLyoqXG4gKiBBcHBlbmRlciB0aGF0IHB1c2hlcyBsb2cgcmVjb3JkcyB0byBhIHJlbW90ZSBlbmRwb2ludCB2aWEgSFRUUCBQVVQuXG4gKiBCYXRjaGVzIHJlY29yZHMgYW5kIHNlbmRzIHdoZW4gcXVldWUgcmVhY2hlcyBGTFVTSF9RVUVVRV9ERVBUSCBvciBGTFVTSF9JTlRFUlZBTF9NUyBoYXMgZWxhcHNlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFB1c2hMb2dSZWNvcmRzQXBwZW5kZXI8UmVjb3JkIGV4dGVuZHMgTG9nUmVjb3JkID0gTG9nUmVjb3JkPiBpbXBsZW1lbnRzIEFwcGVuZGVyPFJlY29yZD4ge1xuICBwcml2YXRlIHBlbmRpbmdSZWNvcmRzOiBMb2dSZWNvcmRbXSA9IFtdXG4gIHByaXZhdGUgZmx1c2hEZWZlcnJlZDogRGVmZXJyZWQ8dm9pZD4gfCBudWxsID0gbnVsbFxuICBwcml2YXRlIGZsdXNoVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGxcblxuICBwdWJsaWMgcmVhZG9ubHkgY3JlZGVudGlhbE1hbmFnZXI6IFB1c2hMb2dSZWNvcmRzQ3JlZGVudGlhbE1hbmFnZXJcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnRVcmw6IHN0cmluZykge1xuICAgIHRoaXMuY3JlZGVudGlhbE1hbmFnZXIgPSBuZXcgUHVzaExvZ1JlY29yZHNDcmVkZW50aWFsTWFuYWdlcihlbmRwb2ludFVybClcblxuICAgIHRoaXMuY3JlZGVudGlhbE1hbmFnZXIub24oXCJyZWNlaXZlZFwiLCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMucGVuZGluZ1JlY29yZHMubGVuZ3RoIHx8IHRoaXMuZmx1c2hEZWZlcnJlZCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHRoaXMuZmx1c2goKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIEVycm9ycyBoYW5kbGVkIGluIGZsdXNoXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kIGEgbG9nIHJlY29yZCB0byB0aGUgcXVldWVcbiAgICovXG4gIGFwcGVuZChyZWNvcmQ6IFJlY29yZCk6IHZvaWQge1xuICAgIC8vIEVuZm9yY2UgbWF4IHF1ZXVlIHNpemUgYnkgcmVtb3Zpbmcgb2xkZXN0IHJlY29yZHNcbiAgICBjb25zdCBwZW5kaW5nQ291bnQgPSB0aGlzLnBlbmRpbmdSZWNvcmRzLmxlbmd0aCArIDFcbiAgICBjb25zdCByZW1vdmVDb3VudCA9IHBlbmRpbmdDb3VudCAtIExPR19RVUVVRV9NQVhfUkVDT1JEU1xuXG4gICAgaWYgKHJlbW92ZUNvdW50ID4gMCkge1xuICAgICAgdGhpcy5wZW5kaW5nUmVjb3Jkcy5zcGxpY2UoMCwgcmVtb3ZlQ291bnQpXG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSByZWNvcmQgd2l0aCBlbnJpY2hlZCBtZXRhZGF0YVxuICAgIHRoaXMucGVuZGluZ1JlY29yZHMucHVzaCh7XG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAuLi5yZWNvcmQsXG4gICAgICBhcHA6IHJlY29yZC5hcHAgJiYgcmVjb3JkLmFwcC5sZW5ndGggPiAwID8gcmVjb3JkLmFwcCA6IFwiVU5LTk9XTlwiLFxuICAgICAgZW52OiByZWNvcmQuZW52ICYmIHJlY29yZC5lbnYubGVuZ3RoID4gMCA/IHJlY29yZC5lbnYgOiBcIlVOS05PV05cIixcbiAgICAgIHVybDogdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiA/IFwibG9jYWw6Ly9cIiA6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxuICAgIH0pXG5cbiAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgZmx1c2ggaW1tZWRpYXRlbHkgZHVlIHRvIHF1ZXVlIGRlcHRoXG4gICAgaWYgKHRoaXMucGVuZGluZ1JlY29yZHMubGVuZ3RoID49IEZMVVNIX1FVRVVFX0RFUFRIKSB7XG4gICAgICB0aGlzLmZsdXNoKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBFcnJvcnMgaGFuZGxlZCBpbiBmbHVzaFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2NoZWR1bGUgYSBmbHVzaCBpZiBub3QgYWxyZWFkeSBzY2hlZHVsZWRcbiAgICAgIHRoaXMuc2NoZWR1bGVGbHVzaCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlIGEgZmx1c2ggYWZ0ZXIgdGhlIGludGVydmFsXG4gICAqL1xuICBwcml2YXRlIHNjaGVkdWxlRmx1c2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmx1c2hUaW1lcikge1xuICAgICAgcmV0dXJuIC8vIEFscmVhZHkgc2NoZWR1bGVkXG4gICAgfVxuXG4gICAgdGhpcy5mbHVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmZsdXNoVGltZXIgPSBudWxsXG4gICAgICB0aGlzLmZsdXNoKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBFcnJvcnMgaGFuZGxlZCBpbiBmbHVzaFxuICAgICAgfSlcbiAgICB9LCBGTFVTSF9JTlRFUlZBTF9NUylcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCBwZW5kaW5nIHJlY29yZHMgdG8gdGhlIGVuZHBvaW50XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFByZXZlbnQgY29uY3VycmVudCBmbHVzaGVzXG4gICAgaWYgKHRoaXMuZmx1c2hEZWZlcnJlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmx1c2hEZWZlcnJlZC5wcm9taXNlXG4gICAgfVxuXG4gICAgLy8gTm90aGluZyB0byBmbHVzaFxuICAgIGlmICghdGhpcy5wZW5kaW5nUmVjb3Jkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEVuc3VyZSB3ZSBoYXZlIHZhbGlkIGNyZWRlbnRpYWxzXG4gICAgY29uc3QgaGFzQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLmNyZWRlbnRpYWxNYW5hZ2VyLmVuc3VyZUNyZWRlbnRpYWxzKClcbiAgICBpZiAoIWhhc0NyZWRlbnRpYWxzKSB7XG4gICAgICBsb2cuZGVidWcoXCJGYWlsZWQgdG8gcHVzaCBsb2cgcmVjb3Jkc1wiLCBcIk5vIHZhbGlkIGNyZWRlbnRpYWxzIGF2YWlsYWJsZVwiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZGVmZXJyZWQgPSAodGhpcy5mbHVzaERlZmVycmVkID0gbmV3IERlZmVycmVkPHZvaWQ+KCkpXG5cbiAgICB0cnkge1xuICAgICAgLy8gVGFrZSBhbGwgcGVuZGluZyByZWNvcmRzIGZvciB0aGlzIGZsdXNoXG4gICAgICBjb25zdCByZWNvcmRzID0gdGhpcy5wZW5kaW5nUmVjb3Jkcy5zcGxpY2UoMCwgdGhpcy5wZW5kaW5nUmVjb3Jkcy5sZW5ndGgpXG4gICAgICBjb25zdCBwYXlsb2FkID0geyByZWNvcmRzOiByZWNvcmRzLm1hcChyZWNvcmQgPT4gSlNPTi5zdHJpbmdpZnkocmVjb3JkKSkgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHRoaXMuZW5kcG9pbnRVcmwsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICBtb2RlOiBcImNvcnNcIixcbiAgICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgICB9KVxuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIC8vIFJlLXF1ZXVlIHJlY29yZHMgb24gZmFpbHVyZVxuICAgICAgICB0aGlzLnBlbmRpbmdSZWNvcmRzLnVuc2hpZnQoLi4ucmVjb3JkcylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQdXNoIGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c31gKVxuICAgICAgfVxuXG4gICAgICBkZWZlcnJlZC5yZXNvbHZlKClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5kZWJ1ZyhcIkZhaWxlZCB0byBwdXNoIGxvZyByZWNvcmRzXCIsIGVycilcbiAgICAgIGRlZmVycmVkLnJlamVjdChlcnIpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZmx1c2hEZWZlcnJlZCA9IG51bGxcblxuICAgICAgLy8gSWYgbW9yZSByZWNvcmRzIGFjY3VtdWxhdGVkIGR1cmluZyBmbHVzaCwgc2NoZWR1bGUgYW5vdGhlclxuICAgICAgaWYgKHRoaXMucGVuZGluZ1JlY29yZHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlRmx1c2goKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgYW4gaW1tZWRpYXRlIGZsdXNoXG4gICAqL1xuICBhc3luYyBmb3JjZUZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmZsdXNoVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZsdXNoVGltZXIpXG4gICAgICB0aGlzLmZsdXNoVGltZXIgPSBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZmx1c2goKVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHJlc291cmNlc1xuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mbHVzaFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5mbHVzaFRpbWVyKVxuICAgICAgdGhpcy5mbHVzaFRpbWVyID0gbnVsbFxuICAgIH1cblxuICAgIHRoaXMuY3JlZGVudGlhbE1hbmFnZXIuZGVzdHJveSgpXG5cbiAgICBpZiAodGhpcy5mbHVzaERlZmVycmVkICYmICF0aGlzLmZsdXNoRGVmZXJyZWQuaXNTZXR0bGVkKCkpIHtcbiAgICAgIHRoaXMuZmx1c2hEZWZlcnJlZC5yZWplY3QobmV3IEVycm9yKFwiQXBwZW5kZXIgZGVzdHJveWVkXCIpKVxuICAgIH1cblxuICAgIHRoaXMuZmx1c2hEZWZlcnJlZCA9IG51bGxcbiAgICB0aGlzLnBlbmRpbmdSZWNvcmRzID0gW11cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQdXNoTG9nUmVjb3Jkc0FwcGVuZGVyXG4iXX0=
291
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHVzaExvZ1JlY29yZHNBcHBlbmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9sb2dnaW5nL2FwcGVuZGVycy9wdXNoL1B1c2hMb2dSZWNvcmRzQXBwZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLE9BQU8sYUFBYSxNQUFNLGVBQWUsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFHcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFFM0QsbURBQW1EO0FBQ25ELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUEsQ0FBQyxhQUFhO0FBQ3hELE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUEsQ0FBQyxzQ0FBc0M7QUFDckYsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUE7QUFDOUIsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFBLENBQUMsYUFBYTtBQUNoRCxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQTtBQUNuQyxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUE7QUFFbEMsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQTtBQU8vQjs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sK0JBQWdDLFNBQVEsYUFBc0Q7SUFLN0U7SUFKcEIsWUFBWSxHQUF5QyxJQUFJLENBQUE7SUFDekQsa0JBQWtCLEdBQTBCLElBQUksQ0FBQTtJQUNoRCxvQkFBb0IsR0FBa0IsSUFBSSxDQUFBO0lBRWxELFlBQTRCLFdBQW1CO1FBQzdDLEtBQUssRUFBRSxDQUFBO1FBRG1CLGdCQUFXLEdBQVgsV0FBVyxDQUFRO0lBRS9DLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDL0IsT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQTtZQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ3BCLE9BQU8sS0FBSyxDQUFBO1FBQ2QsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGlCQUFpQjtRQUNyQixtREFBbUQ7UUFDbkQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQTtRQUNiLENBQUM7UUFFRCxpREFBaUQ7UUFDakQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUNwRSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFBO2dCQUNyQyxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtZQUM5QixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLE9BQU8sS0FBSyxDQUFBO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFFRCx3QkFBd0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQTtRQUMxQixDQUFDO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQTtRQUVoQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO1lBQ3BFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFBO1FBQ3RFLENBQUM7UUFDRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFBO1FBRTlCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDakMseUVBQXlFO1FBQzNFLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLGdCQUFnQjtRQUM1QixNQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLFFBQVEsRUFBUSxDQUFDLENBQUE7UUFFakUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDN0MsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsSUFBSSxFQUFFLE1BQU07Z0JBQ1osV0FBVyxFQUFFLFNBQVM7Z0JBQ3RCLE9BQU8sRUFBRTtvQkFDUCxjQUFjLEVBQUUsa0JBQWtCO2lCQUNuQztnQkFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7YUFDekIsQ0FBQyxDQUFBO1lBRUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FDYix5Q0FBeUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUMzRCxDQUFBO1lBQ0gsQ0FBQztZQUVELHVFQUF1RTtZQUN2RSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLG9CQUFvQixDQUFBO1lBRTdELHFDQUFxQztZQUNyQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7WUFFdEIsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFBO1lBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFckIsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLEdBQUcsQ0FBQyxJQUFJLENBQUMsc0NBQXNDLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFDckQsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNwQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFBO1lBQzlCLE9BQU8sS0FBSyxDQUFBO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGVBQWU7UUFDckIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUNqQyxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsb0JBQW9CLEdBQUcsd0JBQXdCLENBQUE7UUFDakUsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUE7WUFDOUIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDakMsbURBQW1EO2dCQUNuRCxHQUFHLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUE7WUFDbEQsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDZixDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQTtRQUMxQixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUNwRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQTtRQUMzRSxDQUFDO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQTtRQUM5QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFBO0lBQ2xDLENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxzQkFBc0I7SUFTTDtJQU5wQixjQUFjLEdBQWdCLEVBQUUsQ0FBQTtJQUNoQyxhQUFhLEdBQTBCLElBQUksQ0FBQTtJQUMzQyxVQUFVLEdBQXlDLElBQUksQ0FBQTtJQUUvQyxpQkFBaUIsQ0FBaUM7SUFFbEUsWUFBNEIsV0FBbUI7UUFBbkIsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDN0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksK0JBQStCLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFekUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3RELE9BQU07WUFDUixDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7Z0JBQ3RCLDBCQUEwQjtZQUM1QixDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE1BQWM7UUFDbkIsd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3JCLEdBQUcsTUFBTTtZQUNULEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNqRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDakUsR0FBRyxFQUFFLE9BQU8sTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUk7U0FDdkUsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUE7UUFFbkMsMERBQTBEO1FBQzFELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDdEIsMEJBQTBCO1lBQzVCLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTiw0Q0FBNEM7WUFDNUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhO1FBQ25CLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLE9BQU0sQ0FBQyxvQkFBb0I7UUFDN0IsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNoQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQTtZQUN0QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDdEIsMEJBQTBCO1lBQzVCLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUE7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLEtBQUs7UUFDakIsNkJBQTZCO1FBQzdCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUE7UUFDbkMsQ0FBQztRQUVELG1CQUFtQjtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxPQUFNO1FBQ1IsQ0FBQztRQUVELG1DQUFtQztRQUNuQyxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQ3ZFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixHQUFHLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFLGdDQUFnQyxDQUFDLENBQUE7WUFDekUsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxRQUFRLEVBQVEsQ0FBQyxDQUFBO1FBRTVELElBQUksQ0FBQztZQUNILDBDQUEwQztZQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUN6RSxNQUFNLE9BQU8sR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUE7WUFFMUUsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDN0MsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsSUFBSSxFQUFFLE1BQU07Z0JBQ1osV0FBVyxFQUFFLFNBQVM7Z0JBQ3RCLE9BQU8sRUFBRTtvQkFDUCxjQUFjLEVBQUUsa0JBQWtCO2lCQUNuQztnQkFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7YUFDOUIsQ0FBQyxDQUFBO1lBRUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDakIsOEJBQThCO2dCQUM5QixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFBO2dCQUN2QyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQTtnQkFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7WUFDL0QsQ0FBQztZQUVELFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNwQixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLEdBQUcsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEVBQUUsR0FBRyxDQUFDLENBQUE7WUFDNUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUN0QixDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtZQUV6Qiw2REFBNkQ7WUFDN0QsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFBO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxVQUFVO1FBQ2QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQTtRQUN4QixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssNEJBQTRCO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLHFCQUFxQixDQUFBO1FBRXRFLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUM1QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7UUFDeEIsQ0FBQztRQUVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUVoQyxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFBO1FBQzVELENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQTtJQUMxQixDQUFDO0NBQ0Y7QUFFRCxlQUFlLHNCQUFzQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgdHlwZXNjcmlwdC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCBFdmVudEVtaXR0ZXIzIGZyb20gXCJldmVudGVtaXR0ZXIzXCJcbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSBcIi4uLy4uLy4uL2hlbHBlcnMvaW5kZXguanNcIlxuaW1wb3J0IHsgTG9nUmVjb3JkIH0gZnJvbSBcIi4uLy4uL0xvZ1JlY29yZC5qc1wiXG5pbXBvcnQgeyBBcHBlbmRlciB9IGZyb20gXCIuLi8uLi9BcHBlbmRlci5qc1wiXG5pbXBvcnQgeyBnZXRJbnRlcm5hbExvZ2dlciB9IGZyb20gXCIuLi8uLi9JbnRlcm5hbExvZ2dlci5qc1wiXG5cbi8vIENvbnN0YW50cyBmb3IgdHVuaW5nIChhZGp1c3RhYmxlIGluIGRldmVsb3BtZW50KVxuY29uc3QgQ09PS0lFX0VYUElSQVRJT05fTVMgPSA1ICogNjAgKiAxMDAwIC8vIDMwIG1pbnV0ZXNcbmNvbnN0IENPT0tJRV9SRUZSRVNIX0JVRkZFUl9NUyA9IDIgKiA2MCAqIDEwMDAgLy8gUmVmcmVzaCAyIG1pbnV0ZXMgYmVmb3JlIGV4cGlyYXRpb25cbmNvbnN0IEZMVVNIX1FVRVVFX0RFUFRIID0gMTAwMFxuY29uc3QgRkxVU0hfSU5URVJWQUxfTVMgPSA1ICogMTAwMCAvLyAxMCBzZWNvbmRzXG5jb25zdCBMT0dfUVVFVUVfTUFYX1JFQ09SRFMgPSAxMDAwMFxuY29uc3QgQ09PS0lFX05BTUUgPSBcIndpcmVfbG9nc19pZFwiXG5cbmNvbnN0IGxvZyA9IGdldEludGVybmFsTG9nZ2VyKClcblxuaW50ZXJmYWNlIFB1c2hMb2dSZWNvcmRzQ3JlZGVudGlhbE1hbmFnZXJFdmVudE1hcCB7XG4gIHJlY2VpdmVkOiAoKSA9PiB2b2lkXG4gIGV4cGlyZWQ6ICgpID0+IHZvaWRcbn1cblxuLyoqXG4gKiBNYW5hZ2VzIGNyZWRlbnRpYWwgY29va2llIGZvciBQdXNoTG9nUmVjb3Jkc0FwcGVuZGVyLlxuICogSW52b2tlcyB0aGUgZW5kcG9pbnQgdmlhIFBPU1QgdG8gb2J0YWluIGEgc2Vzc2lvbiBjb29raWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBQdXNoTG9nUmVjb3Jkc0NyZWRlbnRpYWxNYW5hZ2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyMzxQdXNoTG9nUmVjb3Jkc0NyZWRlbnRpYWxNYW5hZ2VyRXZlbnRNYXA+IHtcbiAgcHJpdmF0ZSByZWZyZXNoVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBjcmVkZW50aWFsRGVmZXJyZWQ6IERlZmVycmVkPHZvaWQ+IHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBjb29raWVFeHBpcmF0aW9uVGltZTogbnVtYmVyIHwgbnVsbCA9IG51bGxcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnRVcmw6IHN0cmluZykge1xuICAgIHN1cGVyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB2YWxpZCBjcmVkZW50aWFscyBleGlzdFxuICAgKi9cbiAgaGFzQ3JlZGVudGlhbHMoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvb2tpZUV4cGlyYXRpb25UaW1lKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoRGF0ZS5ub3coKSA+PSB0aGlzLmNvb2tpZUV4cGlyYXRpb25UaW1lKSB7XG4gICAgICB0aGlzLmNvb2tpZUV4cGlyYXRpb25UaW1lID0gbnVsbFxuICAgICAgdGhpcy5lbWl0KFwiZXhwaXJlZFwiKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3JlZGVudGlhbHMsIGZldGNoaW5nIHRoZW0gaWYgbmVjZXNzYXJ5XG4gICAqL1xuICBhc3luYyBlbnN1cmVDcmVkZW50aWFscygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBJZiB3ZSBoYXZlIHZhbGlkIGNyZWRlbnRpYWxzLCByZXR1cm4gaW1tZWRpYXRlbHlcbiAgICBpZiAodGhpcy5oYXNDcmVkZW50aWFscygpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIElmIGEgZmV0Y2ggaXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2FpdCBmb3IgaXRcbiAgICBpZiAodGhpcy5jcmVkZW50aWFsRGVmZXJyZWQgJiYgIXRoaXMuY3JlZGVudGlhbERlZmVycmVkLmlzU2V0dGxlZCgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZC5wcm9taXNlXG4gICAgICAgIHJldHVybiB0aGlzLmhhc0NyZWRlbnRpYWxzKClcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGZXRjaCBuZXcgY3JlZGVudGlhbHNcbiAgICByZXR1cm4gdGhpcy5mZXRjaENyZWRlbnRpYWxzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSByZWZyZXNoIG9mIGNyZWRlbnRpYWxzXG4gICAqL1xuICBmb3JjZVJlZnJlc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVmcmVzaFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWZyZXNoVGltZXIpXG4gICAgICB0aGlzLnJlZnJlc2hUaW1lciA9IG51bGxcbiAgICB9XG5cbiAgICB0aGlzLmNvb2tpZUV4cGlyYXRpb25UaW1lID0gbnVsbFxuXG4gICAgaWYgKHRoaXMuY3JlZGVudGlhbERlZmVycmVkICYmICF0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZC5pc1NldHRsZWQoKSkge1xuICAgICAgdGhpcy5jcmVkZW50aWFsRGVmZXJyZWQucmVqZWN0KG5ldyBFcnJvcihcIkZvcmNlIHJlZnJlc2ggcmVxdWVzdGVkXCIpKVxuICAgIH1cbiAgICB0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZCA9IG51bGxcblxuICAgIHRoaXMuZmV0Y2hDcmVkZW50aWFscygpLmNhdGNoKCgpID0+IHtcbiAgICAgIC8vIElnbm9yZSBlcnJvcnMgZHVyaW5nIGZvcmNlIHJlZnJlc2gsIHRoZXknbGwgYmUgaGFuZGxlZCBvbiBuZXh0IHJlcXVlc3RcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGNyZWRlbnRpYWxzIGZyb20gdGhlIGVuZHBvaW50XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoQ3JlZGVudGlhbHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZGVmZXJyZWQgPSAodGhpcy5jcmVkZW50aWFsRGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQ8dm9pZD4oKSlcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHRoaXMuZW5kcG9pbnRVcmwsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgbW9kZTogXCJjb3JzXCIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHt9KVxuICAgICAgfSlcblxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENyZWRlbnRpYWwgcmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtyZXNwb25zZS5zdGF0dXN9YFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIENvb2tpZSBpcyBzZXQgYnkgU2V0LUNvb2tpZSBoZWFkZXIsIHdlIGp1c3QgbmVlZCB0byB0cmFjayBleHBpcmF0aW9uXG4gICAgICB0aGlzLmNvb2tpZUV4cGlyYXRpb25UaW1lID0gRGF0ZS5ub3coKSArIENPT0tJRV9FWFBJUkFUSU9OX01TXG5cbiAgICAgIC8vIFNjaGVkdWxlIHJlZnJlc2ggYmVmb3JlIGV4cGlyYXRpb25cbiAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKClcblxuICAgICAgZGVmZXJyZWQucmVzb2x2ZSgpXG4gICAgICB0aGlzLmVtaXQoXCJyZWNlaXZlZFwiKVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oXCJGYWlsZWQgdG8gZmV0Y2ggcHVzaCBsb2cgY3JlZGVudGlhbHNcIiwgZXJyKVxuICAgICAgZGVmZXJyZWQucmVqZWN0KGVycilcbiAgICAgIHRoaXMuY3JlZGVudGlhbERlZmVycmVkID0gbnVsbFxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlIGEgY3JlZGVudGlhbCByZWZyZXNoIGJlZm9yZSBleHBpcmF0aW9uXG4gICAqL1xuICBwcml2YXRlIHNjaGVkdWxlUmVmcmVzaCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWZyZXNoVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlZnJlc2hUaW1lcilcbiAgICB9XG5cbiAgICBjb25zdCByZWZyZXNoSW4gPSBDT09LSUVfRVhQSVJBVElPTl9NUyAtIENPT0tJRV9SRUZSRVNIX0JVRkZFUl9NU1xuICAgIHRoaXMucmVmcmVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZCA9IG51bGxcbiAgICAgIHRoaXMuZmV0Y2hDcmVkZW50aWFscygpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gTG9nIGJ1dCBkb24ndCB0aHJvdyAtIHdpbGwgcmV0cnkgb24gbmV4dCByZXF1ZXN0XG4gICAgICAgIGxvZy5kZWJ1ZyhcIlNjaGVkdWxlZCBjcmVkZW50aWFsIHJlZnJlc2ggZmFpbGVkXCIpXG4gICAgICB9KVxuICAgIH0sIHJlZnJlc2hJbilcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCByZXNvdXJjZXNcbiAgICovXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVmcmVzaFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWZyZXNoVGltZXIpXG4gICAgICB0aGlzLnJlZnJlc2hUaW1lciA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jcmVkZW50aWFsRGVmZXJyZWQgJiYgIXRoaXMuY3JlZGVudGlhbERlZmVycmVkLmlzU2V0dGxlZCgpKSB7XG4gICAgICB0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZC5yZWplY3QobmV3IEVycm9yKFwiQ3JlZGVudGlhbCBtYW5hZ2VyIGRlc3Ryb3llZFwiKSlcbiAgICB9XG5cbiAgICB0aGlzLmNyZWRlbnRpYWxEZWZlcnJlZCA9IG51bGxcbiAgICB0aGlzLmNvb2tpZUV4cGlyYXRpb25UaW1lID0gbnVsbFxuICB9XG59XG5cbi8qKlxuICogQXBwZW5kZXIgdGhhdCBwdXNoZXMgbG9nIHJlY29yZHMgdG8gYSByZW1vdGUgZW5kcG9pbnQgdmlhIEhUVFAgUFVULlxuICogQmF0Y2hlcyByZWNvcmRzIGFuZCBzZW5kcyB3aGVuIHF1ZXVlIHJlYWNoZXMgRkxVU0hfUVVFVUVfREVQVEggb3IgRkxVU0hfSU5URVJWQUxfTVMgaGFzIGVsYXBzZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQdXNoTG9nUmVjb3Jkc0FwcGVuZGVyPFxuICBSZWNvcmQgZXh0ZW5kcyBMb2dSZWNvcmQgPSBMb2dSZWNvcmRcbj4gaW1wbGVtZW50cyBBcHBlbmRlcjxSZWNvcmQ+IHtcbiAgcHJpdmF0ZSBwZW5kaW5nUmVjb3JkczogTG9nUmVjb3JkW10gPSBbXVxuICBwcml2YXRlIGZsdXNoRGVmZXJyZWQ6IERlZmVycmVkPHZvaWQ+IHwgbnVsbCA9IG51bGxcbiAgcHJpdmF0ZSBmbHVzaFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsXG5cbiAgcHVibGljIHJlYWRvbmx5IGNyZWRlbnRpYWxNYW5hZ2VyOiBQdXNoTG9nUmVjb3Jkc0NyZWRlbnRpYWxNYW5hZ2VyXG5cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGVuZHBvaW50VXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNyZWRlbnRpYWxNYW5hZ2VyID0gbmV3IFB1c2hMb2dSZWNvcmRzQ3JlZGVudGlhbE1hbmFnZXIoZW5kcG9pbnRVcmwpXG5cbiAgICB0aGlzLmNyZWRlbnRpYWxNYW5hZ2VyLm9uKFwicmVjZWl2ZWRcIiwgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnBlbmRpbmdSZWNvcmRzLmxlbmd0aCB8fCB0aGlzLmZsdXNoRGVmZXJyZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB0aGlzLmZsdXNoKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBFcnJvcnMgaGFuZGxlZCBpbiBmbHVzaFxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZCBhIGxvZyByZWNvcmQgdG8gdGhlIHF1ZXVlXG4gICAqL1xuICBhcHBlbmQocmVjb3JkOiBSZWNvcmQpOiB2b2lkIHtcbiAgICAvLyBBZGQgdGhlIHJlY29yZCB3aXRoIGVucmljaGVkIG1ldGFkYXRhXG4gICAgdGhpcy5wZW5kaW5nUmVjb3Jkcy5wdXNoKHtcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIC4uLnJlY29yZCxcbiAgICAgIGFwcDogcmVjb3JkLmFwcCAmJiByZWNvcmQuYXBwLmxlbmd0aCA+IDAgPyByZWNvcmQuYXBwIDogXCJVTktOT1dOXCIsXG4gICAgICBlbnY6IHJlY29yZC5lbnYgJiYgcmVjb3JkLmVudi5sZW5ndGggPiAwID8gcmVjb3JkLmVudiA6IFwiVU5LTk9XTlwiLFxuICAgICAgdXJsOiB0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiID8gXCJsb2NhbDovL1wiIDogd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICB9KVxuICAgIHRoaXMudHJpbVBlbmRpbmdSZWNvcmRzVG9RdWV1ZUNhcCgpXG5cbiAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgZmx1c2ggaW1tZWRpYXRlbHkgZHVlIHRvIHF1ZXVlIGRlcHRoXG4gICAgaWYgKHRoaXMucGVuZGluZ1JlY29yZHMubGVuZ3RoID49IEZMVVNIX1FVRVVFX0RFUFRIKSB7XG4gICAgICB0aGlzLmZsdXNoKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBFcnJvcnMgaGFuZGxlZCBpbiBmbHVzaFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2NoZWR1bGUgYSBmbHVzaCBpZiBub3QgYWxyZWFkeSBzY2hlZHVsZWRcbiAgICAgIHRoaXMuc2NoZWR1bGVGbHVzaCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlIGEgZmx1c2ggYWZ0ZXIgdGhlIGludGVydmFsXG4gICAqL1xuICBwcml2YXRlIHNjaGVkdWxlRmx1c2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmx1c2hUaW1lcikge1xuICAgICAgcmV0dXJuIC8vIEFscmVhZHkgc2NoZWR1bGVkXG4gICAgfVxuXG4gICAgdGhpcy5mbHVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmZsdXNoVGltZXIgPSBudWxsXG4gICAgICB0aGlzLmZsdXNoKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBFcnJvcnMgaGFuZGxlZCBpbiBmbHVzaFxuICAgICAgfSlcbiAgICB9LCBGTFVTSF9JTlRFUlZBTF9NUylcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCBwZW5kaW5nIHJlY29yZHMgdG8gdGhlIGVuZHBvaW50XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFByZXZlbnQgY29uY3VycmVudCBmbHVzaGVzXG4gICAgaWYgKHRoaXMuZmx1c2hEZWZlcnJlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmx1c2hEZWZlcnJlZC5wcm9taXNlXG4gICAgfVxuXG4gICAgLy8gTm90aGluZyB0byBmbHVzaFxuICAgIGlmICghdGhpcy5wZW5kaW5nUmVjb3Jkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEVuc3VyZSB3ZSBoYXZlIHZhbGlkIGNyZWRlbnRpYWxzXG4gICAgY29uc3QgaGFzQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLmNyZWRlbnRpYWxNYW5hZ2VyLmVuc3VyZUNyZWRlbnRpYWxzKClcbiAgICBpZiAoIWhhc0NyZWRlbnRpYWxzKSB7XG4gICAgICBsb2cuZGVidWcoXCJGYWlsZWQgdG8gcHVzaCBsb2cgcmVjb3Jkc1wiLCBcIk5vIHZhbGlkIGNyZWRlbnRpYWxzIGF2YWlsYWJsZVwiKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZGVmZXJyZWQgPSAodGhpcy5mbHVzaERlZmVycmVkID0gbmV3IERlZmVycmVkPHZvaWQ+KCkpXG5cbiAgICB0cnkge1xuICAgICAgLy8gVGFrZSBhbGwgcGVuZGluZyByZWNvcmRzIGZvciB0aGlzIGZsdXNoXG4gICAgICBjb25zdCByZWNvcmRzID0gdGhpcy5wZW5kaW5nUmVjb3Jkcy5zcGxpY2UoMCwgdGhpcy5wZW5kaW5nUmVjb3Jkcy5sZW5ndGgpXG4gICAgICBjb25zdCBwYXlsb2FkID0geyByZWNvcmRzOiByZWNvcmRzLm1hcChyZWNvcmQgPT4gSlNPTi5zdHJpbmdpZnkocmVjb3JkKSkgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHRoaXMuZW5kcG9pbnRVcmwsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgICBtb2RlOiBcImNvcnNcIixcbiAgICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgIH0pXG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgLy8gUmUtcXVldWUgcmVjb3JkcyBvbiBmYWlsdXJlXG4gICAgICAgIHRoaXMucGVuZGluZ1JlY29yZHMudW5zaGlmdCguLi5yZWNvcmRzKVxuICAgICAgICB0aGlzLnRyaW1QZW5kaW5nUmVjb3Jkc1RvUXVldWVDYXAoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFB1c2ggZmFpbGVkIHdpdGggc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzfWApXG4gICAgICB9XG5cbiAgICAgIGRlZmVycmVkLnJlc29sdmUoKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLmRlYnVnKFwiRmFpbGVkIHRvIHB1c2ggbG9nIHJlY29yZHNcIiwgZXJyKVxuICAgICAgZGVmZXJyZWQucmVqZWN0KGVycilcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5mbHVzaERlZmVycmVkID0gbnVsbFxuXG4gICAgICAvLyBJZiBtb3JlIHJlY29yZHMgYWNjdW11bGF0ZWQgZHVyaW5nIGZsdXNoLCBzY2hlZHVsZSBhbm90aGVyXG4gICAgICBpZiAodGhpcy5wZW5kaW5nUmVjb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVGbHVzaCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSBhbiBpbW1lZGlhdGUgZmx1c2hcbiAgICovXG4gIGFzeW5jIGZvcmNlRmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZmx1c2hUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZmx1c2hUaW1lcilcbiAgICAgIHRoaXMuZmx1c2hUaW1lciA9IG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5mbHVzaCgpXG4gIH1cblxuICAvKipcbiAgICogRW5mb3JjZSB0aGUgcGVuZGluZyBxdWV1ZSBjYXAgYnkgZHJvcHBpbmcgdGhlIG9sZGVzdCByZWNvcmRzLlxuICAgKi9cbiAgcHJpdmF0ZSB0cmltUGVuZGluZ1JlY29yZHNUb1F1ZXVlQ2FwKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlbW92ZUNvdW50ID0gdGhpcy5wZW5kaW5nUmVjb3Jkcy5sZW5ndGggLSBMT0dfUVVFVUVfTUFYX1JFQ09SRFNcblxuICAgIGlmIChyZW1vdmVDb3VudCA+IDApIHtcbiAgICAgIHRoaXMucGVuZGluZ1JlY29yZHMuc3BsaWNlKDAsIHJlbW92ZUNvdW50KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCByZXNvdXJjZXNcbiAgICovXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmx1c2hUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZmx1c2hUaW1lcilcbiAgICAgIHRoaXMuZmx1c2hUaW1lciA9IG51bGxcbiAgICB9XG5cbiAgICB0aGlzLmNyZWRlbnRpYWxNYW5hZ2VyLmRlc3Ryb3koKVxuXG4gICAgaWYgKHRoaXMuZmx1c2hEZWZlcnJlZCAmJiAhdGhpcy5mbHVzaERlZmVycmVkLmlzU2V0dGxlZCgpKSB7XG4gICAgICB0aGlzLmZsdXNoRGVmZXJyZWQucmVqZWN0KG5ldyBFcnJvcihcIkFwcGVuZGVyIGRlc3Ryb3llZFwiKSlcbiAgICB9XG5cbiAgICB0aGlzLmZsdXNoRGVmZXJyZWQgPSBudWxsXG4gICAgdGhpcy5wZW5kaW5nUmVjb3JkcyA9IFtdXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUHVzaExvZ1JlY29yZHNBcHBlbmRlclxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=PushLogRecordsAppender.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PushLogRecordsAppender.test.d.ts","sourceRoot":"","sources":["../../../tests/logging/PushLogRecordsAppender.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const Deferred_1 = require("@wireio/shared/helpers/Deferred");
4
+ const PushLogRecordsAppender_1 = require("@wireio/shared/logging/appenders/push/PushLogRecordsAppender");
5
+ const Level_1 = require("@wireio/shared/logging/Level");
6
+ var HttpMethod;
7
+ (function (HttpMethod) {
8
+ HttpMethod["POST"] = "POST";
9
+ HttpMethod["PUT"] = "PUT";
10
+ })(HttpMethod || (HttpMethod = {}));
11
+ const EndpointUrl = "https://logs.example.test/push";
12
+ const LogCategory = "push-log-records-appender-test";
13
+ const QueueCapRecordCount = 10000;
14
+ const FirstPutRequestNumber = 1;
15
+ const FirstPutRequestIndex = 0;
16
+ const RetryPutRequestIndex = 1;
17
+ const AsyncPollAttempts = 20;
18
+ const HttpStatusOk = 200;
19
+ const HttpStatusServerError = 500;
20
+ const FailedRecordMessage = "failed-record";
21
+ const ConcurrentRecordMessagePrefix = "concurrent-record";
22
+ const createRecord = (message) => ({
23
+ timestamp: Date.now(),
24
+ category: LogCategory,
25
+ level: Level_1.Level.info,
26
+ message,
27
+ args: []
28
+ });
29
+ const createFetchMock = (firstPutResponse) => {
30
+ let putRequestCount = 0;
31
+ return jest.fn((_input, init) => {
32
+ if (init?.method === HttpMethod.POST) {
33
+ return Promise.resolve(new Response(null, { status: HttpStatusOk }));
34
+ }
35
+ if (init?.method === HttpMethod.PUT) {
36
+ putRequestCount += 1;
37
+ return putRequestCount === FirstPutRequestNumber
38
+ ? firstPutResponse.promise
39
+ : Promise.resolve(new Response(null, { status: HttpStatusOk }));
40
+ }
41
+ return Promise.reject(new Error(`Unexpected fetch method: ${init?.method}`));
42
+ });
43
+ };
44
+ const countFetchMethodCalls = (fetchMock, method) => fetchMock.mock.calls.filter(([, init]) => init?.method === method).length;
45
+ const waitForFetchMethodCallCount = async (fetchMock, method, count) => {
46
+ for (let attempt = 0; attempt < AsyncPollAttempts; attempt++) {
47
+ if (countFetchMethodCalls(fetchMock, method) >= count) {
48
+ return;
49
+ }
50
+ await new Promise(resolve => setImmediate(resolve));
51
+ }
52
+ throw new Error(`Expected ${count} ${method} fetch calls`);
53
+ };
54
+ const getPutRequestRecords = (fetchMock, requestIndex) => {
55
+ const putCall = fetchMock.mock.calls.filter(([, init]) => init?.method === HttpMethod.PUT)[requestIndex];
56
+ const body = putCall?.[1]?.body;
57
+ if (typeof body !== "string") {
58
+ throw new Error(`Expected PUT request ${requestIndex} to have a string body`);
59
+ }
60
+ const payload = JSON.parse(body);
61
+ return payload.records.map(record => JSON.parse(record));
62
+ };
63
+ const appendConcurrentRecords = (appender) => {
64
+ Array.from({ length: QueueCapRecordCount }).forEach((_, index) => {
65
+ appender.append(createRecord(`${ConcurrentRecordMessagePrefix}-${index}`));
66
+ });
67
+ };
68
+ describe("PushLogRecordsAppender", () => {
69
+ const originalFetch = global.fetch;
70
+ afterEach(() => {
71
+ global.fetch = originalFetch;
72
+ });
73
+ it("keeps failed-send requeues within the queue cap", async () => {
74
+ const firstPutResponse = new Deferred_1.Deferred();
75
+ const fetchMock = createFetchMock(firstPutResponse);
76
+ global.fetch = fetchMock;
77
+ const appender = new PushLogRecordsAppender_1.PushLogRecordsAppender(EndpointUrl);
78
+ try {
79
+ await expect(appender.credentialManager.ensureCredentials()).resolves.toBe(true);
80
+ appender.append(createRecord(FailedRecordMessage));
81
+ const firstFlush = appender.forceFlush();
82
+ await waitForFetchMethodCallCount(fetchMock, HttpMethod.PUT, FirstPutRequestNumber);
83
+ appendConcurrentRecords(appender);
84
+ firstPutResponse.resolve(new Response(null, { status: HttpStatusServerError }));
85
+ await expect(firstFlush).rejects.toThrow(`Push failed with status ${HttpStatusServerError}`);
86
+ await appender.forceFlush();
87
+ const firstPutRecords = getPutRequestRecords(fetchMock, FirstPutRequestIndex);
88
+ const retryPutRecords = getPutRequestRecords(fetchMock, RetryPutRequestIndex);
89
+ expect(firstPutRecords).toHaveLength(FirstPutRequestNumber);
90
+ expect(firstPutRecords[0].message).toBe(FailedRecordMessage);
91
+ expect(retryPutRecords).toHaveLength(QueueCapRecordCount);
92
+ expect(retryPutRecords[0].message).toBe(`${ConcurrentRecordMessagePrefix}-0`);
93
+ expect(retryPutRecords).not.toEqual(expect.arrayContaining([
94
+ expect.objectContaining({ message: FailedRecordMessage })
95
+ ]));
96
+ }
97
+ finally {
98
+ appender.destroy();
99
+ }
100
+ });
101
+ });
102
+ //# sourceMappingURL=PushLogRecordsAppender.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PushLogRecordsAppender.test.js","sourceRoot":"","sources":["../../../tests/logging/PushLogRecordsAppender.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Deferred } from \"@wireio/shared/helpers/Deferred\"\nimport { PushLogRecordsAppender } from \"@wireio/shared/logging/appenders/push/PushLogRecordsAppender\"\nimport { Level } from \"@wireio/shared/logging/Level\"\nimport type { LogRecord } from \"@wireio/shared/logging/LogRecord\"\n\nenum HttpMethod {\n POST = \"POST\",\n PUT = \"PUT\"\n}\n\nconst EndpointUrl = \"https://logs.example.test/push\"\nconst LogCategory = \"push-log-records-appender-test\"\nconst QueueCapRecordCount = 10000\nconst FirstPutRequestNumber = 1\nconst FirstPutRequestIndex = 0\nconst RetryPutRequestIndex = 1\nconst AsyncPollAttempts = 20\nconst HttpStatusOk = 200\nconst HttpStatusServerError = 500\nconst FailedRecordMessage = \"failed-record\"\nconst ConcurrentRecordMessagePrefix = \"concurrent-record\"\n\ninterface PushLogPayload {\n records: string[]\n}\n\nconst createRecord = (message: string): LogRecord => ({\n timestamp: Date.now(),\n category: LogCategory,\n level: Level.info,\n message,\n args: []\n})\n\nconst createFetchMock = (\n firstPutResponse: Deferred<Response>\n): jest.MockedFunction<typeof fetch> => {\n let putRequestCount = 0\n\n return jest.fn<ReturnType<typeof fetch>, Parameters<typeof fetch>>(\n (_input, init) => {\n if (init?.method === HttpMethod.POST) {\n return Promise.resolve(new Response(null, { status: HttpStatusOk }))\n }\n\n if (init?.method === HttpMethod.PUT) {\n putRequestCount += 1\n\n return putRequestCount === FirstPutRequestNumber\n ? firstPutResponse.promise\n : Promise.resolve(new Response(null, { status: HttpStatusOk }))\n }\n\n return Promise.reject(\n new Error(`Unexpected fetch method: ${init?.method}`)\n )\n }\n ) as jest.MockedFunction<typeof fetch>\n}\n\nconst countFetchMethodCalls = (\n fetchMock: jest.MockedFunction<typeof fetch>,\n method: HttpMethod\n): number =>\n fetchMock.mock.calls.filter(([, init]) => init?.method === method).length\n\nconst waitForFetchMethodCallCount = async (\n fetchMock: jest.MockedFunction<typeof fetch>,\n method: HttpMethod,\n count: number\n): Promise<void> => {\n for (let attempt = 0; attempt < AsyncPollAttempts; attempt++) {\n if (countFetchMethodCalls(fetchMock, method) >= count) {\n return\n }\n\n await new Promise<void>(resolve => setImmediate(resolve))\n }\n\n throw new Error(`Expected ${count} ${method} fetch calls`)\n}\n\nconst getPutRequestRecords = (\n fetchMock: jest.MockedFunction<typeof fetch>,\n requestIndex: number\n): LogRecord[] => {\n const putCall = fetchMock.mock.calls.filter(\n ([, init]) => init?.method === HttpMethod.PUT\n )[requestIndex]\n const body = putCall?.[1]?.body\n\n if (typeof body !== \"string\") {\n throw new Error(\n `Expected PUT request ${requestIndex} to have a string body`\n )\n }\n\n const payload = JSON.parse(body) as PushLogPayload\n return payload.records.map(record => JSON.parse(record) as LogRecord)\n}\n\nconst appendConcurrentRecords = (appender: PushLogRecordsAppender): void => {\n Array.from({ length: QueueCapRecordCount }).forEach((_, index) => {\n appender.append(createRecord(`${ConcurrentRecordMessagePrefix}-${index}`))\n })\n}\n\ndescribe(\"PushLogRecordsAppender\", () => {\n const originalFetch = global.fetch\n\n afterEach(() => {\n global.fetch = originalFetch\n })\n\n it(\"keeps failed-send requeues within the queue cap\", async () => {\n const firstPutResponse = new Deferred<Response>()\n const fetchMock = createFetchMock(firstPutResponse)\n global.fetch = fetchMock\n\n const appender = new PushLogRecordsAppender(EndpointUrl)\n\n try {\n await expect(\n appender.credentialManager.ensureCredentials()\n ).resolves.toBe(true)\n\n appender.append(createRecord(FailedRecordMessage))\n const firstFlush = appender.forceFlush()\n await waitForFetchMethodCallCount(\n fetchMock,\n HttpMethod.PUT,\n FirstPutRequestNumber\n )\n\n appendConcurrentRecords(appender)\n\n firstPutResponse.resolve(\n new Response(null, { status: HttpStatusServerError })\n )\n await expect(firstFlush).rejects.toThrow(\n `Push failed with status ${HttpStatusServerError}`\n )\n\n await appender.forceFlush()\n\n const firstPutRecords = getPutRequestRecords(\n fetchMock,\n FirstPutRequestIndex\n )\n const retryPutRecords = getPutRequestRecords(\n fetchMock,\n RetryPutRequestIndex\n )\n\n expect(firstPutRecords).toHaveLength(FirstPutRequestNumber)\n expect(firstPutRecords[0].message).toBe(FailedRecordMessage)\n expect(retryPutRecords).toHaveLength(QueueCapRecordCount)\n expect(retryPutRecords[0].message).toBe(\n `${ConcurrentRecordMessagePrefix}-0`\n )\n expect(retryPutRecords).not.toEqual(\n expect.arrayContaining([\n expect.objectContaining({ message: FailedRecordMessage })\n ])\n )\n } finally {\n appender.destroy()\n }\n })\n})\n"]}