obsidian-integration-testing 13.0.0 → 14.0.0

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 (102) hide show
  1. package/dist/lib/cjs/app-config.cjs +1 -1
  2. package/dist/lib/cjs/app-config.d.cts +25 -25
  3. package/dist/lib/cjs/connect-to-cdp.cjs +1 -1
  4. package/dist/lib/cjs/connect-to-cdp.d.cts +4 -4
  5. package/dist/lib/cjs/demo-vault-bootstrap.cjs +1 -1
  6. package/dist/lib/cjs/demo-vault-bootstrap.d.cts +10 -2
  7. package/dist/lib/cjs/device-settings.cjs +1 -1
  8. package/dist/lib/cjs/device-settings.d.cts +1 -1
  9. package/dist/lib/cjs/emulator-reaper.cjs +1 -1
  10. package/dist/lib/cjs/emulator-reaper.d.cts +2 -2
  11. package/dist/lib/cjs/enable-plugin.cjs +1 -1
  12. package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
  13. package/dist/lib/cjs/eval-in-obsidian.d.cts +12 -12
  14. package/dist/lib/cjs/generate-function-call.cjs +1 -1
  15. package/dist/lib/cjs/generate-function-call.d.cts +2 -2
  16. package/dist/lib/cjs/index.cjs +1 -1
  17. package/dist/lib/cjs/index.d.cts +4 -4
  18. package/dist/lib/cjs/jest/global-setup.cjs +1 -1
  19. package/dist/lib/cjs/jest/global-setup.d.cts +3 -3
  20. package/dist/lib/cjs/leftover-cleanup.cjs +1 -1
  21. package/dist/lib/cjs/leftover-cleanup.d.cts +2 -2
  22. package/dist/lib/cjs/library.cjs +1 -1
  23. package/dist/lib/cjs/namespace-bootstrap.cjs +1 -1
  24. package/dist/lib/cjs/obsidian-instance.cjs +1 -1
  25. package/dist/lib/cjs/obsidian-instance.d.cts +3 -3
  26. package/dist/lib/cjs/open-obsidian-settings-tab.cjs +3 -3
  27. package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +4 -4
  28. package/dist/lib/cjs/parent-liveness.cjs +1 -1
  29. package/dist/lib/cjs/parent-liveness.d.cts +1 -1
  30. package/dist/lib/cjs/poll-in-obsidian.cjs +1 -1
  31. package/dist/lib/cjs/poll-in-obsidian.d.cts +3 -3
  32. package/dist/lib/cjs/poll-until.cjs +1 -1
  33. package/dist/lib/cjs/poll-until.d.cts +4 -4
  34. package/dist/lib/cjs/process-capture.cjs +1 -1
  35. package/dist/lib/cjs/process-capture.d.cts +3 -3
  36. package/dist/lib/cjs/run-version-matrix.cjs +1 -1
  37. package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
  38. package/dist/lib/cjs/setup-lock.cjs +1 -1
  39. package/dist/lib/cjs/setup-lock.d.cts +1 -1
  40. package/dist/lib/cjs/sharp-loader.cjs +1 -1
  41. package/dist/lib/cjs/sharp-loader.d.cts +6 -6
  42. package/dist/lib/cjs/temporary-vault.cjs +2 -3
  43. package/dist/lib/cjs/temporary-vault.d.cts +4 -4
  44. package/dist/lib/cjs/transport-appium.cjs +1 -1
  45. package/dist/lib/cjs/transport-factory.cjs +1 -1
  46. package/dist/lib/cjs/transport.cjs +1 -1
  47. package/dist/lib/cjs/transport.d.cts +10 -10
  48. package/dist/lib/cjs/version-matrix.cjs +1 -1
  49. package/dist/lib/cjs/version-matrix.d.cts +2 -2
  50. package/dist/lib/cjs/vitest/global-setup.cjs +1 -1
  51. package/dist/lib/cjs/vitest/global-setup.d.cts +3 -3
  52. package/dist/lib/esm/app-config.d.mts +25 -25
  53. package/dist/lib/esm/app-config.mjs +1 -1
  54. package/dist/lib/esm/connect-to-cdp.d.mts +4 -4
  55. package/dist/lib/esm/connect-to-cdp.mjs +1 -1
  56. package/dist/lib/esm/demo-vault-bootstrap.d.mts +10 -2
  57. package/dist/lib/esm/demo-vault-bootstrap.mjs +1 -1
  58. package/dist/lib/esm/device-settings.d.mts +1 -1
  59. package/dist/lib/esm/device-settings.mjs +1 -1
  60. package/dist/lib/esm/emulator-reaper.d.mts +2 -2
  61. package/dist/lib/esm/emulator-reaper.mjs +1 -1
  62. package/dist/lib/esm/enable-plugin.mjs +1 -1
  63. package/dist/lib/esm/eval-in-obsidian.d.mts +12 -12
  64. package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
  65. package/dist/lib/esm/generate-function-call.d.mts +2 -2
  66. package/dist/lib/esm/generate-function-call.mjs +1 -1
  67. package/dist/lib/esm/index.d.mts +4 -4
  68. package/dist/lib/esm/index.mjs +1 -1
  69. package/dist/lib/esm/jest/global-setup.d.mts +3 -3
  70. package/dist/lib/esm/jest/global-setup.mjs +1 -1
  71. package/dist/lib/esm/leftover-cleanup.d.mts +2 -2
  72. package/dist/lib/esm/leftover-cleanup.mjs +1 -1
  73. package/dist/lib/esm/library.mjs +1 -1
  74. package/dist/lib/esm/namespace-bootstrap.mjs +1 -1
  75. package/dist/lib/esm/obsidian-instance.d.mts +3 -3
  76. package/dist/lib/esm/obsidian-instance.mjs +1 -1
  77. package/dist/lib/esm/open-obsidian-settings-tab.d.mts +4 -4
  78. package/dist/lib/esm/open-obsidian-settings-tab.mjs +3 -3
  79. package/dist/lib/esm/parent-liveness.d.mts +1 -1
  80. package/dist/lib/esm/parent-liveness.mjs +1 -1
  81. package/dist/lib/esm/poll-in-obsidian.d.mts +3 -3
  82. package/dist/lib/esm/poll-in-obsidian.mjs +1 -1
  83. package/dist/lib/esm/poll-until.d.mts +4 -4
  84. package/dist/lib/esm/poll-until.mjs +1 -1
  85. package/dist/lib/esm/process-capture.d.mts +3 -3
  86. package/dist/lib/esm/process-capture.mjs +1 -1
  87. package/dist/lib/esm/run-version-matrix.d.mts +1 -1
  88. package/dist/lib/esm/run-version-matrix.mjs +1 -1
  89. package/dist/lib/esm/setup-lock.d.mts +1 -1
  90. package/dist/lib/esm/setup-lock.mjs +1 -1
  91. package/dist/lib/esm/sharp-loader.d.mts +6 -6
  92. package/dist/lib/esm/sharp-loader.mjs +1 -1
  93. package/dist/lib/esm/temporary-vault.d.mts +4 -4
  94. package/dist/lib/esm/temporary-vault.mjs +2 -3
  95. package/dist/lib/esm/transport-appium.mjs +1 -1
  96. package/dist/lib/esm/transport-factory.mjs +1 -1
  97. package/dist/lib/esm/transport.d.mts +10 -10
  98. package/dist/lib/esm/version-matrix.d.mts +2 -2
  99. package/dist/lib/esm/version-matrix.mjs +1 -1
  100. package/dist/lib/esm/vitest/global-setup.d.mts +3 -3
  101. package/dist/lib/esm/vitest/global-setup.mjs +1 -1
  102. package/package.json +1 -1
