sliftutils 1.7.23 → 1.7.24

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.
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
6
- //exports.getMainPortAcquireDelay = exports.getFlushDeadline = exports.getTakeoverAltPort = exports.getTakeoverStamp = exports.applyDeployRemap = exports.onTakeoverEvent = exports.registerAltPort = exports.initDeployTakeover = void 0;
6
+ //exports.getMainPortAcquireDelay = exports.getTakeoverAltPort = exports.getTakeoverStamp = exports.applyDeployRemap = exports.onTakeoverEvent = exports.registerAltPort = exports.initDeployTakeover = void 0;
7
7
  const fs_1 = __importDefault(require("fs"));
8
8
  const path_1 = __importDefault(require("path"));
9
9
  const child_process_1 = require("child_process");
@@ -32,12 +32,6 @@ const PORT_REGISTRY_FOLDER_NAME = "storagePortRegistry";
32
32
  const ACQUIRE_SLOW_DELAY = 30 * 1000;
33
33
  const ACQUIRE_FAST_DELAY = 5 * 1000;
34
34
  const ACQUIRE_FAST_WINDOW = 60 * 1000;
35
- // Disk rescans fire this far before and after the write handoff, catching files the other process
36
- // wrote (the BulkDatabase2 index is atomic but its entries land at write time, not file time)
37
- const SWITCH_SCAN_LEAD = 10 * 1000;
38
- // The dying process must have flushed everything before the handoff: fast-write delays never
39
- // extend past S + overlap * this fraction, and after that point fast writes flush immediately
40
- const FLUSH_DEADLINE_FRACTION = 0.25;
41
35
  const BOUNDARY_A_FRACTION = 0.5;
42
36
  const BOUNDARY_B_FRACTION = 1.5;
43
37
  const REMAP_EXPIRE_FRACTION = 2;
@@ -190,36 +184,16 @@ function scheduleEvents() {
190
184
  const remap = current.remap;
191
185
  if (remap) {
192
186
  let altPort = remap.altPort;
193
- schedule(remap.boundaryA - SWITCH_SCAN_LEAD, () => emit("diskScan"));
194
187
  schedule(remap.boundaryA, () => console.log(`${logPrefix()} Deploy switchover write handoff boundary ${iso(remap.boundaryA)} passed: fresh writes now belong to the alternate-port side (port ${altPort})`));
195
- schedule(remap.boundaryA + SWITCH_SCAN_LEAD, () => emit("diskScan"));
196
188
  schedule(remap.boundaryB, () => console.log(`${logPrefix()} Deploy switchover second boundary ${iso(remap.boundaryB)} passed: fresh writes return to the main port`));
197
189
  schedule(remap.expire, () => void recompute().catch((e) => { var _a; return console.error(`Deploy takeover recompute failed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`); }));
198
190
  }
199
- let dying = current.dying;
200
- if (dying) {
201
- let deadline = dying.successorStart + dying.overlap * FLUSH_DEADLINE_FRACTION;
202
- let killTime = dying.successorStart + dying.overlap;
203
- let logDeadline = () => {
204
- if (loggedFlushDeadlineFor === deadline)
205
- return;
206
- loggedFlushDeadlineFor = deadline;
207
- console.log(`${logPrefix()} Deploy switchover flush deadline ${iso(deadline)} reached (now ${iso(Date.now())}): fast writes write through immediately until we are killed at ${iso(killTime)}`);
208
- };
209
- if (deadline <= now) {
210
- logDeadline();
211
- }
212
- else {
213
- schedule(deadline, logDeadline);
214
- }
215
- }
216
191
  }
217
192
  // Multiple processes (predecessor + successor) often share one journal during a switchover, so
218
193
  // every lifecycle line identifies its process
219
194
  function logPrefix() {
220
195
  return `[pid ${process.pid}]`;
221
196
  }
222
- let loggedFlushDeadlineFor;
223
197
  // Recompute is invoked from init, registerAltPort, the poll, and the expiry timer - possibly
224
198
  // concurrently. Runs are serialized, or two in-flight runs would both pass the changed-state check
225
199
  // and double-fire every transition (logs, rebuild events, timers).
