obsidian-dev-utils 101.4.0 → 101.5.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 (43) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/integration-test-plugin/main.js +105 -10
  3. package/dist/lib/cjs/__merged.cjs +7 -1
  4. package/dist/lib/cjs/__merged.d.cts +2 -2
  5. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  6. package/dist/lib/cjs/obsidian/html-element.cjs +14 -3
  7. package/dist/lib/cjs/obsidian/html-element.d.cts +46 -2
  8. package/dist/lib/cjs/obsidian/link.cjs +50 -8
  9. package/dist/lib/cjs/obsidian/link.d.cts +289 -1
  10. package/dist/lib/cjs/obsidian/modals/prompt.cjs +9 -2
  11. package/dist/lib/cjs/obsidian/modals/prompt.d.cts +12 -0
  12. package/dist/lib/cjs/obsidian/modals/select-item.cjs +13 -1
  13. package/dist/lib/cjs/obsidian/modals/select-item.d.cts +14 -0
  14. package/dist/lib/cjs/obsidian/obsidian-settings.cjs +28 -1
  15. package/dist/lib/cjs/obsidian/obsidian-settings.d.cts +30 -0
  16. package/dist/lib/cjs/script-utils/gate.cjs +195 -0
  17. package/dist/lib/cjs/script-utils/gate.d.cts +78 -0
  18. package/dist/lib/cjs/script-utils/index.cjs +4 -1
  19. package/dist/lib/cjs/script-utils/index.d.cts +1 -0
  20. package/dist/lib/cjs/script-utils/test-runners/vitest-config.cjs +12 -3
  21. package/dist/lib/cjs/script-utils/version.cjs +7 -15
  22. package/dist/lib/esm/__merged.d.mts +2 -2
  23. package/dist/lib/esm/__merged.mjs +11 -3
  24. package/dist/lib/esm/generated-during-build.mjs +1 -1
  25. package/dist/lib/esm/obsidian/html-element.d.mts +46 -2
  26. package/dist/lib/esm/obsidian/html-element.mjs +15 -2
  27. package/dist/lib/esm/obsidian/link.d.mts +289 -1
  28. package/dist/lib/esm/obsidian/link.mjs +54 -9
  29. package/dist/lib/esm/obsidian/modals/prompt.d.mts +12 -0
  30. package/dist/lib/esm/obsidian/modals/prompt.mjs +10 -3
  31. package/dist/lib/esm/obsidian/modals/select-item.d.mts +14 -0
  32. package/dist/lib/esm/obsidian/modals/select-item.mjs +13 -1
  33. package/dist/lib/esm/obsidian/obsidian-settings.d.mts +30 -0
  34. package/dist/lib/esm/obsidian/obsidian-settings.mjs +26 -1
  35. package/dist/lib/esm/script-utils/gate.d.mts +78 -0
  36. package/dist/lib/esm/script-utils/gate.mjs +93 -0
  37. package/dist/lib/esm/script-utils/index.d.mts +1 -0
  38. package/dist/lib/esm/script-utils/index.mjs +3 -1
  39. package/dist/lib/esm/script-utils/test-runners/vitest-config.mjs +12 -3
  40. package/dist/lib/esm/script-utils/version.mjs +7 -18
  41. package/dist/templates/scripts/gate/gate.ts +10 -0
  42. package/package.json +15 -13
  43. package/script-utils/gate/package.json +6 -0
@@ -173,7 +173,6 @@ class ObsidianPluginVitestConfigContext {
173
173
  },
174
174
  setupFiles: [
175
175
  "obsidian-test-mocks/vitest-setup",
176
- "obsidian-test-mocks/obsidian-typings/vitest-setup",
177
176
  "obsidian-dev-utils/vitest-setup"
178
177
  ]
179
178
  };
@@ -209,7 +208,17 @@ function defineObsidianPluginVitestConfig(options = {}) {
209
208
  },
210
209
  exclude: [...SHARED_EXCLUDE],
211
210
  globals: false,
212
- include: [UNIT_TEST_FILES],
211
+ /*
212
+ * There is deliberately NO root-level `include` here, and restoring one breaks every project.
213
+ * Under vitest 4 a project's own `include` replaced the root one, so a root
214
+ * `include: [UNIT_TEST_FILES]` was merely redundant — the `unit-tests` project already declares
215
+ * that same glob for itself. Under vitest 5 the project glob no longer replaces it, and
216
+ * `src/**\/*.test.ts` is a superset of every project glob, so EVERY project collected EVERY test
217
+ * file: unit suites ran in the CDP integration environment and died on `Failed to resolve entry
218
+ * for package "obsidian"`, the screenshot-capture suites ran and rewrote checked-in PNGs, and the
219
+ * android / demo-vault suites ran under the desktop transport. Measured in a consumer: the desktop
220
+ * project collected 227 files instead of its own 105, and deleting this one line restored 105.
221
+ */
213
222
  passWithNoTests: true,
