sliftutils 1.7.22 → 1.7.23

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.getTakeoverStamp = exports.applyDeployRemap = exports.onTakeoverEvent = exports.registerAltPort = exports.initDeployTakeover = void 0;
6
+ //exports.getMainPortAcquireDelay = exports.getFlushDeadline = 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");
@@ -187,17 +187,49 @@ function scheduleEvents() {
187
187
  (_b = (_a = timer).unref) === null || _b === void 0 ? void 0 : _b.call(_a);
188
188
  eventTimers.push(timer);
189
189
  };
190
- let remap = current.remap;
190
+ const remap = current.remap;
191
191
  if (remap) {
192
192
  let altPort = remap.altPort;
193
193
  schedule(remap.boundaryA - SWITCH_SCAN_LEAD, () => emit("diskScan"));
194
- schedule(remap.boundaryA, () => console.log(`Deploy switchover write handoff boundary passed: fresh writes now belong to the alternate-port side (port ${altPort})`));
194
+ 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
195
  schedule(remap.boundaryA + SWITCH_SCAN_LEAD, () => emit("diskScan"));
196
- schedule(remap.boundaryB, () => console.log(`Deploy switchover second boundary passed: fresh writes return to the main port`));
196
+ schedule(remap.boundaryB, () => console.log(`${logPrefix()} Deploy switchover second boundary ${iso(remap.boundaryB)} passed: fresh writes return to the main port`));
197
197
  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
198
  }
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
+ }
217
+ // Multiple processes (predecessor + successor) often share one journal during a switchover, so
218
+ // every lifecycle line identifies its process
219
+ function logPrefix() {
220
+ return `[pid ${process.pid}]`;
221
+ }
222
+ let loggedFlushDeadlineFor;
223
+ // Recompute is invoked from init, registerAltPort, the poll, and the expiry timer - possibly
224
+ // concurrently. Runs are serialized, or two in-flight runs would both pass the changed-state check
225
+ // and double-fire every transition (logs, rebuild events, timers).
226
+ let recomputeChain = Promise.resolve();
227
+ function recompute() {
228
+ let next = recomputeChain.then(() => recomputeNow());
229
+ recomputeChain = next.then(() => { }, () => { });
230
+ return next;
199
231
  }