@@ -273,9 +247,10 @@ async function recomputeNow() {
273
247
  if (next) {
274
248
  let successorStart = next.release;
275
249
  let overlap = next.entry.parameters.overlapTime || us.parameters.overlapTime || 0;
276
- // Even a ZERO-overlap deploy needs the dying behaviors - draining fast-write flushes
277
- // by the release and writing through after it, or acknowledged data dies with us.
278
- // Only the remap (the alternate-port middle window) needs an actual overlap.
250
+ // Tracked even for a ZERO-overlap deploy (the scheduled-switchover log must still
251
+ // fire); only the remap (the alternate-port middle window) needs an actual overlap.
252
+ // Flushing before the handoff needs nothing special here: the remap ends our valid
253
+ // window, and fast writes always flush ahead of their window's end.
279
254
  computed.dying = { successorStart, overlap };
280
255
  if (overlap > 0 && now < successorStart + overlap * REMAP_EXPIRE_FRACTION) {
281
256
  const successorPid = next.entry.pid;
@@ -312,7 +287,7 @@ function iso(time) {
312
287
  function logTransitions(prev, next) {
313
288
  if (!prev.dying && next.dying) {
314
289
  let { successorStart, overlap } = next.dying;
315
- console.log(`${logPrefix()} Deploy switchover scheduled: our successor starts at ${iso(successorStart)}; fast-write flushes drain by ${iso(successorStart + overlap * FLUSH_DEADLINE_FRACTION)}, fresh writes hand off at ${iso(successorStart + overlap * BOUNDARY_A_FRACTION)}, and we are killed at ${iso(successorStart + overlap)}`);
290
+ console.log(`${logPrefix()} Deploy switchover scheduled: our successor starts at ${iso(successorStart)}; fresh writes hand off at ${iso(successorStart + overlap * BOUNDARY_A_FRACTION)}, and we are killed at ${iso(successorStart + overlap)}`);
316
291
  }
317
292
  if (!prev.predecessorEnd && next.predecessorEnd) {
318
293
  console.log(`${logPrefix()} We are a deploy successor: our predecessor holds the main port until ${iso(next.predecessorEnd)}`);
@@ -326,7 +301,7 @@ function logTransitions(prev, next) {
326
301
  }
327
302
  /** Starts the takeover machinery. Port fallback (alternate port + registry + acquisition polling)
328
303
  * works regardless; without a deploy timeline folder the switchover-specific parts (the remap,
329
- * the flush deadline, the tighter acquisition pacing) simply stay inert. */
304
+ * the tighter acquisition pacing) simply stay inert. */
330
305
  async function initDeployTakeover(config) {
331
306
  var _a, _b;
332
307
  initialized = config;
@@ -430,15 +405,6 @@ function getTakeoverAltPort() {
430
405
  return (_a = current.remap) === null || _a === void 0 ? void 0 : _a.altPort;
431
406
  }
432
407
  exports.getTakeoverAltPort = getTakeoverAltPort;
433
- /** For the dying process: fast-write flush delays must never extend past this time, and after it
434
- * fast writes flush immediately - so nothing is left in memory when the write window transfers. */
435
- function getFlushDeadline() {
436
- let dying = current.dying;
437
- if (!dying)
438
- return undefined;
439
- return dying.successorStart + dying.overlap * FLUSH_DEADLINE_FRACTION;
440
- }
441
- exports.getFlushDeadline = getFlushDeadline;
442
408
  /** How long to wait between main-port acquisition attempts: tight around the predecessor's
443
409
  * scheduled death (when the port actually frees), relaxed otherwise. */
444
410
  function getMainPortAcquireDelay() {
@@ -449,5 +415,5 @@ function getMainPortAcquireDelay() {
449
415
  return ACQUIRE_SLOW_DELAY;
450
416
  }
451
417
  exports.getMainPortAcquireDelay = getMainPortAcquireDelay;
452
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95VGFrZW92ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3lUYWtlb3Zlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLGlEQUFxQztBQUVyQyxpREFBc0U7QUFFdEUsaUdBQWlHO0FBQ2pHLGlHQUFpRztBQUNqRyxrR0FBa0c7QUFDbEcsOEZBQThGO0FBQzlGLCtGQUErRjtBQUMvRixpR0FBaUc7QUFDakcsbUdBQW1HO0FBQ25HLDBGQUEwRjtBQUMxRixrR0FBa0c7QUFDbEcsK0ZBQStGO0FBQy9GLEVBQUU7QUFDRixpR0FBaUc7QUFDakcsZ0dBQWdHO0FBQ2hHLGlDQUFpQztBQUVqQyxNQUFNLDhCQUE4QixHQUFHLDBCQUEwQixDQUFDO0FBQ2xFLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN6QyxtR0FBbUc7QUFDbkcsK0ZBQStGO0FBQy9GLDhEQUE4RDtBQUM5RCxNQUFNLHlCQUF5QixHQUFHLHFCQUFxQixDQUFDO0FBQ3hELG1HQUFtRztBQUNuRyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDckMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN0QyxrR0FBa0c7QUFDbEcsOEZBQThGO0FBQzlGLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNuQyw2RkFBNkY7QUFDN0YsOEZBQThGO0FBQzlGLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBdUJoQyxJQUFJLFdBQW9GLENBQUM7QUFDekYsSUFB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IjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IFJlbW90ZUNvbmZpZywgUmVtb3RlQ29uZmlnQmFzZSwgSG9zdGVkQ29uZmlnIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgcGFyc2VIb3N0ZWRVcmwsIHJlcGxhY2VIb3N0ZWRVcmxQb3J0IH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5cbi8vIERlcGxveSB0YWtlb3ZlcjogdGhlIGRlcGxveSBtYW5hZ2VyIChxdWVyeXN1YidzIHBhcmFtZXRlcnNUaW1lbGluZSkgd3JpdGVzIDxuPi1wYXJhbWV0ZXJzLmpzb25cbi8vIGZpbGVzIGludG8gb3VyIGluc3RhbmNlIGZvbGRlciBkZXNjcmliaW5nIHdoZW4gZWFjaCB2ZXJzaW9uIHJ1bnMgYW5kIHdoZW4gaXQgaXMgc2h1dCBkb3duLiBPbGRcbi8vIGFuZCBuZXcgdmVyc2lvbiBvdmVybGFwIGZvciB0aGUgb3ZlcmxhcCB0aW1lIChPID0gb2xkRW5kIC0gbmV3U3RhcnQpLiBXZSB0dXJuIHRoYXQgb3ZlcmxhcCBpbnRvXG4vLyBhbiBhdG9taWMgd3JpdGUgaGFuZG9mZiBieSBSRUlOVEVSUFJFVElORyBldmVyeSByb3V0aW5nIHNvdXJjZSB0aGF0IHBvaW50cyBhdCB1czogaXRzIHZhbGlkXG4vLyB3aW5kb3cgaXMgc3BsaXQgc28gdGhhdCB0aGUgbWlkZGxlIG9mIHRoZSBvdmVybGFwIChbUyArIDAuNSpPLCBTICsgMS41Kk9dKSBwb2ludHMgYXQgdGhlIG5ld1xuLy8gcHJvY2VzcydzIHRlbXBvcmFyeSBhbHRlcm5hdGUgcG9ydC4gVGhlIGV4aXN0aW5nIHZhbGlkLXdpbmRvdyBtYWNoaW5lcnkgdGhlbiBkb2VzIGV2ZXJ5dGhpbmcgLVxuLy8gdGhlIG9sZCBwcm9jZXNzIHN0YXJ0cyByZWplY3RpbmcgZnJlc2ggd3JpdGVzIGF0IHRoZSBmaXJzdCBib3VuZGFyeSwgY2xpZW50cyByZS1yZXNvbHZlLCBhbmQgdGhlXG4vLyBuZXcgcHJvY2VzcyAod2hpY2ggcmVjb2duaXplcyB0aGUgYWx0ZXJuYXRlIHBvcnQgYXMgaXRzZWxmKSB0YWtlcyBvdmVyLiBUaGUgcmVtYXAgaXMgYW5cbi8vIElOVEVSUFJFVEFUSU9OIE9WRVJMQVksIGFwcGxpZWQgd2hlcmUgcm91dGluZyBjb25maWdzIGFyZSB1c2VkIChzZWUgYXBwbHlEZXBsb3lSZW1hcCBjYWxsZXJzKSAtXG4vLyBpdCBpcyBuZXZlciB3cml0dGVuIHRvIGRpc2ssIG5ldmVyIHN5bmNocm9uaXplZCwgYW5kIG5ldmVyIHBhcnQgb2YgYW55IHN0b3JlZCBjb25maWd1cmF0aW9uLlxuLy9cbi8vIEV2ZXJ5dGhpbmcgaGVyZSBpcyByZWNvbXB1dGVkIGlkZW1wb3RlbnRseSBmcm9tIGl0cyBpbnB1dHMgKHRpbWVsaW5lIGZpbGVzLCB0aGUgcG9ydCByZWdpc3RyeSxcbi8vIG91ciBhbmNlc3RvciBwaWRzLCB0aGUgY2xvY2spIC0gZmlsZXMgY2FuIGFwcGVhciBvciBjaGFuZ2UgYXQgYW55IG1vbWVudCwgYW5kIHdlIGNhbiBzdGFydCBhdFxuLy8gYW55IHBvaW50IGR1cmluZyBhIHN3aXRjaG92ZXIuXG5cbmNvbnN0IFBBUkFNRVRFUlNfVElNRUxJTkVfRklMRV9SRUdFWCA9IC9eKFxcZCspLXBhcmFtZXRlcnNcXC5qc29uJC87XG5jb25zdCBUSU1FTElORV9QT0xMX0lOVEVSVkFMID0gNjAgKiAxMDAwO1xuLy8gUHJvY2Vzc2VzIGxpc3RlbmluZyBvbiBhbiBhbHRlcm5hdGUgcG9ydCByZWdpc3RlciBpdCBoZXJlIChzaWJsaW5nIG9mIHRoZSBzdG9yYWdlIGZvbGRlciksIGtleWVkXG4vLyBieSB0aGVpciBhY3R1YWwgcGlkOyBjb250ZW50IGluY2x1ZGVzIHRoZWlyIGFuY2VzdG9yIHBpZHMgc28gdGhlIHRpbWVsaW5lIGVudHJ5IHBpZCAoYSBzaGVsbFxuLy8gYW5jZXN0b3Igb2YgdGhlIHByb2Nlc3MpIGNhbiBiZSBtYXRjaGVkIHRvIGEgcmVnaXN0cnkgZW50cnlcbmNvbnN0IFBPUlRfUkVHSVNUUllfRk9MREVSX05BTUUgPSBcInN0b3JhZ2VQb3J0UmVnaXN0cnlcIjtcbi8vIE1haW4tcG9ydCBhY3F1aXNpdGlvbiBhdHRlbXB0cyBydW4gdGhpcyBvZnRlbiwgdGlnaHRlbmluZyBuZWFyIHRoZSBwcmVkZWNlc3NvcidzIHNjaGVkdWxlZCBkZWF0aFxuY29uc3QgQUNRVUlSRV9TTE9XX0RFTEFZID0gMzAgKiAxMDAwO1xuY29uc3QgQUNRVUlSRV9GQVNUX0RFTEFZID0gNSAqIDEwMDA7XG5jb25zdCBBQ1FVSVJFX0ZBU1RfV0lORE9XID0gNjAgKiAxMDAwO1xuLy8gRGlzayByZXNjYW5zIGZpcmUgdGhpcyBmYXIgYmVmb3JlIGFuZCBhZnRlciB0aGUgd3JpdGUgaGFuZG9mZiwgY2F0Y2hpbmcgZmlsZXMgdGhlIG90aGVyIHByb2Nlc3Ncbi8vIHdyb3RlICh0aGUgQnVsa0RhdGFiYXNlMiBpbmRleCBpcyBhdG9taWMgYnV0IGl0cyBlbnRyaWVzIGxhbmQgYXQgd3JpdGUgdGltZSwgbm90IGZpbGUgdGltZSlcbmNvbnN0IFNXSVRDSF9TQ0FOX0xFQUQgPSAxMCAqIDEwMDA7XG4vLyBUaGUgZHlpbmcgcHJvY2VzcyBtdXN0IGhhdmUgZmx1c2hlZCBldmVyeXRoaW5nIGJlZm9yZSB0aGUgaGFuZG9mZjogZmFzdC13cml0ZSBkZWxheXMgbmV2ZXJcbi8vIGV4dGVuZCBwYXN0IFMgKyBvdmVybGFwICogdGhpcyBmcmFjdGlvbiwgYW5kIGFmdGVyIHRoYXQgcG9pbnQgZmFzdCB3cml0ZXMgZmx1c2ggaW1tZWRpYXRlbHlcbmNvbnN0IEZMVVNIX0RFQURMSU5FX0ZSQUNUSU9OID0gMC4yNTtcbmNvbnN0IEJPVU5EQVJZX0FfRlJBQ1RJT04gPSAwLjU7XG5jb25zdCBCT1VOREFSWV9CX0ZSQUNUSU9OID0gMS41O1xuY29uc3QgUkVNQVBfRVhQSVJFX0ZSQUNUSU9OID0gMjtcblxudHlwZSBUaW1lbGluZUVudHJ5ID0ge1xuICAgIHBpZD86IG51bWJlcjtcbiAgICAvLyByZWxlYXNlVGltZSArIG92ZXJsYXBUaW1lIGRlZmluZSBldmVyeXRoaW5nOiB0aGUgbmV3ZXIgZW50cnkncyByZWxlYXNlVGltZSBpcyB3aGVuIGl0XG4gICAgLy8gc3RhcnRzLCBhbmQgcmVsZWFzZVRpbWUgKyBvdmVybGFwVGltZSBpcyB3aGVuIHRoZSBvbGRlciBvbmUgaXMga2lsbGVkIChmcmVlaW5nIHRoZSBwb3J0KS5cbiAgICAvLyBUaGUgZmlsZXMgYWxzbyBjYXJyeSBhbiBhbGl2ZVdpbmRvdywgd2hpY2ggaXMgZGVsaWJlcmF0ZWx5IGlnbm9yZWQuXG4gICAgcGFyYW1ldGVyczogeyByZWxlYXNlVGltZT86IG51bWJlcjsgb3ZlcmxhcFRpbWU/OiBudW1iZXIgfTtcbn07XG5cbnR5cGUgVGFrZW92ZXJDb21wdXRlZCA9IHtcbiAgICAvLyBXZSBhcmUgc2NoZWR1bGVkIHRvIGRpZSB3aXRoIGEgc3VjY2Vzc29yIG92ZXJsYXBwaW5nIHVzIChrbm93biBmcm9tIHRoZSBmaWxlcyBhbG9uZSwgYmVmb3JlXG4gICAgLy8gdGhlIHN1Y2Nlc3NvcidzIHBvcnQgaXMgZGlzY292ZXJlZCAtIHRoZSBmbHVzaCBkZWFkbGluZSBhcHBsaWVzIGltbWVkaWF0ZWx5KVxuICAgIGR5aW5nPzogeyBzdWNjZXNzb3JTdGFydDogbnVtYmVyOyBvdmVybGFwOiBudW1iZXIgfTtcbiAgICAvLyBUaGUgd2luZG93IHJlaW50ZXJwcmV0YXRpb24sIG9uY2UgdGhlIG1pZGRsZSB3aW5kb3cncyBwb3J0IGlzIGtub3duICh0aGUgc3VjY2Vzc29yJ3NcbiAgICAvLyByZWdpc3RlcmVkIGFsdGVybmF0ZSBwb3J0IC0gb3Igb3VyIG93biwgd2hlbiB3ZSBBUkUgdGhlIHN1Y2Nlc3NvcilcbiAgICByZW1hcD86IHsgYm91bmRhcnlBOiBudW1iZXI7IGJvdW5kYXJ5QjogbnVtYmVyOyBleHBpcmU6IG51bWJlcjsgYWx0UG9ydDogbnVtYmVyIH07XG4gICAgLy8gV2hlbiBvdXIgcHJlZGVjZXNzb3IgZGllcyBhbmQgZnJlZXMgdGhlIG1haW4gcG9ydCAoZm9yIGFjcXVpc2l0aW9uIHBhY2luZylcbiAgICBwcmVkZWNlc3NvckVuZD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFRha2VvdmVyRXZlbnQgPSBcInJlbWFwQ2hhbmdlZFwiIHwgXCJkaXNrU2NhblwiO1xuXG5sZXQgaW5pdGlhbGl6ZWQ6IHsgZG9tYWluOiBzdHJpbmc7IG1haW5Qb3J0OiBudW1iZXI7IHN0b3JhZ2VGb2xkZXI6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xubGV0IGFuY2VzdG9yUGlkcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xubGV0IHRpbWVsaW5lRm9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5sZXQgb3VyQWx0UG9ydDogbnVtYmVyIHwgdW5kZWZpbmVkO1xubGV0IGN1cnJlbnQ6IFRha2VvdmVyQ29tcHV0ZWQgPSB7fTtcbmxldCBjdXJyZW50S2V5ID0gSlNPTi5zdHJpbmdpZnkoY3VycmVudCk7XG5sZXQgZXZlbnRMaXN0ZW5lcnM6ICgoZXZlbnQ6IFRha2VvdmVyRXZlbnQpID0+IHZvaWQpW10gPSBbXTtcbmxldCBldmVudFRpbWVyczogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD5bXSA9IFtdO1xubGV0IGxvZ2dlZE5vTWF0Y2ggPSBmYWxzZTtcbmxldCBsb2dnZWRJZGVudGl0eSA9IGZhbHNlO1xuXG5mdW5jdGlvbiBleGVjVGV4dChjb21tYW5kOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGV4ZWMoY29tbWFuZCwgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLy8gVGhlIHRpbWVsaW5lIGVudHJ5IHBpZCBpcyB0aGUgc2NyZWVuIHNoZWxsIHRoYXQgc3Bhd25lZCB1cyAtIGFuIGFuY2VzdG9yIC0gc28gd2Ugd2FsayBvdXIgd2hvbGVcbi8vIGFuY2VzdG9yIGNoYWluIHRvIGZpbmQgd2hpY2ggZW50cnkgaXMgdXNcbmFzeW5jIGZ1bmN0aW9uIGdldEFuY2VzdG9yUGlkcygpOiBQcm9taXNlPFNldDxudW1iZXI+PiB7XG4gICAgbGV0IHBpZHMgPSBuZXcgU2V0PG51bWJlcj4oW3Byb2Nlc3MucGlkXSk7XG4gICAgbGV0IGN1cnJlbnRQaWQgPSBwcm9jZXNzLnBpZDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgcHBpZDogbnVtYmVyO1xuICAgICAgICBpZiAoY3VycmVudFBpZCA9PT0gcHJvY2Vzcy5waWQgJiYgcHJvY2Vzcy5wcGlkKSB7XG4gICAgICAgICAgICBwcGlkID0gcHJvY2Vzcy5wcGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwcGlkID0gcGFyc2VJbnQoKGF3YWl0IGV4ZWNUZXh0KGBwcyAtbyBwcGlkPSAtcCAke2N1cnJlbnRQaWR9YCkpLnRyaW0oKSk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBwaWQgfHwgTnVtYmVyLmlzTmFOKHBwaWQpIHx8IHBwaWQgPD0gMSB8fCBwaWRzLmhhcyhwcGlkKSkgYnJlYWs7XG4gICAgICAgIHBpZHMuYWRkKHBwaWQpO1xuICAgICAgICBjdXJyZW50UGlkID0gcHBpZDtcbiAgICB9XG4gICAgcmV0dXJuIHBpZHM7XG59XG5cbi8vIFRoZSBpbnN0YW5jZSBmb2xkZXIgaXMgQUxXQVlTIHRoZSBwYXJlbnQgb2Ygb3VyIGN3ZCAoc2VydmljZXMgcnVuIGluIDxpbnN0YW5jZT4vZ2l0LykgLSBuZXZlclxuLy8gc2VhcmNoIGZvciBpdCwgYSB3YWxrIGNvdWxkIGxhdGNoIG9udG8gdGhlIHdyb25nIGZvbGRlclxuZnVuY3Rpb24gZ2V0VGltZWxpbmVGb2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHByb2Nlc3MuY3dkKCkpLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKSArIFwiL1wiO1xufVxuXG5mdW5jdGlvbiBwaWRBbGl2ZShwaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAgIHByb2Nlc3Mua2lsbChwaWQsIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiAoZSBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZSA9PT0gXCJFUEVSTVwiO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVnaXN0cnlGb2xkZXIoKTogc3RyaW5nIHtcbiAgICBpZiAoIWluaXRpYWxpemVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVwbG95IHRha2VvdmVyIGlzIG5vdCBpbml0aWFsaXplZGApO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKHBhdGguZGlybmFtZShwYXRoLnJlc29sdmUoaW5pdGlhbGl6ZWQuc3RvcmFnZUZvbGRlcikpLCBQT1JUX1JFR0lTVFJZX0ZPTERFUl9OQU1FKTtcbn1cblxudHlwZSBSZWdpc3RyeUVudHJ5ID0geyBwaWQ6IG51bWJlcjsgcG9ydDogbnVtYmVyOyBhbmNlc3RvclBpZHM6IG51bWJlcltdIH07XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQb3J0UmVnaXN0cnkoKTogUHJvbWlzZTxSZWdpc3RyeUVudHJ5W10+IHtcbiAgICBsZXQgZm9sZGVyID0gZ2V0UmVnaXN0cnlGb2xkZXIoKTtcbiAgICBsZXQgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgICAgZmlsZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGZvbGRlcik7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IGVudHJpZXM6IFJlZ2lzdHJ5RW50cnlbXSA9IFtdO1xuICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gL14oXFxkKylcXC5qc29uJC8uZXhlYyhmaWxlKTtcbiAgICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG4gICAgICAgIGxldCBwaWQgPSBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgIGlmICghcGlkQWxpdmUocGlkKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsocGF0aC5qb2luKGZvbGRlciwgZmlsZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCB7IH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgZW50cnkgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihmb2xkZXIsIGZpbGUpLCBcInV0ZjhcIikpIGFzIFJlZ2lzdHJ5RW50cnk7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goeyAuLi5lbnRyeSwgcGlkIH0pO1xuICAgICAgICB9IGNhdGNoIHsgfVxuICAgIH1cbiAgICByZXR1cm4gZW50cmllcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFRpbWVsaW5lRW50cmllcygpOiBQcm9taXNlPFRpbWVsaW5lRW50cnlbXT4ge1xuICAgIGlmICghdGltZWxpbmVGb2xkZXIpIHJldHVybiBbXTtcbiAgICBsZXQgZW50cmllczogVGltZWxpbmVFbnRyeVtdID0gW107XG4gICAgZm9yIChsZXQgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHRpbWVsaW5lRm9sZGVyKSkge1xuICAgICAgICBpZiAoIVBBUkFNRVRFUlNfVElNRUxJTkVfRklMRV9SRUdFWC50ZXN0KGZpbGUpKSBjb250aW51ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaChKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHRpbWVsaW5lRm9sZGVyICsgZmlsZSwgXCJ1dGY4XCIpKSBhcyBUaW1lbGluZUVudHJ5KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBDb3VsZCBub3QgcmVhZCBkZXBsb3kgdGltZWxpbmUgZmlsZSAke3RpbWVsaW5lRm9sZGVyICsgZmlsZX06ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVudHJpZXM7XG59XG5cbmZ1bmN0aW9uIG1ha2VSZW1hcChzdWNjZXNzb3JTdGFydDogbnVtYmVyLCBvdmVybGFwOiBudW1iZXIsIGFsdFBvcnQ6IG51bWJlcik6IFRha2VvdmVyQ29tcHV0ZWRbXCJyZW1hcFwiXSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYm91bmRhcnlBOiBzdWNjZXNzb3JTdGFydCArIG92ZXJsYXAgKiBCT1VOREFSWV9BX0ZSQUNUSU9OLFxuICAgICAgICBib3VuZGFyeUI6IHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCAqIEJPVU5EQVJZX0JfRlJBQ1RJT04sXG4gICAgICAgIGV4cGlyZTogc3VjY2Vzc29yU3RhcnQgKyBvdmVybGFwICogUkVNQVBfRVhQSVJFX0ZSQUNUSU9OLFxuICAgICAgICBhbHRQb3J0LFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGVtaXQoZXZlbnQ6IFRha2VvdmVyRXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGxldCBsaXN0ZW5lciBvZiBldmVudExpc3RlbmVycykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGlzdGVuZXIoZXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBEZXBsb3kgdGFrZW92ZXIgbGlzdGVuZXIgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUV2ZW50cygpOiB2b2lkIHtcbiAgICBmb3IgKGxldCB0aW1lciBvZiBldmVudFRpbWVycykge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cbiAgICBldmVudFRpbWVycyA9IFtdO1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBzY2hlZHVsZSA9ICh0aW1lOiBudW1iZXIsIGZuYzogKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICBpZiAodGltZSA8PSBub3cpIHJldHVybjtcbiAgICAgICAgbGV0IHRpbWVyID0gc2V0VGltZW91dChmbmMsIHRpbWUgLSBub3cpO1xuICAgICAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICBldmVudFRpbWVycy5wdXNoKHRpbWVyKTtcbiAgICB9O1xuICAgIGNvbnN0IHJlbWFwID0gY3VycmVudC5yZW1hcDtcbiAgICBpZiAocmVtYXApIHtcbiAgICAgICAgbGV0IGFsdFBvcnQgPSByZW1hcC5hbHRQb3J0O1xuICAgICAgICBzY2hlZHVsZShyZW1hcC5ib3VuZGFyeUEgLSBTV0lUQ0hfU0NBTl9MRUFELCAoKSA9PiBlbWl0KFwiZGlza1NjYW5cIikpO1xuICAgICAgICBzY2hlZHVsZShyZW1hcC5ib3VuZGFyeUEsICgpID0+IGNvbnNvbGUubG9nKGAke2xvZ1ByZWZpeCgpfSBEZXBsb3kgc3dpdGNob3ZlciB3cml0ZSBoYW5kb2ZmIGJvdW5kYXJ5ICR7aXNvKHJlbWFwLmJvdW5kYXJ5QSl9IHBhc3NlZDogZnJlc2ggd3JpdGVzIG5vdyBiZWxvbmcgdG8gdGhlIGFsdGVybmF0ZS1wb3J0IHNpZGUgKHBvcnQgJHthbHRQb3J0fSlgKSk7XG4gICAgICAgIHNjaGVkdWxlKHJlbWFwLmJvdW5kYXJ5QSArIFNXSVRDSF9TQ0FOX0xFQUQsICgpID0+IGVtaXQoXCJkaXNrU2NhblwiKSk7XG4gICAgICAgIHNjaGVkdWxlKHJlbWFwLmJvdW5kYXJ5QiwgKCkgPT4gY29uc29sZS5sb2coYCR7bG9nUHJlZml4KCl9IERlcGxveSBzd2l0Y2hvdmVyIHNlY29uZCBib3VuZGFyeSAke2lzbyhyZW1hcC5ib3VuZGFyeUIpfSBwYXNzZWQ6IGZyZXNoIHdyaXRlcyByZXR1cm4gdG8gdGhlIG1haW4gcG9ydGApKTtcbiAgICAgICAgc2NoZWR1bGUocmVtYXAuZXhwaXJlLCAoKSA9PiB2b2lkIHJlY29tcHV0ZSgpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgRGVwbG95IHRha2VvdmVyIHJlY29tcHV0ZSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKSk7XG4gICAgfVxuICAgIGxldCBkeWluZyA9IGN1cnJlbnQuZHlpbmc7XG4gICAgaWYgKGR5aW5nKSB7XG4gICAgICAgIGxldCBkZWFkbGluZSA9IGR5aW5nLnN1Y2Nlc3NvclN0YXJ0ICsgZHlpbmcub3ZlcmxhcCAqIEZMVVNIX0RFQURMSU5FX0ZSQUNUSU9OO1xuICAgICAgICBsZXQga2lsbFRpbWUgPSBkeWluZy5zdWNjZXNzb3JTdGFydCArIGR5aW5nLm92ZXJsYXA7XG4gICAgICAgIGxldCBsb2dEZWFkbGluZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChsb2dnZWRGbHVzaERlYWRsaW5lRm9yID09PSBkZWFkbGluZSkgcmV0dXJuO1xuICAgICAgICAgICAgbG9nZ2VkRmx1c2hEZWFkbGluZUZvciA9IGRlYWRsaW5lO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7bG9nUHJlZml4KCl9IERlcGxveSBzd2l0Y2hvdmVyIGZsdXNoIGRlYWRsaW5lICR7aXNvKGRlYWRsaW5lKX0gcmVhY2hlZCAobm93ICR7aXNvKERhdGUubm93KCkpfSk6IGZhc3Qgd3JpdGVzIHdyaXRlIHRocm91Z2ggaW1tZWRpYXRlbHkgdW50aWwgd2UgYXJlIGtpbGxlZCBhdCAke2lzbyhraWxsVGltZSl9YCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChkZWFkbGluZSA8PSBub3cpIHtcbiAgICAgICAgICAgIGxvZ0RlYWRsaW5lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY2hlZHVsZShkZWFkbGluZSwgbG9nRGVhZGxpbmUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBNdWx0aXBsZSBwcm9jZXNzZXMgKHByZWRlY2Vzc29yICsgc3VjY2Vzc29yKSBvZnRlbiBzaGFyZSBvbmUgam91cm5hbCBkdXJpbmcgYSBzd2l0Y2hvdmVyLCBzb1xuLy8gZXZlcnkgbGlmZWN5Y2xlIGxpbmUgaWRlbnRpZmllcyBpdHMgcHJvY2Vzc1xuZnVuY3Rpb24gbG9nUHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbcGlkICR7cHJvY2Vzcy5waWR9XWA7XG59XG5sZXQgbG9nZ2VkRmx1c2hEZWFkbGluZUZvcjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4vLyBSZWNvbXB1dGUgaXMgaW52b2tlZCBmcm9tIGluaXQsIHJlZ2lzdGVyQWx0UG9ydCwgdGhlIHBvbGwsIGFuZCB0aGUgZXhwaXJ5IHRpbWVyIC0gcG9zc2libHlcbi8vIGNvbmN1cnJlbnRseS4gUnVucyBhcmUgc2VyaWFsaXplZCwgb3IgdHdvIGluLWZsaWdodCBydW5zIHdvdWxkIGJvdGggcGFzcyB0aGUgY2hhbmdlZC1zdGF0ZSBjaGVja1xuLy8gYW5kIGRvdWJsZS1maXJlIGV2ZXJ5IHRyYW5zaXRpb24gKGxvZ3MsIHJlYnVpbGQgZXZlbnRzLCB0aW1lcnMpLlxubGV0IHJlY29tcHV0ZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5mdW5jdGlvbiByZWNvbXB1dGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IG5leHQgPSByZWNvbXB1dGVDaGFpbi50aGVuKCgpID0+IHJlY29tcHV0ZU5vdygpKTtcbiAgICByZWNvbXB1dGVDaGFpbiA9IG5leHQudGhlbigoKSA9PiB7IH0sICgpID0+IHsgfSk7XG4gICAgcmV0dXJuIG5leHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlY29tcHV0ZU5vdygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWluaXRpYWxpemVkIHx8ICF0aW1lbGluZUZvbGRlcikgcmV0dXJuO1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBlbnRyaWVzID0gYXdhaXQgcmVhZFRpbWVsaW5lRW50cmllcygpO1xuICAgIGxldCByZWdpc3RyeSA9IGF3YWl0IHJlYWRQb3J0UmVnaXN0cnkoKTtcbiAgICBsZXQgdXM6IFRpbWVsaW5lRW50cnkgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoZW50cnkucGlkICYmIGFuY2VzdG9yUGlkcy5oYXMoZW50cnkucGlkKSkge1xuICAgICAgICAgICAgdXMgPSBlbnRyeTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNYXRjaGluZyBmYWlsdXJlcyBtdXN0IGJlIGxvdWQsIG9yIHRha2VvdmVyIGRldGVjdGlvbiBmYWlscyBzaWxlbnRseSBmb3JldmVyXG4gICAgaWYgKCF1cyAmJiBlbnRyaWVzLmxlbmd0aCAmJiAhbG9nZ2VkTm9NYXRjaCkge1xuICAgICAgICBsb2dnZWROb01hdGNoID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS53YXJuKGAke2xvZ1ByZWZpeCgpfSBObyBkZXBsb3kgdGltZWxpbmUgZW50cnkgbWF0Y2hlcyBvdXIgcGlkIGNoYWluICgke1suLi5hbmNlc3RvclBpZHNdLmpvaW4oXCIsIFwiKX0pIC0gdGFrZW92ZXIgZGV0ZWN0aW9uIGNhbm5vdCB3b3JrLiBFbnRyaWVzOiAke2VudHJpZXMubWFwKHggPT4gYHBpZD0ke3gucGlkID8/IFwibm9uZVwifSByZWxlYXNlVGltZT0ke3gucGFyYW1ldGVycy5yZWxlYXNlVGltZX1gKS5qb2luKFwiIHwgXCIpfWApO1xuICAgIH1cbiAgICBpZiAodXMgJiYgIWxvZ2dlZElkZW50aXR5KSB7XG4gICAgICAgIGxvZ2dlZElkZW50aXR5ID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS5sb2coYCR7bG9nUHJlZml4KCl9IERlcGxveSB0aW1lbGluZSBlbnRyeSBtYXRjaGVkOiB3ZSBhcmUgcGlkPSR7dXMucGlkfSwgcmVsZWFzZVRpbWU9JHt1cy5wYXJhbWV0ZXJzLnJlbGVhc2VUaW1lICE9PSB1bmRlZmluZWQgJiYgaXNvKHVzLnBhcmFtZXRlcnMucmVsZWFzZVRpbWUpIHx8IFwidW5rbm93blwifSwgJHtlbnRyaWVzLmxlbmd0aH0gZW50cmllcyB0b3RhbGApO1xuICAgIH1cbiAgICBsZXQgY29tcHV0ZWQ6IFRha2VvdmVyQ29tcHV0ZWQgPSB7fTtcbiAgICBsZXQgdXNSZWxlYXNlID0gdXM/LnBhcmFtZXRlcnMucmVsZWFzZVRpbWU7XG4gICAgaWYgKHVzICYmIHVzUmVsZWFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRoZSBuZXdlciBlbnRyeSdzIHJlbGVhc2VUaW1lIGlzIHdoZW4gaXQgc3RhcnRzOyByZWxlYXNlVGltZSArIG92ZXJsYXBUaW1lIGlzIHdoZW4gdGhlXG4gICAgICAgIC8vIG9sZGVyIG9uZSBpcyBraWxsZWQuIFRoYXQncyB0aGUgd2hvbGUgdGltZWxpbmUuXG4gICAgICAgIGxldCBuZXh0OiB7IGVudHJ5OiBUaW1lbGluZUVudHJ5OyByZWxlYXNlOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHByZXY6IHsgZW50cnk6IFRpbWVsaW5lRW50cnk7IHJlbGVhc2U6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkgPT09IHVzKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCByZWxlYXNlID0gZW50cnkucGFyYW1ldGVycy5yZWxlYXNlVGltZTtcbiAgICAgICAgICAgIGlmIChyZWxlYXNlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJlbGVhc2UgPiB1c1JlbGVhc2UgJiYgKCFuZXh0IHx8IHJlbGVhc2UgPCBuZXh0LnJlbGVhc2UpKSB7XG4gICAgICAgICAgICAgICAgbmV4dCA9IHsgZW50cnksIHJlbGVhc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZWxlYXNlIDwgdXNSZWxlYXNlICYmICghcHJldiB8fCByZWxlYXNlID4gcHJldi5yZWxlYXNlKSkge1xuICAgICAgICAgICAgICAgIHByZXYgPSB7IGVudHJ5LCByZWxlYXNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICAgIGxldCBzdWNjZXNzb3JTdGFydCA9IG5leHQucmVsZWFzZTtcbiAgICAgICAgICAgIGxldCBvdmVybGFwID0gbmV4dC5lbnRyeS5wYXJhbWV0ZXJzLm92ZXJsYXBUaW1lIHx8IHVzLnBhcmFtZXRlcnMub3ZlcmxhcFRpbWUgfHwgMDtcbiAgICAgICAgICAgIC8vIEV2ZW4gYSBaRVJPLW92ZXJsYXAgZGVwbG95IG5lZWRzIHRoZSBkeWluZyBiZWhhdmlvcnMgLSBkcmFpbmluZyBmYXN0LXdyaXRlIGZsdXNoZXNcbiAgICAgICAgICAgIC8vIGJ5IHRoZSByZWxlYXNlIGFuZCB3cml0aW5nIHRocm91Z2ggYWZ0ZXIgaXQsIG9yIGFja25vd2xlZGdlZCBkYXRhIGRpZXMgd2l0aCB1cy5cbiAgICAgICAgICAgIC8vIE9ubHkgdGhlIHJlbWFwICh0aGUgYWx0ZXJuYXRlLXBvcnQgbWlkZGxlIHdpbmRvdykgbmVlZHMgYW4gYWN0dWFsIG92ZXJsYXAuXG4gICAgICAgICAgICBjb21wdXRlZC5keWluZyA9IHsgc3VjY2Vzc29yU3RhcnQsIG92ZXJsYXAgfTtcbiAgICAgICAgICAgIGlmIChvdmVybGFwID4gMCAmJiBub3cgPCBzdWNjZXNzb3JTdGFydCArIG92ZXJsYXAgKiBSRU1BUF9FWFBJUkVfRlJBQ1RJT04pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzb3JQaWQgPSBuZXh0LmVudHJ5LnBpZDtcbiAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzc29yUGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdWNjZXNzb3JFbnRyeSA9IHJlZ2lzdHJ5LmZpbmQoeCA9PiB4LmFuY2VzdG9yUGlkcy5pbmNsdWRlcyhzdWNjZXNzb3JQaWQpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3NvckVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZC5yZW1hcCA9IG1ha2VSZW1hcChzdWNjZXNzb3JTdGFydCwgb3ZlcmxhcCwgc3VjY2Vzc29yRW50cnkucG9ydCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgICAgIGxldCBvdmVybGFwID0gdXMucGFyYW1ldGVycy5vdmVybGFwVGltZSB8fCBwcmV2LmVudHJ5LnBhcmFtZXRlcnMub3ZlcmxhcFRpbWUgfHwgMDtcbiAgICAgICAgICAgIC8vIFRoZSBwcmVkZWNlc3NvciBob2xkcyB0aGUgbWFpbiBwb3J0IHVudGlsIE9VUiByZWxlYXNlICsgdGhlIG92ZXJsYXBcbiAgICAgICAgICAgIGNvbXB1dGVkLnByZWRlY2Vzc29yRW5kID0gdXNSZWxlYXNlICsgb3ZlcmxhcDtcbiAgICAgICAgICAgIGlmIChvdmVybGFwID4gMCAmJiBvdXJBbHRQb3J0ICYmIG5vdyA8IHVzUmVsZWFzZSArIG92ZXJsYXAgKiBSRU1BUF9FWFBJUkVfRlJBQ1RJT04gJiYgIWNvbXB1dGVkLnJlbWFwKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWQucmVtYXAgPSBtYWtlUmVtYXAodXNSZWxlYXNlLCBvdmVybGFwLCBvdXJBbHRQb3J0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQga2V5ID0gSlNPTi5zdHJpbmdpZnkoY29tcHV0ZWQpO1xuICAgIGlmIChrZXkgPT09IGN1cnJlbnRLZXkpIHJldHVybjtcbiAgICBsb2dUcmFuc2l0aW9ucyhjdXJyZW50LCBjb21wdXRlZCk7XG4gICAgY3VycmVudCA9IGNvbXB1dGVkO1xuICAgIGN1cnJlbnRLZXkgPSBrZXk7XG4gICAgc2NoZWR1bGVFdmVudHMoKTtcbiAgICBlbWl0KFwicmVtYXBDaGFuZ2VkXCIpO1xufVxuXG5mdW5jdGlvbiBpc28odGltZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGltZSkudG9JU09TdHJpbmcoKTtcbn1cblxuLy8gVGhlIHN3aXRjaG92ZXIgbGlmZWN5Y2xlIGlzIHJhcmUgYW5kIGltcG9ydGFudCwgc28gZXZlcnkgc3RhZ2UgZ2V0cyBhIGNsZWFyIGxpbmVcbmZ1bmN0aW9uIGxvZ1RyYW5zaXRpb25zKHByZXY6IFRha2VvdmVyQ29tcHV0ZWQsIG5leHQ6IFRha2VvdmVyQ29tcHV0ZWQpOiB2b2lkIHtcbiAgICBpZiAoIXByZXYuZHlpbmcgJiYgbmV4dC5keWluZykge1xuICAgICAgICBsZXQgeyBzdWNjZXNzb3JTdGFydCwgb3ZlcmxhcCB9ID0gbmV4dC5keWluZztcbiAgICAgICAgY29uc29sZS5sb2coYCR7bG9nUHJlZml4KCl9IERlcGxveSBzd2l0Y2hvdmVyIHNjaGVkdWxlZDogb3VyIHN1Y2Nlc3NvciBzdGFydHMgYXQgJHtpc28oc3VjY2Vzc29yU3RhcnQpfTsgZmFzdC13cml0ZSBmbHVzaGVzIGRyYWluIGJ5ICR7aXNvKHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCAqIEZMVVNIX0RFQURMSU5FX0ZSQUNUSU9OKX0sIGZyZXNoIHdyaXRlcyBoYW5kIG9mZiBhdCAke2lzbyhzdWNjZXNzb3JTdGFydCArIG92ZXJsYXAgKiBCT1VOREFSWV9BX0ZSQUNUSU9OKX0sIGFuZCB3ZSBhcmUga2lsbGVkIGF0ICR7aXNvKHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCl9YCk7XG4gICAgfVxuICAgIGlmICghcHJldi5wcmVkZWNlc3NvckVuZCAmJiBuZXh0LnByZWRlY2Vzc29yRW5kKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2xvZ1ByZWZpeCgpfSBXZSBhcmUgYSBkZXBsb3kgc3VjY2Vzc29yOiBvdXIgcHJlZGVjZXNzb3IgaG9sZHMgdGhlIG1haW4gcG9ydCB1bnRpbCAke2lzbyhuZXh0LnByZWRlY2Vzc29yRW5kKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwcmV2LnJlbWFwICYmIG5leHQucmVtYXApIHtcbiAgICAgICAgY29uc29sZS5sb2coYCR7bG9nUHJlZml4KCl9IERlcGxveSBzd2l0Y2hvdmVyIHJlbWFwIGFjdGl2ZTogc291cmNlcyBwb2ludGluZyBhdCB1cyBhcmUgc3BsaXQgc28gWyR7aXNvKG5leHQucmVtYXAuYm91bmRhcnlBKX0gLi4gJHtpc28obmV4dC5yZW1hcC5ib3VuZGFyeUIpfV0gcm91dGVzIHRvIGFsdGVybmF0ZSBwb3J0ICR7bmV4dC5yZW1hcC5hbHRQb3J0fSAocmVtYXAgZXhwaXJlcyBhdCAke2lzbyhuZXh0LnJlbWFwLmV4cGlyZSl9KWApO1xuICAgIH1cbiAgICBpZiAocHJldi5yZW1hcCAmJiAhbmV4dC5yZW1hcCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgJHtsb2dQcmVmaXgoKX0gRGVwbG95IHN3aXRjaG92ZXIgcmVtYXAgZW5kZWQ7IHJ1bm5pbmcgb24gdGhlIHBsYWluIHN0b3JlZCByb3V0aW5nIGNvbmZpZ2ApO1xuICAgIH1cbn1cblxuLyoqIFN0YXJ0cyB0aGUgdGFrZW92ZXIgbWFjaGluZXJ5LiBQb3J0IGZhbGxiYWNrIChhbHRlcm5hdGUgcG9ydCArIHJlZ2lzdHJ5ICsgYWNxdWlzaXRpb24gcG9sbGluZylcbiAqICB3b3JrcyByZWdhcmRsZXNzOyB3aXRob3V0IGEgZGVwbG95IHRpbWVsaW5lIGZvbGRlciB0aGUgc3dpdGNob3Zlci1zcGVjaWZpYyBwYXJ0cyAodGhlIHJlbWFwLFxuICogIHRoZSBmbHVzaCBkZWFkbGluZSwgdGhlIHRpZ2h0ZXIgYWNxdWlzaXRpb24gcGFjaW5nKSBzaW1wbHkgc3RheSBpbmVydC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0RGVwbG95VGFrZW92ZXIoY29uZmlnOiB7IGRvbWFpbjogc3RyaW5nOyBtYWluUG9ydDogbnVtYmVyOyBzdG9yYWdlRm9sZGVyOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGluaXRpYWxpemVkID0gY29uZmlnO1xuICAgIGFuY2VzdG9yUGlkcyA9IGF3YWl0IGdldEFuY2VzdG9yUGlkcygpO1xuICAgIHRpbWVsaW5lRm9sZGVyID0gZ2V0VGltZWxpbmVGb2xkZXIoKTtcbiAgICBsZXQgZW50cmllcyA9IGF3YWl0IHJlYWRUaW1lbGluZUVudHJpZXMoKTtcbiAgICBpZiAoIWVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2xvZ1ByZWZpeCgpfSBObyBkZXBsb3kgdGltZWxpbmUgZW50cmllcyBpbiAke3RpbWVsaW5lRm9sZGVyfTsgZGVwbG95IHRha2VvdmVyIGluYWN0aXZlIHVudGlsIHRoZXkgYXBwZWFyIChwb3J0IGZhbGxiYWNrIHN0aWxsIHdvcmtzKWApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2xvZ1ByZWZpeCgpfSBEZXBsb3kgdGltZWxpbmUgZm91bmQgYXQgJHt0aW1lbGluZUZvbGRlcn0gKCR7ZW50cmllcy5sZW5ndGh9IGVudHJpZXMpOyBvdXIgcGlkIGNoYWluOiAke1suLi5hbmNlc3RvclBpZHNdLmpvaW4oXCIgLT4gXCIpfWApO1xuICAgIH1cbiAgICBhd2FpdCByZWNvbXB1dGUoKTtcbiAgICBsZXQgcG9sbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdm9pZCByZWNvbXB1dGUoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYERlcGxveSB0YWtlb3ZlciByZWNvbXB1dGUgZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgfSwgVElNRUxJTkVfUE9MTF9JTlRFUlZBTCk7XG4gICAgKHBvbGwgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xufVxuXG4vKiogQ2FsbGVkIHdoZW4gd2UgaGFkIHRvIGxpc3RlbiBvbiBhbiBhbHRlcm5hdGUgcG9ydCAodGhlIG1haW4gcG9ydCB3YXMgc3RpbGwgaGVsZCBieSBvdXJcbiAqICBwcmVkZWNlc3Nvcik6IHJlZ2lzdGVycyBpdCBzbyB0aGUgcHJlZGVjZXNzb3IgY2FuIHJvdXRlIHRoZSBtaWRkbGUgb3ZlcmxhcCB3aW5kb3cgdG8gdXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJBbHRQb3J0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIG91ckFsdFBvcnQgPSBwb3J0O1xuICAgIGxldCBmb2xkZXIgPSBnZXRSZWdpc3RyeUZvbGRlcigpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgbGV0IGVudHJ5OiBSZWdpc3RyeUVudHJ5ID0geyBwaWQ6IHByb2Nlc3MucGlkLCBwb3J0LCBhbmNlc3RvclBpZHM6IFsuLi5hbmNlc3RvclBpZHNdIH07XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihmb2xkZXIsIGAke3Byb2Nlc3MucGlkfS5qc29uYCksIEpTT04uc3RyaW5naWZ5KGVudHJ5KSk7XG4gICAgYXdhaXQgcmVjb21wdXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvblRha2VvdmVyRXZlbnQobGlzdGVuZXI6IChldmVudDogVGFrZW92ZXJFdmVudCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGV2ZW50TGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xufVxuXG4vKiogVGhlIGludGVycHJldGF0aW9uIG92ZXJsYXk6IHNwbGl0cyBldmVyeSBzb3VyY2UgcG9pbnRpbmcgYXQgb3VyIGRvbWFpbittYWluIHBvcnQgc28gdGhlIG1pZGRsZVxuICogIG9mIHRoZSBkZXBsb3kgb3ZlcmxhcCBwb2ludHMgYXQgdGhlIGFsdGVybmF0ZSBwb3J0LiBQdXJlLCBpbi1tZW1vcnkgb25seSAtIHRoZSBzdG9yZWQgcm91dGluZ1xuICogIGNvbmZpZyBpcyBuZXZlciBtb2RpZmllZCwgYW5kIHRoaXMgbXVzdCBuZXZlciBiZSBhcHBsaWVkIHRvIGRhdGEgdGhhdCBnZXRzIHBlcnNpc3RlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlcGxveVJlbWFwKHJvdXRpbmc6IFJlbW90ZUNvbmZpZyk6IFJlbW90ZUNvbmZpZyB7XG4gICAgbGV0IHJlbWFwID0gY3VycmVudC5yZW1hcDtcbiAgICBsZXQgaW5pdCA9IGluaXRpYWxpemVkO1xuICAgIGlmICghcmVtYXAgfHwgIWluaXQpIHJldHVybiByb3V0aW5nO1xuICAgIGxldCBzb3VyY2VzOiBSZW1vdGVDb25maWdCYXNlW10gPSBbXTtcbiAgICBsZXQgc2xpY2UgPSAoc291cmNlOiBIb3N0ZWRDb25maWcsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCB1cmw/OiBzdHJpbmcpOiBIb3N0ZWRDb25maWcgPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5zb3VyY2UsIHVybDogdXJsIHx8IHNvdXJjZS51cmwsIHZhbGlkV2luZG93OiBbc3RhcnQsIGVuZF0gfTtcbiAgICB9O1xuICAgIGZvciAobGV0IHNvdXJjZSBvZiByb3V0aW5nLnNvdXJjZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIgfHwgc291cmNlLnR5cGUgIT09IFwicmVtb3RlXCIpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhcnNlZDogeyBhZGRyZXNzOiBzdHJpbmc7IHBvcnQ6IG51bWJlciB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoc291cmNlLnVybCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkLmFkZHJlc3MgIT09IGluaXQuZG9tYWluIHx8IHBhcnNlZC5wb3J0ICE9PSBpbml0Lm1haW5Qb3J0KSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSBzb3VyY2UudmFsaWRXaW5kb3c7XG4gICAgICAgIGxldCBhID0gTWF0aC5tYXgoc3RhcnQsIE1hdGgubWluKHJlbWFwLmJvdW5kYXJ5QSwgZW5kKSk7XG4gICAgICAgIGxldCBiID0gTWF0aC5tYXgoc3RhcnQsIE1hdGgubWluKHJlbWFwLmJvdW5kYXJ5QiwgZW5kKSk7XG4gICAgICAgIGxldCBhZGRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoYSA+IHN0YXJ0KSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc2xpY2Uoc291cmNlLCBzdGFydCwgYSkpO1xuICAgICAgICAgICAgYWRkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiID4gYSkge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNsaWNlKHNvdXJjZSwgYSwgYiwgcmVwbGFjZUhvc3RlZFVybFBvcnQoc291cmNlLnVybCwgcmVtYXAuYWx0UG9ydCkpKTtcbiAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kID4gYikge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNsaWNlKHNvdXJjZSwgYiwgZW5kKSk7XG4gICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhZGRlZCkge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgdmVyc2lvbjogcm91dGluZy52ZXJzaW9uLCBzb3VyY2VzIH07XG59XG5cbi8qKiBBIHN0YW1wIG9mIHRoZSBjdXJyZW50IHJlbWFwIGludGVycHJldGF0aW9uLCBhZHZlcnRpc2VkIGluIHBpbmcgcmVzcG9uc2VzIC0gc28gZXZlcnkgY29ubmVjdGVkXG4gKiAgY2xpZW50IGxlYXJucyBvZiBhIHRha2VvdmVyIHdpdGhpbiBvbmUgcGluZyBpbnRlcnZhbCwgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciBpdHMgY29uZmlnIHBvbGxcbiAqICBvciBhIHdyaXRlIHJlamVjdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWtlb3ZlclN0YW1wKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHJlbWFwID0gY3VycmVudC5yZW1hcDtcbiAgICBpZiAoIXJlbWFwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShyZW1hcCk7XG59XG5cbi8qKiBUaGUgbWlkZGxlLXdpbmRvdyBhbHRlcm5hdGUgcG9ydCBvZiBhbiBhY3RpdmUgcmVtYXAuIFRoZSBPVEhFUiBwcm9jZXNzIG9mIHRoZSB0YWtlb3ZlciBsaXZlcyBvblxuICogIHRoaXMgcG9ydCBvbiBPVVIgbWFjaGluZSAoc2FtZSBkaXNrISksIHNvIHNvdXJjZXMgcG9pbnRpbmcgYXQgaXQgYXJlIHNlbGYsIG5ldmVyIHN5bmMgdGFyZ2V0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWtlb3ZlckFsdFBvcnQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gY3VycmVudC5yZW1hcD8uYWx0UG9ydDtcbn1cblxuLyoqIEZvciB0aGUgZHlpbmcgcHJvY2VzczogZmFzdC13cml0ZSBmbHVzaCBkZWxheXMgbXVzdCBuZXZlciBleHRlbmQgcGFzdCB0aGlzIHRpbWUsIGFuZCBhZnRlciBpdFxuICogIGZhc3Qgd3JpdGVzIGZsdXNoIGltbWVkaWF0ZWx5IC0gc28gbm90aGluZyBpcyBsZWZ0IGluIG1lbW9yeSB3aGVuIHRoZSB3cml0ZSB3aW5kb3cgdHJhbnNmZXJzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZsdXNoRGVhZGxpbmUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgZHlpbmcgPSBjdXJyZW50LmR5aW5nO1xuICAgIGlmICghZHlpbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGR5aW5nLnN1Y2Nlc3NvclN0YXJ0ICsgZHlpbmcub3ZlcmxhcCAqIEZMVVNIX0RFQURMSU5FX0ZSQUNUSU9OO1xufVxuXG4vKiogSG93IGxvbmcgdG8gd2FpdCBiZXR3ZWVuIG1haW4tcG9ydCBhY3F1aXNpdGlvbiBhdHRlbXB0czogdGlnaHQgYXJvdW5kIHRoZSBwcmVkZWNlc3NvcidzXG4gKiAgc2NoZWR1bGVkIGRlYXRoICh3aGVuIHRoZSBwb3J0IGFjdHVhbGx5IGZyZWVzKSwgcmVsYXhlZCBvdGhlcndpc2UuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpblBvcnRBY3F1aXJlRGVsYXkoKTogbnVtYmVyIHtcbiAgICBsZXQgZW5kID0gY3VycmVudC5wcmVkZWNlc3NvckVuZDtcbiAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQgJiYgTWF0aC5hYnMoRGF0ZS5ub3coKSAtIGVuZCkgPD0gQUNRVUlSRV9GQVNUX1dJTkRPVykge1xuICAgICAgICByZXR1cm4gQUNRVUlSRV9GQVNUX0RFTEFZO1xuICAgIH1cbiAgICByZXR1cm4gQUNRVUlSRV9TTE9XX0RFTEFZO1xufVxuIl19
453
- /* _JS_SOURCE_HASH = "15f3341884830069c5bd597c97087a376c0e137d0693908ca808d470c4365e30"; */
418
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95VGFrZW92ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3lUYWtlb3Zlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLGlEQUFxQztBQUVyQyxpREFBc0U7QUFFdEUsaUdBQWlHO0FBQ2pHLGlHQUFpRztBQUNqRyxrR0FBa0c7QUFDbEcsOEZBQThGO0FBQzlGLCtGQUErRjtBQUMvRixpR0FBaUc7QUFDakcsbUdBQW1HO0FBQ25HLDBGQUEwRjtBQUMxRixrR0FBa0c7QUFDbEcsK0ZBQStGO0FBQy9GLEVBQUU7QUFDRixpR0FBaUc7QUFDakcsZ0dBQWdHO0FBQ2hHLGlDQUFpQztBQUVqQyxNQUFNLDhCQUE4QixHQUFHLDBCQUEwQixDQUFDO0FBQ2xFLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN6QyxtR0FBbUc7QUFDbkcsK0ZBQStGO0FBQy9GLDhEQUE4RDtBQUM5RCxNQUFNLHlCQUF5QixHQUFHLHFCQUFxQixDQUFDO0FBQ3hELG1HQUFtRztBQUNuRyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDckMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN0QyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUNoQyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUNoQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQXVCaEMsSUFBSSxXQUFvRixDQUFDO0FBQ3pGLElBQUksWUFBWSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFDckMsSUFBSSxjQUFrQyxDQUFDO0FBQ3ZDLElBQUksVUFBOEIsQ0FBQztBQUNuQyxJQUFJLE9BQU8sR0FBcUIsRUFBRSxDQUFDO0FBQ25DLElBQUksVUFBVSxHQUFH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LEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDakQsQ0FBQztBQTdDRCw0Q0E2Q0M7QUFFRDs7NEJBRTRCO0FBQzVCLFNBQWdCLGdCQUFnQjtJQUM1QixJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzFCLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDN0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFKRCw0Q0FJQztBQUVEO3FHQUNxRztBQUNyRyxTQUFnQixrQkFBa0I7O0lBQzlCLE9BQU8sTUFBQSxPQUFPLENBQUMsS0FBSywwQ0FBRSxPQUFPLENBQUM7QUFDbEMsQ0FBQztBQUZELGdEQUVDO0FBRUQ7eUVBQ3lFO0FBQ3pFLFNBQWdCLHVCQUF1QjtJQUNuQyxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0lBQ2pDLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3pFLE9BQU8sa0JBQWtCLENBQUM7SUFDOUIsQ0FBQztJQUNELE9BQU8sa0JBQWtCLENBQUM7QUFDOUIsQ0FBQztBQU5ELDBEQU1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGV4ZWMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgUmVtb3RlQ29uZmlnLCBSZW1vdGVDb25maWdCYXNlLCBIb3N0ZWRDb25maWcgfSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBwYXJzZUhvc3RlZFVybCwgcmVwbGFjZUhvc3RlZFVybFBvcnQgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcblxuLy8gRGVwbG95IHRha2VvdmVyOiB0aGUgZGVwbG95IG1hbmFnZXIgKHF1ZXJ5c3ViJ3MgcGFyYW1ldGVyc1RpbWVsaW5lKSB3cml0ZXMgPG4+LXBhcmFtZXRlcnMuanNvblxuLy8gZmlsZXMgaW50byBvdXIgaW5zdGFuY2UgZm9sZGVyIGRlc2NyaWJpbmcgd2hlbiBlYWNoIHZlcnNpb24gcnVucyBhbmQgd2hlbiBpdCBpcyBzaHV0IGRvd24uIE9sZFxuLy8gYW5kIG5ldyB2ZXJzaW9uIG92ZXJsYXAgZm9yIHRoZSBvdmVybGFwIHRpbWUgKE8gPSBvbGRFbmQgLSBuZXdTdGFydCkuIFdlIHR1cm4gdGhhdCBvdmVybGFwIGludG9cbi8vIGFuIGF0b21pYyB3cml0ZSBoYW5kb2ZmIGJ5IFJFSU5URVJQUkVUSU5HIGV2ZXJ5IHJvdXRpbmcgc291cmNlIHRoYXQgcG9pbnRzIGF0IHVzOiBpdHMgdmFsaWRcbi8vIHdpbmRvdyBpcyBzcGxpdCBzbyB0aGF0IHRoZSBtaWRkbGUgb2YgdGhlIG92ZXJsYXAgKFtTICsgMC41Kk8sIFMgKyAxLjUqT10pIHBvaW50cyBhdCB0aGUgbmV3XG4vLyBwcm9jZXNzJ3MgdGVtcG9yYXJ5IGFsdGVybmF0ZSBwb3J0LiBUaGUgZXhpc3RpbmcgdmFsaWQtd2luZG93IG1hY2hpbmVyeSB0aGVuIGRvZXMgZXZlcnl0aGluZyAtXG4vLyB0aGUgb2xkIHByb2Nlc3Mgc3RhcnRzIHJlamVjdGluZyBmcmVzaCB3cml0ZXMgYXQgdGhlIGZpcnN0IGJvdW5kYXJ5LCBjbGllbnRzIHJlLXJlc29sdmUsIGFuZCB0aGVcbi8vIG5ldyBwcm9jZXNzICh3aGljaCByZWNvZ25pemVzIHRoZSBhbHRlcm5hdGUgcG9ydCBhcyBpdHNlbGYpIHRha2VzIG92ZXIuIFRoZSByZW1hcCBpcyBhblxuLy8gSU5URVJQUkVUQVRJT04gT1ZFUkxBWSwgYXBwbGllZCB3aGVyZSByb3V0aW5nIGNvbmZpZ3MgYXJlIHVzZWQgKHNlZSBhcHBseURlcGxveVJlbWFwIGNhbGxlcnMpIC1cbi8vIGl0IGlzIG5ldmVyIHdyaXR0ZW4gdG8gZGlzaywgbmV2ZXIgc3luY2hyb25pemVkLCBhbmQgbmV2ZXIgcGFydCBvZiBhbnkgc3RvcmVkIGNvbmZpZ3VyYXRpb24uXG4vL1xuLy8gRXZlcnl0aGluZyBoZXJlIGlzIHJlY29tcHV0ZWQgaWRlbXBvdGVudGx5IGZyb20gaXRzIGlucHV0cyAodGltZWxpbmUgZmlsZXMsIHRoZSBwb3J0IHJlZ2lzdHJ5LFxuLy8gb3VyIGFuY2VzdG9yIHBpZHMsIHRoZSBjbG9jaykgLSBmaWxlcyBjYW4gYXBwZWFyIG9yIGNoYW5nZSBhdCBhbnkgbW9tZW50LCBhbmQgd2UgY2FuIHN0YXJ0IGF0XG4vLyBhbnkgcG9pbnQgZHVyaW5nIGEgc3dpdGNob3Zlci5cblxuY29uc3QgUEFSQU1FVEVSU19USU1FTElORV9GSUxFX1JFR0VYID0gL14oXFxkKyktcGFyYW1ldGVyc1xcLmpzb24kLztcbmNvbnN0IFRJTUVMSU5FX1BPTExfSU5URVJWQUwgPSA2MCAqIDEwMDA7XG4vLyBQcm9jZXNzZXMgbGlzdGVuaW5nIG9uIGFuIGFsdGVybmF0ZSBwb3J0IHJlZ2lzdGVyIGl0IGhlcmUgKHNpYmxpbmcgb2YgdGhlIHN0b3JhZ2UgZm9sZGVyKSwga2V5ZWRcbi8vIGJ5IHRoZWlyIGFjdHVhbCBwaWQ7IGNvbnRlbnQgaW5jbHVkZXMgdGhlaXIgYW5jZXN0b3IgcGlkcyBzbyB0aGUgdGltZWxpbmUgZW50cnkgcGlkIChhIHNoZWxsXG4vLyBhbmNlc3RvciBvZiB0aGUgcHJvY2VzcykgY2FuIGJlIG1hdGNoZWQgdG8gYSByZWdpc3RyeSBlbnRyeVxuY29uc3QgUE9SVF9SRUdJU1RSWV9GT0xERVJfTkFNRSA9IFwic3RvcmFnZVBvcnRSZWdpc3RyeVwiO1xuLy8gTWFpbi1wb3J0IGFjcXVpc2l0aW9uIGF0dGVtcHRzIHJ1biB0aGlzIG9mdGVuLCB0aWdodGVuaW5nIG5lYXIgdGhlIHByZWRlY2Vzc29yJ3Mgc2NoZWR1bGVkIGRlYXRoXG5jb25zdCBBQ1FVSVJFX1NMT1dfREVMQVkgPSAzMCAqIDEwMDA7XG5jb25zdCBBQ1FVSVJFX0ZBU1RfREVMQVkgPSA1ICogMTAwMDtcbmNvbnN0IEFDUVVJUkVfRkFTVF9XSU5ET1cgPSA2MCAqIDEwMDA7XG5jb25zdCBCT1VOREFSWV9BX0ZSQUNUSU9OID0gMC41O1xuY29uc3QgQk9VTkRBUllfQl9GUkFDVElPTiA9IDEuNTtcbmNvbnN0IFJFTUFQX0VYUElSRV9GUkFDVElPTiA9IDI7XG5cbnR5cGUgVGltZWxpbmVFbnRyeSA9IHtcbiAgICBwaWQ/OiBudW1iZXI7XG4gICAgLy8gcmVsZWFzZVRpbWUgKyBvdmVybGFwVGltZSBkZWZpbmUgZXZlcnl0aGluZzogdGhlIG5ld2VyIGVudHJ5J3MgcmVsZWFzZVRpbWUgaXMgd2hlbiBpdFxuICAgIC8vIHN0YXJ0cywgYW5kIHJlbGVhc2VUaW1lICsgb3ZlcmxhcFRpbWUgaXMgd2hlbiB0aGUgb2xkZXIgb25lIGlzIGtpbGxlZCAoZnJlZWluZyB0aGUgcG9ydCkuXG4gICAgLy8gVGhlIGZpbGVzIGFsc28gY2FycnkgYW4gYWxpdmVXaW5kb3csIHdoaWNoIGlzIGRlbGliZXJhdGVseSBpZ25vcmVkLlxuICAgIHBhcmFtZXRlcnM6IHsgcmVsZWFzZVRpbWU/OiBudW1iZXI7IG92ZXJsYXBUaW1lPzogbnVtYmVyIH07XG59O1xuXG50eXBlIFRha2VvdmVyQ29tcHV0ZWQgPSB7XG4gICAgLy8gV2UgYXJlIHNjaGVkdWxlZCB0byBkaWUgd2l0aCBhIHN1Y2Nlc3NvciBvdmVybGFwcGluZyB1cyAoa25vd24gZnJvbSB0aGUgZmlsZXMgYWxvbmUsIGJlZm9yZVxuICAgIC8vIHRoZSBzdWNjZXNzb3IncyBwb3J0IGlzIGRpc2NvdmVyZWQgLSB0aGUgZmx1c2ggZGVhZGxpbmUgYXBwbGllcyBpbW1lZGlhdGVseSlcbiAgICBkeWluZz86IHsgc3VjY2Vzc29yU3RhcnQ6IG51bWJlcjsgb3ZlcmxhcDogbnVtYmVyIH07XG4gICAgLy8gVGhlIHdpbmRvdyByZWludGVycHJldGF0aW9uLCBvbmNlIHRoZSBtaWRkbGUgd2luZG93J3MgcG9ydCBpcyBrbm93biAodGhlIHN1Y2Nlc3NvcidzXG4gICAgLy8gcmVnaXN0ZXJlZCBhbHRlcm5hdGUgcG9ydCAtIG9yIG91ciBvd24sIHdoZW4gd2UgQVJFIHRoZSBzdWNjZXNzb3IpXG4gICAgcmVtYXA/OiB7IGJvdW5kYXJ5QTogbnVtYmVyOyBib3VuZGFyeUI6IG51bWJlcjsgZXhwaXJlOiBudW1iZXI7IGFsdFBvcnQ6IG51bWJlciB9O1xuICAgIC8vIFdoZW4gb3VyIHByZWRlY2Vzc29yIGRpZXMgYW5kIGZyZWVzIHRoZSBtYWluIHBvcnQgKGZvciBhY3F1aXNpdGlvbiBwYWNpbmcpXG4gICAgcHJlZGVjZXNzb3JFbmQ/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBUYWtlb3ZlckV2ZW50ID0gXCJyZW1hcENoYW5nZWRcIjtcblxubGV0IGluaXRpYWxpemVkOiB7IGRvbWFpbjogc3RyaW5nOyBtYWluUG9ydDogbnVtYmVyOyBzdG9yYWdlRm9sZGVyOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbmxldCBhbmNlc3RvclBpZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbmxldCB0aW1lbGluZUZvbGRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xubGV0IG91ckFsdFBvcnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbmxldCBjdXJyZW50OiBUYWtlb3ZlckNvbXB1dGVkID0ge307XG5sZXQgY3VycmVudEtleSA9IEpTT04uc3RyaW5naWZ5KGN1cnJlbnQpO1xubGV0IGV2ZW50TGlzdGVuZXJzOiAoKGV2ZW50OiBUYWtlb3ZlckV2ZW50KSA9PiB2b2lkKVtdID0gW107XG5sZXQgZXZlbnRUaW1lcnM6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+W10gPSBbXTtcbmxldCBsb2dnZWROb01hdGNoID0gZmFsc2U7XG5sZXQgbG9nZ2VkSWRlbnRpdHkgPSBmYWxzZTtcblxuZnVuY3Rpb24gZXhlY1RleHQoY29tbWFuZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBleGVjKGNvbW1hbmQsIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8vIFRoZSB0aW1lbGluZSBlbnRyeSBwaWQgaXMgdGhlIHNjcmVlbiBzaGVsbCB0aGF0IHNwYXduZWQgdXMgLSBhbiBhbmNlc3RvciAtIHNvIHdlIHdhbGsgb3VyIHdob2xlXG4vLyBhbmNlc3RvciBjaGFpbiB0byBmaW5kIHdoaWNoIGVudHJ5IGlzIHVzXG5hc3luYyBmdW5jdGlvbiBnZXRBbmNlc3RvclBpZHMoKTogUHJvbWlzZTxTZXQ8bnVtYmVyPj4ge1xuICAgIGxldCBwaWRzID0gbmV3IFNldDxudW1iZXI+KFtwcm9jZXNzLnBpZF0pO1xuICAgIGxldCBjdXJyZW50UGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgbGV0IHBwaWQ6IG51bWJlcjtcbiAgICAgICAgaWYgKGN1cnJlbnRQaWQgPT09IHByb2Nlc3MucGlkICYmIHByb2Nlc3MucHBpZCkge1xuICAgICAgICAgICAgcHBpZCA9IHByb2Nlc3MucHBpZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcHBpZCA9IHBhcnNlSW50KChhd2FpdCBleGVjVGV4dChgcHMgLW8gcHBpZD0gLXAgJHtjdXJyZW50UGlkfWApKS50cmltKCkpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwcGlkIHx8IE51bWJlci5pc05hTihwcGlkKSB8fCBwcGlkIDw9IDEgfHwgcGlkcy5oYXMocHBpZCkpIGJyZWFrO1xuICAgICAgICBwaWRzLmFkZChwcGlkKTtcbiAgICAgICAgY3VycmVudFBpZCA9IHBwaWQ7XG4gICAgfVxuICAgIHJldHVybiBwaWRzO1xufVxuXG4vLyBUaGUgaW5zdGFuY2UgZm9sZGVyIGlzIEFMV0FZUyB0aGUgcGFyZW50IG9mIG91ciBjd2QgKHNlcnZpY2VzIHJ1biBpbiA8aW5zdGFuY2U+L2dpdC8pIC0gbmV2ZXJcbi8vIHNlYXJjaCBmb3IgaXQsIGEgd2FsayBjb3VsZCBsYXRjaCBvbnRvIHRoZSB3cm9uZyBmb2xkZXJcbmZ1bmN0aW9uIGdldFRpbWVsaW5lRm9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZShwcm9jZXNzLmN3ZCgpKS5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIikgKyBcIi9cIjtcbn1cblxuZnVuY3Rpb24gcGlkQWxpdmUocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gKGUgYXMgeyBjb2RlPzogc3RyaW5nIH0pLmNvZGUgPT09IFwiRVBFUk1cIjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlZ2lzdHJ5Rm9sZGVyKCk6IHN0cmluZyB7XG4gICAgaWYgKCFpbml0aWFsaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlcGxveSB0YWtlb3ZlciBpcyBub3QgaW5pdGlhbGl6ZWRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbihwYXRoLmRpcm5hbWUocGF0aC5yZXNvbHZlKGluaXRpYWxpemVkLnN0b3JhZ2VGb2xkZXIpKSwgUE9SVF9SRUdJU1RSWV9GT0xERVJfTkFNRSk7XG59XG5cbnR5cGUgUmVnaXN0cnlFbnRyeSA9IHsgcGlkOiBudW1iZXI7IHBvcnQ6IG51bWJlcjsgYW5jZXN0b3JQaWRzOiBudW1iZXJbXSB9O1xuXG5hc3luYyBmdW5jdGlvbiByZWFkUG9ydFJlZ2lzdHJ5KCk6IFByb21pc2U8UmVnaXN0cnlFbnRyeVtdPiB7XG4gICAgbGV0IGZvbGRlciA9IGdldFJlZ2lzdHJ5Rm9sZGVyKCk7XG4gICAgbGV0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICAgIGZpbGVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihmb2xkZXIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGxldCBlbnRyaWVzOiBSZWdpc3RyeUVudHJ5W10gPSBbXTtcbiAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IC9eKFxcZCspXFwuanNvbiQvLmV4ZWMoZmlsZSk7XG4gICAgICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgcGlkID0gcGFyc2VJbnQobWF0Y2hbMV0pO1xuICAgICAgICBpZiAoIXBpZEFsaXZlKHBpZCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMudW5saW5rKHBhdGguam9pbihmb2xkZXIsIGZpbGUpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggeyB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZm9sZGVyLCBmaWxlKSwgXCJ1dGY4XCIpKSBhcyBSZWdpc3RyeUVudHJ5O1xuICAgICAgICAgICAgZW50cmllcy5wdXNoKHsgLi4uZW50cnksIHBpZCB9KTtcbiAgICAgICAgfSBjYXRjaCB7IH1cbiAgICB9XG4gICAgcmV0dXJuIGVudHJpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRUaW1lbGluZUVudHJpZXMoKTogUHJvbWlzZTxUaW1lbGluZUVudHJ5W10+IHtcbiAgICBpZiAoIXRpbWVsaW5lRm9sZGVyKSByZXR1cm4gW107XG4gICAgbGV0IGVudHJpZXM6IFRpbWVsaW5lRW50cnlbXSA9IFtdO1xuICAgIGZvciAobGV0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih0aW1lbGluZUZvbGRlcikpIHtcbiAgICAgICAgaWYgKCFQQVJBTUVURVJTX1RJTUVMSU5FX0ZJTEVfUkVHRVgudGVzdChmaWxlKSkgY29udGludWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh0aW1lbGluZUZvbGRlciArIGZpbGUsIFwidXRmOFwiKSkgYXMgVGltZWxpbmVFbnRyeSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IHJlYWQgZGVwbG95IHRpbWVsaW5lIGZpbGUgJHt0aW1lbGluZUZvbGRlciArIGZpbGV9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbnRyaWVzO1xufVxuXG5mdW5jdGlvbiBtYWtlUmVtYXAoc3VjY2Vzc29yU3RhcnQ6IG51bWJlciwgb3ZlcmxhcDogbnVtYmVyLCBhbHRQb3J0OiBudW1iZXIpOiBUYWtlb3ZlckNvbXB1dGVkW1wicmVtYXBcIl0ge1xuICAgIHJldHVybiB7XG4gICAgICAgIGJvdW5kYXJ5QTogc3VjY2Vzc29yU3RhcnQgKyBvdmVybGFwICogQk9VTkRBUllfQV9GUkFDVElPTixcbiAgICAgICAgYm91bmRhcnlCOiBzdWNjZXNzb3JTdGFydCArIG92ZXJsYXAgKiBCT1VOREFSWV9CX0ZSQUNUSU9OLFxuICAgICAgICBleHBpcmU6IHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCAqIFJFTUFQX0VYUElSRV9GUkFDVElPTixcbiAgICAgICAgYWx0UG9ydCxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBlbWl0KGV2ZW50OiBUYWtlb3ZlckV2ZW50KTogdm9pZCB7XG4gICAgZm9yIChsZXQgbGlzdGVuZXIgb2YgZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRGVwbG95IHRha2VvdmVyIGxpc3RlbmVyIGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVFdmVudHMoKTogdm9pZCB7XG4gICAgZm9yIChsZXQgdGltZXIgb2YgZXZlbnRUaW1lcnMpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG4gICAgZXZlbnRUaW1lcnMgPSBbXTtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgc2NoZWR1bGUgPSAodGltZTogbnVtYmVyLCBmbmM6ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgaWYgKHRpbWUgPD0gbm93KSByZXR1cm47XG4gICAgICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoZm5jLCB0aW1lIC0gbm93KTtcbiAgICAgICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgZXZlbnRUaW1lcnMucHVzaCh0aW1lcik7XG4gICAgfTtcbiAgICBjb25zdCByZW1hcCA9IGN1cnJlbnQucmVtYXA7XG4gICAgaWYgKHJlbWFwKSB7XG4gICAgICAgIGxldCBhbHRQb3J0ID0gcmVtYXAuYWx0UG9ydDtcbiAgICAgICAgc2NoZWR1bGUocmVtYXAuYm91bmRhcnlBLCAoKSA9PiBjb25zb2xlLmxvZyhgJHtsb2dQcmVmaXgoKX0gRGVwbG95IHN3aXRjaG92ZXIgd3JpdGUgaGFuZG9mZiBib3VuZGFyeSAke2lzbyhyZW1hcC5ib3VuZGFyeUEpfSBwYXNzZWQ6IGZyZXNoIHdyaXRlcyBub3cgYmVsb25nIHRvIHRoZSBhbHRlcm5hdGUtcG9ydCBzaWRlIChwb3J0ICR7YWx0UG9ydH0pYCkpO1xuICAgICAgICBzY2hlZHVsZShyZW1hcC5ib3VuZGFyeUIsICgpID0+IGNvbnNvbGUubG9nKGAke2xvZ1ByZWZpeCgpfSBEZXBsb3kgc3dpdGNob3ZlciBzZWNvbmQgYm91bmRhcnkgJHtpc28ocmVtYXAuYm91bmRhcnlCKX0gcGFzc2VkOiBmcmVzaCB3cml0ZXMgcmV0dXJuIHRvIHRoZSBtYWluIHBvcnRgKSk7XG4gICAgICAgIHNjaGVkdWxlKHJlbWFwLmV4cGlyZSwgKCkgPT4gdm9pZCByZWNvbXB1dGUoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYERlcGxveSB0YWtlb3ZlciByZWNvbXB1dGUgZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSkpO1xuICAgIH1cbn1cblxuLy8gTXVsdGlwbGUgcHJvY2Vzc2VzIChwcmVkZWNlc3NvciArIHN1Y2Nlc3Nvcikgb2Z0ZW4gc2hhcmUgb25lIGpvdXJuYWwgZHVyaW5nIGEgc3dpdGNob3Zlciwgc29cbi8vIGV2ZXJ5IGxpZmVjeWNsZSBsaW5lIGlkZW50aWZpZXMgaXRzIHByb2Nlc3NcbmZ1bmN0aW9uIGxvZ1ByZWZpeCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgW3BpZCAke3Byb2Nlc3MucGlkfV1gO1xufVxuXG4vLyBSZWNvbXB1dGUgaXMgaW52b2tlZCBmcm9tIGluaXQsIHJlZ2lzdGVyQWx0UG9ydCwgdGhlIHBvbGwsIGFuZCB0aGUgZXhwaXJ5IHRpbWVyIC0gcG9zc2libHlcbi8vIGNvbmN1cnJlbnRseS4gUnVucyBhcmUgc2VyaWFsaXplZCwgb3IgdHdvIGluLWZsaWdodCBydW5zIHdvdWxkIGJvdGggcGFzcyB0aGUgY2hhbmdlZC1zdGF0ZSBjaGVja1xuLy8gYW5kIGRvdWJsZS1maXJlIGV2ZXJ5IHRyYW5zaXRpb24gKGxvZ3MsIHJlYnVpbGQgZXZlbnRzLCB0aW1lcnMpLlxubGV0IHJlY29tcHV0ZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5mdW5jdGlvbiByZWNvbXB1dGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IG5leHQgPSByZWNvbXB1dGVDaGFpbi50aGVuKCgpID0+IHJlY29tcHV0ZU5vdygpKTtcbiAgICByZWNvbXB1dGVDaGFpbiA9IG5leHQudGhlbigoKSA9PiB7IH0sICgpID0+IHsgfSk7XG4gICAgcmV0dXJuIG5leHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlY29tcHV0ZU5vdygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWluaXRpYWxpemVkIHx8ICF0aW1lbGluZUZvbGRlcikgcmV0dXJuO1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBlbnRyaWVzID0gYXdhaXQgcmVhZFRpbWVsaW5lRW50cmllcygpO1xuICAgIGxldCByZWdpc3RyeSA9IGF3YWl0IHJlYWRQb3J0UmVnaXN0cnkoKTtcbiAgICBsZXQgdXM6IFRpbWVsaW5lRW50cnkgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoZW50cnkucGlkICYmIGFuY2VzdG9yUGlkcy5oYXMoZW50cnkucGlkKSkge1xuICAgICAgICAgICAgdXMgPSBlbnRyeTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNYXRjaGluZyBmYWlsdXJlcyBtdXN0IGJlIGxvdWQsIG9yIHRha2VvdmVyIGRldGVjdGlvbiBmYWlscyBzaWxlbnRseSBmb3JldmVyXG4gICAgaWYgKCF1cyAmJiBlbnRyaWVzLmxlbmd0aCAmJiAhbG9nZ2VkTm9NYXRjaCkge1xuICAgICAgICBsb2dnZWROb01hdGNoID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS53YXJuKGAke2xvZ1ByZWZpeCgpfSBObyBkZXBsb3kgdGltZWxpbmUgZW50cnkgbWF0Y2hlcyBvdXIgcGlkIGNoYWluICgke1suLi5hbmNlc3RvclBpZHNdLmpvaW4oXCIsIFwiKX0pIC0gdGFrZW92ZXIgZGV0ZWN0aW9uIGNhbm5vdCB3b3JrLiBFbnRyaWVzOiAke2VudHJpZXMubWFwKHggPT4gYHBpZD0ke3gucGlkID8/IFwibm9uZVwifSByZWxlYXNlVGltZT0ke3gucGFyYW1ldGVycy5yZWxlYXNlVGltZX1gKS5qb2luKFwiIHwgXCIpfWApO1xuICAgIH1cbiAgICBpZiAodXMgJiYgIWxvZ2dlZElkZW50aXR5KSB7XG4gICAgICAgIGxvZ2dlZElkZW50aXR5ID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS5sb2coYCR7bG9nUHJlZml4KCl9IERlcGxveSB0aW1lbGluZSBlbnRyeSBtYXRjaGVkOiB3ZSBhcmUgcGlkPSR7dXMucGlkfSwgcmVsZWFzZVRpbWU9JHt1cy5wYXJhbWV0ZXJzLnJlbGVhc2VUaW1lICE9PSB1bmRlZmluZWQgJiYgaXNvKHVzLnBhcmFtZXRlcnMucmVsZWFzZVRpbWUpIHx8IFwidW5rbm93blwifSwgJHtlbnRyaWVzLmxlbmd0aH0gZW50cmllcyB0b3RhbGApO1xuICAgIH1cbiAgICBsZXQgY29tcHV0ZWQ6IFRha2VvdmVyQ29tcHV0ZWQgPSB7fTtcbiAgICBsZXQgdXNSZWxlYXNlID0gdXM/LnBhcmFtZXRlcnMucmVsZWFzZVRpbWU7XG4gICAgaWYgKHVzICYmIHVzUmVsZWFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRoZSBuZXdlciBlbnRyeSdzIHJlbGVhc2VUaW1lIGlzIHdoZW4gaXQgc3RhcnRzOyByZWxlYXNlVGltZSArIG92ZXJsYXBUaW1lIGlzIHdoZW4gdGhlXG4gICAgICAgIC8vIG9sZGVyIG9uZSBpcyBraWxsZWQuIFRoYXQncyB0aGUgd2hvbGUgdGltZWxpbmUuXG4gICAgICAgIGxldCBuZXh0OiB7IGVudHJ5OiBUaW1lbGluZUVudHJ5OyByZWxlYXNlOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHByZXY6IHsgZW50cnk6IFRpbWVsaW5lRW50cnk7IHJlbGVhc2U6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkgPT09IHVzKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCByZWxlYXNlID0gZW50cnkucGFyYW1ldGVycy5yZWxlYXNlVGltZTtcbiAgICAgICAgICAgIGlmIChyZWxlYXNlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJlbGVhc2UgPiB1c1JlbGVhc2UgJiYgKCFuZXh0IHx8IHJlbGVhc2UgPCBuZXh0LnJlbGVhc2UpKSB7XG4gICAgICAgICAgICAgICAgbmV4dCA9IHsgZW50cnksIHJlbGVhc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZWxlYXNlIDwgdXNSZWxlYXNlICYmICghcHJldiB8fCByZWxlYXNlID4gcHJldi5yZWxlYXNlKSkge1xuICAgICAgICAgICAgICAgIHByZXYgPSB7IGVudHJ5LCByZWxlYXNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICAgIGxldCBzdWNjZXNzb3JTdGFydCA9IG5leHQucmVsZWFzZTtcbiAgICAgICAgICAgIGxldCBvdmVybGFwID0gbmV4dC5lbnRyeS5wYXJhbWV0ZXJzLm92ZXJsYXBUaW1lIHx8IHVzLnBhcmFtZXRlcnMub3ZlcmxhcFRpbWUgfHwgMDtcbiAgICAgICAgICAgIC8vIFRyYWNrZWQgZXZlbiBmb3IgYSBaRVJPLW92ZXJsYXAgZGVwbG95ICh0aGUgc2NoZWR1bGVkLXN3aXRjaG92ZXIgbG9nIG11c3Qgc3RpbGxcbiAgICAgICAgICAgIC8vIGZpcmUpOyBvbmx5IHRoZSByZW1hcCAodGhlIGFsdGVybmF0ZS1wb3J0IG1pZGRsZSB3aW5kb3cpIG5lZWRzIGFuIGFjdHVhbCBvdmVybGFwLlxuICAgICAgICAgICAgLy8gRmx1c2hpbmcgYmVmb3JlIHRoZSBoYW5kb2ZmIG5lZWRzIG5vdGhpbmcgc3BlY2lhbCBoZXJlOiB0aGUgcmVtYXAgZW5kcyBvdXIgdmFsaWRcbiAgICAgICAgICAgIC8vIHdpbmRvdywgYW5kIGZhc3Qgd3JpdGVzIGFsd2F5cyBmbHVzaCBhaGVhZCBvZiB0aGVpciB3aW5kb3cncyBlbmQuXG4gICAgICAgICAgICBjb21wdXRlZC5keWluZyA9IHsgc3VjY2Vzc29yU3RhcnQsIG92ZXJsYXAgfTtcbiAgICAgICAgICAgIGlmIChvdmVybGFwID4gMCAmJiBub3cgPCBzdWNjZXNzb3JTdGFydCArIG92ZXJsYXAgKiBSRU1BUF9FWFBJUkVfRlJBQ1RJT04pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzb3JQaWQgPSBuZXh0LmVudHJ5LnBpZDtcbiAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzc29yUGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdWNjZXNzb3JFbnRyeSA9IHJlZ2lzdHJ5LmZpbmQoeCA9PiB4LmFuY2VzdG9yUGlkcy5pbmNsdWRlcyhzdWNjZXNzb3JQaWQpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3NvckVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZC5yZW1hcCA9IG1ha2VSZW1hcChzdWNjZXNzb3JTdGFydCwgb3ZlcmxhcCwgc3VjY2Vzc29yRW50cnkucG9ydCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgICAgIGxldCBvdmVybGFwID0gdXMucGFyYW1ldGVycy5vdmVybGFwVGltZSB8fCBwcmV2LmVudHJ5LnBhcmFtZXRlcnMub3ZlcmxhcFRpbWUgfHwgMDtcbiAgICAgICAgICAgIC8vIFRoZSBwcmVkZWNlc3NvciBob2xkcyB0aGUgbWFpbiBwb3J0IHVudGlsIE9VUiByZWxlYXNlICsgdGhlIG92ZXJsYXBcbiAgICAgICAgICAgIGNvbXB1dGVkLnByZWRlY2Vzc29yRW5kID0gdXNSZWxlYXNlICsgb3ZlcmxhcDtcbiAgICAgICAgICAgIGlmIChvdmVybGFwID4gMCAmJiBvdXJBbHRQb3J0ICYmIG5vdyA8IHVzUmVsZWFzZSArIG92ZXJsYXAgKiBSRU1BUF9FWFBJUkVfRlJBQ1RJT04gJiYgIWNvbXB1dGVkLnJlbWFwKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWQucmVtYXAgPSBtYWtlUmVtYXAodXNSZWxlYXNlLCBvdmVybGFwLCBvdXJBbHRQb3J0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQga2V5ID0gSlNPTi5zdHJpbmdpZnkoY29tcHV0ZWQpO1xuICAgIGlmIChrZXkgPT09IGN1cnJlbnRLZXkpIHJldHVybjtcbiAgICBsb2dUcmFuc2l0aW9ucyhjdXJyZW50LCBjb21wdXRlZCk7XG4gICAgY3VycmVudCA9IGNvbXB1dGVkO1xuICAgIGN1cnJlbnRLZXkgPSBrZXk7XG4gICAgc2NoZWR1bGVFdmVudHMoKTtcbiAgICBlbWl0KFwicmVtYXBDaGFuZ2VkXCIpO1xufVxuXG5mdW5jdGlvbiBpc28odGltZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGltZSkudG9JU09TdHJpbmcoKTtcbn1cblxuLy8gVGhlIHN3aXRjaG92ZXIgbGlmZWN5Y2xlIGlzIHJhcmUgYW5kIGltcG9ydGFudCwgc28gZXZlcnkgc3RhZ2UgZ2V0cyBhIGNsZWFyIGxpbmVcbmZ1bmN0aW9uIGxvZ1RyYW5zaXRpb25zKHByZXY6IFRha2VvdmVyQ29tcHV0ZWQsIG5leHQ6IFRha2VvdmVyQ29tcHV0ZWQpOiB2b2lkIHtcbiAgICBpZiAoIXByZXYuZHlpbmcgJiYgbmV4dC5keWluZykge1xuICAgICAgICBsZXQgeyBzdWNjZXNzb3JTdGFydCwgb3ZlcmxhcCB9ID0gbmV4dC5keWluZztcbiAgICAgICAgY29uc29sZS5sb2coYCR7bG9nUHJlZml4KCl9IERlcGxveSBzd2l0Y2hvdmVyIHNjaGVkdWxlZDogb3VyIHN1Y2Nlc3NvciBzdGFydHMgYXQgJHtpc28oc3VjY2Vzc29yU3RhcnQpfTsgZnJlc2ggd3JpdGVzIGhhbmQgb2ZmIGF0ICR7aXNvKHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCAqIEJPVU5EQVJZX0FfRlJBQ1RJT04pfSwgYW5kIHdlIGFyZSBraWxsZWQgYXQgJHtpc28oc3VjY2Vzc29yU3RhcnQgKyBvdmVybGFwKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwcmV2LnByZWRlY2Vzc29yRW5kICYmIG5leHQucHJlZGVjZXNzb3JFbmQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCR7bG9nUHJlZml4KCl9IFdlIGFyZSBhIGRlcGxveSBzdWNjZXNzb3I6IG91ciBwcmVkZWNlc3NvciBob2xkcyB0aGUgbWFpbiBwb3J0IHVudGlsICR7aXNvKG5leHQucHJlZGVjZXNzb3JFbmQpfWApO1xuICAgIH1cbiAgICBpZiAoIXByZXYucmVtYXAgJiYgbmV4dC5yZW1hcCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgJHtsb2dQcmVmaXgoKX0gRGVwbG95IHN3aXRjaG92ZXIgcmVtYXAgYWN0aXZlOiBzb3VyY2VzIHBvaW50aW5nIGF0IHVzIGFyZSBzcGxpdCBzbyBbJHtpc28obmV4dC5yZW1hcC5ib3VuZGFyeUEpfSAuLiAke2lzbyhuZXh0LnJlbWFwLmJvdW5kYXJ5Qil9XSByb3V0ZXMgdG8gYWx0ZXJuYXRlIHBvcnQgJHtuZXh0LnJlbWFwLmFsdFBvcnR9IChyZW1hcCBleHBpcmVzIGF0ICR7aXNvKG5leHQucmVtYXAuZXhwaXJlKX0pYCk7XG4gICAgfVxuICAgIGlmIChwcmV2LnJlbWFwICYmICFuZXh0LnJlbWFwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2xvZ1ByZWZpeCgpfSBEZXBsb3kgc3dpdGNob3ZlciByZW1hcCBlbmRlZDsgcnVubmluZyBvbiB0aGUgcGxhaW4gc3RvcmVkIHJvdXRpbmcgY29uZmlnYCk7XG4gICAgfVxufVxuXG4vKiogU3RhcnRzIHRoZSB0YWtlb3ZlciBtYWNoaW5lcnkuIFBvcnQgZmFsbGJhY2sgKGFsdGVybmF0ZSBwb3J0ICsgcmVnaXN0cnkgKyBhY3F1aXNpdGlvbiBwb2xsaW5nKVxuICogIHdvcmtzIHJlZ2FyZGxlc3M7IHdpdGhvdXQgYSBkZXBsb3kgdGltZWxpbmUgZm9sZGVyIHRoZSBzd2l0Y2hvdmVyLXNwZWNpZmljIHBhcnRzICh0aGUgcmVtYXAsXG4gKiAgdGhlIHRpZ2h0ZXIgYWNxdWlzaXRpb24gcGFjaW5nKSBzaW1wbHkgc3RheSBpbmVydC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0RGVwbG95VGFrZW92ZXIoY29uZmlnOiB7IGRvbWFpbjogc3RyaW5nOyBtYWluUG9ydDogbnVtYmVyOyBzdG9yYWdlRm9sZGVyOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGluaXRpYWxpemVkID0gY29uZmlnO1xuICAgIGFuY2VzdG9yUGlkcyA9IGF3YWl0IGdldEFuY2VzdG9yUGlkcygpO1xuICAgIHRpbWVsaW5lRm9sZGVyID0gZ2V0VGltZWxpbmVGb2xkZXIoKTtcbiAgICBsZXQgZW50cmllcyA9IGF3YWl0IHJlYWRUaW1lbGluZUVudHJpZXMoKTtcbiAgICBpZiAoIWVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2xvZ1ByZWZpeCgpfSBObyBkZXBsb3kgdGltZWxpbmUgZW50cmllcyBpbiAke3RpbWVsaW5lRm9sZGVyfTsgZGVwbG95IHRha2VvdmVyIGluYWN0aXZlIHVudGlsIHRoZXkgYXBwZWFyIChwb3J0IGZhbGxiYWNrIHN0aWxsIHdvcmtzKWApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2xvZ1ByZWZpeCgpfSBEZXBsb3kgdGltZWxpbmUgZm91bmQgYXQgJHt0aW1lbGluZUZvbGRlcn0gKCR7ZW50cmllcy5sZW5ndGh9IGVudHJpZXMpOyBvdXIgcGlkIGNoYWluOiAke1suLi5hbmNlc3RvclBpZHNdLmpvaW4oXCIgLT4gXCIpfWApO1xuICAgIH1cbiAgICBhd2FpdCByZWNvbXB1dGUoKTtcbiAgICBsZXQgcG9sbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdm9pZCByZWNvbXB1dGUoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYERlcGxveSB0YWtlb3ZlciByZWNvbXB1dGUgZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgfSwgVElNRUxJTkVfUE9MTF9JTlRFUlZBTCk7XG4gICAgKHBvbGwgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xufVxuXG4vKiogQ2FsbGVkIHdoZW4gd2UgaGFkIHRvIGxpc3RlbiBvbiBhbiBhbHRlcm5hdGUgcG9ydCAodGhlIG1haW4gcG9ydCB3YXMgc3RpbGwgaGVsZCBieSBvdXJcbiAqICBwcmVkZWNlc3Nvcik6IHJlZ2lzdGVycyBpdCBzbyB0aGUgcHJlZGVjZXNzb3IgY2FuIHJvdXRlIHRoZSBtaWRkbGUgb3ZlcmxhcCB3aW5kb3cgdG8gdXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJBbHRQb3J0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIG91ckFsdFBvcnQgPSBwb3J0O1xuICAgIGxldCBmb2xkZXIgPSBnZXRSZWdpc3RyeUZvbGRlcigpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgbGV0IGVudHJ5OiBSZWdpc3RyeUVudHJ5ID0geyBwaWQ6IHByb2Nlc3MucGlkLCBwb3J0LCBhbmNlc3RvclBpZHM6IFsuLi5hbmNlc3RvclBpZHNdIH07XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihmb2xkZXIsIGAke3Byb2Nlc3MucGlkfS5qc29uYCksIEpTT04uc3RyaW5naWZ5KGVudHJ5KSk7XG4gICAgYXdhaXQgcmVjb21wdXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvblRha2VvdmVyRXZlbnQobGlzdGVuZXI6IChldmVudDogVGFrZW92ZXJFdmVudCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGV2ZW50TGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xufVxuXG4vKiogVGhlIGludGVycHJldGF0aW9uIG92ZXJsYXk6IHNwbGl0cyBldmVyeSBzb3VyY2UgcG9pbnRpbmcgYXQgb3VyIGRvbWFpbittYWluIHBvcnQgc28gdGhlIG1pZGRsZVxuICogIG9mIHRoZSBkZXBsb3kgb3ZlcmxhcCBwb2ludHMgYXQgdGhlIGFsdGVybmF0ZSBwb3J0LiBQdXJlLCBpbi1tZW1vcnkgb25seSAtIHRoZSBzdG9yZWQgcm91dGluZ1xuICogIGNvbmZpZyBpcyBuZXZlciBtb2RpZmllZCwgYW5kIHRoaXMgbXVzdCBuZXZlciBiZSBhcHBsaWVkIHRvIGRhdGEgdGhhdCBnZXRzIHBlcnNpc3RlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlcGxveVJlbWFwKHJvdXRpbmc6IFJlbW90ZUNvbmZpZyk6IFJlbW90ZUNvbmZpZyB7XG4gICAgbGV0IHJlbWFwID0gY3VycmVudC5yZW1hcDtcbiAgICBsZXQgaW5pdCA9IGluaXRpYWxpemVkO1xuICAgIGlmICghcmVtYXAgfHwgIWluaXQpIHJldHVybiByb3V0aW5nO1xuICAgIGxldCBzb3VyY2VzOiBSZW1vdGVDb25maWdCYXNlW10gPSBbXTtcbiAgICBsZXQgc2xpY2UgPSAoc291cmNlOiBIb3N0ZWRDb25maWcsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCB1cmw/OiBzdHJpbmcpOiBIb3N0ZWRDb25maWcgPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5zb3VyY2UsIHVybDogdXJsIHx8IHNvdXJjZS51cmwsIHZhbGlkV2luZG93OiBbc3RhcnQsIGVuZF0gfTtcbiAgICB9O1xuICAgIGZvciAobGV0IHNvdXJjZSBvZiByb3V0aW5nLnNvdXJjZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIgfHwgc291cmNlLnR5cGUgIT09IFwicmVtb3RlXCIpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhcnNlZDogeyBhZGRyZXNzOiBzdHJpbmc7IHBvcnQ6IG51bWJlciB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoc291cmNlLnVybCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkLmFkZHJlc3MgIT09IGluaXQuZG9tYWluIHx8IHBhcnNlZC5wb3J0ICE9PSBpbml0Lm1haW5Qb3J0KSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSBzb3VyY2UudmFsaWRXaW5kb3c7XG4gICAgICAgIGxldCBhID0gTWF0aC5tYXgoc3RhcnQsIE1hdGgubWluKHJlbWFwLmJvdW5kYXJ5QSwgZW5kKSk7XG4gICAgICAgIGxldCBiID0gTWF0aC5tYXgoc3RhcnQsIE1hdGgubWluKHJlbWFwLmJvdW5kYXJ5QiwgZW5kKSk7XG4gICAgICAgIGxldCBhZGRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoYSA+IHN0YXJ0KSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc2xpY2Uoc291cmNlLCBzdGFydCwgYSkpO1xuICAgICAgICAgICAgYWRkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiID4gYSkge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNsaWNlKHNvdXJjZSwgYSwgYiwgcmVwbGFjZUhvc3RlZFVybFBvcnQoc291cmNlLnVybCwgcmVtYXAuYWx0UG9ydCkpKTtcbiAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kID4gYikge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNsaWNlKHNvdXJjZSwgYiwgZW5kKSk7XG4gICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhZGRlZCkge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgdmVyc2lvbjogcm91dGluZy52ZXJzaW9uLCBzb3VyY2VzIH07XG59XG5cbi8qKiBBIHN0YW1wIG9mIHRoZSBjdXJyZW50IHJlbWFwIGludGVycHJldGF0aW9uLCBhZHZlcnRpc2VkIGluIHBpbmcgcmVzcG9uc2VzIC0gc28gZXZlcnkgY29ubmVjdGVkXG4gKiAgY2xpZW50IGxlYXJucyBvZiBhIHRha2VvdmVyIHdpdGhpbiBvbmUgcGluZyBpbnRlcnZhbCwgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciBpdHMgY29uZmlnIHBvbGxcbiAqICBvciBhIHdyaXRlIHJlamVjdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWtlb3ZlclN0YW1wKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHJlbWFwID0gY3VycmVudC5yZW1hcDtcbiAgICBpZiAoIXJlbWFwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShyZW1hcCk7XG59XG5cbi8qKiBUaGUgbWlkZGxlLXdpbmRvdyBhbHRlcm5hdGUgcG9ydCBvZiBhbiBhY3RpdmUgcmVtYXAuIFRoZSBPVEhFUiBwcm9jZXNzIG9mIHRoZSB0YWtlb3ZlciBsaXZlcyBvblxuICogIHRoaXMgcG9ydCBvbiBPVVIgbWFjaGluZSAoc2FtZSBkaXNrISksIHNvIHNvdXJjZXMgcG9pbnRpbmcgYXQgaXQgYXJlIHNlbGYsIG5ldmVyIHN5bmMgdGFyZ2V0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWtlb3ZlckFsdFBvcnQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gY3VycmVudC5yZW1hcD8uYWx0UG9ydDtcbn1cblxuLyoqIEhvdyBsb25nIHRvIHdhaXQgYmV0d2VlbiBtYWluLXBvcnQgYWNxdWlzaXRpb24gYXR0ZW1wdHM6IHRpZ2h0IGFyb3VuZCB0aGUgcHJlZGVjZXNzb3Inc1xuICogIHNjaGVkdWxlZCBkZWF0aCAod2hlbiB0aGUgcG9ydCBhY3R1YWxseSBmcmVlcyksIHJlbGF4ZWQgb3RoZXJ3aXNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1haW5Qb3J0QWNxdWlyZURlbGF5KCk6IG51bWJlciB7XG4gICAgbGV0IGVuZCA9IGN1cnJlbnQucHJlZGVjZXNzb3JFbmQ7XG4gICAgaWYgKGVuZCAhPT0gdW5kZWZpbmVkICYmIE1hdGguYWJzKERhdGUubm93KCkgLSBlbmQpIDw9IEFDUVVJUkVfRkFTVF9XSU5ET1cpIHtcbiAgICAgICAgcmV0dXJuIEFDUVVJUkVfRkFTVF9ERUxBWTtcbiAgICB9XG4gICAgcmV0dXJuIEFDUVVJUkVfU0xPV19ERUxBWTtcbn1cbiJdfQ==
419
+ /* _JS_SOURCE_HASH = "0805fcebfb2915bb1cd943d39d9aa9b890cfbf20ac1114c48921795db1f87dda"; */
@@ -49,7 +49,7 @@ class SourceWrapper {
49
49
  let wrapper = new SourceWrapper(config, (options === null || options === void 0 ? void 0 : options.background) !== false);
50
50
  if (config.type === "backblaze") {
51
51
  if (await hasBackblazeCreds()) {
52
- wrapper.api = new backblaze_1.ArchivesBackblaze({ bucketName: (0, remoteConfig_1.parseBackblazeUrl)(config.url).bucketName, public: config.public, immutable: config.immutable });
52
+ wrapper.api = new backblaze_1.ArchivesBackblaze({ bucketName: (0, remoteConfig_1.parseBackblazeUrl)(config.url).bucketName, public: config.public, immutable: config.immutable, allowedOrigins: config.allowedOrigins });
53
53
  }
54
54
  else if ((0, misc_1.isNode)()) {
55
55
  wrapper.writeBlocked = `No backblaze credentials for ${config.url}. Provide backblaze.json.applicationKeyId and backblaze.json.applicationKey via getSecret to enable API access.`;
@@ -90,7 +90,7 @@ class SourceWrapper {
90
90
  let endText = end === Number.MAX_SAFE_INTEGER && "forever" || new Date(end).toISOString();
91
91
  parts.push(`validWindow [${startText}, ${endText}]`);
92
92
  }
93
- return `source/${this.config.url}${parts.length && ` (${parts.join(", ")})` || ""}`;
93
+ return `source ${this.config.url}${parts.length && ` (${parts.join(", ")})` || ""}`;
94
94
  }
95
95
  isConnected() {
96
96
  if (!this.remote)
@@ -255,5 +255,5 @@ class SourceWrapper {
255
255
  }
256
256
  }
257
257
  exports.SourceWrapper = SourceWrapper;
258
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlV3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNvdXJjZVdyYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFFMUIsbURBQXdEO0FBQ3hELDJEQUFxRDtBQUNyRCxvREFBaUQ7QUFFakQsaURBQW1HO0FBQ25HLHFEQUFrRDtBQUNsRCwrQ0FBNEM7QUFDNUMsNENBQWlEO0FBQ2pELDZEQUF3RjtBQUUzRSxRQUFBLGlCQUFpQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDN0IsUUFBQSxlQUFlLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDaEMsUUFBQSxZQUFZLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLGFBQWEsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUV4QixLQUFLLFVBQVUsaUJBQWlCO0lBQzVCLElBQUksQ0FBQyxJQUFBLGFBQU0sR0FBRTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzVCLElBQUksQ0FBQztRQUNELE1BQU0sSUFBQSxxQkFBUyxFQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDbkQsTUFBTSxJQUFBLHFCQUFTLEVBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQUMsV0FBTSxDQUFDO1FBQ0wsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztBQUNMLENBQUM7QUFFRCxtR0FBbUc7QUFDbkcsbUdBQW1HO0FBQ25HLGtHQUFrRztBQUNsRyw2RkFBNkY7QUFDN0YsOEZBQThGO0FBQzlGLDZGQUE2RjtBQUM3RixNQUFhLGFBQWE7SUFTdEIsWUFDVyxNQUFzQztJQUM3QyxvRkFBb0Y7SUFDNUUsVUFBbUI7UUFGcEIsV0FB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LENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ3pELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxPQUFPO1FBQ1YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0wsQ0FBQztDQUNKO0FBak9ELHNDQWlPQyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5hbGxvd2NsaWVudCA9IHRydWU7XG5cbmltcG9ydCB7IGlzTm9kZSwgc29ydCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IGdldFNlY3JldCB9IGZyb20gXCIuLi8uLi9taXNjL2dldFNlY3JldFwiO1xuaW1wb3J0IHsgSUFyY2hpdmVzLCBIb3N0ZWRDb25maWcsIEJhY2tibGF6ZUNvbmZpZyB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0QnVja2V0QmFzZVVybCwgcGFyc2VIb3N0ZWRVcmwsIHBhcnNlQmFja2JsYXplVXJsIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1JlbW90ZSB9IGZyb20gXCIuL0FyY2hpdmVzUmVtb3RlXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1VybCB9IGZyb20gXCIuL0FyY2hpdmVzVXJsXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0JhY2tibGF6ZSB9IGZyb20gXCIuLi9iYWNrYmxhemVcIjtcbmltcG9ydCB7IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWdPcHRpb25hbCwgZ2V0TG9jYWxBcmNoaXZlcyB9IGZyb20gXCIuL3N0b3JhZ2VTZXJ2ZXJTdGF0ZVwiO1xuXG5leHBvcnQgY29uc3QgUkVUUllfU1RBUlRfREVMQVkgPSAyICogMTAwMDtcbmV4cG9ydCBjb25zdCBSRVRSWV9NQVhfREVMQVkgPSA1ICogNjAgKiAxMDAwO1xuZXhwb3J0IGNvbnN0IFJFVFJZX0dST1dUSCA9IDEuNTtcbmNvbnN0IEFDQ0VTU19SRUNIRUNLX0lOVEVSVkFMID0gNjAgKiAxMDAwO1xuY29uc3QgUElOR19JTlRFUlZBTCA9IDYwICogMTAwMDtcbmNvbnN0IFBJTkdfSElTVE9SWSA9IDEwO1xuXG5hc3luYyBmdW5jdGlvbiBoYXNCYWNrYmxhemVDcmVkcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWlzTm9kZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZ2V0U2VjcmV0KFwiYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlJZFwiKTtcbiAgICAgICAgYXdhaXQgZ2V0U2VjcmV0KFwiYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlcIik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBPbmUgc291cmNlIG9mIGEgUmVtb3RlQ29uZmlnLCBhcyBhIHVzYWJsZSBJQXJjaGl2ZXMuIFJlYWRzIGZhbGwgYmFjayB0byB0aGUgcHVibGljLVVSTCBmb3JtIHdoZW5cbi8vIHdlIGRvbid0IGhhdmUgQVBJIGFjY2Vzczsgd3JpdGVzIGFsd2F5cyBhdHRlbXB0IHRoZSBBUEkgKHNvIGFjY2VzcyBncmFudGVkIGxhdGVyIGlzIHBpY2tlZCB1cCBvblxuLy8gdGhlIG5leHQgd3JpdGUpLiBXaGVuIGEgY2FsbCBmYWlscyB3aGlsZSB0aGUgV2ViU29ja2V0IGlzIGRvd24sIG5vdGVGYWlsdXJlIHN0YXJ0cyBhIGJhY2tncm91bmRcbi8vIHJlY29ubmVjdCBsb29wIHdpdGggYSByYW1waW5nIGRlbGF5IC0gaXQgbmV2ZXIgYmxvY2tzIGNhbGxlcnMsIGl0IGp1c3Qga2VlcHMgdHJ5aW5nIHNvIHRoZVxuLy8gY29ubmVjdGlvbiBldmVudHVhbGx5IGNvbWVzIGJhY2suIFNvdXJjZXMgd2l0aG91dCBhIFdlYlNvY2tldCAoYmFja2JsYXplLCBVUkwtZm9ybSwgb3VyIG93blxuLy8gbG9jYWwgc2VydmVyKSByZXBvcnQgYWx3YXlzLWNvbm5lY3RlZDogdGhleSdyZSBsYXN0LXJlc29ydCBzb3VyY2VzIHdoZXJlIHRocm93aW5nIGlzIGZpbmUuXG5leHBvcnQgY2xhc3MgU291cmNlV3JhcHBlciB7XG4gICAgcHVibGljIGFwaT86IElBcmNoaXZlcztcbiAgICBwdWJsaWMgdXJsPzogQXJjaGl2ZXNVcmw7XG4gICAgcHVibGljIHdyaXRlQmxvY2tlZD86IHN0cmluZztcbiAgICBwcml2YXRlIHJlbW90ZT86IEFyY2hpdmVzUmVtb3RlO1xuICAgIHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIHJlY29ubmVjdFJ1bm5pbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIGFjY2Vzc0NhY2hlPzogeyBoYXNBY2Nlc3M6IGJvb2xlYW47IHRpbWU6IG51bWJlciB9O1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGNvbmZpZzogSG9zdGVkQ29uZmlnIHwgQmFja2JsYXplQ29uZmlnLFxuICAgICAgICAvLyBmYWxzZSBmb3Igc2hvcnQtbGl2ZWQgcHJvYmUgaW5zdGFuY2VzLCB3aGljaCBtdXN0IG5ldmVyIGxlYXZlIGEgcmV0cnkgbG9vcCBiZWhpbmRcbiAgICAgICAgcHJpdmF0ZSBiYWNrZ3JvdW5kOiBib29sZWFuLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZShjb25maWc6IEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZywgb3B0aW9ucz86IHsgYmFja2dyb3VuZD86IGJvb2xlYW4gfSk6IFByb21pc2U8U291cmNlV3JhcHBlcj4ge1xuICAgICAgICBsZXQgd3JhcHBlciA9IG5ldyBTb3VyY2VXcmFwcGVyKGNvbmZpZywgb3B0aW9ucz8uYmFja2dyb3VuZCAhPT0gZmFsc2UpO1xuICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IFwiYmFja2JsYXplXCIpIHtcbiAgICAgICAgICAgIGlmIChhd2FpdCBoYXNCYWNrYmxhemVDcmVkcygpKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlci5hcGkgPSBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoeyBidWNrZXROYW1lOiBwYXJzZUJhY2tibGF6ZVVybChjb25maWcudXJsKS5idWNrZXROYW1lLCBwdWJsaWM6IGNvbmZpZy5wdWJsaWMsIGltbXV0YWJsZTogY29uZmlnLmltbXV0YWJsZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVyLndyaXRlQmxvY2tlZCA9IGBObyBiYWNrYmxhemUgY3JlZGVudGlhbHMgZm9yICR7Y29uZmlnLnVybH0uIFByb3ZpZGUgYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlJZCBhbmQgYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXkgdmlhIGdldFNlY3JldCB0byBlbmFibGUgQVBJIGFjY2Vzcy5gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVyLndyaXRlQmxvY2tlZCA9IGBCcm93c2VycyBjYW5ub3Qgd3JpdGUgdG8gYmFja2JsYXplIChidWNrZXQgJHtjb25maWcudXJsfSlgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF3cmFwcGVyLmFwaSAmJiBjb25maWcucHVibGljICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHdyYXBwZXIudXJsID0gbmV3IEFyY2hpdmVzVXJsKGdldEJ1Y2tldEJhc2VVcmwoY29uZmlnLnVybCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlSG9zdGVkVXJsKGNvbmZpZy51cmwpO1xuICAgICAgICBsZXQgc2VydmVyID0gaXNOb2RlKCkgJiYgZ2V0U3RvcmFnZVNlcnZlckNvbmZpZ09wdGlvbmFsKCkgfHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoc2VydmVyICYmIHBhcnNlZC5hZGRyZXNzID09PSBzZXJ2ZXIuZG9tYWluICYmIHBhcnNlZC5wb3J0ID09PSBzZXJ2ZXIucG9ydCkge1xuICAgICAgICAgICAgLy8gQSBidWNrZXQgaG9zdGVkIGJ5IG91ciBvd24gcHJvY2VzcyAtIHVzZSBpdCBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgb3Vyc2VsdmVzXG4gICAgICAgICAgICB3cmFwcGVyLmFwaSA9IGdldExvY2FsQXJjaGl2ZXMocGFyc2VkLmFjY291bnQsIHBhcnNlZC5idWNrZXROYW1lKTtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgICAgICB9XG4gICAgICAgIHdyYXBwZXIucmVtb3RlID0gbmV3IEFyY2hpdmVzUmVtb3RlKHsgdXJsOiBjb25maWcudXJsLCBhY2NvdW50TmFtZTogY29uZmlnLmFjY291bnROYW1lLCB3YWl0Rm9yQWNjZXNzOiBmYWxzZSB9KTtcbiAgICAgICAgd3JhcHBlci5hcGkgPSB3cmFwcGVyLnJlbW90ZTtcbiAgICAgICAgaWYgKGNvbmZpZy5wdWJsaWMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB3cmFwcGVyLnVybCA9IG5ldyBBcmNoaXZlc1VybChnZXRCdWNrZXRCYXNlVXJsKGNvbmZpZy51cmwpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIC8vIFRoZSBzYW1lIFVSTCBjYW4gYXBwZWFyIGFzIG11bHRpcGxlIHNvdXJjZXMgKGRpZmZlcmVudCByb3V0ZXMgLyB2YWxpZCB3aW5kb3dzKSwgc28gdGhlXG4gICAgICAgIC8vIGRpc3Rpbmd1aXNoaW5nIHNsaWNlIGlzIHBhcnQgb2YgdGhlIG5hbWVcbiAgICAgICAgbGV0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgcm91dGUgPSB0aGlzLmNvbmZpZy5yb3V0ZTtcbiAgICAgICAgaWYgKHJvdXRlKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGByb3V0ZSBbJHtyb3V0ZVswXX0sICR7cm91dGVbMV19KWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSB0aGlzLmNvbmZpZy52YWxpZFdpbmRvdztcbiAgICAgICAgaWYgKHN0YXJ0ICE9PSAwIHx8IGVuZCAhPT0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFRleHQgPSBzdGFydCA9PT0gMCAmJiBcIjBcIiB8fCBuZXcgRGF0ZShzdGFydCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgIGxldCBlbmRUZXh0ID0gZW5kID09PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiAmJiBcImZvcmV2ZXJcIiB8fCBuZXcgRGF0ZShlbmQpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGB2YWxpZFdpbmRvdyBbJHtzdGFydFRleHR9LCAke2VuZFRleHR9XWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgc291cmNlLyR7dGhpcy5jb25maWcudXJsfSR7cGFydHMubGVuZ3RoICYmIGAgKCR7cGFydHMuam9pbihcIiwgXCIpfSlgIHx8IFwiXCJ9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5yZW1vdGUpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdGUuaXNDb25uZWN0ZWQoKTtcbiAgICB9XG5cbiAgICAvKiogQ2FsbCBhZnRlciBhIHJlcXVlc3QgZmFpbGVkIHdoaWxlIGlzQ29ubmVjdGVkKCkgd2FzIGZhbHNlOiBzdGFydHMgKGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcpXG4gICAgICogIHRoZSBiYWNrZ3JvdW5kIHJlY29ubmVjdCBsb29wLiBOZXZlciBibG9ja3MgLSB0aGUgZmFpbGVkIHJlcXVlc3Qgc3RpbGwgdGhyb3dzLiAqL1xuICAgIHB1YmxpYyBub3RlRmFpbHVyZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmJhY2tncm91bmQgfHwgdGhpcy5kaXNwb3NlZCB8fCB0aGlzLnJlY29ubmVjdFJ1bm5pbmcpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgY29ubmVjdCB0byBzdG9yYWdlICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RSdW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgdm9pZCB0aGlzLnJlY29ubmVjdExvb3AoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlY29ubmVjdExvb3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCByZXRyeURlbGF5ID0gUkVUUllfU1RBUlRfREVMQVk7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBhd2FpdCBkZWxheShyZXRyeURlbGF5KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkgYnJlYWs7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIEFueSBjYWxsIHJlLWVzdGFibGlzaGVzIHRoZSBXZWJTb2NrZXQ7IHRoZSByZXN1bHQgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW90ZT8uZ2V0SW5mbyhST1VUSU5HX0ZJTEUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIEV2ZW4gYSBmYWlsaW5nIGNhbGwgKGUuZy4gYWNjZXNzIGRlbmllZCkgcHJvdmVzIHRoZSBjb25uZWN0aW9uIGlzIGJhY2tcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSBicmVhaztcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYENhbm5vdCBjb25uZWN0IHRvIHN0b3JhZ2UgJHt0aGlzLmdldERlYnVnTmFtZSgpfSwgcmV0cnlpbmcgaW4gJHtNYXRoLnJvdW5kKHJldHJ5RGVsYXkgLyAxMDAwKX1zLiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0cnlEZWxheSA9IE1hdGgubWluKFJFVFJZX01BWF9ERUxBWSwgcmV0cnlEZWxheSAqIFJFVFJZX0dST1dUSCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWNvbm5lY3RSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZWNvbm5lY3RlZCB0byBzdG9yYWdlICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgaG9zdGVkIHNvdXJjZXM6IGNhY2hlZCBhY2Nlc3MgY2hlY2ssIHNvIHJlYWRzIGtub3cgd2hldGhlciB0byB1c2UgdGhlIEFQSSBvciB0aGUgcHVibGljXG4gICAgLy8gVVJMIGZvcm0uIEFjY2Vzcywgb25jZSBzZWVuLCBpcyBhc3N1bWVkIHRvIHN0aWNrOyBuby1hY2Nlc3MgaXMgcmUtY2hlY2tlZCBwZXJpb2RpY2FsbHkgKHRoZVxuICAgIC8vIGNoZWNrIGFsc28gcmVnaXN0ZXJzIG91ciBhY2Nlc3MgcmVxdWVzdCBzZXJ2ZXItc2lkZSwgd2hpY2ggbG9ncyB0aGUgZ3JhbnQgbGluaykuXG4gICAgcHJpdmF0ZSBhc3luYyBjaGVja0FjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IHJlbW90ZSA9IHRoaXMucmVtb3RlO1xuICAgICAgICBpZiAoIXJlbW90ZSkgcmV0dXJuICEhdGhpcy5hcGk7XG4gICAgICAgIGxldCBjYWNoZWQgPSB0aGlzLmFjY2Vzc0NhY2hlO1xuICAgICAgICBpZiAoY2FjaGVkICYmIChjYWNoZWQuaGFzQWNjZXNzIHx8IERhdGUubm93KCkgLSBjYWNoZWQudGltZSA8IEFDQ0VTU19SRUNIRUNLX0lOVEVSVkFMKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZC5oYXNBY2Nlc3M7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHdhaXRpbmcgPSBhd2FpdCByZW1vdGUud2FpdGluZ0ZvckFjY2VzcygpO1xuICAgICAgICB0aGlzLmFjY2Vzc0NhY2hlID0geyBoYXNBY2Nlc3M6ICF3YWl0aW5nLCB0aW1lOiBEYXRlLm5vdygpIH07XG4gICAgICAgIGlmICh3YWl0aW5nKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYE5vIGFjY2VzcyB0byBzdG9yYWdlIGFjY291bnQgZm9yICR7dGhpcy5jb25maWcudXJsfSAob3VyIG1hY2hpbmUgJHt3YWl0aW5nLm1hY2hpbmVJZH0sIGlwICR7d2FpdGluZy5pcH0pLiBSZWFkaW5nIHZpYSB0aGUgcHVibGljIFVSTCBmb3JtIHdoZXJlIHBvc3NpYmxlLiBHcmFudCBhY2Nlc3MgYXQgJHt3YWl0aW5nLmxpbmt9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF3YWl0aW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWFkPFQ+KHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMuYXBpICYmIGF3YWl0IHRoaXMuY2hlY2tBY2Nlc3MoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bih0aGlzLmFwaSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnVuKHRoaXMudXJsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hcGkpIHtcbiAgICAgICAgICAgIC8vIE5vIHB1YmxpYyBVUkwgZm9ybSAtIGxldCB0aGUgQVBJIGNhbGwgdGhyb3cgaXRzIG93biBlcnJvciAod2hpY2ggaW5jbHVkZXMgdGhlIGFjY2Vzc1xuICAgICAgICAgICAgLy8gaW5zdHJ1Y3Rpb25zIGZvciBob3N0ZWQgc291cmNlcylcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBydW4odGhpcy5hcGkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlICR7dGhpcy5jb25maWcudXJsfSBoYXMgbm8gQVBJIGFjY2VzcyBhbmQgbm8gcHVibGljIFVSTCBmb3JtIChwdWJsaWM6IGZhbHNlKWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBoYXNXcml0ZUFjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHRoaXMud3JpdGVCbG9ja2VkIHx8ICF0aGlzLmFwaSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGkuaGFzV3JpdGVBY2Nlc3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBpbmdzOiBudW1iZXJbXSA9IFtdO1xuICAgIHByaXZhdGUgcGluZ1RpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBsb2dnZWRDb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGxhc3RUYWtlb3ZlclN0YW1wOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLyoqIEZpcmVkIHdoZW4gdGhlIHNvdXJjZSdzIGFkdmVydGlzZWQgdGFrZW92ZXIgc3RhbXAgY2hhbmdlcyAoYSBkZXBsb3kgdGFrZW92ZXIgc3RhcnRlZCBvclxuICAgICAqICBlbmRlZCkgLSB0aGUgY2hhaW4gcmVmcmVzaGVzIGl0cyBjb25maWcsIHNvIGNvbm5lY3RlZCBjbGllbnRzIGxlYXJuIHdpdGhpbiBvbmUgcGluZy4gKi9cbiAgICBwdWJsaWMgb25TZXJ2ZWRDb25maWdDaGFuZ2VkOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG5cbiAgICAvKiogU3RhcnRzIG1lYXN1cmluZyB0aGlzIHNvdXJjZSdzIGxhdGVuY3kgKGZvciB2YXJpYWJsZS1zaGFyZCB0YXJnZXQgcHJlZmVyZW5jZSkuIE9ubHkgaG9zdGVkXG4gICAgICogIHJlbW90ZXMgYXJlIHBpbmdlZDsgb3VyIG93biBsb2NhbCBzZXJ2ZXIgY291bnRzIGFzIDAsIGV2ZXJ5dGhpbmcgZWxzZSBhcyBJbmZpbml0eS4gKi9cbiAgICBwdWJsaWMgc3RhcnRQaW5naW5nKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZW1vdGUgPSB0aGlzLnJlbW90ZTtcbiAgICAgICAgaWYgKCFyZW1vdGUgfHwgdGhpcy5waW5nVGltZXIgfHwgdGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbWVhc3VyZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgcmVzdWx0OiB7IHRha2VvdmVyPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlbW90ZS5waW5nKCk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBBIGZhaWxlZCBwaW5nIGlzIGFsc28gb3VyIGVhcmxpZXN0IGRvd24tZGV0ZWN0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5sb2dnZWRDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlZENvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENvbm5lY3RlZCB0byBzdG9yYWdlICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zKWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5waW5ncy5wdXNoKERhdGUubm93KCkgLSBzdGFydCk7XG4gICAgICAgICAgICBpZiAodGhpcy5waW5ncy5sZW5ndGggPiBQSU5HX0hJU1RPUlkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBpbmdzLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3RhbXAgPSByZXN1bHQ/LnRha2VvdmVyO1xuICAgICAgICAgICAgaWYgKHN0YW1wICE9PSB0aGlzLmxhc3RUYWtlb3ZlclN0YW1wKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0VGFrZW92ZXJTdGFtcCA9IHN0YW1wO1xuICAgICAgICAgICAgICAgIHRoaXMub25TZXJ2ZWRDb25maWdDaGFuZ2VkPy4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdm9pZCBtZWFzdXJlKCk7XG4gICAgICAgIHRoaXMucGluZ1RpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgdm9pZCBtZWFzdXJlKCk7XG4gICAgICAgIH0sIFBJTkdfSU5URVJWQUwpO1xuICAgICAgICAodGhpcy5waW5nVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgIH1cblxuICAgIC8qKiBTZWVkcyB0aGUgbGF0ZW5jeSBlc3RpbWF0ZSBiZWZvcmUgdGhlIGZpcnN0IHBpbmcgbGFuZHMgKGUuZy4gZnJvbSB0aGUgaW5pdGlhbCByb3V0aW5nXG4gICAgICogIGZldGNoKSwgc28gdmFyaWFibGUtc2hhcmQgcGlja2luZyBoYXMgc29tZXRoaW5nIGltbWVkaWF0ZWx5LiBSZWFsIHBpbmdzIHRha2Ugb3ZlciBmcm9tIHRoZVxuICAgICAqICBmaXJzdCBtZWFzdXJlbWVudCBvbi4gKi9cbiAgICBwdWJsaWMgc2VlZExhdGVuY3kobXM6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5waW5ncy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5waW5ncy5wdXNoKG1zKTtcbiAgICB9XG5cbiAgICAvKiogTWVkaWFuIG9mIHRoZSByZWNlbnQgcGluZ3MuIFNvdXJjZXMgdGhhdCBjYW4ndCBiZSBwaW5nZWQgc29ydCBsYXN0IChJbmZpbml0eSksIGV4Y2VwdCBvdXJcbiAgICAgKiAgb3duIGluLXByb2Nlc3Mgc2VydmVyLCB3aGljaCBpcyB0aGUgYmVzdCBwb3NzaWJsZSB0YXJnZXQgKDApLiAqL1xuICAgIHB1YmxpYyBnZXRMYXRlbmN5KCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5yZW1vdGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy50eXBlID09PSBcInJlbW90ZVwiICYmIHRoaXMuYXBpKSByZXR1cm4gMDtcbiAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucGluZ3MubGVuZ3RoKSByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgIGxldCBzb3J0ZWQgPSBbLi4udGhpcy5waW5nc107XG4gICAgICAgIHNvcnQoc29ydGVkLCB4ID0+IHgpO1xuICAgICAgICByZXR1cm4gc29ydGVkW01hdGguZmxvb3Ioc29ydGVkLmxlbmd0aCAvIDIpXTtcbiAgICB9XG5cbiAgICAvKiogV3JpdGVzIGFsd2F5cyBnbyB0aHJvdWdoIHRoZSBBUEksIHNvIGEgcGVybWlzc2lvbiBlcnJvciB0aHJvd3MgdG8gdGhlIGNhbGxlciBvbiBldmVyeSB3cml0ZVxuICAgICAqICAoYW5kIGFjY2VzcyBncmFudGVkIGluIHRoZSBtZWFudGltZSBpcyBwaWNrZWQgdXAgYXV0b21hdGljYWxseSkuICovXG4gICAgcHVibGljIGFzeW5jIHdyaXRlPFQ+KHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMud3JpdGVCbG9ja2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy53cml0ZUJsb2NrZWQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhcGkgPSB0aGlzLmFwaTtcbiAgICAgICAgaWYgKCFhcGkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlICR7dGhpcy5jb25maWcudXJsfSBoYXMgbm8gQVBJIGFjY2Vzcywgc28gaXQgY2Fubm90IGFjY2VwdCB3cml0ZXNgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgcnVuKGFwaSk7XG4gICAgICAgIHRoaXMuYWNjZXNzQ2FjaGUgPSB7IGhhc0FjY2VzczogdHJ1ZSwgdGltZTogRGF0ZS5ub3coKSB9O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMucGluZ1RpbWVyKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMucGluZ1RpbWVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
259
- /* _JS_SOURCE_HASH = "2343e97ab137f9ba46543778415768370623ae76d596d16a91b19d24a503e235"; */
258
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlV3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNvdXJjZVdyYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFFMUIsbURBQXdEO0FBQ3hELDJEQUFxRDtBQUNyRCxvREFBaUQ7QUFFakQsaURBQW1HO0FBQ25HLHFEQUFrRDtBQUNsRCwrQ0FBNEM7QUFDNUMsNENBQWlEO0FBQ2pELDZEQUF3RjtBQUUzRSxRQUFBLGlCQUFpQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDN0IsUUFBQSxlQUFlLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDaEMsUUFBQSxZQUFZLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLGFBQWEsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUV4QixLQUFLLFVBQVUsaUJBQWlCO0lBQzVCLElBQUksQ0FBQyxJQUFBLGFBQU0sR0FBRTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzVCLElBQUksQ0FBQztRQUNELE1BQU0sSUFBQSxxQkFBUyxFQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDbkQsTUFBTSxJQUFBLHFCQUFTLEVBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQUMsV0FBTSxDQUFDO1FBQ0wsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztBQUNMLENBQUM7QUFFRCxtR0FBbUc7QUFDbkcsbUdBQW1HO0FBQ25HLGtHQUFrRztBQUNsRyw2RkFBNkY7QUFDN0YsOEZBQThGO0FBQzlGLDZGQUE2RjtBQUM3RixNQUFhLGFBQWE7SUFTdEIsWUFDVyxNQUFzQztJQUM3QyxvRkFBb0Y7SUFDNUUsVUFBbUI7UUFGcEIsV0FB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LEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ3pELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxPQUFPO1FBQ1YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0wsQ0FBQztDQUNKO0FBak9ELHNDQWlPQyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5hbGxvd2NsaWVudCA9IHRydWU7XG5cbmltcG9ydCB7IGlzTm9kZSwgc29ydCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IGdldFNlY3JldCB9IGZyb20gXCIuLi8uLi9taXNjL2dldFNlY3JldFwiO1xuaW1wb3J0IHsgSUFyY2hpdmVzLCBIb3N0ZWRDb25maWcsIEJhY2tibGF6ZUNvbmZpZyB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0QnVja2V0QmFzZVVybCwgcGFyc2VIb3N0ZWRVcmwsIHBhcnNlQmFja2JsYXplVXJsIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1JlbW90ZSB9IGZyb20gXCIuL0FyY2hpdmVzUmVtb3RlXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1VybCB9IGZyb20gXCIuL0FyY2hpdmVzVXJsXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0JhY2tibGF6ZSB9IGZyb20gXCIuLi9iYWNrYmxhemVcIjtcbmltcG9ydCB7IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWdPcHRpb25hbCwgZ2V0TG9jYWxBcmNoaXZlcyB9IGZyb20gXCIuL3N0b3JhZ2VTZXJ2ZXJTdGF0ZVwiO1xuXG5leHBvcnQgY29uc3QgUkVUUllfU1RBUlRfREVMQVkgPSAyICogMTAwMDtcbmV4cG9ydCBjb25zdCBSRVRSWV9NQVhfREVMQVkgPSA1ICogNjAgKiAxMDAwO1xuZXhwb3J0IGNvbnN0IFJFVFJZX0dST1dUSCA9IDEuNTtcbmNvbnN0IEFDQ0VTU19SRUNIRUNLX0lOVEVSVkFMID0gNjAgKiAxMDAwO1xuY29uc3QgUElOR19JTlRFUlZBTCA9IDYwICogMTAwMDtcbmNvbnN0IFBJTkdfSElTVE9SWSA9IDEwO1xuXG5hc3luYyBmdW5jdGlvbiBoYXNCYWNrYmxhemVDcmVkcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWlzTm9kZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZ2V0U2VjcmV0KFwiYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlJZFwiKTtcbiAgICAgICAgYXdhaXQgZ2V0U2VjcmV0KFwiYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlcIik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBPbmUgc291cmNlIG9mIGEgUmVtb3RlQ29uZmlnLCBhcyBhIHVzYWJsZSBJQXJjaGl2ZXMuIFJlYWRzIGZhbGwgYmFjayB0byB0aGUgcHVibGljLVVSTCBmb3JtIHdoZW5cbi8vIHdlIGRvbid0IGhhdmUgQVBJIGFjY2Vzczsgd3JpdGVzIGFsd2F5cyBhdHRlbXB0IHRoZSBBUEkgKHNvIGFjY2VzcyBncmFudGVkIGxhdGVyIGlzIHBpY2tlZCB1cCBvblxuLy8gdGhlIG5leHQgd3JpdGUpLiBXaGVuIGEgY2FsbCBmYWlscyB3aGlsZSB0aGUgV2ViU29ja2V0IGlzIGRvd24sIG5vdGVGYWlsdXJlIHN0YXJ0cyBhIGJhY2tncm91bmRcbi8vIHJlY29ubmVjdCBsb29wIHdpdGggYSByYW1waW5nIGRlbGF5IC0gaXQgbmV2ZXIgYmxvY2tzIGNhbGxlcnMsIGl0IGp1c3Qga2VlcHMgdHJ5aW5nIHNvIHRoZVxuLy8gY29ubmVjdGlvbiBldmVudHVhbGx5IGNvbWVzIGJhY2suIFNvdXJjZXMgd2l0aG91dCBhIFdlYlNvY2tldCAoYmFja2JsYXplLCBVUkwtZm9ybSwgb3VyIG93blxuLy8gbG9jYWwgc2VydmVyKSByZXBvcnQgYWx3YXlzLWNvbm5lY3RlZDogdGhleSdyZSBsYXN0LXJlc29ydCBzb3VyY2VzIHdoZXJlIHRocm93aW5nIGlzIGZpbmUuXG5leHBvcnQgY2xhc3MgU291cmNlV3JhcHBlciB7XG4gICAgcHVibGljIGFwaT86IElBcmNoaXZlcztcbiAgICBwdWJsaWMgdXJsPzogQXJjaGl2ZXNVcmw7XG4gICAgcHVibGljIHdyaXRlQmxvY2tlZD86IHN0cmluZztcbiAgICBwcml2YXRlIHJlbW90ZT86IEFyY2hpdmVzUmVtb3RlO1xuICAgIHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIHJlY29ubmVjdFJ1bm5pbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIGFjY2Vzc0NhY2hlPzogeyBoYXNBY2Nlc3M6IGJvb2xlYW47IHRpbWU6IG51bWJlciB9O1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGNvbmZpZzogSG9zdGVkQ29uZmlnIHwgQmFja2JsYXplQ29uZmlnLFxuICAgICAgICAvLyBmYWxzZSBmb3Igc2hvcnQtbGl2ZWQgcHJvYmUgaW5zdGFuY2VzLCB3aGljaCBtdXN0IG5ldmVyIGxlYXZlIGEgcmV0cnkgbG9vcCBiZWhpbmRcbiAgICAgICAgcHJpdmF0ZSBiYWNrZ3JvdW5kOiBib29sZWFuLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZShjb25maWc6IEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZywgb3B0aW9ucz86IHsgYmFja2dyb3VuZD86IGJvb2xlYW4gfSk6IFByb21pc2U8U291cmNlV3JhcHBlcj4ge1xuICAgICAgICBsZXQgd3JhcHBlciA9IG5ldyBTb3VyY2VXcmFwcGVyKGNvbmZpZywgb3B0aW9ucz8uYmFja2dyb3VuZCAhPT0gZmFsc2UpO1xuICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IFwiYmFja2JsYXplXCIpIHtcbiAgICAgICAgICAgIGlmIChhd2FpdCBoYXNCYWNrYmxhemVDcmVkcygpKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlci5hcGkgPSBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoeyBidWNrZXROYW1lOiBwYXJzZUJhY2tibGF6ZVVybChjb25maWcudXJsKS5idWNrZXROYW1lLCBwdWJsaWM6IGNvbmZpZy5wdWJsaWMsIGltbXV0YWJsZTogY29uZmlnLmltbXV0YWJsZSwgYWxsb3dlZE9yaWdpbnM6IGNvbmZpZy5hbGxvd2VkT3JpZ2lucyB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVyLndyaXRlQmxvY2tlZCA9IGBObyBiYWNrYmxhemUgY3JlZGVudGlhbHMgZm9yICR7Y29uZmlnLnVybH0uIFByb3ZpZGUgYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlJZCBhbmQgYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXkgdmlhIGdldFNlY3JldCB0byBlbmFibGUgQVBJIGFjY2Vzcy5gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVyLndyaXRlQmxvY2tlZCA9IGBCcm93c2VycyBjYW5ub3Qgd3JpdGUgdG8gYmFja2JsYXplIChidWNrZXQgJHtjb25maWcudXJsfSlgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF3cmFwcGVyLmFwaSAmJiBjb25maWcucHVibGljICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHdyYXBwZXIudXJsID0gbmV3IEFyY2hpdmVzVXJsKGdldEJ1Y2tldEJhc2VVcmwoY29uZmlnLnVybCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlSG9zdGVkVXJsKGNvbmZpZy51cmwpO1xuICAgICAgICBsZXQgc2VydmVyID0gaXNOb2RlKCkgJiYgZ2V0U3RvcmFnZVNlcnZlckNvbmZpZ09wdGlvbmFsKCkgfHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoc2VydmVyICYmIHBhcnNlZC5hZGRyZXNzID09PSBzZXJ2ZXIuZG9tYWluICYmIHBhcnNlZC5wb3J0ID09PSBzZXJ2ZXIucG9ydCkge1xuICAgICAgICAgICAgLy8gQSBidWNrZXQgaG9zdGVkIGJ5IG91ciBvd24gcHJvY2VzcyAtIHVzZSBpdCBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgb3Vyc2VsdmVzXG4gICAgICAgICAgICB3cmFwcGVyLmFwaSA9IGdldExvY2FsQXJjaGl2ZXMocGFyc2VkLmFjY291bnQsIHBhcnNlZC5idWNrZXROYW1lKTtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgICAgICB9XG4gICAgICAgIHdyYXBwZXIucmVtb3RlID0gbmV3IEFyY2hpdmVzUmVtb3RlKHsgdXJsOiBjb25maWcudXJsLCBhY2NvdW50TmFtZTogY29uZmlnLmFjY291bnROYW1lLCB3YWl0Rm9yQWNjZXNzOiBmYWxzZSB9KTtcbiAgICAgICAgd3JhcHBlci5hcGkgPSB3cmFwcGVyLnJlbW90ZTtcbiAgICAgICAgaWYgKGNvbmZpZy5wdWJsaWMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB3cmFwcGVyLnVybCA9IG5ldyBBcmNoaXZlc1VybChnZXRCdWNrZXRCYXNlVXJsKGNvbmZpZy51cmwpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIC8vIFRoZSBzYW1lIFVSTCBjYW4gYXBwZWFyIGFzIG11bHRpcGxlIHNvdXJjZXMgKGRpZmZlcmVudCByb3V0ZXMgLyB2YWxpZCB3aW5kb3dzKSwgc28gdGhlXG4gICAgICAgIC8vIGRpc3Rpbmd1aXNoaW5nIHNsaWNlIGlzIHBhcnQgb2YgdGhlIG5hbWVcbiAgICAgICAgbGV0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgcm91dGUgPSB0aGlzLmNvbmZpZy5yb3V0ZTtcbiAgICAgICAgaWYgKHJvdXRlKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGByb3V0ZSBbJHtyb3V0ZVswXX0sICR7cm91dGVbMV19KWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSB0aGlzLmNvbmZpZy52YWxpZFdpbmRvdztcbiAgICAgICAgaWYgKHN0YXJ0ICE9PSAwIHx8IGVuZCAhPT0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFRleHQgPSBzdGFydCA9PT0gMCAmJiBcIjBcIiB8fCBuZXcgRGF0ZShzdGFydCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgIGxldCBlbmRUZXh0ID0gZW5kID09PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiAmJiBcImZvcmV2ZXJcIiB8fCBuZXcgRGF0ZShlbmQpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGB2YWxpZFdpbmRvdyBbJHtzdGFydFRleHR9LCAke2VuZFRleHR9XWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgc291cmNlICR7dGhpcy5jb25maWcudXJsfSR7cGFydHMubGVuZ3RoICYmIGAgKCR7cGFydHMuam9pbihcIiwgXCIpfSlgIHx8IFwiXCJ9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5yZW1vdGUpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdGUuaXNDb25uZWN0ZWQoKTtcbiAgICB9XG5cbiAgICAvKiogQ2FsbCBhZnRlciBhIHJlcXVlc3QgZmFpbGVkIHdoaWxlIGlzQ29ubmVjdGVkKCkgd2FzIGZhbHNlOiBzdGFydHMgKGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcpXG4gICAgICogIHRoZSBiYWNrZ3JvdW5kIHJlY29ubmVjdCBsb29wLiBOZXZlciBibG9ja3MgLSB0aGUgZmFpbGVkIHJlcXVlc3Qgc3RpbGwgdGhyb3dzLiAqL1xuICAgIHB1YmxpYyBub3RlRmFpbHVyZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmJhY2tncm91bmQgfHwgdGhpcy5kaXNwb3NlZCB8fCB0aGlzLnJlY29ubmVjdFJ1bm5pbmcpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgY29ubmVjdCB0byBzdG9yYWdlICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RSdW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgdm9pZCB0aGlzLnJlY29ubmVjdExvb3AoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlY29ubmVjdExvb3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCByZXRyeURlbGF5ID0gUkVUUllfU1RBUlRfREVMQVk7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBhd2FpdCBkZWxheShyZXRyeURlbGF5KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkgYnJlYWs7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIEFueSBjYWxsIHJlLWVzdGFibGlzaGVzIHRoZSBXZWJTb2NrZXQ7IHRoZSByZXN1bHQgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW90ZT8uZ2V0SW5mbyhST1VUSU5HX0ZJTEUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIEV2ZW4gYSBmYWlsaW5nIGNhbGwgKGUuZy4gYWNjZXNzIGRlbmllZCkgcHJvdmVzIHRoZSBjb25uZWN0aW9uIGlzIGJhY2tcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSBicmVhaztcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYENhbm5vdCBjb25uZWN0IHRvIHN0b3JhZ2UgJHt0aGlzLmdldERlYnVnTmFtZSgpfSwgcmV0cnlpbmcgaW4gJHtNYXRoLnJvdW5kKHJldHJ5RGVsYXkgLyAxMDAwKX1zLiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0cnlEZWxheSA9IE1hdGgubWluKFJFVFJZX01BWF9ERUxBWSwgcmV0cnlEZWxheSAqIFJFVFJZX0dST1dUSCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWNvbm5lY3RSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZWNvbm5lY3RlZCB0byBzdG9yYWdlICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgaG9zdGVkIHNvdXJjZXM6IGNhY2hlZCBhY2Nlc3MgY2hlY2ssIHNvIHJlYWRzIGtub3cgd2hldGhlciB0byB1c2UgdGhlIEFQSSBvciB0aGUgcHVibGljXG4gICAgLy8gVVJMIGZvcm0uIEFjY2Vzcywgb25jZSBzZWVuLCBpcyBhc3N1bWVkIHRvIHN0aWNrOyBuby1hY2Nlc3MgaXMgcmUtY2hlY2tlZCBwZXJpb2RpY2FsbHkgKHRoZVxuICAgIC8vIGNoZWNrIGFsc28gcmVnaXN0ZXJzIG91ciBhY2Nlc3MgcmVxdWVzdCBzZXJ2ZXItc2lkZSwgd2hpY2ggbG9ncyB0aGUgZ3JhbnQgbGluaykuXG4gICAgcHJpdmF0ZSBhc3luYyBjaGVja0FjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IHJlbW90ZSA9IHRoaXMucmVtb3RlO1xuICAgICAgICBpZiAoIXJlbW90ZSkgcmV0dXJuICEhdGhpcy5hcGk7XG4gICAgICAgIGxldCBjYWNoZWQgPSB0aGlzLmFjY2Vzc0NhY2hlO1xuICAgICAgICBpZiAoY2FjaGVkICYmIChjYWNoZWQuaGFzQWNjZXNzIHx8IERhdGUubm93KCkgLSBjYWNoZWQudGltZSA8IEFDQ0VTU19SRUNIRUNLX0lOVEVSVkFMKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZC5oYXNBY2Nlc3M7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHdhaXRpbmcgPSBhd2FpdCByZW1vdGUud2FpdGluZ0ZvckFjY2VzcygpO1xuICAgICAgICB0aGlzLmFjY2Vzc0NhY2hlID0geyBoYXNBY2Nlc3M6ICF3YWl0aW5nLCB0aW1lOiBEYXRlLm5vdygpIH07XG4gICAgICAgIGlmICh3YWl0aW5nKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYE5vIGFjY2VzcyB0byBzdG9yYWdlIGFjY291bnQgZm9yICR7dGhpcy5jb25maWcudXJsfSAob3VyIG1hY2hpbmUgJHt3YWl0aW5nLm1hY2hpbmVJZH0sIGlwICR7d2FpdGluZy5pcH0pLiBSZWFkaW5nIHZpYSB0aGUgcHVibGljIFVSTCBmb3JtIHdoZXJlIHBvc3NpYmxlLiBHcmFudCBhY2Nlc3MgYXQgJHt3YWl0aW5nLmxpbmt9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF3YWl0aW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWFkPFQ+KHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMuYXBpICYmIGF3YWl0IHRoaXMuY2hlY2tBY2Nlc3MoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bih0aGlzLmFwaSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnVuKHRoaXMudXJsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hcGkpIHtcbiAgICAgICAgICAgIC8vIE5vIHB1YmxpYyBVUkwgZm9ybSAtIGxldCB0aGUgQVBJIGNhbGwgdGhyb3cgaXRzIG93biBlcnJvciAod2hpY2ggaW5jbHVkZXMgdGhlIGFjY2Vzc1xuICAgICAgICAgICAgLy8gaW5zdHJ1Y3Rpb25zIGZvciBob3N0ZWQgc291cmNlcylcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBydW4odGhpcy5hcGkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlICR7dGhpcy5jb25maWcudXJsfSBoYXMgbm8gQVBJIGFjY2VzcyBhbmQgbm8gcHVibGljIFVSTCBmb3JtIChwdWJsaWM6IGZhbHNlKWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBoYXNXcml0ZUFjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHRoaXMud3JpdGVCbG9ja2VkIHx8ICF0aGlzLmFwaSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGkuaGFzV3JpdGVBY2Nlc3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBpbmdzOiBudW1iZXJbXSA9IFtdO1xuICAgIHByaXZhdGUgcGluZ1RpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBsb2dnZWRDb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGxhc3RUYWtlb3ZlclN0YW1wOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLyoqIEZpcmVkIHdoZW4gdGhlIHNvdXJjZSdzIGFkdmVydGlzZWQgdGFrZW92ZXIgc3RhbXAgY2hhbmdlcyAoYSBkZXBsb3kgdGFrZW92ZXIgc3RhcnRlZCBvclxuICAgICAqICBlbmRlZCkgLSB0aGUgY2hhaW4gcmVmcmVzaGVzIGl0cyBjb25maWcsIHNvIGNvbm5lY3RlZCBjbGllbnRzIGxlYXJuIHdpdGhpbiBvbmUgcGluZy4gKi9cbiAgICBwdWJsaWMgb25TZXJ2ZWRDb25maWdDaGFuZ2VkOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG5cbiAgICAvKiogU3RhcnRzIG1lYXN1cmluZyB0aGlzIHNvdXJjZSdzIGxhdGVuY3kgKGZvciB2YXJpYWJsZS1zaGFyZCB0YXJnZXQgcHJlZmVyZW5jZSkuIE9ubHkgaG9zdGVkXG4gICAgICogIHJlbW90ZXMgYXJlIHBpbmdlZDsgb3VyIG93biBsb2NhbCBzZXJ2ZXIgY291bnRzIGFzIDAsIGV2ZXJ5dGhpbmcgZWxzZSBhcyBJbmZpbml0eS4gKi9cbiAgICBwdWJsaWMgc3RhcnRQaW5naW5nKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZW1vdGUgPSB0aGlzLnJlbW90ZTtcbiAgICAgICAgaWYgKCFyZW1vdGUgfHwgdGhpcy5waW5nVGltZXIgfHwgdGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbWVhc3VyZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgcmVzdWx0OiB7IHRha2VvdmVyPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlbW90ZS5waW5nKCk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBBIGZhaWxlZCBwaW5nIGlzIGFsc28gb3VyIGVhcmxpZXN0IGRvd24tZGV0ZWN0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5sb2dnZWRDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlZENvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENvbm5lY3RlZCB0byBzdG9yYWdlICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zKWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5waW5ncy5wdXNoKERhdGUubm93KCkgLSBzdGFydCk7XG4gICAgICAgICAgICBpZiAodGhpcy5waW5ncy5sZW5ndGggPiBQSU5HX0hJU1RPUlkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBpbmdzLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3RhbXAgPSByZXN1bHQ/LnRha2VvdmVyO1xuICAgICAgICAgICAgaWYgKHN0YW1wICE9PSB0aGlzLmxhc3RUYWtlb3ZlclN0YW1wKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0VGFrZW92ZXJTdGFtcCA9IHN0YW1wO1xuICAgICAgICAgICAgICAgIHRoaXMub25TZXJ2ZWRDb25maWdDaGFuZ2VkPy4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdm9pZCBtZWFzdXJlKCk7XG4gICAgICAgIHRoaXMucGluZ1RpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgdm9pZCBtZWFzdXJlKCk7XG4gICAgICAgIH0sIFBJTkdfSU5URVJWQUwpO1xuICAgICAgICAodGhpcy5waW5nVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgIH1cblxuICAgIC8qKiBTZWVkcyB0aGUgbGF0ZW5jeSBlc3RpbWF0ZSBiZWZvcmUgdGhlIGZpcnN0IHBpbmcgbGFuZHMgKGUuZy4gZnJvbSB0aGUgaW5pdGlhbCByb3V0aW5nXG4gICAgICogIGZldGNoKSwgc28gdmFyaWFibGUtc2hhcmQgcGlja2luZyBoYXMgc29tZXRoaW5nIGltbWVkaWF0ZWx5LiBSZWFsIHBpbmdzIHRha2Ugb3ZlciBmcm9tIHRoZVxuICAgICAqICBmaXJzdCBtZWFzdXJlbWVudCBvbi4gKi9cbiAgICBwdWJsaWMgc2VlZExhdGVuY3kobXM6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5waW5ncy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5waW5ncy5wdXNoKG1zKTtcbiAgICB9XG5cbiAgICAvKiogTWVkaWFuIG9mIHRoZSByZWNlbnQgcGluZ3MuIFNvdXJjZXMgdGhhdCBjYW4ndCBiZSBwaW5nZWQgc29ydCBsYXN0IChJbmZpbml0eSksIGV4Y2VwdCBvdXJcbiAgICAgKiAgb3duIGluLXByb2Nlc3Mgc2VydmVyLCB3aGljaCBpcyB0aGUgYmVzdCBwb3NzaWJsZSB0YXJnZXQgKDApLiAqL1xuICAgIHB1YmxpYyBnZXRMYXRlbmN5KCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5yZW1vdGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy50eXBlID09PSBcInJlbW90ZVwiICYmIHRoaXMuYXBpKSByZXR1cm4gMDtcbiAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucGluZ3MubGVuZ3RoKSByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgIGxldCBzb3J0ZWQgPSBbLi4udGhpcy5waW5nc107XG4gICAgICAgIHNvcnQoc29ydGVkLCB4ID0+IHgpO1xuICAgICAgICByZXR1cm4gc29ydGVkW01hdGguZmxvb3Ioc29ydGVkLmxlbmd0aCAvIDIpXTtcbiAgICB9XG5cbiAgICAvKiogV3JpdGVzIGFsd2F5cyBnbyB0aHJvdWdoIHRoZSBBUEksIHNvIGEgcGVybWlzc2lvbiBlcnJvciB0aHJvd3MgdG8gdGhlIGNhbGxlciBvbiBldmVyeSB3cml0ZVxuICAgICAqICAoYW5kIGFjY2VzcyBncmFudGVkIGluIHRoZSBtZWFudGltZSBpcyBwaWNrZWQgdXAgYXV0b21hdGljYWxseSkuICovXG4gICAgcHVibGljIGFzeW5jIHdyaXRlPFQ+KHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMud3JpdGVCbG9ja2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy53cml0ZUJsb2NrZWQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhcGkgPSB0aGlzLmFwaTtcbiAgICAgICAgaWYgKCFhcGkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlICR7dGhpcy5jb25maWcudXJsfSBoYXMgbm8gQVBJIGFjY2Vzcywgc28gaXQgY2Fubm90IGFjY2VwdCB3cml0ZXNgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgcnVuKGFwaSk7XG4gICAgICAgIHRoaXMuYWNjZXNzQ2FjaGUgPSB7IGhhc0FjY2VzczogdHJ1ZSwgdGltZTogRGF0ZS5ub3coKSB9O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMucGluZ1RpbWVyKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMucGluZ1RpbWVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
259
+ /* _JS_SOURCE_HASH = "bd2c91d7e435eb29bcc5a316176bd393bf156f61f9dde03356d32cd6fb7cba49"; */