214
223
  projects: [
215
224
  {
@@ -233,4 +242,4 @@ export {
233
242
  ObsidianPluginVitestConfigContext,
234
243
  defineObsidianPluginVitestConfig
235
244
  };
236
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy90ZXN0LXJ1bm5lcnMvdml0ZXN0LWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNoYXJlZCB2aXRlc3QgY29uZmlndXJhdGlvbiBmb3IgT2JzaWRpYW4gcGx1Z2lucy5cbiAqXG4gKiBFdmVyeSBwbHVnaW4gaW4gdGhlIHdvcmtzcGFjZSBkZWNsYXJlcyB0aGUgc2FtZSBmaXZlIHZpdGVzdCBwcm9qZWN0cyBcdTIwMTQgYHVuaXQtdGVzdHNgIHBsdXMgdGhlXG4gKiBgaW50ZWdyYXRpb24tdGVzdHM6e25vLWFwcCxkZXNrdG9wLGRlc2t0b3AtcGVyZm9ybWFuY2UsYW5kcm9pZH1gIGZhbWlseSBcdTIwMTQgd2l0aCB0aGUgc2FtZSB0aW1lb3V0cyxcbiAqIGBzZXR1cEZpbGVzYCwgYW5kIGBnbG9iYWxTZXR1cGAgd2lyaW5nLiBNYWludGFpbmluZyB0aGF0IHBlciByZXBvIG1lYW5zIGEgY29udmVudGlvbiBjaGFuZ2UgY29zdHMgb25lXG4gKiBuZWFyLWlkZW50aWNhbCBlZGl0IHBlciBwbHVnaW4sIGFuZCBhbnkgcmVwbyB0aGF0IGlzIG1pc3NlZCBkcmlmdHMgc2lsZW50bHkuIFRoaXMgbW9kdWxlIG93bnMgdGhhdFxuICogY29uZmlndXJhdGlvbiBvbmNlLCBzbyBhIHBsdWdpbidzIGBzY3JpcHRzL3ZpdGVzdC1jb25maWcudHNgIGNvbGxhcHNlcyB0byBhIHNpbmdsZSBjYWxsLlxuICpcbiAqIFRoZSBzZWFtIG1pcnJvcnMge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL29ic2lkaWFuLWRldi11dGlscyB8IHRoZSBFU0xpbnQgb25lfVxuICogKGBkZWZpbmVFc2xpbnRDb25maWdzYCk6IHRoZSBmYWN0b3J5IGJ1aWxkcyBhIGNvbnRleHQgaG9sZGluZyB0aGUgc3RhbmRhcmQgcHJvamVjdHMsIHRoZSBjYWxsZXIgZWRpdHNcbiAqIGl0IGluIHBsYWNlIHRocm91Z2gge0BsaW5rIERlZmluZU9ic2lkaWFuUGx1Z2luVml0ZXN0Q29uZmlnT3B0aW9ucy5lZGl0Q29udGV4dH0sIGFuZCBhcHBlbmRzIGFueVxuICogcHJvamVjdCB0aGUgYmFzZSBkb2VzIG5vdCBrbm93IGFib3V0IHRocm91Z2hcbiAqIHtAbGluayBEZWZpbmVPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ09wdGlvbnMuY3VzdG9tUHJvamVjdHN9LlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgVGVzdFByb2plY3RDb25maWd1cmF0aW9uLFxuICBUZXN0UHJvamVjdElubGluZUNvbmZpZ3VyYXRpb24sXG4gIFZpdGVVc2VyQ29uZmlnXG59IGZyb20gJ3ZpdGVzdC9jb25maWcnO1xuXG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZXN0L2NvbmZpZyc7XG5cbi8qKlxuICogVGhlIGB0ZXN0YCBzZWN0aW9uIG9mIGEgc2luZ2xlIHZpdGVzdCBwcm9qZWN0IGVudHJ5LlxuICovXG5leHBvcnQgdHlwZSBPYnNpZGlhblBsdWdpblZpdGVzdFByb2plY3RDb25maWcgPSBOb25OdWxsYWJsZTxUZXN0UHJvamVjdElubGluZUNvbmZpZ3VyYXRpb25bJ3Rlc3QnXT47XG5cbmNvbnN0IEFORFJPSURfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA2MF8wMDA7XG5jb25zdCBCSUdfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG5jb25zdCBIT09LX1RJTUVPVVRfTVVMVElQTElFUiA9IDQ7XG5jb25zdCBQRVJGT1JNQU5DRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMF8wMDA7XG5cbmNvbnN0IEFORFJPSURfVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5hbmRyb2lkLmludGVncmF0aW9uLnRlc3QudHMnO1xuY29uc3QgQ1JPU1NfUExBVEZPUk1fVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5jcm9zcy1wbGF0Zm9ybS5pbnRlZ3JhdGlvbi50ZXN0LnRzJztcbmNvbnN0IERFQ0xBUkFUSU9OX0ZJTEVTID0gJ3NyYy8qKi8qLmQudHMnO1xuY29uc3QgREVTS1RPUF9QRVJGT1JNQU5DRV9URVNUX0ZJTEVTID0gJ3NyYy8qKi8qLmRlc2t0b3AtcGVyZm9ybWFuY2UuaW50ZWdyYXRpb24udGVzdC50cyc7XG5jb25zdCBERVNLVE9QX1RFU1RfRklMRVMgPSAnc3JjLyoqLyouZGVza3RvcC5pbnRlZ3JhdGlvbi50ZXN0LnRzJztcbmNvbnN0IElOVEVHUkFUSU9OX1RFU1RfRklMRVMgPSAnc3JjLyoqLyouaW50ZWdyYXRpb24udGVzdC50cyc7XG5jb25zdCBOT19BUFBfVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5uby1hcHAuaW50ZWdyYXRpb24udGVzdC50cyc7XG5jb25zdCBVTklUX1RFU1RfRklMRVMgPSAnc3JjLyoqLyoudGVzdC50cyc7XG5cbmNvbnN0IE9CU0lESUFOX1ZFUlNJT05fRU5WX1ZBUklBQkxFX05BTUUgPSAnT0JTSURJQU5fVkVSU0lPTic7XG5jb25zdCBTSEFSRURfRVhDTFVERSA9IFsnbm9kZV9tb2R1bGVzJywgJ2Rpc3QnXTtcblxuLyoqXG4gKiBUaGUgb3B0aW9ucyBmb3IgZGVmaW5pbmcgYSBwbHVnaW4ncyB2aXRlc3QgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ09wdGlvbnMge1xuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGJ1aWxkcyBwcm9qZWN0cyB0aGUgYmFzZSBjb25maWd1cmF0aW9uIGRvZXMgbm90IGtub3cgYWJvdXQsIHN1Y2ggYXMgYSBwbHVnaW4ncyBvd25cbiAgICogYGludGVncmF0aW9uLXRlc3RzOmRlbW8tdmF1bHRgIHByb2plY3QuIFRoZSByZXR1cm5lZCBwcm9qZWN0cyBhcmUgYXBwZW5kZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkIGZpdmUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHZpdGVzdCBjb25maWd1cmF0aW9uIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIFRoZSBleHRyYSBwcm9qZWN0cy5cbiAgICovXG4gIGN1c3RvbVByb2plY3RzPyhjb250ZXh0OiBPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ0NvbnRleHQpOiBUZXN0UHJvamVjdENvbmZpZ3VyYXRpb25bXTtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGVkaXRzIHRoZSB2aXRlc3QgY29uZmlndXJhdGlvbiBjb250ZXh0IGJlZm9yZSBpdCBpcyBhc3NlbWJsZWQgaW50byBhIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHZpdGVzdCBjb25maWd1cmF0aW9uIGNvbnRleHQuXG4gICAqL1xuICBlZGl0Q29udGV4dD8oY29udGV4dDogT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdDb250ZXh0KTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgY29udGV4dCBmb3IgZGVmaW5pbmcgYSBwbHVnaW4ncyB2aXRlc3QgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBFdmVyeSBtZW1iZXIgaXMgbGl2ZTogdGhlIGFycmF5cyBhbmQgb2JqZWN0cyBpdCBleHBvc2VzIGFyZSB0aGUgdmVyeSBvbmVzIHRoZSBhc3NlbWJsZWQgY29uZmlndXJhdGlvblxuICogaXMgYnVpbHQgZnJvbSwgc28gZWRpdGluZyB0aGVtIGluIHBsYWNlIHRocm91Z2hcbiAqIHtAbGluayBEZWZpbmVPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ09wdGlvbnMuZWRpdENvbnRleHR9IGlzIHdoYXQgY3VzdG9taXplcyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgY2xhc3MgT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBgaW50ZWdyYXRpb24tdGVzdHM6YW5kcm9pZGAgcHJvamVjdCwgcnVubmluZyB0aGUgbW9iaWxlLW9ubHkgYW5kIGNyb3NzLXBsYXRmb3JtIHN1aXRlcyBhZ2FpbnN0IGFuXG4gICAqIEFuZHJvaWQgZW11bGF0b3IgdGhyb3VnaCBBcHBpdW0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYW5kcm9pZDogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnbm9kZScsXG4gICAgZW52aXJvbm1lbnRPcHRpb25zOiB7XG4gICAgICBvYnNpZGlhblRyYW5zcG9ydDoge1xuICAgICAgICBhcHBpdW1Vcmw6ICdodHRwOi8vbG9jYWxob3N0OjQ3MjMnLFxuICAgICAgICBhdmROYW1lOiAnb2JzaWRpYW5fdGVzdCcsXG4gICAgICAgIHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bSdcbiAgICAgIH1cbiAgICB9LFxuICAgIGZpbGVQYXJhbGxlbGlzbTogZmFsc2UsXG4gICAgZ2xvYmFsU2V0dXA6IFsnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3QtZ2xvYmFsLXNldHVwLXBsdWdpbiddLFxuICAgIGhvb2tUaW1lb3V0OiBBTkRST0lEX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTICogSE9PS19USU1FT1VUX01VTFRJUExJRVIsXG4gICAgaW5jbHVkZTogW0FORFJPSURfVEVTVF9GSUxFUywgQ1JPU1NfUExBVEZPUk1fVEVTVF9GSUxFU10sXG4gICAgbmFtZTogJ2ludGVncmF0aW9uLXRlc3RzOmFuZHJvaWQnLFxuICAgIHNldHVwRmlsZXM6IFsnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3Qtc2V0dXAnXSxcbiAgICB0ZXN0VGltZW91dDogQU5EUk9JRF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgcGVyLXRlc3QgYnVkZ2V0IG9mIHRoZSBBbmRyb2lkIGludGVncmF0aW9uIHByb2plY3QsIGluIG1pbGxpc2Vjb25kcy4gQm9vdGluZyBhbiBlbXVsYXRvciBhbmRcbiAgICogZHJpdmluZyBpdCBvdmVyIEFwcGl1bSBpcyBzbG93ZXIgdGhhbiB0aGUgZGVza3RvcCBwYXRoLCBoZW5jZSBpdHMgb3duIGNvbnN0YW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYW5kcm9pZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IEFORFJPSURfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgLyoqXG4gICAqIFRoZSBwZXItdGVzdCBidWRnZXQgb2YgdGhlIHJlZ3VsYXIgaW50ZWdyYXRpb24gcHJvamVjdHMsIGluIG1pbGxpc2Vjb25kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDMwMDAwYFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJpZ1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IEJJR19USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICAvKipcbiAgICogVGhlIGNvdmVyYWdlIGBleGNsdWRlYCBnbG9icy4gUHVzaCBvbnRvIGl0IHRvIGRyb3AgbW9yZSBmaWxlcyBmcm9tIHRoZSBjb3ZlcmFnZSByZXBvcnQuXG4gICAqXG4gICAqIERlY2xhcmF0aW9uIGZpbGVzIGFyZSBleGNsdWRlZCBieSBkZWZhdWx0IGJlY2F1c2UgdGhlIGNvdmVyYWdlIGBpbmNsdWRlYCBiZWxvdyBpcyBgc3JjLyoqXFwvKi50c2AsXG4gICAqIHdoaWNoIGEgYC5kLnRzYCBtYXRjaGVzLiBBIGRlY2xhcmF0aW9uIGZpbGUgZW1pdHMgbm8gcnVudGltZSBjb2RlLCBzbyBpdCByZXBvcnRzIDAlIGFuZCBubyB0ZXN0IGNhblxuICAgKiBldmVyIHJhaXNlIGl0IFx1MjAxNCBhIHBsdWdpbiB0aGF0IGdyb3dzIG9uZSB1bmRlciBgc3JjL2Agc2lsZW50bHkgbG9zZXMgaXRzIDEwMCUgZ2F0ZSwgYW5kIHRoZSB1c3VhbFxuICAgKiByZW1lZHkgb2YgYW4gaW5saW5lIGB2OCBpZ25vcmVgIGNvbW1lbnQgZG9lcyBub3QgYXBwbHkgdG8gYSB0eXBlLW9ubHkgZmlsZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb3ZlcmFnZUV4Y2x1ZGU6IHN0cmluZ1tdID0gW1VOSVRfVEVTVF9GSUxFUywgREVDTEFSQVRJT05fRklMRVNdO1xuXG4gIC8qKlxuICAgKiBUaGUgYGludGVncmF0aW9uLXRlc3RzOmRlc2t0b3BgIHByb2plY3QsIHJ1bm5pbmcgdGhlIGRlc2t0b3Atb25seSBhbmQgY3Jvc3MtcGxhdGZvcm0gc3VpdGVzIGFnYWluc3QgYVxuICAgKiByZWFsIGRlc2t0b3AgT2JzaWRpYW4gb3ZlciBDRFAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVza3RvcDogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnbm9kZScsXG4gICAgZmlsZVBhcmFsbGVsaXNtOiBmYWxzZSxcbiAgICBnbG9iYWxTZXR1cDogWydvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nL3ZpdGVzdC1nbG9iYWwtc2V0dXAtcGx1Z2luJ10sXG4gICAgaG9va1RpbWVvdXQ6IEJJR19USU1FT1VUX0lOX01JTExJU0VDT05EUyAqIEhPT0tfVElNRU9VVF9NVUxUSVBMSUVSLFxuICAgIGluY2x1ZGU6IFtERVNLVE9QX1RFU1RfRklMRVMsIENST1NTX1BMQVRGT1JNX1RFU1RfRklMRVNdLFxuICAgIG5hbWU6ICdpbnRlZ3JhdGlvbi10ZXN0czpkZXNrdG9wJyxcbiAgICBzZXR1cEZpbGVzOiBbJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3Rpbmcvdml0ZXN0LXNldHVwJ10sXG4gICAgdGVzdFRpbWVvdXQ6IEJJR19USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgYGludGVncmF0aW9uLXRlc3RzOmRlc2t0b3AtcGVyZm9ybWFuY2VgIHByb2plY3QsIHJ1bm5pbmcgdGhlIGF0LXNjYWxlIHN1aXRlcy4gSXQgaXMgZGVjbGFyZWQgZm9yXG4gICAqIGV2ZXJ5IHBsdWdpbiBldmVuIHdoZW4gdGhlcmUgaXMgbm8gc3VjaCBzdWl0ZSB5ZXQgXHUyMDE0IGBwYXNzV2l0aE5vVGVzdHNgIG1ha2VzIGFuIGVtcHR5IHByb2plY3QgZnJlZSxcbiAgICogYW5kIHRoZSBtYXRjaGluZyBgdGVzdDppbnRlZ3JhdGlvbjpkZXNrdG9wOnBlcmZvcm1hbmNlYCBzY3JpcHQgZXhpc3RzIGZsZWV0LXdpZGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVza3RvcFBlcmZvcm1hbmNlOiBPYnNpZGlhblBsdWdpblZpdGVzdFByb2plY3RDb25maWcgPSB7XG4gICAgZW52aXJvbm1lbnQ6ICdub2RlJyxcbiAgICBmaWxlUGFyYWxsZWxpc206IGZhbHNlLFxuICAgIGdsb2JhbFNldHVwOiBbJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3Rpbmcvdml0ZXN0LWdsb2JhbC1zZXR1cC1wbHVnaW4nXSxcbiAgICBob29rVGltZW91dDogUEVSRk9STUFOQ0VfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgaW5jbHVkZTogW0RFU0tUT1BfUEVSRk9STUFOQ0VfVEVTVF9GSUxFU10sXG4gICAgbmFtZTogJ2ludGVncmF0aW9uLXRlc3RzOmRlc2t0b3AtcGVyZm9ybWFuY2UnLFxuICAgIHNldHVwRmlsZXM6IFsnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3Qtc2V0dXAnXSxcbiAgICB0ZXN0VGltZW91dDogUEVSRk9STUFOQ0VfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgfTtcblxuICAvKipcbiAgICogVGhlIG11bHRpcGxpZXIgYXBwbGllZCB0byBhIHByb2plY3QncyB0ZXN0IGJ1ZGdldCB0byBnZXQgaXRzIGhvb2sgYnVkZ2V0LiBBIGhvb2sgdHlwaWNhbGx5IHBvcHVsYXRlc1xuICAgKiBhbmQgb3BlbnMgYSB2YXVsdCwgc28gaXQgbmVlZHMgc2V2ZXJhbCB0aW1lcyB3aGF0IGEgc2luZ2xlIHRlc3QgZG9lcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDRgXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaG9va1RpbWVvdXRNdWx0aXBsaWVyID0gSE9PS19USU1FT1VUX01VTFRJUExJRVI7XG5cbiAgLyoqXG4gICAqIFRoZSBgaW50ZWdyYXRpb24tdGVzdHM6bm8tYXBwYCBwcm9qZWN0LCBydW5uaW5nIHRoZSBzdWl0ZXMgdGhhdCBuZWVkIG5vIE9ic2lkaWFuIGluc3RhbmNlIGF0IGFsbC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBub0FwcDogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnbm9kZScsXG4gICAgZmlsZVBhcmFsbGVsaXNtOiBmYWxzZSxcbiAgICBob29rVGltZW91dDogQklHX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTICogSE9PS19USU1FT1VUX01VTFRJUExJRVIsXG4gICAgaW5jbHVkZTogW05PX0FQUF9URVNUX0ZJTEVTXSxcbiAgICBuYW1lOiAnaW50ZWdyYXRpb24tdGVzdHM6bm8tYXBwJyxcbiAgICB0ZXN0VGltZW91dDogQklHX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBwZXItdGVzdCBidWRnZXQgb2YgdGhlIHBlcmZvcm1hbmNlIGludGVncmF0aW9uIHByb2plY3QsIGluIG1pbGxpc2Vjb25kcy4gQSBwZXJmb3JtYW5jZSB2YXVsdCBpc1xuICAgKiBwcmUtcG9wdWxhdGVkIHdpdGggdGVucyBvZiB0aG91c2FuZHMgb2Ygbm90ZXMgYmVmb3JlIE9ic2lkaWFuIG9wZW5zLCBzbyBib3RoIGl0cyBzZXR1cCBhbmQgaXRzIHRlc3RzXG4gICAqIG5lZWQgZmFyIG1vcmUgdGltZSB0aGFuIHRoZSByZWd1bGFyIGludGVncmF0aW9uIHByb2plY3RzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDAwYFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBlcmZvcm1hbmNlVGltZW91dEluTWlsbGlzZWNvbmRzID0gUEVSRk9STUFOQ0VfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgLyoqXG4gICAqIFRoZSBgdW5pdC10ZXN0c2AgcHJvamVjdCwgcnVubmluZyB0aGUgbW9ja2VkLU9ic2lkaWFuIHN1aXRlcyBpbiBganNkb21gLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXRUZXN0czogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnanNkb20nLFxuICAgIGV4Y2x1ZGU6IFsuLi5TSEFSRURfRVhDTFVERSwgSU5URUdSQVRJT05fVEVTVF9GSUxFU10sXG4gICAgZXhlY0FyZ3Y6IFsnLS1uby13ZWJzdG9yYWdlJ10sXG4gICAgaW5jbHVkZTogW1VOSVRfVEVTVF9GSUxFU10sXG4gICAgbmFtZTogJ3VuaXQtdGVzdHMnLFxuICAgIHNlcnZlcjoge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGRlcHNgIGlzIGRlY2xhcmVkIGJ5IGB2aXRlc3RgOyByZW5hbWluZyBpdCBoZXJlIHdvdWxkIG5vdCBtYXRjaCB0aGUgQVBJLlxuICAgICAgZGVwczoge1xuICAgICAgICBpbmxpbmU6IFsnQG9ic2lkaWFuLXR5cGluZ3MnLCAnb2JzaWRpYW4tZGV2LXV0aWxzJ11cbiAgICAgIH1cbiAgICB9LFxuICAgIHNldHVwRmlsZXM6IFtcbiAgICAgICdvYnNpZGlhbi10ZXN0LW1vY2tzL3ZpdGVzdC1zZXR1cCcsXG4gICAgICAnb2JzaWRpYW4tdGVzdC1tb2Nrcy9vYnNpZGlhbi10eXBpbmdzL3ZpdGVzdC1zZXR1cCcsXG4gICAgICAnb2JzaWRpYW4tZGV2LXV0aWxzL3ZpdGVzdC1zZXR1cCdcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgY29udGV4dCBzZWVkZWQgd2l0aCB0aGUgc3RhbmRhcmQgcHJvamVjdHMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3Qgb2JzaWRpYW5WZXJzaW9uID0gcHJvY2Vzcy5lbnZbT0JTSURJQU5fVkVSU0lPTl9FTlZfVkFSSUFCTEVfTkFNRV07XG5cbiAgICAvKlxuICAgICAqIFN1cHBvcnQgaXMgdGhlIHJhbmdlIFtsYXRlc3QgcHVibGljLCBsYXRlc3QgY2F0YWx5c3RdIGFuZCBCT1RIIGVuZHMgbXVzdCB3b3JrIChHOTkpLCBzbyB0aGUgdmVyc2lvblxuICAgICAqIGlzIGEga25vYiByYXRoZXIgdGhhbiBhIGNvbnN0YW50LiBUaGUga2V5IGlzIGFkZGVkIE9OTFkgd2hlbiB0aGUgdmFyaWFibGUgaXMgc2V0OiBhbiBleHBsaWNpdFxuICAgICAqIGBvYnNpZGlhblZlcnNpb25gIG1ha2VzIHRoZSBoYXJuZXNzIHJlc29sdmUgYSBjb25jcmV0ZSB2ZXJzaW9uIGFuZCBzd2FwIHRoZSBhc2FyLCB3aGljaCBpcyBub3Qgd2hhdFxuICAgICAqIGFuIHVucGlubmVkIHJ1biBkb2VzLCBzbyBzZWVkaW5nIGEgZGVmYXVsdCBoZXJlIHdvdWxkIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgZXZlcnkgcGx1Z2luLlxuICAgICAqL1xuICAgIGlmIChvYnNpZGlhblZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kZXNrdG9wLmVudmlyb25tZW50T3B0aW9ucyA9IHtcbiAgICAgICAgb2JzaWRpYW5UcmFuc3BvcnQ6IHtcbiAgICAgICAgICBvYnNpZGlhblZlcnNpb24sXG4gICAgICAgICAgdHlwZTogJ29ic2lkaWFuLWNkcCdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSB2aXRlc3QgY29uZmlndXJhdGlvbiBmb3IgYW4gT2JzaWRpYW4gcGx1Z2luLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGRlZmluaW5nIHRoZSBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMgVGhlIHZpdGVzdCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWcob3B0aW9uczogRGVmaW5lT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdPcHRpb25zID0ge30pOiBWaXRlVXNlckNvbmZpZyB7XG4gIGNvbnN0IGNvbnRleHQgPSBuZXcgT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdDb250ZXh0KCk7XG5cbiAgaWYgKG9wdGlvbnMuZWRpdENvbnRleHQpIHtcbiAgICBvcHRpb25zLmVkaXRDb250ZXh0KGNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgY3VzdG9tUHJvamVjdHMgPSBvcHRpb25zLmN1c3RvbVByb2plY3RzPy4oY29udGV4dCkgPz8gW107XG5cbiAgcmV0dXJuIGRlZmluZUNvbmZpZyh7XG4gICAgdGVzdDoge1xuICAgICAgY292ZXJhZ2U6IHtcbiAgICAgICAgZXhjbHVkZTogY29udGV4dC5jb3ZlcmFnZUV4Y2x1ZGUsXG4gICAgICAgIGluY2x1ZGU6IFsnc3JjLyoqLyoudHMnXSxcbiAgICAgICAgcHJvdmlkZXI6ICd2OCcsXG4gICAgICAgIHJlcG9ydGVyOiBbJ3RleHQnLCAnbGNvdicsICdodG1sJ10sXG4gICAgICAgIHJlcG9ydHNEaXJlY3Rvcnk6ICcuL2NvdmVyYWdlJ1xuICAgICAgfSxcbiAgICAgIGV4Y2x1ZGU6IFsuLi5TSEFSRURfRVhDTFVERV0sXG4gICAgICBnbG9iYWxzOiBmYWxzZSxcbiAgICAgIGluY2x1ZGU6IFtVTklUX1RFU1RfRklMRVNdLFxuICAgICAgcGFzc1dpdGhOb1Rlc3RzOiB0cnVlLFxuICAgICAgcHJvamVjdHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHJlc29sdmU6IHtcbiAgICAgICAgICAgIGFsaWFzOiB7XG4gICAgICAgICAgICAgIG9ic2lkaWFuOiAnb2JzaWRpYW4tdGVzdC1tb2Nrcy9vYnNpZGlhbidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHRlc3Q6IGNvbnRleHQudW5pdFRlc3RzXG4gICAgICAgIH0sXG4gICAgICAgIHsgdGVzdDogY29udGV4dC5ub0FwcCB9LFxuICAgICAgICB7IHRlc3Q6IGNvbnRleHQuZGVza3RvcCB9LFxuICAgICAgICB7IHRlc3Q6IGNvbnRleHQuZGVza3RvcFBlcmZvcm1hbmNlIH0sXG4gICAgICAgIHsgdGVzdDogY29udGV4dC5hbmRyb2lkIH0sXG4gICAgICAgIC4uLmN1c3RvbVByb2plY3RzXG4gICAgICBdXG4gICAgfVxuICB9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3QkEsT0FBTyxhQUFhO0FBQ3BCLFNBQVMsb0JBQW9CO0FBTzdCLE1BQU0sa0NBQWtDO0FBQ3hDLE1BQU0sOEJBQThCO0FBQ3BDLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sc0NBQXNDO0FBRTVDLE1BQU0scUJBQXFCO0FBQzNCLE1BQU0sNEJBQTRCO0FBQ2xDLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0saUNBQWlDO0FBQ3ZDLE1BQU0scUJBQXFCO0FBQzNCLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sa0JBQWtCO0FBRXhCLE1BQU0scUNBQXFDO0FBQzNDLE1BQU0saUJBQWlCLENBQUMsZ0JBQWdCLE1BQU07QUE4QnZDLE1BQU0sa0NBQWtDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUs3QixVQUE2QztBQUFBLElBQzNELGFBQWE7QUFBQSxJQUNiLG9CQUFvQjtBQUFBLE1BQ2xCLG1CQUFtQjtBQUFBLFFBQ2pCLFdBQVc7QUFBQSxRQUNYLFNBQVM7QUFBQSxRQUNULE1BQU07QUFBQSxNQUNSO0FBQUEsSUFDRjtBQUFBLElBQ0EsaUJBQWlCO0FBQUEsSUFDakIsYUFBYSxDQUFDLHlEQUF5RDtBQUFBLElBQ3ZFLGFBQWEsa0NBQWtDO0FBQUEsSUFDL0MsU0FBUyxDQUFDLG9CQUFvQix5QkFBeUI7QUFBQSxJQUN2RCxNQUFNO0FBQUEsSUFDTixZQUFZLENBQUMsMkNBQTJDO0FBQUEs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
245
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy90ZXN0LXJ1bm5lcnMvdml0ZXN0LWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNoYXJlZCB2aXRlc3QgY29uZmlndXJhdGlvbiBmb3IgT2JzaWRpYW4gcGx1Z2lucy5cbiAqXG4gKiBFdmVyeSBwbHVnaW4gaW4gdGhlIHdvcmtzcGFjZSBkZWNsYXJlcyB0aGUgc2FtZSBmaXZlIHZpdGVzdCBwcm9qZWN0cyBcdTIwMTQgYHVuaXQtdGVzdHNgIHBsdXMgdGhlXG4gKiBgaW50ZWdyYXRpb24tdGVzdHM6e25vLWFwcCxkZXNrdG9wLGRlc2t0b3AtcGVyZm9ybWFuY2UsYW5kcm9pZH1gIGZhbWlseSBcdTIwMTQgd2l0aCB0aGUgc2FtZSB0aW1lb3V0cyxcbiAqIGBzZXR1cEZpbGVzYCwgYW5kIGBnbG9iYWxTZXR1cGAgd2lyaW5nLiBNYWludGFpbmluZyB0aGF0IHBlciByZXBvIG1lYW5zIGEgY29udmVudGlvbiBjaGFuZ2UgY29zdHMgb25lXG4gKiBuZWFyLWlkZW50aWNhbCBlZGl0IHBlciBwbHVnaW4sIGFuZCBhbnkgcmVwbyB0aGF0IGlzIG1pc3NlZCBkcmlmdHMgc2lsZW50bHkuIFRoaXMgbW9kdWxlIG93bnMgdGhhdFxuICogY29uZmlndXJhdGlvbiBvbmNlLCBzbyBhIHBsdWdpbidzIGBzY3JpcHRzL3ZpdGVzdC1jb25maWcudHNgIGNvbGxhcHNlcyB0byBhIHNpbmdsZSBjYWxsLlxuICpcbiAqIFRoZSBzZWFtIG1pcnJvcnMge0BsaW5rIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL29ic2lkaWFuLWRldi11dGlscyB8IHRoZSBFU0xpbnQgb25lfVxuICogKGBkZWZpbmVFc2xpbnRDb25maWdzYCk6IHRoZSBmYWN0b3J5IGJ1aWxkcyBhIGNvbnRleHQgaG9sZGluZyB0aGUgc3RhbmRhcmQgcHJvamVjdHMsIHRoZSBjYWxsZXIgZWRpdHNcbiAqIGl0IGluIHBsYWNlIHRocm91Z2gge0BsaW5rIERlZmluZU9ic2lkaWFuUGx1Z2luVml0ZXN0Q29uZmlnT3B0aW9ucy5lZGl0Q29udGV4dH0sIGFuZCBhcHBlbmRzIGFueVxuICogcHJvamVjdCB0aGUgYmFzZSBkb2VzIG5vdCBrbm93IGFib3V0IHRocm91Z2hcbiAqIHtAbGluayBEZWZpbmVPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ09wdGlvbnMuY3VzdG9tUHJvamVjdHN9LlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgVGVzdFByb2plY3RDb25maWd1cmF0aW9uLFxuICBUZXN0UHJvamVjdElubGluZUNvbmZpZ3VyYXRpb24sXG4gIFZpdGVVc2VyQ29uZmlnXG59IGZyb20gJ3ZpdGVzdC9jb25maWcnO1xuXG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZXN0L2NvbmZpZyc7XG5cbi8qKlxuICogVGhlIGB0ZXN0YCBzZWN0aW9uIG9mIGEgc2luZ2xlIHZpdGVzdCBwcm9qZWN0IGVudHJ5LlxuICovXG5leHBvcnQgdHlwZSBPYnNpZGlhblBsdWdpblZpdGVzdFByb2plY3RDb25maWcgPSBOb25OdWxsYWJsZTxUZXN0UHJvamVjdElubGluZUNvbmZpZ3VyYXRpb25bJ3Rlc3QnXT47XG5cbmNvbnN0IEFORFJPSURfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA2MF8wMDA7XG5jb25zdCBCSUdfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG5jb25zdCBIT09LX1RJTUVPVVRfTVVMVElQTElFUiA9IDQ7XG5jb25zdCBQRVJGT1JNQU5DRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMF8wMDA7XG5cbmNvbnN0IEFORFJPSURfVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5hbmRyb2lkLmludGVncmF0aW9uLnRlc3QudHMnO1xuY29uc3QgQ1JPU1NfUExBVEZPUk1fVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5jcm9zcy1wbGF0Zm9ybS5pbnRlZ3JhdGlvbi50ZXN0LnRzJztcbmNvbnN0IERFQ0xBUkFUSU9OX0ZJTEVTID0gJ3NyYy8qKi8qLmQudHMnO1xuY29uc3QgREVTS1RPUF9QRVJGT1JNQU5DRV9URVNUX0ZJTEVTID0gJ3NyYy8qKi8qLmRlc2t0b3AtcGVyZm9ybWFuY2UuaW50ZWdyYXRpb24udGVzdC50cyc7XG5jb25zdCBERVNLVE9QX1RFU1RfRklMRVMgPSAnc3JjLyoqLyouZGVza3RvcC5pbnRlZ3JhdGlvbi50ZXN0LnRzJztcbmNvbnN0IElOVEVHUkFUSU9OX1RFU1RfRklMRVMgPSAnc3JjLyoqLyouaW50ZWdyYXRpb24udGVzdC50cyc7XG5jb25zdCBOT19BUFBfVEVTVF9GSUxFUyA9ICdzcmMvKiovKi5uby1hcHAuaW50ZWdyYXRpb24udGVzdC50cyc7XG5jb25zdCBVTklUX1RFU1RfRklMRVMgPSAnc3JjLyoqLyoudGVzdC50cyc7XG5cbmNvbnN0IE9CU0lESUFOX1ZFUlNJT05fRU5WX1ZBUklBQkxFX05BTUUgPSAnT0JTSURJQU5fVkVSU0lPTic7XG5jb25zdCBTSEFSRURfRVhDTFVERSA9IFsnbm9kZV9tb2R1bGVzJywgJ2Rpc3QnXTtcblxuLyoqXG4gKiBUaGUgb3B0aW9ucyBmb3IgZGVmaW5pbmcgYSBwbHVnaW4ncyB2aXRlc3QgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ09wdGlvbnMge1xuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGJ1aWxkcyBwcm9qZWN0cyB0aGUgYmFzZSBjb25maWd1cmF0aW9uIGRvZXMgbm90IGtub3cgYWJvdXQsIHN1Y2ggYXMgYSBwbHVnaW4ncyBvd25cbiAgICogYGludGVncmF0aW9uLXRlc3RzOmRlbW8tdmF1bHRgIHByb2plY3QuIFRoZSByZXR1cm5lZCBwcm9qZWN0cyBhcmUgYXBwZW5kZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkIGZpdmUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHZpdGVzdCBjb25maWd1cmF0aW9uIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIFRoZSBleHRyYSBwcm9qZWN0cy5cbiAgICovXG4gIGN1c3RvbVByb2plY3RzPyhjb250ZXh0OiBPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ0NvbnRleHQpOiBUZXN0UHJvamVjdENvbmZpZ3VyYXRpb25bXTtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGVkaXRzIHRoZSB2aXRlc3QgY29uZmlndXJhdGlvbiBjb250ZXh0IGJlZm9yZSBpdCBpcyBhc3NlbWJsZWQgaW50byBhIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHZpdGVzdCBjb25maWd1cmF0aW9uIGNvbnRleHQuXG4gICAqL1xuICBlZGl0Q29udGV4dD8oY29udGV4dDogT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdDb250ZXh0KTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgY29udGV4dCBmb3IgZGVmaW5pbmcgYSBwbHVnaW4ncyB2aXRlc3QgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBFdmVyeSBtZW1iZXIgaXMgbGl2ZTogdGhlIGFycmF5cyBhbmQgb2JqZWN0cyBpdCBleHBvc2VzIGFyZSB0aGUgdmVyeSBvbmVzIHRoZSBhc3NlbWJsZWQgY29uZmlndXJhdGlvblxuICogaXMgYnVpbHQgZnJvbSwgc28gZWRpdGluZyB0aGVtIGluIHBsYWNlIHRocm91Z2hcbiAqIHtAbGluayBEZWZpbmVPYnNpZGlhblBsdWdpblZpdGVzdENvbmZpZ09wdGlvbnMuZWRpdENvbnRleHR9IGlzIHdoYXQgY3VzdG9taXplcyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgY2xhc3MgT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBgaW50ZWdyYXRpb24tdGVzdHM6YW5kcm9pZGAgcHJvamVjdCwgcnVubmluZyB0aGUgbW9iaWxlLW9ubHkgYW5kIGNyb3NzLXBsYXRmb3JtIHN1aXRlcyBhZ2FpbnN0IGFuXG4gICAqIEFuZHJvaWQgZW11bGF0b3IgdGhyb3VnaCBBcHBpdW0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYW5kcm9pZDogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnbm9kZScsXG4gICAgZW52aXJvbm1lbnRPcHRpb25zOiB7XG4gICAgICBvYnNpZGlhblRyYW5zcG9ydDoge1xuICAgICAgICBhcHBpdW1Vcmw6ICdodHRwOi8vbG9jYWxob3N0OjQ3MjMnLFxuICAgICAgICBhdmROYW1lOiAnb2JzaWRpYW5fdGVzdCcsXG4gICAgICAgIHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bSdcbiAgICAgIH1cbiAgICB9LFxuICAgIGZpbGVQYXJhbGxlbGlzbTogZmFsc2UsXG4gICAgZ2xvYmFsU2V0dXA6IFsnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3QtZ2xvYmFsLXNldHVwLXBsdWdpbiddLFxuICAgIGhvb2tUaW1lb3V0OiBBTkRST0lEX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTICogSE9PS19USU1FT1VUX01VTFRJUExJRVIsXG4gICAgaW5jbHVkZTogW0FORFJPSURfVEVTVF9GSUxFUywgQ1JPU1NfUExBVEZPUk1fVEVTVF9GSUxFU10sXG4gICAgbmFtZTogJ2ludGVncmF0aW9uLXRlc3RzOmFuZHJvaWQnLFxuICAgIHNldHVwRmlsZXM6IFsnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3Qtc2V0dXAnXSxcbiAgICB0ZXN0VGltZW91dDogQU5EUk9JRF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgcGVyLXRlc3QgYnVkZ2V0IG9mIHRoZSBBbmRyb2lkIGludGVncmF0aW9uIHByb2plY3QsIGluIG1pbGxpc2Vjb25kcy4gQm9vdGluZyBhbiBlbXVsYXRvciBhbmRcbiAgICogZHJpdmluZyBpdCBvdmVyIEFwcGl1bSBpcyBzbG93ZXIgdGhhbiB0aGUgZGVza3RvcCBwYXRoLCBoZW5jZSBpdHMgb3duIGNvbnN0YW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYW5kcm9pZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IEFORFJPSURfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgLyoqXG4gICAqIFRoZSBwZXItdGVzdCBidWRnZXQgb2YgdGhlIHJlZ3VsYXIgaW50ZWdyYXRpb24gcHJvamVjdHMsIGluIG1pbGxpc2Vjb25kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDMwMDAwYFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJpZ1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IEJJR19USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICAvKipcbiAgICogVGhlIGNvdmVyYWdlIGBleGNsdWRlYCBnbG9icy4gUHVzaCBvbnRvIGl0IHRvIGRyb3AgbW9yZSBmaWxlcyBmcm9tIHRoZSBjb3ZlcmFnZSByZXBvcnQuXG4gICAqXG4gICAqIERlY2xhcmF0aW9uIGZpbGVzIGFyZSBleGNsdWRlZCBieSBkZWZhdWx0IGJlY2F1c2UgdGhlIGNvdmVyYWdlIGBpbmNsdWRlYCBiZWxvdyBpcyBgc3JjLyoqXFwvKi50c2AsXG4gICAqIHdoaWNoIGEgYC5kLnRzYCBtYXRjaGVzLiBBIGRlY2xhcmF0aW9uIGZpbGUgZW1pdHMgbm8gcnVudGltZSBjb2RlLCBzbyBpdCByZXBvcnRzIDAlIGFuZCBubyB0ZXN0IGNhblxuICAgKiBldmVyIHJhaXNlIGl0IFx1MjAxNCBhIHBsdWdpbiB0aGF0IGdyb3dzIG9uZSB1bmRlciBgc3JjL2Agc2lsZW50bHkgbG9zZXMgaXRzIDEwMCUgZ2F0ZSwgYW5kIHRoZSB1c3VhbFxuICAgKiByZW1lZHkgb2YgYW4gaW5saW5lIGB2OCBpZ25vcmVgIGNvbW1lbnQgZG9lcyBub3QgYXBwbHkgdG8gYSB0eXBlLW9ubHkgZmlsZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb3ZlcmFnZUV4Y2x1ZGU6IHN0cmluZ1tdID0gW1VOSVRfVEVTVF9GSUxFUywgREVDTEFSQVRJT05fRklMRVNdO1xuXG4gIC8qKlxuICAgKiBUaGUgYGludGVncmF0aW9uLXRlc3RzOmRlc2t0b3BgIHByb2plY3QsIHJ1bm5pbmcgdGhlIGRlc2t0b3Atb25seSBhbmQgY3Jvc3MtcGxhdGZvcm0gc3VpdGVzIGFnYWluc3QgYVxuICAgKiByZWFsIGRlc2t0b3AgT2JzaWRpYW4gb3ZlciBDRFAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVza3RvcDogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnbm9kZScsXG4gICAgZmlsZVBhcmFsbGVsaXNtOiBmYWxzZSxcbiAgICBnbG9iYWxTZXR1cDogWydvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nL3ZpdGVzdC1nbG9iYWwtc2V0dXAtcGx1Z2luJ10sXG4gICAgaG9va1RpbWVvdXQ6IEJJR19USU1FT1VUX0lOX01JTExJU0VDT05EUyAqIEhPT0tfVElNRU9VVF9NVUxUSVBMSUVSLFxuICAgIGluY2x1ZGU6IFtERVNLVE9QX1RFU1RfRklMRVMsIENST1NTX1BMQVRGT1JNX1RFU1RfRklMRVNdLFxuICAgIG5hbWU6ICdpbnRlZ3JhdGlvbi10ZXN0czpkZXNrdG9wJyxcbiAgICBzZXR1cEZpbGVzOiBbJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3Rpbmcvdml0ZXN0LXNldHVwJ10sXG4gICAgdGVzdFRpbWVvdXQ6IEJJR19USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgYGludGVncmF0aW9uLXRlc3RzOmRlc2t0b3AtcGVyZm9ybWFuY2VgIHByb2plY3QsIHJ1bm5pbmcgdGhlIGF0LXNjYWxlIHN1aXRlcy4gSXQgaXMgZGVjbGFyZWQgZm9yXG4gICAqIGV2ZXJ5IHBsdWdpbiBldmVuIHdoZW4gdGhlcmUgaXMgbm8gc3VjaCBzdWl0ZSB5ZXQgXHUyMDE0IGBwYXNzV2l0aE5vVGVzdHNgIG1ha2VzIGFuIGVtcHR5IHByb2plY3QgZnJlZSxcbiAgICogYW5kIHRoZSBtYXRjaGluZyBgdGVzdDppbnRlZ3JhdGlvbjpkZXNrdG9wOnBlcmZvcm1hbmNlYCBzY3JpcHQgZXhpc3RzIGZsZWV0LXdpZGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVza3RvcFBlcmZvcm1hbmNlOiBPYnNpZGlhblBsdWdpblZpdGVzdFByb2plY3RDb25maWcgPSB7XG4gICAgZW52aXJvbm1lbnQ6ICdub2RlJyxcbiAgICBmaWxlUGFyYWxsZWxpc206IGZhbHNlLFxuICAgIGdsb2JhbFNldHVwOiBbJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3Rpbmcvdml0ZXN0LWdsb2JhbC1zZXR1cC1wbHVnaW4nXSxcbiAgICBob29rVGltZW91dDogUEVSRk9STUFOQ0VfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgaW5jbHVkZTogW0RFU0tUT1BfUEVSRk9STUFOQ0VfVEVTVF9GSUxFU10sXG4gICAgbmFtZTogJ2ludGVncmF0aW9uLXRlc3RzOmRlc2t0b3AtcGVyZm9ybWFuY2UnLFxuICAgIHNldHVwRmlsZXM6IFsnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3Qtc2V0dXAnXSxcbiAgICB0ZXN0VGltZW91dDogUEVSRk9STUFOQ0VfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgfTtcblxuICAvKipcbiAgICogVGhlIG11bHRpcGxpZXIgYXBwbGllZCB0byBhIHByb2plY3QncyB0ZXN0IGJ1ZGdldCB0byBnZXQgaXRzIGhvb2sgYnVkZ2V0LiBBIGhvb2sgdHlwaWNhbGx5IHBvcHVsYXRlc1xuICAgKiBhbmQgb3BlbnMgYSB2YXVsdCwgc28gaXQgbmVlZHMgc2V2ZXJhbCB0aW1lcyB3aGF0IGEgc2luZ2xlIHRlc3QgZG9lcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDRgXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaG9va1RpbWVvdXRNdWx0aXBsaWVyID0gSE9PS19USU1FT1VUX01VTFRJUExJRVI7XG5cbiAgLyoqXG4gICAqIFRoZSBgaW50ZWdyYXRpb24tdGVzdHM6bm8tYXBwYCBwcm9qZWN0LCBydW5uaW5nIHRoZSBzdWl0ZXMgdGhhdCBuZWVkIG5vIE9ic2lkaWFuIGluc3RhbmNlIGF0IGFsbC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBub0FwcDogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnbm9kZScsXG4gICAgZmlsZVBhcmFsbGVsaXNtOiBmYWxzZSxcbiAgICBob29rVGltZW91dDogQklHX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTICogSE9PS19USU1FT1VUX01VTFRJUExJRVIsXG4gICAgaW5jbHVkZTogW05PX0FQUF9URVNUX0ZJTEVTXSxcbiAgICBuYW1lOiAnaW50ZWdyYXRpb24tdGVzdHM6bm8tYXBwJyxcbiAgICB0ZXN0VGltZW91dDogQklHX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBwZXItdGVzdCBidWRnZXQgb2YgdGhlIHBlcmZvcm1hbmNlIGludGVncmF0aW9uIHByb2plY3QsIGluIG1pbGxpc2Vjb25kcy4gQSBwZXJmb3JtYW5jZSB2YXVsdCBpc1xuICAgKiBwcmUtcG9wdWxhdGVkIHdpdGggdGVucyBvZiB0aG91c2FuZHMgb2Ygbm90ZXMgYmVmb3JlIE9ic2lkaWFuIG9wZW5zLCBzbyBib3RoIGl0cyBzZXR1cCBhbmQgaXRzIHRlc3RzXG4gICAqIG5lZWQgZmFyIG1vcmUgdGltZSB0aGFuIHRoZSByZWd1bGFyIGludGVncmF0aW9uIHByb2plY3RzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDAwYFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBlcmZvcm1hbmNlVGltZW91dEluTWlsbGlzZWNvbmRzID0gUEVSRk9STUFOQ0VfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgLyoqXG4gICAqIFRoZSBgdW5pdC10ZXN0c2AgcHJvamVjdCwgcnVubmluZyB0aGUgbW9ja2VkLU9ic2lkaWFuIHN1aXRlcyBpbiBganNkb21gLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXRUZXN0czogT2JzaWRpYW5QbHVnaW5WaXRlc3RQcm9qZWN0Q29uZmlnID0ge1xuICAgIGVudmlyb25tZW50OiAnanNkb20nLFxuICAgIGV4Y2x1ZGU6IFsuLi5TSEFSRURfRVhDTFVERSwgSU5URUdSQVRJT05fVEVTVF9GSUxFU10sXG4gICAgZXhlY0FyZ3Y6IFsnLS1uby13ZWJzdG9yYWdlJ10sXG4gICAgaW5jbHVkZTogW1VOSVRfVEVTVF9GSUxFU10sXG4gICAgbmFtZTogJ3VuaXQtdGVzdHMnLFxuICAgIHNlcnZlcjoge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGRlcHNgIGlzIGRlY2xhcmVkIGJ5IGB2aXRlc3RgOyByZW5hbWluZyBpdCBoZXJlIHdvdWxkIG5vdCBtYXRjaCB0aGUgQVBJLlxuICAgICAgZGVwczoge1xuICAgICAgICBpbmxpbmU6IFsnQG9ic2lkaWFuLXR5cGluZ3MnLCAnb2JzaWRpYW4tZGV2LXV0aWxzJ11cbiAgICAgIH1cbiAgICB9LFxuICAgIHNldHVwRmlsZXM6IFtcbiAgICAgICdvYnNpZGlhbi10ZXN0LW1vY2tzL3ZpdGVzdC1zZXR1cCcsXG4gICAgICAnb2JzaWRpYW4tZGV2LXV0aWxzL3ZpdGVzdC1zZXR1cCdcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgY29udGV4dCBzZWVkZWQgd2l0aCB0aGUgc3RhbmRhcmQgcHJvamVjdHMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3Qgb2JzaWRpYW5WZXJzaW9uID0gcHJvY2Vzcy5lbnZbT0JTSURJQU5fVkVSU0lPTl9FTlZfVkFSSUFCTEVfTkFNRV07XG5cbiAgICAvKlxuICAgICAqIFN1cHBvcnQgaXMgdGhlIHJhbmdlIFtsYXRlc3QgcHVibGljLCBsYXRlc3QgY2F0YWx5c3RdIGFuZCBCT1RIIGVuZHMgbXVzdCB3b3JrIChHOTkpLCBzbyB0aGUgdmVyc2lvblxuICAgICAqIGlzIGEga25vYiByYXRoZXIgdGhhbiBhIGNvbnN0YW50LiBUaGUga2V5IGlzIGFkZGVkIE9OTFkgd2hlbiB0aGUgdmFyaWFibGUgaXMgc2V0OiBhbiBleHBsaWNpdFxuICAgICAqIGBvYnNpZGlhblZlcnNpb25gIG1ha2VzIHRoZSBoYXJuZXNzIHJlc29sdmUgYSBjb25jcmV0ZSB2ZXJzaW9uIGFuZCBzd2FwIHRoZSBhc2FyLCB3aGljaCBpcyBub3Qgd2hhdFxuICAgICAqIGFuIHVucGlubmVkIHJ1biBkb2VzLCBzbyBzZWVkaW5nIGEgZGVmYXVsdCBoZXJlIHdvdWxkIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgZXZlcnkgcGx1Z2luLlxuICAgICAqL1xuICAgIGlmIChvYnNpZGlhblZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kZXNrdG9wLmVudmlyb25tZW50T3B0aW9ucyA9IHtcbiAgICAgICAgb2JzaWRpYW5UcmFuc3BvcnQ6IHtcbiAgICAgICAgICBvYnNpZGlhblZlcnNpb24sXG4gICAgICAgICAgdHlwZTogJ29ic2lkaWFuLWNkcCdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSB2aXRlc3QgY29uZmlndXJhdGlvbiBmb3IgYW4gT2JzaWRpYW4gcGx1Z2luLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGRlZmluaW5nIHRoZSBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMgVGhlIHZpdGVzdCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWcob3B0aW9uczogRGVmaW5lT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdPcHRpb25zID0ge30pOiBWaXRlVXNlckNvbmZpZyB7XG4gIGNvbnN0IGNvbnRleHQgPSBuZXcgT2JzaWRpYW5QbHVnaW5WaXRlc3RDb25maWdDb250ZXh0KCk7XG5cbiAgaWYgKG9wdGlvbnMuZWRpdENvbnRleHQpIHtcbiAgICBvcHRpb25zLmVkaXRDb250ZXh0KGNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgY3VzdG9tUHJvamVjdHMgPSBvcHRpb25zLmN1c3RvbVByb2plY3RzPy4oY29udGV4dCkgPz8gW107XG5cbiAgcmV0dXJuIGRlZmluZUNvbmZpZyh7XG4gICAgdGVzdDoge1xuICAgICAgY292ZXJhZ2U6IHtcbiAgICAgICAgZXhjbHVkZTogY29udGV4dC5jb3ZlcmFnZUV4Y2x1ZGUsXG4gICAgICAgIGluY2x1ZGU6IFsnc3JjLyoqLyoudHMnXSxcbiAgICAgICAgcHJvdmlkZXI6ICd2OCcsXG4gICAgICAgIHJlcG9ydGVyOiBbJ3RleHQnLCAnbGNvdicsICdodG1sJ10sXG4gICAgICAgIHJlcG9ydHNEaXJlY3Rvcnk6ICcuL2NvdmVyYWdlJ1xuICAgICAgfSxcbiAgICAgIGV4Y2x1ZGU6IFsuLi5TSEFSRURfRVhDTFVERV0sXG4gICAgICBnbG9iYWxzOiBmYWxzZSxcbiAgICAgIC8qXG4gICAgICAgKiBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgTk8gcm9vdC1sZXZlbCBgaW5jbHVkZWAgaGVyZSwgYW5kIHJlc3RvcmluZyBvbmUgYnJlYWtzIGV2ZXJ5IHByb2plY3QuXG4gICAgICAgKiBVbmRlciB2aXRlc3QgNCBhIHByb2plY3QncyBvd24gYGluY2x1ZGVgIHJlcGxhY2VkIHRoZSByb290IG9uZSwgc28gYSByb290XG4gICAgICAgKiBgaW5jbHVkZTogW1VOSVRfVEVTVF9GSUxFU11gIHdhcyBtZXJlbHkgcmVkdW5kYW50IFx1MjAxNCB0aGUgYHVuaXQtdGVzdHNgIHByb2plY3QgYWxyZWFkeSBkZWNsYXJlc1xuICAgICAgICogdGhhdCBzYW1lIGdsb2IgZm9yIGl0c2VsZi4gVW5kZXIgdml0ZXN0IDUgdGhlIHByb2plY3QgZ2xvYiBubyBsb25nZXIgcmVwbGFjZXMgaXQsIGFuZFxuICAgICAgICogYHNyYy8qKlxcLyoudGVzdC50c2AgaXMgYSBzdXBlcnNldCBvZiBldmVyeSBwcm9qZWN0IGdsb2IsIHNvIEVWRVJZIHByb2plY3QgY29sbGVjdGVkIEVWRVJZIHRlc3RcbiAgICAgICAqIGZpbGU6IHVuaXQgc3VpdGVzIHJhbiBpbiB0aGUgQ0RQIGludGVncmF0aW9uIGVudmlyb25tZW50IGFuZCBkaWVkIG9uIGBGYWlsZWQgdG8gcmVzb2x2ZSBlbnRyeVxuICAgICAgICogZm9yIHBhY2thZ2UgXCJvYnNpZGlhblwiYCwgdGhlIHNjcmVlbnNob3QtY2FwdHVyZSBzdWl0ZXMgcmFuIGFuZCByZXdyb3RlIGNoZWNrZWQtaW4gUE5HcywgYW5kIHRoZVxuICAgICAgICogYW5kcm9pZCAvIGRlbW8tdmF1bHQgc3VpdGVzIHJhbiB1bmRlciB0aGUgZGVza3RvcCB0cmFuc3BvcnQuIE1lYXN1cmVkIGluIGEgY29uc3VtZXI6IHRoZSBkZXNrdG9wXG4gICAgICAgKiBwcm9qZWN0IGNvbGxlY3RlZCAyMjcgZmlsZXMgaW5zdGVhZCBvZiBpdHMgb3duIDEwNSwgYW5kIGRlbGV0aW5nIHRoaXMgb25lIGxpbmUgcmVzdG9yZWQgMTA1LlxuICAgICAgICovXG4gICAgICBwYXNzV2l0aE5vVGVzdHM6IHRydWUsXG4gICAgICBwcm9qZWN0czogW1xuICAgICAgICB7XG4gICAgICAgICAgcmVzb2x2ZToge1xuICAgICAgICAgICAgYWxpYXM6IHtcbiAgICAgICAgICAgICAgb2JzaWRpYW46ICdvYnNpZGlhbi10ZXN0LW1vY2tzL29ic2lkaWFuJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGVzdDogY29udGV4dC51bml0VGVzdHNcbiAgICAgICAgfSxcbiAgICAgICAgeyB0ZXN0OiBjb250ZXh0Lm5vQXBwIH0sXG4gICAgICAgIHsgdGVzdDogY29udGV4dC5kZXNrdG9wIH0sXG4gICAgICAgIHsgdGVzdDogY29udGV4dC5kZXNrdG9wUGVyZm9ybWFuY2UgfSxcbiAgICAgICAgeyB0ZXN0OiBjb250ZXh0LmFuZHJvaWQgfSxcbiAgICAgICAgLi4uY3VzdG9tUHJvamVjdHNcbiAgICAgIF1cbiAgICB9XG4gIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQSxPQUFPLGFBQWE7QUFDcEIsU0FBUyxvQkFBb0I7QUFPN0IsTUFBTSxrQ0FBa0M7QUFDeEMsTUFBTSw4QkFBOEI7QUFDcEMsTUFBTSwwQkFBMEI7QUFDaEMsTUFBTSxzQ0FBc0M7QUFFNUMsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSw0QkFBNEI7QUFDbEMsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxpQ0FBaUM7QUFDdkMsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxrQkFBa0I7QUFFeEIsTUFBTSxxQ0FBcUM7QUFDM0MsTUFBTSxpQkFBaUIsQ0FBQyxnQkFBZ0IsTUFBTTtBQThCdkMsTUFBTSxrQ0FBa0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSzdCLFVBQTZDO0FBQUEsSUFDM0QsYUFBYTtBQUFBLElBQ2Isb0JBQW9CO0FBQUEsTUFDbEIsbUJBQW1CO0FBQUEsUUFDakIsV0FBVztBQUFBLFFBQ1gsU0FBUztBQUFBLFFBQ1QsTUFBTTtBQUFBLE1BQ1I7QUFBQSxJQUNGO0FBQUEsSUFDQSxpQkFBaUI7QUFBQSxJQUNqQixhQUFhLENBQUMseURBQXlEO0FBQUEsSUFDdkUsYUFBYSxrQ0FBa0M7QUFBQSxJQUMvQyxTQUFTLENBQUMsb0JBQW9CLHlCQUF5QjtBQUFBLElBQ3ZELE1BQU07QUFBQSxJQUNOLFlBQVksQ0FBQywyQ0FBMkM7QUFBQSxJQUN4RCxhQUFhO0FBQUEsRUFDZjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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
@@ -67,11 +67,8 @@ import {
67
67
  } from "../type-guards.mjs";
68
68
  import { archivePluginDemoVault } from "./demo-vault.mjs";
69
69
  import { readdirPosix } from "./fs.mjs";
70
+ import { gate } from "./gate.mjs";
70
71
  import { editJson } from "./json.mjs";
71
- import {
72
- npmRun,
73
- npmRunOptional
74
- } from "./npm-run.mjs";
75
72
  import {
76
73
  editNpmShrinkWrapJson,
77
74
  editPackageJson,
@@ -311,20 +308,12 @@ async function updateVersion(versionUpdateType, options = {}) {
311
308
  assertChangelogStepIsNonBlocking(changelogFilePath, shouldEditChangelog);
312
309
  if (shouldRunChecks) {
313
310
  await assertGitRepoClean();
314
- await npmRun("format:check");
315
- await npmRun("spellcheck");
316
- await npmRun("lint:md");
317
- }
318
- if (shouldBuild) {
319
- await npmRun("build");
320
- }
321
- if (shouldRunChecks) {
322
- await npmRun("lint");
323
- await npmRunOptional("find-overexposed");
324
- await npmRunOptional("test");
325
- await npmRunOptional("test:integration");
326
- await npmRunOptional("test:coverage");
327
311
  }
312
+ await gate({
313
+ shouldBuild,
314
+ shouldRunChecks,
315
+ shouldRunIntegrationTests: true
316
+ });
328
317
  const newVersion = await getNewVersion(versionUpdateType);
329
318
  const newChangeLog = await prepareChangelog(newVersion, {
330
319
  changelogFilePath,
@@ -565,4 +554,4 @@ export {
565
554
  updateVersionInFiles,
566
555
  validate
567
556
  };
568
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy92ZXJzaW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyB2ZXJzaW9uIHVwZGF0ZXMgaW4gYSBwcm9qZWN0LlxuICogSXQgaW5jbHVkZXMgdGFza3Mgc3VjaCBhcyB2YWxpZGF0aW5nIHZlcnNpb24gdXBkYXRlIHR5cGVzLCBjaGVja2luZyB0aGUgc3RhdGVcbiAqIG9mIEdpdCBhbmQgR2l0SHViIENMSSwgdXBkYXRpbmcgdmVyc2lvbiBudW1iZXJzIGluIGZpbGVzLCBhbmQgcGVyZm9ybWluZ1xuICogR2l0IG9wZXJhdGlvbnMgc3VjaCBhcyB0YWdnaW5nIGFuZCBwdXNoaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVsZWFzZVR5cGUgfSBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkdGVtcCxcbiAgcmVhZEZpbGUsXG4gIHJtLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGNyZWF0ZUludGVyZmFjZSB9IGZyb20gJ25vZGU6cmVhZGxpbmUvcHJvbWlzZXMnO1xuaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7XG4gIGluYyxcbiAgcHJlcmVsZWFzZVxufSBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VMb2NrSnNvbiB9IGZyb20gJy4vbnBtLnRzJztcblxuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyBlcnJvclRvU3RyaW5nIH0gZnJvbSAnLi4vZXJyb3IudHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuLi9vYnNpZGlhbi9wbHVnaW4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJy4uL3N0cmluZy50cyc7XG5pbXBvcnQge1xuICBhc3NlcnROb25OdWxsYWJsZSxcbiAgZW5zdXJlTm9uTnVsbGFibGVcbn0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgYXJjaGl2ZVBsdWdpbkRlbW9WYXVsdCB9IGZyb20gJy4vZGVtby12YXVsdC50cyc7XG5pbXBvcnQgeyByZWFkZGlyUG9zaXggfSBmcm9tICcuL2ZzLnRzJztcbmltcG9ydCB7IGVkaXRKc29uIH0gZnJvbSAnLi9qc29uLnRzJztcbmltcG9ydCB7XG4gIG5wbVJ1bixcbiAgbnBtUnVuT3B0aW9uYWxcbn0gZnJvbSAnLi9ucG0tcnVuLnRzJztcbmltcG9ydCB7XG4gIGVkaXROcG1TaHJpbmtXcmFwSnNvbixcbiAgZWRpdFBhY2thZ2VKc29uLFxuICBlZGl0UGFja2FnZUxvY2tKc29uLFxuICByZWFkUGFja2FnZUpzb25cbn0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocyB9IGZyb20gJy4vb2JzaWRpYW4tZGV2LXV0aWxzLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHtcbiAgZXhlY0Zyb21Sb290LFxuICByZXNvbHZlUGF0aEZyb21Sb290U2FmZVxufSBmcm9tICcuL3Jvb3QudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBhZGRVcGRhdGVkRmlsZXNUb0dpdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkVXBkYXRlZEZpbGVzVG9HaXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGEgdmVyc2lvbiB1cGRhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VkVmVyc2lvbkFyZ3VtZW50cyB7XG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfSBwYXJzZWQgZnJvbSB0aGUgZmxhZ3MuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBVcGRhdGVWZXJzaW9uT3B0aW9ucztcblxuICAvKipcbiAgICogVGhlIHBvc2l0aW9uYWwgdmVyc2lvbiB1cGRhdGUgdHlwZSBhcmd1bWVudCwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSB3YXMgcHJvdmlkZWQuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB1cGRhdGVDaGFuZ2Vsb2d9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMge1xuICAvKipcbiAgICogQSBwYXRoIHRvIGEgZmlsZSB3aG9zZSBjb250ZW50cyBiZWNvbWUgdGhlIGJvZHkgb2YgdGhlIG5ldyB2ZXJzaW9uJ3MgY2hhbmdlbG9nIHNlY3Rpb24sIGluc3RlYWQgb2ZcbiAgICogdGhlIGJ1bGxldHMgZGVyaXZlZCBmcm9tIHRoZSBjb21taXQgbWVzc2FnZXMuIFVzZSBpdCB0byBzdXBwbHkgcHJlcGFyZWQgcmVsZWFzZSBub3RlcyBmcm9tIGFcbiAgICogbm9uLWludGVyYWN0aXZlIGNhbGxlciAoYSBiYWNrZ3JvdW5kIHByb2Nlc3MsIENJLCBhbiBhZ2VudCkuXG4gICAqXG4gICAqIFNldHRpbmcgaXQgaW1wbGllcyBubyBpbnRlcmFjdGl2ZSByZXZpZXc6IHRoZSBjb21taXQgbG9nIGlzIG5vdCByZWFkLCBhbmQgdGhlIGNoYW5nZWxvZyBpcyBuZXZlclxuICAgKiBvcGVuZWQgaW4gdGhlIGVkaXRvciBub3Igd2FpdGVkIG9uIGF0IHRoZSBjb25zb2xlLCByZWdhcmRsZXNzIG9mIHtAbGluayBzaG91bGRFZGl0Q2hhbmdlbG9nfS5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIGZpcnN0LXBhcmVudCBjb21taXQgc3ViamVjdHMgc2luY2UgdGhlIHByZXZpb3VzIHZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZWxvZ0ZpbGVQYXRoPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG9wZW4gdGhlIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgaW4gdGhlIGVkaXRvciBmb3IgYW4gaW50ZXJhY3RpdmUgcmV2aWV3LiBXaGVuIGBmYWxzZWAsXG4gICAqIHRoZSBjaGFuZ2Vsb2cgaXMgc3RpbGwgZ2VuZXJhdGVkIGZyb20gY29tbWl0IG1lc3NhZ2VzLCBidXQgaXQgaXMgbm90IG9wZW5lZCBpbiB0aGUgZWRpdG9yIGZvclxuICAgKiBtYW51YWwgcmV2aWV3LlxuICAgKlxuICAgKiBJZ25vcmVkIHdoZW4ge0BsaW5rIGNoYW5nZWxvZ0ZpbGVQYXRofSBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdENoYW5nZWxvZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHVwZGF0ZVZlcnNpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVZlcnNpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgcGF0aCB0byBhIGZpbGUgd2hvc2UgY29udGVudHMgYmVjb21lIHRoZSBib2R5IG9mIHRoZSBuZXcgdmVyc2lvbidzIGNoYW5nZWxvZyBzZWN0aW9uLCBpbnN0ZWFkIG9mXG4gICAqIHRoZSBidWxsZXRzIGRlcml2ZWQgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2VzLiBVc2UgaXQgdG8gc3VwcGx5IHByZXBhcmVkIHJlbGVhc2Ugbm90ZXMgZnJvbSBhXG4gICAqIG5vbi1pbnRlcmFjdGl2ZSBjYWxsZXIgKGEgYmFja2dyb3VuZCBwcm9jZXNzLCBDSSwgYW4gYWdlbnQpLlxuICAgKlxuICAgKiBTZXR0aW5nIGl0IGltcGxpZXMgbm8gaW50ZXJhY3RpdmUgcmV2aWV3OiB0aGUgY29tbWl0IGxvZyBpcyBub3QgcmVhZCwgYW5kIHRoZSBjaGFuZ2Vsb2cgaXMgbmV2ZXJcbiAgICogb3BlbmVkIGluIHRoZSBlZGl0b3Igbm9yIHdhaXRlZCBvbiBhdCB0aGUgY29uc29sZSwgcmVnYXJkbGVzcyBvZiB7QGxpbmsgc2hvdWxkRWRpdENoYW5nZWxvZ30uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBmaXJzdC1wYXJlbnQgY29tbWl0IHN1YmplY3RzIHNpbmNlIHRoZSBwcmV2aW91cyB2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2Vsb2dGaWxlUGF0aD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQW4gZXhwbGljaXQgYG1pbkFwcFZlcnNpb25gIHRvIHdyaXRlIGludG8gdGhlIHBsdWdpbidzIGBtYW5pZmVzdC5qc29uYCBhbmQgaXRzIG5ldyBgdmVyc2lvbnMuanNvbmBcbiAgICogZW50cnkuIFdoZW4gc2V0LCBpdCBpcyB1c2VkIHZlcmJhdGltIGFuZCB0aGUgbGF0ZXN0IE9ic2lkaWFuIGRlc2t0b3AgdmVyc2lvbiBpcyBub3QgZmV0Y2hlZCBhdCBhbGwuXG4gICAqXG4gICAqIFNldCB0aGlzIHdoZW4gdGhlIHBsdWdpbiBoYXMgYSBrbm93biBtaW5pbXVtIGl0IGFjdHVhbGx5IHJlcXVpcmVzLCByYXRoZXIgdGhhbiB0cmFja2luZyB3aGF0ZXZlclxuICAgKiBPYnNpZGlhbiByZWxlYXNlZCBtb3N0IHJlY2VudGx5LiBPbmx5IGFwcGxpZXMgdG8gT2JzaWRpYW4gcGx1Z2lucywgYW5kIG9ubHkgdG8gbm9uLXByZS1yZWxlYXNlXG4gICAqIHZlcnNpb25zIChhIHByZS1yZWxlYXNlIGNvcGllcyB0aGUgZXhpc3RpbmcgYG1hbmlmZXN0Lmpzb25gIGFuZCBuZXZlciB3cml0ZXMgYG1pbkFwcFZlcnNpb25gKS5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIGxhdGVzdCBPYnNpZGlhbiBkZXNrdG9wIHZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IG1pbkFwcFZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJlcGFyZSB0aGUgR2l0SHViIHJlbGVhc2UuXG4gICAqXG4gICAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIHJlbGVhc2UuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgR2l0SHViIHJlbGVhc2UgaGFzIGJlZW4gcHJlcGFyZWQuXG4gICAqL1xuICBwcmVwYXJlR2l0SHViUmVsZWFzZT8odGhpczogdm9pZCwgbmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhcmNoaXZlIHRoZSBwbHVnaW4ncyBkZW1vIHZhdWx0IChgZGVtby12YXVsdC9gIGluIHRoZSByZXBvIHJvb3QpIGFzIGEgcmVsZWFzZVxuICAgKiBhcnRpZmFjdC4gT25seSBhcHBsaWVzIHRvIE9ic2lkaWFuIHBsdWdpbnM7IGlnbm9yZWQgd2hlbiB0aGUgcmVwbyBoYXMgbm8gYGRlbW8tdmF1bHQvYCBmb2xkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXJjaGl2ZURlbW9WYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBidWlsZCBzdGVwLiBUaGUgYnVpbGQgaXMgYSBwdWJsaXNoaW5nIHByZXJlcXVpc2l0ZSwgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrLFxuICAgKiBzbyBpdCBpcyBnb3Zlcm5lZCBieSB0aGlzIGZsYWcgaW5kZXBlbmRlbnRseSBvZiB7QGxpbmsgc2hvdWxkUnVuQ2hlY2tzfSBcdTIwMTQgaXQgcnVucyBldmVuIHdoZW4gdGhlXG4gICAqIGNoZWNrcyBhcmUgc2tpcHBlZCwgc28gYSBmYXN0IHJlbGVhc2Ugc3RpbGwgc2hpcHMgZnJlc2ggYXJ0aWZhY3RzLiBTZXQgdG8gYGZhbHNlYCBvbmx5IHdoZW4gdGhlXG4gICAqIGJ1aWxkIG91dHB1dCBpcyBrbm93biB0byBhbHJlYWR5IG1hdGNoIHRoZSBjdXJyZW50IGNvZGU7IG90aGVyd2lzZSB0aGUgcmVsZWFzZSB3b3VsZCBwdWJsaXNoXG4gICAqIHN0YWxlIGFydGlmYWN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRCdWlsZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3BlbiB0aGUgZ2VuZXJhdGVkIGNoYW5nZWxvZyBpbiB0aGUgZWRpdG9yIGZvciBhbiBpbnRlcmFjdGl2ZSByZXZpZXcuXG4gICAqXG4gICAqIElnbm9yZWQgd2hlbiB7QGxpbmsgY2hhbmdlbG9nRmlsZVBhdGh9IGlzIHNldC4gV2hlbiBpdCBpcyBuZWl0aGVyIHNldCBub3IgZGlzYWJsZWQsIHRoZSByZWxlYXNlXG4gICAqIHJlcXVpcmVzIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsLCBhbmQge0BsaW5rIHVwZGF0ZVZlcnNpb259IHJlZnVzZXMgdXAgZnJvbnQgd2l0aG91dCBvbmUgcmF0aGVyXG4gICAqIHRoYW4gYmxvY2tpbmcgb24gYW4gZWRpdG9yIG5vYm9keSB3aWxsIGNsb3NlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRDaGFuZ2Vsb2c/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHB1Ymxpc2ggdGhlIHJlbGVhc2UuIFdoZW4gYGZhbHNlYCwgYWxsIGxvY2FsIHN0ZXBzIGFyZSBleGVjdXRlZCAodmVyc2lvbiBidW1wLFxuICAgKiBjaGFuZ2Vsb2csIGNvbW1pdCwgdGFnKSwgYnV0IHRoZSBjaGFuZ2VzIGFyZSBub3QgcHVzaGVkIGFuZCBubyBHaXRIdWIgcmVsZWFzZSBpcyBwdWJsaXNoZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmVmbGlnaHQgdmVyaWZpY2F0aW9uIGNoZWNrcyAoY2xlYW4tcmVwbyBjaGVjaywgZm9ybWF0LCBzcGVsbGNoZWNrLCBsaW50LFxuICAgKiBvdmVyLWV4cG9zdXJlIGFuYWx5c2lzLCBhbmQgdGVzdHMpLiBUaGUgYnVpbGQgc3RlcCBpcyBub3Qgb25lIG9mIHRoZXNlIGNoZWNrcyBcdTIwMTQgaXQgaXMgZ292ZXJuZWRcbiAgICogc2VwYXJhdGVseSBieSB7QGxpbmsgc2hvdWxkQnVpbGR9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJ1bkNoZWNrcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE5wbVBhY2tSZXN1bHQge1xuICByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHByZS1yZWxlYXNlIGlkZW50aWZpZXIgdXNlZCBmb3IgcHJlLXJlbGVhc2UgdmVyc2lvbnMuXG4gKi9cbmNvbnN0IERFRkFVTFRfUFJFSUQgPSAnYmV0YSc7XG5cbi8qKlxuICogVGhlIGZlZWQgdGhlIE9ic2lkaWFuIGRlc2t0b3AgYXBwIHVwZGF0ZXMgZnJvbS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIHRoZSBHaXRIdWIgYHJlbGVhc2VzL2xhdGVzdGAgQVBJOiB0aGF0IGVuZHBvaW50IHJldHVybnMgdGhlIG5ld2VzdCByZWxlYXNlIG9mIGFueSBraW5kXG4gKiBpbiBgb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlc2AsIGluY2x1ZGluZyBvbmUgd2hvc2Ugb25seSBhc3NldCBpcyB0aGUgQW5kcm9pZCBBUEssIHdoaWNoIG5vIGRlc2t0b3BcbiAqIHVzZXIgY2FuIGluc3RhbGwuIFNlZSB7QGxpbmsgZ2V0TGF0ZXN0T2JzaWRpYW5WZXJzaW9ufS5cbiAqL1xuY29uc3QgREVTS1RPUF9SRUxFQVNFU19KU09OX1VSTCA9ICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlcy9tYXN0ZXIvZGVza3RvcC1yZWxlYXNlcy5qc29uJztcblxuLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyBkaWZmZXJlbnQgdHlwZXMgb2YgdmVyc2lvbiB1cGRhdGVzLlxuICpcbiAqIEFsaWducyB3aXRoIG5wbSdzIGBucG0gdmVyc2lvbmAgaW5jcmVtZW50IHR5cGVzIHBsdXMgYE1hbnVhbGAgZm9yIGV4cGxpY2l0IHZlcnNpb25zLlxuICovXG5leHBvcnQgZW51bSBWZXJzaW9uVXBkYXRlVHlwZSB7XG4gIEludmFsaWQgPSAnaW52YWxpZCcsXG4gIE1ham9yID0gJ21ham9yJyxcbiAgTWFudWFsID0gJ21hbnVhbCcsXG4gIE1pbm9yID0gJ21pbm9yJyxcbiAgUGF0Y2ggPSAncGF0Y2gnLFxuICBQcmVNYWpvciA9ICdwcmVtYWpvcicsXG4gIFByZU1pbm9yID0gJ3ByZW1pbm9yJyxcbiAgUHJlUGF0Y2ggPSAncHJlcGF0Y2gnLFxuICBQcmVSZWxlYXNlID0gJ3ByZXJlbGVhc2UnXG59XG5cbi8qKlxuICogVHlwZSByZXByZXNlbnRpbmcgdGhlIHN0cnVjdHVyZSBvZiBPYnNpZGlhbidzIGBkZXNrdG9wLXJlbGVhc2VzLmpzb25gIGZlZWQuXG4gKlxuICogVGhpcyBpcyB0aGUgZmVlZCB0aGUgZGVza3RvcCBhcHAgaXRzZWxmIHVwZGF0ZXMgZnJvbSwgc28gaXQgaXMgdGhlIG9ubHkgc291cmNlIHRoYXQgc3RhdGVzIGEgdmVyc2lvblxuICogZGVza3RvcCB1c2VycyBjYW4gYWN0dWFsbHkgcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlc2t0b3BSZWxlYXNlc0pzb24ge1xuICAvKipcbiAgICogVGhlIGxhdGVzdCBPYnNpZGlhbiB2ZXJzaW9uIGF2YWlsYWJsZSBmb3IgZGVza3RvcC5cbiAgICovXG4gIGxhdGVzdFZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBUeXBlIHJlcHJlc2VudGluZyB0aGUgbWFuaWZlc3QgZmlsZSBmb3JtYXQgZm9yIE9ic2lkaWFuIHBsdWdpbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFuaWZlc3Qge1xuICAvKipcbiAgICogQSBtaW5pbXVtIE9ic2lkaWFuIHZlcnNpb24gcmVxdWlyZWQgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBtaW5BcHBWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBHaXQgdGFnIGZvciB0aGUgbmV3IHZlcnNpb24uXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRvIHVzZSBmb3IgdGhlIHRhZy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdGFnIGhhcyBiZWVuIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRHaXRUYWcobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChgZ2l0IHRhZyAtYSAke25ld1ZlcnNpb259IC1tICR7bmV3VmVyc2lvbn0gLS1mb3JjZWAsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBBZGRzIHVwZGF0ZWQgZmlsZXMgdG8gdGhlIEdpdCBzdGFnaW5nIGFyZWEgYW5kIGNvbW1pdHMgdGhlbSB3aXRoIHRoZSBuZXcgdmVyc2lvbiBtZXNzYWdlLlxuICpcbiAqIElmIHRoZSBjb21taXQgZmFpbHMgKGZvciBleGFtcGxlLCB0aGUgcHJlLWNvbW1pdCBob29rIHJlamVjdHMgYSBuZXcgd29yZCBpbiB0aGUgY2hhbmdlbG9nKSBhbmQgdGhlXG4gKiBwcm9jZXNzIGlzIGF0dGFjaGVkIHRvIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsLCB0aGUgdXNlciBpcyBwcm9tcHRlZCB0byBmaXggdGhlIGlzc3VlIChmb3IgZXhhbXBsZSxcbiAqIGFkZCB0aGUgbWlzc2luZyB3b3JkIHRvIGBjc3BlbGwuanNvbmApIGFuZCBwcmVzcyBFbnRlciB0byByZXRyeS4gVGhlIHJldHJ5IHJlLXN0YWdlcyBhbGwgZmlsZXMsIHNvIHRoZVxuICogZml4IGlzIHBpY2tlZCB1cCB3aXRob3V0IHJlc3RhcnRpbmcgdGhlIHdob2xlIHJlbGVhc2UgbGlmZWN5Y2xlLiBJbiBhIG5vbi1pbnRlcmFjdGl2ZSBlbnZpcm9ubWVudCAobm9cbiAqIFRUWSwgc3VjaCBhcyBDSSksIHRoZSBlcnJvciBpcyByZS10aHJvd24gaW5zdGVhZCBvZiBwcm9tcHRpbmcsIHNvIHRoZSBzY3JpcHQgZmFpbHMgZmFzdCByYXRoZXIgdGhhblxuICogaGFuZ2luZy4gUGFzcyBgc2hvdWxkVmVyaWZ5Q29tbWl0OiBmYWxzZWAgdG8gc2tpcCB0aGUgcHJlLWNvbW1pdCBob29rIGVudGlyZWx5IGluIHN1Y2ggY2FzZXMuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHVzZWQgYXMgdGhlIGNvbW1pdCBtZXNzYWdlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9uc30gY29udHJvbGxpbmcgdGhlIGNvbW1pdCBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIGFuZCBjb21taXR0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRVcGRhdGVkRmlsZXNUb0dpdChuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc2hvdWxkVmVyaWZ5Q29tbWl0ID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgdmVyc2lvbkRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKTtcblxuICBjb25zdCBjb21taXRBcmd1bWVudHMgPSBbJ2dpdCcsICdjb21taXQnLCAnLW0nLCBgY2hvcmU6IHJlbGVhc2UgJHtuZXdWZXJzaW9ufWAsICctLWFsbG93LWVtcHR5J107XG4gIGlmICghc2hvdWxkVmVyaWZ5Q29tbWl0KSB7XG4gICAgY29tbWl0QXJndW1lbnRzLnB1c2goJy0tbm8tdmVyaWZ5Jyk7XG4gIH1cblxuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdhZGQnLCAnLS1hbGwnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZXhlY0Zyb21Sb290KGNvbW1pdEFyZ3VtZW50cywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHZlcnNpb25EZWJ1Z2dlcihcbiAgICAgICAgYEZhaWxlZCB0byBjb21taXQgdGhlIHJlbGVhc2UuXFxuJHtlcnJvclRvU3RyaW5nKGVycm9yKX1cXG5gXG4gICAgICAgICAgKyAnRml4IHRoZSBpc3N1ZXMgKGZvciBleGFtcGxlLCBhZGQgdGhlIG1pc3Npbmcgd29yZCB0byBjc3BlbGwuanNvbikgYW5kIHByZXNzIEVudGVyIHRvIHJldHJ5IHRoZSBjb21taXQsIG9yIEN0cmwrQyB0byBhYm9ydC4nXG4gICAgICApO1xuICAgICAgYXdhaXQgY3JlYXRlSW50ZXJmYWNlKHByb2Nlc3Muc3RkaW4sIHByb2Nlc3Muc3Rkb3V0KS5xdWVzdGlvbignUHJlc3MgRW50ZXIgdG8gcmV0cnkgdGhlIGNvbW1pdC4uLicpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgR2l0SHViIENMSSBpcyBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIEdpdEh1YiBDTEkgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBHaXRIdWIgQ0xJIGlzIG5vdCBpbnN0YWxsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRHaXRIdWJDbGlJbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlY0Zyb21Sb290KCdnaCAtLXZlcnNpb24nLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLiBQbGVhc2UgaW5zdGFsbCBpdCBmcm9tIGh0dHBzOi8vY2xpLmdpdGh1Yi5jb20vJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgR2l0IGlzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiBHaXQgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIEdpdCBpcyBub3QgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0R2l0SW5zdGFsbGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IC0tdmVyc2lvbicsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdHaXQgaXMgbm90IGluc3RhbGxlZC4gUGxlYXNlIGluc3RhbGwgaXQgZnJvbSBodHRwczovL2dpdC1zY20uY29tLycpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBjbGVhbiwgbWVhbmluZyB0aGVyZSBhcmUgbm8gdW5jb21taXR0ZWQgY2hhbmdlcy5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIEdpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBub3QgY2xlYW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRHaXRSZXBvQ2xlYW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgc3RhdHVzIC0tcG9yY2VsYWluIC0tdW50cmFja2VkLWZpbGVzPWFsbCcsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICBpZiAoc3Rkb3V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l0IHJlcG9zaXRvcnkgaXMgbm90IGNsZWFuLiBQbGVhc2UgY29tbWl0IG9yIHN0YXNoIHlvdXIgY2hhbmdlcyBiZWZvcmUgcmVsZWFzaW5nIGEgbmV3IHZlcnNpb24uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwcyBhbnkgYmFyZSBgaHR0cChzKTovL2AgVVJMIGluIHRoZSBnaXZlbiB0ZXh0IGluIGFuZ2xlIGJyYWNrZXRzIChgPHVybD5gKSBzbyB0aGF0IHRleHQgZW1pdHRlZFxuICogaW50byBhIE1hcmtkb3duIGRvY3VtZW50IChzdWNoIGFzIGEgZ2VuZXJhdGVkIGNoYW5nZWxvZyBidWxsZXQpIHBhc3NlcyBtYXJrZG93bmxpbnQnc1xuICogYE1EMDM0L25vLWJhcmUtdXJsc2AgcnVsZSB3aGlsZSBzdGlsbCByZW5kZXJpbmcgYXMgYSBjbGlja2FibGUgYXV0b2xpbmsgb24gR2l0SHViLlxuICpcbiAqIFVSTHMgdGhhdCBhcmUgYWxyZWFkeSB3cmFwcGVkIGluIGFuZ2xlIGJyYWNrZXRzIChgPHVybD5gKSBvciB0aGF0IGZvcm0gdGhlIHRhcmdldCBvZiBhIE1hcmtkb3duXG4gKiBsaW5rIChgW3RleHRdKHVybClgKSBhcmUgbGVmdCB1bnRvdWNoZWQsIHNvIHRoZSBmdW5jdGlvbiBpcyBzYWZlIHRvIHJ1biByZXBlYXRlZGx5LiBUcmFpbGluZ1xuICogc2VudGVuY2UgcHVuY3R1YXRpb24gKGAuYCwgYCxgLCBgO2AsIGA6YCwgYCFgLCBgP2ApIGlzIGtlcHQgb3V0c2lkZSB0aGUgYW5nbGUgYnJhY2tldHMgc28gaXQgZG9lc1xuICogbm90IGJlY29tZSBwYXJ0IG9mIHRoZSBsaW5rLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgcG9zc2libHkgY29udGFpbmluZyBiYXJlIFVSTHMuXG4gKiBAcmV0dXJucyBUaGUgdGV4dCB3aXRoIGV2ZXJ5IGJhcmUgVVJMIHdyYXBwZWQgaW4gYW5nbGUgYnJhY2tldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXRvbGlua0JhcmVVcmxzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoLyg/PCFbPFsoXSlodHRwcz86XFwvXFwvW15cXHM8PilcXF1dKy9nLCAodXJsKSA9PiB7XG4gICAgY29uc3QgdHJhaWxpbmdQdW5jdHVhdGlvbiA9IC9bLiw7OiE/XSskLy5leGVjKHVybCk/LlswXSA/PyAnJztcbiAgICBjb25zdCBiYXJlVXJsID0gdXJsLnNsaWNlKDAsIHVybC5sZW5ndGggLSB0cmFpbGluZ1B1bmN0dWF0aW9uLmxlbmd0aCk7XG4gICAgcmV0dXJuIGA8JHtiYXJlVXJsfT4ke3RyYWlsaW5nUHVuY3R1YXRpb259YDtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSB1cGRhdGVkIG1hbmlmZXN0IGZpbGUgdG8gdGhlIGRpc3RyaWJ1dGlvbiBidWlsZCBmb2xkZXIuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb3B5IG9wZXJhdGlvbiBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlVcGRhdGVkTWFuaWZlc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGNwKFxuICAgIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RKc29uIH0pLFxuICAgIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogam9pbihPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbikgfSksXG4gICAgeyBmb3JjZTogdHJ1ZSB9XG4gICk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbmV3IHZlcnNpb24gc3RyaW5nIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZlcnNpb24gYW5kIHRoZSBzcGVjaWZpZWQgdXBkYXRlIHR5cGUuXG4gKlxuICogVXNlcyB0aGUgYHNlbXZlcmAgcGFja2FnZSB0byBjb21wdXRlIHRoZSBuZXh0IHZlcnNpb24sIHN1cHBvcnRpbmcgYWxsIG5wbSBpbmNyZW1lbnQgdHlwZXM6XG4gKiBgbWFqb3JgLCBgbWlub3JgLCBgcGF0Y2hgLCBgcHJlbWFqb3JgLCBgcHJlbWlub3JgLCBgcHJlcGF0Y2hgLCBhbmQgYHByZXJlbGVhc2VgLlxuICogUHJlLXJlbGVhc2UgdmVyc2lvbnMgdXNlIHRoZSBgYmV0YWAgaWRlbnRpZmllciBieSBkZWZhdWx0IChlLmcuLCBgMS4yLjQtYmV0YS4wYCkuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgb3IgYW4gZXhwbGljaXQgdmVyc2lvbiBzdHJpbmcuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgdmVyc2lvbiBzdHJpbmcuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBjdXJyZW50IHZlcnNpb24gaXMgaW52YWxpZCBvciB0aGUgaW5jcmVtZW50IGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdmVyc2lvblR5cGUgPSBnZXRWZXJzaW9uVXBkYXRlVHlwZSh2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGlmICh2ZXJzaW9uVHlwZSA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuTWFudWFsKSB7XG4gICAgcmV0dXJuIHZlcnNpb25VcGRhdGVUeXBlO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24oKTtcbiAgY29uc3QgY3VycmVudFZlcnNpb24gPSBwYWNrYWdlSnNvbi52ZXJzaW9uID8/ICcnO1xuXG4gIGNvbnN0IHJlbGVhc2VUeXBlID0gdmVyc2lvblR5cGUgYXMgUmVsZWFzZVR5cGU7XG4gIGNvbnN0IGlzUHJlUmVsZWFzZVR5cGUgPSByZWxlYXNlVHlwZS5zdGFydHNXaXRoKCdwcmUnKTtcbiAgY29uc3QgbmV3VmVyc2lvbiA9IGlzUHJlUmVsZWFzZVR5cGVcbiAgICA/IGluYyhjdXJyZW50VmVyc2lvbiwgcmVsZWFzZVR5cGUsIERFRkFVTFRfUFJFSUQpXG4gICAgOiBpbmMoY3VycmVudFZlcnNpb24sIHJlbGVhc2VUeXBlKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobmV3VmVyc2lvbiwgYEZhaWxlZCB0byBpbmNyZW1lbnQgdmVyc2lvbiBmcm9tICcke2N1cnJlbnRWZXJzaW9ufScgd2l0aCB0eXBlICcke3ZlcnNpb25UeXBlfSdgKTtcblxuICByZXR1cm4gbmV3VmVyc2lvbjtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHJlbGVhc2Ugbm90ZXMgZm9yIGEgc3BlY2lmaWMgdmVyc2lvbiBmcm9tIHRoZSBjaGFuZ2Vsb2cuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB3aGljaCB0byBnZXQgdGhlIHJlbGVhc2Ugbm90ZXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZWxlYXNlIG5vdGVzIGZvciB0aGUgc3BlY2lmaWVkIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWxlYXNlTm90ZXMobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY2hhbmdlbG9nUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSk7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShjaGFuZ2Vsb2dQYXRoLCAndXRmLTgnKTtcbiAgY29uc3Qgc2VjdGlvbiA9IGV4dHJhY3RDaGFuZ2Vsb2dTZWN0aW9uKGNvbnRlbnQsIG5ld1ZlcnNpb24pO1xuICBsZXQgcmVsZWFzZU5vdGVzID0gc2VjdGlvbiA/IGAke3NlY3Rpb259XFxuXFxuYCA6ICcnO1xuXG4gIGNvbnN0IHRhZ091dHB1dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IHRhZyAtLXNvcnQ9LWNyZWF0b3JkYXRlJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICBjb25zdCB0YWdzID0gdGFnT3V0cHV0LnNwbGl0KC9cXHI/XFxuLyk7XG4gIGNvbnN0IHByZXZpb3VzVmVyc2lvbiA9IHRhZ3NbMV07XG5cbiAgY29uc3QgcmVwb1VybCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2ggcmVwbyB2aWV3IC0tanNvbiB1cmwgLXEgLnVybCcsIHsgaXNRdWlldDogdHJ1ZSB9KTtcblxuICBjb25zdCBjaGFuZ2VzVXJsID0gcHJldmlvdXNWZXJzaW9uID8gYCR7cmVwb1VybH0vY29tcGFyZS8ke3ByZXZpb3VzVmVyc2lvbn0uLi4ke25ld1ZlcnNpb259YCA6IGAke3JlcG9Vcmx9L2NvbW1pdHMvJHtuZXdWZXJzaW9ufWA7XG5cbiAgcmVsZWFzZU5vdGVzICs9IGAqKkZ1bGwgQ2hhbmdlbG9nKio6ICR7Y2hhbmdlc1VybH1gO1xuICByZXR1cm4gcmVsZWFzZU5vdGVzO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgYmFzZWQgb24gdGhlIGlucHV0IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgaW5wdXQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIGBWZXJzaW9uVXBkYXRlVHlwZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZXJzaW9uVXBkYXRlVHlwZSh2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nKTogVmVyc2lvblVwZGF0ZVR5cGUge1xuICBjb25zdCB2ZXJzaW9uVXBkYXRlVHlwZUVudW0gPSB2ZXJzaW9uVXBkYXRlVHlwZSBhcyBWZXJzaW9uVXBkYXRlVHlwZTtcbiAgc3dpdGNoICh2ZXJzaW9uVXBkYXRlVHlwZUVudW0pIHtcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLk1ham9yOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuTWlub3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlByZU1ham9yOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuUHJlTWlub3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5QcmVQYXRjaDpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlByZVJlbGVhc2U6IHtcbiAgICAgIHJldHVybiB2ZXJzaW9uVXBkYXRlVHlwZUVudW07XG4gICAgfVxuXG4gICAgZGVmYXVsdDoge1xuICAgICAgaWYgKC9eXFxkK1xcLlxcZCtcXC5cXGQrKD86LVtcXHdcXGQuLV0rKT8kLy50ZXN0KHZlcnNpb25VcGRhdGVUeXBlKSkge1xuICAgICAgICByZXR1cm4gVmVyc2lvblVwZGF0ZVR5cGUuTWFudWFsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gVmVyc2lvblVwZGF0ZVR5cGUuSW52YWxpZDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQdXNoZXMgY29tbWl0cyBhbmQgdGFncyB0byB0aGUgcmVtb3RlIEdpdCByZXBvc2l0b3J5LlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcHVzaCBvcGVyYXRpb24gaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnaXRQdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBleGVjRnJvbVJvb3QoJ2dpdCBwdXNoIC0tZm9sbG93LXRhZ3MgLS1mb3JjZScsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGEgdmVyc2lvbiB1cGRhdGUgaW50byBhIHZlcnNpb24gdXBkYXRlIHR5cGUgYW5kXG4gKiB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnN9LlxuICpcbiAqIEVhY2ggYmVoYXZpb3IgaXMgZW5hYmxlZCBieSBkZWZhdWx0OyB0aGUgY29ycmVzcG9uZGluZyBgLS1uby0qYCBmbGFnIHR1cm5zIGl0IG9mZi4gYC0tY2hhbmdlbG9nLWZpbGVgIGFuZFxuICogYC0tbWluLWFwcC12ZXJzaW9uYCB0YWtlIGEgdmFsdWUgaW5zdGVhZCBhbmQgaGF2ZSBubyBkZWZhdWx0LiBSZWNvZ25pemVkIGZsYWdzOlxuICogLSBgLS1jaGFuZ2Vsb2ctZmlsZT08cGF0aD5gIFx1MjAxNCB1c2UgdGhpcyBmaWxlJ3MgY29udGVudHMgYXMgdGhlIG5ldyB2ZXJzaW9uJ3MgY2hhbmdlbG9nIHNlY3Rpb24gaW5zdGVhZCBvZlxuICogICB0aGUgY29tbWl0LWRlcml2ZWQgYnVsbGV0cywgYW5kIHNraXAgdGhlIGludGVyYWN0aXZlIHJldmlldyBlbnRpcmVseS5cbiAqIC0gYC0tbWluLWFwcC12ZXJzaW9uPTx4Lnkuej5gIFx1MjAxNCB3cml0ZSB0aGlzIGBtaW5BcHBWZXJzaW9uYCBpbnRvIHRoZSBwbHVnaW4ncyBgbWFuaWZlc3QuanNvbmAgYW5kIGl0cyBuZXdcbiAqICAgYHZlcnNpb25zLmpzb25gIGVudHJ5IGluc3RlYWQgb2YgdHJhY2tpbmcgdGhlIGxhdGVzdCBPYnNpZGlhbiBkZXNrdG9wIHZlcnNpb24uXG4gKiAtIGAtLW5vLWJ1aWxkYCBcdTIwMTQgc2tpcCB0aGUgYnVpbGQgc3RlcCAob25seSBzYWZlIHdoZW4gdGhlIGJ1aWxkIG91dHB1dCBhbHJlYWR5IG1hdGNoZXMgdGhlIGN1cnJlbnQgY29kZSkuXG4gKiAtIGAtLW5vLWNoYW5nZWxvZy1lZGl0aW5nYCBcdTIwMTQgZ2VuZXJhdGUgdGhlIGNoYW5nZWxvZyB3aXRob3V0IG9wZW5pbmcgaXQgZm9yIG1hbnVhbCByZXZpZXcuXG4gKiAtIGAtLW5vLWNoZWNrc2AgXHUyMDE0IHNraXAgdGhlIGNsZWFuLXJlcG8gY2hlY2ssIGZvcm1hdCwgc3BlbGxjaGVjaywgbGludCwgb3Zlci1leHBvc3VyZSBhbmFseXNpcywgYW5kIHRlc3RzICh0aGUgYnVpbGQgc3RpbGwgcnVucykuXG4gKiAtIGAtLW5vLWNvbW1pdC12ZXJpZmljYXRpb25gIFx1MjAxNCBwYXNzIGAtLW5vLXZlcmlmeWAgdG8gdGhlIHJlbGVhc2UgY29tbWl0LCBza2lwcGluZyB0aGUgcHJlLWNvbW1pdCBob29rLlxuICogLSBgLS1uby1kZW1vLXZhdWx0YCBcdTIwMTQgc2tpcCBhcmNoaXZpbmcgdGhlIHBsdWdpbidzIGRlbW8gdmF1bHQgKGBkZW1vLXZhdWx0L2ApIGFzIGEgcmVsZWFzZSBhcnRpZmFjdC5cbiAqIC0gYC0tbm8tcmVsZWFzZWAgXHUyMDE0IHJ1biBhbGwgbG9jYWwgc3RlcHMgYnV0IHNraXAgdGhlIHB1c2ggYW5kIHRoZSBHaXRIdWIgcmVsZWFzZS5cbiAqXG4gKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRvIHBhcnNlICh0eXBpY2FsbHkgYHByb2Nlc3MuYXJndi5zbGljZSgyKWApLlxuICogQHJldHVybnMgVGhlIHtAbGluayBQYXJzZWRWZXJzaW9uQXJndW1lbnRzfSBjb250YWluaW5nIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIGFuZCB0aGUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmVyc2lvbkFyZ3VtZW50cygkYXJndW1lbnRzOiBzdHJpbmdbXSk6IFBhcnNlZFZlcnNpb25Bcmd1bWVudHMge1xuICBjb25zdCB7IHBvc2l0aW9uYWxzLCB2YWx1ZXMgfSA9IHBhcnNlQXJncyh7XG4gICAgYWxsb3dQb3NpdGlvbmFsczogdHJ1ZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgYXJnc2AgaXMgdGhlIG9wdGlvbiBuYW1lIE5vZGUncyBgcGFyc2VBcmdzYCByZWFkcy5cbiAgICBhcmdzOiAkYXJndW1lbnRzLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgICdjaGFuZ2Vsb2ctZmlsZSc6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICdtaW4tYXBwLXZlcnNpb24nOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAnbm8tYnVpbGQnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLWNoYW5nZWxvZy1lZGl0aW5nJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICduby1jaGVja3MnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLWNvbW1pdC12ZXJpZmljYXRpb24nOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLWRlbW8tdmF1bHQnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLXJlbGVhc2UnOiB7IHR5cGU6ICdib29sZWFuJyB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG9wdGlvbnM6IHtcbiAgICAgIGNoYW5nZWxvZ0ZpbGVQYXRoOiB2YWx1ZXNbJ2NoYW5nZWxvZy1maWxlJ10sXG4gICAgICBtaW5BcHBWZXJzaW9uOiB2YWx1ZXNbJ21pbi1hcHAtdmVyc2lvbiddLFxuICAgICAgc2hvdWxkQXJjaGl2ZURlbW9WYXVsdDogISh2YWx1ZXNbJ25vLWRlbW8tdmF1bHQnXSA/PyBmYWxzZSksXG4gICAgICBzaG91bGRCdWlsZDogISh2YWx1ZXNbJ25vLWJ1aWxkJ10gPz8gZmFsc2UpLFxuICAgICAgc2hvdWxkRWRpdENoYW5nZWxvZzogISh2YWx1ZXNbJ25vLWNoYW5nZWxvZy1lZGl0aW5nJ10gPz8gZmFsc2UpLFxuICAgICAgc2hvdWxkUmVsZWFzZTogISh2YWx1ZXNbJ25vLXJlbGVhc2UnXSA/PyBmYWxzZSksXG4gICAgICBzaG91bGRSdW5DaGVja3M6ICEodmFsdWVzWyduby1jaGVja3MnXSA/PyBmYWxzZSksXG4gICAgICBzaG91bGRWZXJpZnlDb21taXQ6ICEodmFsdWVzWyduby1jb21taXQtdmVyaWZpY2F0aW9uJ10gPz8gZmFsc2UpXG4gICAgfSxcbiAgICB2ZXJzaW9uVXBkYXRlVHlwZTogcG9zaXRpb25hbHNbMF1cbiAgfTtcbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZSBmb3IgdGhlIG5ldyB2ZXJzaW9uLlxuICpcbiAqIEhhbmRsZXMgdGhlIGNyZWF0aW9uIG9mIGEgcmVsZWFzZSBhbmQgdXBsb2FkaW5nIGZpbGVzIGZvciBlaXRoZXIgYW4gT2JzaWRpYW4gcGx1Z2luIG9yIGFub3RoZXIgcHJvamVjdC5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSByZWxlYXNlLlxuICogQHBhcmFtIGlzT2JzaWRpYW5QbHVnaW4gLSBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgcHJvamVjdCBpcyBhbiBPYnNpZGlhbiBwbHVnaW4uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHJlbGVhc2UgaGFzIGJlZW4gcHVibGlzaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVibGlzaEdpdEh1YlJlbGVhc2UobmV3VmVyc2lvbjogc3RyaW5nLCBpc09ic2lkaWFuUGx1Z2luOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBmaWxlUGF0aHM6IHN0cmluZ1tdO1xuXG4gIGlmIChpc09ic2lkaWFuUGx1Z2luKSB7XG4gICAgY29uc3QgYnVpbGRGb2xkZXIgPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3RCdWlsZCB9KTtcbiAgICBjb25zdCBmaWxlTmFtZXMgPSBhd2FpdCByZWFkZGlyUG9zaXgoYnVpbGRGb2xkZXIpO1xuICAgIGZpbGVQYXRocyA9IGZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBqb2luKGJ1aWxkRm9sZGVyLCBmaWxlTmFtZSkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHJlc3VsdE91dHB1dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ25wbScsICdwYWNrJywgJy0tcGFjay1kZXN0aW5hdGlvbicsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdCwgJy0tanNvbiddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VOcG1QYWNrT3V0cHV0KHJlc3VsdE91dHB1dCk7XG4gICAgZmlsZVBhdGhzID0gW1xuICAgICAgam9pbihPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLkRpc3QsIHJlc3VsdC5maWxlbmFtZSksXG4gICAgICBqb2luKE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdCwgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5TdHlsZXNDc3MpXG4gICAgXTtcbiAgfVxuXG4gIGZpbGVQYXRocyA9IGZpbGVQYXRocy5maWx0ZXIoKGZpbGVQYXRoKSA9PiBleGlzdHNTeW5jKHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogZmlsZVBhdGggfSkpKTtcblxuICBhd2FpdCBleGVjRnJvbVJvb3QoW1xuICAgICdnaCcsXG4gICAgJ3JlbGVhc2UnLFxuICAgICdjcmVhdGUnLFxuICAgIG5ld1ZlcnNpb24sXG4gICAgLi4uZmlsZVBhdGhzLFxuICAgICctLXRpdGxlJyxcbiAgICBgdiR7bmV3VmVyc2lvbn1gLFxuICAgIC4uLihpc1ByZVJlbGVhc2UobmV3VmVyc2lvbikgPyBbJy0tcHJlcmVsZWFzZSddIDogW10pLFxuICAgICctLW5vdGVzLWZpbGUnLFxuICAgICctJ1xuICBdLCB7XG4gICAgaXNRdWlldDogdHJ1ZSxcbiAgICBzdGRpbjogYXdhaXQgZ2V0UmVsZWFzZU5vdGVzKG5ld1ZlcnNpb24pXG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGNoYW5nZWxvZyBmaWxlIHdpdGggbmV3IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGNvbW1pdCBtZXNzYWdlcy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBjdXJyZW50IGNoYW5nZWxvZywgYXBwZW5kcyBuZXcgZW50cmllcyBmb3IgdGhlIGxhdGVzdCB2ZXJzaW9uLFxuICogYW5kIHByb21wdHMgdGhlIHVzZXIgdG8gcmV2aWV3IHRoZSBjaGFuZ2VzLlxuICpcbiAqIFRoZSByZXZpZXcgaGFwcGVucyBvbiBhIHNjcmF0Y2ggY29weSBpbiB0aGUgT1MgdGVtcG9yYXJ5IGZvbGRlciwgYW5kIHRoZSByZXBvc2l0b3J5J3Mgb3duXG4gKiBgQ0hBTkdFTE9HLm1kYCBpcyB3cml0dGVuIG9ubHkgb25jZSB0aGUgcmV2aWV3IGlzIG92ZXIgXHUyMDE0IHNvIGludGVycnVwdGluZyB0aGUgcmV2aWV3IGxlYXZlcyB0aGVcbiAqIHJlcG9zaXRvcnkgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB0byBiZSBhZGRlZCB0byB0aGUgY2hhbmdlbG9nLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnN9IGNvbnRyb2xsaW5nIHRoZSBjaGFuZ2Vsb2cgcmV2aWV3IGJlaGF2aW9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjaGFuZ2Vsb2cgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQ2hhbmdlbG9nKG5ld1ZlcnNpb246IHN0cmluZywgb3B0aW9uczogVXBkYXRlQ2hhbmdlbG9nT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHdyaXRlQ2hhbmdlbG9nKGF3YWl0IHByZXBhcmVDaGFuZ2Vsb2cobmV3VmVyc2lvbiwgb3B0aW9ucykpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgYmFzZWQgb24gdGhlIHNwZWNpZmllZCB1cGRhdGUgdHlwZS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgc2VyaWVzIG9mIHRhc2tzIHRvIGhhbmRsZSB2ZXJzaW9uIHVwZGF0ZXM6XG4gKiAxLiBWYWxpZGF0ZXMgdGhlIHZlcnNpb24gdXBkYXRlIHR5cGUuXG4gKiAyLiBDaGVja3MgaWYgR2l0IGFuZCBHaXRIdWIgQ0xJIGFyZSBpbnN0YWxsZWQuXG4gKiAzLiBWZXJpZmllcyB0aGF0IHRoZSBpbnRlcmFjdGl2ZSBjaGFuZ2Vsb2cgcmV2aWV3LCBpZiBvbmUgaXMgZHVlLCBjYW4gYWN0dWFsbHkgYmUgYW5zd2VyZWQuXG4gKiA0LiBWZXJpZmllcyB0aGF0IHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBjbGVhbi5cbiAqIDUuIFJ1bnMgc3BlbGxjaGVjayBhbmQgbGludGluZy5cbiAqIDYuIEJ1aWxkcyB0aGUgcHJvamVjdC5cbiAqIDcuIFNldHRsZXMgdGhlIGNoYW5nZWxvZyBcdTIwMTQgdGhlIG9ubHkgc3RlcCB0aGF0IGNhbiBibG9jayBvbiBhIGh1bWFuLCBhbmQgZGVsaWJlcmF0ZWx5IHRoZSBsYXN0IG9uZSBiZWZvcmVcbiAqICAgIGFueXRoaW5nIGlzIHdyaXR0ZW4sIHNvIGFuIGludGVycnVwdCBoZXJlIGxlYXZlcyB0aGUgd29ya2luZyB0cmVlIGNsZWFuIGFuZCB0aGUgcmVsZWFzZSByZS1ydW5uYWJsZS5cbiAqIDguIFVwZGF0ZXMgdmVyc2lvbiBpbiBmaWxlcywgdGhlbiB3cml0ZXMgdGhlIHNldHRsZWQgY2hhbmdlbG9nLlxuICogOS4gQWRkcyB1cGRhdGVkIGZpbGVzIHRvIEdpdCwgdGFncyB0aGUgY29tbWl0LCBhbmQgcHVzaGVzIHRvIHRoZSByZXBvc2l0b3J5LlxuICogMTAuIElmIGFuIE9ic2lkaWFuIHBsdWdpbiwgY29waWVzIHRoZSB1cGRhdGVkIG1hbmlmZXN0IGFuZCBwdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSB0byBwZXJmb3JtIChtYWpvciwgbWlub3IsIHBhdGNoLCBwcmVtYWpvciwgcHJlbWlub3IsIHByZXBhdGNoLCBwcmVyZWxlYXNlLCBvciB4Lnkuelstc3VmZml4XSkuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnN9IGNvbnRyb2xsaW5nIHRoZSByZWxlYXNlIGJlaGF2aW9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB2ZXJzaW9uIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGU/OiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZVZlcnNpb25PcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGNoYW5nZWxvZ0ZpbGVQYXRoLFxuICAgIG1pbkFwcFZlcnNpb24sXG4gICAgcHJlcGFyZUdpdEh1YlJlbGVhc2UsXG4gICAgc2hvdWxkQXJjaGl2ZURlbW9WYXVsdCA9IHRydWUsXG4gICAgc2hvdWxkQnVpbGQgPSB0cnVlLFxuICAgIHNob3VsZEVkaXRDaGFuZ2Vsb2cgPSB0cnVlLFxuICAgIHNob3VsZFJlbGVhc2UgPSB0cnVlLFxuICAgIHNob3VsZFJ1bkNoZWNrcyA9IHRydWUsXG4gICAgc2hvdWxkVmVyaWZ5Q29tbWl0ID0gdHJ1ZVxuICB9ID0gb3B0aW9ucztcblxuICBpZiAoIXZlcnNpb25VcGRhdGVUeXBlKSB7XG4gICAgY29uc3QgbnBtT2xkVmVyc2lvbiA9IHByb2Nlc3MuZW52WyducG1fb2xkX3ZlcnNpb24nXTtcbiAgICBjb25zdCBucG1OZXdWZXJzaW9uID0gcHJvY2Vzcy5lbnZbJ25wbV9uZXdfdmVyc2lvbiddO1xuXG4gICAgaWYgKG5wbU9sZFZlcnNpb24gJiYgbnBtTmV3VmVyc2lvbikge1xuICAgICAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRmlsZXMobnBtT2xkVmVyc2lvbik7XG4gICAgICBhd2FpdCB1cGRhdGVWZXJzaW9uKG5wbU5ld1ZlcnNpb24sIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignTm8gdmVyc2lvbiB1cGRhdGUgdHlwZSBwcm92aWRlZCcpO1xuICB9XG5cbiAgbGV0IGlzT2JzaWRpYW5QbHVnaW4gPSBmYWxzZTtcbiAgaWYgKGV4aXN0c1N5bmMocmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24gfSkpKSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24oKTtcbiAgICBpc09ic2lkaWFuUGx1Z2luID0gcGFja2FnZUpzb24ubmFtZSAhPT0gJ29ic2lkaWFuLWRldi11dGlscyc7XG4gIH1cblxuICB2YWxpZGF0ZSh2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGF3YWl0IGFzc2VydEdpdEluc3RhbGxlZCgpO1xuICBhd2FpdCBhc3NlcnRHaXRIdWJDbGlJbnN0YWxsZWQoKTtcbiAgLy8gQ2hlY2tlZCBoZXJlLCBiZWZvcmUgdGhlIGNoZWNrcyBhbmQgdGhlIGJ1aWxkLCByYXRoZXIgdGhhbiBhdCB0aGUgY2hhbmdlbG9nIHN0ZXAgaXRzZWxmOiBhIG5vbi1pbnRlcmFjdGl2ZVxuICAvLyBDYWxsZXIgbGVhcm5zIGluIHNlY29uZHMgaW5zdGVhZCBvZiBwYXlpbmcgZm9yIHRoZSB3aG9sZSBwcmVmbGlnaHQgYW5kIG9ubHkgdGhlbiBibG9ja2luZyBvbiBhbiBlZGl0b3JcbiAgLy8gV2luZG93IG5vYm9keSB3aWxsIGV2ZXIgY2xvc2UuXG4gIGFzc2VydENoYW5nZWxvZ1N0ZXBJc05vbkJsb2NraW5nKGNoYW5nZWxvZ0ZpbGVQYXRoLCBzaG91bGRFZGl0Q2hhbmdlbG9nKTtcblxuICBpZiAoc2hvdWxkUnVuQ2hlY2tzKSB7XG4gICAgYXdhaXQgYXNzZXJ0R2l0UmVwb0NsZWFuKCk7XG4gICAgYXdhaXQgbnBtUnVuKCdmb3JtYXQ6Y2hlY2snKTtcbiAgICBhd2FpdCBucG1SdW4oJ3NwZWxsY2hlY2snKTtcbiAgICBhd2FpdCBucG1SdW4oJ2xpbnQ6bWQnKTtcbiAgfVxuXG4gIC8vIFRoZSBidWlsZCBpcyBhIHByZXJlcXVpc2l0ZSBmb3IgcHVibGlzaGluZywgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrLCBzbyBpdCBydW5zIHVubGVzcyBgc2hvdWxkQnVpbGRgIGlzIGBmYWxzZWAgXHUyMDE0IHRoaXMga2VlcHMgdGhlIHJlbGVhc2VkIGFydGlmYWN0cyBpbiBzeW5jIHdpdGggdGhlIGN1cnJlbnQgY29kZSBldmVuIG9uIGEgZmFzdCByZWxlYXNlLlxuICBpZiAoc2hvdWxkQnVpbGQpIHtcbiAgICBhd2FpdCBucG1SdW4oJ2J1aWxkJyk7XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuQ2hlY2tzKSB7XG4gICAgYXdhaXQgbnBtUnVuKCdsaW50Jyk7XG4gICAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ2ZpbmQtb3ZlcmV4cG9zZWQnKTtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbCgndGVzdCcpO1xuICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCd0ZXN0OmludGVncmF0aW9uJyk7XG4gICAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ3Rlc3Q6Y292ZXJhZ2UnKTtcbiAgfVxuXG4gIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCBnZXROZXdWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlKTtcblxuICAvLyBUaGUgY2hhbmdlbG9nIGlzIHNldHRsZWQgQkVGT1JFIGFueXRoaW5nIGlzIHdyaXR0ZW4sIGJlY2F1c2UgdGhpcyBpcyB0aGUgb25seSBzdGVwIHRoYXQgY2FuIGJsb2NrIG9uIGFcbiAgLy8gSHVtYW4uIEludGVycnVwdGluZyBpdCB0aGVyZWZvcmUgbGVhdmVzIHRoZSB3b3JraW5nIHRyZWUgcHJpc3RpbmUgYW5kIHRoZSB3aG9sZSByZWxlYXNlIHJlLXJ1bm5hYmxlLFxuICAvLyBJbnN0ZWFkIG9mIHN0cmFuZGluZyBhIGJ1bXBlZC1idXQtdW5jb21taXR0ZWQgdHJlZSB0aGF0IGBhc3NlcnRHaXRSZXBvQ2xlYW5gIHRoZW4gcmVmdXNlcyB0byByZS1yZWxlYXNlLlxuICBjb25zdCBuZXdDaGFuZ2VMb2cgPSBhd2FpdCBwcmVwYXJlQ2hhbmdlbG9nKG5ld1ZlcnNpb24sIHtcbiAgICBjaGFuZ2Vsb2dGaWxlUGF0aCxcbiAgICBzaG91bGRFZGl0Q2hhbmdlbG9nXG4gIH0pO1xuXG4gIGF3YWl0IHVwZGF0ZVZlcnNpb25JbkZpbGVzKG5ld1ZlcnNpb24pO1xuICBpZiAoaXNPYnNpZGlhblBsdWdpbikge1xuICAgIGF3YWl0IHVwZGF0ZVZlcnNpb25JbkZpbGVzRm9yUGx1Z2luKG5ld1ZlcnNpb24sIG1pbkFwcFZlcnNpb24pO1xuICB9XG5cbiAgYXdhaXQgd3JpdGVDaGFuZ2Vsb2cobmV3Q2hhbmdlTG9nKTtcbiAgYXdhaXQgYWRkVXBkYXRlZEZpbGVzVG9HaXQobmV3VmVyc2lvbiwgeyBzaG91bGRWZXJpZnlDb21taXQgfSk7XG4gIGF3YWl0IGFkZEdpdFRhZyhuZXdWZXJzaW9uKTtcblxuICBpZiAoIXNob3VsZFJlbGVhc2UpIHtcbiAgICBnZXRMaWJEZWJ1Z2dlcignVmVyc2lvbicpKCdTa2lwcGluZyBnaXQgcHVzaCBhbmQgR2l0SHViIHJlbGVhc2UgKC0tbm8tcmVsZWFzZSkuIFRoZSB2ZXJzaW9uIGJ1bXAsIGNoYW5nZWxvZywgY29tbWl0LCBhbmQgdGFnIGhhdmUgYmVlbiBjcmVhdGVkIGxvY2FsbHkuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgZ2l0UHVzaCgpO1xuICBhd2FpdCBwcmVwYXJlR2l0SHViUmVsZWFzZT8uKG5ld1ZlcnNpb24pO1xuICBpZiAoaXNPYnNpZGlhblBsdWdpbiAmJiBzaG91bGRBcmNoaXZlRGVtb1ZhdWx0KSB7XG4gICAgYXdhaXQgYXJjaGl2ZVBsdWdpbkRlbW9WYXVsdCgpO1xuICB9XG4gIGF3YWl0IHB1Ymxpc2hHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb24sIGlzT2JzaWRpYW5QbHVnaW4pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHZlcnNpb24gaW4gdmFyaW91cyBmaWxlcywgaW5jbHVkaW5nIGBwYWNrYWdlLmpzb25gLCBgcGFja2FnZS1sb2NrLmpzb25gLFxuICogYW5kIE9ic2lkaWFuIHBsdWdpbiBtYW5pZmVzdHMgaWYgYXBwbGljYWJsZS5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBzdHJpbmcgdG8gdXBkYXRlIGluIHRoZSBmaWxlcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlVmVyc2lvbkluRmlsZXMobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGVkaXRQYWNrYWdlSnNvbigocGFja2FnZUpzb24pID0+IHtcbiAgICBwYWNrYWdlSnNvbi52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgfSk7XG5cbiAgYXdhaXQgZWRpdFBhY2thZ2VMb2NrSnNvbih1cGRhdGUsIHsgc2hvdWxkU2tpcElmTWlzc2luZzogdHJ1ZSB9KTtcbiAgYXdhaXQgZWRpdE5wbVNocmlua1dyYXBKc29uKHVwZGF0ZSwgeyBzaG91bGRTa2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZShwYWNrYWdlTG9ja0pzb246IFBhY2thZ2VMb2NrSnNvbik6IHZvaWQge1xuICAgIHBhY2thZ2VMb2NrSnNvbi52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICBjb25zdCBkZWZhdWx0UGFja2FnZSA9IHBhY2thZ2VMb2NrSnNvbi5wYWNrYWdlcz8uWycnXTtcbiAgICBpZiAoZGVmYXVsdFBhY2thZ2UpIHtcbiAgICAgIGRlZmF1bHRQYWNrYWdlLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0byBlbnN1cmUgaXQgaXMgZWl0aGVyIGEgcmVjb2duaXplZCB0eXBlXG4gKiBvciBhIHZhbGlkIG1hbnVhbCB2ZXJzaW9uIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0byB2YWxpZGF0ZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgaXMgaW52YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlKSA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuSW52YWxpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdJbnZhbGlkIHZlcnNpb24gdXBkYXRlIHR5cGUuIFBsZWFzZSB1c2UgXFwnbWFqb3JcXCcsIFxcJ21pbm9yXFwnLCBcXCdwYXRjaFxcJywgXFwncHJlbWFqb3JcXCcsIFxcJ3ByZW1pbm9yXFwnLCBcXCdwcmVwYXRjaFxcJywgXFwncHJlcmVsZWFzZVxcJywgb3IgXFwneC55LnpbLXN1ZmZpeF1cXCcgZm9ybWF0LidcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmVmdXNlcyBhIHJlbGVhc2UgdGhhdCB3b3VsZCBoYXZlIHRvIHN0b3AgYXQgdGhlIGludGVyYWN0aXZlIGNoYW5nZWxvZyByZXZpZXcgd2l0aCBub2JvZHkgdGhlcmUgdG9cbiAqIGZpbmlzaCBpdC4gQ2FsbGVkIGZyb20gdGhlIHByZWZsaWdodCBzbyB0aGUgcmVmdXNhbCBjb3N0cyBzZWNvbmRzLCBub3QgdGhlIHdob2xlIGNoZWNrLWFuZC1idWlsZCBnYXRlLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dGaWxlUGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBwcmVwYXJlZCByZWxlYXNlIG5vdGVzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vbmUuXG4gKiBAcGFyYW0gc2hvdWxkRWRpdENoYW5nZWxvZyAtIFdoZXRoZXIgdGhlIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgaXMgbWVhbnQgdG8gYmUgcmV2aWV3ZWQgaW50ZXJhY3RpdmVseS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Q2hhbmdlbG9nU3RlcElzTm9uQmxvY2tpbmcoY2hhbmdlbG9nRmlsZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCwgc2hvdWxkRWRpdENoYW5nZWxvZzogYm9vbGVhbik6IHZvaWQge1xuICBpZiAoY2hhbmdlbG9nRmlsZVBhdGggIT09IHVuZGVmaW5lZCB8fCAhc2hvdWxkRWRpdENoYW5nZWxvZyB8fCBwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICdUaGUgaW50ZXJhY3RpdmUgY2hhbmdlbG9nIHJldmlldyBuZWVkcyBhIHRlcm1pbmFsLCBhbmQgdGhpcyBwcm9jZXNzIGhhcyBub25lLCBzbyB0aGUgcmVsZWFzZSB3b3VsZCBibG9jayBmb3JldmVyLidcbiAgICAgICsgJyBQYXNzIGAtLWNoYW5nZWxvZy1maWxlIDxwYXRoPmAgdG8gc3VwcGx5IHByZXBhcmVkIHJlbGVhc2Ugbm90ZXMsIG9yIGAtLW5vLWNoYW5nZWxvZy1lZGl0aW5nYCB0byBhY2NlcHQgdGhlJ1xuICAgICAgKyAnIGNoYW5nZWxvZyBnZW5lcmF0ZWQgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2VzIGFzIGlzLidcbiAgKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYm9keSBvZiBvbmUgdmVyc2lvbidzIGBDSEFOR0VMT0cubWRgIHNlY3Rpb24gXHUyMDE0IGV2ZXJ5dGhpbmcgYmV0d2VlbiBpdHMgYCMjIDx2ZXJzaW9uPmAgaGVhZGluZ1xuICogYW5kIHdoaWNoZXZlciBjb21lcyBmaXJzdCwgdGhlIG5leHQgYCMjIGAgaGVhZGluZyBvciB0aGUgZW5kIG9mIHRoZSBmaWxlLlxuICpcbiAqIEVuZGluZyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIG5vdCBhbiBlZGdlIGNhc2UgYnV0IHRoZSBub3JtYWwgc2hhcGUgb2YgYSBGSVJTVCByZWxlYXNlOiBzZWN0aW9ucyBhcmVcbiAqIHByZXBlbmRlZCwgc28gdGhlIG5ld2VzdCBvbmUgaXMgYm91bmRlZCBieSB0aGUgcHJldmlvdXMgcmVsZWFzZSBvbmx5IG9uY2UgYSBwcmV2aW91cyByZWxlYXNlIGV4aXN0cy4gVGhlXG4gKiByZWdleCB0aGlzIHJlcGxhY2VkIHJlcXVpcmVkIGEgdHJhaWxpbmcgYFxcblxcbiMjYCwgc28gZXZlcnkgYDEuMC4wYCBzaWxlbnRseSBwdWJsaXNoZWQgZW1wdHkgcmVsZWFzZSBub3Rlcy5cbiAqIFRlcm1pbmF0aW5nIG9uIGAnIyMgJ2AgV0lUSCBpdHMgdHJhaWxpbmcgc3BhY2UgaXMgd2hhdCBrZWVwcyBhbiBgIyMjYCBzdWItaGVhZGluZyBpbnNpZGUgdGhlIHNlY3Rpb25cbiAqIGluc3RlYWQgb2YgdHJ1bmNhdGluZyBpdCB0aGVyZS5cbiAqXG4gKiBAcGFyYW0gY2hhbmdlbG9nQ29udGVudCAtIFRoZSBmdWxsIGNvbnRlbnRzIG9mIGBDSEFOR0VMT0cubWRgLlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbiB3aG9zZSBzZWN0aW9uIHRvIGV4dHJhY3QuXG4gKiBAcmV0dXJucyBUaGUgc2VjdGlvbiBib2R5LCB0cmltbWVkLCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgY2hhbmdlbG9nIGhhcyBubyBzZWN0aW9uIGZvciB0aGF0IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RDaGFuZ2Vsb2dTZWN0aW9uKGNoYW5nZWxvZ0NvbnRlbnQ6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXMgPSBjaGFuZ2Vsb2dDb250ZW50LnNwbGl0KC9cXHI/XFxuLyk7XG4gIGNvbnN0IGhlYWRpbmdJbmRleCA9IGxpbmVzLmluZGV4T2YoYCMjICR7dmVyc2lvbn1gKTtcbiAgaWYgKGhlYWRpbmdJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBib2R5U3RhcnRJbmRleCA9IGhlYWRpbmdJbmRleCArIDE7XG4gIGNvbnN0IG5leHRIZWFkaW5nT2Zmc2V0ID0gbGluZXMuc2xpY2UoYm9keVN0YXJ0SW5kZXgpLmZpbmRJbmRleCgobGluZSkgPT4gbGluZS5zdGFydHNXaXRoKCcjIyAnKSk7XG4gIGNvbnN0IGJvZHlFbmRJbmRleCA9IG5leHRIZWFkaW5nT2Zmc2V0ID09PSAtMSA/IGxpbmVzLmxlbmd0aCA6IGJvZHlTdGFydEluZGV4ICsgbmV4dEhlYWRpbmdPZmZzZXQ7XG4gIHJldHVybiBsaW5lcy5zbGljZShib2R5U3RhcnRJbmRleCwgYm9keUVuZEluZGV4KS5qb2luKCdcXG4nKS50cmltKCk7XG59XG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgT2JzaWRpYW4gdGhhdCB0aGUgZGVza3RvcCBhcHAgY2FuIGFjdHVhbGx5IHJ1bi5cbiAqXG4gKiBSZWFkcyB7QGxpbmsgREVTS1RPUF9SRUxFQVNFU19KU09OX1VSTH0sIG5vdCB0aGUgR2l0SHViIGByZWxlYXNlcy9sYXRlc3RgIEFQSS4gVGhlIEFQSSByZXR1cm5zIHRoZSBuZXdlc3RcbiAqIHJlbGVhc2Ugb2YgQU5ZIGtpbmQsIHNvIHdoZW5ldmVyIGEgbW9iaWxlLW9ubHkgcmVsZWFzZSAoYW4gQVBLLW9ubHkgYXNzZXQpIGlzIG5ld2VyIHRoYW4gdGhlIGRlc2t0b3Agb25lLFxuICogaXQgcmVwb3J0cyBhIHZlcnNpb24gdGhhdCBkb2VzIG5vdCBleGlzdCBmb3IgZGVza3RvcC4gQSBwbHVnaW4gcmVsZWFzZWQgaW4gdGhhdCB3aW5kb3cgZ2V0cyBhXG4gKiBgbWluQXBwVmVyc2lvbmAgbm8gZGVza3RvcCB1c2VyIGNhbiBzYXRpc2Z5LCBhbmQgT2JzaWRpYW4gc2lsZW50bHkga2VlcHMgb2ZmZXJpbmcgdGhlbSB0aGUgcHJldmlvdXNcbiAqIHJlbGVhc2UgaW5zdGVhZCBcdTIwMTQgdGhlIHJlbGVhc2Ugc3VjY2VlZHMgYW5kIHJlYWNoZXMgbm9ib2R5LlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGxhdGVzdCBPYnNpZGlhbiB2ZXJzaW9uIGF2YWlsYWJsZSBmb3IgZGVza3RvcC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0T2JzaWRpYW5WZXJzaW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gV2UgcnVuIHRoaXMgb3V0c2lkZSBvZiBPYnNpZGlhbiwgc28gd2UgZG9uJ3QgaGF2ZSBgcmVxdWVzdFVybCgpYC5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChERVNLVE9QX1JFTEVBU0VTX0pTT05fVVJMKTtcbiAgY29uc3QgZGVza3RvcFJlbGVhc2VzSnNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBQYXJ0aWFsPERlc2t0b3BSZWxlYXNlc0pzb24+O1xuICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUoZGVza3RvcFJlbGVhc2VzSnNvbi5sYXRlc3RWZXJzaW9uLCAnQ291bGQgbm90IGZpbmQgdGhlIGxhdGVzdCBkZXNrdG9wIE9ic2lkaWFuIHZlcnNpb24nKTtcbn1cblxuZnVuY3Rpb24gaXNQcmVSZWxlYXNlKHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJlcmVsZWFzZSh2ZXJzaW9uKSAhPT0gbnVsbDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgc2luZ2xlIHBhY2sgcmVzdWx0IGZyb20gdGhlIG91dHB1dCBvZiBgbnBtIHBhY2sgLS1qc29uYC5cbiAqXG4gKiBUd28gdGhpbmdzIG1ha2UgdGhpcyBtb3JlIHRoYW4gYSBgSlNPTi5wYXJzZSgpYC4gVGhlIHBheWxvYWQgaXMgUFJFQ0VERUQgb24gc3Rkb3V0IGJ5IHdoYXRldmVyIHRoZVxuICogYHByZXBhcmVgIHNjcmlwdCBwcmludGVkICh0aGUgYG5wbSBub3RpY2VgIGxpbmVzIGdvIHRvIHN0ZGVyciwgbm90IGhlcmUpLCBzbyBpdHMgc3RhcnQgaGFzIHRvIGJlIGZvdW5kIFx1MjAxNFxuICogYW5kIGl0IGlzIGZvdW5kIGJ5IHBhcnNpbmcgZnJvbSBlYWNoIGNhbmRpZGF0ZSBzdGFydCByYXRoZXIgdGhhbiBieSBtYXRjaGluZyBhIGxpdGVyYWwsIGJlY2F1c2UgdGhlXG4gKiBwcmVmaXggbWF5IGl0c2VsZiBjb250YWluIGEgYnJhY2UuIEFuZCB0aGUgcGF5bG9hZCdzIFNIQVBFIGRlcGVuZHMgb24gdGhlIG5wbSBtYWpvcjogbnBtIDExIGFuZCBlYXJsaWVyXG4gKiBlbWl0IGFuIGFycmF5IG9mIHBhY2sgcmVzdWx0cywgbnBtIDEyIGVtaXRzIGFuIG9iamVjdCBrZXllZCBieSBwYWNrYWdlIG5hbWUuIEJvdGggYXJlIGFjY2VwdGVkOyBzY2FubmluZ1xuICogZm9yIHRoZSBhcnJheSdzIGxpdGVyYWwgb3BlbmluZyBpcyB3aGF0IGJyb2tlIGV2ZXJ5IHJlbGVhc2Ugb24gbnBtIDEyIChUODA2KS5cbiAqXG4gKiBAcGFyYW0gb3V0cHV0IC0gVGhlIHN0ZG91dCBvZiBgbnBtIHBhY2sgLS1qc29uYC5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgTnBtUGFja1Jlc3VsdH0gZGVzY3JpYmluZyB0aGUgcGFja2VkIHRhcmJhbGwuXG4gKiBAdGhyb3dzIElmIHRoZSBvdXRwdXQgaG9sZHMgbm8gcGFyc2FibGUgSlNPTiBwYXlsb2FkLCBvciB0aGUgcGF5bG9hZCBob2xkcyBubyBwYWNrIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VOcG1QYWNrT3V0cHV0KG91dHB1dDogc3RyaW5nKTogTnBtUGFja1Jlc3VsdCB7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2Ygb3V0cHV0Lm1hdGNoQWxsKC9bW3tdL2cpKSB7XG4gICAgbGV0IHBheWxvYWQ6IHVua25vd247XG5cbiAgICB0cnkge1xuICAgICAgcGF5bG9hZCA9IEpTT04ucGFyc2Uob3V0cHV0LnNsaWNlKG1hdGNoLmluZGV4KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHRzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgYXMgTnBtUGFja1Jlc3VsdFtdIDogT2JqZWN0LnZhbHVlcyhwYXlsb2FkIGFzIFJlY29yZDxzdHJpbmcsIE5wbVBhY2tSZXN1bHQ+KTtcbiAgICBjb25zdCByZXN1bHQgPSByZXN1bHRzWzBdO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgbm8gcGFjayByZXN1bHQgaW4gdGhlIGBucG0gcGFjayAtLWpzb25gIG91dHB1dCcpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmaW5kIHRoZSBKU09OIHBheWxvYWQgaW4gdGhlIGBucG0gcGFjayAtLWpzb25gIG91dHB1dCcpO1xufVxuXG4vKipcbiAqIENvbXBvc2VzIHRoZSBmdWxsIG5ldyBgQ0hBTkdFTE9HLm1kYCBjb250ZW50IFx1MjAxNCBpbmNsdWRpbmcgdGhlIGludGVyYWN0aXZlIHJldmlldywgd2hlbiBvbmUgaXMgZHVlIFx1MjAxNFxuICogV0lUSE9VVCB0b3VjaGluZyB0aGUgcmVwb3NpdG9yeS4gTm90aGluZyBoZXJlIHdyaXRlcyBpbnRvIHRoZSByZXBvLCBzbyBhbiBpbnRlcnJ1cHQgYW55d2hlcmUgaW4gdGhlXG4gKiByZXZpZXcgd2luZG93ICh0aGUgd2hvbGUgcG9pbnQgb2YgdGhlIHNwbGl0KSBsZWF2ZXMgdGhlIHdvcmtpbmcgdHJlZSBleGFjdGx5IGFzIGl0IHdhcy5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgdGhlIGNoYW5nZWxvZyBzZWN0aW9uIGlzIHdyaXR0ZW4gZm9yLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnN9IGNvbnRyb2xsaW5nIHdoZXJlIHRoZSBzZWN0aW9uIGJvZHkgY29tZXMgZnJvbS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHNldHRsZWQgYENIQU5HRUxPRy5tZGAgY29udGVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUNoYW5nZWxvZyhuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZUNoYW5nZWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgY2hhbmdlbG9nRmlsZVBhdGgsXG4gICAgc2hvdWxkRWRpdENoYW5nZWxvZyA9IHRydWVcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IEhFQURFUl9MSU5FU19DT1VOVCA9IDI7XG4gIGNvbnN0IGNoYW5nZWxvZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkNoYW5nZWxvZ01kIH0pO1xuICBsZXQgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lczogc3RyaW5nW107XG4gIGlmIChleGlzdHNTeW5jKGNoYW5nZWxvZ1BhdGgpKSB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ1BhdGgsICd1dGYtOCcpO1xuICAgIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKS5zbGljZShIRUFERVJfTElORVNfQ09VTlQpO1xuICAgIGlmIChwcmV2aW91c0NoYW5nZWxvZ0xpbmVzLmF0KC0xKSA9PT0gJycpIHtcbiAgICAgIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMucG9wKCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMgPSBbXTtcbiAgfVxuXG4gIGxldCBuZXdDaGFuZ2VMb2cgPSBgIyBDSEFOR0VMT0dcXG5cXG4jIyAke25ld1ZlcnNpb259XFxuXFxuYDtcblxuICBpZiAoY2hhbmdlbG9nRmlsZVBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGxhc3RUYWcgPSByZXBsYWNlQWxsKHtcbiAgICAgICRzdHJpbmc6IHByZXZpb3VzQ2hhbmdlbG9nTGluZXNbMF0gPz8gJycsXG4gICAgICByZXBsYWNlcjogJycsXG4gICAgICBzZWFyY2hWYWx1ZTogJyMjICdcbiAgICB9KTtcbiAgICAvLyBBIGhlYWRpbmcgaXMgbm90IGEgdGFnLiBBIGhhbmQtd3JpdHRlbiBgIyMgMC4wLjBgIHBsYWNlaG9sZGVyIGluIGEgbmV2ZXItdGFnZ2VkIHJlcG8sIG9yIGEgdGFnIGRlbGV0ZWRcbiAgICAvLyBBZnRlciB0aGUgZmFjdCwgd291bGQgb3RoZXJ3aXNlIHJlYWNoIGBnaXQgbG9nYCBhcyBhIHJldmlzaW9uIGl0IGNhbm5vdCByZXNvbHZlIFx1MjAxNCBhbmQgaXQgcmVhY2hlcyBpdCBhdFxuICAgIC8vIFRoZSB2ZXJ5IEVORCBvZiB0aGUgcmVsZWFzZSwgYWZ0ZXIgdGhlIHdob2xlIHByZWZsaWdodCBoYXMgYWxyZWFkeSBiZWVuIHBhaWQgZm9yLiBGYWxsaW5nIGJhY2sgdG8gdGhlXG4gICAgLy8gRnVsbCBoaXN0b3J5IG92ZXItaW5jbHVkZXMgd2hlbiBhIHRhZyB3YXMgZGVsZXRlZCwgYnV0IHRoYXQgaXMgc2FmZSBhbmQgdmlzaWJsZTogdGhlIHJldmlldyBzdGVwIGp1c3RcbiAgICAvLyBCZWxvdyBpcyBleGFjdGx5IHdoZXJlIGl0IGdldHMgdHJpbW1lZC5cbiAgICBjb25zdCByZXNvbHZlZExhc3RUYWcgPSBsYXN0VGFnXG4gICAgICA/IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS12ZXJpZnknLCAnLS1xdWlldCcsIGByZWZzL3RhZ3MvJHtsYXN0VGFnfWBdLCB7XG4gICAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgICB9KVxuICAgICAgOiAnJztcblxuICAgIGlmIChsYXN0VGFnICYmICFyZXNvbHZlZExhc3RUYWcpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdWZXJzaW9uJykoXG4gICAgICAgIGAke09ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBzdGFydHMgYXQgJyMjICR7bGFzdFRhZ30nLCBidXQgbm8gc3VjaCB0YWcgZXhpc3RzLiBHZW5lcmF0aW5nIHRoZSBjaGFuZ2Vsb2cgZnJvbSB0aGUgZnVsbCBoaXN0b3J5IGluc3RlYWQuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21taXRSYW5nZSA9IHJlc29sdmVkTGFzdFRhZyA/IGAke2xhc3RUYWd9Li5IRUFEYCA6ICdIRUFEJztcbiAgICBjb25zdCBjb21taXRNZXNzYWdlc1N0cmluZyA9IGF3YWl0IGV4ZWNGcm9tUm9vdChgZ2l0IGxvZyAke2NvbW1pdFJhbmdlfSAtLWZvcm1hdD0lQiAtLWZpcnN0LXBhcmVudCAtemAsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICBjb25zdCBjb21taXRNZXNzYWdlcyA9IGNvbW1pdE1lc3NhZ2VzU3RyaW5nLnNwbGl0KCdcXDAnKS5maWx0ZXIoQm9vbGVhbikubWFwKChjb21taXRNZXNzYWdlKSA9PiB0b0ZpcnN0TGluZShjb21taXRNZXNzYWdlKSk7XG5cbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgY29tbWl0TWVzc2FnZXMpIHtcbiAgICAgIG5ld0NoYW5nZUxvZyArPSBgLSAke2F1dG9saW5rQmFyZVVybHMobWVzc2FnZSl9XFxuYDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJlcGFyZWROb3RlcyA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ0ZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICBuZXdDaGFuZ2VMb2cgKz0gYCR7cmVwbGFjZUFsbCh7ICRzdHJpbmc6IHByZXBhcmVkTm90ZXMsIHJlcGxhY2VyOiAnXFxuJywgc2VhcmNoVmFsdWU6ICdcXHJcXG4nIH0pLnRyaW0oKX1cXG5gO1xuICB9XG5cbiAgaWYgKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMubGVuZ3RoID4gMCkge1xuICAgIG5ld0NoYW5nZUxvZyArPSAnXFxuJztcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcykge1xuICAgICAgbmV3Q2hhbmdlTG9nICs9IGAke2xpbmV9XFxuYDtcbiAgICB9XG4gIH1cblxuICAvLyBQcmVwYXJlZCBub3RlcyBhcmUgYWxyZWFkeSB0aGUgcmV2aWV3ZWQgdGV4dCwgc28gdGhleSBuZXZlciBvcGVuIGFuIGVkaXRvciwgd2hhdGV2ZXIgYHNob3VsZEVkaXRDaGFuZ2Vsb2dgIHNheXMuXG4gIGlmIChjaGFuZ2Vsb2dGaWxlUGF0aCAhPT0gdW5kZWZpbmVkIHx8ICFzaG91bGRFZGl0Q2hhbmdlbG9nKSB7XG4gICAgcmV0dXJuIG5ld0NoYW5nZUxvZztcbiAgfVxuXG4gIHJldHVybiBhd2FpdCByZXZpZXdDaGFuZ2Vsb2cobmV3Q2hhbmdlTG9nKTtcbn1cblxuLyoqXG4gKiBIYW5kcyB0aGUgY29tcG9zZWQgY2hhbmdlbG9nIHRvIHRoZSB1c2VyIGZvciByZXZpZXcgb24gYSBzY3JhdGNoIGNvcHkgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgYW5kXG4gKiByZXR1cm5zIHdoYXRldmVyIHRoZXkgbGVmdCBiZWhpbmQuIFRoZSBzY3JhdGNoIGZvbGRlciBpcyByZW1vdmVkIGV2ZW4gd2hlbiB0aGUgcmV2aWV3IGZhaWxzLlxuICpcbiAqIEBwYXJhbSBuZXdDaGFuZ2VMb2cgLSBUaGUgY29tcG9zZWQgYENIQU5HRUxPRy5tZGAgY29udGVudCB0byBoYW5kIG92ZXIgZm9yIHJldmlldy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldmlld2VkIGNvbnRlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJldmlld0NoYW5nZWxvZyhuZXdDaGFuZ2VMb2c6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHNjcmF0Y2hGb2xkZXIgPSBhd2FpdCBta2R0ZW1wKGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1kZXYtdXRpbHMtY2hhbmdlbG9nLScpKTtcbiAgY29uc3Qgc2NyYXRjaENoYW5nZWxvZ1BhdGggPSBqb2luKHNjcmF0Y2hGb2xkZXIsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkNoYW5nZWxvZ01kKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHdyaXRlRmlsZShzY3JhdGNoQ2hhbmdlbG9nUGF0aCwgbmV3Q2hhbmdlTG9nLCAndXRmLTgnKTtcblxuICAgIGNvbnN0IGNvZGVWZXJzaW9uID0gYXdhaXQgZXhlY0Zyb21Sb290KCdjb2RlIC0tdmVyc2lvbicsIHtcbiAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbnN0IHZlcnNpb25EZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdWZXJzaW9uJyk7XG4gICAgaWYgKGNvZGVWZXJzaW9uKSB7XG4gICAgICB2ZXJzaW9uRGVidWdnZXIoYFBsZWFzZSB1cGRhdGUgdGhlICR7T2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWR9IGZpbGUuIENsb3NlIFZpc3VhbCBTdHVkaW8gQ29kZSB3aGVuIHlvdSBhcmUgZG9uZS4uLmApO1xuICAgICAgYXdhaXQgZXhlY0Zyb21Sb290KFsnY29kZScsICctdycsIHNjcmF0Y2hDaGFuZ2Vsb2dQYXRoXSwge1xuICAgICAgICBpc1F1aWV0OiB0cnVlLFxuICAgICAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZlcnNpb25EZWJ1Z2dlcignQ291bGQgbm90IGZpbmQgVmlzdWFsIFN0dWRpbyBDb2RlIGluIHlvdXIgUEFUSC4gVXNpbmcgY29uc29sZSBtb2RlIGluc3RlYWQuJyk7XG4gICAgICBhd2FpdCBjcmVhdGVJbnRlcmZhY2UocHJvY2Vzcy5zdGRpbiwgcHJvY2Vzcy5zdGRvdXQpLnF1ZXN0aW9uKFxuICAgICAgICBgUGxlYXNlIHVwZGF0ZSB0aGUgJHtzY3JhdGNoQ2hhbmdlbG9nUGF0aH0gZmlsZS4gUHJlc3MgRW50ZXIgd2hlbiB5b3UgYXJlIGRvbmUuLi5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCByZWFkRmlsZShzY3JhdGNoQ2hhbmdlbG9nUGF0aCwgJ3V0Zi04Jyk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcm0oc2NyYXRjaEZvbGRlciwge1xuICAgICAgZm9yY2U6IHRydWUsXG4gICAgICByZWN1cnNpdmU6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0ZpcnN0TGluZSgkc3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gJHN0cmluZy5zcGxpdCgvXFxyP1xcbi8pLmZpbHRlcihCb29sZWFuKS5zbGljZSgwLCAxKS5qb2luKCcnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlVmVyc2lvbkluRmlsZXNGb3JQbHVnaW4obmV3VmVyc2lvbjogc3RyaW5nLCBtaW5BcHBWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbWFuaWZlc3RCZXRhSnNvblBhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0QmV0YUpzb24gfSk7XG4gIGlmIChpc1ByZVJlbGVhc2UobmV3VmVyc2lvbikpIHtcbiAgICBhd2FpdCBjcChcbiAgICAgIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RKc29uIH0pLFxuICAgICAgbWFuaWZlc3RCZXRhSnNvblBhdGgsXG4gICAgICB7IGZvcmNlOiB0cnVlIH1cbiAgICApO1xuICAgIGF3YWl0IGVkaXRKc29uPE1hbmlmZXN0Pih7XG4gICAgICBlZGl0RnVuY3Rpb246IChtYW5pZmVzdCkgPT4ge1xuICAgICAgICBtYW5pZmVzdC52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICAgIH0sXG4gICAgICBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEJldGFKc29uXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcmVzb2x2ZWRNaW5BcHBWZXJzaW9uID0gbWluQXBwVmVyc2lvbiA/PyBhd2FpdCBnZXRMYXRlc3RPYnNpZGlhblZlcnNpb24oKTtcblxuICAgIGF3YWl0IGVkaXRKc29uPE1hbmlmZXN0Pih7XG4gICAgICBlZGl0RnVuY3Rpb246IChtYW5pZmVzdCkgPT4ge1xuICAgICAgICBtYW5pZmVzdC5taW5BcHBWZXJzaW9uID0gcmVzb2x2ZWRNaW5BcHBWZXJzaW9uO1xuICAgICAgICBtYW5pZmVzdC52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICAgIH0sXG4gICAgICBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb25cbiAgICB9KTtcblxuICAgIGF3YWl0IGVkaXRKc29uPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KHtcbiAgICAgIGVkaXRGdW5jdGlvbjogKHZlcnNpb25zKSA9PiB7XG4gICAgICAgIHZlcnNpb25zW25ld1ZlcnNpb25dID0gcmVzb2x2ZWRNaW5BcHBWZXJzaW9uO1xuICAgICAgfSxcbiAgICAgIHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlZlcnNpb25zSnNvblxuICAgIH0pO1xuXG4gICAgaWYgKGV4aXN0c1N5bmMobWFuaWZlc3RCZXRhSnNvblBhdGgpKSB7XG4gICAgICBhd2FpdCBybShtYW5pZmVzdEJldGFKc29uUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgY29weVVwZGF0ZWRNYW5pZmVzdCgpO1xufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgY29tcG9zZWQgY2hhbmdlbG9nIGludG8gdGhlIHJlcG9zaXRvcnkuIERlbGliZXJhdGVseSB0aGUgbGFzdCB0aGluZyB0aGUgY2hhbmdlbG9nIHN0ZXAgZG9lcyxcbiAqIHNvIG5vdGhpbmcgbGFuZHMgb24gZGlzayB1bnRpbCB0aGUgY29udGVudCBpcyBzZXR0bGVkLlxuICpcbiAqIEBwYXJhbSBuZXdDaGFuZ2VMb2cgLSBUaGUgc2V0dGxlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50IHRvIHdyaXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBjaGFuZ2Vsb2cgaGFzIGJlZW4gd3JpdHRlbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVDaGFuZ2Vsb2cobmV3Q2hhbmdlTG9nOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgd3JpdGVGaWxlKHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSksIG5ld0NoYW5nZUxvZywgJ3V0Zi04Jyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0EsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGNBQWM7QUFDdkIsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxpQkFBaUI7QUFDMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFJUCxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHFCQUFxQjtBQUM5QixTQUFTLCtCQUErQjtBQUN4QyxTQUFTLFlBQVk7QUFDckIs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
557
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy92ZXJzaW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyB2ZXJzaW9uIHVwZGF0ZXMgaW4gYSBwcm9qZWN0LlxuICogSXQgaW5jbHVkZXMgdGFza3Mgc3VjaCBhcyB2YWxpZGF0aW5nIHZlcnNpb24gdXBkYXRlIHR5cGVzLCBjaGVja2luZyB0aGUgc3RhdGVcbiAqIG9mIEdpdCBhbmQgR2l0SHViIENMSSwgdXBkYXRpbmcgdmVyc2lvbiBudW1iZXJzIGluIGZpbGVzLCBhbmQgcGVyZm9ybWluZ1xuICogR2l0IG9wZXJhdGlvbnMgc3VjaCBhcyB0YWdnaW5nIGFuZCBwdXNoaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVsZWFzZVR5cGUgfSBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkdGVtcCxcbiAgcmVhZEZpbGUsXG4gIHJtLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGNyZWF0ZUludGVyZmFjZSB9IGZyb20gJ25vZGU6cmVhZGxpbmUvcHJvbWlzZXMnO1xuaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7XG4gIGluYyxcbiAgcHJlcmVsZWFzZVxufSBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VMb2NrSnNvbiB9IGZyb20gJy4vbnBtLnRzJztcblxuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi9kZWJ1Zy50cyc7XG5pbXBvcnQgeyBlcnJvclRvU3RyaW5nIH0gZnJvbSAnLi4vZXJyb3IudHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuLi9vYnNpZGlhbi9wbHVnaW4vb2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMudHMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJy4uL3N0cmluZy50cyc7XG5pbXBvcnQge1xuICBhc3NlcnROb25OdWxsYWJsZSxcbiAgZW5zdXJlTm9uTnVsbGFibGVcbn0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgYXJjaGl2ZVBsdWdpbkRlbW9WYXVsdCB9IGZyb20gJy4vZGVtby12YXVsdC50cyc7XG5pbXBvcnQgeyByZWFkZGlyUG9zaXggfSBmcm9tICcuL2ZzLnRzJztcbmltcG9ydCB7IGdhdGUgfSBmcm9tICcuL2dhdGUudHMnO1xuaW1wb3J0IHsgZWRpdEpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHtcbiAgZWRpdE5wbVNocmlua1dyYXBKc29uLFxuICBlZGl0UGFja2FnZUpzb24sXG4gIGVkaXRQYWNrYWdlTG9ja0pzb24sXG4gIHJlYWRQYWNrYWdlSnNvblxufSBmcm9tICcuL25wbS50cyc7XG5pbXBvcnQgeyBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzIH0gZnJvbSAnLi9vYnNpZGlhbi1kZXYtdXRpbHMtcmVwby1wYXRocy50cyc7XG5pbXBvcnQge1xuICBleGVjRnJvbVJvb3QsXG4gIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlXG59IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGFkZFVwZGF0ZWRGaWxlc1RvR2l0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRVcGRhdGVkRmlsZXNUb0dpdE9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIHByZS1jb21taXQgaG9vayB3aGVuIGNyZWF0aW5nIHRoZSByZWxlYXNlIGNvbW1pdC4gV2hlbiBgZmFsc2VgLCBgLS1uby12ZXJpZnlgXG4gICAqIGlzIHBhc3NlZCB0byB0aGUgcmVsZWFzZSBjb21taXQgdG8gc2tpcCB0aGUgaG9vay5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRWZXJpZnlDb21taXQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSByZXN1bHQgb2YgcGFyc2luZyB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgYSB2ZXJzaW9uIHVwZGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRWZXJzaW9uQXJndW1lbnRzIHtcbiAgLyoqXG4gICAqIFRoZSB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnN9IHBhcnNlZCBmcm9tIHRoZSBmbGFncy5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IFVwZGF0ZVZlcnNpb25PcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgcG9zaXRpb25hbCB2ZXJzaW9uIHVwZGF0ZSB0eXBlIGFyZ3VtZW50LCBvciBgdW5kZWZpbmVkYCBpZiBub25lIHdhcyBwcm92aWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHVwZGF0ZUNoYW5nZWxvZ30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlQ2hhbmdlbG9nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIHBhdGggdG8gYSBmaWxlIHdob3NlIGNvbnRlbnRzIGJlY29tZSB0aGUgYm9keSBvZiB0aGUgbmV3IHZlcnNpb24ncyBjaGFuZ2Vsb2cgc2VjdGlvbiwgaW5zdGVhZCBvZlxuICAgKiB0aGUgYnVsbGV0cyBkZXJpdmVkIGZyb20gdGhlIGNvbW1pdCBtZXNzYWdlcy4gVXNlIGl0IHRvIHN1cHBseSBwcmVwYXJlZCByZWxlYXNlIG5vdGVzIGZyb20gYVxuICAgKiBub24taW50ZXJhY3RpdmUgY2FsbGVyIChhIGJhY2tncm91bmQgcHJvY2VzcywgQ0ksIGFuIGFnZW50KS5cbiAgICpcbiAgICogU2V0dGluZyBpdCBpbXBsaWVzIG5vIGludGVyYWN0aXZlIHJldmlldzogdGhlIGNvbW1pdCBsb2cgaXMgbm90IHJlYWQsIGFuZCB0aGUgY2hhbmdlbG9nIGlzIG5ldmVyXG4gICAqIG9wZW5lZCBpbiB0aGUgZWRpdG9yIG5vciB3YWl0ZWQgb24gYXQgdGhlIGNvbnNvbGUsIHJlZ2FyZGxlc3Mgb2Yge0BsaW5rIHNob3VsZEVkaXRDaGFuZ2Vsb2d9LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0aGUgZmlyc3QtcGFyZW50IGNvbW1pdCBzdWJqZWN0cyBzaW5jZSB0aGUgcHJldmlvdXMgdmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlbG9nRmlsZVBhdGg/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3BlbiB0aGUgZ2VuZXJhdGVkIGNoYW5nZWxvZyBpbiB0aGUgZWRpdG9yIGZvciBhbiBpbnRlcmFjdGl2ZSByZXZpZXcuIFdoZW4gYGZhbHNlYCxcbiAgICogdGhlIGNoYW5nZWxvZyBpcyBzdGlsbCBnZW5lcmF0ZWQgZnJvbSBjb21taXQgbWVzc2FnZXMsIGJ1dCBpdCBpcyBub3Qgb3BlbmVkIGluIHRoZSBlZGl0b3IgZm9yXG4gICAqIG1hbnVhbCByZXZpZXcuXG4gICAqXG4gICAqIElnbm9yZWQgd2hlbiB7QGxpbmsgY2hhbmdlbG9nRmlsZVBhdGh9IGlzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0Q2hhbmdlbG9nPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdXBkYXRlVmVyc2lvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlVmVyc2lvbk9wdGlvbnMge1xuICAvKipcbiAgICogQSBwYXRoIHRvIGEgZmlsZSB3aG9zZSBjb250ZW50cyBiZWNvbWUgdGhlIGJvZHkgb2YgdGhlIG5ldyB2ZXJzaW9uJ3MgY2hhbmdlbG9nIHNlY3Rpb24sIGluc3RlYWQgb2ZcbiAgICogdGhlIGJ1bGxldHMgZGVyaXZlZCBmcm9tIHRoZSBjb21taXQgbWVzc2FnZXMuIFVzZSBpdCB0byBzdXBwbHkgcHJlcGFyZWQgcmVsZWFzZSBub3RlcyBmcm9tIGFcbiAgICogbm9uLWludGVyYWN0aXZlIGNhbGxlciAoYSBiYWNrZ3JvdW5kIHByb2Nlc3MsIENJLCBhbiBhZ2VudCkuXG4gICAqXG4gICAqIFNldHRpbmcgaXQgaW1wbGllcyBubyBpbnRlcmFjdGl2ZSByZXZpZXc6IHRoZSBjb21taXQgbG9nIGlzIG5vdCByZWFkLCBhbmQgdGhlIGNoYW5nZWxvZyBpcyBuZXZlclxuICAgKiBvcGVuZWQgaW4gdGhlIGVkaXRvciBub3Igd2FpdGVkIG9uIGF0IHRoZSBjb25zb2xlLCByZWdhcmRsZXNzIG9mIHtAbGluayBzaG91bGRFZGl0Q2hhbmdlbG9nfS5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIGZpcnN0LXBhcmVudCBjb21taXQgc3ViamVjdHMgc2luY2UgdGhlIHByZXZpb3VzIHZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZWxvZ0ZpbGVQYXRoPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBbiBleHBsaWNpdCBgbWluQXBwVmVyc2lvbmAgdG8gd3JpdGUgaW50byB0aGUgcGx1Z2luJ3MgYG1hbmlmZXN0Lmpzb25gIGFuZCBpdHMgbmV3IGB2ZXJzaW9ucy5qc29uYFxuICAgKiBlbnRyeS4gV2hlbiBzZXQsIGl0IGlzIHVzZWQgdmVyYmF0aW0gYW5kIHRoZSBsYXRlc3QgT2JzaWRpYW4gZGVza3RvcCB2ZXJzaW9uIGlzIG5vdCBmZXRjaGVkIGF0IGFsbC5cbiAgICpcbiAgICogU2V0IHRoaXMgd2hlbiB0aGUgcGx1Z2luIGhhcyBhIGtub3duIG1pbmltdW0gaXQgYWN0dWFsbHkgcmVxdWlyZXMsIHJhdGhlciB0aGFuIHRyYWNraW5nIHdoYXRldmVyXG4gICAqIE9ic2lkaWFuIHJlbGVhc2VkIG1vc3QgcmVjZW50bHkuIE9ubHkgYXBwbGllcyB0byBPYnNpZGlhbiBwbHVnaW5zLCBhbmQgb25seSB0byBub24tcHJlLXJlbGVhc2VcbiAgICogdmVyc2lvbnMgKGEgcHJlLXJlbGVhc2UgY29waWVzIHRoZSBleGlzdGluZyBgbWFuaWZlc3QuanNvbmAgYW5kIG5ldmVyIHdyaXRlcyBgbWluQXBwVmVyc2lvbmApLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0aGUgbGF0ZXN0IE9ic2lkaWFuIGRlc2t0b3AgdmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgbWluQXBwVmVyc2lvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmdW5jdGlvbiB0byBwcmVwYXJlIHRoZSBHaXRIdWIgcmVsZWFzZS5cbiAgICpcbiAgICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB0aGUgcmVsZWFzZS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBHaXRIdWIgcmVsZWFzZSBoYXMgYmVlbiBwcmVwYXJlZC5cbiAgICovXG4gIHByZXBhcmVHaXRIdWJSZWxlYXNlPyh0aGlzOiB2b2lkLCBuZXdWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFyY2hpdmUgdGhlIHBsdWdpbidzIGRlbW8gdmF1bHQgKGBkZW1vLXZhdWx0L2AgaW4gdGhlIHJlcG8gcm9vdCkgYXMgYSByZWxlYXNlXG4gICAqIGFydGlmYWN0LiBPbmx5IGFwcGxpZXMgdG8gT2JzaWRpYW4gcGx1Z2luczsgaWdub3JlZCB3aGVuIHRoZSByZXBvIGhhcyBubyBgZGVtby12YXVsdC9gIGZvbGRlci5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRBcmNoaXZlRGVtb1ZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIGJ1aWxkIHN0ZXAuIFRoZSBidWlsZCBpcyBhIHB1Ymxpc2hpbmcgcHJlcmVxdWlzaXRlLCBub3QgYSB2ZXJpZmljYXRpb24gY2hlY2ssXG4gICAqIHNvIGl0IGlzIGdvdmVybmVkIGJ5IHRoaXMgZmxhZyBpbmRlcGVuZGVudGx5IG9mIHtAbGluayBzaG91bGRSdW5DaGVja3N9IFx1MjAxNCBpdCBydW5zIGV2ZW4gd2hlbiB0aGVcbiAgICogY2hlY2tzIGFyZSBza2lwcGVkLCBzbyBhIGZhc3QgcmVsZWFzZSBzdGlsbCBzaGlwcyBmcmVzaCBhcnRpZmFjdHMuIFNldCB0byBgZmFsc2VgIG9ubHkgd2hlbiB0aGVcbiAgICogYnVpbGQgb3V0cHV0IGlzIGtub3duIHRvIGFscmVhZHkgbWF0Y2ggdGhlIGN1cnJlbnQgY29kZTsgb3RoZXJ3aXNlIHRoZSByZWxlYXNlIHdvdWxkIHB1Ymxpc2hcbiAgICogc3RhbGUgYXJ0aWZhY3RzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEJ1aWxkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBvcGVuIHRoZSBnZW5lcmF0ZWQgY2hhbmdlbG9nIGluIHRoZSBlZGl0b3IgZm9yIGFuIGludGVyYWN0aXZlIHJldmlldy5cbiAgICpcbiAgICogSWdub3JlZCB3aGVuIHtAbGluayBjaGFuZ2Vsb2dGaWxlUGF0aH0gaXMgc2V0LiBXaGVuIGl0IGlzIG5laXRoZXIgc2V0IG5vciBkaXNhYmxlZCwgdGhlIHJlbGVhc2VcbiAgICogcmVxdWlyZXMgYW4gaW50ZXJhY3RpdmUgdGVybWluYWwsIGFuZCB7QGxpbmsgdXBkYXRlVmVyc2lvbn0gcmVmdXNlcyB1cCBmcm9udCB3aXRob3V0IG9uZSByYXRoZXJcbiAgICogdGhhbiBibG9ja2luZyBvbiBhbiBlZGl0b3Igbm9ib2R5IHdpbGwgY2xvc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdENoYW5nZWxvZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHVibGlzaCB0aGUgcmVsZWFzZS4gV2hlbiBgZmFsc2VgLCBhbGwgbG9jYWwgc3RlcHMgYXJlIGV4ZWN1dGVkICh2ZXJzaW9uIGJ1bXAsXG4gICAqIGNoYW5nZWxvZywgY29tbWl0LCB0YWcpLCBidXQgdGhlIGNoYW5nZXMgYXJlIG5vdCBwdXNoZWQgYW5kIG5vIEdpdEh1YiByZWxlYXNlIGlzIHB1Ymxpc2hlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIHByZWZsaWdodCB2ZXJpZmljYXRpb24gY2hlY2tzIChjbGVhbi1yZXBvIGNoZWNrLCBmb3JtYXQsIHNwZWxsY2hlY2ssIGxpbnQsXG4gICAqIG92ZXItZXhwb3N1cmUgYW5hbHlzaXMsIGFuZCB0ZXN0cykuIFRoZSBidWlsZCBzdGVwIGlzIG5vdCBvbmUgb2YgdGhlc2UgY2hlY2tzIFx1MjAxNCBpdCBpcyBnb3Zlcm5lZFxuICAgKiBzZXBhcmF0ZWx5IGJ5IHtAbGluayBzaG91bGRCdWlsZH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUnVuQ2hlY2tzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIHByZS1jb21taXQgaG9vayB3aGVuIGNyZWF0aW5nIHRoZSByZWxlYXNlIGNvbW1pdC4gV2hlbiBgZmFsc2VgLCBgLS1uby12ZXJpZnlgXG4gICAqIGlzIHBhc3NlZCB0byB0aGUgcmVsZWFzZSBjb21taXQgdG8gc2tpcCB0aGUgaG9vay5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRWZXJpZnlDb21taXQ/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgTnBtUGFja1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGZpbGVuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcHJlLXJlbGVhc2UgaWRlbnRpZmllciB1c2VkIGZvciBwcmUtcmVsZWFzZSB2ZXJzaW9ucy5cbiAqL1xuY29uc3QgREVGQVVMVF9QUkVJRCA9ICdiZXRhJztcblxuLyoqXG4gKiBUaGUgZmVlZCB0aGUgT2JzaWRpYW4gZGVza3RvcCBhcHAgdXBkYXRlcyBmcm9tLlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgdGhlIEdpdEh1YiBgcmVsZWFzZXMvbGF0ZXN0YCBBUEk6IHRoYXQgZW5kcG9pbnQgcmV0dXJucyB0aGUgbmV3ZXN0IHJlbGVhc2Ugb2YgYW55IGtpbmRcbiAqIGluIGBvYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzYCwgaW5jbHVkaW5nIG9uZSB3aG9zZSBvbmx5IGFzc2V0IGlzIHRoZSBBbmRyb2lkIEFQSywgd2hpY2ggbm8gZGVza3RvcFxuICogdXNlciBjYW4gaW5zdGFsbC4gU2VlIHtAbGluayBnZXRMYXRlc3RPYnNpZGlhblZlcnNpb259LlxuICovXG5jb25zdCBERVNLVE9QX1JFTEVBU0VTX0pTT05fVVJMID0gJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL21hc3Rlci9kZXNrdG9wLXJlbGVhc2VzLmpzb24nO1xuXG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIGRpZmZlcmVudCB0eXBlcyBvZiB2ZXJzaW9uIHVwZGF0ZXMuXG4gKlxuICogQWxpZ25zIHdpdGggbnBtJ3MgYG5wbSB2ZXJzaW9uYCBpbmNyZW1lbnQgdHlwZXMgcGx1cyBgTWFudWFsYCBmb3IgZXhwbGljaXQgdmVyc2lvbnMuXG4gKi9cbmV4cG9ydCBlbnVtIFZlcnNpb25VcGRhdGVUeXBlIHtcbiAgSW52YWxpZCA9ICdpbnZhbGlkJyxcbiAgTWFqb3IgPSAnbWFqb3InLFxuICBNYW51YWwgPSAnbWFudWFsJyxcbiAgTWlub3IgPSAnbWlub3InLFxuICBQYXRjaCA9ICdwYXRjaCcsXG4gIFByZU1ham9yID0gJ3ByZW1ham9yJyxcbiAgUHJlTWlub3IgPSAncHJlbWlub3InLFxuICBQcmVQYXRjaCA9ICdwcmVwYXRjaCcsXG4gIFByZVJlbGVhc2UgPSAncHJlcmVsZWFzZSdcbn1cblxuLyoqXG4gKiBUeXBlIHJlcHJlc2VudGluZyB0aGUgc3RydWN0dXJlIG9mIE9ic2lkaWFuJ3MgYGRlc2t0b3AtcmVsZWFzZXMuanNvbmAgZmVlZC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBmZWVkIHRoZSBkZXNrdG9wIGFwcCBpdHNlbGYgdXBkYXRlcyBmcm9tLCBzbyBpdCBpcyB0aGUgb25seSBzb3VyY2UgdGhhdCBzdGF0ZXMgYSB2ZXJzaW9uXG4gKiBkZXNrdG9wIHVzZXJzIGNhbiBhY3R1YWxseSBydW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVza3RvcFJlbGVhc2VzSnNvbiB7XG4gIC8qKlxuICAgKiBUaGUgbGF0ZXN0IE9ic2lkaWFuIHZlcnNpb24gYXZhaWxhYmxlIGZvciBkZXNrdG9wLlxuICAgKi9cbiAgbGF0ZXN0VmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFR5cGUgcmVwcmVzZW50aW5nIHRoZSBtYW5pZmVzdCBmaWxlIGZvcm1hdCBmb3IgT2JzaWRpYW4gcGx1Z2lucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBBIG1pbmltdW0gT2JzaWRpYW4gdmVyc2lvbiByZXF1aXJlZCBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIG1pbkFwcFZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogQSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIEdpdCB0YWcgZm9yIHRoZSBuZXcgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgdG8gdXNlIGZvciB0aGUgdGFnLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB0YWcgaGFzIGJlZW4gY3JlYXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZEdpdFRhZyhuZXdWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZXhlY0Zyb21Sb290KGBnaXQgdGFnIC1hICR7bmV3VmVyc2lvbn0gLW0gJHtuZXdWZXJzaW9ufSAtLWZvcmNlYCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIEFkZHMgdXBkYXRlZCBmaWxlcyB0byB0aGUgR2l0IHN0YWdpbmcgYXJlYSBhbmQgY29tbWl0cyB0aGVtIHdpdGggdGhlIG5ldyB2ZXJzaW9uIG1lc3NhZ2UuXG4gKlxuICogSWYgdGhlIGNvbW1pdCBmYWlscyAoZm9yIGV4YW1wbGUsIHRoZSBwcmUtY29tbWl0IGhvb2sgcmVqZWN0cyBhIG5ldyB3b3JkIGluIHRoZSBjaGFuZ2Vsb2cpIGFuZCB0aGVcbiAqIHByb2Nlc3MgaXMgYXR0YWNoZWQgdG8gYW4gaW50ZXJhY3RpdmUgdGVybWluYWwsIHRoZSB1c2VyIGlzIHByb21wdGVkIHRvIGZpeCB0aGUgaXNzdWUgKGZvciBleGFtcGxlLFxuICogYWRkIHRoZSBtaXNzaW5nIHdvcmQgdG8gYGNzcGVsbC5qc29uYCkgYW5kIHByZXNzIEVudGVyIHRvIHJldHJ5LiBUaGUgcmV0cnkgcmUtc3RhZ2VzIGFsbCBmaWxlcywgc28gdGhlXG4gKiBmaXggaXMgcGlja2VkIHVwIHdpdGhvdXQgcmVzdGFydGluZyB0aGUgd2hvbGUgcmVsZWFzZSBsaWZlY3ljbGUuIEluIGEgbm9uLWludGVyYWN0aXZlIGVudmlyb25tZW50IChub1xuICogVFRZLCBzdWNoIGFzIENJKSwgdGhlIGVycm9yIGlzIHJlLXRocm93biBpbnN0ZWFkIG9mIHByb21wdGluZywgc28gdGhlIHNjcmlwdCBmYWlscyBmYXN0IHJhdGhlciB0aGFuXG4gKiBoYW5naW5nLiBQYXNzIGBzaG91bGRWZXJpZnlDb21taXQ6IGZhbHNlYCB0byBza2lwIHRoZSBwcmUtY29tbWl0IGhvb2sgZW50aXJlbHkgaW4gc3VjaCBjYXNlcy5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgdXNlZCBhcyB0aGUgY29tbWl0IG1lc3NhZ2UuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgQWRkVXBkYXRlZEZpbGVzVG9HaXRPcHRpb25zfSBjb250cm9sbGluZyB0aGUgY29tbWl0IGJlaGF2aW9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlcyBoYXZlIGJlZW4gYWRkZWQgYW5kIGNvbW1pdHRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZFVwZGF0ZWRGaWxlc1RvR2l0KG5ld1ZlcnNpb246IHN0cmluZywgb3B0aW9uczogQWRkVXBkYXRlZEZpbGVzVG9HaXRPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzaG91bGRWZXJpZnlDb21taXQgPSB0cnVlIH0gPSBvcHRpb25zO1xuICBjb25zdCB2ZXJzaW9uRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignVmVyc2lvbicpO1xuXG4gIGNvbnN0IGNvbW1pdEFyZ3VtZW50cyA9IFsnZ2l0JywgJ2NvbW1pdCcsICctbScsIGBjaG9yZTogcmVsZWFzZSAke25ld1ZlcnNpb259YCwgJy0tYWxsb3ctZW1wdHknXTtcbiAgaWYgKCFzaG91bGRWZXJpZnlDb21taXQpIHtcbiAgICBjb21taXRBcmd1bWVudHMucHVzaCgnLS1uby12ZXJpZnknKTtcbiAgfVxuXG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2l0JywgJ2FkZCcsICctLWFsbCddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgICBhd2FpdCBleGVjRnJvbVJvb3QoY29tbWl0QXJndW1lbnRzLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgdmVyc2lvbkRlYnVnZ2VyKFxuICAgICAgICBgRmFpbGVkIHRvIGNvbW1pdCB0aGUgcmVsZWFzZS5cXG4ke2Vycm9yVG9TdHJpbmcoZXJyb3IpfVxcbmBcbiAgICAgICAgICArICdGaXggdGhlIGlzc3VlcyAoZm9yIGV4YW1wbGUsIGFkZCB0aGUgbWlzc2luZyB3b3JkIHRvIGNzcGVsbC5qc29uKSBhbmQgcHJlc3MgRW50ZXIgdG8gcmV0cnkgdGhlIGNvbW1pdCwgb3IgQ3RybCtDIHRvIGFib3J0LidcbiAgICAgICk7XG4gICAgICBhd2FpdCBjcmVhdGVJbnRlcmZhY2UocHJvY2Vzcy5zdGRpbiwgcHJvY2Vzcy5zdGRvdXQpLnF1ZXN0aW9uKCdQcmVzcyBFbnRlciB0byByZXRyeSB0aGUgY29tbWl0Li4uJyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBHaXRIdWIgQ0xJIGlzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLlxuICpcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIEdpdEh1YiBDTEkgaXMgbm90IGluc3RhbGxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydEdpdEh1YkNsaUluc3RhbGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjRnJvbVJvb3QoJ2doIC0tdmVyc2lvbicsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdHaXRIdWIgQ0xJIGlzIG5vdCBpbnN0YWxsZWQuIFBsZWFzZSBpbnN0YWxsIGl0IGZyb20gaHR0cHM6Ly9jbGkuZ2l0aHViLmNvbS8nKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBHaXQgaXMgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0uXG4gKlxuICogVGhyb3dzIGFuIGVycm9yIGlmIEdpdCBpcyBub3QgaW5zdGFsbGVkLlxuICpcbiAqIEB0aHJvd3MgRXJyb3IgaWYgR2l0IGlzIG5vdCBpbnN0YWxsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRHaXRJbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgLS12ZXJzaW9uJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdCBpcyBub3QgaW5zdGFsbGVkLiBQbGVhc2UgaW5zdGFsbCBpdCBmcm9tIGh0dHBzOi8vZ2l0LXNjbS5jb20vJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIEdpdCByZXBvc2l0b3J5IGlzIGNsZWFuLCBtZWFuaW5nIHRoZXJlIGFyZSBubyB1bmNvbW1pdHRlZCBjaGFuZ2VzLlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgR2l0IHJlcG9zaXRvcnkgaXMgbm90IGNsZWFuLlxuICpcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIEdpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydEdpdFJlcG9DbGVhbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCBleGVjRnJvbVJvb3QoJ2dpdCBzdGF0dXMgLS1wb3JjZWxhaW4gLS11bnRyYWNrZWQtZmlsZXM9YWxsJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIGlmIChzdGRvdXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdHaXQgcmVwb3NpdG9yeSBpcyBub3QgY2xlYW4uIFBsZWFzZSBjb21taXQgb3Igc3Rhc2ggeW91ciBjaGFuZ2VzIGJlZm9yZSByZWxlYXNpbmcgYSBuZXcgdmVyc2lvbi4nKTtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXBzIGFueSBiYXJlIGBodHRwKHMpOi8vYCBVUkwgaW4gdGhlIGdpdmVuIHRleHQgaW4gYW5nbGUgYnJhY2tldHMgKGA8dXJsPmApIHNvIHRoYXQgdGV4dCBlbWl0dGVkXG4gKiBpbnRvIGEgTWFya2Rvd24gZG9jdW1lbnQgKHN1Y2ggYXMgYSBnZW5lcmF0ZWQgY2hhbmdlbG9nIGJ1bGxldCkgcGFzc2VzIG1hcmtkb3dubGludCdzXG4gKiBgTUQwMzQvbm8tYmFyZS11cmxzYCBydWxlIHdoaWxlIHN0aWxsIHJlbmRlcmluZyBhcyBhIGNsaWNrYWJsZSBhdXRvbGluayBvbiBHaXRIdWIuXG4gKlxuICogVVJMcyB0aGF0IGFyZSBhbHJlYWR5IHdyYXBwZWQgaW4gYW5nbGUgYnJhY2tldHMgKGA8dXJsPmApIG9yIHRoYXQgZm9ybSB0aGUgdGFyZ2V0IG9mIGEgTWFya2Rvd25cbiAqIGxpbmsgKGBbdGV4dF0odXJsKWApIGFyZSBsZWZ0IHVudG91Y2hlZCwgc28gdGhlIGZ1bmN0aW9uIGlzIHNhZmUgdG8gcnVuIHJlcGVhdGVkbHkuIFRyYWlsaW5nXG4gKiBzZW50ZW5jZSBwdW5jdHVhdGlvbiAoYC5gLCBgLGAsIGA7YCwgYDpgLCBgIWAsIGA/YCkgaXMga2VwdCBvdXRzaWRlIHRoZSBhbmdsZSBicmFja2V0cyBzbyBpdCBkb2VzXG4gKiBub3QgYmVjb21lIHBhcnQgb2YgdGhlIGxpbmsuXG4gKlxuICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCBwb3NzaWJseSBjb250YWluaW5nIGJhcmUgVVJMcy5cbiAqIEByZXR1cm5zIFRoZSB0ZXh0IHdpdGggZXZlcnkgYmFyZSBVUkwgd3JhcHBlZCBpbiBhbmdsZSBicmFja2V0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF1dG9saW5rQmFyZVVybHModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvKD88IVs8WyhdKWh0dHBzPzpcXC9cXC9bXlxcczw+KVxcXV0rL2csICh1cmwpID0+IHtcbiAgICBjb25zdCB0cmFpbGluZ1B1bmN0dWF0aW9uID0gL1suLDs6IT9dKyQvLmV4ZWModXJsKT8uWzBdID8/ICcnO1xuICAgIGNvbnN0IGJhcmVVcmwgPSB1cmwuc2xpY2UoMCwgdXJsLmxlbmd0aCAtIHRyYWlsaW5nUHVuY3R1YXRpb24ubGVuZ3RoKTtcbiAgICByZXR1cm4gYDwke2JhcmVVcmx9PiR7dHJhaWxpbmdQdW5jdHVhdGlvbn1gO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIHVwZGF0ZWQgbWFuaWZlc3QgZmlsZSB0byB0aGUgZGlzdHJpYnV0aW9uIGJ1aWxkIGZvbGRlci5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvcHkgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weVVwZGF0ZWRNYW5pZmVzdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY3AoXG4gICAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24gfSksXG4gICAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBqb2luKE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkRpc3RCdWlsZCwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RKc29uKSB9KSxcbiAgICB7IGZvcmNlOiB0cnVlIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBuZXcgdmVyc2lvbiBzdHJpbmcgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmVyc2lvbiBhbmQgdGhlIHNwZWNpZmllZCB1cGRhdGUgdHlwZS5cbiAqXG4gKiBVc2VzIHRoZSBgc2VtdmVyYCBwYWNrYWdlIHRvIGNvbXB1dGUgdGhlIG5leHQgdmVyc2lvbiwgc3VwcG9ydGluZyBhbGwgbnBtIGluY3JlbWVudCB0eXBlczpcbiAqIGBtYWpvcmAsIGBtaW5vcmAsIGBwYXRjaGAsIGBwcmVtYWpvcmAsIGBwcmVtaW5vcmAsIGBwcmVwYXRjaGAsIGFuZCBgcHJlcmVsZWFzZWAuXG4gKiBQcmUtcmVsZWFzZSB2ZXJzaW9ucyB1c2UgdGhlIGBiZXRhYCBpZGVudGlmaWVyIGJ5IGRlZmF1bHQgKGUuZy4sIGAxLjIuNC1iZXRhLjBgKS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSBvciBhbiBleHBsaWNpdCB2ZXJzaW9uIHN0cmluZy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5ldyB2ZXJzaW9uIHN0cmluZy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBpbnZhbGlkIG9yIHRoZSBpbmNyZW1lbnQgZmFpbHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXROZXdWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB2ZXJzaW9uVHlwZSA9IGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlKTtcbiAgaWYgKHZlcnNpb25UeXBlID09PSBWZXJzaW9uVXBkYXRlVHlwZS5NYW51YWwpIHtcbiAgICByZXR1cm4gdmVyc2lvblVwZGF0ZVR5cGU7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbigpO1xuICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHBhY2thZ2VKc29uLnZlcnNpb24gPz8gJyc7XG5cbiAgY29uc3QgcmVsZWFzZVR5cGUgPSB2ZXJzaW9uVHlwZSBhcyBSZWxlYXNlVHlwZTtcbiAgY29uc3QgaXNQcmVSZWxlYXNlVHlwZSA9IHJlbGVhc2VUeXBlLnN0YXJ0c1dpdGgoJ3ByZScpO1xuICBjb25zdCBuZXdWZXJzaW9uID0gaXNQcmVSZWxlYXNlVHlwZVxuICAgID8gaW5jKGN1cnJlbnRWZXJzaW9uLCByZWxlYXNlVHlwZSwgREVGQVVMVF9QUkVJRClcbiAgICA6IGluYyhjdXJyZW50VmVyc2lvbiwgcmVsZWFzZVR5cGUpO1xuICBhc3NlcnROb25OdWxsYWJsZShuZXdWZXJzaW9uLCBgRmFpbGVkIHRvIGluY3JlbWVudCB2ZXJzaW9uIGZyb20gJyR7Y3VycmVudFZlcnNpb259JyB3aXRoIHR5cGUgJyR7dmVyc2lvblR5cGV9J2ApO1xuXG4gIHJldHVybiBuZXdWZXJzaW9uO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgcmVsZWFzZSBub3RlcyBmb3IgYSBzcGVjaWZpYyB2ZXJzaW9uIGZyb20gdGhlIGNoYW5nZWxvZy5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgZm9yIHdoaWNoIHRvIGdldCB0aGUgcmVsZWFzZSBub3Rlcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlbGVhc2Ugbm90ZXMgZm9yIHRoZSBzcGVjaWZpZWQgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlbGVhc2VOb3RlcyhuZXdWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjaGFuZ2Vsb2dQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KTtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ1BhdGgsICd1dGYtOCcpO1xuICBjb25zdCBzZWN0aW9uID0gZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY29udGVudCwgbmV3VmVyc2lvbik7XG4gIGxldCByZWxlYXNlTm90ZXMgPSBzZWN0aW9uID8gYCR7c2VjdGlvbn1cXG5cXG5gIDogJyc7XG5cbiAgY29uc3QgdGFnT3V0cHV0ID0gYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgdGFnIC0tc29ydD0tY3JlYXRvcmRhdGUnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIGNvbnN0IHRhZ3MgPSB0YWdPdXRwdXQuc3BsaXQoL1xccj9cXG4vKTtcbiAgY29uc3QgcHJldmlvdXNWZXJzaW9uID0gdGFnc1sxXTtcblxuICBjb25zdCByZXBvVXJsID0gYXdhaXQgZXhlY0Zyb21Sb290KCdnaCByZXBvIHZpZXcgLS1qc29uIHVybCAtcSAudXJsJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gIGNvbnN0IGNoYW5nZXNVcmwgPSBwcmV2aW91c1ZlcnNpb24gPyBgJHtyZXBvVXJsfS9jb21wYXJlLyR7cHJldmlvdXNWZXJzaW9ufS4uLiR7bmV3VmVyc2lvbn1gIDogYCR7cmVwb1VybH0vY29tbWl0cy8ke25ld1ZlcnNpb259YDtcblxuICByZWxlYXNlTm90ZXMgKz0gYCoqRnVsbCBDaGFuZ2Vsb2cqKjogJHtjaGFuZ2VzVXJsfWA7XG4gIHJldHVybiByZWxlYXNlTm90ZXM7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSBiYXNlZCBvbiB0aGUgaW5wdXQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSBpbnB1dCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlLlxuICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgYFZlcnNpb25VcGRhdGVUeXBlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiBWZXJzaW9uVXBkYXRlVHlwZSB7XG4gIGNvbnN0IHZlcnNpb25VcGRhdGVUeXBlRW51bSA9IHZlcnNpb25VcGRhdGVUeXBlIGFzIFZlcnNpb25VcGRhdGVUeXBlO1xuICBzd2l0Y2ggKHZlcnNpb25VcGRhdGVUeXBlRW51bSkge1xuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5NaW5vcjpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlBhdGNoOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuUHJlTWFqb3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5QcmVNaW5vcjpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlByZVBhdGNoOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuUHJlUmVsZWFzZToge1xuICAgICAgcmV0dXJuIHZlcnNpb25VcGRhdGVUeXBlRW51bTtcbiAgICB9XG5cbiAgICBkZWZhdWx0OiB7XG4gICAgICBpZiAoL15cXGQrXFwuXFxkK1xcLlxcZCsoPzotW1xcd1xcZC4tXSspPyQvLnRlc3QodmVyc2lvblVwZGF0ZVR5cGUpKSB7XG4gICAgICAgIHJldHVybiBWZXJzaW9uVXBkYXRlVHlwZS5NYW51YWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBWZXJzaW9uVXBkYXRlVHlwZS5JbnZhbGlkO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFB1c2hlcyBjb21taXRzIGFuZCB0YWdzIHRvIHRoZSByZW1vdGUgR2l0IHJlcG9zaXRvcnkuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwdXNoIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdpdFB1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IHB1c2ggLS1mb2xsb3ctdGFncyAtLWZvcmNlJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgYSB2ZXJzaW9uIHVwZGF0ZSBpbnRvIGEgdmVyc2lvbiB1cGRhdGUgdHlwZSBhbmRcbiAqIHtAbGluayBVcGRhdGVWZXJzaW9uT3B0aW9uc30uXG4gKlxuICogRWFjaCBiZWhhdmlvciBpcyBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRoZSBjb3JyZXNwb25kaW5nIGAtLW5vLSpgIGZsYWcgdHVybnMgaXQgb2ZmLiBgLS1jaGFuZ2Vsb2ctZmlsZWAgYW5kXG4gKiBgLS1taW4tYXBwLXZlcnNpb25gIHRha2UgYSB2YWx1ZSBpbnN0ZWFkIGFuZCBoYXZlIG5vIGRlZmF1bHQuIFJlY29nbml6ZWQgZmxhZ3M6XG4gKiAtIGAtLWNoYW5nZWxvZy1maWxlPTxwYXRoPmAgXHUyMDE0IHVzZSB0aGlzIGZpbGUncyBjb250ZW50cyBhcyB0aGUgbmV3IHZlcnNpb24ncyBjaGFuZ2Vsb2cgc2VjdGlvbiBpbnN0ZWFkIG9mXG4gKiAgIHRoZSBjb21taXQtZGVyaXZlZCBidWxsZXRzLCBhbmQgc2tpcCB0aGUgaW50ZXJhY3RpdmUgcmV2aWV3IGVudGlyZWx5LlxuICogLSBgLS1taW4tYXBwLXZlcnNpb249PHgueS56PmAgXHUyMDE0IHdyaXRlIHRoaXMgYG1pbkFwcFZlcnNpb25gIGludG8gdGhlIHBsdWdpbidzIGBtYW5pZmVzdC5qc29uYCBhbmQgaXRzIG5ld1xuICogICBgdmVyc2lvbnMuanNvbmAgZW50cnkgaW5zdGVhZCBvZiB0cmFja2luZyB0aGUgbGF0ZXN0IE9ic2lkaWFuIGRlc2t0b3AgdmVyc2lvbi5cbiAqIC0gYC0tbm8tYnVpbGRgIFx1MjAxNCBza2lwIHRoZSBidWlsZCBzdGVwIChvbmx5IHNhZmUgd2hlbiB0aGUgYnVpbGQgb3V0cHV0IGFscmVhZHkgbWF0Y2hlcyB0aGUgY3VycmVudCBjb2RlKS5cbiAqIC0gYC0tbm8tY2hhbmdlbG9nLWVkaXRpbmdgIFx1MjAxNCBnZW5lcmF0ZSB0aGUgY2hhbmdlbG9nIHdpdGhvdXQgb3BlbmluZyBpdCBmb3IgbWFudWFsIHJldmlldy5cbiAqIC0gYC0tbm8tY2hlY2tzYCBcdTIwMTQgc2tpcCB0aGUgY2xlYW4tcmVwbyBjaGVjaywgZm9ybWF0LCBzcGVsbGNoZWNrLCBsaW50LCBvdmVyLWV4cG9zdXJlIGFuYWx5c2lzLCBhbmQgdGVzdHMgKHRoZSBidWlsZCBzdGlsbCBydW5zKS5cbiAqIC0gYC0tbm8tY29tbWl0LXZlcmlmaWNhdGlvbmAgXHUyMDE0IHBhc3MgYC0tbm8tdmVyaWZ5YCB0byB0aGUgcmVsZWFzZSBjb21taXQsIHNraXBwaW5nIHRoZSBwcmUtY29tbWl0IGhvb2suXG4gKiAtIGAtLW5vLWRlbW8tdmF1bHRgIFx1MjAxNCBza2lwIGFyY2hpdmluZyB0aGUgcGx1Z2luJ3MgZGVtbyB2YXVsdCAoYGRlbW8tdmF1bHQvYCkgYXMgYSByZWxlYXNlIGFydGlmYWN0LlxuICogLSBgLS1uby1yZWxlYXNlYCBcdTIwMTQgcnVuIGFsbCBsb2NhbCBzdGVwcyBidXQgc2tpcCB0aGUgcHVzaCBhbmQgdGhlIEdpdEh1YiByZWxlYXNlLlxuICpcbiAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgdG8gcGFyc2UgKHR5cGljYWxseSBgcHJvY2Vzcy5hcmd2LnNsaWNlKDIpYCkuXG4gKiBAcmV0dXJucyBUaGUge0BsaW5rIFBhcnNlZFZlcnNpb25Bcmd1bWVudHN9IGNvbnRhaW5pbmcgdGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgYW5kIHRoZSBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWZXJzaW9uQXJndW1lbnRzKCRhcmd1bWVudHM6IHN0cmluZ1tdKTogUGFyc2VkVmVyc2lvbkFyZ3VtZW50cyB7XG4gIGNvbnN0IHsgcG9zaXRpb25hbHMsIHZhbHVlcyB9ID0gcGFyc2VBcmdzKHtcbiAgICBhbGxvd1Bvc2l0aW9uYWxzOiB0cnVlLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBhcmdzYCBpcyB0aGUgb3B0aW9uIG5hbWUgTm9kZSdzIGBwYXJzZUFyZ3NgIHJlYWRzLlxuICAgIGFyZ3M6ICRhcmd1bWVudHMsXG4gICAgb3B0aW9uczoge1xuICAgICAgJ2NoYW5nZWxvZy1maWxlJzogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgJ21pbi1hcHAtdmVyc2lvbic6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICduby1idWlsZCc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAnbm8tY2hhbmdlbG9nLWVkaXRpbmcnOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgJ25vLWNoZWNrcyc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAnbm8tY29tbWl0LXZlcmlmaWNhdGlvbic6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAnbm8tZGVtby12YXVsdCc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAnbm8tcmVsZWFzZSc6IHsgdHlwZTogJ2Jvb2xlYW4nIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgb3B0aW9uczoge1xuICAgICAgY2hhbmdlbG9nRmlsZVBhdGg6IHZhbHVlc1snY2hhbmdlbG9nLWZpbGUnXSxcbiAgICAgIG1pbkFwcFZlcnNpb246IHZhbHVlc1snbWluLWFwcC12ZXJzaW9uJ10sXG4gICAgICBzaG91bGRBcmNoaXZlRGVtb1ZhdWx0OiAhKHZhbHVlc1snbm8tZGVtby12YXVsdCddID8/IGZhbHNlKSxcbiAgICAgIHNob3VsZEJ1aWxkOiAhKHZhbHVlc1snbm8tYnVpbGQnXSA/PyBmYWxzZSksXG4gICAgICBzaG91bGRFZGl0Q2hhbmdlbG9nOiAhKHZhbHVlc1snbm8tY2hhbmdlbG9nLWVkaXRpbmcnXSA/PyBmYWxzZSksXG4gICAgICBzaG91bGRSZWxlYXNlOiAhKHZhbHVlc1snbm8tcmVsZWFzZSddID8/IGZhbHNlKSxcbiAgICAgIHNob3VsZFJ1bkNoZWNrczogISh2YWx1ZXNbJ25vLWNoZWNrcyddID8/IGZhbHNlKSxcbiAgICAgIHNob3VsZFZlcmlmeUNvbW1pdDogISh2YWx1ZXNbJ25vLWNvbW1pdC12ZXJpZmljYXRpb24nXSA/PyBmYWxzZSlcbiAgICB9LFxuICAgIHZlcnNpb25VcGRhdGVUeXBlOiBwb3NpdGlvbmFsc1swXVxuICB9O1xufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBhIEdpdEh1YiByZWxlYXNlIGZvciB0aGUgbmV3IHZlcnNpb24uXG4gKlxuICogSGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgYSByZWxlYXNlIGFuZCB1cGxvYWRpbmcgZmlsZXMgZm9yIGVpdGhlciBhbiBPYnNpZGlhbiBwbHVnaW4gb3IgYW5vdGhlciBwcm9qZWN0LlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIHJlbGVhc2UuXG4gKiBAcGFyYW0gaXNPYnNpZGlhblBsdWdpbiAtIEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBwcm9qZWN0IGlzIGFuIE9ic2lkaWFuIHBsdWdpbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVsZWFzZSBoYXMgYmVlbiBwdWJsaXNoZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWJsaXNoR2l0SHViUmVsZWFzZShuZXdWZXJzaW9uOiBzdHJpbmcsIGlzT2JzaWRpYW5QbHVnaW46IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGZpbGVQYXRoczogc3RyaW5nW107XG5cbiAgaWYgKGlzT2JzaWRpYW5QbHVnaW4pIHtcbiAgICBjb25zdCBidWlsZEZvbGRlciA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGlzdEJ1aWxkIH0pO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXJQb3NpeChidWlsZEZvbGRlcik7XG4gICAgZmlsZVBhdGhzID0gZmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IGpvaW4oYnVpbGRGb2xkZXIsIGZpbGVOYW1lKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcmVzdWx0T3V0cHV0ID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnbnBtJywgJ3BhY2snLCAnLS1wYWNrLWRlc3RpbmF0aW9uJywgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0LCAnLS1qc29uJ10sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZU5wbVBhY2tPdXRwdXQocmVzdWx0T3V0cHV0KTtcbiAgICBmaWxlUGF0aHMgPSBbXG4gICAgICBqb2luKE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdCwgcmVzdWx0LmZpbGVuYW1lKSxcbiAgICAgIGpvaW4oT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0LCBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLlN0eWxlc0NzcylcbiAgICBdO1xuICB9XG5cbiAgZmlsZVBhdGhzID0gZmlsZVBhdGhzLmZpbHRlcigoZmlsZVBhdGgpID0+IGV4aXN0c1N5bmMocmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBmaWxlUGF0aCB9KSkpO1xuXG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChbXG4gICAgJ2doJyxcbiAgICAncmVsZWFzZScsXG4gICAgJ2NyZWF0ZScsXG4gICAgbmV3VmVyc2lvbixcbiAgICAuLi5maWxlUGF0aHMsXG4gICAgJy0tdGl0bGUnLFxuICAgIGB2JHtuZXdWZXJzaW9ufWAsXG4gICAgLi4uKGlzUHJlUmVsZWFzZShuZXdWZXJzaW9uKSA/IFsnLS1wcmVyZWxlYXNlJ10gOiBbXSksXG4gICAgJy0tbm90ZXMtZmlsZScsXG4gICAgJy0nXG4gIF0sIHtcbiAgICBpc1F1aWV0OiB0cnVlLFxuICAgIHN0ZGluOiBhd2FpdCBnZXRSZWxlYXNlTm90ZXMobmV3VmVyc2lvbilcbiAgfSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgY2hhbmdlbG9nIGZpbGUgd2l0aCBuZXcgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgY29tbWl0IG1lc3NhZ2VzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGN1cnJlbnQgY2hhbmdlbG9nLCBhcHBlbmRzIG5ldyBlbnRyaWVzIGZvciB0aGUgbGF0ZXN0IHZlcnNpb24sXG4gKiBhbmQgcHJvbXB0cyB0aGUgdXNlciB0byByZXZpZXcgdGhlIGNoYW5nZXMuXG4gKlxuICogVGhlIHJldmlldyBoYXBwZW5zIG9uIGEgc2NyYXRjaCBjb3B5IGluIHRoZSBPUyB0ZW1wb3JhcnkgZm9sZGVyLCBhbmQgdGhlIHJlcG9zaXRvcnkncyBvd25cbiAqIGBDSEFOR0VMT0cubWRgIGlzIHdyaXR0ZW4gb25seSBvbmNlIHRoZSByZXZpZXcgaXMgb3ZlciBcdTIwMTQgc28gaW50ZXJydXB0aW5nIHRoZSByZXZpZXcgbGVhdmVzIHRoZVxuICogcmVwb3NpdG9yeSB1bnRvdWNoZWQuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRvIGJlIGFkZGVkIHRvIHRoZSBjaGFuZ2Vsb2cuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVXBkYXRlQ2hhbmdlbG9nT3B0aW9uc30gY29udHJvbGxpbmcgdGhlIGNoYW5nZWxvZyByZXZpZXcgYmVoYXZpb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNoYW5nZWxvZyB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVDaGFuZ2Vsb2cobmV3VmVyc2lvbjogc3RyaW5nLCBvcHRpb25zOiBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgd3JpdGVDaGFuZ2Vsb2coYXdhaXQgcHJlcGFyZUNoYW5nZWxvZyhuZXdWZXJzaW9uLCBvcHRpb25zKSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHVwZGF0ZSB0eXBlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBzZXJpZXMgb2YgdGFza3MgdG8gaGFuZGxlIHZlcnNpb24gdXBkYXRlczpcbiAqIDEuIFZhbGlkYXRlcyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZS5cbiAqIDIuIENoZWNrcyBpZiBHaXQgYW5kIEdpdEh1YiBDTEkgYXJlIGluc3RhbGxlZC5cbiAqIDMuIFZlcmlmaWVzIHRoYXQgdGhlIGludGVyYWN0aXZlIGNoYW5nZWxvZyByZXZpZXcsIGlmIG9uZSBpcyBkdWUsIGNhbiBhY3R1YWxseSBiZSBhbnN3ZXJlZC5cbiAqIDQuIFZlcmlmaWVzIHRoYXQgdGhlIEdpdCByZXBvc2l0b3J5IGlzIGNsZWFuLlxuICogNS4gUnVucyBzcGVsbGNoZWNrIGFuZCBsaW50aW5nLlxuICogNi4gQnVpbGRzIHRoZSBwcm9qZWN0LlxuICogNy4gU2V0dGxlcyB0aGUgY2hhbmdlbG9nIFx1MjAxNCB0aGUgb25seSBzdGVwIHRoYXQgY2FuIGJsb2NrIG9uIGEgaHVtYW4sIGFuZCBkZWxpYmVyYXRlbHkgdGhlIGxhc3Qgb25lIGJlZm9yZVxuICogICAgYW55dGhpbmcgaXMgd3JpdHRlbiwgc28gYW4gaW50ZXJydXB0IGhlcmUgbGVhdmVzIHRoZSB3b3JraW5nIHRyZWUgY2xlYW4gYW5kIHRoZSByZWxlYXNlIHJlLXJ1bm5hYmxlLlxuICogOC4gVXBkYXRlcyB2ZXJzaW9uIGluIGZpbGVzLCB0aGVuIHdyaXRlcyB0aGUgc2V0dGxlZCBjaGFuZ2Vsb2cuXG4gKiA5LiBBZGRzIHVwZGF0ZWQgZmlsZXMgdG8gR2l0LCB0YWdzIHRoZSBjb21taXQsIGFuZCBwdXNoZXMgdG8gdGhlIHJlcG9zaXRvcnkuXG4gKiAxMC4gSWYgYW4gT2JzaWRpYW4gcGx1Z2luLCBjb3BpZXMgdGhlIHVwZGF0ZWQgbWFuaWZlc3QgYW5kIHB1Ymxpc2hlcyBhIEdpdEh1YiByZWxlYXNlLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB0eXBlIG9mIHZlcnNpb24gdXBkYXRlIHRvIHBlcmZvcm0gKG1ham9yLCBtaW5vciwgcGF0Y2gsIHByZW1ham9yLCBwcmVtaW5vciwgcHJlcGF0Y2gsIHByZXJlbGVhc2UsIG9yIHgueS56Wy1zdWZmaXhdKS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBVcGRhdGVWZXJzaW9uT3B0aW9uc30gY29udHJvbGxpbmcgdGhlIHJlbGVhc2UgYmVoYXZpb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHZlcnNpb24gdXBkYXRlIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlVmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZT86IHN0cmluZywgb3B0aW9uczogVXBkYXRlVmVyc2lvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgY2hhbmdlbG9nRmlsZVBhdGgsXG4gICAgbWluQXBwVmVyc2lvbixcbiAgICBwcmVwYXJlR2l0SHViUmVsZWFzZSxcbiAgICBzaG91bGRBcmNoaXZlRGVtb1ZhdWx0ID0gdHJ1ZSxcbiAgICBzaG91bGRCdWlsZCA9IHRydWUsXG4gICAgc2hvdWxkRWRpdENoYW5nZWxvZyA9IHRydWUsXG4gICAgc2hvdWxkUmVsZWFzZSA9IHRydWUsXG4gICAgc2hvdWxkUnVuQ2hlY2tzID0gdHJ1ZSxcbiAgICBzaG91bGRWZXJpZnlDb21taXQgPSB0cnVlXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmICghdmVyc2lvblVwZGF0ZVR5cGUpIHtcbiAgICBjb25zdCBucG1PbGRWZXJzaW9uID0gcHJvY2Vzcy5lbnZbJ25wbV9vbGRfdmVyc2lvbiddO1xuICAgIGNvbnN0IG5wbU5ld1ZlcnNpb24gPSBwcm9jZXNzLmVudlsnbnBtX25ld192ZXJzaW9uJ107XG5cbiAgICBpZiAobnBtT2xkVmVyc2lvbiAmJiBucG1OZXdWZXJzaW9uKSB7XG4gICAgICBhd2FpdCB1cGRhdGVWZXJzaW9uSW5GaWxlcyhucG1PbGRWZXJzaW9uKTtcbiAgICAgIGF3YWl0IHVwZGF0ZVZlcnNpb24obnBtTmV3VmVyc2lvbiwgb3B0aW9ucyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHByb3ZpZGVkJyk7XG4gIH1cblxuICBsZXQgaXNPYnNpZGlhblBsdWdpbiA9IGZhbHNlO1xuICBpZiAoZXhpc3RzU3luYyhyZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbiB9KSkpIHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbigpO1xuICAgIGlzT2JzaWRpYW5QbHVnaW4gPSBwYWNrYWdlSnNvbi5uYW1lICE9PSAnb2JzaWRpYW4tZGV2LXV0aWxzJztcbiAgfVxuXG4gIHZhbGlkYXRlKHZlcnNpb25VcGRhdGVUeXBlKTtcbiAgYXdhaXQgYXNzZXJ0R2l0SW5zdGFsbGVkKCk7XG4gIGF3YWl0IGFzc2VydEdpdEh1YkNsaUluc3RhbGxlZCgpO1xuICAvLyBDaGVja2VkIGhlcmUsIGJlZm9yZSB0aGUgY2hlY2tzIGFuZCB0aGUgYnVpbGQsIHJhdGhlciB0aGFuIGF0IHRoZSBjaGFuZ2Vsb2cgc3RlcCBpdHNlbGY6IGEgbm9uLWludGVyYWN0aXZlXG4gIC8vIENhbGxlciBsZWFybnMgaW4gc2Vjb25kcyBpbnN0ZWFkIG9mIHBheWluZyBmb3IgdGhlIHdob2xlIHByZWZsaWdodCBhbmQgb25seSB0aGVuIGJsb2NraW5nIG9uIGFuIGVkaXRvclxuICAvLyBXaW5kb3cgbm9ib2R5IHdpbGwgZXZlciBjbG9zZS5cbiAgYXNzZXJ0Q2hhbmdlbG9nU3RlcElzTm9uQmxvY2tpbmcoY2hhbmdlbG9nRmlsZVBhdGgsIHNob3VsZEVkaXRDaGFuZ2Vsb2cpO1xuXG4gIGlmIChzaG91bGRSdW5DaGVja3MpIHtcbiAgICBhd2FpdCBhc3NlcnRHaXRSZXBvQ2xlYW4oKTtcbiAgfVxuXG4gIC8vIFRoZSByZXN0IG9mIHRoZSBwcmVmbGlnaHQgSVMgYG5wbSBydW4gZ2F0ZWAsIG5vdCBhIGNvcHkgb2YgaXQ6IGEgY2hlY2sgYWRkZWQgdG8gdGhlIGdhdGUgaXMgcmVhY2hhYmxlXG4gIC8vIEZyb20gdGhlIGJyYW5jaCBhbmQgZnJvbSB0aGUgcmVsZWFzZSBieSBjb25zdHJ1Y3Rpb24sIGluc3RlYWQgb2YgYnkgdHdvIGxpc3RzIGhhcHBlbmluZyB0byBhZ3JlZS5cbiAgLy8gVGhlIGNsZWFuLXJlcG8gYXNzZXJ0aW9uIGFib3ZlIHN0YXlzIGhlcmUsIGJlY2F1c2UgdGhlIGdhdGUgaXMgcnVuIG9uIGEgZGlydHkgdHJlZSBvbiBwdXJwb3NlLlxuICAvLyBUaGUgYnVpbGQgaXMgYSBwcmVyZXF1aXNpdGUgZm9yIHB1Ymxpc2hpbmcsIG5vdCBhIHZlcmlmaWNhdGlvbiBjaGVjaywgc28gaXQgcnVucyB1bmxlc3MgYHNob3VsZEJ1aWxkYCBpcyBgZmFsc2VgIFx1MjAxNCB0aGlzIGtlZXBzIHRoZSByZWxlYXNlZCBhcnRpZmFjdHMgaW4gc3luYyB3aXRoIHRoZSBjdXJyZW50IGNvZGUgZXZlbiBvbiBhIGZhc3QgcmVsZWFzZS5cbiAgYXdhaXQgZ2F0ZSh7XG4gICAgc2hvdWxkQnVpbGQsXG4gICAgc2hvdWxkUnVuQ2hlY2tzLFxuICAgIHNob3VsZFJ1bkludGVncmF0aW9uVGVzdHM6IHRydWVcbiAgfSk7XG5cbiAgY29uc3QgbmV3VmVyc2lvbiA9IGF3YWl0IGdldE5ld1ZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGUpO1xuXG4gIC8vIFRoZSBjaGFuZ2Vsb2cgaXMgc2V0dGxlZCBCRUZPUkUgYW55dGhpbmcgaXMgd3JpdHRlbiwgYmVjYXVzZSB0aGlzIGlzIHRoZSBvbmx5IHN0ZXAgdGhhdCBjYW4gYmxvY2sgb24gYVxuICAvLyBIdW1hbi4gSW50ZXJydXB0aW5nIGl0IHRoZXJlZm9yZSBsZWF2ZXMgdGhlIHdvcmtpbmcgdHJlZSBwcmlzdGluZSBhbmQgdGhlIHdob2xlIHJlbGVhc2UgcmUtcnVubmFibGUsXG4gIC8vIEluc3RlYWQgb2Ygc3RyYW5kaW5nIGEgYnVtcGVkLWJ1dC11bmNvbW1pdHRlZCB0cmVlIHRoYXQgYGFzc2VydEdpdFJlcG9DbGVhbmAgdGhlbiByZWZ1c2VzIHRvIHJlLXJlbGVhc2UuXG4gIGNvbnN0IG5ld0NoYW5nZUxvZyA9IGF3YWl0IHByZXBhcmVDaGFuZ2Vsb2cobmV3VmVyc2lvbiwge1xuICAgIGNoYW5nZWxvZ0ZpbGVQYXRoLFxuICAgIHNob3VsZEVkaXRDaGFuZ2Vsb2dcbiAgfSk7XG5cbiAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRmlsZXMobmV3VmVyc2lvbik7XG4gIGlmIChpc09ic2lkaWFuUGx1Z2luKSB7XG4gICAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRmlsZXNGb3JQbHVnaW4obmV3VmVyc2lvbiwgbWluQXBwVmVyc2lvbik7XG4gIH1cblxuICBhd2FpdCB3cml0ZUNoYW5nZWxvZyhuZXdDaGFuZ2VMb2cpO1xuICBhd2FpdCBhZGRVcGRhdGVkRmlsZXNUb0dpdChuZXdWZXJzaW9uLCB7IHNob3VsZFZlcmlmeUNvbW1pdCB9KTtcbiAgYXdhaXQgYWRkR2l0VGFnKG5ld1ZlcnNpb24pO1xuXG4gIGlmICghc2hvdWxkUmVsZWFzZSkge1xuICAgIGdldExpYkRlYnVnZ2VyKCdWZXJzaW9uJykoJ1NraXBwaW5nIGdpdCBwdXNoIGFuZCBHaXRIdWIgcmVsZWFzZSAoLS1uby1yZWxlYXNlKS4gVGhlIHZlcnNpb24gYnVtcCwgY2hhbmdlbG9nLCBjb21taXQsIGFuZCB0YWcgaGF2ZSBiZWVuIGNyZWF0ZWQgbG9jYWxseS4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBnaXRQdXNoKCk7XG4gIGF3YWl0IHByZXBhcmVHaXRIdWJSZWxlYXNlPy4obmV3VmVyc2lvbik7XG4gIGlmIChpc09ic2lkaWFuUGx1Z2luICYmIHNob3VsZEFyY2hpdmVEZW1vVmF1bHQpIHtcbiAgICBhd2FpdCBhcmNoaXZlUGx1Z2luRGVtb1ZhdWx0KCk7XG4gIH1cbiAgYXdhaXQgcHVibGlzaEdpdEh1YlJlbGVhc2UobmV3VmVyc2lvbiwgaXNPYnNpZGlhblBsdWdpbik7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdmVyc2lvbiBpbiB2YXJpb3VzIGZpbGVzLCBpbmNsdWRpbmcgYHBhY2thZ2UuanNvbmAsIGBwYWNrYWdlLWxvY2suanNvbmAsXG4gKiBhbmQgT2JzaWRpYW4gcGx1Z2luIG1hbmlmZXN0cyBpZiBhcHBsaWNhYmxlLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIHN0cmluZyB0byB1cGRhdGUgaW4gdGhlIGZpbGVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVWZXJzaW9uSW5GaWxlcyhuZXdWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZWRpdFBhY2thZ2VKc29uKChwYWNrYWdlSnNvbikgPT4ge1xuICAgIHBhY2thZ2VKc29uLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICB9KTtcblxuICBhd2FpdCBlZGl0UGFja2FnZUxvY2tKc29uKHVwZGF0ZSwgeyBzaG91bGRTa2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xuICBhd2FpdCBlZGl0TnBtU2hyaW5rV3JhcEpzb24odXBkYXRlLCB7IHNob3VsZFNraXBJZk1pc3Npbmc6IHRydWUgfSk7XG5cbiAgZnVuY3Rpb24gdXBkYXRlKHBhY2thZ2VMb2NrSnNvbjogUGFja2FnZUxvY2tKc29uKTogdm9pZCB7XG4gICAgcGFja2FnZUxvY2tKc29uLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgIGNvbnN0IGRlZmF1bHRQYWNrYWdlID0gcGFja2FnZUxvY2tKc29uLnBhY2thZ2VzPy5bJyddO1xuICAgIGlmIChkZWZhdWx0UGFja2FnZSkge1xuICAgICAgZGVmYXVsdFBhY2thZ2UudmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHRvIGVuc3VyZSBpdCBpcyBlaXRoZXIgYSByZWNvZ25pemVkIHR5cGVcbiAqIG9yIGEgdmFsaWQgbWFudWFsIHZlcnNpb24gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHRvIHZhbGlkYXRlLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSBpcyBpbnZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGUodmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZ2V0VmVyc2lvblVwZGF0ZVR5cGUodmVyc2lvblVwZGF0ZVR5cGUpID09PSBWZXJzaW9uVXBkYXRlVHlwZS5JbnZhbGlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0ludmFsaWQgdmVyc2lvbiB1cGRhdGUgdHlwZS4gUGxlYXNlIHVzZSBcXCdtYWpvclxcJywgXFwnbWlub3JcXCcsIFxcJ3BhdGNoXFwnLCBcXCdwcmVtYWpvclxcJywgXFwncHJlbWlub3JcXCcsIFxcJ3ByZXBhdGNoXFwnLCBcXCdwcmVyZWxlYXNlXFwnLCBvciBcXCd4Lnkuelstc3VmZml4XVxcJyBmb3JtYXQuJ1xuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWZ1c2VzIGEgcmVsZWFzZSB0aGF0IHdvdWxkIGhhdmUgdG8gc3RvcCBhdCB0aGUgaW50ZXJhY3RpdmUgY2hhbmdlbG9nIHJldmlldyB3aXRoIG5vYm9keSB0aGVyZSB0b1xuICogZmluaXNoIGl0LiBDYWxsZWQgZnJvbSB0aGUgcHJlZmxpZ2h0IHNvIHRoZSByZWZ1c2FsIGNvc3RzIHNlY29uZHMsIG5vdCB0aGUgd2hvbGUgY2hlY2stYW5kLWJ1aWxkIGdhdGUuXG4gKlxuICogQHBhcmFtIGNoYW5nZWxvZ0ZpbGVQYXRoIC0gVGhlIHBhdGggdG8gdGhlIHByZXBhcmVkIHJlbGVhc2Ugbm90ZXMsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm9uZS5cbiAqIEBwYXJhbSBzaG91bGRFZGl0Q2hhbmdlbG9nIC0gV2hldGhlciB0aGUgZ2VuZXJhdGVkIGNoYW5nZWxvZyBpcyBtZWFudCB0byBiZSByZXZpZXdlZCBpbnRlcmFjdGl2ZWx5LlxuICovXG5mdW5jdGlvbiBhc3NlcnRDaGFuZ2Vsb2dTdGVwSXNOb25CbG9ja2luZyhjaGFuZ2Vsb2dGaWxlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLCBzaG91bGRFZGl0Q2hhbmdlbG9nOiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChjaGFuZ2Vsb2dGaWxlUGF0aCAhPT0gdW5kZWZpbmVkIHx8ICFzaG91bGRFZGl0Q2hhbmdlbG9nIHx8IHByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ1RoZSBpbnRlcmFjdGl2ZSBjaGFuZ2Vsb2cgcmV2aWV3IG5lZWRzIGEgdGVybWluYWwsIGFuZCB0aGlzIHByb2Nlc3MgaGFzIG5vbmUsIHNvIHRoZSByZWxlYXNlIHdvdWxkIGJsb2NrIGZvcmV2ZXIuJ1xuICAgICAgKyAnIFBhc3MgYC0tY2hhbmdlbG9nLWZpbGUgPHBhdGg+YCB0byBzdXBwbHkgcHJlcGFyZWQgcmVsZWFzZSBub3Rlcywgb3IgYC0tbm8tY2hhbmdlbG9nLWVkaXRpbmdgIHRvIGFjY2VwdCB0aGUnXG4gICAgICArICcgY2hhbmdlbG9nIGdlbmVyYXRlZCBmcm9tIHRoZSBjb21taXQgbWVzc2FnZXMgYXMgaXMuJ1xuICApO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBib2R5IG9mIG9uZSB2ZXJzaW9uJ3MgYENIQU5HRUxPRy5tZGAgc2VjdGlvbiBcdTIwMTQgZXZlcnl0aGluZyBiZXR3ZWVuIGl0cyBgIyMgPHZlcnNpb24+YCBoZWFkaW5nXG4gKiBhbmQgd2hpY2hldmVyIGNvbWVzIGZpcnN0LCB0aGUgbmV4dCBgIyMgYCBoZWFkaW5nIG9yIHRoZSBlbmQgb2YgdGhlIGZpbGUuXG4gKlxuICogRW5kaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgbm90IGFuIGVkZ2UgY2FzZSBidXQgdGhlIG5vcm1hbCBzaGFwZSBvZiBhIEZJUlNUIHJlbGVhc2U6IHNlY3Rpb25zIGFyZVxuICogcHJlcGVuZGVkLCBzbyB0aGUgbmV3ZXN0IG9uZSBpcyBib3VuZGVkIGJ5IHRoZSBwcmV2aW91cyByZWxlYXNlIG9ubHkgb25jZSBhIHByZXZpb3VzIHJlbGVhc2UgZXhpc3RzLiBUaGVcbiAqIHJlZ2V4IHRoaXMgcmVwbGFjZWQgcmVxdWlyZWQgYSB0cmFpbGluZyBgXFxuXFxuIyNgLCBzbyBldmVyeSBgMS4wLjBgIHNpbGVudGx5IHB1Ymxpc2hlZCBlbXB0eSByZWxlYXNlIG5vdGVzLlxuICogVGVybWluYXRpbmcgb24gYCcjIyAnYCBXSVRIIGl0cyB0cmFpbGluZyBzcGFjZSBpcyB3aGF0IGtlZXBzIGFuIGAjIyNgIHN1Yi1oZWFkaW5nIGluc2lkZSB0aGUgc2VjdGlvblxuICogaW5zdGVhZCBvZiB0cnVuY2F0aW5nIGl0IHRoZXJlLlxuICpcbiAqIEBwYXJhbSBjaGFuZ2Vsb2dDb250ZW50IC0gVGhlIGZ1bGwgY29udGVudHMgb2YgYENIQU5HRUxPRy5tZGAuXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHdob3NlIHNlY3Rpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIFRoZSBzZWN0aW9uIGJvZHksIHRyaW1tZWQsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBjaGFuZ2Vsb2cgaGFzIG5vIHNlY3Rpb24gZm9yIHRoYXQgdmVyc2lvbi5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENoYW5nZWxvZ1NlY3Rpb24oY2hhbmdlbG9nQ29udGVudDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lcyA9IGNoYW5nZWxvZ0NvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgY29uc3QgaGVhZGluZ0luZGV4ID0gbGluZXMuaW5kZXhPZihgIyMgJHt2ZXJzaW9ufWApO1xuICBpZiAoaGVhZGluZ0luZGV4ID09PSAtMSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGJvZHlTdGFydEluZGV4ID0gaGVhZGluZ0luZGV4ICsgMTtcbiAgY29uc3QgbmV4dEhlYWRpbmdPZmZzZXQgPSBsaW5lcy5zbGljZShib2R5U3RhcnRJbmRleCkuZmluZEluZGV4KChsaW5lKSA9PiBsaW5lLnN0YXJ0c1dpdGgoJyMjICcpKTtcbiAgY29uc3QgYm9keUVuZEluZGV4ID0gbmV4dEhlYWRpbmdPZmZzZXQgPT09IC0xID8gbGluZXMubGVuZ3RoIDogYm9keVN0YXJ0SW5kZXggKyBuZXh0SGVhZGluZ09mZnNldDtcbiAgcmV0dXJuIGxpbmVzLnNsaWNlKGJvZHlTdGFydEluZGV4LCBib2R5RW5kSW5kZXgpLmpvaW4oJ1xcbicpLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBPYnNpZGlhbiB0aGF0IHRoZSBkZXNrdG9wIGFwcCBjYW4gYWN0dWFsbHkgcnVuLlxuICpcbiAqIFJlYWRzIHtAbGluayBERVNLVE9QX1JFTEVBU0VTX0pTT05fVVJMfSwgbm90IHRoZSBHaXRIdWIgYHJlbGVhc2VzL2xhdGVzdGAgQVBJLiBUaGUgQVBJIHJldHVybnMgdGhlIG5ld2VzdFxuICogcmVsZWFzZSBvZiBBTlkga2luZCwgc28gd2hlbmV2ZXIgYSBtb2JpbGUtb25seSByZWxlYXNlIChhbiBBUEstb25seSBhc3NldCkgaXMgbmV3ZXIgdGhhbiB0aGUgZGVza3RvcCBvbmUsXG4gKiBpdCByZXBvcnRzIGEgdmVyc2lvbiB0aGF0IGRvZXMgbm90IGV4aXN0IGZvciBkZXNrdG9wLiBBIHBsdWdpbiByZWxlYXNlZCBpbiB0aGF0IHdpbmRvdyBnZXRzIGFcbiAqIGBtaW5BcHBWZXJzaW9uYCBubyBkZXNrdG9wIHVzZXIgY2FuIHNhdGlzZnksIGFuZCBPYnNpZGlhbiBzaWxlbnRseSBrZWVwcyBvZmZlcmluZyB0aGVtIHRoZSBwcmV2aW91c1xuICogcmVsZWFzZSBpbnN0ZWFkIFx1MjAxNCB0aGUgcmVsZWFzZSBzdWNjZWVkcyBhbmQgcmVhY2hlcyBub2JvZHkuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbGF0ZXN0IE9ic2lkaWFuIHZlcnNpb24gYXZhaWxhYmxlIGZvciBkZXNrdG9wLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RPYnNpZGlhblZlcnNpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyAtLSBXZSBydW4gdGhpcyBvdXRzaWRlIG9mIE9ic2lkaWFuLCBzbyB3ZSBkb24ndCBoYXZlIGByZXF1ZXN0VXJsKClgLlxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKERFU0tUT1BfUkVMRUFTRVNfSlNPTl9VUkwpO1xuICBjb25zdCBkZXNrdG9wUmVsZWFzZXNKc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIFBhcnRpYWw8RGVza3RvcFJlbGVhc2VzSnNvbj47XG4gIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZShkZXNrdG9wUmVsZWFzZXNKc29uLmxhdGVzdFZlcnNpb24sICdDb3VsZCBub3QgZmluZCB0aGUgbGF0ZXN0IGRlc2t0b3AgT2JzaWRpYW4gdmVyc2lvbicpO1xufVxuXG5mdW5jdGlvbiBpc1ByZVJlbGVhc2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcmVyZWxlYXNlKHZlcnNpb24pICE9PSBudWxsO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBzaW5nbGUgcGFjayByZXN1bHQgZnJvbSB0aGUgb3V0cHV0IG9mIGBucG0gcGFjayAtLWpzb25gLlxuICpcbiAqIFR3byB0aGluZ3MgbWFrZSB0aGlzIG1vcmUgdGhhbiBhIGBKU09OLnBhcnNlKClgLiBUaGUgcGF5bG9hZCBpcyBQUkVDRURFRCBvbiBzdGRvdXQgYnkgd2hhdGV2ZXIgdGhlXG4gKiBgcHJlcGFyZWAgc2NyaXB0IHByaW50ZWQgKHRoZSBgbnBtIG5vdGljZWAgbGluZXMgZ28gdG8gc3RkZXJyLCBub3QgaGVyZSksIHNvIGl0cyBzdGFydCBoYXMgdG8gYmUgZm91bmQgXHUyMDE0XG4gKiBhbmQgaXQgaXMgZm91bmQgYnkgcGFyc2luZyBmcm9tIGVhY2ggY2FuZGlkYXRlIHN0YXJ0IHJhdGhlciB0aGFuIGJ5IG1hdGNoaW5nIGEgbGl0ZXJhbCwgYmVjYXVzZSB0aGVcbiAqIHByZWZpeCBtYXkgaXRzZWxmIGNvbnRhaW4gYSBicmFjZS4gQW5kIHRoZSBwYXlsb2FkJ3MgU0hBUEUgZGVwZW5kcyBvbiB0aGUgbnBtIG1ham9yOiBucG0gMTEgYW5kIGVhcmxpZXJcbiAqIGVtaXQgYW4gYXJyYXkgb2YgcGFjayByZXN1bHRzLCBucG0gMTIgZW1pdHMgYW4gb2JqZWN0IGtleWVkIGJ5IHBhY2thZ2UgbmFtZS4gQm90aCBhcmUgYWNjZXB0ZWQ7IHNjYW5uaW5nXG4gKiBmb3IgdGhlIGFycmF5J3MgbGl0ZXJhbCBvcGVuaW5nIGlzIHdoYXQgYnJva2UgZXZlcnkgcmVsZWFzZSBvbiBucG0gMTIgKFQ4MDYpLlxuICpcbiAqIEBwYXJhbSBvdXRwdXQgLSBUaGUgc3Rkb3V0IG9mIGBucG0gcGFjayAtLWpzb25gLlxuICogQHJldHVybnMgVGhlIHtAbGluayBOcG1QYWNrUmVzdWx0fSBkZXNjcmliaW5nIHRoZSBwYWNrZWQgdGFyYmFsbC5cbiAqIEB0aHJvd3MgSWYgdGhlIG91dHB1dCBob2xkcyBubyBwYXJzYWJsZSBKU09OIHBheWxvYWQsIG9yIHRoZSBwYXlsb2FkIGhvbGRzIG5vIHBhY2sgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBwYXJzZU5wbVBhY2tPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBOcG1QYWNrUmVzdWx0IHtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiBvdXRwdXQubWF0Y2hBbGwoL1tbe10vZykpIHtcbiAgICBsZXQgcGF5bG9hZDogdW5rbm93bjtcblxuICAgIHRyeSB7XG4gICAgICBwYXlsb2FkID0gSlNPTi5wYXJzZShvdXRwdXQuc2xpY2UobWF0Y2guaW5kZXgpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdHMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCBhcyBOcG1QYWNrUmVzdWx0W10gOiBPYmplY3QudmFsdWVzKHBheWxvYWQgYXMgUmVjb3JkPHN0cmluZywgTnBtUGFja1Jlc3VsdD4pO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHNbMF07XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBubyBwYWNrIHJlc3VsdCBpbiB0aGUgYG5wbSBwYWNrIC0tanNvbmAgb3V0cHV0Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZpbmQgdGhlIEpTT04gcGF5bG9hZCBpbiB0aGUgYG5wbSBwYWNrIC0tanNvbmAgb3V0cHV0Jyk7XG59XG5cbi8qKlxuICogQ29tcG9zZXMgdGhlIGZ1bGwgbmV3IGBDSEFOR0VMT0cubWRgIGNvbnRlbnQgXHUyMDE0IGluY2x1ZGluZyB0aGUgaW50ZXJhY3RpdmUgcmV2aWV3LCB3aGVuIG9uZSBpcyBkdWUgXHUyMDE0XG4gKiBXSVRIT1VUIHRvdWNoaW5nIHRoZSByZXBvc2l0b3J5LiBOb3RoaW5nIGhlcmUgd3JpdGVzIGludG8gdGhlIHJlcG8sIHNvIGFuIGludGVycnVwdCBhbnl3aGVyZSBpbiB0aGVcbiAqIHJldmlldyB3aW5kb3cgKHRoZSB3aG9sZSBwb2ludCBvZiB0aGUgc3BsaXQpIGxlYXZlcyB0aGUgd29ya2luZyB0cmVlIGV4YWN0bHkgYXMgaXQgd2FzLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB0aGUgY2hhbmdlbG9nIHNlY3Rpb24gaXMgd3JpdHRlbiBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVXBkYXRlQ2hhbmdlbG9nT3B0aW9uc30gY29udHJvbGxpbmcgd2hlcmUgdGhlIHNlY3Rpb24gYm9keSBjb21lcyBmcm9tLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgc2V0dGxlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50LlxuICovXG5hc3luYyBmdW5jdGlvbiBwcmVwYXJlQ2hhbmdlbG9nKG5ld1ZlcnNpb246IHN0cmluZywgb3B0aW9uczogVXBkYXRlQ2hhbmdlbG9nT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtcbiAgICBjaGFuZ2Vsb2dGaWxlUGF0aCxcbiAgICBzaG91bGRFZGl0Q2hhbmdlbG9nID0gdHJ1ZVxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgSEVBREVSX0xJTkVTX0NPVU5UID0gMjtcbiAgY29uc3QgY2hhbmdlbG9nUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSk7XG4gIGxldCBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzOiBzdHJpbmdbXTtcbiAgaWYgKGV4aXN0c1N5bmMoY2hhbmdlbG9nUGF0aCkpIHtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoY2hhbmdlbG9nUGF0aCwgJ3V0Zi04Jyk7XG4gICAgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpLnNsaWNlKEhFQURFUl9MSU5FU19DT1VOVCk7XG4gICAgaWYgKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMuYXQoLTEpID09PSAnJykge1xuICAgICAgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcy5wb3AoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcyA9IFtdO1xuICB9XG5cbiAgbGV0IG5ld0NoYW5nZUxvZyA9IGAjIENIQU5HRUxPR1xcblxcbiMjICR7bmV3VmVyc2lvbn1cXG5cXG5gO1xuXG4gIGlmIChjaGFuZ2Vsb2dGaWxlUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbGFzdFRhZyA9IHJlcGxhY2VBbGwoe1xuICAgICAgJHN0cmluZzogcHJldmlvdXNDaGFuZ2Vsb2dMaW5lc1swXSA/PyAnJyxcbiAgICAgIHJlcGxhY2VyOiAnJyxcbiAgICAgIHNlYXJjaFZhbHVlOiAnIyMgJ1xuICAgIH0pO1xuICAgIC8vIEEgaGVhZGluZyBpcyBub3QgYSB0YWcuIEEgaGFuZC13cml0dGVuIGAjIyAwLjAuMGAgcGxhY2Vob2xkZXIgaW4gYSBuZXZlci10YWdnZWQgcmVwbywgb3IgYSB0YWcgZGVsZXRlZFxuICAgIC8vIEFmdGVyIHRoZSBmYWN0LCB3b3VsZCBvdGhlcndpc2UgcmVhY2ggYGdpdCBsb2dgIGFzIGEgcmV2aXNpb24gaXQgY2Fubm90IHJlc29sdmUgXHUyMDE0IGFuZCBpdCByZWFjaGVzIGl0IGF0XG4gICAgLy8gVGhlIHZlcnkgRU5EIG9mIHRoZSByZWxlYXNlLCBhZnRlciB0aGUgd2hvbGUgcHJlZmxpZ2h0IGhhcyBhbHJlYWR5IGJlZW4gcGFpZCBmb3IuIEZhbGxpbmcgYmFjayB0byB0aGVcbiAgICAvLyBGdWxsIGhpc3Rvcnkgb3Zlci1pbmNsdWRlcyB3aGVuIGEgdGFnIHdhcyBkZWxldGVkLCBidXQgdGhhdCBpcyBzYWZlIGFuZCB2aXNpYmxlOiB0aGUgcmV2aWV3IHN0ZXAganVzdFxuICAgIC8vIEJlbG93IGlzIGV4YWN0bHkgd2hlcmUgaXQgZ2V0cyB0cmltbWVkLlxuICAgIGNvbnN0IHJlc29sdmVkTGFzdFRhZyA9IGxhc3RUYWdcbiAgICAgID8gYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2l0JywgJ3Jldi1wYXJzZScsICctLXZlcmlmeScsICctLXF1aWV0JywgYHJlZnMvdGFncy8ke2xhc3RUYWd9YF0sIHtcbiAgICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgICAgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWVcbiAgICAgIH0pXG4gICAgICA6ICcnO1xuXG4gICAgaWYgKGxhc3RUYWcgJiYgIXJlc29sdmVkTGFzdFRhZykge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKShcbiAgICAgICAgYCR7T2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWR9IHN0YXJ0cyBhdCAnIyMgJHtsYXN0VGFnfScsIGJ1dCBubyBzdWNoIHRhZyBleGlzdHMuIEdlbmVyYXRpbmcgdGhlIGNoYW5nZWxvZyBmcm9tIHRoZSBmdWxsIGhpc3RvcnkgaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1pdFJhbmdlID0gcmVzb2x2ZWRMYXN0VGFnID8gYCR7bGFzdFRhZ30uLkhFQURgIDogJ0hFQUQnO1xuICAgIGNvbnN0IGNvbW1pdE1lc3NhZ2VzU3RyaW5nID0gYXdhaXQgZXhlY0Zyb21Sb290KGBnaXQgbG9nICR7Y29tbWl0UmFuZ2V9IC0tZm9ybWF0PSVCIC0tZmlyc3QtcGFyZW50IC16YCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIGNvbnN0IGNvbW1pdE1lc3NhZ2VzID0gY29tbWl0TWVzc2FnZXNTdHJpbmcuc3BsaXQoJ1xcMCcpLmZpbHRlcihCb29sZWFuKS5tYXAoKGNvbW1pdE1lc3NhZ2UpID0+IHRvRmlyc3RMaW5lKGNvbW1pdE1lc3NhZ2UpKTtcblxuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBjb21taXRNZXNzYWdlcykge1xuICAgICAgbmV3Q2hhbmdlTG9nICs9IGAtICR7YXV0b2xpbmtCYXJlVXJscyhtZXNzYWdlKX1cXG5gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcmVwYXJlZE5vdGVzID0gYXdhaXQgcmVhZEZpbGUoY2hhbmdlbG9nRmlsZVBhdGgsICd1dGYtOCcpO1xuICAgIG5ld0NoYW5nZUxvZyArPSBgJHtyZXBsYWNlQWxsKHsgJHN0cmluZzogcHJlcGFyZWROb3RlcywgcmVwbGFjZXI6ICdcXG4nLCBzZWFyY2hWYWx1ZTogJ1xcclxcbicgfSkudHJpbSgpfVxcbmA7XG4gIH1cblxuICBpZiAocHJldmlvdXNDaGFuZ2Vsb2dMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgbmV3Q2hhbmdlTG9nICs9ICdcXG4nO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzKSB7XG4gICAgICBuZXdDaGFuZ2VMb2cgKz0gYCR7bGluZX1cXG5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByZXBhcmVkIG5vdGVzIGFyZSBhbHJlYWR5IHRoZSByZXZpZXdlZCB0ZXh0LCBzbyB0aGV5IG5ldmVyIG9wZW4gYW4gZWRpdG9yLCB3aGF0ZXZlciBgc2hvdWxkRWRpdENoYW5nZWxvZ2Agc2F5cy5cbiAgaWYgKGNoYW5nZWxvZ0ZpbGVQYXRoICE9PSB1bmRlZmluZWQgfHwgIXNob3VsZEVkaXRDaGFuZ2Vsb2cpIHtcbiAgICByZXR1cm4gbmV3Q2hhbmdlTG9nO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IHJldmlld0NoYW5nZWxvZyhuZXdDaGFuZ2VMb2cpO1xufVxuXG4vKipcbiAqIEhhbmRzIHRoZSBjb21wb3NlZCBjaGFuZ2Vsb2cgdG8gdGhlIHVzZXIgZm9yIHJldmlldyBvbiBhIHNjcmF0Y2ggY29weSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LCBhbmRcbiAqIHJldHVybnMgd2hhdGV2ZXIgdGhleSBsZWZ0IGJlaGluZC4gVGhlIHNjcmF0Y2ggZm9sZGVyIGlzIHJlbW92ZWQgZXZlbiB3aGVuIHRoZSByZXZpZXcgZmFpbHMuXG4gKlxuICogQHBhcmFtIG5ld0NoYW5nZUxvZyAtIFRoZSBjb21wb3NlZCBgQ0hBTkdFTE9HLm1kYCBjb250ZW50IHRvIGhhbmQgb3ZlciBmb3IgcmV2aWV3LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmV2aWV3ZWQgY29udGVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmV2aWV3Q2hhbmdlbG9nKG5ld0NoYW5nZUxvZzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc2NyYXRjaEZvbGRlciA9IGF3YWl0IG1rZHRlbXAoam9pbih0bXBkaXIoKSwgJ29ic2lkaWFuLWRldi11dGlscy1jaGFuZ2Vsb2ctJykpO1xuICBjb25zdCBzY3JhdGNoQ2hhbmdlbG9nUGF0aCA9IGpvaW4oc2NyYXRjaEZvbGRlciwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWQpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHNjcmF0Y2hDaGFuZ2Vsb2dQYXRoLCBuZXdDaGFuZ2VMb2csICd1dGYtOCcpO1xuXG4gICAgY29uc3QgY29kZVZlcnNpb24gPSBhd2FpdCBleGVjRnJvbVJvb3QoJ2NvZGUgLS12ZXJzaW9uJywge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgfSk7XG4gICAgY29uc3QgdmVyc2lvbkRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKTtcbiAgICBpZiAoY29kZVZlcnNpb24pIHtcbiAgICAgIHZlcnNpb25EZWJ1Z2dlcihgUGxlYXNlIHVwZGF0ZSB0aGUgJHtPYnNpZGlhblBsdWdpblJlcG9QYXRocy5DaGFuZ2Vsb2dNZH0gZmlsZS4gQ2xvc2UgVmlzdWFsIFN0dWRpbyBDb2RlIHdoZW4geW91IGFyZSBkb25lLi4uYCk7XG4gICAgICBhd2FpdCBleGVjRnJvbVJvb3QoWydjb2RlJywgJy13Jywgc2NyYXRjaENoYW5nZWxvZ1BhdGhdLCB7XG4gICAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmVyc2lvbkRlYnVnZ2VyKCdDb3VsZCBub3QgZmluZCBWaXN1YWwgU3R1ZGlvIENvZGUgaW4geW91ciBQQVRILiBVc2luZyBjb25zb2xlIG1vZGUgaW5zdGVhZC4nKTtcbiAgICAgIGF3YWl0IGNyZWF0ZUludGVyZmFjZShwcm9jZXNzLnN0ZGluLCBwcm9jZXNzLnN0ZG91dCkucXVlc3Rpb24oXG4gICAgICAgIGBQbGVhc2UgdXBkYXRlIHRoZSAke3NjcmF0Y2hDaGFuZ2Vsb2dQYXRofSBmaWxlLiBQcmVzcyBFbnRlciB3aGVuIHlvdSBhcmUgZG9uZS4uLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlYWRGaWxlKHNjcmF0Y2hDaGFuZ2Vsb2dQYXRoLCAndXRmLTgnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBybShzY3JhdGNoRm9sZGVyLCB7XG4gICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZVxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvRmlyc3RMaW5lKCRzdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAkc3RyaW5nLnNwbGl0KC9cXHI/XFxuLykuZmlsdGVyKEJvb2xlYW4pLnNsaWNlKDAsIDEpLmpvaW4oJycpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVWZXJzaW9uSW5GaWxlc0ZvclBsdWdpbihuZXdWZXJzaW9uOiBzdHJpbmcsIG1pbkFwcFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtYW5pZmVzdEJldGFKc29uUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RCZXRhSnNvbiB9KTtcbiAgaWYgKGlzUHJlUmVsZWFzZShuZXdWZXJzaW9uKSkge1xuICAgIGF3YWl0IGNwKFxuICAgICAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24gfSksXG4gICAgICBtYW5pZmVzdEJldGFKc29uUGF0aCxcbiAgICAgIHsgZm9yY2U6IHRydWUgfVxuICAgICk7XG4gICAgYXdhaXQgZWRpdEpzb248TWFuaWZlc3Q+KHtcbiAgICAgIGVkaXRGdW5jdGlvbjogKG1hbmlmZXN0KSA9PiB7XG4gICAgICAgIG1hbmlmZXN0LnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgICAgfSxcbiAgICAgIHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0QmV0YUpzb25cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCByZXNvbHZlZE1pbkFwcFZlcnNpb24gPSBtaW5BcHBWZXJzaW9uID8/IGF3YWl0IGdldExhdGVzdE9ic2lkaWFuVmVyc2lvbigpO1xuXG4gICAgYXdhaXQgZWRpdEpzb248TWFuaWZlc3Q+KHtcbiAgICAgIGVkaXRGdW5jdGlvbjogKG1hbmlmZXN0KSA9PiB7XG4gICAgICAgIG1hbmlmZXN0Lm1pbkFwcFZlcnNpb24gPSByZXNvbHZlZE1pbkFwcFZlcnNpb247XG4gICAgICAgIG1hbmlmZXN0LnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgICAgfSxcbiAgICAgIHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvblxuICAgIH0pO1xuXG4gICAgYXdhaXQgZWRpdEpzb248UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oe1xuICAgICAgZWRpdEZ1bmN0aW9uOiAodmVyc2lvbnMpID0+IHtcbiAgICAgICAgdmVyc2lvbnNbbmV3VmVyc2lvbl0gPSByZXNvbHZlZE1pbkFwcFZlcnNpb247XG4gICAgICB9LFxuICAgICAgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuVmVyc2lvbnNKc29uXG4gICAgfSk7XG5cbiAgICBpZiAoZXhpc3RzU3luYyhtYW5pZmVzdEJldGFKc29uUGF0aCkpIHtcbiAgICAgIGF3YWl0IHJtKG1hbmlmZXN0QmV0YUpzb25QYXRoKTtcbiAgICB9XG4gIH1cblxuICBhd2FpdCBjb3B5VXBkYXRlZE1hbmlmZXN0KCk7XG59XG5cbi8qKlxuICogV3JpdGVzIHRoZSBjb21wb3NlZCBjaGFuZ2Vsb2cgaW50byB0aGUgcmVwb3NpdG9yeS4gRGVsaWJlcmF0ZWx5IHRoZSBsYXN0IHRoaW5nIHRoZSBjaGFuZ2Vsb2cgc3RlcCBkb2VzLFxuICogc28gbm90aGluZyBsYW5kcyBvbiBkaXNrIHVudGlsIHRoZSBjb250ZW50IGlzIHNldHRsZWQuXG4gKlxuICogQHBhcmFtIG5ld0NoYW5nZUxvZyAtIFRoZSBzZXR0bGVkIGBDSEFOR0VMT0cubWRgIGNvbnRlbnQgdG8gd3JpdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGNoYW5nZWxvZyBoYXMgYmVlbiB3cml0dGVuLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNoYW5nZWxvZyhuZXdDaGFuZ2VMb2c6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCB3cml0ZUZpbGUocmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5DaGFuZ2Vsb2dNZCB9KSwgbmV3Q2hhbmdlTG9nLCAndXRmLTgnKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXQSxTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLGlCQUFpQjtBQUMxQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUlQLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsK0JBQStCO0FBQ3hDLFNBQVMsWUFBWTtBQUNyQixT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
@@ -0,0 +1,10 @@
1
+ import process from 'node:process';
2
+ import { wrapCliTask } from 'obsidian-dev-utils/script-utils/cli-utils';
3
+ import {
4
+ gate,
5
+ parseGateArguments
6
+ } from 'obsidian-dev-utils/script-utils/gate';
7
+
8
+ const [, , ...$arguments] = process.argv;
9
+ const options = parseGateArguments($arguments);
10
+ await wrapCliTask(() => gate(options));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "101.4.0",
3
+ "version": "101.5.0",
4
4
  "description": "This is the collection of useful functions that you can use for your Obsidian plugin development.",
5
5
  "keywords": [
6
6
  "obsidian"
@@ -656,6 +656,7 @@
656
656
  "find-overexposed:fix": "jiti scripts/find-overexposed-fix.ts",
657
657
  "format": "jiti scripts/format.ts",
658
658
  "format:check": "jiti scripts/format-check.ts",
659
+ "gate": "jiti scripts/gate.ts",
659
660
  "lint": "jiti scripts/lint.ts",
660
661
  "lint:fix": "jiti scripts/lint-fix.ts",
661
662
  "lint:md": "jiti scripts/lint-md.ts",
@@ -670,7 +671,7 @@
670
671
  "version": "jiti scripts/version.ts"
671
672
  },
672
673
  "overrides": {
673
- "@puppeteer/browsers": "^3.2.1",
674
+ "@puppeteer/browsers": "^3.2.2",
674
675
  "@typescript-eslint/eslint-plugin": "$@typescript-eslint/eslint-plugin",
675
676
  "@typescript-eslint/parser": "$@typescript-eslint/parser",
676
677
  "@vitest/coverage-v8": "$@vitest/coverage-v8",
@@ -679,6 +680,7 @@
679
680
  "eslint-plugin-import": "npm:eslint-plugin-import-x@^4.17.1",
680
681
  "eslint-plugin-json-schema-validator": "^6.3.1",
681
682
  "eslint-plugin-n": "$eslint-plugin-n",
683
+ "fflate": "^0.7.5",
682
684
  "glob": "^13.0.6",
683
685
  "js-yaml": "4.3.1",
684
686
  "markdown-it": "^15.0.1",
@@ -711,21 +713,21 @@
711
713
  "@typescript-eslint/parser": "^8.69.0",
712
714
  "adm-zip": "^0.6.0",
713
715
  "compare-versions": "^6.1.1",
714
- "cspell": "^10.2.0",
716
+ "cspell": "^10.2.1",
715
717
  "debug": "^4.4.3",
716
- "dprint": "^0.57.0",
718
+ "dprint": "^0.57.1",
717
719
  "esbuild": "^0.28.2",
718
720
  "esbuild-sass-plugin": "^3.7.0",
719
721
  "esbuild-svelte": "^0.9.5",
720
722
  "eslint": "^10.9.1",
721
723
  "eslint-import-resolver-typescript": "^4.4.5",
722
724
  "eslint-plugin-import-x": "^4.17.1",
723
- "eslint-plugin-jsdoc": "^64.3.3",
725
+ "eslint-plugin-jsdoc": "^64.3.5",
724
726
  "eslint-plugin-obsidianmd": "^0.4.2",
725
727
  "eslint-plugin-perfectionist": "^5.11.0",
726
728
  "eslint-plugin-tsdoc": "^0.5.2",
727
729
  "eslint-plugin-unicorn": "^74.0.0",
728
- "i18next": "^26.4.1",
730
+ "i18next": "^26.4.2",
729
731
  "jiti": "^2.7.0",
730
732
  "localforage": "^1.10.0",
731
733
  "markdownlint": "^0.41.1",
@@ -734,14 +736,14 @@
734
736
  "monkey-around": "^3.0.0",
735
737
  "obsidian": "^1.13.1",
736
738
  "path-browserify": "^1.0.1",
737
- "postcss": "^8.5.26",
739
+ "postcss": "^8.5.28",
738
740
  "postcss-modules": "^9.0.1",
739
741
  "preact": "^10.29.8",
740
742
  "react": "^19.2.8",
741
743
  "remark": "^15.0.1",
742
744
  "remark-parse": "^11.0.0",
743
745
  "remark-wiki-link": "^2.0.1",
744
- "sass": "^1.103.1",
746
+ "sass": "^1.104.0",
745
747
  "semver": "^7.8.5",
746
748
  "svelte-check": "^4.7.6",
747
749
  "svelte-preprocess": "^6.0.5",
@@ -751,7 +753,7 @@
751
753
  },
752
754
  "devDependencies": {
753
755
  "@astrojs/markdown-remark": "^7.3.0",
754
- "@astrojs/starlight": "^0.41.11",
756
+ "@astrojs/starlight": "^0.42.0",
755
757
  "@commitlint/cli": "^21.2.2",
756
758
  "@commitlint/config-conventional": "^21.2.2",
757
759
  "@commitlint/types": "^21.2.0",
@@ -760,8 +762,8 @@
760
762
  "@total-typescript/ts-reset": "^0.6.1",
761
763
  "@types/adm-zip": "^0.5.8",
762
764
  "@typescript-eslint/rule-tester": "^8.69.0",
763
- "@vitest/coverage-v8": "^4.1.11",
764
- "astro": "^7.2.10",
765
+ "@vitest/coverage-v8": "^5.0.0",
766
+ "astro": "^7.3.1",
765
767
  "better-typescript-lib": "^2.12.0",
766
768
  "czg": "^1.14.0",
767
769
  "dedent": "^1.7.2",
@@ -772,14 +774,14 @@
772
774
  "moment": "^2.30.1",
773
775
  "nano-staged": "^1.0.2",
774
776
  "obsidian-integration-testing": "^12.0.0",
775
- "obsidian-test-mocks": "^4.2.1",
777
+ "obsidian-test-mocks": "^5.0.0",
776
778
  "satori": "^0.33.4",
777
779
  "starlight-github-alerts": "^0.4.0",
778
780
  "ts-declaration-location": "^1.0.7",
779
781
  "ts-morph": "^28.0.0",
780
782
  "typedoc-plugin-mdn-links": "^5.1.1",
781
783
  "unist-util-visit": "^5.1.0",
782
- "vitest": "^4.1.11",
784
+ "vitest": "^5.0.0",
783
785
  "yaml": "^2.9.0"
784
786
  },
785
787
  "peerDependencies": {
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../dist/lib/cjs/script-utils/gate.cjs",
3
+ "module": "../../dist/lib/esm/script-utils/gate.mjs",
4
+ "type": "module",
5
+ "types": "../../dist/lib/cjs/script-utils/gate.d.cts"
6
+ }