@cartanova/qgrid-cli 2.3.5 → 2.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/bundle/dist/application/qgrid/oauth.js +15 -12
  2. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +2 -1
  3. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +2 -1
  4. package/bundle/dist/application/qgrid/qgrid.frame.js +40 -20
  5. package/bundle/dist/application/qgrid/qgrid.types.js +8 -2
  6. package/bundle/dist/application/qgrid/token-subscriber.js +16 -8
  7. package/bundle/dist/application/qgrid/token-trigger-setup.js +3 -2
  8. package/bundle/dist/application/request-log/request-log.model.js +12 -7
  9. package/bundle/dist/application/sonamu.generated.js +11 -3
  10. package/bundle/dist/application/sonamu.generated.sso.js +7 -2
  11. package/bundle/dist/application/token/token.model.js +10 -2
  12. package/bundle/dist/application/token/token.types.js +5 -3
  13. package/bundle/dist/i18n/sd.generated.js +4 -1
  14. package/bundle/dist/migrations/20260630223950_alter_tokens_add1_alter1.js +16 -0
  15. package/bundle/dist/migrations/20260701105327_alter_request_logs_add1_alter1.js +16 -0
  16. package/bundle/dist/migrations/20260701105328_alter_request_log_steps_add1_alter1.js +16 -0
  17. package/bundle/dist/sonamu.config.js +13 -6
  18. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +99 -12
  19. package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +31 -0
  20. package/bundle/dist/utils/providers/anthropic/claude-session.js +8 -3
  21. package/bundle/dist/utils/providers/common/ttft.js +25 -0
  22. package/bundle/dist/utils/providers/openai/codex-worker.js +35 -7
  23. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +237 -39
  24. package/bundle/dist/utils/providers/openai/openai-quota.js +30 -0
  25. package/bundle/src/application/qgrid/oauth.ts +17 -7
  26. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +96 -0
  27. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +1 -0
  28. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +16 -0
  29. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +1 -0
  30. package/bundle/src/application/qgrid/qgrid.frame.test.ts +172 -0
  31. package/bundle/src/application/qgrid/qgrid.frame.ts +45 -20
  32. package/bundle/src/application/qgrid/qgrid.types.ts +6 -0
  33. package/bundle/src/application/qgrid/token-subscriber.test.ts +89 -0
  34. package/bundle/src/application/qgrid/token-subscriber.ts +40 -11
  35. package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -1
  36. package/bundle/src/application/qgrid/tool-emulation.test.ts +7 -3
  37. package/bundle/src/application/request-log/request-log.entity.json +3 -0
  38. package/bundle/src/application/request-log/request-log.model.test.ts +92 -0
  39. package/bundle/src/application/request-log/request-log.model.ts +20 -6
  40. package/bundle/src/application/request-log-step/request-log-step.entity.json +3 -0
  41. package/bundle/src/application/sonamu.generated.http +7 -2
  42. package/bundle/src/application/sonamu.generated.sso.ts +5 -0
  43. package/bundle/src/application/sonamu.generated.ts +11 -1
  44. package/bundle/src/application/token/token.entity.json +8 -2
  45. package/bundle/src/application/token/token.model.test.ts +69 -0
  46. package/bundle/src/application/token/token.model.ts +8 -1
  47. package/bundle/src/application/token/token.types.test.ts +34 -0
  48. package/bundle/src/application/token/token.types.ts +5 -0
  49. package/bundle/src/i18n/sd.generated.ts +3 -0
  50. package/bundle/src/migrations/20260630223950_alter_tokens_add1_alter1.ts +15 -0
  51. package/bundle/src/migrations/20260701105327_alter_request_logs_add1_alter1.ts +15 -0
  52. package/bundle/src/migrations/20260701105328_alter_request_log_steps_add1_alter1.ts +15 -0
  53. package/bundle/src/sonamu.config.ts +8 -1
  54. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +183 -15
  55. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +142 -12
  56. package/bundle/src/utils/providers/anthropic/anthropic-quota.test.ts +89 -0
  57. package/bundle/src/utils/providers/anthropic/anthropic-quota.ts +27 -0
  58. package/bundle/src/utils/providers/anthropic/claude-session.ts +7 -2
  59. package/bundle/src/utils/providers/common/provider-dispatcher.ts +1 -0
  60. package/bundle/src/utils/providers/common/ttft.test.ts +37 -0
  61. package/bundle/src/utils/providers/common/ttft.ts +26 -0
  62. package/bundle/src/utils/providers/openai/codex-worker.test.ts +148 -0
  63. package/bundle/src/utils/providers/openai/codex-worker.ts +50 -8
  64. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +378 -6
  65. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +332 -37
  66. package/bundle/src/utils/providers/openai/openai-quota.test.ts +85 -0
  67. package/bundle/src/utils/providers/openai/openai-quota.ts +46 -0
  68. package/bundle/web-dist/client/assets/index-5WdFEqZT.css +1 -0
  69. package/bundle/web-dist/client/assets/{index-DeThumA3.js → index-jnUY7nJ-.js} +3 -3
  70. package/bundle/web-dist/client/assets/logs-B0pWpDrg.js +1 -0
  71. package/bundle/web-dist/client/assets/routes-7XhVuG7o.js +5 -0
  72. package/bundle/web-dist/client/assets/{sd.generated-7jzAQL2_.js → sd.generated-DXhjjL2f.js} +1 -1
  73. package/bundle/web-dist/client/assets/{services.generated-Bx1Eh7ot.js → services.generated-B7u0U1wC.js} +1 -1
  74. package/bundle/web-dist/client/assets/{show-C6OofoAL.js → show-CcjZ9nr7.js} +3 -3
  75. package/bundle/web-dist/client/assets/tokens-DlwAm0v4.js +1 -0
  76. package/bundle/web-dist/client/index.html +3 -3
  77. package/bundle/web-dist/server/assets/{lazyRouteComponent-BEaI4mOq.js → lazyRouteComponent-B0LkbiYf.js} +1 -2
  78. package/bundle/web-dist/server/assets/{logs-CHM0fhfO.js → logs-dLx6gMXT.js} +17 -5
  79. package/bundle/web-dist/server/assets/{routes-C9xFMJ_r.js → routes-DD3Hb9xO.js} +201 -13
  80. package/bundle/web-dist/server/assets/{sd.generated-BeUHLWKH.js → sd.generated-DdfpD_iN.js} +131 -1
  81. package/bundle/web-dist/server/assets/{services.generated-C39hdSv0.js → services.generated-D3ZCvIkt.js} +5 -4
  82. package/bundle/web-dist/server/assets/{show-BZWqH09U.js → show-BQjeyv6A.js} +76 -25
  83. package/bundle/web-dist/server/assets/{tokens-IPwv3pNB.js → tokens-CSOsBpP7.js} +4 -3
  84. package/bundle/web-dist/server/entry-server.generated.js +6 -7
  85. package/dist/cli.js +67 -15
  86. package/package.json +1 -1
  87. package/bundle/web-dist/client/assets/index-B5DSo5uH.css +0 -1
  88. package/bundle/web-dist/client/assets/logs-CtmOVH58.js +0 -1
  89. package/bundle/web-dist/client/assets/routes-Cfoe9J0I.js +0 -5
  90. package/bundle/web-dist/client/assets/tokens-BAZq8sTo.js +0 -1
  91. package/bundle/web-dist/server/assets/shim-B9ZrFt3Z.js +0 -129
  92. /package/bundle/web-dist/server/assets/{cost-DzjfVtUr.js → cost-CSH_t17I.js} +0 -0
@@ -0,0 +1,25 @@
1
+ import "../../../_virtual/_rolldown/runtime.js";
2
+ //#region src/utils/providers/common/ttft.ts
3
+ function createTtftTracker(now = Date.now) {
4
+ let startedAt = null;
5
+ let ttftMs = null;
6
+ const recordFirstDelta = () => {
7
+ if (startedAt === null || ttftMs !== null) return;
8
+ ttftMs = Math.max(0, now() - startedAt);
9
+ };
10
+ return {
11
+ markStart: () => {
12
+ startedAt = now();
13
+ },
14
+ recordFirstDelta,
15
+ value: () => ttftMs,
16
+ wrapDelta: (onDelta) => (text) => {
17
+ recordFirstDelta();
18
+ onDelta(text);
19
+ }
20
+ };
21
+ }
22
+ //#endregion
23
+ export { createTtftTracker };
24
+
25
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHRmdC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi90dGZ0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUdGZ0VHJhY2tlcihub3c6ICgpID0+IG51bWJlciA9IERhdGUubm93KToge1xuICBtYXJrU3RhcnQ6ICgpID0+IHZvaWQ7XG4gIHJlY29yZEZpcnN0RGVsdGE6ICgpID0+IHZvaWQ7XG4gIHZhbHVlOiAoKSA9PiBudW1iZXIgfCBudWxsO1xuICB3cmFwRGVsdGE6IChvbkRlbHRhOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkKSA9PiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xufSB7XG4gIGxldCBzdGFydGVkQXQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBsZXQgdHRmdE1zOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdCByZWNvcmRGaXJzdERlbHRhID0gKCkgPT4ge1xuICAgIGlmIChzdGFydGVkQXQgPT09IG51bGwgfHwgdHRmdE1zICE9PSBudWxsKSByZXR1cm47XG4gICAgdHRmdE1zID0gTWF0aC5tYXgoMCwgbm93KCkgLSBzdGFydGVkQXQpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbWFya1N0YXJ0OiAoKSA9PiB7XG4gICAgICBzdGFydGVkQXQgPSBub3coKTtcbiAgICB9LFxuICAgIHJlY29yZEZpcnN0RGVsdGEsXG4gICAgdmFsdWU6ICgpID0+IHR0ZnRNcyxcbiAgICB3cmFwRGVsdGE6IChvbkRlbHRhKSA9PiAodGV4dCkgPT4ge1xuICAgICAgcmVjb3JkRmlyc3REZWx0YSgpO1xuICAgICAgb25EZWx0YSh0ZXh0KTtcbiAgICB9LFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOztBQUFBLFNBQWdCLGtCQUFrQixNQUFvQixLQUFLLEtBS3pEO0NBQ0EsSUFBSSxZQUEyQjtDQUMvQixJQUFJLFNBQXdCO0NBRTVCLE1BQU0seUJBQXlCO0FBQzdCLE1BQUksY0FBYyxRQUFRLFdBQVcsS0FBTTtBQUMzQyxXQUFTLEtBQUssSUFBSSxHQUFHLEtBQUssR0FBRyxVQUFVOztBQUd6QyxRQUFPO0VBQ0wsaUJBQWlCO0FBQ2YsZUFBWSxLQUFLOztFQUVuQjtFQUNBLGFBQWE7RUFDYixZQUFZLGFBQWEsU0FBUztBQUNoQyxxQkFBa0I7QUFDbEIsV0FBUSxLQUFLOztFQUVoQiJ9
@@ -1,4 +1,5 @@
1
1
  import "../../../_virtual/_rolldown/runtime.js";
2
+ import { createTtftTracker } from "../common/ttft.js";
2
3
  import { CodexRpcClient } from "./codex-rpc.js";
3
4
  import { getLogger } from "@logtape/logtape";
4
5
  import { spawn } from "node:child_process";
@@ -270,9 +271,18 @@ var CodexAppServerWorker = class CodexAppServerWorker {
270
271
  threadId = existingThreadId;
271
272
  model = req.model ?? "";
272
273
  } else ({threadId, model} = await this.createThread(req));
273
- await this.startTurnOnThread(threadId, req);
274
+ const ttftTracker = createTtftTracker();
275
+ const resultPromise = this.consumeTurnNotifications(threadId, model, ttftTracker);
276
+ try {
277
+ ttftTracker.markStart();
278
+ await this.startTurnOnThread(threadId, req);
279
+ } catch (e) {
280
+ this.failActiveTurn(e);
281
+ await resultPromise.catch(() => {});
282
+ throw e;
283
+ }
274
284
  return {
275
- ...await this.consumeTurnNotifications(threadId, model),
285
+ ...await resultPromise,
276
286
  threadId
277
287
  };
278
288
  }
@@ -283,10 +293,20 @@ var CodexAppServerWorker = class CodexAppServerWorker {
283
293
  threadId = existingThreadId;
284
294
  model = req.model ?? "";
285
295
  } else ({threadId, model} = await this.createThread(req));
286
- const { turnId } = await this.startTurnOnThread(threadId, req);
287
296
  cb.onThreadId?.(threadId);
297
+ const ttftTracker = createTtftTracker();
298
+ const resultPromise = this.consumeStreamNotifications(threadId, model, cb, ttftTracker);
299
+ let turnId;
300
+ try {
301
+ ttftTracker.markStart();
302
+ ({turnId} = await this.startTurnOnThread(threadId, req));
303
+ } catch (e) {
304
+ this.failActiveTurn(e);
305
+ await resultPromise.catch(() => {});
306
+ throw e;
307
+ }
288
308
  cb.onTurnId?.(turnId);
289
- await this.consumeStreamNotifications(threadId, model, cb);
309
+ await resultPromise;
290
310
  return { threadId };
291
311
  }
