@workflow/core 5.0.0-beta.44 → 5.0.0-beta.46

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 (58) hide show
  1. package/dist/attribute-changes.d.ts +3 -5
  2. package/dist/attribute-changes.d.ts.map +1 -1
  3. package/dist/attribute-changes.js +2 -2
  4. package/dist/capabilities.d.ts +2 -2
  5. package/dist/capabilities.js +4 -4
  6. package/dist/events-consumer.d.ts +1 -1
  7. package/dist/events-consumer.d.ts.map +1 -1
  8. package/dist/events-consumer.js +3 -2
  9. package/dist/flushable-stream.js +2 -2
  10. package/dist/global.d.ts +3 -1
  11. package/dist/global.d.ts.map +1 -1
  12. package/dist/global.js +8 -5
  13. package/dist/private.d.ts +9 -7
  14. package/dist/private.d.ts.map +1 -1
  15. package/dist/private.js +11 -1
  16. package/dist/runtime/helpers.d.ts +3 -3
  17. package/dist/runtime/helpers.js +1 -1
  18. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  19. package/dist/runtime/quickjs-entrypoint.js +8 -1
  20. package/dist/runtime/quickjs-runtime.js +7 -1
  21. package/dist/runtime/resume-hook.d.ts +27 -12
  22. package/dist/runtime/resume-hook.d.ts.map +1 -1
  23. package/dist/runtime/resume-hook.js +182 -182
  24. package/dist/runtime/resume-latency.d.ts +16 -6
  25. package/dist/runtime/resume-latency.d.ts.map +1 -1
  26. package/dist/runtime/resume-latency.js +4 -2
  27. package/dist/runtime/run.d.ts +1 -1
  28. package/dist/runtime/run.d.ts.map +1 -1
  29. package/dist/runtime/run.js +3 -2
  30. package/dist/runtime/start.js +3 -3
  31. package/dist/runtime/step-latency.d.ts +31 -14
  32. package/dist/runtime/step-latency.d.ts.map +1 -1
  33. package/dist/runtime/step-latency.js +19 -13
  34. package/dist/runtime/suspension-handler.d.ts +9 -7
  35. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  36. package/dist/runtime/suspension-handler.js +41 -41
  37. package/dist/runtime.d.ts.map +1 -1
  38. package/dist/runtime.js +133 -66
  39. package/dist/serialization/hardened.d.ts +5 -4
  40. package/dist/serialization/hardened.d.ts.map +1 -1
  41. package/dist/serialization/hardened.js +7 -1
  42. package/dist/serialization-format.js +2 -2
  43. package/dist/serialization.d.ts +5 -6
  44. package/dist/serialization.d.ts.map +1 -1
  45. package/dist/serialization.js +19 -12
  46. package/dist/step.d.ts.map +1 -1
  47. package/dist/step.js +3 -11
  48. package/dist/telemetry/semantic-conventions.d.ts +14 -5
  49. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  50. package/dist/telemetry/semantic-conventions.js +13 -4
  51. package/dist/version.d.ts +1 -1
  52. package/dist/version.js +2 -2
  53. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -1
  54. package/dist/workflow/attribute-dispatcher.js +3 -6
  55. package/dist/workflow/hook.d.ts.map +1 -1
  56. package/dist/workflow/hook.js +6 -15
  57. package/dist/workflow.js +7 -8
  58. package/package.json +4 -4
@@ -2225,6 +2225,12 @@ function collectDrainOperations(vm, serde) {
2225
2225
  toDispose.push({
2226
2226
  type: "hook_dispose",
2227
2227
  correlationId: p.correlationId,
2228
+ // Carried, not dropped: the entrypoint sends it on hook_disposed,
2229
+ // and the node:vm engine does the same for this case — its
2230
+ // completion drain marks the system hook disposed and reuses the
2231
+ // queue item, token and all. Synthesizing a fresh object here is
2232
+ // what makes it easy to lose.
2233
+ token: p.token,
2228
2234
  hasCreatedEvent: false,
2229
2235
  });
2230
2236
  }
@@ -2418,4 +2424,4 @@ function createInterruptHandler(budget) {
2418
2424
  const timeout = getReplayTimeoutMs();
2419
2425
  return () => Date.now() - budget.start > timeout;
2420
2426
  }
2421
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tqcy1ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcXVpY2tqcy1ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUVMLGlCQUFpQixHQUlsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sRUFFTCxXQUFXLEVBQ1gsT0FBTyxHQUdSLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsZ0NBQWdDLEdBQ2pDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9FLE9BQU8sRUFDTCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixlQUFlLEdBRWhCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWxELDJDQUEyQztBQUUzQzs7Ozs7Ozs7Ozs7R0FXRztBQUNILEtBQUssVUFBVSxpQkFBaUIsQ0FDOUIsSUFBZ0IsRUFDaEIsR0FBbUI7SUFFbkIsT0FBTyxDQUFDLE1BQU0sVUFBVSxDQUFDLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFlLENBQUM7QUFDcEUsQ0FBQztBQXVLRCw4QkFBOEI7QUFFOUI7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFlBQVksR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FvdUJwQixDQUFDO0FBRUYsb0JBQW9CO0FBRXBCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSDs7Ozs7R0FLRztBQUNILE1BQU0saUJBQWlCLEdBQUksVUFBa0IsQ0FBQyxXQUU3QyxDQUFDO0FBTUY7Ozs7Ozs7R0FPRztBQUNILDJFQUEyRTtBQUMzRSw4RUFBOEU7QUFDOUUsdUNBQXVDO0FBQ3ZDLE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FDbkMsdUNBQXVDLEVBQ3ZDLENBQUMsRUFDRCxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ0wsT0FBTyxFQUFFLFNBS0k7Q0FDZCxDQUFDLENBQ0gsQ0FBQztBQUVGLFNBQVMsaUJBQWlCO0lBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0IsYUFBYSxDQUFDLE9BQU8sR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2xDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDcEQsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztnQkFDdEMsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUMvQixpQkFBaUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQWtCLENBQUMsQ0FDbEQ7YUFDRixDQUFDLENBQUM7WUFDSCxPQUFPO2dCQUNMLElBQUk7Z0JBQ0osVUFBVSxFQUFFLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzdDLEdBQUcsR0FBRztvQkFDTixJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFnQztpQkFDekQsQ0FBQyxDQUFDO2FBQ0osQ0FBQztRQUNKLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDTCxxRUFBcUU7UUFDckUsb0RBQW9EO1FBQ3BELGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUMvQixhQUFhLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLGFBQWEsQ0FBQyxPQUFPLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLDBCQUEwQixDQUFDLFFBQXNCO0lBQ3hELE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEIsY0FBYyxDQUFDLFFBQWdCLEVBQUUsVUFBa0IsRUFBRSxTQUFpQjtZQUNwRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEdBQUcsUUFBVSxDQUFDO1lBQzNELElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsRSxPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsS0FBSyxVQUFVLGNBQWMsQ0FDM0IsUUFBc0IsRUFDdEIsZUFBZ0M7SUFFaEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxpQkFBaUIsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sRUFBRSxHQUFHLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUM5QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQWE7UUFDMUIsV0FBVyxFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSTtRQUM5QixnQkFBZ0IsRUFBRSxzQkFBc0IsQ0FBQyxlQUFlLENBQUM7UUFDekQsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1FBQzdCLElBQUksRUFBRSwwQkFBMEIsQ0FBQyxRQUFRLENBQUM7S0FDM0MsQ0FBQyxDQUFDO0lBRUgsZ0NBQWdDO0lBQ2hDLEVBQUUsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBRXBELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxFQUFFO0FBQ0Ysd0VBQXdFO0FBQ3hFLG1FQUFtRTtBQUNuRSwwRUFBMEU7QUFDMUUsdUVBQXVFO0FBQ3ZFLHdFQUF3RTtBQUN4RSxnREFBZ0Q7QUFDaEQsRUFBRTtBQUNGLHFFQUFxRTtBQUNyRSxxRUFBcUU7QUFDckUsaUVBQWlFO0FBQ2pFLGdFQUFnRTtBQUNoRSx5RUFBeUU7QUFDekUscUVBQXFFO0FBQ3JFLHdFQUF3RTtBQUN4RSx3RUFBd0U7QUFDeEUseUVBQXlFO0FBQ3pFLHVFQUF1RTtBQUN2RSx3RUFBd0U7QUFDeEUsaUVBQWlFO0FBQ2pFLGFBQWE7QUFDYixFQUFFO0FBQ0Ysb0VBQW9FO0FBQ3BFLHlFQUF5RTtBQUN6RSxzRUFBc0U7QUFDdEUsbUNBQW1DO0FBRW5DOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLG9CQUFvQixDQUFDO0FBa0I3RCxnRkFBZ0Y7QUFDaEYsZ0ZBQWdGO0FBQ2hGLG9EQUFvRDtBQUNwRCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQy9CLGtDQUFrQyxFQUNsQyxDQUFDLEVBQ0QsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNMLEtBQUssRUFBRSxJQUFJLEdBQUcsRUFBa0M7Q0FDakQsQ0FBQyxDQUNILENBQUM7QUFDRixNQUFNLDBCQUEwQixHQUFHLENBQUMsQ0FBQztBQUVyQyw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLG9DQUFvQztJQUNsRCxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQzFCLENBQUM7QUFFRCxzREFBc0Q7QUFDdEQsTUFBTSxDQUFDLEtBQUssVUFBVSwyQkFBMkIsQ0FDL0MsWUFBb0I7SUFFcEIsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUsdUJBQXVCLENBQ3BDLFlBQW9CLEVBQ3BCLFVBQWtCO0lBRWxCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNoQyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDbkIsTUFBTSxNQUFNLEdBQW9CLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBQ3RELE1BQU0sTUFBTSxHQUFHLE1BQU0saUJBQWlCLEVBQUUsQ0FBQztJQUN6QyxNQUFNLEVBQUUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDOUIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFhO1FBQzFCLFdBQVcsRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUk7UUFDOUIsZ0JBQWdCLEVBQUUsc0JBQXNCLENBQUMsTUFBTSxDQUFDO1FBQ2hELFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtRQUM3QixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNsQixjQUFjLENBQUMsUUFBZ0IsRUFBRSxVQUFrQixFQUFFLFNBQWlCO2dCQUNwRSxVQUFVLEVBQUUsQ0FBQztnQkFDYixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsUUFBVSxDQUFDO2dCQUNqRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2xFLE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQztTQUNGLENBQUMsQ0FBdUI7S0FDMUIsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDO1FBQ0gsRUFBRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFcEQsb0VBQW9FO1FBQ3BFLHNFQUFzRTtRQUN0RSx5REFBeUQ7UUFDekQsOERBQThEO1FBQzlELHFFQUFxRTtRQUNyRSxxQ0FBcUM7UUFDckMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsQ0FBQzs7O2dCQUNDLE1BQU0sUUFBUSxrQ0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7b0JBQzdDLEtBQUssRUFBRSxDQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDckMsQ0FBQyxDQUFDLFFBQUEsQ0FBQztnQkFDSCxNQUFNLElBQUksa0NBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQUEsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sUUFBUSxrQ0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtvQkFDdkQsS0FBSyxFQUFFLENBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUM7Z0JBQzlDLENBQUMsQ0FBQyxRQUFBLENBQUM7Z0JBQ0gsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNwRCxNQUFNLE1BQU0sa0NBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7b0JBQ25ELEtBQUssRUFBRSxDQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2dCQUNwRCxDQUFDLENBQUMsUUFBQSxDQUFDO2dCQUNILEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQzs7Ozs7Ozs7O1NBQ2pEO1FBRUQsbUVBQW1FO1FBQ25FLDJEQUEyRDtRQUMzRCw0REFBNEQ7UUFDNUQsb0VBQW9FO1FBQ3BFLGlFQUFpRTtRQUNqRSwrREFBK0Q7UUFDL0QsbUVBQW1FO1FBQ25FLGtFQUFrRTtRQUNsRSxnRUFBZ0U7UUFDaEUsK0RBQStEO1FBQy9ELDREQUE0RDtRQUM1RCxvRUFBb0U7UUFDcEUsNkJBQTZCO1FBQzdCLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXZDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyw2Q0FBNkM7UUFDN0QsSUFBSSxDQUFDO1lBQ0gsK0RBQStEO1lBQy9ELEVBQUUsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLHdCQUF3QixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEUsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLGlFQUFpRTtZQUNqRSx5Q0FBeUM7WUFDekMsT0FBTztnQkFDTCxLQUFLLEVBQUUsWUFBWTtnQkFDbkIsTUFBTSxFQUFFLG1DQUFtQzthQUM1QyxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsYUFBYSxDQUFDLElBQUksQ0FDaEIsb0pBQW9KLEVBQ3BKLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FDbEMsQ0FBQztZQUNGLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLFlBQVk7Z0JBQ25CLE1BQU0sRUFBRSx5QkFBeUIsS0FBSyxxQkFBcUIsVUFBVSxnQkFBZ0I7YUFDdEYsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDL0IsYUFBYSxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsRUFBRTtZQUN4RCxVQUFVO1lBQ1YsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxZQUFZO1NBQ3JDLENBQUMsQ0FBQztRQUNILE9BQU87WUFDTCxLQUFLLEVBQUUsT0FBTztZQUNkLFFBQVE7WUFDUixZQUFZLEVBQUUsZUFBZSxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUM7U0FDN0MsQ0FBQztJQUNKLENBQUM7WUFBUyxDQUFDO1FBQ1QsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsZ0JBQWdCLENBQ3ZCLFlBQW9CLEVBQ3BCLFVBQWtCO0lBRWxCLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksMEJBQTBCLEVBQUUsQ0FBQztZQUN2RCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuRCxJQUFJLE1BQU0sS0FBSyxTQUFTO2dCQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxLQUFLLEdBQUcsdUJBQXVCLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6QyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQXVCRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0IsQ0FDdEMsT0FBOEI7SUFFOUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEIsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQ3hCLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUN4QyxPQUE4QjtJQUU5QixNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRWxFLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRTlFLHNFQUFzRTtJQUN0RSx3RUFBd0U7SUFDeEUseUVBQXlFO0lBQ3pFLHFFQUFxRTtJQUNyRSx1RUFBdUU7SUFDdkUsd0VBQXdFO0lBQ3hFLDBFQUEwRTtJQUMxRSx1RUFBdUU7SUFDdkUsd0VBQXdFO0lBQ3hFLGtFQUFrRTtJQUNsRSxZQUFZO0lBQ1osRUFBRTtJQUNGLDZEQUE2RDtJQUM3RCxzRUFBc0U7SUFDdEUsa0VBQWtFO0lBQ2xFLCtEQUErRDtJQUMvRCwrQkFBK0I7SUFDL0IsTUFBTSxJQUFJLEdBQUc7UUFDWCxXQUFXLENBQUMsS0FBSztRQUNqQixXQUFXLENBQUMsWUFBWTtRQUN4QixXQUFXLENBQUMsWUFBWTtLQUN6QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNaLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU3Qix3RUFBd0U7SUFDeEUseURBQXlEO0lBQ3pELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUMxRSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQzVDLENBQUM7SUFFRixnRUFBZ0U7SUFDaEUsdUVBQXVFO0lBQ3ZFLHVFQUF1RTtJQUN2RSx3RUFBd0U7SUFDeEUsb0VBQW9FO0lBQ3BFLHFEQUFxRDtJQUNyRCxJQUFJLE9BQU8sR0FDVCxjQUFjLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sWUFBWSxHQUFHLENBQUMsRUFBVSxFQUFFLEVBQUU7UUFDbEMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUFFLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUM7SUFFRiwyQ0FBMkM7SUFDM0MsRUFBRTtJQUNGLHNFQUFzRTtJQUN0RSxvRUFBb0U7SUFDcEUsbUVBQW1FO0lBQ25FLHVFQUF1RTtJQUN2RSx1QkFBdUI7SUFDdkIsTUFBTSxlQUFlLEdBQW9CLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBQy9ELElBQUksZ0JBQXNDLENBQUM7SUFDM0MsSUFBSSxvQkFBd0MsQ0FBQztJQUM3QyxJQUFJLGdDQUFnQyxFQUFFLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUM7WUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLGdCQUFnQixDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQzVCLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7Z0JBQ2xDLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7WUFDNUMsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsK0RBQStEO1lBQy9ELCtEQUErRDtZQUMvRCwrREFBK0Q7WUFDL0QsZ0VBQWdFO1lBQ2hFLGtFQUFrRTtZQUNsRSxrRUFBa0U7WUFDbEUsbUVBQW1FO1lBQ25FLGFBQWEsQ0FBQyxJQUFJLENBQ2hCLGdHQUFnRyxFQUNoRyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQzNCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksRUFBVyxDQUFDO0lBQ2hCLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNyQixNQUFNLE1BQU0sR0FBRyxNQUFNLGlCQUFpQixFQUFFLENBQUM7UUFDekMsRUFBRSxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtZQUMzQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQWE7WUFDMUIsV0FBVyxFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSTtZQUM5QixnQkFBZ0IsRUFBRSxzQkFBc0IsQ0FBQyxlQUFlLENBQUM7WUFDekQsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLElBQUksRUFBRSwwQkFBMEIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUM7U0FDaEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztTQUFNLENBQUM7UUFDTixFQUFFLEdBQUcsTUFBTSxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxxRUFBcUU7SUFDckUsdUVBQXVFO0lBQ3ZFLGtFQUFrRTtJQUNsRSx5RUFBeUU7SUFDekUsd0VBQXdFO0lBQ3hFLDBFQUEwRTtJQUMxRSx1RUFBdUU7SUFDdkUsa0VBQWtFO0lBQ2xFLDRCQUE0QjtJQUM1QixNQUFNLEtBQUssR0FDVCxnQkFBZ0IsSUFBSSxvQkFBb0IsS0FBSyxTQUFTO1FBQ3BELENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUU3QixzRUFBc0U7SUFDdEUsd0VBQXdFO0lBQ3hFLHNFQUFzRTtJQUN0RSxzRUFBc0U7SUFDdEUsbUNBQW1DO0lBQ25DLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxlQUFlLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQztZQUNILEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxrREFBa0Q7UUFDcEQsQ0FBQztRQUNELE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVELDRDQUE0QztJQUM1QyxLQUFLLFVBQVUsZUFBZTtRQUM1QixFQUFFLENBQUMsUUFBUSxDQUNULG9DQUFvQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQ2pGLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFWixxQkFBcUI7UUFDckIsQ0FBQzs7O2dCQUNDLE1BQU0sUUFBUSxrQ0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsUUFBQSxDQUFDO2dCQUNyRSxNQUFNLElBQUksa0NBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQUEsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7Ozs7Ozs7OztTQUNsQztRQUVELDBCQUEwQjtRQUMxQixDQUFDOzs7Z0JBQ0MsTUFBTSxRQUFRLGtDQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFLENBQ3ZELEVBQUUsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FDL0IsUUFBQSxDQUFDO2dCQUNGLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxRQUFRLENBQUMsQ0FBQzs7Ozs7Ozs7O1NBQ3JEO1FBRUQsc0VBQXNFO1FBQ3RFLG9FQUFvRTtRQUNwRSxnRUFBZ0U7UUFDaEUsbUVBQW1FO1FBQ25FLHNFQUFzRTtRQUN0RSxxRUFBcUU7UUFDckUsMERBQTBEO1FBQzFELG9FQUFvRTtRQUNwRSxvRUFBb0U7UUFDcEUsNERBQTREO1FBQzVELGtFQUFrRTtRQUNsRSxDQUFDOzs7Z0JBQ0MsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxhQUFhLEdBQ2pCLGNBQWMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO29CQUNqQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsQ0FBQztnQkFDeEMsTUFBTSxNQUFNLGtDQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQ25ELEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQ3pDLFFBQUEsQ0FBQztnQkFDRixFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUM7Ozs7Ozs7OztTQUNqRDtRQUVELHdFQUF3RTtRQUN4RSwwRUFBMEU7UUFDMUUsc0VBQXNFO1FBQ3RFLG1FQUFtRTtRQUNuRSxzRUFBc0U7UUFDdEUsbUVBQW1FO1FBQ25FLCtEQUErRDtRQUMvRCxXQUFXO1FBQ1gsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVyQyx1RUFBdUU7UUFDdkUsMkVBQTJFO1FBQzNFLG1FQUFtRTtRQUNuRSxxRUFBcUU7UUFDckUsa0VBQWtFO1FBQ2xFLHNEQUFzRDtRQUN0RCxnRUFBZ0U7UUFDaEUsa0VBQWtFO1FBQ2xFLGlFQUFpRTtRQUNqRSxrRUFBa0U7UUFDbEUsaUVBQWlFO1FBQ2pFLHNDQUFzQztRQUN0QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUM7Z0JBQ0gsRUFBRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxJQUFJLGFBQWEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25FLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE9BQU8sa0JBQWtCLENBQ3ZCLFlBQVksQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLDRCQUE0QixDQUFDLENBQ3BELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELHNFQUFzRTtRQUN0RSxpRUFBaUU7UUFDakUsb0VBQW9FO1FBQ3BFLGlFQUFpRTtRQUNqRSxvRUFBb0U7UUFDcEUsNkRBQTZEO1FBQzdELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssYUFBYSxDQUFDLENBQUM7UUFDMUUsTUFBTSxlQUFlLEdBQ25CLGVBQWUsSUFBSSxXQUFXLElBQUksZUFBZTtZQUMvQyxDQUFDLENBQUUsZUFBZSxDQUFDLFNBQXFDLEVBQUUsS0FBSztZQUMvRCxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2hCLE1BQU0sUUFBUSxHQUNaLGVBQWUsSUFBSyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQWlCLENBQUM7UUFFMUQsSUFBSSxRQUFRLFlBQVksVUFBVSxFQUFFLENBQUM7WUFDbkMsTUFBTSxjQUFjLEdBQUcsTUFBTSxpQkFBaUIsQ0FDNUMsUUFBUSxFQUNSLE9BQU8sQ0FBQyxhQUFhLENBQ3RCLENBQUM7WUFDRixhQUFhLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxFQUFFO2dCQUN2RCxNQUFNLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELFVBQVUsRUFBRSxjQUFjLENBQUMsVUFBVTtnQkFDckMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyx1QkFBdUI7YUFDbEUsQ0FBQyxDQUFDO1lBQ0gsZ0VBQWdFO1lBQ2hFLGdEQUFnRDtZQUNoRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3RELEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDbEQsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLENBQUM7YUFBTSxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2RCxpRUFBaUU7WUFDakUsbUVBQW1FO1lBQ25FLGdFQUFnRTtZQUNoRSw0REFBNEQ7WUFDNUQsOERBQThEO1lBQzlELGdFQUFnRTtZQUNoRSwrREFBK0Q7WUFDL0QsK0RBQStEO1lBQy9ELHNCQUFzQjtZQUN0QixrRUFBa0U7WUFDbEUsK0RBQStEO1lBQy9ELG9FQUFvRTtZQUNwRSx5REFBeUQ7WUFDekQsTUFBTSxJQUFJLEtBQUssQ0FDYiw4QkFBOEIsV0FBVyxDQUFDLEtBQUssbUpBQW1KLENBQ25NLENBQUM7UUFDSixDQUFDO1FBRUQsNkRBQTZEO1FBQzdELDZEQUE2RDtRQUM3RCxpRUFBaUU7UUFDakUsOERBQThEO1FBQzlELG1FQUFtRTtRQUNuRSxDQUFDO1lBQ0MsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsWUFBWSxFQUFFLFdBQVcsQ0FBQyxZQUFZO2dCQUN0QyxhQUFhLEVBQUUsV0FBVyxDQUFDLEtBQUs7Z0JBQ2hDLGlCQUFpQixFQUFFLFdBQVcsQ0FBQyxTQUFTO29CQUN0QyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO29CQUNsQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQ2QsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVTtvQkFDekIsQ0FBQyxDQUFDLFdBQVcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUU7b0JBQ3JDLENBQUMsQ0FBQyxvQkFBb0IsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUU7Z0JBQzlDLFFBQVEsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTthQUNsRCxDQUFDO1lBQ0YsRUFBRSxDQUFDLFFBQVEsQ0FDVCxnREFBZ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRztnQkFDekUsMkVBQTJFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FDMUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7UUFFRCxpRUFBaUU7UUFDakUsbUVBQW1FO1FBQ25FLHFEQUFxRDtRQUNyRCxtRUFBbUU7UUFDbkUsaUVBQWlFO1FBQ2pFLGlEQUFpRDtRQUNqRCxJQUFJLENBQUM7WUFDSCxFQUFFLENBQUMsUUFBUSxDQUFDO3VEQUNxQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQzs7b0RBRTdCLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBK0J6RSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE9BQU8sa0JBQWtCLENBQ3ZCLFlBQVksQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLDBCQUEwQixDQUFDLENBQ2xELENBQUM7UUFDSixDQUFDO1FBRUQsdUVBQXVFO1FBQ3ZFLG1FQUFtRTtRQUNuRSxzRUFBc0U7UUFDdEUsOENBQThDO1FBQzlDLENBQUM7WUFDQyxJQUFJLGFBQWEsR0FBRyxHQUFHLENBQUM7WUFDeEIsSUFBSSxZQUFxQixDQUFDO1lBQzFCLEdBQUcsQ0FBQztnQkFDRixZQUFZLEdBQUcsTUFBTSxhQUFhLENBQ2hDLEVBQUUsRUFDRixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixPQUFPLENBQUMsYUFBYSxDQUN0QixDQUFDO2dCQUNGLElBQUksS0FBYSxDQUFDO2dCQUNsQixHQUFHLENBQUM7b0JBQ0YsS0FBSyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUNoQyxJQUFJLEtBQUssR0FBRyxDQUFDO3dCQUFFLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3JDLENBQUMsUUFBUSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQ3RCLENBQUMsUUFBUSxZQUFZLElBQUksRUFBRSxhQUFhLEdBQUcsQ0FBQyxFQUFFO1lBQzlDLElBQUksWUFBWSxJQUFJLGFBQWEsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsNERBQTREO2dCQUM1RCw4REFBOEQ7Z0JBQzlELGlFQUFpRTtnQkFDakUsK0RBQStEO2dCQUMvRCxhQUFhLENBQUMsSUFBSSxDQUNoQix5RkFBeUYsRUFDekY7b0JBQ0UsYUFBYSxFQUFFLFdBQVcsQ0FBQyxLQUFLO29CQUNoQyxVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU07aUJBQzFCLENBQ0YsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLE9BQU8sZUFBZSxDQUNwQixFQUFFLEVBQ0YsS0FBSyxFQUNMLGVBQWUsRUFDZixZQUFZLEVBQ1osT0FBTyxDQUFDLGFBQWEsQ0FDdEIsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLFNBQVMsa0JBQWtCLENBQ3pCLE1BQTRCO0lBRTVCLE9BQU87UUFDTCxNQUFNO1FBQ04sa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQ2Isd0ZBQXdGLENBQ3pGLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUM7S0FDbEIsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQ3RCLEVBQVcsRUFDWCxLQUFtQixFQUNuQixlQUFnQyxFQUNoQyxZQUFrQyxFQUNsQyxhQUE2QjtJQUU3QixNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUUvQixNQUFNLE9BQU8sR0FBMkI7UUFDdEMsTUFBTTtRQUNOLEtBQUssQ0FBQyxrQkFBa0IsQ0FDdEIsU0FBa0I7WUFFbEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNYLE1BQU0sSUFBSSxLQUFLLENBQ2IsMEZBQTBGLENBQzNGLENBQUM7WUFDSixDQUFDO1lBQ0QsaUVBQWlFO1lBQ2pFLDhEQUE4RDtZQUM5RCxlQUFlLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUVuQyxJQUFJLGFBQWEsR0FBRyxHQUFHLENBQUM7WUFDeEIsSUFBSSxZQUFxQixDQUFDO1lBQzFCLEdBQUcsQ0FBQztnQkFDRixZQUFZLEdBQUcsTUFBTSxhQUFhLENBQ2hDLEVBQUUsRUFDRixLQUFLLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixhQUFhLENBQ2QsQ0FBQztnQkFDRixJQUFJLEtBQWEsQ0FBQztnQkFDbEIsR0FBRyxDQUFDO29CQUNGLEtBQUssR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDaEMsSUFBSSxLQUFLLEdBQUcsQ0FBQzt3QkFBRSxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUNyQyxDQUFDLFFBQVEsS0FBSyxHQUFHLENBQUMsRUFBRTtZQUN0QixDQUFDLFFBQVEsWUFBWSxJQUFJLEVBQUUsYUFBYSxHQUFHLENBQUMsRUFBRTtZQUU5QyxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFO2dCQUN6QyxrQkFBa0IsRUFBRSxJQUFJO2FBQ3pCLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztnQkFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ25DLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU87WUFDTCxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ2QsSUFBSSxDQUFDO29CQUNILEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDZixDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCwrQkFBK0I7Z0JBQ2pDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7SUFDRixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsNkJBQTZCO0FBRTdCLEtBQUssVUFBVSxhQUFhLENBQzFCLEVBQVcsRUFDWCxLQUFtQixFQUNuQixNQUFlLEVBQ2YsWUFBa0MsRUFDbEMsYUFBNkI7SUFFN0IsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IscUVBQXFFO1FBQ3JFLG9FQUFvRTtRQUNwRSxzRUFBc0U7UUFDdEUseUVBQXlFO1FBQ3pFLG9FQUFvRTtRQUNwRSxzRUFBc0U7UUFDdEUsd0VBQXdFO1FBQ3hFLHFFQUFxRTtRQUNyRSxxRUFBcUU7UUFDckUsaURBQWlEO1FBQ2pELElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDO1lBQUUsU0FBUztRQUV2QyxxRUFBcUU7UUFDckUsc0VBQXNFO1FBQ3RFLDJFQUEyRTtRQUMzRSx1REFBdUQ7UUFDdkQseURBQXlEO1FBQ3pELFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUvQixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxHQUFHO1lBQUUsU0FBUztRQUVuQixxRUFBcUU7UUFDckUsc0VBQXNFO1FBQ3RFLG9FQUFvRTtRQUNwRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUNiLFdBQVcsSUFBSSxLQUFLO1lBQ2xCLENBQUMsQ0FBRSxLQUFLLENBQUMsU0FBcUM7WUFDOUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVoQixnREFBZ0Q7UUFDaEQsUUFBUSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEIsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ3pCLEVBQUUsQ0FBQyxRQUFRLENBQUMsNEJBQTRCLEtBQUssR0FBRyxDQUFDLENBQ2xELENBQUM7Z0JBQ0YsTUFBTSxTQUFTLEdBQUcsU0FBUyxFQUFFLE1BQU0sSUFBSSxTQUFTLEVBQUUsTUFBTSxDQUFDO2dCQUN6RCxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNoQixJQUFJLFNBQVMsWUFBWSxVQUFVLEVBQUUsQ0FBQzt3QkFDcEMsOERBQThEO3dCQUM5RCxhQUFhLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFOzRCQUN0RCxhQUFhLEVBQUUsR0FBRzs0QkFDbEIsU0FBUyxFQUFFLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUM3RCxhQUFhLEVBQUUsU0FBUyxDQUFDLFVBQVU7NEJBQ25DLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQzt5QkFDckMsQ0FBQyxDQUFDO3dCQUNILE1BQU0sZUFBZSxHQUFHLE1BQU0saUJBQWlCLENBQzdDLFNBQVMsRUFDVCxhQUFhLENBQ2QsQ0FBQzt3QkFDRixhQUFhLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxFQUFFOzRCQUM1RCxhQUFhLEVBQUUsR0FBRzs0QkFDbEIsTUFBTSxFQUFFLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUNoRSxVQUFVLEVBQUUsZUFBZSxDQUFDLFVBQVU7eUJBQ3ZDLENBQUMsQ0FBQzt3QkFDSCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUN2RCxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO3dCQUNuRCxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3RCLEVBQUUsQ0FBQyxRQUFRLENBQ1QsMEJBQTBCLEtBQUsscUNBQXFDOzRCQUNsRSxpQ0FBaUMsS0FBSyxJQUFJOzRCQUMxQyxpQ0FBaUMsQ0FDcEMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDZCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sYUFBYSxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsRUFBRTs0QkFDN0QsYUFBYSxFQUFFLEdBQUc7NEJBQ2xCLElBQUksRUFBRSxPQUFPLFNBQVM7NEJBQ3RCLE1BQU0sRUFBRSxTQUFTLEtBQUssSUFBSTs0QkFDMUIsV0FBVyxFQUFFLFNBQVMsS0FBSyxTQUFTOzRCQUNwQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxJQUFJO3lCQUMxQyxDQUFDLENBQUM7d0JBQ0gsTUFBTSxVQUFVLEdBQ2QsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO3dCQUNwRSxFQUFFLENBQUMsUUFBUSxDQUNULDBCQUEwQixLQUFLLGFBQWEsVUFBVSxJQUFJOzRCQUN4RCxpQ0FBaUMsS0FBSyxJQUFJLENBQzdDLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2QsQ0FBQztvQkFDRCxxQ0FBcUM7b0JBQ3JDLENBQUM7d0JBQ0MsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFDaEIsSUFBSSxDQUFTLENBQUM7d0JBQ2QsR0FBRyxDQUFDOzRCQUNGLENBQUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzt3QkFDOUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ2xCLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGlFQUFpRTtvQkFDakUsZ0VBQWdFO29CQUNoRSw4REFBOEQ7b0JBQzlELCtEQUErRDtvQkFDL0QsMkJBQTJCO29CQUMzQixJQUFJLFNBQVMsWUFBWSxVQUFVLEVBQUUsQ0FBQzt3QkFDcEMsTUFBTSxlQUFlLEdBQUcsTUFBTSxpQkFBaUIsQ0FDN0MsU0FBUyxFQUNULGFBQWEsQ0FDZCxDQUFDO3dCQUNGLDREQUE0RDt3QkFDNUQsMERBQTBEO3dCQUMxRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUN2RCxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO3dCQUNoRCxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3RCLEVBQUUsQ0FBQyxRQUFRLENBQ1QsK0JBQStCLEtBQUssNkRBQTZEOzRCQUMvRiw4QkFBOEIsQ0FDakMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDZCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxVQUFVLEdBQ2QsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO3dCQUNwRSxFQUFFLENBQUMsUUFBUSxDQUNULCtCQUErQixLQUFLLHVDQUF1QyxVQUFVLEtBQUssQ0FDM0YsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDZCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsV0FBVyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDdkIsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ3pCLEVBQUUsQ0FBQyxRQUFRLENBQUMsNEJBQTRCLEtBQUssR0FBRyxDQUFDLENBQ2xELENBQUM7Z0JBQ0YsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIsTUFBTSxTQUFTLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQztvQkFDbkMsSUFBSSxTQUFTLFlBQVksVUFBVSxFQUFFLENBQUM7d0JBQ3BDLDREQUE0RDt3QkFDNUQsK0RBQStEO3dCQUMvRCxnRUFBZ0U7d0JBQ2hFLDZEQUE2RDt3QkFDN0QsK0RBQStEO3dCQUMvRCw0Q0FBNEM7d0JBQzVDLE1BQU0sU0FBUyxHQUFHLE1BQU0saUJBQWlCLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO3dCQUNwRSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNqRCxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO3dCQUNsRCxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3RCLEVBQUUsQ0FBQyxRQUFRLENBQ1QsY0FBYzs0QkFDWiwwQkFBMEIsS0FBSyxtQ0FBbUM7NEJBQ2xFLGlDQUFpQyxLQUFLLElBQUk7NEJBQzFDLGdDQUFnQzs0QkFDaEMsTUFBTSxDQUNULENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2QsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLG1EQUFtRDt3QkFDbkQsMERBQTBEO3dCQUMxRCw2REFBNkQ7d0JBQzdELHlDQUF5Qzt3QkFDekMsTUFBTSxhQUFhLEdBQ2pCLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFDO3dCQUN0RCxNQUFNLEdBQUcsR0FBRyxhQUFhOzRCQUN2QixDQUFDLENBQUMsQ0FBRyxTQUFxQyxDQUFDLE9BQWtCO2dDQUMzRCxhQUFhLENBQUM7NEJBQ2hCLENBQUMsQ0FBQyxPQUFPLFNBQVMsS0FBSyxRQUFRO2dDQUM3QixDQUFDLENBQUMsU0FBUztnQ0FDWCxDQUFDLENBQUMsYUFBYSxDQUFDO3dCQUNwQixNQUFNLFVBQVUsR0FDZCxDQUFDLGFBQWE7NEJBQ1osQ0FBQyxDQUFFLFNBQXFDLENBQUMsS0FBSzs0QkFDOUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFLLFNBQVMsRUFBRSxLQUE0QixDQUFDO3dCQUM3RCxNQUFNLGVBQWUsR0FBRyxVQUFVOzRCQUNoQyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHOzRCQUMxQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUNQLEVBQUUsQ0FBQyxRQUFRLENBQ1QsK0JBQStCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxlQUFlLEVBQUU7NEJBQ3ZHLDBCQUEwQixLQUFLLGNBQWM7NEJBQzdDLGlDQUFpQyxLQUFLLFFBQVEsQ0FDakQsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDZCxDQUFDO29CQUNELENBQUM7d0JBQ0MsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFDaEIsSUFBSSxDQUFTLENBQUM7d0JBQ2QsR0FBRyxDQUFDOzRCQUNGLENBQUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzt3QkFDOUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ2xCLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLDZEQUE2RDtvQkFDN0Qsa0RBQWtEO29CQUNsRCxNQUFNLFNBQVMsR0FBRyxTQUFTLEVBQUUsS0FBSyxDQUFDO29CQUNuQyxJQUFJLFNBQVMsWUFBWSxVQUFVLEVBQUUsQ0FBQzt3QkFDcEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7d0JBQ3BFLDREQUE0RDt3QkFDNUQsb0RBQW9EO3dCQUNwRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNqRCxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO3dCQUNoRCxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3RCLEVBQUUsQ0FBQyxRQUFRLENBQ1QsK0JBQStCLEtBQUssNERBQTREOzRCQUM5Riw4QkFBOEIsQ0FDakMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDZCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxhQUFhLEdBQ2pCLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFDO3dCQUN0RCxNQUFNLEdBQUcsR0FBRyxhQUFhOzRCQUN2QixDQUFDLENBQUMsQ0FBRyxTQUFxQyxDQUFDLE9BQWtCO2dDQUMzRCxhQUFhLENBQUM7NEJBQ2hCLENBQUMsQ0FBQyxPQUFPLFNBQVMsS0FBSyxRQUFRO2dDQUM3QixDQUFDLENBQUMsU0FBUztnQ0FDWCxDQUFDLENBQUMsYUFBYSxDQUFDO3dCQUNwQixNQUFNLFVBQVUsR0FDZCxDQUFDLGFBQWE7NEJBQ1osQ0FBQyxDQUFFLFNBQXFDLENBQUMsS0FBSzs0QkFDOUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFLLFNBQVMsRUFBRSxLQUE0QixDQUFDO3dCQUM3RCxFQUFFLENBQUMsUUFBUSxDQUNULCtCQUErQixLQUFLLHdDQUF3QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxZQUFZLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLENBQ3RLLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2QsQ0FBQztnQkFDSCxDQUFDO2dCQUNELFdBQVcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ3pCLEVBQUUsQ0FBQyxRQUFRLENBQUMsNEJBQTRCLEtBQUssR0FBRyxDQUFDLENBQ2xELENBQUM7Z0JBQ0YsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIsRUFBRSxDQUFDLFFBQVEsQ0FDVCwwQkFBMEIsS0FBSyxjQUFjO3dCQUMzQyxpQ0FBaUMsS0FBSyxJQUFJLENBQzdDLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ1osQ0FBQzt3QkFDQyxRQUFRLEdBQUcsSUFBSSxDQUFDO3dCQUNoQixJQUFJLENBQVMsQ0FBQzt3QkFDZCxHQUFHLENBQUM7NEJBQ0YsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO3dCQUM5QixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDbEIsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04seURBQXlEO29CQUN6RCxFQUFFLENBQUMsUUFBUSxDQUNULCtCQUErQixLQUFLLG9DQUFvQyxDQUN6RSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsV0FBVyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDdkIsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hCLDJEQUEyRDtnQkFDM0Qsd0RBQXdEO2dCQUN4RCwrREFBK0Q7Z0JBQy9ELE1BQU0sTUFBTSxHQUFJLFNBQVMsRUFBRSxNQUF3QztvQkFDakUsRUFBRSxJQUFJLENBQUM7Z0JBQ1QsSUFBSSxNQUFNLEtBQUssVUFBVTtvQkFBRSxNQUFNO2dCQUNqQyxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUN6QixFQUFFLENBQUMsUUFBUSxDQUFDLDRCQUE0QixLQUFLLEdBQUcsQ0FBQyxDQUNsRCxDQUFDO2dCQUNGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDakIseURBQXlEO29CQUN6RCxFQUFFLENBQUMsUUFBUSxDQUNULCtCQUErQixLQUFLLG9DQUFvQyxDQUN6RSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIsRUFBRSxDQUFDLFFBQVEsQ0FDVCwwQkFBMEIsS0FBSyxjQUFjO3dCQUMzQyxpQ0FBaUMsS0FBSyxJQUFJLENBQzdDLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ1osQ0FBQzt3QkFDQyxRQUFRLEdBQUcsSUFBSSxDQUFDO3dCQUNoQixJQUFJLENBQVMsQ0FBQzt3QkFDZCxHQUFHLENBQUM7NEJBQ0YsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO3dCQUM5QixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDbEIsQ0FBQztnQkFDSCxDQUFDO2dCQUNELFdBQVcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxlQUFlLENBQUMsQ0FBQyxDQUFDO2dCQUNyQiwwREFBMEQ7Z0JBQzFELGtFQUFrRTtnQkFDbEUsa0NBQWtDO2dCQUNsQyxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxPQUFPO29CQUNwQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FDTCxFQUFFLENBQUMsUUFBUSxDQUNULCtHQUErRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNqSixDQUNGO29CQUNILENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQ1YsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO29CQUNyQixhQUFhLENBQUMsS0FBSyxDQUNqQixrREFBa0QsRUFDbEQ7d0JBQ0UsYUFBYSxFQUFFLEdBQUc7d0JBQ2xCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztxQkFDdkIsQ0FDRixDQUFDO29CQUNGLFdBQVcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ3ZCLE1BQU07Z0JBQ1IsQ0FBQztnQkFFRCx3REFBd0Q7Z0JBQ3hELGtFQUFrRTtnQkFDbEUsbUVBQW1FO2dCQUNuRSw2REFBNkQ7Z0JBQzdELHNFQUFzRTtnQkFDdEUsa0VBQWtFO2dCQUNsRSxpRUFBaUU7Z0JBQ2pFLGtFQUFrRTtnQkFDbEUsMkNBQTJDO2dCQUMzQyxDQUFDO29CQUNDLGtFQUFrRTtvQkFDbEUsaURBQWlEO29CQUNqRCwyREFBMkQ7b0JBQzNELHVEQUF1RDtvQkFDdkQsTUFBTSxRQUFRLEdBQ1gsS0FBZ0MsQ0FBQyxRQUFRO3dCQUN6QyxTQUFnRCxFQUFFLFFBQVEsQ0FBQztvQkFDOUQsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDNUMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDdkIsRUFBRSxDQUFDLFFBQVEsQ0FDVCwyRUFBMkUsVUFBVSxZQUFZLENBQ2xHLENBQ0YsQ0FBQzt3QkFDRixJQUFJLFNBQVMsRUFBRSxDQUFDOzRCQUNkLGFBQWEsQ0FBQyxLQUFLLENBQ2pCLGdGQUFnRixFQUNoRixFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQ3pELENBQUM7NEJBQ0YsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7Z0NBQ2xCLEVBQUUsQ0FBQyxRQUFRLENBQ1QsbUhBQW1ILElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQzVKLENBQUMsT0FBTyxFQUFFLENBQUM7NEJBQ2QsQ0FBQzs0QkFDRCxXQUFXLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDOzRCQUN2QixNQUFNO3dCQUNSLENBQUM7d0JBQ0QsRUFBRSxDQUFDLFFBQVEsQ0FDVCxrQ0FBa0MsVUFBVSxXQUFXLENBQ3hELENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2QsQ0FBQztnQkFDSCxDQUFDO2dCQUVELGdFQUFnRTtnQkFDaEUsbUVBQW1FO2dCQUNuRSxvRUFBb0U7Z0JBQ3BFLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ3pCLEVBQUUsQ0FBQyxRQUFRLENBQ1QsNkRBQTZELEtBQUssSUFBSSxDQUN2RSxDQUNGLENBQUM7Z0JBQ0YsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIsTUFBTSxlQUFlLEdBQUcsU0FBUyxFQUFFLE9BQU8sQ0FBQztvQkFDM0MsSUFBSSxlQUFlLFlBQVksVUFBVSxFQUFFLENBQUM7d0JBQzFDLE1BQU0sU0FBUyxHQUFHLE1BQU0saUJBQWlCLENBQ3ZDLGVBQWUsRUFDZixhQUFhLENBQ2QsQ0FBQzt3QkFDRixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNuRCxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO3dCQUNwRCxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3hCLEVBQUUsQ0FBQyxRQUFRLENBQ1QsY0FBYzs0QkFDWiwrQkFBK0I7NEJBQy9CLGdDQUFnQzs0QkFDaEMsNkJBQTZCLEtBQUssMkRBQTJEOzRCQUM3RixNQUFNLENBQ1QsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDZCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sRUFBRSxDQUFDLFFBQVEsQ0FDVCw2QkFBNkIsS0FBSywyQkFBMkIsQ0FDOUQsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDZCxDQUFDO29CQUNELDJEQUEyRDtvQkFDM0QsOERBQThEO29CQUM5RCwyREFBMkQ7b0JBQzNELDREQUE0RDtvQkFDNUQsOERBQThEO29CQUM5RCxFQUFFLENBQUMsUUFBUSxDQUNULGNBQWM7d0JBQ1osd0VBQXdFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHVCQUF1Qjt3QkFDbEgsOEJBQThCO3dCQUM5QixNQUFNLENBQ1QsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDWixJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDbEIsRUFBRSxDQUFDLFFBQVEsQ0FDVCxtSEFBbUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FDNUosQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDZCxDQUFDO29CQUNELENBQUM7d0JBQ0MsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFDaEIsSUFBSSxDQUFTLENBQUM7d0JBQ2QsR0FBRyxDQUFDOzRCQUNGLENBQUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzt3QkFDOUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ2xCLENBQUM7b0JBQ0QsV0FBVyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDdkIsTUFBTTtnQkFDUixDQUFDO2dCQUVELE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ3pCLEVBQUUsQ0FBQyxRQUFRLENBQUMsNEJBQTRCLEtBQUssR0FBRyxDQUFDLENBQ2xELENBQUM7Z0JBQ0YsTUFBTSxVQUFVLEdBQUcsU0FBUyxFQUFFLE9BQU8sSUFBSSxTQUFTLEVBQUUsTUFBTSxDQUFDO2dCQUMzRCxhQUFhLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxFQUFFO29CQUMvRCxhQUFhLEVBQUUsR0FBRztvQkFDbEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO29CQUN0QixXQUFXO29CQUNYLFdBQVcsRUFBRSxPQUFPLFVBQVU7b0JBQzlCLG1CQUFtQixFQUFFLFVBQVUsWUFBWSxVQUFVO29CQUNyRCxXQUFXLEVBQ1QsVUFBVSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVE7d0JBQzFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzt3QkFDekIsQ0FBQyxDQUFDLFNBQVM7aUJBQ2hCLENBQUMsQ0FBQztnQkFDSCxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNoQixJQUFJLFVBQVUsWUFBWSxVQUFVLEVBQUUsQ0FBQzt3QkFDckMsOERBQThEO3dCQUM5RCxNQUFNLGdCQUFnQixHQUFHLE1BQU0saUJBQWlCLENBQzlDLFVBQVUsRUFDVixhQUFhLENBQ2QsQ0FBQzt3QkFDRixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7d0JBQzFELEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsYUFBYSxDQUFDLENBQUM7d0JBQ3JELGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDeEIsRUFBRSxDQUFDLFFBQVEsQ0FDVCwwQkFBMEIsS0FBSyxxQ0FBcUM7NEJBQ2xFLGlDQUFpQyxLQUFLLElBQUk7NEJBQzFDLGlDQUFpQyxDQUNwQyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNkLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixNQUFNLFVBQVUsR0FDZCxVQUFVLEtBQUssU0FBUzs0QkFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDOzRCQUM1QixDQUFDLENBQUMsV0FBVyxDQUFDO3dCQUNsQixFQUFFLENBQUMsUUFBUSxDQUNULDBCQUEwQixLQUFLLGFBQWEsVUFBVSxJQUFJOzRCQUN4RCxpQ0FBaUMsS0FBSyxJQUFJLENBQzdDLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2QsQ0FBQztvQkFDRCx5REFBeUQ7b0JBQ3pELHVEQUF1RDtvQkFDdkQsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ2xCLEVBQUUsQ0FBQyxRQUFRLENBQ1QsbUhBQW1ILElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQzVKLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2QsQ0FBQztvQkFDRCxDQUFDO3dCQUNDLFFBQVEsR0FBRyxJQUFJLENBQUM7d0JBQ2hCLElBQUksQ0FBUyxDQUFDO3dCQUNkLEdBQUcsQ0FBQzs0QkFDRixDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUM7d0JBQzlCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNsQixDQUFDO2dCQUNILENBQUM7cUJBQU0sQ0FBQztvQkFDTiw4REFBOEQ7b0JBQzlELGlFQUFpRTtvQkFDakUsZ0VBQWdFO29CQUNoRSxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTzt3QkFDN0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQzt3QkFDL0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQztvQkFDWCxNQUFNLGNBQWMsR0FDbEIsbUNBQW1DLEtBQUssc0NBQXNDLEtBQUssVUFBVTt3QkFDN0YsbUJBQW1CO3dCQUNuQixDQUFDLEtBQUssQ0FBQyxPQUFPOzRCQUNaLENBQUMsQ0FBQyxtSEFBbUgsU0FBUyxXQUFXOzRCQUN6SSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ1YsSUFBSSxVQUFVLFlBQVksVUFBVSxFQUFFLENBQUM7d0JBQ3JDLDhEQUE4RDt3QkFDOUQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLGlCQUFpQixDQUM5QyxVQUFVLEVBQ1YsYUFBYSxDQUNkLENBQUM7d0JBQ0YsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO3dCQUMxRCxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDO3dCQUNyRCxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3hCLDBEQUEwRDt3QkFDMUQseURBQXlEO3dCQUN6RCxnQ0FBZ0M7d0JBQ2hDLEVBQUUsQ0FBQyxRQUFRLENBQ1QsY0FBYyxDQUFDLE9BQU8sQ0FDcEIsV0FBVyxFQUNYLEdBQUcsRUFBRSxDQUFDLHlCQUF5QixDQUNoQyxHQUFHLGlDQUFpQyxDQUN0QyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNkLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixNQUFNLFVBQVUsR0FDZCxVQUFVLEtBQUssU0FBUzs0QkFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDOzRCQUM1QixDQUFDLENBQUMsV0FBVyxDQUFDO3dCQUNsQiw4REFBOEQ7d0JBQzlELDhEQUE4RDt3QkFDOUQsaURBQWlEO3dCQUNqRCxFQUFFLENBQUMsUUFBUSxDQUNULGNBQWMsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUN0RCxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNkLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxXQUFXLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssZUFBZSxDQUFDLENBQUMsQ0FBQztnQkFDckIsaUVBQWlFO2dCQUNqRSxnRUFBZ0U7Z0JBQ2hFLCtEQUErRDtnQkFDL0QsNkRBQTZEO2dCQUM3RCwyREFBMkQ7Z0JBQzNELGlFQUFpRTtnQkFDakUsTUFBTSxhQUFhLEdBQUksU0FBUyxFQUFFLEtBQWdCLElBQUksU0FBUyxDQUFDO2dCQUNoRSxNQUFNLGdCQUFnQixHQUFHLFNBQVMsRUFBRSxnQkFFdkIsQ0FBQztnQkFDZCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUN2QixFQUFFLENBQUMsUUFBUSxDQUNUOzBCQUNjLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDOzRCQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQzt1Q0FDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aUJBcUM5RCxDQUNOLENBQ0YsQ0FBQztnQkFDRixJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUNkLFFBQVEsR0FBRyxJQUFJLENBQUM7b0JBQ2hCLElBQUksQ0FBUyxDQUFDO29CQUNkLEdBQUcsQ0FBQzt3QkFDRixDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQzlCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNsQixDQUFDO2dCQUNELFdBQVcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxjQUFjLENBQUM7WUFDcEIsS0FBSyxjQUFjLENBQUM7WUFDcEIsS0FBSyxlQUFlLENBQUM7WUFDckIsS0FBSyxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixXQUFXLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssY0FBYyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsaUVBQWlFO2dCQUNqRSxnRUFBZ0U7Z0JBQ2hFLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDaEMsRUFBRSxDQUFDLFFBQVEsQ0FDVDtxRUFDeUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7Ozs7Ozs7aUJBT3ZFLENBQ04sQ0FDRixDQUFDO2dCQUNGLElBQUksa0JBQWtCLEVBQUUsQ0FBQztvQkFDdkIsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDaEIsSUFBSSxDQUFTLENBQUM7b0JBQ2QsR0FBRyxDQUFDO3dCQUNGLENBQUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDOUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2xCLENBQUM7Z0JBQ0QsV0FBVyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDdkIsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JCLHdEQUF3RDtnQkFDeEQsMkRBQTJEO2dCQUMzRCxXQUFXLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztnQkFDdkMsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxFQUFXLEVBQUUsS0FBYSxFQUFFLE1BQWU7SUFDOUQsMkVBQTJFO0lBQzNFLHNFQUFzRTtJQUN0RSxvRUFBb0U7SUFDcEUsbUVBQW1FO0lBQ25FLG9FQUFvRTtJQUNwRSwwREFBMEQ7SUFDMUQsTUFBTSxTQUFTLEdBQUcsTUFBTTtRQUN0QixDQUFDLENBQUMsd0NBQXdDLEtBQUssY0FBYyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJO1FBQ3ZGLENBQUMsQ0FBQyx3Q0FBd0MsS0FBSyxJQUFJLENBQUM7SUFDdEQsRUFBRSxDQUFDLFFBQVEsQ0FDVCxxQ0FBcUMsU0FBUyxJQUFJO1FBQ2hELGtDQUFrQyxDQUNyQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ2QsQ0FBQztBQUVELDJCQUEyQjtBQUUzQjs7Ozs7Ozs7R0FRRztBQUNIOzs7OztHQUtHO0FBQ0gsK0VBQStFO0FBQy9FLGdGQUFnRjtBQUNoRixtQkFBbUI7QUFDbkIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBb0MsQ0FBQztBQUV6RSxTQUFTLHNCQUFzQixDQUFDLEVBQVc7SUFDekMsSUFBSSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQVUsQ0FBQztBQUUxRTs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQ3JCLEVBQVcsRUFDWCxLQUFtQixFQUNuQixVQUFrQixFQUNsQixTQUFtQzs7O1FBRW5DLE1BQU0sU0FBUyxrQ0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUNoQixVQUFVOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BNEJuQixDQUFDLFFBQUEsQ0FBQztRQUNQLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUsvQixDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUM1Qix1RUFBdUU7UUFDdkUscUVBQXFFO1FBQ3JFLDhEQUE4RDtRQUM5RCxvRUFBb0U7UUFDcEUsd0RBQXdEO1FBQ3hELElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNDLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNqQyxLQUFLLE1BQU0sS0FBSyxJQUFJLGtCQUFrQixFQUFFLENBQUM7b0JBQ3ZDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDdEMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxTQUFTLGtDQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsUUFBQSxDQUFDO1FBQ3hELEtBQUssTUFBTSxFQUFFLElBQUksUUFBUSxFQUFFLENBQUM7WUFDMUIsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7WUFDekMsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3ZCLEtBQUssTUFBTSxLQUFLLElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDdkMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLEtBQUssS0FBSyxTQUFTO29CQUFFLFNBQVM7Z0JBQ2xDLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDLGFBQWEsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxLQUFLLEdBQUcsU0FBUyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDOzs7d0JBQ1gsTUFBTSxXQUFXLGtDQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQUEsQ0FBQzt3QkFDckQsSUFBSSxDQUFDOzRCQUNILEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUN2QyxDQUFDO3dCQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7NEJBQ2IsaUVBQWlFOzRCQUNqRSw4REFBOEQ7NEJBQzlELCtEQUErRDs0QkFDL0QsNkRBQTZEOzRCQUM3RCxvREFBb0Q7NEJBQ3BELDhEQUE4RDs0QkFDOUQsaUVBQWlFOzRCQUNqRSw4REFBOEQ7NEJBQzlELDJEQUEyRDs0QkFDM0QsaURBQWlEOzRCQUNqRCxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLEtBQUssS0FBSyxPQUFPLEVBQUUsQ0FBQztnQ0FDNUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyx3QkFBd0IsQ0FDaEQsZ0JBQWdCLEVBQ2hCLEdBQUcsQ0FDSixDQUFDO2dDQUNELEVBQWtCLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxrQkFBa0IsQ0FDN0QsT0FBTyxFQUNQLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FDckIsQ0FBQztnQ0FDRixTQUFTOzRCQUNYLENBQUM7NEJBQ0QsTUFBTSxHQUFHLENBQUM7d0JBQ1osQ0FBQzt3QkFDRCxTQUFTLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQzs7Ozs7Ozs7O2lCQUNqQztnQkFDQSxFQUF5QyxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUM1RCxDQUFDO1FBQ0gsQ0FBQztRQUNELEVBQUUsQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN2RCxPQUFPLFFBQVEsQ0FBQzs7Ozs7Ozs7O0NBQ2pCO0FBRUQsU0FBUyxzQkFBc0IsQ0FDN0IsRUFBVyxFQUNYLEtBQW1CO0lBRW5CLHVFQUF1RTtJQUN2RSxzRUFBc0U7SUFDdEUsNEVBQTRFO0lBQzVFLHdFQUF3RTtJQUN4RSxPQUFPLGNBQWMsQ0FDbkIsRUFBRSxFQUNGLEtBQUssRUFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bd0JHLEVBQ0gsc0JBQXNCLENBQUMsRUFBRSxDQUFDLENBQzNCLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FDekIsRUFBVyxFQUNYLEtBQW1CLEVBQ25CLE9BQXlDLEVBQUU7SUFFM0MsdUVBQXVFO0lBQ3ZFLHNFQUFzRTtJQUN0RSx1Q0FBdUM7SUFDdkMsQ0FBQzs7O1lBQ0MsTUFBTSxJQUFJLGtDQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsb0NBQW9DLENBQUMsUUFBQSxDQUFDO1lBQy9ELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7OztvQkFDckIsTUFBTSxDQUFDLGtDQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQUMsUUFBQSxDQUFDO29CQUNyRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN2QyxNQUFNLGVBQWUsR0FBRyxzQkFBc0IsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQzFELEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDYixPQUFPO3dCQUNMLFNBQVMsRUFBRTs0QkFDVCxNQUFNLEVBQUUsV0FBVzs0QkFDbkIsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7eUJBQzNEO3FCQUNGLENBQUM7Ozs7Ozs7OzthQUNIOzs7Ozs7Ozs7S0FDRjtJQUVELGVBQWU7SUFDZixDQUFDOzs7WUFDQyxNQUFNLENBQUMsa0NBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxRQUFBLENBQUM7WUFDcEQsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsbUVBQW1FO2dCQUNuRSxpREFBaUQ7Z0JBQ2pELE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxRQUFRO29CQUN6QixDQUFDLENBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBYTtvQkFDMUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFOzs7NEJBQ0osTUFBTSxLQUFLLG1DQUFHLEVBQUUsQ0FBQyxRQUFRLENBQ3ZCLHVHQUF1RyxDQUN4RyxRQUFBLENBQUM7NEJBQ0YsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FJbkIsQ0FBQzs7Ozs7Ozs7O3FCQUNILENBQUMsRUFBRSxDQUFDO2dCQUNULElBQUksVUFBa0MsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7O3dCQUNoQixNQUFNLFFBQVEsbUNBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBQSxDQUFDO3dCQUNwQyxJQUFJLENBQUM7NEJBQ0gsVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3pDLENBQUM7d0JBQUMsT0FBTyxZQUFZLEVBQUUsQ0FBQzs0QkFDdEIsOERBQThEOzRCQUM5RCwrREFBK0Q7NEJBQy9ELGFBQWEsQ0FBQyxJQUFJLENBQ2hCLDREQUE0RCxFQUM1RDtnQ0FDRSxPQUFPLEVBQ0wsWUFBWSxZQUFZLEtBQUs7b0NBQzNCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTztvQ0FDdEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7NkJBQzNCLENBQ0YsQ0FBQzt3QkFDSixDQUFDOzs7Ozs7Ozs7aUJBQ0Y7Z0JBQ0QsTUFBTSxNQUFNLEdBQ1YsT0FBTyxRQUFRLEtBQUssUUFBUTtvQkFDMUIsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRTtvQkFDdkIsQ0FBQyxDQUFDO3dCQUNFLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTzt3QkFDekIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLElBQUksU0FBUzt3QkFDbEMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksU0FBUzt3QkFDaEMsVUFBVTtxQkFDWCxDQUFDO2dCQUNSLGFBQWEsQ0FBQyxLQUFLLENBQUMsd0NBQXdDLEVBQUU7b0JBQzVELFlBQVksRUFBRSxNQUFNLENBQUMsT0FBTztvQkFDNUIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJO29CQUN0QixVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQUs7aUJBQ3pCLENBQUMsQ0FBQztnQkFDSCxNQUFNLGVBQWUsR0FBRyxzQkFBc0IsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzFELEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDYixPQUFPO29CQUNMLE1BQU0sRUFBRTt3QkFDTixHQUFHLE1BQU07d0JBQ1QsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7cUJBQzNEO2lCQUNGLENBQUM7WUFDSixDQUFDOzs7Ozs7Ozs7S0FDRjtJQUVELDJFQUEyRTtJQUMzRSwwRUFBMEU7SUFDMUUsK0JBQStCO0lBQy9CLENBQUM7OztZQUNDLE1BQU0sQ0FBQyxtQ0FBRyxFQUFFLENBQUMsUUFBUSxDQUNuQixxSEFBcUgsQ0FDdEgsUUFBQSxDQUFDO1lBQ0YsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2YsNkRBQTZEO2dCQUM3RCw4REFBOEQ7Z0JBQzlELGdFQUFnRTtnQkFDaEUsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUMvQixFQUFFLEVBQ0YsS0FBSyxFQUNMLHNJQUFzSSxFQUN0SSxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsQ0FDM0IsQ0FBQztnQkFDRixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQjtvQkFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBRTNDLE9BQU87b0JBQ0wsU0FBUyxFQUFFO3dCQUNULGlCQUFpQixFQUFFLFVBQVU7cUJBQzlCO2lCQUNGLENBQUM7WUFDSixDQUFDOzs7Ozs7Ozs7S0FDRjtJQUVELEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNiLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsRUFBRSxDQUFDO0FBQ3BFLENBQUM7QUFFRCxvQkFBb0I7QUFFcEIsU0FBUyxZQUFZLENBQ25CLEVBQVcsRUFDWCxHQUFZLEVBQ1osZUFBdUI7SUFFdkIsSUFBSSxPQUFPLEdBQUcsZUFBZSxDQUFDO0lBQzlCLElBQUksS0FBeUIsQ0FBQztJQUM5QixJQUFJLElBQXdCLENBQUM7SUFFN0IsSUFBSSxHQUFHLFlBQVksV0FBVyxFQUFFLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFtQyxDQUFDO1FBQ3BFLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckIsT0FBTyxHQUFJLEtBQUssRUFBRSxPQUFrQixJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDO1FBQ3ZFLEtBQUssR0FBSSxLQUFLLEVBQUUsS0FBZ0IsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQzlDLElBQUksR0FBSSxLQUFLLEVBQUUsSUFBZSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUM7SUFDN0MsQ0FBQztTQUFNLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRSxDQUFDO1FBQ2hDLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxJQUFJLGVBQWUsQ0FBQztRQUN6QyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUNsQixJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztJQUNsQixDQUFDO0lBRUQsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2IsT0FBTztRQUNMLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0tBQ2pDLENBQUM7QUFDSixDQUFDO0FBcUJELFNBQVMsc0JBQXNCLENBQUMsTUFBdUI7SUFDckQsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQyxPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBRdWlja0pTIFdlYkFzc2VtYmx5IChXQVNNKSB3b3JrZmxvdyBWTS5cbiAqXG4gKiBBbiBhbHRlcm5hdGl2ZSBlbmdpbmUgZm9yIHRoZSBldmVudC1yZXBsYXkgZXhlY3V0aW9uIG1vZGVsOiB0aGUgd29ya2Zsb3dcbiAqIGNvZGUgcnVucyBpbnNpZGUgYSBRdWlja0pTIFdBU00gVk0gKHZpYSBxdWlja2pzLXdhc2kpIGluc3RlYWQgb2YgYVxuICogYG5vZGU6dm1gIGNvbnRleHQuIEV2ZXJ5IGludm9jYXRpb24gY3JlYXRlcyBhIGZyZXNoIFZNLCByZS1leGVjdXRlcyB0aGVcbiAqIHdvcmtmbG93IGZ1bmN0aW9uIGZyb20gdGhlIHRvcCwgYW5kIHJlcGxheXMgdGhlIHJlY29yZGVkIGV2ZW50IGxvZyB0b1xuICogcmVzb2x2ZSBhd2FpdGVkIHByaW1pdGl2ZXM6IHRoZSBzYW1lIHJlcGxheSBzZW1hbnRpY3MgYXMgdGhlIGBub2RlOnZtYFxuICogZW5naW5lLlxuICpcbiAqIFRoZSB3b3JrZmxvdyBwcmltaXRpdmVzICh1c2VTdGVwLCBzbGVlcCwgY3JlYXRlSG9vaykgYXJlIGltcGxlbWVudGVkIGFzXG4gKiBKYXZhU2NyaXB0IGNvZGUgcnVubmluZyBpbnNpZGUgdGhlIFF1aWNrSlMgVk0uIFRoZSBob3N0IGNvbW11bmljYXRlcyB3aXRoXG4gKiB0aGUgVk0gYnkgZXZhbHVhdGluZyBzbWFsbCBKUyBzbmlwcGV0cyB0byByZWFkIHBlbmRpbmcgb3BlcmF0aW9ucyBhbmRcbiAqIHJlc29sdmUvcmVqZWN0IHByb21pc2VzLlxuICpcbiAqIFRoZSBWTSBib290c3RyYXAgaXMgZGVsaWJlcmF0ZWx5IHNwbGl0IGludG8gdHdvIHBoYXNlczpcbiAqICAgMS4gU3RhdGljIGluaXRpYWxpemF0aW9uIChgaW5pdFdvcmtmbG93Vk1gKTogcnVuLWluZGVwZW5kZW50IHNldHVwOlxuICogICAgICBWTSBjcmVhdGlvbiBhbmQgdGhlIHdvcmtmbG93IHByaW1pdGl2ZXMuIChTZXJpYWxpemF0aW9uIGxpdmVzIG9uXG4gKiAgICAgIHRoZSBob3N0IChzZWUgcXVpY2tqcy1zZXJkZS50cykgc28gbm8gc2VyZGUgY29kZSBpcyBldmFsdWF0ZWRcbiAqICAgICAgaW4gdGhlIFZNLilcbiAqICAgMi4gUGVyLXJ1biBpbml0aWFsaXphdGlvbiAoaW5saW5lIGluIGBydW5RdWlja0pTV29ya2Zsb3dgKTogc2VlZGVkXG4gKiAgICAgIFBSTkcvVUxJRCBob3N0IGZ1bmN0aW9ucywgd29ya2Zsb3cgYnVuZGxlIGV2YWx1YXRpb24sIHJ1biBtZXRhZGF0YSxcbiAqICAgICAgd29ya2Zsb3cgaW5wdXQsIGFuZCBzdGFydC5cbiAqIEtlZXBpbmcgdGhlIHBoYXNlcyBzZXBhcmF0ZSBpcyBncm91bmR3b3JrIGZvciBWTS1tZW1vcnkgc25hcHNob3R0aW5nOlxuICogYSBmb2xsb3ctdXAgY2FuIHBlcnNpc3QvcmVzdG9yZSB0aGUgVk0gYXQgdGhlIHBoYXNlIGJvdW5kYXJ5IChlLmcuIGFcbiAqIGJ1aWxkLXRpbWUgaW5pdGlhbCBzbmFwc2hvdCkgd2l0aG91dCByZXN0cnVjdHVyaW5nIHRoaXMgbW9kdWxlLiBOb3RlXG4gKiB0aGF0IGJ1bmRsZSBldmFsdWF0aW9uIGN1cnJlbnRseSBzaXRzIGluIHRoZSBwZXItcnVuIHBoYXNlIHNvIHRoYXRcbiAqIG1vZHVsZS1zY29wZSB1c2VyIGNvZGUgb2JzZXJ2ZXMgdGhlIHNlZWRlZCBgTWF0aC5yYW5kb21gLCBtYXRjaGluZyB0aGVcbiAqIGBub2RlOnZtYCBlbmdpbmUncyByZXBsYXkgZGV0ZXJtaW5pc20uXG4gKi9cblxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBnbG9iYWxTaW5nbGV0b24gfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHtcbiAgdHlwZSBFdmVudCxcbiAgaXNTZWFsZWROb29wRXZlbnQsXG4gIHR5cGUgUnVuSW5wdXQsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG4gIHR5cGUgV29ybGRDYXBhYmlsaXRpZXMsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgKiBhcyBuYW5vaWQgZnJvbSAnbmFub2lkJztcbmltcG9ydCB7XG4gIHR5cGUgRXh0ZW5zaW9uRGVzY3JpcHRvcixcbiAgSlNFeGNlcHRpb24sXG4gIFF1aWNrSlMsXG4gIHR5cGUgU25hcHNob3QsXG4gIHR5cGUgV2FzaU9wdGlvbnMsXG59IGZyb20gJ3F1aWNranMtd2FzaSc7XG5pbXBvcnQgc2VlZHJhbmRvbSBmcm9tICdzZWVkcmFuZG9tJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZGVjb21wcmVzcyB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vY29tcHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgeyBEZWNyeXB0aW9uS2V5IH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IGRlY3J5cHQgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9lcnJvcnMuanMnO1xuaW1wb3J0IHtcbiAgZ2V0UmVwbGF5VGltZW91dE1zLFxuICBpc1F1aWNrSlNCYXNlbGluZVNuYXBzaG90RW5hYmxlZCxcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgcXVpY2tqc0V4dGVuc2lvbnMsIHF1aWNranNXYXNtIH0gZnJvbSAnLi9xdWlja2pzLWFzc2V0cy5nZW5lcmF0ZWQuanMnO1xuaW1wb3J0IHtcbiAgYWRvcHRTZXJkZVJvb3QsXG4gIGNhcHR1cmVTZXJkZVJvb3QsXG4gIGNyZWF0ZVF1aWNrSlNTZXJkZSxcbiAgZXhwb3J0U2VyZGVSb290LFxuICB0eXBlIFF1aWNrSlNTZXJkZSxcbn0gZnJvbSAnLi9xdWlja2pzLXNlcmRlLmpzJztcbmltcG9ydCB7IHJ1bklkQ3JlYXRlZEF0IH0gZnJvbSAnLi9ydW4taWQtdGltZS5qcyc7XG5cbi8vIC0tLS0gSG9zdCAtPiBWTSBwYXlsb2FkIHByZXBhcmF0aW9uIC0tLS1cblxuLyoqXG4gKiBQcmVwYXJlIHBlcnNpc3RlZCBwYXlsb2FkIGJ5dGVzIGZvciBjb25zdW1wdGlvbiBpbnNpZGUgdGhlIFZNOiBkZWNyeXB0XG4gKiAod2hlbiBhbiBlbmNyeXB0aW9uIGtleSBpcyBjb25maWd1cmVkKSBhbmQgZGVjb21wcmVzcyAoc3BlY1ZlcnNpb24gPj0gNVxuICogcGF5bG9hZHMgbWF5IGJlIGd6aXAvenN0ZC1jb21wcmVzc2VkKS4gVGhlIFZNIG9ubHkgdW5kZXJzdGFuZHMgcGxhaW5cbiAqIGZvcm1hdC1wcmVmaXhlZCAnZGV2bCcgYnl0ZXM6IGl0IGhhcyBuZWl0aGVyIHRoZSBrZXkgbWF0ZXJpYWwgbm9yIHpsaWIuXG4gKiBUaGUga2V5IGlzIHRoZSBydW4ncyBmdWxsIERlY3J5cHRpb25LZXkgY2FwYWJpbGl0eSAoc3ltbWV0cmljIEFFUyBrZXkgK1xuICogWDI1NTE5IGtleXBhaXIpIHNvIHNlYWxlZCBgZW5jcGAgaG9vayBwYXlsb2FkcyBmcm9tIGNyb3NzLWRlcGxveW1lbnRcbiAqIHJlc3VtZUhvb2soKSBjYWxscyBvcGVuIGhlcmUgdG9vLCBub3QganVzdCBzeW1tZXRyaWMgYGVuY3JgIG9uZXMuXG4gKiBCb3RoIHN0YWdlcyBhcmUgZm9ybWF0LXByZWZpeCBkaXNwYXRjaGVkLCBzbyBwbGFpbnRleHQvdW5jb21wcmVzc2VkXG4gKiBkYXRhIHBhc3NlcyB0aHJvdWdoIHVuY2hhbmdlZC4gTWlycm9ycyBgcHJlcGFyZVJlcGxheVBheWxvYWRgIGluXG4gKiBzZXJpYWxpemF0aW9uLnRzICh0aGUgbm9kZTp2bSBlbmdpbmUncyBlcXVpdmFsZW50IGhvc3Qtc2lkZSBzdGFnZSkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVCeXRlc0ZvclZNKFxuICBkYXRhOiBVaW50OEFycmF5LFxuICBrZXk/OiBEZWNyeXB0aW9uS2V5XG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIChhd2FpdCBkZWNvbXByZXNzKGF3YWl0IGRlY3J5cHQoZGF0YSwga2V5KSkpIGFzIFVpbnQ4QXJyYXk7XG59XG5cbi8vIC0tLS0gVHlwZXMgLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlbmRpbmdTdGVwIHtcbiAgdHlwZTogJ3N0ZXAnO1xuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gIHN0ZXBJZDogc3RyaW5nO1xuICAvKipcbiAgICogRm9ybWF0LXByZWZpeGVkIGRldmFsdWUtc2VyaWFsaXplZCBzdGVwIGlucHV0IChhcmdzICsgY2xvc3VyZVZhcnMpLlxuICAgKiBBYnNlbnQgd2hlbiB7QGxpbmsgc2VyaWFsaXphdGlvbkVycm9yfSBpcyBzZXQ6IHRoZSBpbnB1dCBpcyBwcmVjaXNlbHlcbiAgICogd2hhdCByZWZ1c2VkIHRvIHNlcmlhbGl6ZS5cbiAgICovXG4gIGlucHV0PzogVWludDhBcnJheTtcbiAgLyoqIFdoZXRoZXIgYSBzdGVwX2NyZWF0ZWQgZXZlbnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgc3RlcCAqL1xuICBoYXNDcmVhdGVkRXZlbnQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTZXQgd2hlbiBob3N0LXNpZGUgc2VyaWFsaXphdGlvbiBvZiB0aGUgc3RlcCdzIHJhdyBpbnB1dCBmYWlsZWQgd2hpbGVcbiAgICogZHVtcGluZyB0aGUgVk0ncyBwZW5kaW5nIG9wcyAoc2VlIGBkdW1wUGVuZGluZ09wc2ApLiBUaGUgZmFpbHVyZSBpc1xuICAgKiBkZXRlcm1pbmlzdGljIChyZXBsYXlpbmcgcmUtZGVyaXZlcyB0aGUgc2FtZSB1bnNlcmlhbGl6YWJsZSB2YWx1ZSksIHNvXG4gICAqIGluc3RlYWQgb2YgZmFpbGluZyB0aGUgd2hvbGUgY29sbGVjdGlvbiB0aGUgb3AgaXMgc3VyZmFjZWQgd2l0aCB0aGVcbiAgICogcmVmcmFtZWQgZXJyb3IgYW5kIG5vIGBpbnB1dGA7IHRoZSBlbnRyeXBvaW50IGZpbmFsaXplcyB0aGUgc3RlcCBhc1xuICAgKiBgc3RlcF9jcmVhdGVkYCAocGxhY2Vob2xkZXIgaW5wdXQpICsgYHN0ZXBfZmFpbGVkYCwgbWlycm9yaW5nIHRoZVxuICAgKiBub2RlOnZtIGVuZ2luZSdzIGBmaW5hbGl6ZVVuc2VyaWFsaXphYmxlU3RlcGAsIHNvIGEgdHJ5L2NhdGNoIGFyb3VuZFxuICAgKiB0aGUgc3RlcCBjYWxsIG9ic2VydmVzIHRoZSBTZXJpYWxpemF0aW9uRXJyb3IuXG4gICAqL1xuICBzZXJpYWxpemF0aW9uRXJyb3I/OiBTZXJpYWxpemF0aW9uRXJyb3I7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ1dhaXQge1xuICB0eXBlOiAnd2FpdCc7XG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgLyoqIElTTyBzdHJpbmcgb2Ygd2hlbiB0byByZXN1bWUgKi9cbiAgcmVzdW1lQXQ6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgYSB3YWl0X2NyZWF0ZWQgZXZlbnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgd2FpdCAqL1xuICBoYXNDcmVhdGVkRXZlbnQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ0hvb2sge1xuICB0eXBlOiAnaG9vayc7XG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgdG9rZW46IHN0cmluZztcbiAgLyoqIEVhcmxpZXN0IHRva2VuIHJldXNlIHRpbWUsIGFzIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgVW5peCBlcG9jaC4gKi9cbiAgdG9rZW5SZXRlbnRpb25VbnRpbD86IG51bWJlcjtcbiAgaXNXZWJob29rOiBib29sZWFuO1xuICBtZXRhZGF0YT86IHVua25vd247XG4gIGhhc0NyZWF0ZWRFdmVudDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRydWUgZm9yIGludGVybmFsIHN5c3RlbSBob29rcyAoZS5nLiBBYm9ydENvbnRyb2xsZXIncyBob29rKSwgd2hpY2hcbiAgICogYXJlIGV4ZW1wdCBmcm9tIHVzZXItaG9vayB0b2tlbiBuYW1lc3BhY2UgY29uZmxpY3QgY2hlY2tzLlxuICAgKi9cbiAgaXNTeXN0ZW0/OiBib29sZWFuO1xuICAvKipcbiAgICogU2V0IHdoZW4gdGhlIHdvcmtmbG93IGNhbGxlZCBBYm9ydENvbnRyb2xsZXIuYWJvcnQoKSBkdXJpbmcgdGhpc1xuICAgKiBpbnZvY2F0aW9uLiBUaGUgaG9zdCBtdXN0IHJlY29yZCB0aGUgYWJvcnQ6IGNyZWF0ZSBhIGhvb2tfcmVjZWl2ZWRcbiAgICogZXZlbnQgY2FycnlpbmcgYGFib3J0UGF5bG9hZGAgYW5kIHdyaXRlL2Nsb3NlIHRoZSBhYm9ydCBzdHJlYW0uXG4gICAqL1xuICBhYm9ydFJlcXVlc3RlZD86IGJvb2xlYW47XG4gIC8qKiBWTS1zZXJpYWxpemVkIGB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbiB9YCBwYXlsb2FkIGZvciB0aGUgYWJvcnQuICovXG4gIGFib3J0UGF5bG9hZD86IFVpbnQ4QXJyYXk7XG4gIC8qKiBTZXQgYnkgdGhlIGNvbXBsZXRpb24gZHJhaW4gd2hlbiBhIHN5c3RlbSBob29rIGlzIGltcGxpY2l0bHkgZGlzcG9zZWQuICovXG4gIGRpc3Bvc2VkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRydWUgd2hlbiB0aGUgd29ya2Zsb3cgaXMgYXdhaXRpbmcgaG9vay5nZXRDb25mbGljdCgpIGZvciB0aGlzIGhvb2suXG4gICAqIFRoZSBlbnRyeXBvaW50IHJlLWludm9rZXMgdGhlIHdvcmtmbG93IHJpZ2h0IGFmdGVyIHdyaXRpbmdcbiAgICogaG9va19jcmVhdGVkIHNvIHJlcGxheSBjYW4gY29uZmlybSBjcmVhdGlvbiBhbmQgcmVzb2x2ZSB0aGUgYXdhaXRlci5cbiAgICovXG4gIGhhc0dldENvbmZsaWN0QXdhaXRlcj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ0F0dHJpYnV0ZSB7XG4gIHR5cGU6ICdhdHRyaWJ1dGUnO1xuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gIC8qKiBOb3JtYWxpemVkIGF0dHJpYnV0ZSBjaGFuZ2VzIChwbGFpbiBKU09OLWFibGUgb2JqZWN0cykgKi9cbiAgY2hhbmdlczogdW5rbm93bltdO1xuICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGFuIGF0dHJfc2V0IGV2ZW50IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHdyaXRlICovXG4gIGhhc0NyZWF0ZWRFdmVudDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZW5kaW5nSG9va0Rpc3Bvc2Uge1xuICB0eXBlOiAnaG9va19kaXNwb3NlJztcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICAvKipcbiAgICogVG9rZW4gb2YgdGhlIGhvb2sgYmVpbmcgZGlzcG9zZWQuIFVzZWQgYnkgdGhlIGVudHJ5cG9pbnQgdG8gb3JkZXJcbiAgICogc2FtZS10b2tlbiBob29rIG9wZXJhdGlvbnMgc2VxdWVudGlhbGx5IGluIGNvZGUgb3JkZXIuXG4gICAqL1xuICB0b2tlbj86IHN0cmluZztcbiAgaGFzQ3JlYXRlZEV2ZW50OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBQZW5kaW5nT3BlcmF0aW9uID1cbiAgfCBQZW5kaW5nU3RlcFxuICB8IFBlbmRpbmdXYWl0XG4gIHwgUGVuZGluZ0hvb2tcbiAgfCBQZW5kaW5nQXR0cmlidXRlXG4gIHwgUGVuZGluZ0hvb2tEaXNwb3NlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1aWNrSlNSdW50aW1lUmVzdWx0IHtcbiAgLyoqIFRoZSB3b3JrZmxvdyBjb21wbGV0ZWQ6IHJlc3VsdCBpcyBmb3JtYXQtcHJlZml4ZWQgZGV2YWx1ZSBieXRlcyAqL1xuICBjb21wbGV0ZWQ/OiB7XG4gICAgcmVzdWx0OiBVaW50OEFycmF5O1xuICAgIC8qKlxuICAgICAqIExlZnRvdmVyIHBlbmRpbmcgb3BlcmF0aW9ucyB0aGF0IHN0aWxsIG5lZWQgZHVyYWJsZSBzaWRlIGVmZmVjdHMgYXRcbiAgICAgKiBjb21wbGV0aW9uOiBhYm9ydCByZWNvcmRpbmdzLCBzeXN0ZW0taG9vayBkaXNwb3NhbHMsIGZpcmUtYW5kLWZvcmdldFxuICAgICAqIGF0dHJpYnV0ZS9ob29rL3N0ZXAgZXZlbnRzLiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSdzXG4gICAgICogZHJhaW5QZW5kaW5nUXVldWVJdGVtcy4gVGhlIGVudHJ5cG9pbnQgZGlzcGF0Y2hlcyB0aGVzZSBXSVRIT1VUXG4gICAgICogcXVldWVpbmcgc3RlcHMgb3IgcmVxdWV1aW5nIHRoZSBydW4uXG4gICAgICovXG4gICAgZHJhaW5PcGVyYXRpb25zPzogUGVuZGluZ09wZXJhdGlvbltdO1xuICB9O1xuICAvKiogVGhlIHdvcmtmbG93IHN1c3BlbmRlZCB3aXRoIHBlbmRpbmcgb3BlcmF0aW9ucyAqL1xuICBzdXNwZW5kZWQ/OiB7XG4gICAgcGVuZGluZ09wZXJhdGlvbnM6IFBlbmRpbmdPcGVyYXRpb25bXTtcbiAgfTtcbiAgLyoqIFRoZSB3b3JrZmxvdyBmYWlsZWQgKi9cbiAgZmFpbGVkPzoge1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBzdGFjaz86IHN0cmluZztcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKiBTZWUgY29tcGxldGVkLmRyYWluT3BlcmF0aW9uczogc2FtZSBzZW1hbnRpY3Mgb24gZmFpbHVyZS4gKi9cbiAgICBkcmFpbk9wZXJhdGlvbnM/OiBQZW5kaW5nT3BlcmF0aW9uW107XG4gICAgLyoqXG4gICAgICogRm9ybWF0LXByZWZpeGVkIGRldmFsdWUgYnl0ZXMgb2YgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZVxuICAgICAqIChFcnJvciBzdWJjbGFzcyB3aXRoIGNhdXNlIGNoYWluLCBwbGFpbiBvYmplY3QsIHByaW1pdGl2ZSwgZXRjLikuXG4gICAgICogU2V0IHdoZW4gdGhlIFZNLXNpZGUgcmVqZWN0aW9uIGhhbmRsZXIgc3VjY2Vzc2Z1bGx5IHNlcmlhbGl6ZXNcbiAgICAgKiB0aGUgdGhyb3duIHZhbHVlLiBUaGUgaG9zdCB1c2VzIHRoZXNlIGJ5dGVzIHRvIHJlY29uc3RydWN0IHRoZVxuICAgICAqIG9yaWdpbmFsIHZhbHVlIHRocm91Z2ggdGhlIHN0YW5kYXJkIGVycm9yIGh5ZHJhdGlvbiBwaXBlbGluZSxcbiAgICAgKiBwcmVzZXJ2aW5nIHR5cGUgaWRlbnRpdHkgKFR5cGVFcnJvciwgRmF0YWxFcnJvcikgYW5kIG5vbi1FcnJvclxuICAgICAqIHRocm93cyB2ZXJiYXRpbS4gRmFsbHMgYmFjayB0byB0aGUgbWVzc2FnZS9zdGFjay9uYW1lIGZpZWxkc1xuICAgICAqIHdoZW4gdGhpcyBpcyB1bmRlZmluZWQgKGUuZy4gZXh0cmFjdEVycm9yIHBzZXVkby1mYWlsdXJlcykuXG4gICAgICovXG4gICAgdmFsdWVCeXRlcz86IFVpbnQ4QXJyYXk7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVpY2tKU1J1bnRpbWVPcHRpb25zIHtcbiAgLyoqIFRoZSBjb21waWxlZCB3b3JrZmxvdyBidW5kbGUgY29kZSAod29ya2Zsb3cgbW9kZSBvdXRwdXQgZnJvbSBTV0MpICovXG4gIHdvcmtmbG93Q29kZTogc3RyaW5nO1xuICAvKiogVGhlIHdvcmtmbG93IElEIChlLmcuIFwid29ya2Zsb3cvLy4vd29ya2Zsb3dzLzFfc2ltcGxlLy9zaW1wbGVcIikgKi9cbiAgd29ya2Zsb3dJZDogc3RyaW5nO1xuICAvKiogVGhlIHdvcmtmbG93IHJ1biBlbnRpdHkgKi9cbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICAvKiogRmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBXb3JsZCBleGVjdXRpbmcgdGhpcyB3b3JrZmxvdy4gKi9cbiAgd29ybGRDYXBhYmlsaXRpZXM/OiBXb3JsZENhcGFiaWxpdGllcztcbiAgLyoqXG4gICAqIFRoZSBmdWxsIGV2ZW50IGxvZyBmb3IgdGhlIHJ1bi4gRXZlcnkgaW52b2NhdGlvbiByZXBsYXlzIHRoZSBjb21wbGV0ZVxuICAgKiBsb2cgZnJvbSB0aGUgc3RhcnQgKHNhbWUgcmVwbGF5IHNlbWFudGljcyBhcyB0aGUgYG5vZGU6dm1gIGVuZ2luZSkuXG4gICAqL1xuICBldmVudHM6IEV2ZW50W107XG4gIC8qKiBFbmNyeXB0aW9uIGtleSBmb3IgZGVjcnlwdGluZyBldmVudCBwYXlsb2FkcyAodW5kZWZpbmVkIGlmIHVuZW5jcnlwdGVkKSAqL1xuICBlbmNyeXB0aW9uS2V5PzogRGVjcnlwdGlvbktleTtcbiAgLyoqXG4gICAqIFRoZSBsb2NhbCBwb3J0IHRoZSB3b3JrZmxvdyBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uLCB1c2VkIHRvIHBvcHVsYXRlXG4gICAqIGB3b3JrZmxvd01ldGFkYXRhLnVybGAuIFJlc29sdmVkIGF0IGNhbGwgdGltZSBvbiB0aGUgaG9zdCBzaWRlIHNvIHRoZVxuICAgKiBWTSBkb2Vzbid0IGhhdmUgdG8gcHJvYmUgdGhlIGZpbGVzeXN0ZW0uIElnbm9yZWQgb24gVmVyY2VsLCB3aGVyZVxuICAgKiBWRVJDRUxfVVJMIHRha2VzIHByZWNlZGVuY2UuXG4gICAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKipcbiAgICogRmFsbGJhY2sgd29ya2Zsb3cgaW5wdXQgZnJvbSB0aGUgcXVldWUgbWVzc2FnZSdzIHJlc2lsaWVudC1zdGFydFxuICAgKiBwYXlsb2FkLiBVc2VkIHdoZW4gdGhlIGZldGNoZWQgZXZlbnQgbG9nIGxhY2tzIGEgYHJ1bl9jcmVhdGVkYCBldmVudFxuICAgKiAoZXZlbnR1YWxseS1jb25zaXN0ZW50IHJlYWQgYWZ0ZXIgdGhlIHBhcmVudCdzIHN0YXJ0KCkgd3JvdGUgaXQpLlxuICAgKi9cbiAgcnVuSW5wdXQ/OiBSdW5JbnB1dDtcbn1cblxuLy8gLS0tLSBWTSBCb290c3RyYXAgQ29kZSAtLS0tXG5cbi8qKlxuICogSmF2YVNjcmlwdCBjb2RlIHRoYXQgcnVucyBpbnNpZGUgdGhlIFF1aWNrSlMgVk0gdG8gc2V0IHVwIHRoZSB3b3JrZmxvd1xuICogcHJpbWl0aXZlcy4gVGhpcyBzZXRzIHVwOlxuICogLSBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3MgKE1hcCkgLSB3b3JrZmxvdyByZWdpc3RyeVxuICogLSBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzIChPYmplY3QpIC0gcGVuZGluZyBwcm9taXNlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9uc1xuICogLSBnbG9iYWxUaGlzLl9fcGVuZGluZyAoQXJyYXkpIC0gbWV0YWRhdGEgYWJvdXQgcGVuZGluZyBvcGVyYXRpb25zXG4gKiAtIGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXSAtIHN0ZXAgcHJveHkgZmFjdG9yeVxuICogLSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19TTEVFUFwiKV0gLSBzbGVlcCBmdW5jdGlvblxuICovXG5jb25zdCBWTV9CT09UU1RSQVAgPSBgXG4vLyBTeW1ib2wuZGlzcG9zZSAvIFN5bWJvbC5hc3luY0Rpc3Bvc2UgcG9seWZpbGxzIGZvciBRdWlja0pTXG5pZiAodHlwZW9mIFN5bWJvbC5kaXNwb3NlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIFN5bWJvbC5kaXNwb3NlID0gU3ltYm9sLmZvcihcIlN5bWJvbC5kaXNwb3NlXCIpO1xufVxuaWYgKHR5cGVvZiBTeW1ib2wuYXN5bmNEaXNwb3NlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIFN5bWJvbC5hc3luY0Rpc3Bvc2UgPSBTeW1ib2wuZm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZVwiKTtcbn1cblxuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzID0gbmV3IE1hcCgpO1xuZ2xvYmFsVGhpcy5fX3Jlc29sdmVycyA9IHt9O1xuZ2xvYmFsVGhpcy5fX3BlbmRpbmcgPSBbXTtcbmdsb2JhbFRoaXMuX193b3JrZmxvd1Jlc3VsdCA9IHVuZGVmaW5lZDtcbmdsb2JhbFRoaXMuX193b3JrZmxvd0Vycm9yID0gdW5kZWZpbmVkO1xuLy8gQnVmZmVyIGZvciBob29rX3JlY2VpdmVkIHBheWxvYWRzIHRoYXQgYXJyaXZlIGJlZm9yZSB0aGUgaG9vayBpcyBhd2FpdGVkLlxuLy8gS2V5ZWQgYnkgY29ycmVsYXRpb25JZCDihpIgYXJyYXkgb2YgcGF5bG9hZHMgKHByZXNlcnZlcyBkZWxpdmVyeSBvcmRlcikuXG4vLyBUaGlzIG1pcnJvcnMgdGhlIGV2ZW50LXJlcGxheSBydW50aW1lJ3MgcGF5bG9hZHNRdWV1ZSBpbiBob29rLnRzLlxuZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyID0ge307XG5cbi8vIEJ1ZmZlciBmb3Igc3RlcC93YWl0L2F0dHIgdGVybWluYWwgb3V0Y29tZXMgdGhhdCBhcnJpdmUgYmVmb3JlIHRoaXMgVk1cbi8vIGhhcyBjb25zdHJ1Y3RlZCB0aGUgY29ycmVzcG9uZGluZyBhd2FpdGluZyBwcm9taXNlLiBJbiBmcmVzaC1WTSByZXBsYXlcbi8vIHRoZSBtdWx0aS1wYXNzIGV2ZW50IHNjYW4gbWFrZXMgdGhpcyB1bnJlYWNoYWJsZSAoYXdhaXRzIGFyZVxuLy8gcmVjb25zdHJ1Y3RlZCBiZWZvcmUgdGhlaXIgdGVybWluYWxzIGFyZSByZS1zY2FubmVkKSwgYnV0IHRoZSBsaXZlXG4vLyBjb250aW51YXRpb24gcGF0aCAoY29udGludWVXaXRoRXZlbnRzKSBzY2FucyBlYWNoIGRlbHRhIGV4YWN0bHkgb25jZSDigJRcbi8vIGEgY29uY3VycmVudCBpbnZvY2F0aW9uJ3MgdGVybWluYWwgYXJyaXZpbmcgYmVmb3JlIHRoaXMgVk0gcmVhY2hlcyB0aGVcbi8vIGF3YWl0IHdvdWxkIG90aGVyd2lzZSBiZSBkcm9wcGVkIG9uIHRoZSBmbG9vciBhbmQgdGhlIGF3YWl0IHdvdWxkXG4vLyBuZXZlciBzZXR0bGUgKHRoZSBmZWVkJ3Mgc2Vlbi1zZXQgbWVhbnMgaXQgaXMgbmV2ZXIgcmUtZGVsaXZlcmVkKS5cbi8vIE1pcnJvcnMgX19ob29rUGF5bG9hZEJ1ZmZlciwgd2hpY2ggZXhpc3RzIGZvciBleGFjdGx5IHRoaXMgcmVhc29uIG9uXG4vLyB0aGUgaG9vayBwYXRoLiBLZXllZCBieSBjb3JyZWxhdGlvbklkIOKGkiBzaW5nbGUgdGVybWluYWwgKHN0ZXBzLCB3YWl0c1xuLy8gYW5kIGF0dHJzIHNldHRsZSBleGFjdGx5IG9uY2UpLlxuZ2xvYmFsVGhpcy5fX3Rlcm1pbmFsQnVmZmVyID0ge307XG5cbi8vIFJlZ2lzdGVycyBhIHJlc29sdmVyIGZvciBhbiBhd2FpdGVkIHByaW1pdGl2ZSwgZmlyc3QgZHJhaW5pbmcgYW55XG4vLyBidWZmZXJlZCB0ZXJtaW5hbCByZWNvcmRlZCBmb3IgdGhlIGNvcnJlbGF0aW9uSWQuIEVudHJpZXMgYXJlIHByZXBhcmVkXG4vLyBob3N0LXNpZGU6IGJ5dGVzIGFyZSBkZWNyeXB0ZWQgQU5EIGRlc2VyaWFsaXplZCBpbnRvIFZNIHZhbHVlcyBieSB0aGVcbi8vIGhvc3Qgc2VyZGUgYmVmb3JlIGJ1ZmZlcmluZyAodGhlIFZNIGhhcyBubyBpbi1ndWVzdCBkZXNlcmlhbGl6ZXIgb25cbi8vIHRoZSBob3N0LXNlcmRlIGVuZ2luZSksIHNvIGRyYWluaW5nIG9ubHkgZm9yd2FyZHMgdGhlIHN0b3JlZCB2YWx1ZS5cbmdsb2JhbFRoaXMuX19yZWdpc3RlclJlc29sdmVyID0gZnVuY3Rpb24oY29ycmVsYXRpb25JZCwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gIHZhciBidWZmZXJlZCA9IGdsb2JhbFRoaXMuX190ZXJtaW5hbEJ1ZmZlcltjb3JyZWxhdGlvbklkXTtcbiAgaWYgKGJ1ZmZlcmVkKSB7XG4gICAgZGVsZXRlIGdsb2JhbFRoaXMuX190ZXJtaW5hbEJ1ZmZlcltjb3JyZWxhdGlvbklkXTtcbiAgICBpZiAoYnVmZmVyZWQua2luZCA9PT0gXCJyZXNvbHZlX3ZhbHVlXCIpIHtcbiAgICAgIHJlc29sdmUoYnVmZmVyZWQudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoYnVmZmVyZWQua2luZCA9PT0gXCJyZWplY3RfdmFsdWVcIikge1xuICAgICAgcmVqZWN0KGJ1ZmZlcmVkLnZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGJ1ZmZlcmVkLmtpbmQgPT09IFwicmVqZWN0X2Vycm9yXCIpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKGJ1ZmZlcmVkLm1lc3NhZ2UpO1xuICAgICAgZS5uYW1lID0gXCJGYXRhbEVycm9yXCI7XG4gICAgICBlLmZhdGFsID0gdHJ1ZTtcbiAgICAgIGlmIChidWZmZXJlZC5zdGFjaykgZS5zdGFjayA9IGJ1ZmZlcmVkLnN0YWNrO1xuICAgICAgcmVqZWN0KGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzW2NvcnJlbGF0aW9uSWRdID0geyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9O1xufTtcblxuLy8gU3R1YnMgZm9yIFdlYiBBUElzIHRoYXQgdGhlIHdvcmtmbG93IGJ1bmRsZSBtYXkgcmVmZXJlbmNlIGJ1dCBhcmUgbm90XG4vLyBhdmFpbGFibGUgaW4gUXVpY2tKUy4gTmF0aXZlIEMgZXh0ZW5zaW9ucyAoZW5jb2RpbmcsIGhlYWRlcnMsIHVybCxcbi8vIHN0cnVjdHVyZWQtY2xvbmUpIHByb3ZpZGUgdGhlIHJlYWwgaW1wbGVtZW50YXRpb25zOyB0aGVzZSBhcmUgbWluaW1hbFxuLy8gc3R1YnMgZm9yIEFQSXMgdGhhdCBkb24ndCBoYXZlIG5hdGl2ZSBleHRlbnNpb25zIHlldC4gKGJ0b2EvYXRvYiBhbmRcbi8vIHRoZSBVaW50OEFycmF5IGJhc2U2NC9oZXggbWV0aG9kcyBhcmUgYnVpbHQgaW50byBxdWlja2pzLXdhc2kgPj0gMy4pXG5cbmlmICh0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgLy8gTWluaW1hbCBSZWFkYWJsZVN0cmVhbSB0aGF0IHN0b3JlcyBib2R5IGRhdGEgZm9yIFJlc3BvbnNlLmpzb24oKS90ZXh0KClcbiAgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbSA9IGZ1bmN0aW9uKCkge307XG4gIGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLl9fYm9keURhdGEgPSBudWxsO1xufVxuXG5pZiAodHlwZW9mIFdyaXRhYmxlU3RyZWFtID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIGdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW0gPSBmdW5jdGlvbigpIHt9O1xufVxuXG5pZiAodHlwZW9mIFRyYW5zZm9ybVN0cmVhbSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICBnbG9iYWxUaGlzLlRyYW5zZm9ybVN0cmVhbSA9IGZ1bmN0aW9uKCkge307XG59XG5cbmlmICh0eXBlb2YgY29uc29sZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICBnbG9iYWxUaGlzLmNvbnNvbGUgPSB7IGxvZzogZnVuY3Rpb24oKXt9LCBlcnJvcjogZnVuY3Rpb24oKXt9LCB3YXJuOiBmdW5jdGlvbigpe30sIGluZm86IGZ1bmN0aW9uKCl7fSB9O1xufVxuLy8gU3R1YiBleHBvcnRzL21vZHVsZSBmb3IgQ0pTIGJ1bmRsZSBmb3JtYXRcbmdsb2JhbFRoaXMuZXhwb3J0cyA9IHt9O1xuZ2xvYmFsVGhpcy5tb2R1bGUgPSB7IGV4cG9ydHM6IGdsb2JhbFRoaXMuZXhwb3J0cyB9O1xuLy8gTk9URTogVGV4dEVuY29kZXIvVGV4dERlY29kZXIgYXJlIHByb3ZpZGVkIGJ5IHRoZSBuYXRpdmUgZW5jb2RpbmcgZXh0ZW5zaW9uLlxuXG4vLyAtLS0tIERldGVybWluaXN0aWMgXFxgY3J5cHRvXFxgIChwYXJpdHkgd2l0aCB0aGUgbm9kZTp2bSBlbmdpbmUpIC0tLS1cbi8vIGdldFJhbmRvbVZhbHVlcyAvIHJhbmRvbVVVSUQgZHJhdyBmcm9tIE1hdGgucmFuZG9tLCB3aGljaCB0aGUgaG9zdFxuLy8gcmVwbGFjZXMgd2l0aCB0aGUgcnVuJ3Mgc2VlZGVkIFBSTkcgYmVmb3JlIGFueSB1c2VyIGNvZGUgcnVucyDigJQgc28gdGhlXG4vLyB2YWx1ZXMgcmVwbGF5IGRldGVybWluaXN0aWNhbGx5IGFuZCBtYXRjaCB0aGUgbm9kZSBlbmdpbmUsIHdob3NlXG4vLyBpbXBsZW1lbnRhdGlvbnMgZHJhdyBmcm9tIHRoZSBzYW1lIHNlZWRlZCBzZXF1ZW5jZSAoc2VlIHZtL2luZGV4LnRzKS5cbi8vIEV2ZXJ5IGNyeXB0by5zdWJ0bGUgbWV0aG9kIHRocm93cyB3aXRoIHRoZSBzYW1lIGd1aWRhbmNlIGFzIHRoZSBub2RlXG4vLyBlbmdpbmUncyBub24tcmVwbGF5YWJsZSBtZXRob2RzOyB1bmxpa2Ugbm9kZSwgXFxgZGlnZXN0XFxgIGlzIGFsc29cbi8vIHVuYXZhaWxhYmxlIGhlcmUgKG5vIG5hdGl2ZSBoYXNoIGluIHRoZSBWTSB5ZXQpLlxuKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBnZXRSYW5kb21WYWx1ZXMoYXJyYXkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnJheVtpXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1Nik7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuICAvLyBNaXJyb3JzIHZtL3V1aWQudHMgY3JlYXRlUmFuZG9tVVVJRDogaWRlbnRpY2FsIGRyYXcgcGF0dGVybiBmcm9tIHRoZVxuICAvLyBzZWVkZWQgUFJORywgc28gYm90aCBlbmdpbmVzIHByb2R1Y2UgdGhlIHNhbWUgVVVJRCBhdCB0aGUgc2FtZSBwb2ludFxuICAvLyBpbiBhIHJlcGxheS5cbiAgZnVuY3Rpb24gcmFuZG9tVVVJRCgpIHtcbiAgICB2YXIgY2hhcnMgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIjtcbiAgICB2YXIgdXVpZCA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzNjsgaSsrKSB7XG4gICAgICBpZiAoaSA9PT0gOCB8fCBpID09PSAxMyB8fCBpID09PSAxOCB8fCBpID09PSAyMykge1xuICAgICAgICB1dWlkICs9IFwiLVwiO1xuICAgICAgfSBlbHNlIGlmIChpID09PSAxNCkge1xuICAgICAgICB1dWlkICs9IFwiNFwiO1xuICAgICAgfSBlbHNlIGlmIChpID09PSAxOSkge1xuICAgICAgICB1dWlkICs9IGNoYXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDQpICsgOF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1dWlkICs9IGNoYXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE2KV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1dWlkO1xuICB9XG4gIGZ1bmN0aW9uIHN1YnRsZVRocm93KG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiXFxgY3J5cHRvLnN1YnRsZS5cIiArIG5hbWUgKyBcIigpXFxgIGlzIG5vdCBhdmFpbGFibGUgaW5zaWRlIGEgd29ya2Zsb3cgZnVuY3Rpb24uIE1vdmUgaXQgdG8gYSBzdGVwIGZ1bmN0aW9uIHdoZXJlIGZ1bGwgTm9kZS5qcyBjcnlwdG8gaXMgYXZhaWxhYmxlLlwiKTtcbiAgICAgIGVyci5uYW1lID0gXCJXb3JrZmxvd1J1bnRpbWVFcnJvclwiO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH07XG4gIH1cbiAgdmFyIHN1YnRsZSA9IHt9O1xuICBbXCJlbmNyeXB0XCIsXCJkZWNyeXB0XCIsXCJzaWduXCIsXCJ2ZXJpZnlcIixcImRpZ2VzdFwiLFwiZ2VuZXJhdGVLZXlcIixcImRlcml2ZUtleVwiLFwiZGVyaXZlQml0c1wiLFwiaW1wb3J0S2V5XCIsXCJleHBvcnRLZXlcIixcIndyYXBLZXlcIixcInVud3JhcEtleVwiXS5mb3JFYWNoKGZ1bmN0aW9uKG0pIHtcbiAgICBzdWJ0bGVbbV0gPSBzdWJ0bGVUaHJvdyhtKTtcbiAgfSk7XG4gIGdsb2JhbFRoaXMuY3J5cHRvID0ge1xuICAgIGdldFJhbmRvbVZhbHVlczogZ2V0UmFuZG9tVmFsdWVzLFxuICAgIHJhbmRvbVVVSUQ6IHJhbmRvbVVVSUQsXG4gICAgc3VidGxlOiBzdWJ0bGUsXG4gIH07XG59KSgpO1xuXG4vLyAtLS0tIExvdWQgSW50bCAvIGxvY2FsZSBndWFyZHMgLS0tLVxuLy8gUXVpY2tKUyBoYXMgbm8gSUNVOiBcXGBJbnRsXFxgIGlzIGFic2VudCBhbmQgdG9Mb2NhbGVTdHJpbmctZmFtaWx5IG1ldGhvZHNcbi8vIHNpbGVudGx5IGlnbm9yZSB0aGVpciBsb2NhbGUgYXJndW1lbnQuIFNpbGVudCBkaXZlcmdlbmNlIGZyb20gdGhlIG5vZGVcbi8vIGVuZ2luZSB3b3VsZCB3cml0ZSBkaWZmZXJlbnQgdmFsdWVzIGludG8gYSBkdXJhYmxlIGV2ZW50IGxvZyB3aXRoIG5vXG4vLyBlcnJvciBhbnl3aGVyZSDigJQgc28gbWFrZSB0aGUgZ2FwIGxvdWQgaW5zdGVhZDogSW50bCBjb25zdHJ1Y3RvcnMgdGhyb3csXG4vLyBhbmQgdG9Mb2NhbGUqIG1ldGhvZHMgdGhyb3cgT05MWSB3aGVuIGNhbGxlZCB3aXRoIGFuIGV4cGxpY2l0IGxvY2FsZVxuLy8gKHRoZSBuby1hcmd1bWVudCBmb3JtcyBrZWVwIFF1aWNrSlMncyBkZWZhdWx0IGJlaGF2aW9yKS5cbihmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gaW50bFRocm93KG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiXFxgSW50bC5cIiArIG5hbWUgKyBcIlxcYCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBRdWlja0pTIHdvcmtmbG93IGVuZ2luZSAobm8gSUNVKS4gUGVyZm9ybSBsb2NhbGUtc2Vuc2l0aXZlIGZvcm1hdHRpbmcgaW4gYSBzdGVwIGZ1bmN0aW9uLCBvciB1c2UgV09SS0ZMT1dfVk09bm9kZS5cIik7XG4gICAgICBlcnIubmFtZSA9IFwiV29ya2Zsb3dSdW50aW1lRXJyb3JcIjtcbiAgICAgIHRocm93IGVycjtcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlb2YgSW50bCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBpbnRsID0ge307XG4gICAgW1wiQ29sbGF0b3JcIixcIkRhdGVUaW1lRm9ybWF0XCIsXCJEaXNwbGF5TmFtZXNcIixcIkR1cmF0aW9uRm9ybWF0XCIsXCJMaXN0Rm9ybWF0XCIsXCJMb2NhbGVcIixcIk51bWJlckZvcm1hdFwiLFwiUGx1cmFsUnVsZXNcIixcIlJlbGF0aXZlVGltZUZvcm1hdFwiLFwiU2VnbWVudGVyXCJdLmZvckVhY2goZnVuY3Rpb24obikge1xuICAgICAgaW50bFtuXSA9IGludGxUaHJvdyhuKTtcbiAgICB9KTtcbiAgICBpbnRsLmdldENhbm9uaWNhbExvY2FsZXMgPSBpbnRsVGhyb3coXCJnZXRDYW5vbmljYWxMb2NhbGVzXCIpO1xuICAgIGdsb2JhbFRoaXMuSW50bCA9IGludGw7XG4gIH1cbiAgZnVuY3Rpb24gZ3VhcmRMb2NhbGUocHJvdG8sIG1ldGhvZCkge1xuICAgIHZhciBvcmlnaW5hbCA9IHByb3RvW21ldGhvZF07XG4gICAgaWYgKHR5cGVvZiBvcmlnaW5hbCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm47XG4gICAgcHJvdG9bbWV0aG9kXSA9IGZ1bmN0aW9uKGxvY2FsZXMpIHtcbiAgICAgIGlmIChsb2NhbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIlxcYFwiICsgbWV0aG9kICsgXCIobG9jYWxlcywgLi4uKVxcYCB3aXRoIGFuIGV4cGxpY2l0IGxvY2FsZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBRdWlja0pTIHdvcmtmbG93IGVuZ2luZSAobm8gSUNVKSDigJQgaXQgd291bGQgc2lsZW50bHkgaWdub3JlIHRoZSBsb2NhbGUuIEZvcm1hdCBpbiBhIHN0ZXAgZnVuY3Rpb24sIG9yIGNhbGwgd2l0aG91dCBhcmd1bWVudHMgZm9yIHRoZSBlbmdpbmUgZGVmYXVsdC5cIik7XG4gICAgICAgIGVyci5uYW1lID0gXCJXb3JrZmxvd1J1bnRpbWVFcnJvclwiO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3JpZ2luYWwuY2FsbCh0aGlzKTtcbiAgICB9O1xuICB9XG4gIGd1YXJkTG9jYWxlKE51bWJlci5wcm90b3R5cGUsIFwidG9Mb2NhbGVTdHJpbmdcIik7XG4gIGd1YXJkTG9jYWxlKERhdGUucHJvdG90eXBlLCBcInRvTG9jYWxlU3RyaW5nXCIpO1xuICBndWFyZExvY2FsZShEYXRlLnByb3RvdHlwZSwgXCJ0b0xvY2FsZURhdGVTdHJpbmdcIik7XG4gIGd1YXJkTG9jYWxlKERhdGUucHJvdG90eXBlLCBcInRvTG9jYWxlVGltZVN0cmluZ1wiKTtcbiAgZ3VhcmRMb2NhbGUoU3RyaW5nLnByb3RvdHlwZSwgXCJ0b0xvY2FsZUxvd2VyQ2FzZVwiKTtcbiAgZ3VhcmRMb2NhbGUoU3RyaW5nLnByb3RvdHlwZSwgXCJ0b0xvY2FsZVVwcGVyQ2FzZVwiKTtcbiAgLy8gbG9jYWxlQ29tcGFyZSdzIGxvY2FsZXMgYXJndW1lbnQgaXMgdGhlIFNFQ09ORCBwYXJhbWV0ZXIuXG4gIChmdW5jdGlvbigpIHtcbiAgICB2YXIgb3JpZ2luYWwgPSBTdHJpbmcucHJvdG90eXBlLmxvY2FsZUNvbXBhcmU7XG4gICAgU3RyaW5nLnByb3RvdHlwZS5sb2NhbGVDb21wYXJlID0gZnVuY3Rpb24odGhhdCwgbG9jYWxlcykge1xuICAgICAgaWYgKGxvY2FsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiXFxgbG9jYWxlQ29tcGFyZSh0aGF0LCBsb2NhbGVzLCAuLi4pXFxgIHdpdGggYW4gZXhwbGljaXQgbG9jYWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIFF1aWNrSlMgd29ya2Zsb3cgZW5naW5lIChubyBJQ1UpLiBDb21wYXJlIGluIGEgc3RlcCBmdW5jdGlvbiwgb3IgY2FsbCB3aXRob3V0IGEgbG9jYWxlLlwiKTtcbiAgICAgICAgZXJyLm5hbWUgPSBcIldvcmtmbG93UnVudGltZUVycm9yXCI7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcmlnaW5hbC5jYWxsKHRoaXMsIHRoYXQpO1xuICAgIH07XG4gIH0pKCk7XG59KSgpO1xuXG5nbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0gPSBmdW5jdGlvbihzdGVwSWQsIGNsb3N1cmVWYXJzRm4pIHtcbiAgdmFyIGZuID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIHZhciBjb3JyZWxhdGlvbklkID0gXCJzdGVwX1wiICsgZ2xvYmFsVGhpcy5fX2dlbmVyYXRlVWxpZCgpO1xuICAgIC8vIENhcHR1cmUgJ3RoaXMnIGZvciBtZXRob2QgaW52b2NhdGlvbnMgKGUuZy4sIE15Q2xhc3MubWV0aG9kKCkpXG4gICAgdmFyIHRoaXNWYWwgPSAodGhpcyAhPT0gdW5kZWZpbmVkICYmIHRoaXMgIT09IG51bGwgJiYgdGhpcyAhPT0gZ2xvYmFsVGhpcykgPyB0aGlzIDogdW5kZWZpbmVkO1xuICAgIC8vIFRoZSBSQVcgaW5wdXQgdmFsdWUuIFNlcmlhbGl6YXRpb24gaGFwcGVucyBvbiB0aGUgaG9zdCwgd2hpY2ggcmVhZHNcbiAgICAvLyB0aGlzIHRocm91Z2ggYSBoYW5kbGUgd2hlbiBpdCBjb2xsZWN0cyB0aGUgcGVuZGluZyBvcCDigJQgbm9cbiAgICAvLyBzZXJpYWxpemVyIGNvZGUgcnVucyBpbnNpZGUgdGhlIFZNLlxuICAgIHZhciBpbnB1dCA9IHtcbiAgICAgIGFyZ3M6IGFyZ3MsXG4gICAgICBjbG9zdXJlVmFyczogY2xvc3VyZVZhcnNGbiA/IGNsb3N1cmVWYXJzRm4oKSA6IHVuZGVmaW5lZCxcbiAgICAgIHRoaXNWYWw6IHRoaXNWYWwsXG4gICAgfTtcbiAgICBnbG9iYWxUaGlzLl9fcGVuZGluZy5wdXNoKHtcbiAgICAgIHR5cGU6IFwic3RlcFwiLFxuICAgICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZCxcbiAgICAgIHN0ZXBJZDogc3RlcElkLFxuICAgICAgaW5wdXQ6IGlucHV0LFxuICAgICAgaGFzQ3JlYXRlZEV2ZW50OiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBnbG9iYWxUaGlzLl9fcmVnaXN0ZXJSZXNvbHZlcihjb3JyZWxhdGlvbklkLCByZXNvbHZlLCByZWplY3QpO1xuICAgIH0pO1xuICB9O1xuICAvLyBTZXQgc3RlcElkIG9uIHRoZSBwcm94eSBzbyB0aGUgU3RlcEZ1bmN0aW9uIHJlZHVjZXIgY2FuIGRldGVjdCBhbmRcbiAgLy8gc2VyaWFsaXplIHN0ZXAgZnVuY3Rpb24gcmVmZXJlbmNlcyAoZS5nLiB3aGVuIHBhc3NlZCBhcyBhcmd1bWVudHMpLlxuICBmbi5zdGVwSWQgPSBzdGVwSWQ7XG4gIGlmIChjbG9zdXJlVmFyc0ZuKSBmbi5fX2Nsb3N1cmVWYXJzRm4gPSBjbG9zdXJlVmFyc0ZuO1xuICAvLyBPdmVycmlkZSAuYmluZCBzbyBhIGJvdW5kIHN0ZXAgcHJveHkgKGUuZy4gdGhlIFNXQyBwbHVnaW4nc1xuICAvLyB1c2VTdGVwKC4uLikuYmluZCh0aGlzKSBmb3IgbGV4aWNhbC10aGlzIGFycm93IHN0ZXBzKSBrZWVwcyBpdHNcbiAgLy8gc3RlcElkIGFuZCByZWNvcmRzIHRoZSBib3VuZCByZWNlaXZlciAvIHByZWZpbGxlZCBhcmdzIOKAlCB0aGUgbmF0aXZlXG4gIC8vIGJpbmQgZHJvcHMgb3duIHByb3BlcnRpZXMsIHdoaWNoIHdvdWxkIG1ha2UgdGhlIFN0ZXBGdW5jdGlvblxuICAvLyByZWR1Y2VyIGZhaWwgdG8gcmVjb2duaXplIHRoZSBwcm94eSB3aGVuIGl0IGNyb3NzZXMgYSBzZXJpYWxpemF0aW9uXG4gIC8vIGJvdW5kYXJ5LiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSdzIG92ZXJyaWRlIGluIHN0ZXAudHMuXG4gIGZuLmJpbmQgPSBmdW5jdGlvbih0aGlzQXJnKSB7XG4gICAgdmFyIHBhcnRpYWxBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICB2YXIgYm91bmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseSh0aGlzLCBbdGhpc0FyZ10uY29uY2F0KHBhcnRpYWxBcmdzKSk7XG4gICAgYm91bmQuc3RlcElkID0gc3RlcElkO1xuICAgIGlmIChjbG9zdXJlVmFyc0ZuKSBib3VuZC5fX2Nsb3N1cmVWYXJzRm4gPSBjbG9zdXJlVmFyc0ZuO1xuICAgIGJvdW5kLl9fYm91bmRUaGlzID0gdGhpc0FyZztcbiAgICBpZiAocGFydGlhbEFyZ3MubGVuZ3RoID4gMCkgYm91bmQuX19ib3VuZEFyZ3MgPSBwYXJ0aWFsQXJncztcbiAgICByZXR1cm4gYm91bmQ7XG4gIH07XG4gIHJldHVybiBmbjtcbn07XG5cbi8vIFBhcnNlcyBhbiBcIm1zXCIgbGlicmFyeSBzdHlsZSBkdXJhdGlvbiBzdHJpbmcgaW50byBtaWxsaXNlY29uZHMuXG4vLyBTdXBwb3J0cyB0aGUgc2FtZSB1bml0cyBhcyB0aGUgcmVwbGF5IHJ1bnRpbWUgKHdoaWNoIHVzZXMgdGhlIFwibXNcIlxuLy8gcGFja2FnZSk6IG1zIC8gcyAvIG0gLyBoIC8gZCAvIHcgLyB5LCB3aXRoIHZlcmJvc2UgYWxpYXNlc1xuLy8gKHNlY29uZHMsIG1pbnV0ZXMsIC4uLikuXG5nbG9iYWxUaGlzLl9fcGFyc2VEdXJhdGlvbk1zID0gZnVuY3Rpb24oc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdmFyIG1hdGNoID0gc3RyLm1hdGNoKFxuICAgIC9eKC0/KD86XFxcXGQrKT9cXFxcLj9cXFxcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2lcbiAgKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgXCJtc1wiKS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgcyA9IDEwMDAsIG0gPSA2MCAqIHMsIGggPSA2MCAqIG0sIGQgPSAyNCAqIGgsIHcgPSA3ICogZCwgeSA9IDM2NS4yNSAqIGQ7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJ5ZWFyc1wiOiBjYXNlIFwieWVhclwiOiBjYXNlIFwieXJzXCI6IGNhc2UgXCJ5clwiOiBjYXNlIFwieVwiOiByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSBcIndlZWtzXCI6IGNhc2UgXCJ3ZWVrXCI6IGNhc2UgXCJ3XCI6IHJldHVybiBuICogdztcbiAgICBjYXNlIFwiZGF5c1wiOiBjYXNlIFwiZGF5XCI6IGNhc2UgXCJkXCI6IHJldHVybiBuICogZDtcbiAgICBjYXNlIFwiaG91cnNcIjogY2FzZSBcImhvdXJcIjogY2FzZSBcImhyc1wiOiBjYXNlIFwiaHJcIjogY2FzZSBcImhcIjogcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgXCJtaW51dGVzXCI6IGNhc2UgXCJtaW51dGVcIjogY2FzZSBcIm1pbnNcIjogY2FzZSBcIm1pblwiOiBjYXNlIFwibVwiOiByZXR1cm4gbiAqIG07XG4gICAgY2FzZSBcInNlY29uZHNcIjogY2FzZSBcInNlY29uZFwiOiBjYXNlIFwic2Vjc1wiOiBjYXNlIFwic2VjXCI6IGNhc2UgXCJzXCI6IHJldHVybiBuICogcztcbiAgICBjYXNlIFwibWlsbGlzZWNvbmRzXCI6IGNhc2UgXCJtaWxsaXNlY29uZFwiOiBjYXNlIFwibXNlY3NcIjogY2FzZSBcIm1zZWNcIjogY2FzZSBcIm1zXCI6IHJldHVybiBuO1xuICAgIGRlZmF1bHQ6IHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG5cbmdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1NMRUVQXCIpXSA9IGZ1bmN0aW9uKHBhcmFtKSB7XG4gIHZhciBjb3JyZWxhdGlvbklkID0gXCJ3YWl0X1wiICsgZ2xvYmFsVGhpcy5fX2dlbmVyYXRlVWxpZCgpO1xuICB2YXIgcmVzdW1lQXQ7XG4gIGlmICh0eXBlb2YgcGFyYW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXN1bWVBdCA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBwYXJhbSkudG9JU09TdHJpbmcoKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICB2YXIgbXMgPSBnbG9iYWxUaGlzLl9fcGFyc2VEdXJhdGlvbk1zKHBhcmFtKTtcbiAgICBpZiAodHlwZW9mIG1zID09PSBcIm51bWJlclwiICYmIGlzRmluaXRlKG1zKSkge1xuICAgICAgcmVzdW1lQXQgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgbXMpLnRvSVNPU3RyaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vdCBhIGR1cmF0aW9uIHN0cmluZyDigJQgdHJ5IGFzIGFuIGFic29sdXRlIGRhdGUgc3RyaW5nLlxuICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShwYXJhbSk7XG4gICAgICBpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc2xlZXAgcGFyYW1ldGVyOiBcIiArIHBhcmFtKTtcbiAgICAgIH1cbiAgICAgIHJlc3VtZUF0ID0gZGF0ZS50b0lTT1N0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBpZiAoaXNOYU4ocGFyYW0uZ2V0VGltZSgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzbGVlcCBwYXJhbWV0ZXI6IFwiICsgcGFyYW0pO1xuICAgIH1cbiAgICByZXN1bWVBdCA9IHBhcmFtLnRvSVNPU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzbGVlcCBwYXJhbWV0ZXI6IFwiICsgcGFyYW0pO1xuICB9XG4gIGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goe1xuICAgIHR5cGU6IFwid2FpdFwiLFxuICAgIGNvcnJlbGF0aW9uSWQ6IGNvcnJlbGF0aW9uSWQsXG4gICAgcmVzdW1lQXQ6IHJlc3VtZUF0LFxuICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gIH0pO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyUmVzb2x2ZXIoY29ycmVsYXRpb25JZCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgfSk7XG59O1xuXG4vLyBSZXNwb25zZS9SZXF1ZXN0IHBvbHlmaWxscyDigJQgLmpzb24oKS8udGV4dCgpLy5hcnJheUJ1ZmZlcigpIGFyZSB1c2VTdGVwXG4vLyBwcm94aWVzIHRoYXQgZXhlY3V0ZSBvbiB0aGUgaG9zdCBzaWRlLiBUaGUgcHJveGllcyBhcmUgYXNzaWduZWQgZGlyZWN0bHlcbi8vIHRvIHRoZSBwcm90b3R5cGVzIHNvIHRoYXQgJ3RoaXMnICh0aGUgUmVzcG9uc2UvUmVxdWVzdCBpbnN0YW5jZSkgaXNcbi8vIHNlcmlhbGl6ZWQgYXMgdGhpc1ZhbCBieSBXT1JLRkxPV19VU0VfU1RFUCwgbWF0Y2hpbmcgdGhlIGV2ZW50LXJlcGxheVxuLy8gcnVudGltZSdzIGFwcHJvYWNoIChjb21taXQgZGNiMDc2MSkuXG5pZiAodHlwZW9mIFJlc3BvbnNlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIHZhciBfX0JPRFlfSU5JVCA9IFN5bWJvbC5mb3IoXCJCT0RZX0lOSVRcIik7XG5cbiAgZ2xvYmFsVGhpcy5SZXNwb25zZSA9IGZ1bmN0aW9uKGJvZHksIGluaXQpIHtcbiAgICBpbml0ID0gaW5pdCB8fCB7fTtcbiAgICB0aGlzLnN0YXR1cyA9IGluaXQuc3RhdHVzIHx8IDIwMDtcbiAgICB0aGlzLnN0YXR1c1RleHQgPSBpbml0LnN0YXR1c1RleHQgfHwgXCJcIjtcbiAgICB0aGlzLmhlYWRlcnMgPSBuZXcgZ2xvYmFsVGhpcy5IZWFkZXJzKGluaXQuaGVhZGVycyB8fCBbXSk7XG4gICAgdGhpcy50eXBlID0gXCJkZWZhdWx0XCI7XG4gICAgdGhpcy51cmwgPSBcIlwiO1xuICAgIHRoaXMucmVkaXJlY3RlZCA9IGZhbHNlO1xuICAgIGlmIChib2R5ICE9PSBudWxsICYmIGJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5ib2R5ID0gT2JqZWN0LmNyZWF0ZShnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSk7XG4gICAgICB0aGlzLmJvZHlbX19CT0RZX0lOSVRdID0gYm9keTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ib2R5ID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLlJlc3BvbnNlLnByb3RvdHlwZSwgXCJva1wiLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMDsgfVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMuUmVzcG9uc2UucHJvdG90eXBlLCBcImJvZHlVc2VkXCIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgfSk7XG4gIC8vIEFzc2lnbiB1c2VTdGVwIHByb3hpZXMgZGlyZWN0bHkg4oCUICd0aGlzJyBiaW5kaW5nIHByb3ZpZGVzIHRoZVxuICAvLyBSZXNwb25zZSBpbnN0YW5jZSwgd2hpY2ggZ2V0cyBzZXJpYWxpemVkIGFzIHRoaXNWYWwgYnkgdGhlIHByb3h5LlxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhnbG9iYWxUaGlzLlJlc3BvbnNlLnByb3RvdHlwZSwge1xuICAgIGFycmF5QnVmZmVyOiB7IHZhbHVlOiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyXCIpLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0sXG4gICAganNvbjogeyB2YWx1ZTogZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwiX19idWlsdGluX3Jlc3BvbnNlX2pzb25cIiksIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSxcbiAgICB0ZXh0OiB7IHZhbHVlOiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dFwiKSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LFxuICB9KTtcbiAgZ2xvYmFsVGhpcy5SZXNwb25zZS5wcm90b3R5cGUuYnl0ZXMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5hcnJheUJ1ZmZlcigpLnRoZW4oZnVuY3Rpb24oYnVmKSB7IHJldHVybiBuZXcgVWludDhBcnJheShidWYpOyB9KTtcbiAgfTtcbiAgZ2xvYmFsVGhpcy5SZXNwb25zZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgciA9IE9iamVjdC5jcmVhdGUoZ2xvYmFsVGhpcy5SZXNwb25zZS5wcm90b3R5cGUpO1xuICAgIHIuc3RhdHVzID0gdGhpcy5zdGF0dXM7IHIuc3RhdHVzVGV4dCA9IHRoaXMuc3RhdHVzVGV4dDtcbiAgICByLmhlYWRlcnMgPSB0aGlzLmhlYWRlcnM7IHIudHlwZSA9IHRoaXMudHlwZTtcbiAgICByLnVybCA9IHRoaXMudXJsOyByLnJlZGlyZWN0ZWQgPSB0aGlzLnJlZGlyZWN0ZWQ7IHIuYm9keSA9IHRoaXMuYm9keTtcbiAgICByZXR1cm4gcjtcbiAgfTtcbiAgZ2xvYmFsVGhpcy5SZXNwb25zZS5qc29uID0gZnVuY3Rpb24oZGF0YSwgaW5pdCkge1xuICAgIHZhciBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgdmFyIGhlYWRlcnMgPSBuZXcgZ2xvYmFsVGhpcy5IZWFkZXJzKGluaXQgPyBpbml0LmhlYWRlcnMgOiBbXSk7XG4gICAgaWYgKCFoZWFkZXJzLmhhcyhcImNvbnRlbnQtdHlwZVwiKSkgeyBoZWFkZXJzLnNldChcImNvbnRlbnQtdHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7IH1cbiAgICByZXR1cm4gbmV3IGdsb2JhbFRoaXMuUmVzcG9uc2UoYm9keSwgeyBzdGF0dXM6IChpbml0ICYmIGluaXQuc3RhdHVzKSB8fCAyMDAsIHN0YXR1c1RleHQ6IChpbml0ICYmIGluaXQuc3RhdHVzVGV4dCkgfHwgXCJcIiwgaGVhZGVyczogaGVhZGVycyB9KTtcbiAgfTtcbn1cbmlmICh0eXBlb2YgUmVxdWVzdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICBnbG9iYWxUaGlzLlJlcXVlc3QgPSBmdW5jdGlvbihpbnB1dCwgaW5pdCkge1xuICAgIGluaXQgPSBpbml0IHx8IHt9O1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHsgdGhpcy51cmwgPSBpbnB1dDsgfVxuICAgIGVsc2UgaWYgKGlucHV0ICYmIHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy51cmwgPSBpbnB1dC51cmwgfHwgXCJcIjsgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2Q7XG4gICAgICB0aGlzLmhlYWRlcnMgPSBpbnB1dC5oZWFkZXJzOyB0aGlzLmJvZHkgPSBpbnB1dC5ib2R5O1xuICAgIH1cbiAgICBpZiAoaW5pdC5tZXRob2QpIHRoaXMubWV0aG9kID0gaW5pdC5tZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoIXRoaXMubWV0aG9kKSB0aGlzLm1ldGhvZCA9IFwiR0VUXCI7XG4gICAgaWYgKGluaXQuaGVhZGVycykgdGhpcy5oZWFkZXJzID0gbmV3IGdsb2JhbFRoaXMuSGVhZGVycyhpbml0LmhlYWRlcnMpO1xuICAgIGlmICghdGhpcy5oZWFkZXJzKSB0aGlzLmhlYWRlcnMgPSBuZXcgZ2xvYmFsVGhpcy5IZWFkZXJzKCk7XG4gICAgaWYgKGluaXQuYm9keSAhPT0gdW5kZWZpbmVkKSB0aGlzLmJvZHkgPSBpbml0LmJvZHk7XG4gICAgaWYgKCF0aGlzLmJvZHkpIHRoaXMuYm9keSA9IG51bGw7XG4gICAgdGhpcy5kdXBsZXggPSBpbml0LmR1cGxleCB8fCBcImhhbGZcIjtcbiAgfTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMuUmVxdWVzdC5wcm90b3R5cGUsIFwiYm9keVVzZWRcIiwge1xuICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZTsgfVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZ2xvYmFsVGhpcy5SZXF1ZXN0LnByb3RvdHlwZSwge1xuICAgIGFycmF5QnVmZmVyOiB7IHZhbHVlOiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyXCIpLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0sXG4gICAganNvbjogeyB2YWx1ZTogZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwiX19idWlsdGluX3Jlc3BvbnNlX2pzb25cIiksIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSxcbiAgICB0ZXh0OiB7IHZhbHVlOiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dFwiKSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LFxuICB9KTtcbn1cblxuLy8gY3JlYXRlSG9vayDigJQgcmV0dXJucyBhIEhvb2sgb2JqZWN0IHRoYXQgaXMgYm90aCBhIFRoZW5hYmxlIGFuZCBBc3luY0l0ZXJhYmxlLlxuLy8gRWFjaCBhd2FpdC95aWVsZCBjcmVhdGVzIGEgbmV3IHByb21pc2Uga2V5ZWQgYnkgdGhlIHNhbWUgY29ycmVsYXRpb25JZC5cbi8vIFRoZSBwcm9taXNlIGlzIHJlc29sdmVkIHdoZW4gYSBob29rX3JlY2VpdmVkIGV2ZW50IGFycml2ZXMuXG5nbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19DUkVBVEVfSE9PS1wiKV0gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZiAob3B0aW9ucy5pc1dlYmhvb2sgPT09IHRydWUgJiYgb3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYmhvb2sgaG9va3MgZG8gbm90IHN1cHBvcnQgXFxgZXhwZXJpbWVudGFsX21pblJldGVudGlvblxcYC4gVXNlIGEgbm9uLXdlYmhvb2sgXFxgY3JlYXRlSG9vaygpXFxgIHdpdGggXFxgcmVzdW1lSG9vaygpXFxgLicpO1xuICB9XG4gIGlmIChvcHRpb25zLmV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb24gIT09IHVuZGVmaW5lZCAmJiBnbG9iYWxUaGlzLl9fd29ybGRDYXBhYmlsaXRpZXM/Lmhvb2tSZXRlbnRpb24/LmFjdGl2ZSAhPT0gdHJ1ZSkge1xuICAgIHZhciB1bnN1cHBvcnRlZFJldGVudGlvbkVycm9yID0gbmV3IEVycm9yKCdUaGUgY29uZmlndXJlZCBXb3JsZCBkb2VzIG5vdCBzdXBwb3J0IFxcYGV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb25cXGAgZm9yIEhvb2tzLicpO1xuICAgIHVuc3VwcG9ydGVkUmV0ZW50aW9uRXJyb3IubmFtZSA9IFwiRmF0YWxFcnJvclwiO1xuICAgIHVuc3VwcG9ydGVkUmV0ZW50aW9uRXJyb3IuZmF0YWwgPSB0cnVlO1xuICAgIHRocm93IHVuc3VwcG9ydGVkUmV0ZW50aW9uRXJyb3I7XG4gIH1cbiAgdmFyIHRva2VuID0gb3B0aW9ucy50b2tlbiB8fCBnbG9iYWxUaGlzLl9fZ2VuZXJhdGVOYW5vaWQoKTtcbiAgdmFyIGNvcnJlbGF0aW9uSWQgPSBcImhvb2tfXCIgKyBnbG9iYWxUaGlzLl9fZ2VuZXJhdGVVbGlkKCk7XG4gIHZhciBpc0Rpc3Bvc2VkID0gZmFsc2U7XG4gIHZhciBoYXNDcmVhdGVkRXZlbnQgPSBmYWxzZTtcbiAgdmFyIHRva2VuUmV0ZW50aW9uVW50aWw7XG4gIGlmIChvcHRpb25zLmV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBtaW5SZXRlbnRpb24gPSBvcHRpb25zLmV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb247XG4gICAgaWYgKHR5cGVvZiBtaW5SZXRlbnRpb24gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChtaW5SZXRlbnRpb24gPCAwIHx8ICFpc0Zpbml0ZShtaW5SZXRlbnRpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZHVyYXRpb246IFwiICsgbWluUmV0ZW50aW9uICsgXCIuIEV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlwiKTtcbiAgICAgIH1cbiAgICAgIHRva2VuUmV0ZW50aW9uVW50aWwgPSBEYXRlLm5vdygpICsgbWluUmV0ZW50aW9uO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1pblJldGVudGlvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdmFyIHJldGVudGlvbk1zID0gZ2xvYmFsVGhpcy5fX3BhcnNlRHVyYXRpb25NcyhtaW5SZXRlbnRpb24pO1xuICAgICAgaWYgKHR5cGVvZiByZXRlbnRpb25NcyAhPT0gXCJudW1iZXJcIiB8fCByZXRlbnRpb25NcyA8IDAgfHwgIWlzRmluaXRlKHJldGVudGlvbk1zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZHVyYXRpb246IFwiJyArIG1pblJldGVudGlvbiArICdcIi4gRXhwZWN0ZWQgYSB2YWxpZCBkdXJhdGlvbiBzdHJpbmcgbGlrZSBcIjFzXCIsIFwiMW1cIiwgXCIxaFwiLCBldGMuJyk7XG4gICAgICB9XG4gICAgICB0b2tlblJldGVudGlvblVudGlsID0gRGF0ZS5ub3coKSArIHJldGVudGlvbk1zO1xuICAgIH0gZWxzZSBpZiAobWluUmV0ZW50aW9uIGluc3RhbmNlb2YgRGF0ZSB8fCAobWluUmV0ZW50aW9uICYmIHR5cGVvZiBtaW5SZXRlbnRpb24uZ2V0VGltZSA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgICAgLy8gQWNjZXB0IERhdGUtbGlrZSBvYmplY3RzIChhbnl0aGluZyB3aXRoIGdldFRpbWUpLCBtYXRjaGluZ1xuICAgICAgLy8gcGFyc2VEdXJhdGlvblRvRGF0ZTogdmFsdWVzIHRoYXQgY3Jvc3NlZCB0aGUgc2VyZGUgYm91bmRhcnkgbWF5XG4gICAgICAvLyBub3QgYmUgcmVhbG0tbmF0aXZlIERhdGUgaW5zdGFuY2VzLlxuICAgICAgdG9rZW5SZXRlbnRpb25VbnRpbCA9IG1pblJldGVudGlvbi5nZXRUaW1lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZHVyYXRpb24gcGFyYW1ldGVyLiBFeHBlY3RlZCBhIGR1cmF0aW9uIHN0cmluZywgbnVtYmVyIChtaWxsaXNlY29uZHMpLCBvciBEYXRlIG9iamVjdC5cIik7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgaW4gcGVuZGluZyBvcGVyYXRpb25zLiBNZXRhZGF0YSBzdGF5cyBhIFJBVyB2YWx1ZTsgdGhlIGhvc3RcbiAgLy8gc2VyaWFsaXplcyBpdCB0aHJvdWdoIGEgaGFuZGxlIHdoZW4gaXQgY29sbGVjdHMgdGhlIHBlbmRpbmcgb3AuXG4gIHZhciBwZW5kaW5nT3AgPSB7XG4gICAgdHlwZTogXCJob29rXCIsXG4gICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZCxcbiAgICB0b2tlbjogdG9rZW4sXG4gICAgdG9rZW5SZXRlbnRpb25VbnRpbDogdG9rZW5SZXRlbnRpb25VbnRpbCxcbiAgICBpc1dlYmhvb2s6ICEhb3B0aW9ucy5pc1dlYmhvb2ssXG4gICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgaGFzQ3JlYXRlZEV2ZW50OiBmYWxzZSxcbiAgfTtcbiAgZ2xvYmFsVGhpcy5fX3BlbmRpbmcucHVzaChwZW5kaW5nT3ApO1xuXG4gIC8vIFBlci1ob29rIGxpZmVjeWNsZSBzdGF0ZSBiYWNraW5nIGhvb2suZ2V0Q29uZmxpY3QoKTogcmVzb2x2ZXMgbnVsbFxuICAvLyBvbmNlIGNyZWF0aW9uIGlzIGNvbmZpcm1lZCAoaG9va19jcmVhdGVkKSwgb3IgcmVzb2x2ZXMgd2l0aCB0aGVcbiAgLy8gY29uZmxpY3RpbmcgUnVuIGhhbmRsZSAvIHJlamVjdHMgd2l0aCBIb29rQ29uZmxpY3RFcnJvciBvblxuICAvLyBob29rX2NvbmZsaWN0LiBTdGF0ZSB0cmFuc2l0aW9ucyBhcmUgZHJpdmVuIGJ5IHRoZSBob3N0IGR1cmluZyBldmVudFxuICAvLyBwcm9jZXNzaW5nIChzZWUgcHJvY2Vzc0V2ZW50cykuXG4gIGdsb2JhbFRoaXMuX19ob29rcyA9IGdsb2JhbFRoaXMuX19ob29rcyB8fCB7fTtcbiAgZ2xvYmFsVGhpcy5fX2hvb2tzW2NvcnJlbGF0aW9uSWRdID0ge1xuICAgIHRva2VuOiB0b2tlbixcbiAgICBjcmVhdGVkOiBmYWxzZSxcbiAgICBjb25mbGljdDogbnVsbCxcbiAgICBnZXRDb25mbGljdFJlc29sdmVyczogW10sXG4gIH07XG5cbiAgLy8gRWFjaCBhd2FpdCBjcmVhdGVzIGEgbmV3IHByb21pc2UgZm9yIHRoZSBuZXh0IHBheWxvYWQuXG4gIC8vIFRoZSBjb3JyZWxhdGlvbklkIHN0YXlzIHRoZSBzYW1lIOKAlCB0aGUgcmVzb2x2ZXIgaXMgcmVwbGFjZWQgZWFjaCB0aW1lLlxuICBmdW5jdGlvbiBjcmVhdGVIb29rUHJvbWlzZSgpIHtcbiAgICAvLyBDaGVjayB0aGUgcGF5bG9hZCBidWZmZXIgZmlyc3Qg4oCUIGlmIGEgaG9va19yZWNlaXZlZCBldmVudCBhcnJpdmVkXG4gICAgLy8gYmVmb3JlIHRoaXMgaG9vayB3YXMgYXdhaXRlZCwgdGhlIHBheWxvYWQgd2FzIGJ1ZmZlcmVkIGluIHRoZSBWTVxuICAgIC8vIGhlYXAuIERyYWluIGl0IGltbWVkaWF0ZWx5IChtYXRjaGluZyBldmVudC1yZXBsYXkgcGF5bG9hZHNRdWV1ZSkuXG4gICAgdmFyIGJ1ZiA9IGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlcltjb3JyZWxhdGlvbklkXTtcbiAgICBpZiAoYnVmICYmIGJ1Zi5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGJ1Zi5zaGlmdCgpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1tjb3JyZWxhdGlvbklkXSA9IHsgcmVzb2x2ZTogcmVzb2x2ZSwgcmVqZWN0OiByZWplY3QgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc3Bvc2VIb29rKCkge1xuICAgIGlmIChpc0Rpc3Bvc2VkKSByZXR1cm47XG4gICAgaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgLy8gQSBjb25mbGljdGVkIGhvb2sgd2FzIG5ldmVyIGNyZWF0ZWQgKHRoZSB3b3JsZCByZWplY3RlZCBpdHMgY2xhaW1cbiAgICAvLyDigJQgdGhlIHRva2VuIGJlbG9uZ3MgdG8gYW5vdGhlciBydW4pLCBzbyB0aGVyZSBpcyBubyBlbnRpdHkgdG9cbiAgICAvLyBkaXNwb3NlLiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSwgd2hlcmUgaG9va19jb25mbGljdCByZW1vdmVzXG4gICAgLy8gdGhlIGludm9jYXRpb24tcXVldWUgaXRlbSBiZWZvcmUgZGlzcG9zZSBjYW4gbWFyayBpdC4gRW1pdHRpbmcgYVxuICAgIC8vIGhvb2tfZGlzcG9zZWQgaGVyZSB3b3VsZCBiZSByZWplY3RlZCBieSB0aGUgd29ybGQnc1xuICAgIC8vIGhvb2stZXhpc3RlbmNlIHZhbGlkYXRpb24uXG4gICAgdmFyIHN0YXRlID0gZ2xvYmFsVGhpcy5fX2hvb2tzW2NvcnJlbGF0aW9uSWRdO1xuICAgIGlmICghc3RhdGUgfHwgIXN0YXRlLmNvbmZsaWN0KSB7XG4gICAgICAvLyBTaWduYWwgdG8gdGhlIGVudHJ5cG9pbnQgdG8gY3JlYXRlIGEgaG9va19kaXNwb3NlZCBldmVudC4gVGhlXG4gICAgICAvLyB0b2tlbiBpcyBjYXJyaWVkIHNvIHRoZSBlbnRyeXBvaW50IGNhbiBvcmRlciBzYW1lLXRva2VuIGhvb2tcbiAgICAgIC8vIG9wZXJhdGlvbnMgc2VxdWVudGlhbGx5IChhIGRpc3Bvc2UgbXVzdCByZWxlYXNlIHRoZSB0b2tlbiBiZWZvcmVcbiAgICAgIC8vIGEgbGF0ZXIgc2FtZS10b2tlbiBob29rJ3MgY3JlYXRpb24gaXMgdmFsaWRhdGVkKS5cbiAgICAgIGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goe1xuICAgICAgICB0eXBlOiBcImhvb2tfZGlzcG9zZVwiLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBjb3JyZWxhdGlvbklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gSWYgdGhlcmUncyBhIHBlbmRpbmcgcmVzb2x2ZXIsIHJlc29sdmUgaXQgd2l0aCB1bmRlZmluZWQgdG8gYnJlYWsgdGhlIGl0ZXJhdG9yXG4gICAgaWYgKGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbY29ycmVsYXRpb25JZF0pIHtcbiAgICAgIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbY29ycmVsYXRpb25JZF0ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgZGVsZXRlIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbY29ycmVsYXRpb25JZF07XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q29uZmxpY3QoKSB7XG4gICAgdmFyIHN0YXRlID0gZ2xvYmFsVGhpcy5fX2hvb2tzW2NvcnJlbGF0aW9uSWRdO1xuICAgIGlmIChzdGF0ZS5jb25mbGljdCkge1xuICAgICAgcmV0dXJuIHN0YXRlLmNvbmZsaWN0LnJ1blxuICAgICAgICA/IFByb21pc2UucmVzb2x2ZShzdGF0ZS5jb25mbGljdC5ydW4pXG4gICAgICAgIDogUHJvbWlzZS5yZWplY3Qoc3RhdGUuY29uZmxpY3QuZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuY3JlYXRlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgLy8gQ3JlYXRpb24gbm90IHlldCBjb25maXJtZWQgYnkgdGhlIGV2ZW50IGxvZyDigJQgcGFyayB0aGUgYXdhaXRlciBhbmRcbiAgICAvLyBmbGFnIHRoZSBwZW5kaW5nIG9wIHNvIHRoZSBlbnRyeXBvaW50IHJlLWludm9rZXMgdGhlIHdvcmtmbG93IHJpZ2h0XG4gICAgLy8gYWZ0ZXIgd3JpdGluZyBob29rX2NyZWF0ZWQgKG5vdGhpbmcgZXh0ZXJuYWwgcmVzdW1lcyBhIGdldENvbmZsaWN0XG4gICAgLy8gYXdhaXRlcjsgY29uZmlybWF0aW9uIG9ubHkgY29tZXMgZnJvbSByZXBsYXlpbmcgdGhlIG5ldyBldmVudCkuXG4gICAgcGVuZGluZ09wLmhhc0dldENvbmZsaWN0QXdhaXRlciA9IHRydWU7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgc3RhdGUuZ2V0Q29uZmxpY3RSZXNvbHZlcnMucHVzaCh7IHJlc29sdmU6IHJlc29sdmUsIHJlamVjdDogcmVqZWN0IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGhvb2sgPSB7XG4gICAgdG9rZW46IHRva2VuLFxuICAgIHRoZW46IGZ1bmN0aW9uKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gY3JlYXRlSG9va1Byb21pc2UoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICB9LFxuICAgIGdldENvbmZsaWN0OiBnZXRDb25mbGljdCxcbiAgICBkaXNwb3NlOiBkaXNwb3NlSG9vayxcbiAgfTtcblxuICAvLyBTeW1ib2wuZGlzcG9zZSBmb3IgZXhwbGljaXQgcmVzb3VyY2UgbWFuYWdlbWVudFxuICBob29rW1N5bWJvbC5kaXNwb3NlXSA9IGRpc3Bvc2VIb29rO1xuXG4gIC8vIEFzeW5jSXRlcmFibGUg4oCUIHlpZWxkcyBwYXlsb2FkcyB1bnRpbCBkaXNwb3NlZFxuICBob29rW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlSG9va1Byb21pc2UoKS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgLy8gSWYgZGlzcG9zZWQgd2hpbGUgd2FpdGluZywgc2lnbmFsIGRvbmVcbiAgICAgICAgICBpZiAoaXNEaXNwb3NlZCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcmV0dXJuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgZGlzcG9zZUhvb2soKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG5cbiAgcmV0dXJuIGhvb2s7XG59O1xuXG4vLyBzZXRBdHRyaWJ1dGVzIOKAlCBhdHRhY2hlcyBwbGFpbnRleHQgbWV0YWRhdGEgdG8gdGhlIGN1cnJlbnQgcnVuLlxuLy8gVmFsaWRhdGlvbiBoYXBwZW5zIGluIGxpYnJhcnkgY29kZSAobm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcykgYmVmb3JlXG4vLyB0aGlzIGRpc3BhdGNoZXIgaXMgaW52b2tlZCwgc28gXCJjaGFuZ2VzXCIgaXMgYWxyZWFkeSBub3JtYWxpemVkLiBUaGVcbi8vIHJldHVybmVkIHByb21pc2UgcmVzb2x2ZXMgd2hlbiB0aGUgbWF0Y2hpbmcgYXR0cl9zZXQgZXZlbnQgaXNcbi8vIG9ic2VydmVkIGR1cmluZyBldmVudCBwcm9jZXNzaW5nIOKAlCBtaXJyb3JpbmcgdGhlIG5vZGU6dm0gZW5naW5lJ3Ncbi8vIGNyZWF0ZVNldEF0dHJpYnV0ZXMgKGF0dHJpYnV0ZS1kaXNwYXRjaGVyLnRzKS5cbmdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1NFVF9BVFRSSUJVVEVTXCIpXSA9IGZ1bmN0aW9uKGNoYW5nZXMsIG9wdGlvbnMpIHtcbiAgdmFyIGNvcnJlbGF0aW9uSWQgPSBcImF0dHJfXCIgKyBnbG9iYWxUaGlzLl9fZ2VuZXJhdGVVbGlkKCk7XG4gIGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goe1xuICAgIHR5cGU6IFwiYXR0cmlidXRlXCIsXG4gICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZCxcbiAgICBjaGFuZ2VzOiBjaGFuZ2VzLFxuICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOiAhIShvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMpLFxuICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gIH0pO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyUmVzb2x2ZXIoY29ycmVsYXRpb25JZCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgfSk7XG59O1xuXG4vLyAtLS0tIEFib3J0Q29udHJvbGxlciAvIEFib3J0U2lnbmFsIChob29rLWJhY2tlZCkgLS0tLVxuLy8gUG9ydCBvZiB3b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLnRzIHRvIHRoZSBWTSBwZW5kaW5nLW9wIG1vZGVsOlxuLy8gdGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGEgc3lzdGVtIGhvb2s7IGFib3J0KCkgZmxpcHMgdGhlIHNpZ25hbFxuLy8gc3luY2hyb25vdXNseSBhbmQgbWFya3MgdGhlIHBlbmRpbmcgb3Agc28gdGhlIGhvc3QgcmVjb3JkcyB0aGUgYWJvcnRcbi8vIChob29rX3JlY2VpdmVkIGV2ZW50ICsgc3RyZWFtIHBhY2tldCkuIE9uIHJlcGxheSwgdGhlIHJlY29yZGVkXG4vLyBob29rX3JlY2VpdmVkIGV2ZW50IGNhbGxzIF9zZXRBYm9ydGVkIGR1cmluZyBldmVudCBwcm9jZXNzaW5nIGFuZCB0aGVcbi8vIHdvcmtmbG93J3Mgb3duIGFib3J0KCkgY2FsbCBiZWNvbWVzIGEgbm8tb3AuXG52YXIgX19BQk9SVF9TVFJFQU1fTkFNRSA9IFN5bWJvbC5mb3IoXCJXT1JLRkxPV19BQk9SVF9TVFJFQU1fTkFNRVwiKTtcbnZhciBfX0FCT1JUX0hPT0tfVE9LRU4gPSBTeW1ib2wuZm9yKFwiV09SS0ZMT1dfQUJPUlRfSE9PS19UT0tFTlwiKTtcblxuZnVuY3Rpb24gX19tYWtlQWJvcnRFcnJvcigpIHtcbiAgaWYgKHR5cGVvZiBET01FeGNlcHRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gbmV3IERPTUV4Y2VwdGlvbihcIlRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuXCIsIFwiQWJvcnRFcnJvclwiKTtcbiAgfVxuICB2YXIgZSA9IG5ldyBFcnJvcihcIlRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuXCIpO1xuICBlLm5hbWUgPSBcIkFib3J0RXJyb3JcIjtcbiAgcmV0dXJuIGU7XG59XG5cbmZ1bmN0aW9uIFdvcmtmbG93QWJvcnRTaWduYWwoc3RyZWFtTmFtZSwgaG9va1Rva2VuKSB7XG4gIHRoaXMuYWJvcnRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYXNvbiA9IHVuZGVmaW5lZDtcbiAgdGhpc1tfX0FCT1JUX1NUUkVBTV9OQU1FXSA9IHN0cmVhbU5hbWU7XG4gIHRoaXNbX19BQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgdGhpcy5fX2xpc3RlbmVycyA9IFtdO1xuICB0aGlzLl9fb25hYm9ydCA9IG51bGw7XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV29ya2Zsb3dBYm9ydFNpZ25hbC5wcm90b3R5cGUsIFwib25hYm9ydFwiLCB7XG4gIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9fb25hYm9ydDsgfSxcbiAgc2V0OiBmdW5jdGlvbihoYW5kbGVyKSB7XG4gICAgdGhpcy5fX29uYWJvcnQgPSBoYW5kbGVyO1xuICAgIGlmIChoYW5kbGVyICYmIHRoaXMuYWJvcnRlZCkgaGFuZGxlci5jYWxsKHRoaXMpO1xuICB9LFxufSk7XG5Xb3JrZmxvd0Fib3J0U2lnbmFsLnByb3RvdHlwZS5fc2V0QWJvcnRlZCA9IGZ1bmN0aW9uKHJlYXNvbikge1xuICBpZiAodGhpcy5hYm9ydGVkKSByZXR1cm47XG4gIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gIHRoaXMucmVhc29uID0gcmVhc29uO1xuICBpZiAodGhpcy5fX29uYWJvcnQpIHRoaXMuX19vbmFib3J0LmNhbGwodGhpcyk7XG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9fbGlzdGVuZXJzO1xuICB0aGlzLl9fbGlzdGVuZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSBsaXN0ZW5lcnNbaV0oKTtcbn07XG5Xb3JrZmxvd0Fib3J0U2lnbmFsLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKHR5cGUgIT09IFwiYWJvcnRcIikgcmV0dXJuO1xuICBpZiAodGhpcy5hYm9ydGVkKSB7XG4gICAgLy8gRmlyZSBzeW5jaHJvbm91c2x5IChub3Qgb24gYSBtaWNyb3Rhc2spIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheSDigJRcbiAgICAvLyBtYXRjaGVzIHRoZSBub2RlOnZtIGVuZ2luZSdzIFdvcmtmbG93QWJvcnRTaWduYWwuXG4gICAgbGlzdGVuZXIoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5fX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbn07XG5Xb3JrZmxvd0Fib3J0U2lnbmFsLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKHR5cGUgIT09IFwiYWJvcnRcIikgcmV0dXJuO1xuICB0aGlzLl9fbGlzdGVuZXJzID0gdGhpcy5fX2xpc3RlbmVycy5maWx0ZXIoZnVuY3Rpb24obCkgeyByZXR1cm4gbCAhPT0gbGlzdGVuZXI7IH0pO1xufTtcbldvcmtmbG93QWJvcnRTaWduYWwucHJvdG90eXBlLnRocm93SWZBYm9ydGVkID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLmFib3J0ZWQpIHtcbiAgICB0aHJvdyB0aGlzLnJlYXNvbiAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmVhc29uICE9PSBudWxsXG4gICAgICA/IHRoaXMucmVhc29uXG4gICAgICA6IF9fbWFrZUFib3J0RXJyb3IoKTtcbiAgfVxufTtcbi8vIEV4cG9zZSBmb3IgdGhlIGhvc3Qgc2VyZGUncyByZXZpdmVycyAodGhleSBsb29rIHRoZSBjbGFzcyB1cCBsYXppbHksXG4vLyB0aHJvdWdoIGEgaGFuZGxlLCBhdCByZXZpdmUgdGltZSkuXG5nbG9iYWxUaGlzLl9fV29ya2Zsb3dBYm9ydFNpZ25hbCA9IFdvcmtmbG93QWJvcnRTaWduYWw7XG5cbi8vIFJlZ2lzdHJ5IG9mIGxpdmUgYWJvcnQgc2lnbmFscyBrZXllZCBieSB0aGVpciBob29rIGNvcnJlbGF0aW9uSWQuIFRoZVxuLy8gaG9zdCBkZWxpdmVycyBob29rX3JlY2VpdmVkIGV2ZW50cyBmb3IgdGhlc2UgaWRzIGFzIF9zZXRBYm9ydGVkIGNhbGxzLlxuZ2xvYmFsVGhpcy5fX2Fib3J0U2lnbmFscyA9IHt9O1xuXG5nbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciA9IGZ1bmN0aW9uIFdvcmtmbG93QWJvcnRDb250cm9sbGVyKCkge1xuICB2YXIgaWQgPSBnbG9iYWxUaGlzLl9fZ2VuZXJhdGVVbGlkKCk7XG4gIHZhciBzdHJlYW1OYW1lID0gXCJzdHJtX1wiICsgaWQgKyBcIl9zeXN0ZW1fYWJvcnRcIjtcbiAgdmFyIGhvb2tUb2tlbiA9IFwiYWJydF9cIiArIGlkO1xuICB0aGlzW19fQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgdGhpc1tfX0FCT1JUX0hPT0tfVE9LRU5dID0gaG9va1Rva2VuO1xuICB0aGlzLnNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKHN0cmVhbU5hbWUsIGhvb2tUb2tlbik7XG4gIHZhciBjb3JyZWxhdGlvbklkID0gXCJob29rX1wiICsgZ2xvYmFsVGhpcy5fX2dlbmVyYXRlVWxpZCgpO1xuICAvLyBSZWdpc3RlciBhbiBpbnRlcm5hbCBzeXN0ZW0gaG9vay4gaXNTeXN0ZW0gcHJldmVudHMgdG9rZW4gbmFtZXNwYWNlXG4gIC8vIGNvbmZsaWN0cyB3aXRoIHVzZXIgaG9va3MuXG4gIGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goe1xuICAgIHR5cGU6IFwiaG9va1wiLFxuICAgIGNvcnJlbGF0aW9uSWQ6IGNvcnJlbGF0aW9uSWQsXG4gICAgdG9rZW46IGhvb2tUb2tlbixcbiAgICBpc1dlYmhvb2s6IGZhbHNlLFxuICAgIGlzU3lzdGVtOiB0cnVlLFxuICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gIH0pO1xuICBnbG9iYWxUaGlzLl9fYWJvcnRTaWduYWxzW2NvcnJlbGF0aW9uSWRdID0gdGhpcy5zaWduYWw7XG59O1xuZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXIucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24ocmVhc29uKSB7XG4gIGlmICh0aGlzLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47IC8vIGFscmVhZHkgYWJvcnRlZCAoZS5nLiBmcm9tIHJlcGxheSlcbiAgdGhpcy5zaWduYWwuX3NldEFib3J0ZWQocmVhc29uKTtcbiAgLy8gTWFyayB0aGUgcGVuZGluZyBob29rIG9wIHNvIHRoZSBob3N0IHJlY29yZHMgdGhlIGFib3J0LiBUaGUgcGF5bG9hZFxuICAvLyBzdGF5cyBhIFJBVyB2YWx1ZTsgdGhlIGhvc3Qgc2VyaWFsaXplcyBpdCB0aHJvdWdoIGEgaGFuZGxlIHdpdGggZnVsbFxuICAvLyB0eXBlIGZpZGVsaXR5IChFcnJvcnMsIERPTUV4Y2VwdGlvbiwgY3VzdG9tIHZhbHVlcykuXG4gIHZhciB0b2tlbiA9IHRoaXNbX19BQk9SVF9IT09LX1RPS0VOXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbG9iYWxUaGlzLl9fcGVuZGluZy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gZ2xvYmFsVGhpcy5fX3BlbmRpbmdbaV07XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJob29rXCIgJiYgaXRlbS50b2tlbiA9PT0gdG9rZW4pIHtcbiAgICAgIGl0ZW0uYWJvcnRSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgaXRlbS5hYm9ydFBheWxvYWQgPSB7XG4gICAgICAgIGFib3J0ZWQ6IHRydWUsXG4gICAgICAgIHJlYXNvbjogcmVhc29uLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufTtcblxuZ2xvYmFsVGhpcy5BYm9ydFNpZ25hbCA9IHtcbiAgYWJvcnQ6IGZ1bmN0aW9uKHJlYXNvbikge1xuICAgIHZhciBzID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwoXCJcIiwgXCJcIik7XG4gICAgcy5fc2V0QWJvcnRlZChyZWFzb24gIT09IHVuZGVmaW5lZCA/IHJlYXNvbiA6IF9fbWFrZUFib3J0RXJyb3IoKSk7XG4gICAgcmV0dXJuIHM7XG4gIH0sXG4gIGFueTogZnVuY3Rpb24oc2lnbmFscykge1xuICAgIHZhciBjb21wb3NpdGUgPSBuZXcgV29ya2Zsb3dBYm9ydFNpZ25hbChcIlwiLCBcIlwiKTtcbiAgICB2YXIgYXJyID0gQXJyYXkuZnJvbShzaWduYWxzKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycltpXS5hYm9ydGVkKSB7XG4gICAgICAgIGNvbXBvc2l0ZS5fc2V0QWJvcnRlZChhcnJbaV0ucmVhc29uKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICAgIHZhciBjbGVhbnVwID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpc3RlbmVycy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAobGlzdGVuZXJzW2pdLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgbGlzdGVuZXJzW2pdLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgbGlzdGVuZXJzW2pdLmxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdGVuZXJzLmxlbmd0aCA9IDA7XG4gICAgfTtcbiAgICBhcnIuZm9yRWFjaChmdW5jdGlvbihzaWduYWwpIHtcbiAgICAgIGlmICghc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIpIHJldHVybjtcbiAgICAgIHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIWNvbXBvc2l0ZS5hYm9ydGVkKSB7XG4gICAgICAgICAgY29tcG9zaXRlLl9zZXRBYm9ydGVkKHNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGxpc3RlbmVycy5wdXNoKHsgc2lnbmFsOiBzaWduYWwsIGxpc3RlbmVyOiBsaXN0ZW5lciB9KTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgbGlzdGVuZXIpO1xuICAgIH0pO1xuICAgIHJldHVybiBjb21wb3NpdGU7XG4gIH0sXG4gIHRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQWJvcnRTaWduYWwudGltZW91dCgpIGlzIG5vdCBzdXBwb3J0ZWQgaW4gd29ya2Zsb3cgZnVuY3Rpb25zLiBcIiArXG4gICAgICAgIFwiVXNlIHNsZWVwKCkgd2l0aCBhbiBBYm9ydENvbnRyb2xsZXIgaW5zdGVhZC4gXCIgK1xuICAgICAgICBcIlNlZTogL2RvY3MvZXJyb3JzL2Fib3J0LXNpZ25hbC10aW1lb3V0LWluLXdvcmtmbG93XCJcbiAgICApO1xuICB9LFxufTtcblxuLy8gV09SS0ZMT1dfR0VUX1NUUkVBTV9JRCDigJQgZ2VuZXJhdGVzIGEgc3RyZWFtIElEIGZvciBhIHdvcmtmbG93IHJ1bi5cbi8vIFJlcGxpY2F0ZXMgZ2V0V29ya2Zsb3dSdW5TdHJlYW1JZCgpIGZyb20gdXRpbC50cyBpbnNpZGUgdGhlIFF1aWNrSlMgVk0uXG4vLyBVc2VzIHRoZSBidWlsdC1pbiBidG9hKCkgZm9yIGJhc2U2NHVybCBlbmNvZGluZy5cbmdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX0dFVF9TVFJFQU1fSURcIildID0gZnVuY3Rpb24obmFtZXNwYWNlKSB7XG4gIHZhciBydW5JZCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX0NPTlRFWFRcIildXG4gICAgPyBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19DT05URVhUXCIpXS53b3JrZmxvd1J1bklkXG4gICAgOiBcIlwiO1xuICB2YXIgc3RyZWFtSWQgPSBydW5JZC5yZXBsYWNlKFwid3J1bl9cIiwgXCJzdHJtX1wiKSArIFwiX3VzZXJcIjtcbiAgaWYgKCFuYW1lc3BhY2UpIHJldHVybiBzdHJlYW1JZDtcbiAgLy8gYmFzZTY0dXJsOiBidG9hIHRoZW4gcmVwbGFjZSArIHdpdGggLSwgLyB3aXRoIF8sIHN0cmlwID1cbiAgdmFyIGI2NCA9IGJ0b2EobmFtZXNwYWNlKS5yZXBsYWNlKC9cXFxcKy9nLCBcIi1cIikucmVwbGFjZSgvXFxcXC8vZywgXCJfXCIpLnJlcGxhY2UoLz0rJC8sIFwiXCIpO1xuICByZXR1cm4gc3RyZWFtSWQgKyBcIl9cIiArIGI2NDtcbn07XG5gO1xuXG4vLyAtLS0tIFJ1bnRpbWUgLS0tLVxuXG4vKipcbiAqIFBoYXNlIDE6IHN0YXRpYyAocnVuLWluZGVwZW5kZW50KSBWTSBpbml0aWFsaXphdGlvbi5cbiAqXG4gKiBDcmVhdGVzIGEgUXVpY2tKUyBWTSBhbmQgbG9hZHMgZXZlcnl0aGluZyB0aGF0IGRvZXMgbm90IGRlcGVuZCBvbiBhXG4gKiBzcGVjaWZpYyB3b3JrZmxvdyBydW46IHRoZSB3b3JrZmxvdy1wcmltaXRpdmUgYm9vdHN0cmFwICh1c2VTdGVwIC9cbiAqIHNsZWVwIC8gY3JlYXRlSG9vayAvIFJlc3BvbnNlLVJlcXVlc3QgcG9seWZpbGxzKS4gU2VyaWFsaXphdGlvbiBpc1xuICogaG9zdC1zaWRlIChxdWlja2pzLXNlcmRlLnRzKSBhbmQgY2FwdHVyZXMgaXRzIGludHJpbnNpY3MgZnJvbSB0aGUgVk1cbiAqIHJpZ2h0IGFmdGVyIHRoaXMgcmV0dXJucy5cbiAqXG4gKiBgZ2V0Tm93TXNgIGJhY2tzIHRoZSBWTSdzIFdBU0kgY2xvY2sgKGBEYXRlLm5vdygpYCAvIGBuZXcgRGF0ZSgpYFxuICogaW5zaWRlIHRoZSBWTSkuIFRoZSBjYWxsYmFjayBpdHNlbGYgaXMgc3RhdGljOiB0aGUgcGVyLXJ1biBzdGF0ZSBpdFxuICogcmVhZHMgbGl2ZXMgb24gdGhlIGhvc3QgYW5kIGlzIGFkdmFuY2VkIGFzIGV2ZW50cyBhcmUgY29uc3VtZWQsXG4gKiBtYXRjaGluZyB0aGUgbm9kZTp2bSBlbmdpbmUncyBkZXRlcm1pbmlzdGljIHJlcGxheSBjbG9jay5cbiAqXG4gKiBUaGlzIHBoYXNlIGlzIHRoZSBmdXR1cmUgYm91bmRhcnkgZm9yIFZNLW1lbW9yeSBzbmFwc2hvdHRpbmc6IGFcbiAqIGJ1aWxkLXRpbWUgc25hcHNob3QgY2FuIGNhcHR1cmUgdGhlIFZNIHJpZ2h0IGFmdGVyIHRoaXMgZnVuY3Rpb24gYW5kXG4gKiBuZXcgcnVucyBjYW4gcmVzdG9yZSBmcm9tIGl0IGluc3RlYWQgb2YgcGF5aW5nIFZNIGNyZWF0aW9uICsgZXZhbCBjb3N0XG4gKiAoYFF1aWNrSlMucmVzdG9yZWAgYWNjZXB0cyB0aGUgc2FtZSB3YXNpIG92ZXJyaWRlKS5cbiAqL1xuLyoqXG4gKiBMb29zZWx5LXR5cGVkIGFjY2Vzc29yIGZvciB0aGUgYFdlYkFzc2VtYmx5YCBnbG9iYWwuIFRoZSBwYWNrYWdlXG4gKiB0c2NvbmZpZydzIGBsaWI6IFtcImVzMjAyMlwiXWAgZG9lcyBub3QgaW5jbHVkZSB0aGUgRE9NIGxpYiB3aGVyZSB0aGVcbiAqIGBXZWJBc3NlbWJseWAgbmFtZXNwYWNlIHR5cGVzIGxpdmU7IHRoZSBydW50aW1lIGdsb2JhbCBpcyBhdmFpbGFibGUgb25cbiAqIGV2ZXJ5IFdBU00tY2FwYWJsZSBwbGF0Zm9ybSB0aGlzIGVuZ2luZSB0YXJnZXRzLlxuICovXG5jb25zdCBXZWJBc3NlbWJseUdsb2JhbCA9IChnbG9iYWxUaGlzIGFzIGFueSkuV2ViQXNzZW1ibHkgYXMge1xuICBjb21waWxlKGJ5dGVzOiBVaW50OEFycmF5KTogUHJvbWlzZTxvYmplY3Q+O1xufTtcblxudHlwZSBDb21waWxlZEV4dGVuc2lvbiA9IE9taXQ8RXh0ZW5zaW9uRGVzY3JpcHRvciwgJ3dhc20nPiAmIHtcbiAgd2FzbTogRXh0ZW5zaW9uRGVzY3JpcHRvclsnd2FzbSddO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzLXdpZGUgY2FjaGUgb2YgdGhlIGNvbXBpbGVkIGBXZWJBc3NlbWJseS5Nb2R1bGVgcyBmb3IgdGhlIG1haW5cbiAqIFF1aWNrSlMgcnVudGltZSBhbmQgaXRzIG5hdGl2ZSBleHRlbnNpb25zLiBgV2ViQXNzZW1ibHkuY29tcGlsZWAgb2YgdGhlXG4gKiB+NjAwIEtCIHJ1bnRpbWUgYmluYXJ5IGlzIHRoZSBtb3N0IGV4cGVuc2l2ZSBwYXJ0IG9mIFZNIGNyZWF0aW9uIGFuZCBpc1xuICogcHVyZSAobm8gcGVyLVZNIHN0YXRlOiBpbnN0YW50aWF0aW9uIGJpbmRzIHRoZSBwZXItVk0gbWVtb3J5KSwgc28gaXRcbiAqIG9ubHkgbmVlZHMgdG8gaGFwcGVuIG9uY2UgcGVyIHByb2Nlc3MuIFRoZSBwcm9taXNlIGlzIGNhY2hlZCAobm90IHRoZVxuICogcmVzdWx0KSBzbyBjb25jdXJyZW50IGZpcnN0IGludm9jYXRpb25zIHNoYXJlIGEgc2luZ2xlIGNvbXBpbGF0aW9uLlxuICovXG4vLyBPbiBgZ2xvYmFsVGhpc2AgKHNlZSBgZ2xvYmFsU2luZ2xldG9uYCk6IHRoZSBjb21tZW50IGFib3ZlIHNheXMgb25jZSBwZXJcbi8vIHByb2Nlc3MsIGFuZCBtb2R1bGUgc2NvcGUgd291bGQgbWFrZSBpdCBvbmNlIHBlciBidW5kbGVyIGxheWVyLCByZWNvbXBpbGluZ1xuLy8gdGhlIH42MDAgS0IgcnVudGltZSBiaW5hcnkgZm9yIGVhY2guXG5jb25zdCBxdWlja2pzQXNzZXRzID0gZ2xvYmFsU2luZ2xldG9uKFxuICAnQHdvcmtmbG93L2NvcmUvL3F1aWNranNDb21waWxlZEFzc2V0cycsXG4gIDEsXG4gICgpID0+ICh7XG4gICAgcHJvbWlzZTogdW5kZWZpbmVkIGFzXG4gICAgICB8IFByb21pc2U8e1xuICAgICAgICAgIHdhc206IG9iamVjdDtcbiAgICAgICAgICBleHRlbnNpb25zOiBDb21waWxlZEV4dGVuc2lvbltdO1xuICAgICAgICB9PlxuICAgICAgfCB1bmRlZmluZWQsXG4gIH0pXG4pO1xuXG5mdW5jdGlvbiBnZXRDb21waWxlZEFzc2V0cygpIHtcbiAgaWYgKCFxdWlja2pzQXNzZXRzLnByb21pc2UpIHtcbiAgICBxdWlja2pzQXNzZXRzLnByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgW3dhc20sIC4uLmV4dGVuc2lvbk1vZHVsZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBXZWJBc3NlbWJseUdsb2JhbC5jb21waWxlKHF1aWNranNXYXNtKSxcbiAgICAgICAgLi4ucXVpY2tqc0V4dGVuc2lvbnMubWFwKChleHQpID0+XG4gICAgICAgICAgV2ViQXNzZW1ibHlHbG9iYWwuY29tcGlsZShleHQud2FzbSBhcyBVaW50OEFycmF5KVxuICAgICAgICApLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3YXNtLFxuICAgICAgICBleHRlbnNpb25zOiBxdWlja2pzRXh0ZW5zaW9ucy5tYXAoKGV4dCwgaSkgPT4gKHtcbiAgICAgICAgICAuLi5leHQsXG4gICAgICAgICAgd2FzbTogZXh0ZW5zaW9uTW9kdWxlc1tpXSBhcyBFeHRlbnNpb25EZXNjcmlwdG9yWyd3YXNtJ10sXG4gICAgICAgIH0pKSxcbiAgICAgIH07XG4gICAgfSkoKTtcbiAgICAvLyBPbiBmYWlsdXJlLCBjbGVhciB0aGUgY2FjaGUgc28gYSBsYXRlciBpbnZvY2F0aW9uIGNhbiByZXRyeSByYXRoZXJcbiAgICAvLyB0aGFuIGJlaW5nIHN0dWNrIHdpdGggYSByZWplY3RlZCBwcm9taXNlIGZvcmV2ZXIuXG4gICAgcXVpY2tqc0Fzc2V0cy5wcm9taXNlLmNhdGNoKCgpID0+IHtcbiAgICAgIHF1aWNranNBc3NldHMucHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcXVpY2tqc0Fzc2V0cy5wcm9taXNlO1xufVxuXG4vKipcbiAqIFdBU0kgY2xvY2sgb3ZlcnJpZGUgcmVhZGluZyB0aGUgZ2l2ZW4gYWNjZXNzb3IsIHNoYXJlZCBiZXR3ZWVuIGZyZXNoXG4gKiBib290cyAoaW5pdFdvcmtmbG93Vk0pIGFuZCBiYXNlbGluZS1zbmFwc2hvdCByZXN0b3Jlcywgc28gdGhlIHR3b1xuICogcGF0aHMgY2Fubm90IGRyaWZ0IG9uIHJvdW5kaW5nL2VuY29kaW5nLlxuICpcbiAqIERldGVybWluaXN0aWMgcmVwbGF5IGNsb2NrOiBEYXRlLm5vdygpIC8gbmV3IERhdGUoKSBpbnNpZGUgdGhlIFZNXG4gKiByZWFkIHRoZSBob3N0LWNvbnRyb2xsZWQgY2xvY2sgaW5zdGVhZCBvZiB3YWxsIHRpbWUuIFJlcGxheVxuICogcmUtZXhlY3V0ZXMgdGhlIHdvcmtmbG93IGZyb20gdGhlIHRvcCBvbiBldmVyeSBpbnZvY2F0aW9uLCBzbyB0aGVcbiAqIGNsb2NrIG11c3QgYmUgZGVyaXZlZCBmcm9tIHRoZSBldmVudCBsb2cgKG5vdCByZWFsIHRpbWUpIGZvciB0aGVcbiAqIHdvcmtmbG93IHRvIG9ic2VydmUgc3RhYmxlIHRpbWVzdGFtcHMgYWNyb3NzIGludm9jYXRpb25zLlxuICovXG5mdW5jdGlvbiBtYWtlRGV0ZXJtaW5pc3RpY0Nsb2NrV2FzaShnZXROb3dNczogKCkgPT4gbnVtYmVyKTogV2FzaU9wdGlvbnMge1xuICByZXR1cm4gKG1lbW9yeSkgPT4gKHtcbiAgICBjbG9ja190aW1lX2dldChfY2xvY2tJZDogbnVtYmVyLCBfcHJlY2lzaW9uOiBiaWdpbnQsIHJlc3VsdFB0cjogbnVtYmVyKSB7XG4gICAgICBjb25zdCB0aW1lTnMgPSBCaWdJbnQoTWF0aC5yb3VuZChnZXROb3dNcygpKSkgKiAxXzAwMF8wMDBuO1xuICAgICAgbmV3IERhdGFWaWV3KG1lbW9yeS5idWZmZXIpLnNldEJpZ1VpbnQ2NChyZXN1bHRQdHIsIHRpbWVOcywgdHJ1ZSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9LFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdFdvcmtmbG93Vk0oXG4gIGdldE5vd01zOiAoKSA9PiBudW1iZXIsXG4gIGludGVycnVwdEJ1ZGdldDogSW50ZXJydXB0QnVkZ2V0XG4pOiBQcm9taXNlPFF1aWNrSlM+IHtcbiAgY29uc3QgYXNzZXRzID0gYXdhaXQgZ2V0Q29tcGlsZWRBc3NldHMoKTtcbiAgY29uc3Qgdm0gPSBhd2FpdCBRdWlja0pTLmNyZWF0ZSh7XG4gICAgd2FzbTogYXNzZXRzLndhc20gYXMgbmV2ZXIsXG4gICAgbWVtb3J5TGltaXQ6IDI1NiAqIDEwMjQgKiAxMDI0LFxuICAgIGludGVycnVwdEhhbmRsZXI6IGNyZWF0ZUludGVycnVwdEhhbmRsZXIoaW50ZXJydXB0QnVkZ2V0KSxcbiAgICBleHRlbnNpb25zOiBhc3NldHMuZXh0ZW5zaW9ucyxcbiAgICB3YXNpOiBtYWtlRGV0ZXJtaW5pc3RpY0Nsb2NrV2FzaShnZXROb3dNcyksXG4gIH0pO1xuXG4gIC8vIEJvb3RzdHJhcCB3b3JrZmxvdyBwcmltaXRpdmVzXG4gIHZtLmV2YWxDb2RlKFZNX0JPT1RTVFJBUCwgJ2Jvb3RzdHJhcC5qcycpLmRpc3Bvc2UoKTtcblxuICByZXR1cm4gdm07XG59XG5cbi8vIC0tLS0gQmFzZWxpbmUgc25hcHNob3QgKHN0YXJ0dXAgb3B0aW1pemF0aW9uKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy9cbi8vIEV2YWx1YXRpbmcgdGhlIHdvcmtmbG93IGJ1bmRsZSBkb21pbmF0ZXMgVk0gc3RhcnR1cCAofjc0bXMgb2YgYSB+Nzdtc1xuLy8gYm9vdCBmb3IgYSAxLjNNQiBidW5kbGUpLCBhbmQgZnVsbCBldmVudCByZXBsYXkgcGF5cyBpdCBvbiBFVkVSWVxuLy8gaW52b2NhdGlvbi4gVGhlIGJ1bmRsZSBpcyBpZGVudGljYWwgYWNyb3NzIGFsbCBydW5zIG9mIGEgZGVwbG95bWVudCwgc29cbi8vIHRoZSBlbmdpbmUgaHlkcmF0ZXMgb25lIFZNIHBlciBmdW5jdGlvbiBpbnN0YW5jZSAoYm9vdHN0cmFwICsgYnVuZGxlXG4vLyBldmFsKSwgc25hcHNob3RzIGl0cyBtZW1vcnksIGFuZCBzdGFydHMgZXZlcnkgaW52b2NhdGlvbiBieSByZXN0b3Jpbmdcbi8vIHRoZSBzbmFwc2hvdCAofjNtcykgaW5zdGVhZCBvZiByZS1ldmFsdWF0aW5nLlxuLy9cbi8vIERldGVybWluaXNtOiByZXBsYXkgcmVxdWlyZXMgbW9kdWxlLXNjb3BlIHVzZXIgY29kZSB0byBvYnNlcnZlIHRoZVxuLy8gcnVuLXNlZWRlZCBQUk5HIGFuZCB0aGUgcnVuJ3MgZGV0ZXJtaW5pc3RpYyBjbG9jay4gQSByZXN0b3JlZCBoZWFwXG4vLyBjYXJyaWVzIHdoYXRldmVyIG1vZHVsZSBzY29wZSBjb21wdXRlZCBhdCBIWURSQVRFIHRpbWUsIHNvIHRoZVxuLy8gb3B0aW1pemF0aW9uIGlzIG9ubHkgc291bmQgd2hlbiBtb2R1bGUgc2NvcGUgY29uc3VtZWQgbmVpdGhlclxuLy8gcmFuZG9tbmVzcyBub3IgdGltZS4gQm90aCBhcmUgZGV0ZWN0ZWQgZHVyaW5nIGh5ZHJhdGUgKHRoZSBwbGFjZWhvbGRlclxuLy8gaG9zdCBmbnMgY291bnQgZHJhd3MsIHRoZSBoeWRyYXRlIGNsb2NrIGNvdW50cyByZWFkcykgYW5kIGEgYnVuZGxlXG4vLyB0aGF0IHVzZWQgZWl0aGVyIGlzIG1hcmtlZCBpbmVsaWdpYmxlOiBldmVyeSBpbnZvY2F0aW9uIGZhbGxzIGJhY2sgdG9cbi8vIGZyZXNoIGV2YWx1YXRpb24sIHByZXNlcnZpbmcgZXhhY3Qgbm9kZTp2bS1wYXJpdHkgc2VtYW50aWNzLiBXaGVuIHRoZVxuLy8gZ2F0ZSBwYXNzZXMsIHJlc3RvcmUgaXMgYnl0ZS1lcXVpdmFsZW50IHRvIGZyZXNoIGV2YWwgKHZlcmlmaWVkIGJ5IHRoZVxuLy8gcGFyaXR5IHRlc3RzKTogdGhlIHBlci1ydW4gaG9zdCBmbnMgYXJlIHJlLXJlZ2lzdGVyZWQgYnkgbmFtZSBvbiB0aGVcbi8vIHJlc3RvcmVkIFZNIChxdWlja2pzLXdhc2kgcmVzdG9yZSBzZW1hbnRpY3MpIGJlZm9yZSB0aGUgd29ya2Zsb3cgYm9keVxuLy8gcnVucywgc28gdGhlIHNlZWRlZCBkcmF3IHNlcXVlbmNlIChhbmQgZXZlcnkgY29ycmVsYXRpb25JZCkgaXNcbi8vIGlkZW50aWNhbC5cbi8vXG4vLyBUaGUgY2FjaGUgaXMgcGVyIGZ1bmN0aW9uIGluc3RhbmNlIGFuZCBrZXllZCBvbiB0aGUgYnVuZGxlIHN0cmluZ1xuLy8gKHJlZmVyZW5jZS1zdGFibGU6IHRoZSBnZW5lcmF0ZWQgZmxvdyByb3V0ZSBob2xkcyBpdCBpbiBhIG1vZHVsZS1sZXZlbFxuLy8gY29uc3QpLiBDYXBwZWQgYXQgYSBmZXcgZW50cmllcyBzbyB0ZXN0cyB3aXRoIG1hbnkgZGlzdGluY3QgYnVuZGxlc1xuLy8gZG9uJ3QgYWNjdW11bGF0ZSAxNk1CIHNuYXBzaG90cy5cblxuLyoqXG4gKiBFdmFsIGZpbGVuYW1lIHVzZWQgd2hlbiBoeWRyYXRpbmcgdGhlIGJhc2VsaW5lIFZNLiBUaGUgYmFzZWxpbmUgaXNcbiAqIHNoYXJlZCBieSBFVkVSWSB3b3JrZmxvdyBpbiB0aGUgYnVuZGxlLCBzbyB0aGUgZmlsZW5hbWUgYmFrZWQgaW50b1xuICogaXRzIGNvbXBpbGVkIGNvZGUgKGFuZCB0aGVyZWZvcmUgaW50byBzbmFwc2hvdC1wYXRoIHN0YWNrIGZyYW1lcylcbiAqIG11c3QgYmUgd29ya2Zsb3ctaW5kZXBlbmRlbnQ6IGh5ZHJhdGluZyB1bmRlciB0aGUgZmlyc3QgY2FsbGVyJ3NcbiAqIHdvcmtmbG93SWQgd291bGQgYnJlYWsgYHJlbWFwRXJyb3JTdGFja2AncyBmaWxlbmFtZSBtYXRjaGluZyBmb3JcbiAqIGV2ZXJ5IG90aGVyIHdvcmtmbG93IGluIHRoZSBidW5kbGUuIFJlbWFwIGNhbGwgc2l0ZXMgbWF0Y2ggdGhpc1xuICogY29uc3RhbnQgSU4gQURESVRJT04gdG8gdGhlIHJ1bidzIG1vZHVsZSBzcGVjaWZpZXIgKHdoaWNoIGNvdmVyc1xuICogZnJlc2gtcGF0aCBmcmFtZXMpLlxuICovXG5leHBvcnQgY29uc3QgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FID0gJ3dvcmtmbG93LWJ1bmRsZS5qcyc7XG5cbnR5cGUgQmFzZWxpbmVFbnRyeSA9XG4gIHwge1xuICAgICAgc3RhdGU6ICdyZWFkeSc7XG4gICAgICBzbmFwc2hvdDogU25hcHNob3Q7XG4gICAgICAvKipcbiAgICAgICAqIFJhdyBib3ggcG9pbnRlciBvZiB0aGUgc2VyZGUgY2FwdHVyZSByb290IGNyZWF0ZWQgQkVGT1JFIHRoZVxuICAgICAgICogYnVuZGxlIGV2YWx1YXRlZCAoc2VlIGNhcHR1cmVTZXJkZVJvb3QpLiBUaGUgYm94IGxpdmVzIGluIHRoZVxuICAgICAgICogc25hcHNob3QncyBtZW1vcnkgaW1hZ2UgYXQgdGhpcyBvZmZzZXQ7IGV2ZXJ5IHJlc3RvcmVkIFZNXG4gICAgICAgKiByZS1hZG9wdHMgaXQgc28gc2VyZGUgaW5pdGlhbGl6YXRpb24gZXhlY3V0ZXMgbm8gZ3Vlc3QgY29kZVxuICAgICAgICogYWZ0ZXIgdXNlciBjb2RlIGhhcyBydW46IGNhcHR1cmUtYmVmb3JlLXVzZXItY29kZSBzZW1hbnRpY3MsXG4gICAgICAgKiBpZGVudGljYWwgdG8gdGhlIGZyZXNoIHBhdGguXG4gICAgICAgKi9cbiAgICAgIHNlcmRlUm9vdFB0cjogbnVtYmVyO1xuICAgIH1cbiAgfCB7IHN0YXRlOiAnaW5lbGlnaWJsZSc7IHJlYXNvbjogc3RyaW5nIH07XG5cbi8vIE9uIGBnbG9iYWxUaGlzYCAoc2VlIGBnbG9iYWxTaW5nbGV0b25gKTogYSBzbmFwc2hvdCBpcyBleHBlbnNpdmUgdG8gYnVpbGQgYW5kXG4vLyBpcyBrZXllZCBieSBidW5kbGUsIHNvIHBlci1jb3B5IGNhY2hlcyB3b3VsZCBidWlsZCB0aGUgc2FtZSBiYXNlbGluZSBvbmNlIHBlclxuLy8gYnVuZGxlciBsYXllciB3aGlsZSBlYWNoIGVuZm9yY2luZyBpdHMgb3duIGJvdW5kLlxuY29uc3QgYmFzZWxpbmVzID0gZ2xvYmFsU2luZ2xldG9uKFxuICAnQHdvcmtmbG93L2NvcmUvL3F1aWNranNCYXNlbGluZXMnLFxuICAxLFxuICAoKSA9PiAoe1xuICAgIGJ5S2V5OiBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxCYXNlbGluZUVudHJ5Pj4oKSxcbiAgfSlcbik7XG5jb25zdCBCQVNFTElORV9DQUNIRV9NQVhfRU5UUklFUyA9IDQ7XG5cbi8qKiBUZXN0LW9ubHk6IHJlc2V0IHRoZSBiYXNlbGluZSBjYWNoZSBiZXR3ZWVuIHRlc3QgY2FzZXMuICovXG5leHBvcnQgZnVuY3Rpb24gX19jbGVhckJhc2VsaW5lU25hcHNob3RDYWNoZUZvclRlc3RzKCk6IHZvaWQge1xuICBiYXNlbGluZXMuYnlLZXkuY2xlYXIoKTtcbn1cblxuLyoqIFRlc3Qtb25seTogb2JzZXJ2ZSBob3cgYSBidW5kbGUgd2FzIGNsYXNzaWZpZWQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX19wZWVrQmFzZWxpbmVFbnRyeUZvclRlc3RzKFxuICB3b3JrZmxvd0NvZGU6IHN0cmluZ1xuKTogUHJvbWlzZTxCYXNlbGluZUVudHJ5IHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiBiYXNlbGluZXMuYnlLZXkuZ2V0KHdvcmtmbG93Q29kZSk7XG59XG5cbi8qKlxuICogSHlkcmF0ZSBhIFZNIHdpdGggdGhlIHdvcmtmbG93IGJ1bmRsZSBhbmQgc25hcHNob3QgaXQsIGdhdGluZyBvblxuICogbW9kdWxlLXNjb3BlIG5vbmRldGVybWluaXNtIChzZWUgdGhlIHNlY3Rpb24gY29tbWVudCBhYm92ZSkuIFJldHVybnMgYW5cbiAqIGBpbmVsaWdpYmxlYCBlbnRyeSBpbnN0ZWFkIG9mIHRocm93aW5nIG9uIGV2YWwgZmFpbHVyZTogdGhlIGZyZXNoIHBhdGhcbiAqIHJlLWV2YWx1YXRlcyBhbmQgcHJvZHVjZXMgdGhlIHJlYWwsIHNvdXJjZS1tYXBwZWQgZXJyb3IuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVCYXNlbGluZVNuYXBzaG90KFxuICB3b3JrZmxvd0NvZGU6IHN0cmluZyxcbiAgd29ya2Zsb3dJZDogc3RyaW5nXG4pOiBQcm9taXNlPEJhc2VsaW5lRW50cnk+IHtcbiAgY29uc3QgaHlkcmF0ZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgbGV0IGNsb2NrUmVhZHMgPSAwO1xuICBjb25zdCBidWRnZXQ6IEludGVycnVwdEJ1ZGdldCA9IHsgc3RhcnQ6IERhdGUubm93KCkgfTtcbiAgY29uc3QgYXNzZXRzID0gYXdhaXQgZ2V0Q29tcGlsZWRBc3NldHMoKTtcbiAgY29uc3Qgdm0gPSBhd2FpdCBRdWlja0pTLmNyZWF0ZSh7XG4gICAgd2FzbTogYXNzZXRzLndhc20gYXMgbmV2ZXIsXG4gICAgbWVtb3J5TGltaXQ6IDI1NiAqIDEwMjQgKiAxMDI0LFxuICAgIGludGVycnVwdEhhbmRsZXI6IGNyZWF0ZUludGVycnVwdEhhbmRsZXIoYnVkZ2V0KSxcbiAgICBleHRlbnNpb25zOiBhc3NldHMuZXh0ZW5zaW9ucyxcbiAgICB3YXNpOiAoKG1lbW9yeSkgPT4gKHtcbiAgICAgIGNsb2NrX3RpbWVfZ2V0KF9jbG9ja0lkOiBudW1iZXIsIF9wcmVjaXNpb246IGJpZ2ludCwgcmVzdWx0UHRyOiBudW1iZXIpIHtcbiAgICAgICAgY2xvY2tSZWFkcysrO1xuICAgICAgICBjb25zdCB0aW1lTnMgPSBCaWdJbnQoaHlkcmF0ZVN0YXJ0KSAqIDFfMDAwXzAwMG47XG4gICAgICAgIG5ldyBEYXRhVmlldyhtZW1vcnkuYnVmZmVyKS5zZXRCaWdVaW50NjQocmVzdWx0UHRyLCB0aW1lTnMsIHRydWUpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0sXG4gICAgfSkpIHNhdGlzZmllcyBXYXNpT3B0aW9ucyxcbiAgfSk7XG4gIHRyeSB7XG4gICAgdm0uZXZhbENvZGUoVk1fQk9PVFNUUkFQLCAnYm9vdHN0cmFwLmpzJykuZGlzcG9zZSgpO1xuXG4gICAgLy8gUGxhY2Vob2xkZXIgaG9zdCBmbnMgdW5kZXIgdGhlIFNBTUUgTkFNRVMgdGhlIHBlci1ydW4gcGhhc2UgdXNlcy5cbiAgICAvLyBUaGV5IGV4aXN0IHNvIG1vZHVsZS1zY29wZSBjb2RlIGNhbiBleGVjdXRlIGF0IGh5ZHJhdGUgdGltZSwgYW5kIHRvXG4gICAgLy8gZGV0ZWN0IHRoYXQgaXQgZGlkOiBhbnkgZHJhdyBtZWFucyB0aGUgaGVhcCB3b3VsZCBiYWtlXG4gICAgLy8gaHlkcmF0ZS1zZWVkZWQgdmFsdWVzIHRoYXQgcGVyLXJ1biBmcmVzaCBldmFsIHdvdWxkIGNvbXB1dGVcbiAgICAvLyBkaWZmZXJlbnRseS4gcnVuV29ya2Zsb3dJblZNIHJlLXJlZ2lzdGVycyBhbGwgdGhyZWUgbmFtZXMgd2l0aCB0aGVcbiAgICAvLyBydW4tc2VlZGVkIGNsb3N1cmVzIGFmdGVyIHJlc3RvcmUuXG4gICAgbGV0IGRyYXdzID0gMDtcbiAgICB7XG4gICAgICB1c2luZyByYW5kb21GbiA9IHZtLm5ld0Z1bmN0aW9uKCdyYW5kb20nLCAoKSA9PiB7XG4gICAgICAgIGRyYXdzKys7XG4gICAgICAgIHJldHVybiB2bS5uZXdOdW1iZXIoTWF0aC5yYW5kb20oKSk7XG4gICAgICB9KTtcbiAgICAgIHVzaW5nIG1hdGggPSB2bS5nbG9iYWwuZ2V0UHJvcCgnTWF0aCcpO1xuICAgICAgbWF0aC5zZXRQcm9wKCdyYW5kb20nLCByYW5kb21Gbik7XG4gICAgICB1c2luZyBuYW5vaWRGbiA9IHZtLm5ld0Z1bmN0aW9uKCdfX2dlbmVyYXRlTmFub2lkJywgKCkgPT4ge1xuICAgICAgICBkcmF3cysrO1xuICAgICAgICByZXR1cm4gdm0ubmV3U3RyaW5nKCdiYXNlbGluZS1wbGFjZWhvbGRlcicpO1xuICAgICAgfSk7XG4gICAgICB2bS5zZXRQcm9wKHZtLmdsb2JhbCwgJ19fZ2VuZXJhdGVOYW5vaWQnLCBuYW5vaWRGbik7XG4gICAgICB1c2luZyB1bGlkRm4gPSB2bS5uZXdGdW5jdGlvbignX19nZW5lcmF0ZVVsaWQnLCAoKSA9PiB7XG4gICAgICAgIGRyYXdzKys7XG4gICAgICAgIHJldHVybiB2bS5uZXdTdHJpbmcoJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgICB9KTtcbiAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX19nZW5lcmF0ZVVsaWQnLCB1bGlkRm4pO1xuICAgIH1cblxuICAgIC8vIFNlcmRlIGNhcHR1cmUgcm9vdDogY3JlYXRlZCBCRUZPUkUgdGhlIGJ1bmRsZSBldmFsdWF0ZXMsIGV4YWN0bHlcbiAgICAvLyBsaWtlIHRoZSBmcmVzaCBwYXRoJ3MgY2FwdHVyZS4gSXRzIGJveCBwb2ludGVyIHJpZGVzIHRoZVxuICAgIC8vIEJhc2VsaW5lRW50cnkgYW5kIGVhY2ggcmVzdG9yZWQgVk0gcmUtYWRvcHRzIGl0LCBzbyBzZXJkZVxuICAgIC8vIGluaXRpYWxpemF0aW9uIG5ldmVyIGV4ZWN1dGVzIGd1ZXN0IGNvZGUgYWZ0ZXIgdXNlciBjb2RlIGhhcyBydW4uXG4gICAgLy8gVGhpcyBpcyB3aGF0IG1ha2VzIG1vZHVsZS1zY29wZSBpbnRyaW5zaWMgcGF0Y2hpbmcgKHBvbHlmaWxscyxcbiAgICAvLyBzdGF0ZWZ1bCB3cmFwcGVycyBhcm91bmQgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciwg4oCmKVxuICAgIC8vIEhBUk1MRVNTIG9uIHRoZSBzbmFwc2hvdCBwYXRoIHJhdGhlciB0aGFuIG1lcmVseSBkZXRlY3RhYmxlOiB0aGVcbiAgICAvLyBzZXJkZSB1c2VzIHRoZSBwcmlzdGluZSBwcmUtZXZhbCBjYXB0dXJlcyBvbiBib3RoIHBhdGhzLCBhbmQgbm9cbiAgICAvLyBwb3N0LWV2YWwgcHJvYmUgZXhpc3RzIHdob3NlIHNpZGUgZWZmZWN0cyBjb3VsZCBiYWtlIGludG8gdGhlXG4gICAgLy8gc25hcHNob3QuIFRoZSBoYW5kbGUgaXMgZGVsaWJlcmF0ZWx5IE5PVCBkaXNwb3NlZCBiZWZvcmUgdGhlXG4gICAgLy8gc25hcHNob3Q6IHRoZSBib3ggbXVzdCBzdGF5IGxpdmUgaW4gdGhlIG1lbW9yeSBpbWFnZSAodGhlXG4gICAgLy8gYmFzZWxpbmUgVk0ncyBkaXNwb3NlIGJlbG93IHRlYXJzIGRvd24gdGhlIHdob2xlIGluc3RhbmNlIHdpdGhvdXRcbiAgICAvLyBmcmVlaW5nIGluZGl2aWR1YWwgYm94ZXMpLlxuICAgIGNvbnN0IHNlcmRlUm9vdCA9IGNhcHR1cmVTZXJkZVJvb3Qodm0pO1xuXG4gICAgY2xvY2tSZWFkcyA9IDA7IC8vIG9ubHkgY291bnQgcmVhZHMgbWFkZSBieSB0aGUgYnVuZGxlIGl0c2VsZlxuICAgIHRyeSB7XG4gICAgICAvLyBXb3JrZmxvdy1pbmRlcGVuZGVudCBmaWxlbmFtZS4gU2VlIEJBU0VMSU5FX0JVTkRMRV9GSUxFTkFNRS5cbiAgICAgIHZtLmV2YWxDb2RlKHdvcmtmbG93Q29kZSwgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FKS5kaXNwb3NlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZXQgdGhlIGZyZXNoIHBhdGggcmUtZXZhbHVhdGUgYW5kIHN1cmZhY2UgdGhlIHJlYWwgZXJyb3Igd2l0aFxuICAgICAgLy8gcHJvcGVyIGZpbGVuYW1lIC8gc291cmNlLW1hcCBoYW5kbGluZy5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXRlOiAnaW5lbGlnaWJsZScsXG4gICAgICAgIHJlYXNvbjogJ21vZHVsZSBzY29wZSB0aHJldyBkdXJpbmcgaHlkcmF0ZScsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChkcmF3cyA+IDAgfHwgY2xvY2tSZWFkcyA+IDApIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgJ1F1aWNrSlMgYmFzZWxpbmUgc25hcHNob3QgZGlzYWJsZWQgZm9yIHRoaXMgYnVuZGxlOiBtb2R1bGUgc2NvcGUgY29uc3VtZWQgbm9uZGV0ZXJtaW5pc3RpYyBpbnB1dHM7IGV2ZXJ5IGludm9jYXRpb24gd2lsbCBldmFsdWF0ZSB0aGUgYnVuZGxlIGZyZXNoJyxcbiAgICAgICAgeyB3b3JrZmxvd0lkLCBkcmF3cywgY2xvY2tSZWFkcyB9XG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdGU6ICdpbmVsaWdpYmxlJyxcbiAgICAgICAgcmVhc29uOiBgbW9kdWxlIHNjb3BlIGNvbnN1bWVkICR7ZHJhd3N9IFBSTkcgZHJhdyhzKSBhbmQgJHtjbG9ja1JlYWRzfSBjbG9jayByZWFkKHMpYCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc25hcHNob3QgPSB2bS5zbmFwc2hvdCgpO1xuICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgYmFzZWxpbmUgc25hcHNob3QgcHJlcGFyZWQnLCB7XG4gICAgICB3b3JrZmxvd0lkLFxuICAgICAgaHlkcmF0ZU1zOiBEYXRlLm5vdygpIC0gaHlkcmF0ZVN0YXJ0LFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZTogJ3JlYWR5JyxcbiAgICAgIHNuYXBzaG90LFxuICAgICAgc2VyZGVSb290UHRyOiBleHBvcnRTZXJkZVJvb3Qodm0sIHNlcmRlUm9vdCksXG4gICAgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB2bS5kaXNwb3NlKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWNoZWQgYmFzZWxpbmUgZW50cnkgZm9yIGEgYnVuZGxlLCBwcmVwYXJpbmcgaXQgb24gZmlyc3QgYWNjZXNzLlxuICogQ29uY3VycmVudCBmaXJzdCBpbnZvY2F0aW9ucyBzaGFyZSBvbmUgaHlkcmF0ZSB2aWEgdGhlIGNhY2hlZCBwcm9taXNlO1xuICogYSBoeWRyYXRlIHRoYXQgUkVKRUNUUyAoaW5mcmFzdHJ1Y3R1cmUgZmFpbHVyZSwgbm90IGJ1bmRsZSBldmFsLCB3aGljaFxuICogcmV0dXJucyBgaW5lbGlnaWJsZWApIGlzIGV2aWN0ZWQgc28gYSBsYXRlciBpbnZvY2F0aW9uIGNhbiByZXRyeS5cbiAqL1xuZnVuY3Rpb24gZ2V0QmFzZWxpbmVFbnRyeShcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gIHdvcmtmbG93SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxCYXNlbGluZUVudHJ5PiB7XG4gIGxldCBlbnRyeSA9IGJhc2VsaW5lcy5ieUtleS5nZXQod29ya2Zsb3dDb2RlKTtcbiAgaWYgKCFlbnRyeSkge1xuICAgIGlmIChiYXNlbGluZXMuYnlLZXkuc2l6ZSA+PSBCQVNFTElORV9DQUNIRV9NQVhfRU5UUklFUykge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gYmFzZWxpbmVzLmJ5S2V5LmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIGJhc2VsaW5lcy5ieUtleS5kZWxldGUob2xkZXN0KTtcbiAgICB9XG4gICAgZW50cnkgPSBwcmVwYXJlQmFzZWxpbmVTbmFwc2hvdCh3b3JrZmxvd0NvZGUsIHdvcmtmbG93SWQpO1xuICAgIGJhc2VsaW5lcy5ieUtleS5zZXQod29ya2Zsb3dDb2RlLCBlbnRyeSk7XG4gICAgZW50cnkuY2F0Y2goKCkgPT4gYmFzZWxpbmVzLmJ5S2V5LmRlbGV0ZSh3b3JrZmxvd0NvZGUpKTtcbiAgfVxuICByZXR1cm4gZW50cnk7XG59XG5cbi8qKlxuICogQSBsaXZlIFF1aWNrSlMgd29ya2Zsb3cgaW52b2NhdGlvbi4gV2hlbiB0aGUgaW5pdGlhbCBgcmVzdWx0YCBpc1xuICogYHN1c3BlbmRlZGAsIHRoZSBWTSBpcyBrZXB0IGFsaXZlIHNvIHRoZSBjYWxsZXIgY2FuIGZlZWQgbmV3bHkgcmVjb3JkZWRcbiAqIGV2ZW50cyAoZS5nLiB0ZXJtaW5hbCBldmVudHMgb2YgaW5saW5lLWV4ZWN1dGVkIHN0ZXBzKSBpbnRvIHRoZSBTQU1FIFZNXG4gKiB2aWEgYGNvbnRpbnVlV2l0aEV2ZW50c2AsIHJlc3VtaW5nIGV4ZWN1dGlvbiBleGFjdGx5IHdoZXJlIGl0IGxlZnQgb2ZmXG4gKiB3aXRob3V0IGEgZnJlc2gtVk0gcmUtcmVwbGF5LiBUZXJtaW5hbCByZXN1bHRzIGRpc3Bvc2UgdGhlIFZNXG4gKiBhdXRvbWF0aWNhbGx5OyBgZGlzcG9zZSgpYCBtdXN0IGJlIGNhbGxlZCB3aGVuIGFiYW5kb25pbmcgYSBzdXNwZW5kZWRcbiAqIHNlc3Npb24gKGlkZW1wb3RlbnQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1aWNrSlNXb3JrZmxvd1Nlc3Npb24ge1xuICByZXN1bHQ6IFF1aWNrSlNSdW50aW1lUmVzdWx0O1xuICAvKipcbiAgICogUHJvY2VzcyBuZXdseSByZWNvcmRlZCBldmVudHMgaW4gdGhlIGxpdmUgVk0gYW5kIHJlLWV2YWx1YXRlIHRoZVxuICAgKiB3b3JrZmxvdyBzdGF0ZS4gT25seSB2YWxpZCB3aGlsZSB0aGUgbGFzdCByZXN1bHQgd2FzIGBzdXNwZW5kZWRgLlxuICAgKiBSZXNldHMgdGhlIFZNJ3MgaW50ZXJydXB0IGJ1ZGdldCBmb3IgdGhlIG5ldyBleGVjdXRpb24gYnVyc3QuXG4gICAqL1xuICBjb250aW51ZVdpdGhFdmVudHMobmV3RXZlbnRzOiBFdmVudFtdKTogUHJvbWlzZTxRdWlja0pTUnVudGltZVJlc3VsdD47XG4gIC8qKiBEaXNwb3NlIHRoZSBWTSBpZiBpdCBpcyBzdGlsbCBhbGl2ZS4gU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzLiAqL1xuICBkaXNwb3NlKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogUnVuIGEgd29ya2Zsb3cgaW52b2NhdGlvbiB0byBpdHMgZmlyc3Qgc2V0dGxlZCBzdGF0ZSBhbmQgZGlzcG9zZSB0aGVcbiAqIFZNLiBDb252ZW5pZW5jZSB3cmFwcGVyIG92ZXIge0BsaW5rIHN0YXJ0UXVpY2tKU1dvcmtmbG93fSBmb3IgY2FsbGVyc1xuICogKGFuZCB0ZXN0cykgdGhhdCBkb24ndCB1c2UgbGl2ZS1WTSBjb250aW51YXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5RdWlja0pTV29ya2Zsb3coXG4gIG9wdGlvbnM6IFF1aWNrSlNSdW50aW1lT3B0aW9uc1xuKTogUHJvbWlzZTxRdWlja0pTUnVudGltZVJlc3VsdD4ge1xuICBjb25zdCBzZXNzaW9uID0gYXdhaXQgc3RhcnRRdWlja0pTV29ya2Zsb3cob3B0aW9ucyk7XG4gIHNlc3Npb24uZGlzcG9zZSgpO1xuICByZXR1cm4gc2Vzc2lvbi5yZXN1bHQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydFF1aWNrSlNXb3JrZmxvdyhcbiAgb3B0aW9uczogUXVpY2tKU1J1bnRpbWVPcHRpb25zXG4pOiBQcm9taXNlPFF1aWNrSlNXb3JrZmxvd1Nlc3Npb24+IHtcbiAgY29uc3QgeyB3b3JrZmxvd0NvZGUsIHdvcmtmbG93SWQsIHdvcmtmbG93UnVuLCBldmVudHMgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3Qgc3RhcnRlZEF0ID0gd29ya2Zsb3dSdW4uc3RhcnRlZEF0ID8gK3dvcmtmbG93UnVuLnN0YXJ0ZWRBdCA6IERhdGUubm93KCk7XG5cbiAgLy8gRGV0ZXJtaW5pc3RpYyBQUk5HIHNlZWQsIGlkZW50aWNhbCBmb3IgRVZFUlkgaW52b2NhdGlvbiBvZiB0aGUgc2FtZVxuICAvLyBydW4uIEZ1bGwgZXZlbnQgcmVwbGF5IHJlcXVpcmVzIHRoaXM6IGVhY2ggaW52b2NhdGlvbiByZS1leGVjdXRlcyB0aGVcbiAgLy8gd29ya2Zsb3cgZnJvbSB0aGUgdG9wIGFuZCBtdXN0IHJlZ2VuZXJhdGUgdGhlIGV4YWN0IHNhbWUgY29ycmVsYXRpb25JZFxuICAvLyBzZXF1ZW5jZSBzbyB0aGF0IHBlbmRpbmcgb3BlcmF0aW9ucyByZS1jcmVhdGVkIGJ5IHJlcGxheSBtYXRjaCB0aGVcbiAgLy8gZXZlbnRzIHJlY29yZGVkIGJ5IGVhcmxpZXIgaW52b2NhdGlvbnMuIFNlcXVlbnRpYWwgb3BlcmF0aW9ucyB3aXRoaW5cbiAgLy8gb25lIGV4ZWN1dGlvbiBzdGlsbCBnZXQgZGlzdGluY3QgaWRzIGJlY2F1c2UgdGhlIFBSTkcgYWR2YW5jZXMgYXMgdGhlXG4gIC8vIHdvcmtmbG93IGRyYXdzIGZyb20gaXQuIElkZW50aWNhbCBzZWVkaW5nIGFjcm9zcyBDT05DVVJSRU5UIGludm9jYXRpb25zXG4gIC8vIG9mIHRoZSBzYW1lIHJ1biBpcyBhbHNvIGxvYWQtYmVhcmluZzogYm90aCBwcm9kdWNlIHRoZSBzYW1lIGlkcywgYW5kXG4gIC8vIHRoZSB3b3JsZCdzIHBlci0ocnVuSWQsIGNvcnJlbGF0aW9uSWQpIHVuaXF1ZW5lc3MgdHVybnMgdGhlIGR1cGxpY2F0ZVxuICAvLyBgZXZlbnRzLmNyZWF0ZWAgaW50byBhbiBFbnRpdHlDb25mbGljdEVycm9yIHRoYXQgdGhlIGVudHJ5cG9pbnRcbiAgLy8gc3dhbGxvd3MuXG4gIC8vXG4gIC8vIFRoZSBzZWVkIGlucHV0cyBNVVNUIGJlIHN0YWJsZSBhY3Jvc3MgaW52b2NhdGlvbnMuIE5vdGFibHlcbiAgLy8gYHN0YXJ0ZWRBdGAgaXMgTk9UOiB1bmRlciB0dXJibyB0aGUgZmlyc3QgaW52b2NhdGlvbiBydW5zIGFnYWluc3QgYVxuICAvLyBzeW50aGVzaXplZCBydW4gb2JqZWN0IHdob3NlIHRpbWVzdGFtcHMgZGlmZmVyIGZyb20gdGhlIGR1cmFibHlcbiAgLy8gc3RvcmVkIG9uZXMgdGhhdCBsYXRlciBpbnZvY2F0aW9ucyBsb2FkLiBNYXRjaGVzIHRoZSBub2RlOnZtXG4gIC8vIGVuZ2luZSdzIHNlZWQgKHdvcmtmbG93LnRzKS5cbiAgY29uc3Qgc2VlZCA9IFtcbiAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICB3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsXG4gICAgd29ya2Zsb3dSdW4uZGVwbG95bWVudElkLFxuICBdLmpvaW4oJzonKTtcbiAgY29uc3Qgcm5nID0gc2VlZHJhbmRvbShzZWVkKTtcblxuICAvLyBTZWVkZWQgbmFub2lkIGdlbmVyYXRvcjogdXNlcyB0aGUgc2FtZSBuYW5vaWQgcGFja2FnZSBhbmQgc2VlZGVkIFBSTkdcbiAgLy8gYXMgdGhlIG5vZGU6dm0gZW5naW5lIGZvciBjb25zaXN0ZW50IHRva2VuIGdlbmVyYXRpb24uXG4gIGNvbnN0IGdlbmVyYXRlTmFub2lkID0gbmFub2lkLmN1c3RvbVJhbmRvbShuYW5vaWQudXJsQWxwaGFiZXQsIDIxLCAoc2l6ZSkgPT5cbiAgICBuZXcgVWludDhBcnJheShzaXplKS5tYXAoKCkgPT4gMjU2ICogcm5nKCkpXG4gICk7XG5cbiAgLy8gRGV0ZXJtaW5pc3RpYyByZXBsYXkgY2xvY2ssIG1pcnJvcmluZyB0aGUgbm9kZTp2bSBlbmdpbmUgKHNlZVxuICAvLyB3b3JrZmxvdy50cyk6IHRoZSBpbml0aWFsIHZhbHVlIGlzIHRoZSBydW4ncyBjcmVhdGlvbiB0aW1lIHJlY292ZXJlZFxuICAvLyBmcm9tIHRoZSBVTElEIGVtYmVkZGVkIGluIGBydW5JZGAgKGZhbGxpbmcgYmFjayB0byBgY3JlYXRlZEF0YCksIGFuZFxuICAvLyBpdCBhZHZhbmNlcyB0byBlYWNoIHByb2Nlc3NlZCBldmVudCdzIGBjcmVhdGVkQXRgIGFzIHRoZSBldmVudCBsb2cgaXNcbiAgLy8gcmVwbGF5ZWQuIE1vbm90b25pYyAoTWF0aC5tYXgpIHNvIHRoZSBvdXRlciBwcm9jZXNzRXZlbnRzIHJlLXNjYW5cbiAgLy8gbG9vcCBjYW4ndCBtb3ZlIHRoZSBjbG9jayBiYWNrd2FyZHMgbWlkLWV4ZWN1dGlvbi5cbiAgbGV0IHZtTm93TXMgPVxuICAgIHJ1bklkQ3JlYXRlZEF0KHdvcmtmbG93UnVuLnJ1bklkKSA/PyAoK3dvcmtmbG93UnVuLmNyZWF0ZWRBdCB8fCBzdGFydGVkQXQpO1xuICBjb25zdCBhZHZhbmNlQ2xvY2sgPSAobXM6IG51bWJlcikgPT4ge1xuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUobXMpKSB2bU5vd01zID0gTWF0aC5tYXgodm1Ob3dNcywgbXMpO1xuICB9O1xuXG4gIC8vIC0tLS0gUGhhc2UgMTogc3RhdGljIGluaXRpYWxpemF0aW9uIC0tLS1cbiAgLy9cbiAgLy8gQmFzZWxpbmUtc25hcHNob3QgZmFzdCBwYXRoIChkZWZhdWx0IE9OOyBzZWUgdGhlIHNlY3Rpb24gY29tbWVudCBhdFxuICAvLyBwcmVwYXJlQmFzZWxpbmVTbmFwc2hvdCk6IHJlc3RvcmUgYSBidW5kbGUtaHlkcmF0ZWQgVk0gaW5zdGVhZCBvZlxuICAvLyBib290aW5nIGZyZXNoIGFuZCByZS1ldmFsdWF0aW5nIHRoZSBidW5kbGUuIGBpbmVsaWdpYmxlYCBidW5kbGVzXG4gIC8vIChtb2R1bGUtc2NvcGUgbm9uZGV0ZXJtaW5pc20sIGV2YWwgZmFpbHVyZSkgdGFrZSB0aGUgZnJlc2ggcGF0aCB3aXRoXG4gIC8vIGlkZW50aWNhbCBzZW1hbnRpY3MuXG4gIGNvbnN0IGludGVycnVwdEJ1ZGdldDogSW50ZXJydXB0QnVkZ2V0ID0geyBzdGFydDogRGF0ZS5ub3coKSB9O1xuICBsZXQgYmFzZWxpbmVTbmFwc2hvdDogU25hcHNob3QgfCB1bmRlZmluZWQ7XG4gIGxldCBiYXNlbGluZVNlcmRlUm9vdFB0cjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAoaXNRdWlja0pTQmFzZWxpbmVTbmFwc2hvdEVuYWJsZWQoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGF3YWl0IGdldEJhc2VsaW5lRW50cnkod29ya2Zsb3dDb2RlLCB3b3JrZmxvd0lkKTtcbiAgICAgIGlmIChlbnRyeS5zdGF0ZSA9PT0gJ3JlYWR5Jykge1xuICAgICAgICBiYXNlbGluZVNuYXBzaG90ID0gZW50cnkuc25hcHNob3Q7XG4gICAgICAgIGJhc2VsaW5lU2VyZGVSb290UHRyID0gZW50cnkuc2VyZGVSb290UHRyO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gQSByZWplY3Rpb24gaGVyZSBpcyBhbiBpbmZyYXN0cnVjdHVyZSBmYWlsdXJlIGR1cmluZyBoeWRyYXRlXG4gICAgICAvLyAoZS5nLiB2bS5zbmFwc2hvdCgpIHVuZGVyIG1lbW9yeSBwcmVzc3VyZSwgUXVpY2tKUy5jcmVhdGUgb3JcbiAgICAgIC8vIGdldENvbXBpbGVkQXNzZXRzKCkgZmFpbGluZyksIE5PVCBidW5kbGUgZXZhbCwgd2hpY2ggcmV0dXJuc1xuICAgICAgLy8gYW4gaW5lbGlnaWJsZSBlbnRyeS4gZ2V0QmFzZWxpbmVFbnRyeSBoYXMgYWxyZWFkeSBldmljdGVkIHRoZVxuICAgICAgLy8gY2FjaGVkIHByb21pc2Ugc28gYSBsYXRlciBpbnZvY2F0aW9uIGNhbiByZXRyeS4gVGhpcyBpbnZvY2F0aW9uXG4gICAgICAvLyBtdXN0IGZhbGwgYmFjayB0byBmcmVzaCBldmFsdWF0aW9uICh3aGljaCB3b3VsZCBoYXZlIHN1Y2NlZWRlZClcbiAgICAgIC8vIHJhdGhlciB0aGFuIGZhaWwgdGhlIHdob2xlIHJ1biBmb3IgYSBzbmFwc2hvdC1vbmx5IGZhaWx1cmUgbW9kZS5cbiAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgJ1F1aWNrSlMgYmFzZWxpbmUgc25hcHNob3QgaHlkcmF0ZSBmYWlsZWQ7IGZhbGxpbmcgYmFjayB0byBmcmVzaCBldmFsdWF0aW9uIGZvciB0aGlzIGludm9jYXRpb24nLFxuICAgICAgICB7IHdvcmtmbG93SWQsIGVycm9yOiBlcnIgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgbGV0IHZtOiBRdWlja0pTO1xuICBpZiAoYmFzZWxpbmVTbmFwc2hvdCkge1xuICAgIGNvbnN0IGFzc2V0cyA9IGF3YWl0IGdldENvbXBpbGVkQXNzZXRzKCk7XG4gICAgdm0gPSBhd2FpdCBRdWlja0pTLnJlc3RvcmUoYmFzZWxpbmVTbmFwc2hvdCwge1xuICAgICAgd2FzbTogYXNzZXRzLndhc20gYXMgbmV2ZXIsXG4gICAgICBtZW1vcnlMaW1pdDogMjU2ICogMTAyNCAqIDEwMjQsXG4gICAgICBpbnRlcnJ1cHRIYW5kbGVyOiBjcmVhdGVJbnRlcnJ1cHRIYW5kbGVyKGludGVycnVwdEJ1ZGdldCksXG4gICAgICBleHRlbnNpb25zOiBhc3NldHMuZXh0ZW5zaW9ucyxcbiAgICAgIHdhc2k6IG1ha2VEZXRlcm1pbmlzdGljQ2xvY2tXYXNpKCgpID0+IHZtTm93TXMpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHZtID0gYXdhaXQgaW5pdFdvcmtmbG93Vk0oKCkgPT4gdm1Ob3dNcywgaW50ZXJydXB0QnVkZ2V0KTtcbiAgfVxuXG4gIC8vIEhvc3Qtc2lkZSBzZXJkZTogY2FwdHVyZXMgdGhlIFZNJ3MgaW50cmluc2ljcyAoYm9vdHN0cmFwIGluY2x1ZGVkKVxuICAvLyBiZWZvcmUgYW55IHVzZXIgY29kZSBydW5zLiBBbGwgc2VyaWFsaXphdGlvbiBub3cgaGFwcGVucyBvbiB0aGUgaG9zdFxuICAvLyB0aHJvdWdoIGhhbmRsZXM6IG5vIHNlcmlhbGl6ZXIgY29kZSBpcyBldmFsdWF0ZWQgaW5zaWRlIHRoZSBWTS5cbiAgLy8gRnJlc2ggcGF0aDogY2FwdHVyZSBub3cgKG5vIHVzZXIgY29kZSBoYXMgcnVuLCBhcyB0aGUgYnVuZGxlIGV2YWx1YXRlc1xuICAvLyBsYXRlciBpbiB0aGUgcGVyLXJ1biBwaGFzZSkuIFNuYXBzaG90IHBhdGg6IHJlLWFkb3B0IHRoZSBjYXB0dXJlIHJvb3RcbiAgLy8gdGhlIGJhc2VsaW5lIGh5ZHJhdGUgY3JlYXRlZCBCRUZPUkUgdGhlIGJ1bmRsZSBldmFsdWF0ZWQsIHNpbmNlIHRoZSBib3hcbiAgLy8gbGl2ZXMgaW4gdGhlIHJlc3RvcmVkIG1lbW9yeSBpbWFnZSBhdCB0aGUgcmVjb3JkZWQgb2Zmc2V0LiBCb3RoIGdpdmVcbiAgLy8gdGhlIHNlcmRlIHByaXN0aW5lIGNhcHR1cmUtYmVmb3JlLXVzZXItY29kZSBpbnRyaW5zaWNzOyBuZWl0aGVyXG4gIC8vIGV4ZWN1dGVzIGd1ZXN0IGNvZGUgaGVyZS5cbiAgY29uc3Qgc2VyZGUgPVxuICAgIGJhc2VsaW5lU25hcHNob3QgJiYgYmFzZWxpbmVTZXJkZVJvb3RQdHIgIT09IHVuZGVmaW5lZFxuICAgICAgPyBjcmVhdGVRdWlja0pTU2VyZGUodm0sIGFkb3B0U2VyZGVSb290KHZtLCBiYXNlbGluZVNlcmRlUm9vdFB0cikpXG4gICAgICA6IGNyZWF0ZVF1aWNrSlNTZXJkZSh2bSk7XG5cbiAgLy8gQW55IHRocm93IGJldHdlZW4gaGVyZSBhbmQgdGhlIHRlcm1pbmFsIHBhdGhzICh3aGljaCBkaXNwb3NlIHRoZSBWTVxuICAvLyBpbnNpZGUgY2hlY2tXb3JrZmxvd1N0YXRlIC8gZXh0cmFjdEVycm9yIGJlZm9yZSBSRVRVUk5JTkcpIHdvdWxkIGxlYWtcbiAgLy8gYSBsaXZlIFF1aWNrSlMgaW5zdGFuY2UgYW5kIGl0cyBXQVNNIGxpbmVhciBtZW1vcnkgZm9yIHRoZSBsaWZldGltZVxuICAvLyBvZiB0aGUgY29tcHV0ZSBpbnN0YW5jZSwgd2hpY2ggaXMgcmV1c2VkLiBEaXNwb3NlIG9uIHRoZSB3YXkgb3V0IG9mXG4gIC8vIGFuIGV4Y2VwdGlvbmFsIGV4aXQgYW5kIHJldGhyb3cuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJ1bldvcmtmbG93SW5WTSgpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0cnkge1xuICAgICAgdm0uZGlzcG9zZSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQWxyZWFkeSBkaXNwb3NlZCBieSBhIHRlcm1pbmFsIHBhdGgsIHNvIGlnbm9yZS5cbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgLy8gLS0tLSBQaGFzZSAyOiBwZXItcnVuIGluaXRpYWxpemF0aW9uIC0tLS1cbiAgYXN5bmMgZnVuY3Rpb24gcnVuV29ya2Zsb3dJblZNKCk6IFByb21pc2U8UXVpY2tKU1dvcmtmbG93U2Vzc2lvbj4ge1xuICAgIHZtLmV2YWxDb2RlKFxuICAgICAgYGdsb2JhbFRoaXMuX193b3JsZENhcGFiaWxpdGllcyA9ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucy53b3JsZENhcGFiaWxpdGllcyl9O2BcbiAgICApLmRpc3Bvc2UoKTtcblxuICAgIC8vIFNlZWRlZCBNYXRoLnJhbmRvbVxuICAgIHtcbiAgICAgIHVzaW5nIHJhbmRvbUZuID0gdm0ubmV3RnVuY3Rpb24oJ3JhbmRvbScsICgpID0+IHZtLm5ld051bWJlcihybmcoKSkpO1xuICAgICAgdXNpbmcgbWF0aCA9IHZtLmdsb2JhbC5nZXRQcm9wKCdNYXRoJyk7XG4gICAgICBtYXRoLnNldFByb3AoJ3JhbmRvbScsIHJhbmRvbUZuKTtcbiAgICB9XG5cbiAgICAvLyBTZWVkZWQgbmFub2lkIGdlbmVyYXRvclxuICAgIHtcbiAgICAgIHVzaW5nIG5hbm9pZEZuID0gdm0ubmV3RnVuY3Rpb24oJ19fZ2VuZXJhdGVOYW5vaWQnLCAoKSA9PlxuICAgICAgICB2bS5uZXdTdHJpbmcoZ2VuZXJhdGVOYW5vaWQoKSlcbiAgICAgICk7XG4gICAgICB2bS5zZXRQcm9wKHZtLmdsb2JhbCwgJ19fZ2VuZXJhdGVOYW5vaWQnLCBuYW5vaWRGbik7XG4gICAgfVxuXG4gICAgLy8gSG9zdC1zaWRlIGRldGVybWluaXN0aWMgVUxJRCBnZW5lcmF0b3IgZm9yIGNvcnJlbGF0aW9uSWRzLiBVc2VzIHRoZVxuICAgIC8vIHNhbWUgYHVsaWRgIHBhY2thZ2UgYW5kIG1vbm90b25pYyBmYWN0b3J5IGFzIGJlZm9yZSwgZHJhd2luZyBmcm9tXG4gICAgLy8gdGhlIFNBTUUgc2VlZGVkIFBSTkcgaW5zdGFuY2UgYXMgdGhlIFZNJ3MgTWF0aC5yYW5kb20sIHNvIHRoZVxuICAgIC8vIGludGVybGVhdmVkIGRyYXcgc2VxdWVuY2UgKGFuZCB0aGVyZWZvcmUgZXZlcnkgY29ycmVsYXRpb25JZCkgaXNcbiAgICAvLyBieXRlLWlkZW50aWNhbCB0byB3aGF0IHRoZSBwcmV2aW91cyBpbi1WTSBVTElEIGZhY3RvcnkgcHJvZHVjZWQgZm9yXG4gICAgLy8gdGhlIHNhbWUgcnVuLiBUaGUgdGltZSBwcmVmaXggaXMgZGVyaXZlZCBmcm9tIHRoZSBydW5JZCdzIGVtYmVkZGVkXG4gICAgLy8gVUxJRCAoc3RhYmxlIGFjcm9zcyBpbnZvY2F0aW9ucyBieSBjb25zdHJ1Y3Rpb24sIHVubGlrZVxuICAgIC8vIGBzdGFydGVkQXRgLCB3aGljaCBkaWZmZXJzIGJldHdlZW4gdHVyYm8ncyBzeW50aGVzaXplZCBydW4gb2JqZWN0XG4gICAgLy8gYW5kIHRoZSBkdXJhYmx5IHN0b3JlZCBydW4pLCBzbyB0d28gY29uY3VycmVudCBpbnZvY2F0aW9ucyBvZiB0aGVcbiAgICAvLyBzYW1lIHJ1biBwcm9kdWNlIElERU5USUNBTCBjb3JyZWxhdGlvbklkcyBhbmQgdGhlIHdvcmxkJ3NcbiAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yIG9uIGBldmVudHMuY3JlYXRlYCBkZWR1cHMgb25lIG9mIGVhY2ggcGFpci5cbiAgICB7XG4gICAgICBjb25zdCB1bGlkRmFjdG9yeSA9IG1vbm90b25pY0ZhY3RvcnkoKCkgPT4gcm5nKCkpO1xuICAgICAgY29uc3QgdWxpZFRpbWVzdGFtcCA9XG4gICAgICAgIHJ1bklkQ3JlYXRlZEF0KHdvcmtmbG93UnVuLnJ1bklkKSA/P1xuICAgICAgICAoK3dvcmtmbG93UnVuLmNyZWF0ZWRBdCB8fCBzdGFydGVkQXQpO1xuICAgICAgdXNpbmcgdWxpZEZuID0gdm0ubmV3RnVuY3Rpb24oJ19fZ2VuZXJhdGVVbGlkJywgKCkgPT5cbiAgICAgICAgdm0ubmV3U3RyaW5nKHVsaWRGYWN0b3J5KHVsaWRUaW1lc3RhbXApKVxuICAgICAgKTtcbiAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX19nZW5lcmF0ZVVsaWQnLCB1bGlkRm4pO1xuICAgIH1cblxuICAgIC8vIGBwcm9jZXNzLmVudmA6IHBhcml0eSB3aXRoIHRoZSBub2RlOnZtIGVuZ2luZSwgd2hpY2ggZXhwb3NlcyBhIGZyb3plblxuICAgIC8vIGNvcHkgb2YgdGhlIGhvc3QgZW52ICh2bS9pbmRleC50cykuIEluamVjdGVkIHBlciBydW4gc28gdGhlIHNuYXBzaG90IG9mXG4gICAgLy8gdGhlIGVudiBpcyB0YWtlbiBhdCBpbnZvY2F0aW9uIHRpbWUsIHNhbWUgYXMgbm9kZS4gSGFuZGxlLWJhc2VkIChub1xuICAgIC8vIGd1ZXN0IHNvdXJjZSBldmFsdWF0ZWQpOiBvbiB0aGUgYmFzZWxpbmUtc25hcHNob3QgcGF0aCB0aGlzIHJ1bnNcbiAgICAvLyBhZnRlciB1c2VyIGNvZGUsIGFuZCBhIGd1ZXN0LXNvdXJjZSBpbmplY3Rpb24gd291bGQgZXhlY3V0ZSB0aHJvdWdoXG4gICAgLy8gcG90ZW50aWFsbHkgcGF0Y2hlZCBnbG9iYWxzIChKU09OLnBhcnNlLCBPYmplY3QuZnJlZXplKSwgdmlzaWJsZVxuICAgIC8vIHRvIG1vZHVsZS1zY29wZSB3cmFwcGVycyBvbmx5IG9uIHRoZSByZXN0b3JlIHBhdGgsIGRpdmVyZ2luZ1xuICAgIC8vIHJlcGxheXMuXG4gICAgc2VyZGUuaW5zdGFsbFByb2Nlc3NFbnYocHJvY2Vzcy5lbnYpO1xuXG4gICAgLy8gRXhlY3V0ZSB0aGUgd29ya2Zsb3cgYnVuZGxlOiB1c2UgdGhlIHdvcmtmbG93SWQgYXMgdGhlIGV2YWwgZmlsZW5hbWVcbiAgICAvLyBzbyBRdWlja0pTIHN0YWNrIHRyYWNlcyByZWZlcmVuY2UgdGhlIHdvcmtmbG93IG5hbWUsIGVuYWJsaW5nIHNvdXJjZSBtYXBcbiAgICAvLyByZW1hcHBpbmcgYnkgcmVtYXBFcnJvclN0YWNrICh3aGljaCBtYXRjaGVzIGZyYW1lcyBieSBmaWxlbmFtZSkuXG4gICAgLy8gRXZhbHVhdGVkIGluIHRoZSBwZXItcnVuIHBoYXNlIChhZnRlciBNYXRoLnJhbmRvbSBzZWVkaW5nKSBzbyB0aGF0XG4gICAgLy8gbW9kdWxlLXNjb3BlIHVzZXIgY29kZSBkcmF3cyBmcm9tIHRoZSBzZWVkZWQgUFJORywgbWF0Y2hpbmcgdGhlXG4gICAgLy8gbm9kZTp2bSBlbmdpbmUncyByZXBsYXkgZGV0ZXJtaW5pc20uIFNraXBwZWQgb24gdGhlXG4gICAgLy8gYmFzZWxpbmUtc25hcHNob3QgcGF0aDogdGhlIHJlc3RvcmVkIGhlYXAgYWxyZWFkeSBjYXJyaWVzIHRoZVxuICAgIC8vIGV2YWx1YXRlZCBidW5kbGUsIGFuZCB0aGUgYmFzZWxpbmUgZ2F0ZSBndWFyYW50ZWVzIG1vZHVsZSBzY29wZVxuICAgIC8vIGNvbnN1bWVkIG5vIFBSTkcgZHJhd3Mgb3IgY2xvY2sgcmVhZHMsIHNvIHNraXBwaW5nIHRoZSBldmFsIGlzXG4gICAgLy8gb2JzZXJ2YXRpb25hbGx5IGlkZW50aWNhbCB0byByZS1ydW5uaW5nIGl0ICh0aGUgcnVuLXNlZWRlZCBob3N0XG4gICAgLy8gZm5zIHJlZ2lzdGVyZWQgYWJvdmUgcmViaW5kIHRoZSBTQU1FIG5hbWVzIHRoZSByZXN0b3JlZCBoZWFwJ3NcbiAgICAvLyBmdW5jdGlvbiBvYmplY3RzIGRpc3BhdGNoIHRocm91Z2gpLlxuICAgIGlmICghYmFzZWxpbmVTbmFwc2hvdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdm0uZXZhbENvZGUod29ya2Zsb3dDb2RlLCB3b3JrZmxvd0lkIHx8ICd3b3JrZmxvdy5qcycpLmRpc3Bvc2UoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gbWFrZVNldHRsZWRTZXNzaW9uKFxuICAgICAgICAgIGV4dHJhY3RFcnJvcih2bSwgZXJyLCAnV29ya2Zsb3cgZXZhbHVhdGlvbiBmYWlsZWQnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV4dHJhY3Qgd29ya2Zsb3cgYXJndW1lbnRzLiBQcmVmZXIgdGhlIHJ1bl9jcmVhdGVkIGV2ZW50OyBmYWxsIGJhY2tcbiAgICAvLyB0byB0aGUgcXVldWUgbWVzc2FnZSdzIHJ1bklucHV0IGlmIHRoZSBldmVudCBsb2cgaXMgaW5jb21wbGV0ZVxuICAgIC8vIChldmVudHVhbGx5LWNvbnNpc3RlbnQgcmVhZCBhZnRlciBzdGFydCgpKS4gRmFpbGluZyB0byBmaW5kIGlucHV0XG4gICAgLy8gZm9yIGEgZmlyc3QgaW52b2NhdGlvbiBpcyBmYXRhbDogcnVubmluZyB0aGUgd29ya2Zsb3cgZnVuY3Rpb25cbiAgICAvLyB3aXRoIG5vIGFyZ3Mgd291bGQgc2lsZW50bHkgdHVybiB0eXBlZCBhcmd1bWVudHMgaW50byBgdW5kZWZpbmVkYFxuICAgIC8vIGFuZCwgZm9yIHJlY3Vyc2l2ZSB3b3JrZmxvd3MsIHByb2R1Y2UgZXhwb25lbnRpYWwgZmFuLW91dC5cbiAgICBjb25zdCBydW5DcmVhdGVkRXZlbnQgPSBldmVudHMuZmluZCgoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcpO1xuICAgIGNvbnN0IHJ1bkNyZWF0ZWRJbnB1dCA9XG4gICAgICBydW5DcmVhdGVkRXZlbnQgJiYgJ2V2ZW50RGF0YScgaW4gcnVuQ3JlYXRlZEV2ZW50XG4gICAgICAgID8gKHJ1bkNyZWF0ZWRFdmVudC5ldmVudERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5pbnB1dFxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBydW5JbnB1dDogdW5rbm93biA9XG4gICAgICBydW5DcmVhdGVkSW5wdXQgPz8gKG9wdGlvbnMucnVuSW5wdXQ/LmlucHV0IGFzIHVua25vd24pO1xuXG4gICAgaWYgKHJ1bklucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgY29uc3QgZGVjcnlwdGVkSW5wdXQgPSBhd2FpdCBwcmVwYXJlQnl0ZXNGb3JWTShcbiAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgIG9wdGlvbnMuZW5jcnlwdGlvbktleVxuICAgICAgKTtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgcnVudGltZTogcnVuIGlucHV0IGZvcm1hdCcsIHtcbiAgICAgICAgcHJlZml4OiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZGVjcnlwdGVkSW5wdXQuc3ViYXJyYXkoMCwgNCkpLFxuICAgICAgICBieXRlTGVuZ3RoOiBkZWNyeXB0ZWRJbnB1dC5ieXRlTGVuZ3RoLFxuICAgICAgICBzb3VyY2U6IHJ1bkNyZWF0ZWRJbnB1dCA/ICdydW5fY3JlYXRlZCcgOiAncXVldWVNZXNzYWdlLnJ1bklucHV0JyxcbiAgICAgIH0pO1xuICAgICAgLy8gQnVpbGQgdGhlIGFyZ3VtZW50IHZhbHVlIGRpcmVjdGx5IGluIHRoZSBWTSB2aWEgdGhlIGhvc3Qtc2lkZVxuICAgICAgLy8gc2VyZGUgKGd1ZXN0IGNvZGUgbmV2ZXIgc2VlcyB0aGUgd2lyZSBieXRlcykuXG4gICAgICBjb25zdCBpbnB1dEhhbmRsZSA9IHNlcmRlLmRlc2VyaWFsaXplKGRlY3J5cHRlZElucHV0KTtcbiAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX193ZGtfaW5wdXQnLCBpbnB1dEhhbmRsZSk7XG4gICAgICBpbnB1dEhhbmRsZS5kaXNwb3NlKCk7XG4gICAgfSBlbHNlIGlmIChydW5JbnB1dCA9PT0gdW5kZWZpbmVkICYmIGV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgZXZlbnQgbG9nIGlzIG5vbi1lbXB0eSAod2UgZ290IHJ1bl9zdGFydGVkIG9yIHNpbWlsYXIpIGJ1dFxuICAgICAgLy8gbm8gcnVuX2NyZWF0ZWQgZXZlbnQgd2FzIGZvdW5kIGFuZCBubyBxdWV1ZS1wcm92aWRlZCBydW5JbnB1dCBpc1xuICAgICAgLy8gYXZhaWxhYmxlLiBUaGlzIGlzIHRoZSByYWNlIGNvbmRpdGlvbiBvYnNlcnZlZCBkdXJpbmcgdGhlIGZpYlxuICAgICAgLy8gaW5jaWRlbnQ6IHNpbGVudGx5IGRyb3BwaW5nIGFyZ3VtZW50cyB3b3VsZCB0dXJuIGBuYCBpbnRvXG4gICAgICAvLyBgdW5kZWZpbmVkYCBhbmQsIGZvciByZWN1cnNpdmUgd29ya2Zsb3dzLCBjYXVzZSBleHBvbmVudGlhbFxuICAgICAgLy8gZmFuLW91dC4gRmFpbCBsb3VkOiB0aGUgdGhyb3cgZXNjYXBlcyB0aGUgZW50cnlwb2ludCBpbnRvIHRoZVxuICAgICAgLy8gcmVwbGF5IGxvb3AncyBjYXRjaCBpbiBydW50aW1lLnRzICh0aGUgUXVpY2tKUyBkaXNwYXRjaCBydW5zXG4gICAgICAvLyBpbnNpZGUgdGhhdCBsb29wJ3MgdHJ5KSwgd2hpY2ggcmVjb3JkcyBydW5fZmFpbGVkLiBBIHZpc2libGVcbiAgICAgIC8vIHRlcm1pbmFsIGZhaWx1cmUgaXNcbiAgICAgIC8vIHByZWZlcnJlZCBvdmVyIHNpbGVudGx5IGV4ZWN1dGluZyB3aXRoIHVuZGVmaW5lZCBhcmd1bWVudHMuIFRoZVxuICAgICAgLy8gcXVldWUtcHJvdmlkZWQgcnVuSW5wdXQgZmFsbGJhY2sgYWJvdmUgbWFrZXMgdGhpcyBwYXRoIHJhcmUuXG4gICAgICAvLyBFbXB0eSBgZXZlbnRzYCBpcyBhbGxvd2VkIGJlY2F1c2UgdGVzdHMgdGhhdCBib290c3RyYXAgYSB3b3JrZmxvd1xuICAgICAgLy8gd2l0aCBubyBhcmd1bWVudHMgcmVseSBvbiB0aGUgb2xkIHBlcm1pc3NpdmUgYmVoYXZpb3IuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3Qgc3RhcnQgd29ya2Zsb3cgcnVuIFwiJHt3b3JrZmxvd1J1bi5ydW5JZH1cIjogbm8gcnVuX2NyZWF0ZWQgZXZlbnQgZm91bmQgYW5kIG5vIHJ1bklucHV0IGluIHRoZSBxdWV1ZSBwYXlsb2FkLCBidXQgb3RoZXIgZXZlbnRzIGFyZSBwcmVzZW50IChsaWtlbHkgYSByZWFkLWFmdGVyLXdyaXRlIHJhY2UgZHVyaW5nIHN0YXJ0KCkpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHdvcmtmbG93IGNvbnRleHQgbWV0YWRhdGEgKGZvciBnZXRXb3JrZmxvd01ldGFkYXRhKCkpLlxuICAgIC8vIE11c3QgbWF0Y2ggdGhlIHNoYXBlIHRoYXQgdGhlIG5vZGU6dm0gZW5naW5lIHByb2R1Y2VzIChzZWVcbiAgICAvLyBwYWNrYWdlcy9jb3JlL3NyYy93b3JrZmxvdy50czogcnVuV29ya2Zsb3cg4oaSIGN0eCkgc28gdXNlciBjb2RlXG4gICAgLy8gdGhhdCBjb21wYXJlcyBgZ2V0V29ya2Zsb3dNZXRhZGF0YSgpYCB2YWx1ZXMgYmV0d2VlbiBhIHN0ZXBcbiAgICAvLyAoc2VydmVyLXNpZGUpIGFuZCB0aGUgd29ya2Zsb3cgKFZNLXNpZGUpIHNlZXMgaWRlbnRpY2FsIG9iamVjdHMuXG4gICAge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICB3b3JrZmxvd1J1bklkOiB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQ6IHdvcmtmbG93UnVuLnN0YXJ0ZWRBdFxuICAgICAgICAgID8gbmV3IERhdGUoK3dvcmtmbG93UnVuLnN0YXJ0ZWRBdClcbiAgICAgICAgICA6IG5ldyBEYXRlKCksXG4gICAgICAgIHVybDogcHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTFxuICAgICAgICAgID8gYGh0dHBzOi8vJHtwcm9jZXNzLmVudi5WRVJDRUxfVVJMfWBcbiAgICAgICAgICA6IGBodHRwOi8vbG9jYWxob3N0OiR7b3B0aW9ucy5wb3J0ID8/IDMwMDB9YCxcbiAgICAgICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFvcHRpb25zLmVuY3J5cHRpb25LZXkgfSxcbiAgICAgIH07XG4gICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgYGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX0NPTlRFWFRcIildID0gJHtKU09OLnN0cmluZ2lmeShtZXRhZGF0YSl9O2AgK1xuICAgICAgICAgIGBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19DT05URVhUXCIpXS53b3JrZmxvd1N0YXJ0ZWRBdCA9IG5ldyBEYXRlKCR7SlNPTi5zdHJpbmdpZnkobWV0YWRhdGEud29ya2Zsb3dTdGFydGVkQXQudG9JU09TdHJpbmcoKSl9KTtgXG4gICAgICApLmRpc3Bvc2UoKTtcbiAgICB9XG5cbiAgICAvLyBTdGFydCB0aGUgd29ya2Zsb3cgZnVuY3Rpb24uIElmIHRoZSB3b3JrZmxvdyBpc24ndCByZWdpc3RlcmVkLFxuICAgIC8vIHRocm93IGFuIGVycm9yIHRhZ2dlZCB3aXRoIGBuYW1lID0gXCJXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvclwiYFxuICAgIC8vIHNvIHRoZSBob3N0LXNpZGUgZW50cnlwb2ludCBjYW4gcmVjb25zdHJ1Y3QgYSByZWFsXG4gICAgLy8gV29ya2Zsb3dOb3RSZWdpc3RlcmVkRXJyb3IgKGEgV29ya2Zsb3dSdW50aW1lRXJyb3Igc3ViY2xhc3MgdGhhdFxuICAgIC8vIGNsYXNzaWZpZXMgYXMgUlVOVElNRV9FUlJPUikgcmF0aGVyIHRoYW4gYSBnZW5lcmljIHVzZXIgZXJyb3IuXG4gICAgLy8gU2VlIHF1aWNranMtZW50cnlwb2ludC50cydzIHJ1bl9mYWlsZWQgYnJhbmNoLlxuICAgIHRyeSB7XG4gICAgICB2bS5ldmFsQ29kZShgXG4gICAgICB2YXIgX193Zm4gPSBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3MuZ2V0KCR7SlNPTi5zdHJpbmdpZnkod29ya2Zsb3dJZCl9KTtcbiAgICAgIGlmICghX193Zm4pIHtcbiAgICAgICAgdmFyIF9fd2ZuRXJyID0gbmV3IEVycm9yKFwiV29ya2Zsb3cgXFxcXFwiXCIgKyAke0pTT04uc3RyaW5naWZ5KHdvcmtmbG93SWQpfSArIFwiXFxcXFwiIGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBjdXJyZW50IGRlcGxveW1lbnQuXCIpO1xuICAgICAgICBfX3dmbkVyci5uYW1lID0gXCJXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvclwiO1xuICAgICAgICB0aHJvdyBfX3dmbkVycjtcbiAgICAgIH1cbiAgICAgIHZhciBfX2FyZ3MgPSBnbG9iYWxUaGlzLl9fd2RrX2lucHV0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBnbG9iYWxUaGlzLl9fd2RrX2lucHV0XG4gICAgICAgIDogW107XG4gICAgICBkZWxldGUgZ2xvYmFsVGhpcy5fX3dka19pbnB1dDtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShfX2FyZ3MpKSBfX2FyZ3MgPSBbX19hcmdzXTtcbiAgICAgIF9fd2ZuLmFwcGx5KG51bGwsIF9fYXJncykudGhlbihcbiAgICAgICAgZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgLy8gU3RvcmUgdGhlIFJBVyByZXN1bHQ7IHRoZSBob3N0IHNlcmlhbGl6ZXMgaXQgdGhyb3VnaCBhIGhhbmRsZS5cbiAgICAgICAgICAvLyBBIHNlcGFyYXRlIGRvbmUgZmxhZyBkaXN0aW5ndWlzaGVzIFwiY29tcGxldGVkIHdpdGggdW5kZWZpbmVkXCJcbiAgICAgICAgICAvLyBmcm9tIFwibm90IGNvbXBsZXRlZFwiLlxuICAgICAgICAgIGdsb2JhbFRoaXMuX193b3JrZmxvd0RvbmUgPSB0cnVlO1xuICAgICAgICAgIGdsb2JhbFRoaXMuX193b3JrZmxvd1Jlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgICAgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAvLyBQcmVzZXJ2ZSBkaXNwbGF5IGluZm8gb24gdGhlIGhvc3Qtc2lkZSBmYWlsZWQgb2JqZWN0XG4gICAgICAgICAgLy8gKG1hdGNoZXMgdGhlIGxlZ2FjeSBob3N0LXZpc2libGUgc2hhcGUpIEFORCBrZWVwIHRoZSBSQVdcbiAgICAgICAgICAvLyB0aHJvd24gdmFsdWUgc28gdGhlIGhvc3QgY2FuIHNlcmlhbGl6ZSB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAvLyB0eXBlLWlkZW50aXR5LCBjYXVzZSBjaGFpbiwgb3Igbm9uLUVycm9yIHRocm93cyB2ZXJiYXRpbVxuICAgICAgICAgIC8vIHRocm91Z2ggdGhlIHN0YW5kYXJkIGVycm9yIHBpcGVsaW5lLlxuICAgICAgICAgIGdsb2JhbFRoaXMuX193b3JrZmxvd0Vycm9yID0ge1xuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3IgJiYgZXJyb3IubWVzc2FnZSAhPSBudWxsID8gU3RyaW5nKGVycm9yLm1lc3NhZ2UpIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgIHN0YWNrOiBlcnJvciAmJiBlcnJvci5zdGFjayA/IGVycm9yLnN0YWNrIDogXCJcIixcbiAgICAgICAgICAgIG5hbWU6IGVycm9yICYmIGVycm9yLm5hbWUgPyBlcnJvci5uYW1lIDogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBcIkVycm9yXCIgOiB0eXBlb2YgZXJyb3IpLFxuICAgICAgICAgICAgdmFsdWU6IGVycm9yLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgYCkuZGlzcG9zZSgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIG1ha2VTZXR0bGVkU2Vzc2lvbihcbiAgICAgICAgZXh0cmFjdEVycm9yKHZtLCBlcnIsICdGYWlsZWQgdG8gc3RhcnQgd29ya2Zsb3cnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGV2ZW50cyBhbmQgZHJhaW4gam9icyBpbiBhIGxvb3AuIEV2ZW50cyBtYXkgcmVzb2x2ZSBwcm9taXNlc1xuICAgIC8vIHRoYXQgdW5ibG9jayB3b3JrZmxvdyBjb2RlLCB3aGljaCB0aGVuIGNyZWF0ZXMgTkVXIHJlc29sdmVycyBmb3JcbiAgICAvLyBzdWJzZXF1ZW50IGV2ZW50cy4gUmUtcHJvY2Vzc2luZyBldmVudHMgbWF0Y2hlcyB0aGVzZSBuZXcgcmVzb2x2ZXJzXG4gICAgLy8gYWdhaW5zdCBldmVudHMgdGhhdCB3ZXJlIGFscmVhZHkgZGVsaXZlcmVkLlxuICAgIHtcbiAgICAgIGxldCBtYXhJdGVyYXRpb25zID0gMTAwO1xuICAgICAgbGV0IG1hZGVQcm9ncmVzczogYm9vbGVhbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbWFkZVByb2dyZXNzID0gYXdhaXQgcHJvY2Vzc0V2ZW50cyhcbiAgICAgICAgICB2bSxcbiAgICAgICAgICBzZXJkZSxcbiAgICAgICAgICBldmVudHMsXG4gICAgICAgICAgYWR2YW5jZUNsb2NrLFxuICAgICAgICAgIG9wdGlvbnMuZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgICBsZXQgYmF0Y2g6IG51bWJlcjtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGJhdGNoID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgaWYgKGJhdGNoID4gMCkgbWFkZVByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgfSB3aGlsZSAoYmF0Y2ggPiAwKTtcbiAgICAgIH0gd2hpbGUgKG1hZGVQcm9ncmVzcyAmJiAtLW1heEl0ZXJhdGlvbnMgPiAwKTtcbiAgICAgIGlmIChtYWRlUHJvZ3Jlc3MgJiYgbWF4SXRlcmF0aW9ucyA9PT0gMCkge1xuICAgICAgICAvLyBUaGUgZHJhaW4gbG9vcCBoaXQgaXRzIGJvdW5kIHdoaWxlIHN0aWxsIG1ha2luZyBwcm9ncmVzczpcbiAgICAgICAgLy8gcHJvY2VlZGluZyBhcyBpZiBpdCBjb252ZXJnZWQgd291bGQgcHJlc2VudCBhcyBhIG15c3RlcmlvdXNcbiAgICAgICAgLy8gc3VzcGVuc2lvbiBvciByZXBsYXkgZGl2ZXJnZW5jZS4gTWFrZSB0aGUgZ2l2aW5nLXVwIHZpc2libGUgc29cbiAgICAgICAgLy8gYSB3ZWRnZSBpcyBhdHRyaWJ1dGFibGUgdG8gdGhpcyBib3VuZCByYXRoZXIgdGhhbiBhIG15c3RlcnkuXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBldmVudCBkcmFpbiBsb29wIGhpdCBpdHMgaXRlcmF0aW9uIGJvdW5kIGJlZm9yZSByZWFjaGluZyBhIGZpeGVkIHBvaW50JyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgICAgIGV2ZW50Q291bnQ6IGV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLS0gQ2hlY2sgcmVzdWx0IC0tLS1cbiAgICByZXR1cm4gbWFrZUxpdmVTZXNzaW9uKFxuICAgICAgdm0sXG4gICAgICBzZXJkZSxcbiAgICAgIGludGVycnVwdEJ1ZGdldCxcbiAgICAgIGFkdmFuY2VDbG9jayxcbiAgICAgIG9wdGlvbnMuZW5jcnlwdGlvbktleVxuICAgICk7XG4gIH1cbn1cblxuLyoqIFNlc3Npb24gd3JhcHBlciBmb3IgYSByZXN1bHQgd2hvc2UgVk0gaXMgYWxyZWFkeSBzZXR0bGVkL2Rpc3Bvc2VkLiAqL1xuZnVuY3Rpb24gbWFrZVNldHRsZWRTZXNzaW9uKFxuICByZXN1bHQ6IFF1aWNrSlNSdW50aW1lUmVzdWx0XG4pOiBRdWlja0pTV29ya2Zsb3dTZXNzaW9uIHtcbiAgcmV0dXJuIHtcbiAgICByZXN1bHQsXG4gICAgY29udGludWVXaXRoRXZlbnRzOiAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdRdWlja0pTIHdvcmtmbG93IHNlc3Npb24gaXMgc2V0dGxlZCDigJQgY29udGludWVXaXRoRXZlbnRzIGlzIG9ubHkgdmFsaWQgd2hpbGUgc3VzcGVuZGVkJ1xuICAgICAgKTtcbiAgICB9LFxuICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICB9O1xufVxuXG4vKipcbiAqIEV2YWx1YXRlIHRoZSBWTSdzIHN0YXRlIGFuZCB3cmFwIGl0IGluIGEgbGl2ZSBzZXNzaW9uLiBXaGlsZSBzdXNwZW5kZWQsXG4gKiB0aGUgVk0gc3RheXMgYWxpdmUgc28gYGNvbnRpbnVlV2l0aEV2ZW50c2AgY2FuIHJlc3VtZSBpdCBpbiBwbGFjZTtcbiAqIHRlcm1pbmFsIHN0YXRlcyBkaXNwb3NlIHRoZSBWTSBpbW1lZGlhdGVseSAoaW5zaWRlIGNoZWNrV29ya2Zsb3dTdGF0ZSkuXG4gKi9cbmZ1bmN0aW9uIG1ha2VMaXZlU2Vzc2lvbihcbiAgdm06IFF1aWNrSlMsXG4gIHNlcmRlOiBRdWlja0pTU2VyZGUsXG4gIGludGVycnVwdEJ1ZGdldDogSW50ZXJydXB0QnVkZ2V0LFxuICBhZHZhbmNlQ2xvY2s6IChtczogbnVtYmVyKSA9PiB2b2lkLFxuICBlbmNyeXB0aW9uS2V5PzogRGVjcnlwdGlvbktleVxuKTogUXVpY2tKU1dvcmtmbG93U2Vzc2lvbiB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrV29ya2Zsb3dTdGF0ZSh2bSwgc2VyZGUsIHsga2VlcEFsaXZlT25TdXNwZW5kOiB0cnVlIH0pO1xuICBsZXQgYWxpdmUgPSAhIXJlc3VsdC5zdXNwZW5kZWQ7XG5cbiAgY29uc3Qgc2Vzc2lvbjogUXVpY2tKU1dvcmtmbG93U2Vzc2lvbiA9IHtcbiAgICByZXN1bHQsXG4gICAgYXN5bmMgY29udGludWVXaXRoRXZlbnRzKFxuICAgICAgbmV3RXZlbnRzOiBFdmVudFtdXG4gICAgKTogUHJvbWlzZTxRdWlja0pTUnVudGltZVJlc3VsdD4ge1xuICAgICAgaWYgKCFhbGl2ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1F1aWNrSlMgd29ya2Zsb3cgc2Vzc2lvbiBpcyBub3QgYWxpdmUg4oCUIGNvbnRpbnVlV2l0aEV2ZW50cyBpcyBvbmx5IHZhbGlkIHdoaWxlIHN1c3BlbmRlZCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIEZyZXNoIGV4ZWN1dGlvbiBidXJzdDogdGhlIGludGVycnVwdCBidWRnZXQgYm91bmRzIFZNIGNvbXB1dGUsXG4gICAgICAvLyBub3Qgd2FsbCB0aW1lIHNwZW50IHdhaXRpbmcgb24gaW5saW5lIHN0ZXBzIGJldHdlZW4gYnVyc3RzLlxuICAgICAgaW50ZXJydXB0QnVkZ2V0LnN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgICAgbGV0IG1heEl0ZXJhdGlvbnMgPSAxMDA7XG4gICAgICBsZXQgbWFkZVByb2dyZXNzOiBib29sZWFuO1xuICAgICAgZG8ge1xuICAgICAgICBtYWRlUHJvZ3Jlc3MgPSBhd2FpdCBwcm9jZXNzRXZlbnRzKFxuICAgICAgICAgIHZtLFxuICAgICAgICAgIHNlcmRlLFxuICAgICAgICAgIG5ld0V2ZW50cyxcbiAgICAgICAgICBhZHZhbmNlQ2xvY2ssXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgICBsZXQgYmF0Y2g6IG51bWJlcjtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGJhdGNoID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgaWYgKGJhdGNoID4gMCkgbWFkZVByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgfSB3aGlsZSAoYmF0Y2ggPiAwKTtcbiAgICAgIH0gd2hpbGUgKG1hZGVQcm9ncmVzcyAmJiAtLW1heEl0ZXJhdGlvbnMgPiAwKTtcblxuICAgICAgY29uc3QgbmV4dCA9IGNoZWNrV29ya2Zsb3dTdGF0ZSh2bSwgc2VyZGUsIHtcbiAgICAgICAga2VlcEFsaXZlT25TdXNwZW5kOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBpZiAoIW5leHQuc3VzcGVuZGVkKSBhbGl2ZSA9IGZhbHNlO1xuICAgICAgc2Vzc2lvbi5yZXN1bHQgPSBuZXh0O1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfSxcbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgaWYgKGFsaXZlKSB7XG4gICAgICAgIGFsaXZlID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdm0uZGlzcG9zZSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBBbHJlYWR5IGRpc3Bvc2VkLCBzbyBpZ25vcmUuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9O1xuICByZXR1cm4gc2Vzc2lvbjtcbn1cblxuLy8gLS0tLSBFdmVudCBQcm9jZXNzaW5nIC0tLS1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0V2ZW50cyhcbiAgdm06IFF1aWNrSlMsXG4gIHNlcmRlOiBRdWlja0pTU2VyZGUsXG4gIGV2ZW50czogRXZlbnRbXSxcbiAgYWR2YW5jZUNsb2NrOiAobXM6IG51bWJlcikgPT4gdm9pZCxcbiAgZW5jcnlwdGlvbktleT86IERlY3J5cHRpb25LZXlcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBsZXQgcmVzb2x2ZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAvLyBBIHNlYWxlZC1sb2cgbm9vcCBvY2N1cGllcyBhIHNsb3Qgd2hvc2Ugd3JpdGVyIGRpZWQ7IHRoZSBydW4gbmV2ZXJcbiAgICAvLyBvYnNlcnZlZCBpdC4gU3RlcCBvdmVyIGl0IEJFRk9SRSB0aGUgY2xvY2sgbGluZSBiZWxvdywgbm90IGF0IHRoZVxuICAgIC8vIHN3aXRjaDogaXRzIGBjcmVhdGVkQXRgIGlzIHRoZSBzZWFsZXIncyB3YWxsIGNsb2NrIGFuZCBjYW4gcG9zdGRhdGVcbiAgICAvLyBldmVyeSByZWFsIGV2ZW50IGFyb3VuZCBpdCwgc28gYWR2YW5jaW5nIHRvIGl0IHdvdWxkIGxlYWsgdGhlIHNlYWxlcidzXG4gICAgLy8gc2NoZWR1bGUgaW50byByZXBsYXkuIEJlY2F1c2UgdGhlIGNsb2NrIGlzIG1vbm90b25pYywgZXZlcnkgbGF0ZXJcbiAgICAvLyBEYXRlLm5vdygpIGluIHRoZSBydW4gd2l0aCBpdC4gVGhhdCB3b3VsZCBtYWtlIGEgbG9nIHdob3NlIGhvbGUgd2FzXG4gICAgLy8gc2VhbGVkIHJlcGxheSBkaWZmZXJlbnRseSBmcm9tIHRoZSBzYW1lIGxvZyB3aG9zZSBob2xlIGl0cyBvd24gd3JpdGVyXG4gICAgLy8gZmlsbGVkLCBhbmQgZGlmZmVyZW50bHkgZnJvbSB0aGlzIGxvZyBvbiB0aGUgbm9kZTp2bSBlbmdpbmUsIHdoaWNoXG4gICAgLy8gc2tpcHMgbm9vcHMgaW4gYEV2ZW50c0NvbnN1bWVyYCBiZWZvcmUgYG9uQ29uc3VtZWRFdmVudGAgZmVlZHMgdGhlXG4gICAgLy8gY2xvY2suIFNhbWUgcnVsZSwgYm90aCBlbmdpbmVzLCBvbmUgcHJlZGljYXRlLlxuICAgIGlmIChpc1NlYWxlZE5vb3BFdmVudChldmVudCkpIGNvbnRpbnVlO1xuXG4gICAgLy8gQWR2YW5jZSB0aGUgVk0ncyBkZXRlcm1pbmlzdGljIGNsb2NrIHRvIHRoaXMgZXZlbnQncyBjcmVhdGlvbiB0aW1lXG4gICAgLy8gQkVGT1JFIHJlc29sdmluZyBhbnl0aGluZywgc28gd29ya2Zsb3cgY29kZSB1bmJsb2NrZWQgYnkgdGhpcyBldmVudFxuICAgIC8vIG9ic2VydmVzIERhdGUubm93KCkgYXQgKG9yIGFmdGVyLCBzaW5jZSB0aGUgY2xvY2sgaXMgbW9ub3RvbmljKSB0aGUgdGltZVxuICAgIC8vIHRoZSBldmVudCB3YXMgcmVjb3JkZWQuIE1pcnJvcnMgdGhlIG5vZGU6dm0gZW5naW5lJ3NcbiAgICAvLyBgb25Db25zdW1lZEV2ZW50IOKGkiB1cGRhdGVUaW1lc3RhbXAoK2V2ZW50LmNyZWF0ZWRBdClgLlxuICAgIGFkdmFuY2VDbG9jaygrZXZlbnQuY3JlYXRlZEF0KTtcblxuICAgIGNvbnN0IGNpZCA9IGV2ZW50LmNvcnJlbGF0aW9uSWQ7XG4gICAgaWYgKCFjaWQpIGNvbnRpbnVlO1xuXG4gICAgLy8gSlNPTi5zdHJpbmdpZnkgaGFuZGxlcyBxdW90ZXMsIGJhY2tzbGFzaGVzIGFuZCBjb250cm9sIGNoYXJhY3RlcnM7XG4gICAgLy8gY29ycmVsYXRpb24gaWRzIGFyZSBob3N0LWdlbmVyYXRlZCBVTElEcyB0b2RheSwgYnV0IHRoZSBldmFsLXN0cmluZ1xuICAgIC8vIHNhZmV0eSBzaG91bGRuJ3QgZGVwZW5kIG9uIHRoYXQgaW52YXJpYW50IGJlaW5nIGFzc2VydGVkIG5vd2hlcmUuXG4gICAgY29uc3QgY2lkSnMgPSBKU09OLnN0cmluZ2lmeShjaWQpO1xuICAgIGNvbnN0IGV2ZW50RGF0YSA9XG4gICAgICAnZXZlbnREYXRhJyBpbiBldmVudFxuICAgICAgICA/IChldmVudC5ldmVudERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gTG9nIHRoZSBldmVudCBhbmQgd2hldGhlciB0aGUgcmVzb2x2ZXIgZXhpc3RzXG4gICAgc3dpdGNoIChldmVudC5ldmVudFR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0ZXBfY29tcGxldGVkJzoge1xuICAgICAgICBjb25zdCBoYXNSZXNvbHZlciA9IHZtLmR1bXAoXG4gICAgICAgICAgdm0uZXZhbENvZGUoYCEhZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV1gKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCByYXdPdXRwdXQgPSBldmVudERhdGE/LnJlc3VsdCA/PyBldmVudERhdGE/Lm91dHB1dDtcbiAgICAgICAgaWYgKGhhc1Jlc29sdmVyKSB7XG4gICAgICAgICAgaWYgKHJhd091dHB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIC8vIERlY3J5cHQgaWYgZW5jcnlwdGVkOiB0aGUgVk0gb25seSB1bmRlcnN0YW5kcyAnZGV2bCcgZm9ybWF0XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRdWlja0pTIHJ1bnRpbWU6IHN0ZXAgcmVzdWx0IHJhdycsIHtcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogY2lkLFxuICAgICAgICAgICAgICByYXdQcmVmaXg6IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShyYXdPdXRwdXQuc3ViYXJyYXkoMCwgNCkpLFxuICAgICAgICAgICAgICByYXdCeXRlTGVuZ3RoOiByYXdPdXRwdXQuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgICAgaXNCdWZmZXI6IEJ1ZmZlci5pc0J1ZmZlcihyYXdPdXRwdXQpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBkZWNyeXB0ZWRPdXRwdXQgPSBhd2FpdCBwcmVwYXJlQnl0ZXNGb3JWTShcbiAgICAgICAgICAgICAgcmF3T3V0cHV0LFxuICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBydW50aW1lOiBzdGVwIHJlc3VsdCBkZWNyeXB0ZWQnLCB7XG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGNpZCxcbiAgICAgICAgICAgICAgcHJlZml4OiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZGVjcnlwdGVkT3V0cHV0LnN1YmFycmF5KDAsIDQpKSxcbiAgICAgICAgICAgICAgYnl0ZUxlbmd0aDogZGVjcnlwdGVkT3V0cHV0LmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlSGFuZGxlID0gc2VyZGUuZGVzZXJpYWxpemUoZGVjcnlwdGVkT3V0cHV0KTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfcmVzdWx0JywgdmFsdWVIYW5kbGUpO1xuICAgICAgICAgICAgdmFsdWVIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XS5yZXNvbHZlKGdsb2JhbFRoaXMuX190bXBfcmVzdWx0KTtgICtcbiAgICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dO2AgK1xuICAgICAgICAgICAgICAgIGBkZWxldGUgZ2xvYmFsVGhpcy5fX3RtcF9yZXN1bHQ7YFxuICAgICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgcnVudGltZTogc3RlcCByZXN1bHQgbm9uLWJpbmFyeScsIHtcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogY2lkLFxuICAgICAgICAgICAgICB0eXBlOiB0eXBlb2YgcmF3T3V0cHV0LFxuICAgICAgICAgICAgICBpc051bGw6IHJhd091dHB1dCA9PT0gbnVsbCxcbiAgICAgICAgICAgICAgaXNVbmRlZmluZWQ6IHJhd091dHB1dCA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogcmF3T3V0cHV0Py5jb25zdHJ1Y3Rvcj8ubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9XG4gICAgICAgICAgICAgIHJhd091dHB1dCAhPT0gdW5kZWZpbmVkID8gSlNPTi5zdHJpbmdpZnkocmF3T3V0cHV0KSA6ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XS5yZXNvbHZlKCR7c2VyaWFsaXplZH0pO2AgK1xuICAgICAgICAgICAgICAgIGBkZWxldGUgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV07YFxuICAgICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIERyYWluIEFMTCBtaWNyb3Rhc2tzIGFmdGVyIHJlc29sdmVcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHJlc29sdmVyIHlldCwgc28gYnVmZmVyIHRoZSBwcmVwYXJlZCBvdXRjb21lIHNvIHRoZSBwcm9taXNlXG4gICAgICAgICAgLy8gc2V0dGxlcyB0aGUgbW9tZW50IHRoZSBWTSBjb25zdHJ1Y3RzIGl0IChzZWUgX190ZXJtaW5hbEJ1ZmZlclxuICAgICAgICAgIC8vIGluIHRoZSBib290c3RyYXApLiBXaXRob3V0IHRoaXMsIHRoZSBsaXZlLWNvbnRpbnVhdGlvbiBwYXRoXG4gICAgICAgICAgLy8gKHdoaWNoIHNjYW5zIGVhY2ggZGVsdGEgZXhhY3RseSBvbmNlKSBkcm9wcyB0aGUgdGVybWluYWwgYW5kXG4gICAgICAgICAgLy8gdGhlIGF3YWl0IG5ldmVyIHNldHRsZXMuXG4gICAgICAgICAgaWYgKHJhd091dHB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZE91dHB1dCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKFxuICAgICAgICAgICAgICByYXdPdXRwdXQsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBIb3N0IHNlcmRlOiBkZXNlcmlhbGl6ZSBpbnRvIGEgVk0gdmFsdWUgTk9XIChzYW1lIHBhdGggYXNcbiAgICAgICAgICAgIC8vIHRoZSByZXNvbHZlciBicmFuY2ggYWJvdmUpIGFuZCBidWZmZXIgdGhlIHZhbHVlIGl0c2VsZi5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlSGFuZGxlID0gc2VyZGUuZGVzZXJpYWxpemUoZGVjcnlwdGVkT3V0cHV0KTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfYnVmJywgdmFsdWVIYW5kbGUpO1xuICAgICAgICAgICAgdmFsdWVIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlc29sdmVfdmFsdWVcIiwgdmFsdWU6IGdsb2JhbFRoaXMuX190bXBfYnVmIH07YCArXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBnbG9iYWxUaGlzLl9fdG1wX2J1ZjtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9XG4gICAgICAgICAgICAgIHJhd091dHB1dCAhPT0gdW5kZWZpbmVkID8gSlNPTi5zdHJpbmdpZnkocmF3T3V0cHV0KSA6ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlc29sdmVfdmFsdWVcIiwgdmFsdWU6ICR7c2VyaWFsaXplZH0gfTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdGVwX2ZhaWxlZCc6IHtcbiAgICAgICAgY29uc3QgaGFzUmVzb2x2ZXIgPSB2bS5kdW1wKFxuICAgICAgICAgIHZtLmV2YWxDb2RlKGAhIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dYClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGhhc1Jlc29sdmVyKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JEYXRhID0gZXZlbnREYXRhPy5lcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3JEYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAgICAgLy8gTW9kZXJuIHBhdGggKHBvc3QtIzE4NTEpOiB0aGUgc3RlcCBoYW5kbGVyIGRlaHlkcmF0ZWQgdGhlXG4gICAgICAgICAgICAvLyB0aHJvd24gdmFsdWUgdGhyb3VnaCB0aGUgZmlyc3QtY2xhc3MgZXJyb3IgcGlwZWxpbmUuIERlY3J5cHRcbiAgICAgICAgICAgIC8vIChpZiBlbmNyeXB0ZWQpIGFuZCBwYXNzIHRoZSBieXRlcyB0byB0aGUgVk0tc2lkZSBkZXNlcmlhbGl6ZXJcbiAgICAgICAgICAgIC8vIHNvIHRoZSB3b3JrZmxvdyBjYXRjaCBzZWVzIGEgcHJvcGVybHkgdHlwZWQgRXJyb3Igc3ViY2xhc3NcbiAgICAgICAgICAgIC8vIChUeXBlRXJyb3IsIEZhdGFsRXJyb3Igd2l0aCBvcmlnaW5hbCBjYXVzZSBjaGFpbiwgZXRjLikgd2l0aFxuICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIG1lc3NhZ2UgYW5kIHN0YWNrIHByZXNlcnZlZC5cbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKGVycm9yRGF0YSwgZW5jcnlwdGlvbktleSk7XG4gICAgICAgICAgICBjb25zdCBlcnJvckhhbmRsZSA9IHNlcmRlLmRlc2VyaWFsaXplKGRlY3J5cHRlZCk7XG4gICAgICAgICAgICB2bS5zZXRQcm9wKHZtLmdsb2JhbCwgJ19fdG1wX2Vycm9yJywgZXJyb3JIYW5kbGUpO1xuICAgICAgICAgICAgZXJyb3JIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGAoZnVuY3Rpb24oKXtgICtcbiAgICAgICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVqZWN0KGdsb2JhbFRoaXMuX190bXBfZXJyb3IpO2AgK1xuICAgICAgICAgICAgICAgIGBkZWxldGUgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV07YCArXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBnbG9iYWxUaGlzLl9fdG1wX2Vycm9yO2AgK1xuICAgICAgICAgICAgICAgIGB9KSgpYFxuICAgICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIExlZ2FjeSBwYXRoOiBwcmUtcGlwZWxpbmUgZXZlbnRzIHN0b3JlZCBlcnJvciBhc1xuICAgICAgICAgICAgLy8gYHsgbWVzc2FnZSwgc3RhY2ssIGNvZGUgfWAuIFJlY29uc3RydWN0IGEgRmF0YWxFcnJvciBzb1xuICAgICAgICAgICAgLy8gd29ya2Zsb3cgY2F0Y2ggY2FuIGRldGVjdCBpdCB2aWEgRmF0YWxFcnJvci5pcygpLCBtYXRjaGluZ1xuICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIFYxIHN0ZXAgaGFuZGxlciBiZWhhdmlvci5cbiAgICAgICAgICAgIGNvbnN0IGlzRXJyb3JPYmplY3QgPVxuICAgICAgICAgICAgICB0eXBlb2YgZXJyb3JEYXRhID09PSAnb2JqZWN0JyAmJiBlcnJvckRhdGEgIT09IG51bGw7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBpc0Vycm9yT2JqZWN0XG4gICAgICAgICAgICAgID8gKCgoZXJyb3JEYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5tZXNzYWdlIGFzIHN0cmluZykgPz9cbiAgICAgICAgICAgICAgICAnU3RlcCBmYWlsZWQnKVxuICAgICAgICAgICAgICA6IHR5cGVvZiBlcnJvckRhdGEgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBlcnJvckRhdGFcbiAgICAgICAgICAgICAgICA6ICdTdGVwIGZhaWxlZCc7XG4gICAgICAgICAgICBjb25zdCBlcnJvclN0YWNrID1cbiAgICAgICAgICAgICAgKGlzRXJyb3JPYmplY3RcbiAgICAgICAgICAgICAgICA/IChlcnJvckRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnN0YWNrXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQpID8/IChldmVudERhdGE/LnN0YWNrIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBjb25zdCBzdGFja0Fzc2lnbm1lbnQgPSBlcnJvclN0YWNrXG4gICAgICAgICAgICAgID8gYGUuc3RhY2s9JHtKU09OLnN0cmluZ2lmeShlcnJvclN0YWNrKX07YFxuICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGAoZnVuY3Rpb24oKXt2YXIgZT1uZXcgRXJyb3IoJHtKU09OLnN0cmluZ2lmeShtc2cpfSk7ZS5uYW1lPVwiRmF0YWxFcnJvclwiO2UuZmF0YWw9dHJ1ZTske3N0YWNrQXNzaWdubWVudH1gICtcbiAgICAgICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVqZWN0KGUpO2AgK1xuICAgICAgICAgICAgICAgIGBkZWxldGUgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV07fSkoKWBcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHJlc29sdmVyIHlldCwgc28gYnVmZmVyIHRoZSBwcmVwYXJlZCByZWplY3Rpb24gKHNlZSB0aGVcbiAgICAgICAgICAvLyBzdGVwX2NvbXBsZXRlZCBicmFuY2ggYWJvdmUgZm9yIHRoZSByYXRpb25hbGUpLlxuICAgICAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGV2ZW50RGF0YT8uZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yRGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKGVycm9yRGF0YSwgZW5jcnlwdGlvbktleSk7XG4gICAgICAgICAgICAvLyBIb3N0IHNlcmRlOiBkZXNlcmlhbGl6ZSBpbnRvIHRoZSBWTSBlcnJvciB2YWx1ZSBOT1cgKHNhbWVcbiAgICAgICAgICAgIC8vIHBhdGggYXMgdGhlIHJlc29sdmVyIGJyYW5jaCBhYm92ZSkgYW5kIGJ1ZmZlciBpdC5cbiAgICAgICAgICAgIGNvbnN0IGVycm9ySGFuZGxlID0gc2VyZGUuZGVzZXJpYWxpemUoZGVjcnlwdGVkKTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfYnVmJywgZXJyb3JIYW5kbGUpO1xuICAgICAgICAgICAgZXJyb3JIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlamVjdF92YWx1ZVwiLCB2YWx1ZTogZ2xvYmFsVGhpcy5fX3RtcF9idWYgfTtgICtcbiAgICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX190bXBfYnVmO2BcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpc0Vycm9yT2JqZWN0ID1cbiAgICAgICAgICAgICAgdHlwZW9mIGVycm9yRGF0YSA9PT0gJ29iamVjdCcgJiYgZXJyb3JEYXRhICE9PSBudWxsO1xuICAgICAgICAgICAgY29uc3QgbXNnID0gaXNFcnJvck9iamVjdFxuICAgICAgICAgICAgICA/ICgoKGVycm9yRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikubWVzc2FnZSBhcyBzdHJpbmcpID8/XG4gICAgICAgICAgICAgICAgJ1N0ZXAgZmFpbGVkJylcbiAgICAgICAgICAgICAgOiB0eXBlb2YgZXJyb3JEYXRhID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8gZXJyb3JEYXRhXG4gICAgICAgICAgICAgICAgOiAnU3RlcCBmYWlsZWQnO1xuICAgICAgICAgICAgY29uc3QgZXJyb3JTdGFjayA9XG4gICAgICAgICAgICAgIChpc0Vycm9yT2JqZWN0XG4gICAgICAgICAgICAgICAgPyAoZXJyb3JEYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5zdGFja1xuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkKSA/PyAoZXZlbnREYXRhPy5zdGFjayBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlamVjdF9lcnJvclwiLCBtZXNzYWdlOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9LCBzdGFjazogJHtlcnJvclN0YWNrID8gSlNPTi5zdHJpbmdpZnkoZXJyb3JTdGFjaykgOiAndW5kZWZpbmVkJ30gfTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd3YWl0X2NvbXBsZXRlZCc6IHtcbiAgICAgICAgY29uc3QgaGFzUmVzb2x2ZXIgPSB2bS5kdW1wKFxuICAgICAgICAgIHZtLmV2YWxDb2RlKGAhIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dYClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGhhc1Jlc29sdmVyKSB7XG4gICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVzb2x2ZSgpO2AgK1xuICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dO2BcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHJlc29sdmVyIHlldCwgc28gYnVmZmVyIChzZWUgc3RlcF9jb21wbGV0ZWQgYWJvdmUpLlxuICAgICAgICAgIHZtLmV2YWxDb2RlKFxuICAgICAgICAgICAgYGdsb2JhbFRoaXMuX190ZXJtaW5hbEJ1ZmZlclske2NpZEpzfV0gPSB7IGtpbmQ6IFwicmVzb2x2ZV91bmRlZmluZWRcIiB9O2BcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBtYXJrQ3JlYXRlZCh2bSwgY2lkSnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2F0dHJfc2V0Jzoge1xuICAgICAgICAvLyBPbmx5IHdvcmtmbG93LXdyaXR0ZW4gYXR0cmlidXRlIGV2ZW50cyByZXNvbHZlIGEgcGVuZGluZ1xuICAgICAgICAvLyBzZXRBdHRyaWJ1dGVzKCkgcHJvbWlzZTsgc3RlcC9zeXN0ZW0gd3JpdGVycyBzaGFyZSBub1xuICAgICAgICAvLyBjb3JyZWxhdGlvbklkcyB3aXRoIFZNIHJlc29sdmVycywgc28gdGhlIGd1YXJkIGlzIGRlZmVuc2l2ZS5cbiAgICAgICAgY29uc3Qgd3JpdGVyID0gKGV2ZW50RGF0YT8ud3JpdGVyIGFzIHsgdHlwZT86IHN0cmluZyB9IHwgdW5kZWZpbmVkKVxuICAgICAgICAgID8udHlwZTtcbiAgICAgICAgaWYgKHdyaXRlciAhPT0gJ3dvcmtmbG93JykgYnJlYWs7XG4gICAgICAgIGNvbnN0IGhhc1Jlc29sdmVyID0gdm0uZHVtcChcbiAgICAgICAgICB2bS5ldmFsQ29kZShgISFnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XWApXG4gICAgICAgICk7XG4gICAgICAgIGlmICghaGFzUmVzb2x2ZXIpIHtcbiAgICAgICAgICAvLyBObyByZXNvbHZlciB5ZXQsIHNvIGJ1ZmZlciAoc2VlIHN0ZXBfY29tcGxldGVkIGFib3ZlKS5cbiAgICAgICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlc29sdmVfdW5kZWZpbmVkXCIgfTtgXG4gICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1Jlc29sdmVyKSB7XG4gICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVzb2x2ZSgpO2AgK1xuICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dO2BcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1hcmtDcmVhdGVkKHZtLCBjaWRKcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnaG9va19yZWNlaXZlZCc6IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBldmVudCB3YXMgYWxyZWFkeSBwcm9jZXNzZWQgKGRlbGl2ZXJlZCBvclxuICAgICAgICAvLyBidWZmZXJlZCkgd2l0aGluIHRoaXMgaW52b2NhdGlvbi4gUHJldmVudHMgZG91YmxlLWRlbGl2ZXJ5IHdoZW5cbiAgICAgICAgLy8gdGhlIG91dGVyIGxvb3AgcmUtc2NhbnMgZXZlbnRzLlxuICAgICAgICBjb25zdCBhbHJlYWR5UHJvY2Vzc2VkID0gZXZlbnQuZXZlbnRJZFxuICAgICAgICAgID8gdm0uZHVtcChcbiAgICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgICAgYCEhKGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzICYmIGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzWyR7SlNPTi5zdHJpbmdpZnkoZXZlbnQuZXZlbnRJZCl9XSlgXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICBpZiAoYWxyZWFkeVByb2Nlc3NlZCkge1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBob29rX3JlY2VpdmVkIGFscmVhZHkgcHJvY2Vzc2VkJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogY2lkLFxuICAgICAgICAgICAgICBldmVudElkOiBldmVudC5ldmVudElkLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2lsaWVudC1yZXN1bWUgZGVkdXAgKHBhcml0eSB3aXRoIHRoZSBub2RlIGVuZ2luZSdzXG4gICAgICAgIC8vIEV2ZW50c0NvbnN1bWVyIGluIHdvcmtmbG93L2hvb2sudHMpOiB0d28gaG9va19yZWNlaXZlZCByb3dzIGZvclxuICAgICAgICAvLyBPTkUgcmVzdW1lIGF0dGVtcHQgc2hhcmUgYSBjbGllbnQtbWludGVkIGByZXN1bWVJZGAgKGEgZHVwbGljYXRlXG4gICAgICAgIC8vIGNhbiBiZSBjb21taXR0ZWQgd2hlbiB0aGUgbWF0ZXJpYWxpemF0aW9uIGZhbGxiYWNrIHJhY2VzIGFcbiAgICAgICAgLy8gZGVsYXllZCBkaXJlY3Qgd3JpdGUsIHNpbmNlIGhvb2tfcmVjZWl2ZWQgaGFzIG5vIHN0b3JhZ2UgdW5pcXVlbmVzc1xuICAgICAgICAvLyBjb25zdHJhaW50KS4gRGVsaXZlciBvbmx5IHRoZSBmaXJzdC1pbi1sb2cgb2NjdXJyZW5jZS4gVGhlIHNlZW5cbiAgICAgICAgLy8gc2V0IGxpdmVzIGluIHRoZSBWTSBoZWFwIHNvIGl0IGlzIGRldGVybWluaXN0aWMgcGVyIHJlcGxheSBhbmRcbiAgICAgICAgLy8gc3Vydml2ZXMgZXZlbnQgcmUtc2NhbnMgd2l0aGluIHRoZSBpbnZvY2F0aW9uLiBFdmVudHMgd2l0aG91dCBhXG4gICAgICAgIC8vIHJlc3VtZUlkIChvbGRlciBTREtzKSBhcmUgbmV2ZXIgZGVkdXBlZC5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFRvcC1sZXZlbCBldmVudC5yZXN1bWVJZCBpcyB0aGUgY2Fub25pY2FsIGxvY2F0aW9uICh0aGUgYmFja2VuZFxuICAgICAgICAgIC8vIGhvaXN0cyBpdCB0byBhIGZpcnN0LWNsYXNzIGNvbHVtbik7IHRoZSBuZXN0ZWRcbiAgICAgICAgICAvLyBldmVudERhdGEucmVzdW1lSWQgZm9ybSBpcyBhIGRlcHJlY2F0ZWQgbGVnYWN5IGZhbGxiYWNrLlxuICAgICAgICAgIC8vIE1pcnJvcnMgdGhlIG5vZGUgZW5naW5lJ3MgZGVkdXAgaW4gd29ya2Zsb3cvaG9vay50cy5cbiAgICAgICAgICBjb25zdCByZXN1bWVJZCA9XG4gICAgICAgICAgICAoZXZlbnQgYXMgeyByZXN1bWVJZD86IHVua25vd24gfSkucmVzdW1lSWQgPz9cbiAgICAgICAgICAgIChldmVudERhdGEgYXMgeyByZXN1bWVJZD86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LnJlc3VtZUlkO1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzdW1lSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bWVJZEpzID0gSlNPTi5zdHJpbmdpZnkocmVzdW1lSWQpO1xuICAgICAgICAgICAgY29uc3QgZHVwbGljYXRlID0gdm0uZHVtcChcbiAgICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgICAgYChnbG9iYWxUaGlzLl9faG9va1NlZW5SZXN1bWVJZHMgPSBnbG9iYWxUaGlzLl9faG9va1NlZW5SZXN1bWVJZHMgfHwge30pWyR7cmVzdW1lSWRKc31dID09PSB0cnVlYFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGR1cGxpY2F0ZSBob29rX3JlY2VpdmVkIGZvciB0aGUgc2FtZSByZXN1bWUgYXR0ZW1wdCwgZHJvcHBpbmcnLFxuICAgICAgICAgICAgICAgIHsgY29ycmVsYXRpb25JZDogY2lkLCBldmVudElkOiBldmVudC5ldmVudElkLCByZXN1bWVJZCB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChldmVudC5ldmVudElkKSB7XG4gICAgICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgICAgICBgKGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzID0gZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyLl9fcHJvY2Vzc2VkRXZlbnRJZHMgfHwge30pWyR7SlNPTi5zdHJpbmdpZnkoZXZlbnQuZXZlbnRJZCl9XSA9IHRydWU7YFxuICAgICAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1hcmtDcmVhdGVkKHZtLCBjaWRKcyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9faG9va1NlZW5SZXN1bWVJZHNbJHtyZXN1bWVJZEpzfV0gPSB0cnVlO2BcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFib3J0IGRlbGl2ZXJ5OiBob29rX3JlY2VpdmVkIGZvciBhbiBBYm9ydENvbnRyb2xsZXIncyBzeXN0ZW1cbiAgICAgICAgLy8gaG9vayBmbGlwcyB0aGUgcmVnaXN0ZXJlZCBzaWduYWwgaW5zdGVhZCBvZiByZXNvbHZpbmcgYSBwcm9taXNlLlxuICAgICAgICAvLyBUaGUgcGF5bG9hZCBpcyB0aGUgZGVoeWRyYXRlZCBgeyBhYm9ydGVkOiB0cnVlLCByZWFzb24gfWAgb2JqZWN0LlxuICAgICAgICBjb25zdCBpc0Fib3J0SG9vayA9IHZtLmR1bXAoXG4gICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICBgISEoZ2xvYmFsVGhpcy5fX2Fib3J0U2lnbmFscyAmJiBnbG9iYWxUaGlzLl9fYWJvcnRTaWduYWxzWyR7Y2lkSnN9XSlgXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBpZiAoaXNBYm9ydEhvb2spIHtcbiAgICAgICAgICBjb25zdCByYXdBYm9ydFBheWxvYWQgPSBldmVudERhdGE/LnBheWxvYWQ7XG4gICAgICAgICAgaWYgKHJhd0Fib3J0UGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKFxuICAgICAgICAgICAgICByYXdBYm9ydFBheWxvYWQsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkSGFuZGxlID0gc2VyZGUuZGVzZXJpYWxpemUoZGVjcnlwdGVkKTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfYWJvcnQnLCBwYXlsb2FkSGFuZGxlKTtcbiAgICAgICAgICAgIHBheWxvYWRIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGAoZnVuY3Rpb24oKXtgICtcbiAgICAgICAgICAgICAgICBgdmFyIHA9Z2xvYmFsVGhpcy5fX3RtcF9hYm9ydDtgICtcbiAgICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX190bXBfYWJvcnQ7YCArXG4gICAgICAgICAgICAgICAgYGdsb2JhbFRoaXMuX19hYm9ydFNpZ25hbHNbJHtjaWRKc31dLl9zZXRBYm9ydGVkKHAmJnR5cGVvZiBwPT09XCJvYmplY3RcIj9wLnJlYXNvbjp1bmRlZmluZWQpO2AgK1xuICAgICAgICAgICAgICAgIGB9KSgpYFxuICAgICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZtLmV2YWxDb2RlKFxuICAgICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX2Fib3J0U2lnbmFsc1ske2NpZEpzfV0uX3NldEFib3J0ZWQodW5kZWZpbmVkKTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVGhlIGFib3J0IGlzIGR1cmFibHkgcmVjb3JkZWQsIHNvIGNsZWFyIHRoZSBwZW5kaW5nIG9wJ3NcbiAgICAgICAgICAvLyBhYm9ydFJlcXVlc3RlZCBtYXJrZXIgc28gdGhlIGhvc3QgZG9lc24ndCByZS1yZWNvcmQgaXQgKHRoZVxuICAgICAgICAgIC8vIHdvcmtmbG93J3Mgb3duIGFib3J0KCkgY2FsbCBjYW4gc2V0IHRoZSBmbGFnIGJlZm9yZSB0aGlzXG4gICAgICAgICAgLy8gZXZlbnQgaXMgcHJvY2Vzc2VkIHdoZW4gaXQgaGFwcGVucyBsYXRlciBpbiByZXBsYXkgb3JkZXIsXG4gICAgICAgICAgLy8gYW5kIGhvb2tfcmVjZWl2ZWQgZXZlbnRzIGFyZSBub3QgdW5pcXVlIHBlciBjb3JyZWxhdGlvbklkKS5cbiAgICAgICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgIGAoZnVuY3Rpb24oKXtgICtcbiAgICAgICAgICAgICAgYHZhciBwPWdsb2JhbFRoaXMuX19wZW5kaW5nLmZpbmQoZnVuY3Rpb24ocSl7cmV0dXJuIHEuY29ycmVsYXRpb25JZD09PSR7SlNPTi5zdHJpbmdpZnkoY2lkKX0mJnEudHlwZT09PVwiaG9va1wiO30pO2AgK1xuICAgICAgICAgICAgICBgaWYocClwLmFib3J0UmVxdWVzdGVkPWZhbHNlO2AgK1xuICAgICAgICAgICAgICBgfSkoKWBcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICBpZiAoZXZlbnQuZXZlbnRJZCkge1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGAoZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyLl9fcHJvY2Vzc2VkRXZlbnRJZHMgPSBnbG9iYWxUaGlzLl9faG9va1BheWxvYWRCdWZmZXIuX19wcm9jZXNzZWRFdmVudElkcyB8fCB7fSlbJHtKU09OLnN0cmluZ2lmeShldmVudC5ldmVudElkKX1dID0gdHJ1ZTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IGI6IG51bWJlcjtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgYiA9IHZtLmV4ZWN1dGVQZW5kaW5nSm9icygpO1xuICAgICAgICAgICAgfSB3aGlsZSAoYiA+IDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXJrQ3JlYXRlZCh2bSwgY2lkSnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFzUmVzb2x2ZXIgPSB2bS5kdW1wKFxuICAgICAgICAgIHZtLmV2YWxDb2RlKGAhIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dYClcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmF3UGF5bG9hZCA9IGV2ZW50RGF0YT8ucGF5bG9hZCA/PyBldmVudERhdGE/LnJlc3VsdDtcbiAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBydW50aW1lOiBwcm9jZXNzaW5nIGhvb2tfcmVjZWl2ZWQnLCB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogY2lkLFxuICAgICAgICAgIGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICAgICAgaGFzUmVzb2x2ZXIsXG4gICAgICAgICAgcGF5bG9hZFR5cGU6IHR5cGVvZiByYXdQYXlsb2FkLFxuICAgICAgICAgIHBheWxvYWRJc1VpbnQ4QXJyYXk6IHJhd1BheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5LFxuICAgICAgICAgIHBheWxvYWRLZXlzOlxuICAgICAgICAgICAgcmF3UGF5bG9hZCAmJiB0eXBlb2YgcmF3UGF5bG9hZCA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgPyBPYmplY3Qua2V5cyhyYXdQYXlsb2FkKVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChoYXNSZXNvbHZlcikge1xuICAgICAgICAgIGlmIChyYXdQYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAgICAgLy8gRGVjcnlwdCBpZiBlbmNyeXB0ZWQ6IHRoZSBWTSBvbmx5IHVuZGVyc3RhbmRzICdkZXZsJyBmb3JtYXRcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZFBheWxvYWQgPSBhd2FpdCBwcmVwYXJlQnl0ZXNGb3JWTShcbiAgICAgICAgICAgICAgcmF3UGF5bG9hZCxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWRIYW5kbGUgPSBzZXJkZS5kZXNlcmlhbGl6ZShkZWNyeXB0ZWRQYXlsb2FkKTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfcmVzdWx0JywgcGF5bG9hZEhhbmRsZSk7XG4gICAgICAgICAgICBwYXlsb2FkSGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHZtLmV2YWxDb2RlKFxuICAgICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVzb2x2ZShnbG9iYWxUaGlzLl9fdG1wX3Jlc3VsdCk7YCArXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XTtgICtcbiAgICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX190bXBfcmVzdWx0O2BcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID1cbiAgICAgICAgICAgICAgcmF3UGF5bG9hZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShyYXdQYXlsb2FkKVxuICAgICAgICAgICAgICAgIDogJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgICAgYGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dLnJlc29sdmUoJHtzZXJpYWxpemVkfSk7YCArXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTWFyayB0aGlzIGV2ZW50IGFzIHByb2Nlc3NlZCBpbiB0aGUgVk0gaGVhcCB0byBwcmV2ZW50XG4gICAgICAgICAgLy8gZG91YmxlLWRlbGl2ZXJ5IHdoZW4gdGhlIG91dGVyIGxvb3AgcmUtc2NhbnMgZXZlbnRzLlxuICAgICAgICAgIGlmIChldmVudC5ldmVudElkKSB7XG4gICAgICAgICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgICAgYChnbG9iYWxUaGlzLl9faG9va1BheWxvYWRCdWZmZXIuX19wcm9jZXNzZWRFdmVudElkcyA9IGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzIHx8IHt9KVske0pTT04uc3RyaW5naWZ5KGV2ZW50LmV2ZW50SWQpfV0gPSB0cnVlO2BcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHJlc29sdmVyIHlldCwgc28gYnVmZmVyIHRoZSBwYXlsb2FkIGluIHRoZSBWTSBoZWFwLiBXaGVuXG4gICAgICAgICAgLy8gY3JlYXRlSG9va1Byb21pc2UoKSBpcyBjYWxsZWQgbGF0ZXIsIGl0IHdpbGwgZHJhaW4gdGhpcyBidWZmZXJcbiAgICAgICAgICAvLyBmaXJzdCAobWF0Y2hpbmcgdGhlIG5vZGU6dm0gZW5naW5lJ3MgcGF5bG9hZHNRdWV1ZSBiZWhhdmlvcikuXG4gICAgICAgICAgY29uc3QgZXZlbnRJZEpzID0gZXZlbnQuZXZlbnRJZFxuICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShldmVudC5ldmVudElkKVxuICAgICAgICAgICAgOiAnbnVsbCc7XG4gICAgICAgICAgY29uc3QgYnVmZmVyQW5kVHJhY2sgPVxuICAgICAgICAgICAgYChnbG9iYWxUaGlzLl9faG9va1BheWxvYWRCdWZmZXJbJHtjaWRKc31dID0gZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyWyR7Y2lkSnN9XSB8fCBbXSlgICtcbiAgICAgICAgICAgIGAucHVzaCglUEFZTE9BRCUpO2AgK1xuICAgICAgICAgICAgKGV2ZW50LmV2ZW50SWRcbiAgICAgICAgICAgICAgPyBgKGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzID0gZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyLl9fcHJvY2Vzc2VkRXZlbnRJZHMgfHwge30pWyR7ZXZlbnRJZEpzfV0gPSB0cnVlO2BcbiAgICAgICAgICAgICAgOiAnJyk7XG4gICAgICAgICAgaWYgKHJhd1BheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgICAgICAvLyBEZWNyeXB0IGlmIGVuY3J5cHRlZDogdGhlIFZNIG9ubHkgdW5kZXJzdGFuZHMgJ2RldmwnIGZvcm1hdFxuICAgICAgICAgICAgY29uc3QgZGVjcnlwdGVkUGF5bG9hZCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKFxuICAgICAgICAgICAgICByYXdQYXlsb2FkLFxuICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZEhhbmRsZSA9IHNlcmRlLmRlc2VyaWFsaXplKGRlY3J5cHRlZFBheWxvYWQpO1xuICAgICAgICAgICAgdm0uc2V0UHJvcCh2bS5nbG9iYWwsICdfX3RtcF9yZXN1bHQnLCBwYXlsb2FkSGFuZGxlKTtcbiAgICAgICAgICAgIHBheWxvYWRIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgLy8gTk9URTogcmVwbGFjZW1lbnQgaXMgYSBmdW5jdGlvbiBzbyBgJGAtc2VxdWVuY2VzIGluIHRoZVxuICAgICAgICAgICAgLy8gc3Vic3RpdHV0ZWQgSlMgbmV2ZXIgZ2V0IGludGVycHJldGVkIGFzIFN0cmluZy5yZXBsYWNlXG4gICAgICAgICAgICAvLyBzcGVjaWFsIHJlcGxhY2VtZW50IHBhdHRlcm5zLlxuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGJ1ZmZlckFuZFRyYWNrLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgJyVQQVlMT0FEJScsXG4gICAgICAgICAgICAgICAgKCkgPT4gJ2dsb2JhbFRoaXMuX190bXBfcmVzdWx0J1xuICAgICAgICAgICAgICApICsgJ2RlbGV0ZSBnbG9iYWxUaGlzLl9fdG1wX3Jlc3VsdDsnXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9XG4gICAgICAgICAgICAgIHJhd1BheWxvYWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkocmF3UGF5bG9hZClcbiAgICAgICAgICAgICAgICA6ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmVwbGFjZW1lbnQ6IGEgSlNPTi1zZXJpYWxpemVkIHBheWxvYWQgY2FuIGNvbnRhaW5cbiAgICAgICAgICAgIC8vIGAkJmAsIGAkJ2AsIGAkXFxgYCwgLi4uIHdoaWNoIFN0cmluZy5yZXBsYWNlIHdvdWxkIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gZXhwYW5kLCBzaWxlbnRseSBjb3JydXB0aW5nIHRoZSBpbmplY3RlZCBjb2RlLlxuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGJ1ZmZlckFuZFRyYWNrLnJlcGxhY2UoJyVQQVlMT0FEJScsICgpID0+IHNlcmlhbGl6ZWQpXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdob29rX2NvbmZsaWN0Jzoge1xuICAgICAgICAvLyBBbm90aGVyIHdvcmtmbG93IG93bnMgdGhpcyBob29rIHRva2VuLiBQYXlsb2FkIGF3YWl0ZXJzIHJlamVjdFxuICAgICAgICAvLyB3aXRoIEhvb2tDb25mbGljdEVycm9yOyBnZXRDb25mbGljdCgpIGF3YWl0ZXJzIHJlc29sdmUgd2l0aCBhXG4gICAgICAgIC8vIFJ1biBoYW5kbGUgZm9yIHRoZSBjb25mbGljdGluZyBydW4gKHJldml2ZWQgdGhyb3VnaCB0aGUgVk0nc1xuICAgICAgICAvLyBjbGFzcyByZWdpc3RyeSBzbyBpdHMgbWV0aG9kcyBhcmUgZHVyYWJsZSBzdGVwIHByb3hpZXMpIG9yXG4gICAgICAgIC8vIHJlamVjdCB3aXRoIHRoZSBlcnJvciB3aGVuIG5vIGhhbmRsZSBjYW4gYmUgY29uc3RydWN0ZWQsXG4gICAgICAgIC8vIG1pcnJvcmluZyB0aGUgbm9kZTp2bSBlbmdpbmUncyBob29rLnRzIGhvb2tfY29uZmxpY3QgaGFuZGxpbmcuXG4gICAgICAgIGNvbnN0IGNvbmZsaWN0VG9rZW4gPSAoZXZlbnREYXRhPy50b2tlbiBhcyBzdHJpbmcpID8/ICd1bmtub3duJztcbiAgICAgICAgY29uc3QgY29uZmxpY3RpbmdSdW5JZCA9IGV2ZW50RGF0YT8uY29uZmxpY3RpbmdSdW5JZCBhc1xuICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGRpZFNldHRsZSA9IHZtLmR1bXAoXG4gICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICBgKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgIHZhciBjaWQgPSAke0pTT04uc3RyaW5naWZ5KGNpZCl9O1xuICAgICAgICAgICAgICB2YXIgdG9rZW4gPSAke0pTT04uc3RyaW5naWZ5KGNvbmZsaWN0VG9rZW4pfTtcbiAgICAgICAgICAgICAgdmFyIGNvbmZsaWN0aW5nUnVuSWQgPSAke0pTT04uc3RyaW5naWZ5KGNvbmZsaWN0aW5nUnVuSWQgPz8gbnVsbCl9O1xuICAgICAgICAgICAgICB2YXIgRXJyQ2xzID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9Ib29rQ29uZmxpY3RFcnJvcicpXTtcbiAgICAgICAgICAgICAgdmFyIGVycjtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBFcnJDbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBlcnIgPSBuZXcgRXJyQ2xzKHRva2VuLCBjb25mbGljdGluZ1J1bklkIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKCdIb29rIHRva2VuIFwiJyArIHRva2VuICsgJ1wiIGlzIGFscmVhZHkgaW4gdXNlIGJ5IGFub3RoZXIgd29ya2Zsb3cnKTtcbiAgICAgICAgICAgICAgICBlcnIubmFtZSA9ICdIb29rQ29uZmxpY3RFcnJvcic7XG4gICAgICAgICAgICAgICAgZXJyLnRva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZsaWN0aW5nUnVuSWQpIGVyci5jb25mbGljdGluZ1J1bklkID0gY29uZmxpY3RpbmdSdW5JZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgcnVuID0gbnVsbDtcbiAgICAgICAgICAgICAgaWYgKGNvbmZsaWN0aW5nUnVuSWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVnID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKCd3b3JrZmxvdy1jbGFzcy1yZWdpc3RyeScpXTtcbiAgICAgICAgICAgICAgICB2YXIgUnVuQ2xzID0gcmVnICYmIHJlZy5nZXQoJ2NsYXNzLy93b3JrZmxvdy8vUnVuJyk7XG4gICAgICAgICAgICAgICAgdmFyIGRlcyA9IFJ1bkNscyAmJiBSdW5DbHNbU3ltYm9sLmZvcignd29ya2Zsb3ctZGVzZXJpYWxpemUnKV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgIHJ1biA9IGRlcy5jYWxsKFJ1bkNscywgeyBydW5JZDogY29uZmxpY3RpbmdSdW5JZCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIHNldHRsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdmFyIHN0YXRlID0gZ2xvYmFsVGhpcy5fX2hvb2tzICYmIGdsb2JhbFRoaXMuX19ob29rc1tjaWRdO1xuICAgICAgICAgICAgICBpZiAoc3RhdGUgJiYgIXN0YXRlLmNvbmZsaWN0KSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuY29uZmxpY3QgPSB7IGVycm9yOiBlcnIsIHJ1bjogcnVuIH07XG4gICAgICAgICAgICAgICAgdmFyIGdjID0gc3RhdGUuZ2V0Q29uZmxpY3RSZXNvbHZlcnM7XG4gICAgICAgICAgICAgICAgc3RhdGUuZ2V0Q29uZmxpY3RSZXNvbHZlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdjLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocnVuKSB7IGdjW2ldLnJlc29sdmUocnVuKTsgfSBlbHNlIHsgZ2NbaV0ucmVqZWN0KGVycik7IH1cbiAgICAgICAgICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1tjaWRdKSB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1tjaWRdLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzW2NpZF07XG4gICAgICAgICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHNldHRsZWQ7XG4gICAgICAgICAgICB9KSgpYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRpZFNldHRsZSkge1xuICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGIgPSB2bS5leGVjdXRlUGVuZGluZ0pvYnMoKTtcbiAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdGVwX2NyZWF0ZWQnOlxuICAgICAgY2FzZSAnc3RlcF9zdGFydGVkJzpcbiAgICAgIGNhc2UgJ3N0ZXBfcmV0cnlpbmcnOlxuICAgICAgY2FzZSAnd2FpdF9jcmVhdGVkJzoge1xuICAgICAgICBtYXJrQ3JlYXRlZCh2bSwgY2lkSnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hvb2tfY3JlYXRlZCc6IHtcbiAgICAgICAgLy8gQ29uZmlybSBjcmVhdGlvbiBmb3IgZ2V0Q29uZmxpY3QoKSBhd2FpdGVyczogcmVzb2x2ZSB0aGVtIHdpdGhcbiAgICAgICAgLy8gbnVsbCAobm8gY29uZmxpY3QpIG9uY2UgdGhlIGV2ZW50IGxvZyBwcm92ZXMgdGhlIGhvb2sgZXhpc3RzLlxuICAgICAgICBjb25zdCBzZXR0bGVkR2V0Q29uZmxpY3QgPSB2bS5kdW1wKFxuICAgICAgICAgIHZtLmV2YWxDb2RlKFxuICAgICAgICAgICAgYChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBnbG9iYWxUaGlzLl9faG9va3MgJiYgZ2xvYmFsVGhpcy5fX2hvb2tzWyR7SlNPTi5zdHJpbmdpZnkoY2lkKX1dO1xuICAgICAgICAgICAgICBpZiAoIXN0YXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIHN0YXRlLmNyZWF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB2YXIgZ2MgPSBzdGF0ZS5nZXRDb25mbGljdFJlc29sdmVycztcbiAgICAgICAgICAgICAgc3RhdGUuZ2V0Q29uZmxpY3RSZXNvbHZlcnMgPSBbXTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnYy5sZW5ndGg7IGkrKykgZ2NbaV0ucmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGdjLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB9KSgpYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHNldHRsZWRHZXRDb25mbGljdCkge1xuICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGIgPSB2bS5leGVjdXRlUGVuZGluZ0pvYnMoKTtcbiAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdob29rX2Rpc3Bvc2VkJzoge1xuICAgICAgICAvLyBEaXNhbWJpZ3VhdGUgZnJvbSB0aGUgYGhvb2tgIHBlbmRpbmcgb3Agd2l0aCB0aGUgc2FtZVxuICAgICAgICAvLyBjb3JyZWxhdGlvbklkOiB3ZSB3YW50IHRvIG1hcmsgdGhlIGBob29rX2Rpc3Bvc2VgIGVudHJ5LlxuICAgICAgICBtYXJrQ3JlYXRlZCh2bSwgY2lkSnMsICdob29rX2Rpc3Bvc2UnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNvbHZlZDtcbn1cblxuZnVuY3Rpb24gbWFya0NyZWF0ZWQodm06IFF1aWNrSlMsIGNpZEpzOiBzdHJpbmcsIG9wVHlwZT86IHN0cmluZyk6IHZvaWQge1xuICAvLyBgY2lkSnNgIGlzIHRoZSBKU09OLnN0cmluZ2lmeS1xdW90ZWQgY29ycmVsYXRpb24gaWQgKHNlZSBwcm9jZXNzRXZlbnRzKS5cbiAgLy8gYGhvb2tgIGFuZCBgaG9va19kaXNwb3NlYCBwZW5kaW5nIG9wcyBzaGFyZSB0aGUgc2FtZSBjb3JyZWxhdGlvbklkLFxuICAvLyBzbyB3aGVuIHByb2Nlc3NpbmcgYGhvb2tfZGlzcG9zZWRgIGV2ZW50cyB3ZSBtdXN0IGRpc2FtYmlndWF0ZSBieVxuICAvLyB0eXBlOiBvdGhlcndpc2UgYC5maW5kKClgIHJldHVybnMgdGhlIG9yaWdpbmFsIGBob29rYCBvcCBhbmQgdGhlXG4gIC8vIGBob29rX2Rpc3Bvc2VgIG9wIGlzIG5ldmVyIG1hcmtlZCwgY2F1c2luZyB0aGUgZW50cnlwb2ludCB0byBrZWVwXG4gIC8vIHJldHJ5aW5nIGEgaG9va19kaXNwb3NlZCBmb3IgYW4gYWxyZWFkeS1kZWxldGVkIGVudGl0eS5cbiAgY29uc3QgcHJlZGljYXRlID0gb3BUeXBlXG4gICAgPyBgZnVuY3Rpb24ocCl7cmV0dXJuIHAuY29ycmVsYXRpb25JZD09PSR7Y2lkSnN9JiZwLnR5cGU9PT0ke0pTT04uc3RyaW5naWZ5KG9wVHlwZSl9O31gXG4gICAgOiBgZnVuY3Rpb24ocCl7cmV0dXJuIHAuY29ycmVsYXRpb25JZD09PSR7Y2lkSnN9O31gO1xuICB2bS5ldmFsQ29kZShcbiAgICBgdmFyIF9fcD1nbG9iYWxUaGlzLl9fcGVuZGluZy5maW5kKCR7cHJlZGljYXRlfSk7YCArXG4gICAgICBgaWYoX19wKV9fcC5oYXNDcmVhdGVkRXZlbnQ9dHJ1ZTtgXG4gICkuZGlzcG9zZSgpO1xufVxuXG4vLyAtLS0tIFN0YXRlIENoZWNraW5nIC0tLS1cblxuLyoqXG4gKiBDb2xsZWN0IGxlZnRvdmVyIHBlbmRpbmcgb3BlcmF0aW9ucyB0aGF0IG5lZWQgZHVyYWJsZSBzaWRlIGVmZmVjdHMgd2hlblxuICogdGhlIHdvcmtmbG93IHJlYWNoZXMgYSB0ZXJtaW5hbCBzdGF0ZS4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUnc1xuICogZHJhaW5QZW5kaW5nUXVldWVJdGVtcyAod29ya2Zsb3cudHMpOiBzdGlsbC1hbGl2ZSBzeXN0ZW0gaG9va3NcbiAqIChBYm9ydENvbnRyb2xsZXIpIHdpdGhvdXQgYW4gYWJvcnQgaW4gZmxpZ2h0IGFyZSBpbXBsaWNpdGx5IGRpc3Bvc2VkIHNvXG4gKiB0aGV5IGRvbid0IGxlYWsgaG9vayByb3dzOyBvcHMgd2l0aG91dCBjcmVhdGVkIGV2ZW50cyAoZmlyZS1hbmQtZm9yZ2V0XG4gKiBhdHRyaWJ1dGVzL2hvb2tzL3N0ZXBzL3dhaXRzKSBhbmQgcGVuZGluZyBhYm9ydCByZWNvcmRpbmdzIGFyZSBzdXJmYWNlZFxuICogZm9yIHRoZSBlbnRyeXBvaW50IHRvIGZsdXNoLlxuICovXG4vKipcbiAqIFBlci1WTSBjYWNoZSBvZiBzZXJpYWxpemVkIHBlbmRpbmctb3AgZmllbGQgYnl0ZXMsIGtleWVkXG4gKiBgY29ycmVsYXRpb25JZDpmaWVsZGAuIEEgc3RlcCdzIHJhdyBpbnB1dCBpcyBpbW11dGFibGUgb25jZSBwdXNoZWQsIHNvXG4gKiBpdHMgYnl0ZXMgYXJlIGNvbXB1dGVkIG9uY2UgZXZlbiB0aG91Z2ggdGhlIG9wIGlzIHJlLWNvbGxlY3RlZCBvbiBldmVyeVxuICogc3VzcGVuc2lvbiBpdCBzdGF5cyBwZW5kaW5nIHRocm91Z2guXG4gKi9cbi8vIHBlci1jb3B5LW9rOiBrZXllZCBvbiB0aGUgVk0gaW5zdGFuY2UsIGFuZCBhIFZNIGlzIGNyZWF0ZWQgYW5kIGRyaXZlbiBieSBvbmVcbi8vIGNvcHkuIEFub3RoZXIgY29weSBob2xkcyBubyByZWZlcmVuY2UgdG8gdGhlIGtleSwgc28gYSBzaGFyZWQgbWFwIGNvdWxkIG5ldmVyXG4vLyBiZSByZWFkIGZyb20gaXQuXG5jb25zdCBwZW5kaW5nQnl0ZUNhY2hlID0gbmV3IFdlYWtNYXA8UXVpY2tKUywgTWFwPHN0cmluZywgVWludDhBcnJheT4+KCk7XG5cbmZ1bmN0aW9uIGVuc3VyZVBlbmRpbmdCeXRlQ2FjaGUodm06IFF1aWNrSlMpOiBNYXA8c3RyaW5nLCBVaW50OEFycmF5PiB7XG4gIGxldCBjYWNoZSA9IHBlbmRpbmdCeXRlQ2FjaGUuZ2V0KHZtKTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIGNhY2hlID0gbmV3IE1hcCgpO1xuICAgIHBlbmRpbmdCeXRlQ2FjaGUuc2V0KHZtLCBjYWNoZSk7XG4gIH1cbiAgcmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIFRoZSBwZW5kaW5nLW9wIGZpZWxkcyB0aGF0IGhvbGQgUkFXIGd1ZXN0IHZhbHVlcyAodGhlIGJvb3RzdHJhcCBubyBsb25nZXJcbiAqIHNlcmlhbGl6ZXMgdGhlbSBpbiB0aGUgVk0pLiBDb2xsZWN0aW9uIHByb2plY3RzIHRoZW0gb3V0IG9mIHRoZSBkdW1wZWRcbiAqIHBsYWluIG1ldGFkYXRhIGFuZCBzZXJpYWxpemVzIGVhY2ggdGhyb3VnaCBhIGhhbmRsZSB3aXRoIHRoZSBob3N0IHNlcmRlLlxuICovXG5jb25zdCBSQVdfUEVORElOR19GSUVMRFMgPSBbJ2lucHV0JywgJ21ldGFkYXRhJywgJ2Fib3J0UGF5bG9hZCddIGFzIGNvbnN0O1xuXG4vKipcbiAqIER1bXAgYSBmaWx0ZXJlZCB2aWV3IG9mIGBnbG9iYWxUaGlzLl9fcGVuZGluZ2AgdG8gaG9zdCBQZW5kaW5nT3BlcmF0aW9uXG4gKiBvYmplY3RzLCBzZXJpYWxpemluZyB0aGUgcmF3LXZhbHVlIGZpZWxkcyBob3N0LXNpZGUuIGBmaWx0ZXJFeHByYCBpcyBhXG4gKiBndWVzdCBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBhcnJheSBvZiBvcHMgdG8gY29sbGVjdC5cbiAqL1xuZnVuY3Rpb24gZHVtcFBlbmRpbmdPcHMoXG4gIHZtOiBRdWlja0pTLFxuICBzZXJkZTogUXVpY2tKU1NlcmRlLFxuICBmaWx0ZXJFeHByOiBzdHJpbmcsXG4gIGJ5dGVDYWNoZT86IE1hcDxzdHJpbmcsIFVpbnQ4QXJyYXk+XG4pOiBQZW5kaW5nT3BlcmF0aW9uW10ge1xuICB1c2luZyBwcm9qZWN0ZWQgPSB2bS5ldmFsQ29kZShgKGZ1bmN0aW9uKCl7XG4gICAgdmFyIG9wcyA9ICR7ZmlsdGVyRXhwcn07XG4gICAgZ2xvYmFsVGhpcy5fX3Jhd0ZpZWxkcyA9IFtdO1xuICAgIC8vIFNldHRsZWQgb3BzIOKAlCBjcmVhdGVkLCByZXNvbHZlci1sZXNzLCBubyBhYm9ydCBpbiBmbGlnaHQg4oCUIGFyZVxuICAgIC8vIG5ldmVyIGNvbGxlY3RlZCBhZ2FpbiBieSBlaXRoZXIgdGhlIHN1c3BlbnNpb24gb3IgdGhlIGRyYWluXG4gICAgLy8gZmlsdGVyLCBzbyB0aGVpciBjYWNoZWQgYnl0ZXMgYXJlIGRlYWQgd2VpZ2h0OyBzdXJmYWNlIHRoZWlyIGNpZHNcbiAgICAvLyBzbyB0aGUgaG9zdCBjYW4gZXZpY3QgdGhlbSAoc2VlIHRoZSBieXRlLWNhY2hlIGV2aWN0aW9uIGJlbG93KS5cbiAgICB2YXIgc2V0dGxlZCA9IFtdO1xuICAgIGdsb2JhbFRoaXMuX19wZW5kaW5nLmZvckVhY2goZnVuY3Rpb24ocCl7XG4gICAgICBpZiAocC5oYXNDcmVhdGVkRXZlbnQgJiYgIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbcC5jb3JyZWxhdGlvbklkXSAmJiAhcC5hYm9ydFJlcXVlc3RlZCkge1xuICAgICAgICBzZXR0bGVkLnB1c2gocC5jb3JyZWxhdGlvbklkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4geyBzZXR0bGVkOiBzZXR0bGVkLCBvcHM6IG9wcy5tYXAoZnVuY3Rpb24ocCl7XG4gICAgICB2YXIgcSA9IHt9O1xuICAgICAgZm9yICh2YXIgayBpbiBwKSB7XG4gICAgICAgIGlmIChrID09PSAnaW5wdXQnIHx8IGsgPT09ICdtZXRhZGF0YScgfHwgayA9PT0gJ2Fib3J0UGF5bG9hZCcpIGNvbnRpbnVlO1xuICAgICAgICBxW2tdID0gcFtrXTtcbiAgICAgIH1cbiAgICAgIHZhciByYXcgPSB7fTtcbiAgICAgIFsnaW5wdXQnLCAnbWV0YWRhdGEnLCAnYWJvcnRQYXlsb2FkJ10uZm9yRWFjaChmdW5jdGlvbihmKXtcbiAgICAgICAgaWYgKHBbZl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJhd1tmXSA9IGdsb2JhbFRoaXMuX19yYXdGaWVsZHMubGVuZ3RoO1xuICAgICAgICAgIGdsb2JhbFRoaXMuX19yYXdGaWVsZHMucHVzaChwW2ZdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBxLl9fcmF3SW5kaWNlcyA9IHJhdztcbiAgICAgIHJldHVybiBxO1xuICAgIH0pIH07XG4gIH0pKClgKTtcbiAgY29uc3QgZHVtcGVkID0gdm0uZHVtcChwcm9qZWN0ZWQpIGFzIHtcbiAgICBzZXR0bGVkOiBzdHJpbmdbXTtcbiAgICBvcHM6IChQZW5kaW5nT3BlcmF0aW9uICYge1xuICAgICAgX19yYXdJbmRpY2VzPzogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICB9KVtdO1xuICB9O1xuICBjb25zdCBwbGFpbk9wcyA9IGR1bXBlZC5vcHM7XG4gIC8vIEJ5dGUtY2FjaGUgZXZpY3Rpb246IGVudHJpZXMgZm9yIHNldHRsZWQgb3BzIGNhbiBuZXZlciBiZSByZWFkIGFnYWluXG4gIC8vIChuZWl0aGVyIGNvbGxlY3Rpb24gZmlsdGVyIG1hdGNoZXMgYSBzZXR0bGVkIG9wKSwgc28gZHJvcHBpbmcgdGhlbVxuICAvLyBib3VuZHMgdGhlIGNhY2hlIGJ5IHRoZSBMSVZFIHBlbmRpbmcgc2V0IGluc3RlYWQgb2YgZ3Jvd2luZ1xuICAvLyBtb25vdG9uaWNhbGx5IGZvciB0aGUgVk0ncyBsaWZldGltZSwgd2hpY2ggbWF0dGVycyBmb3IgdGhlIGlubGluZVxuICAvLyBsb29wJ3MgbG9uZy1saXZlZCBzZXNzaW9ucyBhbmQgc25hcHNob3QtcmVzdG9yZWQgVk1zLlxuICBpZiAoYnl0ZUNhY2hlICYmIGR1bXBlZC5zZXR0bGVkLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IGNpZCBvZiBkdW1wZWQuc2V0dGxlZCkge1xuICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBSQVdfUEVORElOR19GSUVMRFMpIHtcbiAgICAgICAgYnl0ZUNhY2hlLmRlbGV0ZShgJHtjaWR9OiR7ZmllbGR9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHVzaW5nIHJhd0ZpZWxkcyA9IHZtLmV2YWxDb2RlKCdnbG9iYWxUaGlzLl9fcmF3RmllbGRzJyk7XG4gIGZvciAoY29uc3Qgb3Agb2YgcGxhaW5PcHMpIHtcbiAgICBjb25zdCByYXdJbmRpY2VzID0gb3AuX19yYXdJbmRpY2VzID8/IHt9O1xuICAgIGRlbGV0ZSBvcC5fX3Jhd0luZGljZXM7XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBSQVdfUEVORElOR19GSUVMRFMpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcmF3SW5kaWNlc1tmaWVsZF07XG4gICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IGAke29wLmNvcnJlbGF0aW9uSWR9OiR7ZmllbGR9YDtcbiAgICAgIGxldCBieXRlcyA9IGJ5dGVDYWNoZT8uZ2V0KGNhY2hlS2V5KTtcbiAgICAgIGlmICghYnl0ZXMpIHtcbiAgICAgICAgdXNpbmcgdmFsdWVIYW5kbGUgPSByYXdGaWVsZHMuZ2V0UHJvcChTdHJpbmcoaW5kZXgpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBieXRlcyA9IHNlcmRlLnNlcmlhbGl6ZSh2YWx1ZUhhbmRsZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIEEgc3RlcCBpbnB1dCB0aGF0IHJlZnVzZXMgdG8gc2VyaWFsaXplIGlzIGEgZGV0ZXJtaW5pc3RpYyB1c2VyXG4gICAgICAgICAgLy8gZXJyb3I6IGZhaWxpbmcgdGhlIHdob2xlIGNvbGxlY3Rpb24gaGVyZSB3b3VsZCBmYWlsIHRoZSBydW5cbiAgICAgICAgICAvLyBmcm9tIHRoZSBvdXRzaWRlLCB3aGVyZSBubyB3b3JrZmxvdyBjb2RlIGNhbiBvYnNlcnZlIGl0IChhbmRcbiAgICAgICAgICAvLyB3aXRoIGEgYmFyZSBEZXZhbHVlRXJyb3IgaW5zdGVhZCBvZiB0aGUgZnJhbWVkIG1lc3NhZ2UgdGhlXG4gICAgICAgICAgLy8gbm9kZTp2bSBlbmdpbmUgcHJvZHVjZXMpLiBSZWZyYW1lIGl0IGV4YWN0bHkgbGlrZVxuICAgICAgICAgIC8vIGBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzYCBkb2VzIGFuZCBzdXJmYWNlIGl0IG9uIHRoZSBvcDogdGhlXG4gICAgICAgICAgLy8gZW50cnlwb2ludCBmaW5hbGl6ZXMgdGhlIHN0ZXAgYXMgc3RlcF9jcmVhdGVkICsgc3RlcF9mYWlsZWQgc29cbiAgICAgICAgICAvLyB0aGUgZmFpbHVyZSByZWplY3RzIGludG8gdGhlIHdvcmtmbG93LCBjYXRjaGFibGUuIE90aGVyIHJhd1xuICAgICAgICAgIC8vIGZpZWxkcyAoaG9vayBtZXRhZGF0YSwgYWJvcnQgcGF5bG9hZHMpIGtlZXAgdGhlIHRocm93aW5nXG4gICAgICAgICAgLy8gYmVoYXZpb3IsIG1hdGNoaW5nIHRoZSBub2RlOnZtIGVuZ2luZSdzIHNjb3BlLlxuICAgICAgICAgIGlmIChvcC50eXBlID09PSAnc3RlcCcgJiYgZmllbGQgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgICAnc3RlcCBhcmd1bWVudHMnLFxuICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAob3AgYXMgUGVuZGluZ1N0ZXApLnNlcmlhbGl6YXRpb25FcnJvciA9IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgIHsgaGludCwgY2F1c2U6IGVyciB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICBieXRlQ2FjaGU/LnNldChjYWNoZUtleSwgYnl0ZXMpO1xuICAgICAgfVxuICAgICAgKG9wIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2ZpZWxkXSA9IGJ5dGVzO1xuICAgIH1cbiAgfVxuICB2bS5ldmFsQ29kZSgnZGVsZXRlIGdsb2JhbFRoaXMuX19yYXdGaWVsZHMnKS5kaXNwb3NlKCk7XG4gIHJldHVybiBwbGFpbk9wcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdERyYWluT3BlcmF0aW9ucyhcbiAgdm06IFF1aWNrSlMsXG4gIHNlcmRlOiBRdWlja0pTU2VyZGVcbik6IFBlbmRpbmdPcGVyYXRpb25bXSB7XG4gIC8vIFNoYXJlIHRoZSBwZXItVk0gYnl0ZSBjYWNoZSB3aXRoIHRoZSBzdXNwZW5zaW9uIHBhdGg6IGFuIG9wIHRoYXQgd2FzXG4gIC8vIHNlcmlhbGl6ZWQgZHVyaW5nIGEgc3VzcGVuc2lvbiBwYXNzIG11c3QgcmV1c2UgdGhvc2UgZXhhY3QgYnl0ZXMgYXRcbiAgLy8gdGVybWluYWwgZHJhaW4sIHNpbmNlIHJlLXNlcmlhbGl6aW5nIGNhbiBpbnZva2UgZ2V0dGVycyBhZ2FpbiBhbmQgcHJvZHVjZVxuICAvLyBhIERJRkZFUkVOVCBieXRlIHNlcXVlbmNlIGZvciB3aGF0IHRoZSBldmVudCBsb2cgdHJlYXRzIGFzIG9uZSB2YWx1ZS5cbiAgcmV0dXJuIGR1bXBQZW5kaW5nT3BzKFxuICAgIHZtLFxuICAgIHNlcmRlLFxuICAgIGAoZnVuY3Rpb24oKXtcbiAgICB2YXIgdG9EaXNwb3NlID0gW107XG4gICAgZ2xvYmFsVGhpcy5fX3BlbmRpbmcuZm9yRWFjaChmdW5jdGlvbihwKXtcbiAgICAgIGlmIChwLnR5cGUgPT09IFwiaG9va1wiICYmIHAuaXNTeXN0ZW0gJiYgIXAuYWJvcnRSZXF1ZXN0ZWQgJiYgIXAuZGlzcG9zZWQpIHtcbiAgICAgICAgcC5kaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIC8vIE9ubHkgZGlzcG9zZSBob29rcyB0aGF0IHdlcmUgZHVyYWJseSBjcmVhdGVkOyBhIGhvb2sgdGhhdCBuZXZlclxuICAgICAgICAvLyByZWFjaGVkIHN0b3JhZ2UgaGFzIG5vdGhpbmcgdG8gY2xlYW4gdXAuXG4gICAgICAgIGlmIChwLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgICAgIHRvRGlzcG9zZS5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwiaG9va19kaXNwb3NlXCIsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICBoYXNDcmVhdGVkRXZlbnQ6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgdG9EaXNwb3NlLmZvckVhY2goZnVuY3Rpb24oZCl7IGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goZCk7IH0pO1xuICAgIHJldHVybiBnbG9iYWxUaGlzLl9fcGVuZGluZy5maWx0ZXIoZnVuY3Rpb24ocCl7XG4gICAgICBpZiAocC5hYm9ydFJlcXVlc3RlZCkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAocC5oYXNDcmVhdGVkRXZlbnQpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIFNraXAgc3lzdGVtIGhvb2tzIHRoYXQgd2VyZSBkaXNwb3NlZCBiZWZvcmUgZXZlciBiZWluZyBjcmVhdGVkLlxuICAgICAgaWYgKHAudHlwZSA9PT0gXCJob29rXCIgJiYgcC5kaXNwb3NlZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0pKClgLFxuICAgIGVuc3VyZVBlbmRpbmdCeXRlQ2FjaGUodm0pXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrV29ya2Zsb3dTdGF0ZShcbiAgdm06IFF1aWNrSlMsXG4gIHNlcmRlOiBRdWlja0pTU2VyZGUsXG4gIG9wdHM6IHsga2VlcEFsaXZlT25TdXNwZW5kPzogYm9vbGVhbiB9ID0ge31cbik6IFF1aWNrSlNSdW50aW1lUmVzdWx0IHtcbiAgLy8gQ2hlY2sgY29tcGxldGVkOiBfX3dvcmtmbG93UmVzdWx0IGhvbGRzIHRoZSBSQVcgcmV0dXJuIHZhbHVlICh3aXRoIGFcbiAgLy8gc2VwYXJhdGUgZG9uZSBmbGFnIHNvIGB1bmRlZmluZWRgIHJlc3VsdHMgYXJlIGRpc3Rpbmd1aXNoYWJsZSk7IHRoZVxuICAvLyBob3N0IHNlcmlhbGl6ZXMgaXQgdGhyb3VnaCBhIGhhbmRsZS5cbiAge1xuICAgIHVzaW5nIGRvbmUgPSB2bS5ldmFsQ29kZSgnZ2xvYmFsVGhpcy5fX3dvcmtmbG93RG9uZSA9PT0gdHJ1ZScpO1xuICAgIGlmIChkb25lLnRvQm9vbGVhbigpKSB7XG4gICAgICB1c2luZyBoID0gdm0uZXZhbENvZGUoJ2dsb2JhbFRoaXMuX193b3JrZmxvd1Jlc3VsdCcpO1xuICAgICAgY29uc3QgcmVzdWx0Qnl0ZXMgPSBzZXJkZS5zZXJpYWxpemUoaCk7XG4gICAgICBjb25zdCBkcmFpbk9wZXJhdGlvbnMgPSBjb2xsZWN0RHJhaW5PcGVyYXRpb25zKHZtLCBzZXJkZSk7XG4gICAgICB2bS5kaXNwb3NlKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21wbGV0ZWQ6IHtcbiAgICAgICAgICByZXN1bHQ6IHJlc3VsdEJ5dGVzLFxuICAgICAgICAgIC4uLihkcmFpbk9wZXJhdGlvbnMubGVuZ3RoID4gMCA/IHsgZHJhaW5PcGVyYXRpb25zIH0gOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGZhaWxlZFxuICB7XG4gICAgdXNpbmcgaCA9IHZtLmV2YWxDb2RlKCdnbG9iYWxUaGlzLl9fd29ya2Zsb3dFcnJvcicpO1xuICAgIGlmICghaC5pc1VuZGVmaW5lZCkge1xuICAgICAgLy8gVGhlIGRpc3BsYXkgZmllbGRzIGFyZSBwbGFpbiBzdHJpbmdzOyB0aGUgdGhyb3duIHZhbHVlIGl0c2VsZiBpc1xuICAgICAgLy8gUkFXIGFuZCBzZXJpYWxpemVkIGhvc3Qtc2lkZSB0aHJvdWdoIGEgaGFuZGxlLlxuICAgICAgY29uc3QgZXJyb3JPYmogPSBoLmlzU3RyaW5nXG4gICAgICAgID8gKGgudG9TdHJpbmcoKSBhcyBzdHJpbmcpXG4gICAgICAgIDogKCgpID0+IHtcbiAgICAgICAgICAgIHVzaW5nIHBsYWluID0gdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgICcoZnVuY3Rpb24oZSl7cmV0dXJuIHttZXNzYWdlOiBlLm1lc3NhZ2UsIHN0YWNrOiBlLnN0YWNrLCBuYW1lOiBlLm5hbWV9O30pKGdsb2JhbFRoaXMuX193b3JrZmxvd0Vycm9yKSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gdm0uZHVtcChwbGFpbikgYXMge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgICAgICAgICAgIHN0YWNrPzogc3RyaW5nO1xuICAgICAgICAgICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSgpO1xuICAgICAgbGV0IHZhbHVlQnl0ZXM6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWguaXNTdHJpbmcpIHtcbiAgICAgICAgdXNpbmcgcmF3VmFsdWUgPSBoLmdldFByb3AoJ3ZhbHVlJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFsdWVCeXRlcyA9IHNlcmRlLnNlcmlhbGl6ZShyYXdWYWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKHNlcmlhbGl6ZUVycikge1xuICAgICAgICAgIC8vIEEgdGhyb3duIHZhbHVlIHRoZSBjb2RlYyBjYW5ub3Qgc2VyaWFsaXplIG11c3Qgbm90IG1hc2sgdGhlXG4gICAgICAgICAgLy8gd29ya2Zsb3cgZmFpbHVyZSBpdHNlbGYsIHNvIGZhbGwgYmFjayB0byB0aGUgZGlzcGxheSBmaWVsZHMuXG4gICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgJ1F1aWNrSlMgcnVudGltZTogZmFpbGVkIHRvIHNlcmlhbGl6ZSB0aHJvd24gd29ya2Zsb3cgZXJyb3InLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICA/IHNlcmlhbGl6ZUVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICA6IFN0cmluZyhzZXJpYWxpemVFcnIpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGZhaWxlZCA9XG4gICAgICAgIHR5cGVvZiBlcnJvck9iaiA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHsgbWVzc2FnZTogZXJyb3JPYmogfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvck9iai5tZXNzYWdlLFxuICAgICAgICAgICAgICBzdGFjazogZXJyb3JPYmouc3RhY2sgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBuYW1lOiBlcnJvck9iai5uYW1lIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdmFsdWVCeXRlcyxcbiAgICAgICAgICAgIH07XG4gICAgICBydW50aW1lTG9nZ2VyLmVycm9yKCdRdWlja0pTIHJ1bnRpbWU6IHdvcmtmbG93IGZhaWxlZCBpbiBWTScsIHtcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBmYWlsZWQubWVzc2FnZSxcbiAgICAgICAgZXJyb3JOYW1lOiBmYWlsZWQubmFtZSxcbiAgICAgICAgZXJyb3JTdGFjazogZmFpbGVkLnN0YWNrLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkcmFpbk9wZXJhdGlvbnMgPSBjb2xsZWN0RHJhaW5PcGVyYXRpb25zKHZtLCBzZXJkZSk7XG4gICAgICB2bS5kaXNwb3NlKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmYWlsZWQ6IHtcbiAgICAgICAgICAuLi5mYWlsZWQsXG4gICAgICAgICAgLi4uKGRyYWluT3BlcmF0aW9ucy5sZW5ndGggPiAwID8geyBkcmFpbk9wZXJhdGlvbnMgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgc3VzcGVuZGVkOiB0aGUgd29ya2Zsb3cgaXMgc3VzcGVuZGVkIGlmIHRoZXJlIGFyZSBhY3RpdmUgcmVzb2x2ZXJzXG4gIC8vIE9SIHBlbmRpbmcgb3BlcmF0aW9ucyB0aGF0IGhhdmVuJ3QgYmVlbiBjcmVhdGVkIHlldCAoZS5nLiBob29rcyBjcmVhdGVkXG4gIC8vIHVwZnJvbnQgYnV0IG5vdCB5ZXQgYXdhaXRlZClcbiAge1xuICAgIHVzaW5nIGggPSB2bS5ldmFsQ29kZShcbiAgICAgICdPYmplY3Qua2V5cyhnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzKS5sZW5ndGggPiAwIHx8IGdsb2JhbFRoaXMuX19wZW5kaW5nLnNvbWUoZnVuY3Rpb24ocCl7cmV0dXJuIXAuaGFzQ3JlYXRlZEV2ZW50O30pJ1xuICAgICk7XG4gICAgaWYgKHZtLmR1bXAoaCkpIHtcbiAgICAgIC8vIE9wcyB3aXRoIGFuIGFjdGl2ZSByZXNvbHZlciBvciB3aXRob3V0IGEgY3JlYXRlZCBldmVudCBhcmVcbiAgICAgIC8vIHBlbmRpbmc7IGFib3J0LXJlcXVlc3RlZCBob29rcyBhcmUgYWxzbyBzdXJmYWNlZCAoZXZlbiB3aGVuXG4gICAgICAvLyBhbHJlYWR5IGNyZWF0ZWQgYW5kIHVuYXdhaXRlZCkgc28gdGhlIGhvc3QgcmVjb3JkcyB0aGUgYWJvcnQuXG4gICAgICBjb25zdCBwZW5kaW5nT3BzID0gZHVtcFBlbmRpbmdPcHMoXG4gICAgICAgIHZtLFxuICAgICAgICBzZXJkZSxcbiAgICAgICAgYGdsb2JhbFRoaXMuX19wZW5kaW5nLmZpbHRlcihmdW5jdGlvbihwKXtyZXR1cm4hIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbcC5jb3JyZWxhdGlvbklkXSB8fCAhcC5oYXNDcmVhdGVkRXZlbnQgfHwgcC5hYm9ydFJlcXVlc3RlZDt9KWAsXG4gICAgICAgIGVuc3VyZVBlbmRpbmdCeXRlQ2FjaGUodm0pXG4gICAgICApO1xuICAgICAgaWYgKCFvcHRzLmtlZXBBbGl2ZU9uU3VzcGVuZCkgdm0uZGlzcG9zZSgpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdXNwZW5kZWQ6IHtcbiAgICAgICAgICBwZW5kaW5nT3BlcmF0aW9uczogcGVuZGluZ09wcyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdm0uZGlzcG9zZSgpO1xuICByZXR1cm4geyBmYWlsZWQ6IHsgbWVzc2FnZTogJ1dvcmtmbG93IGVuZGVkIGluIHVua25vd24gc3RhdGUnIH0gfTtcbn1cblxuLy8gLS0tLSBIZWxwZXJzIC0tLS1cblxuZnVuY3Rpb24gZXh0cmFjdEVycm9yKFxuICB2bTogUXVpY2tKUyxcbiAgZXJyOiB1bmtub3duLFxuICBmYWxsYmFja01lc3NhZ2U6IHN0cmluZ1xuKTogUXVpY2tKU1J1bnRpbWVSZXN1bHQge1xuICBsZXQgbWVzc2FnZSA9IGZhbGxiYWNrTWVzc2FnZTtcbiAgbGV0IHN0YWNrOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKGVyciBpbnN0YW5jZW9mIEpTRXhjZXB0aW9uKSB7XG4gICAgY29uc3QgZXJyb3IgPSB2bS5kdW1wKGVyci5oYW5kbGUpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDtcbiAgICBlcnIuaGFuZGxlLmRpc3Bvc2UoKTtcbiAgICBtZXNzYWdlID0gKGVycm9yPy5tZXNzYWdlIGFzIHN0cmluZykgPz8gZXJyLm1lc3NhZ2UgPz8gZmFsbGJhY2tNZXNzYWdlO1xuICAgIHN0YWNrID0gKGVycm9yPy5zdGFjayBhcyBzdHJpbmcpID8/IGVyci5zdGFjaztcbiAgICBuYW1lID0gKGVycm9yPy5uYW1lIGFzIHN0cmluZykgPz8gZXJyLm5hbWU7XG4gIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBtZXNzYWdlID0gZXJyLm1lc3NhZ2UgPz8gZmFsbGJhY2tNZXNzYWdlO1xuICAgIHN0YWNrID0gZXJyLnN0YWNrO1xuICAgIG5hbWUgPSBlcnIubmFtZTtcbiAgfVxuXG4gIHZtLmRpc3Bvc2UoKTtcbiAgcmV0dXJuIHtcbiAgICBmYWlsZWQ6IHsgbWVzc2FnZSwgc3RhY2ssIG5hbWUgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBNdXRhYmxlIGludGVycnVwdCBidWRnZXQgZm9yIGEgVk0uIFF1aWNrSlMgcG9sbHMgdGhlIGludGVycnVwdCBoYW5kbGVyXG4gKiBkdXJpbmcgSlMgZXhlY3V0aW9uOyB3aGVuIGl0IHJldHVybnMgdHJ1ZSwgZXhlY3V0aW9uIGFib3J0cy4gVGhlIGJ1ZGdldFxuICogYm91bmRzIGEgc2luZ2xlIGhvc3QtPlZNIGV4ZWN1dGlvbiBidXJzdCAoYnVuZGxlIGV2YWwgKyBldmVudFxuICogcHJvY2Vzc2luZyksIG5vdCB0b3RhbCBWTSBsaWZldGltZTogdGhlIGlubGluZS1zdGVwIGxvb3Aga2VlcHMgYSBWTVxuICogYWxpdmUgYWNyb3NzIHN0ZXAgZXhlY3V0aW9ucyB0aGF0IGNhbiBsZWdpdGltYXRlbHkgdGFrZSBtaW51dGVzLCBzbyB0aGVcbiAqIGhvc3QgcmVzZXRzIHRoZSBidWRnZXQgYmVmb3JlIGVhY2ggcmUtZW50cnkgKHNlZSByZXNldEJ1ZGdldCBjYWxscykuXG4gKlxuICogVGhlIHBlci1idXJzdCBjZWlsaW5nIGlzIHRoZSBzYW1lIGNvbmZpZ3VyYWJsZSBidWRnZXQgYXMgdGhlIG5vZGVcbiAqIGVuZ2luZSdzIFJlcGxheUJ1ZGdldCAoUkVQTEFZX1RJTUVPVVRfTVMsIGRlZmF1bHQgMjQwcyk6IGEgd29ya2Zsb3dcbiAqIHdob3NlIHJlcGxheSB0aGUgbm9kZSBlbmdpbmUgaGFuZGxlcyBmaW5lIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGhlcmVcbiAqIGJ5IGEgbG93ZXIgaGFyZGNvZGVkIGNlaWxpbmcuIFRoZSBpbnRlcnJ1cHQgZXJyb3IgZXNjYXBlc1xuICogcnVuUXVpY2tKU1dvcmtmbG93IGFuZCByZWFjaGVzIHRoZSByZXBsYXkgbG9vcCdzIGNhdGNoIGluIHJ1bnRpbWUudHMsXG4gKiB3aGljaCByZWNvcmRzIHJ1bl9mYWlsZWQuXG4gKi9cbmludGVyZmFjZSBJbnRlcnJ1cHRCdWRnZXQge1xuICBzdGFydDogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVJbnRlcnJ1cHRIYW5kbGVyKGJ1ZGdldDogSW50ZXJydXB0QnVkZ2V0KTogKCkgPT4gYm9vbGVhbiB7XG4gIGNvbnN0IHRpbWVvdXQgPSBnZXRSZXBsYXlUaW1lb3V0TXMoKTtcbiAgcmV0dXJuICgpID0+IERhdGUubm93KCkgLSBidWRnZXQuc3RhcnQgPiB0aW1lb3V0O1xufVxuIl19
2427
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2tqcy1ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvcXVpY2tqcy1ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUVMLGlCQUFpQixHQUlsQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sRUFFTCxXQUFXLEVBQ1gsT0FBTyxHQUdSLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsZ0NBQWdDLEdBQ2pDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9FLE9BQU8sRUFDTCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixlQUFlLEdBRWhCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGNB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ZSxDQUFDO0lBQzlCLElBQUksS0FBeUIsQ0FBQztJQUM5QixJQUFJLElBQXdCLENBQUM7SUFFN0IsSUFBSSxHQUFHLFlBQVksV0FBVyxFQUFFLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFtQyxDQUFDO1FBQ3BFLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckIsT0FBTyxHQUFJLEtBQUssRUFBRSxPQUFrQixJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDO1FBQ3ZFLEtBQUssR0FBSSxLQUFLLEVBQUUsS0FBZ0IsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQzlDLElBQUksR0FBSSxLQUFLLEVBQUUsSUFBZSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUM7SUFDN0MsQ0FBQztTQUFNLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRSxDQUFDO1FBQ2hDLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxJQUFJLGVBQWUsQ0FBQztRQUN6QyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUNsQixJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztJQUNsQixDQUFDO0lBRUQsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2IsT0FBTztRQUNMLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0tBQ2pDLENBQUM7QUFDSixDQUFDO0FBcUJELFNBQVMsc0JBQXNCLENBQUMsTUFBdUI7SUFDckQsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztJQUNyQyxPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBRdWlja0pTIFdlYkFzc2VtYmx5IChXQVNNKSB3b3JrZmxvdyBWTS5cbiAqXG4gKiBBbiBhbHRlcm5hdGl2ZSBlbmdpbmUgZm9yIHRoZSBldmVudC1yZXBsYXkgZXhlY3V0aW9uIG1vZGVsOiB0aGUgd29ya2Zsb3dcbiAqIGNvZGUgcnVucyBpbnNpZGUgYSBRdWlja0pTIFdBU00gVk0gKHZpYSBxdWlja2pzLXdhc2kpIGluc3RlYWQgb2YgYVxuICogYG5vZGU6dm1gIGNvbnRleHQuIEV2ZXJ5IGludm9jYXRpb24gY3JlYXRlcyBhIGZyZXNoIFZNLCByZS1leGVjdXRlcyB0aGVcbiAqIHdvcmtmbG93IGZ1bmN0aW9uIGZyb20gdGhlIHRvcCwgYW5kIHJlcGxheXMgdGhlIHJlY29yZGVkIGV2ZW50IGxvZyB0b1xuICogcmVzb2x2ZSBhd2FpdGVkIHByaW1pdGl2ZXM6IHRoZSBzYW1lIHJlcGxheSBzZW1hbnRpY3MgYXMgdGhlIGBub2RlOnZtYFxuICogZW5naW5lLlxuICpcbiAqIFRoZSB3b3JrZmxvdyBwcmltaXRpdmVzICh1c2VTdGVwLCBzbGVlcCwgY3JlYXRlSG9vaykgYXJlIGltcGxlbWVudGVkIGFzXG4gKiBKYXZhU2NyaXB0IGNvZGUgcnVubmluZyBpbnNpZGUgdGhlIFF1aWNrSlMgVk0uIFRoZSBob3N0IGNvbW11bmljYXRlcyB3aXRoXG4gKiB0aGUgVk0gYnkgZXZhbHVhdGluZyBzbWFsbCBKUyBzbmlwcGV0cyB0byByZWFkIHBlbmRpbmcgb3BlcmF0aW9ucyBhbmRcbiAqIHJlc29sdmUvcmVqZWN0IHByb21pc2VzLlxuICpcbiAqIFRoZSBWTSBib290c3RyYXAgaXMgZGVsaWJlcmF0ZWx5IHNwbGl0IGludG8gdHdvIHBoYXNlczpcbiAqICAgMS4gU3RhdGljIGluaXRpYWxpemF0aW9uIChgaW5pdFdvcmtmbG93Vk1gKTogcnVuLWluZGVwZW5kZW50IHNldHVwOlxuICogICAgICBWTSBjcmVhdGlvbiBhbmQgdGhlIHdvcmtmbG93IHByaW1pdGl2ZXMuIChTZXJpYWxpemF0aW9uIGxpdmVzIG9uXG4gKiAgICAgIHRoZSBob3N0IChzZWUgcXVpY2tqcy1zZXJkZS50cykgc28gbm8gc2VyZGUgY29kZSBpcyBldmFsdWF0ZWRcbiAqICAgICAgaW4gdGhlIFZNLilcbiAqICAgMi4gUGVyLXJ1biBpbml0aWFsaXphdGlvbiAoaW5saW5lIGluIGBydW5RdWlja0pTV29ya2Zsb3dgKTogc2VlZGVkXG4gKiAgICAgIFBSTkcvVUxJRCBob3N0IGZ1bmN0aW9ucywgd29ya2Zsb3cgYnVuZGxlIGV2YWx1YXRpb24sIHJ1biBtZXRhZGF0YSxcbiAqICAgICAgd29ya2Zsb3cgaW5wdXQsIGFuZCBzdGFydC5cbiAqIEtlZXBpbmcgdGhlIHBoYXNlcyBzZXBhcmF0ZSBpcyBncm91bmR3b3JrIGZvciBWTS1tZW1vcnkgc25hcHNob3R0aW5nOlxuICogYSBmb2xsb3ctdXAgY2FuIHBlcnNpc3QvcmVzdG9yZSB0aGUgVk0gYXQgdGhlIHBoYXNlIGJvdW5kYXJ5IChlLmcuIGFcbiAqIGJ1aWxkLXRpbWUgaW5pdGlhbCBzbmFwc2hvdCkgd2l0aG91dCByZXN0cnVjdHVyaW5nIHRoaXMgbW9kdWxlLiBOb3RlXG4gKiB0aGF0IGJ1bmRsZSBldmFsdWF0aW9uIGN1cnJlbnRseSBzaXRzIGluIHRoZSBwZXItcnVuIHBoYXNlIHNvIHRoYXRcbiAqIG1vZHVsZS1zY29wZSB1c2VyIGNvZGUgb2JzZXJ2ZXMgdGhlIHNlZWRlZCBgTWF0aC5yYW5kb21gLCBtYXRjaGluZyB0aGVcbiAqIGBub2RlOnZtYCBlbmdpbmUncyByZXBsYXkgZGV0ZXJtaW5pc20uXG4gKi9cblxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBnbG9iYWxTaW5nbGV0b24gfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHtcbiAgdHlwZSBFdmVudCxcbiAgaXNTZWFsZWROb29wRXZlbnQsXG4gIHR5cGUgUnVuSW5wdXQsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG4gIHR5cGUgV29ybGRDYXBhYmlsaXRpZXMsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgKiBhcyBuYW5vaWQgZnJvbSAnbmFub2lkJztcbmltcG9ydCB7XG4gIHR5cGUgRXh0ZW5zaW9uRGVzY3JpcHRvcixcbiAgSlNFeGNlcHRpb24sXG4gIFF1aWNrSlMsXG4gIHR5cGUgU25hcHNob3QsXG4gIHR5cGUgV2FzaU9wdGlvbnMsXG59IGZyb20gJ3F1aWNranMtd2FzaSc7XG5pbXBvcnQgc2VlZHJhbmRvbSBmcm9tICdzZWVkcmFuZG9tJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZGVjb21wcmVzcyB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24vY29tcHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgeyBEZWNyeXB0aW9uS2V5IH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IGRlY3J5cHQgfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi9lcnJvcnMuanMnO1xuaW1wb3J0IHtcbiAgZ2V0UmVwbGF5VGltZW91dE1zLFxuICBpc1F1aWNrSlNCYXNlbGluZVNuYXBzaG90RW5hYmxlZCxcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgcXVpY2tqc0V4dGVuc2lvbnMsIHF1aWNranNXYXNtIH0gZnJvbSAnLi9xdWlja2pzLWFzc2V0cy5nZW5lcmF0ZWQuanMnO1xuaW1wb3J0IHtcbiAgYWRvcHRTZXJkZVJvb3QsXG4gIGNhcHR1cmVTZXJkZVJvb3QsXG4gIGNyZWF0ZVF1aWNrSlNTZXJkZSxcbiAgZXhwb3J0U2VyZGVSb290LFxuICB0eXBlIFF1aWNrSlNTZXJkZSxcbn0gZnJvbSAnLi9xdWlja2pzLXNlcmRlLmpzJztcbmltcG9ydCB7IHJ1bklkQ3JlYXRlZEF0IH0gZnJvbSAnLi9ydW4taWQtdGltZS5qcyc7XG5cbi8vIC0tLS0gSG9zdCAtPiBWTSBwYXlsb2FkIHByZXBhcmF0aW9uIC0tLS1cblxuLyoqXG4gKiBQcmVwYXJlIHBlcnNpc3RlZCBwYXlsb2FkIGJ5dGVzIGZvciBjb25zdW1wdGlvbiBpbnNpZGUgdGhlIFZNOiBkZWNyeXB0XG4gKiAod2hlbiBhbiBlbmNyeXB0aW9uIGtleSBpcyBjb25maWd1cmVkKSBhbmQgZGVjb21wcmVzcyAoc3BlY1ZlcnNpb24gPj0gNVxuICogcGF5bG9hZHMgbWF5IGJlIGd6aXAvenN0ZC1jb21wcmVzc2VkKS4gVGhlIFZNIG9ubHkgdW5kZXJzdGFuZHMgcGxhaW5cbiAqIGZvcm1hdC1wcmVmaXhlZCAnZGV2bCcgYnl0ZXM6IGl0IGhhcyBuZWl0aGVyIHRoZSBrZXkgbWF0ZXJpYWwgbm9yIHpsaWIuXG4gKiBUaGUga2V5IGlzIHRoZSBydW4ncyBmdWxsIERlY3J5cHRpb25LZXkgY2FwYWJpbGl0eSAoc3ltbWV0cmljIEFFUyBrZXkgK1xuICogWDI1NTE5IGtleXBhaXIpIHNvIHNlYWxlZCBgZW5jcGAgaG9vayBwYXlsb2FkcyBmcm9tIGNyb3NzLWRlcGxveW1lbnRcbiAqIHJlc3VtZUhvb2soKSBjYWxscyBvcGVuIGhlcmUgdG9vLCBub3QganVzdCBzeW1tZXRyaWMgYGVuY3JgIG9uZXMuXG4gKiBCb3RoIHN0YWdlcyBhcmUgZm9ybWF0LXByZWZpeCBkaXNwYXRjaGVkLCBzbyBwbGFpbnRleHQvdW5jb21wcmVzc2VkXG4gKiBkYXRhIHBhc3NlcyB0aHJvdWdoIHVuY2hhbmdlZC4gTWlycm9ycyBgcHJlcGFyZVJlcGxheVBheWxvYWRgIGluXG4gKiBzZXJpYWxpemF0aW9uLnRzICh0aGUgbm9kZTp2bSBlbmdpbmUncyBlcXVpdmFsZW50IGhvc3Qtc2lkZSBzdGFnZSkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVCeXRlc0ZvclZNKFxuICBkYXRhOiBVaW50OEFycmF5LFxuICBrZXk/OiBEZWNyeXB0aW9uS2V5XG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgcmV0dXJuIChhd2FpdCBkZWNvbXByZXNzKGF3YWl0IGRlY3J5cHQoZGF0YSwga2V5KSkpIGFzIFVpbnQ4QXJyYXk7XG59XG5cbi8vIC0tLS0gVHlwZXMgLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlbmRpbmdTdGVwIHtcbiAgdHlwZTogJ3N0ZXAnO1xuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gIHN0ZXBJZDogc3RyaW5nO1xuICAvKipcbiAgICogRm9ybWF0LXByZWZpeGVkIGRldmFsdWUtc2VyaWFsaXplZCBzdGVwIGlucHV0IChhcmdzICsgY2xvc3VyZVZhcnMpLlxuICAgKiBBYnNlbnQgd2hlbiB7QGxpbmsgc2VyaWFsaXphdGlvbkVycm9yfSBpcyBzZXQ6IHRoZSBpbnB1dCBpcyBwcmVjaXNlbHlcbiAgICogd2hhdCByZWZ1c2VkIHRvIHNlcmlhbGl6ZS5cbiAgICovXG4gIGlucHV0PzogVWludDhBcnJheTtcbiAgLyoqIFdoZXRoZXIgYSBzdGVwX2NyZWF0ZWQgZXZlbnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgc3RlcCAqL1xuICBoYXNDcmVhdGVkRXZlbnQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTZXQgd2hlbiBob3N0LXNpZGUgc2VyaWFsaXphdGlvbiBvZiB0aGUgc3RlcCdzIHJhdyBpbnB1dCBmYWlsZWQgd2hpbGVcbiAgICogZHVtcGluZyB0aGUgVk0ncyBwZW5kaW5nIG9wcyAoc2VlIGBkdW1wUGVuZGluZ09wc2ApLiBUaGUgZmFpbHVyZSBpc1xuICAgKiBkZXRlcm1pbmlzdGljIChyZXBsYXlpbmcgcmUtZGVyaXZlcyB0aGUgc2FtZSB1bnNlcmlhbGl6YWJsZSB2YWx1ZSksIHNvXG4gICAqIGluc3RlYWQgb2YgZmFpbGluZyB0aGUgd2hvbGUgY29sbGVjdGlvbiB0aGUgb3AgaXMgc3VyZmFjZWQgd2l0aCB0aGVcbiAgICogcmVmcmFtZWQgZXJyb3IgYW5kIG5vIGBpbnB1dGA7IHRoZSBlbnRyeXBvaW50IGZpbmFsaXplcyB0aGUgc3RlcCBhc1xuICAgKiBgc3RlcF9jcmVhdGVkYCAocGxhY2Vob2xkZXIgaW5wdXQpICsgYHN0ZXBfZmFpbGVkYCwgbWlycm9yaW5nIHRoZVxuICAgKiBub2RlOnZtIGVuZ2luZSdzIGBmaW5hbGl6ZVVuc2VyaWFsaXphYmxlU3RlcGAsIHNvIGEgdHJ5L2NhdGNoIGFyb3VuZFxuICAgKiB0aGUgc3RlcCBjYWxsIG9ic2VydmVzIHRoZSBTZXJpYWxpemF0aW9uRXJyb3IuXG4gICAqL1xuICBzZXJpYWxpemF0aW9uRXJyb3I/OiBTZXJpYWxpemF0aW9uRXJyb3I7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ1dhaXQge1xuICB0eXBlOiAnd2FpdCc7XG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgLyoqIElTTyBzdHJpbmcgb2Ygd2hlbiB0byByZXN1bWUgKi9cbiAgcmVzdW1lQXQ6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgYSB3YWl0X2NyZWF0ZWQgZXZlbnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgd2FpdCAqL1xuICBoYXNDcmVhdGVkRXZlbnQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ0hvb2sge1xuICB0eXBlOiAnaG9vayc7XG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgdG9rZW46IHN0cmluZztcbiAgLyoqIEVhcmxpZXN0IHRva2VuIHJldXNlIHRpbWUsIGFzIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgVW5peCBlcG9jaC4gKi9cbiAgdG9rZW5SZXRlbnRpb25VbnRpbD86IG51bWJlcjtcbiAgaXNXZWJob29rOiBib29sZWFuO1xuICBtZXRhZGF0YT86IHVua25vd247XG4gIGhhc0NyZWF0ZWRFdmVudDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRydWUgZm9yIGludGVybmFsIHN5c3RlbSBob29rcyAoZS5nLiBBYm9ydENvbnRyb2xsZXIncyBob29rKSwgd2hpY2hcbiAgICogYXJlIGV4ZW1wdCBmcm9tIHVzZXItaG9vayB0b2tlbiBuYW1lc3BhY2UgY29uZmxpY3QgY2hlY2tzLlxuICAgKi9cbiAgaXNTeXN0ZW0/OiBib29sZWFuO1xuICAvKipcbiAgICogU2V0IHdoZW4gdGhlIHdvcmtmbG93IGNhbGxlZCBBYm9ydENvbnRyb2xsZXIuYWJvcnQoKSBkdXJpbmcgdGhpc1xuICAgKiBpbnZvY2F0aW9uLiBUaGUgaG9zdCBtdXN0IHJlY29yZCB0aGUgYWJvcnQ6IGNyZWF0ZSBhIGhvb2tfcmVjZWl2ZWRcbiAgICogZXZlbnQgY2FycnlpbmcgYGFib3J0UGF5bG9hZGAgYW5kIHdyaXRlL2Nsb3NlIHRoZSBhYm9ydCBzdHJlYW0uXG4gICAqL1xuICBhYm9ydFJlcXVlc3RlZD86IGJvb2xlYW47XG4gIC8qKiBWTS1zZXJpYWxpemVkIGB7IGFib3J0ZWQ6IHRydWUsIHJlYXNvbiB9YCBwYXlsb2FkIGZvciB0aGUgYWJvcnQuICovXG4gIGFib3J0UGF5bG9hZD86IFVpbnQ4QXJyYXk7XG4gIC8qKiBTZXQgYnkgdGhlIGNvbXBsZXRpb24gZHJhaW4gd2hlbiBhIHN5c3RlbSBob29rIGlzIGltcGxpY2l0bHkgZGlzcG9zZWQuICovXG4gIGRpc3Bvc2VkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRydWUgd2hlbiB0aGUgd29ya2Zsb3cgaXMgYXdhaXRpbmcgaG9vay5nZXRDb25mbGljdCgpIGZvciB0aGlzIGhvb2suXG4gICAqIFRoZSBlbnRyeXBvaW50IHJlLWludm9rZXMgdGhlIHdvcmtmbG93IHJpZ2h0IGFmdGVyIHdyaXRpbmdcbiAgICogaG9va19jcmVhdGVkIHNvIHJlcGxheSBjYW4gY29uZmlybSBjcmVhdGlvbiBhbmQgcmVzb2x2ZSB0aGUgYXdhaXRlci5cbiAgICovXG4gIGhhc0dldENvbmZsaWN0QXdhaXRlcj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ0F0dHJpYnV0ZSB7XG4gIHR5cGU6ICdhdHRyaWJ1dGUnO1xuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gIC8qKiBOb3JtYWxpemVkIGF0dHJpYnV0ZSBjaGFuZ2VzIChwbGFpbiBKU09OLWFibGUgb2JqZWN0cykgKi9cbiAgY2hhbmdlczogdW5rbm93bltdO1xuICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGFuIGF0dHJfc2V0IGV2ZW50IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHdyaXRlICovXG4gIGhhc0NyZWF0ZWRFdmVudDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZW5kaW5nSG9va0Rpc3Bvc2Uge1xuICB0eXBlOiAnaG9va19kaXNwb3NlJztcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICAvKipcbiAgICogVG9rZW4gb2YgdGhlIGhvb2sgYmVpbmcgZGlzcG9zZWQuIFVzZWQgYnkgdGhlIGVudHJ5cG9pbnQgdG8gb3JkZXJcbiAgICogc2FtZS10b2tlbiBob29rIG9wZXJhdGlvbnMgc2VxdWVudGlhbGx5IGluIGNvZGUgb3JkZXIuXG4gICAqL1xuICB0b2tlbj86IHN0cmluZztcbiAgaGFzQ3JlYXRlZEV2ZW50OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBQZW5kaW5nT3BlcmF0aW9uID1cbiAgfCBQZW5kaW5nU3RlcFxuICB8IFBlbmRpbmdXYWl0XG4gIHwgUGVuZGluZ0hvb2tcbiAgfCBQZW5kaW5nQXR0cmlidXRlXG4gIHwgUGVuZGluZ0hvb2tEaXNwb3NlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1aWNrSlNSdW50aW1lUmVzdWx0IHtcbiAgLyoqIFRoZSB3b3JrZmxvdyBjb21wbGV0ZWQ6IHJlc3VsdCBpcyBmb3JtYXQtcHJlZml4ZWQgZGV2YWx1ZSBieXRlcyAqL1xuICBjb21wbGV0ZWQ/OiB7XG4gICAgcmVzdWx0OiBVaW50OEFycmF5O1xuICAgIC8qKlxuICAgICAqIExlZnRvdmVyIHBlbmRpbmcgb3BlcmF0aW9ucyB0aGF0IHN0aWxsIG5lZWQgZHVyYWJsZSBzaWRlIGVmZmVjdHMgYXRcbiAgICAgKiBjb21wbGV0aW9uOiBhYm9ydCByZWNvcmRpbmdzLCBzeXN0ZW0taG9vayBkaXNwb3NhbHMsIGZpcmUtYW5kLWZvcmdldFxuICAgICAqIGF0dHJpYnV0ZS9ob29rL3N0ZXAgZXZlbnRzLiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSdzXG4gICAgICogZHJhaW5QZW5kaW5nUXVldWVJdGVtcy4gVGhlIGVudHJ5cG9pbnQgZGlzcGF0Y2hlcyB0aGVzZSBXSVRIT1VUXG4gICAgICogcXVldWVpbmcgc3RlcHMgb3IgcmVxdWV1aW5nIHRoZSBydW4uXG4gICAgICovXG4gICAgZHJhaW5PcGVyYXRpb25zPzogUGVuZGluZ09wZXJhdGlvbltdO1xuICB9O1xuICAvKiogVGhlIHdvcmtmbG93IHN1c3BlbmRlZCB3aXRoIHBlbmRpbmcgb3BlcmF0aW9ucyAqL1xuICBzdXNwZW5kZWQ/OiB7XG4gICAgcGVuZGluZ09wZXJhdGlvbnM6IFBlbmRpbmdPcGVyYXRpb25bXTtcbiAgfTtcbiAgLyoqIFRoZSB3b3JrZmxvdyBmYWlsZWQgKi9cbiAgZmFpbGVkPzoge1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBzdGFjaz86IHN0cmluZztcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKiBTZWUgY29tcGxldGVkLmRyYWluT3BlcmF0aW9uczogc2FtZSBzZW1hbnRpY3Mgb24gZmFpbHVyZS4gKi9cbiAgICBkcmFpbk9wZXJhdGlvbnM/OiBQZW5kaW5nT3BlcmF0aW9uW107XG4gICAgLyoqXG4gICAgICogRm9ybWF0LXByZWZpeGVkIGRldmFsdWUgYnl0ZXMgb2YgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZVxuICAgICAqIChFcnJvciBzdWJjbGFzcyB3aXRoIGNhdXNlIGNoYWluLCBwbGFpbiBvYmplY3QsIHByaW1pdGl2ZSwgZXRjLikuXG4gICAgICogU2V0IHdoZW4gdGhlIFZNLXNpZGUgcmVqZWN0aW9uIGhhbmRsZXIgc3VjY2Vzc2Z1bGx5IHNlcmlhbGl6ZXNcbiAgICAgKiB0aGUgdGhyb3duIHZhbHVlLiBUaGUgaG9zdCB1c2VzIHRoZXNlIGJ5dGVzIHRvIHJlY29uc3RydWN0IHRoZVxuICAgICAqIG9yaWdpbmFsIHZhbHVlIHRocm91Z2ggdGhlIHN0YW5kYXJkIGVycm9yIGh5ZHJhdGlvbiBwaXBlbGluZSxcbiAgICAgKiBwcmVzZXJ2aW5nIHR5cGUgaWRlbnRpdHkgKFR5cGVFcnJvciwgRmF0YWxFcnJvcikgYW5kIG5vbi1FcnJvclxuICAgICAqIHRocm93cyB2ZXJiYXRpbS4gRmFsbHMgYmFjayB0byB0aGUgbWVzc2FnZS9zdGFjay9uYW1lIGZpZWxkc1xuICAgICAqIHdoZW4gdGhpcyBpcyB1bmRlZmluZWQgKGUuZy4gZXh0cmFjdEVycm9yIHBzZXVkby1mYWlsdXJlcykuXG4gICAgICovXG4gICAgdmFsdWVCeXRlcz86IFVpbnQ4QXJyYXk7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVpY2tKU1J1bnRpbWVPcHRpb25zIHtcbiAgLyoqIFRoZSBjb21waWxlZCB3b3JrZmxvdyBidW5kbGUgY29kZSAod29ya2Zsb3cgbW9kZSBvdXRwdXQgZnJvbSBTV0MpICovXG4gIHdvcmtmbG93Q29kZTogc3RyaW5nO1xuICAvKiogVGhlIHdvcmtmbG93IElEIChlLmcuIFwid29ya2Zsb3cvLy4vd29ya2Zsb3dzLzFfc2ltcGxlLy9zaW1wbGVcIikgKi9cbiAgd29ya2Zsb3dJZDogc3RyaW5nO1xuICAvKiogVGhlIHdvcmtmbG93IHJ1biBlbnRpdHkgKi9cbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICAvKiogRmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBXb3JsZCBleGVjdXRpbmcgdGhpcyB3b3JrZmxvdy4gKi9cbiAgd29ybGRDYXBhYmlsaXRpZXM/OiBXb3JsZENhcGFiaWxpdGllcztcbiAgLyoqXG4gICAqIFRoZSBmdWxsIGV2ZW50IGxvZyBmb3IgdGhlIHJ1bi4gRXZlcnkgaW52b2NhdGlvbiByZXBsYXlzIHRoZSBjb21wbGV0ZVxuICAgKiBsb2cgZnJvbSB0aGUgc3RhcnQgKHNhbWUgcmVwbGF5IHNlbWFudGljcyBhcyB0aGUgYG5vZGU6dm1gIGVuZ2luZSkuXG4gICAqL1xuICBldmVudHM6IEV2ZW50W107XG4gIC8qKiBFbmNyeXB0aW9uIGtleSBmb3IgZGVjcnlwdGluZyBldmVudCBwYXlsb2FkcyAodW5kZWZpbmVkIGlmIHVuZW5jcnlwdGVkKSAqL1xuICBlbmNyeXB0aW9uS2V5PzogRGVjcnlwdGlvbktleTtcbiAgLyoqXG4gICAqIFRoZSBsb2NhbCBwb3J0IHRoZSB3b3JrZmxvdyBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uLCB1c2VkIHRvIHBvcHVsYXRlXG4gICAqIGB3b3JrZmxvd01ldGFkYXRhLnVybGAuIFJlc29sdmVkIGF0IGNhbGwgdGltZSBvbiB0aGUgaG9zdCBzaWRlIHNvIHRoZVxuICAgKiBWTSBkb2Vzbid0IGhhdmUgdG8gcHJvYmUgdGhlIGZpbGVzeXN0ZW0uIElnbm9yZWQgb24gVmVyY2VsLCB3aGVyZVxuICAgKiBWRVJDRUxfVVJMIHRha2VzIHByZWNlZGVuY2UuXG4gICAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKipcbiAgICogRmFsbGJhY2sgd29ya2Zsb3cgaW5wdXQgZnJvbSB0aGUgcXVldWUgbWVzc2FnZSdzIHJlc2lsaWVudC1zdGFydFxuICAgKiBwYXlsb2FkLiBVc2VkIHdoZW4gdGhlIGZldGNoZWQgZXZlbnQgbG9nIGxhY2tzIGEgYHJ1bl9jcmVhdGVkYCBldmVudFxuICAgKiAoZXZlbnR1YWxseS1jb25zaXN0ZW50IHJlYWQgYWZ0ZXIgdGhlIHBhcmVudCdzIHN0YXJ0KCkgd3JvdGUgaXQpLlxuICAgKi9cbiAgcnVuSW5wdXQ/OiBSdW5JbnB1dDtcbn1cblxuLy8gLS0tLSBWTSBCb290c3RyYXAgQ29kZSAtLS0tXG5cbi8qKlxuICogSmF2YVNjcmlwdCBjb2RlIHRoYXQgcnVucyBpbnNpZGUgdGhlIFF1aWNrSlMgVk0gdG8gc2V0IHVwIHRoZSB3b3JrZmxvd1xuICogcHJpbWl0aXZlcy4gVGhpcyBzZXRzIHVwOlxuICogLSBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3MgKE1hcCkgLSB3b3JrZmxvdyByZWdpc3RyeVxuICogLSBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzIChPYmplY3QpIC0gcGVuZGluZyBwcm9taXNlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9uc1xuICogLSBnbG9iYWxUaGlzLl9fcGVuZGluZyAoQXJyYXkpIC0gbWV0YWRhdGEgYWJvdXQgcGVuZGluZyBvcGVyYXRpb25zXG4gKiAtIGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXSAtIHN0ZXAgcHJveHkgZmFjdG9yeVxuICogLSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19TTEVFUFwiKV0gLSBzbGVlcCBmdW5jdGlvblxuICovXG5jb25zdCBWTV9CT09UU1RSQVAgPSBgXG4vLyBTeW1ib2wuZGlzcG9zZSAvIFN5bWJvbC5hc3luY0Rpc3Bvc2UgcG9seWZpbGxzIGZvciBRdWlja0pTXG5pZiAodHlwZW9mIFN5bWJvbC5kaXNwb3NlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIFN5bWJvbC5kaXNwb3NlID0gU3ltYm9sLmZvcihcIlN5bWJvbC5kaXNwb3NlXCIpO1xufVxuaWYgKHR5cGVvZiBTeW1ib2wuYXN5bmNEaXNwb3NlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIFN5bWJvbC5hc3luY0Rpc3Bvc2UgPSBTeW1ib2wuZm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZVwiKTtcbn1cblxuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzID0gbmV3IE1hcCgpO1xuZ2xvYmFsVGhpcy5fX3Jlc29sdmVycyA9IHt9O1xuZ2xvYmFsVGhpcy5fX3BlbmRpbmcgPSBbXTtcbmdsb2JhbFRoaXMuX193b3JrZmxvd1Jlc3VsdCA9IHVuZGVmaW5lZDtcbmdsb2JhbFRoaXMuX193b3JrZmxvd0Vycm9yID0gdW5kZWZpbmVkO1xuLy8gQnVmZmVyIGZvciBob29rX3JlY2VpdmVkIHBheWxvYWRzIHRoYXQgYXJyaXZlIGJlZm9yZSB0aGUgaG9vayBpcyBhd2FpdGVkLlxuLy8gS2V5ZWQgYnkgY29ycmVsYXRpb25JZCDihpIgYXJyYXkgb2YgcGF5bG9hZHMgKHByZXNlcnZlcyBkZWxpdmVyeSBvcmRlcikuXG4vLyBUaGlzIG1pcnJvcnMgdGhlIGV2ZW50LXJlcGxheSBydW50aW1lJ3MgcGF5bG9hZHNRdWV1ZSBpbiBob29rLnRzLlxuZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyID0ge307XG5cbi8vIEJ1ZmZlciBmb3Igc3RlcC93YWl0L2F0dHIgdGVybWluYWwgb3V0Y29tZXMgdGhhdCBhcnJpdmUgYmVmb3JlIHRoaXMgVk1cbi8vIGhhcyBjb25zdHJ1Y3RlZCB0aGUgY29ycmVzcG9uZGluZyBhd2FpdGluZyBwcm9taXNlLiBJbiBmcmVzaC1WTSByZXBsYXlcbi8vIHRoZSBtdWx0aS1wYXNzIGV2ZW50IHNjYW4gbWFrZXMgdGhpcyB1bnJlYWNoYWJsZSAoYXdhaXRzIGFyZVxuLy8gcmVjb25zdHJ1Y3RlZCBiZWZvcmUgdGhlaXIgdGVybWluYWxzIGFyZSByZS1zY2FubmVkKSwgYnV0IHRoZSBsaXZlXG4vLyBjb250aW51YXRpb24gcGF0aCAoY29udGludWVXaXRoRXZlbnRzKSBzY2FucyBlYWNoIGRlbHRhIGV4YWN0bHkgb25jZSDigJRcbi8vIGEgY29uY3VycmVudCBpbnZvY2F0aW9uJ3MgdGVybWluYWwgYXJyaXZpbmcgYmVmb3JlIHRoaXMgVk0gcmVhY2hlcyB0aGVcbi8vIGF3YWl0IHdvdWxkIG90aGVyd2lzZSBiZSBkcm9wcGVkIG9uIHRoZSBmbG9vciBhbmQgdGhlIGF3YWl0IHdvdWxkXG4vLyBuZXZlciBzZXR0bGUgKHRoZSBmZWVkJ3Mgc2Vlbi1zZXQgbWVhbnMgaXQgaXMgbmV2ZXIgcmUtZGVsaXZlcmVkKS5cbi8vIE1pcnJvcnMgX19ob29rUGF5bG9hZEJ1ZmZlciwgd2hpY2ggZXhpc3RzIGZvciBleGFjdGx5IHRoaXMgcmVhc29uIG9uXG4vLyB0aGUgaG9vayBwYXRoLiBLZXllZCBieSBjb3JyZWxhdGlvbklkIOKGkiBzaW5nbGUgdGVybWluYWwgKHN0ZXBzLCB3YWl0c1xuLy8gYW5kIGF0dHJzIHNldHRsZSBleGFjdGx5IG9uY2UpLlxuZ2xvYmFsVGhpcy5fX3Rlcm1pbmFsQnVmZmVyID0ge307XG5cbi8vIFJlZ2lzdGVycyBhIHJlc29sdmVyIGZvciBhbiBhd2FpdGVkIHByaW1pdGl2ZSwgZmlyc3QgZHJhaW5pbmcgYW55XG4vLyBidWZmZXJlZCB0ZXJtaW5hbCByZWNvcmRlZCBmb3IgdGhlIGNvcnJlbGF0aW9uSWQuIEVudHJpZXMgYXJlIHByZXBhcmVkXG4vLyBob3N0LXNpZGU6IGJ5dGVzIGFyZSBkZWNyeXB0ZWQgQU5EIGRlc2VyaWFsaXplZCBpbnRvIFZNIHZhbHVlcyBieSB0aGVcbi8vIGhvc3Qgc2VyZGUgYmVmb3JlIGJ1ZmZlcmluZyAodGhlIFZNIGhhcyBubyBpbi1ndWVzdCBkZXNlcmlhbGl6ZXIgb25cbi8vIHRoZSBob3N0LXNlcmRlIGVuZ2luZSksIHNvIGRyYWluaW5nIG9ubHkgZm9yd2FyZHMgdGhlIHN0b3JlZCB2YWx1ZS5cbmdsb2JhbFRoaXMuX19yZWdpc3RlclJlc29sdmVyID0gZnVuY3Rpb24oY29ycmVsYXRpb25JZCwgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gIHZhciBidWZmZXJlZCA9IGdsb2JhbFRoaXMuX190ZXJtaW5hbEJ1ZmZlcltjb3JyZWxhdGlvbklkXTtcbiAgaWYgKGJ1ZmZlcmVkKSB7XG4gICAgZGVsZXRlIGdsb2JhbFRoaXMuX190ZXJtaW5hbEJ1ZmZlcltjb3JyZWxhdGlvbklkXTtcbiAgICBpZiAoYnVmZmVyZWQua2luZCA9PT0gXCJyZXNvbHZlX3ZhbHVlXCIpIHtcbiAgICAgIHJlc29sdmUoYnVmZmVyZWQudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoYnVmZmVyZWQua2luZCA9PT0gXCJyZWplY3RfdmFsdWVcIikge1xuICAgICAgcmVqZWN0KGJ1ZmZlcmVkLnZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGJ1ZmZlcmVkLmtpbmQgPT09IFwicmVqZWN0X2Vycm9yXCIpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKGJ1ZmZlcmVkLm1lc3NhZ2UpO1xuICAgICAgZS5uYW1lID0gXCJGYXRhbEVycm9yXCI7XG4gICAgICBlLmZhdGFsID0gdHJ1ZTtcbiAgICAgIGlmIChidWZmZXJlZC5zdGFjaykgZS5zdGFjayA9IGJ1ZmZlcmVkLnN0YWNrO1xuICAgICAgcmVqZWN0KGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzW2NvcnJlbGF0aW9uSWRdID0geyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9O1xufTtcblxuLy8gU3R1YnMgZm9yIFdlYiBBUElzIHRoYXQgdGhlIHdvcmtmbG93IGJ1bmRsZSBtYXkgcmVmZXJlbmNlIGJ1dCBhcmUgbm90XG4vLyBhdmFpbGFibGUgaW4gUXVpY2tKUy4gTmF0aXZlIEMgZXh0ZW5zaW9ucyAoZW5jb2RpbmcsIGhlYWRlcnMsIHVybCxcbi8vIHN0cnVjdHVyZWQtY2xvbmUpIHByb3ZpZGUgdGhlIHJlYWwgaW1wbGVtZW50YXRpb25zOyB0aGVzZSBhcmUgbWluaW1hbFxuLy8gc3R1YnMgZm9yIEFQSXMgdGhhdCBkb24ndCBoYXZlIG5hdGl2ZSBleHRlbnNpb25zIHlldC4gKGJ0b2EvYXRvYiBhbmRcbi8vIHRoZSBVaW50OEFycmF5IGJhc2U2NC9oZXggbWV0aG9kcyBhcmUgYnVpbHQgaW50byBxdWlja2pzLXdhc2kgPj0gMy4pXG5cbmlmICh0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgLy8gTWluaW1hbCBSZWFkYWJsZVN0cmVhbSB0aGF0IHN0b3JlcyBib2R5IGRhdGEgZm9yIFJlc3BvbnNlLmpzb24oKS90ZXh0KClcbiAgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbSA9IGZ1bmN0aW9uKCkge307XG4gIGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLl9fYm9keURhdGEgPSBudWxsO1xufVxuXG5pZiAodHlwZW9mIFdyaXRhYmxlU3RyZWFtID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIGdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW0gPSBmdW5jdGlvbigpIHt9O1xufVxuXG5pZiAodHlwZW9mIFRyYW5zZm9ybVN0cmVhbSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICBnbG9iYWxUaGlzLlRyYW5zZm9ybVN0cmVhbSA9IGZ1bmN0aW9uKCkge307XG59XG5cbmlmICh0eXBlb2YgY29uc29sZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICBnbG9iYWxUaGlzLmNvbnNvbGUgPSB7IGxvZzogZnVuY3Rpb24oKXt9LCBlcnJvcjogZnVuY3Rpb24oKXt9LCB3YXJuOiBmdW5jdGlvbigpe30sIGluZm86IGZ1bmN0aW9uKCl7fSB9O1xufVxuLy8gU3R1YiBleHBvcnRzL21vZHVsZSBmb3IgQ0pTIGJ1bmRsZSBmb3JtYXRcbmdsb2JhbFRoaXMuZXhwb3J0cyA9IHt9O1xuZ2xvYmFsVGhpcy5tb2R1bGUgPSB7IGV4cG9ydHM6IGdsb2JhbFRoaXMuZXhwb3J0cyB9O1xuLy8gTk9URTogVGV4dEVuY29kZXIvVGV4dERlY29kZXIgYXJlIHByb3ZpZGVkIGJ5IHRoZSBuYXRpdmUgZW5jb2RpbmcgZXh0ZW5zaW9uLlxuXG4vLyAtLS0tIERldGVybWluaXN0aWMgXFxgY3J5cHRvXFxgIChwYXJpdHkgd2l0aCB0aGUgbm9kZTp2bSBlbmdpbmUpIC0tLS1cbi8vIGdldFJhbmRvbVZhbHVlcyAvIHJhbmRvbVVVSUQgZHJhdyBmcm9tIE1hdGgucmFuZG9tLCB3aGljaCB0aGUgaG9zdFxuLy8gcmVwbGFjZXMgd2l0aCB0aGUgcnVuJ3Mgc2VlZGVkIFBSTkcgYmVmb3JlIGFueSB1c2VyIGNvZGUgcnVucyDigJQgc28gdGhlXG4vLyB2YWx1ZXMgcmVwbGF5IGRldGVybWluaXN0aWNhbGx5IGFuZCBtYXRjaCB0aGUgbm9kZSBlbmdpbmUsIHdob3NlXG4vLyBpbXBsZW1lbnRhdGlvbnMgZHJhdyBmcm9tIHRoZSBzYW1lIHNlZWRlZCBzZXF1ZW5jZSAoc2VlIHZtL2luZGV4LnRzKS5cbi8vIEV2ZXJ5IGNyeXB0by5zdWJ0bGUgbWV0aG9kIHRocm93cyB3aXRoIHRoZSBzYW1lIGd1aWRhbmNlIGFzIHRoZSBub2RlXG4vLyBlbmdpbmUncyBub24tcmVwbGF5YWJsZSBtZXRob2RzOyB1bmxpa2Ugbm9kZSwgXFxgZGlnZXN0XFxgIGlzIGFsc29cbi8vIHVuYXZhaWxhYmxlIGhlcmUgKG5vIG5hdGl2ZSBoYXNoIGluIHRoZSBWTSB5ZXQpLlxuKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBnZXRSYW5kb21WYWx1ZXMoYXJyYXkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnJheVtpXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1Nik7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuICAvLyBNaXJyb3JzIHZtL3V1aWQudHMgY3JlYXRlUmFuZG9tVVVJRDogaWRlbnRpY2FsIGRyYXcgcGF0dGVybiBmcm9tIHRoZVxuICAvLyBzZWVkZWQgUFJORywgc28gYm90aCBlbmdpbmVzIHByb2R1Y2UgdGhlIHNhbWUgVVVJRCBhdCB0aGUgc2FtZSBwb2ludFxuICAvLyBpbiBhIHJlcGxheS5cbiAgZnVuY3Rpb24gcmFuZG9tVVVJRCgpIHtcbiAgICB2YXIgY2hhcnMgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIjtcbiAgICB2YXIgdXVpZCA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzNjsgaSsrKSB7XG4gICAgICBpZiAoaSA9PT0gOCB8fCBpID09PSAxMyB8fCBpID09PSAxOCB8fCBpID09PSAyMykge1xuICAgICAgICB1dWlkICs9IFwiLVwiO1xuICAgICAgfSBlbHNlIGlmIChpID09PSAxNCkge1xuICAgICAgICB1dWlkICs9IFwiNFwiO1xuICAgICAgfSBlbHNlIGlmIChpID09PSAxOSkge1xuICAgICAgICB1dWlkICs9IGNoYXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDQpICsgOF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1dWlkICs9IGNoYXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE2KV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1dWlkO1xuICB9XG4gIGZ1bmN0aW9uIHN1YnRsZVRocm93KG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiXFxgY3J5cHRvLnN1YnRsZS5cIiArIG5hbWUgKyBcIigpXFxgIGlzIG5vdCBhdmFpbGFibGUgaW5zaWRlIGEgd29ya2Zsb3cgZnVuY3Rpb24uIE1vdmUgaXQgdG8gYSBzdGVwIGZ1bmN0aW9uIHdoZXJlIGZ1bGwgTm9kZS5qcyBjcnlwdG8gaXMgYXZhaWxhYmxlLlwiKTtcbiAgICAgIGVyci5uYW1lID0gXCJXb3JrZmxvd1J1bnRpbWVFcnJvclwiO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH07XG4gIH1cbiAgdmFyIHN1YnRsZSA9IHt9O1xuICBbXCJlbmNyeXB0XCIsXCJkZWNyeXB0XCIsXCJzaWduXCIsXCJ2ZXJpZnlcIixcImRpZ2VzdFwiLFwiZ2VuZXJhdGVLZXlcIixcImRlcml2ZUtleVwiLFwiZGVyaXZlQml0c1wiLFwiaW1wb3J0S2V5XCIsXCJleHBvcnRLZXlcIixcIndyYXBLZXlcIixcInVud3JhcEtleVwiXS5mb3JFYWNoKGZ1bmN0aW9uKG0pIHtcbiAgICBzdWJ0bGVbbV0gPSBzdWJ0bGVUaHJvdyhtKTtcbiAgfSk7XG4gIGdsb2JhbFRoaXMuY3J5cHRvID0ge1xuICAgIGdldFJhbmRvbVZhbHVlczogZ2V0UmFuZG9tVmFsdWVzLFxuICAgIHJhbmRvbVVVSUQ6IHJhbmRvbVVVSUQsXG4gICAgc3VidGxlOiBzdWJ0bGUsXG4gIH07XG59KSgpO1xuXG4vLyAtLS0tIExvdWQgSW50bCAvIGxvY2FsZSBndWFyZHMgLS0tLVxuLy8gUXVpY2tKUyBoYXMgbm8gSUNVOiBcXGBJbnRsXFxgIGlzIGFic2VudCBhbmQgdG9Mb2NhbGVTdHJpbmctZmFtaWx5IG1ldGhvZHNcbi8vIHNpbGVudGx5IGlnbm9yZSB0aGVpciBsb2NhbGUgYXJndW1lbnQuIFNpbGVudCBkaXZlcmdlbmNlIGZyb20gdGhlIG5vZGVcbi8vIGVuZ2luZSB3b3VsZCB3cml0ZSBkaWZmZXJlbnQgdmFsdWVzIGludG8gYSBkdXJhYmxlIGV2ZW50IGxvZyB3aXRoIG5vXG4vLyBlcnJvciBhbnl3aGVyZSDigJQgc28gbWFrZSB0aGUgZ2FwIGxvdWQgaW5zdGVhZDogSW50bCBjb25zdHJ1Y3RvcnMgdGhyb3csXG4vLyBhbmQgdG9Mb2NhbGUqIG1ldGhvZHMgdGhyb3cgT05MWSB3aGVuIGNhbGxlZCB3aXRoIGFuIGV4cGxpY2l0IGxvY2FsZVxuLy8gKHRoZSBuby1hcmd1bWVudCBmb3JtcyBrZWVwIFF1aWNrSlMncyBkZWZhdWx0IGJlaGF2aW9yKS5cbihmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gaW50bFRocm93KG5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiXFxgSW50bC5cIiArIG5hbWUgKyBcIlxcYCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBRdWlja0pTIHdvcmtmbG93IGVuZ2luZSAobm8gSUNVKS4gUGVyZm9ybSBsb2NhbGUtc2Vuc2l0aXZlIGZvcm1hdHRpbmcgaW4gYSBzdGVwIGZ1bmN0aW9uLCBvciB1c2UgV09SS0ZMT1dfVk09bm9kZS5cIik7XG4gICAgICBlcnIubmFtZSA9IFwiV29ya2Zsb3dSdW50aW1lRXJyb3JcIjtcbiAgICAgIHRocm93IGVycjtcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlb2YgSW50bCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBpbnRsID0ge307XG4gICAgW1wiQ29sbGF0b3JcIixcIkRhdGVUaW1lRm9ybWF0XCIsXCJEaXNwbGF5TmFtZXNcIixcIkR1cmF0aW9uRm9ybWF0XCIsXCJMaXN0Rm9ybWF0XCIsXCJMb2NhbGVcIixcIk51bWJlckZvcm1hdFwiLFwiUGx1cmFsUnVsZXNcIixcIlJlbGF0aXZlVGltZUZvcm1hdFwiLFwiU2VnbWVudGVyXCJdLmZvckVhY2goZnVuY3Rpb24obikge1xuICAgICAgaW50bFtuXSA9IGludGxUaHJvdyhuKTtcbiAgICB9KTtcbiAgICBpbnRsLmdldENhbm9uaWNhbExvY2FsZXMgPSBpbnRsVGhyb3coXCJnZXRDYW5vbmljYWxMb2NhbGVzXCIpO1xuICAgIGdsb2JhbFRoaXMuSW50bCA9IGludGw7XG4gIH1cbiAgZnVuY3Rpb24gZ3VhcmRMb2NhbGUocHJvdG8sIG1ldGhvZCkge1xuICAgIHZhciBvcmlnaW5hbCA9IHByb3RvW21ldGhvZF07XG4gICAgaWYgKHR5cGVvZiBvcmlnaW5hbCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm47XG4gICAgcHJvdG9bbWV0aG9kXSA9IGZ1bmN0aW9uKGxvY2FsZXMpIHtcbiAgICAgIGlmIChsb2NhbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcihcIlxcYFwiICsgbWV0aG9kICsgXCIobG9jYWxlcywgLi4uKVxcYCB3aXRoIGFuIGV4cGxpY2l0IGxvY2FsZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBRdWlja0pTIHdvcmtmbG93IGVuZ2luZSAobm8gSUNVKSDigJQgaXQgd291bGQgc2lsZW50bHkgaWdub3JlIHRoZSBsb2NhbGUuIEZvcm1hdCBpbiBhIHN0ZXAgZnVuY3Rpb24sIG9yIGNhbGwgd2l0aG91dCBhcmd1bWVudHMgZm9yIHRoZSBlbmdpbmUgZGVmYXVsdC5cIik7XG4gICAgICAgIGVyci5uYW1lID0gXCJXb3JrZmxvd1J1bnRpbWVFcnJvclwiO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3JpZ2luYWwuY2FsbCh0aGlzKTtcbiAgICB9O1xuICB9XG4gIGd1YXJkTG9jYWxlKE51bWJlci5wcm90b3R5cGUsIFwidG9Mb2NhbGVTdHJpbmdcIik7XG4gIGd1YXJkTG9jYWxlKERhdGUucHJvdG90eXBlLCBcInRvTG9jYWxlU3RyaW5nXCIpO1xuICBndWFyZExvY2FsZShEYXRlLnByb3RvdHlwZSwgXCJ0b0xvY2FsZURhdGVTdHJpbmdcIik7XG4gIGd1YXJkTG9jYWxlKERhdGUucHJvdG90eXBlLCBcInRvTG9jYWxlVGltZVN0cmluZ1wiKTtcbiAgZ3VhcmRMb2NhbGUoU3RyaW5nLnByb3RvdHlwZSwgXCJ0b0xvY2FsZUxvd2VyQ2FzZVwiKTtcbiAgZ3VhcmRMb2NhbGUoU3RyaW5nLnByb3RvdHlwZSwgXCJ0b0xvY2FsZVVwcGVyQ2FzZVwiKTtcbiAgLy8gbG9jYWxlQ29tcGFyZSdzIGxvY2FsZXMgYXJndW1lbnQgaXMgdGhlIFNFQ09ORCBwYXJhbWV0ZXIuXG4gIChmdW5jdGlvbigpIHtcbiAgICB2YXIgb3JpZ2luYWwgPSBTdHJpbmcucHJvdG90eXBlLmxvY2FsZUNvbXBhcmU7XG4gICAgU3RyaW5nLnByb3RvdHlwZS5sb2NhbGVDb21wYXJlID0gZnVuY3Rpb24odGhhdCwgbG9jYWxlcykge1xuICAgICAgaWYgKGxvY2FsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFwiXFxgbG9jYWxlQ29tcGFyZSh0aGF0LCBsb2NhbGVzLCAuLi4pXFxgIHdpdGggYW4gZXhwbGljaXQgbG9jYWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIFF1aWNrSlMgd29ya2Zsb3cgZW5naW5lIChubyBJQ1UpLiBDb21wYXJlIGluIGEgc3RlcCBmdW5jdGlvbiwgb3IgY2FsbCB3aXRob3V0IGEgbG9jYWxlLlwiKTtcbiAgICAgICAgZXJyLm5hbWUgPSBcIldvcmtmbG93UnVudGltZUVycm9yXCI7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcmlnaW5hbC5jYWxsKHRoaXMsIHRoYXQpO1xuICAgIH07XG4gIH0pKCk7XG59KSgpO1xuXG5nbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0gPSBmdW5jdGlvbihzdGVwSWQsIGNsb3N1cmVWYXJzRm4pIHtcbiAgdmFyIGZuID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIHZhciBjb3JyZWxhdGlvbklkID0gXCJzdGVwX1wiICsgZ2xvYmFsVGhpcy5fX2dlbmVyYXRlVWxpZCgpO1xuICAgIC8vIENhcHR1cmUgJ3RoaXMnIGZvciBtZXRob2QgaW52b2NhdGlvbnMgKGUuZy4sIE15Q2xhc3MubWV0aG9kKCkpXG4gICAgdmFyIHRoaXNWYWwgPSAodGhpcyAhPT0gdW5kZWZpbmVkICYmIHRoaXMgIT09IG51bGwgJiYgdGhpcyAhPT0gZ2xvYmFsVGhpcykgPyB0aGlzIDogdW5kZWZpbmVkO1xuICAgIC8vIFRoZSBSQVcgaW5wdXQgdmFsdWUuIFNlcmlhbGl6YXRpb24gaGFwcGVucyBvbiB0aGUgaG9zdCwgd2hpY2ggcmVhZHNcbiAgICAvLyB0aGlzIHRocm91Z2ggYSBoYW5kbGUgd2hlbiBpdCBjb2xsZWN0cyB0aGUgcGVuZGluZyBvcCDigJQgbm9cbiAgICAvLyBzZXJpYWxpemVyIGNvZGUgcnVucyBpbnNpZGUgdGhlIFZNLlxuICAgIHZhciBpbnB1dCA9IHtcbiAgICAgIGFyZ3M6IGFyZ3MsXG4gICAgICBjbG9zdXJlVmFyczogY2xvc3VyZVZhcnNGbiA/IGNsb3N1cmVWYXJzRm4oKSA6IHVuZGVmaW5lZCxcbiAgICAgIHRoaXNWYWw6IHRoaXNWYWwsXG4gICAgfTtcbiAgICBnbG9iYWxUaGlzLl9fcGVuZGluZy5wdXNoKHtcbiAgICAgIHR5cGU6IFwic3RlcFwiLFxuICAgICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZCxcbiAgICAgIHN0ZXBJZDogc3RlcElkLFxuICAgICAgaW5wdXQ6IGlucHV0LFxuICAgICAgaGFzQ3JlYXRlZEV2ZW50OiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBnbG9iYWxUaGlzLl9fcmVnaXN0ZXJSZXNvbHZlcihjb3JyZWxhdGlvbklkLCByZXNvbHZlLCByZWplY3QpO1xuICAgIH0pO1xuICB9O1xuICAvLyBTZXQgc3RlcElkIG9uIHRoZSBwcm94eSBzbyB0aGUgU3RlcEZ1bmN0aW9uIHJlZHVjZXIgY2FuIGRldGVjdCBhbmRcbiAgLy8gc2VyaWFsaXplIHN0ZXAgZnVuY3Rpb24gcmVmZXJlbmNlcyAoZS5nLiB3aGVuIHBhc3NlZCBhcyBhcmd1bWVudHMpLlxuICBmbi5zdGVwSWQgPSBzdGVwSWQ7XG4gIGlmIChjbG9zdXJlVmFyc0ZuKSBmbi5fX2Nsb3N1cmVWYXJzRm4gPSBjbG9zdXJlVmFyc0ZuO1xuICAvLyBPdmVycmlkZSAuYmluZCBzbyBhIGJvdW5kIHN0ZXAgcHJveHkgKGUuZy4gdGhlIFNXQyBwbHVnaW4nc1xuICAvLyB1c2VTdGVwKC4uLikuYmluZCh0aGlzKSBmb3IgbGV4aWNhbC10aGlzIGFycm93IHN0ZXBzKSBrZWVwcyBpdHNcbiAgLy8gc3RlcElkIGFuZCByZWNvcmRzIHRoZSBib3VuZCByZWNlaXZlciAvIHByZWZpbGxlZCBhcmdzIOKAlCB0aGUgbmF0aXZlXG4gIC8vIGJpbmQgZHJvcHMgb3duIHByb3BlcnRpZXMsIHdoaWNoIHdvdWxkIG1ha2UgdGhlIFN0ZXBGdW5jdGlvblxuICAvLyByZWR1Y2VyIGZhaWwgdG8gcmVjb2duaXplIHRoZSBwcm94eSB3aGVuIGl0IGNyb3NzZXMgYSBzZXJpYWxpemF0aW9uXG4gIC8vIGJvdW5kYXJ5LiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSdzIG92ZXJyaWRlIGluIHN0ZXAudHMuXG4gIGZuLmJpbmQgPSBmdW5jdGlvbih0aGlzQXJnKSB7XG4gICAgdmFyIHBhcnRpYWxBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICB2YXIgYm91bmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseSh0aGlzLCBbdGhpc0FyZ10uY29uY2F0KHBhcnRpYWxBcmdzKSk7XG4gICAgYm91bmQuc3RlcElkID0gc3RlcElkO1xuICAgIGlmIChjbG9zdXJlVmFyc0ZuKSBib3VuZC5fX2Nsb3N1cmVWYXJzRm4gPSBjbG9zdXJlVmFyc0ZuO1xuICAgIGJvdW5kLl9fYm91bmRUaGlzID0gdGhpc0FyZztcbiAgICBpZiAocGFydGlhbEFyZ3MubGVuZ3RoID4gMCkgYm91bmQuX19ib3VuZEFyZ3MgPSBwYXJ0aWFsQXJncztcbiAgICByZXR1cm4gYm91bmQ7XG4gIH07XG4gIHJldHVybiBmbjtcbn07XG5cbi8vIFBhcnNlcyBhbiBcIm1zXCIgbGlicmFyeSBzdHlsZSBkdXJhdGlvbiBzdHJpbmcgaW50byBtaWxsaXNlY29uZHMuXG4vLyBTdXBwb3J0cyB0aGUgc2FtZSB1bml0cyBhcyB0aGUgcmVwbGF5IHJ1bnRpbWUgKHdoaWNoIHVzZXMgdGhlIFwibXNcIlxuLy8gcGFja2FnZSk6IG1zIC8gcyAvIG0gLyBoIC8gZCAvIHcgLyB5LCB3aXRoIHZlcmJvc2UgYWxpYXNlc1xuLy8gKHNlY29uZHMsIG1pbnV0ZXMsIC4uLikuXG5nbG9iYWxUaGlzLl9fcGFyc2VEdXJhdGlvbk1zID0gZnVuY3Rpb24oc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdmFyIG1hdGNoID0gc3RyLm1hdGNoKFxuICAgIC9eKC0/KD86XFxcXGQrKT9cXFxcLj9cXFxcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2lcbiAgKTtcbiAgaWYgKCFtYXRjaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgXCJtc1wiKS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgcyA9IDEwMDAsIG0gPSA2MCAqIHMsIGggPSA2MCAqIG0sIGQgPSAyNCAqIGgsIHcgPSA3ICogZCwgeSA9IDM2NS4yNSAqIGQ7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJ5ZWFyc1wiOiBjYXNlIFwieWVhclwiOiBjYXNlIFwieXJzXCI6IGNhc2UgXCJ5clwiOiBjYXNlIFwieVwiOiByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSBcIndlZWtzXCI6IGNhc2UgXCJ3ZWVrXCI6IGNhc2UgXCJ3XCI6IHJldHVybiBuICogdztcbiAgICBjYXNlIFwiZGF5c1wiOiBjYXNlIFwiZGF5XCI6IGNhc2UgXCJkXCI6IHJldHVybiBuICogZDtcbiAgICBjYXNlIFwiaG91cnNcIjogY2FzZSBcImhvdXJcIjogY2FzZSBcImhyc1wiOiBjYXNlIFwiaHJcIjogY2FzZSBcImhcIjogcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgXCJtaW51dGVzXCI6IGNhc2UgXCJtaW51dGVcIjogY2FzZSBcIm1pbnNcIjogY2FzZSBcIm1pblwiOiBjYXNlIFwibVwiOiByZXR1cm4gbiAqIG07XG4gICAgY2FzZSBcInNlY29uZHNcIjogY2FzZSBcInNlY29uZFwiOiBjYXNlIFwic2Vjc1wiOiBjYXNlIFwic2VjXCI6IGNhc2UgXCJzXCI6IHJldHVybiBuICogcztcbiAgICBjYXNlIFwibWlsbGlzZWNvbmRzXCI6IGNhc2UgXCJtaWxsaXNlY29uZFwiOiBjYXNlIFwibXNlY3NcIjogY2FzZSBcIm1zZWNcIjogY2FzZSBcIm1zXCI6IHJldHVybiBuO1xuICAgIGRlZmF1bHQ6IHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn07XG5cbmdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1NMRUVQXCIpXSA9IGZ1bmN0aW9uKHBhcmFtKSB7XG4gIHZhciBjb3JyZWxhdGlvbklkID0gXCJ3YWl0X1wiICsgZ2xvYmFsVGhpcy5fX2dlbmVyYXRlVWxpZCgpO1xuICB2YXIgcmVzdW1lQXQ7XG4gIGlmICh0eXBlb2YgcGFyYW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXN1bWVBdCA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBwYXJhbSkudG9JU09TdHJpbmcoKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICB2YXIgbXMgPSBnbG9iYWxUaGlzLl9fcGFyc2VEdXJhdGlvbk1zKHBhcmFtKTtcbiAgICBpZiAodHlwZW9mIG1zID09PSBcIm51bWJlclwiICYmIGlzRmluaXRlKG1zKSkge1xuICAgICAgcmVzdW1lQXQgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgbXMpLnRvSVNPU3RyaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vdCBhIGR1cmF0aW9uIHN0cmluZyDigJQgdHJ5IGFzIGFuIGFic29sdXRlIGRhdGUgc3RyaW5nLlxuICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShwYXJhbSk7XG4gICAgICBpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc2xlZXAgcGFyYW1ldGVyOiBcIiArIHBhcmFtKTtcbiAgICAgIH1cbiAgICAgIHJlc3VtZUF0ID0gZGF0ZS50b0lTT1N0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBpZiAoaXNOYU4ocGFyYW0uZ2V0VGltZSgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzbGVlcCBwYXJhbWV0ZXI6IFwiICsgcGFyYW0pO1xuICAgIH1cbiAgICByZXN1bWVBdCA9IHBhcmFtLnRvSVNPU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzbGVlcCBwYXJhbWV0ZXI6IFwiICsgcGFyYW0pO1xuICB9XG4gIGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goe1xuICAgIHR5cGU6IFwid2FpdFwiLFxuICAgIGNvcnJlbGF0aW9uSWQ6IGNvcnJlbGF0aW9uSWQsXG4gICAgcmVzdW1lQXQ6IHJlc3VtZUF0LFxuICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gIH0pO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyUmVzb2x2ZXIoY29ycmVsYXRpb25JZCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgfSk7XG59O1xuXG4vLyBSZXNwb25zZS9SZXF1ZXN0IHBvbHlmaWxscyDigJQgLmpzb24oKS8udGV4dCgpLy5hcnJheUJ1ZmZlcigpIGFyZSB1c2VTdGVwXG4vLyBwcm94aWVzIHRoYXQgZXhlY3V0ZSBvbiB0aGUgaG9zdCBzaWRlLiBUaGUgcHJveGllcyBhcmUgYXNzaWduZWQgZGlyZWN0bHlcbi8vIHRvIHRoZSBwcm90b3R5cGVzIHNvIHRoYXQgJ3RoaXMnICh0aGUgUmVzcG9uc2UvUmVxdWVzdCBpbnN0YW5jZSkgaXNcbi8vIHNlcmlhbGl6ZWQgYXMgdGhpc1ZhbCBieSBXT1JLRkxPV19VU0VfU1RFUCwgbWF0Y2hpbmcgdGhlIGV2ZW50LXJlcGxheVxuLy8gcnVudGltZSdzIGFwcHJvYWNoIChjb21taXQgZGNiMDc2MSkuXG5pZiAodHlwZW9mIFJlc3BvbnNlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIHZhciBfX0JPRFlfSU5JVCA9IFN5bWJvbC5mb3IoXCJCT0RZX0lOSVRcIik7XG5cbiAgZ2xvYmFsVGhpcy5SZXNwb25zZSA9IGZ1bmN0aW9uKGJvZHksIGluaXQpIHtcbiAgICBpbml0ID0gaW5pdCB8fCB7fTtcbiAgICB0aGlzLnN0YXR1cyA9IGluaXQuc3RhdHVzIHx8IDIwMDtcbiAgICB0aGlzLnN0YXR1c1RleHQgPSBpbml0LnN0YXR1c1RleHQgfHwgXCJcIjtcbiAgICB0aGlzLmhlYWRlcnMgPSBuZXcgZ2xvYmFsVGhpcy5IZWFkZXJzKGluaXQuaGVhZGVycyB8fCBbXSk7XG4gICAgdGhpcy50eXBlID0gXCJkZWZhdWx0XCI7XG4gICAgdGhpcy51cmwgPSBcIlwiO1xuICAgIHRoaXMucmVkaXJlY3RlZCA9IGZhbHNlO1xuICAgIGlmIChib2R5ICE9PSBudWxsICYmIGJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5ib2R5ID0gT2JqZWN0LmNyZWF0ZShnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSk7XG4gICAgICB0aGlzLmJvZHlbX19CT0RZX0lOSVRdID0gYm9keTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ib2R5ID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLlJlc3BvbnNlLnByb3RvdHlwZSwgXCJva1wiLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMDsgfVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMuUmVzcG9uc2UucHJvdG90eXBlLCBcImJvZHlVc2VkXCIsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgfSk7XG4gIC8vIEFzc2lnbiB1c2VTdGVwIHByb3hpZXMgZGlyZWN0bHkg4oCUICd0aGlzJyBiaW5kaW5nIHByb3ZpZGVzIHRoZVxuICAvLyBSZXNwb25zZSBpbnN0YW5jZSwgd2hpY2ggZ2V0cyBzZXJpYWxpemVkIGFzIHRoaXNWYWwgYnkgdGhlIHByb3h5LlxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhnbG9iYWxUaGlzLlJlc3BvbnNlLnByb3RvdHlwZSwge1xuICAgIGFycmF5QnVmZmVyOiB7IHZhbHVlOiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyXCIpLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0sXG4gICAganNvbjogeyB2YWx1ZTogZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwiX19idWlsdGluX3Jlc3BvbnNlX2pzb25cIiksIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSxcbiAgICB0ZXh0OiB7IHZhbHVlOiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dFwiKSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LFxuICB9KTtcbiAgZ2xvYmFsVGhpcy5SZXNwb25zZS5wcm90b3R5cGUuYnl0ZXMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5hcnJheUJ1ZmZlcigpLnRoZW4oZnVuY3Rpb24oYnVmKSB7IHJldHVybiBuZXcgVWludDhBcnJheShidWYpOyB9KTtcbiAgfTtcbiAgZ2xvYmFsVGhpcy5SZXNwb25zZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgciA9IE9iamVjdC5jcmVhdGUoZ2xvYmFsVGhpcy5SZXNwb25zZS5wcm90b3R5cGUpO1xuICAgIHIuc3RhdHVzID0gdGhpcy5zdGF0dXM7IHIuc3RhdHVzVGV4dCA9IHRoaXMuc3RhdHVzVGV4dDtcbiAgICByLmhlYWRlcnMgPSB0aGlzLmhlYWRlcnM7IHIudHlwZSA9IHRoaXMudHlwZTtcbiAgICByLnVybCA9IHRoaXMudXJsOyByLnJlZGlyZWN0ZWQgPSB0aGlzLnJlZGlyZWN0ZWQ7IHIuYm9keSA9IHRoaXMuYm9keTtcbiAgICByZXR1cm4gcjtcbiAgfTtcbiAgZ2xvYmFsVGhpcy5SZXNwb25zZS5qc29uID0gZnVuY3Rpb24oZGF0YSwgaW5pdCkge1xuICAgIHZhciBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgdmFyIGhlYWRlcnMgPSBuZXcgZ2xvYmFsVGhpcy5IZWFkZXJzKGluaXQgPyBpbml0LmhlYWRlcnMgOiBbXSk7XG4gICAgaWYgKCFoZWFkZXJzLmhhcyhcImNvbnRlbnQtdHlwZVwiKSkgeyBoZWFkZXJzLnNldChcImNvbnRlbnQtdHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7IH1cbiAgICByZXR1cm4gbmV3IGdsb2JhbFRoaXMuUmVzcG9uc2UoYm9keSwgeyBzdGF0dXM6IChpbml0ICYmIGluaXQuc3RhdHVzKSB8fCAyMDAsIHN0YXR1c1RleHQ6IChpbml0ICYmIGluaXQuc3RhdHVzVGV4dCkgfHwgXCJcIiwgaGVhZGVyczogaGVhZGVycyB9KTtcbiAgfTtcbn1cbmlmICh0eXBlb2YgUmVxdWVzdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICBnbG9iYWxUaGlzLlJlcXVlc3QgPSBmdW5jdGlvbihpbnB1dCwgaW5pdCkge1xuICAgIGluaXQgPSBpbml0IHx8IHt9O1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHsgdGhpcy51cmwgPSBpbnB1dDsgfVxuICAgIGVsc2UgaWYgKGlucHV0ICYmIHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy51cmwgPSBpbnB1dC51cmwgfHwgXCJcIjsgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2Q7XG4gICAgICB0aGlzLmhlYWRlcnMgPSBpbnB1dC5oZWFkZXJzOyB0aGlzLmJvZHkgPSBpbnB1dC5ib2R5O1xuICAgIH1cbiAgICBpZiAoaW5pdC5tZXRob2QpIHRoaXMubWV0aG9kID0gaW5pdC5tZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoIXRoaXMubWV0aG9kKSB0aGlzLm1ldGhvZCA9IFwiR0VUXCI7XG4gICAgaWYgKGluaXQuaGVhZGVycykgdGhpcy5oZWFkZXJzID0gbmV3IGdsb2JhbFRoaXMuSGVhZGVycyhpbml0LmhlYWRlcnMpO1xuICAgIGlmICghdGhpcy5oZWFkZXJzKSB0aGlzLmhlYWRlcnMgPSBuZXcgZ2xvYmFsVGhpcy5IZWFkZXJzKCk7XG4gICAgaWYgKGluaXQuYm9keSAhPT0gdW5kZWZpbmVkKSB0aGlzLmJvZHkgPSBpbml0LmJvZHk7XG4gICAgaWYgKCF0aGlzLmJvZHkpIHRoaXMuYm9keSA9IG51bGw7XG4gICAgdGhpcy5kdXBsZXggPSBpbml0LmR1cGxleCB8fCBcImhhbGZcIjtcbiAgfTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMuUmVxdWVzdC5wcm90b3R5cGUsIFwiYm9keVVzZWRcIiwge1xuICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZTsgfVxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZ2xvYmFsVGhpcy5SZXF1ZXN0LnByb3RvdHlwZSwge1xuICAgIGFycmF5QnVmZmVyOiB7IHZhbHVlOiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyXCIpLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0sXG4gICAganNvbjogeyB2YWx1ZTogZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwiX19idWlsdGluX3Jlc3BvbnNlX2pzb25cIiksIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSxcbiAgICB0ZXh0OiB7IHZhbHVlOiBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dFwiKSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9LFxuICB9KTtcbn1cblxuLy8gY3JlYXRlSG9vayDigJQgcmV0dXJucyBhIEhvb2sgb2JqZWN0IHRoYXQgaXMgYm90aCBhIFRoZW5hYmxlIGFuZCBBc3luY0l0ZXJhYmxlLlxuLy8gRWFjaCBhd2FpdC95aWVsZCBjcmVhdGVzIGEgbmV3IHByb21pc2Uga2V5ZWQgYnkgdGhlIHNhbWUgY29ycmVsYXRpb25JZC5cbi8vIFRoZSBwcm9taXNlIGlzIHJlc29sdmVkIHdoZW4gYSBob29rX3JlY2VpdmVkIGV2ZW50IGFycml2ZXMuXG5nbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19DUkVBVEVfSE9PS1wiKV0gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZiAob3B0aW9ucy5pc1dlYmhvb2sgPT09IHRydWUgJiYgb3B0aW9ucy5leHBlcmltZW50YWxfbWluUmV0ZW50aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYmhvb2sgaG9va3MgZG8gbm90IHN1cHBvcnQgXFxgZXhwZXJpbWVudGFsX21pblJldGVudGlvblxcYC4gVXNlIGEgbm9uLXdlYmhvb2sgXFxgY3JlYXRlSG9vaygpXFxgIHdpdGggXFxgcmVzdW1lSG9vaygpXFxgLicpO1xuICB9XG4gIGlmIChvcHRpb25zLmV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb24gIT09IHVuZGVmaW5lZCAmJiBnbG9iYWxUaGlzLl9fd29ybGRDYXBhYmlsaXRpZXM/Lmhvb2tSZXRlbnRpb24/LmFjdGl2ZSAhPT0gdHJ1ZSkge1xuICAgIHZhciB1bnN1cHBvcnRlZFJldGVudGlvbkVycm9yID0gbmV3IEVycm9yKCdUaGUgY29uZmlndXJlZCBXb3JsZCBkb2VzIG5vdCBzdXBwb3J0IFxcYGV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb25cXGAgZm9yIEhvb2tzLicpO1xuICAgIHVuc3VwcG9ydGVkUmV0ZW50aW9uRXJyb3IubmFtZSA9IFwiRmF0YWxFcnJvclwiO1xuICAgIHVuc3VwcG9ydGVkUmV0ZW50aW9uRXJyb3IuZmF0YWwgPSB0cnVlO1xuICAgIHRocm93IHVuc3VwcG9ydGVkUmV0ZW50aW9uRXJyb3I7XG4gIH1cbiAgdmFyIHRva2VuID0gb3B0aW9ucy50b2tlbiB8fCBnbG9iYWxUaGlzLl9fZ2VuZXJhdGVOYW5vaWQoKTtcbiAgdmFyIGNvcnJlbGF0aW9uSWQgPSBcImhvb2tfXCIgKyBnbG9iYWxUaGlzLl9fZ2VuZXJhdGVVbGlkKCk7XG4gIHZhciBpc0Rpc3Bvc2VkID0gZmFsc2U7XG4gIHZhciBoYXNDcmVhdGVkRXZlbnQgPSBmYWxzZTtcbiAgdmFyIHRva2VuUmV0ZW50aW9uVW50aWw7XG4gIGlmIChvcHRpb25zLmV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBtaW5SZXRlbnRpb24gPSBvcHRpb25zLmV4cGVyaW1lbnRhbF9taW5SZXRlbnRpb247XG4gICAgaWYgKHR5cGVvZiBtaW5SZXRlbnRpb24gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmIChtaW5SZXRlbnRpb24gPCAwIHx8ICFpc0Zpbml0ZShtaW5SZXRlbnRpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZHVyYXRpb246IFwiICsgbWluUmV0ZW50aW9uICsgXCIuIEV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlwiKTtcbiAgICAgIH1cbiAgICAgIHRva2VuUmV0ZW50aW9uVW50aWwgPSBEYXRlLm5vdygpICsgbWluUmV0ZW50aW9uO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1pblJldGVudGlvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdmFyIHJldGVudGlvbk1zID0gZ2xvYmFsVGhpcy5fX3BhcnNlRHVyYXRpb25NcyhtaW5SZXRlbnRpb24pO1xuICAgICAgaWYgKHR5cGVvZiByZXRlbnRpb25NcyAhPT0gXCJudW1iZXJcIiB8fCByZXRlbnRpb25NcyA8IDAgfHwgIWlzRmluaXRlKHJldGVudGlvbk1zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZHVyYXRpb246IFwiJyArIG1pblJldGVudGlvbiArICdcIi4gRXhwZWN0ZWQgYSB2YWxpZCBkdXJhdGlvbiBzdHJpbmcgbGlrZSBcIjFzXCIsIFwiMW1cIiwgXCIxaFwiLCBldGMuJyk7XG4gICAgICB9XG4gICAgICB0b2tlblJldGVudGlvblVudGlsID0gRGF0ZS5ub3coKSArIHJldGVudGlvbk1zO1xuICAgIH0gZWxzZSBpZiAobWluUmV0ZW50aW9uIGluc3RhbmNlb2YgRGF0ZSB8fCAobWluUmV0ZW50aW9uICYmIHR5cGVvZiBtaW5SZXRlbnRpb24uZ2V0VGltZSA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgICAgLy8gQWNjZXB0IERhdGUtbGlrZSBvYmplY3RzIChhbnl0aGluZyB3aXRoIGdldFRpbWUpLCBtYXRjaGluZ1xuICAgICAgLy8gcGFyc2VEdXJhdGlvblRvRGF0ZTogdmFsdWVzIHRoYXQgY3Jvc3NlZCB0aGUgc2VyZGUgYm91bmRhcnkgbWF5XG4gICAgICAvLyBub3QgYmUgcmVhbG0tbmF0aXZlIERhdGUgaW5zdGFuY2VzLlxuICAgICAgdG9rZW5SZXRlbnRpb25VbnRpbCA9IG1pblJldGVudGlvbi5nZXRUaW1lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZHVyYXRpb24gcGFyYW1ldGVyLiBFeHBlY3RlZCBhIGR1cmF0aW9uIHN0cmluZywgbnVtYmVyIChtaWxsaXNlY29uZHMpLCBvciBEYXRlIG9iamVjdC5cIik7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgaW4gcGVuZGluZyBvcGVyYXRpb25zLiBNZXRhZGF0YSBzdGF5cyBhIFJBVyB2YWx1ZTsgdGhlIGhvc3RcbiAgLy8gc2VyaWFsaXplcyBpdCB0aHJvdWdoIGEgaGFuZGxlIHdoZW4gaXQgY29sbGVjdHMgdGhlIHBlbmRpbmcgb3AuXG4gIHZhciBwZW5kaW5nT3AgPSB7XG4gICAgdHlwZTogXCJob29rXCIsXG4gICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZCxcbiAgICB0b2tlbjogdG9rZW4sXG4gICAgdG9rZW5SZXRlbnRpb25VbnRpbDogdG9rZW5SZXRlbnRpb25VbnRpbCxcbiAgICBpc1dlYmhvb2s6ICEhb3B0aW9ucy5pc1dlYmhvb2ssXG4gICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgaGFzQ3JlYXRlZEV2ZW50OiBmYWxzZSxcbiAgfTtcbiAgZ2xvYmFsVGhpcy5fX3BlbmRpbmcucHVzaChwZW5kaW5nT3ApO1xuXG4gIC8vIFBlci1ob29rIGxpZmVjeWNsZSBzdGF0ZSBiYWNraW5nIGhvb2suZ2V0Q29uZmxpY3QoKTogcmVzb2x2ZXMgbnVsbFxuICAvLyBvbmNlIGNyZWF0aW9uIGlzIGNvbmZpcm1lZCAoaG9va19jcmVhdGVkKSwgb3IgcmVzb2x2ZXMgd2l0aCB0aGVcbiAgLy8gY29uZmxpY3RpbmcgUnVuIGhhbmRsZSAvIHJlamVjdHMgd2l0aCBIb29rQ29uZmxpY3RFcnJvciBvblxuICAvLyBob29rX2NvbmZsaWN0LiBTdGF0ZSB0cmFuc2l0aW9ucyBhcmUgZHJpdmVuIGJ5IHRoZSBob3N0IGR1cmluZyBldmVudFxuICAvLyBwcm9jZXNzaW5nIChzZWUgcHJvY2Vzc0V2ZW50cykuXG4gIGdsb2JhbFRoaXMuX19ob29rcyA9IGdsb2JhbFRoaXMuX19ob29rcyB8fCB7fTtcbiAgZ2xvYmFsVGhpcy5fX2hvb2tzW2NvcnJlbGF0aW9uSWRdID0ge1xuICAgIHRva2VuOiB0b2tlbixcbiAgICBjcmVhdGVkOiBmYWxzZSxcbiAgICBjb25mbGljdDogbnVsbCxcbiAgICBnZXRDb25mbGljdFJlc29sdmVyczogW10sXG4gIH07XG5cbiAgLy8gRWFjaCBhd2FpdCBjcmVhdGVzIGEgbmV3IHByb21pc2UgZm9yIHRoZSBuZXh0IHBheWxvYWQuXG4gIC8vIFRoZSBjb3JyZWxhdGlvbklkIHN0YXlzIHRoZSBzYW1lIOKAlCB0aGUgcmVzb2x2ZXIgaXMgcmVwbGFjZWQgZWFjaCB0aW1lLlxuICBmdW5jdGlvbiBjcmVhdGVIb29rUHJvbWlzZSgpIHtcbiAgICAvLyBDaGVjayB0aGUgcGF5bG9hZCBidWZmZXIgZmlyc3Qg4oCUIGlmIGEgaG9va19yZWNlaXZlZCBldmVudCBhcnJpdmVkXG4gICAgLy8gYmVmb3JlIHRoaXMgaG9vayB3YXMgYXdhaXRlZCwgdGhlIHBheWxvYWQgd2FzIGJ1ZmZlcmVkIGluIHRoZSBWTVxuICAgIC8vIGhlYXAuIERyYWluIGl0IGltbWVkaWF0ZWx5IChtYXRjaGluZyBldmVudC1yZXBsYXkgcGF5bG9hZHNRdWV1ZSkuXG4gICAgdmFyIGJ1ZiA9IGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlcltjb3JyZWxhdGlvbklkXTtcbiAgICBpZiAoYnVmICYmIGJ1Zi5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGJ1Zi5zaGlmdCgpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1tjb3JyZWxhdGlvbklkXSA9IHsgcmVzb2x2ZTogcmVzb2x2ZSwgcmVqZWN0OiByZWplY3QgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc3Bvc2VIb29rKCkge1xuICAgIGlmIChpc0Rpc3Bvc2VkKSByZXR1cm47XG4gICAgaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgLy8gQSBjb25mbGljdGVkIGhvb2sgd2FzIG5ldmVyIGNyZWF0ZWQgKHRoZSB3b3JsZCByZWplY3RlZCBpdHMgY2xhaW1cbiAgICAvLyDigJQgdGhlIHRva2VuIGJlbG9uZ3MgdG8gYW5vdGhlciBydW4pLCBzbyB0aGVyZSBpcyBubyBlbnRpdHkgdG9cbiAgICAvLyBkaXNwb3NlLiBNaXJyb3JzIHRoZSBub2RlOnZtIGVuZ2luZSwgd2hlcmUgaG9va19jb25mbGljdCByZW1vdmVzXG4gICAgLy8gdGhlIGludm9jYXRpb24tcXVldWUgaXRlbSBiZWZvcmUgZGlzcG9zZSBjYW4gbWFyayBpdC4gRW1pdHRpbmcgYVxuICAgIC8vIGhvb2tfZGlzcG9zZWQgaGVyZSB3b3VsZCBiZSByZWplY3RlZCBieSB0aGUgd29ybGQnc1xuICAgIC8vIGhvb2stZXhpc3RlbmNlIHZhbGlkYXRpb24uXG4gICAgdmFyIHN0YXRlID0gZ2xvYmFsVGhpcy5fX2hvb2tzW2NvcnJlbGF0aW9uSWRdO1xuICAgIGlmICghc3RhdGUgfHwgIXN0YXRlLmNvbmZsaWN0KSB7XG4gICAgICAvLyBTaWduYWwgdG8gdGhlIGVudHJ5cG9pbnQgdG8gY3JlYXRlIGEgaG9va19kaXNwb3NlZCBldmVudC4gVGhlXG4gICAgICAvLyB0b2tlbiBpcyBjYXJyaWVkIHNvIHRoZSBlbnRyeXBvaW50IGNhbiBvcmRlciBzYW1lLXRva2VuIGhvb2tcbiAgICAgIC8vIG9wZXJhdGlvbnMgc2VxdWVudGlhbGx5IChhIGRpc3Bvc2UgbXVzdCByZWxlYXNlIHRoZSB0b2tlbiBiZWZvcmVcbiAgICAgIC8vIGEgbGF0ZXIgc2FtZS10b2tlbiBob29rJ3MgY3JlYXRpb24gaXMgdmFsaWRhdGVkKS5cbiAgICAgIGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goe1xuICAgICAgICB0eXBlOiBcImhvb2tfZGlzcG9zZVwiLFxuICAgICAgICBjb3JyZWxhdGlvbklkOiBjb3JyZWxhdGlvbklkLFxuICAgICAgICB0b2tlbjogdG9rZW4sXG4gICAgICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gSWYgdGhlcmUncyBhIHBlbmRpbmcgcmVzb2x2ZXIsIHJlc29sdmUgaXQgd2l0aCB1bmRlZmluZWQgdG8gYnJlYWsgdGhlIGl0ZXJhdG9yXG4gICAgaWYgKGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbY29ycmVsYXRpb25JZF0pIHtcbiAgICAgIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbY29ycmVsYXRpb25JZF0ucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgZGVsZXRlIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbY29ycmVsYXRpb25JZF07XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q29uZmxpY3QoKSB7XG4gICAgdmFyIHN0YXRlID0gZ2xvYmFsVGhpcy5fX2hvb2tzW2NvcnJlbGF0aW9uSWRdO1xuICAgIGlmIChzdGF0ZS5jb25mbGljdCkge1xuICAgICAgcmV0dXJuIHN0YXRlLmNvbmZsaWN0LnJ1blxuICAgICAgICA/IFByb21pc2UucmVzb2x2ZShzdGF0ZS5jb25mbGljdC5ydW4pXG4gICAgICAgIDogUHJvbWlzZS5yZWplY3Qoc3RhdGUuY29uZmxpY3QuZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuY3JlYXRlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG4gICAgLy8gQ3JlYXRpb24gbm90IHlldCBjb25maXJtZWQgYnkgdGhlIGV2ZW50IGxvZyDigJQgcGFyayB0aGUgYXdhaXRlciBhbmRcbiAgICAvLyBmbGFnIHRoZSBwZW5kaW5nIG9wIHNvIHRoZSBlbnRyeXBvaW50IHJlLWludm9rZXMgdGhlIHdvcmtmbG93IHJpZ2h0XG4gICAgLy8gYWZ0ZXIgd3JpdGluZyBob29rX2NyZWF0ZWQgKG5vdGhpbmcgZXh0ZXJuYWwgcmVzdW1lcyBhIGdldENvbmZsaWN0XG4gICAgLy8gYXdhaXRlcjsgY29uZmlybWF0aW9uIG9ubHkgY29tZXMgZnJvbSByZXBsYXlpbmcgdGhlIG5ldyBldmVudCkuXG4gICAgcGVuZGluZ09wLmhhc0dldENvbmZsaWN0QXdhaXRlciA9IHRydWU7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgc3RhdGUuZ2V0Q29uZmxpY3RSZXNvbHZlcnMucHVzaCh7IHJlc29sdmU6IHJlc29sdmUsIHJlamVjdDogcmVqZWN0IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIGhvb2sgPSB7XG4gICAgdG9rZW46IHRva2VuLFxuICAgIHRoZW46IGZ1bmN0aW9uKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gY3JlYXRlSG9va1Byb21pc2UoKS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbiAgICB9LFxuICAgIGdldENvbmZsaWN0OiBnZXRDb25mbGljdCxcbiAgICBkaXNwb3NlOiBkaXNwb3NlSG9vayxcbiAgfTtcblxuICAvLyBTeW1ib2wuZGlzcG9zZSBmb3IgZXhwbGljaXQgcmVzb3VyY2UgbWFuYWdlbWVudFxuICBob29rW1N5bWJvbC5kaXNwb3NlXSA9IGRpc3Bvc2VIb29rO1xuXG4gIC8vIEFzeW5jSXRlcmFibGUg4oCUIHlpZWxkcyBwYXlsb2FkcyB1bnRpbCBkaXNwb3NlZFxuICBob29rW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlSG9va1Byb21pc2UoKS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgLy8gSWYgZGlzcG9zZWQgd2hpbGUgd2FpdGluZywgc2lnbmFsIGRvbmVcbiAgICAgICAgICBpZiAoaXNEaXNwb3NlZCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcmV0dXJuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgZGlzcG9zZUhvb2soKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG5cbiAgcmV0dXJuIGhvb2s7XG59O1xuXG4vLyBzZXRBdHRyaWJ1dGVzIOKAlCBhdHRhY2hlcyBwbGFpbnRleHQgbWV0YWRhdGEgdG8gdGhlIGN1cnJlbnQgcnVuLlxuLy8gVmFsaWRhdGlvbiBoYXBwZW5zIGluIGxpYnJhcnkgY29kZSAobm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcykgYmVmb3JlXG4vLyB0aGlzIGRpc3BhdGNoZXIgaXMgaW52b2tlZCwgc28gXCJjaGFuZ2VzXCIgaXMgYWxyZWFkeSBub3JtYWxpemVkLiBUaGVcbi8vIHJldHVybmVkIHByb21pc2UgcmVzb2x2ZXMgd2hlbiB0aGUgbWF0Y2hpbmcgYXR0cl9zZXQgZXZlbnQgaXNcbi8vIG9ic2VydmVkIGR1cmluZyBldmVudCBwcm9jZXNzaW5nIOKAlCBtaXJyb3JpbmcgdGhlIG5vZGU6dm0gZW5naW5lJ3Ncbi8vIGNyZWF0ZVNldEF0dHJpYnV0ZXMgKGF0dHJpYnV0ZS1kaXNwYXRjaGVyLnRzKS5cbmdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1NFVF9BVFRSSUJVVEVTXCIpXSA9IGZ1bmN0aW9uKGNoYW5nZXMsIG9wdGlvbnMpIHtcbiAgdmFyIGNvcnJlbGF0aW9uSWQgPSBcImF0dHJfXCIgKyBnbG9iYWxUaGlzLl9fZ2VuZXJhdGVVbGlkKCk7XG4gIGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goe1xuICAgIHR5cGU6IFwiYXR0cmlidXRlXCIsXG4gICAgY29ycmVsYXRpb25JZDogY29ycmVsYXRpb25JZCxcbiAgICBjaGFuZ2VzOiBjaGFuZ2VzLFxuICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOiAhIShvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMpLFxuICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gIH0pO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyUmVzb2x2ZXIoY29ycmVsYXRpb25JZCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgfSk7XG59O1xuXG4vLyAtLS0tIEFib3J0Q29udHJvbGxlciAvIEFib3J0U2lnbmFsIChob29rLWJhY2tlZCkgLS0tLVxuLy8gUG9ydCBvZiB3b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLnRzIHRvIHRoZSBWTSBwZW5kaW5nLW9wIG1vZGVsOlxuLy8gdGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGEgc3lzdGVtIGhvb2s7IGFib3J0KCkgZmxpcHMgdGhlIHNpZ25hbFxuLy8gc3luY2hyb25vdXNseSBhbmQgbWFya3MgdGhlIHBlbmRpbmcgb3Agc28gdGhlIGhvc3QgcmVjb3JkcyB0aGUgYWJvcnRcbi8vIChob29rX3JlY2VpdmVkIGV2ZW50ICsgc3RyZWFtIHBhY2tldCkuIE9uIHJlcGxheSwgdGhlIHJlY29yZGVkXG4vLyBob29rX3JlY2VpdmVkIGV2ZW50IGNhbGxzIF9zZXRBYm9ydGVkIGR1cmluZyBldmVudCBwcm9jZXNzaW5nIGFuZCB0aGVcbi8vIHdvcmtmbG93J3Mgb3duIGFib3J0KCkgY2FsbCBiZWNvbWVzIGEgbm8tb3AuXG52YXIgX19BQk9SVF9TVFJFQU1fTkFNRSA9IFN5bWJvbC5mb3IoXCJXT1JLRkxPV19BQk9SVF9TVFJFQU1fTkFNRVwiKTtcbnZhciBfX0FCT1JUX0hPT0tfVE9LRU4gPSBTeW1ib2wuZm9yKFwiV09SS0ZMT1dfQUJPUlRfSE9PS19UT0tFTlwiKTtcblxuZnVuY3Rpb24gX19tYWtlQWJvcnRFcnJvcigpIHtcbiAgaWYgKHR5cGVvZiBET01FeGNlcHRpb24gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gbmV3IERPTUV4Y2VwdGlvbihcIlRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuXCIsIFwiQWJvcnRFcnJvclwiKTtcbiAgfVxuICB2YXIgZSA9IG5ldyBFcnJvcihcIlRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuXCIpO1xuICBlLm5hbWUgPSBcIkFib3J0RXJyb3JcIjtcbiAgcmV0dXJuIGU7XG59XG5cbmZ1bmN0aW9uIFdvcmtmbG93QWJvcnRTaWduYWwoc3RyZWFtTmFtZSwgaG9va1Rva2VuKSB7XG4gIHRoaXMuYWJvcnRlZCA9IGZhbHNlO1xuICB0aGlzLnJlYXNvbiA9IHVuZGVmaW5lZDtcbiAgdGhpc1tfX0FCT1JUX1NUUkVBTV9OQU1FXSA9IHN0cmVhbU5hbWU7XG4gIHRoaXNbX19BQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgdGhpcy5fX2xpc3RlbmVycyA9IFtdO1xuICB0aGlzLl9fb25hYm9ydCA9IG51bGw7XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV29ya2Zsb3dBYm9ydFNpZ25hbC5wcm90b3R5cGUsIFwib25hYm9ydFwiLCB7XG4gIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9fb25hYm9ydDsgfSxcbiAgc2V0OiBmdW5jdGlvbihoYW5kbGVyKSB7XG4gICAgdGhpcy5fX29uYWJvcnQgPSBoYW5kbGVyO1xuICAgIGlmIChoYW5kbGVyICYmIHRoaXMuYWJvcnRlZCkgaGFuZGxlci5jYWxsKHRoaXMpO1xuICB9LFxufSk7XG5Xb3JrZmxvd0Fib3J0U2lnbmFsLnByb3RvdHlwZS5fc2V0QWJvcnRlZCA9IGZ1bmN0aW9uKHJlYXNvbikge1xuICBpZiAodGhpcy5hYm9ydGVkKSByZXR1cm47XG4gIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gIHRoaXMucmVhc29uID0gcmVhc29uO1xuICBpZiAodGhpcy5fX29uYWJvcnQpIHRoaXMuX19vbmFib3J0LmNhbGwodGhpcyk7XG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9fbGlzdGVuZXJzO1xuICB0aGlzLl9fbGlzdGVuZXJzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSBsaXN0ZW5lcnNbaV0oKTtcbn07XG5Xb3JrZmxvd0Fib3J0U2lnbmFsLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKHR5cGUgIT09IFwiYWJvcnRcIikgcmV0dXJuO1xuICBpZiAodGhpcy5hYm9ydGVkKSB7XG4gICAgLy8gRmlyZSBzeW5jaHJvbm91c2x5IChub3Qgb24gYSBtaWNyb3Rhc2spIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheSDigJRcbiAgICAvLyBtYXRjaGVzIHRoZSBub2RlOnZtIGVuZ2luZSdzIFdvcmtmbG93QWJvcnRTaWduYWwuXG4gICAgbGlzdGVuZXIoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5fX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbn07XG5Xb3JrZmxvd0Fib3J0U2lnbmFsLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKHR5cGUgIT09IFwiYWJvcnRcIikgcmV0dXJuO1xuICB0aGlzLl9fbGlzdGVuZXJzID0gdGhpcy5fX2xpc3RlbmVycy5maWx0ZXIoZnVuY3Rpb24obCkgeyByZXR1cm4gbCAhPT0gbGlzdGVuZXI7IH0pO1xufTtcbldvcmtmbG93QWJvcnRTaWduYWwucHJvdG90eXBlLnRocm93SWZBYm9ydGVkID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLmFib3J0ZWQpIHtcbiAgICB0aHJvdyB0aGlzLnJlYXNvbiAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmVhc29uICE9PSBudWxsXG4gICAgICA/IHRoaXMucmVhc29uXG4gICAgICA6IF9fbWFrZUFib3J0RXJyb3IoKTtcbiAgfVxufTtcbi8vIEV4cG9zZSBmb3IgdGhlIGhvc3Qgc2VyZGUncyByZXZpdmVycyAodGhleSBsb29rIHRoZSBjbGFzcyB1cCBsYXppbHksXG4vLyB0aHJvdWdoIGEgaGFuZGxlLCBhdCByZXZpdmUgdGltZSkuXG5nbG9iYWxUaGlzLl9fV29ya2Zsb3dBYm9ydFNpZ25hbCA9IFdvcmtmbG93QWJvcnRTaWduYWw7XG5cbi8vIFJlZ2lzdHJ5IG9mIGxpdmUgYWJvcnQgc2lnbmFscyBrZXllZCBieSB0aGVpciBob29rIGNvcnJlbGF0aW9uSWQuIFRoZVxuLy8gaG9zdCBkZWxpdmVycyBob29rX3JlY2VpdmVkIGV2ZW50cyBmb3IgdGhlc2UgaWRzIGFzIF9zZXRBYm9ydGVkIGNhbGxzLlxuZ2xvYmFsVGhpcy5fX2Fib3J0U2lnbmFscyA9IHt9O1xuXG5nbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciA9IGZ1bmN0aW9uIFdvcmtmbG93QWJvcnRDb250cm9sbGVyKCkge1xuICB2YXIgaWQgPSBnbG9iYWxUaGlzLl9fZ2VuZXJhdGVVbGlkKCk7XG4gIHZhciBzdHJlYW1OYW1lID0gXCJzdHJtX1wiICsgaWQgKyBcIl9zeXN0ZW1fYWJvcnRcIjtcbiAgdmFyIGhvb2tUb2tlbiA9IFwiYWJydF9cIiArIGlkO1xuICB0aGlzW19fQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgdGhpc1tfX0FCT1JUX0hPT0tfVE9LRU5dID0gaG9va1Rva2VuO1xuICB0aGlzLnNpZ25hbCA9IG5ldyBXb3JrZmxvd0Fib3J0U2lnbmFsKHN0cmVhbU5hbWUsIGhvb2tUb2tlbik7XG4gIHZhciBjb3JyZWxhdGlvbklkID0gXCJob29rX1wiICsgZ2xvYmFsVGhpcy5fX2dlbmVyYXRlVWxpZCgpO1xuICAvLyBSZWdpc3RlciBhbiBpbnRlcm5hbCBzeXN0ZW0gaG9vay4gaXNTeXN0ZW0gcHJldmVudHMgdG9rZW4gbmFtZXNwYWNlXG4gIC8vIGNvbmZsaWN0cyB3aXRoIHVzZXIgaG9va3MuXG4gIGdsb2JhbFRoaXMuX19wZW5kaW5nLnB1c2goe1xuICAgIHR5cGU6IFwiaG9va1wiLFxuICAgIGNvcnJlbGF0aW9uSWQ6IGNvcnJlbGF0aW9uSWQsXG4gICAgdG9rZW46IGhvb2tUb2tlbixcbiAgICBpc1dlYmhvb2s6IGZhbHNlLFxuICAgIGlzU3lzdGVtOiB0cnVlLFxuICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gIH0pO1xuICBnbG9iYWxUaGlzLl9fYWJvcnRTaWduYWxzW2NvcnJlbGF0aW9uSWRdID0gdGhpcy5zaWduYWw7XG59O1xuZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXIucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24ocmVhc29uKSB7XG4gIGlmICh0aGlzLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47IC8vIGFscmVhZHkgYWJvcnRlZCAoZS5nLiBmcm9tIHJlcGxheSlcbiAgdGhpcy5zaWduYWwuX3NldEFib3J0ZWQocmVhc29uKTtcbiAgLy8gTWFyayB0aGUgcGVuZGluZyBob29rIG9wIHNvIHRoZSBob3N0IHJlY29yZHMgdGhlIGFib3J0LiBUaGUgcGF5bG9hZFxuICAvLyBzdGF5cyBhIFJBVyB2YWx1ZTsgdGhlIGhvc3Qgc2VyaWFsaXplcyBpdCB0aHJvdWdoIGEgaGFuZGxlIHdpdGggZnVsbFxuICAvLyB0eXBlIGZpZGVsaXR5IChFcnJvcnMsIERPTUV4Y2VwdGlvbiwgY3VzdG9tIHZhbHVlcykuXG4gIHZhciB0b2tlbiA9IHRoaXNbX19BQk9SVF9IT09LX1RPS0VOXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbG9iYWxUaGlzLl9fcGVuZGluZy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gZ2xvYmFsVGhpcy5fX3BlbmRpbmdbaV07XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJob29rXCIgJiYgaXRlbS50b2tlbiA9PT0gdG9rZW4pIHtcbiAgICAgIGl0ZW0uYWJvcnRSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgaXRlbS5hYm9ydFBheWxvYWQgPSB7XG4gICAgICAgIGFib3J0ZWQ6IHRydWUsXG4gICAgICAgIHJlYXNvbjogcmVhc29uLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufTtcblxuZ2xvYmFsVGhpcy5BYm9ydFNpZ25hbCA9IHtcbiAgYWJvcnQ6IGZ1bmN0aW9uKHJlYXNvbikge1xuICAgIHZhciBzID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwoXCJcIiwgXCJcIik7XG4gICAgcy5fc2V0QWJvcnRlZChyZWFzb24gIT09IHVuZGVmaW5lZCA/IHJlYXNvbiA6IF9fbWFrZUFib3J0RXJyb3IoKSk7XG4gICAgcmV0dXJuIHM7XG4gIH0sXG4gIGFueTogZnVuY3Rpb24oc2lnbmFscykge1xuICAgIHZhciBjb21wb3NpdGUgPSBuZXcgV29ya2Zsb3dBYm9ydFNpZ25hbChcIlwiLCBcIlwiKTtcbiAgICB2YXIgYXJyID0gQXJyYXkuZnJvbShzaWduYWxzKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycltpXS5hYm9ydGVkKSB7XG4gICAgICAgIGNvbXBvc2l0ZS5fc2V0QWJvcnRlZChhcnJbaV0ucmVhc29uKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICAgIHZhciBjbGVhbnVwID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpc3RlbmVycy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAobGlzdGVuZXJzW2pdLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgbGlzdGVuZXJzW2pdLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgbGlzdGVuZXJzW2pdLmxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdGVuZXJzLmxlbmd0aCA9IDA7XG4gICAgfTtcbiAgICBhcnIuZm9yRWFjaChmdW5jdGlvbihzaWduYWwpIHtcbiAgICAgIGlmICghc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIpIHJldHVybjtcbiAgICAgIHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIWNvbXBvc2l0ZS5hYm9ydGVkKSB7XG4gICAgICAgICAgY29tcG9zaXRlLl9zZXRBYm9ydGVkKHNpZ25hbC5yZWFzb24pO1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGxpc3RlbmVycy5wdXNoKHsgc2lnbmFsOiBzaWduYWwsIGxpc3RlbmVyOiBsaXN0ZW5lciB9KTtcbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgbGlzdGVuZXIpO1xuICAgIH0pO1xuICAgIHJldHVybiBjb21wb3NpdGU7XG4gIH0sXG4gIHRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiQWJvcnRTaWduYWwudGltZW91dCgpIGlzIG5vdCBzdXBwb3J0ZWQgaW4gd29ya2Zsb3cgZnVuY3Rpb25zLiBcIiArXG4gICAgICAgIFwiVXNlIHNsZWVwKCkgd2l0aCBhbiBBYm9ydENvbnRyb2xsZXIgaW5zdGVhZC4gXCIgK1xuICAgICAgICBcIlNlZTogL2RvY3MvZXJyb3JzL2Fib3J0LXNpZ25hbC10aW1lb3V0LWluLXdvcmtmbG93XCJcbiAgICApO1xuICB9LFxufTtcblxuLy8gV09SS0ZMT1dfR0VUX1NUUkVBTV9JRCDigJQgZ2VuZXJhdGVzIGEgc3RyZWFtIElEIGZvciBhIHdvcmtmbG93IHJ1bi5cbi8vIFJlcGxpY2F0ZXMgZ2V0V29ya2Zsb3dSdW5TdHJlYW1JZCgpIGZyb20gdXRpbC50cyBpbnNpZGUgdGhlIFF1aWNrSlMgVk0uXG4vLyBVc2VzIHRoZSBidWlsdC1pbiBidG9hKCkgZm9yIGJhc2U2NHVybCBlbmNvZGluZy5cbmdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX0dFVF9TVFJFQU1fSURcIildID0gZnVuY3Rpb24obmFtZXNwYWNlKSB7XG4gIHZhciBydW5JZCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX0NPTlRFWFRcIildXG4gICAgPyBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19DT05URVhUXCIpXS53b3JrZmxvd1J1bklkXG4gICAgOiBcIlwiO1xuICB2YXIgc3RyZWFtSWQgPSBydW5JZC5yZXBsYWNlKFwid3J1bl9cIiwgXCJzdHJtX1wiKSArIFwiX3VzZXJcIjtcbiAgaWYgKCFuYW1lc3BhY2UpIHJldHVybiBzdHJlYW1JZDtcbiAgLy8gYmFzZTY0dXJsOiBidG9hIHRoZW4gcmVwbGFjZSArIHdpdGggLSwgLyB3aXRoIF8sIHN0cmlwID1cbiAgdmFyIGI2NCA9IGJ0b2EobmFtZXNwYWNlKS5yZXBsYWNlKC9cXFxcKy9nLCBcIi1cIikucmVwbGFjZSgvXFxcXC8vZywgXCJfXCIpLnJlcGxhY2UoLz0rJC8sIFwiXCIpO1xuICByZXR1cm4gc3RyZWFtSWQgKyBcIl9cIiArIGI2NDtcbn07XG5gO1xuXG4vLyAtLS0tIFJ1bnRpbWUgLS0tLVxuXG4vKipcbiAqIFBoYXNlIDE6IHN0YXRpYyAocnVuLWluZGVwZW5kZW50KSBWTSBpbml0aWFsaXphdGlvbi5cbiAqXG4gKiBDcmVhdGVzIGEgUXVpY2tKUyBWTSBhbmQgbG9hZHMgZXZlcnl0aGluZyB0aGF0IGRvZXMgbm90IGRlcGVuZCBvbiBhXG4gKiBzcGVjaWZpYyB3b3JrZmxvdyBydW46IHRoZSB3b3JrZmxvdy1wcmltaXRpdmUgYm9vdHN0cmFwICh1c2VTdGVwIC9cbiAqIHNsZWVwIC8gY3JlYXRlSG9vayAvIFJlc3BvbnNlLVJlcXVlc3QgcG9seWZpbGxzKS4gU2VyaWFsaXphdGlvbiBpc1xuICogaG9zdC1zaWRlIChxdWlja2pzLXNlcmRlLnRzKSBhbmQgY2FwdHVyZXMgaXRzIGludHJpbnNpY3MgZnJvbSB0aGUgVk1cbiAqIHJpZ2h0IGFmdGVyIHRoaXMgcmV0dXJucy5cbiAqXG4gKiBgZ2V0Tm93TXNgIGJhY2tzIHRoZSBWTSdzIFdBU0kgY2xvY2sgKGBEYXRlLm5vdygpYCAvIGBuZXcgRGF0ZSgpYFxuICogaW5zaWRlIHRoZSBWTSkuIFRoZSBjYWxsYmFjayBpdHNlbGYgaXMgc3RhdGljOiB0aGUgcGVyLXJ1biBzdGF0ZSBpdFxuICogcmVhZHMgbGl2ZXMgb24gdGhlIGhvc3QgYW5kIGlzIGFkdmFuY2VkIGFzIGV2ZW50cyBhcmUgY29uc3VtZWQsXG4gKiBtYXRjaGluZyB0aGUgbm9kZTp2bSBlbmdpbmUncyBkZXRlcm1pbmlzdGljIHJlcGxheSBjbG9jay5cbiAqXG4gKiBUaGlzIHBoYXNlIGlzIHRoZSBmdXR1cmUgYm91bmRhcnkgZm9yIFZNLW1lbW9yeSBzbmFwc2hvdHRpbmc6IGFcbiAqIGJ1aWxkLXRpbWUgc25hcHNob3QgY2FuIGNhcHR1cmUgdGhlIFZNIHJpZ2h0IGFmdGVyIHRoaXMgZnVuY3Rpb24gYW5kXG4gKiBuZXcgcnVucyBjYW4gcmVzdG9yZSBmcm9tIGl0IGluc3RlYWQgb2YgcGF5aW5nIFZNIGNyZWF0aW9uICsgZXZhbCBjb3N0XG4gKiAoYFF1aWNrSlMucmVzdG9yZWAgYWNjZXB0cyB0aGUgc2FtZSB3YXNpIG92ZXJyaWRlKS5cbiAqL1xuLyoqXG4gKiBMb29zZWx5LXR5cGVkIGFjY2Vzc29yIGZvciB0aGUgYFdlYkFzc2VtYmx5YCBnbG9iYWwuIFRoZSBwYWNrYWdlXG4gKiB0c2NvbmZpZydzIGBsaWI6IFtcImVzMjAyMlwiXWAgZG9lcyBub3QgaW5jbHVkZSB0aGUgRE9NIGxpYiB3aGVyZSB0aGVcbiAqIGBXZWJBc3NlbWJseWAgbmFtZXNwYWNlIHR5cGVzIGxpdmU7IHRoZSBydW50aW1lIGdsb2JhbCBpcyBhdmFpbGFibGUgb25cbiAqIGV2ZXJ5IFdBU00tY2FwYWJsZSBwbGF0Zm9ybSB0aGlzIGVuZ2luZSB0YXJnZXRzLlxuICovXG5jb25zdCBXZWJBc3NlbWJseUdsb2JhbCA9IChnbG9iYWxUaGlzIGFzIGFueSkuV2ViQXNzZW1ibHkgYXMge1xuICBjb21waWxlKGJ5dGVzOiBVaW50OEFycmF5KTogUHJvbWlzZTxvYmplY3Q+O1xufTtcblxudHlwZSBDb21waWxlZEV4dGVuc2lvbiA9IE9taXQ8RXh0ZW5zaW9uRGVzY3JpcHRvciwgJ3dhc20nPiAmIHtcbiAgd2FzbTogRXh0ZW5zaW9uRGVzY3JpcHRvclsnd2FzbSddO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzLXdpZGUgY2FjaGUgb2YgdGhlIGNvbXBpbGVkIGBXZWJBc3NlbWJseS5Nb2R1bGVgcyBmb3IgdGhlIG1haW5cbiAqIFF1aWNrSlMgcnVudGltZSBhbmQgaXRzIG5hdGl2ZSBleHRlbnNpb25zLiBgV2ViQXNzZW1ibHkuY29tcGlsZWAgb2YgdGhlXG4gKiB+NjAwIEtCIHJ1bnRpbWUgYmluYXJ5IGlzIHRoZSBtb3N0IGV4cGVuc2l2ZSBwYXJ0IG9mIFZNIGNyZWF0aW9uIGFuZCBpc1xuICogcHVyZSAobm8gcGVyLVZNIHN0YXRlOiBpbnN0YW50aWF0aW9uIGJpbmRzIHRoZSBwZXItVk0gbWVtb3J5KSwgc28gaXRcbiAqIG9ubHkgbmVlZHMgdG8gaGFwcGVuIG9uY2UgcGVyIHByb2Nlc3MuIFRoZSBwcm9taXNlIGlzIGNhY2hlZCAobm90IHRoZVxuICogcmVzdWx0KSBzbyBjb25jdXJyZW50IGZpcnN0IGludm9jYXRpb25zIHNoYXJlIGEgc2luZ2xlIGNvbXBpbGF0aW9uLlxuICovXG4vLyBPbiBgZ2xvYmFsVGhpc2AgKHNlZSBgZ2xvYmFsU2luZ2xldG9uYCk6IHRoZSBjb21tZW50IGFib3ZlIHNheXMgb25jZSBwZXJcbi8vIHByb2Nlc3MsIGFuZCBtb2R1bGUgc2NvcGUgd291bGQgbWFrZSBpdCBvbmNlIHBlciBidW5kbGVyIGxheWVyLCByZWNvbXBpbGluZ1xuLy8gdGhlIH42MDAgS0IgcnVudGltZSBiaW5hcnkgZm9yIGVhY2guXG5jb25zdCBxdWlja2pzQXNzZXRzID0gZ2xvYmFsU2luZ2xldG9uKFxuICAnQHdvcmtmbG93L2NvcmUvL3F1aWNranNDb21waWxlZEFzc2V0cycsXG4gIDEsXG4gICgpID0+ICh7XG4gICAgcHJvbWlzZTogdW5kZWZpbmVkIGFzXG4gICAgICB8IFByb21pc2U8e1xuICAgICAgICAgIHdhc206IG9iamVjdDtcbiAgICAgICAgICBleHRlbnNpb25zOiBDb21waWxlZEV4dGVuc2lvbltdO1xuICAgICAgICB9PlxuICAgICAgfCB1bmRlZmluZWQsXG4gIH0pXG4pO1xuXG5mdW5jdGlvbiBnZXRDb21waWxlZEFzc2V0cygpIHtcbiAgaWYgKCFxdWlja2pzQXNzZXRzLnByb21pc2UpIHtcbiAgICBxdWlja2pzQXNzZXRzLnByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgW3dhc20sIC4uLmV4dGVuc2lvbk1vZHVsZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBXZWJBc3NlbWJseUdsb2JhbC5jb21waWxlKHF1aWNranNXYXNtKSxcbiAgICAgICAgLi4ucXVpY2tqc0V4dGVuc2lvbnMubWFwKChleHQpID0+XG4gICAgICAgICAgV2ViQXNzZW1ibHlHbG9iYWwuY29tcGlsZShleHQud2FzbSBhcyBVaW50OEFycmF5KVxuICAgICAgICApLFxuICAgICAgXSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3YXNtLFxuICAgICAgICBleHRlbnNpb25zOiBxdWlja2pzRXh0ZW5zaW9ucy5tYXAoKGV4dCwgaSkgPT4gKHtcbiAgICAgICAgICAuLi5leHQsXG4gICAgICAgICAgd2FzbTogZXh0ZW5zaW9uTW9kdWxlc1tpXSBhcyBFeHRlbnNpb25EZXNjcmlwdG9yWyd3YXNtJ10sXG4gICAgICAgIH0pKSxcbiAgICAgIH07XG4gICAgfSkoKTtcbiAgICAvLyBPbiBmYWlsdXJlLCBjbGVhciB0aGUgY2FjaGUgc28gYSBsYXRlciBpbnZvY2F0aW9uIGNhbiByZXRyeSByYXRoZXJcbiAgICAvLyB0aGFuIGJlaW5nIHN0dWNrIHdpdGggYSByZWplY3RlZCBwcm9taXNlIGZvcmV2ZXIuXG4gICAgcXVpY2tqc0Fzc2V0cy5wcm9taXNlLmNhdGNoKCgpID0+IHtcbiAgICAgIHF1aWNranNBc3NldHMucHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcXVpY2tqc0Fzc2V0cy5wcm9taXNlO1xufVxuXG4vKipcbiAqIFdBU0kgY2xvY2sgb3ZlcnJpZGUgcmVhZGluZyB0aGUgZ2l2ZW4gYWNjZXNzb3IsIHNoYXJlZCBiZXR3ZWVuIGZyZXNoXG4gKiBib290cyAoaW5pdFdvcmtmbG93Vk0pIGFuZCBiYXNlbGluZS1zbmFwc2hvdCByZXN0b3Jlcywgc28gdGhlIHR3b1xuICogcGF0aHMgY2Fubm90IGRyaWZ0IG9uIHJvdW5kaW5nL2VuY29kaW5nLlxuICpcbiAqIERldGVybWluaXN0aWMgcmVwbGF5IGNsb2NrOiBEYXRlLm5vdygpIC8gbmV3IERhdGUoKSBpbnNpZGUgdGhlIFZNXG4gKiByZWFkIHRoZSBob3N0LWNvbnRyb2xsZWQgY2xvY2sgaW5zdGVhZCBvZiB3YWxsIHRpbWUuIFJlcGxheVxuICogcmUtZXhlY3V0ZXMgdGhlIHdvcmtmbG93IGZyb20gdGhlIHRvcCBvbiBldmVyeSBpbnZvY2F0aW9uLCBzbyB0aGVcbiAqIGNsb2NrIG11c3QgYmUgZGVyaXZlZCBmcm9tIHRoZSBldmVudCBsb2cgKG5vdCByZWFsIHRpbWUpIGZvciB0aGVcbiAqIHdvcmtmbG93IHRvIG9ic2VydmUgc3RhYmxlIHRpbWVzdGFtcHMgYWNyb3NzIGludm9jYXRpb25zLlxuICovXG5mdW5jdGlvbiBtYWtlRGV0ZXJtaW5pc3RpY0Nsb2NrV2FzaShnZXROb3dNczogKCkgPT4gbnVtYmVyKTogV2FzaU9wdGlvbnMge1xuICByZXR1cm4gKG1lbW9yeSkgPT4gKHtcbiAgICBjbG9ja190aW1lX2dldChfY2xvY2tJZDogbnVtYmVyLCBfcHJlY2lzaW9uOiBiaWdpbnQsIHJlc3VsdFB0cjogbnVtYmVyKSB7XG4gICAgICBjb25zdCB0aW1lTnMgPSBCaWdJbnQoTWF0aC5yb3VuZChnZXROb3dNcygpKSkgKiAxXzAwMF8wMDBuO1xuICAgICAgbmV3IERhdGFWaWV3KG1lbW9yeS5idWZmZXIpLnNldEJpZ1VpbnQ2NChyZXN1bHRQdHIsIHRpbWVOcywgdHJ1ZSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9LFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdFdvcmtmbG93Vk0oXG4gIGdldE5vd01zOiAoKSA9PiBudW1iZXIsXG4gIGludGVycnVwdEJ1ZGdldDogSW50ZXJydXB0QnVkZ2V0XG4pOiBQcm9taXNlPFF1aWNrSlM+IHtcbiAgY29uc3QgYXNzZXRzID0gYXdhaXQgZ2V0Q29tcGlsZWRBc3NldHMoKTtcbiAgY29uc3Qgdm0gPSBhd2FpdCBRdWlja0pTLmNyZWF0ZSh7XG4gICAgd2FzbTogYXNzZXRzLndhc20gYXMgbmV2ZXIsXG4gICAgbWVtb3J5TGltaXQ6IDI1NiAqIDEwMjQgKiAxMDI0LFxuICAgIGludGVycnVwdEhhbmRsZXI6IGNyZWF0ZUludGVycnVwdEhhbmRsZXIoaW50ZXJydXB0QnVkZ2V0KSxcbiAgICBleHRlbnNpb25zOiBhc3NldHMuZXh0ZW5zaW9ucyxcbiAgICB3YXNpOiBtYWtlRGV0ZXJtaW5pc3RpY0Nsb2NrV2FzaShnZXROb3dNcyksXG4gIH0pO1xuXG4gIC8vIEJvb3RzdHJhcCB3b3JrZmxvdyBwcmltaXRpdmVzXG4gIHZtLmV2YWxDb2RlKFZNX0JPT1RTVFJBUCwgJ2Jvb3RzdHJhcC5qcycpLmRpc3Bvc2UoKTtcblxuICByZXR1cm4gdm07XG59XG5cbi8vIC0tLS0gQmFzZWxpbmUgc25hcHNob3QgKHN0YXJ0dXAgb3B0aW1pemF0aW9uKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy9cbi8vIEV2YWx1YXRpbmcgdGhlIHdvcmtmbG93IGJ1bmRsZSBkb21pbmF0ZXMgVk0gc3RhcnR1cCAofjc0bXMgb2YgYSB+Nzdtc1xuLy8gYm9vdCBmb3IgYSAxLjNNQiBidW5kbGUpLCBhbmQgZnVsbCBldmVudCByZXBsYXkgcGF5cyBpdCBvbiBFVkVSWVxuLy8gaW52b2NhdGlvbi4gVGhlIGJ1bmRsZSBpcyBpZGVudGljYWwgYWNyb3NzIGFsbCBydW5zIG9mIGEgZGVwbG95bWVudCwgc29cbi8vIHRoZSBlbmdpbmUgaHlkcmF0ZXMgb25lIFZNIHBlciBmdW5jdGlvbiBpbnN0YW5jZSAoYm9vdHN0cmFwICsgYnVuZGxlXG4vLyBldmFsKSwgc25hcHNob3RzIGl0cyBtZW1vcnksIGFuZCBzdGFydHMgZXZlcnkgaW52b2NhdGlvbiBieSByZXN0b3Jpbmdcbi8vIHRoZSBzbmFwc2hvdCAofjNtcykgaW5zdGVhZCBvZiByZS1ldmFsdWF0aW5nLlxuLy9cbi8vIERldGVybWluaXNtOiByZXBsYXkgcmVxdWlyZXMgbW9kdWxlLXNjb3BlIHVzZXIgY29kZSB0byBvYnNlcnZlIHRoZVxuLy8gcnVuLXNlZWRlZCBQUk5HIGFuZCB0aGUgcnVuJ3MgZGV0ZXJtaW5pc3RpYyBjbG9jay4gQSByZXN0b3JlZCBoZWFwXG4vLyBjYXJyaWVzIHdoYXRldmVyIG1vZHVsZSBzY29wZSBjb21wdXRlZCBhdCBIWURSQVRFIHRpbWUsIHNvIHRoZVxuLy8gb3B0aW1pemF0aW9uIGlzIG9ubHkgc291bmQgd2hlbiBtb2R1bGUgc2NvcGUgY29uc3VtZWQgbmVpdGhlclxuLy8gcmFuZG9tbmVzcyBub3IgdGltZS4gQm90aCBhcmUgZGV0ZWN0ZWQgZHVyaW5nIGh5ZHJhdGUgKHRoZSBwbGFjZWhvbGRlclxuLy8gaG9zdCBmbnMgY291bnQgZHJhd3MsIHRoZSBoeWRyYXRlIGNsb2NrIGNvdW50cyByZWFkcykgYW5kIGEgYnVuZGxlXG4vLyB0aGF0IHVzZWQgZWl0aGVyIGlzIG1hcmtlZCBpbmVsaWdpYmxlOiBldmVyeSBpbnZvY2F0aW9uIGZhbGxzIGJhY2sgdG9cbi8vIGZyZXNoIGV2YWx1YXRpb24sIHByZXNlcnZpbmcgZXhhY3Qgbm9kZTp2bS1wYXJpdHkgc2VtYW50aWNzLiBXaGVuIHRoZVxuLy8gZ2F0ZSBwYXNzZXMsIHJlc3RvcmUgaXMgYnl0ZS1lcXVpdmFsZW50IHRvIGZyZXNoIGV2YWwgKHZlcmlmaWVkIGJ5IHRoZVxuLy8gcGFyaXR5IHRlc3RzKTogdGhlIHBlci1ydW4gaG9zdCBmbnMgYXJlIHJlLXJlZ2lzdGVyZWQgYnkgbmFtZSBvbiB0aGVcbi8vIHJlc3RvcmVkIFZNIChxdWlja2pzLXdhc2kgcmVzdG9yZSBzZW1hbnRpY3MpIGJlZm9yZSB0aGUgd29ya2Zsb3cgYm9keVxuLy8gcnVucywgc28gdGhlIHNlZWRlZCBkcmF3IHNlcXVlbmNlIChhbmQgZXZlcnkgY29ycmVsYXRpb25JZCkgaXNcbi8vIGlkZW50aWNhbC5cbi8vXG4vLyBUaGUgY2FjaGUgaXMgcGVyIGZ1bmN0aW9uIGluc3RhbmNlIGFuZCBrZXllZCBvbiB0aGUgYnVuZGxlIHN0cmluZ1xuLy8gKHJlZmVyZW5jZS1zdGFibGU6IHRoZSBnZW5lcmF0ZWQgZmxvdyByb3V0ZSBob2xkcyBpdCBpbiBhIG1vZHVsZS1sZXZlbFxuLy8gY29uc3QpLiBDYXBwZWQgYXQgYSBmZXcgZW50cmllcyBzbyB0ZXN0cyB3aXRoIG1hbnkgZGlzdGluY3QgYnVuZGxlc1xuLy8gZG9uJ3QgYWNjdW11bGF0ZSAxNk1CIHNuYXBzaG90cy5cblxuLyoqXG4gKiBFdmFsIGZpbGVuYW1lIHVzZWQgd2hlbiBoeWRyYXRpbmcgdGhlIGJhc2VsaW5lIFZNLiBUaGUgYmFzZWxpbmUgaXNcbiAqIHNoYXJlZCBieSBFVkVSWSB3b3JrZmxvdyBpbiB0aGUgYnVuZGxlLCBzbyB0aGUgZmlsZW5hbWUgYmFrZWQgaW50b1xuICogaXRzIGNvbXBpbGVkIGNvZGUgKGFuZCB0aGVyZWZvcmUgaW50byBzbmFwc2hvdC1wYXRoIHN0YWNrIGZyYW1lcylcbiAqIG11c3QgYmUgd29ya2Zsb3ctaW5kZXBlbmRlbnQ6IGh5ZHJhdGluZyB1bmRlciB0aGUgZmlyc3QgY2FsbGVyJ3NcbiAqIHdvcmtmbG93SWQgd291bGQgYnJlYWsgYHJlbWFwRXJyb3JTdGFja2AncyBmaWxlbmFtZSBtYXRjaGluZyBmb3JcbiAqIGV2ZXJ5IG90aGVyIHdvcmtmbG93IGluIHRoZSBidW5kbGUuIFJlbWFwIGNhbGwgc2l0ZXMgbWF0Y2ggdGhpc1xuICogY29uc3RhbnQgSU4gQURESVRJT04gdG8gdGhlIHJ1bidzIG1vZHVsZSBzcGVjaWZpZXIgKHdoaWNoIGNvdmVyc1xuICogZnJlc2gtcGF0aCBmcmFtZXMpLlxuICovXG5leHBvcnQgY29uc3QgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FID0gJ3dvcmtmbG93LWJ1bmRsZS5qcyc7XG5cbnR5cGUgQmFzZWxpbmVFbnRyeSA9XG4gIHwge1xuICAgICAgc3RhdGU6ICdyZWFkeSc7XG4gICAgICBzbmFwc2hvdDogU25hcHNob3Q7XG4gICAgICAvKipcbiAgICAgICAqIFJhdyBib3ggcG9pbnRlciBvZiB0aGUgc2VyZGUgY2FwdHVyZSByb290IGNyZWF0ZWQgQkVGT1JFIHRoZVxuICAgICAgICogYnVuZGxlIGV2YWx1YXRlZCAoc2VlIGNhcHR1cmVTZXJkZVJvb3QpLiBUaGUgYm94IGxpdmVzIGluIHRoZVxuICAgICAgICogc25hcHNob3QncyBtZW1vcnkgaW1hZ2UgYXQgdGhpcyBvZmZzZXQ7IGV2ZXJ5IHJlc3RvcmVkIFZNXG4gICAgICAgKiByZS1hZG9wdHMgaXQgc28gc2VyZGUgaW5pdGlhbGl6YXRpb24gZXhlY3V0ZXMgbm8gZ3Vlc3QgY29kZVxuICAgICAgICogYWZ0ZXIgdXNlciBjb2RlIGhhcyBydW46IGNhcHR1cmUtYmVmb3JlLXVzZXItY29kZSBzZW1hbnRpY3MsXG4gICAgICAgKiBpZGVudGljYWwgdG8gdGhlIGZyZXNoIHBhdGguXG4gICAgICAgKi9cbiAgICAgIHNlcmRlUm9vdFB0cjogbnVtYmVyO1xuICAgIH1cbiAgfCB7IHN0YXRlOiAnaW5lbGlnaWJsZSc7IHJlYXNvbjogc3RyaW5nIH07XG5cbi8vIE9uIGBnbG9iYWxUaGlzYCAoc2VlIGBnbG9iYWxTaW5nbGV0b25gKTogYSBzbmFwc2hvdCBpcyBleHBlbnNpdmUgdG8gYnVpbGQgYW5kXG4vLyBpcyBrZXllZCBieSBidW5kbGUsIHNvIHBlci1jb3B5IGNhY2hlcyB3b3VsZCBidWlsZCB0aGUgc2FtZSBiYXNlbGluZSBvbmNlIHBlclxuLy8gYnVuZGxlciBsYXllciB3aGlsZSBlYWNoIGVuZm9yY2luZyBpdHMgb3duIGJvdW5kLlxuY29uc3QgYmFzZWxpbmVzID0gZ2xvYmFsU2luZ2xldG9uKFxuICAnQHdvcmtmbG93L2NvcmUvL3F1aWNranNCYXNlbGluZXMnLFxuICAxLFxuICAoKSA9PiAoe1xuICAgIGJ5S2V5OiBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxCYXNlbGluZUVudHJ5Pj4oKSxcbiAgfSlcbik7XG5jb25zdCBCQVNFTElORV9DQUNIRV9NQVhfRU5UUklFUyA9IDQ7XG5cbi8qKiBUZXN0LW9ubHk6IHJlc2V0IHRoZSBiYXNlbGluZSBjYWNoZSBiZXR3ZWVuIHRlc3QgY2FzZXMuICovXG5leHBvcnQgZnVuY3Rpb24gX19jbGVhckJhc2VsaW5lU25hcHNob3RDYWNoZUZvclRlc3RzKCk6IHZvaWQge1xuICBiYXNlbGluZXMuYnlLZXkuY2xlYXIoKTtcbn1cblxuLyoqIFRlc3Qtb25seTogb2JzZXJ2ZSBob3cgYSBidW5kbGUgd2FzIGNsYXNzaWZpZWQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX19wZWVrQmFzZWxpbmVFbnRyeUZvclRlc3RzKFxuICB3b3JrZmxvd0NvZGU6IHN0cmluZ1xuKTogUHJvbWlzZTxCYXNlbGluZUVudHJ5IHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiBiYXNlbGluZXMuYnlLZXkuZ2V0KHdvcmtmbG93Q29kZSk7XG59XG5cbi8qKlxuICogSHlkcmF0ZSBhIFZNIHdpdGggdGhlIHdvcmtmbG93IGJ1bmRsZSBhbmQgc25hcHNob3QgaXQsIGdhdGluZyBvblxuICogbW9kdWxlLXNjb3BlIG5vbmRldGVybWluaXNtIChzZWUgdGhlIHNlY3Rpb24gY29tbWVudCBhYm92ZSkuIFJldHVybnMgYW5cbiAqIGBpbmVsaWdpYmxlYCBlbnRyeSBpbnN0ZWFkIG9mIHRocm93aW5nIG9uIGV2YWwgZmFpbHVyZTogdGhlIGZyZXNoIHBhdGhcbiAqIHJlLWV2YWx1YXRlcyBhbmQgcHJvZHVjZXMgdGhlIHJlYWwsIHNvdXJjZS1tYXBwZWQgZXJyb3IuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVCYXNlbGluZVNuYXBzaG90KFxuICB3b3JrZmxvd0NvZGU6IHN0cmluZyxcbiAgd29ya2Zsb3dJZDogc3RyaW5nXG4pOiBQcm9taXNlPEJhc2VsaW5lRW50cnk+IHtcbiAgY29uc3QgaHlkcmF0ZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgbGV0IGNsb2NrUmVhZHMgPSAwO1xuICBjb25zdCBidWRnZXQ6IEludGVycnVwdEJ1ZGdldCA9IHsgc3RhcnQ6IERhdGUubm93KCkgfTtcbiAgY29uc3QgYXNzZXRzID0gYXdhaXQgZ2V0Q29tcGlsZWRBc3NldHMoKTtcbiAgY29uc3Qgdm0gPSBhd2FpdCBRdWlja0pTLmNyZWF0ZSh7XG4gICAgd2FzbTogYXNzZXRzLndhc20gYXMgbmV2ZXIsXG4gICAgbWVtb3J5TGltaXQ6IDI1NiAqIDEwMjQgKiAxMDI0LFxuICAgIGludGVycnVwdEhhbmRsZXI6IGNyZWF0ZUludGVycnVwdEhhbmRsZXIoYnVkZ2V0KSxcbiAgICBleHRlbnNpb25zOiBhc3NldHMuZXh0ZW5zaW9ucyxcbiAgICB3YXNpOiAoKG1lbW9yeSkgPT4gKHtcbiAgICAgIGNsb2NrX3RpbWVfZ2V0KF9jbG9ja0lkOiBudW1iZXIsIF9wcmVjaXNpb246IGJpZ2ludCwgcmVzdWx0UHRyOiBudW1iZXIpIHtcbiAgICAgICAgY2xvY2tSZWFkcysrO1xuICAgICAgICBjb25zdCB0aW1lTnMgPSBCaWdJbnQoaHlkcmF0ZVN0YXJ0KSAqIDFfMDAwXzAwMG47XG4gICAgICAgIG5ldyBEYXRhVmlldyhtZW1vcnkuYnVmZmVyKS5zZXRCaWdVaW50NjQocmVzdWx0UHRyLCB0aW1lTnMsIHRydWUpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH0sXG4gICAgfSkpIHNhdGlzZmllcyBXYXNpT3B0aW9ucyxcbiAgfSk7XG4gIHRyeSB7XG4gICAgdm0uZXZhbENvZGUoVk1fQk9PVFNUUkFQLCAnYm9vdHN0cmFwLmpzJykuZGlzcG9zZSgpO1xuXG4gICAgLy8gUGxhY2Vob2xkZXIgaG9zdCBmbnMgdW5kZXIgdGhlIFNBTUUgTkFNRVMgdGhlIHBlci1ydW4gcGhhc2UgdXNlcy5cbiAgICAvLyBUaGV5IGV4aXN0IHNvIG1vZHVsZS1zY29wZSBjb2RlIGNhbiBleGVjdXRlIGF0IGh5ZHJhdGUgdGltZSwgYW5kIHRvXG4gICAgLy8gZGV0ZWN0IHRoYXQgaXQgZGlkOiBhbnkgZHJhdyBtZWFucyB0aGUgaGVhcCB3b3VsZCBiYWtlXG4gICAgLy8gaHlkcmF0ZS1zZWVkZWQgdmFsdWVzIHRoYXQgcGVyLXJ1biBmcmVzaCBldmFsIHdvdWxkIGNvbXB1dGVcbiAgICAvLyBkaWZmZXJlbnRseS4gcnVuV29ya2Zsb3dJblZNIHJlLXJlZ2lzdGVycyBhbGwgdGhyZWUgbmFtZXMgd2l0aCB0aGVcbiAgICAvLyBydW4tc2VlZGVkIGNsb3N1cmVzIGFmdGVyIHJlc3RvcmUuXG4gICAgbGV0IGRyYXdzID0gMDtcbiAgICB7XG4gICAgICB1c2luZyByYW5kb21GbiA9IHZtLm5ld0Z1bmN0aW9uKCdyYW5kb20nLCAoKSA9PiB7XG4gICAgICAgIGRyYXdzKys7XG4gICAgICAgIHJldHVybiB2bS5uZXdOdW1iZXIoTWF0aC5yYW5kb20oKSk7XG4gICAgICB9KTtcbiAgICAgIHVzaW5nIG1hdGggPSB2bS5nbG9iYWwuZ2V0UHJvcCgnTWF0aCcpO1xuICAgICAgbWF0aC5zZXRQcm9wKCdyYW5kb20nLCByYW5kb21Gbik7XG4gICAgICB1c2luZyBuYW5vaWRGbiA9IHZtLm5ld0Z1bmN0aW9uKCdfX2dlbmVyYXRlTmFub2lkJywgKCkgPT4ge1xuICAgICAgICBkcmF3cysrO1xuICAgICAgICByZXR1cm4gdm0ubmV3U3RyaW5nKCdiYXNlbGluZS1wbGFjZWhvbGRlcicpO1xuICAgICAgfSk7XG4gICAgICB2bS5zZXRQcm9wKHZtLmdsb2JhbCwgJ19fZ2VuZXJhdGVOYW5vaWQnLCBuYW5vaWRGbik7XG4gICAgICB1c2luZyB1bGlkRm4gPSB2bS5uZXdGdW5jdGlvbignX19nZW5lcmF0ZVVsaWQnLCAoKSA9PiB7XG4gICAgICAgIGRyYXdzKys7XG4gICAgICAgIHJldHVybiB2bS5uZXdTdHJpbmcoJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyk7XG4gICAgICB9KTtcbiAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX19nZW5lcmF0ZVVsaWQnLCB1bGlkRm4pO1xuICAgIH1cblxuICAgIC8vIFNlcmRlIGNhcHR1cmUgcm9vdDogY3JlYXRlZCBCRUZPUkUgdGhlIGJ1bmRsZSBldmFsdWF0ZXMsIGV4YWN0bHlcbiAgICAvLyBsaWtlIHRoZSBmcmVzaCBwYXRoJ3MgY2FwdHVyZS4gSXRzIGJveCBwb2ludGVyIHJpZGVzIHRoZVxuICAgIC8vIEJhc2VsaW5lRW50cnkgYW5kIGVhY2ggcmVzdG9yZWQgVk0gcmUtYWRvcHRzIGl0LCBzbyBzZXJkZVxuICAgIC8vIGluaXRpYWxpemF0aW9uIG5ldmVyIGV4ZWN1dGVzIGd1ZXN0IGNvZGUgYWZ0ZXIgdXNlciBjb2RlIGhhcyBydW4uXG4gICAgLy8gVGhpcyBpcyB3aGF0IG1ha2VzIG1vZHVsZS1zY29wZSBpbnRyaW5zaWMgcGF0Y2hpbmcgKHBvbHlmaWxscyxcbiAgICAvLyBzdGF0ZWZ1bCB3cmFwcGVycyBhcm91bmQgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciwg4oCmKVxuICAgIC8vIEhBUk1MRVNTIG9uIHRoZSBzbmFwc2hvdCBwYXRoIHJhdGhlciB0aGFuIG1lcmVseSBkZXRlY3RhYmxlOiB0aGVcbiAgICAvLyBzZXJkZSB1c2VzIHRoZSBwcmlzdGluZSBwcmUtZXZhbCBjYXB0dXJlcyBvbiBib3RoIHBhdGhzLCBhbmQgbm9cbiAgICAvLyBwb3N0LWV2YWwgcHJvYmUgZXhpc3RzIHdob3NlIHNpZGUgZWZmZWN0cyBjb3VsZCBiYWtlIGludG8gdGhlXG4gICAgLy8gc25hcHNob3QuIFRoZSBoYW5kbGUgaXMgZGVsaWJlcmF0ZWx5IE5PVCBkaXNwb3NlZCBiZWZvcmUgdGhlXG4gICAgLy8gc25hcHNob3Q6IHRoZSBib3ggbXVzdCBzdGF5IGxpdmUgaW4gdGhlIG1lbW9yeSBpbWFnZSAodGhlXG4gICAgLy8gYmFzZWxpbmUgVk0ncyBkaXNwb3NlIGJlbG93IHRlYXJzIGRvd24gdGhlIHdob2xlIGluc3RhbmNlIHdpdGhvdXRcbiAgICAvLyBmcmVlaW5nIGluZGl2aWR1YWwgYm94ZXMpLlxuICAgIGNvbnN0IHNlcmRlUm9vdCA9IGNhcHR1cmVTZXJkZVJvb3Qodm0pO1xuXG4gICAgY2xvY2tSZWFkcyA9IDA7IC8vIG9ubHkgY291bnQgcmVhZHMgbWFkZSBieSB0aGUgYnVuZGxlIGl0c2VsZlxuICAgIHRyeSB7XG4gICAgICAvLyBXb3JrZmxvdy1pbmRlcGVuZGVudCBmaWxlbmFtZS4gU2VlIEJBU0VMSU5FX0JVTkRMRV9GSUxFTkFNRS5cbiAgICAgIHZtLmV2YWxDb2RlKHdvcmtmbG93Q29kZSwgQkFTRUxJTkVfQlVORExFX0ZJTEVOQU1FKS5kaXNwb3NlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZXQgdGhlIGZyZXNoIHBhdGggcmUtZXZhbHVhdGUgYW5kIHN1cmZhY2UgdGhlIHJlYWwgZXJyb3Igd2l0aFxuICAgICAgLy8gcHJvcGVyIGZpbGVuYW1lIC8gc291cmNlLW1hcCBoYW5kbGluZy5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXRlOiAnaW5lbGlnaWJsZScsXG4gICAgICAgIHJlYXNvbjogJ21vZHVsZSBzY29wZSB0aHJldyBkdXJpbmcgaHlkcmF0ZScsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChkcmF3cyA+IDAgfHwgY2xvY2tSZWFkcyA+IDApIHtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgJ1F1aWNrSlMgYmFzZWxpbmUgc25hcHNob3QgZGlzYWJsZWQgZm9yIHRoaXMgYnVuZGxlOiBtb2R1bGUgc2NvcGUgY29uc3VtZWQgbm9uZGV0ZXJtaW5pc3RpYyBpbnB1dHM7IGV2ZXJ5IGludm9jYXRpb24gd2lsbCBldmFsdWF0ZSB0aGUgYnVuZGxlIGZyZXNoJyxcbiAgICAgICAgeyB3b3JrZmxvd0lkLCBkcmF3cywgY2xvY2tSZWFkcyB9XG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdGU6ICdpbmVsaWdpYmxlJyxcbiAgICAgICAgcmVhc29uOiBgbW9kdWxlIHNjb3BlIGNvbnN1bWVkICR7ZHJhd3N9IFBSTkcgZHJhdyhzKSBhbmQgJHtjbG9ja1JlYWRzfSBjbG9jayByZWFkKHMpYCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc25hcHNob3QgPSB2bS5zbmFwc2hvdCgpO1xuICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgYmFzZWxpbmUgc25hcHNob3QgcHJlcGFyZWQnLCB7XG4gICAgICB3b3JrZmxvd0lkLFxuICAgICAgaHlkcmF0ZU1zOiBEYXRlLm5vdygpIC0gaHlkcmF0ZVN0YXJ0LFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZTogJ3JlYWR5JyxcbiAgICAgIHNuYXBzaG90LFxuICAgICAgc2VyZGVSb290UHRyOiBleHBvcnRTZXJkZVJvb3Qodm0sIHNlcmRlUm9vdCksXG4gICAgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB2bS5kaXNwb3NlKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWNoZWQgYmFzZWxpbmUgZW50cnkgZm9yIGEgYnVuZGxlLCBwcmVwYXJpbmcgaXQgb24gZmlyc3QgYWNjZXNzLlxuICogQ29uY3VycmVudCBmaXJzdCBpbnZvY2F0aW9ucyBzaGFyZSBvbmUgaHlkcmF0ZSB2aWEgdGhlIGNhY2hlZCBwcm9taXNlO1xuICogYSBoeWRyYXRlIHRoYXQgUkVKRUNUUyAoaW5mcmFzdHJ1Y3R1cmUgZmFpbHVyZSwgbm90IGJ1bmRsZSBldmFsLCB3aGljaFxuICogcmV0dXJucyBgaW5lbGlnaWJsZWApIGlzIGV2aWN0ZWQgc28gYSBsYXRlciBpbnZvY2F0aW9uIGNhbiByZXRyeS5cbiAqL1xuZnVuY3Rpb24gZ2V0QmFzZWxpbmVFbnRyeShcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gIHdvcmtmbG93SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxCYXNlbGluZUVudHJ5PiB7XG4gIGxldCBlbnRyeSA9IGJhc2VsaW5lcy5ieUtleS5nZXQod29ya2Zsb3dDb2RlKTtcbiAgaWYgKCFlbnRyeSkge1xuICAgIGlmIChiYXNlbGluZXMuYnlLZXkuc2l6ZSA+PSBCQVNFTElORV9DQUNIRV9NQVhfRU5UUklFUykge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gYmFzZWxpbmVzLmJ5S2V5LmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIGJhc2VsaW5lcy5ieUtleS5kZWxldGUob2xkZXN0KTtcbiAgICB9XG4gICAgZW50cnkgPSBwcmVwYXJlQmFzZWxpbmVTbmFwc2hvdCh3b3JrZmxvd0NvZGUsIHdvcmtmbG93SWQpO1xuICAgIGJhc2VsaW5lcy5ieUtleS5zZXQod29ya2Zsb3dDb2RlLCBlbnRyeSk7XG4gICAgZW50cnkuY2F0Y2goKCkgPT4gYmFzZWxpbmVzLmJ5S2V5LmRlbGV0ZSh3b3JrZmxvd0NvZGUpKTtcbiAgfVxuICByZXR1cm4gZW50cnk7XG59XG5cbi8qKlxuICogQSBsaXZlIFF1aWNrSlMgd29ya2Zsb3cgaW52b2NhdGlvbi4gV2hlbiB0aGUgaW5pdGlhbCBgcmVzdWx0YCBpc1xuICogYHN1c3BlbmRlZGAsIHRoZSBWTSBpcyBrZXB0IGFsaXZlIHNvIHRoZSBjYWxsZXIgY2FuIGZlZWQgbmV3bHkgcmVjb3JkZWRcbiAqIGV2ZW50cyAoZS5nLiB0ZXJtaW5hbCBldmVudHMgb2YgaW5saW5lLWV4ZWN1dGVkIHN0ZXBzKSBpbnRvIHRoZSBTQU1FIFZNXG4gKiB2aWEgYGNvbnRpbnVlV2l0aEV2ZW50c2AsIHJlc3VtaW5nIGV4ZWN1dGlvbiBleGFjdGx5IHdoZXJlIGl0IGxlZnQgb2ZmXG4gKiB3aXRob3V0IGEgZnJlc2gtVk0gcmUtcmVwbGF5LiBUZXJtaW5hbCByZXN1bHRzIGRpc3Bvc2UgdGhlIFZNXG4gKiBhdXRvbWF0aWNhbGx5OyBgZGlzcG9zZSgpYCBtdXN0IGJlIGNhbGxlZCB3aGVuIGFiYW5kb25pbmcgYSBzdXNwZW5kZWRcbiAqIHNlc3Npb24gKGlkZW1wb3RlbnQpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1aWNrSlNXb3JrZmxvd1Nlc3Npb24ge1xuICByZXN1bHQ6IFF1aWNrSlNSdW50aW1lUmVzdWx0O1xuICAvKipcbiAgICogUHJvY2VzcyBuZXdseSByZWNvcmRlZCBldmVudHMgaW4gdGhlIGxpdmUgVk0gYW5kIHJlLWV2YWx1YXRlIHRoZVxuICAgKiB3b3JrZmxvdyBzdGF0ZS4gT25seSB2YWxpZCB3aGlsZSB0aGUgbGFzdCByZXN1bHQgd2FzIGBzdXNwZW5kZWRgLlxuICAgKiBSZXNldHMgdGhlIFZNJ3MgaW50ZXJydXB0IGJ1ZGdldCBmb3IgdGhlIG5ldyBleGVjdXRpb24gYnVyc3QuXG4gICAqL1xuICBjb250aW51ZVdpdGhFdmVudHMobmV3RXZlbnRzOiBFdmVudFtdKTogUHJvbWlzZTxRdWlja0pTUnVudGltZVJlc3VsdD47XG4gIC8qKiBEaXNwb3NlIHRoZSBWTSBpZiBpdCBpcyBzdGlsbCBhbGl2ZS4gU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzLiAqL1xuICBkaXNwb3NlKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogUnVuIGEgd29ya2Zsb3cgaW52b2NhdGlvbiB0byBpdHMgZmlyc3Qgc2V0dGxlZCBzdGF0ZSBhbmQgZGlzcG9zZSB0aGVcbiAqIFZNLiBDb252ZW5pZW5jZSB3cmFwcGVyIG92ZXIge0BsaW5rIHN0YXJ0UXVpY2tKU1dvcmtmbG93fSBmb3IgY2FsbGVyc1xuICogKGFuZCB0ZXN0cykgdGhhdCBkb24ndCB1c2UgbGl2ZS1WTSBjb250aW51YXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5RdWlja0pTV29ya2Zsb3coXG4gIG9wdGlvbnM6IFF1aWNrSlNSdW50aW1lT3B0aW9uc1xuKTogUHJvbWlzZTxRdWlja0pTUnVudGltZVJlc3VsdD4ge1xuICBjb25zdCBzZXNzaW9uID0gYXdhaXQgc3RhcnRRdWlja0pTV29ya2Zsb3cob3B0aW9ucyk7XG4gIHNlc3Npb24uZGlzcG9zZSgpO1xuICByZXR1cm4gc2Vzc2lvbi5yZXN1bHQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydFF1aWNrSlNXb3JrZmxvdyhcbiAgb3B0aW9uczogUXVpY2tKU1J1bnRpbWVPcHRpb25zXG4pOiBQcm9taXNlPFF1aWNrSlNXb3JrZmxvd1Nlc3Npb24+IHtcbiAgY29uc3QgeyB3b3JrZmxvd0NvZGUsIHdvcmtmbG93SWQsIHdvcmtmbG93UnVuLCBldmVudHMgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3Qgc3RhcnRlZEF0ID0gd29ya2Zsb3dSdW4uc3RhcnRlZEF0ID8gK3dvcmtmbG93UnVuLnN0YXJ0ZWRBdCA6IERhdGUubm93KCk7XG5cbiAgLy8gRGV0ZXJtaW5pc3RpYyBQUk5HIHNlZWQsIGlkZW50aWNhbCBmb3IgRVZFUlkgaW52b2NhdGlvbiBvZiB0aGUgc2FtZVxuICAvLyBydW4uIEZ1bGwgZXZlbnQgcmVwbGF5IHJlcXVpcmVzIHRoaXM6IGVhY2ggaW52b2NhdGlvbiByZS1leGVjdXRlcyB0aGVcbiAgLy8gd29ya2Zsb3cgZnJvbSB0aGUgdG9wIGFuZCBtdXN0IHJlZ2VuZXJhdGUgdGhlIGV4YWN0IHNhbWUgY29ycmVsYXRpb25JZFxuICAvLyBzZXF1ZW5jZSBzbyB0aGF0IHBlbmRpbmcgb3BlcmF0aW9ucyByZS1jcmVhdGVkIGJ5IHJlcGxheSBtYXRjaCB0aGVcbiAgLy8gZXZlbnRzIHJlY29yZGVkIGJ5IGVhcmxpZXIgaW52b2NhdGlvbnMuIFNlcXVlbnRpYWwgb3BlcmF0aW9ucyB3aXRoaW5cbiAgLy8gb25lIGV4ZWN1dGlvbiBzdGlsbCBnZXQgZGlzdGluY3QgaWRzIGJlY2F1c2UgdGhlIFBSTkcgYWR2YW5jZXMgYXMgdGhlXG4gIC8vIHdvcmtmbG93IGRyYXdzIGZyb20gaXQuIElkZW50aWNhbCBzZWVkaW5nIGFjcm9zcyBDT05DVVJSRU5UIGludm9jYXRpb25zXG4gIC8vIG9mIHRoZSBzYW1lIHJ1biBpcyBhbHNvIGxvYWQtYmVhcmluZzogYm90aCBwcm9kdWNlIHRoZSBzYW1lIGlkcywgYW5kXG4gIC8vIHRoZSB3b3JsZCdzIHBlci0ocnVuSWQsIGNvcnJlbGF0aW9uSWQpIHVuaXF1ZW5lc3MgdHVybnMgdGhlIGR1cGxpY2F0ZVxuICAvLyBgZXZlbnRzLmNyZWF0ZWAgaW50byBhbiBFbnRpdHlDb25mbGljdEVycm9yIHRoYXQgdGhlIGVudHJ5cG9pbnRcbiAgLy8gc3dhbGxvd3MuXG4gIC8vXG4gIC8vIFRoZSBzZWVkIGlucHV0cyBNVVNUIGJlIHN0YWJsZSBhY3Jvc3MgaW52b2NhdGlvbnMuIE5vdGFibHlcbiAgLy8gYHN0YXJ0ZWRBdGAgaXMgTk9UOiB1bmRlciB0dXJibyB0aGUgZmlyc3QgaW52b2NhdGlvbiBydW5zIGFnYWluc3QgYVxuICAvLyBzeW50aGVzaXplZCBydW4gb2JqZWN0IHdob3NlIHRpbWVzdGFtcHMgZGlmZmVyIGZyb20gdGhlIGR1cmFibHlcbiAgLy8gc3RvcmVkIG9uZXMgdGhhdCBsYXRlciBpbnZvY2F0aW9ucyBsb2FkLiBNYXRjaGVzIHRoZSBub2RlOnZtXG4gIC8vIGVuZ2luZSdzIHNlZWQgKHdvcmtmbG93LnRzKS5cbiAgY29uc3Qgc2VlZCA9IFtcbiAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICB3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsXG4gICAgd29ya2Zsb3dSdW4uZGVwbG95bWVudElkLFxuICBdLmpvaW4oJzonKTtcbiAgY29uc3Qgcm5nID0gc2VlZHJhbmRvbShzZWVkKTtcblxuICAvLyBTZWVkZWQgbmFub2lkIGdlbmVyYXRvcjogdXNlcyB0aGUgc2FtZSBuYW5vaWQgcGFja2FnZSBhbmQgc2VlZGVkIFBSTkdcbiAgLy8gYXMgdGhlIG5vZGU6dm0gZW5naW5lIGZvciBjb25zaXN0ZW50IHRva2VuIGdlbmVyYXRpb24uXG4gIGNvbnN0IGdlbmVyYXRlTmFub2lkID0gbmFub2lkLmN1c3RvbVJhbmRvbShuYW5vaWQudXJsQWxwaGFiZXQsIDIxLCAoc2l6ZSkgPT5cbiAgICBuZXcgVWludDhBcnJheShzaXplKS5tYXAoKCkgPT4gMjU2ICogcm5nKCkpXG4gICk7XG5cbiAgLy8gRGV0ZXJtaW5pc3RpYyByZXBsYXkgY2xvY2ssIG1pcnJvcmluZyB0aGUgbm9kZTp2bSBlbmdpbmUgKHNlZVxuICAvLyB3b3JrZmxvdy50cyk6IHRoZSBpbml0aWFsIHZhbHVlIGlzIHRoZSBydW4ncyBjcmVhdGlvbiB0aW1lIHJlY292ZXJlZFxuICAvLyBmcm9tIHRoZSBVTElEIGVtYmVkZGVkIGluIGBydW5JZGAgKGZhbGxpbmcgYmFjayB0byBgY3JlYXRlZEF0YCksIGFuZFxuICAvLyBpdCBhZHZhbmNlcyB0byBlYWNoIHByb2Nlc3NlZCBldmVudCdzIGBjcmVhdGVkQXRgIGFzIHRoZSBldmVudCBsb2cgaXNcbiAgLy8gcmVwbGF5ZWQuIE1vbm90b25pYyAoTWF0aC5tYXgpIHNvIHRoZSBvdXRlciBwcm9jZXNzRXZlbnRzIHJlLXNjYW5cbiAgLy8gbG9vcCBjYW4ndCBtb3ZlIHRoZSBjbG9jayBiYWNrd2FyZHMgbWlkLWV4ZWN1dGlvbi5cbiAgbGV0IHZtTm93TXMgPVxuICAgIHJ1bklkQ3JlYXRlZEF0KHdvcmtmbG93UnVuLnJ1bklkKSA/PyAoK3dvcmtmbG93UnVuLmNyZWF0ZWRBdCB8fCBzdGFydGVkQXQpO1xuICBjb25zdCBhZHZhbmNlQ2xvY2sgPSAobXM6IG51bWJlcikgPT4ge1xuICAgIGlmIChOdW1iZXIuaXNGaW5pdGUobXMpKSB2bU5vd01zID0gTWF0aC5tYXgodm1Ob3dNcywgbXMpO1xuICB9O1xuXG4gIC8vIC0tLS0gUGhhc2UgMTogc3RhdGljIGluaXRpYWxpemF0aW9uIC0tLS1cbiAgLy9cbiAgLy8gQmFzZWxpbmUtc25hcHNob3QgZmFzdCBwYXRoIChkZWZhdWx0IE9OOyBzZWUgdGhlIHNlY3Rpb24gY29tbWVudCBhdFxuICAvLyBwcmVwYXJlQmFzZWxpbmVTbmFwc2hvdCk6IHJlc3RvcmUgYSBidW5kbGUtaHlkcmF0ZWQgVk0gaW5zdGVhZCBvZlxuICAvLyBib290aW5nIGZyZXNoIGFuZCByZS1ldmFsdWF0aW5nIHRoZSBidW5kbGUuIGBpbmVsaWdpYmxlYCBidW5kbGVzXG4gIC8vIChtb2R1bGUtc2NvcGUgbm9uZGV0ZXJtaW5pc20sIGV2YWwgZmFpbHVyZSkgdGFrZSB0aGUgZnJlc2ggcGF0aCB3aXRoXG4gIC8vIGlkZW50aWNhbCBzZW1hbnRpY3MuXG4gIGNvbnN0IGludGVycnVwdEJ1ZGdldDogSW50ZXJydXB0QnVkZ2V0ID0geyBzdGFydDogRGF0ZS5ub3coKSB9O1xuICBsZXQgYmFzZWxpbmVTbmFwc2hvdDogU25hcHNob3QgfCB1bmRlZmluZWQ7XG4gIGxldCBiYXNlbGluZVNlcmRlUm9vdFB0cjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAoaXNRdWlja0pTQmFzZWxpbmVTbmFwc2hvdEVuYWJsZWQoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGF3YWl0IGdldEJhc2VsaW5lRW50cnkod29ya2Zsb3dDb2RlLCB3b3JrZmxvd0lkKTtcbiAgICAgIGlmIChlbnRyeS5zdGF0ZSA9PT0gJ3JlYWR5Jykge1xuICAgICAgICBiYXNlbGluZVNuYXBzaG90ID0gZW50cnkuc25hcHNob3Q7XG4gICAgICAgIGJhc2VsaW5lU2VyZGVSb290UHRyID0gZW50cnkuc2VyZGVSb290UHRyO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gQSByZWplY3Rpb24gaGVyZSBpcyBhbiBpbmZyYXN0cnVjdHVyZSBmYWlsdXJlIGR1cmluZyBoeWRyYXRlXG4gICAgICAvLyAoZS5nLiB2bS5zbmFwc2hvdCgpIHVuZGVyIG1lbW9yeSBwcmVzc3VyZSwgUXVpY2tKUy5jcmVhdGUgb3JcbiAgICAgIC8vIGdldENvbXBpbGVkQXNzZXRzKCkgZmFpbGluZyksIE5PVCBidW5kbGUgZXZhbCwgd2hpY2ggcmV0dXJuc1xuICAgICAgLy8gYW4gaW5lbGlnaWJsZSBlbnRyeS4gZ2V0QmFzZWxpbmVFbnRyeSBoYXMgYWxyZWFkeSBldmljdGVkIHRoZVxuICAgICAgLy8gY2FjaGVkIHByb21pc2Ugc28gYSBsYXRlciBpbnZvY2F0aW9uIGNhbiByZXRyeS4gVGhpcyBpbnZvY2F0aW9uXG4gICAgICAvLyBtdXN0IGZhbGwgYmFjayB0byBmcmVzaCBldmFsdWF0aW9uICh3aGljaCB3b3VsZCBoYXZlIHN1Y2NlZWRlZClcbiAgICAgIC8vIHJhdGhlciB0aGFuIGZhaWwgdGhlIHdob2xlIHJ1biBmb3IgYSBzbmFwc2hvdC1vbmx5IGZhaWx1cmUgbW9kZS5cbiAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgJ1F1aWNrSlMgYmFzZWxpbmUgc25hcHNob3QgaHlkcmF0ZSBmYWlsZWQ7IGZhbGxpbmcgYmFjayB0byBmcmVzaCBldmFsdWF0aW9uIGZvciB0aGlzIGludm9jYXRpb24nLFxuICAgICAgICB7IHdvcmtmbG93SWQsIGVycm9yOiBlcnIgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgbGV0IHZtOiBRdWlja0pTO1xuICBpZiAoYmFzZWxpbmVTbmFwc2hvdCkge1xuICAgIGNvbnN0IGFzc2V0cyA9IGF3YWl0IGdldENvbXBpbGVkQXNzZXRzKCk7XG4gICAgdm0gPSBhd2FpdCBRdWlja0pTLnJlc3RvcmUoYmFzZWxpbmVTbmFwc2hvdCwge1xuICAgICAgd2FzbTogYXNzZXRzLndhc20gYXMgbmV2ZXIsXG4gICAgICBtZW1vcnlMaW1pdDogMjU2ICogMTAyNCAqIDEwMjQsXG4gICAgICBpbnRlcnJ1cHRIYW5kbGVyOiBjcmVhdGVJbnRlcnJ1cHRIYW5kbGVyKGludGVycnVwdEJ1ZGdldCksXG4gICAgICBleHRlbnNpb25zOiBhc3NldHMuZXh0ZW5zaW9ucyxcbiAgICAgIHdhc2k6IG1ha2VEZXRlcm1pbmlzdGljQ2xvY2tXYXNpKCgpID0+IHZtTm93TXMpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHZtID0gYXdhaXQgaW5pdFdvcmtmbG93Vk0oKCkgPT4gdm1Ob3dNcywgaW50ZXJydXB0QnVkZ2V0KTtcbiAgfVxuXG4gIC8vIEhvc3Qtc2lkZSBzZXJkZTogY2FwdHVyZXMgdGhlIFZNJ3MgaW50cmluc2ljcyAoYm9vdHN0cmFwIGluY2x1ZGVkKVxuICAvLyBiZWZvcmUgYW55IHVzZXIgY29kZSBydW5zLiBBbGwgc2VyaWFsaXphdGlvbiBub3cgaGFwcGVucyBvbiB0aGUgaG9zdFxuICAvLyB0aHJvdWdoIGhhbmRsZXM6IG5vIHNlcmlhbGl6ZXIgY29kZSBpcyBldmFsdWF0ZWQgaW5zaWRlIHRoZSBWTS5cbiAgLy8gRnJlc2ggcGF0aDogY2FwdHVyZSBub3cgKG5vIHVzZXIgY29kZSBoYXMgcnVuLCBhcyB0aGUgYnVuZGxlIGV2YWx1YXRlc1xuICAvLyBsYXRlciBpbiB0aGUgcGVyLXJ1biBwaGFzZSkuIFNuYXBzaG90IHBhdGg6IHJlLWFkb3B0IHRoZSBjYXB0dXJlIHJvb3RcbiAgLy8gdGhlIGJhc2VsaW5lIGh5ZHJhdGUgY3JlYXRlZCBCRUZPUkUgdGhlIGJ1bmRsZSBldmFsdWF0ZWQsIHNpbmNlIHRoZSBib3hcbiAgLy8gbGl2ZXMgaW4gdGhlIHJlc3RvcmVkIG1lbW9yeSBpbWFnZSBhdCB0aGUgcmVjb3JkZWQgb2Zmc2V0LiBCb3RoIGdpdmVcbiAgLy8gdGhlIHNlcmRlIHByaXN0aW5lIGNhcHR1cmUtYmVmb3JlLXVzZXItY29kZSBpbnRyaW5zaWNzOyBuZWl0aGVyXG4gIC8vIGV4ZWN1dGVzIGd1ZXN0IGNvZGUgaGVyZS5cbiAgY29uc3Qgc2VyZGUgPVxuICAgIGJhc2VsaW5lU25hcHNob3QgJiYgYmFzZWxpbmVTZXJkZVJvb3RQdHIgIT09IHVuZGVmaW5lZFxuICAgICAgPyBjcmVhdGVRdWlja0pTU2VyZGUodm0sIGFkb3B0U2VyZGVSb290KHZtLCBiYXNlbGluZVNlcmRlUm9vdFB0cikpXG4gICAgICA6IGNyZWF0ZVF1aWNrSlNTZXJkZSh2bSk7XG5cbiAgLy8gQW55IHRocm93IGJldHdlZW4gaGVyZSBhbmQgdGhlIHRlcm1pbmFsIHBhdGhzICh3aGljaCBkaXNwb3NlIHRoZSBWTVxuICAvLyBpbnNpZGUgY2hlY2tXb3JrZmxvd1N0YXRlIC8gZXh0cmFjdEVycm9yIGJlZm9yZSBSRVRVUk5JTkcpIHdvdWxkIGxlYWtcbiAgLy8gYSBsaXZlIFF1aWNrSlMgaW5zdGFuY2UgYW5kIGl0cyBXQVNNIGxpbmVhciBtZW1vcnkgZm9yIHRoZSBsaWZldGltZVxuICAvLyBvZiB0aGUgY29tcHV0ZSBpbnN0YW5jZSwgd2hpY2ggaXMgcmV1c2VkLiBEaXNwb3NlIG9uIHRoZSB3YXkgb3V0IG9mXG4gIC8vIGFuIGV4Y2VwdGlvbmFsIGV4aXQgYW5kIHJldGhyb3cuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJ1bldvcmtmbG93SW5WTSgpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0cnkge1xuICAgICAgdm0uZGlzcG9zZSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQWxyZWFkeSBkaXNwb3NlZCBieSBhIHRlcm1pbmFsIHBhdGgsIHNvIGlnbm9yZS5cbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgLy8gLS0tLSBQaGFzZSAyOiBwZXItcnVuIGluaXRpYWxpemF0aW9uIC0tLS1cbiAgYXN5bmMgZnVuY3Rpb24gcnVuV29ya2Zsb3dJblZNKCk6IFByb21pc2U8UXVpY2tKU1dvcmtmbG93U2Vzc2lvbj4ge1xuICAgIHZtLmV2YWxDb2RlKFxuICAgICAgYGdsb2JhbFRoaXMuX193b3JsZENhcGFiaWxpdGllcyA9ICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucy53b3JsZENhcGFiaWxpdGllcyl9O2BcbiAgICApLmRpc3Bvc2UoKTtcblxuICAgIC8vIFNlZWRlZCBNYXRoLnJhbmRvbVxuICAgIHtcbiAgICAgIHVzaW5nIHJhbmRvbUZuID0gdm0ubmV3RnVuY3Rpb24oJ3JhbmRvbScsICgpID0+IHZtLm5ld051bWJlcihybmcoKSkpO1xuICAgICAgdXNpbmcgbWF0aCA9IHZtLmdsb2JhbC5nZXRQcm9wKCdNYXRoJyk7XG4gICAgICBtYXRoLnNldFByb3AoJ3JhbmRvbScsIHJhbmRvbUZuKTtcbiAgICB9XG5cbiAgICAvLyBTZWVkZWQgbmFub2lkIGdlbmVyYXRvclxuICAgIHtcbiAgICAgIHVzaW5nIG5hbm9pZEZuID0gdm0ubmV3RnVuY3Rpb24oJ19fZ2VuZXJhdGVOYW5vaWQnLCAoKSA9PlxuICAgICAgICB2bS5uZXdTdHJpbmcoZ2VuZXJhdGVOYW5vaWQoKSlcbiAgICAgICk7XG4gICAgICB2bS5zZXRQcm9wKHZtLmdsb2JhbCwgJ19fZ2VuZXJhdGVOYW5vaWQnLCBuYW5vaWRGbik7XG4gICAgfVxuXG4gICAgLy8gSG9zdC1zaWRlIGRldGVybWluaXN0aWMgVUxJRCBnZW5lcmF0b3IgZm9yIGNvcnJlbGF0aW9uSWRzLiBVc2VzIHRoZVxuICAgIC8vIHNhbWUgYHVsaWRgIHBhY2thZ2UgYW5kIG1vbm90b25pYyBmYWN0b3J5IGFzIGJlZm9yZSwgZHJhd2luZyBmcm9tXG4gICAgLy8gdGhlIFNBTUUgc2VlZGVkIFBSTkcgaW5zdGFuY2UgYXMgdGhlIFZNJ3MgTWF0aC5yYW5kb20sIHNvIHRoZVxuICAgIC8vIGludGVybGVhdmVkIGRyYXcgc2VxdWVuY2UgKGFuZCB0aGVyZWZvcmUgZXZlcnkgY29ycmVsYXRpb25JZCkgaXNcbiAgICAvLyBieXRlLWlkZW50aWNhbCB0byB3aGF0IHRoZSBwcmV2aW91cyBpbi1WTSBVTElEIGZhY3RvcnkgcHJvZHVjZWQgZm9yXG4gICAgLy8gdGhlIHNhbWUgcnVuLiBUaGUgdGltZSBwcmVmaXggaXMgZGVyaXZlZCBmcm9tIHRoZSBydW5JZCdzIGVtYmVkZGVkXG4gICAgLy8gVUxJRCAoc3RhYmxlIGFjcm9zcyBpbnZvY2F0aW9ucyBieSBjb25zdHJ1Y3Rpb24sIHVubGlrZVxuICAgIC8vIGBzdGFydGVkQXRgLCB3aGljaCBkaWZmZXJzIGJldHdlZW4gdHVyYm8ncyBzeW50aGVzaXplZCBydW4gb2JqZWN0XG4gICAgLy8gYW5kIHRoZSBkdXJhYmx5IHN0b3JlZCBydW4pLCBzbyB0d28gY29uY3VycmVudCBpbnZvY2F0aW9ucyBvZiB0aGVcbiAgICAvLyBzYW1lIHJ1biBwcm9kdWNlIElERU5USUNBTCBjb3JyZWxhdGlvbklkcyBhbmQgdGhlIHdvcmxkJ3NcbiAgICAvLyBFbnRpdHlDb25mbGljdEVycm9yIG9uIGBldmVudHMuY3JlYXRlYCBkZWR1cHMgb25lIG9mIGVhY2ggcGFpci5cbiAgICB7XG4gICAgICBjb25zdCB1bGlkRmFjdG9yeSA9IG1vbm90b25pY0ZhY3RvcnkoKCkgPT4gcm5nKCkpO1xuICAgICAgY29uc3QgdWxpZFRpbWVzdGFtcCA9XG4gICAgICAgIHJ1bklkQ3JlYXRlZEF0KHdvcmtmbG93UnVuLnJ1bklkKSA/P1xuICAgICAgICAoK3dvcmtmbG93UnVuLmNyZWF0ZWRBdCB8fCBzdGFydGVkQXQpO1xuICAgICAgdXNpbmcgdWxpZEZuID0gdm0ubmV3RnVuY3Rpb24oJ19fZ2VuZXJhdGVVbGlkJywgKCkgPT5cbiAgICAgICAgdm0ubmV3U3RyaW5nKHVsaWRGYWN0b3J5KHVsaWRUaW1lc3RhbXApKVxuICAgICAgKTtcbiAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX19nZW5lcmF0ZVVsaWQnLCB1bGlkRm4pO1xuICAgIH1cblxuICAgIC8vIGBwcm9jZXNzLmVudmA6IHBhcml0eSB3aXRoIHRoZSBub2RlOnZtIGVuZ2luZSwgd2hpY2ggZXhwb3NlcyBhIGZyb3plblxuICAgIC8vIGNvcHkgb2YgdGhlIGhvc3QgZW52ICh2bS9pbmRleC50cykuIEluamVjdGVkIHBlciBydW4gc28gdGhlIHNuYXBzaG90IG9mXG4gICAgLy8gdGhlIGVudiBpcyB0YWtlbiBhdCBpbnZvY2F0aW9uIHRpbWUsIHNhbWUgYXMgbm9kZS4gSGFuZGxlLWJhc2VkIChub1xuICAgIC8vIGd1ZXN0IHNvdXJjZSBldmFsdWF0ZWQpOiBvbiB0aGUgYmFzZWxpbmUtc25hcHNob3QgcGF0aCB0aGlzIHJ1bnNcbiAgICAvLyBhZnRlciB1c2VyIGNvZGUsIGFuZCBhIGd1ZXN0LXNvdXJjZSBpbmplY3Rpb24gd291bGQgZXhlY3V0ZSB0aHJvdWdoXG4gICAgLy8gcG90ZW50aWFsbHkgcGF0Y2hlZCBnbG9iYWxzIChKU09OLnBhcnNlLCBPYmplY3QuZnJlZXplKSwgdmlzaWJsZVxuICAgIC8vIHRvIG1vZHVsZS1zY29wZSB3cmFwcGVycyBvbmx5IG9uIHRoZSByZXN0b3JlIHBhdGgsIGRpdmVyZ2luZ1xuICAgIC8vIHJlcGxheXMuXG4gICAgc2VyZGUuaW5zdGFsbFByb2Nlc3NFbnYocHJvY2Vzcy5lbnYpO1xuXG4gICAgLy8gRXhlY3V0ZSB0aGUgd29ya2Zsb3cgYnVuZGxlOiB1c2UgdGhlIHdvcmtmbG93SWQgYXMgdGhlIGV2YWwgZmlsZW5hbWVcbiAgICAvLyBzbyBRdWlja0pTIHN0YWNrIHRyYWNlcyByZWZlcmVuY2UgdGhlIHdvcmtmbG93IG5hbWUsIGVuYWJsaW5nIHNvdXJjZSBtYXBcbiAgICAvLyByZW1hcHBpbmcgYnkgcmVtYXBFcnJvclN0YWNrICh3aGljaCBtYXRjaGVzIGZyYW1lcyBieSBmaWxlbmFtZSkuXG4gICAgLy8gRXZhbHVhdGVkIGluIHRoZSBwZXItcnVuIHBoYXNlIChhZnRlciBNYXRoLnJhbmRvbSBzZWVkaW5nKSBzbyB0aGF0XG4gICAgLy8gbW9kdWxlLXNjb3BlIHVzZXIgY29kZSBkcmF3cyBmcm9tIHRoZSBzZWVkZWQgUFJORywgbWF0Y2hpbmcgdGhlXG4gICAgLy8gbm9kZTp2bSBlbmdpbmUncyByZXBsYXkgZGV0ZXJtaW5pc20uIFNraXBwZWQgb24gdGhlXG4gICAgLy8gYmFzZWxpbmUtc25hcHNob3QgcGF0aDogdGhlIHJlc3RvcmVkIGhlYXAgYWxyZWFkeSBjYXJyaWVzIHRoZVxuICAgIC8vIGV2YWx1YXRlZCBidW5kbGUsIGFuZCB0aGUgYmFzZWxpbmUgZ2F0ZSBndWFyYW50ZWVzIG1vZHVsZSBzY29wZVxuICAgIC8vIGNvbnN1bWVkIG5vIFBSTkcgZHJhd3Mgb3IgY2xvY2sgcmVhZHMsIHNvIHNraXBwaW5nIHRoZSBldmFsIGlzXG4gICAgLy8gb2JzZXJ2YXRpb25hbGx5IGlkZW50aWNhbCB0byByZS1ydW5uaW5nIGl0ICh0aGUgcnVuLXNlZWRlZCBob3N0XG4gICAgLy8gZm5zIHJlZ2lzdGVyZWQgYWJvdmUgcmViaW5kIHRoZSBTQU1FIG5hbWVzIHRoZSByZXN0b3JlZCBoZWFwJ3NcbiAgICAvLyBmdW5jdGlvbiBvYmplY3RzIGRpc3BhdGNoIHRocm91Z2gpLlxuICAgIGlmICghYmFzZWxpbmVTbmFwc2hvdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdm0uZXZhbENvZGUod29ya2Zsb3dDb2RlLCB3b3JrZmxvd0lkIHx8ICd3b3JrZmxvdy5qcycpLmRpc3Bvc2UoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gbWFrZVNldHRsZWRTZXNzaW9uKFxuICAgICAgICAgIGV4dHJhY3RFcnJvcih2bSwgZXJyLCAnV29ya2Zsb3cgZXZhbHVhdGlvbiBmYWlsZWQnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV4dHJhY3Qgd29ya2Zsb3cgYXJndW1lbnRzLiBQcmVmZXIgdGhlIHJ1bl9jcmVhdGVkIGV2ZW50OyBmYWxsIGJhY2tcbiAgICAvLyB0byB0aGUgcXVldWUgbWVzc2FnZSdzIHJ1bklucHV0IGlmIHRoZSBldmVudCBsb2cgaXMgaW5jb21wbGV0ZVxuICAgIC8vIChldmVudHVhbGx5LWNvbnNpc3RlbnQgcmVhZCBhZnRlciBzdGFydCgpKS4gRmFpbGluZyB0byBmaW5kIGlucHV0XG4gICAgLy8gZm9yIGEgZmlyc3QgaW52b2NhdGlvbiBpcyBmYXRhbDogcnVubmluZyB0aGUgd29ya2Zsb3cgZnVuY3Rpb25cbiAgICAvLyB3aXRoIG5vIGFyZ3Mgd291bGQgc2lsZW50bHkgdHVybiB0eXBlZCBhcmd1bWVudHMgaW50byBgdW5kZWZpbmVkYFxuICAgIC8vIGFuZCwgZm9yIHJlY3Vyc2l2ZSB3b3JrZmxvd3MsIHByb2R1Y2UgZXhwb25lbnRpYWwgZmFuLW91dC5cbiAgICBjb25zdCBydW5DcmVhdGVkRXZlbnQgPSBldmVudHMuZmluZCgoZSkgPT4gZS5ldmVudFR5cGUgPT09ICdydW5fY3JlYXRlZCcpO1xuICAgIGNvbnN0IHJ1bkNyZWF0ZWRJbnB1dCA9XG4gICAgICBydW5DcmVhdGVkRXZlbnQgJiYgJ2V2ZW50RGF0YScgaW4gcnVuQ3JlYXRlZEV2ZW50XG4gICAgICAgID8gKHJ1bkNyZWF0ZWRFdmVudC5ldmVudERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pPy5pbnB1dFxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBydW5JbnB1dDogdW5rbm93biA9XG4gICAgICBydW5DcmVhdGVkSW5wdXQgPz8gKG9wdGlvbnMucnVuSW5wdXQ/LmlucHV0IGFzIHVua25vd24pO1xuXG4gICAgaWYgKHJ1bklucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgY29uc3QgZGVjcnlwdGVkSW5wdXQgPSBhd2FpdCBwcmVwYXJlQnl0ZXNGb3JWTShcbiAgICAgICAgcnVuSW5wdXQsXG4gICAgICAgIG9wdGlvbnMuZW5jcnlwdGlvbktleVxuICAgICAgKTtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgcnVudGltZTogcnVuIGlucHV0IGZvcm1hdCcsIHtcbiAgICAgICAgcHJlZml4OiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZGVjcnlwdGVkSW5wdXQuc3ViYXJyYXkoMCwgNCkpLFxuICAgICAgICBieXRlTGVuZ3RoOiBkZWNyeXB0ZWRJbnB1dC5ieXRlTGVuZ3RoLFxuICAgICAgICBzb3VyY2U6IHJ1bkNyZWF0ZWRJbnB1dCA/ICdydW5fY3JlYXRlZCcgOiAncXVldWVNZXNzYWdlLnJ1bklucHV0JyxcbiAgICAgIH0pO1xuICAgICAgLy8gQnVpbGQgdGhlIGFyZ3VtZW50IHZhbHVlIGRpcmVjdGx5IGluIHRoZSBWTSB2aWEgdGhlIGhvc3Qtc2lkZVxuICAgICAgLy8gc2VyZGUgKGd1ZXN0IGNvZGUgbmV2ZXIgc2VlcyB0aGUgd2lyZSBieXRlcykuXG4gICAgICBjb25zdCBpbnB1dEhhbmRsZSA9IHNlcmRlLmRlc2VyaWFsaXplKGRlY3J5cHRlZElucHV0KTtcbiAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX193ZGtfaW5wdXQnLCBpbnB1dEhhbmRsZSk7XG4gICAgICBpbnB1dEhhbmRsZS5kaXNwb3NlKCk7XG4gICAgfSBlbHNlIGlmIChydW5JbnB1dCA9PT0gdW5kZWZpbmVkICYmIGV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgZXZlbnQgbG9nIGlzIG5vbi1lbXB0eSAod2UgZ290IHJ1bl9zdGFydGVkIG9yIHNpbWlsYXIpIGJ1dFxuICAgICAgLy8gbm8gcnVuX2NyZWF0ZWQgZXZlbnQgd2FzIGZvdW5kIGFuZCBubyBxdWV1ZS1wcm92aWRlZCBydW5JbnB1dCBpc1xuICAgICAgLy8gYXZhaWxhYmxlLiBUaGlzIGlzIHRoZSByYWNlIGNvbmRpdGlvbiBvYnNlcnZlZCBkdXJpbmcgdGhlIGZpYlxuICAgICAgLy8gaW5jaWRlbnQ6IHNpbGVudGx5IGRyb3BwaW5nIGFyZ3VtZW50cyB3b3VsZCB0dXJuIGBuYCBpbnRvXG4gICAgICAvLyBgdW5kZWZpbmVkYCBhbmQsIGZvciByZWN1cnNpdmUgd29ya2Zsb3dzLCBjYXVzZSBleHBvbmVudGlhbFxuICAgICAgLy8gZmFuLW91dC4gRmFpbCBsb3VkOiB0aGUgdGhyb3cgZXNjYXBlcyB0aGUgZW50cnlwb2ludCBpbnRvIHRoZVxuICAgICAgLy8gcmVwbGF5IGxvb3AncyBjYXRjaCBpbiBydW50aW1lLnRzICh0aGUgUXVpY2tKUyBkaXNwYXRjaCBydW5zXG4gICAgICAvLyBpbnNpZGUgdGhhdCBsb29wJ3MgdHJ5KSwgd2hpY2ggcmVjb3JkcyBydW5fZmFpbGVkLiBBIHZpc2libGVcbiAgICAgIC8vIHRlcm1pbmFsIGZhaWx1cmUgaXNcbiAgICAgIC8vIHByZWZlcnJlZCBvdmVyIHNpbGVudGx5IGV4ZWN1dGluZyB3aXRoIHVuZGVmaW5lZCBhcmd1bWVudHMuIFRoZVxuICAgICAgLy8gcXVldWUtcHJvdmlkZWQgcnVuSW5wdXQgZmFsbGJhY2sgYWJvdmUgbWFrZXMgdGhpcyBwYXRoIHJhcmUuXG4gICAgICAvLyBFbXB0eSBgZXZlbnRzYCBpcyBhbGxvd2VkIGJlY2F1c2UgdGVzdHMgdGhhdCBib290c3RyYXAgYSB3b3JrZmxvd1xuICAgICAgLy8gd2l0aCBubyBhcmd1bWVudHMgcmVseSBvbiB0aGUgb2xkIHBlcm1pc3NpdmUgYmVoYXZpb3IuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3Qgc3RhcnQgd29ya2Zsb3cgcnVuIFwiJHt3b3JrZmxvd1J1bi5ydW5JZH1cIjogbm8gcnVuX2NyZWF0ZWQgZXZlbnQgZm91bmQgYW5kIG5vIHJ1bklucHV0IGluIHRoZSBxdWV1ZSBwYXlsb2FkLCBidXQgb3RoZXIgZXZlbnRzIGFyZSBwcmVzZW50IChsaWtlbHkgYSByZWFkLWFmdGVyLXdyaXRlIHJhY2UgZHVyaW5nIHN0YXJ0KCkpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHdvcmtmbG93IGNvbnRleHQgbWV0YWRhdGEgKGZvciBnZXRXb3JrZmxvd01ldGFkYXRhKCkpLlxuICAgIC8vIE11c3QgbWF0Y2ggdGhlIHNoYXBlIHRoYXQgdGhlIG5vZGU6dm0gZW5naW5lIHByb2R1Y2VzIChzZWVcbiAgICAvLyBwYWNrYWdlcy9jb3JlL3NyYy93b3JrZmxvdy50czogcnVuV29ya2Zsb3cg4oaSIGN0eCkgc28gdXNlciBjb2RlXG4gICAgLy8gdGhhdCBjb21wYXJlcyBgZ2V0V29ya2Zsb3dNZXRhZGF0YSgpYCB2YWx1ZXMgYmV0d2VlbiBhIHN0ZXBcbiAgICAvLyAoc2VydmVyLXNpZGUpIGFuZCB0aGUgd29ya2Zsb3cgKFZNLXNpZGUpIHNlZXMgaWRlbnRpY2FsIG9iamVjdHMuXG4gICAge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAgICAgIHdvcmtmbG93TmFtZTogd29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lLFxuICAgICAgICB3b3JrZmxvd1J1bklkOiB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQ6IHdvcmtmbG93UnVuLnN0YXJ0ZWRBdFxuICAgICAgICAgID8gbmV3IERhdGUoK3dvcmtmbG93UnVuLnN0YXJ0ZWRBdClcbiAgICAgICAgICA6IG5ldyBEYXRlKCksXG4gICAgICAgIHVybDogcHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTFxuICAgICAgICAgID8gYGh0dHBzOi8vJHtwcm9jZXNzLmVudi5WRVJDRUxfVVJMfWBcbiAgICAgICAgICA6IGBodHRwOi8vbG9jYWxob3N0OiR7b3B0aW9ucy5wb3J0ID8/IDMwMDB9YCxcbiAgICAgICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFvcHRpb25zLmVuY3J5cHRpb25LZXkgfSxcbiAgICAgIH07XG4gICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgYGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX0NPTlRFWFRcIildID0gJHtKU09OLnN0cmluZ2lmeShtZXRhZGF0YSl9O2AgK1xuICAgICAgICAgIGBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19DT05URVhUXCIpXS53b3JrZmxvd1N0YXJ0ZWRBdCA9IG5ldyBEYXRlKCR7SlNPTi5zdHJpbmdpZnkobWV0YWRhdGEud29ya2Zsb3dTdGFydGVkQXQudG9JU09TdHJpbmcoKSl9KTtgXG4gICAgICApLmRpc3Bvc2UoKTtcbiAgICB9XG5cbiAgICAvLyBTdGFydCB0aGUgd29ya2Zsb3cgZnVuY3Rpb24uIElmIHRoZSB3b3JrZmxvdyBpc24ndCByZWdpc3RlcmVkLFxuICAgIC8vIHRocm93IGFuIGVycm9yIHRhZ2dlZCB3aXRoIGBuYW1lID0gXCJXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvclwiYFxuICAgIC8vIHNvIHRoZSBob3N0LXNpZGUgZW50cnlwb2ludCBjYW4gcmVjb25zdHJ1Y3QgYSByZWFsXG4gICAgLy8gV29ya2Zsb3dOb3RSZWdpc3RlcmVkRXJyb3IgKGEgV29ya2Zsb3dSdW50aW1lRXJyb3Igc3ViY2xhc3MgdGhhdFxuICAgIC8vIGNsYXNzaWZpZXMgYXMgUlVOVElNRV9FUlJPUikgcmF0aGVyIHRoYW4gYSBnZW5lcmljIHVzZXIgZXJyb3IuXG4gICAgLy8gU2VlIHF1aWNranMtZW50cnlwb2ludC50cydzIHJ1bl9mYWlsZWQgYnJhbmNoLlxuICAgIHRyeSB7XG4gICAgICB2bS5ldmFsQ29kZShgXG4gICAgICB2YXIgX193Zm4gPSBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3MuZ2V0KCR7SlNPTi5zdHJpbmdpZnkod29ya2Zsb3dJZCl9KTtcbiAgICAgIGlmICghX193Zm4pIHtcbiAgICAgICAgdmFyIF9fd2ZuRXJyID0gbmV3IEVycm9yKFwiV29ya2Zsb3cgXFxcXFwiXCIgKyAke0pTT04uc3RyaW5naWZ5KHdvcmtmbG93SWQpfSArIFwiXFxcXFwiIGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBjdXJyZW50IGRlcGxveW1lbnQuXCIpO1xuICAgICAgICBfX3dmbkVyci5uYW1lID0gXCJXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvclwiO1xuICAgICAgICB0aHJvdyBfX3dmbkVycjtcbiAgICAgIH1cbiAgICAgIHZhciBfX2FyZ3MgPSBnbG9iYWxUaGlzLl9fd2RrX2lucHV0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBnbG9iYWxUaGlzLl9fd2RrX2lucHV0XG4gICAgICAgIDogW107XG4gICAgICBkZWxldGUgZ2xvYmFsVGhpcy5fX3dka19pbnB1dDtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShfX2FyZ3MpKSBfX2FyZ3MgPSBbX19hcmdzXTtcbiAgICAgIF9fd2ZuLmFwcGx5KG51bGwsIF9fYXJncykudGhlbihcbiAgICAgICAgZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgLy8gU3RvcmUgdGhlIFJBVyByZXN1bHQ7IHRoZSBob3N0IHNlcmlhbGl6ZXMgaXQgdGhyb3VnaCBhIGhhbmRsZS5cbiAgICAgICAgICAvLyBBIHNlcGFyYXRlIGRvbmUgZmxhZyBkaXN0aW5ndWlzaGVzIFwiY29tcGxldGVkIHdpdGggdW5kZWZpbmVkXCJcbiAgICAgICAgICAvLyBmcm9tIFwibm90IGNvbXBsZXRlZFwiLlxuICAgICAgICAgIGdsb2JhbFRoaXMuX193b3JrZmxvd0RvbmUgPSB0cnVlO1xuICAgICAgICAgIGdsb2JhbFRoaXMuX193b3JrZmxvd1Jlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgICAgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAvLyBQcmVzZXJ2ZSBkaXNwbGF5IGluZm8gb24gdGhlIGhvc3Qtc2lkZSBmYWlsZWQgb2JqZWN0XG4gICAgICAgICAgLy8gKG1hdGNoZXMgdGhlIGxlZ2FjeSBob3N0LXZpc2libGUgc2hhcGUpIEFORCBrZWVwIHRoZSBSQVdcbiAgICAgICAgICAvLyB0aHJvd24gdmFsdWUgc28gdGhlIGhvc3QgY2FuIHNlcmlhbGl6ZSB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAvLyB0eXBlLWlkZW50aXR5LCBjYXVzZSBjaGFpbiwgb3Igbm9uLUVycm9yIHRocm93cyB2ZXJiYXRpbVxuICAgICAgICAgIC8vIHRocm91Z2ggdGhlIHN0YW5kYXJkIGVycm9yIHBpcGVsaW5lLlxuICAgICAgICAgIGdsb2JhbFRoaXMuX193b3JrZmxvd0Vycm9yID0ge1xuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3IgJiYgZXJyb3IubWVzc2FnZSAhPSBudWxsID8gU3RyaW5nKGVycm9yLm1lc3NhZ2UpIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgIHN0YWNrOiBlcnJvciAmJiBlcnJvci5zdGFjayA/IGVycm9yLnN0YWNrIDogXCJcIixcbiAgICAgICAgICAgIG5hbWU6IGVycm9yICYmIGVycm9yLm5hbWUgPyBlcnJvci5uYW1lIDogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBcIkVycm9yXCIgOiB0eXBlb2YgZXJyb3IpLFxuICAgICAgICAgICAgdmFsdWU6IGVycm9yLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgYCkuZGlzcG9zZSgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIG1ha2VTZXR0bGVkU2Vzc2lvbihcbiAgICAgICAgZXh0cmFjdEVycm9yKHZtLCBlcnIsICdGYWlsZWQgdG8gc3RhcnQgd29ya2Zsb3cnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGV2ZW50cyBhbmQgZHJhaW4gam9icyBpbiBhIGxvb3AuIEV2ZW50cyBtYXkgcmVzb2x2ZSBwcm9taXNlc1xuICAgIC8vIHRoYXQgdW5ibG9jayB3b3JrZmxvdyBjb2RlLCB3aGljaCB0aGVuIGNyZWF0ZXMgTkVXIHJlc29sdmVycyBmb3JcbiAgICAvLyBzdWJzZXF1ZW50IGV2ZW50cy4gUmUtcHJvY2Vzc2luZyBldmVudHMgbWF0Y2hlcyB0aGVzZSBuZXcgcmVzb2x2ZXJzXG4gICAgLy8gYWdhaW5zdCBldmVudHMgdGhhdCB3ZXJlIGFscmVhZHkgZGVsaXZlcmVkLlxuICAgIHtcbiAgICAgIGxldCBtYXhJdGVyYXRpb25zID0gMTAwO1xuICAgICAgbGV0IG1hZGVQcm9ncmVzczogYm9vbGVhbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbWFkZVByb2dyZXNzID0gYXdhaXQgcHJvY2Vzc0V2ZW50cyhcbiAgICAgICAgICB2bSxcbiAgICAgICAgICBzZXJkZSxcbiAgICAgICAgICBldmVudHMsXG4gICAgICAgICAgYWR2YW5jZUNsb2NrLFxuICAgICAgICAgIG9wdGlvbnMuZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgICBsZXQgYmF0Y2g6IG51bWJlcjtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGJhdGNoID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgaWYgKGJhdGNoID4gMCkgbWFkZVByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgfSB3aGlsZSAoYmF0Y2ggPiAwKTtcbiAgICAgIH0gd2hpbGUgKG1hZGVQcm9ncmVzcyAmJiAtLW1heEl0ZXJhdGlvbnMgPiAwKTtcbiAgICAgIGlmIChtYWRlUHJvZ3Jlc3MgJiYgbWF4SXRlcmF0aW9ucyA9PT0gMCkge1xuICAgICAgICAvLyBUaGUgZHJhaW4gbG9vcCBoaXQgaXRzIGJvdW5kIHdoaWxlIHN0aWxsIG1ha2luZyBwcm9ncmVzczpcbiAgICAgICAgLy8gcHJvY2VlZGluZyBhcyBpZiBpdCBjb252ZXJnZWQgd291bGQgcHJlc2VudCBhcyBhIG15c3RlcmlvdXNcbiAgICAgICAgLy8gc3VzcGVuc2lvbiBvciByZXBsYXkgZGl2ZXJnZW5jZS4gTWFrZSB0aGUgZ2l2aW5nLXVwIHZpc2libGUgc29cbiAgICAgICAgLy8gYSB3ZWRnZSBpcyBhdHRyaWJ1dGFibGUgdG8gdGhpcyBib3VuZCByYXRoZXIgdGhhbiBhIG15c3RlcnkuXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBldmVudCBkcmFpbiBsb29wIGhpdCBpdHMgaXRlcmF0aW9uIGJvdW5kIGJlZm9yZSByZWFjaGluZyBhIGZpeGVkIHBvaW50JyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgICAgIGV2ZW50Q291bnQ6IGV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLS0gQ2hlY2sgcmVzdWx0IC0tLS1cbiAgICByZXR1cm4gbWFrZUxpdmVTZXNzaW9uKFxuICAgICAgdm0sXG4gICAgICBzZXJkZSxcbiAgICAgIGludGVycnVwdEJ1ZGdldCxcbiAgICAgIGFkdmFuY2VDbG9jayxcbiAgICAgIG9wdGlvbnMuZW5jcnlwdGlvbktleVxuICAgICk7XG4gIH1cbn1cblxuLyoqIFNlc3Npb24gd3JhcHBlciBmb3IgYSByZXN1bHQgd2hvc2UgVk0gaXMgYWxyZWFkeSBzZXR0bGVkL2Rpc3Bvc2VkLiAqL1xuZnVuY3Rpb24gbWFrZVNldHRsZWRTZXNzaW9uKFxuICByZXN1bHQ6IFF1aWNrSlNSdW50aW1lUmVzdWx0XG4pOiBRdWlja0pTV29ya2Zsb3dTZXNzaW9uIHtcbiAgcmV0dXJuIHtcbiAgICByZXN1bHQsXG4gICAgY29udGludWVXaXRoRXZlbnRzOiAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdRdWlja0pTIHdvcmtmbG93IHNlc3Npb24gaXMgc2V0dGxlZCDigJQgY29udGludWVXaXRoRXZlbnRzIGlzIG9ubHkgdmFsaWQgd2hpbGUgc3VzcGVuZGVkJ1xuICAgICAgKTtcbiAgICB9LFxuICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICB9O1xufVxuXG4vKipcbiAqIEV2YWx1YXRlIHRoZSBWTSdzIHN0YXRlIGFuZCB3cmFwIGl0IGluIGEgbGl2ZSBzZXNzaW9uLiBXaGlsZSBzdXNwZW5kZWQsXG4gKiB0aGUgVk0gc3RheXMgYWxpdmUgc28gYGNvbnRpbnVlV2l0aEV2ZW50c2AgY2FuIHJlc3VtZSBpdCBpbiBwbGFjZTtcbiAqIHRlcm1pbmFsIHN0YXRlcyBkaXNwb3NlIHRoZSBWTSBpbW1lZGlhdGVseSAoaW5zaWRlIGNoZWNrV29ya2Zsb3dTdGF0ZSkuXG4gKi9cbmZ1bmN0aW9uIG1ha2VMaXZlU2Vzc2lvbihcbiAgdm06IFF1aWNrSlMsXG4gIHNlcmRlOiBRdWlja0pTU2VyZGUsXG4gIGludGVycnVwdEJ1ZGdldDogSW50ZXJydXB0QnVkZ2V0LFxuICBhZHZhbmNlQ2xvY2s6IChtczogbnVtYmVyKSA9PiB2b2lkLFxuICBlbmNyeXB0aW9uS2V5PzogRGVjcnlwdGlvbktleVxuKTogUXVpY2tKU1dvcmtmbG93U2Vzc2lvbiB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrV29ya2Zsb3dTdGF0ZSh2bSwgc2VyZGUsIHsga2VlcEFsaXZlT25TdXNwZW5kOiB0cnVlIH0pO1xuICBsZXQgYWxpdmUgPSAhIXJlc3VsdC5zdXNwZW5kZWQ7XG5cbiAgY29uc3Qgc2Vzc2lvbjogUXVpY2tKU1dvcmtmbG93U2Vzc2lvbiA9IHtcbiAgICByZXN1bHQsXG4gICAgYXN5bmMgY29udGludWVXaXRoRXZlbnRzKFxuICAgICAgbmV3RXZlbnRzOiBFdmVudFtdXG4gICAgKTogUHJvbWlzZTxRdWlja0pTUnVudGltZVJlc3VsdD4ge1xuICAgICAgaWYgKCFhbGl2ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1F1aWNrSlMgd29ya2Zsb3cgc2Vzc2lvbiBpcyBub3QgYWxpdmUg4oCUIGNvbnRpbnVlV2l0aEV2ZW50cyBpcyBvbmx5IHZhbGlkIHdoaWxlIHN1c3BlbmRlZCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIEZyZXNoIGV4ZWN1dGlvbiBidXJzdDogdGhlIGludGVycnVwdCBidWRnZXQgYm91bmRzIFZNIGNvbXB1dGUsXG4gICAgICAvLyBub3Qgd2FsbCB0aW1lIHNwZW50IHdhaXRpbmcgb24gaW5saW5lIHN0ZXBzIGJldHdlZW4gYnVyc3RzLlxuICAgICAgaW50ZXJydXB0QnVkZ2V0LnN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgICAgbGV0IG1heEl0ZXJhdGlvbnMgPSAxMDA7XG4gICAgICBsZXQgbWFkZVByb2dyZXNzOiBib29sZWFuO1xuICAgICAgZG8ge1xuICAgICAgICBtYWRlUHJvZ3Jlc3MgPSBhd2FpdCBwcm9jZXNzRXZlbnRzKFxuICAgICAgICAgIHZtLFxuICAgICAgICAgIHNlcmRlLFxuICAgICAgICAgIG5ld0V2ZW50cyxcbiAgICAgICAgICBhZHZhbmNlQ2xvY2ssXG4gICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICApO1xuICAgICAgICBsZXQgYmF0Y2g6IG51bWJlcjtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGJhdGNoID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgaWYgKGJhdGNoID4gMCkgbWFkZVByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgfSB3aGlsZSAoYmF0Y2ggPiAwKTtcbiAgICAgIH0gd2hpbGUgKG1hZGVQcm9ncmVzcyAmJiAtLW1heEl0ZXJhdGlvbnMgPiAwKTtcblxuICAgICAgY29uc3QgbmV4dCA9IGNoZWNrV29ya2Zsb3dTdGF0ZSh2bSwgc2VyZGUsIHtcbiAgICAgICAga2VlcEFsaXZlT25TdXNwZW5kOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBpZiAoIW5leHQuc3VzcGVuZGVkKSBhbGl2ZSA9IGZhbHNlO1xuICAgICAgc2Vzc2lvbi5yZXN1bHQgPSBuZXh0O1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfSxcbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgaWYgKGFsaXZlKSB7XG4gICAgICAgIGFsaXZlID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdm0uZGlzcG9zZSgpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBBbHJlYWR5IGRpc3Bvc2VkLCBzbyBpZ25vcmUuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICB9O1xuICByZXR1cm4gc2Vzc2lvbjtcbn1cblxuLy8gLS0tLSBFdmVudCBQcm9jZXNzaW5nIC0tLS1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0V2ZW50cyhcbiAgdm06IFF1aWNrSlMsXG4gIHNlcmRlOiBRdWlja0pTU2VyZGUsXG4gIGV2ZW50czogRXZlbnRbXSxcbiAgYWR2YW5jZUNsb2NrOiAobXM6IG51bWJlcikgPT4gdm9pZCxcbiAgZW5jcnlwdGlvbktleT86IERlY3J5cHRpb25LZXlcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBsZXQgcmVzb2x2ZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAvLyBBIHNlYWxlZC1sb2cgbm9vcCBvY2N1cGllcyBhIHNsb3Qgd2hvc2Ugd3JpdGVyIGRpZWQ7IHRoZSBydW4gbmV2ZXJcbiAgICAvLyBvYnNlcnZlZCBpdC4gU3RlcCBvdmVyIGl0IEJFRk9SRSB0aGUgY2xvY2sgbGluZSBiZWxvdywgbm90IGF0IHRoZVxuICAgIC8vIHN3aXRjaDogaXRzIGBjcmVhdGVkQXRgIGlzIHRoZSBzZWFsZXIncyB3YWxsIGNsb2NrIGFuZCBjYW4gcG9zdGRhdGVcbiAgICAvLyBldmVyeSByZWFsIGV2ZW50IGFyb3VuZCBpdCwgc28gYWR2YW5jaW5nIHRvIGl0IHdvdWxkIGxlYWsgdGhlIHNlYWxlcidzXG4gICAgLy8gc2NoZWR1bGUgaW50byByZXBsYXkuIEJlY2F1c2UgdGhlIGNsb2NrIGlzIG1vbm90b25pYywgZXZlcnkgbGF0ZXJcbiAgICAvLyBEYXRlLm5vdygpIGluIHRoZSBydW4gd2l0aCBpdC4gVGhhdCB3b3VsZCBtYWtlIGEgbG9nIHdob3NlIGhvbGUgd2FzXG4gICAgLy8gc2VhbGVkIHJlcGxheSBkaWZmZXJlbnRseSBmcm9tIHRoZSBzYW1lIGxvZyB3aG9zZSBob2xlIGl0cyBvd24gd3JpdGVyXG4gICAgLy8gZmlsbGVkLCBhbmQgZGlmZmVyZW50bHkgZnJvbSB0aGlzIGxvZyBvbiB0aGUgbm9kZTp2bSBlbmdpbmUsIHdoaWNoXG4gICAgLy8gc2tpcHMgbm9vcHMgaW4gYEV2ZW50c0NvbnN1bWVyYCBiZWZvcmUgYG9uQ29uc3VtZWRFdmVudGAgZmVlZHMgdGhlXG4gICAgLy8gY2xvY2suIFNhbWUgcnVsZSwgYm90aCBlbmdpbmVzLCBvbmUgcHJlZGljYXRlLlxuICAgIGlmIChpc1NlYWxlZE5vb3BFdmVudChldmVudCkpIGNvbnRpbnVlO1xuXG4gICAgLy8gQWR2YW5jZSB0aGUgVk0ncyBkZXRlcm1pbmlzdGljIGNsb2NrIHRvIHRoaXMgZXZlbnQncyBjcmVhdGlvbiB0aW1lXG4gICAgLy8gQkVGT1JFIHJlc29sdmluZyBhbnl0aGluZywgc28gd29ya2Zsb3cgY29kZSB1bmJsb2NrZWQgYnkgdGhpcyBldmVudFxuICAgIC8vIG9ic2VydmVzIERhdGUubm93KCkgYXQgKG9yIGFmdGVyLCBzaW5jZSB0aGUgY2xvY2sgaXMgbW9ub3RvbmljKSB0aGUgdGltZVxuICAgIC8vIHRoZSBldmVudCB3YXMgcmVjb3JkZWQuIE1pcnJvcnMgdGhlIG5vZGU6dm0gZW5naW5lJ3NcbiAgICAvLyBgb25Db25zdW1lZEV2ZW50IOKGkiB1cGRhdGVUaW1lc3RhbXAoK2V2ZW50LmNyZWF0ZWRBdClgLlxuICAgIGFkdmFuY2VDbG9jaygrZXZlbnQuY3JlYXRlZEF0KTtcblxuICAgIGNvbnN0IGNpZCA9IGV2ZW50LmNvcnJlbGF0aW9uSWQ7XG4gICAgaWYgKCFjaWQpIGNvbnRpbnVlO1xuXG4gICAgLy8gSlNPTi5zdHJpbmdpZnkgaGFuZGxlcyBxdW90ZXMsIGJhY2tzbGFzaGVzIGFuZCBjb250cm9sIGNoYXJhY3RlcnM7XG4gICAgLy8gY29ycmVsYXRpb24gaWRzIGFyZSBob3N0LWdlbmVyYXRlZCBVTElEcyB0b2RheSwgYnV0IHRoZSBldmFsLXN0cmluZ1xuICAgIC8vIHNhZmV0eSBzaG91bGRuJ3QgZGVwZW5kIG9uIHRoYXQgaW52YXJpYW50IGJlaW5nIGFzc2VydGVkIG5vd2hlcmUuXG4gICAgY29uc3QgY2lkSnMgPSBKU09OLnN0cmluZ2lmeShjaWQpO1xuICAgIGNvbnN0IGV2ZW50RGF0YSA9XG4gICAgICAnZXZlbnREYXRhJyBpbiBldmVudFxuICAgICAgICA/IChldmVudC5ldmVudERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gTG9nIHRoZSBldmVudCBhbmQgd2hldGhlciB0aGUgcmVzb2x2ZXIgZXhpc3RzXG4gICAgc3dpdGNoIChldmVudC5ldmVudFR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0ZXBfY29tcGxldGVkJzoge1xuICAgICAgICBjb25zdCBoYXNSZXNvbHZlciA9IHZtLmR1bXAoXG4gICAgICAgICAgdm0uZXZhbENvZGUoYCEhZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV1gKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCByYXdPdXRwdXQgPSBldmVudERhdGE/LnJlc3VsdCA/PyBldmVudERhdGE/Lm91dHB1dDtcbiAgICAgICAgaWYgKGhhc1Jlc29sdmVyKSB7XG4gICAgICAgICAgaWYgKHJhd091dHB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIC8vIERlY3J5cHQgaWYgZW5jcnlwdGVkOiB0aGUgVk0gb25seSB1bmRlcnN0YW5kcyAnZGV2bCcgZm9ybWF0XG4gICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKCdRdWlja0pTIHJ1bnRpbWU6IHN0ZXAgcmVzdWx0IHJhdycsIHtcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogY2lkLFxuICAgICAgICAgICAgICByYXdQcmVmaXg6IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShyYXdPdXRwdXQuc3ViYXJyYXkoMCwgNCkpLFxuICAgICAgICAgICAgICByYXdCeXRlTGVuZ3RoOiByYXdPdXRwdXQuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgICAgaXNCdWZmZXI6IEJ1ZmZlci5pc0J1ZmZlcihyYXdPdXRwdXQpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBkZWNyeXB0ZWRPdXRwdXQgPSBhd2FpdCBwcmVwYXJlQnl0ZXNGb3JWTShcbiAgICAgICAgICAgICAgcmF3T3V0cHV0LFxuICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBydW50aW1lOiBzdGVwIHJlc3VsdCBkZWNyeXB0ZWQnLCB7XG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGNpZCxcbiAgICAgICAgICAgICAgcHJlZml4OiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZGVjcnlwdGVkT3V0cHV0LnN1YmFycmF5KDAsIDQpKSxcbiAgICAgICAgICAgICAgYnl0ZUxlbmd0aDogZGVjcnlwdGVkT3V0cHV0LmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlSGFuZGxlID0gc2VyZGUuZGVzZXJpYWxpemUoZGVjcnlwdGVkT3V0cHV0KTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfcmVzdWx0JywgdmFsdWVIYW5kbGUpO1xuICAgICAgICAgICAgdmFsdWVIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XS5yZXNvbHZlKGdsb2JhbFRoaXMuX190bXBfcmVzdWx0KTtgICtcbiAgICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dO2AgK1xuICAgICAgICAgICAgICAgIGBkZWxldGUgZ2xvYmFsVGhpcy5fX3RtcF9yZXN1bHQ7YFxuICAgICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoJ1F1aWNrSlMgcnVudGltZTogc3RlcCByZXN1bHQgbm9uLWJpbmFyeScsIHtcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogY2lkLFxuICAgICAgICAgICAgICB0eXBlOiB0eXBlb2YgcmF3T3V0cHV0LFxuICAgICAgICAgICAgICBpc051bGw6IHJhd091dHB1dCA9PT0gbnVsbCxcbiAgICAgICAgICAgICAgaXNVbmRlZmluZWQ6IHJhd091dHB1dCA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogcmF3T3V0cHV0Py5jb25zdHJ1Y3Rvcj8ubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9XG4gICAgICAgICAgICAgIHJhd091dHB1dCAhPT0gdW5kZWZpbmVkID8gSlNPTi5zdHJpbmdpZnkocmF3T3V0cHV0KSA6ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XS5yZXNvbHZlKCR7c2VyaWFsaXplZH0pO2AgK1xuICAgICAgICAgICAgICAgIGBkZWxldGUgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV07YFxuICAgICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIERyYWluIEFMTCBtaWNyb3Rhc2tzIGFmdGVyIHJlc29sdmVcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHJlc29sdmVyIHlldCwgc28gYnVmZmVyIHRoZSBwcmVwYXJlZCBvdXRjb21lIHNvIHRoZSBwcm9taXNlXG4gICAgICAgICAgLy8gc2V0dGxlcyB0aGUgbW9tZW50IHRoZSBWTSBjb25zdHJ1Y3RzIGl0IChzZWUgX190ZXJtaW5hbEJ1ZmZlclxuICAgICAgICAgIC8vIGluIHRoZSBib290c3RyYXApLiBXaXRob3V0IHRoaXMsIHRoZSBsaXZlLWNvbnRpbnVhdGlvbiBwYXRoXG4gICAgICAgICAgLy8gKHdoaWNoIHNjYW5zIGVhY2ggZGVsdGEgZXhhY3RseSBvbmNlKSBkcm9wcyB0aGUgdGVybWluYWwgYW5kXG4gICAgICAgICAgLy8gdGhlIGF3YWl0IG5ldmVyIHNldHRsZXMuXG4gICAgICAgICAgaWYgKHJhd091dHB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZE91dHB1dCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKFxuICAgICAgICAgICAgICByYXdPdXRwdXQsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBIb3N0IHNlcmRlOiBkZXNlcmlhbGl6ZSBpbnRvIGEgVk0gdmFsdWUgTk9XIChzYW1lIHBhdGggYXNcbiAgICAgICAgICAgIC8vIHRoZSByZXNvbHZlciBicmFuY2ggYWJvdmUpIGFuZCBidWZmZXIgdGhlIHZhbHVlIGl0c2VsZi5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlSGFuZGxlID0gc2VyZGUuZGVzZXJpYWxpemUoZGVjcnlwdGVkT3V0cHV0KTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfYnVmJywgdmFsdWVIYW5kbGUpO1xuICAgICAgICAgICAgdmFsdWVIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlc29sdmVfdmFsdWVcIiwgdmFsdWU6IGdsb2JhbFRoaXMuX190bXBfYnVmIH07YCArXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBnbG9iYWxUaGlzLl9fdG1wX2J1ZjtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9XG4gICAgICAgICAgICAgIHJhd091dHB1dCAhPT0gdW5kZWZpbmVkID8gSlNPTi5zdHJpbmdpZnkocmF3T3V0cHV0KSA6ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlc29sdmVfdmFsdWVcIiwgdmFsdWU6ICR7c2VyaWFsaXplZH0gfTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdGVwX2ZhaWxlZCc6IHtcbiAgICAgICAgY29uc3QgaGFzUmVzb2x2ZXIgPSB2bS5kdW1wKFxuICAgICAgICAgIHZtLmV2YWxDb2RlKGAhIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dYClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGhhc1Jlc29sdmVyKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JEYXRhID0gZXZlbnREYXRhPy5lcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3JEYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAgICAgLy8gTW9kZXJuIHBhdGggKHBvc3QtIzE4NTEpOiB0aGUgc3RlcCBoYW5kbGVyIGRlaHlkcmF0ZWQgdGhlXG4gICAgICAgICAgICAvLyB0aHJvd24gdmFsdWUgdGhyb3VnaCB0aGUgZmlyc3QtY2xhc3MgZXJyb3IgcGlwZWxpbmUuIERlY3J5cHRcbiAgICAgICAgICAgIC8vIChpZiBlbmNyeXB0ZWQpIGFuZCBwYXNzIHRoZSBieXRlcyB0byB0aGUgVk0tc2lkZSBkZXNlcmlhbGl6ZXJcbiAgICAgICAgICAgIC8vIHNvIHRoZSB3b3JrZmxvdyBjYXRjaCBzZWVzIGEgcHJvcGVybHkgdHlwZWQgRXJyb3Igc3ViY2xhc3NcbiAgICAgICAgICAgIC8vIChUeXBlRXJyb3IsIEZhdGFsRXJyb3Igd2l0aCBvcmlnaW5hbCBjYXVzZSBjaGFpbiwgZXRjLikgd2l0aFxuICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIG1lc3NhZ2UgYW5kIHN0YWNrIHByZXNlcnZlZC5cbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKGVycm9yRGF0YSwgZW5jcnlwdGlvbktleSk7XG4gICAgICAgICAgICBjb25zdCBlcnJvckhhbmRsZSA9IHNlcmRlLmRlc2VyaWFsaXplKGRlY3J5cHRlZCk7XG4gICAgICAgICAgICB2bS5zZXRQcm9wKHZtLmdsb2JhbCwgJ19fdG1wX2Vycm9yJywgZXJyb3JIYW5kbGUpO1xuICAgICAgICAgICAgZXJyb3JIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGAoZnVuY3Rpb24oKXtgICtcbiAgICAgICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVqZWN0KGdsb2JhbFRoaXMuX190bXBfZXJyb3IpO2AgK1xuICAgICAgICAgICAgICAgIGBkZWxldGUgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV07YCArXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBnbG9iYWxUaGlzLl9fdG1wX2Vycm9yO2AgK1xuICAgICAgICAgICAgICAgIGB9KSgpYFxuICAgICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIExlZ2FjeSBwYXRoOiBwcmUtcGlwZWxpbmUgZXZlbnRzIHN0b3JlZCBlcnJvciBhc1xuICAgICAgICAgICAgLy8gYHsgbWVzc2FnZSwgc3RhY2ssIGNvZGUgfWAuIFJlY29uc3RydWN0IGEgRmF0YWxFcnJvciBzb1xuICAgICAgICAgICAgLy8gd29ya2Zsb3cgY2F0Y2ggY2FuIGRldGVjdCBpdCB2aWEgRmF0YWxFcnJvci5pcygpLCBtYXRjaGluZ1xuICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIFYxIHN0ZXAgaGFuZGxlciBiZWhhdmlvci5cbiAgICAgICAgICAgIGNvbnN0IGlzRXJyb3JPYmplY3QgPVxuICAgICAgICAgICAgICB0eXBlb2YgZXJyb3JEYXRhID09PSAnb2JqZWN0JyAmJiBlcnJvckRhdGEgIT09IG51bGw7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBpc0Vycm9yT2JqZWN0XG4gICAgICAgICAgICAgID8gKCgoZXJyb3JEYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5tZXNzYWdlIGFzIHN0cmluZykgPz9cbiAgICAgICAgICAgICAgICAnU3RlcCBmYWlsZWQnKVxuICAgICAgICAgICAgICA6IHR5cGVvZiBlcnJvckRhdGEgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgPyBlcnJvckRhdGFcbiAgICAgICAgICAgICAgICA6ICdTdGVwIGZhaWxlZCc7XG4gICAgICAgICAgICBjb25zdCBlcnJvclN0YWNrID1cbiAgICAgICAgICAgICAgKGlzRXJyb3JPYmplY3RcbiAgICAgICAgICAgICAgICA/IChlcnJvckRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnN0YWNrXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQpID8/IChldmVudERhdGE/LnN0YWNrIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBjb25zdCBzdGFja0Fzc2lnbm1lbnQgPSBlcnJvclN0YWNrXG4gICAgICAgICAgICAgID8gYGUuc3RhY2s9JHtKU09OLnN0cmluZ2lmeShlcnJvclN0YWNrKX07YFxuICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGAoZnVuY3Rpb24oKXt2YXIgZT1uZXcgRXJyb3IoJHtKU09OLnN0cmluZ2lmeShtc2cpfSk7ZS5uYW1lPVwiRmF0YWxFcnJvclwiO2UuZmF0YWw9dHJ1ZTske3N0YWNrQXNzaWdubWVudH1gICtcbiAgICAgICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVqZWN0KGUpO2AgK1xuICAgICAgICAgICAgICAgIGBkZWxldGUgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV07fSkoKWBcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHJlc29sdmVyIHlldCwgc28gYnVmZmVyIHRoZSBwcmVwYXJlZCByZWplY3Rpb24gKHNlZSB0aGVcbiAgICAgICAgICAvLyBzdGVwX2NvbXBsZXRlZCBicmFuY2ggYWJvdmUgZm9yIHRoZSByYXRpb25hbGUpLlxuICAgICAgICAgIGNvbnN0IGVycm9yRGF0YSA9IGV2ZW50RGF0YT8uZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yRGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKGVycm9yRGF0YSwgZW5jcnlwdGlvbktleSk7XG4gICAgICAgICAgICAvLyBIb3N0IHNlcmRlOiBkZXNlcmlhbGl6ZSBpbnRvIHRoZSBWTSBlcnJvciB2YWx1ZSBOT1cgKHNhbWVcbiAgICAgICAgICAgIC8vIHBhdGggYXMgdGhlIHJlc29sdmVyIGJyYW5jaCBhYm92ZSkgYW5kIGJ1ZmZlciBpdC5cbiAgICAgICAgICAgIGNvbnN0IGVycm9ySGFuZGxlID0gc2VyZGUuZGVzZXJpYWxpemUoZGVjcnlwdGVkKTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfYnVmJywgZXJyb3JIYW5kbGUpO1xuICAgICAgICAgICAgZXJyb3JIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlamVjdF92YWx1ZVwiLCB2YWx1ZTogZ2xvYmFsVGhpcy5fX3RtcF9idWYgfTtgICtcbiAgICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX190bXBfYnVmO2BcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpc0Vycm9yT2JqZWN0ID1cbiAgICAgICAgICAgICAgdHlwZW9mIGVycm9yRGF0YSA9PT0gJ29iamVjdCcgJiYgZXJyb3JEYXRhICE9PSBudWxsO1xuICAgICAgICAgICAgY29uc3QgbXNnID0gaXNFcnJvck9iamVjdFxuICAgICAgICAgICAgICA/ICgoKGVycm9yRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikubWVzc2FnZSBhcyBzdHJpbmcpID8/XG4gICAgICAgICAgICAgICAgJ1N0ZXAgZmFpbGVkJylcbiAgICAgICAgICAgICAgOiB0eXBlb2YgZXJyb3JEYXRhID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8gZXJyb3JEYXRhXG4gICAgICAgICAgICAgICAgOiAnU3RlcCBmYWlsZWQnO1xuICAgICAgICAgICAgY29uc3QgZXJyb3JTdGFjayA9XG4gICAgICAgICAgICAgIChpc0Vycm9yT2JqZWN0XG4gICAgICAgICAgICAgICAgPyAoZXJyb3JEYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5zdGFja1xuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkKSA/PyAoZXZlbnREYXRhPy5zdGFjayBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlamVjdF9lcnJvclwiLCBtZXNzYWdlOiAke0pTT04uc3RyaW5naWZ5KG1zZyl9LCBzdGFjazogJHtlcnJvclN0YWNrID8gSlNPTi5zdHJpbmdpZnkoZXJyb3JTdGFjaykgOiAndW5kZWZpbmVkJ30gfTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd3YWl0X2NvbXBsZXRlZCc6IHtcbiAgICAgICAgY29uc3QgaGFzUmVzb2x2ZXIgPSB2bS5kdW1wKFxuICAgICAgICAgIHZtLmV2YWxDb2RlKGAhIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dYClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGhhc1Jlc29sdmVyKSB7XG4gICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVzb2x2ZSgpO2AgK1xuICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dO2BcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHJlc29sdmVyIHlldCwgc28gYnVmZmVyIChzZWUgc3RlcF9jb21wbGV0ZWQgYWJvdmUpLlxuICAgICAgICAgIHZtLmV2YWxDb2RlKFxuICAgICAgICAgICAgYGdsb2JhbFRoaXMuX190ZXJtaW5hbEJ1ZmZlclske2NpZEpzfV0gPSB7IGtpbmQ6IFwicmVzb2x2ZV91bmRlZmluZWRcIiB9O2BcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBtYXJrQ3JlYXRlZCh2bSwgY2lkSnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2F0dHJfc2V0Jzoge1xuICAgICAgICAvLyBPbmx5IHdvcmtmbG93LXdyaXR0ZW4gYXR0cmlidXRlIGV2ZW50cyByZXNvbHZlIGEgcGVuZGluZ1xuICAgICAgICAvLyBzZXRBdHRyaWJ1dGVzKCkgcHJvbWlzZTsgc3RlcC9zeXN0ZW0gd3JpdGVycyBzaGFyZSBub1xuICAgICAgICAvLyBjb3JyZWxhdGlvbklkcyB3aXRoIFZNIHJlc29sdmVycywgc28gdGhlIGd1YXJkIGlzIGRlZmVuc2l2ZS5cbiAgICAgICAgY29uc3Qgd3JpdGVyID0gKGV2ZW50RGF0YT8ud3JpdGVyIGFzIHsgdHlwZT86IHN0cmluZyB9IHwgdW5kZWZpbmVkKVxuICAgICAgICAgID8udHlwZTtcbiAgICAgICAgaWYgKHdyaXRlciAhPT0gJ3dvcmtmbG93JykgYnJlYWs7XG4gICAgICAgIGNvbnN0IGhhc1Jlc29sdmVyID0gdm0uZHVtcChcbiAgICAgICAgICB2bS5ldmFsQ29kZShgISFnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XWApXG4gICAgICAgICk7XG4gICAgICAgIGlmICghaGFzUmVzb2x2ZXIpIHtcbiAgICAgICAgICAvLyBObyByZXNvbHZlciB5ZXQsIHNvIGJ1ZmZlciAoc2VlIHN0ZXBfY29tcGxldGVkIGFib3ZlKS5cbiAgICAgICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9fdGVybWluYWxCdWZmZXJbJHtjaWRKc31dID0geyBraW5kOiBcInJlc29sdmVfdW5kZWZpbmVkXCIgfTtgXG4gICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc1Jlc29sdmVyKSB7XG4gICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVzb2x2ZSgpO2AgK1xuICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dO2BcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1hcmtDcmVhdGVkKHZtLCBjaWRKcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnaG9va19yZWNlaXZlZCc6IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBldmVudCB3YXMgYWxyZWFkeSBwcm9jZXNzZWQgKGRlbGl2ZXJlZCBvclxuICAgICAgICAvLyBidWZmZXJlZCkgd2l0aGluIHRoaXMgaW52b2NhdGlvbi4gUHJldmVudHMgZG91YmxlLWRlbGl2ZXJ5IHdoZW5cbiAgICAgICAgLy8gdGhlIG91dGVyIGxvb3AgcmUtc2NhbnMgZXZlbnRzLlxuICAgICAgICBjb25zdCBhbHJlYWR5UHJvY2Vzc2VkID0gZXZlbnQuZXZlbnRJZFxuICAgICAgICAgID8gdm0uZHVtcChcbiAgICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgICAgYCEhKGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzICYmIGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzWyR7SlNPTi5zdHJpbmdpZnkoZXZlbnQuZXZlbnRJZCl9XSlgXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICBpZiAoYWxyZWFkeVByb2Nlc3NlZCkge1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBob29rX3JlY2VpdmVkIGFscmVhZHkgcHJvY2Vzc2VkJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogY2lkLFxuICAgICAgICAgICAgICBldmVudElkOiBldmVudC5ldmVudElkLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2lsaWVudC1yZXN1bWUgZGVkdXAgKHBhcml0eSB3aXRoIHRoZSBub2RlIGVuZ2luZSdzXG4gICAgICAgIC8vIEV2ZW50c0NvbnN1bWVyIGluIHdvcmtmbG93L2hvb2sudHMpOiB0d28gaG9va19yZWNlaXZlZCByb3dzIGZvclxuICAgICAgICAvLyBPTkUgcmVzdW1lIGF0dGVtcHQgc2hhcmUgYSBjbGllbnQtbWludGVkIGByZXN1bWVJZGAgKGEgZHVwbGljYXRlXG4gICAgICAgIC8vIGNhbiBiZSBjb21taXR0ZWQgd2hlbiB0aGUgbWF0ZXJpYWxpemF0aW9uIGZhbGxiYWNrIHJhY2VzIGFcbiAgICAgICAgLy8gZGVsYXllZCBkaXJlY3Qgd3JpdGUsIHNpbmNlIGhvb2tfcmVjZWl2ZWQgaGFzIG5vIHN0b3JhZ2UgdW5pcXVlbmVzc1xuICAgICAgICAvLyBjb25zdHJhaW50KS4gRGVsaXZlciBvbmx5IHRoZSBmaXJzdC1pbi1sb2cgb2NjdXJyZW5jZS4gVGhlIHNlZW5cbiAgICAgICAgLy8gc2V0IGxpdmVzIGluIHRoZSBWTSBoZWFwIHNvIGl0IGlzIGRldGVybWluaXN0aWMgcGVyIHJlcGxheSBhbmRcbiAgICAgICAgLy8gc3Vydml2ZXMgZXZlbnQgcmUtc2NhbnMgd2l0aGluIHRoZSBpbnZvY2F0aW9uLiBFdmVudHMgd2l0aG91dCBhXG4gICAgICAgIC8vIHJlc3VtZUlkIChvbGRlciBTREtzKSBhcmUgbmV2ZXIgZGVkdXBlZC5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFRvcC1sZXZlbCBldmVudC5yZXN1bWVJZCBpcyB0aGUgY2Fub25pY2FsIGxvY2F0aW9uICh0aGUgYmFja2VuZFxuICAgICAgICAgIC8vIGhvaXN0cyBpdCB0byBhIGZpcnN0LWNsYXNzIGNvbHVtbik7IHRoZSBuZXN0ZWRcbiAgICAgICAgICAvLyBldmVudERhdGEucmVzdW1lSWQgZm9ybSBpcyBhIGRlcHJlY2F0ZWQgbGVnYWN5IGZhbGxiYWNrLlxuICAgICAgICAgIC8vIE1pcnJvcnMgdGhlIG5vZGUgZW5naW5lJ3MgZGVkdXAgaW4gd29ya2Zsb3cvaG9vay50cy5cbiAgICAgICAgICBjb25zdCByZXN1bWVJZCA9XG4gICAgICAgICAgICAoZXZlbnQgYXMgeyByZXN1bWVJZD86IHVua25vd24gfSkucmVzdW1lSWQgPz9cbiAgICAgICAgICAgIChldmVudERhdGEgYXMgeyByZXN1bWVJZD86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LnJlc3VtZUlkO1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzdW1lSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bWVJZEpzID0gSlNPTi5zdHJpbmdpZnkocmVzdW1lSWQpO1xuICAgICAgICAgICAgY29uc3QgZHVwbGljYXRlID0gdm0uZHVtcChcbiAgICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgICAgYChnbG9iYWxUaGlzLl9faG9va1NlZW5SZXN1bWVJZHMgPSBnbG9iYWxUaGlzLl9faG9va1NlZW5SZXN1bWVJZHMgfHwge30pWyR7cmVzdW1lSWRKc31dID09PSB0cnVlYFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICdRdWlja0pTIHJ1bnRpbWU6IGR1cGxpY2F0ZSBob29rX3JlY2VpdmVkIGZvciB0aGUgc2FtZSByZXN1bWUgYXR0ZW1wdCwgZHJvcHBpbmcnLFxuICAgICAgICAgICAgICAgIHsgY29ycmVsYXRpb25JZDogY2lkLCBldmVudElkOiBldmVudC5ldmVudElkLCByZXN1bWVJZCB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChldmVudC5ldmVudElkKSB7XG4gICAgICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgICAgICBgKGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzID0gZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyLl9fcHJvY2Vzc2VkRXZlbnRJZHMgfHwge30pWyR7SlNPTi5zdHJpbmdpZnkoZXZlbnQuZXZlbnRJZCl9XSA9IHRydWU7YFxuICAgICAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1hcmtDcmVhdGVkKHZtLCBjaWRKcyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGBnbG9iYWxUaGlzLl9faG9va1NlZW5SZXN1bWVJZHNbJHtyZXN1bWVJZEpzfV0gPSB0cnVlO2BcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFib3J0IGRlbGl2ZXJ5OiBob29rX3JlY2VpdmVkIGZvciBhbiBBYm9ydENvbnRyb2xsZXIncyBzeXN0ZW1cbiAgICAgICAgLy8gaG9vayBmbGlwcyB0aGUgcmVnaXN0ZXJlZCBzaWduYWwgaW5zdGVhZCBvZiByZXNvbHZpbmcgYSBwcm9taXNlLlxuICAgICAgICAvLyBUaGUgcGF5bG9hZCBpcyB0aGUgZGVoeWRyYXRlZCBgeyBhYm9ydGVkOiB0cnVlLCByZWFzb24gfWAgb2JqZWN0LlxuICAgICAgICBjb25zdCBpc0Fib3J0SG9vayA9IHZtLmR1bXAoXG4gICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICBgISEoZ2xvYmFsVGhpcy5fX2Fib3J0U2lnbmFscyAmJiBnbG9iYWxUaGlzLl9fYWJvcnRTaWduYWxzWyR7Y2lkSnN9XSlgXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBpZiAoaXNBYm9ydEhvb2spIHtcbiAgICAgICAgICBjb25zdCByYXdBYm9ydFBheWxvYWQgPSBldmVudERhdGE/LnBheWxvYWQ7XG4gICAgICAgICAgaWYgKHJhd0Fib3J0UGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKFxuICAgICAgICAgICAgICByYXdBYm9ydFBheWxvYWQsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkSGFuZGxlID0gc2VyZGUuZGVzZXJpYWxpemUoZGVjcnlwdGVkKTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfYWJvcnQnLCBwYXlsb2FkSGFuZGxlKTtcbiAgICAgICAgICAgIHBheWxvYWRIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGAoZnVuY3Rpb24oKXtgICtcbiAgICAgICAgICAgICAgICBgdmFyIHA9Z2xvYmFsVGhpcy5fX3RtcF9hYm9ydDtgICtcbiAgICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX190bXBfYWJvcnQ7YCArXG4gICAgICAgICAgICAgICAgYGdsb2JhbFRoaXMuX19hYm9ydFNpZ25hbHNbJHtjaWRKc31dLl9zZXRBYm9ydGVkKHAmJnR5cGVvZiBwPT09XCJvYmplY3RcIj9wLnJlYXNvbjp1bmRlZmluZWQpO2AgK1xuICAgICAgICAgICAgICAgIGB9KSgpYFxuICAgICAgICAgICAgKS5kaXNwb3NlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZtLmV2YWxDb2RlKFxuICAgICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX2Fib3J0U2lnbmFsc1ske2NpZEpzfV0uX3NldEFib3J0ZWQodW5kZWZpbmVkKTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVGhlIGFib3J0IGlzIGR1cmFibHkgcmVjb3JkZWQsIHNvIGNsZWFyIHRoZSBwZW5kaW5nIG9wJ3NcbiAgICAgICAgICAvLyBhYm9ydFJlcXVlc3RlZCBtYXJrZXIgc28gdGhlIGhvc3QgZG9lc24ndCByZS1yZWNvcmQgaXQgKHRoZVxuICAgICAgICAgIC8vIHdvcmtmbG93J3Mgb3duIGFib3J0KCkgY2FsbCBjYW4gc2V0IHRoZSBmbGFnIGJlZm9yZSB0aGlzXG4gICAgICAgICAgLy8gZXZlbnQgaXMgcHJvY2Vzc2VkIHdoZW4gaXQgaGFwcGVucyBsYXRlciBpbiByZXBsYXkgb3JkZXIsXG4gICAgICAgICAgLy8gYW5kIGhvb2tfcmVjZWl2ZWQgZXZlbnRzIGFyZSBub3QgdW5pcXVlIHBlciBjb3JyZWxhdGlvbklkKS5cbiAgICAgICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgIGAoZnVuY3Rpb24oKXtgICtcbiAgICAgICAgICAgICAgYHZhciBwPWdsb2JhbFRoaXMuX19wZW5kaW5nLmZpbmQoZnVuY3Rpb24ocSl7cmV0dXJuIHEuY29ycmVsYXRpb25JZD09PSR7SlNPTi5zdHJpbmdpZnkoY2lkKX0mJnEudHlwZT09PVwiaG9va1wiO30pO2AgK1xuICAgICAgICAgICAgICBgaWYocClwLmFib3J0UmVxdWVzdGVkPWZhbHNlO2AgK1xuICAgICAgICAgICAgICBgfSkoKWBcbiAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICBpZiAoZXZlbnQuZXZlbnRJZCkge1xuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGAoZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyLl9fcHJvY2Vzc2VkRXZlbnRJZHMgPSBnbG9iYWxUaGlzLl9faG9va1BheWxvYWRCdWZmZXIuX19wcm9jZXNzZWRFdmVudElkcyB8fCB7fSlbJHtKU09OLnN0cmluZ2lmeShldmVudC5ldmVudElkKX1dID0gdHJ1ZTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IGI6IG51bWJlcjtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgYiA9IHZtLmV4ZWN1dGVQZW5kaW5nSm9icygpO1xuICAgICAgICAgICAgfSB3aGlsZSAoYiA+IDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXJrQ3JlYXRlZCh2bSwgY2lkSnMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFzUmVzb2x2ZXIgPSB2bS5kdW1wKFxuICAgICAgICAgIHZtLmV2YWxDb2RlKGAhIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dYClcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmF3UGF5bG9hZCA9IGV2ZW50RGF0YT8ucGF5bG9hZCA/PyBldmVudERhdGE/LnJlc3VsdDtcbiAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZygnUXVpY2tKUyBydW50aW1lOiBwcm9jZXNzaW5nIGhvb2tfcmVjZWl2ZWQnLCB7XG4gICAgICAgICAgY29ycmVsYXRpb25JZDogY2lkLFxuICAgICAgICAgIGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICAgICAgaGFzUmVzb2x2ZXIsXG4gICAgICAgICAgcGF5bG9hZFR5cGU6IHR5cGVvZiByYXdQYXlsb2FkLFxuICAgICAgICAgIHBheWxvYWRJc1VpbnQ4QXJyYXk6IHJhd1BheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5LFxuICAgICAgICAgIHBheWxvYWRLZXlzOlxuICAgICAgICAgICAgcmF3UGF5bG9hZCAmJiB0eXBlb2YgcmF3UGF5bG9hZCA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgPyBPYmplY3Qua2V5cyhyYXdQYXlsb2FkKVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChoYXNSZXNvbHZlcikge1xuICAgICAgICAgIGlmIChyYXdQYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgICAgICAgLy8gRGVjcnlwdCBpZiBlbmNyeXB0ZWQ6IHRoZSBWTSBvbmx5IHVuZGVyc3RhbmRzICdkZXZsJyBmb3JtYXRcbiAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZFBheWxvYWQgPSBhd2FpdCBwcmVwYXJlQnl0ZXNGb3JWTShcbiAgICAgICAgICAgICAgcmF3UGF5bG9hZCxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWRIYW5kbGUgPSBzZXJkZS5kZXNlcmlhbGl6ZShkZWNyeXB0ZWRQYXlsb2FkKTtcbiAgICAgICAgICAgIHZtLnNldFByb3Aodm0uZ2xvYmFsLCAnX190bXBfcmVzdWx0JywgcGF5bG9hZEhhbmRsZSk7XG4gICAgICAgICAgICBwYXlsb2FkSGFuZGxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHZtLmV2YWxDb2RlKFxuICAgICAgICAgICAgICBgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1ske2NpZEpzfV0ucmVzb2x2ZShnbG9iYWxUaGlzLl9fdG1wX3Jlc3VsdCk7YCArXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XTtgICtcbiAgICAgICAgICAgICAgICBgZGVsZXRlIGdsb2JhbFRoaXMuX190bXBfcmVzdWx0O2BcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID1cbiAgICAgICAgICAgICAgcmF3UGF5bG9hZCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShyYXdQYXlsb2FkKVxuICAgICAgICAgICAgICAgIDogJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgICAgYGdsb2JhbFRoaXMuX19yZXNvbHZlcnNbJHtjaWRKc31dLnJlc29sdmUoJHtzZXJpYWxpemVkfSk7YCArXG4gICAgICAgICAgICAgICAgYGRlbGV0ZSBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzWyR7Y2lkSnN9XTtgXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTWFyayB0aGlzIGV2ZW50IGFzIHByb2Nlc3NlZCBpbiB0aGUgVk0gaGVhcCB0byBwcmV2ZW50XG4gICAgICAgICAgLy8gZG91YmxlLWRlbGl2ZXJ5IHdoZW4gdGhlIG91dGVyIGxvb3AgcmUtc2NhbnMgZXZlbnRzLlxuICAgICAgICAgIGlmIChldmVudC5ldmVudElkKSB7XG4gICAgICAgICAgICB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgICAgYChnbG9iYWxUaGlzLl9faG9va1BheWxvYWRCdWZmZXIuX19wcm9jZXNzZWRFdmVudElkcyA9IGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzIHx8IHt9KVske0pTT04uc3RyaW5naWZ5KGV2ZW50LmV2ZW50SWQpfV0gPSB0cnVlO2BcbiAgICAgICAgICAgICkuZGlzcG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBiID0gdm0uZXhlY3V0ZVBlbmRpbmdKb2JzKCk7XG4gICAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIHJlc29sdmVyIHlldCwgc28gYnVmZmVyIHRoZSBwYXlsb2FkIGluIHRoZSBWTSBoZWFwLiBXaGVuXG4gICAgICAgICAgLy8gY3JlYXRlSG9va1Byb21pc2UoKSBpcyBjYWxsZWQgbGF0ZXIsIGl0IHdpbGwgZHJhaW4gdGhpcyBidWZmZXJcbiAgICAgICAgICAvLyBmaXJzdCAobWF0Y2hpbmcgdGhlIG5vZGU6dm0gZW5naW5lJ3MgcGF5bG9hZHNRdWV1ZSBiZWhhdmlvcikuXG4gICAgICAgICAgY29uc3QgZXZlbnRJZEpzID0gZXZlbnQuZXZlbnRJZFxuICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShldmVudC5ldmVudElkKVxuICAgICAgICAgICAgOiAnbnVsbCc7XG4gICAgICAgICAgY29uc3QgYnVmZmVyQW5kVHJhY2sgPVxuICAgICAgICAgICAgYChnbG9iYWxUaGlzLl9faG9va1BheWxvYWRCdWZmZXJbJHtjaWRKc31dID0gZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyWyR7Y2lkSnN9XSB8fCBbXSlgICtcbiAgICAgICAgICAgIGAucHVzaCglUEFZTE9BRCUpO2AgK1xuICAgICAgICAgICAgKGV2ZW50LmV2ZW50SWRcbiAgICAgICAgICAgICAgPyBgKGdsb2JhbFRoaXMuX19ob29rUGF5bG9hZEJ1ZmZlci5fX3Byb2Nlc3NlZEV2ZW50SWRzID0gZ2xvYmFsVGhpcy5fX2hvb2tQYXlsb2FkQnVmZmVyLl9fcHJvY2Vzc2VkRXZlbnRJZHMgfHwge30pWyR7ZXZlbnRJZEpzfV0gPSB0cnVlO2BcbiAgICAgICAgICAgICAgOiAnJyk7XG4gICAgICAgICAgaWYgKHJhd1BheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgICAgICAvLyBEZWNyeXB0IGlmIGVuY3J5cHRlZDogdGhlIFZNIG9ubHkgdW5kZXJzdGFuZHMgJ2RldmwnIGZvcm1hdFxuICAgICAgICAgICAgY29uc3QgZGVjcnlwdGVkUGF5bG9hZCA9IGF3YWl0IHByZXBhcmVCeXRlc0ZvclZNKFxuICAgICAgICAgICAgICByYXdQYXlsb2FkLFxuICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZEhhbmRsZSA9IHNlcmRlLmRlc2VyaWFsaXplKGRlY3J5cHRlZFBheWxvYWQpO1xuICAgICAgICAgICAgdm0uc2V0UHJvcCh2bS5nbG9iYWwsICdfX3RtcF9yZXN1bHQnLCBwYXlsb2FkSGFuZGxlKTtcbiAgICAgICAgICAgIHBheWxvYWRIYW5kbGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgLy8gTk9URTogcmVwbGFjZW1lbnQgaXMgYSBmdW5jdGlvbiBzbyBgJGAtc2VxdWVuY2VzIGluIHRoZVxuICAgICAgICAgICAgLy8gc3Vic3RpdHV0ZWQgSlMgbmV2ZXIgZ2V0IGludGVycHJldGVkIGFzIFN0cmluZy5yZXBsYWNlXG4gICAgICAgICAgICAvLyBzcGVjaWFsIHJlcGxhY2VtZW50IHBhdHRlcm5zLlxuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGJ1ZmZlckFuZFRyYWNrLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgJyVQQVlMT0FEJScsXG4gICAgICAgICAgICAgICAgKCkgPT4gJ2dsb2JhbFRoaXMuX190bXBfcmVzdWx0J1xuICAgICAgICAgICAgICApICsgJ2RlbGV0ZSBnbG9iYWxUaGlzLl9fdG1wX3Jlc3VsdDsnXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9XG4gICAgICAgICAgICAgIHJhd1BheWxvYWQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkocmF3UGF5bG9hZClcbiAgICAgICAgICAgICAgICA6ICd1bmRlZmluZWQnO1xuICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmVwbGFjZW1lbnQ6IGEgSlNPTi1zZXJpYWxpemVkIHBheWxvYWQgY2FuIGNvbnRhaW5cbiAgICAgICAgICAgIC8vIGAkJmAsIGAkJ2AsIGAkXFxgYCwgLi4uIHdoaWNoIFN0cmluZy5yZXBsYWNlIHdvdWxkIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gZXhwYW5kLCBzaWxlbnRseSBjb3JydXB0aW5nIHRoZSBpbmplY3RlZCBjb2RlLlxuICAgICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICAgIGJ1ZmZlckFuZFRyYWNrLnJlcGxhY2UoJyVQQVlMT0FEJScsICgpID0+IHNlcmlhbGl6ZWQpXG4gICAgICAgICAgICApLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdob29rX2NvbmZsaWN0Jzoge1xuICAgICAgICAvLyBBbm90aGVyIHdvcmtmbG93IG93bnMgdGhpcyBob29rIHRva2VuLiBQYXlsb2FkIGF3YWl0ZXJzIHJlamVjdFxuICAgICAgICAvLyB3aXRoIEhvb2tDb25mbGljdEVycm9yOyBnZXRDb25mbGljdCgpIGF3YWl0ZXJzIHJlc29sdmUgd2l0aCBhXG4gICAgICAgIC8vIFJ1biBoYW5kbGUgZm9yIHRoZSBjb25mbGljdGluZyBydW4gKHJldml2ZWQgdGhyb3VnaCB0aGUgVk0nc1xuICAgICAgICAvLyBjbGFzcyByZWdpc3RyeSBzbyBpdHMgbWV0aG9kcyBhcmUgZHVyYWJsZSBzdGVwIHByb3hpZXMpIG9yXG4gICAgICAgIC8vIHJlamVjdCB3aXRoIHRoZSBlcnJvciB3aGVuIG5vIGhhbmRsZSBjYW4gYmUgY29uc3RydWN0ZWQsXG4gICAgICAgIC8vIG1pcnJvcmluZyB0aGUgbm9kZTp2bSBlbmdpbmUncyBob29rLnRzIGhvb2tfY29uZmxpY3QgaGFuZGxpbmcuXG4gICAgICAgIGNvbnN0IGNvbmZsaWN0VG9rZW4gPSAoZXZlbnREYXRhPy50b2tlbiBhcyBzdHJpbmcpID8/ICd1bmtub3duJztcbiAgICAgICAgY29uc3QgY29uZmxpY3RpbmdSdW5JZCA9IGV2ZW50RGF0YT8uY29uZmxpY3RpbmdSdW5JZCBhc1xuICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGRpZFNldHRsZSA9IHZtLmR1bXAoXG4gICAgICAgICAgdm0uZXZhbENvZGUoXG4gICAgICAgICAgICBgKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgIHZhciBjaWQgPSAke0pTT04uc3RyaW5naWZ5KGNpZCl9O1xuICAgICAgICAgICAgICB2YXIgdG9rZW4gPSAke0pTT04uc3RyaW5naWZ5KGNvbmZsaWN0VG9rZW4pfTtcbiAgICAgICAgICAgICAgdmFyIGNvbmZsaWN0aW5nUnVuSWQgPSAke0pTT04uc3RyaW5naWZ5KGNvbmZsaWN0aW5nUnVuSWQgPz8gbnVsbCl9O1xuICAgICAgICAgICAgICB2YXIgRXJyQ2xzID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9Ib29rQ29uZmxpY3RFcnJvcicpXTtcbiAgICAgICAgICAgICAgdmFyIGVycjtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBFcnJDbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBlcnIgPSBuZXcgRXJyQ2xzKHRva2VuLCBjb25mbGljdGluZ1J1bklkIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKCdIb29rIHRva2VuIFwiJyArIHRva2VuICsgJ1wiIGlzIGFscmVhZHkgaW4gdXNlIGJ5IGFub3RoZXIgd29ya2Zsb3cnKTtcbiAgICAgICAgICAgICAgICBlcnIubmFtZSA9ICdIb29rQ29uZmxpY3RFcnJvcic7XG4gICAgICAgICAgICAgICAgZXJyLnRva2VuID0gdG9rZW47XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZsaWN0aW5nUnVuSWQpIGVyci5jb25mbGljdGluZ1J1bklkID0gY29uZmxpY3RpbmdSdW5JZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgcnVuID0gbnVsbDtcbiAgICAgICAgICAgICAgaWYgKGNvbmZsaWN0aW5nUnVuSWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVnID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKCd3b3JrZmxvdy1jbGFzcy1yZWdpc3RyeScpXTtcbiAgICAgICAgICAgICAgICB2YXIgUnVuQ2xzID0gcmVnICYmIHJlZy5nZXQoJ2NsYXNzLy93b3JrZmxvdy8vUnVuJyk7XG4gICAgICAgICAgICAgICAgdmFyIGRlcyA9IFJ1bkNscyAmJiBSdW5DbHNbU3ltYm9sLmZvcignd29ya2Zsb3ctZGVzZXJpYWxpemUnKV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgIHJ1biA9IGRlcy5jYWxsKFJ1bkNscywgeyBydW5JZDogY29uZmxpY3RpbmdSdW5JZCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIHNldHRsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdmFyIHN0YXRlID0gZ2xvYmFsVGhpcy5fX2hvb2tzICYmIGdsb2JhbFRoaXMuX19ob29rc1tjaWRdO1xuICAgICAgICAgICAgICBpZiAoc3RhdGUgJiYgIXN0YXRlLmNvbmZsaWN0KSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuY29uZmxpY3QgPSB7IGVycm9yOiBlcnIsIHJ1bjogcnVuIH07XG4gICAgICAgICAgICAgICAgdmFyIGdjID0gc3RhdGUuZ2V0Q29uZmxpY3RSZXNvbHZlcnM7XG4gICAgICAgICAgICAgICAgc3RhdGUuZ2V0Q29uZmxpY3RSZXNvbHZlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdjLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocnVuKSB7IGdjW2ldLnJlc29sdmUocnVuKTsgfSBlbHNlIHsgZ2NbaV0ucmVqZWN0KGVycik7IH1cbiAgICAgICAgICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1tjaWRdKSB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1tjaWRdLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBnbG9iYWxUaGlzLl9fcmVzb2x2ZXJzW2NpZF07XG4gICAgICAgICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHNldHRsZWQ7XG4gICAgICAgICAgICB9KSgpYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRpZFNldHRsZSkge1xuICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGIgPSB2bS5leGVjdXRlUGVuZGluZ0pvYnMoKTtcbiAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdGVwX2NyZWF0ZWQnOlxuICAgICAgY2FzZSAnc3RlcF9zdGFydGVkJzpcbiAgICAgIGNhc2UgJ3N0ZXBfcmV0cnlpbmcnOlxuICAgICAgY2FzZSAnd2FpdF9jcmVhdGVkJzoge1xuICAgICAgICBtYXJrQ3JlYXRlZCh2bSwgY2lkSnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hvb2tfY3JlYXRlZCc6IHtcbiAgICAgICAgLy8gQ29uZmlybSBjcmVhdGlvbiBmb3IgZ2V0Q29uZmxpY3QoKSBhd2FpdGVyczogcmVzb2x2ZSB0aGVtIHdpdGhcbiAgICAgICAgLy8gbnVsbCAobm8gY29uZmxpY3QpIG9uY2UgdGhlIGV2ZW50IGxvZyBwcm92ZXMgdGhlIGhvb2sgZXhpc3RzLlxuICAgICAgICBjb25zdCBzZXR0bGVkR2V0Q29uZmxpY3QgPSB2bS5kdW1wKFxuICAgICAgICAgIHZtLmV2YWxDb2RlKFxuICAgICAgICAgICAgYChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBnbG9iYWxUaGlzLl9faG9va3MgJiYgZ2xvYmFsVGhpcy5fX2hvb2tzWyR7SlNPTi5zdHJpbmdpZnkoY2lkKX1dO1xuICAgICAgICAgICAgICBpZiAoIXN0YXRlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIHN0YXRlLmNyZWF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB2YXIgZ2MgPSBzdGF0ZS5nZXRDb25mbGljdFJlc29sdmVycztcbiAgICAgICAgICAgICAgc3RhdGUuZ2V0Q29uZmxpY3RSZXNvbHZlcnMgPSBbXTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnYy5sZW5ndGg7IGkrKykgZ2NbaV0ucmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGdjLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICB9KSgpYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHNldHRsZWRHZXRDb25mbGljdCkge1xuICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICBsZXQgYjogbnVtYmVyO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGIgPSB2bS5leGVjdXRlUGVuZGluZ0pvYnMoKTtcbiAgICAgICAgICB9IHdoaWxlIChiID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgbWFya0NyZWF0ZWQodm0sIGNpZEpzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdob29rX2Rpc3Bvc2VkJzoge1xuICAgICAgICAvLyBEaXNhbWJpZ3VhdGUgZnJvbSB0aGUgYGhvb2tgIHBlbmRpbmcgb3Agd2l0aCB0aGUgc2FtZVxuICAgICAgICAvLyBjb3JyZWxhdGlvbklkOiB3ZSB3YW50IHRvIG1hcmsgdGhlIGBob29rX2Rpc3Bvc2VgIGVudHJ5LlxuICAgICAgICBtYXJrQ3JlYXRlZCh2bSwgY2lkSnMsICdob29rX2Rpc3Bvc2UnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNvbHZlZDtcbn1cblxuZnVuY3Rpb24gbWFya0NyZWF0ZWQodm06IFF1aWNrSlMsIGNpZEpzOiBzdHJpbmcsIG9wVHlwZT86IHN0cmluZyk6IHZvaWQge1xuICAvLyBgY2lkSnNgIGlzIHRoZSBKU09OLnN0cmluZ2lmeS1xdW90ZWQgY29ycmVsYXRpb24gaWQgKHNlZSBwcm9jZXNzRXZlbnRzKS5cbiAgLy8gYGhvb2tgIGFuZCBgaG9va19kaXNwb3NlYCBwZW5kaW5nIG9wcyBzaGFyZSB0aGUgc2FtZSBjb3JyZWxhdGlvbklkLFxuICAvLyBzbyB3aGVuIHByb2Nlc3NpbmcgYGhvb2tfZGlzcG9zZWRgIGV2ZW50cyB3ZSBtdXN0IGRpc2FtYmlndWF0ZSBieVxuICAvLyB0eXBlOiBvdGhlcndpc2UgYC5maW5kKClgIHJldHVybnMgdGhlIG9yaWdpbmFsIGBob29rYCBvcCBhbmQgdGhlXG4gIC8vIGBob29rX2Rpc3Bvc2VgIG9wIGlzIG5ldmVyIG1hcmtlZCwgY2F1c2luZyB0aGUgZW50cnlwb2ludCB0byBrZWVwXG4gIC8vIHJldHJ5aW5nIGEgaG9va19kaXNwb3NlZCBmb3IgYW4gYWxyZWFkeS1kZWxldGVkIGVudGl0eS5cbiAgY29uc3QgcHJlZGljYXRlID0gb3BUeXBlXG4gICAgPyBgZnVuY3Rpb24ocCl7cmV0dXJuIHAuY29ycmVsYXRpb25JZD09PSR7Y2lkSnN9JiZwLnR5cGU9PT0ke0pTT04uc3RyaW5naWZ5KG9wVHlwZSl9O31gXG4gICAgOiBgZnVuY3Rpb24ocCl7cmV0dXJuIHAuY29ycmVsYXRpb25JZD09PSR7Y2lkSnN9O31gO1xuICB2bS5ldmFsQ29kZShcbiAgICBgdmFyIF9fcD1nbG9iYWxUaGlzLl9fcGVuZGluZy5maW5kKCR7cHJlZGljYXRlfSk7YCArXG4gICAgICBgaWYoX19wKV9fcC5oYXNDcmVhdGVkRXZlbnQ9dHJ1ZTtgXG4gICkuZGlzcG9zZSgpO1xufVxuXG4vLyAtLS0tIFN0YXRlIENoZWNraW5nIC0tLS1cblxuLyoqXG4gKiBDb2xsZWN0IGxlZnRvdmVyIHBlbmRpbmcgb3BlcmF0aW9ucyB0aGF0IG5lZWQgZHVyYWJsZSBzaWRlIGVmZmVjdHMgd2hlblxuICogdGhlIHdvcmtmbG93IHJlYWNoZXMgYSB0ZXJtaW5hbCBzdGF0ZS4gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUnc1xuICogZHJhaW5QZW5kaW5nUXVldWVJdGVtcyAod29ya2Zsb3cudHMpOiBzdGlsbC1hbGl2ZSBzeXN0ZW0gaG9va3NcbiAqIChBYm9ydENvbnRyb2xsZXIpIHdpdGhvdXQgYW4gYWJvcnQgaW4gZmxpZ2h0IGFyZSBpbXBsaWNpdGx5IGRpc3Bvc2VkIHNvXG4gKiB0aGV5IGRvbid0IGxlYWsgaG9vayByb3dzOyBvcHMgd2l0aG91dCBjcmVhdGVkIGV2ZW50cyAoZmlyZS1hbmQtZm9yZ2V0XG4gKiBhdHRyaWJ1dGVzL2hvb2tzL3N0ZXBzL3dhaXRzKSBhbmQgcGVuZGluZyBhYm9ydCByZWNvcmRpbmdzIGFyZSBzdXJmYWNlZFxuICogZm9yIHRoZSBlbnRyeXBvaW50IHRvIGZsdXNoLlxuICovXG4vKipcbiAqIFBlci1WTSBjYWNoZSBvZiBzZXJpYWxpemVkIHBlbmRpbmctb3AgZmllbGQgYnl0ZXMsIGtleWVkXG4gKiBgY29ycmVsYXRpb25JZDpmaWVsZGAuIEEgc3RlcCdzIHJhdyBpbnB1dCBpcyBpbW11dGFibGUgb25jZSBwdXNoZWQsIHNvXG4gKiBpdHMgYnl0ZXMgYXJlIGNvbXB1dGVkIG9uY2UgZXZlbiB0aG91Z2ggdGhlIG9wIGlzIHJlLWNvbGxlY3RlZCBvbiBldmVyeVxuICogc3VzcGVuc2lvbiBpdCBzdGF5cyBwZW5kaW5nIHRocm91Z2guXG4gKi9cbi8vIHBlci1jb3B5LW9rOiBrZXllZCBvbiB0aGUgVk0gaW5zdGFuY2UsIGFuZCBhIFZNIGlzIGNyZWF0ZWQgYW5kIGRyaXZlbiBieSBvbmVcbi8vIGNvcHkuIEFub3RoZXIgY29weSBob2xkcyBubyByZWZlcmVuY2UgdG8gdGhlIGtleSwgc28gYSBzaGFyZWQgbWFwIGNvdWxkIG5ldmVyXG4vLyBiZSByZWFkIGZyb20gaXQuXG5jb25zdCBwZW5kaW5nQnl0ZUNhY2hlID0gbmV3IFdlYWtNYXA8UXVpY2tKUywgTWFwPHN0cmluZywgVWludDhBcnJheT4+KCk7XG5cbmZ1bmN0aW9uIGVuc3VyZVBlbmRpbmdCeXRlQ2FjaGUodm06IFF1aWNrSlMpOiBNYXA8c3RyaW5nLCBVaW50OEFycmF5PiB7XG4gIGxldCBjYWNoZSA9IHBlbmRpbmdCeXRlQ2FjaGUuZ2V0KHZtKTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIGNhY2hlID0gbmV3IE1hcCgpO1xuICAgIHBlbmRpbmdCeXRlQ2FjaGUuc2V0KHZtLCBjYWNoZSk7XG4gIH1cbiAgcmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIFRoZSBwZW5kaW5nLW9wIGZpZWxkcyB0aGF0IGhvbGQgUkFXIGd1ZXN0IHZhbHVlcyAodGhlIGJvb3RzdHJhcCBubyBsb25nZXJcbiAqIHNlcmlhbGl6ZXMgdGhlbSBpbiB0aGUgVk0pLiBDb2xsZWN0aW9uIHByb2plY3RzIHRoZW0gb3V0IG9mIHRoZSBkdW1wZWRcbiAqIHBsYWluIG1ldGFkYXRhIGFuZCBzZXJpYWxpemVzIGVhY2ggdGhyb3VnaCBhIGhhbmRsZSB3aXRoIHRoZSBob3N0IHNlcmRlLlxuICovXG5jb25zdCBSQVdfUEVORElOR19GSUVMRFMgPSBbJ2lucHV0JywgJ21ldGFkYXRhJywgJ2Fib3J0UGF5bG9hZCddIGFzIGNvbnN0O1xuXG4vKipcbiAqIER1bXAgYSBmaWx0ZXJlZCB2aWV3IG9mIGBnbG9iYWxUaGlzLl9fcGVuZGluZ2AgdG8gaG9zdCBQZW5kaW5nT3BlcmF0aW9uXG4gKiBvYmplY3RzLCBzZXJpYWxpemluZyB0aGUgcmF3LXZhbHVlIGZpZWxkcyBob3N0LXNpZGUuIGBmaWx0ZXJFeHByYCBpcyBhXG4gKiBndWVzdCBleHByZXNzaW9uIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBhcnJheSBvZiBvcHMgdG8gY29sbGVjdC5cbiAqL1xuZnVuY3Rpb24gZHVtcFBlbmRpbmdPcHMoXG4gIHZtOiBRdWlja0pTLFxuICBzZXJkZTogUXVpY2tKU1NlcmRlLFxuICBmaWx0ZXJFeHByOiBzdHJpbmcsXG4gIGJ5dGVDYWNoZT86IE1hcDxzdHJpbmcsIFVpbnQ4QXJyYXk+XG4pOiBQZW5kaW5nT3BlcmF0aW9uW10ge1xuICB1c2luZyBwcm9qZWN0ZWQgPSB2bS5ldmFsQ29kZShgKGZ1bmN0aW9uKCl7XG4gICAgdmFyIG9wcyA9ICR7ZmlsdGVyRXhwcn07XG4gICAgZ2xvYmFsVGhpcy5fX3Jhd0ZpZWxkcyA9IFtdO1xuICAgIC8vIFNldHRsZWQgb3BzIOKAlCBjcmVhdGVkLCByZXNvbHZlci1sZXNzLCBubyBhYm9ydCBpbiBmbGlnaHQg4oCUIGFyZVxuICAgIC8vIG5ldmVyIGNvbGxlY3RlZCBhZ2FpbiBieSBlaXRoZXIgdGhlIHN1c3BlbnNpb24gb3IgdGhlIGRyYWluXG4gICAgLy8gZmlsdGVyLCBzbyB0aGVpciBjYWNoZWQgYnl0ZXMgYXJlIGRlYWQgd2VpZ2h0OyBzdXJmYWNlIHRoZWlyIGNpZHNcbiAgICAvLyBzbyB0aGUgaG9zdCBjYW4gZXZpY3QgdGhlbSAoc2VlIHRoZSBieXRlLWNhY2hlIGV2aWN0aW9uIGJlbG93KS5cbiAgICB2YXIgc2V0dGxlZCA9IFtdO1xuICAgIGdsb2JhbFRoaXMuX19wZW5kaW5nLmZvckVhY2goZnVuY3Rpb24ocCl7XG4gICAgICBpZiAocC5oYXNDcmVhdGVkRXZlbnQgJiYgIWdsb2JhbFRoaXMuX19yZXNvbHZlcnNbcC5jb3JyZWxhdGlvbklkXSAmJiAhcC5hYm9ydFJlcXVlc3RlZCkge1xuICAgICAgICBzZXR0bGVkLnB1c2gocC5jb3JyZWxhdGlvbklkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4geyBzZXR0bGVkOiBzZXR0bGVkLCBvcHM6IG9wcy5tYXAoZnVuY3Rpb24ocCl7XG4gICAgICB2YXIgcSA9IHt9O1xuICAgICAgZm9yICh2YXIgayBpbiBwKSB7XG4gICAgICAgIGlmIChrID09PSAnaW5wdXQnIHx8IGsgPT09ICdtZXRhZGF0YScgfHwgayA9PT0gJ2Fib3J0UGF5bG9hZCcpIGNvbnRpbnVlO1xuICAgICAgICBxW2tdID0gcFtrXTtcbiAgICAgIH1cbiAgICAgIHZhciByYXcgPSB7fTtcbiAgICAgIFsnaW5wdXQnLCAnbWV0YWRhdGEnLCAnYWJvcnRQYXlsb2FkJ10uZm9yRWFjaChmdW5jdGlvbihmKXtcbiAgICAgICAgaWYgKHBbZl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJhd1tmXSA9IGdsb2JhbFRoaXMuX19yYXdGaWVsZHMubGVuZ3RoO1xuICAgICAgICAgIGdsb2JhbFRoaXMuX19yYXdGaWVsZHMucHVzaChwW2ZdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBxLl9fcmF3SW5kaWNlcyA9IHJhdztcbiAgICAgIHJldHVybiBxO1xuICAgIH0pIH07XG4gIH0pKClgKTtcbiAgY29uc3QgZHVtcGVkID0gdm0uZHVtcChwcm9qZWN0ZWQpIGFzIHtcbiAgICBzZXR0bGVkOiBzdHJpbmdbXTtcbiAgICBvcHM6IChQZW5kaW5nT3BlcmF0aW9uICYge1xuICAgICAgX19yYXdJbmRpY2VzPzogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICB9KVtdO1xuICB9O1xuICBjb25zdCBwbGFpbk9wcyA9IGR1bXBlZC5vcHM7XG4gIC8vIEJ5dGUtY2FjaGUgZXZpY3Rpb246IGVudHJpZXMgZm9yIHNldHRsZWQgb3BzIGNhbiBuZXZlciBiZSByZWFkIGFnYWluXG4gIC8vIChuZWl0aGVyIGNvbGxlY3Rpb24gZmlsdGVyIG1hdGNoZXMgYSBzZXR0bGVkIG9wKSwgc28gZHJvcHBpbmcgdGhlbVxuICAvLyBib3VuZHMgdGhlIGNhY2hlIGJ5IHRoZSBMSVZFIHBlbmRpbmcgc2V0IGluc3RlYWQgb2YgZ3Jvd2luZ1xuICAvLyBtb25vdG9uaWNhbGx5IGZvciB0aGUgVk0ncyBsaWZldGltZSwgd2hpY2ggbWF0dGVycyBmb3IgdGhlIGlubGluZVxuICAvLyBsb29wJ3MgbG9uZy1saXZlZCBzZXNzaW9ucyBhbmQgc25hcHNob3QtcmVzdG9yZWQgVk1zLlxuICBpZiAoYnl0ZUNhY2hlICYmIGR1bXBlZC5zZXR0bGVkLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IGNpZCBvZiBkdW1wZWQuc2V0dGxlZCkge1xuICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBSQVdfUEVORElOR19GSUVMRFMpIHtcbiAgICAgICAgYnl0ZUNhY2hlLmRlbGV0ZShgJHtjaWR9OiR7ZmllbGR9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHVzaW5nIHJhd0ZpZWxkcyA9IHZtLmV2YWxDb2RlKCdnbG9iYWxUaGlzLl9fcmF3RmllbGRzJyk7XG4gIGZvciAoY29uc3Qgb3Agb2YgcGxhaW5PcHMpIHtcbiAgICBjb25zdCByYXdJbmRpY2VzID0gb3AuX19yYXdJbmRpY2VzID8/IHt9O1xuICAgIGRlbGV0ZSBvcC5fX3Jhd0luZGljZXM7XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBSQVdfUEVORElOR19GSUVMRFMpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcmF3SW5kaWNlc1tmaWVsZF07XG4gICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IGAke29wLmNvcnJlbGF0aW9uSWR9OiR7ZmllbGR9YDtcbiAgICAgIGxldCBieXRlcyA9IGJ5dGVDYWNoZT8uZ2V0KGNhY2hlS2V5KTtcbiAgICAgIGlmICghYnl0ZXMpIHtcbiAgICAgICAgdXNpbmcgdmFsdWVIYW5kbGUgPSByYXdGaWVsZHMuZ2V0UHJvcChTdHJpbmcoaW5kZXgpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBieXRlcyA9IHNlcmRlLnNlcmlhbGl6ZSh2YWx1ZUhhbmRsZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIEEgc3RlcCBpbnB1dCB0aGF0IHJlZnVzZXMgdG8gc2VyaWFsaXplIGlzIGEgZGV0ZXJtaW5pc3RpYyB1c2VyXG4gICAgICAgICAgLy8gZXJyb3I6IGZhaWxpbmcgdGhlIHdob2xlIGNvbGxlY3Rpb24gaGVyZSB3b3VsZCBmYWlsIHRoZSBydW5cbiAgICAgICAgICAvLyBmcm9tIHRoZSBvdXRzaWRlLCB3aGVyZSBubyB3b3JrZmxvdyBjb2RlIGNhbiBvYnNlcnZlIGl0IChhbmRcbiAgICAgICAgICAvLyB3aXRoIGEgYmFyZSBEZXZhbHVlRXJyb3IgaW5zdGVhZCBvZiB0aGUgZnJhbWVkIG1lc3NhZ2UgdGhlXG4gICAgICAgICAgLy8gbm9kZTp2bSBlbmdpbmUgcHJvZHVjZXMpLiBSZWZyYW1lIGl0IGV4YWN0bHkgbGlrZVxuICAgICAgICAgIC8vIGBkZWh5ZHJhdGVTdGVwQXJndW1lbnRzYCBkb2VzIGFuZCBzdXJmYWNlIGl0IG9uIHRoZSBvcDogdGhlXG4gICAgICAgICAgLy8gZW50cnlwb2ludCBmaW5hbGl6ZXMgdGhlIHN0ZXAgYXMgc3RlcF9jcmVhdGVkICsgc3RlcF9mYWlsZWQgc29cbiAgICAgICAgICAvLyB0aGUgZmFpbHVyZSByZWplY3RzIGludG8gdGhlIHdvcmtmbG93LCBjYXRjaGFibGUuIE90aGVyIHJhd1xuICAgICAgICAgIC8vIGZpZWxkcyAoaG9vayBtZXRhZGF0YSwgYWJvcnQgcGF5bG9hZHMpIGtlZXAgdGhlIHRocm93aW5nXG4gICAgICAgICAgLy8gYmVoYXZpb3IsIG1hdGNoaW5nIHRoZSBub2RlOnZtIGVuZ2luZSdzIHNjb3BlLlxuICAgICAgICAgIGlmIChvcC50eXBlID09PSAnc3RlcCcgJiYgZmllbGQgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgaGludCB9ID0gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICAgICAgICAgICAgICAnc3RlcCBhcmd1bWVudHMnLFxuICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAob3AgYXMgUGVuZGluZ1N0ZXApLnNlcmlhbGl6YXRpb25FcnJvciA9IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IoXG4gICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgIHsgaGludCwgY2F1c2U6IGVyciB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICBieXRlQ2FjaGU/LnNldChjYWNoZUtleSwgYnl0ZXMpO1xuICAgICAgfVxuICAgICAgKG9wIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2ZpZWxkXSA9IGJ5dGVzO1xuICAgIH1cbiAgfVxuICB2bS5ldmFsQ29kZSgnZGVsZXRlIGdsb2JhbFRoaXMuX19yYXdGaWVsZHMnKS5kaXNwb3NlKCk7XG4gIHJldHVybiBwbGFpbk9wcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdERyYWluT3BlcmF0aW9ucyhcbiAgdm06IFF1aWNrSlMsXG4gIHNlcmRlOiBRdWlja0pTU2VyZGVcbik6IFBlbmRpbmdPcGVyYXRpb25bXSB7XG4gIC8vIFNoYXJlIHRoZSBwZXItVk0gYnl0ZSBjYWNoZSB3aXRoIHRoZSBzdXNwZW5zaW9uIHBhdGg6IGFuIG9wIHRoYXQgd2FzXG4gIC8vIHNlcmlhbGl6ZWQgZHVyaW5nIGEgc3VzcGVuc2lvbiBwYXNzIG11c3QgcmV1c2UgdGhvc2UgZXhhY3QgYnl0ZXMgYXRcbiAgLy8gdGVybWluYWwgZHJhaW4sIHNpbmNlIHJlLXNlcmlhbGl6aW5nIGNhbiBpbnZva2UgZ2V0dGVycyBhZ2FpbiBhbmQgcHJvZHVjZVxuICAvLyBhIERJRkZFUkVOVCBieXRlIHNlcXVlbmNlIGZvciB3aGF0IHRoZSBldmVudCBsb2cgdHJlYXRzIGFzIG9uZSB2YWx1ZS5cbiAgcmV0dXJuIGR1bXBQZW5kaW5nT3BzKFxuICAgIHZtLFxuICAgIHNlcmRlLFxuICAgIGAoZnVuY3Rpb24oKXtcbiAgICB2YXIgdG9EaXNwb3NlID0gW107XG4gICAgZ2xvYmFsVGhpcy5fX3BlbmRpbmcuZm9yRWFjaChmdW5jdGlvbihwKXtcbiAgICAgIGlmIChwLnR5cGUgPT09IFwiaG9va1wiICYmIHAuaXNTeXN0ZW0gJiYgIXAuYWJvcnRSZXF1ZXN0ZWQgJiYgIXAuZGlzcG9zZWQpIHtcbiAgICAgICAgcC5kaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIC8vIE9ubHkgZGlzcG9zZSBob29rcyB0aGF0IHdlcmUgZHVyYWJseSBjcmVhdGVkOyBhIGhvb2sgdGhhdCBuZXZlclxuICAgICAgICAvLyByZWFjaGVkIHN0b3JhZ2UgaGFzIG5vdGhpbmcgdG8gY2xlYW4gdXAuXG4gICAgICAgIGlmIChwLmhhc0NyZWF0ZWRFdmVudCkge1xuICAgICAgICAgIHRvRGlzcG9zZS5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwiaG9va19kaXNwb3NlXCIsXG4gICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBwLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgICAgICAvLyBDYXJyaWVkLCBub3QgZHJvcHBlZDogdGhlIGVudHJ5cG9pbnQgc2VuZHMgaXQgb24gaG9va19kaXNwb3NlZCxcbiAgICAgICAgICAgIC8vIGFuZCB0aGUgbm9kZTp2bSBlbmdpbmUgZG9lcyB0aGUgc2FtZSBmb3IgdGhpcyBjYXNlIOKAlCBpdHNcbiAgICAgICAgICAgIC8vIGNvbXBsZXRpb24gZHJhaW4gbWFya3MgdGhlIHN5c3RlbSBob29rIGRpc3Bvc2VkIGFuZCByZXVzZXMgdGhlXG4gICAgICAgICAgICAvLyBxdWV1ZSBpdGVtLCB0b2tlbiBhbmQgYWxsLiBTeW50aGVzaXppbmcgYSBmcmVzaCBvYmplY3QgaGVyZSBpc1xuICAgICAgICAgICAgLy8gd2hhdCBtYWtlcyBpdCBlYXN5IHRvIGxvc2UuXG4gICAgICAgICAgICB0b2tlbjogcC50b2tlbixcbiAgICAgICAgICAgIGhhc0NyZWF0ZWRFdmVudDogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICB0b0Rpc3Bvc2UuZm9yRWFjaChmdW5jdGlvbihkKXsgZ2xvYmFsVGhpcy5fX3BlbmRpbmcucHVzaChkKTsgfSk7XG4gICAgcmV0dXJuIGdsb2JhbFRoaXMuX19wZW5kaW5nLmZpbHRlcihmdW5jdGlvbihwKXtcbiAgICAgIGlmIChwLmFib3J0UmVxdWVzdGVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChwLmhhc0NyZWF0ZWRFdmVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gU2tpcCBzeXN0ZW0gaG9va3MgdGhhdCB3ZXJlIGRpc3Bvc2VkIGJlZm9yZSBldmVyIGJlaW5nIGNyZWF0ZWQuXG4gICAgICBpZiAocC50eXBlID09PSBcImhvb2tcIiAmJiBwLmRpc3Bvc2VkKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfSkoKWAsXG4gICAgZW5zdXJlUGVuZGluZ0J5dGVDYWNoZSh2bSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tXb3JrZmxvd1N0YXRlKFxuICB2bTogUXVpY2tKUyxcbiAgc2VyZGU6IFF1aWNrSlNTZXJkZSxcbiAgb3B0czogeyBrZWVwQWxpdmVPblN1c3BlbmQ/OiBib29sZWFuIH0gPSB7fVxuKTogUXVpY2tKU1J1bnRpbWVSZXN1bHQge1xuICAvLyBDaGVjayBjb21wbGV0ZWQ6IF9fd29ya2Zsb3dSZXN1bHQgaG9sZHMgdGhlIFJBVyByZXR1cm4gdmFsdWUgKHdpdGggYVxuICAvLyBzZXBhcmF0ZSBkb25lIGZsYWcgc28gYHVuZGVmaW5lZGAgcmVzdWx0cyBhcmUgZGlzdGluZ3Vpc2hhYmxlKTsgdGhlXG4gIC8vIGhvc3Qgc2VyaWFsaXplcyBpdCB0aHJvdWdoIGEgaGFuZGxlLlxuICB7XG4gICAgdXNpbmcgZG9uZSA9IHZtLmV2YWxDb2RlKCdnbG9iYWxUaGlzLl9fd29ya2Zsb3dEb25lID09PSB0cnVlJyk7XG4gICAgaWYgKGRvbmUudG9Cb29sZWFuKCkpIHtcbiAgICAgIHVzaW5nIGggPSB2bS5ldmFsQ29kZSgnZ2xvYmFsVGhpcy5fX3dvcmtmbG93UmVzdWx0Jyk7XG4gICAgICBjb25zdCByZXN1bHRCeXRlcyA9IHNlcmRlLnNlcmlhbGl6ZShoKTtcbiAgICAgIGNvbnN0IGRyYWluT3BlcmF0aW9ucyA9IGNvbGxlY3REcmFpbk9wZXJhdGlvbnModm0sIHNlcmRlKTtcbiAgICAgIHZtLmRpc3Bvc2UoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBsZXRlZDoge1xuICAgICAgICAgIHJlc3VsdDogcmVzdWx0Qnl0ZXMsXG4gICAgICAgICAgLi4uKGRyYWluT3BlcmF0aW9ucy5sZW5ndGggPiAwID8geyBkcmFpbk9wZXJhdGlvbnMgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZmFpbGVkXG4gIHtcbiAgICB1c2luZyBoID0gdm0uZXZhbENvZGUoJ2dsb2JhbFRoaXMuX193b3JrZmxvd0Vycm9yJyk7XG4gICAgaWYgKCFoLmlzVW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGUgZGlzcGxheSBmaWVsZHMgYXJlIHBsYWluIHN0cmluZ3M7IHRoZSB0aHJvd24gdmFsdWUgaXRzZWxmIGlzXG4gICAgICAvLyBSQVcgYW5kIHNlcmlhbGl6ZWQgaG9zdC1zaWRlIHRocm91Z2ggYSBoYW5kbGUuXG4gICAgICBjb25zdCBlcnJvck9iaiA9IGguaXNTdHJpbmdcbiAgICAgICAgPyAoaC50b1N0cmluZygpIGFzIHN0cmluZylcbiAgICAgICAgOiAoKCkgPT4ge1xuICAgICAgICAgICAgdXNpbmcgcGxhaW4gPSB2bS5ldmFsQ29kZShcbiAgICAgICAgICAgICAgJyhmdW5jdGlvbihlKXtyZXR1cm4ge21lc3NhZ2U6IGUubWVzc2FnZSwgc3RhY2s6IGUuc3RhY2ssIG5hbWU6IGUubmFtZX07fSkoZ2xvYmFsVGhpcy5fX3dvcmtmbG93RXJyb3IpJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB2bS5kdW1wKHBsYWluKSBhcyB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgICAgICAgc3RhY2s/OiBzdHJpbmc7XG4gICAgICAgICAgICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pKCk7XG4gICAgICBsZXQgdmFsdWVCeXRlczogVWludDhBcnJheSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghaC5pc1N0cmluZykge1xuICAgICAgICB1c2luZyByYXdWYWx1ZSA9IGguZ2V0UHJvcCgndmFsdWUnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZUJ5dGVzID0gc2VyZGUuc2VyaWFsaXplKHJhd1ZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoc2VyaWFsaXplRXJyKSB7XG4gICAgICAgICAgLy8gQSB0aHJvd24gdmFsdWUgdGhlIGNvZGVjIGNhbm5vdCBzZXJpYWxpemUgbXVzdCBub3QgbWFzayB0aGVcbiAgICAgICAgICAvLyB3b3JrZmxvdyBmYWlsdXJlIGl0c2VsZiwgc28gZmFsbCBiYWNrIHRvIHRoZSBkaXNwbGF5IGZpZWxkcy5cbiAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAnUXVpY2tKUyBydW50aW1lOiBmYWlsZWQgdG8gc2VyaWFsaXplIHRocm93biB3b3JrZmxvdyBlcnJvcicsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplRXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgID8gc2VyaWFsaXplRXJyLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgIDogU3RyaW5nKHNlcmlhbGl6ZUVyciksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZmFpbGVkID1cbiAgICAgICAgdHlwZW9mIGVycm9yT2JqID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8geyBtZXNzYWdlOiBlcnJvck9iaiB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yT2JqLm1lc3NhZ2UsXG4gICAgICAgICAgICAgIHN0YWNrOiBlcnJvck9iai5zdGFjayB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIG5hbWU6IGVycm9yT2JqLm5hbWUgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB2YWx1ZUJ5dGVzLFxuICAgICAgICAgICAgfTtcbiAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoJ1F1aWNrSlMgcnVudGltZTogd29ya2Zsb3cgZmFpbGVkIGluIFZNJywge1xuICAgICAgICBlcnJvck1lc3NhZ2U6IGZhaWxlZC5tZXNzYWdlLFxuICAgICAgICBlcnJvck5hbWU6IGZhaWxlZC5uYW1lLFxuICAgICAgICBlcnJvclN0YWNrOiBmYWlsZWQuc3RhY2ssXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRyYWluT3BlcmF0aW9ucyA9IGNvbGxlY3REcmFpbk9wZXJhdGlvbnModm0sIHNlcmRlKTtcbiAgICAgIHZtLmRpc3Bvc2UoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZhaWxlZDoge1xuICAgICAgICAgIC4uLmZhaWxlZCxcbiAgICAgICAgICAuLi4oZHJhaW5PcGVyYXRpb25zLmxlbmd0aCA+IDAgPyB7IGRyYWluT3BlcmF0aW9ucyB9IDoge30pLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBzdXNwZW5kZWQ6IHRoZSB3b3JrZmxvdyBpcyBzdXNwZW5kZWQgaWYgdGhlcmUgYXJlIGFjdGl2ZSByZXNvbHZlcnNcbiAgLy8gT1IgcGVuZGluZyBvcGVyYXRpb25zIHRoYXQgaGF2ZW4ndCBiZWVuIGNyZWF0ZWQgeWV0IChlLmcuIGhvb2tzIGNyZWF0ZWRcbiAgLy8gdXBmcm9udCBidXQgbm90IHlldCBhd2FpdGVkKVxuICB7XG4gICAgdXNpbmcgaCA9IHZtLmV2YWxDb2RlKFxuICAgICAgJ09iamVjdC5rZXlzKGdsb2JhbFRoaXMuX19yZXNvbHZlcnMpLmxlbmd0aCA+IDAgfHwgZ2xvYmFsVGhpcy5fX3BlbmRpbmcuc29tZShmdW5jdGlvbihwKXtyZXR1cm4hcC5oYXNDcmVhdGVkRXZlbnQ7fSknXG4gICAgKTtcbiAgICBpZiAodm0uZHVtcChoKSkge1xuICAgICAgLy8gT3BzIHdpdGggYW4gYWN0aXZlIHJlc29sdmVyIG9yIHdpdGhvdXQgYSBjcmVhdGVkIGV2ZW50IGFyZVxuICAgICAgLy8gcGVuZGluZzsgYWJvcnQtcmVxdWVzdGVkIGhvb2tzIGFyZSBhbHNvIHN1cmZhY2VkIChldmVuIHdoZW5cbiAgICAgIC8vIGFscmVhZHkgY3JlYXRlZCBhbmQgdW5hd2FpdGVkKSBzbyB0aGUgaG9zdCByZWNvcmRzIHRoZSBhYm9ydC5cbiAgICAgIGNvbnN0IHBlbmRpbmdPcHMgPSBkdW1wUGVuZGluZ09wcyhcbiAgICAgICAgdm0sXG4gICAgICAgIHNlcmRlLFxuICAgICAgICBgZ2xvYmFsVGhpcy5fX3BlbmRpbmcuZmlsdGVyKGZ1bmN0aW9uKHApe3JldHVybiEhZ2xvYmFsVGhpcy5fX3Jlc29sdmVyc1twLmNvcnJlbGF0aW9uSWRdIHx8ICFwLmhhc0NyZWF0ZWRFdmVudCB8fCBwLmFib3J0UmVxdWVzdGVkO30pYCxcbiAgICAgICAgZW5zdXJlUGVuZGluZ0J5dGVDYWNoZSh2bSlcbiAgICAgICk7XG4gICAgICBpZiAoIW9wdHMua2VlcEFsaXZlT25TdXNwZW5kKSB2bS5kaXNwb3NlKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1c3BlbmRlZDoge1xuICAgICAgICAgIHBlbmRpbmdPcGVyYXRpb25zOiBwZW5kaW5nT3BzLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICB2bS5kaXNwb3NlKCk7XG4gIHJldHVybiB7IGZhaWxlZDogeyBtZXNzYWdlOiAnV29ya2Zsb3cgZW5kZWQgaW4gdW5rbm93biBzdGF0ZScgfSB9O1xufVxuXG4vLyAtLS0tIEhlbHBlcnMgLS0tLVxuXG5mdW5jdGlvbiBleHRyYWN0RXJyb3IoXG4gIHZtOiBRdWlja0pTLFxuICBlcnI6IHVua25vd24sXG4gIGZhbGxiYWNrTWVzc2FnZTogc3RyaW5nXG4pOiBRdWlja0pTUnVudGltZVJlc3VsdCB7XG4gIGxldCBtZXNzYWdlID0gZmFsbGJhY2tNZXNzYWdlO1xuICBsZXQgc3RhY2s6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoZXJyIGluc3RhbmNlb2YgSlNFeGNlcHRpb24pIHtcbiAgICBjb25zdCBlcnJvciA9IHZtLmR1bXAoZXJyLmhhbmRsZSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsO1xuICAgIGVyci5oYW5kbGUuZGlzcG9zZSgpO1xuICAgIG1lc3NhZ2UgPSAoZXJyb3I/Lm1lc3NhZ2UgYXMgc3RyaW5nKSA/PyBlcnIubWVzc2FnZSA/PyBmYWxsYmFja01lc3NhZ2U7XG4gICAgc3RhY2sgPSAoZXJyb3I/LnN0YWNrIGFzIHN0cmluZykgPz8gZXJyLnN0YWNrO1xuICAgIG5hbWUgPSAoZXJyb3I/Lm5hbWUgYXMgc3RyaW5nKSA/PyBlcnIubmFtZTtcbiAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIG1lc3NhZ2UgPSBlcnIubWVzc2FnZSA/PyBmYWxsYmFja01lc3NhZ2U7XG4gICAgc3RhY2sgPSBlcnIuc3RhY2s7XG4gICAgbmFtZSA9IGVyci5uYW1lO1xuICB9XG5cbiAgdm0uZGlzcG9zZSgpO1xuICByZXR1cm4ge1xuICAgIGZhaWxlZDogeyBtZXNzYWdlLCBzdGFjaywgbmFtZSB9LFxuICB9O1xufVxuXG4vKipcbiAqIE11dGFibGUgaW50ZXJydXB0IGJ1ZGdldCBmb3IgYSBWTS4gUXVpY2tKUyBwb2xscyB0aGUgaW50ZXJydXB0IGhhbmRsZXJcbiAqIGR1cmluZyBKUyBleGVjdXRpb247IHdoZW4gaXQgcmV0dXJucyB0cnVlLCBleGVjdXRpb24gYWJvcnRzLiBUaGUgYnVkZ2V0XG4gKiBib3VuZHMgYSBzaW5nbGUgaG9zdC0+Vk0gZXhlY3V0aW9uIGJ1cnN0IChidW5kbGUgZXZhbCArIGV2ZW50XG4gKiBwcm9jZXNzaW5nKSwgbm90IHRvdGFsIFZNIGxpZmV0aW1lOiB0aGUgaW5saW5lLXN0ZXAgbG9vcCBrZWVwcyBhIFZNXG4gKiBhbGl2ZSBhY3Jvc3Mgc3RlcCBleGVjdXRpb25zIHRoYXQgY2FuIGxlZ2l0aW1hdGVseSB0YWtlIG1pbnV0ZXMsIHNvIHRoZVxuICogaG9zdCByZXNldHMgdGhlIGJ1ZGdldCBiZWZvcmUgZWFjaCByZS1lbnRyeSAoc2VlIHJlc2V0QnVkZ2V0IGNhbGxzKS5cbiAqXG4gKiBUaGUgcGVyLWJ1cnN0IGNlaWxpbmcgaXMgdGhlIHNhbWUgY29uZmlndXJhYmxlIGJ1ZGdldCBhcyB0aGUgbm9kZVxuICogZW5naW5lJ3MgUmVwbGF5QnVkZ2V0IChSRVBMQVlfVElNRU9VVF9NUywgZGVmYXVsdCAyNDBzKTogYSB3b3JrZmxvd1xuICogd2hvc2UgcmVwbGF5IHRoZSBub2RlIGVuZ2luZSBoYW5kbGVzIGZpbmUgbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgaGVyZVxuICogYnkgYSBsb3dlciBoYXJkY29kZWQgY2VpbGluZy4gVGhlIGludGVycnVwdCBlcnJvciBlc2NhcGVzXG4gKiBydW5RdWlja0pTV29ya2Zsb3cgYW5kIHJlYWNoZXMgdGhlIHJlcGxheSBsb29wJ3MgY2F0Y2ggaW4gcnVudGltZS50cyxcbiAqIHdoaWNoIHJlY29yZHMgcnVuX2ZhaWxlZC5cbiAqL1xuaW50ZXJmYWNlIEludGVycnVwdEJ1ZGdldCB7XG4gIHN0YXJ0OiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUludGVycnVwdEhhbmRsZXIoYnVkZ2V0OiBJbnRlcnJ1cHRCdWRnZXQpOiAoKSA9PiBib29sZWFuIHtcbiAgY29uc3QgdGltZW91dCA9IGdldFJlcGxheVRpbWVvdXRNcygpO1xuICByZXR1cm4gKCkgPT4gRGF0ZS5ub3coKSAtIGJ1ZGdldC5zdGFydCA+IHRpbWVvdXQ7XG59XG4iXX0=