@@ -47,7 +47,6 @@ class TemporaryVault {
47
47
  * @param path - An explicit vault path. If omitted, a temp directory is created.
48
48
  * @param options - Vault options.
49
49
  */
50
- // eslint-disable-next-line obsidian-dev-utils/params-options-name-match -- Temporary: `TemporaryVaultOptions` is re-exported from `index.ts`, so renaming it to `TemporaryVaultConstructorOptions` is a breaking change held for the next major.
51
50
  constructor(path, options) {
52
51
  this.path = path ?? (0, import_node_fs.mkdtempSync)((0, import_node_path.join)((0, import_node_os.tmpdir)(), import_leftover_cleanup.TEMP_VAULT_DIR_PREFIX));
53
52
  this.#shouldRemoveDirectoryOnDispose = options?.shouldRemoveDirectoryOnDispose ?? path === void 0;
@@ -56,7 +55,7 @@ class TemporaryVault {
56
55
  * Unregisters the vault from Obsidian and, when this handle owns the directory, deletes it.
57
56
  *
58
57
  * The directory is removed only when this instance created it, or when
59
- * {@link TemporaryVaultOptions.shouldRemoveDirectoryOnDispose} said so explicitly. That is what
58
+ * {@link TemporaryVaultConstructorOptions.shouldRemoveDirectoryOnDispose} said so explicitly. That is what
60
59
  * makes a handle over a directory somebody else owns — the run's shared setup vault, say, which
61
60
  * `getTemporaryVault()` wraps — safe to dispose from a consumer's `afterAll`.
62
61
  *
@@ -200,4 +199,4 @@ async function retryRm(path) {
200
199
  0 && (module.exports = {
201
200
  TemporaryVault
202
201
  });
203
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RlbXBvcmFyeS12YXVsdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1hbmFnZXMgdGVtcG9yYXJ5IHZhdWx0IGxpZmVjeWNsZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBta2R0ZW1wU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIHJlYWRkaXIsXG4gIHJlYWRGaWxlLFxuICBybVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LmNqcyc7XG5cbmltcG9ydCB7IGdldFRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIuY2pzJztcbmltcG9ydCB7IFRFTVBfVkFVTFRfRElSX1BSRUZJWCB9IGZyb20gJy4vbGVmdG92ZXItY2xlYW51cC5janMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7IGdldE9yQ3JlYXRlVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5janMnO1xuaW1wb3J0IHtcbiAgcmVnaXN0ZXJWYXVsdCxcbiAgdW5yZWdpc3RlclZhdWx0XG59IGZyb20gJy4vdmF1bHQtcmVnaXN0cnkuY2pzJztcblxuLyoqXG4gKiBDb250ZW50IHZhbHVlIGZvciBhIHNpbmdsZSBlbnRyeSBpbiBhIHtAbGluayBQb3B1bGF0ZUZpbGVzfSBtYXAuXG4gKlxuICogLSBgc3RyaW5nYCBcdTIwMTQgdGV4dCBmaWxlICh3cml0dGVuIGFzIFVURi04KS5cbiAqIC0gYFVpbnQ4QXJyYXlgIFx1MjAxNCBiaW5hcnkgZmlsZSAod3JpdHRlbiBhcyByYXcgYnl0ZXM7IGBCdWZmZXJgIGlzIGFjY2VwdGVkXG4gKiAgIGJlY2F1c2UgYEJ1ZmZlciBleHRlbmRzIFVpbnQ4QXJyYXlgKS5cbiAqIC0gYHVuZGVmaW5lZGAgXHUyMDE0IGVtcHR5IGZvbGRlciAodGhlIGtleSAqKm11c3QqKiBlbmQgd2l0aCBgL2ApLlxuICovXG5leHBvcnQgdHlwZSBQb3B1bGF0ZUZpbGVDb250ZW50ID0gc3RyaW5nIHwgVWludDhBcnJheSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIG1hcCBvZiB2YXVsdC1yZWxhdGl2ZSBwYXRocyB0byB0aGVpciBjb250ZW50LCB1c2VkIGJ5XG4gKiB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQucG9wdWxhdGV9LlxuICpcbiAqIFBhdGhzIGVuZGluZyB3aXRoIGAvYCBkZW5vdGUgZm9sZGVycyBhbmQgKiptdXN0KiogaGF2ZSBhbiBgdW5kZWZpbmVkYCB2YWx1ZS5cbiAqIEFsbCBvdGhlciBwYXRocyBhcmUgd3JpdHRlbiBhcyBmaWxlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUG9wdWxhdGVGaWxlc1BhcmFtcyA9IFJlY29yZDxzdHJpbmcsIFBvcHVsYXRlRmlsZUNvbnRlbnQ+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgVGVtcG9yYXJ5VmF1bHR9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBvcmFyeVZhdWx0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHtAbGluayBUZW1wb3JhcnlWYXVsdC5kaXNwb3NlfSByZW1vdmVzIHRoZSB2YXVsdCAqKmRpcmVjdG9yeSoqLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGRlZmF1bHRzIHRvIHdoZXRoZXIgdGhpcyBpbnN0YW5jZSBjcmVhdGVkIHRoYXQgZGlyZWN0b3J5IFx1MjAxNCBgdHJ1ZWAgZm9yIGEgdGVtcFxuICAgKiBkaXJlY3RvcnkgdGhlIGNvbnN0cnVjdG9yIG1hZGUgKG5vIGBwYXRoYCBhcmd1bWVudCksIGBmYWxzZWAgZm9yIGEgZGlyZWN0b3J5IGhhbmRlZCB0byBpdCBhcyBhblxuICAgKiBleHBsaWNpdCBgcGF0aGAuIEEgaGFuZGxlIG92ZXIgc29tZWJvZHkgZWxzZSdzIGRpcmVjdG9yeSB1bnJlZ2lzdGVycyB0aGUgdmF1bHQgYnV0IGxlYXZlcyB0aGVcbiAgICogZmlsZXMgYWxvbmUsIHNvIHdyYXBwaW5nIGEgZGlyZWN0b3J5IGNhbm5vdCBkZXN0cm95IGl0LiBTZXQgZXhwbGljaXRseSB0byBvdmVycmlkZS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZT86IGJvb2xlYW47XG59XG5cbmNvbnN0IFJNX1JFVFJZX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IFJNX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTBfMDAwO1xuXG4vKipcbiAqIEEgdGVtcG9yYXJ5IE9ic2lkaWFuIHZhdWx0IGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBDcmVhdGVzIGEgdGVtcCBkaXJlY3RvcnkgYW5kIHJlZ2lzdGVycyBpdCBpbiB0aGUgcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZVxuICogc28gdGhhdCB0aGUgT2JzaWRpYW4gQ0xJIGNhbiB0YXJnZXQgaXQgdmlhIGBjd2RgLlxuICpcbiAqIEEgaGFuZGxlICoqb3ducyoqIHRoZSBkaXJlY3Rvcnkgb25seSB3aGVuIGl0IGNyZWF0ZWQgaXQuIHtAbGluayBUZW1wb3JhcnlWYXVsdC5kaXNwb3NlfSBkZWxldGVzIGFuXG4gKiBvd25lZCBkaXJlY3RvcnkgYW5kIGxlYXZlcyBhIGJvcnJvd2VkIG9uZSBpbiBwbGFjZSBcdTIwMTQgc2VlXG4gKiB7QGxpbmsgVGVtcG9yYXJ5VmF1bHRPcHRpb25zLnNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZX0sIHdoaWNoIG92ZXJyaWRlcyB0aGF0IGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wb3JhcnlWYXVsdCB7XG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdGVtcG9yYXJ5IHZhdWx0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQuZGlzcG9zZX0gcmVtb3ZlcyB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQucGF0aH0gZnJvbSBkaXNrLlxuICAgKi9cbiAgcmVhZG9ubHkgI3Nob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyB0ZW1wIHZhdWx0LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIEFuIGV4cGxpY2l0IHZhdWx0IHBhdGguIElmIG9taXR0ZWQsIGEgdGVtcCBkaXJlY3RvcnkgaXMgY3JlYXRlZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBWYXVsdCBvcHRpb25zLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi11dGlscy9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIFRlbXBvcmFyeTogYFRlbXBvcmFyeVZhdWx0T3B0aW9uc2AgaXMgcmUtZXhwb3J0ZWQgZnJvbSBgaW5kZXgudHNgLCBzbyByZW5hbWluZyBpdCB0byBgVGVtcG9yYXJ5VmF1bHRDb25zdHJ1Y3Rvck9wdGlvbnNgIGlzIGEgYnJlYWtpbmcgY2hhbmdlIGhlbGQgZm9yIHRoZSBuZXh0IG1ham9yLlxuICBwdWJsaWMgY29uc3RydWN0b3IocGF0aD86IHN0cmluZywgb3B0aW9ucz86IFRlbXBvcmFyeVZhdWx0T3B0aW9ucykge1xuICAgIHRoaXMucGF0aCA9IHBhdGggPz8gbWtkdGVtcFN5bmMoam9pbih0bXBkaXIoKSwgVEVNUF9WQVVMVF9ESVJfUFJFRklYKSk7XG4gICAgdGhpcy4jc2hvdWxkUmVtb3ZlRGlyZWN0b3J5T25EaXNwb3NlID0gb3B0aW9ucz8uc2hvdWxkUmVtb3ZlRGlyZWN0b3J5T25EaXNwb3NlID8/IHBhdGggPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyB0aGUgdmF1bHQgZnJvbSBPYnNpZGlhbiBhbmQsIHdoZW4gdGhpcyBoYW5kbGUgb3ducyB0aGUgZGlyZWN0b3J5LCBkZWxldGVzIGl0LlxuICAgKlxuICAgKiBUaGUgZGlyZWN0b3J5IGlzIHJlbW92ZWQgb25seSB3aGVuIHRoaXMgaW5zdGFuY2UgY3JlYXRlZCBpdCwgb3Igd2hlblxuICAgKiB7QGxpbmsgVGVtcG9yYXJ5VmF1bHRPcHRpb25zLnNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZX0gc2FpZCBzbyBleHBsaWNpdGx5LiBUaGF0IGlzIHdoYXRcbiAgICogbWFrZXMgYSBoYW5kbGUgb3ZlciBhIGRpcmVjdG9yeSBzb21lYm9keSBlbHNlIG93bnMgXHUyMDE0IHRoZSBydW4ncyBzaGFyZWQgc2V0dXAgdmF1bHQsIHNheSwgd2hpY2hcbiAgICogYGdldFRlbXBvcmFyeVZhdWx0KClgIHdyYXBzIFx1MjAxNCBzYWZlIHRvIGRpc3Bvc2UgZnJvbSBhIGNvbnN1bWVyJ3MgYGFmdGVyQWxsYC5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zcG9ydE92ZXJyaWRlIC0gQW4gZXhwbGljaXQgdHJhbnNwb3J0IHRvIHVzZSB3aGVuIHVucmVnaXN0ZXJpbmcuXG4gICAqICAgV2hlbiBvbWl0dGVkLCBmYWxscyBiYWNrIHRvIHRoZSB0cmFuc3BvcnQgY29uZmlndXJlZCB2aWEgdGhlIGNvbnRleHQgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzcG9zZSh0cmFuc3BvcnRPdmVycmlkZT86IE9ic2lkaWFuVHJhbnNwb3J0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHVucmVnaXN0ZXJWYXVsdCh0aGlzLnBhdGgsIHRyYW5zcG9ydE92ZXJyaWRlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuI3Nob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZSkge1xuICAgICAgICBhd2FpdCByZXRyeVJtKHRoaXMucGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coYFt0ZW1wb3JhcnktdmF1bHRdIFVucmVnaXN0ZXJlZCBidXQga2VwdCB0aGUgdmF1bHQgZGlyZWN0b3J5LCB3aGljaCB0aGlzIGhhbmRsZSBkb2VzIG5vdCBvd246ICR7dGhpcy5wYXRofWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgZmlsZXMgYW5kIGZvbGRlcnMgaW50byB0aGUgdmF1bHQgZGlyZWN0b3J5ICoqb24gdGhlIGhvc3QqKi5cbiAgICogUGFyZW50IGRpcmVjdG9yaWVzIGFyZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIC0gYHN0cmluZ2AgdmFsdWVzIGFyZSB3cml0dGVuIGFzIFVURi04IHRleHQgZmlsZXMuXG4gICAqIC0gYFVpbnQ4QXJyYXlgIHZhbHVlcyAoaW5jbHVkaW5nIGBCdWZmZXJgKSBhcmUgd3JpdHRlbiBhcyBiaW5hcnkgZmlsZXMuXG4gICAqIC0gUGF0aHMgZW5kaW5nIHdpdGggYC9gIGFyZSB0cmVhdGVkIGFzIGVtcHR5IGZvbGRlcnMgKHZhbHVlIG11c3QgYmUgYHVuZGVmaW5lZGApLlxuICAgKlxuICAgKiBUaGUgd3JpdGUgaXMgYWx3YXlzIGhvc3QtbG9jYWwgXHUyMDE0IHtAbGluayBUZW1wb3JhcnlWYXVsdC5wYXRofSBpcyBhIGhvc3QgcGF0aCwgYW5kIG9uIGEgbW9iaWxlXG4gICAqIHRyYW5zcG9ydCB0aGUgdmF1bHQgdGhlIGFwcCBvcGVucyBsaXZlcyBvbiB0aGUgZGV2aWNlIGluc3RlYWQuIHtAbGluayBUZW1wb3JhcnlWYXVsdC5yZWdpc3Rlcn1cbiAgICogY2FycmllcyB0aGUgZGlyZWN0b3J5IGFjcm9zcyBiZWZvcmUgaXQgcmVnaXN0ZXJzLCBzbyBwb3B1bGF0ZS10aGVuLXJlZ2lzdGVyIGlzIGFsbCBhIGNhbGxlclxuICAgKiBuZWVkczsge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnN5bmNUb0RldmljZX0gaXMgdGhlIHNlYW0gdGhhdCBkb2VzIHRoZSBjYXJyeWluZy5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVzIC0gTWFwIG9mIGZpbGUvZm9sZGVyIHBhdGhzIHRvIGNvbnRlbnQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW4tZGV2LXV0aWxzL3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2ggLS0gUGVybWFuZW50OiBgUG9wdWxhdGVGaWxlc1BhcmFtc2AgaXMgb25lIGJhZyBzaGFyZWQgYnkgdGhpcyBtZXRob2QgYW5kIHRoZSBjb25maWctZGlyZWN0b3J5IHJlbWFwIGluIGBnbG9iYWwtc2V0dXAtY29yZS50c2AsIHNvIG5vIHBlci1vd25lciBuYW1lIGNhbiBzYXRpc2Z5IGJvdGguXG4gIHB1YmxpYyBwb3B1bGF0ZShmaWxlczogUG9wdWxhdGVGaWxlc1BhcmFtcyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhmaWxlcykpIHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbih0aGlzLnBhdGgsIGZpbGVQYXRoKTtcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvbGRlciBwYXRoIFwiJHtmaWxlUGF0aH1cIiBtdXN0IGhhdmUgdW5kZWZpbmVkIGNvbnRlbnRgKTtcbiAgICAgICAgfVxuICAgICAgICBta2RpclN5bmMoZnVsbFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBwYXRoIFwiJHtmaWxlUGF0aH1cIiBtdXN0IGhhdmUgZGVmaW5lZCBjb250ZW50OyB1c2UgYSB0cmFpbGluZyBcIi9cIiBmb3IgZm9sZGVyc2ApO1xuICAgICAgICB9XG4gICAgICAgIG1rZGlyU3luYyhkaXJuYW1lKGZ1bGxQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIHdyaXRlRmlsZVN5bmMoZnVsbFBhdGgsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhpcyB2YXVsdCBpbiB0aGUgcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZSBzbyB0aGUgQ0xJIGNhbiB0YXJnZXQgaXQuXG4gICAqXG4gICAqIFB1c2hlcyB0aGUgdmF1bHQgZGlyZWN0b3J5IHRvIHRoZSB0YXJnZXQgZGV2aWNlIGZpcnN0LCB2aWFcbiAgICoge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnN5bmNUb0RldmljZX0gXHUyMDE0IGEgbm8tb3Agb24gYSB0cmFuc3BvcnQgd2hvc2UgYXBwIGFscmVhZHkgcmVhZHMgdGhlIGhvc3RcbiAgICogZmlsZXN5c3RlbS4gVGhhdCBvcmRlcmluZyB1c2VkIHRvIGJlIHRoZSBjYWxsZXIncyB0byByZW1lbWJlciwgYW5kIGEgY2FsbGVyIHdobyBmb3Jnb3QgZ290IGFcbiAgICogc2lsZW50bHkgKiplbXB0eSoqIHZhdWx0IHJhdGhlciB0aGFuIGFuIGVycm9yOiBldmVyeSBwcmUtcmVnaXN0cmF0aW9uXG4gICAqIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZX0gd3JpdGUgc3RheWVkIG9uIHRoZSBob3N0IHdoaWxlIHRoZSBhcHAgb3BlbmVkIHRoZSBkZXZpY2UncyBjb3B5LlxuICAgKiBGb2xkaW5nIGl0IGluIGhlcmUgbWFrZXMgcG9wdWxhdGUtdGhlbi1yZWdpc3RlciBjb3JyZWN0IG9uIGV2ZXJ5IHRyYW5zcG9ydC5cbiAgICpcbiAgICogVGhlIHRyYW5zcG9ydCBpcyByZXNvbHZlZCBvbmNlIGFuZCBoYW5kZWQgdG8gYm90aCBzdGVwcywgc28gYSBwdXNoIGFuZCB0aGUgcmVnaXN0cmF0aW9uIHRoYXRcbiAgICogZm9sbG93cyBpdCBjYW4gbmV2ZXIgbGFuZCBvbiB0d28gZGlmZmVyZW50IHRyYW5zcG9ydHMuXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc3BvcnRPdmVycmlkZSAtIEFuIGV4cGxpY2l0IHRyYW5zcG9ydCB0byB1c2UuIFdoZW4gb21pdHRlZCxcbiAgICogICBmYWxscyBiYWNrIHRvIHRoZSB0cmFuc3BvcnQgY29uZmlndXJlZCB2aWEgdGhlIGNvbnRleHQgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIodHJhbnNwb3J0T3ZlcnJpZGU/OiBPYnNpZGlhblRyYW5zcG9ydCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRyYW5zcG9ydCA9IHRyYW5zcG9ydE92ZXJyaWRlID8/IGF3YWl0IGdldE9yQ3JlYXRlVHJhbnNwb3J0KGdldFRyYW5zcG9ydE9wdGlvbnMoKSk7XG4gICAgYXdhaXQgdGhpcy5zeW5jVG9EZXZpY2UodHJhbnNwb3J0KTtcbiAgICBhd2FpdCByZWdpc3RlclZhdWx0KHRoaXMucGF0aCwgdHJhbnNwb3J0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luYyBkaXNwb3NhYmxlIHN1cHBvcnQgZm9yIGBhd2FpdCB1c2luZ2AuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHZhdWx0IGlzIGRpc3Bvc2VkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kaXNwb3NlKCk7XG4gIH1cblxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIHRoYXQgcmVxdWlyZXMgYSBydW5uaW5nIHRyYW5zcG9ydC4gKi9cblxuICAvKipcbiAgICogUHVzaGVzIGFsbCBmaWxlcyBmcm9tIHRoZSBsb2NhbCBzdGFnaW5nIGRpcmVjdG9yeSB0byB0aGUgdGFyZ2V0IGRldmljZVxuICAgKiB2aWEgdGhlIGFjdGl2ZSB0cmFuc3BvcnQncyBgcHVzaEZpbGVzKClgLlxuICAgKlxuICAgKiBPbiBkZXNrdG9wIHRyYW5zcG9ydHMgdGhpcyBpcyBhIG5vLW9wIChmaWxlcyBhcmUgYWxyZWFkeSBsb2NhbCkuXG4gICAqIE9uIG1vYmlsZSB0cmFuc3BvcnRzIChBcHBpdW0pIHRoaXMgcHVzaGVzIGZpbGVzIHRvIHRoZSBkZXZpY2UuXG4gICAqXG4gICAqIHtAbGluayBUZW1wb3JhcnlWYXVsdC5yZWdpc3Rlcn0gY2FsbHMgdGhpcyBpdHNlbGYsIHNvIGEgcG9wdWxhdGUtdGhlbi1yZWdpc3RlciBzZXF1ZW5jZSBuZWVkc1xuICAgKiBub3RoaW5nIGV4dHJhLiBDYWxsIGl0IGRpcmVjdGx5IG9ubHkgdG8gY2FycnkgYWNyb3NzIGZpbGVzIHdyaXR0ZW4gKiphZnRlcioqIHJlZ2lzdHJhdGlvbjogdGhlXG4gICAqIGhvc3QgZGlyZWN0b3J5IGlzIG5vdCBtaXJyb3JlZCwgc28gYSBsYXRlciB3cml0ZSBpbnRvIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wYXRofSBzdGF5cyBvbiB0aGVcbiAgICogaG9zdCB1bnRpbCB0aGlzIHJ1bnMgYWdhaW4uXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc3BvcnRPdmVycmlkZSAtIEFuIGV4cGxpY2l0IHRyYW5zcG9ydCB0byB1c2UuIFdoZW4gb21pdHRlZCxcbiAgICogICBmYWxscyBiYWNrIHRvIHRoZSB0cmFuc3BvcnQgY29uZmlndXJlZCB2aWEgdGhlIGNvbnRleHQgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3luY1RvRGV2aWNlKHRyYW5zcG9ydE92ZXJyaWRlPzogT2JzaWRpYW5UcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0cmFuc3BvcnQgPSB0cmFuc3BvcnRPdmVycmlkZSA/PyBhd2FpdCBnZXRPckNyZWF0ZVRyYW5zcG9ydChnZXRUcmFuc3BvcnRPcHRpb25zKCkpO1xuICAgIGlmICghdHJhbnNwb3J0LnB1c2hGaWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5jb2xsZWN0RmlsZXModGhpcy5wYXRoKTtcbiAgICBhd2FpdCB0cmFuc3BvcnQucHVzaEZpbGVzKHRoaXMucGF0aCwgZmlsZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZWx5IHJlYWRzIGFsbCBmaWxlcyBmcm9tIGEgZGlyZWN0b3J5IGludG8gYSBmbGF0IG1hcC5cbiAgICpcbiAgICogQHBhcmFtIGRpcmVjdG9yeSAtIFRoZSBkaXJlY3RvcnkgdG8gcmVhZC5cbiAgICogQHJldHVybnMgQSBtYXAgb2YgcmVsYXRpdmUgZmlsZSBwYXRocyB0byBjb250ZW50IGJ1ZmZlcnMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbGxlY3RGaWxlcyhkaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgVWludDhBcnJheT4+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+ID0ge307XG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbihkaXJlY3RvcnksIGVudHJ5Lm5hbWUpO1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUodGhpcy5wYXRoLCBmdWxsUGF0aCk7XG5cbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCBhd2FpdCB0aGlzLmNvbGxlY3RGaWxlcyhmdWxsUGF0aCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3JlbGF0aXZlUGF0aF0gPSBhd2FpdCByZWFkRmlsZShmdWxsUGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xufVxuXG4vKipcbiAqIFJldHJpZXMgYHJtYCB1bnRpbCBpdCBzdWNjZWVkcyBvciB0aW1lcyBvdXQuXG4gKiBPYnNpZGlhbiBtYXkgaG9sZCBmaWxlIGxvY2tzIGJyaWVmbHkgYWZ0ZXIgYSB3aW5kb3cgaXMgZGVzdHJveWVkLlxuICpcbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkaXJlY3RvcnkgaXMgcmVtb3ZlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmV0cnlSbShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgUk1fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBSTV9SRVRSWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8vIEZpbmFsIGF0dGVtcHQgXHUyMDE0IGxldCBpdCB0aHJvdy5cbiAgYXdhaXQgcm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7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
202
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RlbXBvcmFyeS12YXVsdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1hbmFnZXMgdGVtcG9yYXJ5IHZhdWx0IGxpZmVjeWNsZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBta2R0ZW1wU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIHJlYWRkaXIsXG4gIHJlYWRGaWxlLFxuICBybVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LmNqcyc7XG5cbmltcG9ydCB7IGdldFRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIuY2pzJztcbmltcG9ydCB7IFRFTVBfVkFVTFRfRElSX1BSRUZJWCB9IGZyb20gJy4vbGVmdG92ZXItY2xlYW51cC5janMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7IGdldE9yQ3JlYXRlVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5janMnO1xuaW1wb3J0IHtcbiAgcmVnaXN0ZXJWYXVsdCxcbiAgdW5yZWdpc3RlclZhdWx0XG59IGZyb20gJy4vdmF1bHQtcmVnaXN0cnkuY2pzJztcblxuLyoqXG4gKiBDb250ZW50IHZhbHVlIGZvciBhIHNpbmdsZSBlbnRyeSBpbiBhIHtAbGluayBQb3B1bGF0ZUZpbGVzfSBtYXAuXG4gKlxuICogLSBgc3RyaW5nYCBcdTIwMTQgdGV4dCBmaWxlICh3cml0dGVuIGFzIFVURi04KS5cbiAqIC0gYFVpbnQ4QXJyYXlgIFx1MjAxNCBiaW5hcnkgZmlsZSAod3JpdHRlbiBhcyByYXcgYnl0ZXM7IGBCdWZmZXJgIGlzIGFjY2VwdGVkXG4gKiAgIGJlY2F1c2UgYEJ1ZmZlciBleHRlbmRzIFVpbnQ4QXJyYXlgKS5cbiAqIC0gYHVuZGVmaW5lZGAgXHUyMDE0IGVtcHR5IGZvbGRlciAodGhlIGtleSAqKm11c3QqKiBlbmQgd2l0aCBgL2ApLlxuICovXG5leHBvcnQgdHlwZSBQb3B1bGF0ZUZpbGVDb250ZW50ID0gc3RyaW5nIHwgVWludDhBcnJheSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIG1hcCBvZiB2YXVsdC1yZWxhdGl2ZSBwYXRocyB0byB0aGVpciBjb250ZW50LCB1c2VkIGJ5XG4gKiB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQucG9wdWxhdGV9LlxuICpcbiAqIFBhdGhzIGVuZGluZyB3aXRoIGAvYCBkZW5vdGUgZm9sZGVycyBhbmQgKiptdXN0KiogaGF2ZSBhbiBgdW5kZWZpbmVkYCB2YWx1ZS5cbiAqIEFsbCBvdGhlciBwYXRocyBhcmUgd3JpdHRlbiBhcyBmaWxlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUG9wdWxhdGVGaWxlc1BhcmFtcyA9IFJlY29yZDxzdHJpbmcsIFBvcHVsYXRlRmlsZUNvbnRlbnQ+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgVGVtcG9yYXJ5VmF1bHR9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBvcmFyeVZhdWx0Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIge0BsaW5rIFRlbXBvcmFyeVZhdWx0LmRpc3Bvc2V9IHJlbW92ZXMgdGhlIHZhdWx0ICoqZGlyZWN0b3J5KiouXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgZGVmYXVsdHMgdG8gd2hldGhlciB0aGlzIGluc3RhbmNlIGNyZWF0ZWQgdGhhdCBkaXJlY3RvcnkgXHUyMDE0IGB0cnVlYCBmb3IgYSB0ZW1wXG4gICAqIGRpcmVjdG9yeSB0aGUgY29uc3RydWN0b3IgbWFkZSAobm8gYHBhdGhgIGFyZ3VtZW50KSwgYGZhbHNlYCBmb3IgYSBkaXJlY3RvcnkgaGFuZGVkIHRvIGl0IGFzIGFuXG4gICAqIGV4cGxpY2l0IGBwYXRoYC4gQSBoYW5kbGUgb3ZlciBzb21lYm9keSBlbHNlJ3MgZGlyZWN0b3J5IHVucmVnaXN0ZXJzIHRoZSB2YXVsdCBidXQgbGVhdmVzIHRoZVxuICAgKiBmaWxlcyBhbG9uZSwgc28gd3JhcHBpbmcgYSBkaXJlY3RvcnkgY2Fubm90IGRlc3Ryb3kgaXQuIFNldCBleHBsaWNpdGx5IHRvIG92ZXJyaWRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVtb3ZlRGlyZWN0b3J5T25EaXNwb3NlPzogYm9vbGVhbjtcbn1cblxuY29uc3QgUk1fUkVUUllfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgUk1fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMF8wMDA7XG5cbi8qKlxuICogQSB0ZW1wb3JhcnkgT2JzaWRpYW4gdmF1bHQgZm9yIGludGVncmF0aW9uIHRlc3RzLlxuICpcbiAqIENyZWF0ZXMgYSB0ZW1wIGRpcmVjdG9yeSBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlXG4gKiBzbyB0aGF0IHRoZSBPYnNpZGlhbiBDTEkgY2FuIHRhcmdldCBpdCB2aWEgYGN3ZGAuXG4gKlxuICogQSBoYW5kbGUgKipvd25zKiogdGhlIGRpcmVjdG9yeSBvbmx5IHdoZW4gaXQgY3JlYXRlZCBpdC4ge0BsaW5rIFRlbXBvcmFyeVZhdWx0LmRpc3Bvc2V9IGRlbGV0ZXMgYW5cbiAqIG93bmVkIGRpcmVjdG9yeSBhbmQgbGVhdmVzIGEgYm9ycm93ZWQgb25lIGluIHBsYWNlIFx1MjAxNCBzZWVcbiAqIHtAbGluayBUZW1wb3JhcnlWYXVsdENvbnN0cnVjdG9yT3B0aW9ucy5zaG91bGRSZW1vdmVEaXJlY3RvcnlPbkRpc3Bvc2V9LCB3aGljaCBvdmVycmlkZXMgdGhhdCBkZWZhdWx0LlxuICovXG5leHBvcnQgY2xhc3MgVGVtcG9yYXJ5VmF1bHQge1xuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHRlbXBvcmFyeSB2YXVsdC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIge0BsaW5rIFRlbXBvcmFyeVZhdWx0LmRpc3Bvc2V9IHJlbW92ZXMge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnBhdGh9IGZyb20gZGlzay5cbiAgICovXG4gIHJlYWRvbmx5ICNzaG91bGRSZW1vdmVEaXJlY3RvcnlPbkRpc3Bvc2U6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdGVtcCB2YXVsdC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBBbiBleHBsaWNpdCB2YXVsdCBwYXRoLiBJZiBvbWl0dGVkLCBhIHRlbXAgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVmF1bHQgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoPzogc3RyaW5nLCBvcHRpb25zPzogVGVtcG9yYXJ5VmF1bHRDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICB0aGlzLnBhdGggPSBwYXRoID8/IG1rZHRlbXBTeW5jKGpvaW4odG1wZGlyKCksIFRFTVBfVkFVTFRfRElSX1BSRUZJWCkpO1xuICAgIHRoaXMuI3Nob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZSA9IG9wdGlvbnM/LnNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZSA/PyBwYXRoID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgdGhlIHZhdWx0IGZyb20gT2JzaWRpYW4gYW5kLCB3aGVuIHRoaXMgaGFuZGxlIG93bnMgdGhlIGRpcmVjdG9yeSwgZGVsZXRlcyBpdC5cbiAgICpcbiAgICogVGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkIG9ubHkgd2hlbiB0aGlzIGluc3RhbmNlIGNyZWF0ZWQgaXQsIG9yIHdoZW5cbiAgICoge0BsaW5rIFRlbXBvcmFyeVZhdWx0Q29uc3RydWN0b3JPcHRpb25zLnNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZX0gc2FpZCBzbyBleHBsaWNpdGx5LiBUaGF0IGlzIHdoYXRcbiAgICogbWFrZXMgYSBoYW5kbGUgb3ZlciBhIGRpcmVjdG9yeSBzb21lYm9keSBlbHNlIG93bnMgXHUyMDE0IHRoZSBydW4ncyBzaGFyZWQgc2V0dXAgdmF1bHQsIHNheSwgd2hpY2hcbiAgICogYGdldFRlbXBvcmFyeVZhdWx0KClgIHdyYXBzIFx1MjAxNCBzYWZlIHRvIGRpc3Bvc2UgZnJvbSBhIGNvbnN1bWVyJ3MgYGFmdGVyQWxsYC5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zcG9ydE92ZXJyaWRlIC0gQW4gZXhwbGljaXQgdHJhbnNwb3J0IHRvIHVzZSB3aGVuIHVucmVnaXN0ZXJpbmcuXG4gICAqICAgV2hlbiBvbWl0dGVkLCBmYWxscyBiYWNrIHRvIHRoZSB0cmFuc3BvcnQgY29uZmlndXJlZCB2aWEgdGhlIGNvbnRleHQgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzcG9zZSh0cmFuc3BvcnRPdmVycmlkZT86IE9ic2lkaWFuVHJhbnNwb3J0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHVucmVnaXN0ZXJWYXVsdCh0aGlzLnBhdGgsIHRyYW5zcG9ydE92ZXJyaWRlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuI3Nob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZSkge1xuICAgICAgICBhd2FpdCByZXRyeVJtKHRoaXMucGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coYFt0ZW1wb3JhcnktdmF1bHRdIFVucmVnaXN0ZXJlZCBidXQga2VwdCB0aGUgdmF1bHQgZGlyZWN0b3J5LCB3aGljaCB0aGlzIGhhbmRsZSBkb2VzIG5vdCBvd246ICR7dGhpcy5wYXRofWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgZmlsZXMgYW5kIGZvbGRlcnMgaW50byB0aGUgdmF1bHQgZGlyZWN0b3J5ICoqb24gdGhlIGhvc3QqKi5cbiAgICogUGFyZW50IGRpcmVjdG9yaWVzIGFyZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIC0gYHN0cmluZ2AgdmFsdWVzIGFyZSB3cml0dGVuIGFzIFVURi04IHRleHQgZmlsZXMuXG4gICAqIC0gYFVpbnQ4QXJyYXlgIHZhbHVlcyAoaW5jbHVkaW5nIGBCdWZmZXJgKSBhcmUgd3JpdHRlbiBhcyBiaW5hcnkgZmlsZXMuXG4gICAqIC0gUGF0aHMgZW5kaW5nIHdpdGggYC9gIGFyZSB0cmVhdGVkIGFzIGVtcHR5IGZvbGRlcnMgKHZhbHVlIG11c3QgYmUgYHVuZGVmaW5lZGApLlxuICAgKlxuICAgKiBUaGUgd3JpdGUgaXMgYWx3YXlzIGhvc3QtbG9jYWwgXHUyMDE0IHtAbGluayBUZW1wb3JhcnlWYXVsdC5wYXRofSBpcyBhIGhvc3QgcGF0aCwgYW5kIG9uIGEgbW9iaWxlXG4gICAqIHRyYW5zcG9ydCB0aGUgdmF1bHQgdGhlIGFwcCBvcGVucyBsaXZlcyBvbiB0aGUgZGV2aWNlIGluc3RlYWQuIHtAbGluayBUZW1wb3JhcnlWYXVsdC5yZWdpc3Rlcn1cbiAgICogY2FycmllcyB0aGUgZGlyZWN0b3J5IGFjcm9zcyBiZWZvcmUgaXQgcmVnaXN0ZXJzLCBzbyBwb3B1bGF0ZS10aGVuLXJlZ2lzdGVyIGlzIGFsbCBhIGNhbGxlclxuICAgKiBuZWVkczsge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnN5bmNUb0RldmljZX0gaXMgdGhlIHNlYW0gdGhhdCBkb2VzIHRoZSBjYXJyeWluZy5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVzIC0gTWFwIG9mIGZpbGUvZm9sZGVyIHBhdGhzIHRvIGNvbnRlbnQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW4tZGV2LXV0aWxzL3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2ggLS0gUGVybWFuZW50OiBgUG9wdWxhdGVGaWxlc1BhcmFtc2AgaXMgb25lIGJhZyBzaGFyZWQgYnkgdGhpcyBtZXRob2QgYW5kIHRoZSBjb25maWctZGlyZWN0b3J5IHJlbWFwIGluIGBnbG9iYWwtc2V0dXAtY29yZS50c2AsIHNvIG5vIHBlci1vd25lciBuYW1lIGNhbiBzYXRpc2Z5IGJvdGguXG4gIHB1YmxpYyBwb3B1bGF0ZShmaWxlczogUG9wdWxhdGVGaWxlc1BhcmFtcyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhmaWxlcykpIHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbih0aGlzLnBhdGgsIGZpbGVQYXRoKTtcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvbGRlciBwYXRoIFwiJHtmaWxlUGF0aH1cIiBtdXN0IGhhdmUgdW5kZWZpbmVkIGNvbnRlbnRgKTtcbiAgICAgICAgfVxuICAgICAgICBta2RpclN5bmMoZnVsbFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBwYXRoIFwiJHtmaWxlUGF0aH1cIiBtdXN0IGhhdmUgZGVmaW5lZCBjb250ZW50OyB1c2UgYSB0cmFpbGluZyBcIi9cIiBmb3IgZm9sZGVyc2ApO1xuICAgICAgICB9XG4gICAgICAgIG1rZGlyU3luYyhkaXJuYW1lKGZ1bGxQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIHdyaXRlRmlsZVN5bmMoZnVsbFBhdGgsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhpcyB2YXVsdCBpbiB0aGUgcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZSBzbyB0aGUgQ0xJIGNhbiB0YXJnZXQgaXQuXG4gICAqXG4gICAqIFB1c2hlcyB0aGUgdmF1bHQgZGlyZWN0b3J5IHRvIHRoZSB0YXJnZXQgZGV2aWNlIGZpcnN0LCB2aWFcbiAgICoge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnN5bmNUb0RldmljZX0gXHUyMDE0IGEgbm8tb3Agb24gYSB0cmFuc3BvcnQgd2hvc2UgYXBwIGFscmVhZHkgcmVhZHMgdGhlIGhvc3RcbiAgICogZmlsZXN5c3RlbS4gVGhhdCBvcmRlcmluZyB1c2VkIHRvIGJlIHRoZSBjYWxsZXIncyB0byByZW1lbWJlciwgYW5kIGEgY2FsbGVyIHdobyBmb3Jnb3QgZ290IGFcbiAgICogc2lsZW50bHkgKiplbXB0eSoqIHZhdWx0IHJhdGhlciB0aGFuIGFuIGVycm9yOiBldmVyeSBwcmUtcmVnaXN0cmF0aW9uXG4gICAqIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZX0gd3JpdGUgc3RheWVkIG9uIHRoZSBob3N0IHdoaWxlIHRoZSBhcHAgb3BlbmVkIHRoZSBkZXZpY2UncyBjb3B5LlxuICAgKiBGb2xkaW5nIGl0IGluIGhlcmUgbWFrZXMgcG9wdWxhdGUtdGhlbi1yZWdpc3RlciBjb3JyZWN0IG9uIGV2ZXJ5IHRyYW5zcG9ydC5cbiAgICpcbiAgICogVGhlIHRyYW5zcG9ydCBpcyByZXNvbHZlZCBvbmNlIGFuZCBoYW5kZWQgdG8gYm90aCBzdGVwcywgc28gYSBwdXNoIGFuZCB0aGUgcmVnaXN0cmF0aW9uIHRoYXRcbiAgICogZm9sbG93cyBpdCBjYW4gbmV2ZXIgbGFuZCBvbiB0d28gZGlmZmVyZW50IHRyYW5zcG9ydHMuXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc3BvcnRPdmVycmlkZSAtIEFuIGV4cGxpY2l0IHRyYW5zcG9ydCB0byB1c2UuIFdoZW4gb21pdHRlZCxcbiAgICogICBmYWxscyBiYWNrIHRvIHRoZSB0cmFuc3BvcnQgY29uZmlndXJlZCB2aWEgdGhlIGNvbnRleHQgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIodHJhbnNwb3J0T3ZlcnJpZGU/OiBPYnNpZGlhblRyYW5zcG9ydCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRyYW5zcG9ydCA9IHRyYW5zcG9ydE92ZXJyaWRlID8/IGF3YWl0IGdldE9yQ3JlYXRlVHJhbnNwb3J0KGdldFRyYW5zcG9ydE9wdGlvbnMoKSk7XG4gICAgYXdhaXQgdGhpcy5zeW5jVG9EZXZpY2UodHJhbnNwb3J0KTtcbiAgICBhd2FpdCByZWdpc3RlclZhdWx0KHRoaXMucGF0aCwgdHJhbnNwb3J0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luYyBkaXNwb3NhYmxlIHN1cHBvcnQgZm9yIGBhd2FpdCB1c2luZ2AuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHZhdWx0IGlzIGRpc3Bvc2VkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kaXNwb3NlKCk7XG4gIH1cblxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIHRoYXQgcmVxdWlyZXMgYSBydW5uaW5nIHRyYW5zcG9ydC4gKi9cblxuICAvKipcbiAgICogUHVzaGVzIGFsbCBmaWxlcyBmcm9tIHRoZSBsb2NhbCBzdGFnaW5nIGRpcmVjdG9yeSB0byB0aGUgdGFyZ2V0IGRldmljZVxuICAgKiB2aWEgdGhlIGFjdGl2ZSB0cmFuc3BvcnQncyBgcHVzaEZpbGVzKClgLlxuICAgKlxuICAgKiBPbiBkZXNrdG9wIHRyYW5zcG9ydHMgdGhpcyBpcyBhIG5vLW9wIChmaWxlcyBhcmUgYWxyZWFkeSBsb2NhbCkuXG4gICAqIE9uIG1vYmlsZSB0cmFuc3BvcnRzIChBcHBpdW0pIHRoaXMgcHVzaGVzIGZpbGVzIHRvIHRoZSBkZXZpY2UuXG4gICAqXG4gICAqIHtAbGluayBUZW1wb3JhcnlWYXVsdC5yZWdpc3Rlcn0gY2FsbHMgdGhpcyBpdHNlbGYsIHNvIGEgcG9wdWxhdGUtdGhlbi1yZWdpc3RlciBzZXF1ZW5jZSBuZWVkc1xuICAgKiBub3RoaW5nIGV4dHJhLiBDYWxsIGl0IGRpcmVjdGx5IG9ubHkgdG8gY2FycnkgYWNyb3NzIGZpbGVzIHdyaXR0ZW4gKiphZnRlcioqIHJlZ2lzdHJhdGlvbjogdGhlXG4gICAqIGhvc3QgZGlyZWN0b3J5IGlzIG5vdCBtaXJyb3JlZCwgc28gYSBsYXRlciB3cml0ZSBpbnRvIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wYXRofSBzdGF5cyBvbiB0aGVcbiAgICogaG9zdCB1bnRpbCB0aGlzIHJ1bnMgYWdhaW4uXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc3BvcnRPdmVycmlkZSAtIEFuIGV4cGxpY2l0IHRyYW5zcG9ydCB0byB1c2UuIFdoZW4gb21pdHRlZCxcbiAgICogICBmYWxscyBiYWNrIHRvIHRoZSB0cmFuc3BvcnQgY29uZmlndXJlZCB2aWEgdGhlIGNvbnRleHQgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3luY1RvRGV2aWNlKHRyYW5zcG9ydE92ZXJyaWRlPzogT2JzaWRpYW5UcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0cmFuc3BvcnQgPSB0cmFuc3BvcnRPdmVycmlkZSA/PyBhd2FpdCBnZXRPckNyZWF0ZVRyYW5zcG9ydChnZXRUcmFuc3BvcnRPcHRpb25zKCkpO1xuICAgIGlmICghdHJhbnNwb3J0LnB1c2hGaWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5jb2xsZWN0RmlsZXModGhpcy5wYXRoKTtcbiAgICBhd2FpdCB0cmFuc3BvcnQucHVzaEZpbGVzKHRoaXMucGF0aCwgZmlsZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZWx5IHJlYWRzIGFsbCBmaWxlcyBmcm9tIGEgZGlyZWN0b3J5IGludG8gYSBmbGF0IG1hcC5cbiAgICpcbiAgICogQHBhcmFtIGRpcmVjdG9yeSAtIFRoZSBkaXJlY3RvcnkgdG8gcmVhZC5cbiAgICogQHJldHVybnMgQSBtYXAgb2YgcmVsYXRpdmUgZmlsZSBwYXRocyB0byBjb250ZW50IGJ1ZmZlcnMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbGxlY3RGaWxlcyhkaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgVWludDhBcnJheT4+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+ID0ge307XG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbihkaXJlY3RvcnksIGVudHJ5Lm5hbWUpO1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUodGhpcy5wYXRoLCBmdWxsUGF0aCk7XG5cbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCBhd2FpdCB0aGlzLmNvbGxlY3RGaWxlcyhmdWxsUGF0aCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3JlbGF0aXZlUGF0aF0gPSBhd2FpdCByZWFkRmlsZShmdWxsUGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xufVxuXG4vKipcbiAqIFJldHJpZXMgYHJtYCB1bnRpbCBpdCBzdWNjZWVkcyBvciB0aW1lcyBvdXQuXG4gKiBPYnNpZGlhbiBtYXkgaG9sZCBmaWxlIGxvY2tzIGJyaWVmbHkgYWZ0ZXIgYSB3aW5kb3cgaXMgZGVzdHJveWVkLlxuICpcbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkaXJlY3RvcnkgaXMgcmVtb3ZlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmV0cnlSbShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgUk1fUkVUUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBSTV9SRVRSWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8vIEZpbmFsIGF0dGVtcHQgXHUyMDE0IGxldCBpdCB0aHJvdy5cbiAgYXdhaXQgcm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BLHFCQUlPO0FBQ1Asc0JBSU87QUFDUCxxQkFBdUI7QUFDdkIsdUJBSU87QUFJUCw4QkFBb0M7QUFDcEMsOEJBQXNDO0FBQ3RDLGlCQUFvQjtBQUNwQiwrQkFBcUM7QUFDckMsNEJBR087QUFvQ1AsTUFBTSxpQ0FBaUM7QUFDdkMsTUFBTSxtQ0FBbUM7QUFZbEMsTUFBTSxlQUFlO0FBQUE7QUFBQTtB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
@@ -24,7 +24,7 @@ export type PopulateFilesParams = Record<string, PopulateFileContent>;
24
24
  /**
25
25
  * Options for the {@link TemporaryVault} constructor.
26
26
  */
27
- export interface TemporaryVaultOptions {
27
+ export interface TemporaryVaultConstructorOptions {
28
28
  /**
29
29
  * Whether {@link TemporaryVault.dispose} removes the vault **directory**.
30
30
  *
@@ -43,7 +43,7 @@ export interface TemporaryVaultOptions {
43
43
  *
44
44
  * A handle **owns** the directory only when it created it. {@link TemporaryVault.dispose} deletes an
45
45
  * owned directory and leaves a borrowed one in place — see
46
- * {@link TemporaryVaultOptions.shouldRemoveDirectoryOnDispose}, which overrides that default.
46
+ * {@link TemporaryVaultConstructorOptions.shouldRemoveDirectoryOnDispose}, which overrides that default.
47
47
  */
48
48
  export declare class TemporaryVault {
49
49
  #private;
@@ -57,12 +57,12 @@ export declare class TemporaryVault {
57
57
  * @param path - An explicit vault path. If omitted, a temp directory is created.
58
58
  * @param options - Vault options.
59
59
  */
60
- constructor(path?: string, options?: TemporaryVaultOptions);
60
+ constructor(path?: string, options?: TemporaryVaultConstructorOptions);
61
61
  /**
62
62
  * Unregisters the vault from Obsidian and, when this handle owns the directory, deletes it.
63
63
  *
64
64
  * The directory is removed only when this instance created it, or when
65
- * {@link TemporaryVaultOptions.shouldRemoveDirectoryOnDispose} said so explicitly. That is what
65
+ * {@link TemporaryVaultConstructorOptions.shouldRemoveDirectoryOnDispose} said so explicitly. That is what
66
66
  * makes a handle over a directory somebody else owns — the run's shared setup vault, say, which
67
67
  * `getTemporaryVault()` wraps — safe to dispose from a consumer's `afterAll`.
68
68
  *
@@ -771,4 +771,4 @@ function extractVaultName(vaultPath) {
771
771
  AppiumTransport,
772
772
  DEFAULT_ANDROID_VAULT_BASE_PATH
773
773
  });
774
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1hcHBpdW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBcHBpdW0gdHJhbnNwb3J0IFx1MjAxNCBldmFsdWF0ZXMgZXhwcmVzc2lvbnMgaW5zaWRlIE9ic2lkaWFuIE1vYmlsZSB2aWEgV2ViVmlld1xuICogSmF2YVNjcmlwdCBpbmplY3Rpb24uIE1hbmFnZXMgdmF1bHQgbGlmZWN5Y2xlIHZpYSBsb2NhbFN0b3JhZ2UgYW5kIGZpbGUgcHVzaC5cbiAqXG4gKiBDb25maWd1cmVkIHZpYSBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YCBpbiB2aXRlc3QgY29uZmlnOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHZpdGVzdC5jb25maWcudHNcbiAqIGVudmlyb25tZW50T3B0aW9uczoge1xuICogICBvYnNpZGlhblRyYW5zcG9ydDoge1xuICogICAgIHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScsXG4gKiAgICAgYXBwaXVtVXJsOiAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJyxcbiAqICAgICBhdmROYW1lOiAnb2JzaWRpYW5fdGVzdCcsXG4gKiAgIH0sXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBGb3IgQnJvd3NlclN0YWNrLCBzZXQgYGFwcGl1bVVybGAgdG8gdGhlIEJyb3dzZXJTdGFjayBodWIgVVJMXG4gKiBcdTIwMTQgdGhlIHRyYW5zcG9ydCBpdHNlbGYgaXMgaHViLWFnbm9zdGljLlxuICpcbiAqICMjIEhvdyB2YXVsdCByZWdpc3RyYXRpb24gd29ya3Mgb24gbW9iaWxlXG4gKlxuICogT2JzaWRpYW4gTW9iaWxlIHN0b3JlcyBpdHMgdmF1bHQgcmVnaXN0cnkgaW4gdGhlIFdlYlZpZXcncyBgbG9jYWxTdG9yYWdlYDpcbiAqXG4gKiAtIGBtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzYCBcdTIwMTQgSlNPTiBhcnJheSBvZiByZWdpc3RlcmVkIHZhdWx0IHBhdGhzXG4gKiAtIGBtb2JpbGUtc2VsZWN0ZWQtdmF1bHRgIFx1MjAxNCB0aGUgY3VycmVudGx5IGFjdGl2ZSB2YXVsdCBwYXRoXG4gKiAtIGBlbmFibGUtcGx1Z2luLTx2YXVsdFBhdGg+YCBcdTIwMTQgYFwidHJ1ZVwiYCB0byBlbmFibGUgdGhlIHBsdWdpbiBzeXN0ZW0gZm9yIHRoZSB2YXVsdFxuICpcbiAqIFRvIHJlZ2lzdGVyIGEgdmF1bHQgcHJvZ3JhbW1hdGljYWxseSAod2l0aG91dCBVSSBpbnRlcmFjdGlvbik6XG4gKlxuICogMS4gUHVzaCB2YXVsdCBmaWxlcyB0byB0aGUgZGV2aWNlIChlLmcuIGAvc2RjYXJkL0RvY3VtZW50cy88TmFtZT4vLm9ic2lkaWFuL2FwcC5qc29uYClcbiAqIDIuIFN3aXRjaCB0byBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dFxuICogMy4gU2V0IHRoZSBsb2NhbFN0b3JhZ2UgZW50cmllc1xuICogNC4gQ2FsbCBgbG9jYXRpb24ucmVsb2FkKClgIFx1MjAxNCBPYnNpZGlhbiByZS1yZWFkcyBsb2NhbFN0b3JhZ2UgYW5kIG9wZW5zIHRoZSB2YXVsdFxuICpcbiAqIFRoaXMgYXZvaWRzIHRoZSBvbmJvYXJkaW5nIGZsb3cgZW50aXJlbHkuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHR5cGUgeyBCcm93c2VyIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgcm0sXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwU3RhcnR1cE1pbGVzdG9uZSxcbiAgQXBwU3RhcnR1cFBoYXNlLFxuICBTdGFydHVwUHJvYmVSZXN1bHRcbn0gZnJvbSAnLi9hcHAtc3RhcnR1cC1wcm9ncmVzcy5janMnO1xuaW1wb3J0IHR5cGUgeyBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyB9IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90LmNqcyc7XG5pbXBvcnQgdHlwZSB7IE1vYmlsZUlucHV0RW52ZWxvcGUgfSBmcm9tICcuL21vYmlsZS1pbnB1dC5janMnO1xuaW1wb3J0IHR5cGUge1xuICBDb25zb2xlQ2FwdHVyZUhhbmRsZSxcbiAgT2JzaWRpYW5UcmFuc3BvcnQsXG4gIFRyYW5zcG9ydEV2YWxPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LmNqcyc7XG5pbXBvcnQgdHlwZSB7IFdlYlZpZXdDZHBDb25uZWN0aW9uIH0gZnJvbSAnLi93ZWJ2aWV3LWNkcC5janMnO1xuXG5pbXBvcnQge1xuICBidWlsZFN0YXJ0dXBUaW1lb3V0TWVzc2FnZSxcbiAgY2hlY2tBcHBTdGFydGVkLFxuICBjaGVja0xheW91dFJlYWR5LFxuICBjbGFzc2lmeUFwcFN0YXJ0dXBQcm9iZSxcbiAgY29tcGFyZUFwcFN0YXJ0dXBNaWxlc3RvbmVzXG59IGZyb20gJy4vYXBwLXN0YXJ0dXAtcHJvZ3Jlc3MuY2pzJztcbmltcG9ydCB7XG4gIGRlY29kZUJhc2U2NFBuZyxcbiAgaXNQbmdcbn0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QuY2pzJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICcuL2Vycm9yLXRvLXN0cmluZy5janMnO1xuaW1wb3J0IHtcbiAgRXZhbENhcEV4Y2VlZGVkRXJyb3IsXG4gIGlzU2NyaXB0VGltZW91dEVycm9yXG59IGZyb20gJy4vZXZhbC1jYXAtZXhjZWVkZWQtZXJyb3IuY2pzJztcbmltcG9ydCB7IERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTIH0gZnJvbSAnLi9ldmFsLWNhcC5janMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5janMnO1xuaW1wb3J0IHsgVEVNUF9WQVVMVF9ESVJfUFJFRklYIH0gZnJvbSAnLi9sZWZ0b3Zlci1jbGVhbnVwLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuaW1wb3J0IHtcbiAgYnVpbGRDbGFpbUlucHV0RXhwcmVzc2lvbixcbiAgYnVpbGRSZXNvbHZlSW5wdXRFeHByZXNzaW9uLFxuICBjaGVja0lucHV0Q2xhaW1HcmFudGVkLFxuICBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FLFxuICB0b0NkcElucHV0Q29tbWFuZHNcbn0gZnJvbSAnLi9tb2JpbGUtaW5wdXQuY2pzJztcbmltcG9ydCB7IGNvbm5lY3RUb1dlYlZpZXdDZHAgfSBmcm9tICcuL3dlYnZpZXctY2RwLmNqcyc7XG5cbi8qKlxuICogU2Vzc2lvbiBjb25uZWN0aW9uIGluZm8gcmV0dXJuZWQgYnkge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5nZXRTZXNzaW9uSW5mb30sXG4gKiB1c2VkIHRvIHJlYXR0YWNoIGZyb20gYW5vdGhlciBwcm9jZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGl1bVNlc3Npb25JbmZvIHtcbiAgLyoqXG4gIFRoZSBkZXZpY2UgVURJRCAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgQXBwaXVtL1dlYkRyaXZlciBzZXNzaW9uIElELlxuICAgKi9cbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIEFwcGl1bSB0cmFuc3BvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwaXVtVHJhbnNwb3J0Q29uZmlnIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYC5cbiAgICovXG4gIGFwcElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgT2JzaWRpYW4gTW9iaWxlIHRvIGdldCBhcyBmYXIgYXMgYGdsb2JhbFRoaXMuYXBwYFxuICAgKiBleGlzdGluZyBhZnRlciB0aGUgdmF1bHQgaXMgKHJlKW9wZW5lZCwgYmVmb3JlIHRoZSB0aWdodGVyXG4gICAqIHtAbGluayBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kc30gY2xvY2sgc3RhcnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTgwMDAwYFxuICAgKi9cbiAgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBBcHBpdW0gYnJvd3Nlci9kcml2ZXIgaW5zdGFuY2UuXG4gICAqIENyZWF0ZWQgYnkgdGhlIGNvbnN1bWVyIHZpYSBlLmcuIFdlYkRyaXZlcklPJ3MgYHJlbW90ZSgpYC5cbiAgICovXG4gIGJyb3dzZXI6IEJyb3dzZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgVURJRCAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqIFVzZWQgZm9yIGBhZGJgIGNvbW1hbmRzIHdoZW4gcHVzaGluZyBmaWxlcyB0byB0aGUgZGV2aWNlLlxuICAgKi9cbiAgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBvd25zIHRoZSBBcHBpdW0gc2Vzc2lvbiBhbmQgc2hvdWxkIGRlbGV0ZSBpdCBvblxuICAgKiB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0LmRpc3Bvc2V9LlxuICAgKlxuICAgKiBgdHJ1ZWAgZm9yIHNlc3Npb25zIGNyZWF0ZWQgdmlhIGByZW1vdGUoKWAgKGdsb2JhbCBzZXR1cCkuXG4gICAqIGBmYWxzZWAgZm9yIHNlc3Npb25zIHJlYXR0YWNoZWQgdmlhIGBhdHRhY2goKWAgKHRlc3Qgd29ya2VycykuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgaXNTZXNzaW9uT3duZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgLCBjb3VudGVkXG4gICAqIGZyb20gdGhlIG1vbWVudCB7QGxpbmsgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHN9IGlzIHNhdGlzZmllZCBcdTIwMTQgbm90IGZyb21cbiAgICogdGhlIHJlbG9hZCwgc28gYSBjb2xkIGFwcCBzdGFydCBpcyBub3QgY2hhcmdlZCBhZ2FpbnN0IGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgOTAwMDBgXG4gICAqL1xuICBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGFyZ2V0IHBsYXRmb3JtLiBEZXRlcm1pbmVzIFdlYlZpZXcgY29udGV4dCBuYW1pbmcgYW5kIGRldmljZSBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcGxhdGZvcm06ICdhbmRyb2lkJyB8ICdpb3MnO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVyLXNjcmlwdCBjYXAsIGluIG1pbGxpc2Vjb25kcywgdGhpcyBzZXNzaW9uIHdhcyBnaXZlbiBhcyBpdHMgVzNDXG4gICAqIGB0aW1lb3V0cy5zY3JpcHRgIGNhcGFiaWxpdHkuXG4gICAqXG4gICAqIENhcnJpZWQgb25seSBzbyBhIHNjcmlwdCB0aW1lb3V0IGNhbiBiZSByZXBvcnRlZCB3aXRoIHRoZSBudW1iZXIgdGhhdFxuICAgKiBwcm9kdWNlZCBpdDsgdGhlIGNhcGFiaWxpdHkgaXRzZWxmIGlzIHNldCB3aGVuIHRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAzMDAwMGBcbiAgICovXG4gIHNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciByZWdpc3RlcmluZyBhIHZhdWx0IGFsc28gcHJ1bmVzIHRoZSAqKm90aGVyKiogYHRlbXAtdmF1bHQtKmBcbiAgICogcmVnaXN0cmF0aW9ucyBlYXJsaWVyIHJ1bnMgbGVmdCBpbiBPYnNpZGlhbiBNb2JpbGUncyBgbG9jYWxTdG9yYWdlYC5cbiAgICpcbiAgICogVGhlIGRldmljZS1zaWRlIGRpcmVjdG9yaWVzIGFyZSBzd2VwdCBiZWZvcmUgdGhlIGFwcCBsYXVuY2hlcyAoc2VlIHRoZVxuICAgKiBmYWN0b3J5KTsgdGhpcyByZW1vdmVzIHRoZWlyIG5vdy1kYW5nbGluZyByZWdpc3RyeSBlbnRyaWVzLCB3aGljaCBhcmUgd2hhdFxuICAgKiBPYnNpZGlhbiBhY3R1YWxseSBlbnVtZXJhdGVzIGF0IHN0YXJ0dXAuIFVucmVnaXN0ZXJpbmcgdGhpcyBydW4ncyBvd24gdmF1bHRcbiAgICogaXMgdW5hZmZlY3RlZCBcdTIwMTQgdGhhdCBhbHdheXMgaGFwcGVucy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICBzaG91bGRTd2VlcExlZnRvdmVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEJhc2UgcGF0aCBvbiB0aGUgZGV2aWNlIHdoZXJlIE9ic2lkaWFuIHN0b3JlcyB2YXVsdHMuXG4gICAqXG4gICAqIERlZmF1bHRzOlxuICAgKiAtIEFuZHJvaWQ6IGAvc2RjYXJkL0RvY3VtZW50cy9gXG4gICAqIC0gaU9TOiBgQG1kLm9ic2lkaWFuOmRvY3VtZW50cy9gXG4gICAqL1xuICB2YXVsdEJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgdGhlIFdlYlZpZXcgY29udGV4dCB0byBiZWNvbWUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG5jb25zdCBOT19PVVRQVVQgPSAnKG5vIG91dHB1dCknO1xuY29uc3QgQVBQX1NUQVRFX0ZPUkVHUk9VTkQgPSA0O1xuY29uc3QgV0VCVklFV19DT05URVhUX1BSRUZJWCA9ICdXRUJWSUVXX21kLm9ic2lkaWFuJztcbmNvbnN0IFdFQlZJRVdfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBERUZBVUxUX1dFQlZJRVdfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwXzAwMDtcbmNvbnN0IExBWU9VVF9SRUFEWV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IERFRkFVTFRfTEFZT1VUX1JFQURZX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA5MF8wMDA7XG5jb25zdCBERUZBVUxUX0FQUF9TVEFSVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTgwXzAwMDtcbmNvbnN0IEFQUF9SRVNUQVJUX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBERUZBVUxUX0FQUF9JRCA9ICdtZC5vYnNpZGlhbic7XG5jb25zdCBBREJfVkFVTFRfUkVNT1ZFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuLypcbiAqIEV4dHJhIGJ1ZGdldCBncmFudGVkIHRvIHRoZSBPTkUgZXZhbCB0aGF0IGZvbGxvd3MgYSBjYXAgb3ZlcnJ1biwgb24gdG9wIG9mIHRoZSBjYXAgaXRzZWxmLiBUaGVcbiAqIGFiYW5kb25lZCBjbG9zdXJlIGtlZXBzIHJ1bm5pbmcgaW4gdGhlIGd1ZXN0LCBhbmQgQXBwaXVtIHNlcmlhbGl6ZXMgY29tbWFuZHMgcGVyIHNlc3Npb24sIHNvIHRoZSBuZXh0XG4gKiBjb21tYW5kIHdhaXRzIG91dCB3aGF0ZXZlciBpcyBsZWZ0IG9mIGl0LiBTaXplZCBhdCB0aGUgZGVmYXVsdCBjYXAgYWdhaW4gXHUyMDE0IGRlcml2ZWQgZnJvbSBpdCByYXRoZXIgdGhhblxuICogcmVzdGF0ZWQsIHNvIHRoZSB0d28gY2Fubm90IGRyaWZ0IFx1MjAxNCB3aGljaCBpcyBhIHByYWdtYXRpYyBjZWlsaW5nIHJhdGhlciB0aGFuIGEgcHJvb2Y6IGEgY2xvc3VyZSBjYW5cbiAqIG91dHJ1biBhbnkgbnVtYmVyIHBpY2tlZCBoZXJlLiBJdCBkb2VzIG5vdCBuZWVkIHRvIGJlIGEgcHJvb2YsIGJlY2F1c2UgYSBndWVzdCB0aGF0IGlzIHN0aWxsIGJ1c3kgYWZ0ZXJcbiAqIGl0IHNpbXBseSBwcm9kdWNlcyBhbm90aGVyIG92ZXJydW4gb24gdGhlIG5leHQgZXZhbCwgd2hpY2ggaXMgZ3JhbnRlZCB0aGUgZ3JhY2UgaW4gdHVybiBcdTIwMTQgc28gdGhlIHNlc3Npb25cbiAqIHJlY292ZXJzIG92ZXIgc3VjY2Vzc2l2ZSBldmFscyBpbnN0ZWFkIG9mIGNvbXBvdW5kaW5nLCBhbmQgZXZlcnkgb25lIG9mIHRob3NlIGV2YWxzIHJlcG9ydHMgdGhlIHNhbWVcbiAqIGhvbmVzdCBkaWFnbm9zaXMuXG4gKi9cbmNvbnN0IENBUF9SRUNPVkVSWV9HUkFDRV9JTl9NSUxMSVNFQ09ORFMgPSBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUztcblxuLy8gLS0tIENvbnNvbGUgY2FwdHVyZSAoTGF5ZXIgMiBvZiB0aGUgcGx1Z2luLWxvYWQgZXJyb3Igc3VyZmFjaW5nKSAtLS1cbi8qKlxuICogVGhlIGBsb2djYXRgIHRhZyBzdGFtcGVkIGF0IGNhcHR1cmUgc3RhcnQsIGFuZCB0aGUgcHJlZml4IG9mIHRoZSB1bmlxdWUgbWFya2VyIHdyaXR0ZW4gdW5kZXIgaXQuXG4gKlxuICogUHJvY2Vzcy1sb2NhbCByYXRoZXIgdGhhbiBhIHByb3RvY29sOiBgYmVnaW5Db25zb2xlQ2FwdHVyZWAgd3JpdGVzIGl0IGFuZCBgcmVhZENvbnNvbGVDYXB0dXJlU2luY2VgIHNlYXJjaGVzIHRoZSBkdW1wIGZvclxuICogdGhlIHNhbWUgc3RyaW5nLCBib3RoIGZyb20gdGhpcyBjb25zdGFudCwgc28gdGhlIHZhbHVlIGlzIGZyZWUgdG8gY2hhbmdlLiBJdCBvbmx5IGhhcyB0byBiZSB1bmxpa2VseSB0byBvY2N1ciBpbiBhblxuICogdW5yZWxhdGVkIGxvZyBsaW5lLlxuICovXG5jb25zdCBDT05TT0xFX0NBUFRVUkVfTUFSS0VSX1RBRyA9ICdPQlNJRElBTl9JTlRFR1JBVElPTl9URVNUSU5HX0NBUFRVUkUnO1xuY29uc3QgQ09OU09MRV9DQVBUVVJFX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBBREJfTE9HX01BUktFUl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBMT0dDQVRfRFVNUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcbi8qKlxuICogYGFkYiBsb2djYXQgLXYgdGltZWAgbGluZXMgbG9vayBsaWtlIGBNTS1ERCBISDpNTTpTUy5tbW0gTEVWRUwvVEFHKCBQSUQpOiBtZXNzYWdlYC5cbiAqIEtlZXAgb25seSB0aGUgdGFncyBDaHJvbWl1bS9XZWJWaWV3IHJvdXRlcyBKUyBgY29uc29sZS4qYCBvdXRwdXQgYW5kIHVuY2F1Z2h0XG4gKiBlcnJvcnMgdG8gKGBjaHJvbWl1bWAsIHRoZSBDYXBhY2l0b3IgY29uc29sZSBicmlkZ2UsIGFuZCBuYXRpdmUgYEFuZHJvaWRSdW50aW1lYCkuXG4gKi9cbmNvbnN0IENPTlNPTEVfQ0FQVFVSRV9UQUdfUkUgPSAvXFwvKD86Y2hyb21pdW18QW5kcm9pZFJ1bnRpbWV8Q2FwYWNpdG9yXFwvQ29uc29sZSlcXCgvO1xuXG4vKipcbiAqIEJhc2UgcGF0aCBvbiBhbiBBbmRyb2lkIGRldmljZSB3aGVyZSBPYnNpZGlhbiBNb2JpbGUgc3RvcmVzIGl0cyB2YXVsdHMuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSB0aGUgdHJhbnNwb3J0IGZhY3Rvcnkgc3dlZXBzIGxlZnRvdmVyIHZhdWx0cyBmcm9tIGl0IGJlZm9yZVxuICogYSB0cmFuc3BvcnQgZXhpc3RzIChzZWUgdGhlIHJlcG8ncyBMMzEpLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSCA9ICcvc2RjYXJkL0RvY3VtZW50cy8nO1xuXG5jb25zdCBERUZBVUxUX1ZBVUxUX0JBU0VfUEFUSDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgYW5kcm9pZDogREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSCxcbiAgaW9zOiAnQG1kLm9ic2lkaWFuOmRvY3VtZW50cy8nXG59O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnQud2FpdEZvclN0YXJ0dXBNaWxlc3RvbmV9LlxuICovXG5pbnRlcmZhY2UgQXBwaXVtVHJhbnNwb3J0V2FpdEZvclN0YXJ0dXBNaWxlc3RvbmVQYXJhbXMge1xuICAvKipcbiAgV2hldGhlciB0aGUgbWlsZXN0b25lIGp1c3Qgb2JzZXJ2ZWQgZW5kcyB0aGlzIHBoYXNlLlxuICAgKi9cbiAgaXNTYXRpc2ZpZWQodGhpczogdm9pZCwgbWlsZXN0b25lOiBBcHBTdGFydHVwTWlsZXN0b25lKTogYm9vbGVhbjtcblxuICAvKipcbiAgVGhlIHBoYXNlIGJlaW5nIHdhaXRlZCBvdXQsIG5hbWVkIGluIHRoZSBsb2cgYW5kIGluIHRoZSB0aW1lb3V0IG1lc3NhZ2UuXG4gICAqL1xuICByZWFkb25seSBwaGFzZTogQXBwU3RhcnR1cFBoYXNlO1xuXG4gIC8qKlxuICBUaGlzIHBoYXNlJ3MgYnVkZ2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBMb2FkaW5nQXBwIHtcbiAgd29ya3NwYWNlPzogTG9hZGluZ1dvcmtzcGFjZTtcbn1cblxuaW50ZXJmYWNlIExvYWRpbmdXb3Jrc3BhY2Uge1xuICBsYXlvdXRSZWFkeT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVHJhbnNwb3J0IHRoYXQgY29tbXVuaWNhdGVzIHdpdGggT2JzaWRpYW4gTW9iaWxlIHZpYSBBcHBpdW0gV2ViVmlldyBKUyBpbmplY3Rpb24uXG4gKlxuICogRXZhbHVhdGVzIGV4cHJlc3Npb25zIGJ5IHN3aXRjaGluZyB0byB0aGUgYFdFQlZJRVdfbWQub2JzaWRpYW5gIGNvbnRleHQgYW5kXG4gKiBjYWxsaW5nIGBleGVjdXRlKClgLiBNYW5hZ2VzIHZhdWx0cyBieSB3cml0aW5nIHRvIHRoZSBXZWJWaWV3J3MgYGxvY2FsU3RvcmFnZWBcbiAqICh3aGljaCBPYnNpZGlhbiB1c2VzIGFzIGl0cyB2YXVsdCByZWdpc3RyeSBvbiBtb2JpbGUpIGFuZCBwdXNoaW5nIGZpbGVzIHRvIHRoZSBkZXZpY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBBcHBpdW1UcmFuc3BvcnQgaW1wbGVtZW50cyBPYnNpZGlhblRyYW5zcG9ydCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBmb3IgYSBtb2JpbGUgcGxhdGZvcm0uIEFsd2F5cyBgdHJ1ZWAgZm9yIHRoaXMgdHJhbnNwb3J0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzTW9iaWxlID0gdHJ1ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHBJZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcFN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnJvd3NlcjogQnJvd3NlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGBwcm9jZXNzLm9uKCdleGl0JylgIGhhbmRsZXIgdGhhdCB0ZWFycyB0aGUgY2hhbm5lbCBkb3duIHdoZW4gbm90aGluZyBlbHNlIHdpbGwuXG4gICAqL1xuICBwcml2YXRlIGRpc3Bvc2VJbnB1dENoYW5uZWxPbkV4aXQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogVGhlIGhvc3QgaGFsZiBvZiB0aGUgdHJ1c3RlZC1pbnB1dCBjaGFubmVsOiBhIENEUCBjb25uZWN0aW9uIHRvIHRoZSBXZWJWaWV3LCBpbmRlcGVuZGVudCBvZiB0aGVcbiAgICogQXBwaXVtIHNlc3Npb24sIG9wZW5lZCBsYXppbHkgb24gZmlyc3QgZXZhbHVhdGUgYW5kIHJldXNlZCAoc2VlICoqTDM5KiopLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnB1dENoYW5uZWw6IG51bGwgfCBXZWJWaWV3Q2RwQ29ubmVjdGlvbiA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFNldCBvbmNlIHRoZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwgaXMga25vd24gbm90IHRvIGJlIG9wZW5hYmxlIGhlcmUgKGlPUywgYSByZW1vdGUgaHViLCBubyBsb2NhbFxuICAgKiBgYWRiYCksIHNvIHRoZSBhdHRlbXB0IGlzIG5vdCByZXBlYXRlZCBvbiBldmVyeSBldmFsdWF0ZS5cbiAgICovXG4gIHByaXZhdGUgaXNJbnB1dENoYW5uZWxVbmF2YWlsYWJsZSA9IGZhbHNlO1xuICAvKipcbiAgICogVHJhY2tzIHdoZXRoZXIgdGhlIGRyaXZlciBpcyBjdXJyZW50bHkgc3dpdGNoZWQgdG8gdGhlIFdlYlZpZXcgY29udGV4dC5cbiAgICpcbiAgICogU2V0IHRvIGB0cnVlYCBhZnRlciBhIHN1Y2Nlc3NmdWwgYHN3aXRjaENvbnRleHQoV0VCVklFV19tZC5vYnNpZGlhbilgLlxuICAgKiBSZXNldCB0byBgZmFsc2VgIHdoZW4gdGhlIGNvbnRleHQgaXMga25vd24gdG8gYmUgaW52YWxpZGF0ZWRcbiAgICogKGUuZy4gYWZ0ZXIgYGxvY2F0aW9uLnJlbG9hZCgpYCBpbiB7QGxpbmsgcmVnaXN0ZXJWYXVsdH0pLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCwge0BsaW5rIGVuc3VyZVdlYlZpZXdDb250ZXh0fSBza2lwcyB0aGUgZXhwZW5zaXZlXG4gICAqIGBnZXRDb250ZXh0cygpYCBjYWxsICh3aGljaCBydW5zIGBhZGIgc2hlbGwgY2F0IC9wcm9jL25ldC91bml4YCBhbmRcbiAgICogY2FuIHRpbWUgb3V0IG9uIHNsb3cgZW11bGF0b3JzKS5cbiAgICovXG4gIHByaXZhdGUgaXNJbldlYlZpZXdDb250ZXh0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHByZXZpb3VzIGV2YWwgZW5kZWQgaW4gYSBjYXAgb3ZlcnJ1biwgc28gdGhlIG5leHQgb25lIGlzIG93ZWQgdGhlIHJlY292ZXJ5IGdyYWNlLlxuICAgKlxuICAgKiBUaGUgYWJhbmRvbmVkIGNsb3N1cmUgaXMgc3RpbGwgcnVubmluZyBpbiB0aGUgZ3Vlc3QsIGFuZCBBcHBpdW0gc2VyaWFsaXplcyBjb21tYW5kcyBwZXIgc2Vzc2lvbiwgc29cbiAgICogdGhlIG5leHQgY29tbWFuZCBxdWV1ZXMgYmVoaW5kIHdoYXRldmVyIGlzIGxlZnQgb2YgaXQuIFNlZSB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0LmV2YWx1YXRlV2l0aGluQ2FwfS5cbiAgICovXG4gIHByaXZhdGUgaXNSZWNvdmVyaW5nRnJvbUNhcE92ZXJydW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlzU2Vzc2lvbk93bmVyOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm06ICdhbmRyb2lkJyB8ICdpb3MnO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZFN3ZWVwTGVmdG92ZXJzOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhdWx0QmFzZVBhdGg6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBBcHBpdW0gdHJhbnNwb3J0LlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gQXBwaXVtIHRyYW5zcG9ydCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNvbmZpZzogQXBwaXVtVHJhbnNwb3J0Q29uZmlnKSB7XG4gICAgdGhpcy5icm93c2VyID0gY29uZmlnLmJyb3dzZXI7XG4gICAgdGhpcy5kZXZpY2VJZCA9IGNvbmZpZy5kZXZpY2VJZDtcbiAgICB0aGlzLmlzU2Vzc2lvbk93bmVyID0gY29uZmlnLmlzU2Vzc2lvbk93bmVyID8/IHRydWU7XG4gICAgdGhpcy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IGNvbmZpZy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0xBWU9VVF9SRUFEWV9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHRoaXMucGxhdGZvcm0gPSBjb25maWcucGxhdGZvcm07XG4gICAgdGhpcy5hcHBJZCA9IGNvbmZpZy5hcHBJZCA/PyBERUZBVUxUX0FQUF9JRDtcbiAgICB0aGlzLmFwcFN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzID0gY29uZmlnLmFwcFN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfQVBQX1NUQVJUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgdGhpcy5zY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBjb25maWcuc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTO1xuICAgIHRoaXMuc2hvdWxkU3dlZXBMZWZ0b3ZlcnMgPSBjb25maWcuc2hvdWxkU3dlZXBMZWZ0b3ZlcnMgPz8gdHJ1ZTtcbiAgICB0aGlzLnZhdWx0QmFzZVBhdGggPSBjb25maWcudmF1bHRCYXNlUGF0aCA/PyBERUZBVUxUX1ZBVUxUX0JBU0VfUEFUSFt0aGlzLnBsYXRmb3JtXSA/PyBERUZBVUxUX0FORFJPSURfVkFVTFRfQkFTRV9QQVRIO1xuICAgIHRoaXMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IGNvbmZpZy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfV0VCVklFV19QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIEJlZ2lucyBhIGNvbnNvbGUgY2FwdHVyZSBieSBzdGFtcGluZyB0aGUgZGV2aWNlIGxvZyB3aXRoIGEgdW5pcXVlIG1hcmtlci5cbiAgICpcbiAgICogVXNlcyBgYWRiIHNoZWxsIGxvZ2AgdG8gd3JpdGUgYSBtYXJrZXIgaW50byBgbG9nY2F0YCBhdCBjYXB0dXJlIHN0YXJ0IHNvIGFcbiAgICogbGF0ZXIge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5yZWFkQ29uc29sZUNhcHR1cmVTaW5jZX0gY2FuIHNsaWNlIG91dFxuICAgKiBldmVyeXRoaW5nIHRoZSBXZWJWaWV3IGxvZ2dlZCBhZnRlcndhcmRzIFx1MjAxNCB3aXRob3V0IHRoZSBpbnZhc2l2ZSBgbG9nY2F0IC1jYFxuICAgKiBidWZmZXIgY2xlYXIuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgaGFuZGxlIGNhcnJ5aW5nIHRoZSB1bmlxdWUgbWFya2VyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGJlZ2luQ29uc29sZUNhcHR1cmUoKTogUHJvbWlzZTxDb25zb2xlQ2FwdHVyZUhhbmRsZT4ge1xuICAgIGNvbnN0IG1hcmtlciA9IGAke0NPTlNPTEVfQ0FQVFVSRV9NQVJLRVJfVEFHfV8ke3JhbmRvbVVVSUQoKX1gO1xuICAgIGF3YWl0IGV4ZWMoXG4gICAgICBbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdsb2cnLCAnLXQnLCBDT05TT0xFX0NBUFRVUkVfTUFSS0VSX1RBRywgbWFya2VyXSxcbiAgICAgIHsgaXNRdWlldDogdHJ1ZSwgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWUsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogQURCX0xPR19NQVJLRVJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfVxuICAgICk7XG4gICAgcmV0dXJuIHsgbWFya2VyIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FwdHVyZXMgYSBQTkcgc2NyZWVuc2hvdCBvZiB0aGUgZGV2aWNlJ3Mgc2NyZWVuLlxuICAgKlxuICAgKiBUaGUgaW1hZ2UgaXMgYWx3YXlzIHRoZSBkZXZpY2UncyBuYXRpdmUgZnJhbWVidWZmZXIgXHUyMDE0IHRoZXJlIGlzIG5vIG1vYmlsZVxuICAgKiBlcXVpdmFsZW50IG9mIHRoZSBkZXNrdG9wIHZpZXdwb3J0IG92ZXJyaWRlLCBzb1xuICAgKiB7QGxpbmsgQ2FwdHVyZVNjcmVlbnNob3RQYXJhbXMud2lkdGhJblBpeGVsc30gL1xuICAgKiB7QGxpbmsgQ2FwdHVyZVNjcmVlbnNob3RQYXJhbXMuaGVpZ2h0SW5QaXhlbHN9IGFyZSBpZ25vcmVkLiBTaXplIGEgbW9iaWxlXG4gICAqIGNhcHR1cmUgYnkgY2hvb3NpbmcgYW4gQVZEIHdob3NlIHNjcmVlbiBnZW9tZXRyeSBhbHJlYWR5IG1hdGNoZXMgd2hhdCB0aGVcbiAgICogaW1hZ2UgaGFzIHRvIGJlLlxuICAgKlxuICAgKiBAcGFyYW0gX3BhcmFtcyAtIENhcHR1cmUgcGFyYW1ldGVycy4gSWdub3JlZCBvbiBtb2JpbGU6IGBjd2RgIGRvZXMgbm90IHNlbGVjdCBhIHdpbmRvdyAodmF1bHQgdGFyZ2V0aW5nIGlzIHZpYSBsb2NhbFN0b3JhZ2UpLCBhbmQgdGhlIHNpemUgY2Fubm90IGJlIG92ZXJyaWRkZW4uXG4gICAqIEByZXR1cm5zIFRoZSByYXcgUE5HIGJ5dGVzLlxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBkcml2ZXIgcmV0dXJucyBkYXRhIHRoYXQgaXMgbm90IGEgUE5HLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi11dGlscy9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIFBlcm1hbmVudDogYENhcHR1cmVTY3JlZW5zaG90UGFyYW1zYCBpcyBvbmUgYmFnIHNoYXJlZCBieSB0aGUgYGNhcHR1cmVTY3JlZW5zaG90YCBvZiBib3RoIHRyYW5zcG9ydHMsIHNvIG5vIHBlci1vd25lciBuYW1lIGNhbiBzYXRpc2Z5IGJvdGguXG4gIHB1YmxpYyBhc3luYyBjYXB0dXJlU2NyZWVuc2hvdChfcGFyYW1zOiBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gZGVjb2RlQmFzZTY0UG5nKGF3YWl0IHRoaXMuYnJvd3Nlci50YWtlU2NyZWVuc2hvdCgpKTtcbiAgICBpZiAoIWlzUG5nKGJ5dGVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHBpdW0gc2NyZWVuc2hvdCBlcnJvcjogdGFrZVNjcmVlbnNob3QgcmV0dXJuZWQgZGF0YSB0aGF0IGlzIG5vdCBhIFBORy4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnl0ZXM7XG4gIH1cblxuICAvKipcbiAgICogRW5kcyB0aGUgQXBwaXVtIHNlc3Npb24uXG4gICAqXG4gICAqIE9ubHkgZGVsZXRlcyB0aGUgc2Vzc2lvbiBpZiB0aGlzIHRyYW5zcG9ydCBvd25zIGl0LiBUcmFuc3BvcnRzIGNyZWF0ZWRcbiAgICogdmlhIGBhdHRhY2goKWAgKHRlc3Qgd29ya2VycyByZXVzaW5nIHRoZSBnbG9iYWwgc2V0dXAncyBzZXNzaW9uKSBza2lwXG4gICAqIGRlbGV0aW9uIHNvIHRoZSBzZXNzaW9uIHJlbWFpbnMgYXZhaWxhYmxlIGZvciB0aGUgb3duaW5nIHByb2Nlc3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRpc3Bvc2VJbnB1dENoYW5uZWwoKTtcblxuICAgIGlmICh0aGlzLmlzU2Vzc2lvbk93bmVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmJyb3dzZXIuZGVsZXRlU2Vzc2lvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyB0ZWFyZG93biBmb3IgYHByb2Nlc3Mub24oJ2V4aXQnKWAgaGFuZGxlcnMuXG4gICAqXG4gICAqIE9ubHkgdGhlIHRydXN0ZWQtaW5wdXQgY2hhbm5lbCBuZWVkcyBpdDogdGhlIEFwcGl1bSBzZXNzaW9uIGlzIHRoZSBvd25pbmcgcHJvY2VzcydzIHRvIGVuZCwgYW5kIGFuXG4gICAqIGFicnVwdCBleGl0IGlzIGV4YWN0bHkgd2hlbiB0aGUgYXN5bmMge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlfSBuZXZlciBydW5zIFx1MjAxNCB3aGljaCB3b3VsZCBzdHJhbmRcbiAgICogdGhlIGFkYiBwb3J0IGZvcndhcmQgb24gdGhlIGRldmljZS5cbiAgICovXG4gIHB1YmxpYyBkaXNwb3NlU3luYygpOiB2b2lkIHtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5pbnB1dENoYW5uZWw7XG4gICAgdGhpcy5pbnB1dENoYW5uZWwgPSBudWxsO1xuICAgIHRoaXMudW5yZWdpc3RlcklucHV0Q2hhbm5lbEV4aXRIYW5kbGVyKCk7XG4gICAgY2hhbm5lbD8uZGlzcG9zZVN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gaW5zaWRlIE9ic2lkaWFuIE1vYmlsZSdzIFdlYlZpZXcuXG4gICAqXG4gICAqIFN3aXRjaGVzIHRvIHRoZSBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dCwgZXhlY3V0ZXMgdGhlIGV4cHJlc3Npb24sXG4gICAqIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBfb3B0aW9ucyAtIEV2YWx1YXRpb24gb3B0aW9ucyAoY3dkIGlzIG5vdCB1c2VkIG9uIG1vYmlsZSBcdTIwMTQgdmF1bHQgdGFyZ2V0aW5nIGlzIHZpYSBsb2NhbFN0b3JhZ2UpLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi11dGlscy9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIFBlcm1hbmVudDogYFRyYW5zcG9ydEV2YWxPcHRpb25zYCBpcyBvbmUgYmFnIHNoYXJlZCBieSB0aGUgYGV2YWx1YXRlYCBvZiBib3RoIHRyYW5zcG9ydHMsIHNvIG5vIHBlci1vd25lciBuYW1lIGNhbiBzYXRpc2Z5IGJvdGguXG4gIHB1YmxpYyBhc3luYyBldmFsdWF0ZShleHByZXNzaW9uOiBzdHJpbmcsIF9vcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJWaWV3Q29udGV4dCgpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5wdXRDaGFubmVsKCk7XG5cbiAgICB0cnkge1xuICAgICAgLypcbiAgICAgICAqIFRoZSBjYXAgaXMgZW5mb3JjZWQgSEVSRSwgb24gdGhlIE5vZGUgc2lkZSwgYW5kIG5vdCBieSB0aGUgYHRpbWVvdXRzLnNjcmlwdGAgY2FwYWJpbGl0eSB0aGVcbiAgICAgICAqIFNlc3Npb24gYWxzbyBkZWNsYXJlcy4gTWVhc3VyZWQgb24gYSBsaXZlIGVtdWxhdG9yOiB0aGUgY2FwYWJpbGl0eSBpcyBhY2NlcHRlZCBhbmQgcmVhZHNcbiAgICAgICAqIEJhY2sgYXMgMzAwMDAgaW4gdGhlIFdlYlZpZXcgY29udGV4dCwgYW5kIG5vdGhpbmcgZXZlciBlbmZvcmNlcyBpdCBcdTIwMTQgb3Zlci1jYXAgY2xvc3VyZXMgaW4gYm90aCB0aGVcbiAgICAgICAqIFNsZWVwaW5nIGFuZCB0aGUgc3Bpbm5pbmcgc2hhcGUsIHdpdGggYW5kIHdpdGhvdXQgYW4gZXhwbGljaXQgYHNldFRpbWVvdXRzYCwgcmFuIHBhc3QgYSA2MHMgY2VpbGluZ1xuICAgICAgICogV2l0aG91dCBXZWJEcml2ZXIgcmFpc2luZyBgc2NyaXB0IHRpbWVvdXRgIGV2ZW4gb25jZS4gV2hhdCBhY3R1YWxseSBoYXBwZW5zIHBhc3Qgcm91Z2hseSBoYWxmIGFcbiAgICAgICAqIE1pbnV0ZSBpcyB3b3JzZSB0aGFuIGEgbGF0ZSBhbnN3ZXI6IHRoZSBjbG9zdXJlIENPTVBMRVRFUyBpbiB0aGUgZ3Vlc3Qgb24gc2NoZWR1bGUgKHRpbWVycyBhcm1lZCBhdFxuICAgICAgICogMzBzIGFuZCA0MHMgZmlyZWQgd2l0aGluIH4xM21zIG9mIG5vbWluYWwsIG9uIGEgdmlzaWJsZSBhbmQgZm9jdXNlZCBwYWdlKSBhbmQgaXRzIEV4ZWN1dGUgU2NyaXB0XG4gICAgICAgKiBSZXNwb25zZSBuZXZlciByZWFjaGVzIHRoaXMgY2xpZW50IFx1MjAxNCBzbyB0aGUgcHJvbWlzZSBiZWxvdyBzaW1wbHkgbmV2ZXIgc2V0dGxlcy5cbiAgICAgICAqXG4gICAgICAgKiBBIGhhbmcgaXMgdGhlIG9uZSBmYWlsdXJlIG1vZGUgYSB0ZXN0IGF1dGhvciBjYW5ub3QgYWN0IG9uLCBzbyB0aGUgd2FpdCBpcyBib3VuZGVkIGhlcmUuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGVXaXRoaW5DYXAoYHJldHVybiAoJHtleHByZXNzaW9ufSlgKTtcblxuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkIHx8IHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gTk9fT1VUUFVUO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvKlxuICAgICAgICogQSBjYXAgb3ZlcnJ1biBpcyB0aGUgb25lIGZhaWx1cmUgaGVyZSB0aGF0IHNheXMgbm90aGluZyBhYm91dCB0aGUgY29udGV4dDogdGhlIGNsb3N1cmUgb3V0c3RheWVkXG4gICAgICAgKiBJdHMgYnVkZ2V0LCB0aGUgV2ViVmlldyBpcyBzdGlsbCB0aGUgV2ViVmlldy4gUmVzZXR0aW5nIHRoZSBmbGFnIHdvdWxkIGNoYXJnZSB0aGUgTkVYVCBldmFsIGFcbiAgICAgICAqIH4xN3MgYHN3aXRjaENvbnRleHRgICgqKkwxOSoqKSB0byByZWNvdmVyIGZyb20gc29tZXRoaW5nIHRoYXQgd2FzIG5ldmVyIGxvc3QuXG4gICAgICAgKi9cbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEV2YWxDYXBFeGNlZWRlZEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICAvLyBDb250ZXh0IG1heSBoYXZlIGJlZW4gbG9zdCBtaWQtZXhlY3V0aW9uIChlLmcuIHBhZ2UgcmVsb2FkKS5cbiAgICAgIHRoaXMuaXNJbldlYlZpZXdDb250ZXh0ID0gZmFsc2U7XG5cbiAgICAgIC8qXG4gICAgICAgKiBLZXB0IGFzIGEgZmFzdCBwYXRoIGV2ZW4gdGhvdWdoIHRoaXMgZHJpdmVyIHdhcyBtZWFzdXJlZCBuZXZlciByYWlzaW5nIGl0OiBpdCBjb3N0cyBub3RoaW5nLFxuICAgICAgICogSXQgaXMgdGhlIGNvcnJlY3QgdHJhbnNsYXRpb24gaWYgYSBmdXR1cmUgZHJpdmVyIGRvZXMgZW5mb3JjZSB0aGUgY2FwYWJpbGl0eSwgYW5kIGl0IGtlZXBzIHRoZSB0d29cbiAgICAgICAqIFRyYW5zcG9ydHMgcmVwb3J0aW5nIG9uZSBlcnJvciBmb3Igb25lIGNvbmRpdGlvbi5cbiAgICAgICAqL1xuICAgICAgaWYgKGlzU2NyaXB0VGltZW91dEVycm9yKGVycm9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXZhbENhcEV4Y2VlZGVkRXJyb3Ioe1xuICAgICAgICAgIGNhcEluTWlsbGlzZWNvbmRzOiB0aGlzLnNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgb3B0aW9uTmFtZTogJ3NjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcycsXG4gICAgICAgICAgdHJhbnNwb3J0TmFtZTogJ0FuZHJvaWQgKEFwcGl1bSknXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2Vzc2lvbiBjb25uZWN0aW9uIGluZm8gbmVlZGVkIHRvIHJlYXR0YWNoIHRvIHRoaXMgc2Vzc2lvblxuICAgKiBmcm9tIGFub3RoZXIgcHJvY2VzcyAoZS5nLiBhIHRlc3Qgd29ya2VyKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHNlc3Npb24gSUQgYW5kIGRldmljZSBJRC5cbiAgICovXG4gIHB1YmxpYyBnZXRTZXNzaW9uSW5mbygpOiBBcHBpdW1TZXNzaW9uSW5mbyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRldmljZUlkOiB0aGlzLmRldmljZUlkLFxuICAgICAgc2Vzc2lvbklkOiB0aGlzLmJyb3dzZXIuc2Vzc2lvbklkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSBPYnNpZGlhbiBhcHAgaXMgcnVubmluZyBhbmQgdGhlIFdlYlZpZXcgaXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gX3ZhdWx0UGF0aCAtIE5vdCB1c2VkIG9uIG1vYmlsZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwcmVmbGlnaHRDaGVjayhfdmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBSdW5uaW5nIHByZWZsaWdodCBjaGVjay4uLicpO1xuICAgIGNvbnN0IHN0YXRlID0gYXdhaXQgdGhpcy5icm93c2VyLnF1ZXJ5QXBwU3RhdGUodGhpcy5hcHBJZCk7XG4gICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gQXBwIHN0YXRlOiAke1N0cmluZyhzdGF0ZSl9IChuZWVkICR7U3RyaW5nKEFQUF9TVEFURV9GT1JFR1JPVU5EKX09Zm9yZWdyb3VuZClgKTtcbiAgICBpZiAoc3RhdGUgIT09IEFQUF9TVEFURV9GT1JFR1JPVU5EKSB7XG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBBY3RpdmF0aW5nIGFwcCAke3RoaXMuYXBwSWR9Li4uYCk7XG4gICAgICB0aGlzLmlzSW5XZWJWaWV3Q29udGV4dCA9IGZhbHNlO1xuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLmFjdGl2YXRlQXBwKHRoaXMuYXBwSWQpO1xuICAgICAgYXdhaXQgZGVsYXkoQVBQX1JFU1RBUlRfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlZpZXdDb250ZXh0KCk7XG4gICAgbG9nKCdbYXBwaXVtLXRyYW5zcG9ydF0gUHJlZmxpZ2h0IGNoZWNrIHBhc3NlZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXNoZXMgdmF1bHQgZmlsZXMgdG8gdGhlIGRldmljZSB2aWEgY29tcHJlc3NlZCBgYWRiIHB1c2hgLlxuICAgKlxuICAgKiBDcmVhdGVzIGEgdGFyLmd6IGFyY2hpdmUgb2YgdGhlIGxvY2FsIHZhdWx0IGRpcmVjdG9yeSwgcHVzaGVzIGl0IHRvIHRoZVxuICAgKiBkZXZpY2UgYXMgYSBzaW5nbGUgZmlsZSwgYW5kIGV4dHJhY3RzIGl0IGluLXBsYWNlLiBUaGlzIGF2b2lkcyB0aGVcbiAgICogd2ViZHJpdmVyIGBSYW5nZUVycm9yYCBvbiBsYXJnZSBiYXNlNjQgcGF5bG9hZHMgYW5kIGlzIHNpZ25pZmljYW50bHlcbiAgICogZmFzdGVyIHRoYW4gcGVyLWZpbGUgYGJyb3dzZXIucHVzaEZpbGUoKWAgY2FsbHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCAodXNlZCBhcyB0aGUgdmF1bHQgZGlyZWN0b3J5IG5hbWUgb24gZGV2aWNlKS5cbiAgICogQHBhcmFtIF9maWxlcyAtIE1hcCBvZiByZWxhdGl2ZSBmaWxlIHBhdGhzIHRvIGNvbnRlbnQgYnVmZmVycyAodW51c2VkIFx1MjAxNCBhZGIgcHVzaGVzIHRoZSBkaXJlY3RvcnkgZGlyZWN0bHkpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHB1c2hGaWxlcyh2YXVsdFBhdGg6IHN0cmluZywgX2ZpbGVzOiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5Pik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRldmljZVZhdWx0UGF0aCA9IHRoaXMuZ2V0RGV2aWNlVmF1bHRQYXRoKHZhdWx0UGF0aCk7XG4gICAgY29uc3QgYXJjaGl2ZU5hbWUgPSBgdmF1bHQtJHtyYW5kb21VVUlEKCl9LnRhci5nemA7XG4gICAgY29uc3QgbG9jYWxBcmNoaXZlID0gam9pbih0bXBkaXIoKSwgYXJjaGl2ZU5hbWUpO1xuICAgIGNvbnN0IHJlbW90ZUFyY2hpdmUgPSBgL2RhdGEvbG9jYWwvdG1wLyR7YXJjaGl2ZU5hbWV9YDtcblxuICAgIHRyeSB7XG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBDcmVhdGluZyBhcmNoaXZlOiAke2xvY2FsQXJjaGl2ZX1gKTtcbiAgICAgIGF3YWl0IGV4ZWMoWyd0YXInLCAnY3pmJywgYXJjaGl2ZU5hbWUsICctQycsIHZhdWx0UGF0aCwgJy4nXSwgeyBjd2Q6IHRtcGRpcigpLCBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBQdXNoaW5nIGFyY2hpdmUgdG8gZGV2aWNlICR7dGhpcy5kZXZpY2VJZH0uLi5gKTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAncHVzaCcsIGxvY2FsQXJjaGl2ZSwgcmVtb3RlQXJjaGl2ZV0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcblxuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gRXh0cmFjdGluZyBhcmNoaXZlIG9uIGRldmljZSBhdCAke2RldmljZVZhdWx0UGF0aH0uLi5gKTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAnbWtkaXInLCAnLXAnLCBkZXZpY2VWYXVsdFBhdGhdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ3RhcicsICd4emYnLCByZW1vdGVBcmNoaXZlLCAnLUMnLCBkZXZpY2VWYXVsdFBhdGhdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIEZsdXNoaW5nIGZpbGVzeXN0ZW0gYnVmZmVycy4uLicpO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdzeW5jJ10sIHsgaXNRdWlldDogdHJ1ZSB9KTtcblxuICAgICAgbG9nKCdbYXBwaXVtLXRyYW5zcG9ydF0gQ2xlYW5pbmcgdXAgcmVtb3RlIGFyY2hpdmUuLi4nKTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAncm0nLCByZW1vdGVBcmNoaXZlXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBybShsb2NhbEFyY2hpdmUsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIER1bXBzIGBhZGIgbG9nY2F0YCBhbmQgcmV0dXJucyB0aGUgV2ViVmlldyBjb25zb2xlL2Vycm9yIG91dHB1dCBsb2dnZWRcbiAgICogc2luY2UgdGhlIG1hcmtlciBmcm9tIHtAbGluayBBcHBpdW1UcmFuc3BvcnQuYmVnaW5Db25zb2xlQ2FwdHVyZX0uXG4gICAqXG4gICAqIEZpbHRlcnMgdG8gdGhlIENocm9taXVtL1dlYlZpZXcgdGFncyB0aGF0IGNhcnJ5IEpTIGBjb25zb2xlLipgIG91dHB1dCBhbmRcbiAgICogdW5jYXVnaHQgZXJyb3JzLCBhbmQgY2FwcyB0aGUgcmVzdWx0IGxlbmd0aC4gQm91bmRlZCwgcG9zdC1ob2MsXG4gICAqIGZhaWx1cmUtcGF0aC1vbmx5IFx1MjAxNCBuZXZlciBhIGxpdmUgbW9uaXRvci5cbiAgICpcbiAgICogQHBhcmFtIGhhbmRsZSAtIFRoZSBjYXB0dXJlIGhhbmRsZSAob3IgYHVuZGVmaW5lZGAgd2hlbiBjYXB0dXJlIG5ldmVyIHN0YXJ0ZWQpLlxuICAgKiBAcmV0dXJucyBUaGUgY2FwdHVyZWQgY29uc29sZS9lcnJvciB0ZXh0LCBvciBgdW5kZWZpbmVkYCBpZiBub3RoaW5nIHJlbGV2YW50IHdhcyBsb2dnZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVhZENvbnNvbGVDYXB0dXJlU2luY2UoaGFuZGxlOiBDb25zb2xlQ2FwdHVyZUhhbmRsZSB8IHVuZGVmaW5lZCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCFoYW5kbGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZHVtcCA9IGF3YWl0IGV4ZWMoXG4gICAgICBbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdsb2djYXQnLCAnLWQnLCAnLXYnLCAndGltZSddLFxuICAgICAgeyBpc1F1aWV0OiB0cnVlLCBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZSwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBMT0dDQVRfRFVNUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9XG4gICAgKTtcblxuICAgIGNvbnN0IG1hcmtlckluZGV4ID0gZHVtcC5sYXN0SW5kZXhPZihoYW5kbGUubWFya2VyKTtcbiAgICBjb25zdCByZWdpb24gPSBtYXJrZXJJbmRleCA9PT0gLTEgPyBkdW1wIDogZHVtcC5zbGljZShtYXJrZXJJbmRleCArIGhhbmRsZS5tYXJrZXIubGVuZ3RoKTtcbiAgICBjb25zdCByZWxldmFudCA9IHJlZ2lvblxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLmZpbHRlcigobGluZSkgPT4gQ09OU09MRV9DQVBUVVJFX1RBR19SRS50ZXN0KGxpbmUpKVxuICAgICAgLmpvaW4oJ1xcbicpXG4gICAgICAudHJpbSgpO1xuXG4gICAgaWYgKCFyZWxldmFudCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVsZXZhbnQuc2xpY2UoLUNPTlNPTEVfQ0FQVFVSRV9UQUlMX01BWF9MRU5HVEgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHZhdWx0IG9uIG1vYmlsZSBieSBwdXNoaW5nIGZpbGVzIGFuZCBjb25maWd1cmluZyBsb2NhbFN0b3JhZ2UuXG4gICAqXG4gICAqIFRoZSByZWdpc3RyYXRpb24gZmxvdzpcbiAgICogMS4gUHVzaCBhIG1pbmltYWwgYC5vYnNpZGlhbi9hcHAuanNvbmAgdG8gdGhlIGRldmljZSBzbyBPYnNpZGlhbiByZWNvZ25pemVzIHRoZSB2YXVsdFxuICAgKiAyLiBTd2l0Y2ggdG8gdGhlIFdlYlZpZXcgY29udGV4dFxuICAgKiAzLiBBZGQgdGhlIHZhdWx0IHRvIGxvY2FsU3RvcmFnZSAoYG1vYmlsZS1leHRlcm5hbC12YXVsdHNgLCBgbW9iaWxlLXNlbGVjdGVkLXZhdWx0YCxcbiAgICogICAgYGVuYWJsZS1wbHVnaW4tPHBhdGg+YClcbiAgICogNC4gVHJpZ2dlciBgbG9jYXRpb24ucmVsb2FkKClgIHNvIE9ic2lkaWFuIHJlLXJlYWRzIGxvY2FsU3RvcmFnZSBhbmQgb3BlbnMgdGhlIHZhdWx0XG4gICAqIDUuIFdhaXQgZm9yIGBnbG9iYWxUaGlzLmFwcGAgdG8gZXhpc3QgKHRoZSBhcHAncyBjb2xkIHN0YXJ0KSwgdGhlbiBcdTIwMTQgb24gYVxuICAgKiAgICBzZXBhcmF0ZSwgdGlnaHRlciBidWRnZXQgXHUyMDE0IGZvciBgYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeWBcbiAgICpcbiAgICogRXhpc3RpbmcgdmF1bHQgcmVnaXN0cmF0aW9ucyBpbiBsb2NhbFN0b3JhZ2UgYXJlIHByZXNlcnZlZCAoYXBwZW5kLCBub3RcbiAgICogb3ZlcndyaXRlKSBcdTIwMTQgZXhjZXB0IHRoZSAqKmhhcm5lc3MncyBvd24qKiBgdGVtcC12YXVsdC0qYCByZWdpc3RyYXRpb25zIGZyb21cbiAgICogZWFybGllciBydW5zLCB3aGljaCBhcmUgcHJ1bmVkIHdoZW4ge0BsaW5rIEFwcGl1bVRyYW5zcG9ydENvbmZpZy5zaG91bGRTd2VlcExlZnRvdmVyc31cbiAgICogaXMgb24uIFRoZWlyIGRpcmVjdG9yaWVzIGFyZSBhbHJlYWR5IGdvbmUgKHRoZSBmYWN0b3J5IHN3ZWVwcyB0aGVtIGJlZm9yZVxuICAgKiB0aGUgYXBwIGxhdW5jaGVzKSwgYW5kIGl0IGlzIHRoaXMgcmVnaXN0cnkgXHUyMDE0IG5vdCB0aGUgZmlsZXN5c3RlbSBcdTIwMTQgdGhhdFxuICAgKiBPYnNpZGlhbiBlbnVtZXJhdGVzIGF0IHN0YXJ0dXAsIHNvIGxlYXZpbmcgdGhlbSBpcyB3aGF0IG1ha2VzIGVhY2ggZmFpbGVkXG4gICAqIHJ1biBzbG93IHRoZSBuZXh0IG9uZSBkb3duLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IG9uIHRoZSBob3N0IG1hY2hpbmUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFJlZ2lzdGVyaW5nIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBjb25zdCBkZXZpY2VWYXVsdFBhdGggPSB0aGlzLmdldERldmljZVZhdWx0UGF0aCh2YXVsdFBhdGgpO1xuXG4gICAgLy8gUHVzaCBhIG1pbmltYWwgLm9ic2lkaWFuIGRpcmVjdG9yeSBzbyBPYnNpZGlhbiByZWNvZ25pemVzIGl0IGFzIGEgdmF1bHQuXG4gICAgYXdhaXQgdGhpcy5wdXNoT2JzaWRpYW5NYXJrZXIoZGV2aWNlVmF1bHRQYXRoKTtcblxuICAgIC8vIFN3aXRjaCB0byBXZWJWaWV3IGFuZCBjb25maWd1cmUgbG9jYWxTdG9yYWdlLlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlV2ViVmlld0NvbnRleHQoKTtcblxuICAgIC8vIEludmFsaWRhdGUgYmVmb3JlIHJlbG9hZCBcdTIwMTQgdGhlIHBhZ2Ugd2lsbCBuYXZpZ2F0ZSBhbmQgdGhlIFdlYlZpZXdcbiAgICAvLyBjb250ZXh0IG1heSBiZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSBkdXJpbmcgcmVsb2FkLlxuICAgIHRoaXMuaXNJbldlYlZpZXdDb250ZXh0ID0gZmFsc2U7XG5cbiAgICBjb25zdCBzdGFsZVByZWZpeCA9IHRoaXMuc2hvdWxkU3dlZXBMZWZ0b3ZlcnMgPyBgJHt0aGlzLnZhdWx0QmFzZVBhdGh9JHtURU1QX1ZBVUxUX0RJUl9QUkVGSVh9YCA6ICcnO1xuXG4gICAgYXdhaXQgdGhpcy5icm93c2VyLmV4ZWN1dGUoXG4gICAgICAocGF0aDogc3RyaW5nLCBwcnVuZVByZWZpeDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGxldCBleGlzdGluZyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21vYmlsZS1leHRlcm5hbC12YXVsdHMnKSA/PyAnW10nKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICBpZiAocHJ1bmVQcmVmaXgpIHtcbiAgICAgICAgICBjb25zdCBzdGFsZSA9IGV4aXN0aW5nLmZpbHRlcigocmVnaXN0ZXJlZCkgPT4gcmVnaXN0ZXJlZCAhPT0gcGF0aCAmJiByZWdpc3RlcmVkLnN0YXJ0c1dpdGgocHJ1bmVQcmVmaXgpKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJlZ2lzdGVyZWQgb2Ygc3RhbGUpIHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGBlbmFibGUtcGx1Z2luLSR7cmVnaXN0ZXJlZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXhpc3RpbmcgPSBleGlzdGluZy5maWx0ZXIoKHJlZ2lzdGVyZWQpID0+ICFzdGFsZS5pbmNsdWRlcyhyZWdpc3RlcmVkKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWV4aXN0aW5nLmluY2x1ZGVzKHBhdGgpKSB7XG4gICAgICAgICAgZXhpc3RpbmcucHVzaChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbW9iaWxlLWV4dGVybmFsLXZhdWx0cycsIEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nKSk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdtb2JpbGUtc2VsZWN0ZWQtdmF1bHQnLCBwYXRoKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYGVuYWJsZS1wbHVnaW4tJHtwYXRofWAsICd0cnVlJyk7XG4gICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgfSxcbiAgICAgIGRldmljZVZhdWx0UGF0aCxcbiAgICAgIHN0YWxlUHJlZml4XG4gICAgKTtcblxuICAgIC8vIFdhaXQgZm9yIHJlbG9hZCArIHZhdWx0IGluaXRpYWxpemF0aW9uLCBhcyB0d28gc2VwYXJhdGVseSBidWRnZXRlZCBwaGFzZXM6XG4gICAgLy8gVGhlIGFwcCdzIGNvbGQgc3RhcnQgZmlyc3QsIHRoZW4gT2JzaWRpYW4ncyBvd24gd29yay4gU2VlIGB3YWl0Rm9yQXBwU3RhcnRlZGAuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yQXBwU3RhcnRlZCgpO1xuICAgIGF3YWl0IHRoaXMud2FpdEZvckxheW91dFJlYWR5KCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBvbiBtb2JpbGUgYnkgcmVtb3ZpbmcgaXQgZnJvbSBsb2NhbFN0b3JhZ2UuXG4gICAqXG4gICAqIFByZXNlcnZlcyBvdGhlciB2YXVsdCByZWdpc3RyYXRpb25zLiBJZiB0aGUgdW5yZWdpc3RlcmVkIHZhdWx0IHdhcyBzZWxlY3RlZCxcbiAgICogc3dpdGNoZXMgdG8gdGhlIGZpcnN0IHJlbWFpbmluZyB2YXVsdCAob3IgY2xlYXJzIHRoZSBzZWxlY3Rpb24pLlxuICAgKlxuICAgKiBUaGUgdmF1bHQncyAqKmZpbGVzIGFyZSB0aGVuIHJlbW92ZWQgZnJvbSB0aGUgZGV2aWNlIG92ZXIgYGFkYmAsIHdoZXRoZXIgb3JcbiAgICogbm90IHRoZSBgbG9jYWxTdG9yYWdlYCBzdGVwIHN1Y2NlZWRlZCoqIFx1MjAxNCBkZWxpYmVyYXRlbHksIGJlY2F1c2UgdGhlXG4gICAqIGBsb2NhbFN0b3JhZ2VgIHN0ZXAgZ29lcyB0aHJvdWdoIHRoZSBXZWJWaWV3IGFuZCBhIGRlYWQgV2ViVmlldyBpcyBleGFjdGx5XG4gICAqIHdoYXQgbW9zdCBBbmRyb2lkIGZhaWx1cmVzIGFyZS4gUm91dGluZyB0aGUgcmVtb3ZhbCB0aHJvdWdoIHRoZSBhcHAgd2FzIHdoYXRcbiAgICogbWFkZSBldmVyeSBmYWlsZWQgcnVuIGxlYWsgaXRzIHZhdWx0IChgVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogbm9cbiAgICogc3VjaCB3aW5kb3dgKSwgc28gdGhlIGZpbGVzeXN0ZW0tbGV2ZWwgcmVtb3ZhbCBtdXN0IG5vdCBkZXBlbmQgb24gaXQuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgb24gdGhlIGhvc3QgbWFjaGluZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZXZpY2VWYXVsdFBhdGggPSB0aGlzLmdldERldmljZVZhdWx0UGF0aCh2YXVsdFBhdGgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlV2ViVmlld0NvbnRleHQoKTtcblxuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLmV4ZWN1dGUoKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21vYmlsZS1leHRlcm5hbC12YXVsdHMnKSA/PyAnW10nKSBhcyBzdHJpbmdbXTtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBleGlzdGluZy5maWx0ZXIoKHYpID0+IHYgIT09IHBhdGgpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbW9iaWxlLWV4dGVybmFsLXZhdWx0cycsIEpTT04uc3RyaW5naWZ5KGZpbHRlcmVkKSk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGBlbmFibGUtcGx1Z2luLSR7cGF0aH1gKTtcbiAgICAgICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtb2JpbGUtc2VsZWN0ZWQtdmF1bHQnKSA9PT0gcGF0aCkge1xuICAgICAgICAgIGlmIChmaWx0ZXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbW9iaWxlLXNlbGVjdGVkLXZhdWx0JywgZmlsdGVyZWRbMF0gPz8gJycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnbW9iaWxlLXNlbGVjdGVkLXZhdWx0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBkZXZpY2VWYXVsdFBhdGgpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coXG4gICAgICAgIGBbYXBwaXVtLXRyYW5zcG9ydF0gQ291bGQgbm90IGRlcmVnaXN0ZXIgJHtkZXZpY2VWYXVsdFBhdGh9IGZyb20gbG9jYWxTdG9yYWdlIGBcbiAgICAgICAgICArIGAoJHtTdHJpbmcoZXJyb3IpfSk7IHJlbW92aW5nIGl0cyBmaWxlcyBhbnl3YXkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnJlbW92ZURldmljZVZhdWx0RGlyZWN0b3J5KGRldmljZVZhdWx0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwsIGlmIG9uZSBpcyBvcGVuLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwb3NlSW5wdXRDaGFubmVsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmlucHV0Q2hhbm5lbDtcbiAgICB0aGlzLmlucHV0Q2hhbm5lbCA9IG51bGw7XG4gICAgdGhpcy51bnJlZ2lzdGVySW5wdXRDaGFubmVsRXhpdEhhbmRsZXIoKTtcbiAgICBhd2FpdCBjaGFubmVsPy5kaXNwb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIHRydXN0ZWQtaW5wdXQgY2hhbm5lbCBpZiBpdCBpcyBub3QgYWxyZWFkeSBvcGVuLCBhbmQgcmUtb3BlbnMgaXQgaWYgdGhlIFdlYlZpZXcgd2VudCBhd2F5LlxuICAgKlxuICAgKiBJbnN0YWxscyBhIGBSdW50aW1lLmFkZEJpbmRpbmdgIGZ1bmN0aW9uIG9uIHRoZSBwYWdlIGFuZCBzZXJ2aWNlcyBldmVyeSBjYWxsIHRvIGl0IGZvciB0aGUgbGlmZSBvZiB0aGVcbiAgICogY29ubmVjdGlvbi4gVGhlIGJpbmRpbmcgaXMgZXhwb3NlZCBvbiAqZXZlcnkqIGV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSBwYWdlLCBzbyBpdCBzdXJ2aXZlcyB0aGVcbiAgICogYGxvY2F0aW9uLnJlbG9hZCgpYCB0aGF0IHtAbGluayBBcHBpdW1UcmFuc3BvcnQucmVnaXN0ZXJWYXVsdH0gcGVyZm9ybXM7IG9ubHkgYSBmdWxsIGFwcCByZXN0YXJ0LCB3aGljaFxuICAgKiBkZXN0cm95cyB0aGUgV2ViVmlldyB0YXJnZXQsIG5lZWRzIHRoZSByZWNvbm5lY3QgYmVsb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUlucHV0Q2hhbm5lbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pbnB1dENoYW5uZWw/LmlzT3BlbiB8fCB0aGlzLmlzSW5wdXRDaGFubmVsVW5hdmFpbGFibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgY2hhbm5lbCBpcyByZWFjaGFibGUgb25seSBvdmVyIGxvY2FsIGBhZGJgLCBzbyBpdCBkb2VzIG5vdCBleGlzdCBvbiBpT1Mgb3IgYWdhaW5zdCBhIHJlbW90ZSBodWJcbiAgICAvLyAoQnJvd3NlclN0YWNrKS4gVGhvc2UgYXJlIHN1cHBvcnRlZCB0cmFuc3BvcnRzLCBzbyB0aGlzIHN0YXlzICoqYmVzdC1lZmZvcnQqKjogYSBydW4gdGhhdCBuZXZlclxuICAgIC8vIGRyaXZlcyBpbnB1dCBtdXN0IG5vdCBmYWlsIGJlY2F1c2UgdGhlIGNoYW5uZWwgY291bGQgbm90IGJlIG9wZW5lZC4gQSBydW4gdGhhdCAqZG9lcyogZHJpdmUgaW5wdXRcbiAgICAvLyBnZXRzIGEgbGVnaWJsZSBlcnJvciBmcm9tIHRoZSByZW5kZXJlcidzIG93biBndWFyZCwgd2hpY2ggbmFtZXMgdGhlIG1pc3NpbmcgY2hhbm5lbC5cbiAgICBpZiAodGhpcy5wbGF0Zm9ybSAhPT0gJ2FuZHJvaWQnKSB7XG4gICAgICB0aGlzLmlzSW5wdXRDaGFubmVsVW5hdmFpbGFibGUgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZGlzcG9zZUlucHV0Q2hhbm5lbCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBhd2FpdCBjb25uZWN0VG9XZWJWaWV3Q2RwKHsgYXBwSWQ6IHRoaXMuYXBwSWQsIGRldmljZUlkOiB0aGlzLmRldmljZUlkIH0pO1xuICAgICAgYXdhaXQgY29ubmVjdGlvbi5zZW5kKCdSdW50aW1lLmVuYWJsZScpO1xuICAgICAgYXdhaXQgY29ubmVjdGlvbi5zZW5kKCdSdW50aW1lLmFkZEJpbmRpbmcnLCB7IG5hbWU6IE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUgfSk7XG4gICAgICBjb25uZWN0aW9uLm9uKCdSdW50aW1lLmJpbmRpbmdDYWxsZWQnLCAocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4ge1xuICAgICAgICBpZiAocGFyYW1zWyduYW1lJ10gIT09IE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXlsb2FkID0gcGFyYW1zWydwYXlsb2FkJ107XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBub3QgYXdhaXRlZDogdGhpcyBydW5zIHdoaWxlIHRoZSByZW5kZXJlcidzIGBFeGVjdXRlIFNjcmlwdGAgaXMgc3RpbGwgcGVuZGluZywgYW5kXG4gICAgICAgIC8vIHRoYXQgaXMgdGhlIHdob2xlIHBvaW50IFx1MjAxNCB0aGUgcmVxdWVzdCBpcyBzZXJ2aWNlZCBjb25jdXJyZW50bHkgYW5kIGFuc3dlcmVkIGJ5IHJlc29sdmluZyB0aGVcbiAgICAgICAgLy8gcmVuZGVyZXIncyBwcm9taXNlIG92ZXIgdGhpcyBzYW1lIHNvY2tldC4gSXQgaGFuZGxlcyBpdHMgb3duIGZhaWx1cmVzLCBzbyBub3RoaW5nIHJlYWNoZXMgaGVyZS5cbiAgICAgICAgdGhpcy5oYW5kbGVJbnB1dFJlcXVlc3QoY29ubmVjdGlvbiwgdHlwZW9mIHBheWxvYWQgPT09ICdzdHJpbmcnID8gcGF5bG9hZCA6ICcnKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gVW5yZWFjaGFibGU6IGBoYW5kbGVJbnB1dFJlcXVlc3RgIG5ldmVyIHJlamVjdHMuXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuaW5wdXRDaGFubmVsID0gY29ubmVjdGlvbjtcblxuICAgICAgLy8gU2VsZi1jbGVhbmluZywgZGVsaWJlcmF0ZWx5OiB0aGlzIHRyYW5zcG9ydCBjYW4gYmUgY3JlYXRlZCBzdHJhaWdodCBmcm9tIGEgdGVzdCB3b3JrZXIsIHdpdGggbm9cbiAgICAgIC8vIGBjb3JlU2V0dXBgIG93bmluZyBpdHMgbGlmZWN5Y2xlIGFuZCB0aGVyZWZvcmUgbm90aGluZyB0aGF0IGV2ZXIgY2FsbHMgYGRpc3Bvc2VgL2BkaXNwb3NlU3luY2AgXHUyMDE0XG4gICAgICAvLyB3aGljaCBpcyBob3cgYSBydW4gbGVhdmVzIGl0cyBhZGIgcG9ydCBmb3J3YXJkIHN0cmFuZGVkIG9uIHRoZSBkZXZpY2UgKG9ic2VydmVkIDIwMjYtMDgtMzApLiBUaGVcbiAgICAgIC8vIGhhbmRsZXIgaXMgcmVtb3ZlZCBhZ2FpbiBvbiBkaXNwb3NhbCBzbyByZWNvbm5lY3RzIGRvIG5vdCBzdGFjayBsaXN0ZW5lcnMuXG4gICAgICB0aGlzLmRpc3Bvc2VJbnB1dENoYW5uZWxPbkV4aXQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbm5lY3Rpb24uZGlzcG9zZVN5bmMoKTtcbiAgICAgIH07XG4gICAgICBwcm9jZXNzLm9uY2UoJ2V4aXQnLCB0aGlzLmRpc3Bvc2VJbnB1dENoYW5uZWxPbkV4aXQpO1xuXG4gICAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBUcnVzdGVkLWlucHV0IGNoYW5uZWwgb3Blbi4nKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gR2l2ZSB1cCBmb3IgdGhlIGxpZmUgb2YgdGhlIHRyYW5zcG9ydCByYXRoZXIgdGhhbiBwYXlpbmcgYW4gYGFkYmAgcm91bmQtdHJpcCBvbiBldmVyeSBldmFsLlxuICAgICAgLy8gQSBzb2NrZXQgdGhhdCBtZXJlbHkgKmNsb3NlZCogYWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbm5lY3QgaXMgYSBkaWZmZXJlbnQgY2FzZSBcdTIwMTQgYGlzT3BlbmAgaXMgZmFsc2VcbiAgICAgIC8vIHRoZXJlIHdoaWxlIHRoaXMgZmxhZyBzdGF5cyB1bnNldCwgc28gdGhlIHJlY29ubmVjdCBhYm92ZSBzdGlsbCBydW5zLlxuICAgICAgdGhpcy5pc0lucHV0Q2hhbm5lbFVuYXZhaWxhYmxlID0gdHJ1ZTtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFRydXN0ZWQgaW5wdXQgaXMgdW5hdmFpbGFibGUgb24gdGhpcyBkZXZpY2U6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaGVzIHRoZSBkcml2ZXIgdG8gdGhlIGBXRUJWSUVXX21kLm9ic2lkaWFuYCBjb250ZXh0LlxuICAgKlxuICAgKiBJZiB0aGUgY29udGV4dCB3YXMgYWxyZWFkeSB2ZXJpZmllZCAoY2FjaGVkIHZpYSB7QGxpbmsgaXNJbldlYlZpZXdDb250ZXh0fSksXG4gICAqIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aG91dCBjYWxsaW5nIGBnZXRDb250ZXh0cygpYCBcdTIwMTQgd2hpY2ggcnVuc1xuICAgKiBgYWRiIHNoZWxsIGNhdCAvcHJvYy9uZXQvdW5peGAgYW5kIGNhbiB0aW1lIG91dCBvbiBzbG93IGVtdWxhdG9ycy5cbiAgICpcbiAgICogUG9sbHMgdW50aWwgdGhlIGNvbnRleHQgYmVjb21lcyBhdmFpbGFibGUgKHRoZSBhcHAgbWF5IHN0aWxsIGJlIGxvYWRpbmcpLlxuICAgKiBVc2VzIHRoZSBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dCBzcGVjaWZpY2FsbHkgdG8gYXZvaWQgY29ubmVjdGluZ1xuICAgKiB0byBDaHJvbWUgb3Igb3RoZXIgV2ViVmlld3Mgb24gdGhlIGRldmljZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlV2ViVmlld0NvbnRleHQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbldlYlZpZXdDb250ZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGhpcy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzO1xuICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFdhaXRpbmcgZm9yICR7V0VCVklFV19DT05URVhUX1BSRUZJWH0gY29udGV4dCAodGltZW91dD0ke1N0cmluZyh0aGlzLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zKS4uLmApO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgY29udGV4dHMgPSBhd2FpdCB0aGlzLmJyb3dzZXIuZ2V0Q29udGV4dHMoKTtcbiAgICAgIGNvbnN0IG9ic2lkaWFuQ29udGV4dCA9IGNvbnRleHRzLmZpbmQoKGNvbnRleHQpOiBjb250ZXh0IGlzIHN0cmluZyA9PiB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycgJiYgY29udGV4dC5zdGFydHNXaXRoKFdFQlZJRVdfQ09OVEVYVF9QUkVGSVgpKTtcblxuICAgICAgaWYgKG9ic2lkaWFuQ29udGV4dCkge1xuICAgICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBGb3VuZCBXZWJWaWV3IGNvbnRleHQ6ICR7b2JzaWRpYW5Db250ZXh0fWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5zd2l0Y2hDb250ZXh0KG9ic2lkaWFuQ29udGV4dCk7XG4gICAgICAgICAgdGhpcy5pc0luV2ViVmlld0NvbnRleHQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBzd2l0Y2hDb250ZXh0IGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfS4gUmVzZXR0aW5nIHRvIE5BVElWRV9BUFAgYmVmb3JlIHJldHJ5aW5nLi4uYCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5zd2l0Y2hDb250ZXh0KCdOQVRJVkVfQVBQJyk7XG4gICAgICAgICAgfSBjYXRjaCAocmVzZXRFcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gTkFUSVZFX0FQUCByZXNldCBhbHNvIGZhaWxlZDogJHtTdHJpbmcocmVzZXRFcnJvcil9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFdlYlZpZXcgbm90IHJlYWR5LCBhdmFpbGFibGUgY29udGV4dHM6ICR7SlNPTi5zdHJpbmdpZnkoY29udGV4dHMpfS4gUmV0cnlpbmcuLi5gKTtcbiAgICAgIGF3YWl0IGRlbGF5KFdFQlZJRVdfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgTm8gJHtXRUJWSUVXX0NPTlRFWFRfUFJFRklYfSBjb250ZXh0IGZvdW5kIHdpdGhpbiAke1N0cmluZyh0aGlzLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLiBJcyB0aGUgT2JzaWRpYW4gYXBwIGZ1bGx5IGxvYWRlZD9gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG9uZSBFeGVjdXRlIFNjcmlwdCB1bmRlciB0aGUgcGVyLWV2YWwgY2FwLCByYWlzaW5nIHtAbGluayBFdmFsQ2FwRXhjZWVkZWRFcnJvcn0gaWYgaXQgb3V0bGFzdHMgaXQuXG4gICAqXG4gICAqIFRoZSBjYXAgY292ZXJzIHRoZSBzY3JpcHQgQUxPTkUgXHUyMDE0IGBlbnN1cmVXZWJWaWV3Q29udGV4dGAgYW5kIGBlbnN1cmVJbnB1dENoYW5uZWxgIHJ1biBiZWZvcmUgaXQsXG4gICAqIGJlY2F1c2UgYSBgc3dpdGNoQ29udGV4dGAgbGVnaXRpbWF0ZWx5IGNvc3RzIH4xN3MgKCoqTDE5KiopIGFuZCBjaGFyZ2luZyB0aGF0IHRvIGEgdGVzdCdzIG93biBidWRnZXRcbiAgICogd291bGQgcmVwb3J0IHRoZSBoYXJuZXNzJ3Mgc2V0dXAgYXMgdGhlIHRlc3QncyBvdmVycnVuLlxuICAgKlxuICAgKiBUaGUgYWJhbmRvbmVkIHJlcXVlc3QgaXMgZGVsaWJlcmF0ZWx5IGxlZnQgaW4gZmxpZ2h0IHJhdGhlciB0aGFuIGNhbmNlbGxlZC4gTm90aGluZyBjYW4gY2FuY2VsIGl0OlxuICAgKiBgUnVudGltZS50ZXJtaW5hdGVFeGVjdXRpb25gIG92ZXIgdGhlIHRyYW5zcG9ydCdzIG93biBDRFAgY2hhbm5lbCB3YXMgbWVhc3VyZWQgcmVsZWFzaW5nIG5vdGhpbmcsXG4gICAqIGFuZCBhIGd1ZXN0LXNpZGUgYWJvcnQgaG9vayBjb3VsZCBub3QgZXZlbiBiZSBpbnN0YWxsZWQgaW4gdGltZS4gV2hhdCB0aGUgc2FtZSBydW5zIGRpZCBzaG93IGlzIHRoYXRcbiAgICogdGhlIHNlc3Npb24gdXN1YWxseSBrZWVwcyBzZXJ2aW5nIFx1MjAxNCBhIHZhdWx0IHJlYWQtYmFjayB3YXMgYW5zd2VyZWQgNTI4bXMgYWZ0ZXIgb25lIHN1Y2ggYWJhbmRvbm1lbnQsXG4gICAqIHdpdGggdGhlIHNlc3Npb24gZnJlZSBcdTIwMTQgc28gYm91bmRpbmcgdGhlIHdhaXQgY29zdHMgYSB0ZXN0IGl0cyBjbG9zdXJlLCBub3QgdGhlIHJlc3Qgb2YgaXRzIHN1aXRlLlxuICAgKlxuICAgKiBAcGFyYW0gc2NyaXB0IC0gVGhlIHNjcmlwdCB0byBydW4sIGFscmVhZHkgd3JhcHBlZCBpbiBpdHMgYHJldHVybiAoLi4uKWAuXG4gICAqIEByZXR1cm5zIFRoZSBzY3JpcHQncyByZXN1bHQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV2YWx1YXRlV2l0aGluQ2FwKHNjcmlwdDogc3RyaW5nKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgLypcbiAgICAgKiBUaGUgZXZhbCBBRlRFUiBhbiBvdmVycnVuIGdldHMgYSBncmFjZSBwZXJpb2Qgb24gdG9wIG9mIHRoZSBjYXAsIGFuZCB0aGlzIGlzIG5vdCBnZW5lcm9zaXR5LiBBcHBpdW1cbiAgICAgKiBTZXJpYWxpemVzIGNvbW1hbmRzIHBlciBzZXNzaW9uLCBhbmQgYW4gYWJhbmRvbmVkIGNsb3N1cmUga2VlcHMgcnVubmluZyBpbiB0aGUgZ3Vlc3QgXHUyMDE0IHNvIHRoZSBuZXh0XG4gICAgICogQ29tbWFuZCBxdWV1ZXMgYmVoaW5kIHdoYXRldmVyIGlzIGxlZnQgb2YgaXQgYW5kLCBvbiB0aGUgYmFyZSBjYXAsIGlzIGNhcHBlZCBpbiBpdHMgdHVybi4gVGhhdCBpc1xuICAgICAqIE1lYXN1cmVkOiB3aXRoIHRoZSBjYXAgZmlyaW5nIGF0IDMwcyBhZ2FpbnN0IGEgNDBzIGNsb3N1cmUsIHRoZSBmb2xsb3dpbmcgdmF1bHQgcmVhZC1iYWNrIGZhaWxlZCBhdFxuICAgICAqIDMwIDIwNm1zLCB3aGlsZSB0aGUgc2FtZSByZWFkLWJhY2sgaXNzdWVkIGFmdGVyIHRoZSBjbG9zdXJlIGhhZCBmaW5pc2hlZCB3YXMgYW5zd2VyZWQgaW4gNTI4bXMuXG4gICAgICpcbiAgICAgKiBXYWl0aW5nIG9uIHRoZSBhYmFuZG9uZWQgcmVxdWVzdCBpbnN0ZWFkIHdvdWxkIG5vdCB3b3JrOiB0aGF0IHByb21pc2UgaXMgdGhlIG9uZSB0aGF0IG5ldmVyIHNldHRsZXMuXG4gICAgICogV2hhdCBmcmVlcyB0aGUgc2Vzc2lvbiBpcyB0aGUgR1VFU1QgZmluaXNoaW5nLCBvbiBhIHNjaGVkdWxlIHRoaXMgc2lkZSBjYW5ub3Qga25vdyBcdTIwMTQgc28gdGhlIGdyYWNlIGlzXG4gICAgICogYSBjZWlsaW5nLCBub3QgYSBkZWxheS4gSXQgY29zdHMgbm90aGluZyB3aGVuIHRoZSBzZXNzaW9uIGNvbWVzIGJhY2sgcHJvbXB0bHksIHdoaWNoIGlzIHRoZSBub3JtLlxuICAgICAqL1xuICAgIGNvbnN0IGJ1ZGdldEluTWlsbGlzZWNvbmRzID0gdGhpcy5pc1JlY292ZXJpbmdGcm9tQ2FwT3ZlcnJ1blxuICAgICAgPyB0aGlzLnNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyArIENBUF9SRUNPVkVSWV9HUkFDRV9JTl9NSUxMSVNFQ09ORFNcbiAgICAgIDogdGhpcy5zY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5pc1JlY292ZXJpbmdGcm9tQ2FwT3ZlcnJ1biA9IGZhbHNlO1xuXG4gICAgbGV0IGNhcFRpbWVyOiBOb2RlSlMuVGltZW91dCB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNhcCA9IG5ldyBQcm9taXNlPG5ldmVyPigoX3Jlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY2FwVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc1JlY292ZXJpbmdGcm9tQ2FwT3ZlcnJ1biA9IHRydWU7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXZhbENhcEV4Y2VlZGVkRXJyb3Ioe1xuICAgICAgICAgICAgY2FwSW5NaWxsaXNlY29uZHM6IGJ1ZGdldEluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgY2F1c2U6IG5ldyBFcnJvcihgVGhlIEFwcGl1bSBFeGVjdXRlIFNjcmlwdCBjYXJyeWluZyB0aGlzIGNsb3N1cmUgZGlkIG5vdCBhbnN3ZXIgd2l0aGluICR7U3RyaW5nKGJ1ZGdldEluTWlsbGlzZWNvbmRzKX1tcy5gKSxcbiAgICAgICAgICAgIG9wdGlvbk5hbWU6ICdzY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHMnLFxuICAgICAgICAgICAgdHJhbnNwb3J0TmFtZTogJ0FuZHJvaWQgKEFwcGl1bSknXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sIGJ1ZGdldEluTWlsbGlzZWNvbmRzKTtcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgdGhpcy5icm93c2VyLmV4ZWN1dGU8bnVsbCB8IHN0cmluZyB8IHVuZGVmaW5lZCwgW10+KHNjcmlwdCksXG4gICAgICAgIGNhcFxuICAgICAgXSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChjYXBUaW1lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChjYXBUaW1lcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgaG9zdC1zaWRlIHZhdWx0IHBhdGggdG8gdGhlIGRldmljZS1zaWRlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBBYnNvbHV0ZSBwYXRoIG9uIHRoZSBob3N0IG1hY2hpbmUuXG4gICAqIEByZXR1cm5zIFRoZSBkZXZpY2Utc2lkZSB2YXVsdCBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnZhdWx0QmFzZVBhdGh9JHtleHRyYWN0VmF1bHROYW1lKHZhdWx0UGF0aCl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJ2aWNlcyBvbmUgaW5wdXQgcmVxdWVzdCBmcm9tIHRoZSByZW5kZXJlcjogaW5qZWN0LCB0aGVuIHJlc29sdmUgdGhlIHJlbmRlcmVyJ3MgcHJvbWlzZS5cbiAgICpcbiAgICogRXZlcnkgZmFpbHVyZSBwYXRoIHN0aWxsIHJlc29sdmVzIHRoYXQgcHJvbWlzZSBcdTIwMTQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIHRoZSByZW5kZXJlciByZS10aHJvd3MgXHUyMDE0IGJlY2F1c2VcbiAgICogYSByZXF1ZXN0IHRoYXQgaXMgc2lsZW50bHkgZHJvcHBlZCB3b3VsZCBoYW5nIHRoZSBjbG9zdXJlIHVudGlsIHRoZSB3aG9sZSBydW4gdGltZXMgb3V0LCBhbmQgcmVwb3J0XG4gICAqIG5vdGhpbmcgYWJvdXQgd2h5LlxuICAgKlxuICAgKiBAcGFyYW0gY29ubmVjdGlvbiAtIFRoZSBjaGFubmVsIHRoZSByZXF1ZXN0IGFycml2ZWQgb24uXG4gICAqIEBwYXJhbSBwYXlsb2FkIC0gVGhlIHJhdyBKU09OIHBheWxvYWQgdGhlIGJpbmRpbmcgd2FzIGNhbGxlZCB3aXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVJbnB1dFJlcXVlc3QoY29ubmVjdGlvbjogV2ViVmlld0NkcENvbm5lY3Rpb24sIHBheWxvYWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCByZXF1ZXN0SWQgPSAnJztcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBpZCwgcmVxdWVzdCB9ID0gSlNPTi5wYXJzZShwYXlsb2FkKSBhcyBNb2JpbGVJbnB1dEVudmVsb3BlO1xuICAgICAgcmVxdWVzdElkID0gaWQ7XG5cbiAgICAgIC8vIEV4YWN0bHktb25jZSBhY3Jvc3MgZXZlcnkgYXR0YWNoZWQgaG9zdC4gYFJ1bnRpbWUuYmluZGluZ0NhbGxlZGAgaXMgYnJvYWRjYXN0IHRvIEFMTCBhdHRhY2hlZFxuICAgICAgLy8gQ0RQIHNlc3Npb25zLCBzbyB3aXRob3V0IHRoaXMgZWFjaCBwcm9jZXNzIGluamVjdHMgdGhlIGdlc3R1cmUgYWdhaW46IG1lYXN1cmVkIDIwMjYtMDktMTAsIGFcbiAgICAgIC8vIFZpdGVzdCBtYWluIHByb2Nlc3MgYW5kIGl0cyB3b3JrZXIgc2VydmljZWQgcmVxdWVzdCBgaWQ9MWAgaW4gdGhlIHNhbWUgbWlsbGlzZWNvbmQsIGFuZCBvbmVcbiAgICAgIC8vIGBjbGlja0VsZW1lbnRgIHJlYWNoZWQgdGhlIHBhZ2UgYXMgdHdvIGBwb2ludGVyZG93bmAgLyBgdG91Y2hzdGFydGAgcGFpcnMuXG4gICAgICAvL1xuICAgICAgLy8gQSBMT1NFUiBNVVNUIFJFVFVSTiBTSUxFTlRMWTogdGhlIHdpbm5lciBpcyB0aGUgb25lIHRoYXQgaW5qZWN0cyBhbmQgdGhlIG9uZSB0aGF0IHJlc29sdmVzIHRoZVxuICAgICAgLy8gcmVuZGVyZXIncyBwcm9taXNlLCBzbyBhbnN3ZXJpbmcgaGVyZSBhcyB3ZWxsIHdvdWxkIHJlc29sdmUgYSByZXF1ZXN0IHdob3NlIGdlc3R1cmUgdGhpc1xuICAgICAgLy8gcHJvY2VzcyBuZXZlciBzZW50LlxuICAgICAgY29uc3QgY2xhaW0gPSBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1J1bnRpbWUuZXZhbHVhdGUnLCB7IGV4cHJlc3Npb246IGJ1aWxkQ2xhaW1JbnB1dEV4cHJlc3Npb24oaWQpLCByZXR1cm5CeVZhbHVlOiB0cnVlIH0pO1xuICAgICAgaWYgKCFjaGVja0lucHV0Q2xhaW1HcmFudGVkKGNsYWltKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZEFsbCh0b0NkcElucHV0Q29tbWFuZHMocmVxdWVzdCkpO1xuICAgICAgYXdhaXQgY29ubmVjdGlvbi5zZW5kKCdSdW50aW1lLmV2YWx1YXRlJywgeyBleHByZXNzaW9uOiBidWlsZFJlc29sdmVJbnB1dEV4cHJlc3Npb24oaWQpIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3JUb1N0cmluZyhlcnJvcik7XG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBUcnVzdGVkIGlucHV0IGZhaWxlZDogJHttZXNzYWdlfWApO1xuICAgICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1J1bnRpbWUuZXZhbHVhdGUnLCB7IGV4cHJlc3Npb246IGJ1aWxkUmVzb2x2ZUlucHV0RXhwcmVzc2lvbihyZXF1ZXN0SWQsIG1lc3NhZ2UpIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSBzb2NrZXQgaXMgZ29uZTsgdGhlIHJlbmRlcmVyJ3Mgb3duIHRpbWVvdXQgaXMgdGhlIHJlbWFpbmluZyBiYWNrc3RvcC5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvYmVzIHRoZSBXZWJWaWV3IG9uY2UgZm9yIGhvdyBmYXIgT2JzaWRpYW4ncyBzdGFydHVwIGhhcyBnb3QuXG4gICAqXG4gICAqIEEgcHJvYmUgdGhhdCB0aHJvd3MgaXMgcmVwb3J0ZWQgYXMgYHVuZGVmaW5lZGAgcmF0aGVyIHRoYW4gcHJvcGFnYXRlZDogdGhlXG4gICAqIHBhZ2UgaXMgbWlkLWBsb2NhdGlvbi5yZWxvYWQoKWAgZm9yIG1vc3Qgb2YgdGhlIGFwcC1zdGFydCBwaGFzZSwgYW5kIGFcbiAgICogV2ViVmlldyB0aGF0IGNhbm5vdCBhbnN3ZXIgeWV0IGlzIHRoZSAqZXhwZWN0ZWQqIHJlYWRpbmcgdGhlcmUsIG5vdCBhbiBlcnJvci5cbiAgICpcbiAgICogQHJldHVybnMgV2hhdCB0aGUgcHJvYmUgc2F3LCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGNvdWxkIG5vdCBydW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2JlU3RhcnR1cCgpOiBQcm9taXNlPFN0YXJ0dXBQcm9iZVJlc3VsdCB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5icm93c2VyLmV4ZWN1dGUoKCk6IFN0YXJ0dXBQcm9iZVJlc3VsdCA9PiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBXZSBuZWVkIGdsb2JhbCBgYXBwYCB2YXJpYWJsZS5cbiAgICAgICAgY29uc3QgYXBwID0gZ2xvYmFsVGhpcy5hcHAgYXMgTG9hZGluZ0FwcCB8IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBoYXNBcHA6ICEhYXBwLFxuICAgICAgICAgIGhhc1dvcmtzcGFjZTogISFhcHA/LndvcmtzcGFjZSxcbiAgICAgICAgICBpc0xheW91dFJlYWR5OiAhIWFwcD8ud29ya3NwYWNlPy5sYXlvdXRSZWFkeVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQdXNoZXMgdGhlIG1pbmltYWwgYC5vYnNpZGlhbi9hcHAuanNvbmAgdmF1bHQgbWFya2VyIHZpYSBgYWRiIHB1c2hgLlxuICAgKlxuICAgKiBgYnJvd3Nlci5wdXNoRmlsZWAgKFdlYkRyaXZlciBiYXNlNjQpIGlzIGFuIG9yZGVyIG9mIG1hZ25pdHVkZSBzbG93ZXIgb24gYVxuICAgKiBjb2xkIG9yIGxvYWRlZCBlbXVsYXRvciBcdTIwMTQgbWVhc3VyZWQgYXQgOVx1MjAxMzIxcyBwZXIgY2FsbCBmb3IgdGhpcyAyLWJ5dGUgbWFya2VyLFxuICAgKiB2ZXJzdXMgc3ViLXNlY29uZCBvdmVyIGBhZGJgLiBUaGlzIG1pcnJvcnMge0BsaW5rIHB1c2hGaWxlc30sIHdoaWNoIHN3aXRjaGVkXG4gICAqIHRvIGBhZGJgIGZvciB0aGUgc2FtZSByZWFzb24uIGBta2RpciAtcGAgZ3VhcmFudGVlcyB0aGUgcGFyZW50IGRpcmVjdG9yeS5cbiAgICpcbiAgICogQHBhcmFtIGRldmljZVZhdWx0UGF0aCAtIFRoZSBkZXZpY2Utc2lkZSB2YXVsdCBkaXJlY3RvcnkgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHVzaE9ic2lkaWFuTWFya2VyKGRldmljZVZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9jYWxNYXJrZXIgPSBqb2luKHRtcGRpcigpLCBgb2JzaWRpYW4tbWFya2VyLSR7cmFuZG9tVVVJRCgpfS5qc29uYCk7XG4gICAgY29uc3QgcmVtb3RlTWFya2VyID0gYCR7ZGV2aWNlVmF1bHRQYXRofS8ub2JzaWRpYW4vYXBwLmpzb25gO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShsb2NhbE1hcmtlciwgJ3t9JywgJ3V0Zi04Jyk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ21rZGlyJywgJy1wJywgYCR7ZGV2aWNlVmF1bHRQYXRofS8ub2JzaWRpYW5gXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdwdXNoJywgbG9jYWxNYXJrZXIsIHJlbW90ZU1hcmtlcl0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcm0obG9jYWxNYXJrZXIsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSB2YXVsdCBkaXJlY3RvcnkgZnJvbSB0aGUgZGV2aWNlIG92ZXIgYGFkYmAsIGFuZCBDSEVDS1MgdGhhdCBpdCBpc1xuICAgKiBhY3R1YWxseSBnb25lLlxuICAgKlxuICAgKiBCZXN0LWVmZm9ydDogYSBmYWlsdXJlIGlzIGxvZ2dlZCwgbm90IHRocm93biwgc28gYSB0ZWFyZG93biBwcm9ibGVtIG5ldmVyXG4gICAqIG1hc2tzIHRoZSB0ZXN0IHJlc3VsdC4gVGhlIG5leHQgcnVuJ3Mgc3RhcnQtb2YtcnVuIHN3ZWVwIHBpY2tzIHVwIHdoYXRldmVyXG4gICAqIHRoaXMgY291bGQgbm90IHJlbW92ZS5cbiAgICpcbiAgICogVGhlIGNoZWNrIGlzIHRoZSBwb2ludC4gYHJtIC1yZmAgcnVucyB3aXRoIGBzaG91bGRJZ25vcmVFeGl0Q29kZWAsIHNvIGFuXG4gICAqIHVucmVtb3ZlZCBkaXJlY3RvcnkgdXNlZCB0byBsZWF2ZSBubyB0cmFjZSBhdCBhbGwgXHUyMDE0IHdoaWNoIGlzIGhvdyBydW5zIHRoYXRcbiAgICogcGFzc2VkIGVuZCB0byBlbmQgd2VyZSBzdGlsbCBmb3VuZCB0byBiZSBsZWFraW5nIGEgdmF1bHQgYXBpZWNlLCBpbnZpc2libHksXG4gICAqIHVudGlsIHNvbWVvbmUgY291bnRlZCB0aGUgZGlyZWN0b3JpZXMgb24gdGhlIGRldmljZSBieSBoYW5kLiBBIGxlYWsgaXMgbm93XG4gICAqIG5hbWVkIGluIHRoZSBsb2cgYXQgdGhlIG1vbWVudCBpdCBoYXBwZW5zLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlVmF1bHRQYXRoIC0gVGhlIGRldmljZS1zaWRlIHZhdWx0IGRpcmVjdG9yeSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZW1vdmVEZXZpY2VWYXVsdERpcmVjdG9yeShkZXZpY2VWYXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBSZW1vdmluZyB2YXVsdCBkaXJlY3RvcnkgZnJvbSBkZXZpY2U6ICR7ZGV2aWNlVmF1bHRQYXRofWApO1xuICAgICAgYXdhaXQgZXhlYyhcbiAgICAgICAgWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAncm0nLCAnLXJmJywgZGV2aWNlVmF1bHRQYXRoXSxcbiAgICAgICAgeyBpc1F1aWV0OiB0cnVlLCBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZSwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBBREJfVkFVTFRfUkVNT1ZFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGxpc3RpbmcgPSBhd2FpdCBleGVjKFxuICAgICAgICBbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdscycsICctZCcsIGRldmljZVZhdWx0UGF0aF0sXG4gICAgICAgIHsgaXNRdWlldDogdHJ1ZSwgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWUsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogQURCX1ZBVUxUX1JFTU9WRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9XG4gICAgICApO1xuXG4gICAgICBpZiAobGlzdGluZy5pbmNsdWRlcyhkZXZpY2VWYXVsdFBhdGgpKSB7XG4gICAgICAgIGxvZyhcbiAgICAgICAgICBgW2FwcGl1bS10cmFuc3BvcnRdIFdhcm5pbmc6ICR7ZGV2aWNlVmF1bHRQYXRofSBzdXJ2aXZlZCByZW1vdmFsIGFuZCBpcyBub3cgbGVha2VkIHJlc2lkdWUuIGBcbiAgICAgICAgICAgICsgJ1RoZSBuZXh0IHJ1blxcJ3Mgc3RhcnQtb2YtcnVuIHN3ZWVwIHdpbGwgcmV0cnkgaXQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBWYXVsdCBkaXJlY3RvcnkgcmVtb3ZhbCBmYWlsZWQgKG5vbi1mYXRhbCk6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJvcHMgdGhlIGBwcm9jZXNzLm9uKCdleGl0JylgIGhhbmRsZXIgdGhhdCB3b3VsZCBvdGhlcndpc2UgY2xvc2UgYW4gYWxyZWFkeS1jbG9zZWQgY2hhbm5lbCwgYW5kIHdvdWxkXG4gICAqIHN0YWNrIGEgbGlzdGVuZXIgcGVyIHJlY29ubmVjdC5cbiAgICovXG4gIHByaXZhdGUgdW5yZWdpc3RlcklucHV0Q2hhbm5lbEV4aXRIYW5kbGVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNwb3NlSW5wdXRDaGFubmVsT25FeGl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHJvY2Vzcy5vZmYoJ2V4aXQnLCB0aGlzLmRpc3Bvc2VJbnB1dENoYW5uZWxPbkV4aXQpO1xuICAgIHRoaXMuZGlzcG9zZUlucHV0Q2hhbm5lbE9uRXhpdCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdW50aWwgYGdsb2JhbFRoaXMuYXBwYCBleGlzdHMgaW4gdGhlIFdlYlZpZXcgXHUyMDE0IHRoZSBhcHAgaGFzIGZpbmlzaGVkXG4gICAqIGl0cyBjb2xkIHN0YXJ0IGFuZCBPYnNpZGlhbidzIG93biBib290IGhhcyBiZWd1bi5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgKipmaXJzdCoqIG9mIHRoZSB0d28gYnVkZ2V0cyBzcGVudCBhZnRlciBgbG9jYXRpb24ucmVsb2FkKClgLFxuICAgKiBhbmQgdGhlIGdlbmVyb3VzIG9uZS4gRXZlcnl0aGluZyBpdCBwYXlzIGZvciBpcyBvdXRzaWRlIE9ic2lkaWFuJ3MgY29udHJvbDpcbiAgICogdGhlIFdlYlZpZXcgcmVsb2FkaW5nLCBhbmQgYSBndWVzdCB0aGF0IG1heSBzdGlsbCBiZSBvcHRpbWl6aW5nIHBhY2thZ2VzLlxuICAgKiBLZWVwaW5nIGl0IHNlcGFyYXRlIGlzIHRoZSBwb2ludCBvZiB0aGUgc3BsaXQgXHUyMDE0IHRoZSBvbGQgc2luZ2xlIHdhbGwgY2xvY2tcbiAgICogc3RhcnRlZCBoZXJlIGFuZCBsZWZ0IHRoZSB0aWdodCBsYXlvdXQgYnVkZ2V0IHBheWluZyBmb3IgYSBjb2xkIHN0YXJ0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQXBwU3RhcnRlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBXYWl0aW5nIGZvciB0aGUgYXBwIHRvIHN0YXJ0ICh0aW1lb3V0PSR7U3RyaW5nKHRoaXMuYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zKS4uLmApO1xuICAgIGF3YWl0IHRoaXMud2FpdEZvclN0YXJ0dXBNaWxlc3RvbmUoe1xuICAgICAgaXNTYXRpc2ZpZWQ6IGNoZWNrQXBwU3RhcnRlZCxcbiAgICAgIHBoYXNlOiAnYXBwLXN0YXJ0JyxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogdGhpcy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIHVudGlsIGBhcHAud29ya3NwYWNlLmxheW91dFJlYWR5YCBpcyBgdHJ1ZWAgaW4gdGhlIFdlYlZpZXcuXG4gICAqXG4gICAqIFRoZSAqKnNlY29uZCoqIGJ1ZGdldCwgYW5kIHRoZSB0aWdodCBvbmU6IGJ5IHRoZSB0aW1lIGl0IHN0YXJ0cywgdGhlIGFwcCBpc1xuICAgKiBhbHJlYWR5IHVwLCBzbyBhbGwgaXQgY292ZXJzIGlzIE9ic2lkaWFuIG9wZW5pbmcgdGhlIHZhdWx0IGFuZCBsb2FkaW5nXG4gICAqIHBsdWdpbnMgXHUyMDE0IH4xcyBpbiBwcmFjdGljZSwgXHUyMjY0OC40cyB1bmRlciBoZWF2eSBob3N0IHN0cmVzcyAoKipMMTkqKikuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JMYXlvdXRSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBXYWl0aW5nIGZvciBsYXlvdXQgcmVhZHkgKHRpbWVvdXQ9JHtTdHJpbmcodGhpcy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMpLi4uYCk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yU3RhcnR1cE1pbGVzdG9uZSh7XG4gICAgICBpc1NhdGlzZmllZDogY2hlY2tMYXlvdXRSZWFkeSxcbiAgICAgIHBoYXNlOiAnbGF5b3V0LXJlYWR5JyxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogdGhpcy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIHRoZSBXZWJWaWV3IHVudGlsIGEgc3RhcnR1cCBwaGFzZSdzIG1pbGVzdG9uZSBpcyBzYXRpc2ZpZWQsIHRyYWNraW5nXG4gICAqIHRoZSBldmlkZW5jZSB0aGF0IHRlbGxzIGEgc2xvdyBPYnNpZGlhbiBmcm9tIGEgY29udGVuZGVkIGd1ZXN0LlxuICAgKlxuICAgKiBFYWNoIHBvbGwgY29zdHMgZXhhY3RseSBvbmUgYGJyb3dzZXIuZXhlY3V0ZWAgcm91bmQtdHJpcCBcdTIwMTQgZGVsaWJlcmF0ZWx5IG5vdFxuICAgKiBhbiB7QGxpbmsgZW5zdXJlV2ViVmlld0NvbnRleHR9IGNhbGwsIHdob3NlIGBnZXRDb250ZXh0cygpYCBydW5zXG4gICAqIGBhZGIgc2hlbGwgY2F0IC9wcm9jL25ldC91bml4YCBhbmQgd2FzIG1lYXN1cmVkIGF0IH4xN3MgcGVyICoqTDE5KiouIFRoZVxuICAgKiByb3VuZC10cmlwIGlzIHRpbWVkLCBhbmQgdGhlIHNsb3dlc3Qgb25lIGlzIHJlcG9ydGVkIG9uIHRpbWVvdXQ6IGEgcGhhc2VcbiAgICogdGhhdCByYW4gb3V0IGFmdGVyIGEgaGFuZGZ1bCBvZiBwcm9iZXMgZWFjaCB0YWtpbmcgdGVucyBvZiBzZWNvbmRzIHdhc1xuICAgKiBzdGFydmVkIGJ5IHRoZSBndWVzdCwgbm90IGJ5IE9ic2lkaWFuLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBoYXNlLCBpdHMgYnVkZ2V0LCBhbmQgdGhlIHByZWRpY2F0ZSB0aGF0IGVuZHMgaXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JTdGFydHVwTWlsZXN0b25lKHBhcmFtczogQXBwaXVtVHJhbnNwb3J0V2FpdEZvclN0YXJ0dXBNaWxlc3RvbmVQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGlzU2F0aXNmaWVkLCBwaGFzZSwgdGltZW91dEluTWlsbGlzZWNvbmRzIH0gPSBwYXJhbXM7XG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG5cbiAgICBsZXQgZnVydGhlc3RNaWxlc3RvbmU6IEFwcFN0YXJ0dXBNaWxlc3RvbmUgPSAnbm8td2Vidmlldyc7XG4gICAgbGV0IHBvbGxDb3VudCA9IDA7XG4gICAgbGV0IHNsb3dlc3RSb3VuZFRyaXBJbk1pbGxpc2Vjb25kcyA9IDA7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCByb3VuZFRyaXBTdGFydCA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBtaWxlc3RvbmUgPSBjbGFzc2lmeUFwcFN0YXJ0dXBQcm9iZShhd2FpdCB0aGlzLnByb2JlU3RhcnR1cCgpKTtcbiAgICAgIGNvbnN0IHJvdW5kVHJpcEluTWlsbGlzZWNvbmRzID0gRGF0ZS5ub3coKSAtIHJvdW5kVHJpcFN0YXJ0O1xuXG4gICAgICBwb2xsQ291bnQrKztcbiAgICAgIHNsb3dlc3RSb3VuZFRyaXBJbk1pbGxpc2Vjb25kcyA9IE1hdGgubWF4KHNsb3dlc3RSb3VuZFRyaXBJbk1pbGxpc2Vjb25kcywgcm91bmRUcmlwSW5NaWxsaXNlY29uZHMpO1xuICAgICAgaWYgKGNvbXBhcmVBcHBTdGFydHVwTWlsZXN0b25lcyhtaWxlc3RvbmUsIGZ1cnRoZXN0TWlsZXN0b25lKSA+IDApIHtcbiAgICAgICAgZnVydGhlc3RNaWxlc3RvbmUgPSBtaWxlc3RvbmU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1NhdGlzZmllZChtaWxlc3RvbmUpKSB7XG4gICAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFBoYXNlIFwiJHtwaGFzZX1cIiBzYXRpc2ZpZWQgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcyAoJHtTdHJpbmcocG9sbENvdW50KX0gcHJvYmUocykpLmApO1xuICAgICAgICB0aGlzLmlzSW5XZWJWaWV3Q29udGV4dCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbG9nKFxuICAgICAgICBgW2FwcGl1bS10cmFuc3BvcnRdIFBoYXNlIFwiJHtwaGFzZX1cIiBub3Qgc2F0aXNmaWVkIHlldDogJHttaWxlc3RvbmV9IGBcbiAgICAgICAgICArIGAoZWxhcHNlZD0ke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zLCByb3VuZC10cmlwPSR7U3RyaW5nKHJvdW5kVHJpcEluTWlsbGlzZWNvbmRzKX1tcykuIFJldHJ5aW5nLi4uYFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRlbGF5KExBWU9VVF9SRUFEWV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkU3RhcnR1cFRpbWVvdXRNZXNzYWdlKHtcbiAgICAgIGVsYXBzZWRJbk1pbGxpc2Vjb25kczogRGF0ZS5ub3coKSAtIHN0YXJ0LFxuICAgICAgbWlsZXN0b25lOiBmdXJ0aGVzdE1pbGVzdG9uZSxcbiAgICAgIHBoYXNlLFxuICAgICAgcG9sbENvdW50LFxuICAgICAgc2xvd2VzdFJvdW5kVHJpcEluTWlsbGlzZWNvbmRzLFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSkpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHZhdWx0IGRpcmVjdG9yeSBuYW1lIGZyb20gYSBob3N0LXNpZGUgdmF1bHQgcGF0aC5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gQWJzb2x1dGUgcGF0aCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICogQHJldHVybnMgVGhlIGxhc3QgcGF0aCBzZWdtZW50ICh2YXVsdCBkaXJlY3RvcnkgbmFtZSkuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RWYXVsdE5hbWUodmF1bHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBub3JtYWxpemVkID0gdmF1bHRQYXRoLnJlcGxhY2UoL1tcXFxcL10rJC8sICcnKTtcbiAgY29uc3QgbGFzdFNlcGFyYXRvciA9IE1hdGgubWF4KG5vcm1hbGl6ZWQubGFzdEluZGV4T2YoJy8nKSwgbm9ybWFsaXplZC5sYXN0SW5kZXhPZignXFxcXCcpKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQuc2xpY2UobGFzdFNlcGFyYXRvciArIDEpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNENBLHlCQUEyQjtBQUMzQixzQkFHTztBQUNQLHFCQUF1QjtBQUN2Qix1QkFBcUI7QUFnQnJCLGtDQU1PO0FBQ1AsZ0NBR087QUFDUCw2QkFBOEI7QUFDOUIscUNBR087QUFDUCxzQkFBaUQ7QUFDakQsa0JBQXFCO0FBQ3JCLDhCQUFzQztBQUN0QyxpQkFBb0I7QUFDcEIsMEJBTU87QUFDUCx5QkFBb0M7QUFtSHBDLE1BQU0sWUFBWTtBQUNsQixNQUFNLHVCQUF1QjtBQUM3QixNQUFNLHlCQUF5QjtBQUMvQixNQUFNLHdDQUF3QztBQUM5QyxNQUFNLCtDQUErQztBQUNyRCxNQUFNLDZDQUE2QztBQUNuRCxNQUFNLG9EQUFvRDtBQUMxRCxNQUFNLGlEQUFpRDtBQUN2RCxNQUFNLG9D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
774
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1hcHBpdW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBcHBpdW0gdHJhbnNwb3J0IFx1MjAxNCBldmFsdWF0ZXMgZXhwcmVzc2lvbnMgaW5zaWRlIE9ic2lkaWFuIE1vYmlsZSB2aWEgV2ViVmlld1xuICogSmF2YVNjcmlwdCBpbmplY3Rpb24uIE1hbmFnZXMgdmF1bHQgbGlmZWN5Y2xlIHZpYSBsb2NhbFN0b3JhZ2UgYW5kIGZpbGUgcHVzaC5cbiAqXG4gKiBDb25maWd1cmVkIHZpYSBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YCBpbiB2aXRlc3QgY29uZmlnOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHZpdGVzdC5jb25maWcudHNcbiAqIGVudmlyb25tZW50T3B0aW9uczoge1xuICogICBvYnNpZGlhblRyYW5zcG9ydDoge1xuICogICAgIHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScsXG4gKiAgICAgYXBwaXVtVXJsOiAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJyxcbiAqICAgICBhdmROYW1lOiAnb2JzaWRpYW5fdGVzdCcsXG4gKiAgIH0sXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBGb3IgQnJvd3NlclN0YWNrLCBzZXQgYGFwcGl1bVVybGAgdG8gdGhlIEJyb3dzZXJTdGFjayBodWIgVVJMXG4gKiBcdTIwMTQgdGhlIHRyYW5zcG9ydCBpdHNlbGYgaXMgaHViLWFnbm9zdGljLlxuICpcbiAqICMjIEhvdyB2YXVsdCByZWdpc3RyYXRpb24gd29ya3Mgb24gbW9iaWxlXG4gKlxuICogT2JzaWRpYW4gTW9iaWxlIHN0b3JlcyBpdHMgdmF1bHQgcmVnaXN0cnkgaW4gdGhlIFdlYlZpZXcncyBgbG9jYWxTdG9yYWdlYDpcbiAqXG4gKiAtIGBtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzYCBcdTIwMTQgSlNPTiBhcnJheSBvZiByZWdpc3RlcmVkIHZhdWx0IHBhdGhzXG4gKiAtIGBtb2JpbGUtc2VsZWN0ZWQtdmF1bHRgIFx1MjAxNCB0aGUgY3VycmVudGx5IGFjdGl2ZSB2YXVsdCBwYXRoXG4gKiAtIGBlbmFibGUtcGx1Z2luLTx2YXVsdFBhdGg+YCBcdTIwMTQgYFwidHJ1ZVwiYCB0byBlbmFibGUgdGhlIHBsdWdpbiBzeXN0ZW0gZm9yIHRoZSB2YXVsdFxuICpcbiAqIFRvIHJlZ2lzdGVyIGEgdmF1bHQgcHJvZ3JhbW1hdGljYWxseSAod2l0aG91dCBVSSBpbnRlcmFjdGlvbik6XG4gKlxuICogMS4gUHVzaCB2YXVsdCBmaWxlcyB0byB0aGUgZGV2aWNlIChlLmcuIGAvc2RjYXJkL0RvY3VtZW50cy88TmFtZT4vLm9ic2lkaWFuL2FwcC5qc29uYClcbiAqIDIuIFN3aXRjaCB0byBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dFxuICogMy4gU2V0IHRoZSBsb2NhbFN0b3JhZ2UgZW50cmllc1xuICogNC4gQ2FsbCBgbG9jYXRpb24ucmVsb2FkKClgIFx1MjAxNCBPYnNpZGlhbiByZS1yZWFkcyBsb2NhbFN0b3JhZ2UgYW5kIG9wZW5zIHRoZSB2YXVsdFxuICpcbiAqIFRoaXMgYXZvaWRzIHRoZSBvbmJvYXJkaW5nIGZsb3cgZW50aXJlbHkuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHR5cGUgeyBCcm93c2VyIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgcm0sXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwU3RhcnR1cE1pbGVzdG9uZSxcbiAgQXBwU3RhcnR1cFBoYXNlLFxuICBTdGFydHVwUHJvYmVSZXN1bHRcbn0gZnJvbSAnLi9hcHAtc3RhcnR1cC1wcm9ncmVzcy5janMnO1xuaW1wb3J0IHR5cGUgeyBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyB9IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90LmNqcyc7XG5pbXBvcnQgdHlwZSB7IE1vYmlsZUlucHV0RW52ZWxvcGUgfSBmcm9tICcuL21vYmlsZS1pbnB1dC5janMnO1xuaW1wb3J0IHR5cGUge1xuICBDb25zb2xlQ2FwdHVyZUhhbmRsZSxcbiAgT2JzaWRpYW5UcmFuc3BvcnQsXG4gIFRyYW5zcG9ydEV2YWxPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LmNqcyc7XG5pbXBvcnQgdHlwZSB7IFdlYlZpZXdDZHBDb25uZWN0aW9uIH0gZnJvbSAnLi93ZWJ2aWV3LWNkcC5janMnO1xuXG5pbXBvcnQge1xuICBidWlsZFN0YXJ0dXBUaW1lb3V0TWVzc2FnZSxcbiAgY2hlY2tBcHBTdGFydGVkLFxuICBjaGVja0xheW91dFJlYWR5LFxuICBjbGFzc2lmeUFwcFN0YXJ0dXBQcm9iZSxcbiAgY29tcGFyZUFwcFN0YXJ0dXBNaWxlc3RvbmVzXG59IGZyb20gJy4vYXBwLXN0YXJ0dXAtcHJvZ3Jlc3MuY2pzJztcbmltcG9ydCB7XG4gIGRlY29kZUJhc2U2NFBuZyxcbiAgaXNQbmdcbn0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QuY2pzJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICcuL2Vycm9yLXRvLXN0cmluZy5janMnO1xuaW1wb3J0IHtcbiAgRXZhbENhcEV4Y2VlZGVkRXJyb3IsXG4gIGlzU2NyaXB0VGltZW91dEVycm9yXG59IGZyb20gJy4vZXZhbC1jYXAtZXhjZWVkZWQtZXJyb3IuY2pzJztcbmltcG9ydCB7IERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTIH0gZnJvbSAnLi9ldmFsLWNhcC5janMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5janMnO1xuaW1wb3J0IHsgVEVNUF9WQVVMVF9ESVJfUFJFRklYIH0gZnJvbSAnLi9sZWZ0b3Zlci1jbGVhbnVwLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuaW1wb3J0IHtcbiAgYnVpbGRDbGFpbUlucHV0RXhwcmVzc2lvbixcbiAgYnVpbGRSZXNvbHZlSW5wdXRFeHByZXNzaW9uLFxuICBjaGVja0lucHV0Q2xhaW1HcmFudGVkLFxuICBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FLFxuICB0b0NkcElucHV0Q29tbWFuZHNcbn0gZnJvbSAnLi9tb2JpbGUtaW5wdXQuY2pzJztcbmltcG9ydCB7IGNvbm5lY3RUb1dlYlZpZXdDZHAgfSBmcm9tICcuL3dlYnZpZXctY2RwLmNqcyc7XG5cbi8qKlxuICogU2Vzc2lvbiBjb25uZWN0aW9uIGluZm8gcmV0dXJuZWQgYnkge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5nZXRTZXNzaW9uSW5mb30sXG4gKiB1c2VkIHRvIHJlYXR0YWNoIGZyb20gYW5vdGhlciBwcm9jZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGl1bVNlc3Npb25JbmZvIHtcbiAgLyoqXG4gIFRoZSBkZXZpY2UgVURJRCAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgQXBwaXVtL1dlYkRyaXZlciBzZXNzaW9uIElELlxuICAgKi9cbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIEFwcGl1bSB0cmFuc3BvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwaXVtVHJhbnNwb3J0Q29uZmlnIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYC5cbiAgICovXG4gIGFwcElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgT2JzaWRpYW4gTW9iaWxlIHRvIGdldCBhcyBmYXIgYXMgYGdsb2JhbFRoaXMuYXBwYFxuICAgKiBleGlzdGluZyBhZnRlciB0aGUgdmF1bHQgaXMgKHJlKW9wZW5lZCwgYmVmb3JlIHRoZSB0aWdodGVyXG4gICAqIHtAbGluayBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kc30gY2xvY2sgc3RhcnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTgwMDAwYFxuICAgKi9cbiAgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBBcHBpdW0gYnJvd3Nlci9kcml2ZXIgaW5zdGFuY2UuXG4gICAqIENyZWF0ZWQgYnkgdGhlIGNvbnN1bWVyIHZpYSBlLmcuIFdlYkRyaXZlcklPJ3MgYHJlbW90ZSgpYC5cbiAgICovXG4gIGJyb3dzZXI6IEJyb3dzZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgVURJRCAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqIFVzZWQgZm9yIGBhZGJgIGNvbW1hbmRzIHdoZW4gcHVzaGluZyBmaWxlcyB0byB0aGUgZGV2aWNlLlxuICAgKi9cbiAgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBvd25zIHRoZSBBcHBpdW0gc2Vzc2lvbiBhbmQgc2hvdWxkIGRlbGV0ZSBpdCBvblxuICAgKiB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0LmRpc3Bvc2V9LlxuICAgKlxuICAgKiBgdHJ1ZWAgZm9yIHNlc3Npb25zIGNyZWF0ZWQgdmlhIGByZW1vdGUoKWAgKGdsb2JhbCBzZXR1cCkuXG4gICAqIGBmYWxzZWAgZm9yIHNlc3Npb25zIHJlYXR0YWNoZWQgdmlhIGBhdHRhY2goKWAgKHRlc3Qgd29ya2VycykuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgaXNTZXNzaW9uT3duZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgLCBjb3VudGVkXG4gICAqIGZyb20gdGhlIG1vbWVudCB7QGxpbmsgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHN9IGlzIHNhdGlzZmllZCBcdTIwMTQgbm90IGZyb21cbiAgICogdGhlIHJlbG9hZCwgc28gYSBjb2xkIGFwcCBzdGFydCBpcyBub3QgY2hhcmdlZCBhZ2FpbnN0IGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgOTAwMDBgXG4gICAqL1xuICBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGFyZ2V0IHBsYXRmb3JtLiBEZXRlcm1pbmVzIFdlYlZpZXcgY29udGV4dCBuYW1pbmcgYW5kIGRldmljZSBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcGxhdGZvcm06ICdhbmRyb2lkJyB8ICdpb3MnO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVyLXNjcmlwdCBjYXAsIGluIG1pbGxpc2Vjb25kcywgdGhpcyBzZXNzaW9uIHdhcyBnaXZlbiBhcyBpdHMgVzNDXG4gICAqIGB0aW1lb3V0cy5zY3JpcHRgIGNhcGFiaWxpdHkuXG4gICAqXG4gICAqIENhcnJpZWQgb25seSBzbyBhIHNjcmlwdCB0aW1lb3V0IGNhbiBiZSByZXBvcnRlZCB3aXRoIHRoZSBudW1iZXIgdGhhdFxuICAgKiBwcm9kdWNlZCBpdDsgdGhlIGNhcGFiaWxpdHkgaXRzZWxmIGlzIHNldCB3aGVuIHRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAzMDAwMGBcbiAgICovXG4gIHNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciByZWdpc3RlcmluZyBhIHZhdWx0IGFsc28gcHJ1bmVzIHRoZSAqKm90aGVyKiogYHRlbXAtdmF1bHQtKmBcbiAgICogcmVnaXN0cmF0aW9ucyBlYXJsaWVyIHJ1bnMgbGVmdCBpbiBPYnNpZGlhbiBNb2JpbGUncyBgbG9jYWxTdG9yYWdlYC5cbiAgICpcbiAgICogVGhlIGRldmljZS1zaWRlIGRpcmVjdG9yaWVzIGFyZSBzd2VwdCBiZWZvcmUgdGhlIGFwcCBsYXVuY2hlcyAoc2VlIHRoZVxuICAgKiBmYWN0b3J5KTsgdGhpcyByZW1vdmVzIHRoZWlyIG5vdy1kYW5nbGluZyByZWdpc3RyeSBlbnRyaWVzLCB3aGljaCBhcmUgd2hhdFxuICAgKiBPYnNpZGlhbiBhY3R1YWxseSBlbnVtZXJhdGVzIGF0IHN0YXJ0dXAuIFVucmVnaXN0ZXJpbmcgdGhpcyBydW4ncyBvd24gdmF1bHRcbiAgICogaXMgdW5hZmZlY3RlZCBcdTIwMTQgdGhhdCBhbHdheXMgaGFwcGVucy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICBzaG91bGRTd2VlcExlZnRvdmVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEJhc2UgcGF0aCBvbiB0aGUgZGV2aWNlIHdoZXJlIE9ic2lkaWFuIHN0b3JlcyB2YXVsdHMuXG4gICAqXG4gICAqIERlZmF1bHRzOlxuICAgKiAtIEFuZHJvaWQ6IGAvc2RjYXJkL0RvY3VtZW50cy9gXG4gICAqIC0gaU9TOiBgQG1kLm9ic2lkaWFuOmRvY3VtZW50cy9gXG4gICAqL1xuICB2YXVsdEJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgdGhlIFdlYlZpZXcgY29udGV4dCB0byBiZWNvbWUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG5jb25zdCBOT19PVVRQVVQgPSAnKG5vIG91dHB1dCknO1xuY29uc3QgQVBQX1NUQVRFX0ZPUkVHUk9VTkQgPSA0O1xuY29uc3QgV0VCVklFV19DT05URVhUX1BSRUZJWCA9ICdXRUJWSUVXX21kLm9ic2lkaWFuJztcbmNvbnN0IFdFQlZJRVdfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBERUZBVUxUX1dFQlZJRVdfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwXzAwMDtcbmNvbnN0IExBWU9VVF9SRUFEWV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IERFRkFVTFRfTEFZT1VUX1JFQURZX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA5MF8wMDA7XG5jb25zdCBERUZBVUxUX0FQUF9TVEFSVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTgwXzAwMDtcbmNvbnN0IEFQUF9SRVNUQVJUX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBERUZBVUxUX0FQUF9JRCA9ICdtZC5vYnNpZGlhbic7XG5jb25zdCBBREJfVkFVTFRfUkVNT1ZFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuLypcbiAqIEV4dHJhIGJ1ZGdldCBncmFudGVkIHRvIHRoZSBPTkUgZXZhbCB0aGF0IGZvbGxvd3MgYSBjYXAgb3ZlcnJ1biwgb24gdG9wIG9mIHRoZSBjYXAgaXRzZWxmLiBUaGVcbiAqIGFiYW5kb25lZCBjbG9zdXJlIGtlZXBzIHJ1bm5pbmcgaW4gdGhlIGd1ZXN0LCBhbmQgQXBwaXVtIHNlcmlhbGl6ZXMgY29tbWFuZHMgcGVyIHNlc3Npb24sIHNvIHRoZSBuZXh0XG4gKiBjb21tYW5kIHdhaXRzIG91dCB3aGF0ZXZlciBpcyBsZWZ0IG9mIGl0LiBTaXplZCBhdCB0aGUgZGVmYXVsdCBjYXAgYWdhaW4gXHUyMDE0IGRlcml2ZWQgZnJvbSBpdCByYXRoZXIgdGhhblxuICogcmVzdGF0ZWQsIHNvIHRoZSB0d28gY2Fubm90IGRyaWZ0IFx1MjAxNCB3aGljaCBpcyBhIHByYWdtYXRpYyBjZWlsaW5nIHJhdGhlciB0aGFuIGEgcHJvb2Y6IGEgY2xvc3VyZSBjYW5cbiAqIG91dHJ1biBhbnkgbnVtYmVyIHBpY2tlZCBoZXJlLiBJdCBkb2VzIG5vdCBuZWVkIHRvIGJlIGEgcHJvb2YsIGJlY2F1c2UgYSBndWVzdCB0aGF0IGlzIHN0aWxsIGJ1c3kgYWZ0ZXJcbiAqIGl0IHNpbXBseSBwcm9kdWNlcyBhbm90aGVyIG92ZXJydW4gb24gdGhlIG5leHQgZXZhbCwgd2hpY2ggaXMgZ3JhbnRlZCB0aGUgZ3JhY2UgaW4gdHVybiBcdTIwMTQgc28gdGhlIHNlc3Npb25cbiAqIHJlY292ZXJzIG92ZXIgc3VjY2Vzc2l2ZSBldmFscyBpbnN0ZWFkIG9mIGNvbXBvdW5kaW5nLCBhbmQgZXZlcnkgb25lIG9mIHRob3NlIGV2YWxzIHJlcG9ydHMgdGhlIHNhbWVcbiAqIGhvbmVzdCBkaWFnbm9zaXMuXG4gKi9cbmNvbnN0IENBUF9SRUNPVkVSWV9HUkFDRV9JTl9NSUxMSVNFQ09ORFMgPSBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUztcblxuLy8gLS0tIENvbnNvbGUgY2FwdHVyZSAoTGF5ZXIgMiBvZiB0aGUgcGx1Z2luLWxvYWQgZXJyb3Igc3VyZmFjaW5nKSAtLS1cbi8qKlxuICogVGhlIGBsb2djYXRgIHRhZyBzdGFtcGVkIGF0IGNhcHR1cmUgc3RhcnQsIGFuZCB0aGUgcHJlZml4IG9mIHRoZSB1bmlxdWUgbWFya2VyIHdyaXR0ZW4gdW5kZXIgaXQuXG4gKlxuICogUHJvY2Vzcy1sb2NhbCByYXRoZXIgdGhhbiBhIHByb3RvY29sOiBgYmVnaW5Db25zb2xlQ2FwdHVyZWAgd3JpdGVzIGl0IGFuZCBgcmVhZENvbnNvbGVDYXB0dXJlU2luY2VgIHNlYXJjaGVzIHRoZSBkdW1wIGZvclxuICogdGhlIHNhbWUgc3RyaW5nLCBib3RoIGZyb20gdGhpcyBjb25zdGFudCwgc28gdGhlIHZhbHVlIGlzIGZyZWUgdG8gY2hhbmdlLiBJdCBvbmx5IGhhcyB0byBiZSB1bmxpa2VseSB0byBvY2N1ciBpbiBhblxuICogdW5yZWxhdGVkIGxvZyBsaW5lLlxuICovXG5jb25zdCBDT05TT0xFX0NBUFRVUkVfTUFSS0VSX1RBRyA9ICdPQlNJRElBTl9JTlRFR1JBVElPTl9URVNUSU5HX0NBUFRVUkUnO1xuY29uc3QgQ09OU09MRV9DQVBUVVJFX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBBREJfTE9HX01BUktFUl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBMT0dDQVRfRFVNUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcbi8qKlxuICogYGFkYiBsb2djYXQgLXYgdGltZWAgbGluZXMgbG9vayBsaWtlIGBNTS1ERCBISDpNTTpTUy5tbW0gTEVWRUwvVEFHKCBQSUQpOiBtZXNzYWdlYC5cbiAqIEtlZXAgb25seSB0aGUgdGFncyBDaHJvbWl1bS9XZWJWaWV3IHJvdXRlcyBKUyBgY29uc29sZS4qYCBvdXRwdXQgYW5kIHVuY2F1Z2h0XG4gKiBlcnJvcnMgdG8gKGBjaHJvbWl1bWAsIHRoZSBDYXBhY2l0b3IgY29uc29sZSBicmlkZ2UsIGFuZCBuYXRpdmUgYEFuZHJvaWRSdW50aW1lYCkuXG4gKi9cbmNvbnN0IENPTlNPTEVfQ0FQVFVSRV9UQUdfUkUgPSAvXFwvKD86Y2hyb21pdW18QW5kcm9pZFJ1bnRpbWV8Q2FwYWNpdG9yXFwvQ29uc29sZSlcXCgvO1xuXG4vKipcbiAqIEJhc2UgcGF0aCBvbiBhbiBBbmRyb2lkIGRldmljZSB3aGVyZSBPYnNpZGlhbiBNb2JpbGUgc3RvcmVzIGl0cyB2YXVsdHMuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSB0aGUgdHJhbnNwb3J0IGZhY3Rvcnkgc3dlZXBzIGxlZnRvdmVyIHZhdWx0cyBmcm9tIGl0IGJlZm9yZVxuICogYSB0cmFuc3BvcnQgZXhpc3RzIChzZWUgdGhlIHJlcG8ncyBMMzEpLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSCA9ICcvc2RjYXJkL0RvY3VtZW50cy8nO1xuXG5jb25zdCBERUZBVUxUX1ZBVUxUX0JBU0VfUEFUSDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgYW5kcm9pZDogREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSCxcbiAgaW9zOiAnQG1kLm9ic2lkaWFuOmRvY3VtZW50cy8nXG59O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnQud2FpdEZvclN0YXJ0dXBNaWxlc3RvbmV9LlxuICovXG5pbnRlcmZhY2UgQXBwaXVtVHJhbnNwb3J0V2FpdEZvclN0YXJ0dXBNaWxlc3RvbmVQYXJhbXMge1xuICAvKipcbiAgV2hldGhlciB0aGUgbWlsZXN0b25lIGp1c3Qgb2JzZXJ2ZWQgZW5kcyB0aGlzIHBoYXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNTYXRpc2ZpZWQ6IChtaWxlc3RvbmU6IEFwcFN0YXJ0dXBNaWxlc3RvbmUpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gIFRoZSBwaGFzZSBiZWluZyB3YWl0ZWQgb3V0LCBuYW1lZCBpbiB0aGUgbG9nIGFuZCBpbiB0aGUgdGltZW91dCBtZXNzYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGhhc2U6IEFwcFN0YXJ0dXBQaGFzZTtcblxuICAvKipcbiAgVGhpcyBwaGFzZSdzIGJ1ZGdldC5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgTG9hZGluZ0FwcCB7XG4gIHdvcmtzcGFjZT86IExvYWRpbmdXb3Jrc3BhY2U7XG59XG5cbmludGVyZmFjZSBMb2FkaW5nV29ya3NwYWNlIHtcbiAgbGF5b3V0UmVhZHk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRyYW5zcG9ydCB0aGF0IGNvbW11bmljYXRlcyB3aXRoIE9ic2lkaWFuIE1vYmlsZSB2aWEgQXBwaXVtIFdlYlZpZXcgSlMgaW5qZWN0aW9uLlxuICpcbiAqIEV2YWx1YXRlcyBleHByZXNzaW9ucyBieSBzd2l0Y2hpbmcgdG8gdGhlIGBXRUJWSUVXX21kLm9ic2lkaWFuYCBjb250ZXh0IGFuZFxuICogY2FsbGluZyBgZXhlY3V0ZSgpYC4gTWFuYWdlcyB2YXVsdHMgYnkgd3JpdGluZyB0byB0aGUgV2ViVmlldydzIGBsb2NhbFN0b3JhZ2VgXG4gKiAod2hpY2ggT2JzaWRpYW4gdXNlcyBhcyBpdHMgdmF1bHQgcmVnaXN0cnkgb24gbW9iaWxlKSBhbmQgcHVzaGluZyBmaWxlcyB0byB0aGUgZGV2aWNlLlxuICovXG5leHBvcnQgY2xhc3MgQXBwaXVtVHJhbnNwb3J0IGltcGxlbWVudHMgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgZm9yIGEgbW9iaWxlIHBsYXRmb3JtLiBBbHdheXMgYHRydWVgIGZvciB0aGlzIHRyYW5zcG9ydC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc01vYmlsZSA9IHRydWU7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBhcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGJyb3dzZXI6IEJyb3dzZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBgcHJvY2Vzcy5vbignZXhpdCcpYCBoYW5kbGVyIHRoYXQgdGVhcnMgdGhlIGNoYW5uZWwgZG93biB3aGVuIG5vdGhpbmcgZWxzZSB3aWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwb3NlSW5wdXRDaGFubmVsT25FeGl0OiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBob3N0IGhhbGYgb2YgdGhlIHRydXN0ZWQtaW5wdXQgY2hhbm5lbDogYSBDRFAgY29ubmVjdGlvbiB0byB0aGUgV2ViVmlldywgaW5kZXBlbmRlbnQgb2YgdGhlXG4gICAqIEFwcGl1bSBzZXNzaW9uLCBvcGVuZWQgbGF6aWx5IG9uIGZpcnN0IGV2YWx1YXRlIGFuZCByZXVzZWQgKHNlZSAqKkwzOSoqKS5cbiAgICovXG4gIHByaXZhdGUgaW5wdXRDaGFubmVsOiBudWxsIHwgV2ViVmlld0NkcENvbm5lY3Rpb24gPSBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb25jZSB0aGUgdHJ1c3RlZC1pbnB1dCBjaGFubmVsIGlzIGtub3duIG5vdCB0byBiZSBvcGVuYWJsZSBoZXJlIChpT1MsIGEgcmVtb3RlIGh1Yiwgbm8gbG9jYWxcbiAgICogYGFkYmApLCBzbyB0aGUgYXR0ZW1wdCBpcyBub3QgcmVwZWF0ZWQgb24gZXZlcnkgZXZhbHVhdGUuXG4gICAqL1xuICBwcml2YXRlIGlzSW5wdXRDaGFubmVsVW5hdmFpbGFibGUgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFRyYWNrcyB3aGV0aGVyIHRoZSBkcml2ZXIgaXMgY3VycmVudGx5IHN3aXRjaGVkIHRvIHRoZSBXZWJWaWV3IGNvbnRleHQuXG4gICAqXG4gICAqIFNldCB0byBgdHJ1ZWAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGBzd2l0Y2hDb250ZXh0KFdFQlZJRVdfbWQub2JzaWRpYW4pYC5cbiAgICogUmVzZXQgdG8gYGZhbHNlYCB3aGVuIHRoZSBjb250ZXh0IGlzIGtub3duIHRvIGJlIGludmFsaWRhdGVkXG4gICAqIChlLmcuIGFmdGVyIGBsb2NhdGlvbi5yZWxvYWQoKWAgaW4ge0BsaW5rIHJlZ2lzdGVyVmF1bHR9KS5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAsIHtAbGluayBlbnN1cmVXZWJWaWV3Q29udGV4dH0gc2tpcHMgdGhlIGV4cGVuc2l2ZVxuICAgKiBgZ2V0Q29udGV4dHMoKWAgY2FsbCAod2hpY2ggcnVucyBgYWRiIHNoZWxsIGNhdCAvcHJvYy9uZXQvdW5peGAgYW5kXG4gICAqIGNhbiB0aW1lIG91dCBvbiBzbG93IGVtdWxhdG9ycykuXG4gICAqL1xuICBwcml2YXRlIGlzSW5XZWJWaWV3Q29udGV4dCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwcmV2aW91cyBldmFsIGVuZGVkIGluIGEgY2FwIG92ZXJydW4sIHNvIHRoZSBuZXh0IG9uZSBpcyBvd2VkIHRoZSByZWNvdmVyeSBncmFjZS5cbiAgICpcbiAgICogVGhlIGFiYW5kb25lZCBjbG9zdXJlIGlzIHN0aWxsIHJ1bm5pbmcgaW4gdGhlIGd1ZXN0LCBhbmQgQXBwaXVtIHNlcmlhbGl6ZXMgY29tbWFuZHMgcGVyIHNlc3Npb24sIHNvXG4gICAqIHRoZSBuZXh0IGNvbW1hbmQgcXVldWVzIGJlaGluZCB3aGF0ZXZlciBpcyBsZWZ0IG9mIGl0LiBTZWUge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5ldmFsdWF0ZVdpdGhpbkNhcH0uXG4gICAqL1xuICBwcml2YXRlIGlzUmVjb3ZlcmluZ0Zyb21DYXBPdmVycnVuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc1Nlc3Npb25Pd25lcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtOiAnYW5kcm9pZCcgfCAnaW9zJztcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRTd2VlcExlZnRvdmVyczogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSB2YXVsdEJhc2VQYXRoOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQXBwaXVtIHRyYW5zcG9ydC5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIEFwcGl1bSB0cmFuc3BvcnQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb25maWc6IEFwcGl1bVRyYW5zcG9ydENvbmZpZykge1xuICAgIHRoaXMuYnJvd3NlciA9IGNvbmZpZy5icm93c2VyO1xuICAgIHRoaXMuZGV2aWNlSWQgPSBjb25maWcuZGV2aWNlSWQ7XG4gICAgdGhpcy5pc1Nlc3Npb25Pd25lciA9IGNvbmZpZy5pc1Nlc3Npb25Pd25lciA/PyB0cnVlO1xuICAgIHRoaXMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBjb25maWcubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9MQVlPVVRfUkVBRFlfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLnBsYXRmb3JtID0gY29uZmlnLnBsYXRmb3JtO1xuICAgIHRoaXMuYXBwSWQgPSBjb25maWcuYXBwSWQgPz8gREVGQVVMVF9BUFBfSUQ7XG4gICAgdGhpcy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IGNvbmZpZy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0FQUF9TVEFSVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHRoaXMuc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzID0gY29uZmlnLnNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLnNob3VsZFN3ZWVwTGVmdG92ZXJzID0gY29uZmlnLnNob3VsZFN3ZWVwTGVmdG92ZXJzID8/IHRydWU7XG4gICAgdGhpcy52YXVsdEJhc2VQYXRoID0gY29uZmlnLnZhdWx0QmFzZVBhdGggPz8gREVGQVVMVF9WQVVMVF9CQVNFX1BBVEhbdGhpcy5wbGF0Zm9ybV0gPz8gREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSDtcbiAgICB0aGlzLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBjb25maWcud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1dFQlZJRVdfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgfVxuXG4gIC8qKlxuICAgKiBCZWdpbnMgYSBjb25zb2xlIGNhcHR1cmUgYnkgc3RhbXBpbmcgdGhlIGRldmljZSBsb2cgd2l0aCBhIHVuaXF1ZSBtYXJrZXIuXG4gICAqXG4gICAqIFVzZXMgYGFkYiBzaGVsbCBsb2dgIHRvIHdyaXRlIGEgbWFya2VyIGludG8gYGxvZ2NhdGAgYXQgY2FwdHVyZSBzdGFydCBzbyBhXG4gICAqIGxhdGVyIHtAbGluayBBcHBpdW1UcmFuc3BvcnQucmVhZENvbnNvbGVDYXB0dXJlU2luY2V9IGNhbiBzbGljZSBvdXRcbiAgICogZXZlcnl0aGluZyB0aGUgV2ViVmlldyBsb2dnZWQgYWZ0ZXJ3YXJkcyBcdTIwMTQgd2l0aG91dCB0aGUgaW52YXNpdmUgYGxvZ2NhdCAtY2BcbiAgICogYnVmZmVyIGNsZWFyLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGhhbmRsZSBjYXJyeWluZyB0aGUgdW5pcXVlIG1hcmtlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBiZWdpbkNvbnNvbGVDYXB0dXJlKCk6IFByb21pc2U8Q29uc29sZUNhcHR1cmVIYW5kbGU+IHtcbiAgICBjb25zdCBtYXJrZXIgPSBgJHtDT05TT0xFX0NBUFRVUkVfTUFSS0VSX1RBR31fJHtyYW5kb21VVUlEKCl9YDtcbiAgICBhd2FpdCBleGVjKFxuICAgICAgWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAnbG9nJywgJy10JywgQ09OU09MRV9DQVBUVVJFX01BUktFUl9UQUcsIG1hcmtlcl0sXG4gICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9MT0dfTUFSS0VSX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH1cbiAgICApO1xuICAgIHJldHVybiB7IG1hcmtlciB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhcHR1cmVzIGEgUE5HIHNjcmVlbnNob3Qgb2YgdGhlIGRldmljZSdzIHNjcmVlbi5cbiAgICpcbiAgICogVGhlIGltYWdlIGlzIGFsd2F5cyB0aGUgZGV2aWNlJ3MgbmF0aXZlIGZyYW1lYnVmZmVyIFx1MjAxNCB0aGVyZSBpcyBubyBtb2JpbGVcbiAgICogZXF1aXZhbGVudCBvZiB0aGUgZGVza3RvcCB2aWV3cG9ydCBvdmVycmlkZSwgc29cbiAgICoge0BsaW5rIENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLndpZHRoSW5QaXhlbHN9IC9cbiAgICoge0BsaW5rIENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLmhlaWdodEluUGl4ZWxzfSBhcmUgaWdub3JlZC4gU2l6ZSBhIG1vYmlsZVxuICAgKiBjYXB0dXJlIGJ5IGNob29zaW5nIGFuIEFWRCB3aG9zZSBzY3JlZW4gZ2VvbWV0cnkgYWxyZWFkeSBtYXRjaGVzIHdoYXQgdGhlXG4gICAqIGltYWdlIGhhcyB0byBiZS5cbiAgICpcbiAgICogQHBhcmFtIF9wYXJhbXMgLSBDYXB0dXJlIHBhcmFtZXRlcnMuIElnbm9yZWQgb24gbW9iaWxlOiBgY3dkYCBkb2VzIG5vdCBzZWxlY3QgYSB3aW5kb3cgKHZhdWx0IHRhcmdldGluZyBpcyB2aWEgbG9jYWxTdG9yYWdlKSwgYW5kIHRoZSBzaXplIGNhbm5vdCBiZSBvdmVycmlkZGVuLlxuICAgKiBAcmV0dXJucyBUaGUgcmF3IFBORyBieXRlcy5cbiAgICogQHRocm93cyBFcnJvciBpZiB0aGUgZHJpdmVyIHJldHVybnMgZGF0YSB0aGF0IGlzIG5vdCBhIFBORy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBQZXJtYW5lbnQ6IGBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtc2AgaXMgb25lIGJhZyBzaGFyZWQgYnkgdGhlIGBjYXB0dXJlU2NyZWVuc2hvdGAgb2YgYm90aCB0cmFuc3BvcnRzLCBzbyBubyBwZXItb3duZXIgbmFtZSBjYW4gc2F0aXNmeSBib3RoLlxuICBwdWJsaWMgYXN5bmMgY2FwdHVyZVNjcmVlbnNob3QoX3BhcmFtczogQ2FwdHVyZVNjcmVlbnNob3RQYXJhbXMpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBjb25zdCBieXRlcyA9IGRlY29kZUJhc2U2NFBuZyhhd2FpdCB0aGlzLmJyb3dzZXIudGFrZVNjcmVlbnNob3QoKSk7XG4gICAgaWYgKCFpc1BuZyhieXRlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXBwaXVtIHNjcmVlbnNob3QgZXJyb3I6IHRha2VTY3JlZW5zaG90IHJldHVybmVkIGRhdGEgdGhhdCBpcyBub3QgYSBQTkcuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ5dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZHMgdGhlIEFwcGl1bSBzZXNzaW9uLlxuICAgKlxuICAgKiBPbmx5IGRlbGV0ZXMgdGhlIHNlc3Npb24gaWYgdGhpcyB0cmFuc3BvcnQgb3ducyBpdC4gVHJhbnNwb3J0cyBjcmVhdGVkXG4gICAqIHZpYSBgYXR0YWNoKClgICh0ZXN0IHdvcmtlcnMgcmV1c2luZyB0aGUgZ2xvYmFsIHNldHVwJ3Mgc2Vzc2lvbikgc2tpcFxuICAgKiBkZWxldGlvbiBzbyB0aGUgc2Vzc2lvbiByZW1haW5zIGF2YWlsYWJsZSBmb3IgdGhlIG93bmluZyBwcm9jZXNzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kaXNwb3NlSW5wdXRDaGFubmVsKCk7XG5cbiAgICBpZiAodGhpcy5pc1Nlc3Npb25Pd25lcikge1xuICAgICAgYXdhaXQgdGhpcy5icm93c2VyLmRlbGV0ZVNlc3Npb24oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXMgdGVhcmRvd24gZm9yIGBwcm9jZXNzLm9uKCdleGl0JylgIGhhbmRsZXJzLlxuICAgKlxuICAgKiBPbmx5IHRoZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwgbmVlZHMgaXQ6IHRoZSBBcHBpdW0gc2Vzc2lvbiBpcyB0aGUgb3duaW5nIHByb2Nlc3MncyB0byBlbmQsIGFuZCBhblxuICAgKiBhYnJ1cHQgZXhpdCBpcyBleGFjdGx5IHdoZW4gdGhlIGFzeW5jIHtAbGluayBBcHBpdW1UcmFuc3BvcnQuZGlzcG9zZX0gbmV2ZXIgcnVucyBcdTIwMTQgd2hpY2ggd291bGQgc3RyYW5kXG4gICAqIHRoZSBhZGIgcG9ydCBmb3J3YXJkIG9uIHRoZSBkZXZpY2UuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZVN5bmMoKTogdm9pZCB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuaW5wdXRDaGFubmVsO1xuICAgIHRoaXMuaW5wdXRDaGFubmVsID0gbnVsbDtcbiAgICB0aGlzLnVucmVnaXN0ZXJJbnB1dENoYW5uZWxFeGl0SGFuZGxlcigpO1xuICAgIGNoYW5uZWw/LmRpc3Bvc2VTeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiBNb2JpbGUncyBXZWJWaWV3LlxuICAgKlxuICAgKiBTd2l0Y2hlcyB0byB0aGUgYFdFQlZJRVdfbWQub2JzaWRpYW5gIGNvbnRleHQsIGV4ZWN1dGVzIHRoZSBleHByZXNzaW9uLFxuICAgKiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICAgKiBAcGFyYW0gX29wdGlvbnMgLSBFdmFsdWF0aW9uIG9wdGlvbnMgKGN3ZCBpcyBub3QgdXNlZCBvbiBtb2JpbGUgXHUyMDE0IHZhdWx0IHRhcmdldGluZyBpcyB2aWEgbG9jYWxTdG9yYWdlKS5cbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcmVzdWx0IHN0cmluZy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBQZXJtYW5lbnQ6IGBUcmFuc3BvcnRFdmFsT3B0aW9uc2AgaXMgb25lIGJhZyBzaGFyZWQgYnkgdGhlIGBldmFsdWF0ZWAgb2YgYm90aCB0cmFuc3BvcnRzLCBzbyBubyBwZXItb3duZXIgbmFtZSBjYW4gc2F0aXNmeSBib3RoLlxuICBwdWJsaWMgYXN5bmMgZXZhbHVhdGUoZXhwcmVzc2lvbjogc3RyaW5nLCBfb3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlV2ViVmlld0NvbnRleHQoKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUlucHV0Q2hhbm5lbCgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8qXG4gICAgICAgKiBUaGUgY2FwIGlzIGVuZm9yY2VkIEhFUkUsIG9uIHRoZSBOb2RlIHNpZGUsIGFuZCBub3QgYnkgdGhlIGB0aW1lb3V0cy5zY3JpcHRgIGNhcGFiaWxpdHkgdGhlXG4gICAgICAgKiBTZXNzaW9uIGFsc28gZGVjbGFyZXMuIE1lYXN1cmVkIG9uIGEgbGl2ZSBlbXVsYXRvcjogdGhlIGNhcGFiaWxpdHkgaXMgYWNjZXB0ZWQgYW5kIHJlYWRzXG4gICAgICAgKiBCYWNrIGFzIDMwMDAwIGluIHRoZSBXZWJWaWV3IGNvbnRleHQsIGFuZCBub3RoaW5nIGV2ZXIgZW5mb3JjZXMgaXQgXHUyMDE0IG92ZXItY2FwIGNsb3N1cmVzIGluIGJvdGggdGhlXG4gICAgICAgKiBTbGVlcGluZyBhbmQgdGhlIHNwaW5uaW5nIHNoYXBlLCB3aXRoIGFuZCB3aXRob3V0IGFuIGV4cGxpY2l0IGBzZXRUaW1lb3V0c2AsIHJhbiBwYXN0IGEgNjBzIGNlaWxpbmdcbiAgICAgICAqIFdpdGhvdXQgV2ViRHJpdmVyIHJhaXNpbmcgYHNjcmlwdCB0aW1lb3V0YCBldmVuIG9uY2UuIFdoYXQgYWN0dWFsbHkgaGFwcGVucyBwYXN0IHJvdWdobHkgaGFsZiBhXG4gICAgICAgKiBNaW51dGUgaXMgd29yc2UgdGhhbiBhIGxhdGUgYW5zd2VyOiB0aGUgY2xvc3VyZSBDT01QTEVURVMgaW4gdGhlIGd1ZXN0IG9uIHNjaGVkdWxlICh0aW1lcnMgYXJtZWQgYXRcbiAgICAgICAqIDMwcyBhbmQgNDBzIGZpcmVkIHdpdGhpbiB+MTNtcyBvZiBub21pbmFsLCBvbiBhIHZpc2libGUgYW5kIGZvY3VzZWQgcGFnZSkgYW5kIGl0cyBFeGVjdXRlIFNjcmlwdFxuICAgICAgICogUmVzcG9uc2UgbmV2ZXIgcmVhY2hlcyB0aGlzIGNsaWVudCBcdTIwMTQgc28gdGhlIHByb21pc2UgYmVsb3cgc2ltcGx5IG5ldmVyIHNldHRsZXMuXG4gICAgICAgKlxuICAgICAgICogQSBoYW5nIGlzIHRoZSBvbmUgZmFpbHVyZSBtb2RlIGEgdGVzdCBhdXRob3IgY2Fubm90IGFjdCBvbiwgc28gdGhlIHdhaXQgaXMgYm91bmRlZCBoZXJlLlxuICAgICAgICovXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlV2l0aGluQ2FwKGByZXR1cm4gKCR7ZXhwcmVzc2lvbn0pYCk7XG5cbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCB8fCByZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIE5PX09VVFBVVDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLypcbiAgICAgICAqIEEgY2FwIG92ZXJydW4gaXMgdGhlIG9uZSBmYWlsdXJlIGhlcmUgdGhhdCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIGNvbnRleHQ6IHRoZSBjbG9zdXJlIG91dHN0YXllZFxuICAgICAgICogSXRzIGJ1ZGdldCwgdGhlIFdlYlZpZXcgaXMgc3RpbGwgdGhlIFdlYlZpZXcuIFJlc2V0dGluZyB0aGUgZmxhZyB3b3VsZCBjaGFyZ2UgdGhlIE5FWFQgZXZhbCBhXG4gICAgICAgKiB+MTdzIGBzd2l0Y2hDb250ZXh0YCAoKipMMTkqKikgdG8gcmVjb3ZlciBmcm9tIHNvbWV0aGluZyB0aGF0IHdhcyBuZXZlciBsb3N0LlxuICAgICAgICovXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFdmFsQ2FwRXhjZWVkZWRFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgLy8gQ29udGV4dCBtYXkgaGF2ZSBiZWVuIGxvc3QgbWlkLWV4ZWN1dGlvbiAoZS5nLiBwYWdlIHJlbG9hZCkuXG4gICAgICB0aGlzLmlzSW5XZWJWaWV3Q29udGV4dCA9IGZhbHNlO1xuXG4gICAgICAvKlxuICAgICAgICogS2VwdCBhcyBhIGZhc3QgcGF0aCBldmVuIHRob3VnaCB0aGlzIGRyaXZlciB3YXMgbWVhc3VyZWQgbmV2ZXIgcmFpc2luZyBpdDogaXQgY29zdHMgbm90aGluZyxcbiAgICAgICAqIEl0IGlzIHRoZSBjb3JyZWN0IHRyYW5zbGF0aW9uIGlmIGEgZnV0dXJlIGRyaXZlciBkb2VzIGVuZm9yY2UgdGhlIGNhcGFiaWxpdHksIGFuZCBpdCBrZWVwcyB0aGUgdHdvXG4gICAgICAgKiBUcmFuc3BvcnRzIHJlcG9ydGluZyBvbmUgZXJyb3IgZm9yIG9uZSBjb25kaXRpb24uXG4gICAgICAgKi9cbiAgICAgIGlmIChpc1NjcmlwdFRpbWVvdXRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEV2YWxDYXBFeGNlZWRlZEVycm9yKHtcbiAgICAgICAgICBjYXBJbk1pbGxpc2Vjb25kczogdGhpcy5zY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgIG9wdGlvbk5hbWU6ICdzY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHMnLFxuICAgICAgICAgIHRyYW5zcG9ydE5hbWU6ICdBbmRyb2lkIChBcHBpdW0pJ1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNlc3Npb24gY29ubmVjdGlvbiBpbmZvIG5lZWRlZCB0byByZWF0dGFjaCB0byB0aGlzIHNlc3Npb25cbiAgICogZnJvbSBhbm90aGVyIHByb2Nlc3MgKGUuZy4gYSB0ZXN0IHdvcmtlcikuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzZXNzaW9uIElEIGFuZCBkZXZpY2UgSUQuXG4gICAqL1xuICBwdWJsaWMgZ2V0U2Vzc2lvbkluZm8oKTogQXBwaXVtU2Vzc2lvbkluZm8ge1xuICAgIHJldHVybiB7XG4gICAgICBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCxcbiAgICAgIHNlc3Npb25JZDogdGhpcy5icm93c2VyLnNlc3Npb25JZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgT2JzaWRpYW4gYXBwIGlzIHJ1bm5pbmcgYW5kIHRoZSBXZWJWaWV3IGlzIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIF92YXVsdFBhdGggLSBOb3QgdXNlZCBvbiBtb2JpbGUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJlZmxpZ2h0Q2hlY2soX3ZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbYXBwaXVtLXRyYW5zcG9ydF0gUnVubmluZyBwcmVmbGlnaHQgY2hlY2suLi4nKTtcbiAgICBjb25zdCBzdGF0ZSA9IGF3YWl0IHRoaXMuYnJvd3Nlci5xdWVyeUFwcFN0YXRlKHRoaXMuYXBwSWQpO1xuICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEFwcCBzdGF0ZTogJHtTdHJpbmcoc3RhdGUpfSAobmVlZCAke1N0cmluZyhBUFBfU1RBVEVfRk9SRUdST1VORCl9PWZvcmVncm91bmQpYCk7XG4gICAgaWYgKHN0YXRlICE9PSBBUFBfU1RBVEVfRk9SRUdST1VORCkge1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gQWN0aXZhdGluZyBhcHAgJHt0aGlzLmFwcElkfS4uLmApO1xuICAgICAgdGhpcy5pc0luV2ViVmlld0NvbnRleHQgPSBmYWxzZTtcbiAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5hY3RpdmF0ZUFwcCh0aGlzLmFwcElkKTtcbiAgICAgIGF3YWl0IGRlbGF5KEFQUF9SRVNUQVJUX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJWaWV3Q29udGV4dCgpO1xuICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIFByZWZsaWdodCBjaGVjayBwYXNzZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogUHVzaGVzIHZhdWx0IGZpbGVzIHRvIHRoZSBkZXZpY2UgdmlhIGNvbXByZXNzZWQgYGFkYiBwdXNoYC5cbiAgICpcbiAgICogQ3JlYXRlcyBhIHRhci5neiBhcmNoaXZlIG9mIHRoZSBsb2NhbCB2YXVsdCBkaXJlY3RvcnksIHB1c2hlcyBpdCB0byB0aGVcbiAgICogZGV2aWNlIGFzIGEgc2luZ2xlIGZpbGUsIGFuZCBleHRyYWN0cyBpdCBpbi1wbGFjZS4gVGhpcyBhdm9pZHMgdGhlXG4gICAqIHdlYmRyaXZlciBgUmFuZ2VFcnJvcmAgb24gbGFyZ2UgYmFzZTY0IHBheWxvYWRzIGFuZCBpcyBzaWduaWZpY2FudGx5XG4gICAqIGZhc3RlciB0aGFuIHBlci1maWxlIGBicm93c2VyLnB1c2hGaWxlKClgIGNhbGxzLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggKHVzZWQgYXMgdGhlIHZhdWx0IGRpcmVjdG9yeSBuYW1lIG9uIGRldmljZSkuXG4gICAqIEBwYXJhbSBfZmlsZXMgLSBNYXAgb2YgcmVsYXRpdmUgZmlsZSBwYXRocyB0byBjb250ZW50IGJ1ZmZlcnMgKHVudXNlZCBcdTIwMTQgYWRiIHB1c2hlcyB0aGUgZGlyZWN0b3J5IGRpcmVjdGx5KS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwdXNoRmlsZXModmF1bHRQYXRoOiBzdHJpbmcsIF9maWxlczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZXZpY2VWYXVsdFBhdGggPSB0aGlzLmdldERldmljZVZhdWx0UGF0aCh2YXVsdFBhdGgpO1xuICAgIGNvbnN0IGFyY2hpdmVOYW1lID0gYHZhdWx0LSR7cmFuZG9tVVVJRCgpfS50YXIuZ3pgO1xuICAgIGNvbnN0IGxvY2FsQXJjaGl2ZSA9IGpvaW4odG1wZGlyKCksIGFyY2hpdmVOYW1lKTtcbiAgICBjb25zdCByZW1vdGVBcmNoaXZlID0gYC9kYXRhL2xvY2FsL3RtcC8ke2FyY2hpdmVOYW1lfWA7XG5cbiAgICB0cnkge1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gQ3JlYXRpbmcgYXJjaGl2ZTogJHtsb2NhbEFyY2hpdmV9YCk7XG4gICAgICBhd2FpdCBleGVjKFsndGFyJywgJ2N6ZicsIGFyY2hpdmVOYW1lLCAnLUMnLCB2YXVsdFBhdGgsICcuJ10sIHsgY3dkOiB0bXBkaXIoKSwgaXNRdWlldDogdHJ1ZSB9KTtcblxuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gUHVzaGluZyBhcmNoaXZlIHRvIGRldmljZSAke3RoaXMuZGV2aWNlSWR9Li4uYCk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3B1c2gnLCBsb2NhbEFyY2hpdmUsIHJlbW90ZUFyY2hpdmVdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEV4dHJhY3RpbmcgYXJjaGl2ZSBvbiBkZXZpY2UgYXQgJHtkZXZpY2VWYXVsdFBhdGh9Li4uYCk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ21rZGlyJywgJy1wJywgZGV2aWNlVmF1bHRQYXRoXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICd0YXInLCAneHpmJywgcmVtb3RlQXJjaGl2ZSwgJy1DJywgZGV2aWNlVmF1bHRQYXRoXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gICAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBGbHVzaGluZyBmaWxlc3lzdGVtIGJ1ZmZlcnMuLi4nKTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAnc3luYyddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIENsZWFuaW5nIHVwIHJlbW90ZSBhcmNoaXZlLi4uJyk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ3JtJywgcmVtb3RlQXJjaGl2ZV0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcm0obG9jYWxBcmNoaXZlLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEdW1wcyBgYWRiIGxvZ2NhdGAgYW5kIHJldHVybnMgdGhlIFdlYlZpZXcgY29uc29sZS9lcnJvciBvdXRwdXQgbG9nZ2VkXG4gICAqIHNpbmNlIHRoZSBtYXJrZXIgZnJvbSB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0LmJlZ2luQ29uc29sZUNhcHR1cmV9LlxuICAgKlxuICAgKiBGaWx0ZXJzIHRvIHRoZSBDaHJvbWl1bS9XZWJWaWV3IHRhZ3MgdGhhdCBjYXJyeSBKUyBgY29uc29sZS4qYCBvdXRwdXQgYW5kXG4gICAqIHVuY2F1Z2h0IGVycm9ycywgYW5kIGNhcHMgdGhlIHJlc3VsdCBsZW5ndGguIEJvdW5kZWQsIHBvc3QtaG9jLFxuICAgKiBmYWlsdXJlLXBhdGgtb25seSBcdTIwMTQgbmV2ZXIgYSBsaXZlIG1vbml0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBoYW5kbGUgLSBUaGUgY2FwdHVyZSBoYW5kbGUgKG9yIGB1bmRlZmluZWRgIHdoZW4gY2FwdHVyZSBuZXZlciBzdGFydGVkKS5cbiAgICogQHJldHVybnMgVGhlIGNhcHR1cmVkIGNvbnNvbGUvZXJyb3IgdGV4dCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90aGluZyByZWxldmFudCB3YXMgbG9nZ2VkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYWRDb25zb2xlQ2FwdHVyZVNpbmNlKGhhbmRsZTogQ29uc29sZUNhcHR1cmVIYW5kbGUgfCB1bmRlZmluZWQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghaGFuZGxlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGR1bXAgPSBhd2FpdCBleGVjKFxuICAgICAgWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnbG9nY2F0JywgJy1kJywgJy12JywgJ3RpbWUnXSxcbiAgICAgIHsgaXNRdWlldDogdHJ1ZSwgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWUsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogTE9HQ0FUX0RVTVBfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfVxuICAgICk7XG5cbiAgICBjb25zdCBtYXJrZXJJbmRleCA9IGR1bXAubGFzdEluZGV4T2YoaGFuZGxlLm1hcmtlcik7XG4gICAgY29uc3QgcmVnaW9uID0gbWFya2VySW5kZXggPT09IC0xID8gZHVtcCA6IGR1bXAuc2xpY2UobWFya2VySW5kZXggKyBoYW5kbGUubWFya2VyLmxlbmd0aCk7XG4gICAgY29uc3QgcmVsZXZhbnQgPSByZWdpb25cbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IENPTlNPTEVfQ0FQVFVSRV9UQUdfUkUudGVzdChsaW5lKSlcbiAgICAgIC5qb2luKCdcXG4nKVxuICAgICAgLnRyaW0oKTtcblxuICAgIGlmICghcmVsZXZhbnQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbGV2YW50LnNsaWNlKC1DT05TT0xFX0NBUFRVUkVfVEFJTF9NQVhfTEVOR1RIKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSB2YXVsdCBvbiBtb2JpbGUgYnkgcHVzaGluZyBmaWxlcyBhbmQgY29uZmlndXJpbmcgbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiBUaGUgcmVnaXN0cmF0aW9uIGZsb3c6XG4gICAqIDEuIFB1c2ggYSBtaW5pbWFsIGAub2JzaWRpYW4vYXBwLmpzb25gIHRvIHRoZSBkZXZpY2Ugc28gT2JzaWRpYW4gcmVjb2duaXplcyB0aGUgdmF1bHRcbiAgICogMi4gU3dpdGNoIHRvIHRoZSBXZWJWaWV3IGNvbnRleHRcbiAgICogMy4gQWRkIHRoZSB2YXVsdCB0byBsb2NhbFN0b3JhZ2UgKGBtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzYCwgYG1vYmlsZS1zZWxlY3RlZC12YXVsdGAsXG4gICAqICAgIGBlbmFibGUtcGx1Z2luLTxwYXRoPmApXG4gICAqIDQuIFRyaWdnZXIgYGxvY2F0aW9uLnJlbG9hZCgpYCBzbyBPYnNpZGlhbiByZS1yZWFkcyBsb2NhbFN0b3JhZ2UgYW5kIG9wZW5zIHRoZSB2YXVsdFxuICAgKiA1LiBXYWl0IGZvciBgZ2xvYmFsVGhpcy5hcHBgIHRvIGV4aXN0ICh0aGUgYXBwJ3MgY29sZCBzdGFydCksIHRoZW4gXHUyMDE0IG9uIGFcbiAgICogICAgc2VwYXJhdGUsIHRpZ2h0ZXIgYnVkZ2V0IFx1MjAxNCBmb3IgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgXG4gICAqXG4gICAqIEV4aXN0aW5nIHZhdWx0IHJlZ2lzdHJhdGlvbnMgaW4gbG9jYWxTdG9yYWdlIGFyZSBwcmVzZXJ2ZWQgKGFwcGVuZCwgbm90XG4gICAqIG92ZXJ3cml0ZSkgXHUyMDE0IGV4Y2VwdCB0aGUgKipoYXJuZXNzJ3Mgb3duKiogYHRlbXAtdmF1bHQtKmAgcmVnaXN0cmF0aW9ucyBmcm9tXG4gICAqIGVhcmxpZXIgcnVucywgd2hpY2ggYXJlIHBydW5lZCB3aGVuIHtAbGluayBBcHBpdW1UcmFuc3BvcnRDb25maWcuc2hvdWxkU3dlZXBMZWZ0b3ZlcnN9XG4gICAqIGlzIG9uLiBUaGVpciBkaXJlY3RvcmllcyBhcmUgYWxyZWFkeSBnb25lICh0aGUgZmFjdG9yeSBzd2VlcHMgdGhlbSBiZWZvcmVcbiAgICogdGhlIGFwcCBsYXVuY2hlcyksIGFuZCBpdCBpcyB0aGlzIHJlZ2lzdHJ5IFx1MjAxNCBub3QgdGhlIGZpbGVzeXN0ZW0gXHUyMDE0IHRoYXRcbiAgICogT2JzaWRpYW4gZW51bWVyYXRlcyBhdCBzdGFydHVwLCBzbyBsZWF2aW5nIHRoZW0gaXMgd2hhdCBtYWtlcyBlYWNoIGZhaWxlZFxuICAgKiBydW4gc2xvdyB0aGUgbmV4dCBvbmUgZG93bi5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBSZWdpc3RlcmluZyB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gICAgY29uc3QgZGV2aWNlVmF1bHRQYXRoID0gdGhpcy5nZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoKTtcblxuICAgIC8vIFB1c2ggYSBtaW5pbWFsIC5vYnNpZGlhbiBkaXJlY3Rvcnkgc28gT2JzaWRpYW4gcmVjb2duaXplcyBpdCBhcyBhIHZhdWx0LlxuICAgIGF3YWl0IHRoaXMucHVzaE9ic2lkaWFuTWFya2VyKGRldmljZVZhdWx0UGF0aCk7XG5cbiAgICAvLyBTd2l0Y2ggdG8gV2ViVmlldyBhbmQgY29uZmlndXJlIGxvY2FsU3RvcmFnZS5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlZpZXdDb250ZXh0KCk7XG5cbiAgICAvLyBJbnZhbGlkYXRlIGJlZm9yZSByZWxvYWQgXHUyMDE0IHRoZSBwYWdlIHdpbGwgbmF2aWdhdGUgYW5kIHRoZSBXZWJWaWV3XG4gICAgLy8gY29udGV4dCBtYXkgYmUgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUgZHVyaW5nIHJlbG9hZC5cbiAgICB0aGlzLmlzSW5XZWJWaWV3Q29udGV4dCA9IGZhbHNlO1xuXG4gICAgY29uc3Qgc3RhbGVQcmVmaXggPSB0aGlzLnNob3VsZFN3ZWVwTGVmdG92ZXJzID8gYCR7dGhpcy52YXVsdEJhc2VQYXRofSR7VEVNUF9WQVVMVF9ESVJfUFJFRklYfWAgOiAnJztcblxuICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5leGVjdXRlKFxuICAgICAgKHBhdGg6IHN0cmluZywgcHJ1bmVQcmVmaXg6IHN0cmluZykgPT4ge1xuICAgICAgICBsZXQgZXhpc3RpbmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzJykgPz8gJ1tdJykgYXMgc3RyaW5nW107XG5cbiAgICAgICAgaWYgKHBydW5lUHJlZml4KSB7XG4gICAgICAgICAgY29uc3Qgc3RhbGUgPSBleGlzdGluZy5maWx0ZXIoKHJlZ2lzdGVyZWQpID0+IHJlZ2lzdGVyZWQgIT09IHBhdGggJiYgcmVnaXN0ZXJlZC5zdGFydHNXaXRoKHBydW5lUHJlZml4KSk7XG4gICAgICAgICAgZm9yIChjb25zdCByZWdpc3RlcmVkIG9mIHN0YWxlKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgZW5hYmxlLXBsdWdpbi0ke3JlZ2lzdGVyZWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGV4aXN0aW5nID0gZXhpc3RpbmcuZmlsdGVyKChyZWdpc3RlcmVkKSA9PiAhc3RhbGUuaW5jbHVkZXMocmVnaXN0ZXJlZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFleGlzdGluZy5pbmNsdWRlcyhwYXRoKSkge1xuICAgICAgICAgIGV4aXN0aW5nLnB1c2gocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21vYmlsZS1leHRlcm5hbC12YXVsdHMnLCBKU09OLnN0cmluZ2lmeShleGlzdGluZykpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbW9iaWxlLXNlbGVjdGVkLXZhdWx0JywgcGF0aCk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBlbmFibGUtcGx1Z2luLSR7cGF0aH1gLCAndHJ1ZScpO1xuICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgIH0sXG4gICAgICBkZXZpY2VWYXVsdFBhdGgsXG4gICAgICBzdGFsZVByZWZpeFxuICAgICk7XG5cbiAgICAvLyBXYWl0IGZvciByZWxvYWQgKyB2YXVsdCBpbml0aWFsaXphdGlvbiwgYXMgdHdvIHNlcGFyYXRlbHkgYnVkZ2V0ZWQgcGhhc2VzOlxuICAgIC8vIFRoZSBhcHAncyBjb2xkIHN0YXJ0IGZpcnN0LCB0aGVuIE9ic2lkaWFuJ3Mgb3duIHdvcmsuIFNlZSBgd2FpdEZvckFwcFN0YXJ0ZWRgLlxuICAgIGF3YWl0IHRoaXMud2FpdEZvckFwcFN0YXJ0ZWQoKTtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JMYXlvdXRSZWFkeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgdmF1bHQgb24gbW9iaWxlIGJ5IHJlbW92aW5nIGl0IGZyb20gbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiBQcmVzZXJ2ZXMgb3RoZXIgdmF1bHQgcmVnaXN0cmF0aW9ucy4gSWYgdGhlIHVucmVnaXN0ZXJlZCB2YXVsdCB3YXMgc2VsZWN0ZWQsXG4gICAqIHN3aXRjaGVzIHRvIHRoZSBmaXJzdCByZW1haW5pbmcgdmF1bHQgKG9yIGNsZWFycyB0aGUgc2VsZWN0aW9uKS5cbiAgICpcbiAgICogVGhlIHZhdWx0J3MgKipmaWxlcyBhcmUgdGhlbiByZW1vdmVkIGZyb20gdGhlIGRldmljZSBvdmVyIGBhZGJgLCB3aGV0aGVyIG9yXG4gICAqIG5vdCB0aGUgYGxvY2FsU3RvcmFnZWAgc3RlcCBzdWNjZWVkZWQqKiBcdTIwMTQgZGVsaWJlcmF0ZWx5LCBiZWNhdXNlIHRoZVxuICAgKiBgbG9jYWxTdG9yYWdlYCBzdGVwIGdvZXMgdGhyb3VnaCB0aGUgV2ViVmlldyBhbmQgYSBkZWFkIFdlYlZpZXcgaXMgZXhhY3RseVxuICAgKiB3aGF0IG1vc3QgQW5kcm9pZCBmYWlsdXJlcyBhcmUuIFJvdXRpbmcgdGhlIHJlbW92YWwgdGhyb3VnaCB0aGUgYXBwIHdhcyB3aGF0XG4gICAqIG1hZGUgZXZlcnkgZmFpbGVkIHJ1biBsZWFrIGl0cyB2YXVsdCAoYFZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6IG5vXG4gICAqIHN1Y2ggd2luZG93YCksIHNvIHRoZSBmaWxlc3lzdGVtLWxldmVsIHJlbW92YWwgbXVzdCBub3QgZGVwZW5kIG9uIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IG9uIHRoZSBob3N0IG1hY2hpbmUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGV2aWNlVmF1bHRQYXRoID0gdGhpcy5nZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlZpZXdDb250ZXh0KCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5leGVjdXRlKChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzJykgPz8gJ1tdJykgYXMgc3RyaW5nW107XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gZXhpc3RpbmcuZmlsdGVyKCh2KSA9PiB2ICE9PSBwYXRoKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21vYmlsZS1leHRlcm5hbC12YXVsdHMnLCBKU09OLnN0cmluZ2lmeShmaWx0ZXJlZCkpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShgZW5hYmxlLXBsdWdpbi0ke3BhdGh9YCk7XG4gICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbW9iaWxlLXNlbGVjdGVkLXZhdWx0JykgPT09IHBhdGgpIHtcbiAgICAgICAgICBpZiAoZmlsdGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21vYmlsZS1zZWxlY3RlZC12YXVsdCcsIGZpbHRlcmVkWzBdID8/ICcnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ21vYmlsZS1zZWxlY3RlZC12YXVsdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgZGV2aWNlVmF1bHRQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKFxuICAgICAgICBgW2FwcGl1bS10cmFuc3BvcnRdIENvdWxkIG5vdCBkZXJlZ2lzdGVyICR7ZGV2aWNlVmF1bHRQYXRofSBmcm9tIGxvY2FsU3RvcmFnZSBgXG4gICAgICAgICAgKyBgKCR7U3RyaW5nKGVycm9yKX0pOyByZW1vdmluZyBpdHMgZmlsZXMgYW55d2F5LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5yZW1vdmVEZXZpY2VWYXVsdERpcmVjdG9yeShkZXZpY2VWYXVsdFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgdHJ1c3RlZC1pbnB1dCBjaGFubmVsLCBpZiBvbmUgaXMgb3Blbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcG9zZUlucHV0Q2hhbm5lbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5pbnB1dENoYW5uZWw7XG4gICAgdGhpcy5pbnB1dENoYW5uZWwgPSBudWxsO1xuICAgIHRoaXMudW5yZWdpc3RlcklucHV0Q2hhbm5lbEV4aXRIYW5kbGVyKCk7XG4gICAgYXdhaXQgY2hhbm5lbD8uZGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwgaWYgaXQgaXMgbm90IGFscmVhZHkgb3BlbiwgYW5kIHJlLW9wZW5zIGl0IGlmIHRoZSBXZWJWaWV3IHdlbnQgYXdheS5cbiAgICpcbiAgICogSW5zdGFsbHMgYSBgUnVudGltZS5hZGRCaW5kaW5nYCBmdW5jdGlvbiBvbiB0aGUgcGFnZSBhbmQgc2VydmljZXMgZXZlcnkgY2FsbCB0byBpdCBmb3IgdGhlIGxpZmUgb2YgdGhlXG4gICAqIGNvbm5lY3Rpb24uIFRoZSBiaW5kaW5nIGlzIGV4cG9zZWQgb24gKmV2ZXJ5KiBleGVjdXRpb24gY29udGV4dCBvZiB0aGUgcGFnZSwgc28gaXQgc3Vydml2ZXMgdGhlXG4gICAqIGBsb2NhdGlvbi5yZWxvYWQoKWAgdGhhdCB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0LnJlZ2lzdGVyVmF1bHR9IHBlcmZvcm1zOyBvbmx5IGEgZnVsbCBhcHAgcmVzdGFydCwgd2hpY2hcbiAgICogZGVzdHJveXMgdGhlIFdlYlZpZXcgdGFyZ2V0LCBuZWVkcyB0aGUgcmVjb25uZWN0IGJlbG93LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVJbnB1dENoYW5uZWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5wdXRDaGFubmVsPy5pc09wZW4gfHwgdGhpcy5pc0lucHV0Q2hhbm5lbFVuYXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIGNoYW5uZWwgaXMgcmVhY2hhYmxlIG9ubHkgb3ZlciBsb2NhbCBgYWRiYCwgc28gaXQgZG9lcyBub3QgZXhpc3Qgb24gaU9TIG9yIGFnYWluc3QgYSByZW1vdGUgaHViXG4gICAgLy8gKEJyb3dzZXJTdGFjaykuIFRob3NlIGFyZSBzdXBwb3J0ZWQgdHJhbnNwb3J0cywgc28gdGhpcyBzdGF5cyAqKmJlc3QtZWZmb3J0Kio6IGEgcnVuIHRoYXQgbmV2ZXJcbiAgICAvLyBkcml2ZXMgaW5wdXQgbXVzdCBub3QgZmFpbCBiZWNhdXNlIHRoZSBjaGFubmVsIGNvdWxkIG5vdCBiZSBvcGVuZWQuIEEgcnVuIHRoYXQgKmRvZXMqIGRyaXZlIGlucHV0XG4gICAgLy8gZ2V0cyBhIGxlZ2libGUgZXJyb3IgZnJvbSB0aGUgcmVuZGVyZXIncyBvd24gZ3VhcmQsIHdoaWNoIG5hbWVzIHRoZSBtaXNzaW5nIGNoYW5uZWwuXG4gICAgaWYgKHRoaXMucGxhdGZvcm0gIT09ICdhbmRyb2lkJykge1xuICAgICAgdGhpcy5pc0lucHV0Q2hhbm5lbFVuYXZhaWxhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmRpc3Bvc2VJbnB1dENoYW5uZWwoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgY29ubmVjdFRvV2ViVmlld0NkcCh7IGFwcElkOiB0aGlzLmFwcElkLCBkZXZpY2VJZDogdGhpcy5kZXZpY2VJZCB9KTtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZCgnUnVudGltZS5lbmFibGUnKTtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZCgnUnVudGltZS5hZGRCaW5kaW5nJywgeyBuYW1lOiBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FIH0pO1xuICAgICAgY29ubmVjdGlvbi5vbignUnVudGltZS5iaW5kaW5nQ2FsbGVkJywgKHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgaWYgKHBhcmFtc1snbmFtZSddICE9PSBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHBhcmFtc1sncGF5bG9hZCddO1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgbm90IGF3YWl0ZWQ6IHRoaXMgcnVucyB3aGlsZSB0aGUgcmVuZGVyZXIncyBgRXhlY3V0ZSBTY3JpcHRgIGlzIHN0aWxsIHBlbmRpbmcsIGFuZFxuICAgICAgICAvLyB0aGF0IGlzIHRoZSB3aG9sZSBwb2ludCBcdTIwMTQgdGhlIHJlcXVlc3QgaXMgc2VydmljZWQgY29uY3VycmVudGx5IGFuZCBhbnN3ZXJlZCBieSByZXNvbHZpbmcgdGhlXG4gICAgICAgIC8vIHJlbmRlcmVyJ3MgcHJvbWlzZSBvdmVyIHRoaXMgc2FtZSBzb2NrZXQuIEl0IGhhbmRsZXMgaXRzIG93biBmYWlsdXJlcywgc28gbm90aGluZyByZWFjaGVzIGhlcmUuXG4gICAgICAgIHRoaXMuaGFuZGxlSW5wdXRSZXF1ZXN0KGNvbm5lY3Rpb24sIHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJyA/IHBheWxvYWQgOiAnJykuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIFVucmVhY2hhYmxlOiBgaGFuZGxlSW5wdXRSZXF1ZXN0YCBuZXZlciByZWplY3RzLlxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmlucHV0Q2hhbm5lbCA9IGNvbm5lY3Rpb247XG5cbiAgICAgIC8vIFNlbGYtY2xlYW5pbmcsIGRlbGliZXJhdGVseTogdGhpcyB0cmFuc3BvcnQgY2FuIGJlIGNyZWF0ZWQgc3RyYWlnaHQgZnJvbSBhIHRlc3Qgd29ya2VyLCB3aXRoIG5vXG4gICAgICAvLyBgY29yZVNldHVwYCBvd25pbmcgaXRzIGxpZmVjeWNsZSBhbmQgdGhlcmVmb3JlIG5vdGhpbmcgdGhhdCBldmVyIGNhbGxzIGBkaXNwb3NlYC9gZGlzcG9zZVN5bmNgIFx1MjAxNFxuICAgICAgLy8gd2hpY2ggaXMgaG93IGEgcnVuIGxlYXZlcyBpdHMgYWRiIHBvcnQgZm9yd2FyZCBzdHJhbmRlZCBvbiB0aGUgZGV2aWNlIChvYnNlcnZlZCAyMDI2LTA4LTMwKS4gVGhlXG4gICAgICAvLyBoYW5kbGVyIGlzIHJlbW92ZWQgYWdhaW4gb24gZGlzcG9zYWwgc28gcmVjb25uZWN0cyBkbyBub3Qgc3RhY2sgbGlzdGVuZXJzLlxuICAgICAgdGhpcy5kaXNwb3NlSW5wdXRDaGFubmVsT25FeGl0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25uZWN0aW9uLmRpc3Bvc2VTeW5jKCk7XG4gICAgICB9O1xuICAgICAgcHJvY2Vzcy5vbmNlKCdleGl0JywgdGhpcy5kaXNwb3NlSW5wdXRDaGFubmVsT25FeGl0KTtcblxuICAgICAgbG9nKCdbYXBwaXVtLXRyYW5zcG9ydF0gVHJ1c3RlZC1pbnB1dCBjaGFubmVsIG9wZW4uJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIEdpdmUgdXAgZm9yIHRoZSBsaWZlIG9mIHRoZSB0cmFuc3BvcnQgcmF0aGVyIHRoYW4gcGF5aW5nIGFuIGBhZGJgIHJvdW5kLXRyaXAgb24gZXZlcnkgZXZhbC5cbiAgICAgIC8vIEEgc29ja2V0IHRoYXQgbWVyZWx5ICpjbG9zZWQqIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjb25uZWN0IGlzIGEgZGlmZmVyZW50IGNhc2UgXHUyMDE0IGBpc09wZW5gIGlzIGZhbHNlXG4gICAgICAvLyB0aGVyZSB3aGlsZSB0aGlzIGZsYWcgc3RheXMgdW5zZXQsIHNvIHRoZSByZWNvbm5lY3QgYWJvdmUgc3RpbGwgcnVucy5cbiAgICAgIHRoaXMuaXNJbnB1dENoYW5uZWxVbmF2YWlsYWJsZSA9IHRydWU7XG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBUcnVzdGVkIGlucHV0IGlzIHVuYXZhaWxhYmxlIG9uIHRoaXMgZGV2aWNlOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTd2l0Y2hlcyB0aGUgZHJpdmVyIHRvIHRoZSBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dC5cbiAgICpcbiAgICogSWYgdGhlIGNvbnRleHQgd2FzIGFscmVhZHkgdmVyaWZpZWQgKGNhY2hlZCB2aWEge0BsaW5rIGlzSW5XZWJWaWV3Q29udGV4dH0pLFxuICAgKiByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGhvdXQgY2FsbGluZyBgZ2V0Q29udGV4dHMoKWAgXHUyMDE0IHdoaWNoIHJ1bnNcbiAgICogYGFkYiBzaGVsbCBjYXQgL3Byb2MvbmV0L3VuaXhgIGFuZCBjYW4gdGltZSBvdXQgb24gc2xvdyBlbXVsYXRvcnMuXG4gICAqXG4gICAqIFBvbGxzIHVudGlsIHRoZSBjb250ZXh0IGJlY29tZXMgYXZhaWxhYmxlICh0aGUgYXBwIG1heSBzdGlsbCBiZSBsb2FkaW5nKS5cbiAgICogVXNlcyB0aGUgYFdFQlZJRVdfbWQub2JzaWRpYW5gIGNvbnRleHQgc3BlY2lmaWNhbGx5IHRvIGF2b2lkIGNvbm5lY3RpbmdcbiAgICogdG8gQ2hyb21lIG9yIG90aGVyIFdlYlZpZXdzIG9uIHRoZSBkZXZpY2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZVdlYlZpZXdDb250ZXh0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzSW5XZWJWaWV3Q29udGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRoaXMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcztcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBXYWl0aW5nIGZvciAke1dFQlZJRVdfQ09OVEVYVF9QUkVGSVh9IGNvbnRleHQgKHRpbWVvdXQ9JHtTdHJpbmcodGhpcy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzKX1tcykuLi5gKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IGNvbnRleHRzID0gYXdhaXQgdGhpcy5icm93c2VyLmdldENvbnRleHRzKCk7XG4gICAgICBjb25zdCBvYnNpZGlhbkNvbnRleHQgPSBjb250ZXh0cy5maW5kKChjb250ZXh0KTogY29udGV4dCBpcyBzdHJpbmcgPT4gdHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnICYmIGNvbnRleHQuc3RhcnRzV2l0aChXRUJWSUVXX0NPTlRFWFRfUFJFRklYKSk7XG5cbiAgICAgIGlmIChvYnNpZGlhbkNvbnRleHQpIHtcbiAgICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gRm91bmQgV2ViVmlldyBjb250ZXh0OiAke29ic2lkaWFuQ29udGV4dH1gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmJyb3dzZXIuc3dpdGNoQ29udGV4dChvYnNpZGlhbkNvbnRleHQpO1xuICAgICAgICAgIHRoaXMuaXNJbldlYlZpZXdDb250ZXh0ID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gc3dpdGNoQ29udGV4dCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX0uIFJlc2V0dGluZyB0byBOQVRJVkVfQVBQIGJlZm9yZSByZXRyeWluZy4uLmApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmJyb3dzZXIuc3dpdGNoQ29udGV4dCgnTkFUSVZFX0FQUCcpO1xuICAgICAgICAgIH0gY2F0Y2ggKHJlc2V0RXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIE5BVElWRV9BUFAgcmVzZXQgYWxzbyBmYWlsZWQ6ICR7U3RyaW5nKHJlc2V0RXJyb3IpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBXZWJWaWV3IG5vdCByZWFkeSwgYXZhaWxhYmxlIGNvbnRleHRzOiAke0pTT04uc3RyaW5naWZ5KGNvbnRleHRzKX0uIFJldHJ5aW5nLi4uYCk7XG4gICAgICBhd2FpdCBkZWxheShXRUJWSUVXX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vICR7V0VCVklFV19DT05URVhUX1BSRUZJWH0gY29udGV4dCBmb3VuZCB3aXRoaW4gJHtTdHJpbmcodGhpcy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzKX1tcy4gSXMgdGhlIE9ic2lkaWFuIGFwcCBmdWxseSBsb2FkZWQ/YCk7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBvbmUgRXhlY3V0ZSBTY3JpcHQgdW5kZXIgdGhlIHBlci1ldmFsIGNhcCwgcmFpc2luZyB7QGxpbmsgRXZhbENhcEV4Y2VlZGVkRXJyb3J9IGlmIGl0IG91dGxhc3RzIGl0LlxuICAgKlxuICAgKiBUaGUgY2FwIGNvdmVycyB0aGUgc2NyaXB0IEFMT05FIFx1MjAxNCBgZW5zdXJlV2ViVmlld0NvbnRleHRgIGFuZCBgZW5zdXJlSW5wdXRDaGFubmVsYCBydW4gYmVmb3JlIGl0LFxuICAgKiBiZWNhdXNlIGEgYHN3aXRjaENvbnRleHRgIGxlZ2l0aW1hdGVseSBjb3N0cyB+MTdzICgqKkwxOSoqKSBhbmQgY2hhcmdpbmcgdGhhdCB0byBhIHRlc3QncyBvd24gYnVkZ2V0XG4gICAqIHdvdWxkIHJlcG9ydCB0aGUgaGFybmVzcydzIHNldHVwIGFzIHRoZSB0ZXN0J3Mgb3ZlcnJ1bi5cbiAgICpcbiAgICogVGhlIGFiYW5kb25lZCByZXF1ZXN0IGlzIGRlbGliZXJhdGVseSBsZWZ0IGluIGZsaWdodCByYXRoZXIgdGhhbiBjYW5jZWxsZWQuIE5vdGhpbmcgY2FuIGNhbmNlbCBpdDpcbiAgICogYFJ1bnRpbWUudGVybWluYXRlRXhlY3V0aW9uYCBvdmVyIHRoZSB0cmFuc3BvcnQncyBvd24gQ0RQIGNoYW5uZWwgd2FzIG1lYXN1cmVkIHJlbGVhc2luZyBub3RoaW5nLFxuICAgKiBhbmQgYSBndWVzdC1zaWRlIGFib3J0IGhvb2sgY291bGQgbm90IGV2ZW4gYmUgaW5zdGFsbGVkIGluIHRpbWUuIFdoYXQgdGhlIHNhbWUgcnVucyBkaWQgc2hvdyBpcyB0aGF0XG4gICAqIHRoZSBzZXNzaW9uIHVzdWFsbHkga2VlcHMgc2VydmluZyBcdTIwMTQgYSB2YXVsdCByZWFkLWJhY2sgd2FzIGFuc3dlcmVkIDUyOG1zIGFmdGVyIG9uZSBzdWNoIGFiYW5kb25tZW50LFxuICAgKiB3aXRoIHRoZSBzZXNzaW9uIGZyZWUgXHUyMDE0IHNvIGJvdW5kaW5nIHRoZSB3YWl0IGNvc3RzIGEgdGVzdCBpdHMgY2xvc3VyZSwgbm90IHRoZSByZXN0IG9mIGl0cyBzdWl0ZS5cbiAgICpcbiAgICogQHBhcmFtIHNjcmlwdCAtIFRoZSBzY3JpcHQgdG8gcnVuLCBhbHJlYWR5IHdyYXBwZWQgaW4gaXRzIGByZXR1cm4gKC4uLilgLlxuICAgKiBAcmV0dXJucyBUaGUgc2NyaXB0J3MgcmVzdWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBldmFsdWF0ZVdpdGhpbkNhcChzY3JpcHQ6IHN0cmluZyk6IFByb21pc2U8bnVsbCB8IHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIC8qXG4gICAgICogVGhlIGV2YWwgQUZURVIgYW4gb3ZlcnJ1biBnZXRzIGEgZ3JhY2UgcGVyaW9kIG9uIHRvcCBvZiB0aGUgY2FwLCBhbmQgdGhpcyBpcyBub3QgZ2VuZXJvc2l0eS4gQXBwaXVtXG4gICAgICogU2VyaWFsaXplcyBjb21tYW5kcyBwZXIgc2Vzc2lvbiwgYW5kIGFuIGFiYW5kb25lZCBjbG9zdXJlIGtlZXBzIHJ1bm5pbmcgaW4gdGhlIGd1ZXN0IFx1MjAxNCBzbyB0aGUgbmV4dFxuICAgICAqIENvbW1hbmQgcXVldWVzIGJlaGluZCB3aGF0ZXZlciBpcyBsZWZ0IG9mIGl0IGFuZCwgb24gdGhlIGJhcmUgY2FwLCBpcyBjYXBwZWQgaW4gaXRzIHR1cm4uIFRoYXQgaXNcbiAgICAgKiBNZWFzdXJlZDogd2l0aCB0aGUgY2FwIGZpcmluZyBhdCAzMHMgYWdhaW5zdCBhIDQwcyBjbG9zdXJlLCB0aGUgZm9sbG93aW5nIHZhdWx0IHJlYWQtYmFjayBmYWlsZWQgYXRcbiAgICAgKiAzMCAyMDZtcywgd2hpbGUgdGhlIHNhbWUgcmVhZC1iYWNrIGlzc3VlZCBhZnRlciB0aGUgY2xvc3VyZSBoYWQgZmluaXNoZWQgd2FzIGFuc3dlcmVkIGluIDUyOG1zLlxuICAgICAqXG4gICAgICogV2FpdGluZyBvbiB0aGUgYWJhbmRvbmVkIHJlcXVlc3QgaW5zdGVhZCB3b3VsZCBub3Qgd29yazogdGhhdCBwcm9taXNlIGlzIHRoZSBvbmUgdGhhdCBuZXZlciBzZXR0bGVzLlxuICAgICAqIFdoYXQgZnJlZXMgdGhlIHNlc3Npb24gaXMgdGhlIEdVRVNUIGZpbmlzaGluZywgb24gYSBzY2hlZHVsZSB0aGlzIHNpZGUgY2Fubm90IGtub3cgXHUyMDE0IHNvIHRoZSBncmFjZSBpc1xuICAgICAqIGEgY2VpbGluZywgbm90IGEgZGVsYXkuIEl0IGNvc3RzIG5vdGhpbmcgd2hlbiB0aGUgc2Vzc2lvbiBjb21lcyBiYWNrIHByb21wdGx5LCB3aGljaCBpcyB0aGUgbm9ybS5cbiAgICAgKi9cbiAgICBjb25zdCBidWRnZXRJbk1pbGxpc2Vjb25kcyA9IHRoaXMuaXNSZWNvdmVyaW5nRnJvbUNhcE92ZXJydW5cbiAgICAgID8gdGhpcy5zY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHMgKyBDQVBfUkVDT1ZFUllfR1JBQ0VfSU5fTUlMTElTRUNPTkRTXG4gICAgICA6IHRoaXMuc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzO1xuICAgIHRoaXMuaXNSZWNvdmVyaW5nRnJvbUNhcE92ZXJydW4gPSBmYWxzZTtcblxuICAgIGxldCBjYXBUaW1lcjogTm9kZUpTLlRpbWVvdXQgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjYXAgPSBuZXcgUHJvbWlzZTxuZXZlcj4oKF9yZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNhcFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNSZWNvdmVyaW5nRnJvbUNhcE92ZXJydW4gPSB0cnVlO1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEV2YWxDYXBFeGNlZWRlZEVycm9yKHtcbiAgICAgICAgICAgIGNhcEluTWlsbGlzZWNvbmRzOiBidWRnZXRJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgIGNhdXNlOiBuZXcgRXJyb3IoYFRoZSBBcHBpdW0gRXhlY3V0ZSBTY3JpcHQgY2FycnlpbmcgdGhpcyBjbG9zdXJlIGRpZCBub3QgYW5zd2VyIHdpdGhpbiAke1N0cmluZyhidWRnZXRJbk1pbGxpc2Vjb25kcyl9bXMuYCksXG4gICAgICAgICAgICBvcHRpb25OYW1lOiAnc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzJyxcbiAgICAgICAgICAgIHRyYW5zcG9ydE5hbWU6ICdBbmRyb2lkIChBcHBpdW0pJ1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9LCBidWRnZXRJbk1pbGxpc2Vjb25kcyk7XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgIHRoaXMuYnJvd3Nlci5leGVjdXRlPG51bGwgfCBzdHJpbmcgfCB1bmRlZmluZWQsIFtdPihzY3JpcHQpLFxuICAgICAgICBjYXBcbiAgICAgIF0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoY2FwVGltZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQoY2FwVGltZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGhvc3Qtc2lkZSB2YXVsdCBwYXRoIHRvIHRoZSBkZXZpY2Utc2lkZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gQWJzb2x1dGUgcGF0aCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICAgKiBAcmV0dXJucyBUaGUgZGV2aWNlLXNpZGUgdmF1bHQgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgZ2V0RGV2aWNlVmF1bHRQYXRoKHZhdWx0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy52YXVsdEJhc2VQYXRofSR7ZXh0cmFjdFZhdWx0TmFtZSh2YXVsdFBhdGgpfWA7XG4gIH1cblxuICAvKipcbiAgICogU2VydmljZXMgb25lIGlucHV0IHJlcXVlc3QgZnJvbSB0aGUgcmVuZGVyZXI6IGluamVjdCwgdGhlbiByZXNvbHZlIHRoZSByZW5kZXJlcidzIHByb21pc2UuXG4gICAqXG4gICAqIEV2ZXJ5IGZhaWx1cmUgcGF0aCBzdGlsbCByZXNvbHZlcyB0aGF0IHByb21pc2UgXHUyMDE0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSB0aGUgcmVuZGVyZXIgcmUtdGhyb3dzIFx1MjAxNCBiZWNhdXNlXG4gICAqIGEgcmVxdWVzdCB0aGF0IGlzIHNpbGVudGx5IGRyb3BwZWQgd291bGQgaGFuZyB0aGUgY2xvc3VyZSB1bnRpbCB0aGUgd2hvbGUgcnVuIHRpbWVzIG91dCwgYW5kIHJlcG9ydFxuICAgKiBub3RoaW5nIGFib3V0IHdoeS5cbiAgICpcbiAgICogQHBhcmFtIGNvbm5lY3Rpb24gLSBUaGUgY2hhbm5lbCB0aGUgcmVxdWVzdCBhcnJpdmVkIG9uLlxuICAgKiBAcGFyYW0gcGF5bG9hZCAtIFRoZSByYXcgSlNPTiBwYXlsb2FkIHRoZSBiaW5kaW5nIHdhcyBjYWxsZWQgd2l0aC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlSW5wdXRSZXF1ZXN0KGNvbm5lY3Rpb246IFdlYlZpZXdDZHBDb25uZWN0aW9uLCBwYXlsb2FkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcmVxdWVzdElkID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgaWQsIHJlcXVlc3QgfSA9IEpTT04ucGFyc2UocGF5bG9hZCkgYXMgTW9iaWxlSW5wdXRFbnZlbG9wZTtcbiAgICAgIHJlcXVlc3RJZCA9IGlkO1xuXG4gICAgICAvLyBFeGFjdGx5LW9uY2UgYWNyb3NzIGV2ZXJ5IGF0dGFjaGVkIGhvc3QuIGBSdW50aW1lLmJpbmRpbmdDYWxsZWRgIGlzIGJyb2FkY2FzdCB0byBBTEwgYXR0YWNoZWRcbiAgICAgIC8vIENEUCBzZXNzaW9ucywgc28gd2l0aG91dCB0aGlzIGVhY2ggcHJvY2VzcyBpbmplY3RzIHRoZSBnZXN0dXJlIGFnYWluOiBtZWFzdXJlZCAyMDI2LTA5LTEwLCBhXG4gICAgICAvLyBWaXRlc3QgbWFpbiBwcm9jZXNzIGFuZCBpdHMgd29ya2VyIHNlcnZpY2VkIHJlcXVlc3QgYGlkPTFgIGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kLCBhbmQgb25lXG4gICAgICAvLyBgY2xpY2tFbGVtZW50YCByZWFjaGVkIHRoZSBwYWdlIGFzIHR3byBgcG9pbnRlcmRvd25gIC8gYHRvdWNoc3RhcnRgIHBhaXJzLlxuICAgICAgLy9cbiAgICAgIC8vIEEgTE9TRVIgTVVTVCBSRVRVUk4gU0lMRU5UTFk6IHRoZSB3aW5uZXIgaXMgdGhlIG9uZSB0aGF0IGluamVjdHMgYW5kIHRoZSBvbmUgdGhhdCByZXNvbHZlcyB0aGVcbiAgICAgIC8vIHJlbmRlcmVyJ3MgcHJvbWlzZSwgc28gYW5zd2VyaW5nIGhlcmUgYXMgd2VsbCB3b3VsZCByZXNvbHZlIGEgcmVxdWVzdCB3aG9zZSBnZXN0dXJlIHRoaXNcbiAgICAgIC8vIHByb2Nlc3MgbmV2ZXIgc2VudC5cbiAgICAgIGNvbnN0IGNsYWltID0gYXdhaXQgY29ubmVjdGlvbi5zZW5kKCdSdW50aW1lLmV2YWx1YXRlJywgeyBleHByZXNzaW9uOiBidWlsZENsYWltSW5wdXRFeHByZXNzaW9uKGlkKSwgcmV0dXJuQnlWYWx1ZTogdHJ1ZSB9KTtcbiAgICAgIGlmICghY2hlY2tJbnB1dENsYWltR3JhbnRlZChjbGFpbSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmRBbGwodG9DZHBJbnB1dENvbW1hbmRzKHJlcXVlc3QpKTtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZCgnUnVudGltZS5ldmFsdWF0ZScsIHsgZXhwcmVzc2lvbjogYnVpbGRSZXNvbHZlSW5wdXRFeHByZXNzaW9uKGlkKSB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yVG9TdHJpbmcoZXJyb3IpO1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gVHJ1c3RlZCBpbnB1dCBmYWlsZWQ6ICR7bWVzc2FnZX1gKTtcbiAgICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5zZW5kKCdSdW50aW1lLmV2YWx1YXRlJywgeyBleHByZXNzaW9uOiBidWlsZFJlc29sdmVJbnB1dEV4cHJlc3Npb24ocmVxdWVzdElkLCBtZXNzYWdlKSB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgc29ja2V0IGlzIGdvbmU7IHRoZSByZW5kZXJlcidzIG93biB0aW1lb3V0IGlzIHRoZSByZW1haW5pbmcgYmFja3N0b3AuXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2JlcyB0aGUgV2ViVmlldyBvbmNlIGZvciBob3cgZmFyIE9ic2lkaWFuJ3Mgc3RhcnR1cCBoYXMgZ290LlxuICAgKlxuICAgKiBBIHByb2JlIHRoYXQgdGhyb3dzIGlzIHJlcG9ydGVkIGFzIGB1bmRlZmluZWRgIHJhdGhlciB0aGFuIHByb3BhZ2F0ZWQ6IHRoZVxuICAgKiBwYWdlIGlzIG1pZC1gbG9jYXRpb24ucmVsb2FkKClgIGZvciBtb3N0IG9mIHRoZSBhcHAtc3RhcnQgcGhhc2UsIGFuZCBhXG4gICAqIFdlYlZpZXcgdGhhdCBjYW5ub3QgYW5zd2VyIHlldCBpcyB0aGUgKmV4cGVjdGVkKiByZWFkaW5nIHRoZXJlLCBub3QgYW4gZXJyb3IuXG4gICAqXG4gICAqIEByZXR1cm5zIFdoYXQgdGhlIHByb2JlIHNhdywgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBjb3VsZCBub3QgcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9iZVN0YXJ0dXAoKTogUHJvbWlzZTxTdGFydHVwUHJvYmVSZXN1bHQgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYnJvd3Nlci5leGVjdXRlKCgpOiBTdGFydHVwUHJvYmVSZXN1bHQgPT4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gV2UgbmVlZCBnbG9iYWwgYGFwcGAgdmFyaWFibGUuXG4gICAgICAgIGNvbnN0IGFwcCA9IGdsb2JhbFRoaXMuYXBwIGFzIExvYWRpbmdBcHAgfCB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaGFzQXBwOiAhIWFwcCxcbiAgICAgICAgICBoYXNXb3Jrc3BhY2U6ICEhYXBwPy53b3Jrc3BhY2UsXG4gICAgICAgICAgaXNMYXlvdXRSZWFkeTogISFhcHA/LndvcmtzcGFjZT8ubGF5b3V0UmVhZHlcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHVzaGVzIHRoZSBtaW5pbWFsIGAub2JzaWRpYW4vYXBwLmpzb25gIHZhdWx0IG1hcmtlciB2aWEgYGFkYiBwdXNoYC5cbiAgICpcbiAgICogYGJyb3dzZXIucHVzaEZpbGVgIChXZWJEcml2ZXIgYmFzZTY0KSBpcyBhbiBvcmRlciBvZiBtYWduaXR1ZGUgc2xvd2VyIG9uIGFcbiAgICogY29sZCBvciBsb2FkZWQgZW11bGF0b3IgXHUyMDE0IG1lYXN1cmVkIGF0IDlcdTIwMTMyMXMgcGVyIGNhbGwgZm9yIHRoaXMgMi1ieXRlIG1hcmtlcixcbiAgICogdmVyc3VzIHN1Yi1zZWNvbmQgb3ZlciBgYWRiYC4gVGhpcyBtaXJyb3JzIHtAbGluayBwdXNoRmlsZXN9LCB3aGljaCBzd2l0Y2hlZFxuICAgKiB0byBgYWRiYCBmb3IgdGhlIHNhbWUgcmVhc29uLiBgbWtkaXIgLXBgIGd1YXJhbnRlZXMgdGhlIHBhcmVudCBkaXJlY3RvcnkuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VWYXVsdFBhdGggLSBUaGUgZGV2aWNlLXNpZGUgdmF1bHQgZGlyZWN0b3J5IHBhdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHB1c2hPYnNpZGlhbk1hcmtlcihkZXZpY2VWYXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvY2FsTWFya2VyID0gam9pbih0bXBkaXIoKSwgYG9ic2lkaWFuLW1hcmtlci0ke3JhbmRvbVVVSUQoKX0uanNvbmApO1xuICAgIGNvbnN0IHJlbW90ZU1hcmtlciA9IGAke2RldmljZVZhdWx0UGF0aH0vLm9ic2lkaWFuL2FwcC5qc29uYDtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3cml0ZUZpbGUobG9jYWxNYXJrZXIsICd7fScsICd1dGYtOCcpO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdta2RpcicsICctcCcsIGAke2RldmljZVZhdWx0UGF0aH0vLm9ic2lkaWFuYF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAncHVzaCcsIGxvY2FsTWFya2VyLCByZW1vdGVNYXJrZXJdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHJtKGxvY2FsTWFya2VyLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgdmF1bHQgZGlyZWN0b3J5IGZyb20gdGhlIGRldmljZSBvdmVyIGBhZGJgLCBhbmQgQ0hFQ0tTIHRoYXQgaXQgaXNcbiAgICogYWN0dWFsbHkgZ29uZS5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQ6IGEgZmFpbHVyZSBpcyBsb2dnZWQsIG5vdCB0aHJvd24sIHNvIGEgdGVhcmRvd24gcHJvYmxlbSBuZXZlclxuICAgKiBtYXNrcyB0aGUgdGVzdCByZXN1bHQuIFRoZSBuZXh0IHJ1bidzIHN0YXJ0LW9mLXJ1biBzd2VlcCBwaWNrcyB1cCB3aGF0ZXZlclxuICAgKiB0aGlzIGNvdWxkIG5vdCByZW1vdmUuXG4gICAqXG4gICAqIFRoZSBjaGVjayBpcyB0aGUgcG9pbnQuIGBybSAtcmZgIHJ1bnMgd2l0aCBgc2hvdWxkSWdub3JlRXhpdENvZGVgLCBzbyBhblxuICAgKiB1bnJlbW92ZWQgZGlyZWN0b3J5IHVzZWQgdG8gbGVhdmUgbm8gdHJhY2UgYXQgYWxsIFx1MjAxNCB3aGljaCBpcyBob3cgcnVucyB0aGF0XG4gICAqIHBhc3NlZCBlbmQgdG8gZW5kIHdlcmUgc3RpbGwgZm91bmQgdG8gYmUgbGVha2luZyBhIHZhdWx0IGFwaWVjZSwgaW52aXNpYmx5LFxuICAgKiB1bnRpbCBzb21lb25lIGNvdW50ZWQgdGhlIGRpcmVjdG9yaWVzIG9uIHRoZSBkZXZpY2UgYnkgaGFuZC4gQSBsZWFrIGlzIG5vd1xuICAgKiBuYW1lZCBpbiB0aGUgbG9nIGF0IHRoZSBtb21lbnQgaXQgaGFwcGVucy5cbiAgICpcbiAgICogQHBhcmFtIGRldmljZVZhdWx0UGF0aCAtIFRoZSBkZXZpY2Utc2lkZSB2YXVsdCBkaXJlY3RvcnkgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlRGV2aWNlVmF1bHREaXJlY3RvcnkoZGV2aWNlVmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gUmVtb3ZpbmcgdmF1bHQgZGlyZWN0b3J5IGZyb20gZGV2aWNlOiAke2RldmljZVZhdWx0UGF0aH1gKTtcbiAgICAgIGF3YWl0IGV4ZWMoXG4gICAgICAgIFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ3JtJywgJy1yZicsIGRldmljZVZhdWx0UGF0aF0sXG4gICAgICAgIHsgaXNRdWlldDogdHJ1ZSwgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWUsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogQURCX1ZBVUxUX1JFTU9WRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBsaXN0aW5nID0gYXdhaXQgZXhlYyhcbiAgICAgICAgWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAnbHMnLCAnLWQnLCBkZXZpY2VWYXVsdFBhdGhdLFxuICAgICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9WQVVMVF9SRU1PVkVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfVxuICAgICAgKTtcblxuICAgICAgaWYgKGxpc3RpbmcuaW5jbHVkZXMoZGV2aWNlVmF1bHRQYXRoKSkge1xuICAgICAgICBsb2coXG4gICAgICAgICAgYFthcHBpdW0tdHJhbnNwb3J0XSBXYXJuaW5nOiAke2RldmljZVZhdWx0UGF0aH0gc3Vydml2ZWQgcmVtb3ZhbCBhbmQgaXMgbm93IGxlYWtlZCByZXNpZHVlLiBgXG4gICAgICAgICAgICArICdUaGUgbmV4dCBydW5cXCdzIHN0YXJ0LW9mLXJ1biBzd2VlcCB3aWxsIHJldHJ5IGl0LidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gVmF1bHQgZGlyZWN0b3J5IHJlbW92YWwgZmFpbGVkIChub24tZmF0YWwpOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIHRoZSBgcHJvY2Vzcy5vbignZXhpdCcpYCBoYW5kbGVyIHRoYXQgd291bGQgb3RoZXJ3aXNlIGNsb3NlIGFuIGFscmVhZHktY2xvc2VkIGNoYW5uZWwsIGFuZCB3b3VsZFxuICAgKiBzdGFjayBhIGxpc3RlbmVyIHBlciByZWNvbm5lY3QuXG4gICAqL1xuICBwcml2YXRlIHVucmVnaXN0ZXJJbnB1dENoYW5uZWxFeGl0SGFuZGxlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzcG9zZUlucHV0Q2hhbm5lbE9uRXhpdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHByb2Nlc3Mub2ZmKCdleGl0JywgdGhpcy5kaXNwb3NlSW5wdXRDaGFubmVsT25FeGl0KTtcbiAgICB0aGlzLmRpc3Bvc2VJbnB1dENoYW5uZWxPbkV4aXQgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIHVudGlsIGBnbG9iYWxUaGlzLmFwcGAgZXhpc3RzIGluIHRoZSBXZWJWaWV3IFx1MjAxNCB0aGUgYXBwIGhhcyBmaW5pc2hlZFxuICAgKiBpdHMgY29sZCBzdGFydCBhbmQgT2JzaWRpYW4ncyBvd24gYm9vdCBoYXMgYmVndW4uXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlICoqZmlyc3QqKiBvZiB0aGUgdHdvIGJ1ZGdldHMgc3BlbnQgYWZ0ZXIgYGxvY2F0aW9uLnJlbG9hZCgpYCxcbiAgICogYW5kIHRoZSBnZW5lcm91cyBvbmUuIEV2ZXJ5dGhpbmcgaXQgcGF5cyBmb3IgaXMgb3V0c2lkZSBPYnNpZGlhbidzIGNvbnRyb2w6XG4gICAqIHRoZSBXZWJWaWV3IHJlbG9hZGluZywgYW5kIGEgZ3Vlc3QgdGhhdCBtYXkgc3RpbGwgYmUgb3B0aW1pemluZyBwYWNrYWdlcy5cbiAgICogS2VlcGluZyBpdCBzZXBhcmF0ZSBpcyB0aGUgcG9pbnQgb2YgdGhlIHNwbGl0IFx1MjAxNCB0aGUgb2xkIHNpbmdsZSB3YWxsIGNsb2NrXG4gICAqIHN0YXJ0ZWQgaGVyZSBhbmQgbGVmdCB0aGUgdGlnaHQgbGF5b3V0IGJ1ZGdldCBwYXlpbmcgZm9yIGEgY29sZCBzdGFydC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckFwcFN0YXJ0ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gV2FpdGluZyBmb3IgdGhlIGFwcCB0byBzdGFydCAodGltZW91dD0ke1N0cmluZyh0aGlzLmFwcFN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzKX1tcykuLi5gKTtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JTdGFydHVwTWlsZXN0b25lKHtcbiAgICAgIGlzU2F0aXNmaWVkOiBjaGVja0FwcFN0YXJ0ZWQsXG4gICAgICBwaGFzZTogJ2FwcC1zdGFydCcsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IHRoaXMuYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyB1bnRpbCBgYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeWAgaXMgYHRydWVgIGluIHRoZSBXZWJWaWV3LlxuICAgKlxuICAgKiBUaGUgKipzZWNvbmQqKiBidWRnZXQsIGFuZCB0aGUgdGlnaHQgb25lOiBieSB0aGUgdGltZSBpdCBzdGFydHMsIHRoZSBhcHAgaXNcbiAgICogYWxyZWFkeSB1cCwgc28gYWxsIGl0IGNvdmVycyBpcyBPYnNpZGlhbiBvcGVuaW5nIHRoZSB2YXVsdCBhbmQgbG9hZGluZ1xuICAgKiBwbHVnaW5zIFx1MjAxNCB+MXMgaW4gcHJhY3RpY2UsIFx1MjI2NDguNHMgdW5kZXIgaGVhdnkgaG9zdCBzdHJlc3MgKCoqTDE5KiopLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yTGF5b3V0UmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gV2FpdGluZyBmb3IgbGF5b3V0IHJlYWR5ICh0aW1lb3V0PSR7U3RyaW5nKHRoaXMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zKS4uLmApO1xuICAgIGF3YWl0IHRoaXMud2FpdEZvclN0YXJ0dXBNaWxlc3RvbmUoe1xuICAgICAgaXNTYXRpc2ZpZWQ6IGNoZWNrTGF5b3V0UmVhZHksXG4gICAgICBwaGFzZTogJ2xheW91dC1yZWFkeScsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IHRoaXMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyB0aGUgV2ViVmlldyB1bnRpbCBhIHN0YXJ0dXAgcGhhc2UncyBtaWxlc3RvbmUgaXMgc2F0aXNmaWVkLCB0cmFja2luZ1xuICAgKiB0aGUgZXZpZGVuY2UgdGhhdCB0ZWxscyBhIHNsb3cgT2JzaWRpYW4gZnJvbSBhIGNvbnRlbmRlZCBndWVzdC5cbiAgICpcbiAgICogRWFjaCBwb2xsIGNvc3RzIGV4YWN0bHkgb25lIGBicm93c2VyLmV4ZWN1dGVgIHJvdW5kLXRyaXAgXHUyMDE0IGRlbGliZXJhdGVseSBub3RcbiAgICogYW4ge0BsaW5rIGVuc3VyZVdlYlZpZXdDb250ZXh0fSBjYWxsLCB3aG9zZSBgZ2V0Q29udGV4dHMoKWAgcnVuc1xuICAgKiBgYWRiIHNoZWxsIGNhdCAvcHJvYy9uZXQvdW5peGAgYW5kIHdhcyBtZWFzdXJlZCBhdCB+MTdzIHBlciAqKkwxOSoqLiBUaGVcbiAgICogcm91bmQtdHJpcCBpcyB0aW1lZCwgYW5kIHRoZSBzbG93ZXN0IG9uZSBpcyByZXBvcnRlZCBvbiB0aW1lb3V0OiBhIHBoYXNlXG4gICAqIHRoYXQgcmFuIG91dCBhZnRlciBhIGhhbmRmdWwgb2YgcHJvYmVzIGVhY2ggdGFraW5nIHRlbnMgb2Ygc2Vjb25kcyB3YXNcbiAgICogc3RhcnZlZCBieSB0aGUgZ3Vlc3QsIG5vdCBieSBPYnNpZGlhbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwaGFzZSwgaXRzIGJ1ZGdldCwgYW5kIHRoZSBwcmVkaWNhdGUgdGhhdCBlbmRzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yU3RhcnR1cE1pbGVzdG9uZShwYXJhbXM6IEFwcGl1bVRyYW5zcG9ydFdhaXRGb3JTdGFydHVwTWlsZXN0b25lUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBpc1NhdGlzZmllZCwgcGhhc2UsIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IHN0YXJ0ICsgdGltZW91dEluTWlsbGlzZWNvbmRzO1xuXG4gICAgbGV0IGZ1cnRoZXN0TWlsZXN0b25lOiBBcHBTdGFydHVwTWlsZXN0b25lID0gJ25vLXdlYnZpZXcnO1xuICAgIGxldCBwb2xsQ291bnQgPSAwO1xuICAgIGxldCBzbG93ZXN0Um91bmRUcmlwSW5NaWxsaXNlY29uZHMgPSAwO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3Qgcm91bmRUcmlwU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgbWlsZXN0b25lID0gY2xhc3NpZnlBcHBTdGFydHVwUHJvYmUoYXdhaXQgdGhpcy5wcm9iZVN0YXJ0dXAoKSk7XG4gICAgICBjb25zdCByb3VuZFRyaXBJbk1pbGxpc2Vjb25kcyA9IERhdGUubm93KCkgLSByb3VuZFRyaXBTdGFydDtcblxuICAgICAgcG9sbENvdW50Kys7XG4gICAgICBzbG93ZXN0Um91bmRUcmlwSW5NaWxsaXNlY29uZHMgPSBNYXRoLm1heChzbG93ZXN0Um91bmRUcmlwSW5NaWxsaXNlY29uZHMsIHJvdW5kVHJpcEluTWlsbGlzZWNvbmRzKTtcbiAgICAgIGlmIChjb21wYXJlQXBwU3RhcnR1cE1pbGVzdG9uZXMobWlsZXN0b25lLCBmdXJ0aGVzdE1pbGVzdG9uZSkgPiAwKSB7XG4gICAgICAgIGZ1cnRoZXN0TWlsZXN0b25lID0gbWlsZXN0b25lO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNTYXRpc2ZpZWQobWlsZXN0b25lKSkge1xuICAgICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBQaGFzZSBcIiR7cGhhc2V9XCIgc2F0aXNmaWVkIGFmdGVyICR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMgKCR7U3RyaW5nKHBvbGxDb3VudCl9IHByb2JlKHMpKS5gKTtcbiAgICAgICAgdGhpcy5pc0luV2ViVmlld0NvbnRleHQgPSB0cnVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxvZyhcbiAgICAgICAgYFthcHBpdW0tdHJhbnNwb3J0XSBQaGFzZSBcIiR7cGhhc2V9XCIgbm90IHNhdGlzZmllZCB5ZXQ6ICR7bWlsZXN0b25lfSBgXG4gICAgICAgICAgKyBgKGVsYXBzZWQ9JHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcywgcm91bmQtdHJpcD0ke1N0cmluZyhyb3VuZFRyaXBJbk1pbGxpc2Vjb25kcyl9bXMpLiBSZXRyeWluZy4uLmBcbiAgICAgICk7XG4gICAgICBhd2FpdCBkZWxheShMQVlPVVRfUkVBRFlfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihidWlsZFN0YXJ0dXBUaW1lb3V0TWVzc2FnZSh7XG4gICAgICBlbGFwc2VkSW5NaWxsaXNlY29uZHM6IERhdGUubm93KCkgLSBzdGFydCxcbiAgICAgIG1pbGVzdG9uZTogZnVydGhlc3RNaWxlc3RvbmUsXG4gICAgICBwaGFzZSxcbiAgICAgIHBvbGxDb3VudCxcbiAgICAgIHNsb3dlc3RSb3VuZFRyaXBJbk1pbGxpc2Vjb25kcyxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGdpdmVuIGRlbGF5LlxuICpcbiAqIEBwYXJhbSBtcyAtIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZGVsYXkuXG4gKi9cbmZ1bmN0aW9uIGRlbGF5KG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0VGltZW91dChyZXNvbHZlLCBtcyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSB2YXVsdCBkaXJlY3RvcnkgbmFtZSBmcm9tIGEgaG9zdC1zaWRlIHZhdWx0IHBhdGguXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIEFic29sdXRlIHBhdGggb24gdGhlIGhvc3QgbWFjaGluZS5cbiAqIEByZXR1cm5zIFRoZSBsYXN0IHBhdGggc2VnbWVudCAodmF1bHQgZGlyZWN0b3J5IG5hbWUpLlxuICovXG5mdW5jdGlvbiBleHRyYWN0VmF1bHROYW1lKHZhdWx0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHZhdWx0UGF0aC5yZXBsYWNlKC9bXFxcXC9dKyQvLCAnJyk7XG4gIGNvbnN0IGxhc3RTZXBhcmF0b3IgPSBNYXRoLm1heChub3JtYWxpemVkLmxhc3RJbmRleE9mKCcvJyksIG5vcm1hbGl6ZWQubGFzdEluZGV4T2YoJ1xcXFwnKSk7XG4gIHJldHVybiBub3JtYWxpemVkLnNsaWNlKGxhc3RTZXBhcmF0b3IgKyAxKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTRDQSx5QkFBMkI7QUFDM0Isc0JBR087QUFDUCxxQkFBdUI7QUFDdkIsdUJBQXFCO0FBZ0JyQixrQ0FNTztBQUNQLGdDQUdPO0FBQ1AsNkJBQThCO0FBQzlCLHFDQUdPO0FBQ1Asc0JBQWlEO0FBQ2pELGtCQUFxQjtBQUNyQiw4QkFBc0M7QUFDdEMsaUJBQW9CO0FBQ3BCLDBCQU1PO0FBQ1AseUJBQW9DO0FBbUhwQyxNQUFNLFlBQVk7QUFDbEIsTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSx3Q0FBd0M7QUFDOUMsTUFBTSwrQ0FBK0M7QUFDckQsTUFBTSw2Q0FBNkM7QUFDbkQsTUFBTSxvREFBb0Q7QUFDMUQsTUFBTSxpREFBaUQ7QUFDdkQsTUFBTSxv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