292
312
  get epoch() {
@@ -319,7 +339,7 @@ var CodexAppServerWorker = class CodexAppServerWorker {
319
339
  this.activeTurnAbort = void 0;
320
340
  abort?.(error);
321
341
  }
322
- consumeTurnNotifications(threadId, model) {
342
+ consumeTurnNotifications(threadId, model, ttftTracker = createTtftTracker()) {
323
343
  return new Promise((resolve, reject) => {
324
344
  let settled = false;
325
345
  let abort;
@@ -364,6 +384,11 @@ var CodexAppServerWorker = class CodexAppServerWorker {
364
384
  if (p.threadId !== threadId) return;
365
385
  if (p.item.type === "agentMessage") text = p.item.text;
366
386
  });
387
+ this.rpc.onNotification("item/agentMessage/delta", (p) => {
388
+ if (p.threadId !== threadId) return;
389
+ ttftTracker.recordFirstDelta();
390
+ text += p.delta;
391
+ });
367
392
  this.rpc.onNotification("thread/tokenUsage/updated", (p) => {
368
393
  if (p.threadId !== threadId) return;
369
394
  usage = p.tokenUsage.last;
@@ -375,6 +400,7 @@ var CodexAppServerWorker = class CodexAppServerWorker {
375
400
  text,
376
401
  usage,
377
402
  durationMs,
403
+ ttftMs: ttftTracker.value(),
378
404
  model
379
405
  });
380
406
  else finishWithError(/* @__PURE__ */ new Error(`turn failed: ${JSON.stringify(p.turn.error)}`));
@@ -385,7 +411,7 @@ var CodexAppServerWorker = class CodexAppServerWorker {
385
411
  });
386
412
  });
387
413
  }
388
- consumeStreamNotifications(threadId, model, cb) {
414
+ consumeStreamNotifications(threadId, model, cb, ttftTracker = createTtftTracker()) {
389
415
  return new Promise((resolve, reject) => {
390
416
  let settled = false;
391
417
  let abort;
@@ -429,6 +455,7 @@ var CodexAppServerWorker = class CodexAppServerWorker {
429
455
  this.activeTurnAbort = abort;
430
456
  this.rpc.onNotification("item/agentMessage/delta", (p) => {
431
457
  if (p.threadId !== threadId) return;
458
+ ttftTracker.recordFirstDelta();
432
459
  text += p.delta;
433
460
  cb.onDelta(p.delta);
434
461
  });
@@ -446,6 +473,7 @@ var CodexAppServerWorker = class CodexAppServerWorker {
446
473
  text,
447
474
  usage,
448
475
  durationMs: p.turn.durationMs ?? 0,
476
+ ttftMs: ttftTracker.value(),
449
477
  model
450
478
  });
451
479
  else finishWithError(/* @__PURE__ */ new Error(`turn ${p.turn.status}: ${JSON.stringify(p.turn.error)}`));
@@ -476,4 +504,4 @@ var CodexAppServerWorker = class CodexAppServerWorker {
476
504
  //#endregion
477
505
  export { CodexAppServerWorker };
478
506
 
479
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXgtd29ya2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL2NvZGV4LXdvcmtlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgdHlwZSBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgdHlwZSBUaHJlYWRJbmplY3RJdGVtc1BhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRJbmplY3RJdGVtc1BhcmFtc1wiO1xuaW1wb3J0IHsgdHlwZSBUaHJlYWRTdGFydFBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRTdGFydFBhcmFtc1wiO1xuaW1wb3J0IHsgdHlwZSBUaHJlYWRTdGFydFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL1RocmVhZFN0YXJ0UmVzcG9uc2VcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5Vc2FnZUJyZWFrZG93biB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Ub2tlblVzYWdlQnJlYWtkb3duXCI7XG5pbXBvcnQgeyB0eXBlIFR1cm5TdGFydFBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UdXJuU3RhcnRQYXJhbXNcIjtcbmltcG9ydCB7IHR5cGUgVHVyblN0YXJ0UmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVHVyblN0YXJ0UmVzcG9uc2VcIjtcbmltcG9ydCB7IHR5cGUgU3RyZWFtQ2FsbGJhY2tzIGFzIENvbW1vblN0cmVhbUNhbGxiYWNrcyB9IGZyb20gXCIuLi9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgQ29kZXhScGNDbGllbnQgfSBmcm9tIFwiLi9jb2RleC1ycGNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwiY29kZXgtd29ya2VyXCJdKTtcblxuY29uc3QgTUFYX1JFU1RBUlRfQVRURU1QVFMgPSAzO1xuY29uc3QgUkVTVEFSVF9CQUNLT0ZGX0JBU0VfTVMgPSAxXzAwMDtcblxuLy8g4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtlckNvbmZpZyB7XG4gIHRva2VuSWQ6IG51bWJlcjtcbiAgdG9rZW5OYW1lOiBzdHJpbmc7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIGFjY291bnRJZDogc3RyaW5nO1xuICBwbGFuVHlwZT86IHN0cmluZztcbiAgd29ya2VySW5kZXg/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHVyblJlcXVlc3Qge1xuICBpbnB1dDogVHVyblN0YXJ0UGFyYW1zW1wiaW5wdXRcIl07XG4gIG91dHB1dFNjaGVtYT86IFR1cm5TdGFydFBhcmFtc1tcIm91dHB1dFNjaGVtYVwiXTtcbiAgZWZmb3J0Pzogc3RyaW5nO1xuICBtb2RlbD86IHN0cmluZztcbiAgZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zPzogc3RyaW5nO1xuICBoaXN0b3J5PzogVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXNbXCJpdGVtc1wiXTtcbiAgdmVyYm9zaXR5Pzogc3RyaW5nO1xuICByZWFzb25pbmdTdW1tYXJ5Pzogc3RyaW5nO1xuICBzZXJ2aWNlVGllcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUdXJuUmVzdWx0IHtcbiAgdGV4dDogc3RyaW5nO1xuICB1c2FnZTogVG9rZW5Vc2FnZUJyZWFrZG93bjtcbiAgZHVyYXRpb25NczogbnVtYmVyO1xuICBtb2RlbDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBTdHJlYW1DYWxsYmFja3MgPSBDb21tb25TdHJlYW1DYWxsYmFja3M8VHVyblJlc3VsdD47XG5cbnR5cGUgUmVmcmVzaGFibGVXb3JrZXJDcmVkZW50aWFscyA9IFBpY2s8V29ya2VyQ29uZmlnLCBcImFjY2Vzc1Rva2VuXCIgfCBcImFjY291bnRJZFwiIHwgXCJwbGFuVHlwZVwiPjtcbnR5cGUgQWN0aXZlVHVybkFib3J0ID0gKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcblxuLy8gdGhyZWFkL3N0YXJ0IOqzte2GtSDsmLXshZhcbmNvbnN0IFRIUkVBRF9ERUZBVUxUUyA9IHtcbiAgc2FuZGJveDogXCJyZWFkLW9ubHlcIixcbiAgYXBwcm92YWxQb2xpY3k6IFwibmV2ZXJcIixcbiAgY29uZmlnOiB7XG4gICAgYXBwczogeyBfZGVmYXVsdDogeyBlbmFibGVkOiBmYWxzZSwgZGVzdHJ1Y3RpdmVfZW5hYmxlZDogZmFsc2UsIG9wZW5fd29ybGRfZW5hYmxlZDogZmFsc2UgfSB9LFxuICB9LFxufSBzYXRpc2ZpZXMgUGFydGlhbDxUaHJlYWRTdGFydFBhcmFtcz47XG5cbmNvbnN0IEJBU0VfSU5TVFJVQ1RJT05TID1cbiAgXCJZb3UgYXJlIGEgaGVscGZ1bCBhc3Npc3RhbnQuIERvIG5vdCB1c2UgYW55IHRvb2xzIHN1Y2ggYXMgc2hlbGwsIGZpbGUgb3BlcmF0aW9ucywgb3Igd2ViIHNlYXJjaC4gUmVzcG9uZCB3aXRoIHRleHQgb25seS5cIjtcblxuLy8gY29kZXjqsIAg66ekIOyalOyyreyXkCDsnpDrj5kg7KO87J6F7ZWY64qUIOuCtOyepSB0b29sKHNoZWxsL3dlYl9zZWFyY2gvc3Bhd25fYWdlbnQg65OxIDE06rCcKeqzvFxuLy8gaW5zdHJ1Y3Rpb24g67iU66GdKHBlcm1pc3Npb25zL2Vudmlyb25tZW50X2NvbnRleHQvc2tpbGxzLCB+MTBLQinsnYQg67mE7Zmc7ISx7ZmUXG4vLyAkQ09ERVhfSE9NRS9jb25maWcudG9tbCDroZwg7I2o64Sj7Jy866m0IGNvZGV4IOu2gO2MhSDsi5wgc2NhblxuLy8g7Ya17KCc67aI6rCAOiB1cGRhdGVfcGxhbi9yZXF1ZXN0X3VzZXJfaW5wdXRcbmNvbnN0IENPREVYX0NPTkZJR19UT01MID0gYHdlYl9zZWFyY2ggPSBcImRpc2FibGVkXCJcbmluY2x1ZGVfcGVybWlzc2lvbnNfaW5zdHJ1Y3Rpb25zID0gZmFsc2VcbmluY2x1ZGVfYXBwc19pbnN0cnVjdGlvbnMgPSBmYWxzZVxuaW5jbHVkZV9lbnZpcm9ubWVudF9jb250ZXh0ID0gZmFsc2VcblxuW2ZlYXR1cmVzXVxuc2hlbGxfdG9vbCA9IGZhbHNlXG50b29sX3NlYXJjaCA9IGZhbHNlXG50b29sX3N1Z2dlc3QgPSBmYWxzZVxubXVsdGlfYWdlbnQgPSBmYWxzZVxuaW1hZ2VfZ2VuZXJhdGlvbiA9IGZhbHNlXG5hcHBzID0gZmFsc2VcbnBsdWdpbnMgPSBmYWxzZVxuXG5bdG9vbHNdXG52aWV3X2ltYWdlID0gZmFsc2VcblxuW3NraWxsc11cbmluY2x1ZGVfaW5zdHJ1Y3Rpb25zID0gZmFsc2VcbmA7XG5cbi8vIOKUgOKUgCBXb3JrZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBDb2RleEFwcFNlcnZlcldvcmtlciB7XG4gIHByaXZhdGUgcHJvYzogQ2hpbGRQcm9jZXNzIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcnBjOiBDb2RleFJwY0NsaWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvZGV4SG9tZTogc3RyaW5nO1xuICBwcml2YXRlIHJlc3RhcnRBdHRlbXB0cyA9IDA7XG4gIHByaXZhdGUgcmVhZHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBidXN5ID0gZmFsc2U7XG4gIHByaXZhdGUgYWN0aXZlVHVybkFib3J0PzogQWN0aXZlVHVybkFib3J0O1xuICBhY3RpdmUgPSB0cnVlO1xuICBvblJlYWR5PzogKCkgPT4gdm9pZDtcbiAgLy8gcmVzdGFydCDsi5wgcnBjIOqwneyytOqwgCDsg4jroZwg7IOd7ISx65CY66+A66GcLCDtlbjrk6Trn6zrpbwg67O06rSA7ZaI64uk6rCAIOunpCBzcGF3buuniOuLpCDsnqzrsJTsnbjrlKntlZzri6QuXG4gIHNlcnZlclJlcXVlc3RIYW5kbGVyPzogKG1ldGhvZDogc3RyaW5nLCBwYXJhbXM6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLy8gdGhyZWFkIOyerOyCrOyaqShwcm9tcHQgY2FjaGUpOiB3b3JrZXIg6rCAIOyDneyEse2VnCB0aHJlYWQg65Ok7J2YIOuplO2DgC5cbiAgLy8gZXBoZW1lcmFsIHRocmVhZCDripQg7J20IO2UhOuhnOyEuOyKpCDrqZTrqqjrpqzsl5Drp4wg7KG07J6s7ZWY66+A66GcIHJlc3RhcnQg7IucIOyghOu2gCDrrLTtmqguXG4gIHByaXZhdGUgdGhyZWFkTWV0YSA9IG5ldyBNYXA8c3RyaW5nLCB7IGxhc3RVc2VkQXQ6IG51bWJlciB9PigpO1xuICAvLyBzcGF3biDsubTsmrTthLAuIHJlc3RhcnQg66eI64ukIOymneqwgCDihpIgY29udiDtlbjrk6TsnZggZXBvY2gg7JmAIOuMgOyhsO2VtCBzdGFsZSB0aHJlYWQg6rCQ7KeALlxuICBwcml2YXRlIGVwb2NoQ291bnRlciA9IDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRIUkVBRF9JRExFX1RUTF9NUyA9IDEwICogNjBfMDAwO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfVEhSRUFEU19QRVJfV09SS0VSID0gMTY7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IFdvcmtlckNvbmZpZykge1xuICAgIGNvbnN0IHN1ZmZpeCA9IGNvbmZpZy53b3JrZXJJbmRleCAhPT0gdW5kZWZpbmVkID8gYC0ke2NvbmZpZy53b3JrZXJJbmRleH1gIDogXCJcIjtcbiAgICB0aGlzLmNvZGV4SG9tZSA9IGAvdG1wL3FncmlkLWNvZGV4LyR7Y29uZmlnLnRva2VuSWR9JHtzdWZmaXh9YDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBhc3luYyBzcGF3bkFuZEluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7IOIIGNvZGV4IO2UhOuhnOyEuOyKpCDihpIg6riw7KG0IGVwaGVtZXJhbCB0aHJlYWQg7KCE67aAIOustO2aqC4gZXBvY2gg7Kad6rCA66GcIHN0YWxlIOqwkOyngC5cbiAgICB0aGlzLmVwb2NoQ291bnRlcisrO1xuICAgIHRoaXMudGhyZWFkTWV0YS5jbGVhcigpO1xuICAgIGNvbnN0IGN3ZCA9IGAke3RoaXMuY29kZXhIb21lfS9jd2RgO1xuICAgIG1rZGlyU3luYyhjd2QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIC8vIGNvZGV4IOuCtOyepSB0b29sL3dlYl9zZWFyY2gvaW5zdHJ1Y3Rpb24g67iU66GdIOu5hO2ZnOyEse2ZlFxuICAgIHdyaXRlRmlsZVN5bmMoYCR7dGhpcy5jb2RleEhvbWV9L2NvbmZpZy50b21sYCwgQ09ERVhfQ09ORklHX1RPTUwpO1xuXG4gICAgdGhpcy5wcm9jID0gc3Bhd24oXCJjb2RleFwiLCBbXCJhcHAtc2VydmVyXCIsIFwiLS1saXN0ZW5cIiwgXCJzdGRpbzovL1wiXSwge1xuICAgICAgc3RkaW86IFtcInBpcGVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcbiAgICAgIGN3ZCxcbiAgICAgIGVudjoge1xuICAgICAgICBQQVRIOiBwcm9jZXNzLmVudi5QQVRILFxuICAgICAgICBUTVBESVI6IHByb2Nlc3MuZW52LlRNUERJUixcbiAgICAgICAgQ09ERVhfSE9NRTogdGhpcy5jb2RleEhvbWUsXG4gICAgICAgIC8vIGVudmlyb25tZW50IOu5hO2ZnOyEse2ZlCDihpIgaGFzX2Vudmlyb25tZW50PWZhbHNlIOKGkiBzaGVsbC9hcHBseV9wYXRjaC92aWV3X2ltYWdlIOygnOqxsFxuICAgICAgICBDT0RFWF9FWEVDX1NFUlZFUl9VUkw6IFwibm9uZVwiLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvYy5vbihcImV4aXRcIiwgKGNvZGUpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IGV4aXRlZCAoY29kZT0ke2NvZGV9KWApO1xuICAgICAgdGhpcy5mYWlsQWN0aXZlVHVybihcbiAgICAgICAgbmV3IEVycm9yKGBjb2RleCB3b3JrZXIgZXhpdGVkIHdoaWxlIHR1cm4gd2FzIHJ1bm5pbmcgKGNvZGU9JHtjb2RlID8/IFwidW5rbm93blwifSlgKSxcbiAgICAgICk7XG4gICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgICB0aGlzLnJwYyA9IG51bGw7XG4gICAgICB0aGlzLnByb2MgPSBudWxsO1xuICAgICAgaWYgKCF0aGlzLmRlc3Ryb3llZCkgdGhpcy5zY2hlZHVsZVJlc3RhcnQoKTtcbiAgICB9KTtcblxuICAgIHRoaXMucnBjID0gbmV3IENvZGV4UnBjQ2xpZW50KHRoaXMucHJvYyk7XG4gICAgLy8gcmVzdGFydCDtm4Tsl5Drj4QgcmVmcmVzaCBzZXJ2ZXItcmVxdWVzdCDtlbjrk6Trn6zrpbwg7Jyg7KeAICjsl4bsnLzrqbQgY29kZXgg7Yag7YGwIO2ajOyghCDsi6TtjKgg4oaSIHNlc3Npb24gZXhwaXJlZClcbiAgICB0aGlzLmJpbmRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcigpO1xuXG4gICAgYXdhaXQgdGhpcy5ycGMucmVxdWVzdChcImluaXRpYWxpemVcIiwge1xuICAgICAgY2xpZW50SW5mbzogeyBuYW1lOiBcInFncmlkXCIsIHZlcnNpb246IFwiMS4wLjBcIiB9LFxuICAgICAgY2FwYWJpbGl0aWVzOiB7IGV4cGVyaW1lbnRhbEFwaTogdHJ1ZSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB3YWl0Rm9yTG9naW5Db21wbGV0ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlamVjdChuZXcgRXJyb3IoXCJsb2dpbiB0aW1lb3V0XCIpKSwgMTIwXzAwMCk7XG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJhY2NvdW50L2xvZ2luL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIGlmIChwLnN1Y2Nlc3MpIHJlc29sdmUoKTtcbiAgICAgICAgZWxzZSByZWplY3QobmV3IEVycm9yKGBsb2dpbiBmYWlsZWQ6ICR7cC5lcnJvciA/PyBcInVua25vd25cIn1gKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zcGF3bkFuZEluaXQoKTtcblxuICAgIGF3YWl0IHRoaXMucnBjIS5yZXF1ZXN0KFwiYWNjb3VudC9sb2dpbi9zdGFydFwiLCB7XG4gICAgICB0eXBlOiBcImNoYXRncHRBdXRoVG9rZW5zXCIsXG4gICAgICBhY2Nlc3NUb2tlbjogdGhpcy5jb25maWcuYWNjZXNzVG9rZW4sXG4gICAgICBjaGF0Z3B0QWNjb3VudElkOiB0aGlzLmNvbmZpZy5hY2NvdW50SWQsXG4gICAgICAuLi4odGhpcy5jb25maWcucGxhblR5cGUgPyB7IGNoYXRncHRQbGFuVHlwZTogdGhpcy5jb25maWcucGxhblR5cGUgfSA6IHt9KSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMud2FpdEZvckxvZ2luQ29tcGxldGVkKCk7XG4gICAgdGhpcy5yZWFkeSA9IHRydWU7XG4gICAgdGhpcy5yZXN0YXJ0QXR0ZW1wdHMgPSAwO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRCcm93c2VyTG9naW4oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCB0aGlzLnNwYXduQW5kSW5pdCgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnBjIS5yZXF1ZXN0PHsgYXV0aFVybDogc3RyaW5nIH0+KFwiYWNjb3VudC9sb2dpbi9zdGFydFwiLCB7XG4gICAgICB0eXBlOiBcImNoYXRncHRcIixcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSBicm93c2VyIGxvZ2luIHN0YXJ0ZWRgKTtcbiAgICByZXR1cm4gcmVzdWx0LmF1dGhVcmw7XG4gIH1cblxuICBhc3luYyB3YWl0Rm9yQnJvd3NlckxvZ2luQ29tcGxldGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTG9naW5Db21wbGV0ZWQoKTtcbiAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cyA9IDA7XG4gICAgbG9nZ2VyLmluZm8oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gYnJvd3NlciBsb2dpbiBjb21wbGV0ZWRgKTtcbiAgfVxuXG4gIGFzeW5jIHJlYWRNYW5hZ2VkQ3JlZGVudGlhbHMoKTogUHJvbWlzZTx7XG4gICAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgICBpZFRva2VuPzogc3RyaW5nO1xuICAgIGFjY291bnRJZDogc3RyaW5nO1xuICB9IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhgJHt0aGlzLmNvZGV4SG9tZX0vYXV0aC5qc29uYCwgXCJ1dGYtOFwiKSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY2Nlc3NUb2tlbjogcmF3LnRva2Vucz8uYWNjZXNzX3Rva2VuID8/IFwiXCIsXG4gICAgICAgIHJlZnJlc2hUb2tlbjogcmF3LnRva2Vucz8ucmVmcmVzaF90b2tlbiA/PyBcIlwiLFxuICAgICAgICBpZFRva2VuOiByYXcudG9rZW5zPy5pZF90b2tlbixcbiAgICAgICAgYWNjb3VudElkOiByYXcudG9rZW5zPy5hY2NvdW50X2lkID8/IFwiXCIsXG4gICAgICB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMga2lsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgIHRoaXMuZmFpbEFjdGl2ZVR1cm4obmV3IEVycm9yKFwiY29kZXggd29ya2VyIHN0b3BwZWRcIikpO1xuICAgIHRoaXMucnBjPy5kZXN0cm95KCk7XG5cbiAgICBpZiAodGhpcy5wcm9jKSB7XG4gICAgICB0aGlzLnByb2Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucHJvYz8ua2lsbChcIlNJR0tJTExcIik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LCAzXzAwMCk7XG4gICAgICAgIHRoaXMucHJvYyEub24oXCJleGl0XCIsICgpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcm1TeW5jKHRoaXMuY29kZXhIb21lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgZ2V0IGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkgJiYgIXRoaXMuZGVzdHJveWVkO1xuICB9XG4gIGdldCBpc0Rlc3Ryb3llZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95ZWQ7XG4gIH1cbiAgZ2V0IHRva2VuSWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudG9rZW5JZDtcbiAgfVxuICBnZXQgd29ya2VySW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcud29ya2VySW5kZXggPz8gMDtcbiAgfVxuICBnZXQgdG9rZW5OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnRva2VuTmFtZTtcbiAgfVxuXG4gIGNhblJldXNlRm9yVG9rZW4oX3Rva2VuTmFtZTogc3RyaW5nLCBjcmVkZW50aWFsczogUmVmcmVzaGFibGVXb3JrZXJDcmVkZW50aWFscyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbmZpZy5hY2NvdW50SWQgPT09IGNyZWRlbnRpYWxzLmFjY291bnRJZCAmJlxuICAgICAgKHRoaXMuY29uZmlnLnBsYW5UeXBlID8/IHVuZGVmaW5lZCkgPT09IChjcmVkZW50aWFscy5wbGFuVHlwZSA/PyB1bmRlZmluZWQpXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZVRva2VuU3RhdGUodG9rZW5OYW1lOiBzdHJpbmcsIGNyZWRlbnRpYWxzOiBSZWZyZXNoYWJsZVdvcmtlckNyZWRlbnRpYWxzKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcudG9rZW5OYW1lID0gdG9rZW5OYW1lO1xuICAgIHRoaXMuY29uZmlnLmFjY2Vzc1Rva2VuID0gY3JlZGVudGlhbHMuYWNjZXNzVG9rZW47XG4gICAgdGhpcy5jb25maWcuYWNjb3VudElkID0gY3JlZGVudGlhbHMuYWNjb3VudElkO1xuICAgIGlmIChjcmVkZW50aWFscy5wbGFuVHlwZSkge1xuICAgICAgdGhpcy5jb25maWcucGxhblR5cGUgPSBjcmVkZW50aWFscy5wbGFuVHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMuY29uZmlnLnBsYW5UeXBlO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBSYXRlIGxpbWl0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBnZXRSYXRlTGltaXRzKCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHRocm93IG5ldyBFcnJvcihcIndvcmtlciBub3QgcmVhZHlcIik7XG4gICAgcmV0dXJuIHRoaXMucnBjLnJlcXVlc3QoXCJhY2NvdW50L3JhdGVMaW1pdHMvcmVhZFwiLCB7fSk7XG4gIH1cblxuICAvLyDilIDilIAgU2VydmVyLXJlcXVlc3QgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBzZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihoYW5kbGVyOiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuc2VydmVyUmVxdWVzdEhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG4gIH1cblxuICAvLyBzcGF3bkFuZEluaXTsl5DshJwgcnBjIOyDneyEsSDsp4Htm4Qg7Zi47LacLiByZXN0YXJ066GcIHJwY+qwgCDsg4jroZwg66eM65Ok7Ja07KC464+EIO2VuOuTpOufrOqwgCDsnKDsp4DrkJzri6QuXG4gIGJpbmRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcigpOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5zZXJ2ZXJSZXF1ZXN0SGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHJldHVybjtcbiAgICB0aGlzLnJwYz8ub25TZXJ2ZXJSZXF1ZXN0KFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIChwYXJhbXMpID0+XG4gICAgICBoYW5kbGVyKFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIHBhcmFtcyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUdXJuIGV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICB0cnlBY3F1aXJlVHVybigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5idXN5KSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZWxlYXNlVHVybigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgfVxuICBnZXQgaGFzQ2FwYWNpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmJ1c3k7XG4gIH1cblxuICAvLyDsg4ggdGhyZWFkIOyDneyEsSAodGhyZWFkL3N0YXJ0ICsg7ZWE7JqUIOyLnCBoaXN0b3J5IGluamVjdCkuIOyyqyB0dXJuIC8g7Y+067CxIOqyveuhnOyaqS5cbiAgLy8g7ZuE7IaNIHR1cm4g7J2AIGNyZWF0ZVRocmVhZCDsl4bsnbQgc3RhcnRUdXJuT25UaHJlYWQg66eMIO2YuOy2nO2VtCBjb252ZXJzYXRpb25faWQg66W8IOqzoOygle2VnOuLpC5cbiAgLy8gdGhyZWFkIOydmCDquLDrs7ggbW9kZWwg64+EIOuwmO2ZmCAocmVxLm1vZGVsIOuvuOyngOyglSDsi5wgZmFsbGJhY2spLlxuICBhc3luYyBjcmVhdGVUaHJlYWQocmVxOiBUdXJuUmVxdWVzdCk6IFByb21pc2U8eyB0aHJlYWRJZDogc3RyaW5nOyBtb2RlbDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuICAgIHRoaXMuc3dlZXBJZGxlVGhyZWFkcygpO1xuXG4gICAgY29uc3QgdGhyZWFkQ29uZmlnOiBUaHJlYWRTdGFydFBhcmFtc1tcImNvbmZpZ1wiXSA9IHtcbiAgICAgIC4uLlRIUkVBRF9ERUZBVUxUUy5jb25maWcsXG4gICAgICAuLi4ocmVxLnZlcmJvc2l0eSA/IHsgbW9kZWxfdmVyYm9zaXR5OiByZXEudmVyYm9zaXR5IH0gOiB7fSksXG4gICAgfTtcbiAgICBjb25zdCB7IHRocmVhZCwgbW9kZWw6IHRocmVhZE1vZGVsIH0gPSBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0PFRocmVhZFN0YXJ0UmVzcG9uc2U+KFxuICAgICAgXCJ0aHJlYWQvc3RhcnRcIixcbiAgICAgIHtcbiAgICAgICAgZXBoZW1lcmFsOiB0cnVlLFxuICAgICAgICBjd2Q6IGAke3RoaXMuY29kZXhIb21lfS9jd2RgLFxuICAgICAgICBiYXNlSW5zdHJ1Y3Rpb25zOiBCQVNFX0lOU1RSVUNUSU9OUyxcbiAgICAgICAgZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zOiByZXEuZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zID8/IFwiXCIsXG4gICAgICAgIHNhbmRib3g6IFRIUkVBRF9ERUZBVUxUUy5zYW5kYm94LFxuICAgICAgICBhcHByb3ZhbFBvbGljeTogVEhSRUFEX0RFRkFVTFRTLmFwcHJvdmFsUG9saWN5LFxuICAgICAgICBjb25maWc6IHRocmVhZENvbmZpZyxcbiAgICAgIH0gc2F0aXNmaWVzIFBhcnRpYWw8VGhyZWFkU3RhcnRQYXJhbXM+LFxuICAgICk7XG5cbiAgICBjb25zdCB0aHJlYWRJZCA9IHRocmVhZC5pZDtcbiAgICBpZiAocmVxLmhpc3Rvcnk/Lmxlbmd0aCkge1xuICAgICAgYXdhaXQgdGhpcy5ycGMucmVxdWVzdChcInRocmVhZC9pbmplY3RfaXRlbXNcIiwge1xuICAgICAgICB0aHJlYWRJZCxcbiAgICAgICAgaXRlbXM6IHJlcS5oaXN0b3J5LFxuICAgICAgfSBzYXRpc2ZpZXMgVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXMpO1xuICAgIH1cbiAgICB0aGlzLnRocmVhZE1ldGEuc2V0KHRocmVhZElkLCB7IGxhc3RVc2VkQXQ6IERhdGUubm93KCkgfSk7XG5cbiAgICByZXR1cm4geyB0aHJlYWRJZCwgbW9kZWw6IHJlcS5tb2RlbCA/PyB0aHJlYWRNb2RlbCB9O1xuICB9XG5cbiAgLy8g6riw7KG0IHRocmVhZCDsl5AgdHVybiDrp4wg7Iuk7ZaJIChpbmplY3Qg7JeG7J2MKS4gY29udmVyc2F0aW9uX2lkIOycoOyngCDihpIgcHJvbXB0IGNhY2hlIOyggeykkS5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydFR1cm5PblRocmVhZCh0aHJlYWRJZDogc3RyaW5nLCByZXE6IFR1cm5SZXF1ZXN0KTogUHJvbWlzZTx7IHR1cm5JZDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuXG4gICAgY29uc3QgeyB0dXJuIH0gPSBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0PFR1cm5TdGFydFJlc3BvbnNlPihcInR1cm4vc3RhcnRcIiwge1xuICAgICAgdGhyZWFkSWQsXG4gICAgICBpbnB1dDogcmVxLmlucHV0LFxuICAgICAgLi4uKHJlcS5vdXRwdXRTY2hlbWEgPyB7IG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5lZmZvcnQgPyB7IGVmZm9ydDogcmVxLmVmZm9ydCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5tb2RlbCA/IHsgbW9kZWw6IHJlcS5tb2RlbCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5yZWFzb25pbmdTdW1tYXJ5ID8geyBzdW1tYXJ5OiByZXEucmVhc29uaW5nU3VtbWFyeSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5zZXJ2aWNlVGllciA/IHsgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllciB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnRocmVhZE1ldGEuZ2V0KHRocmVhZElkKTtcbiAgICBpZiAobWV0YSkgbWV0YS5sYXN0VXNlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4geyB0dXJuSWQ6IHR1cm4uaWQgfTtcbiAgfVxuXG4gIC8vIGV4aXN0aW5nVGhyZWFkSWQg7J6I7Jy866m0IOq3uCB0aHJlYWQg7J6s7IKs7JqpKO2bhOyGjSB0dXJuKSwg7JeG7Jy866m0IOyDiCB0aHJlYWQg7IOd7ISxKOyyqyB0dXJuKS5cbiAgLy8g7Zi47LacIO2bhCDsgqzsmqntlZwgdGhyZWFkSWQg66W8IOuwmO2ZmO2VtCBkaXNwYXRjaGVyIOqwgCBjb252IO2VuOuTpOydhCDrsJzquIntlZzri6QuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuKFxuICAgIHJlcTogVHVyblJlcXVlc3QsXG4gICAgZXhpc3RpbmdUaHJlYWRJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxUdXJuUmVzdWx0ICYgeyB0aHJlYWRJZDogc3RyaW5nIH0+IHtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBsZXQgbW9kZWw6IHN0cmluZztcbiAgICBpZiAoZXhpc3RpbmdUaHJlYWRJZCkge1xuICAgICAgdGhyZWFkSWQgPSBleGlzdGluZ1RocmVhZElkO1xuICAgICAgbW9kZWwgPSByZXEubW9kZWwgPz8gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgdGhyZWFkSWQsIG1vZGVsIH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVRocmVhZChyZXEpKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zdGFydFR1cm5PblRocmVhZCh0aHJlYWRJZCwgcmVxKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNvbnN1bWVUdXJuTm90aWZpY2F0aW9ucyh0aHJlYWRJZCwgbW9kZWwpO1xuICAgIHJldHVybiB7IC4uLnJlc3VsdCwgdGhyZWFkSWQgfTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuU3RyZWFtKFxuICAgIHJlcTogVHVyblJlcXVlc3QsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrcyxcbiAgICBleGlzdGluZ1RocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgdGhyZWFkSWQ6IHN0cmluZyB9PiB7XG4gICAgbGV0IHRocmVhZElkOiBzdHJpbmc7XG4gICAgbGV0IG1vZGVsOiBzdHJpbmc7XG4gICAgaWYgKGV4aXN0aW5nVGhyZWFkSWQpIHtcbiAgICAgIHRocmVhZElkID0gZXhpc3RpbmdUaHJlYWRJZDtcbiAgICAgIG1vZGVsID0gcmVxLm1vZGVsID8/IFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgICh7IHRocmVhZElkLCBtb2RlbCB9ID0gYXdhaXQgdGhpcy5jcmVhdGVUaHJlYWQocmVxKSk7XG4gICAgfVxuICAgIGNvbnN0IHsgdHVybklkIH0gPSBhd2FpdCB0aGlzLnN0YXJ0VHVybk9uVGhyZWFkKHRocmVhZElkLCByZXEpO1xuICAgIGNiLm9uVGhyZWFkSWQ/Lih0aHJlYWRJZCk7XG4gICAgY2Iub25UdXJuSWQ/Lih0dXJuSWQpO1xuICAgIGF3YWl0IHRoaXMuY29uc3VtZVN0cmVhbU5vdGlmaWNhdGlvbnModGhyZWFkSWQsIG1vZGVsLCBjYik7XG4gICAgcmV0dXJuIHsgdGhyZWFkSWQgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0aHJlYWQg7J6s7IKs7JqpIOyngOybkCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXQgZXBvY2goKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lcG9jaENvdW50ZXI7XG4gIH1cblxuICBoYXNUaHJlYWQodGhyZWFkSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRocmVhZE1ldGEuaGFzKHRocmVhZElkKTtcbiAgfVxuXG4gIC8vIGlkbGUgVFRMIOy0iOqzvCAvIOqwnOyImCDsg4HtlZwg7LSI6rO8IHRocmVhZCDrpbwg7KCV66asLiBjcmVhdGVUaHJlYWQg7KeB7KCEIGxhenkg7Zi47LacLlxuICAvLyBjb2RleCBlcGhlbWVyYWwgdGhyZWFkIOuKlCDrqoXsi5zsoIEgY2xvc2UgUlBDIOyXhuydtCDrp7Xsl5DshJwg7KCc6rGwIOKGkiDrjZQg7J207IOBIHR1cm4g7JWIIOuztOuDhC5cbiAgc3dlZXBJZGxlVGhyZWFkcygpOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgW2lkLCBtZXRhXSBvZiB0aGlzLnRocmVhZE1ldGEpIHtcbiAgICAgIGlmIChub3cgLSBtZXRhLmxhc3RVc2VkQXQgPiBDb2RleEFwcFNlcnZlcldvcmtlci5USFJFQURfSURMRV9UVExfTVMpIHtcbiAgICAgICAgdGhpcy50aHJlYWRNZXRhLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNyZWF0ZVRocmVhZCDsp4HsoIQg7Zi47LacIOKGkiDsg4ggdGhyZWFkIDEg6rCc6rCAIOqzpyDstpTqsIDrkJzri6QuIOy2lOqwgCDtm4Tsl5Drj4QgTUFYIOulvCDrhJjsp4Ag7JWK64+E66GdXG4gICAgLy8gTUFYLTEg7J207ZWY66GcIOykhOyXrCDrkZTri6Qo6re4656Y7JW8IOyDneyEsSDsp4Htm4Qg7KCV7ZmV7Z6IIE1BWCkuIExSVTogbGFzdFVzZWRBdCDsmKTrpoTssKjsiJzsnLzroZwg7KCc6rGwLlxuICAgIGNvbnN0IGxpbWl0ID0gQ29kZXhBcHBTZXJ2ZXJXb3JrZXIuTUFYX1RIUkVBRFNfUEVSX1dPUktFUiAtIDE7XG4gICAgaWYgKHRoaXMudGhyZWFkTWV0YS5zaXplID4gbGltaXQpIHtcbiAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi50aGlzLnRocmVhZE1ldGEuZW50cmllcygpXS50b1NvcnRlZChcbiAgICAgICAgKGEsIGIpID0+IGFbMV0ubGFzdFVzZWRBdCAtIGJbMV0ubGFzdFVzZWRBdCxcbiAgICAgICk7XG4gICAgICBjb25zdCBvdmVyID0gdGhpcy50aHJlYWRNZXRhLnNpemUgLSBsaW1pdDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3ZlcjsgaSsrKSB0aGlzLnRocmVhZE1ldGEuZGVsZXRlKHNvcnRlZFtpXSFbMF0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGludGVycnVwdFR1cm4odGhyZWFkSWQ6IHN0cmluZywgdHVybklkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucnBjLnJlcXVlc3QoXCJ0dXJuL2ludGVycnVwdFwiLCB7IHRocmVhZElkLCB0dXJuSWQgfSk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgcHJpdmF0ZSBmYWlsQWN0aXZlVHVybihlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgICBjb25zdCBhYm9ydCA9IHRoaXMuYWN0aXZlVHVybkFib3J0O1xuICAgIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gdW5kZWZpbmVkO1xuICAgIGFib3J0Py4oZXJyb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdW1lVHVybk5vdGlmaWNhdGlvbnModGhyZWFkSWQ6IHN0cmluZywgbW9kZWw6IHN0cmluZyk6IFByb21pc2U8VHVyblJlc3VsdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUdXJuUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgbGV0IGFib3J0OiBBY3RpdmVUdXJuQWJvcnQ7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoXCJ0dXJuIHRpbWVvdXQgKDYwMHMpXCIpKTtcbiAgICAgIH0sIDYwMF8wMDApO1xuXG4gICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICBsZXQgdXNhZ2U6IFRva2VuVXNhZ2VCcmVha2Rvd24gPSB7XG4gICAgICAgIHRvdGFsVG9rZW5zOiAwLFxuICAgICAgICBpbnB1dFRva2VuczogMCxcbiAgICAgICAgb3V0cHV0VG9rZW5zOiAwLFxuICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogMCxcbiAgICAgICAgcmVhc29uaW5nT3V0cHV0VG9rZW5zOiAwLFxuICAgICAgfTtcbiAgICAgIGxldCBkdXJhdGlvbk1zID0gMDtcblxuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVUdXJuQWJvcnQgPT09IGFib3J0KSB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIFtcbiAgICAgICAgICBcIml0ZW0vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLFxuICAgICAgICAgIFwidHVybi9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIixcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIF0gYXMgY29uc3QpIHtcbiAgICAgICAgICB0aGlzLnJwYz8ub25Ob3RpZmljYXRpb24obiwgKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoUmVzdWx0ID0gKHJlc3VsdDogVHVyblJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9O1xuXG4gICAgICBhYm9ydCA9IGZpbmlzaFdpdGhFcnJvcjtcbiAgICAgIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gYWJvcnQ7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC5pdGVtLnR5cGUgPT09IFwiYWdlbnRNZXNzYWdlXCIpIHRleHQgPSBwLml0ZW0udGV4dDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJ0aHJlYWQvdG9rZW5Vc2FnZS91cGRhdGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOyLnCAudG90YWwg7J2AIOuMgO2ZlCDsoITssrQg64iE7KCB7J206528LCBjb2xkIOyYgOuNmCDsnbTsoIQgdHVybiDquYzsp4Ag7ISe7JesXG4gICAgICAgIC8vIOydtCDsmpTssq0g7J6Q7LK07J2YIGNhY2hlIOyggeykkeuloOydtCDtnazshJ3rkJzri6Qo7JiIOiB0dXJuMSBjb2xkIDAlICsgdHVybjIgOTAlIOKGkiA0OCUg66GcIOq4sOuhnSkuXG4gICAgICAgIC8vIC5sYXN0IOuKlCDsnbTrsoggdHVybiDrp4zsnZggdXNhZ2Ug6528IHJlcXVlc3RfbG9nIOqwgCDqt7gg7JqU7LKt7J2YIOyLpOygnCDthqDtgbDsnYQg7KCV7ZmV7Z6IIOuwmOyYge2VnOuLpC5cbiAgICAgICAgdXNhZ2UgPSBwLnRva2VuVXNhZ2UubGFzdDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJ0dXJuL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgZHVyYXRpb25NcyA9IHAudHVybi5kdXJhdGlvbk1zID8/IDA7XG4gICAgICAgIGlmIChwLnR1cm4uc3RhdHVzID09PSBcImNvbXBsZXRlZFwiKSBmaW5pc2hXaXRoUmVzdWx0KHsgdGV4dCwgdXNhZ2UsIGR1cmF0aW9uTXMsIG1vZGVsIH0pO1xuICAgICAgICBlbHNlIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoYHR1cm4gZmFpbGVkOiAke0pTT04uc3RyaW5naWZ5KHAudHVybi5lcnJvcil9YCkpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImVycm9yXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXAud2lsbFJldHJ5KSB7XG4gICAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihgY29kZXggZXJyb3I6ICR7cC5lcnJvci5tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVTdHJlYW1Ob3RpZmljYXRpb25zKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgbW9kZWw6IHN0cmluZyxcbiAgICBjYjogU3RyZWFtQ2FsbGJhY2tzLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGxldCBhYm9ydDogQWN0aXZlVHVybkFib3J0O1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKFwidHVybiB0aW1lb3V0ICg2MDBzKVwiKSk7XG4gICAgICB9LCA2MDBfMDAwKTtcblxuICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgbGV0IHVzYWdlOiBUb2tlblVzYWdlQnJlYWtkb3duID0ge1xuICAgICAgICB0b3RhbFRva2VuczogMCxcbiAgICAgICAgaW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIG91dHB1dFRva2VuczogMCxcbiAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAsXG4gICAgICAgIHJlYXNvbmluZ091dHB1dFRva2VuczogMCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlVHVybkFib3J0ID09PSBhYm9ydCkgdGhpcy5hY3RpdmVUdXJuQWJvcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBbXG4gICAgICAgICAgXCJpdGVtL2NvbXBsZXRlZFwiLFxuICAgICAgICAgIFwiaXRlbS9hZ2VudE1lc3NhZ2UvZGVsdGFcIixcbiAgICAgICAgICBcInR1cm4vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJ0aHJlYWQvdG9rZW5Vc2FnZS91cGRhdGVkXCIsXG4gICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICBdIGFzIGNvbnN0KSB7XG4gICAgICAgICAgdGhpcy5ycGM/Lm9uTm90aWZpY2F0aW9uKG4sICgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgZmluaXNoV2l0aEVycm9yID0gKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICBjYi5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmlzaFdpdGhDb21wbGV0ZSA9IChyZXN1bHQ6IFR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgY2Iub25Db21wbGV0ZShyZXN1bHQpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBhYm9ydCA9IGZpbmlzaFdpdGhFcnJvcjtcbiAgICAgIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gYWJvcnQ7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vYWdlbnRNZXNzYWdlL2RlbHRhXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICB0ZXh0ICs9IHAuZGVsdGE7XG4gICAgICAgIGNiLm9uRGVsdGEocC5kZWx0YSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9jb21wbGV0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmIChwLml0ZW0udHlwZSA9PT0gXCJhZ2VudE1lc3NhZ2VcIikgdGV4dCA9IHAuaXRlbS50ZXh0O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIC8vIHRocmVhZCDsnqzsgqzsmqkg7IucIC50b3RhbCDsnYAg64yA7ZmUIOyghOyytCDriITsoIHsnbTrnbwsIGNvbGQg7JiA642YIOydtOyghCB0dXJuIOq5jOyngCDshJ7sl6xcbiAgICAgICAgLy8g7J20IOyalOyyrSDsnpDssrTsnZggY2FjaGUg7KCB7KSR66Wg7J20IO2drOyEneuQnOuLpCjsmIg6IHR1cm4xIGNvbGQgMCUgKyB0dXJuMiA5MCUg4oaSIDQ4JSDroZwg6riw66GdKS5cbiAgICAgICAgLy8gLmxhc3Qg64qUIOydtOuyiCB0dXJuIOunjOydmCB1c2FnZSDrnbwgcmVxdWVzdF9sb2cg6rCAIOq3uCDsmpTssq3snZgg7Iuk7KCcIO2GoO2BsOydhCDsoJXtmZXtnogg67CY7JiB7ZWc64ukLlxuICAgICAgICB1c2FnZSA9IHAudG9rZW5Vc2FnZS5sYXN0O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInR1cm4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC50dXJuLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgIGZpbmlzaFdpdGhDb21wbGV0ZSh7IHRleHQsIHVzYWdlLCBkdXJhdGlvbk1zOiBwLnR1cm4uZHVyYXRpb25NcyA/PyAwLCBtb2RlbCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKGB0dXJuICR7cC50dXJuLnN0YXR1c306ICR7SlNPTi5zdHJpbmdpZnkocC50dXJuLmVycm9yKX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJlcnJvclwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgaWYgKCFwLndpbGxSZXRyeSkge1xuICAgICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoYGNvZGV4IGVycm9yOiAke3AuZXJyb3IubWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlc3RhcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlc3RhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWVkIHx8IHRoaXMucmVzdGFydEF0dGVtcHRzID49IE1BWF9SRVNUQVJUX0FUVEVNUFRTKSB7XG4gICAgICBpZiAodGhpcy5yZXN0YXJ0QXR0ZW1wdHMgPj0gTUFYX1JFU1RBUlRfQVRURU1QVFMpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gbWF4IHJlc3RhcnQgYXR0ZW1wdHMgcmVhY2hlZGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVzdGFydEF0dGVtcHRzKys7XG4gICAgY29uc3QgYmFzZURlbGF5ID0gUkVTVEFSVF9CQUNLT0ZGX0JBU0VfTVMgKiAyICoqICh0aGlzLnJlc3RhcnRBdHRlbXB0cyAtIDEpO1xuICAgIGNvbnN0IHN0YWdnZXIgPSAodGhpcy5jb25maWcud29ya2VySW5kZXggPz8gMCkgKiAyXzAwMDtcbiAgICBjb25zdCBkZWxheSA9IGJhc2VEZWxheSArIHN0YWdnZXI7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfVske3RoaXMuY29uZmlnLndvcmtlckluZGV4ID8/IDB9XSByZXN0YXJ0aW5nIGluICR7ZGVsYXl9bXMgKGF0dGVtcHQgJHt0aGlzLnJlc3RhcnRBdHRlbXB0c30pYCxcbiAgICApO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpXG4gICAgICAgIC50aGVuKCgpID0+IHRoaXMub25SZWFkeT8uKCkpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IHJlc3RhcnQgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGVSZXN0YXJ0KCk7XG4gICAgICAgIH0pO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFjQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsZUFBZSxDQUFDO0FBRW5ELE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0sMEJBQTBCO0FBc0NoQyxNQUFNLGtCQUFrQjtDQUN0QixTQUFTO0NBQ1QsZ0JBQWdCO0NBQ2hCLFFBQVEsRUFDTixNQUFNLEVBQUUsVUFBVTtFQUFFLFNBQVM7RUFBTyxxQkFBcUI7RUFBTyxvQkFB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
507
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZXgtd29ya2VyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL2NvZGV4LXdvcmtlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgdHlwZSBDaGlsZFByb2Nlc3MgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgdHlwZSBUaHJlYWRJbmplY3RJdGVtc1BhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRJbmplY3RJdGVtc1BhcmFtc1wiO1xuaW1wb3J0IHsgdHlwZSBUaHJlYWRTdGFydFBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UaHJlYWRTdGFydFBhcmFtc1wiO1xuaW1wb3J0IHsgdHlwZSBUaHJlYWRTdGFydFJlc3BvbnNlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3YyL1RocmVhZFN0YXJ0UmVzcG9uc2VcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5Vc2FnZUJyZWFrZG93biB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Ub2tlblVzYWdlQnJlYWtkb3duXCI7XG5pbXBvcnQgeyB0eXBlIFR1cm5TdGFydFBhcmFtcyB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9UdXJuU3RhcnRQYXJhbXNcIjtcbmltcG9ydCB7IHR5cGUgVHVyblN0YXJ0UmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVHVyblN0YXJ0UmVzcG9uc2VcIjtcbmltcG9ydCB7IHR5cGUgU3RyZWFtQ2FsbGJhY2tzIGFzIENvbW1vblN0cmVhbUNhbGxiYWNrcyB9IGZyb20gXCIuLi9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgY3JlYXRlVHRmdFRyYWNrZXIgfSBmcm9tIFwiLi4vY29tbW9uL3R0ZnRcIjtcbmltcG9ydCB7IENvZGV4UnBjQ2xpZW50IH0gZnJvbSBcIi4vY29kZXgtcnBjXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcImNvZGV4LXdvcmtlclwiXSk7XG5cbmNvbnN0IE1BWF9SRVNUQVJUX0FUVEVNUFRTID0gMztcbmNvbnN0IFJFU1RBUlRfQkFDS09GRl9CQVNFX01TID0gMV8wMDA7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZXJDb25maWcge1xuICB0b2tlbklkOiBudW1iZXI7XG4gIHRva2VuTmFtZTogc3RyaW5nO1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBhY2NvdW50SWQ6IHN0cmluZztcbiAgcGxhblR5cGU/OiBzdHJpbmc7XG4gIHdvcmtlckluZGV4PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR1cm5SZXF1ZXN0IHtcbiAgaW5wdXQ6IFR1cm5TdGFydFBhcmFtc1tcImlucHV0XCJdO1xuICBvdXRwdXRTY2hlbWE/OiBUdXJuU3RhcnRQYXJhbXNbXCJvdXRwdXRTY2hlbWFcIl07XG4gIGVmZm9ydD86IHN0cmluZztcbiAgbW9kZWw/OiBzdHJpbmc7XG4gIGRldmVsb3Blckluc3RydWN0aW9ucz86IHN0cmluZztcbiAgaGlzdG9yeT86IFRocmVhZEluamVjdEl0ZW1zUGFyYW1zW1wiaXRlbXNcIl07XG4gIHZlcmJvc2l0eT86IHN0cmluZztcbiAgcmVhc29uaW5nU3VtbWFyeT86IHN0cmluZztcbiAgc2VydmljZVRpZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHVyblJlc3VsdCB7XG4gIHRleHQ6IHN0cmluZztcbiAgdXNhZ2U6IFRva2VuVXNhZ2VCcmVha2Rvd247XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgdHRmdE1zOiBudW1iZXIgfCBudWxsO1xuICBtb2RlbDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBTdHJlYW1DYWxsYmFja3MgPSBDb21tb25TdHJlYW1DYWxsYmFja3M8VHVyblJlc3VsdD47XG5cbnR5cGUgUmVmcmVzaGFibGVXb3JrZXJDcmVkZW50aWFscyA9IFBpY2s8V29ya2VyQ29uZmlnLCBcImFjY2Vzc1Rva2VuXCIgfCBcImFjY291bnRJZFwiIHwgXCJwbGFuVHlwZVwiPjtcbnR5cGUgQWN0aXZlVHVybkFib3J0ID0gKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcblxuLy8gdGhyZWFkL3N0YXJ0IOqzte2GtSDsmLXshZhcbmNvbnN0IFRIUkVBRF9ERUZBVUxUUyA9IHtcbiAgc2FuZGJveDogXCJyZWFkLW9ubHlcIixcbiAgYXBwcm92YWxQb2xpY3k6IFwibmV2ZXJcIixcbiAgY29uZmlnOiB7XG4gICAgYXBwczogeyBfZGVmYXVsdDogeyBlbmFibGVkOiBmYWxzZSwgZGVzdHJ1Y3RpdmVfZW5hYmxlZDogZmFsc2UsIG9wZW5fd29ybGRfZW5hYmxlZDogZmFsc2UgfSB9LFxuICB9LFxufSBzYXRpc2ZpZXMgUGFydGlhbDxUaHJlYWRTdGFydFBhcmFtcz47XG5cbmNvbnN0IEJBU0VfSU5TVFJVQ1RJT05TID1cbiAgXCJZb3UgYXJlIGEgaGVscGZ1bCBhc3Npc3RhbnQuIERvIG5vdCB1c2UgYW55IHRvb2xzIHN1Y2ggYXMgc2hlbGwsIGZpbGUgb3BlcmF0aW9ucywgb3Igd2ViIHNlYXJjaC4gUmVzcG9uZCB3aXRoIHRleHQgb25seS5cIjtcblxuLy8gY29kZXjqsIAg66ekIOyalOyyreyXkCDsnpDrj5kg7KO87J6F7ZWY64qUIOuCtOyepSB0b29sKHNoZWxsL3dlYl9zZWFyY2gvc3Bhd25fYWdlbnQg65OxIDE06rCcKeqzvFxuLy8gaW5zdHJ1Y3Rpb24g67iU66GdKHBlcm1pc3Npb25zL2Vudmlyb25tZW50X2NvbnRleHQvc2tpbGxzLCB+MTBLQinsnYQg67mE7Zmc7ISx7ZmUXG4vLyAkQ09ERVhfSE9NRS9jb25maWcudG9tbCDroZwg7I2o64Sj7Jy866m0IGNvZGV4IOu2gO2MhSDsi5wgc2NhblxuLy8g7Ya17KCc67aI6rCAOiB1cGRhdGVfcGxhbi9yZXF1ZXN0X3VzZXJfaW5wdXRcbmNvbnN0IENPREVYX0NPTkZJR19UT01MID0gYHdlYl9zZWFyY2ggPSBcImRpc2FibGVkXCJcbmluY2x1ZGVfcGVybWlzc2lvbnNfaW5zdHJ1Y3Rpb25zID0gZmFsc2VcbmluY2x1ZGVfYXBwc19pbnN0cnVjdGlvbnMgPSBmYWxzZVxuaW5jbHVkZV9lbnZpcm9ubWVudF9jb250ZXh0ID0gZmFsc2VcblxuW2ZlYXR1cmVzXVxuc2hlbGxfdG9vbCA9IGZhbHNlXG50b29sX3NlYXJjaCA9IGZhbHNlXG50b29sX3N1Z2dlc3QgPSBmYWxzZVxubXVsdGlfYWdlbnQgPSBmYWxzZVxuaW1hZ2VfZ2VuZXJhdGlvbiA9IGZhbHNlXG5hcHBzID0gZmFsc2VcbnBsdWdpbnMgPSBmYWxzZVxuXG5bdG9vbHNdXG52aWV3X2ltYWdlID0gZmFsc2VcblxuW3NraWxsc11cbmluY2x1ZGVfaW5zdHJ1Y3Rpb25zID0gZmFsc2VcbmA7XG5cbi8vIOKUgOKUgCBXb3JrZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBjbGFzcyBDb2RleEFwcFNlcnZlcldvcmtlciB7XG4gIHByaXZhdGUgcHJvYzogQ2hpbGRQcm9jZXNzIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcnBjOiBDb2RleFJwY0NsaWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvZGV4SG9tZTogc3RyaW5nO1xuICBwcml2YXRlIHJlc3RhcnRBdHRlbXB0cyA9IDA7XG4gIHByaXZhdGUgcmVhZHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBidXN5ID0gZmFsc2U7XG4gIHByaXZhdGUgYWN0aXZlVHVybkFib3J0PzogQWN0aXZlVHVybkFib3J0O1xuICBhY3RpdmUgPSB0cnVlO1xuICBvblJlYWR5PzogKCkgPT4gdm9pZDtcbiAgLy8gcmVzdGFydCDsi5wgcnBjIOqwneyytOqwgCDsg4jroZwg7IOd7ISx65CY66+A66GcLCDtlbjrk6Trn6zrpbwg67O06rSA7ZaI64uk6rCAIOunpCBzcGF3buuniOuLpCDsnqzrsJTsnbjrlKntlZzri6QuXG4gIHNlcnZlclJlcXVlc3RIYW5kbGVyPzogKG1ldGhvZDogc3RyaW5nLCBwYXJhbXM6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLy8gdGhyZWFkIOyerOyCrOyaqShwcm9tcHQgY2FjaGUpOiB3b3JrZXIg6rCAIOyDneyEse2VnCB0aHJlYWQg65Ok7J2YIOuplO2DgC5cbiAgLy8gZXBoZW1lcmFsIHRocmVhZCDripQg7J20IO2UhOuhnOyEuOyKpCDrqZTrqqjrpqzsl5Drp4wg7KG07J6s7ZWY66+A66GcIHJlc3RhcnQg7IucIOyghOu2gCDrrLTtmqguXG4gIHByaXZhdGUgdGhyZWFkTWV0YSA9IG5ldyBNYXA8c3RyaW5nLCB7IGxhc3RVc2VkQXQ6IG51bWJlciB9PigpO1xuICAvLyBzcGF3biDsubTsmrTthLAuIHJlc3RhcnQg66eI64ukIOymneqwgCDihpIgY29udiDtlbjrk6TsnZggZXBvY2gg7JmAIOuMgOyhsO2VtCBzdGFsZSB0aHJlYWQg6rCQ7KeALlxuICBwcml2YXRlIGVwb2NoQ291bnRlciA9IDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRIUkVBRF9JRExFX1RUTF9NUyA9IDEwICogNjBfMDAwO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfVEhSRUFEU19QRVJfV09SS0VSID0gMTY7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IFdvcmtlckNvbmZpZykge1xuICAgIGNvbnN0IHN1ZmZpeCA9IGNvbmZpZy53b3JrZXJJbmRleCAhPT0gdW5kZWZpbmVkID8gYC0ke2NvbmZpZy53b3JrZXJJbmRleH1gIDogXCJcIjtcbiAgICB0aGlzLmNvZGV4SG9tZSA9IGAvdG1wL3FncmlkLWNvZGV4LyR7Y29uZmlnLnRva2VuSWR9JHtzdWZmaXh9YDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBhc3luYyBzcGF3bkFuZEluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7IOIIGNvZGV4IO2UhOuhnOyEuOyKpCDihpIg6riw7KG0IGVwaGVtZXJhbCB0aHJlYWQg7KCE67aAIOustO2aqC4gZXBvY2gg7Kad6rCA66GcIHN0YWxlIOqwkOyngC5cbiAgICB0aGlzLmVwb2NoQ291bnRlcisrO1xuICAgIHRoaXMudGhyZWFkTWV0YS5jbGVhcigpO1xuICAgIGNvbnN0IGN3ZCA9IGAke3RoaXMuY29kZXhIb21lfS9jd2RgO1xuICAgIG1rZGlyU3luYyhjd2QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIC8vIGNvZGV4IOuCtOyepSB0b29sL3dlYl9zZWFyY2gvaW5zdHJ1Y3Rpb24g67iU66GdIOu5hO2ZnOyEse2ZlFxuICAgIHdyaXRlRmlsZVN5bmMoYCR7dGhpcy5jb2RleEhvbWV9L2NvbmZpZy50b21sYCwgQ09ERVhfQ09ORklHX1RPTUwpO1xuXG4gICAgdGhpcy5wcm9jID0gc3Bhd24oXCJjb2RleFwiLCBbXCJhcHAtc2VydmVyXCIsIFwiLS1saXN0ZW5cIiwgXCJzdGRpbzovL1wiXSwge1xuICAgICAgc3RkaW86IFtcInBpcGVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcbiAgICAgIGN3ZCxcbiAgICAgIGVudjoge1xuICAgICAgICBQQVRIOiBwcm9jZXNzLmVudi5QQVRILFxuICAgICAgICBUTVBESVI6IHByb2Nlc3MuZW52LlRNUERJUixcbiAgICAgICAgQ09ERVhfSE9NRTogdGhpcy5jb2RleEhvbWUsXG4gICAgICAgIC8vIGVudmlyb25tZW50IOu5hO2ZnOyEse2ZlCDihpIgaGFzX2Vudmlyb25tZW50PWZhbHNlIOKGkiBzaGVsbC9hcHBseV9wYXRjaC92aWV3X2ltYWdlIOygnOqxsFxuICAgICAgICBDT0RFWF9FWEVDX1NFUlZFUl9VUkw6IFwibm9uZVwiLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvYy5vbihcImV4aXRcIiwgKGNvZGUpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IGV4aXRlZCAoY29kZT0ke2NvZGV9KWApO1xuICAgICAgdGhpcy5mYWlsQWN0aXZlVHVybihcbiAgICAgICAgbmV3IEVycm9yKGBjb2RleCB3b3JrZXIgZXhpdGVkIHdoaWxlIHR1cm4gd2FzIHJ1bm5pbmcgKGNvZGU9JHtjb2RlID8/IFwidW5rbm93blwifSlgKSxcbiAgICAgICk7XG4gICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgICB0aGlzLnJwYyA9IG51bGw7XG4gICAgICB0aGlzLnByb2MgPSBudWxsO1xuICAgICAgaWYgKCF0aGlzLmRlc3Ryb3llZCkgdGhpcy5zY2hlZHVsZVJlc3RhcnQoKTtcbiAgICB9KTtcblxuICAgIHRoaXMucnBjID0gbmV3IENvZGV4UnBjQ2xpZW50KHRoaXMucHJvYyk7XG4gICAgLy8gcmVzdGFydCDtm4Tsl5Drj4QgcmVmcmVzaCBzZXJ2ZXItcmVxdWVzdCDtlbjrk6Trn6zrpbwg7Jyg7KeAICjsl4bsnLzrqbQgY29kZXgg7Yag7YGwIO2ajOyghCDsi6TtjKgg4oaSIHNlc3Npb24gZXhwaXJlZClcbiAgICB0aGlzLmJpbmRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcigpO1xuXG4gICAgYXdhaXQgdGhpcy5ycGMucmVxdWVzdChcImluaXRpYWxpemVcIiwge1xuICAgICAgY2xpZW50SW5mbzogeyBuYW1lOiBcInFncmlkXCIsIHZlcnNpb246IFwiMS4wLjBcIiB9LFxuICAgICAgY2FwYWJpbGl0aWVzOiB7IGV4cGVyaW1lbnRhbEFwaTogdHJ1ZSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB3YWl0Rm9yTG9naW5Db21wbGV0ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlamVjdChuZXcgRXJyb3IoXCJsb2dpbiB0aW1lb3V0XCIpKSwgMTIwXzAwMCk7XG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJhY2NvdW50L2xvZ2luL2NvbXBsZXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIGlmIChwLnN1Y2Nlc3MpIHJlc29sdmUoKTtcbiAgICAgICAgZWxzZSByZWplY3QobmV3IEVycm9yKGBsb2dpbiBmYWlsZWQ6ICR7cC5lcnJvciA/PyBcInVua25vd25cIn1gKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zcGF3bkFuZEluaXQoKTtcblxuICAgIGF3YWl0IHRoaXMucnBjIS5yZXF1ZXN0KFwiYWNjb3VudC9sb2dpbi9zdGFydFwiLCB7XG4gICAgICB0eXBlOiBcImNoYXRncHRBdXRoVG9rZW5zXCIsXG4gICAgICBhY2Nlc3NUb2tlbjogdGhpcy5jb25maWcuYWNjZXNzVG9rZW4sXG4gICAgICBjaGF0Z3B0QWNjb3VudElkOiB0aGlzLmNvbmZpZy5hY2NvdW50SWQsXG4gICAgICAuLi4odGhpcy5jb25maWcucGxhblR5cGUgPyB7IGNoYXRncHRQbGFuVHlwZTogdGhpcy5jb25maWcucGxhblR5cGUgfSA6IHt9KSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMud2FpdEZvckxvZ2luQ29tcGxldGVkKCk7XG4gICAgdGhpcy5yZWFkeSA9IHRydWU7XG4gICAgdGhpcy5yZXN0YXJ0QXR0ZW1wdHMgPSAwO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRCcm93c2VyTG9naW4oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCB0aGlzLnNwYXduQW5kSW5pdCgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnBjIS5yZXF1ZXN0PHsgYXV0aFVybDogc3RyaW5nIH0+KFwiYWNjb3VudC9sb2dpbi9zdGFydFwiLCB7XG4gICAgICB0eXBlOiBcImNoYXRncHRcIixcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSBicm93c2VyIGxvZ2luIHN0YXJ0ZWRgKTtcbiAgICByZXR1cm4gcmVzdWx0LmF1dGhVcmw7XG4gIH1cblxuICBhc3luYyB3YWl0Rm9yQnJvd3NlckxvZ2luQ29tcGxldGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTG9naW5Db21wbGV0ZWQoKTtcbiAgICB0aGlzLnJlYWR5ID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cyA9IDA7XG4gICAgbG9nZ2VyLmluZm8oYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX0gYnJvd3NlciBsb2dpbiBjb21wbGV0ZWRgKTtcbiAgfVxuXG4gIGFzeW5jIHJlYWRNYW5hZ2VkQ3JlZGVudGlhbHMoKTogUHJvbWlzZTx7XG4gICAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgICByZWZyZXNoVG9rZW46IHN0cmluZztcbiAgICBpZFRva2VuPzogc3RyaW5nO1xuICAgIGFjY291bnRJZDogc3RyaW5nO1xuICB9IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXcgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhgJHt0aGlzLmNvZGV4SG9tZX0vYXV0aC5qc29uYCwgXCJ1dGYtOFwiKSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY2Nlc3NUb2tlbjogcmF3LnRva2Vucz8uYWNjZXNzX3Rva2VuID8/IFwiXCIsXG4gICAgICAgIHJlZnJlc2hUb2tlbjogcmF3LnRva2Vucz8ucmVmcmVzaF90b2tlbiA/PyBcIlwiLFxuICAgICAgICBpZFRva2VuOiByYXcudG9rZW5zPy5pZF90b2tlbixcbiAgICAgICAgYWNjb3VudElkOiByYXcudG9rZW5zPy5hY2NvdW50X2lkID8/IFwiXCIsXG4gICAgICB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMga2lsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgIHRoaXMuZmFpbEFjdGl2ZVR1cm4obmV3IEVycm9yKFwiY29kZXggd29ya2VyIHN0b3BwZWRcIikpO1xuICAgIHRoaXMucnBjPy5kZXN0cm95KCk7XG5cbiAgICBpZiAodGhpcy5wcm9jKSB7XG4gICAgICB0aGlzLnByb2Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucHJvYz8ua2lsbChcIlNJR0tJTExcIik7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LCAzXzAwMCk7XG4gICAgICAgIHRoaXMucHJvYyEub24oXCJleGl0XCIsICgpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcm1TeW5jKHRoaXMuY29kZXhIb21lLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgZ2V0IGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkgJiYgIXRoaXMuZGVzdHJveWVkO1xuICB9XG4gIGdldCBpc0Rlc3Ryb3llZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95ZWQ7XG4gIH1cbiAgZ2V0IHRva2VuSWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcudG9rZW5JZDtcbiAgfVxuICBnZXQgd29ya2VySW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcud29ya2VySW5kZXggPz8gMDtcbiAgfVxuICBnZXQgdG9rZW5OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnRva2VuTmFtZTtcbiAgfVxuXG4gIGNhblJldXNlRm9yVG9rZW4oX3Rva2VuTmFtZTogc3RyaW5nLCBjcmVkZW50aWFsczogUmVmcmVzaGFibGVXb3JrZXJDcmVkZW50aWFscyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbmZpZy5hY2NvdW50SWQgPT09IGNyZWRlbnRpYWxzLmFjY291bnRJZCAmJlxuICAgICAgKHRoaXMuY29uZmlnLnBsYW5UeXBlID8/IHVuZGVmaW5lZCkgPT09IChjcmVkZW50aWFscy5wbGFuVHlwZSA/PyB1bmRlZmluZWQpXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZVRva2VuU3RhdGUodG9rZW5OYW1lOiBzdHJpbmcsIGNyZWRlbnRpYWxzOiBSZWZyZXNoYWJsZVdvcmtlckNyZWRlbnRpYWxzKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcudG9rZW5OYW1lID0gdG9rZW5OYW1lO1xuICAgIHRoaXMuY29uZmlnLmFjY2Vzc1Rva2VuID0gY3JlZGVudGlhbHMuYWNjZXNzVG9rZW47XG4gICAgdGhpcy5jb25maWcuYWNjb3VudElkID0gY3JlZGVudGlhbHMuYWNjb3VudElkO1xuICAgIGlmIChjcmVkZW50aWFscy5wbGFuVHlwZSkge1xuICAgICAgdGhpcy5jb25maWcucGxhblR5cGUgPSBjcmVkZW50aWFscy5wbGFuVHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMuY29uZmlnLnBsYW5UeXBlO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBSYXRlIGxpbWl0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBnZXRSYXRlTGltaXRzKCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5ycGMgfHwgIXRoaXMucmVhZHkpIHRocm93IG5ldyBFcnJvcihcIndvcmtlciBub3QgcmVhZHlcIik7XG4gICAgcmV0dXJuIHRoaXMucnBjLnJlcXVlc3QoXCJhY2NvdW50L3JhdGVMaW1pdHMvcmVhZFwiLCB7fSk7XG4gIH1cblxuICAvLyDilIDilIAgU2VydmVyLXJlcXVlc3QgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBzZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihoYW5kbGVyOiAobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuc2VydmVyUmVxdWVzdEhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHRoaXMuYmluZFNlcnZlclJlcXVlc3RIYW5kbGVyKCk7XG4gIH1cblxuICAvLyBzcGF3bkFuZEluaXTsl5DshJwgcnBjIOyDneyEsSDsp4Htm4Qg7Zi47LacLiByZXN0YXJ066GcIHJwY+qwgCDsg4jroZwg66eM65Ok7Ja07KC464+EIO2VuOuTpOufrOqwgCDsnKDsp4DrkJzri6QuXG4gIGJpbmRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcigpOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5zZXJ2ZXJSZXF1ZXN0SGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHJldHVybjtcbiAgICB0aGlzLnJwYz8ub25TZXJ2ZXJSZXF1ZXN0KFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIChwYXJhbXMpID0+XG4gICAgICBoYW5kbGVyKFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIsIHBhcmFtcyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUdXJuIGV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICB0cnlBY3F1aXJlVHVybigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5idXN5KSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZWxlYXNlVHVybigpOiB2b2lkIHtcbiAgICB0aGlzLmJ1c3kgPSBmYWxzZTtcbiAgfVxuICBnZXQgaGFzQ2FwYWNpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmJ1c3k7XG4gIH1cblxuICAvLyDsg4ggdGhyZWFkIOyDneyEsSAodGhyZWFkL3N0YXJ0ICsg7ZWE7JqUIOyLnCBoaXN0b3J5IGluamVjdCkuIOyyqyB0dXJuIC8g7Y+067CxIOqyveuhnOyaqS5cbiAgLy8g7ZuE7IaNIHR1cm4g7J2AIGNyZWF0ZVRocmVhZCDsl4bsnbQgc3RhcnRUdXJuT25UaHJlYWQg66eMIO2YuOy2nO2VtCBjb252ZXJzYXRpb25faWQg66W8IOqzoOygle2VnOuLpC5cbiAgLy8gdGhyZWFkIOydmCDquLDrs7ggbW9kZWwg64+EIOuwmO2ZmCAocmVxLm1vZGVsIOuvuOyngOyglSDsi5wgZmFsbGJhY2spLlxuICBhc3luYyBjcmVhdGVUaHJlYWQocmVxOiBUdXJuUmVxdWVzdCk6IFByb21pc2U8eyB0aHJlYWRJZDogc3RyaW5nOyBtb2RlbDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuICAgIHRoaXMuc3dlZXBJZGxlVGhyZWFkcygpO1xuXG4gICAgY29uc3QgdGhyZWFkQ29uZmlnOiBUaHJlYWRTdGFydFBhcmFtc1tcImNvbmZpZ1wiXSA9IHtcbiAgICAgIC4uLlRIUkVBRF9ERUZBVUxUUy5jb25maWcsXG4gICAgICAuLi4ocmVxLnZlcmJvc2l0eSA/IHsgbW9kZWxfdmVyYm9zaXR5OiByZXEudmVyYm9zaXR5IH0gOiB7fSksXG4gICAgfTtcbiAgICBjb25zdCB7IHRocmVhZCwgbW9kZWw6IHRocmVhZE1vZGVsIH0gPSBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0PFRocmVhZFN0YXJ0UmVzcG9uc2U+KFxuICAgICAgXCJ0aHJlYWQvc3RhcnRcIixcbiAgICAgIHtcbiAgICAgICAgZXBoZW1lcmFsOiB0cnVlLFxuICAgICAgICBjd2Q6IGAke3RoaXMuY29kZXhIb21lfS9jd2RgLFxuICAgICAgICBiYXNlSW5zdHJ1Y3Rpb25zOiBCQVNFX0lOU1RSVUNUSU9OUyxcbiAgICAgICAgZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zOiByZXEuZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zID8/IFwiXCIsXG4gICAgICAgIHNhbmRib3g6IFRIUkVBRF9ERUZBVUxUUy5zYW5kYm94LFxuICAgICAgICBhcHByb3ZhbFBvbGljeTogVEhSRUFEX0RFRkFVTFRTLmFwcHJvdmFsUG9saWN5LFxuICAgICAgICBjb25maWc6IHRocmVhZENvbmZpZyxcbiAgICAgIH0gc2F0aXNmaWVzIFBhcnRpYWw8VGhyZWFkU3RhcnRQYXJhbXM+LFxuICAgICk7XG5cbiAgICBjb25zdCB0aHJlYWRJZCA9IHRocmVhZC5pZDtcbiAgICBpZiAocmVxLmhpc3Rvcnk/Lmxlbmd0aCkge1xuICAgICAgYXdhaXQgdGhpcy5ycGMucmVxdWVzdChcInRocmVhZC9pbmplY3RfaXRlbXNcIiwge1xuICAgICAgICB0aHJlYWRJZCxcbiAgICAgICAgaXRlbXM6IHJlcS5oaXN0b3J5LFxuICAgICAgfSBzYXRpc2ZpZXMgVGhyZWFkSW5qZWN0SXRlbXNQYXJhbXMpO1xuICAgIH1cbiAgICB0aGlzLnRocmVhZE1ldGEuc2V0KHRocmVhZElkLCB7IGxhc3RVc2VkQXQ6IERhdGUubm93KCkgfSk7XG5cbiAgICByZXR1cm4geyB0aHJlYWRJZCwgbW9kZWw6IHJlcS5tb2RlbCA/PyB0aHJlYWRNb2RlbCB9O1xuICB9XG5cbiAgLy8g6riw7KG0IHRocmVhZCDsl5AgdHVybiDrp4wg7Iuk7ZaJIChpbmplY3Qg7JeG7J2MKS4gY29udmVyc2F0aW9uX2lkIOycoOyngCDihpIgcHJvbXB0IGNhY2hlIOyggeykkS5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydFR1cm5PblRocmVhZCh0aHJlYWRJZDogc3RyaW5nLCByZXE6IFR1cm5SZXF1ZXN0KTogUHJvbWlzZTx7IHR1cm5JZDogc3RyaW5nIH0+IHtcbiAgICBpZiAoIXRoaXMucnBjIHx8ICF0aGlzLnJlYWR5KSB0aHJvdyBuZXcgRXJyb3IoXCJ3b3JrZXIgbm90IHJlYWR5XCIpO1xuXG4gICAgY29uc3QgeyB0dXJuIH0gPSBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0PFR1cm5TdGFydFJlc3BvbnNlPihcInR1cm4vc3RhcnRcIiwge1xuICAgICAgdGhyZWFkSWQsXG4gICAgICBpbnB1dDogcmVxLmlucHV0LFxuICAgICAgLi4uKHJlcS5vdXRwdXRTY2hlbWEgPyB7IG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5lZmZvcnQgPyB7IGVmZm9ydDogcmVxLmVmZm9ydCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5tb2RlbCA/IHsgbW9kZWw6IHJlcS5tb2RlbCB9IDoge30pLFxuICAgICAgLi4uKHJlcS5yZWFzb25pbmdTdW1tYXJ5ID8geyBzdW1tYXJ5OiByZXEucmVhc29uaW5nU3VtbWFyeSB9IDoge30pLFxuICAgICAgLi4uKHJlcS5zZXJ2aWNlVGllciA/IHsgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllciB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLnRocmVhZE1ldGEuZ2V0KHRocmVhZElkKTtcbiAgICBpZiAobWV0YSkgbWV0YS5sYXN0VXNlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4geyB0dXJuSWQ6IHR1cm4uaWQgfTtcbiAgfVxuXG4gIC8vIGV4aXN0aW5nVGhyZWFkSWQg7J6I7Jy866m0IOq3uCB0aHJlYWQg7J6s7IKs7JqpKO2bhOyGjSB0dXJuKSwg7JeG7Jy866m0IOyDiCB0aHJlYWQg7IOd7ISxKOyyqyB0dXJuKS5cbiAgLy8g7Zi47LacIO2bhCDsgqzsmqntlZwgdGhyZWFkSWQg66W8IOuwmO2ZmO2VtCBkaXNwYXRjaGVyIOqwgCBjb252IO2VuOuTpOydhCDrsJzquIntlZzri6QuXG4gIGFzeW5jIGV4ZWN1dGVUdXJuKFxuICAgIHJlcTogVHVyblJlcXVlc3QsXG4gICAgZXhpc3RpbmdUaHJlYWRJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxUdXJuUmVzdWx0ICYgeyB0aHJlYWRJZDogc3RyaW5nIH0+IHtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBsZXQgbW9kZWw6IHN0cmluZztcbiAgICBpZiAoZXhpc3RpbmdUaHJlYWRJZCkge1xuICAgICAgdGhyZWFkSWQgPSBleGlzdGluZ1RocmVhZElkO1xuICAgICAgbW9kZWwgPSByZXEubW9kZWwgPz8gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgdGhyZWFkSWQsIG1vZGVsIH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVRocmVhZChyZXEpKTtcbiAgICB9XG4gICAgY29uc3QgdHRmdFRyYWNrZXIgPSBjcmVhdGVUdGZ0VHJhY2tlcigpO1xuICAgIGNvbnN0IHJlc3VsdFByb21pc2UgPSB0aGlzLmNvbnN1bWVUdXJuTm90aWZpY2F0aW9ucyh0aHJlYWRJZCwgbW9kZWwsIHR0ZnRUcmFja2VyKTtcbiAgICB0cnkge1xuICAgICAgdHRmdFRyYWNrZXIubWFya1N0YXJ0KCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0VHVybk9uVGhyZWFkKHRocmVhZElkLCByZXEpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuZmFpbEFjdGl2ZVR1cm4oZSBhcyBFcnJvcik7XG4gICAgICBhd2FpdCByZXN1bHRQcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3VsdFByb21pc2U7XG4gICAgcmV0dXJuIHsgLi4ucmVzdWx0LCB0aHJlYWRJZCB9O1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVR1cm5TdHJlYW0oXG4gICAgcmVxOiBUdXJuUmVxdWVzdCxcbiAgICBjYjogU3RyZWFtQ2FsbGJhY2tzLFxuICAgIGV4aXN0aW5nVGhyZWFkSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyB0aHJlYWRJZDogc3RyaW5nIH0+IHtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZztcbiAgICBsZXQgbW9kZWw6IHN0cmluZztcbiAgICBpZiAoZXhpc3RpbmdUaHJlYWRJZCkge1xuICAgICAgdGhyZWFkSWQgPSBleGlzdGluZ1RocmVhZElkO1xuICAgICAgbW9kZWwgPSByZXEubW9kZWwgPz8gXCJcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgdGhyZWFkSWQsIG1vZGVsIH0gPSBhd2FpdCB0aGlzLmNyZWF0ZVRocmVhZChyZXEpKTtcbiAgICB9XG4gICAgY2Iub25UaHJlYWRJZD8uKHRocmVhZElkKTtcbiAgICBjb25zdCB0dGZ0VHJhY2tlciA9IGNyZWF0ZVR0ZnRUcmFja2VyKCk7XG4gICAgY29uc3QgcmVzdWx0UHJvbWlzZSA9IHRoaXMuY29uc3VtZVN0cmVhbU5vdGlmaWNhdGlvbnModGhyZWFkSWQsIG1vZGVsLCBjYiwgdHRmdFRyYWNrZXIpO1xuICAgIGxldCB0dXJuSWQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgdHRmdFRyYWNrZXIubWFya1N0YXJ0KCk7XG4gICAgICAoeyB0dXJuSWQgfSA9IGF3YWl0IHRoaXMuc3RhcnRUdXJuT25UaHJlYWQodGhyZWFkSWQsIHJlcSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuZmFpbEFjdGl2ZVR1cm4oZSBhcyBFcnJvcik7XG4gICAgICBhd2FpdCByZXN1bHRQcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGNiLm9uVHVybklkPy4odHVybklkKTtcbiAgICBhd2FpdCByZXN1bHRQcm9taXNlO1xuICAgIHJldHVybiB7IHRocmVhZElkIH07XG4gIH1cblxuICAvLyDilIDilIAgdGhyZWFkIOyerOyCrOyaqSDsp4Dsm5Ag4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IGVwb2NoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZXBvY2hDb3VudGVyO1xuICB9XG5cbiAgaGFzVGhyZWFkKHRocmVhZElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50aHJlYWRNZXRhLmhhcyh0aHJlYWRJZCk7XG4gIH1cblxuICAvLyBpZGxlIFRUTCDstIjqs7wgLyDqsJzsiJgg7IOB7ZWcIOy0iOqzvCB0aHJlYWQg66W8IOygleumrC4gY3JlYXRlVGhyZWFkIOyngeyghCBsYXp5IO2YuOy2nC5cbiAgLy8gY29kZXggZXBoZW1lcmFsIHRocmVhZCDripQg66qF7Iuc7KCBIGNsb3NlIFJQQyDsl4bsnbQg66e17JeQ7IScIOygnOqxsCDihpIg642UIOydtOyDgSB0dXJuIOyViCDrs7Trg4QuXG4gIHN3ZWVwSWRsZVRocmVhZHMoKTogdm9pZCB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBmb3IgKGNvbnN0IFtpZCwgbWV0YV0gb2YgdGhpcy50aHJlYWRNZXRhKSB7XG4gICAgICBpZiAobm93IC0gbWV0YS5sYXN0VXNlZEF0ID4gQ29kZXhBcHBTZXJ2ZXJXb3JrZXIuVEhSRUFEX0lETEVfVFRMX01TKSB7XG4gICAgICAgIHRoaXMudGhyZWFkTWV0YS5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjcmVhdGVUaHJlYWQg7KeB7KCEIO2YuOy2nCDihpIg7IOIIHRocmVhZCAxIOqwnOqwgCDqs6cg7LaU6rCA65Cc64ukLiDstpTqsIAg7ZuE7JeQ64+EIE1BWCDrpbwg64SY7KeAIOyViuuPhOuhnVxuICAgIC8vIE1BWC0xIOydtO2VmOuhnCDspITsl6wg65GU64ukKOq3uOuemOyVvCDsg53shLEg7KeB7ZuEIOygle2Zle2eiCBNQVgpLiBMUlU6IGxhc3RVc2VkQXQg7Jik66aE7LCo7Iic7Jy866GcIOygnOqxsC5cbiAgICBjb25zdCBsaW1pdCA9IENvZGV4QXBwU2VydmVyV29ya2VyLk1BWF9USFJFQURTX1BFUl9XT1JLRVIgLSAxO1xuICAgIGlmICh0aGlzLnRocmVhZE1ldGEuc2l6ZSA+IGxpbWl0KSB7XG4gICAgICBjb25zdCBzb3J0ZWQgPSBbLi4udGhpcy50aHJlYWRNZXRhLmVudHJpZXMoKV0udG9Tb3J0ZWQoXG4gICAgICAgIChhLCBiKSA9PiBhWzFdLmxhc3RVc2VkQXQgLSBiWzFdLmxhc3RVc2VkQXQsXG4gICAgICApO1xuICAgICAgY29uc3Qgb3ZlciA9IHRoaXMudGhyZWFkTWV0YS5zaXplIC0gbGltaXQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG92ZXI7IGkrKykgdGhpcy50aHJlYWRNZXRhLmRlbGV0ZShzb3J0ZWRbaV0hWzBdKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpbnRlcnJ1cHRUdXJuKHRocmVhZElkOiBzdHJpbmcsIHR1cm5JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnJwYyB8fCAhdGhpcy5yZWFkeSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnJwYy5yZXF1ZXN0KFwidHVybi9pbnRlcnJ1cHRcIiwgeyB0aHJlYWRJZCwgdHVybklkIH0pO1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIHByaXZhdGUgZmFpbEFjdGl2ZVR1cm4oZXJyb3I6IEVycm9yKTogdm9pZCB7XG4gICAgY29uc3QgYWJvcnQgPSB0aGlzLmFjdGl2ZVR1cm5BYm9ydDtcbiAgICB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IHVuZGVmaW5lZDtcbiAgICBhYm9ydD8uKGVycm9yKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVR1cm5Ob3RpZmljYXRpb25zKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgbW9kZWw6IHN0cmluZyxcbiAgICB0dGZ0VHJhY2tlciA9IGNyZWF0ZVR0ZnRUcmFja2VyKCksXG4gICk6IFByb21pc2U8VHVyblJlc3VsdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUdXJuUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgbGV0IGFib3J0OiBBY3RpdmVUdXJuQWJvcnQ7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGZpbmlzaFdpdGhFcnJvcihuZXcgRXJyb3IoXCJ0dXJuIHRpbWVvdXQgKDYwMHMpXCIpKTtcbiAgICAgIH0sIDYwMF8wMDApO1xuXG4gICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICBsZXQgdXNhZ2U6IFRva2VuVXNhZ2VCcmVha2Rvd24gPSB7XG4gICAgICAgIHRvdGFsVG9rZW5zOiAwLFxuICAgICAgICBpbnB1dFRva2VuczogMCxcbiAgICAgICAgb3V0cHV0VG9rZW5zOiAwLFxuICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogMCxcbiAgICAgICAgcmVhc29uaW5nT3V0cHV0VG9rZW5zOiAwLFxuICAgICAgfTtcbiAgICAgIGxldCBkdXJhdGlvbk1zID0gMDtcblxuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBpZiAodGhpcy5hY3RpdmVUdXJuQWJvcnQgPT09IGFib3J0KSB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIFtcbiAgICAgICAgICBcIml0ZW0vY29tcGxldGVkXCIsXG4gICAgICAgICAgXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLFxuICAgICAgICAgIFwidHVybi9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIixcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIF0gYXMgY29uc3QpIHtcbiAgICAgICAgICB0aGlzLnJwYz8ub25Ob3RpZmljYXRpb24obiwgKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoRXJyb3IgPSAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoUmVzdWx0ID0gKHJlc3VsdDogVHVyblJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9O1xuXG4gICAgICBhYm9ydCA9IGZpbmlzaFdpdGhFcnJvcjtcbiAgICAgIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gYWJvcnQ7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcIml0ZW0vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC5pdGVtLnR5cGUgPT09IFwiYWdlbnRNZXNzYWdlXCIpIHRleHQgPSBwLml0ZW0udGV4dDtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgdHRmdFRyYWNrZXIucmVjb3JkRmlyc3REZWx0YSgpO1xuICAgICAgICB0ZXh0ICs9IHAuZGVsdGE7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwidGhyZWFkL3Rva2VuVXNhZ2UvdXBkYXRlZFwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgLy8gdGhyZWFkIOyerOyCrOyaqSDsi5wgLnRvdGFsIOydgCDrjIDtmZQg7KCE7LK0IOuIhOyggeydtOudvCwgY29sZCDsmIDrjZgg7J207KCEIHR1cm4g6rmM7KeAIOyEnuyXrFxuICAgICAgICAvLyDsnbQg7JqU7LKtIOyekOyytOydmCBjYWNoZSDsoIHspJHrpaDsnbQg7Z2s7ISd65Cc64ukKOyYiDogdHVybjEgY29sZCAwJSArIHR1cm4yIDkwJSDihpIgNDglIOuhnCDquLDroZ0pLlxuICAgICAgICAvLyAubGFzdCDripQg7J2067KIIHR1cm4g66eM7J2YIHVzYWdlIOudvCByZXF1ZXN0X2xvZyDqsIAg6re4IOyalOyyreydmCDsi6TsoJwg7Yag7YGw7J2EIOygle2Zle2eiCDrsJjsmIHtlZzri6QuXG4gICAgICAgIHVzYWdlID0gcC50b2tlblVzYWdlLmxhc3Q7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwidHVybi9jb21wbGV0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGR1cmF0aW9uTXMgPSBwLnR1cm4uZHVyYXRpb25NcyA/PyAwO1xuICAgICAgICBpZiAocC50dXJuLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgIGZpbmlzaFdpdGhSZXN1bHQoeyB0ZXh0LCB1c2FnZSwgZHVyYXRpb25NcywgdHRmdE1zOiB0dGZ0VHJhY2tlci52YWx1ZSgpLCBtb2RlbCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKGB0dXJuIGZhaWxlZDogJHtKU09OLnN0cmluZ2lmeShwLnR1cm4uZXJyb3IpfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcImVycm9yXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXAud2lsbFJldHJ5KSB7XG4gICAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihgY29kZXggZXJyb3I6ICR7cC5lcnJvci5tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVTdHJlYW1Ob3RpZmljYXRpb25zKFxuICAgIHRocmVhZElkOiBzdHJpbmcsXG4gICAgbW9kZWw6IHN0cmluZyxcbiAgICBjYjogU3RyZWFtQ2FsbGJhY2tzLFxuICAgIHR0ZnRUcmFja2VyID0gY3JlYXRlVHRmdFRyYWNrZXIoKSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBsZXQgYWJvcnQ6IEFjdGl2ZVR1cm5BYm9ydDtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihcInR1cm4gdGltZW91dCAoNjAwcylcIikpO1xuICAgICAgfSwgNjAwXzAwMCk7XG5cbiAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgIGxldCB1c2FnZTogVG9rZW5Vc2FnZUJyZWFrZG93biA9IHtcbiAgICAgICAgdG90YWxUb2tlbnM6IDAsXG4gICAgICAgIGlucHV0VG9rZW5zOiAwLFxuICAgICAgICBvdXRwdXRUb2tlbnM6IDAsXG4gICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLFxuICAgICAgICByZWFzb25pbmdPdXRwdXRUb2tlbnM6IDAsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9PT0gYWJvcnQpIHRoaXMuYWN0aXZlVHVybkFib3J0ID0gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgW1xuICAgICAgICAgIFwiaXRlbS9jb21wbGV0ZWRcIixcbiAgICAgICAgICBcIml0ZW0vYWdlbnRNZXNzYWdlL2RlbHRhXCIsXG4gICAgICAgICAgXCJ0dXJuL2NvbXBsZXRlZFwiLFxuICAgICAgICAgIFwidGhyZWFkL3Rva2VuVXNhZ2UvdXBkYXRlZFwiLFxuICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgXSBhcyBjb25zdCkge1xuICAgICAgICAgIHRoaXMucnBjPy5vbk5vdGlmaWNhdGlvbihuLCAoKSA9PiB7fSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGZpbmlzaFdpdGhFcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgY2Iub25FcnJvcihlcnJvcik7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBmaW5pc2hXaXRoQ29tcGxldGUgPSAocmVzdWx0OiBUdXJuUmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIGNiLm9uQ29tcGxldGUocmVzdWx0KTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcblxuICAgICAgYWJvcnQgPSBmaW5pc2hXaXRoRXJyb3I7XG4gICAgICB0aGlzLmFjdGl2ZVR1cm5BYm9ydCA9IGFib3J0O1xuXG4gICAgICB0aGlzLnJwYyEub25Ob3RpZmljYXRpb24oXCJpdGVtL2FnZW50TWVzc2FnZS9kZWx0YVwiLCAocCkgPT4ge1xuICAgICAgICBpZiAocC50aHJlYWRJZCAhPT0gdGhyZWFkSWQpIHJldHVybjtcbiAgICAgICAgdHRmdFRyYWNrZXIucmVjb3JkRmlyc3REZWx0YSgpO1xuICAgICAgICB0ZXh0ICs9IHAuZGVsdGE7XG4gICAgICAgIGNiLm9uRGVsdGEocC5kZWx0YSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiaXRlbS9jb21wbGV0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmIChwLml0ZW0udHlwZSA9PT0gXCJhZ2VudE1lc3NhZ2VcIikgdGV4dCA9IHAuaXRlbS50ZXh0O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInRocmVhZC90b2tlblVzYWdlL3VwZGF0ZWRcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIC8vIHRocmVhZCDsnqzsgqzsmqkg7IucIC50b3RhbCDsnYAg64yA7ZmUIOyghOyytCDriITsoIHsnbTrnbwsIGNvbGQg7JiA642YIOydtOyghCB0dXJuIOq5jOyngCDshJ7sl6xcbiAgICAgICAgLy8g7J20IOyalOyyrSDsnpDssrTsnZggY2FjaGUg7KCB7KSR66Wg7J20IO2drOyEneuQnOuLpCjsmIg6IHR1cm4xIGNvbGQgMCUgKyB0dXJuMiA5MCUg4oaSIDQ4JSDroZwg6riw66GdKS5cbiAgICAgICAgLy8gLmxhc3Qg64qUIOydtOuyiCB0dXJuIOunjOydmCB1c2FnZSDrnbwgcmVxdWVzdF9sb2cg6rCAIOq3uCDsmpTssq3snZgg7Iuk7KCcIO2GoO2BsOydhCDsoJXtmZXtnogg67CY7JiB7ZWc64ukLlxuICAgICAgICB1c2FnZSA9IHAudG9rZW5Vc2FnZS5sYXN0O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucnBjIS5vbk5vdGlmaWNhdGlvbihcInR1cm4vY29tcGxldGVkXCIsIChwKSA9PiB7XG4gICAgICAgIGlmIChwLnRocmVhZElkICE9PSB0aHJlYWRJZCkgcmV0dXJuO1xuICAgICAgICBpZiAocC50dXJuLnN0YXR1cyA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgIGZpbmlzaFdpdGhDb21wbGV0ZSh7XG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgdXNhZ2UsXG4gICAgICAgICAgICBkdXJhdGlvbk1zOiBwLnR1cm4uZHVyYXRpb25NcyA/PyAwLFxuICAgICAgICAgICAgdHRmdE1zOiB0dGZ0VHJhY2tlci52YWx1ZSgpLFxuICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluaXNoV2l0aEVycm9yKG5ldyBFcnJvcihgdHVybiAke3AudHVybi5zdGF0dXN9OiAke0pTT04uc3RyaW5naWZ5KHAudHVybi5lcnJvcil9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5ycGMhLm9uTm90aWZpY2F0aW9uKFwiZXJyb3JcIiwgKHApID0+IHtcbiAgICAgICAgaWYgKHAudGhyZWFkSWQgIT09IHRocmVhZElkKSByZXR1cm47XG4gICAgICAgIGlmICghcC53aWxsUmV0cnkpIHtcbiAgICAgICAgICBmaW5pc2hXaXRoRXJyb3IobmV3IEVycm9yKGBjb2RleCBlcnJvcjogJHtwLmVycm9yLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZXN0YXJ0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgc2NoZWR1bGVSZXN0YXJ0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCB8fCB0aGlzLnJlc3RhcnRBdHRlbXB0cyA+PSBNQVhfUkVTVEFSVF9BVFRFTVBUUykge1xuICAgICAgaWYgKHRoaXMucmVzdGFydEF0dGVtcHRzID49IE1BWF9SRVNUQVJUX0FUVEVNUFRTKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGB3b3JrZXIgJHt0aGlzLmNvbmZpZy50b2tlbk5hbWV9IG1heCByZXN0YXJ0IGF0dGVtcHRzIHJlYWNoZWRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlc3RhcnRBdHRlbXB0cysrO1xuICAgIGNvbnN0IGJhc2VEZWxheSA9IFJFU1RBUlRfQkFDS09GRl9CQVNFX01TICogMiAqKiAodGhpcy5yZXN0YXJ0QXR0ZW1wdHMgLSAxKTtcbiAgICBjb25zdCBzdGFnZ2VyID0gKHRoaXMuY29uZmlnLndvcmtlckluZGV4ID8/IDApICogMl8wMDA7XG4gICAgY29uc3QgZGVsYXkgPSBiYXNlRGVsYXkgKyBzdGFnZ2VyO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgYHdvcmtlciAke3RoaXMuY29uZmlnLnRva2VuTmFtZX1bJHt0aGlzLmNvbmZpZy53b3JrZXJJbmRleCA/PyAwfV0gcmVzdGFydGluZyBpbiAke2RlbGF5fW1zIChhdHRlbXB0ICR7dGhpcy5yZXN0YXJ0QXR0ZW1wdHN9KWAsXG4gICAgKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gICAgICB0aGlzLmluaXRpYWxpemUoKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLm9uUmVhZHk/LigpKVxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2Fybihgd29ya2VyICR7dGhpcy5jb25maWcudG9rZW5OYW1lfSByZXN0YXJ0IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgICB0aGlzLnNjaGVk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