200
- async function recompute() {
232
+ async function recomputeNow() {
201
233
  if (!initialized || !timelineFolder)
202
234
  return;
203
235
  let now = Date.now();
@@ -212,11 +244,11 @@ async function recompute() {
212
244
  // Matching failures must be loud, or takeover detection fails silently forever
213
245
  if (!us && entries.length && !loggedNoMatch) {
214
246
  loggedNoMatch = true;
215
- console.warn(`No deploy timeline entry matches our pid chain (${[...ancestorPids].join(", ")}) - takeover detection cannot work. Entries: ${entries.map(x => { var _a; return `pid=${(_a = x.pid) !== null && _a !== void 0 ? _a : "none"} releaseTime=${x.parameters.releaseTime}`; }).join(" | ")}`);
247
+ console.warn(`${logPrefix()} No deploy timeline entry matches our pid chain (${[...ancestorPids].join(", ")}) - takeover detection cannot work. Entries: ${entries.map(x => { var _a; return `pid=${(_a = x.pid) !== null && _a !== void 0 ? _a : "none"} releaseTime=${x.parameters.releaseTime}`; }).join(" | ")}`);
216
248
  }
217
249
  if (us && !loggedIdentity) {
218
250
  loggedIdentity = true;
219
- console.log(`Deploy timeline entry matched: we are pid=${us.pid}, releaseTime=${us.parameters.releaseTime !== undefined && iso(us.parameters.releaseTime) || "unknown"}, ${entries.length} entries total`);
251
+ console.log(`${logPrefix()} Deploy timeline entry matched: we are pid=${us.pid}, releaseTime=${us.parameters.releaseTime !== undefined && iso(us.parameters.releaseTime) || "unknown"}, ${entries.length} entries total`);
220
252
  }
221
253
  let computed = {};
222
254
  let usRelease = us === null || us === void 0 ? void 0 : us.parameters.releaseTime;
@@ -280,16 +312,16 @@ function iso(time) {
280
312
  function logTransitions(prev, next) {
281
313
  if (!prev.dying && next.dying) {
282
314
  let { successorStart, overlap } = next.dying;
283
- console.log(`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)}`);
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)}`);
284
316
  }
285
317
  if (!prev.predecessorEnd && next.predecessorEnd) {
286
- console.log(`We are a deploy successor: our predecessor holds the main port until ${iso(next.predecessorEnd)}`);
318
+ console.log(`${logPrefix()} We are a deploy successor: our predecessor holds the main port until ${iso(next.predecessorEnd)}`);
287
319
  }
288
320
  if (!prev.remap && next.remap) {
289
- console.log(`Deploy switchover remap active: sources pointing at us are split so [${iso(next.remap.boundaryA)} .. ${iso(next.remap.boundaryB)}] routes to alternate port ${next.remap.altPort} (remap expires at ${iso(next.remap.expire)})`);
321
+ console.log(`${logPrefix()} Deploy switchover remap active: sources pointing at us are split so [${iso(next.remap.boundaryA)} .. ${iso(next.remap.boundaryB)}] routes to alternate port ${next.remap.altPort} (remap expires at ${iso(next.remap.expire)})`);
290
322
  }
291
323
  if (prev.remap && !next.remap) {
292
- console.log(`Deploy switchover remap ended; running on the plain stored routing config`);
324
+ console.log(`${logPrefix()} Deploy switchover remap ended; running on the plain stored routing config`);
293
325
  }
294
326
  }
295
327
  /** Starts the takeover machinery. Port fallback (alternate port + registry + acquisition polling)
@@ -302,10 +334,10 @@ async function initDeployTakeover(config) {
302
334
  timelineFolder = getTimelineFolder();
303
335
  let entries = await readTimelineEntries();
304
336
  if (!entries.length) {
305
- console.log(`No deploy timeline entries in ${timelineFolder}; deploy takeover inactive until they appear (port fallback still works)`);
337
+ console.log(`${logPrefix()} No deploy timeline entries in ${timelineFolder}; deploy takeover inactive until they appear (port fallback still works)`);
306
338
  }
307
339
  else {
308
- console.log(`Deploy timeline found at ${timelineFolder} (${entries.length} entries); our pid chain: ${[...ancestorPids].join(" -> ")}`);
340
+ console.log(`${logPrefix()} Deploy timeline found at ${timelineFolder} (${entries.length} entries); our pid chain: ${[...ancestorPids].join(" -> ")}`);
309
341
  }
310
342
  await recompute();
311
343
  let poll = setInterval(() => {
@@ -391,6 +423,13 @@ function getTakeoverStamp() {
391
423
  return JSON.stringify(remap);
392
424
  }
393
425
  exports.getTakeoverStamp = getTakeoverStamp;
426
+ /** The middle-window alternate port of an active remap. The OTHER process of the takeover lives on
427
+ * this port on OUR machine (same disk!), so sources pointing at it are self, never sync targets. */
428
+ function getTakeoverAltPort() {
429
+ var _a;
430
+ return (_a = current.remap) === null || _a === void 0 ? void 0 : _a.altPort;
431
+ }
432
+ exports.getTakeoverAltPort = getTakeoverAltPort;
394
433
  /** For the dying process: fast-write flush delays must never extend past this time, and after it
395
434
  * fast writes flush immediately - so nothing is left in memory when the write window transfers. */
396
435
  function getFlushDeadline() {
@@ -410,5 +449,5 @@ function getMainPortAcquireDelay() {
410
449
  return ACQUIRE_SLOW_DELAY;
411
450
  }
412
451
  exports.getMainPortAcquireDelay = getMainPortAcquireDelay;
413
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95VGFrZW92ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3lUYWtlb3Zlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLGlEQUFxQztBQUVyQyxpREFBc0U7QUFFdEUsaUdBQWlHO0FBQ2pHLGlHQUFpRztBQUNqRyxrR0FBa0c7QUFDbEcsOEZBQThGO0FBQzlGLCtGQUErRjtBQUMvRixpR0FBaUc7QUFDakcsbUdBQW1HO0FBQ25HLDBGQUEwRjtBQUMxRixrR0FBa0c7QUFDbEcsK0ZBQStGO0FBQy9GLEVBQUU7QUFDRixpR0FBaUc7QUFDakcsZ0dBQWdHO0FBQ2hHLGlDQUFpQztBQUVqQyxNQUFNLDhCQUE4QixHQUFHLDBCQUEwQixDQUFDO0FBQ2xFLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN6QyxtR0FBbUc7QUFDbkcsK0ZBQStGO0FBQy9GLDhEQUE4RDtBQUM5RCxNQUFNLHlCQUF5QixHQUFHLHFCQUFxQixDQUFDO0FBQ3hELG1HQUFtRztBQUNuRyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDckMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN0QyxrR0FBa0c7QUFDbEcsOEZBQThGO0FBQzlGLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNuQyw2RkFBNkY7QUFDN0YsOEZBQThGO0FBQzlGLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBdUJoQyxJQUFJLFdBQW9GLENBQUM7QUFDekYsSUFB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SUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUMxQixJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzdCLE9BQU8sS0FBSyxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLHVCQUF1QixDQUFDO0FBQzFFLENBQUM7QUFKRCw0Q0FJQztBQUVEO3lFQUN5RTtBQUN6RSxTQUFnQix1QkFBdUI7SUFDbkMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztJQUNqQyxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUN6RSxPQUFPLGtCQUFrQixDQUFDO0lBQzlCLENBQUM7SUFDRCxPQUFPLGtCQUFrQixDQUFDO0FBQzlCLENBQUM7QUFORCwwREFNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IFJlbW90ZUNvbmZpZywgUmVtb3RlQ29uZmlnQmFzZSwgSG9zdGVkQ29uZmlnIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgcGFyc2VIb3N0ZWRVcmwsIHJlcGxhY2VIb3N0ZWRVcmxQb3J0IH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5cbi8vIERlcGxveSB0YWtlb3ZlcjogdGhlIGRlcGxveSBtYW5hZ2VyIChxdWVyeXN1YidzIHBhcmFtZXRlcnNUaW1lbGluZSkgd3JpdGVzIDxuPi1wYXJhbWV0ZXJzLmpzb25cbi8vIGZpbGVzIGludG8gb3VyIGluc3RhbmNlIGZvbGRlciBkZXNjcmliaW5nIHdoZW4gZWFjaCB2ZXJzaW9uIHJ1bnMgYW5kIHdoZW4gaXQgaXMgc2h1dCBkb3duLiBPbGRcbi8vIGFuZCBuZXcgdmVyc2lvbiBvdmVybGFwIGZvciB0aGUgb3ZlcmxhcCB0aW1lIChPID0gb2xkRW5kIC0gbmV3U3RhcnQpLiBXZSB0dXJuIHRoYXQgb3ZlcmxhcCBpbnRvXG4vLyBhbiBhdG9taWMgd3JpdGUgaGFuZG9mZiBieSBSRUlOVEVSUFJFVElORyBldmVyeSByb3V0aW5nIHNvdXJjZSB0aGF0IHBvaW50cyBhdCB1czogaXRzIHZhbGlkXG4vLyB3aW5kb3cgaXMgc3BsaXQgc28gdGhhdCB0aGUgbWlkZGxlIG9mIHRoZSBvdmVybGFwIChbUyArIDAuNSpPLCBTICsgMS41Kk9dKSBwb2ludHMgYXQgdGhlIG5ld1xuLy8gcHJvY2VzcydzIHRlbXBvcmFyeSBhbHRlcm5hdGUgcG9ydC4gVGhlIGV4aXN0aW5nIHZhbGlkLXdpbmRvdyBtYWNoaW5lcnkgdGhlbiBkb2VzIGV2ZXJ5dGhpbmcgLVxuLy8gdGhlIG9sZCBwcm9jZXNzIHN0YXJ0cyByZWplY3RpbmcgZnJlc2ggd3JpdGVzIGF0IHRoZSBmaXJzdCBib3VuZGFyeSwgY2xpZW50cyByZS1yZXNvbHZlLCBhbmQgdGhlXG4vLyBuZXcgcHJvY2VzcyAod2hpY2ggcmVjb2duaXplcyB0aGUgYWx0ZXJuYXRlIHBvcnQgYXMgaXRzZWxmKSB0YWtlcyBvdmVyLiBUaGUgcmVtYXAgaXMgYW5cbi8vIElOVEVSUFJFVEFUSU9OIE9WRVJMQVksIGFwcGxpZWQgd2hlcmUgcm91dGluZyBjb25maWdzIGFyZSB1c2VkIChzZWUgYXBwbHlEZXBsb3lSZW1hcCBjYWxsZXJzKSAtXG4vLyBpdCBpcyBuZXZlciB3cml0dGVuIHRvIGRpc2ssIG5ldmVyIHN5bmNocm9uaXplZCwgYW5kIG5ldmVyIHBhcnQgb2YgYW55IHN0b3JlZCBjb25maWd1cmF0aW9uLlxuLy9cbi8vIEV2ZXJ5dGhpbmcgaGVyZSBpcyByZWNvbXB1dGVkIGlkZW1wb3RlbnRseSBmcm9tIGl0cyBpbnB1dHMgKHRpbWVsaW5lIGZpbGVzLCB0aGUgcG9ydCByZWdpc3RyeSxcbi8vIG91ciBhbmNlc3RvciBwaWRzLCB0aGUgY2xvY2spIC0gZmlsZXMgY2FuIGFwcGVhciBvciBjaGFuZ2UgYXQgYW55IG1vbWVudCwgYW5kIHdlIGNhbiBzdGFydCBhdFxuLy8gYW55IHBvaW50IGR1cmluZyBhIHN3aXRjaG92ZXIuXG5cbmNvbnN0IFBBUkFNRVRFUlNfVElNRUxJTkVfRklMRV9SRUdFWCA9IC9eKFxcZCspLXBhcmFtZXRlcnNcXC5qc29uJC87XG5jb25zdCBUSU1FTElORV9QT0xMX0lOVEVSVkFMID0gNjAgKiAxMDAwO1xuLy8gUHJvY2Vzc2VzIGxpc3RlbmluZyBvbiBhbiBhbHRlcm5hdGUgcG9ydCByZWdpc3RlciBpdCBoZXJlIChzaWJsaW5nIG9mIHRoZSBzdG9yYWdlIGZvbGRlciksIGtleWVkXG4vLyBieSB0aGVpciBhY3R1YWwgcGlkOyBjb250ZW50IGluY2x1ZGVzIHRoZWlyIGFuY2VzdG9yIHBpZHMgc28gdGhlIHRpbWVsaW5lIGVudHJ5IHBpZCAoYSBzaGVsbFxuLy8gYW5jZXN0b3Igb2YgdGhlIHByb2Nlc3MpIGNhbiBiZSBtYXRjaGVkIHRvIGEgcmVnaXN0cnkgZW50cnlcbmNvbnN0IFBPUlRfUkVHSVNUUllfRk9MREVSX05BTUUgPSBcInN0b3JhZ2VQb3J0UmVnaXN0cnlcIjtcbi8vIE1haW4tcG9ydCBhY3F1aXNpdGlvbiBhdHRlbXB0cyBydW4gdGhpcyBvZnRlbiwgdGlnaHRlbmluZyBuZWFyIHRoZSBwcmVkZWNlc3NvcidzIHNjaGVkdWxlZCBkZWF0aFxuY29uc3QgQUNRVUlSRV9TTE9XX0RFTEFZID0gMzAgKiAxMDAwO1xuY29uc3QgQUNRVUlSRV9GQVNUX0RFTEFZID0gNSAqIDEwMDA7XG5jb25zdCBBQ1FVSVJFX0ZBU1RfV0lORE9XID0gNjAgKiAxMDAwO1xuLy8gRGlzayByZXNjYW5zIGZpcmUgdGhpcyBmYXIgYmVmb3JlIGFuZCBhZnRlciB0aGUgd3JpdGUgaGFuZG9mZiwgY2F0Y2hpbmcgZmlsZXMgdGhlIG90aGVyIHByb2Nlc3Ncbi8vIHdyb3RlICh0aGUgQnVsa0RhdGFiYXNlMiBpbmRleCBpcyBhdG9taWMgYnV0IGl0cyBlbnRyaWVzIGxhbmQgYXQgd3JpdGUgdGltZSwgbm90IGZpbGUgdGltZSlcbmNvbnN0IFNXSVRDSF9TQ0FOX0xFQUQgPSAxMCAqIDEwMDA7XG4vLyBUaGUgZHlpbmcgcHJvY2VzcyBtdXN0IGhhdmUgZmx1c2hlZCBldmVyeXRoaW5nIGJlZm9yZSB0aGUgaGFuZG9mZjogZmFzdC13cml0ZSBkZWxheXMgbmV2ZXJcbi8vIGV4dGVuZCBwYXN0IFMgKyBvdmVybGFwICogdGhpcyBmcmFjdGlvbiwgYW5kIGFmdGVyIHRoYXQgcG9pbnQgZmFzdCB3cml0ZXMgZmx1c2ggaW1tZWRpYXRlbHlcbmNvbnN0IEZMVVNIX0RFQURMSU5FX0ZSQUNUSU9OID0gMC4yNTtcbmNvbnN0IEJPVU5EQVJZX0FfRlJBQ1RJT04gPSAwLjU7XG5jb25zdCBCT1VOREFSWV9CX0ZSQUNUSU9OID0gMS41O1xuY29uc3QgUkVNQVBfRVhQSVJFX0ZSQUNUSU9OID0gMjtcblxudHlwZSBUaW1lbGluZUVudHJ5ID0ge1xuICAgIHBpZD86IG51bWJlcjtcbiAgICAvLyByZWxlYXNlVGltZSArIG92ZXJsYXBUaW1lIGRlZmluZSBldmVyeXRoaW5nOiB0aGUgbmV3ZXIgZW50cnkncyByZWxlYXNlVGltZSBpcyB3aGVuIGl0XG4gICAgLy8gc3RhcnRzLCBhbmQgcmVsZWFzZVRpbWUgKyBvdmVybGFwVGltZSBpcyB3aGVuIHRoZSBvbGRlciBvbmUgaXMga2lsbGVkIChmcmVlaW5nIHRoZSBwb3J0KS5cbiAgICAvLyBUaGUgZmlsZXMgYWxzbyBjYXJyeSBhbiBhbGl2ZVdpbmRvdywgd2hpY2ggaXMgZGVsaWJlcmF0ZWx5IGlnbm9yZWQuXG4gICAgcGFyYW1ldGVyczogeyByZWxlYXNlVGltZT86IG51bWJlcjsgb3ZlcmxhcFRpbWU/OiBudW1iZXIgfTtcbn07XG5cbnR5cGUgVGFrZW92ZXJDb21wdXRlZCA9IHtcbiAgICAvLyBXZSBhcmUgc2NoZWR1bGVkIHRvIGRpZSB3aXRoIGEgc3VjY2Vzc29yIG92ZXJsYXBwaW5nIHVzIChrbm93biBmcm9tIHRoZSBmaWxlcyBhbG9uZSwgYmVmb3JlXG4gICAgLy8gdGhlIHN1Y2Nlc3NvcidzIHBvcnQgaXMgZGlzY292ZXJlZCAtIHRoZSBmbHVzaCBkZWFkbGluZSBhcHBsaWVzIGltbWVkaWF0ZWx5KVxuICAgIGR5aW5nPzogeyBzdWNjZXNzb3JTdGFydDogbnVtYmVyOyBvdmVybGFwOiBudW1iZXIgfTtcbiAgICAvLyBUaGUgd2luZG93IHJlaW50ZXJwcmV0YXRpb24sIG9uY2UgdGhlIG1pZGRsZSB3aW5kb3cncyBwb3J0IGlzIGtub3duICh0aGUgc3VjY2Vzc29yJ3NcbiAgICAvLyByZWdpc3RlcmVkIGFsdGVybmF0ZSBwb3J0IC0gb3Igb3VyIG93biwgd2hlbiB3ZSBBUkUgdGhlIHN1Y2Nlc3NvcilcbiAgICByZW1hcD86IHsgYm91bmRhcnlBOiBudW1iZXI7IGJvdW5kYXJ5QjogbnVtYmVyOyBleHBpcmU6IG51bWJlcjsgYWx0UG9ydDogbnVtYmVyIH07XG4gICAgLy8gV2hlbiBvdXIgcHJlZGVjZXNzb3IgZGllcyBhbmQgZnJlZXMgdGhlIG1haW4gcG9ydCAoZm9yIGFjcXVpc2l0aW9uIHBhY2luZylcbiAgICBwcmVkZWNlc3NvckVuZD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFRha2VvdmVyRXZlbnQgPSBcInJlbWFwQ2hhbmdlZFwiIHwgXCJkaXNrU2NhblwiO1xuXG5sZXQgaW5pdGlhbGl6ZWQ6IHsgZG9tYWluOiBzdHJpbmc7IG1haW5Qb3J0OiBudW1iZXI7IHN0b3JhZ2VGb2xkZXI6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xubGV0IGFuY2VzdG9yUGlkcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xubGV0IHRpbWVsaW5lRm9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5sZXQgb3VyQWx0UG9ydDogbnVtYmVyIHwgdW5kZWZpbmVkO1xubGV0IGN1cnJlbnQ6IFRha2VvdmVyQ29tcHV0ZWQgPSB7fTtcbmxldCBjdXJyZW50S2V5ID0gSlNPTi5zdHJpbmdpZnkoY3VycmVudCk7XG5sZXQgZXZlbnRMaXN0ZW5lcnM6ICgoZXZlbnQ6IFRha2VvdmVyRXZlbnQpID0+IHZvaWQpW10gPSBbXTtcbmxldCBldmVudFRpbWVyczogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD5bXSA9IFtdO1xubGV0IGxvZ2dlZE5vTWF0Y2ggPSBmYWxzZTtcbmxldCBsb2dnZWRJZGVudGl0eSA9IGZhbHNlO1xuXG5mdW5jdGlvbiBleGVjVGV4dChjb21tYW5kOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGV4ZWMoY29tbWFuZCwgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLy8gVGhlIHRpbWVsaW5lIGVudHJ5IHBpZCBpcyB0aGUgc2NyZWVuIHNoZWxsIHRoYXQgc3Bhd25lZCB1cyAtIGFuIGFuY2VzdG9yIC0gc28gd2Ugd2FsayBvdXIgd2hvbGVcbi8vIGFuY2VzdG9yIGNoYWluIHRvIGZpbmQgd2hpY2ggZW50cnkgaXMgdXNcbmFzeW5jIGZ1bmN0aW9uIGdldEFuY2VzdG9yUGlkcygpOiBQcm9taXNlPFNldDxudW1iZXI+PiB7XG4gICAgbGV0IHBpZHMgPSBuZXcgU2V0PG51bWJlcj4oW3Byb2Nlc3MucGlkXSk7XG4gICAgbGV0IGN1cnJlbnRQaWQgPSBwcm9jZXNzLnBpZDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgcHBpZDogbnVtYmVyO1xuICAgICAgICBpZiAoY3VycmVudFBpZCA9PT0gcHJvY2Vzcy5waWQgJiYgcHJvY2Vzcy5wcGlkKSB7XG4gICAgICAgICAgICBwcGlkID0gcHJvY2Vzcy5wcGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwcGlkID0gcGFyc2VJbnQoKGF3YWl0IGV4ZWNUZXh0KGBwcyAtbyBwcGlkPSAtcCAke2N1cnJlbnRQaWR9YCkpLnRyaW0oKSk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBwaWQgfHwgTnVtYmVyLmlzTmFOKHBwaWQpIHx8IHBwaWQgPD0gMSB8fCBwaWRzLmhhcyhwcGlkKSkgYnJlYWs7XG4gICAgICAgIHBpZHMuYWRkKHBwaWQpO1xuICAgICAgICBjdXJyZW50UGlkID0gcHBpZDtcbiAgICB9XG4gICAgcmV0dXJuIHBpZHM7XG59XG5cbi8vIFRoZSBpbnN0YW5jZSBmb2xkZXIgaXMgQUxXQVlTIHRoZSBwYXJlbnQgb2Ygb3VyIGN3ZCAoc2VydmljZXMgcnVuIGluIDxpbnN0YW5jZT4vZ2l0LykgLSBuZXZlclxuLy8gc2VhcmNoIGZvciBpdCwgYSB3YWxrIGNvdWxkIGxhdGNoIG9udG8gdGhlIHdyb25nIGZvbGRlclxuZnVuY3Rpb24gZ2V0VGltZWxpbmVGb2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHByb2Nlc3MuY3dkKCkpLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKSArIFwiL1wiO1xufVxuXG5mdW5jdGlvbiBwaWRBbGl2ZShwaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAgIHByb2Nlc3Mua2lsbChwaWQsIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiAoZSBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZSA9PT0gXCJFUEVSTVwiO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVnaXN0cnlGb2xkZXIoKTogc3RyaW5nIHtcbiAgICBpZiAoIWluaXRpYWxpemVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVwbG95IHRha2VvdmVyIGlzIG5vdCBpbml0aWFsaXplZGApO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKHBhdGguZGlybmFtZShwYXRoLnJlc29sdmUoaW5pdGlhbGl6ZWQuc3RvcmFnZUZvbGRlcikpLCBQT1JUX1JFR0lTVFJZX0ZPTERFUl9OQU1FKTtcbn1cblxudHlwZSBSZWdpc3RyeUVudHJ5ID0geyBwaWQ6IG51bWJlcjsgcG9ydDogbnVtYmVyOyBhbmNlc3RvclBpZHM6IG51bWJlcltdIH07XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQb3J0UmVnaXN0cnkoKTogUHJvbWlzZTxSZWdpc3RyeUVudHJ5W10+IHtcbiAgICBsZXQgZm9sZGVyID0gZ2V0UmVnaXN0cnlGb2xkZXIoKTtcbiAgICBsZXQgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgICAgZmlsZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGZvbGRlcik7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IGVudHJpZXM6IFJlZ2lzdHJ5RW50cnlbXSA9IFtdO1xuICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gL14oXFxkKylcXC5qc29uJC8uZXhlYyhmaWxlKTtcbiAgICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG4gICAgICAgIGxldCBwaWQgPSBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgIGlmICghcGlkQWxpdmUocGlkKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsocGF0aC5qb2luKGZvbGRlciwgZmlsZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCB7IH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgZW50cnkgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihmb2xkZXIsIGZpbGUpLCBcInV0ZjhcIikpIGFzIFJlZ2lzdHJ5RW50cnk7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goeyAuLi5lbnRyeSwgcGlkIH0pO1xuICAgICAgICB9IGNhdGNoIHsgfVxuICAgIH1cbiAgICByZXR1cm4gZW50cmllcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFRpbWVsaW5lRW50cmllcygpOiBQcm9taXNlPFRpbWVsaW5lRW50cnlbXT4ge1xuICAgIGlmICghdGltZWxpbmVGb2xkZXIpIHJldHVybiBbXTtcbiAgICBsZXQgZW50cmllczogVGltZWxpbmVFbnRyeVtdID0gW107XG4gICAgZm9yIChsZXQgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHRpbWVsaW5lRm9sZGVyKSkge1xuICAgICAgICBpZiAoIVBBUkFNRVRFUlNfVElNRUxJTkVfRklMRV9SRUdFWC50ZXN0KGZpbGUpKSBjb250aW51ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaChKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHRpbWVsaW5lRm9sZGVyICsgZmlsZSwgXCJ1dGY4XCIpKSBhcyBUaW1lbGluZUVudHJ5KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBDb3VsZCBub3QgcmVhZCBkZXBsb3kgdGltZWxpbmUgZmlsZSAke3RpbWVsaW5lRm9sZGVyICsgZmlsZX06ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVudHJpZXM7XG59XG5cbmZ1bmN0aW9uIG1ha2VSZW1hcChzdWNjZXNzb3JTdGFydDogbnVtYmVyLCBvdmVybGFwOiBudW1iZXIsIGFsdFBvcnQ6IG51bWJlcik6IFRha2VvdmVyQ29tcHV0ZWRbXCJyZW1hcFwiXSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYm91bmRhcnlBOiBzdWNjZXNzb3JTdGFydCArIG92ZXJsYXAgKiBCT1VOREFSWV9BX0ZSQUNUSU9OLFxuICAgICAgICBib3VuZGFyeUI6IHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCAqIEJPVU5EQVJZX0JfRlJBQ1RJT04sXG4gICAgICAgIGV4cGlyZTogc3VjY2Vzc29yU3RhcnQgKyBvdmVybGFwICogUkVNQVBfRVhQSVJFX0ZSQUNUSU9OLFxuICAgICAgICBhbHRQb3J0LFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGVtaXQoZXZlbnQ6IFRha2VvdmVyRXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGxldCBsaXN0ZW5lciBvZiBldmVudExpc3RlbmVycykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGlzdGVuZXIoZXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBEZXBsb3kgdGFrZW92ZXIgbGlzdGVuZXIgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUV2ZW50cygpOiB2b2lkIHtcbiAgICBmb3IgKGxldCB0aW1lciBvZiBldmVudFRpbWVycykge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cbiAgICBldmVudFRpbWVycyA9IFtdO1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBzY2hlZHVsZSA9ICh0aW1lOiBudW1iZXIsIGZuYzogKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICBpZiAodGltZSA8PSBub3cpIHJldHVybjtcbiAgICAgICAgbGV0IHRpbWVyID0gc2V0VGltZW91dChmbmMsIHRpbWUgLSBub3cpO1xuICAgICAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICBldmVudFRpbWVycy5wdXNoKHRpbWVyKTtcbiAgICB9O1xuICAgIGxldCByZW1hcCA9IGN1cnJlbnQucmVtYXA7XG4gICAgaWYgKHJlbWFwKSB7XG4gICAgICAgIGxldCBhbHRQb3J0ID0gcmVtYXAuYWx0UG9ydDtcbiAgICAgICAgc2NoZWR1bGUocmVtYXAuYm91bmRhcnlBIC0gU1dJVENIX1NDQU5fTEVBRCwgKCkgPT4gZW1pdChcImRpc2tTY2FuXCIpKTtcbiAgICAgICAgc2NoZWR1bGUocmVtYXAuYm91bmRhcnlBLCAoKSA9PiBjb25zb2xlLmxvZyhgRGVwbG95IHN3aXRjaG92ZXIgd3JpdGUgaGFuZG9mZiBib3VuZGFyeSBwYXNzZWQ6IGZyZXNoIHdyaXRlcyBub3cgYmVsb25nIHRvIHRoZSBhbHRlcm5hdGUtcG9ydCBzaWRlIChwb3J0ICR7YWx0UG9ydH0pYCkpO1xuICAgICAgICBzY2hlZHVsZShyZW1hcC5ib3VuZGFyeUEgKyBTV0lUQ0hfU0NBTl9MRUFELCAoKSA9PiBlbWl0KFwiZGlza1NjYW5cIikpO1xuICAgICAgICBzY2hlZHVsZShyZW1hcC5ib3VuZGFyeUIsICgpID0+IGNvbnNvbGUubG9nKGBEZXBsb3kgc3dpdGNob3ZlciBzZWNvbmQgYm91bmRhcnkgcGFzc2VkOiBmcmVzaCB3cml0ZXMgcmV0dXJuIHRvIHRoZSBtYWluIHBvcnRgKSk7XG4gICAgICAgIHNjaGVkdWxlKHJlbWFwLmV4cGlyZSwgKCkgPT4gdm9pZCByZWNvbXB1dGUoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYERlcGxveSB0YWtlb3ZlciByZWNvbXB1dGUgZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSkpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVjb21wdXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghaW5pdGlhbGl6ZWQgfHwgIXRpbWVsaW5lRm9sZGVyKSByZXR1cm47XG4gICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgbGV0IGVudHJpZXMgPSBhd2FpdCByZWFkVGltZWxpbmVFbnRyaWVzKCk7XG4gICAgbGV0IHJlZ2lzdHJ5ID0gYXdhaXQgcmVhZFBvcnRSZWdpc3RyeSgpO1xuICAgIGxldCB1czogVGltZWxpbmVFbnRyeSB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyeS5waWQgJiYgYW5jZXN0b3JQaWRzLmhhcyhlbnRyeS5waWQpKSB7XG4gICAgICAgICAgICB1cyA9IGVudHJ5O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE1hdGNoaW5nIGZhaWx1cmVzIG11c3QgYmUgbG91ZCwgb3IgdGFrZW92ZXIgZGV0ZWN0aW9uIGZhaWxzIHNpbGVudGx5IGZvcmV2ZXJcbiAgICBpZiAoIXVzICYmIGVudHJpZXMubGVuZ3RoICYmICFsb2dnZWROb01hdGNoKSB7XG4gICAgICAgIGxvZ2dlZE5vTWF0Y2ggPSB0cnVlO1xuICAgICAgICBjb25zb2xlLndhcm4oYE5vIGRlcGxveSB0aW1lbGluZSBlbnRyeSBtYXRjaGVzIG91ciBwaWQgY2hhaW4gKCR7Wy4uLmFuY2VzdG9yUGlkc10uam9pbihcIiwgXCIpfSkgLSB0YWtlb3ZlciBkZXRlY3Rpb24gY2Fubm90IHdvcmsuIEVudHJpZXM6ICR7ZW50cmllcy5tYXAoeCA9PiBgcGlkPSR7eC5waWQgPz8gXCJub25lXCJ9IHJlbGVhc2VUaW1lPSR7eC5wYXJhbWV0ZXJzLnJlbGVhc2VUaW1lfWApLmpvaW4oXCIgfCBcIil9YCk7XG4gICAgfVxuICAgIGlmICh1cyAmJiAhbG9nZ2VkSWRlbnRpdHkpIHtcbiAgICAgICAgbG9nZ2VkSWRlbnRpdHkgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLmxvZyhgRGVwbG95IHRpbWVsaW5lIGVudHJ5IG1hdGNoZWQ6IHdlIGFyZSBwaWQ9JHt1cy5waWR9LCByZWxlYXNlVGltZT0ke3VzLnBhcmFtZXRlcnMucmVsZWFzZVRpbWUgIT09IHVuZGVmaW5lZCAmJiBpc28odXMucGFyYW1ldGVycy5yZWxlYXNlVGltZSkgfHwgXCJ1bmtub3duXCJ9LCAke2VudHJpZXMubGVuZ3RofSBlbnRyaWVzIHRvdGFsYCk7XG4gICAgfVxuICAgIGxldCBjb21wdXRlZDogVGFrZW92ZXJDb21wdXRlZCA9IHt9O1xuICAgIGxldCB1c1JlbGVhc2UgPSB1cz8ucGFyYW1ldGVycy5yZWxlYXNlVGltZTtcbiAgICBpZiAodXMgJiYgdXNSZWxlYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gVGhlIG5ld2VyIGVudHJ5J3MgcmVsZWFzZVRpbWUgaXMgd2hlbiBpdCBzdGFydHM7IHJlbGVhc2VUaW1lICsgb3ZlcmxhcFRpbWUgaXMgd2hlbiB0aGVcbiAgICAgICAgLy8gb2xkZXIgb25lIGlzIGtpbGxlZC4gVGhhdCdzIHRoZSB3aG9sZSB0aW1lbGluZS5cbiAgICAgICAgbGV0IG5leHQ6IHsgZW50cnk6IFRpbWVsaW5lRW50cnk7IHJlbGVhc2U6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBsZXQgcHJldjogeyBlbnRyeTogVGltZWxpbmVFbnRyeTsgcmVsZWFzZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeSA9PT0gdXMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHJlbGVhc2UgPSBlbnRyeS5wYXJhbWV0ZXJzLnJlbGVhc2VUaW1lO1xuICAgICAgICAgICAgaWYgKHJlbGVhc2UgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAocmVsZWFzZSA+IHVzUmVsZWFzZSAmJiAoIW5leHQgfHwgcmVsZWFzZSA8IG5leHQucmVsZWFzZSkpIHtcbiAgICAgICAgICAgICAgICBuZXh0ID0geyBlbnRyeSwgcmVsZWFzZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlbGVhc2UgPCB1c1JlbGVhc2UgJiYgKCFwcmV2IHx8IHJlbGVhc2UgPiBwcmV2LnJlbGVhc2UpKSB7XG4gICAgICAgICAgICAgICAgcHJldiA9IHsgZW50cnksIHJlbGVhc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobmV4dCkge1xuICAgICAgICAgICAgbGV0IHN1Y2Nlc3NvclN0YXJ0ID0gbmV4dC5yZWxlYXNlO1xuICAgICAgICAgICAgbGV0IG92ZXJsYXAgPSBuZXh0LmVudHJ5LnBhcmFtZXRlcnMub3ZlcmxhcFRpbWUgfHwgdXMucGFyYW1ldGVycy5vdmVybGFwVGltZSB8fCAwO1xuICAgICAgICAgICAgLy8gRXZlbiBhIFpFUk8tb3ZlcmxhcCBkZXBsb3kgbmVlZHMgdGhlIGR5aW5nIGJlaGF2aW9ycyAtIGRyYWluaW5nIGZhc3Qtd3JpdGUgZmx1c2hlc1xuICAgICAgICAgICAgLy8gYnkgdGhlIHJlbGVhc2UgYW5kIHdyaXRpbmcgdGhyb3VnaCBhZnRlciBpdCwgb3IgYWNrbm93bGVkZ2VkIGRhdGEgZGllcyB3aXRoIHVzLlxuICAgICAgICAgICAgLy8gT25seSB0aGUgcmVtYXAgKHRoZSBhbHRlcm5hdGUtcG9ydCBtaWRkbGUgd2luZG93KSBuZWVkcyBhbiBhY3R1YWwgb3ZlcmxhcC5cbiAgICAgICAgICAgIGNvbXB1dGVkLmR5aW5nID0geyBzdWNjZXNzb3JTdGFydCwgb3ZlcmxhcCB9O1xuICAgICAgICAgICAgaWYgKG92ZXJsYXAgPiAwICYmIG5vdyA8IHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCAqIFJFTUFQX0VYUElSRV9GUkFDVElPTikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3NvclBpZCA9IG5leHQuZW50cnkucGlkO1xuICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzb3JQaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN1Y2Nlc3NvckVudHJ5ID0gcmVnaXN0cnkuZmluZCh4ID0+IHguYW5jZXN0b3JQaWRzLmluY2x1ZGVzKHN1Y2Nlc3NvclBpZCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzc29yRW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkLnJlbWFwID0gbWFrZVJlbWFwKHN1Y2Nlc3NvclN0YXJ0LCBvdmVybGFwLCBzdWNjZXNzb3JFbnRyeS5wb3J0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgICAgbGV0IG92ZXJsYXAgPSB1cy5wYXJhbWV0ZXJzLm92ZXJsYXBUaW1lIHx8IHByZXYuZW50cnkucGFyYW1ldGVycy5vdmVybGFwVGltZSB8fCAwO1xuICAgICAgICAgICAgLy8gVGhlIHByZWRlY2Vzc29yIGhvbGRzIHRoZSBtYWluIHBvcnQgdW50aWwgT1VSIHJlbGVhc2UgKyB0aGUgb3ZlcmxhcFxuICAgICAgICAgICAgY29tcHV0ZWQucHJlZGVjZXNzb3JFbmQgPSB1c1JlbGVhc2UgKyBvdmVybGFwO1xuICAgICAgICAgICAgaWYgKG92ZXJsYXAgPiAwICYmIG91ckFsdFBvcnQgJiYgbm93IDwgdXNSZWxlYXNlICsgb3ZlcmxhcCAqIFJFTUFQX0VYUElSRV9GUkFDVElPTiAmJiAhY29tcHV0ZWQucmVtYXApIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZC5yZW1hcCA9IG1ha2VSZW1hcCh1c1JlbGVhc2UsIG92ZXJsYXAsIG91ckFsdFBvcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBrZXkgPSBKU09OLnN0cmluZ2lmeShjb21wdXRlZCk7XG4gICAgaWYgKGtleSA9PT0gY3VycmVudEtleSkgcmV0dXJuO1xuICAgIGxvZ1RyYW5zaXRpb25zKGN1cnJlbnQsIGNvbXB1dGVkKTtcbiAgICBjdXJyZW50ID0gY29tcHV0ZWQ7XG4gICAgY3VycmVudEtleSA9IGtleTtcbiAgICBzY2hlZHVsZUV2ZW50cygpO1xuICAgIGVtaXQoXCJyZW1hcENoYW5nZWRcIik7XG59XG5cbmZ1bmN0aW9uIGlzbyh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lKS50b0lTT1N0cmluZygpO1xufVxuXG4vLyBUaGUgc3dpdGNob3ZlciBsaWZlY3ljbGUgaXMgcmFyZSBhbmQgaW1wb3J0YW50LCBzbyBldmVyeSBzdGFnZSBnZXRzIGEgY2xlYXIgbGluZVxuZnVuY3Rpb24gbG9nVHJhbnNpdGlvbnMocHJldjogVGFrZW92ZXJDb21wdXRlZCwgbmV4dDogVGFrZW92ZXJDb21wdXRlZCk6IHZvaWQge1xuICAgIGlmICghcHJldi5keWluZyAmJiBuZXh0LmR5aW5nKSB7XG4gICAgICAgIGxldCB7IHN1Y2Nlc3NvclN0YXJ0LCBvdmVybGFwIH0gPSBuZXh0LmR5aW5nO1xuICAgICAgICBjb25zb2xlLmxvZyhgRGVwbG95IHN3aXRjaG92ZXIgc2NoZWR1bGVkOiBvdXIgc3VjY2Vzc29yIHN0YXJ0cyBhdCAke2lzbyhzdWNjZXNzb3JTdGFydCl9OyBmYXN0LXdyaXRlIGZsdXNoZXMgZHJhaW4gYnkgJHtpc28oc3VjY2Vzc29yU3RhcnQgKyBvdmVybGFwICogRkxVU0hfREVBRExJTkVfRlJBQ1RJT04pfSwgZnJlc2ggd3JpdGVzIGhhbmQgb2ZmIGF0ICR7aXNvKHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCAqIEJPVU5EQVJZX0FfRlJBQ1RJT04pfSwgYW5kIHdlIGFyZSBraWxsZWQgYXQgJHtpc28oc3VjY2Vzc29yU3RhcnQgKyBvdmVybGFwKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwcmV2LnByZWRlY2Vzc29yRW5kICYmIG5leHQucHJlZGVjZXNzb3JFbmQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFdlIGFyZSBhIGRlcGxveSBzdWNjZXNzb3I6IG91ciBwcmVkZWNlc3NvciBob2xkcyB0aGUgbWFpbiBwb3J0IHVudGlsICR7aXNvKG5leHQucHJlZGVjZXNzb3JFbmQpfWApO1xuICAgIH1cbiAgICBpZiAoIXByZXYucmVtYXAgJiYgbmV4dC5yZW1hcCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgRGVwbG95IHN3aXRjaG92ZXIgcmVtYXAgYWN0aXZlOiBzb3VyY2VzIHBvaW50aW5nIGF0IHVzIGFyZSBzcGxpdCBzbyBbJHtpc28obmV4dC5yZW1hcC5ib3VuZGFyeUEpfSAuLiAke2lzbyhuZXh0LnJlbWFwLmJvdW5kYXJ5Qil9XSByb3V0ZXMgdG8gYWx0ZXJuYXRlIHBvcnQgJHtuZXh0LnJlbWFwLmFsdFBvcnR9IChyZW1hcCBleHBpcmVzIGF0ICR7aXNvKG5leHQucmVtYXAuZXhwaXJlKX0pYCk7XG4gICAgfVxuICAgIGlmIChwcmV2LnJlbWFwICYmICFuZXh0LnJlbWFwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBEZXBsb3kgc3dpdGNob3ZlciByZW1hcCBlbmRlZDsgcnVubmluZyBvbiB0aGUgcGxhaW4gc3RvcmVkIHJvdXRpbmcgY29uZmlnYCk7XG4gICAgfVxufVxuXG4vKiogU3RhcnRzIHRoZSB0YWtlb3ZlciBtYWNoaW5lcnkuIFBvcnQgZmFsbGJhY2sgKGFsdGVybmF0ZSBwb3J0ICsgcmVnaXN0cnkgKyBhY3F1aXNpdGlvbiBwb2xsaW5nKVxuICogIHdvcmtzIHJlZ2FyZGxlc3M7IHdpdGhvdXQgYSBkZXBsb3kgdGltZWxpbmUgZm9sZGVyIHRoZSBzd2l0Y2hvdmVyLXNwZWNpZmljIHBhcnRzICh0aGUgcmVtYXAsXG4gKiAgdGhlIGZsdXNoIGRlYWRsaW5lLCB0aGUgdGlnaHRlciBhY3F1aXNpdGlvbiBwYWNpbmcpIHNpbXBseSBzdGF5IGluZXJ0LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXREZXBsb3lUYWtlb3Zlcihjb25maWc6IHsgZG9tYWluOiBzdHJpbmc7IG1haW5Qb3J0OiBudW1iZXI7IHN0b3JhZ2VGb2xkZXI6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaW5pdGlhbGl6ZWQgPSBjb25maWc7XG4gICAgYW5jZXN0b3JQaWRzID0gYXdhaXQgZ2V0QW5jZXN0b3JQaWRzKCk7XG4gICAgdGltZWxpbmVGb2xkZXIgPSBnZXRUaW1lbGluZUZvbGRlcigpO1xuICAgIGxldCBlbnRyaWVzID0gYXdhaXQgcmVhZFRpbWVsaW5lRW50cmllcygpO1xuICAgIGlmICghZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS5sb2coYE5vIGRlcGxveSB0aW1lbGluZSBlbnRyaWVzIGluICR7dGltZWxpbmVGb2xkZXJ9OyBkZXBsb3kgdGFrZW92ZXIgaW5hY3RpdmUgdW50aWwgdGhleSBhcHBlYXIgKHBvcnQgZmFsbGJhY2sgc3RpbGwgd29ya3MpYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coYERlcGxveSB0aW1lbGluZSBmb3VuZCBhdCAke3RpbWVsaW5lRm9sZGVyfSAoJHtlbnRyaWVzLmxlbmd0aH0gZW50cmllcyk7IG91ciBwaWQgY2hhaW46ICR7Wy4uLmFuY2VzdG9yUGlkc10uam9pbihcIiAtPiBcIil9YCk7XG4gICAgfVxuICAgIGF3YWl0IHJlY29tcHV0ZSgpO1xuICAgIGxldCBwb2xsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICB2b2lkIHJlY29tcHV0ZSgpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgRGVwbG95IHRha2VvdmVyIHJlY29tcHV0ZSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICB9LCBUSU1FTElORV9QT0xMX0lOVEVSVkFMKTtcbiAgICAocG9sbCBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG59XG5cbi8qKiBDYWxsZWQgd2hlbiB3ZSBoYWQgdG8gbGlzdGVuIG9uIGFuIGFsdGVybmF0ZSBwb3J0ICh0aGUgbWFpbiBwb3J0IHdhcyBzdGlsbCBoZWxkIGJ5IG91clxuICogIHByZWRlY2Vzc29yKTogcmVnaXN0ZXJzIGl0IHNvIHRoZSBwcmVkZWNlc3NvciBjYW4gcm91dGUgdGhlIG1pZGRsZSBvdmVybGFwIHdpbmRvdyB0byB1cy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlckFsdFBvcnQocG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgb3VyQWx0UG9ydCA9IHBvcnQ7XG4gICAgbGV0IGZvbGRlciA9IGdldFJlZ2lzdHJ5Rm9sZGVyKCk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgZW50cnk6IFJlZ2lzdHJ5RW50cnkgPSB7IHBpZDogcHJvY2Vzcy5waWQsIHBvcnQsIGFuY2VzdG9yUGlkczogWy4uLmFuY2VzdG9yUGlkc10gfTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGZvbGRlciwgYCR7cHJvY2Vzcy5waWR9Lmpzb25gKSwgSlNPTi5zdHJpbmdpZnkoZW50cnkpKTtcbiAgICBhd2FpdCByZWNvbXB1dGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uVGFrZW92ZXJFdmVudChsaXN0ZW5lcjogKGV2ZW50OiBUYWtlb3ZlckV2ZW50KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgZXZlbnRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG59XG5cbi8qKiBUaGUgaW50ZXJwcmV0YXRpb24gb3ZlcmxheTogc3BsaXRzIGV2ZXJ5IHNvdXJjZSBwb2ludGluZyBhdCBvdXIgZG9tYWluK21haW4gcG9ydCBzbyB0aGUgbWlkZGxlXG4gKiAgb2YgdGhlIGRlcGxveSBvdmVybGFwIHBvaW50cyBhdCB0aGUgYWx0ZXJuYXRlIHBvcnQuIFB1cmUsIGluLW1lbW9yeSBvbmx5IC0gdGhlIHN0b3JlZCByb3V0aW5nXG4gKiAgY29uZmlnIGlzIG5ldmVyIG1vZGlmaWVkLCBhbmQgdGhpcyBtdXN0IG5ldmVyIGJlIGFwcGxpZWQgdG8gZGF0YSB0aGF0IGdldHMgcGVyc2lzdGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVwbG95UmVtYXAocm91dGluZzogUmVtb3RlQ29uZmlnKTogUmVtb3RlQ29uZmlnIHtcbiAgICBsZXQgcmVtYXAgPSBjdXJyZW50LnJlbWFwO1xuICAgIGxldCBpbml0ID0gaW5pdGlhbGl6ZWQ7XG4gICAgaWYgKCFyZW1hcCB8fCAhaW5pdCkgcmV0dXJuIHJvdXRpbmc7XG4gICAgbGV0IHNvdXJjZXM6IFJlbW90ZUNvbmZpZ0Jhc2VbXSA9IFtdO1xuICAgIGxldCBzbGljZSA9IChzb3VyY2U6IEhvc3RlZENvbmZpZywgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHVybD86IHN0cmluZyk6IEhvc3RlZENvbmZpZyA9PiB7XG4gICAgICAgIHJldHVybiB7IC4uLnNvdXJjZSwgdXJsOiB1cmwgfHwgc291cmNlLnVybCwgdmFsaWRXaW5kb3c6IFtzdGFydCwgZW5kXSB9O1xuICAgIH07XG4gICAgZm9yIChsZXQgc291cmNlIG9mIHJvdXRpbmcuc291cmNlcykge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UudHlwZSAhPT0gXCJyZW1vdGVcIikge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFyc2VkOiB7IGFkZHJlc3M6IHN0cmluZzsgcG9ydDogbnVtYmVyIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBwYXJzZUhvc3RlZFVybChzb3VyY2UudXJsKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWQuYWRkcmVzcyAhPT0gaW5pdC5kb21haW4gfHwgcGFyc2VkLnBvcnQgIT09IGluaXQubWFpblBvcnQpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IHNvdXJjZS52YWxpZFdpbmRvdztcbiAgICAgICAgbGV0IGEgPSBNYXRoLm1heChzdGFydCwgTWF0aC5taW4ocmVtYXAuYm91bmRhcnlBLCBlbmQpKTtcbiAgICAgICAgbGV0IGIgPSBNYXRoLm1heChzdGFydCwgTWF0aC5taW4ocmVtYXAuYm91bmRhcnlCLCBlbmQpKTtcbiAgICAgICAgbGV0IGFkZGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChhID4gc3RhcnQpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaChzbGljZShzb3VyY2UsIHN0YXJ0LCBhKSk7XG4gICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgPiBhKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc2xpY2Uoc291cmNlLCBhLCBiLCByZXBsYWNlSG9zdGVkVXJsUG9ydChzb3VyY2UudXJsLCByZW1hcC5hbHRQb3J0KSkpO1xuICAgICAgICAgICAgYWRkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPiBiKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc2xpY2Uoc291cmNlLCBiLCBlbmQpKTtcbiAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFkZGVkKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB2ZXJzaW9uOiByb3V0aW5nLnZlcnNpb24sIHNvdXJjZXMgfTtcbn1cblxuLyoqIEEgc3RhbXAgb2YgdGhlIGN1cnJlbnQgcmVtYXAgaW50ZXJwcmV0YXRpb24sIGFkdmVydGlzZWQgaW4gcGluZyByZXNwb25zZXMgLSBzbyBldmVyeSBjb25uZWN0ZWRcbiAqICBjbGllbnQgbGVhcm5zIG9mIGEgdGFrZW92ZXIgd2l0aGluIG9uZSBwaW5nIGludGVydmFsLCBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIGl0cyBjb25maWcgcG9sbFxuICogIG9yIGEgd3JpdGUgcmVqZWN0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRha2VvdmVyU3RhbXAoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgcmVtYXAgPSBjdXJyZW50LnJlbWFwO1xuICAgIGlmICghcmVtYXApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlbWFwKTtcbn1cblxuLyoqIEZvciB0aGUgZHlpbmcgcHJvY2VzczogZmFzdC13cml0ZSBmbHVzaCBkZWxheXMgbXVzdCBuZXZlciBleHRlbmQgcGFzdCB0aGlzIHRpbWUsIGFuZCBhZnRlciBpdFxuICogIGZhc3Qgd3JpdGVzIGZsdXNoIGltbWVkaWF0ZWx5IC0gc28gbm90aGluZyBpcyBsZWZ0IGluIG1lbW9yeSB3aGVuIHRoZSB3cml0ZSB3aW5kb3cgdHJhbnNmZXJzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZsdXNoRGVhZGxpbmUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgZHlpbmcgPSBjdXJyZW50LmR5aW5nO1xuICAgIGlmICghZHlpbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGR5aW5nLnN1Y2Nlc3NvclN0YXJ0ICsgZHlpbmcub3ZlcmxhcCAqIEZMVVNIX0RFQURMSU5FX0ZSQUNUSU9OO1xufVxuXG4vKiogSG93IGxvbmcgdG8gd2FpdCBiZXR3ZWVuIG1haW4tcG9ydCBhY3F1aXNpdGlvbiBhdHRlbXB0czogdGlnaHQgYXJvdW5kIHRoZSBwcmVkZWNlc3NvcidzXG4gKiAgc2NoZWR1bGVkIGRlYXRoICh3aGVuIHRoZSBwb3J0IGFjdHVhbGx5IGZyZWVzKSwgcmVsYXhlZCBvdGhlcndpc2UuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpblBvcnRBY3F1aXJlRGVsYXkoKTogbnVtYmVyIHtcbiAgICBsZXQgZW5kID0gY3VycmVudC5wcmVkZWNlc3NvckVuZDtcbiAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQgJiYgTWF0aC5hYnMoRGF0ZS5ub3coKSAtIGVuZCkgPD0gQUNRVUlSRV9GQVNUX1dJTkRPVykge1xuICAgICAgICByZXR1cm4gQUNRVUlSRV9GQVNUX0RFTEFZO1xuICAgIH1cbiAgICByZXR1cm4gQUNRVUlSRV9TTE9XX0RFTEFZO1xufVxuIl19
414
- /* _JS_SOURCE_HASH = "3e19f5d0cb9ae731512d6ad2fdc8e08e1bca439fb271c07d2433bef4b99adfde"; */
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"; */