obsidian-dev-utils 101.6.0 → 101.7.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 (64) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/integration-test-plugin/main.js +4410 -3705
  3. package/dist/lib/cjs/__merged.cjs +26 -1
  4. package/dist/lib/cjs/__merged.d.cts +4 -1
  5. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  6. package/dist/lib/cjs/obsidian/components/component-ex.cjs +14 -1
  7. package/dist/lib/cjs/obsidian/components/component-ex.d.cts +11 -0
  8. package/dist/lib/cjs/obsidian/components/index.cjs +4 -1
  9. package/dist/lib/cjs/obsidian/components/index.d.cts +1 -0
  10. package/dist/lib/cjs/obsidian/components/plugin-gate-component.cjs +520 -0
  11. package/dist/lib/cjs/obsidian/components/plugin-gate-component.d.cts +299 -0
  12. package/dist/lib/cjs/obsidian/components/plugin-suggestion-component.cjs +17 -38
  13. package/dist/lib/cjs/obsidian/components/plugin-suggestion-component.d.cts +25 -18
  14. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +7 -2
  15. package/dist/lib/cjs/obsidian/css-class.cjs +3 -1
  16. package/dist/lib/cjs/obsidian/css-class.d.cts +9 -0
  17. package/dist/lib/cjs/obsidian/html-element.cjs +27 -3
  18. package/dist/lib/cjs/obsidian/html-element.d.cts +36 -0
  19. package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +15 -1
  20. package/dist/lib/cjs/obsidian/i18n/locales/en.d.cts +14 -0
  21. package/dist/lib/cjs/obsidian/i18n/locales/translations-map.d.cts +14 -0
  22. package/dist/lib/cjs/obsidian/plugin/index.cjs +7 -1
  23. package/dist/lib/cjs/obsidian/plugin/index.d.cts +2 -0
  24. package/dist/lib/cjs/obsidian/plugin/plugin-api.cjs +2 -2
  25. package/dist/lib/cjs/obsidian/plugin/plugin-api.d.cts +34 -15
  26. package/dist/lib/cjs/obsidian/plugin/plugin-install-state.cjs +208 -0
  27. package/dist/lib/cjs/obsidian/plugin/plugin-install-state.d.cts +113 -0
  28. package/dist/lib/cjs/obsidian/plugin/plugin-lifecycle-events.cjs +161 -0
  29. package/dist/lib/cjs/obsidian/plugin/plugin-lifecycle-events.d.cts +119 -0
  30. package/dist/lib/cjs/obsidian/plugin/plugin.cjs +241 -21
  31. package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +133 -4
  32. package/dist/lib/esm/__merged.d.mts +4 -1
  33. package/dist/lib/esm/__merged.mjs +30 -2
  34. package/dist/lib/esm/generated-during-build.mjs +1 -1
  35. package/dist/lib/esm/obsidian/components/component-ex.d.mts +11 -0
  36. package/dist/lib/esm/obsidian/components/component-ex.mjs +14 -1
  37. package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
  38. package/dist/lib/esm/obsidian/components/index.mjs +3 -1
  39. package/dist/lib/esm/obsidian/components/plugin-gate-component.d.mts +299 -0
  40. package/dist/lib/esm/obsidian/components/plugin-gate-component.mjs +428 -0
  41. package/dist/lib/esm/obsidian/components/plugin-suggestion-component.d.mts +25 -18
  42. package/dist/lib/esm/obsidian/components/plugin-suggestion-component.mjs +21 -41
  43. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +7 -2
  44. package/dist/lib/esm/obsidian/css-class.d.mts +9 -0
  45. package/dist/lib/esm/obsidian/css-class.mjs +3 -1
  46. package/dist/lib/esm/obsidian/html-element.d.mts +36 -0
  47. package/dist/lib/esm/obsidian/html-element.mjs +24 -2
  48. package/dist/lib/esm/obsidian/i18n/locales/en.d.mts +14 -0
  49. package/dist/lib/esm/obsidian/i18n/locales/en.mjs +15 -1
  50. package/dist/lib/esm/obsidian/i18n/locales/translations-map.d.mts +14 -0
  51. package/dist/lib/esm/obsidian/plugin/index.d.mts +2 -0
  52. package/dist/lib/esm/obsidian/plugin/index.mjs +5 -1
  53. package/dist/lib/esm/obsidian/plugin/plugin-api.d.mts +34 -15
  54. package/dist/lib/esm/obsidian/plugin/plugin-api.mjs +2 -2
  55. package/dist/lib/esm/obsidian/plugin/plugin-install-state.d.mts +113 -0
  56. package/dist/lib/esm/obsidian/plugin/plugin-install-state.mjs +106 -0
  57. package/dist/lib/esm/obsidian/plugin/plugin-lifecycle-events.d.mts +119 -0
  58. package/dist/lib/esm/obsidian/plugin/plugin-lifecycle-events.mjs +54 -0
  59. package/dist/lib/esm/obsidian/plugin/plugin.d.mts +133 -4
  60. package/dist/lib/esm/obsidian/plugin/plugin.mjs +245 -21
  61. package/obsidian/components/plugin-gate-component/package.json +6 -0
  62. package/obsidian/plugin/plugin-install-state/package.json +6 -0
  63. package/obsidian/plugin/plugin-lifecycle-events/package.json +6 -0
  64. package/package.json +1 -1
@@ -336,7 +336,7 @@ function publishPluginApi(params) {
336
336
  };
337
337
  records.push(record);
338
338
  notifySubscribers();
339
- params.plugin.register(() => {
339
+ (params.component ?? params.plugin).register(() => {
340
340
  revokeRecord(record);
341
341
  });
342
342
  }
@@ -528,4 +528,4 @@ function validatePayload(params) {
528
528
  publishPluginApi,
529
529
  watchPluginApi
530
530
  });
531
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4tYXBpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSB0eXBlZCwgdmVyc2lvbmVkLCBsaWZlY3ljbGUtYXdhcmUgcmVnaXN0cnkgZm9yIGNyb3NzLXBsdWdpbiBBUElzIFx1MjAxNCB0aGUgYWR2YW5jZWQgc3VjY2Vzc29yIHRvXG4gKiBgQHZhbmFrYXQvcGx1Z2luLWFwaWAuXG4gKlxuICogQSBwcm92aWRlciBwdWJsaXNoZXMgaXRzIEFQSSBvbmNlLCB1bmRlciBhIGNvbnRyYWN0IHZlcnNpb24gdGhhdCBpcyBpbmRlcGVuZGVudCBvZiBpdHMgcGx1Z2luIHZlcnNpb246XG4gKlxuICogYGBgdHNcbiAqIHB1Ymxpc2hQbHVnaW5BcGkoe1xuICogICBhcGk6IG5ldyBNeUFwaSh0aGlzKSxcbiAqICAgYXBpVmVyc2lvbjogJzIuMS4wJyxcbiAqICAgY29udHJhY3Q6IE1ZX0FQSV9DT05UUkFDVF9WMixcbiAqICAgcGx1Z2luOiB0aGlzXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEEgY29uc3VtZXIgZ2V0cyBhIExJVkUgUkVGIHdob3NlIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9IGlzIGFsd2F5cyBjdXJyZW50IFx1MjAxNCBgbnVsbGAgYmVmb3JlIHRoZVxuICogcHJvdmlkZXIgbG9hZHMsIHRoZSBBUEkgb25jZSBpdCBwdWJsaXNoZXMsIGBudWxsYCBhZ2FpbiBvbmNlIGl0IHVubG9hZHMsIGFuZCB0aGUgQVBJIGFnYWluIGFmdGVyIGFcbiAqIHJlLWVuYWJsZTpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVmID0gd2F0Y2hQbHVnaW5BcGk8TXlBcGk+KHtcbiAqICAgYXBpVmVyc2lvblJhbmdlOiAnXjInLFxuICogICBhcHA6IHRoaXMuYXBwLFxuICogICBjb21wb25lbnQ6IHRoaXMsXG4gKiAgIHBsdWdpbklkOiAnbXktcHJvdmlkZXInXG4gKiB9KTtcbiAqXG4gKiByZWYudmFsdWU7ICAgICAgICAgICAgICAgICAgICAvLyBNeUFwaSB8IG51bGwgXHUyMDE0IHN5bmMsIGZyZWUsIGFsd2F5cyBjb3JyZWN0XG4gKiBhd2FpdCByZWYud2hlbkF2YWlsYWJsZSgpOyAgICAvLyBvbmUtc2hvdCBmbG93czsgcmVqZWN0cyB3aXRoIGEgdHlwZWQsIGNsYXNzaWZpZWQgZXJyb3JcbiAqIHJlZi5vbignY2hhbmdlJywgKCkgPT4geyB9KTsgLy8gZm9yIGNvbnN1bWVycyB0aGF0IG11c3QgUkVBQ1QgcmF0aGVyIHRoYW4gcmVhZFxuICogYGBgXG4gKlxuICogV2hhdCB0aGlzIGZpeGVzLCByZWxhdGl2ZSB0byBwdWJsaXNoaW5nIGEgYmFyZSBvYmplY3Qgb24gYHdpbmRvdy5QbHVnaW5BcGlgOlxuICpcbiAqIC0gKipMb2FkIG9yZGVyLioqIFRoZSByZWYgc3Vic2NyaWJlczsgaXQgZG9lcyBub3Qgc2FtcGxlLiBSZWFkaW5nIGBudWxsYCBkdXJpbmcgYG9ubG9hZGAgbWVhbnMgXCJub3QgeWV0XCIsXG4gKiAgIGFuZCBpdCBiZWNvbWVzIG5vbi1gbnVsbGAgb24gaXRzIG93bi5cbiAqIC0gKipWZXJzaW9uIG5lZ290aWF0aW9uLioqIFRoZSBwcm92aWRlciBkZWNsYXJlcyBhIGNvbnRyYWN0IHZlcnNpb247IHRoZSBjb25zdW1lciBkZWNsYXJlcyB0aGUgcmFuZ2UgaXRcbiAqICAgY29tcGlsZWQgYWdhaW5zdDsgdGhlIGhpZ2hlc3Qgc2F0aXNmeWluZyByZWNvcmQgd2lucy5cbiAqIC0gKipTdGFsZSBoYW5kbGVzLioqIFRoZSB2YWx1ZSBpcyBhIHJldm9jYWJsZSBoYW5kbGUgXHUyMDE0IGFmdGVyIHRoZSBwcm92aWRlciB1bmxvYWRzLCBhIHByb3BlcnR5IHJlYWQgdGhyb3dzXG4gKiAgIGEge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0gbmFtaW5nIHRoZSBwcm92aWRlciBpbnN0ZWFkIG9mIGEgbnVsbCBkZXJlZiBkZWVwIGluIHNvbWVvbmUgZWxzZSdzIHN0YWNrLlxuICogLSAqKkZyZWUtc3RyaW5nIG5hbWVzLioqIFJlY29yZHMgYXJlIGtleWVkIGJ5IGBwbHVnaW4ubWFuaWZlc3QuaWRgLCB3aGljaCBPYnNpZGlhbiBhbHJlYWR5IGtlZXBzIHVuaXF1ZS5cbiAqIC0gKipMZWdpYmxlIGZhaWx1cmUuKioge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSByZWplY3RzIHdpdGggYVxuICogICB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gY2FycnlpbmcgYSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb259LCBzbyB0aGUgZml2ZSBkaXN0aW5jdFxuICogICBjYXVzZXMgYXJlIHRvbGQgYXBhcnQuXG4gKlxuICogUGF5bG9hZCB2YWxpZGF0aW9uIGlzIG9wdC1pbiBwZXIgbWV0aG9kIHRocm91Z2gge0BsaW5rIGh0dHBzOi8vc3RhbmRhcmRzY2hlbWEuZGV2IHwgU3RhbmRhcmQgU2NoZW1hfSwgc29cbiAqIHpvZCAvIHZhbGlib3QgLyBhcmt0eXBlIC8gYSBoYW5kLXdyaXR0ZW4gdmFsaWRhdG9yIGFsbCBwbHVnIGluIGFuZCBub25lIG9mIHRoZW0gaXMgYSBkZXBlbmRlbmN5IGhlcmUuIEl0XG4gKiBydW5zIG9ubHkgd2hpbGUgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHM6UGx1Z2luQXBpYCBkZWJ1Z2dlciBpcyBlbmFibGVkLCBzbyBwcm9kdWN0aW9uIHBheXMgbm90aGluZy5cbiAqXG4gKiBAcmVtYXJrc1xuICogRXZlcnkgcGx1Z2luIGJ1bmRsZXMgaXRzIE9XTiBjb3B5IG9mIGBvYnNpZGlhbi1kZXYtdXRpbHNgLCBzbyBhIHJlZ2lzdHJ5IHJlY29yZCBpcyBhIHdpcmUgZm9ybWF0IGJldHdlZW5cbiAqIGRpZmZlcmVudCBsaWJyYXJ5IHZlcnNpb25zIGFuZCBtdXN0IHN0YXkgYmFja3dhcmQtY29tcGF0aWJsZSBmb3JldmVyLiBOb3RoaW5nIGNyb3NzaW5nIGl0IG1heSBiZVxuICogYGluc3RhbmNlb2ZgLWNoZWNrZWQgXHUyMDE0IHJlYWRzIGFyZSBzdHJ1Y3R1cmFsLCBhbmQgb25seSBwbGFpbiBkYXRhIG9iamVjdHMgYW5kIHBsYWluIGZ1bmN0aW9ucyBhcmUgc3RvcmVkLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhbmRhcmRTY2hlbWFWMSB9IGZyb20gJ0BzdGFuZGFyZC1zY2hlbWEvc3BlYyc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ29tcG9uZW50LFxuICBQbHVnaW5cbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIHNhdGlzZmllcyBhcyBzYXRpc2ZpZXNWZXJzaW9uXG59IGZyb20gJ2NvbXBhcmUtdmVyc2lvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jRXZlbnRTb3VyY2UgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJy4uLy4uL2FycmF5LnRzJztcbmltcG9ydCB7IG1peGluQXN5bmNFdmVudHMgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHtcbiAgaW52b2tlQXN5bmNTYWZlbHksXG4gIHJ1bldpdGhUaW1lb3V0XG59IGZyb20gJy4uLy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgY2FzdFRvIH0gZnJvbSAnLi4vLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uLy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5cbmNvbnN0IFBMVUdJTl9BUElfREVCVUdHRVJfTkFNRVNQQUNFID0gJ1BsdWdpbkFwaSc7XG5jb25zdCBQTFVHSU5fQVBJX1JFR0lTVFJZX1NUQVRFX0tFWSA9ICdwbHVnaW5BcGlSZWdpc3RyeSc7XG5cbi8qKlxuICogSG93IGxvbmcge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSB3YWl0cyBiZWZvcmUgZ2l2aW5nIHVwIGFuZCBjbGFzc2lmeWluZyB0aGUgZmFpbHVyZS5cbiAqL1xuY29uc3QgREVGQVVMVF9XSEVOX0FWQUlMQUJMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcblxuLyoqXG4gKiBXaGljaCBoYWxmIG9mIGEgbWV0aG9kIGNhbGwgYSB2YWxpZGF0aW9uIGZhaWx1cmUgY2FtZSBmcm9tLlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BcGlQYXlsb2FkS2luZCB7XG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kJ3MgYXJndW1lbnRzLlxuICAgKi9cbiAgSW5wdXQgPSAnaW5wdXQnLFxuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgT3V0cHV0ID0gJ291dHB1dCdcbn1cblxuLyoqXG4gKiBUaGUgcmVhc29uIGEgcGx1Z2luIEFQSSBjb3VsZCBub3QgYmUgaGFuZGVkIG92ZXIuXG4gKlxuICogVGhlIHdob2xlIHBvaW50IG9mIHRoZSBlbnVtIGlzIHRoYXQgdGhlc2UgYXJlIHRvbGQgYXBhcnQuIGBAdmFuYWthdC9wbHVnaW4tYXBpYCBjYW5ub3QgdGVsbCBhbnkgb2YgdGhlbVxuICogYXBhcnQsIGFuZCBub3QgdW5pZm9ybWx5OiBgTm90SW5zdGFsbGVkYCAvIGBOb3RFbmFibGVkYCAvIGBOb3RQdWJsaXNoZWRgIGFsbCByZWR1Y2UgdG8gb25lIGBOb3RpY2VgIHBsdXNcbiAqIGB1bmRlZmluZWRgLCB3aGlsZSBgVmVyc2lvbk1pc21hdGNoYCAvIGBTaGFwZU1pc21hdGNoYCBwcm9kdWNlIE5PIHNpZ25hbCBhdCBhbGwgXHUyMDE0IGl0IG5ldmVyIGV4YW1pbmVzIHdoYXQgaXRcbiAqIGZvdW5kLCBzbyBpdCBoYW5kcyB0aGUgb2JqZWN0IG92ZXIgYW5kIHRoZSBtaXNtYXRjaCBzdXJmYWNlcyBsYXRlciwgc29tZXdoZXJlIGVsc2UsIGFzIHNvbWVib2R5IGVsc2Unc1xuICogYFR5cGVFcnJvcmAuXG4gKlxuICogQHJlbWFya3NcbiAqIHtAbGluayBQbHVnaW5BcGlSZWYud2hlbkF2YWlsYWJsZX0gY2FuIHJlcG9ydCB0aGUgZmlyc3QgZml2ZTsge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlJldm9rZWR9XG4gKiBpcyBub3Qgb25lIG9mIHRoZW0sIGJlY2F1c2UgaXQgZGVzY3JpYmVzIGEgaGFuZGxlIHRoYXQgV0FTIHZhbGlkIGFuZCBpcyBjYXJyaWVkIGJ5XG4gKiB7QGxpbmsgUGx1Z2luQXBpUmV2b2tlZEVycm9yfSBpbnN0ZWFkLlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIGluc3RhbGxlZCBidXQgbm90IGVuYWJsZWQuXG4gICAqL1xuICBOb3RFbmFibGVkID0gJ25vdEVuYWJsZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhpcyB2YXVsdC5cbiAgICovXG4gIE5vdEluc3RhbGxlZCA9ICdub3RJbnN0YWxsZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZCBidXQgaGFzIG5vdCBwdWJsaXNoZWQgYW55IEFQSS5cbiAgICovXG4gIE5vdFB1Ymxpc2hlZCA9ICdub3RQdWJsaXNoZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgaGFuZGxlIHdhcyB2YWxpZCBidXQgdGhlIHByb3ZpZGVyIGhhcyBzaW5jZSB1bmxvYWRlZCwgc28gaXQgaGFzIGJlZW4gcmV2b2tlZC5cbiAgICovXG4gIFJldm9rZWQgPSAncmV2b2tlZCcsXG5cbiAgLyoqXG4gICAqIEEgcmVjb3JkIHNhdGlzZmllcyB0aGUgcmVxdWVzdGVkIHZlcnNpb24gcmFuZ2UsIGJ1dCB0aGUgQVBJIG9iamVjdCBpcyBtaXNzaW5nIGEgbWV0aG9kIHRoZSBjb250cmFjdFxuICAgKiBkZWNsYXJlcyBcdTIwMTQgdGhlIHByb3ZpZGVyJ3Mgc2hpcHBlZCBzaGFwZSBhbmQgaXRzIGRlY2xhcmVkIHNoYXBlIGRpc2FncmVlLlxuICAgKi9cbiAgU2hhcGVNaXNtYXRjaCA9ICdzaGFwZU1pc21hdGNoJyxcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwdWJsaXNoZWQgYW4gQVBJLCBidXQgbm8gcHVibGlzaGVkIGNvbnRyYWN0IHZlcnNpb24gc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgcmFuZ2UuXG4gICAqL1xuICBWZXJzaW9uTWlzbWF0Y2ggPSAndmVyc2lvbk1pc21hdGNoJ1xufVxuXG4vKipcbiAqIFRoZSBjb250cmFjdCBhIHByb3ZpZGVyIGRlY2xhcmVzIGZvciBpdHMgQVBJOiBldmVyeSBrZXkgaXMgYSBtZXRob2QgdGhlIEFQSSBpcyBwcm9taXNpbmcgdG8gZXhwb3NlLCBhbmRcbiAqIGl0cyB2YWx1ZSBvcHRpb25hbGx5IGNhcnJpZXMgdGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgdGhhdCBtZXRob2QuXG4gKlxuICogVGhlIEtFWVMgYXJlIHRoZSBwYXJ0IHRoYXQgYWx3YXlzIG1hdHRlcnMgXHUyMDE0IHRoZXkgZHJpdmUgdGhlIHNoYXBlIGNoZWNrIHRoYXQgZGVjaWRlcyB3aGV0aGVyIGEgcHVibGlzaGVkXG4gKiByZWNvcmQgaXMgdXNhYmxlIGF0IGFsbC4gVGhlIHNjaGVtYXMgYXJlIG9wdGlvbmFsIGFuZCBvbmx5IGV2ZXIgY29uc3VsdGVkIHdoaWxlIGRlYnVnZ2luZy5cbiAqXG4gKiBAcmVtYXJrc1xuICogV2h5IHRoZSBzaGFwZSBjaGVjayBpcyBhIGB0eXBlb2ZgIHJhdGhlciB0aGFuIGEgc2NoZW1hIG92ZXIgdGhlIHdob2xlIEFQSSBvYmplY3QuIEluIHpvZCA0IGB6LmZ1bmN0aW9uKClgXG4gKiByZXR1cm5zIGEgZnVuY3Rpb24gRkFDVE9SWSwgbm90IGEgc2NoZW1hLCBzbyBpdCBjYW5ub3QgYmUgYSBgei5vYmplY3QoKWAgbWVtYmVyIGRpcmVjdGx5LiBUaGVyZSBpcyBhIGtub3duXG4gKiB3b3JrYXJvdW5kICh6b2QjNDE0MykgXHUyMDE0IGB6LmN1c3RvbSgoZm4pID0+IGZ1bmN0aW9uU2NoZW1hLmltcGxlbWVudChmbikpYCBcdTIwMTQgYW5kIGl0IGRvZXMgYnV5IGNvcnJlY3RcbiAqIGB6LmluZmVyYCB0eXBlcyBmb3IgYSBmdW5jdGlvbiBtZW1iZXIuIEl0IGRvZXMgbm90IGJ1eSBydW50aW1lIHZhbGlkYXRpb24gaGVyZSwgdGhvdWdoOiBgei5jdXN0b21gIGlzIGFcbiAqIGJvb2xlYW4gcHJlZGljYXRlIHRoYXQgcmV0dXJucyBpdHMgaW5wdXQgdW5jaGFuZ2VkLCBzbyB0aGUgdmFsaWRhdGluZyB3cmFwcGVyIGBpbXBsZW1lbnRgIGJ1aWxkcyBpc1xuICogZGlzY2FyZGVkIGFuZCB0aGUgY2hlY2sgY29sbGFwc2VzIGJhY2sgdG8gXCJpcyBpdCBjYWxsYWJsZVwiLiBLZWVwaW5nIHRoYXQgd3JhcHBlciB3b3VsZCBuZWVkIGEgZnVydGhlclxuICogYC50cmFuc2Zvcm0oKWAsIGFuZCB3b3VsZCB0aGVuIG1vdmUgdmFsaWRhdGlvbiBvbnRvIGV2ZXJ5IGNhbGwgaW5zdGVhZCBvZiBiZWhpbmQgdGhlIGRlYnVnIGdhdGUsIGFuZCBiaW5kXG4gKiB0aGUgY29udHJhY3QgdG8gem9kIHNwZWNpZmljYWxseSBcdTIwMTQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHJlYWNoaW5nIHRocm91Z2ggU3RhbmRhcmQgU2NoZW1hIGF2b2lkcy4gU28gdGhlXG4gKiBkZWNsYXJlZCBtZXRob2QgbmFtZXMgYXJlIGNoZWNrZWQgd2l0aCBgdHlwZW9mYCwgYW5kIHRoZSBwYXlsb2FkcyBhcmUgdmFsaWRhdGVkIHBlciBtZXRob2QgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luQXBpQ29udHJhY3QgPSBSZWNvcmQ8c3RyaW5nLCBQbHVnaW5BcGlNZXRob2RDb250cmFjdD47XG5cbi8qKlxuICogVGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgYSBzaW5nbGUgQVBJIG1ldGhvZC4gQm90aCBoYWx2ZXMgYXJlIG9wdGlvbmFsOiBhIG1ldGhvZCBtYXkgZGVjbGFyZSBvbmx5IGl0cyBpbnB1dCxcbiAqIG9ubHkgaXRzIG91dHB1dCwgbmVpdGhlciAodGhlIGVudHJ5IHRoZW4ganVzdCBkZWNsYXJlcyB0aGF0IHRoZSBtZXRob2QgbXVzdCBleGlzdCksIG9yIGJvdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpTWV0aG9kQ29udHJhY3Qge1xuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyBhcmd1bWVudHMsIGFzIGFuIGFycmF5LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXQ/OiBTdGFuZGFyZFNjaGVtYVYxO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZSBcdTIwMTQgb3IsIHdoZW4gdGhlIG1ldGhvZCByZXR1cm5zIGEgdGhlbmFibGUsIHRoZSB2YWx1ZSBpdCByZXNvbHZlcyB0by5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dD86IFN0YW5kYXJkU2NoZW1hVjE7XG59XG5cbi8qKlxuICogQSBsaXZlIHJlZmVyZW5jZSB0byBhbm90aGVyIHBsdWdpbidzIEFQSS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoZSByZWYgaXMgdGhlIFdIT0xFIGNvbnN1bWVyIHN1cmZhY2UsIGRlbGliZXJhdGVseS4gQSBwbGFpbiB7QGxpbmsgUHJvbWlzZX0gY2Fubm90IG1vZGVsIHRoaXMgYmVjYXVzZSBpdFxuICogc2V0dGxlcyBvbmNlLCB3aGVyZWFzIGF2YWlsYWJpbGl0eSBpcyBhIHJlcGVhdGluZyBzaWduYWwgKGF2YWlsYWJsZSBcdTIxOTIgZ29uZSBcdTIxOTIgYXZhaWxhYmxlIGFnYWluIGFjcm9zcyBhXG4gKiBkaXNhYmxlL2VuYWJsZSBjeWNsZSkgXHUyMDE0IHdoaWNoIGlzIHdoeSB7QGxpbmsgUGx1Z2luQXBpUmVmLndoZW5BdmFpbGFibGV9IGlzIGEgbWV0aG9kIE9OIHRoZSByZWYgcmF0aGVyIHRoYW5cbiAqIHRoZSB0aGluZyBoYW5kZWQgYmFjay4gVGhlIGBjaGFuZ2VgIGV2ZW50IGV4aXN0cyBmb3IgY29uc3VtZXJzIHRoYXQgbXVzdCByZWFjdCByYXRoZXIgdGhhbiByZWFkLCBhbmQgaXNcbiAqIHNlY29uZGFyeTogaXQgaW1wb3NlcyBubyBjZXJlbW9ueSBvbiB0aGUgY29tbW9uIGNhc2UsIHdoaWNoIGlzIHJlYWRpbmcge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpUmVmPFRBcGkgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgQXN5bmNFdmVudFNvdXJjZTxQbHVnaW5BcGlSZWZFdmVudE1hcD4ge1xuICAvKipcbiAgICogVGhlIEFQSSwgb3IgYG51bGxgIHdoZW4gaXQgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEFsd2F5cyBjdXJyZW50LCBzeW5jaHJvbm91cywgYW5kIGZyZWUgXHUyMDE0IHRoZSByZWYgbWFpbnRhaW5zIGl0LCBzbyB0aGVyZSBpcyBubyByZWdpc3RyeSBsb29rdXAgcGVyIHJlYWQuXG4gICAqIGBudWxsYCBoZXJlIG1lYW5zIFwibm90IGF2YWlsYWJsZSByaWdodCBub3dcIiwgTk9UIFwibm90IGluc3RhbGxlZFwiOiBkdXJpbmcgYSBjb25zdW1lcidzIGBvbmxvYWRgIHRoZVxuICAgKiBwcm92aWRlciBtYXkgc2ltcGx5IG5vdCBoYXZlIGxvYWRlZCB5ZXQsIGFuZCB0aGUgdmFsdWUgYmVjb21lcyBub24tYG51bGxgIG9uIGl0cyBvd24uXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogbnVsbCB8IFRBcGk7XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgQVBJIHRvIGJlY29tZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSB3YWl0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIEFQSS5cbiAgICogQHRocm93cyBBIHtAbGluayBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yfSB3aG9zZSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvci5yZWFzb259IHNheXMgd2hpY2ggb2ZcbiAgICogdGhlIGZpdmUgZmFpbHVyZXMgb2NjdXJyZWQsIGlmIHRoZSBBUEkgZG9lcyBub3QgYmVjb21lIGF2YWlsYWJsZSBiZWZvcmUgdGhlIHRpbWVvdXQgZWxhcHNlcy5cbiAgICovXG4gIHdoZW5BdmFpbGFibGUob3B0aW9ucz86IFdoZW5BdmFpbGFibGVQbHVnaW5BcGlPcHRpb25zKTogUHJvbWlzZTxUQXBpPjtcbn1cblxuLyoqXG4gKiBUaGUgZXZlbnRzIGEge0BsaW5rIFBsdWdpbkFwaVJlZn0gZmlyZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpUmVmRXZlbnRNYXAge1xuICAvKipcbiAgICogRmlyZWQgd2hlbmV2ZXIge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0gY2hhbmdlcyBcdTIwMTQgaW5jbHVkaW5nIHdoZW4gaXQgYmVjb21lcyBgbnVsbGAgYmVjYXVzZSB0aGUgcHJvdmlkZXJcbiAgICogdW5sb2FkZWQuXG4gICAqL1xuICBjaGFuZ2U6IFtdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGV4cGxpY2l0IG1lc3NhZ2UuIFdoZW4gb21pdHRlZCwgb25lIGlzIGRlcml2ZWQgZnJvbSB0aGUgcGx1Z2luIGlkIGFuZCB0aGUgcmVhc29uLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbiB3aG9zZSBBUEkgd2FzIHJlcXVlc3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9mIHRoZSBmaXZlIGZhaWx1cmVzIG9jY3VycmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uOiBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGlzc3VlcyB0aGUgc2NoZW1hIHJlcG9ydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW107XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2hvc2UgcGF5bG9hZCBmYWlsZWQgdmFsaWRhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgaW5wdXQgb3IgdGhlIG91dHB1dCBmYWlsZWQuXG4gICAqL1xuICByZWFkb25seSBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQ7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwcm92aWRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcHVibGlzaFBsdWdpbkFwaX0uXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0eXBlIGJlaW5nIHB1Ymxpc2hlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWJsaXNoUGx1Z2luQXBpUGFyYW1zPFRBcGkgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIFRoZSBBUEkgb2JqZWN0IHRvIHB1Ymxpc2guIEl0cyBtZXRob2RzIGFyZSBoYW5kZWQgdG8gY29uc3VtZXJzIHRocm91Z2ggYSByZXZvY2FibGUgaGFuZGxlLCBhbmQgdGhleSBhcmVcbiAgICogYWx3YXlzIGludm9rZWQgd2l0aCB0aGlzIG9iamVjdCBhcyB0aGVpciBgdGhpc2AsIHNvIGFuIGltcGxlbWVudGF0aW9uIHVzaW5nIHByaXZhdGUgY2xhc3MgZmllbGRzIGtlZXBzXG4gICAqIHdvcmtpbmcuXG4gICAqL1xuICByZWFkb25seSBhcGk6IFRBcGk7XG5cbiAgLyoqXG4gICAqIFRoZSBDT05UUkFDVCB2ZXJzaW9uLCBpbiBzZW12ZXIgZm9ybSBcdTIwMTQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsdWdpbidzIG93biB2ZXJzaW9uLiBQbHVnaW4gYDEuNC43YCBtYXlcbiAgICogcGVyZmVjdGx5IHdlbGwgZXhwb3NlIEFQSSBgMi4wLjBgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udHJhY3QgdGhpcyB2ZXJzaW9uIG9mIHRoZSBBUEkgc2F0aXNmaWVzLiBPcHRpb25hbDogd2hlbiBvbWl0dGVkLCBubyBzaGFwZSBjaGVjayBpcyBwZXJmb3JtZWQgb25cbiAgICogdGhlIHByb3ZpZGVyJ3MgYmVoYWxmIGFuZCB0aGUgY29uc3VtZXIncyBvd24gY29udHJhY3QgKGlmIGFueSkgaXMgdXNlZCBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udHJhY3Q/OiBQbHVnaW5BcGlDb250cmFjdDtcblxuICAvKipcbiAgICogVGhlIHB1Ymxpc2hpbmcgcGx1Z2luLiBUaGUgcmVjb3JkIGlzIGtleWVkIGJ5IGl0cyBgbWFuaWZlc3QuaWRgIGFuZCByZXZva2VkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luXG4gICAqIHVubG9hZHMsIHZpYSBgcGx1Z2luLnJlZ2lzdGVyKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHdhdGNoUGx1Z2luQXBpfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaFBsdWdpbkFwaVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc2VtdmVyIHJhbmdlIG9mIGNvbnRyYWN0IHZlcnNpb25zIHRoZSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0LCBlLmcuIGAnXjInYC4gVGhlIGhpZ2hlc3QgcHVibGlzaGVkXG4gICAqIHZlcnNpb24gc2F0aXNmeWluZyBpdCB3aW5zLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGUgcmFuZ2UgaXMgZXZhbHVhdGVkIGJ5IGBjb21wYXJlLXZlcnNpb25zYCwgd2hpY2ggYWNjZXB0cyBgXmAsIGB+YCwgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGFuZCBgeGBcbiAgICogd2lsZGNhcmRzIFx1MjAxNCBidXQgTk9UIGEgYmFyZSBgKmAuIFNwZWxsIFwiYW55IHZlcnNpb25cIiBhcyBgJz49MC4wLjAnYC5cbiAgICovXG4gIHJlYWRvbmx5IGFwaVZlcnNpb25SYW5nZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLCB1c2VkIHRvIGNsYXNzaWZ5IGEgZmFpbHVyZSBhcyBub3QtaW5zdGFsbGVkIHZzIG5vdC1lbmFibGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgb3duaW5nIHRoZSBzdWJzY3JpcHRpb24uIFRoZSB3YXRjaCBpcyB0b3JuIGRvd24gd2hlbiBpdCB1bmxvYWRzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50OiBDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250cmFjdCB0aGUgQ09OU1VNRVIgZXhwZWN0cy4gT3B0aW9uYWwsIGFuZCBpdCB3aW5zIG92ZXIgdGhlIHByb3ZpZGVyJ3MgcHVibGlzaGVkIGNvbnRyYWN0IHdoZW5cbiAgICogc3VwcGxpZWQgXHUyMDE0IGl0IGlzIHRoZSBjb25zdW1lcidzIG93biBjb21waWxlZC1hZ2FpbnN0IGV4cGVjdGF0aW9uLCBzbyBpdCBpcyB0aGUgb25lIHdob3NlIHZpb2xhdGlvbiBpc1xuICAgKiB0aGUgY29uc3VtZXIncyBwcm9ibGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udHJhY3Q/OiBQbHVnaW5BcGlDb250cmFjdDtcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBQbHVnaW5BcGlSZWYud2hlbkF2YWlsYWJsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2hlbkF2YWlsYWJsZVBsdWdpbkFwaU9wdGlvbnMge1xuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwIGFuZCBjbGFzc2lmeWluZyB0aGUgZmFpbHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMTAwMDBcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlTWV0aG9kV3JhcHBlcn0uXG4gKi9cbmludGVyZmFjZSBDcmVhdGVNZXRob2RXcmFwcGVyUGFyYW1zIHtcbiAgcmVhZG9ubHkgbWV0aG9kQ29udHJhY3Q6IFBsdWdpbkFwaU1ldGhvZENvbnRyYWN0IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgaHVtYW4tcmVhZGFibGUgbmFtZSB1c2VkIGluIGVycm9yIG1lc3NhZ2VzIGFuZCBkZWJ1ZyBvdXRwdXQuIE5PVCBhIGtleSBcdTIwMTQgc2VlIHtAbGluayBwcm9wZXJ0eUtleX0uXG4gICAqL1xuICByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGtleSB0aGUgbWV0aG9kIGlzIGFjdHVhbGx5IHJlYWQgYnksIHdoaWNoIG1heSBiZSBhIHN5bWJvbC5cbiAgICovXG4gIHJlYWRvbmx5IHByb3BlcnR5S2V5OiBQcm9wZXJ0eUtleTtcblxuICByZWFkb25seSB0YXJnZXQ6IG9iamVjdDtcbn1cblxuLyoqXG4gKiBUaGUgcmVhbG0tZ2xvYmFsIHJlZ2lzdHJ5IHNoYXJlZCBieSBldmVyeSBgb2JzaWRpYW4tZGV2LXV0aWxzYCBjb3B5IGluIHRoZSByZW5kZXJlci5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpbkFwaVJlZ2lzdHJ5IHtcbiAgcmVjb3JkczogUmVjb3JkPHN0cmluZywgUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkW10+O1xuICBzdWJzY3JpYmVyczogKCgpID0+IHZvaWQpW107XG59XG5cbi8qKlxuICogQSByZWNvcmQgYXMgaXQgc2l0cyBpbiB0aGUgc2hhcmVkIHJlZ2lzdHJ5LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIGlzIHRoZSBXSVJFIEZPUk1BVCBiZXR3ZWVuIGRpZmZlcmVudCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBjb3BpZXMsIHNvIGl0IGhvbGRzIG5vdGhpbmcgYnV0IHBsYWluIGRhdGFcbiAqIGFuZCBwbGFpbiBmdW5jdGlvbnMsIGFuZCBldmVyeSByZWFkIG9mIGl0IGVsc2V3aGVyZSBpbiB0aGlzIGZpbGUgaXMgc3RydWN0dXJhbC5cbiAqL1xuaW50ZXJmYWNlIFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCB7XG4gIGFwaTogb2JqZWN0O1xuICBhcGlWZXJzaW9uOiBzdHJpbmc7XG4gIGNvbnRyYWN0OiBQbHVnaW5BcGlDb250cmFjdDtcbiAgaXNSZXZva2VkOiBib29sZWFuO1xuICBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB2YWxpZGF0ZVBheWxvYWR9LlxuICovXG5pbnRlcmZhY2UgVmFsaWRhdGVQYXlsb2FkUGFyYW1zIHtcbiAgcmVhZG9ubHkgbWV0aG9kTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQ7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNjaGVtYTogU3RhbmRhcmRTY2hlbWFWMTtcbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogSG9sZHMgd2hhdCBhIHdhdGNoIG5lZWRzIHJlZ2FyZGxlc3Mgb2YgdGhlIEFQSSB0eXBlIGl0IGlzIHR5cGVkIGFnYWluc3QsIHNvIHRoZSB7QGxpbmsgbWl4aW5Bc3luY0V2ZW50c31cbiAqIG1peGluIGhhcyBhIHJlYWwgYmFzZSB0byBleHRlbmQuXG4gKi9cbmFic3RyYWN0IGNsYXNzIFBsdWdpbkFwaVdhdGNoQmFzZSB7XG4gIHByb3RlY3RlZCBoYW5kbGU6IG51bGwgfCBvYmplY3QgPSBudWxsO1xuXG4gIHByb3RlY3RlZCByZWNvcmQ6IG51bGwgfCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQgPSBudWxsO1xuXG4gIC8vIEEgYHByb3RlY3RlZGAgY29uc3RydWN0b3IgaXMgbm90IGFzc2lnbmFibGUgdG8gYEFic3RyYWN0Q29uc3RydWN0b3I8b2JqZWN0PmAsIHdoaWNoIGlzIHdoYXRcbiAgLy8gYG1peGluQXN5bmNFdmVudHNgIGFjY2VwdHMsIHNvIHRoaXMgc3RheXMgcHVibGljIGV2ZW4gdGhvdWdoIG9ubHkgdGhlIHN1YmNsYXNzIGJlbG93IGNhbGxzIGl0LlxuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpIHt9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZXJyb3IgZGVzY3JpYmluZyB3aHkgdGhlIEFQSSBpcyBub3QgYXZhaWxhYmxlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNsYXNzaWZpZWQgZXJyb3IuXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlVW5hdmFpbGFibGVFcnJvcigpOiBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yIHtcbiAgICByZXR1cm4gbmV3IFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3Ioe1xuICAgICAgcGx1Z2luSWQ6IHRoaXMucGFyYW1zLnBsdWdpbklkLFxuICAgICAgcmVhc29uOiByZXNvbHZlVW5hdmFpbGFiaWxpdHlSZWFzb24odGhpcy5wYXJhbXMpXG4gICAgfSk7XG4gIH1cbn1cblxuY2xhc3MgUGx1Z2luQXBpUmVmSW1wbDxUQXBpIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIG1peGluQXN5bmNFdmVudHM8UGx1Z2luQXBpUmVmRXZlbnRNYXA+KCkoUGx1Z2luQXBpV2F0Y2hCYXNlKSBpbXBsZW1lbnRzIFBsdWdpbkFwaVJlZjxUQXBpPiB7XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogbnVsbCB8IFRBcGkge1xuICAgIHJldHVybiBjYXN0VG88bnVsbCB8IFRBcGk+KHRoaXMuaGFuZGxlKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFdhdGNoUGx1Z2luQXBpUGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbXB1dGVzIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlIHJlZ2lzdHJ5LCBmaXJpbmcgYGNoYW5nZWAgb25seSB3aGVuIGl0IGFjdHVhbGx5IGNoYW5nZWQuXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICBjb25zdCByZWNvcmQgPSBzZWxlY3RSZWNvcmQodGhpcy5wYXJhbXMpO1xuICAgIGlmIChyZWNvcmQgPT09IHRoaXMucmVjb3JkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZWNvcmQgPSByZWNvcmQ7XG4gICAgdGhpcy5oYW5kbGUgPSByZWNvcmQgPT09IG51bGwgPyBudWxsIDogY3JlYXRlUmV2b2NhYmxlSGFuZGxlKHJlY29yZCwgdGhpcy5wYXJhbXMuY29udHJhY3QpO1xuICAgIHRoaXMudHJpZ2dlcignY2hhbmdlJyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgd2hlbkF2YWlsYWJsZShvcHRpb25zPzogV2hlbkF2YWlsYWJsZVBsdWdpbkFwaU9wdGlvbnMpOiBQcm9taXNlPFRBcGk+IHtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmIChjdXJyZW50VmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBydW5XaXRoVGltZW91dDxUQXBpPih7XG4gICAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiBhc3luYyAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTxUQXBpPiA9PiBhd2FpdCB0aGlzLndhaXRGb3JWYWx1ZShhYm9ydFNpZ25hbCksXG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IGB3YXRjaFBsdWdpbkFwaShcIiR7dGhpcy5wYXJhbXMucGx1Z2luSWR9XCIpLndoZW5BdmFpbGFibGVgLFxuICAgICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnM/LnRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1dIRU5fQVZBSUxBQkxFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IHRoaXMuY3JlYXRlVW5hdmFpbGFibGVFcnJvcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvclZhbHVlKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VEFwaT4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxUQXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBUaGUgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZCBGSVJTVCBhbmQgaW52b2tlZCB0aHJvdWdoIGEgdGh1bmssIHNvIGBldmVudFJlZmAgaXMgYWxyZWFkeSBib3VuZCBieSB0aGVcbiAgICAgIC8vIFRpbWUgYW55dGhpbmcgY2FuIHJlYWNoIGl0IFx1MjAxNCB3aGljaCBpcyB3aGF0IGxldHMgYGNsZWFuVXBgIGJlIHVuY29uZGl0aW9uYWwgcmF0aGVyIHRoYW4gbnVsbC1ndWFyZGVkLlxuICAgICAgY29uc3QgZXZlbnRSZWYgPSB0aGlzLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIGhhbmRsZUNoYW5nZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKTogdm9pZCB7XG4gICAgICAgIGV2ZW50UmVmLmFzeW5jRXZlbnRTb3VyY2Uub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICAgICAgYWJvcnRTaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBoYW5kbGVBYm9ydCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZUFib3J0KCk6IHZvaWQge1xuICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgIHJlamVjdChhYm9ydFNpZ25hbC5yZWFzb24gYXMgRXJyb3IpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgY2xlYW5VcCgpO1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBhYm9ydFNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGhhbmRsZUFib3J0KTtcbiAgICAgIGhhbmRsZUNoYW5nZSgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBwbHVnaW4gQVBJIGNhbm5vdCBiZSBoYW5kZWQgb3ZlciwgY2FycnlpbmcgdGhlIHtAbGluayBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbn0gdGhhdCBzYXlzXG4gKiB3aHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbiB3aG9zZSBBUEkgd2FzIHJlcXVlc3RlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBvY2N1cnJlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWFzb246IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKHBhcmFtcy5tZXNzYWdlID8/IGBUaGUgQVBJIG9mIHRoZSBwbHVnaW4gXCIke3BhcmFtcy5wbHVnaW5JZH1cIiBpcyB1bmF2YWlsYWJsZTogJHtwYXJhbXMucmVhc29ufS5gKTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcic7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnJlYXNvbiA9IHBhcmFtcy5yZWFzb247XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHByb3BlcnR5IGlzIHJlYWQgZnJvbSBhIGhhbmRsZSB3aG9zZSBwcm92aWRlciBoYXMgc2luY2UgdW5sb2FkZWQuXG4gKlxuICogVGhpcyBpcyB0aGUgcG9pbnQgb2YgaGFuZGluZyBvdXQgYSByZXZvY2FibGUgaGFuZGxlIHJhdGhlciB0aGFuIHRoZSByYXcgb2JqZWN0OiBhIGNvbnN1bWVyIHRoYXQgY2FjaGVkIHRoZVxuICogQVBJIGluIGEgZmllbGQgYW5kIGtlcHQgdXNpbmcgaXQgYWNyb3NzIGEgZGlzYWJsZSBnZXRzIGFuIGVycm9yIG5hbWluZyB0aGUgcHJvdmlkZXIsIGluc3RlYWQgb2ZcbiAqIGBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIHVuZGVmaW5lZGAgc29tZXdoZXJlIGRlZXAgaW5zaWRlIGEgdG9ybi1kb3duIHBsdWdpbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkFwaVJldm9rZWRFcnJvciBleHRlbmRzIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBQbHVnaW5BcGlSZXZva2VkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luIHdob3NlIEFQSSB3YXMgcmV2b2tlZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwbHVnaW5JZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoe1xuICAgICAgbWVzc2FnZTogYFRoZSBBUEkgb2YgdGhlIHBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGJlZW4gcmV2b2tlZCwgYmVjYXVzZSB0aGUgcGx1Z2luIHdhcyB1bmxvYWRlZC5gLFxuICAgICAgcGx1Z2luSWQsXG4gICAgICByZWFzb246IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlJldm9rZWRcbiAgICB9KTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luQXBpUmV2b2tlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgcHVibGlzaGVkIEFQSSdzIHBheWxvYWQgZmFpbHMgdGhlIHNjaGVtYSBpdHMgY29udHJhY3QgZGVjbGFyZXMuXG4gKlxuICogT25seSBldmVyIHRocm93biB3aGlsZSB0aGUgYG9ic2lkaWFuLWRldi11dGlsczpQbHVnaW5BcGlgIGRlYnVnZ2VyIGlzIGVuYWJsZWQgXHUyMDE0IGluIHByb2R1Y3Rpb24gdGhlIG1ldGhvZHNcbiAqIGFyZSBub3Qgd3JhcHBlZCBhdCBhbGwuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgaXNzdWVzIHRoZSBzY2hlbWEgcmVwb3J0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW107XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2hvc2UgcGF5bG9hZCBmYWlsZWQgdmFsaWRhdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwcm92aWRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKFxuICAgICAgYFRoZSAke3BhcmFtcy5wYXlsb2FkS2luZH0gb2YgXCIke3BhcmFtcy5wbHVnaW5JZH1cIiBBUEkgbWV0aG9kIFwiJHtwYXJhbXMubWV0aG9kTmFtZX1cIiBmYWlsZWQgdmFsaWRhdGlvbjogJHtmb3JtYXRJc3N1ZXMocGFyYW1zLmlzc3Vlcyl9YFxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ1BsdWdpbkFwaVZhbGlkYXRpb25FcnJvcic7XG4gICAgdGhpcy5pc3N1ZXMgPSBwYXJhbXMuaXNzdWVzO1xuICAgIHRoaXMubWV0aG9kTmFtZSA9IHBhcmFtcy5tZXRob2ROYW1lO1xuICAgIHRoaXMucGx1Z2luSWQgPSBwYXJhbXMucGx1Z2luSWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYSBwbHVnaW4ncyBBUEkgc28gb3RoZXIgcGx1Z2lucyBjYW4gY29uc3VtZSBpdCwga2V5ZWQgYnkgdGhlIHBsdWdpbidzIGBtYW5pZmVzdC5pZGAgYW5kIHJldm9rZWRcbiAqIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMuXG4gKlxuICogU2V2ZXJhbCBjb250cmFjdCB2ZXJzaW9ucyBtYXkgYmUgcHVibGlzaGVkIHNpZGUgYnkgc2lkZSwgc28gYSBwcm92aWRlciBjYW4gbW92ZSB0byBgMi4wLjBgIHdpdGhvdXQgYnJlYWtpbmdcbiAqIGNvbnN1bWVycyBzdGlsbCBwaW5uZWQgdG8gYF4xYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgYmVpbmcgcHVibGlzaGVkLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBwdWJsaXNoaW5nLlxuICogQHRocm93cyBBbiB7QGxpbmsgRXJyb3J9IGlmIHRoaXMgcGx1Z2luIGhhcyBhbHJlYWR5IHB1Ymxpc2hlZCB0aGlzIGV4YWN0IGBhcGlWZXJzaW9uYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hQbHVnaW5BcGk8VEFwaSBleHRlbmRzIG9iamVjdD4ocGFyYW1zOiBQdWJsaXNoUGx1Z2luQXBpUGFyYW1zPFRBcGk+KTogdm9pZCB7XG4gIGNvbnN0IHBsdWdpbklkID0gcGFyYW1zLnBsdWdpbi5tYW5pZmVzdC5pZDtcbiAgY29uc3QgcmVnaXN0cnkgPSBnZXRSZWdpc3RyeSgpO1xuICBjb25zdCByZWNvcmRzID0gcmVnaXN0cnkucmVjb3Jkc1twbHVnaW5JZF0gPz8gW107XG4gIHJlZ2lzdHJ5LnJlY29yZHNbcGx1Z2luSWRdID0gcmVjb3JkcztcblxuICBpZiAocmVjb3Jkcy5zb21lKChyZWNvcmQpID0+IHJlY29yZC5hcGlWZXJzaW9uID09PSBwYXJhbXMuYXBpVmVyc2lvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGhhcyBhbHJlYWR5IHB1Ymxpc2hlZCB0aGUgQVBJIHZlcnNpb24gXCIke3BhcmFtcy5hcGlWZXJzaW9ufVwiLmApO1xuICB9XG5cbiAgY29uc3QgcmVjb3JkOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQgPSB7XG4gICAgYXBpOiBwYXJhbXMuYXBpLFxuICAgIGFwaVZlcnNpb246IHBhcmFtcy5hcGlWZXJzaW9uLFxuICAgIGNvbnRyYWN0OiBwYXJhbXMuY29udHJhY3QgPz8ge30sXG4gICAgaXNSZXZva2VkOiBmYWxzZSxcbiAgICBwbHVnaW5JZFxuICB9O1xuICByZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgbm90aWZ5U3Vic2NyaWJlcnMoKTtcblxuICBwYXJhbXMucGx1Z2luLnJlZ2lzdGVyKCgpID0+IHtcbiAgICByZXZva2VSZWNvcmQocmVjb3JkKTtcbiAgfSk7XG59XG5cbi8qKlxuICogV2F0Y2hlcyBhbm90aGVyIHBsdWdpbidzIEFQSSBhbmQgcmV0dXJucyBhIGxpdmUge0BsaW5rIFBsdWdpbkFwaVJlZn0gd2hvc2Uge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0gc3RheXNcbiAqIGNvcnJlY3QgYWNyb3NzIHRoZSBwcm92aWRlcidzIGxvYWQsIHVubG9hZCwgYW5kIHJlLWVuYWJsZS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBlbnRpcmUgY29uc3VtZXIgc3VyZmFjZS4gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIHN5bmNocm9ub3VzIFwiZ2V0IGl0IG9yIGBudWxsYFwiIHByb2JlOiBhIHByb2JlXG4gKiBvbmx5IGFuc3dlcnMgXCJub3dcIiBhbmQgbmV2ZXIgdGVsbHMgeW91IHdoZW4gXCJub3dcIiBjaGFuZ2VkLCBzbyBjYWxsaW5nIG9uZSBkdXJpbmcgYG9ubG9hZGAgcmVhZHMgYG51bGxgIGFuZFxuICogaW52aXRlcyB0aGUgY29uY2x1c2lvbiBcIm5vdCBpbnN0YWxsZWRcIi4gQSBjb25zdW1lciB0aGF0IG5lZWRzIGEgc3luY2hyb25vdXMgYW5zd2VyIGluc2lkZSBhIGNhbGxiYWNrIHdob3NlXG4gKiBzaWduYXR1cmUgZm9yYmlkcyBgYXdhaXRgIFx1MjAxNCBgY2hlY2tDYWxsYmFjayhpc0NoZWNraW5nKTogYm9vbGVhbmAsIGBjYW5FeGVjdXRlKClgLCBhIHNldHRpbmdzLXJvdyBgdmlzaWJsZWBcbiAqIHByZWRpY2F0ZSBcdTIwMTQgaG9sZHMgdGhlIHJlZiAob3IgdGhlIHZhbHVlIGl0IG1haW50YWlucykgaW4gYSBmaWVsZCBhbmQgcmVhZHMgdGhhdCwgd2hpY2ggaXMgYm90aCBjaGVhcGVyIGFuZFxuICogY29ycmVjdCBhY3Jvc3MgQk9USCBlZGdlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3YXRjaC5cbiAqIEByZXR1cm5zIFRoZSBsaXZlIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoUGx1Z2luQXBpPFRBcGkgZXh0ZW5kcyBvYmplY3Q+KHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpOiBQbHVnaW5BcGlSZWY8VEFwaT4ge1xuICBjb25zdCByZWYgPSBuZXcgUGx1Z2luQXBpUmVmSW1wbDxUQXBpPihwYXJhbXMpO1xuICBjb25zdCB1bnN1YnNjcmliZSA9IHN1YnNjcmliZSgoKSA9PiB7XG4gICAgcmVmLnJlZnJlc2goKTtcbiAgfSk7XG4gIHBhcmFtcy5jb21wb25lbnQucmVnaXN0ZXIodW5zdWJzY3JpYmUpO1xuICByZWYucmVmcmVzaCgpO1xuICByZXR1cm4gcmVmO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWxseSBkZXRlY3RzIGEgdGhlbmFibGUuIEEgY3Jvc3MtY29weSB2YWx1ZSBtYXkgY29tZSBmcm9tIGFub3RoZXIgcmVhbG0sIHNvIGBpbnN0YW5jZW9mIFByb21pc2VgIGlzXG4gKiBub3QgdXNhYmxlIGhlcmUgXHUyMDE0IHRoZSBzYW1lIGRpc2NpcGxpbmUgdGhlIHJlZ2lzdHJ5IHJlY29yZHMgZm9sbG93LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB2YWx1ZSB0aGUgdGhlbmFibGUgcmVzb2x2ZXMgdG8uXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSB2YWx1ZSBpcyB0aGVuYWJsZS5cbiAqL1xuZnVuY3Rpb24gY2hlY2tJc1Byb21pc2VMaWtlPFQ+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJvbWlzZUxpa2U8VD4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgICYmIHZhbHVlICE9PSBudWxsXG4gICAgJiYgJ3RoZW4nIGluIHZhbHVlXG4gICAgJiYgdHlwZW9mICh2YWx1ZSBhcyBQcm9taXNlTGlrZTxUPikudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBldmVyeSBtZXRob2QgdGhlIGVmZmVjdGl2ZSBjb250cmFjdCBkZWNsYXJlcyBpcyBhY3R1YWxseSBwcmVzZW50IG9uIHRoZSBwdWJsaXNoZWQgQVBJLlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIHdoZW4gc3VwcGxpZWQuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgc2hhcGUgbWF0Y2hlcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tNYXRjaGVzQ29udHJhY3RTaGFwZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRyYWN0ID0gY29uc3VtZXJDb250cmFjdCA/PyByZWNvcmQuY29udHJhY3Q7XG4gIHJldHVybiBPYmplY3Qua2V5cyhjb250cmFjdCkuZXZlcnkoKG1ldGhvZE5hbWUpID0+IHR5cGVvZiBnZXRNZW1iZXIocmVjb3JkLmFwaSwgbWV0aG9kTmFtZSkgPT09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZnVuY3Rpb24gYSBjb25zdW1lciBhY3R1YWxseSBjYWxsczogaXQgYWx3YXlzIGludm9rZXMgdGhlIG9yaWdpbmFsIHdpdGggdGhlIHJhdyBBUEkgb2JqZWN0IGFzXG4gKiBgdGhpc2AsIGFuZCBcdTIwMTQgb25seSB3aGlsZSB0aGUgbGlicmFyeSBkZWJ1Z2dlciBpcyBlbmFibGVkIFx1MjAxNCB2YWxpZGF0ZXMgdGhlIGRlY2xhcmVkIHBheWxvYWRzIGFyb3VuZCBpdC5cbiAqXG4gKiBUaGUgZGVidWdnZXIgaXMgY29uc3VsdGVkIHBlciBjYWxsIHJhdGhlciB0aGFuIHBlciB3cmFwLCBzbyB0b2dnbGluZyBgREVCVUdgIGF0IHJ1bnRpbWUgdGFrZXMgZWZmZWN0IHdpdGhvdXRcbiAqIHJlLWFjcXVpcmluZyB0aGUgaGFuZGxlLCB3aGlsZSB0aGUgd3JhcHBlcidzIGlkZW50aXR5IHN0YXlzIHN0YWJsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3cmFwcGVyLlxuICogQHJldHVybnMgVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1ldGhvZFdyYXBwZXIocGFyYW1zOiBDcmVhdGVNZXRob2RXcmFwcGVyUGFyYW1zKTogKC4uLiRhcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93biB7XG4gIHJldHVybiBmdW5jdGlvbiBwbHVnaW5BcGlNZXRob2QoLi4uJGFyZ3VtZW50czogdW5rbm93bltdKTogdW5rbm93biB7XG4gICAgLy8gUmVhZCBieSB0aGUgT1JJR0lOQUwga2V5LCBub3QgYnkgdGhlIGRpc3BsYXkgbmFtZTogYFN0cmluZyhzeW1ib2wpYCBpcyBgJ1N5bWJvbCh4KSdgLCB3aGljaCBpcyBub3QgYVxuICAgIC8vIEtleSB0aGUgQVBJIG9iamVjdCBoYXMuXG4gICAgY29uc3QgbWV0aG9kID0gY2FzdFRvPCguLi4kaW5uZXJBcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93bj4oZ2V0TWVtYmVyKHBhcmFtcy50YXJnZXQsIHBhcmFtcy5wcm9wZXJ0eUtleSkpO1xuICAgIGNvbnN0IG1ldGhvZENvbnRyYWN0ID0gcGFyYW1zLm1ldGhvZENvbnRyYWN0O1xuXG4gICAgaWYgKG1ldGhvZENvbnRyYWN0ID09PSB1bmRlZmluZWQgfHwgIWdldFBsdWdpbkFwaURlYnVnZ2VyKCkuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kQ29udHJhY3QuaW5wdXQpIHtcbiAgICAgIHZhbGlkYXRlUGF5bG9hZCh7XG4gICAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuSW5wdXQsXG4gICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgIHNjaGVtYTogbWV0aG9kQ29udHJhY3QuaW5wdXQsXG4gICAgICAgIHZhbHVlOiAkYXJndW1lbnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBtZXRob2RDb250cmFjdC5vdXRwdXQ7XG4gICAgaWYgKCFvdXRwdXRTY2hlbWEpIHtcbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKHJldHVyblZhbHVlKSkge1xuICAgICAgcmV0dXJuIHJldHVyblZhbHVlLnRoZW4oKHJlc29sdmVkVmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgICAgICBtZXRob2ROYW1lOiBwYXJhbXMubWV0aG9kTmFtZSxcbiAgICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuT3V0cHV0LFxuICAgICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgc2NoZW1hOiBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgdmFsdWU6IHJlc29sdmVkVmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlZFZhbHVlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgcGF5bG9hZEtpbmQ6IFBsdWdpbkFwaVBheWxvYWRLaW5kLk91dHB1dCxcbiAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICBzY2hlbWE6IG91dHB1dFNjaGVtYSxcbiAgICAgIHZhbHVlOiByZXR1cm5WYWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhIHB1Ymxpc2hlZCBBUEkgaW4gYSByZXZvY2FibGUgaGFuZGxlLlxuICpcbiAqIEEgZmxhZy1jaGVja2luZyBgZ2V0YCB0cmFwIGlzIHVzZWQgcmF0aGVyIHRoYW4gYFByb3h5LnJldm9jYWJsZWAsIGJlY2F1c2UgdGhlIGxhdHRlciB0aHJvd3MgYSBiYXJlXG4gKiBgVHlwZUVycm9yYCB3aG9zZSBtZXNzYWdlIHdlIGNhbm5vdCBwaHJhc2UgXHUyMDE0IGFuZCB0aGUgd2hvbGUgdmFsdWUgb2YgcmV2b2tpbmcgaXMgdGhhdCB0aGUgZXJyb3IgbmFtZXMgdGhlXG4gKiBwcm92aWRlci5cbiAqXG4gKiBNZXRob2RzIGFyZSBib3VuZCB0byB0aGUgUkFXIGFwaSBvYmplY3QgcmF0aGVyIHRoYW4gdG8gdGhlIHByb3h5OiBhbiBpbXBsZW1lbnRhdGlvbiB1c2luZyBwcml2YXRlIGNsYXNzXG4gKiBmaWVsZHMgKGAjZmllbGRgKSB0aHJvd3MgaWYgaXRzIGB0aGlzYCBpcyBhIHByb3h5LlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIG92ZXIgdGhlIHB1Ymxpc2hlZCBvbmUgd2hlbiBzdXBwbGllZC5cbiAqIEByZXR1cm5zIFRoZSBoYW5kbGUuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJldm9jYWJsZUhhbmRsZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0KTogb2JqZWN0IHtcbiAgY29uc3QgY29udHJhY3QgPSBjb25zdW1lckNvbnRyYWN0ID8/IHJlY29yZC5jb250cmFjdDtcbiAgY29uc3QgbWV0aG9kQ2FjaGUgPSBuZXcgTWFwPFByb3BlcnR5S2V5PigpO1xuXG4gIHJldHVybiBuZXcgUHJveHkocmVjb3JkLmFwaSwge1xuICAgIGdldCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk6IFByb3BlcnR5S2V5KTogdW5rbm93biB7XG4gICAgICBpZiAocmVjb3JkLmlzUmV2b2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGx1Z2luQXBpUmV2b2tlZEVycm9yKHJlY29yZC5wbHVnaW5JZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TWVtYmVyKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RDYWNoZS5nZXQocHJvcGVydHlLZXkpO1xuICAgICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGhvZCA9IGNyZWF0ZU1ldGhvZFdyYXBwZXIoe1xuICAgICAgICAgIG1ldGhvZENvbnRyYWN0OiB0eXBlb2YgcHJvcGVydHlLZXkgPT09ICdzdHJpbmcnID8gY29udHJhY3RbcHJvcGVydHlLZXldIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1ldGhvZE5hbWU6IFN0cmluZyhwcm9wZXJ0eUtleSksXG4gICAgICAgICAgcGx1Z2luSWQ6IHJlY29yZC5wbHVnaW5JZCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICB0YXJnZXRcbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGhvZENhY2hlLnNldChwcm9wZXJ0eUtleSwgbWV0aG9kKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHNjaGVtYSBpc3N1ZXMgaW50byBhIHNpbmdsZSByZWFkYWJsZSBsaW5lLlxuICpcbiAqIEBwYXJhbSBpc3N1ZXMgLSBUaGUgaXNzdWVzIHRvIHJlbmRlci5cbiAqIEByZXR1cm5zIFRoZSByZW5kZXJlZCBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBmb3JtYXRJc3N1ZXMoaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW10pOiBzdHJpbmcge1xuICByZXR1cm4gaXNzdWVzXG4gICAgLm1hcCgoaXNzdWUpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBpc3N1ZS5wYXRoPy5tYXAoKHNlZ21lbnQpID0+IFN0cmluZyh0eXBlb2Ygc2VnbWVudCA9PT0gJ29iamVjdCcgPyBzZWdtZW50LmtleSA6IHNlZ21lbnQpKS5qb2luKCcuJyk7XG4gICAgICByZXR1cm4gcGF0aCA/IGAke3BhdGh9OiAke2lzc3VlLm1lc3NhZ2V9YCA6IGlzc3VlLm1lc3NhZ2U7XG4gICAgfSlcbiAgICAuam9pbignOyAnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWNvcmRzIGEgcGx1Z2luIGN1cnJlbnRseSBoYXMgcHVibGlzaGVkLCBleGNsdWRpbmcgYW55IHRoYXQgaGF2ZSBiZWVuIHJldm9rZWQuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gKiBAcmV0dXJucyBUaGUgbGl2ZSByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBnZXRMaXZlUmVjb3JkcyhwbHVnaW5JZDogc3RyaW5nKTogUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkW10ge1xuICByZXR1cm4gKGdldFJlZ2lzdHJ5KCkucmVjb3Jkc1twbHVnaW5JZF0gPz8gW10pLmZpbHRlcigocmVjb3JkKSA9PiAhcmVjb3JkLmlzUmV2b2tlZCk7XG59XG5cbi8qKlxuICogUmVhZHMgYSBtZW1iZXIgb2ZmIGEgcHVibGlzaGVkIEFQSSBvYmplY3Qgd2l0aG91dCBuYXJyb3dpbmcgaXQgXHUyMDE0IHRoZSBBUEkgY3Jvc3NlcyBhIGxpYnJhcnktdmVyc2lvbiBib3VuZGFyeSxcbiAqIHNvIG5vdGhpbmcgYWJvdXQgaXRzIHNoYXBlIG1heSBiZSBhc3N1bWVkLlxuICpcbiAqIEBwYXJhbSBhcGkgLSBUaGUgcHVibGlzaGVkIEFQSSBvYmplY3QuXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBtZW1iZXIgdG8gcmVhZC5cbiAqIEByZXR1cm5zIFRoZSBtZW1iZXIncyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWVtYmVyKGFwaTogb2JqZWN0LCBtZXRob2ROYW1lOiBQcm9wZXJ0eUtleSk6IHVua25vd24ge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoYXBpLCBtZXRob2ROYW1lKTtcbn1cblxuLyoqXG4gKiBUaGUgZGVidWdnZXIgdGhhdCBnYXRlcyBwYXlsb2FkIHZhbGlkYXRpb24uXG4gKlxuICogQHJldHVybnMgVGhlIGRlYnVnZ2VyLlxuICovXG5mdW5jdGlvbiBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRMaWJEZWJ1Z2dlcj4ge1xuICByZXR1cm4gZ2V0TGliRGVidWdnZXIoUExVR0lOX0FQSV9ERUJVR0dFUl9OQU1FU1BBQ0UpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc2hhcmVkIHJlZ2lzdHJ5LCB0b2xlcmF0aW5nIGEgYmFnIHdyaXR0ZW4gYnkgYSBESUZGRVJFTlQgYG9ic2lkaWFuLWRldi11dGlsc2AgY29weSB0aGF0IG1heVxuICogcHJlZGF0ZSBvbmUgb2YgaXRzIGZpZWxkcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcmVnaXN0cnkuXG4gKi9cbmZ1bmN0aW9uIGdldFJlZ2lzdHJ5KCk6IFBsdWdpbkFwaVJlZ2lzdHJ5IHtcbiAgY29uc3Qgd3JhcHBlciA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxQYXJ0aWFsPFBsdWdpbkFwaVJlZ2lzdHJ5Pj4oUExVR0lOX0FQSV9SRUdJU1RSWV9TVEFURV9LRVksIHt9KTtcbiAgY29uc3QgcmVnaXN0cnkgPSB3cmFwcGVyLnZhbHVlO1xuICByZWdpc3RyeS5yZWNvcmRzID8/PSB7fTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMgPz89IFtdO1xuICByZXR1cm4gY2FzdFRvPFBsdWdpbkFwaVJlZ2lzdHJ5PihyZWdpc3RyeSk7XG59XG5cbi8qKlxuICogTm90aWZpZXMgZXZlcnkgc3Vic2NyaWJlciwgb3ZlciBhIFNOQVBTSE9UIG9mIHRoZSBsaXN0IFx1MjAxNCBhIGNhbGxiYWNrIGlzIGZyZWUgdG8gdW5zdWJzY3JpYmUgKG9yIHN1YnNjcmliZSlcbiAqIHdoaWxlIHRoZSBzd2VlcCBpcyBydW5uaW5nLlxuICovXG5mdW5jdGlvbiBub3RpZnlTdWJzY3JpYmVycygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBzdWJzY3JpYmVyIG9mIHNuYXBzaG90KGdldFJlZ2lzdHJ5KCkuc3Vic2NyaWJlcnMpKSB7XG4gICAgc3Vic2NyaWJlcigpO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBhcHBsaWVzLCBwcm9iaW5nIHRoZSBjYXVzZXMgZnJvbSB0aGUgb3V0ZXJtb3N0IGlud2FyZHMgc28gdGhlIG1vc3RcbiAqIGFjdGlvbmFibGUgb25lIHdpbnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB3YXRjaCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHJlYXNvbi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVVuYXZhaWxhYmlsaXR5UmVhc29uKHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpOiBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIGlmICghT2JqZWN0Lmhhc093bihwYXJhbXMuYXBwLnBsdWdpbnMubWFuaWZlc3RzLCBwYXJhbXMucGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdEluc3RhbGxlZDtcbiAgfVxuXG4gIGlmICghcGFyYW1zLmFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zLmhhcyhwYXJhbXMucGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdEVuYWJsZWQ7XG4gIH1cblxuICBjb25zdCByZWNvcmRzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKTtcbiAgaWYgKHJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdFB1Ymxpc2hlZDtcbiAgfVxuXG4gIGlmIChyZWNvcmRzLmV2ZXJ5KChyZWNvcmQpID0+ICFzYXRpc2ZpZXNWZXJzaW9uKHJlY29yZC5hcGlWZXJzaW9uLCBwYXJhbXMuYXBpVmVyc2lvblJhbmdlKSkpIHtcbiAgICByZXR1cm4gUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uVmVyc2lvbk1pc21hdGNoO1xuICB9XG5cbiAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlNoYXBlTWlzbWF0Y2g7XG59XG5cbi8qKlxuICogTWFya3MgYSByZWNvcmQgcmV2b2tlZCBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgcmVnaXN0cnksIHRoZW4gdGVsbHMgZXZlcnkgd2F0Y2hlciB0byByZWNvbXB1dGUuXG4gKlxuICogVGhlIHJlY29yZCBvYmplY3QgaXRzZWxmIGlzIGRlbGliZXJhdGVseSBrZXB0IGFsaXZlIGFuZCBmbGFnZ2VkIHJhdGhlciB0aGFuIGRpc2NhcmRlZCwgYmVjYXVzZSBoYW5kbGVzXG4gKiBhbHJlYWR5IGhhbmRlZCBvdXQgY2xvc2Ugb3ZlciBpdCBcdTIwMTQgdGhhdCBmbGFnIGlzIHdoYXQgdHVybnMgYSBsYXRlciBwcm9wZXJ0eSByZWFkIGludG8gYVxuICoge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0uXG4gKlxuICogQHBhcmFtIHJlY29yZCAtIFRoZSByZWNvcmQgdG8gcmV2b2tlLlxuICovXG5mdW5jdGlvbiByZXZva2VSZWNvcmQocmVjb3JkOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQpOiB2b2lkIHtcbiAgcmVjb3JkLmlzUmV2b2tlZCA9IHRydWU7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgY29uc3QgcmVjb3JkcyA9IHJlZ2lzdHJ5LnJlY29yZHNbcmVjb3JkLnBsdWdpbklkXTtcbiAgaWYgKHJlY29yZHMpIHtcbiAgICByZWdpc3RyeS5yZWNvcmRzW3JlY29yZC5wbHVnaW5JZF0gPSByZWNvcmRzLmZpbHRlcigoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IHJlY29yZCk7XG4gIH1cbiAgbm90aWZ5U3Vic2NyaWJlcnMoKTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgaGlnaGVzdCBwdWJsaXNoZWQgcmVjb3JkIHRoYXQgaXMgbGl2ZSwgc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiByYW5nZSwgYW5kIG1hdGNoZXMgdGhlXG4gKiBlZmZlY3RpdmUgY29udHJhY3QncyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHdhdGNoIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgd2lubmluZyByZWNvcmQsIG9yIGBudWxsYCB3aGVuIG5vbmUgcXVhbGlmaWVzLlxuICovXG5mdW5jdGlvbiBzZWxlY3RSZWNvcmQocGFyYW1zOiBXYXRjaFBsdWdpbkFwaVBhcmFtcyk6IG51bGwgfCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKVxuICAgIC5maWx0ZXIoKHJlY29yZCkgPT4gc2F0aXNmaWVzVmVyc2lvbihyZWNvcmQuYXBpVmVyc2lvbiwgcGFyYW1zLmFwaVZlcnNpb25SYW5nZSkpXG4gICAgLmZpbHRlcigocmVjb3JkKSA9PiBjaGVja01hdGNoZXNDb250cmFjdFNoYXBlKHJlY29yZCwgcGFyYW1zLmNvbnRyYWN0KSlcbiAgICAuc29ydCgoYSwgYikgPT4gY29tcGFyZVZlcnNpb25zKGIuYXBpVmVyc2lvbiwgYS5hcGlWZXJzaW9uKSk7XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF0gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmaXJlZCB3aGVuZXZlciB0aGUgcmVnaXN0cnkgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0gc3Vic2NyaWJlciAtIFRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB1bnJlZ2lzdGVycyB0aGUgY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZShzdWJzY3JpYmVyOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKTtcbiAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHJlZ2lzdHJ5LnN1YnNjcmliZXJzLmluZGV4T2Yoc3Vic2NyaWJlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmVnaXN0cnkuc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUnVucyBvbmUgU3RhbmRhcmQgU2NoZW1hIG92ZXIgb25lIHBheWxvYWQuXG4gKlxuICogQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIFNZTkNIUk9OT1VTTFkgdGhyb3dzIGF0IHRoZSBjYWxsIHNpdGUsIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBcdTIwMTQgYSB2ZXJzaW9uIHNrZXcgcmVhZHNcbiAqIGFzIGEgbGVnaWJsZSBlcnJvciB3aGVyZSB0aGUgY2FsbCB3YXMgbWFkZS4gQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIHdpdGggYSB7QGxpbmsgUHJvbWlzZX0gY2Fubm90IGRvIHRoYXQ6IHRoZVxuICogc3luY2hyb25vdXMgY2FsbCBpdCB3YXMgZ3VhcmRpbmcgaGFzIGFscmVhZHkgcmV0dXJuZWQgYnkgdGhlIHRpbWUgdGhlIGFuc3dlciBhcnJpdmVzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvXG4gKiB0aHJvdyBpbnRvIGFuZCB0aGUgZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSBsaWJyYXJ5IGRlYnVnZ2VyIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgdmFsaWRhdGlvbi5cbiAqIEB0aHJvd3MgQSB7QGxpbmsgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yfSBpZiBhIHN5bmNocm9ub3VzIHNjaGVtYSByZXBvcnRzIGlzc3Vlcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXlsb2FkKHBhcmFtczogVmFsaWRhdGVQYXlsb2FkUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcmFtcy5zY2hlbWFbJ35zdGFuZGFyZCddLnZhbGlkYXRlKHBhcmFtcy52YWx1ZSk7XG5cbiAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZTxTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDx1bmtub3duPj4ocmVzdWx0KSkge1xuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFzeW5jUmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xuICAgICAgaWYgKGFzeW5jUmVzdWx0Lmlzc3Vlcykge1xuICAgICAgICBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpKFxuICAgICAgICAgICdBc3luY2hyb25vdXMgdmFsaWRhdGlvbiBvZiB0aGUgJXMgb2YgXCIlc1wiIEFQSSBtZXRob2QgXCIlc1wiIGZhaWxlZDogJXMnLFxuICAgICAgICAgIHBhcmFtcy5wYXlsb2FkS2luZCxcbiAgICAgICAgICBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICAgICAgZm9ybWF0SXNzdWVzKGFzeW5jUmVzdWx0Lmlzc3VlcylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocmVzdWx0Lmlzc3Vlcykge1xuICAgIHRocm93IG5ldyBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3Ioe1xuICAgICAgaXNzdWVzOiByZXN1bHQuaXNzdWVzLFxuICAgICAgbWV0aG9kTmFtZTogcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICBwYXlsb2FkS2luZDogcGFyYW1zLnBheWxvYWRLaW5kLFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZFxuICAgIH0pO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdFQSw4QkFHTztBQUlQLG1CQUF5QjtBQUN6QiwwQkFBaUM7QUFDakMsbUJBR087QUFDUCxtQkFBK0I7QUFDL0IsMEJBQXVCO0FBQ3ZCLHNDQUF5QztBQUV6QyxNQUFNLGdDQUFnQztBQUN0QyxNQUFNLGdDQUFnQztBQUt0QyxNQUFNLGlEQUFpRDtBQUtoRCxJQUFLLHVCQUFMLGtCQUFLQSwwQkFBTDtBQUlMLEVBQUFBLHNCQUFBLFdBQVE7QUFLUixFQUFBQSxzQkFBQSxZQUFTO0FBVEMsU0FBQUE7QUFBQSxHQUFBO0FBMEJMLElBQUssZ0NBQUwsa0JBQUtDLG1DQUFMO0FBSUwsRUFBQUEsK0JBQUEsZ0JBQWE7QUFLYixFQUFBQSwrQkFBQSxrQkFBZTtBQUtmLEVBQUFBLCtCQUFBLGtCQUFlO0FBS2YsRUFBQUEsK0JBQUEsYUFBVTtBQU1WLEVBQUFBLCtCQUFBLG1CQUFnQjtBQUtoQixFQUFBQSwrQkFBQSxxQkFBa0I7QUE5QlIsU0FBQUE7QUFBQSxHQUFBO0FBMFNaLE1BQWUsbUJBQW1CO0FBQUE7QUFBQTtBQUFBLEVBT3pCLFlBQStCLFFBQThCO0FBQTlCO0FBQUEsRUFBK0I7QUFBQSxFQUEvQjtBQUFBLEVBTjVCLFNBQXdCO0FBQUEsRUFFeEIsU0FBMEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXMUMseUJBQW9EO0FBQzVELFdBQU8sSUFBSSwwQkFBMEI7QUFBQSxNQUNuQyxVQUFVLEtBQUssT0FBTztBQUFBLE1BQ3RCLFFBQVEsNEJBQTRCLEtBQUssTUFBTTtBQUFBLElBQ2pELENBQUM7QUFBQSxFQUNIO0FBQ0Y7QUFFQSxNQUFNLDZCQUE4QyxzQ0FBdUMsRUFBRSxrQkFBa0IsRUFBZ0M7QUFBQSxFQUM3SSxJQUFXLFFBQXFCO0FBQzlCLGVBQU8sNEJBQW9CLEtBQUssTUFBTTtBQUFBLEVBQ3hDO0FBQUEsRUFFTyxZQUFZLFFBQThCO0FBQy9DLFVBQU0sTUFBTTtBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtPLFVBQWdCO0FBQ3JCLFVBQU0sU0FBUyxhQUFhLEtBQUssTUFBTTtBQUN2QyxRQUFJLFdBQVcsS0FBSyxRQUFRO0FBQzFCO0FBQUEsSUFDRjtBQUVBLFNBQUssU0FBUztBQUNkLFNBQUssU0FBUyxXQUFXLE9BQU8sT0FBTyxzQkFBc0IsUUFBUSxLQUFLLE9BQU8sUUFBUTtBQUN6RixTQUFLLFFBQVEsUUFBUTtBQUFBLEVBQ3ZCO0FBQUEsRUFFQSxNQUFhLGNBQWMsU0FBd0Q7QUFDakYsVUFBTSxlQUFlLEtBQUs7QUFDMUIsUUFBSSxpQkFBaUIsTUFBTTtBQUN6QixhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQUk7QUFDRixhQUFPLFVBQU0sNkJBQXFCO0FBQUEsUUFDaEMsbUJBQW1CLE9BQU8sZ0JBQTRDLE1BQU0sS0FBSyxhQUFhLFdBQVc7QUFBQSxRQUN6RyxlQUFlLG1CQUFtQixLQUFLLE9BQU8sUUFBUTtBQUFBLFFBQ3RELHVCQUF1QixTQUFTLHlCQUF5QjtBQUFBLE1BQzNELENBQUM7QUFBQSxJQUNILFFBQVE7QUFDTixZQUFNLEtBQUssdUJBQXVCO0FBQUEsSUFDcEM7QUFBQSxFQUNGO0FBQUEsRUFFQSxNQUFjLGFBQWEsYUFBeUM7QUFDbEUsV0FBTyxNQUFNLElBQUksUUFBYyxDQUFDLFNBQVMsV0FBVztBQUdsRCxZQUFNLFdBQVcsS0FBSyxHQUFHLFVBQVUsTUFBTTtBQUN2QyxxQkFBYTtBQUFBLE1BQ2YsQ0FBQztBQUVELGVBQVMsVUFBZ0I7QUFDdkIsaUJBQVMsaUJBQWlCLE9BQU8sUUFBUTtBQUN6QyxvQkFBWSxvQkFBb0IsU0FBUyxXQUFXO0FBQUEsTUFDdEQ7QUFFQSxlQUFTLGNBQW9CO0FBQzNCLGdCQUFRO0FBQ1IsZUFBTyxZQUFZLE1BQWU7QUFBQSxNQUNwQztBQUVBLFlBQU0sZUFBZSxNQUFZO0FBQy9CLGNBQU0sUUFBUSxLQUFLO0FBQ25CLFlBQUksVUFBVSxNQUFNO0FBQ2xCLGtCQUFRO0FBQ1Isa0JBQVEsS0FBSztBQUFBLFFBQ2Y7QUFBQSxNQUNGO0FBRUEsa0JBQVksaUJBQWlCLFNBQVMsV0FBVztBQUNqRCxtQkFBYTtBQUFBLElBQ2YsQ0FBQztBQUFBLEVBQ0g7QUFDRjtBQU1PLE1BQU0sa0NBQWtDLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUluQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVCxZQUFZLFFBQW9EO0FBQ3JFLFVBQU0sT0FBTyxXQUFXLDBCQUEwQixPQUFPLFFBQVEscUJBQXFCLE9BQU8sTUFBTSxHQUFHO0FBQ3RHLFNBQUssT0FBTztBQUNaLFNBQUssV0FBVyxPQUFPO0FBQ3ZCLFNBQUssU0FBUyxPQUFPO0FBQUEsRUFDdkI7QUFDRjtBQVNPLE1BQU0sOEJBQThCLDBCQUEwQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU01RCxZQUFZLFVBQWtCO0FBQ25DLFVBQU07QUFBQSxNQUNKLFNBQVMsMEJBQTBCLFFBQVE7QUFBQSxNQUMzQztBQUFBLE1BQ0EsUUFBUTtBQUFBLElBQ1YsQ0FBQztBQUNELFNBQUssT0FBTztBQUFBLEVBQ2Q7QUFDRjtBQVFPLE1BQU0saUNBQWlDLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlsQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1QsWUFBWSxRQUFtRDtBQUNwRTtBQUFBLE1BQ0UsT0FBTyxPQUFPLFdBQVcsUUFBUSxPQUFPLFFBQVEsaUJBQWlCLE9BQU8sVUFBVSx3QkFBd0IsYUFBYSxPQUFPLE1BQU0sQ0FBQztBQUFBLElBQ3ZJO0FBQ0EsU0FBSyxPQUFPO0FBQ1osU0FBSyxTQUFTLE9BQU87QUFDckIsU0FBSyxhQUFhLE9BQU87QUFDekIsU0FBSyxXQUFXLE9BQU87QUFBQSxFQUN6QjtBQUNGO0FBYU8sU0FBUyxpQkFBc0MsUUFBNEM7QUFDaEcsUUFBTSxXQUFXLE9BQU8sT0FBTyxTQUFTO0FBQ3hDLFFBQU0sV0FBVyxZQUFZO0FBQzdCLFFBQU0sVUFBVSxTQUFTLFFBQVEsUUFBUSxLQUFLLENBQUM7QUFDL0MsV0FBUyxRQUFRLFFBQVEsSUFBSTtBQUU3QixNQUFJLFFBQVEsS0FBSyxDQUFDQyxZQUFXQSxRQUFPLGVBQWUsT0FBTyxVQUFVLEdBQUc7QUFDckUsVUFBTSxJQUFJLE1BQU0sZUFBZSxRQUFRLDRDQUE0QyxPQUFPLFVBQVUsSUFBSTtBQUFBLEVBQzFHO0FBRUEsUUFBTSxTQUFtQztBQUFBLElBQ3ZDLEtBQUssT0FBTztBQUFBLElBQ1osWUFBWSxPQUFPO0FBQUEsSUFDbkIsVUFBVSxPQUFPLFlBQVksQ0FBQztBQUFBLElBQzlCLFdBQVc7QUFBQSxJQUNYO0FBQUEsRUFDRjtBQUNBLFVBQVEsS0FBSyxNQUFNO0FBQ25CLG9CQUFrQjtBQUVsQixTQUFPLE9BQU8sU0FBUyxNQUFNO0FBQzNCLGlCQUFhLE1BQU07QUFBQSxFQUNyQixDQUFDO0FBQ0g7QUFpQk8sU0FBUyxlQUFvQyxRQUFrRDtBQUNwRyxRQUFNLE1BQU0sSUFBSSxpQkFBdUIsTUFBTTtBQUM3QyxRQUFNLGNBQWMsVUFBVSxNQUFNO0FBQ2xDLFFBQUksUUFBUTtBQUFBLEVBQ2QsQ0FBQztBQUNELFNBQU8sVUFBVSxTQUFTLFdBQVc7QUFDckMsTUFBSSxRQUFRO0FBQ1osU0FBTztBQUNUO0FBVUEsU0FBUyxtQkFBc0IsT0FBeUM7QUFDdEUsU0FBTyxPQUFPLFVBQVUsWUFDbkIsVUFBVSxRQUNWLFVBQVUsU0FDVixPQUFRLE1BQXlCLFNBQVM7QUFDakQ7QUFTQSxTQUFTLDBCQUEwQixRQUFrQyxrQkFBK0M7QUFDbEgsUUFBTSxXQUFXLG9CQUFvQixPQUFPO0FBQzVDLFNBQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxNQUFNLENBQUMsZUFBZSxPQUFPLFVBQVUsT0FBTyxLQUFLLFVBQVUsTUFBTSxVQUFVO0FBQzVHO0FBWUEsU0FBUyxvQkFBb0IsUUFBMEU7QUFDckcsU0FBTyxTQUFTLG1CQUFtQixZQUFnQztBQUdqRSxVQUFNLGFBQVMsNEJBQW1ELFVBQVUsT0FBTyxRQUFRLE9BQU8sV0FBVyxDQUFDO0FBQzlHLFVBQU0saUJBQWlCLE9BQU87QUFFOUIsUUFBSSxtQkFBbUIsVUFBYSxDQUFDLHFCQUFxQixFQUFFLFNBQVM7QUFDbkUsYUFBTyxPQUFPLE1BQU0sT0FBTyxRQUFRLFVBQVU7QUFBQSxJQUMvQztBQUVBLFFBQUksZUFBZSxPQUFPO0FBQ3hCLHNCQUFnQjtBQUFBLFFBQ2QsWUFBWSxPQUFPO0FBQUEsUUFDbkIsYUFBYTtBQUFBLFFBQ2IsVUFBVSxPQUFPO0FBQUEsUUFDakIsUUFBUSxlQUFlO0FBQUEsUUFDdkIsT0FBTztBQUFBLE1BQ1QsQ0FBQztBQUFBLElBQ0g7QUFFQSxVQUFNLGNBQWMsT0FBTyxNQUFNLE9BQU8sUUFBUSxVQUFVO0FBQzFELFVBQU0sZUFBZSxlQUFlO0FBQ3BDLFFBQUksQ0FBQyxjQUFjO0FBQ2pCLGFBQU87QUFBQSxJQUNUO0FBRUEsUUFBSSxtQkFBbUIsV0FBVyxHQUFHO0FBQ25DLGFBQU8sWUFBWSxLQUFLLENBQUMsa0JBQTJCO0FBQ2xELHdCQUFnQjtBQUFBLFVBQ2QsWUFBWSxPQUFPO0FBQUEsVUFDbkIsYUFBYTtBQUFBLFVBQ2IsVUFBVSxPQUFPO0FBQUEsVUFDakIsUUFBUTtBQUFBLFVBQ1IsT0FBTztBQUFBLFFBQ1QsQ0FBQztBQUNELGVBQU87QUFBQSxNQUNULENBQUM7QUFBQSxJQUNIO0FBRUEsb0JBQWdCO0FBQUEsTUFDZCxZQUFZLE9BQU87QUFBQSxNQUNuQixhQUFhO0FBQUEsTUFDYixVQUFVLE9BQU87QUFBQSxNQUNqQixRQUFRO0FBQUEsTUFDUixPQUFPO0FBQUEsSUFDVCxDQUFDO0FBQ0QsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQWdCQSxTQUFTLHNCQUFzQixRQUFrQyxrQkFBOEM7QUFDN0csUUFBTSxXQUFXLG9CQUFvQixPQUFPO0FBQzVDLFFBQU0sY0FBYyxvQkFBSSxJQUFpQjtBQUV6QyxTQUFPLElBQUksTUFBTSxPQUFPLEtBQUs7QUFBQSxJQUMzQixJQUFJLFFBQWdCLGFBQW1DO0FBQ3JELFVBQUksT0FBTyxXQUFXO0FBQ3BCLGNBQU0sSUFBSSxzQkFBc0IsT0FBTyxRQUFRO0FBQUEsTUFDakQ7QUFFQSxZQUFNLFFBQVEsVUFBVSxRQUFRLFdBQVc7QUFDM0MsVUFBSSxPQUFPLFVBQVUsWUFBWTtBQUMvQixlQUFPO0FBQUEsTUFDVDtBQUVBLFVBQUksU0FBUyxZQUFZLElBQUksV0FBVztBQUN4QyxVQUFJLFdBQVcsUUFBVztBQUN4QixpQkFBUyxvQkFBb0I7QUFBQSxVQUMzQixnQkFBZ0IsT0FBTyxnQkFBZ0IsV0FBVyxTQUFTLFdBQVcsSUFBSTtBQUFBLFVBQzFFLFlBQVksT0FBTyxXQUFXO0FBQUEsVUFDOUIsVUFBVSxPQUFPO0FBQUEsVUFDakI7QUFBQSxVQUNBO0FBQUEsUUFDRixDQUFDO0FBQ0Qsb0JBQVksSUFBSSxhQUFhLE1BQU07QUFBQSxNQUNyQztBQUNBLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFRQSxTQUFTLGFBQWEsUUFBbUQ7QUFDdkUsU0FBTyxPQUNKLElBQUksQ0FBQyxVQUFVO0FBQ2QsVUFBTSxPQUFPLE1BQU0sTUFBTSxJQUFJLENBQUMsWUFBWSxPQUFPLE9BQU8sWUFBWSxXQUFXLFFBQVEsTUFBTSxPQUFPLENBQUMsRUFBRSxLQUFLLEdBQUc7QUFDL0csV0FBTyxPQUFPLEdBQUcsSUFBSSxLQUFLLE1BQU0sT0FBTyxLQUFLLE1BQU07QUFBQSxFQUNwRCxDQUFDLEVBQ0EsS0FBSyxJQUFJO0FBQ2Q7QUFRQSxTQUFTLGVBQWUsVUFBOEM7QUFDcEUsVUFBUSxZQUFZLEVBQUUsUUFBUSxRQUFRLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxTQUFTO0FBQ3JGO0FBVUEsU0FBUyxVQUFVLEtBQWEsWUFBa0M7QUFDaEUsU0FBTyxRQUFRLElBQUksS0FBSyxVQUFVO0FBQ3BDO0FBT0EsU0FBUyx1QkFBMEQ7QUFDakUsYUFBTyw2QkFBZSw2QkFBNkI7QUFDckQ7QUFRQSxTQUFTLGNBQWlDO0FBQ3hDLFFBQU0sY0FBVSwwREFBcUQsK0JBQStCLENBQUMsQ0FBQztBQUN0RyxRQUFNLFdBQVcsUUFBUTtBQUN6QixXQUFTLFlBQVksQ0FBQztBQUN0QixXQUFTLGdCQUFnQixDQUFDO0FBQzFCLGFBQU8sNEJBQTBCLFFBQVE7QUFDM0M7QUFNQSxTQUFTLG9CQUEwQjtBQUNqQyxhQUFXLGtCQUFjLHVCQUFTLFlBQVksRUFBRSxXQUFXLEdBQUc7QUFDNUQsZUFBVztBQUFBLEVBQ2I7QUFDRjtBQVNBLFNBQVMsNEJBQTRCLFFBQTZEO0FBQ2hHLE1BQUksQ0FBQyxPQUFPLE9BQU8sT0FBTyxJQUFJLFFBQVEsV0FBVyxPQUFPLFFBQVEsR0FBRztBQUNqRSxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksQ0FBQyxPQUFPLElBQUksUUFBUSxlQUFlLElBQUksT0FBTyxRQUFRLEdBQUc7QUFDM0QsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLFVBQVUsZUFBZSxPQUFPLFFBQVE7QUFDOUMsTUFBSSxRQUFRLFdBQVcsR0FBRztBQUN4QixXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksUUFBUSxNQUFNLENBQUMsV0FBVyxLQUFDLHdCQUFBQyxXQUFpQixPQUFPLFlBQVksT0FBTyxlQUFlLENBQUMsR0FBRztBQUMzRixXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU87QUFDVDtBQVdBLFNBQVMsYUFBYSxRQUF3QztBQUM1RCxTQUFPLFlBQVk7QUFDbkIsUUFBTSxXQUFXLFlBQVk7QUFDN0IsUUFBTSxVQUFVLFNBQVMsUUFBUSxPQUFPLFFBQVE7QUFDaEQsTUFBSSxTQUFTO0FBQ1gsYUFBUyxRQUFRLE9BQU8sUUFBUSxJQUFJLFFBQVEsT0FBTyxDQUFDLGNBQWMsY0FBYyxNQUFNO0FBQUEsRUFDeEY7QUFDQSxvQkFBa0I7QUFDcEI7QUFTQSxTQUFTLGFBQWEsUUFBK0Q7QUFDbkYsUUFBTSxhQUFhLGVBQWUsT0FBTyxRQUFRLEVBQzlDLE9BQU8sQ0FBQyxlQUFXLHdCQUFBQSxXQUFpQixPQUFPLFlBQVksT0FBTyxlQUFlLENBQUMsRUFDOUUsT0FBTyxDQUFDLFdBQVcsMEJBQTBCLFFBQVEsT0FBTyxRQUFRLENBQUMsRUFDckUsS0FBSyxDQUFDLEdBQUcsVUFBTSx5Q0FBZ0IsRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDO0FBRTdELFNBQU8sV0FBVyxDQUFDLEtBQUs7QUFDMUI7QUFRQSxTQUFTLFVBQVUsWUFBb0M7QUFDckQsUUFBTSxXQUFXLFlBQVk7QUFDN0IsV0FBUyxZQUFZLEtBQUssVUFBVTtBQUNwQyxTQUFPLE1BQVk7QUFDakIsVUFBTSxRQUFRLFNBQVMsWUFBWSxRQUFRLFVBQVU7QUFDckQsUUFBSSxVQUFVLElBQUk7QUFDaEIsZUFBUyxZQUFZLE9BQU8sT0FBTyxDQUFDO0FBQUEsSUFDdEM7QUFBQSxFQUNGO0FBQ0Y7QUFhQSxTQUFTLGdCQUFnQixRQUFxQztBQUM1RCxRQUFNLFNBQVMsT0FBTyxPQUFPLFdBQVcsRUFBRSxTQUFTLE9BQU8sS0FBSztBQUUvRCxNQUFJLG1CQUFxRCxNQUFNLEdBQUc7QUFDaEUsd0NBQWtCLFlBQVk7QUFDNUIsWUFBTSxjQUFjLE1BQU07QUFDMUIsVUFBSSxZQUFZLFFBQVE7QUFDdEIsNkJBQXFCO0FBQUEsVUFDbkI7QUFBQSxVQUNBLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLGFBQWEsWUFBWSxNQUFNO0FBQUEsUUFDakM7QUFBQSxNQUNGO0FBQUEsSUFDRixDQUFDO0FBQ0Q7QUFBQSxFQUNGO0FBRUEsTUFBSSxPQUFPLFFBQVE7QUFDakIsVUFBTSxJQUFJLHlCQUF5QjtBQUFBLE1BQ2pDLFFBQVEsT0FBTztBQUFBLE1BQ2YsWUFBWSxPQUFPO0FBQUEsTUFDbkIsYUFBYSxPQUFPO0FBQUEsTUFDcEIsVUFBVSxPQUFPO0FBQUEsSUFDbkIsQ0FBQztBQUFBLEVBQ0g7QUFDRjsiLAogICJuYW1lcyI6IFsiUGx1Z2luQXBpUGF5bG9hZEtpbmQiLCAiUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24iLCAicmVjb3JkIiwgInNhdGlzZmllc1ZlcnNpb24iXQp9Cg==
531
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4tYXBpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSB0eXBlZCwgdmVyc2lvbmVkLCBsaWZlY3ljbGUtYXdhcmUgcmVnaXN0cnkgZm9yIGNyb3NzLXBsdWdpbiBBUElzIFx1MjAxNCB0aGUgYWR2YW5jZWQgc3VjY2Vzc29yIHRvXG4gKiBgQHZhbmFrYXQvcGx1Z2luLWFwaWAuXG4gKlxuICogQSBwcm92aWRlciBwdWJsaXNoZXMgaXRzIEFQSSBvbmNlLCB1bmRlciBhIGNvbnRyYWN0IHZlcnNpb24gdGhhdCBpcyBpbmRlcGVuZGVudCBvZiBpdHMgcGx1Z2luIHZlcnNpb246XG4gKlxuICogYGBgdHNcbiAqIHB1Ymxpc2hQbHVnaW5BcGkoe1xuICogICBhcGk6IG5ldyBNeUFwaSh0aGlzKSxcbiAqICAgYXBpVmVyc2lvbjogJzIuMS4wJyxcbiAqICAgY29udHJhY3Q6IE1ZX0FQSV9DT05UUkFDVF9WMixcbiAqICAgcGx1Z2luOiB0aGlzXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEEgY29uc3VtZXIgZ2V0cyBhIExJVkUgUkVGIHdob3NlIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9IGlzIGFsd2F5cyBjdXJyZW50IFx1MjAxNCBgbnVsbGAgYmVmb3JlIHRoZVxuICogcHJvdmlkZXIgbG9hZHMsIHRoZSBBUEkgb25jZSBpdCBwdWJsaXNoZXMsIGBudWxsYCBhZ2FpbiBvbmNlIGl0IHVubG9hZHMsIGFuZCB0aGUgQVBJIGFnYWluIGFmdGVyIGFcbiAqIHJlLWVuYWJsZTpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVmID0gd2F0Y2hQbHVnaW5BcGk8TXlBcGk+KHtcbiAqICAgYXBpVmVyc2lvblJhbmdlOiAnXjInLFxuICogICBhcHA6IHRoaXMuYXBwLFxuICogICBjb21wb25lbnQ6IHRoaXMsXG4gKiAgIHBsdWdpbklkOiAnbXktcHJvdmlkZXInXG4gKiB9KTtcbiAqXG4gKiByZWYudmFsdWU7ICAgICAgICAgICAgICAgICAgICAvLyBNeUFwaSB8IG51bGwgXHUyMDE0IHN5bmMsIGZyZWUsIGFsd2F5cyBjb3JyZWN0XG4gKiBhd2FpdCByZWYud2hlbkF2YWlsYWJsZSgpOyAgICAvLyBvbmUtc2hvdCBmbG93czsgcmVqZWN0cyB3aXRoIGEgdHlwZWQsIGNsYXNzaWZpZWQgZXJyb3JcbiAqIHJlZi5vbignY2hhbmdlJywgKCkgPT4geyB9KTsgLy8gZm9yIGNvbnN1bWVycyB0aGF0IG11c3QgUkVBQ1QgcmF0aGVyIHRoYW4gcmVhZFxuICogYGBgXG4gKlxuICogV2hhdCB0aGlzIGZpeGVzLCByZWxhdGl2ZSB0byBwdWJsaXNoaW5nIGEgYmFyZSBvYmplY3Qgb24gYHdpbmRvdy5QbHVnaW5BcGlgOlxuICpcbiAqIC0gKipMb2FkIG9yZGVyLioqIFRoZSByZWYgc3Vic2NyaWJlczsgaXQgZG9lcyBub3Qgc2FtcGxlLiBSZWFkaW5nIGBudWxsYCBkdXJpbmcgYG9ubG9hZGAgbWVhbnMgXCJub3QgeWV0XCIsXG4gKiAgIGFuZCBpdCBiZWNvbWVzIG5vbi1gbnVsbGAgb24gaXRzIG93bi5cbiAqIC0gKipWZXJzaW9uIG5lZ290aWF0aW9uLioqIFRoZSBwcm92aWRlciBkZWNsYXJlcyBhIGNvbnRyYWN0IHZlcnNpb247IHRoZSBjb25zdW1lciBkZWNsYXJlcyB0aGUgcmFuZ2UgaXRcbiAqICAgY29tcGlsZWQgYWdhaW5zdDsgdGhlIGhpZ2hlc3Qgc2F0aXNmeWluZyByZWNvcmQgd2lucy5cbiAqIC0gKipTdGFsZSBoYW5kbGVzLioqIFRoZSB2YWx1ZSBpcyBhIHJldm9jYWJsZSBoYW5kbGUgXHUyMDE0IGFmdGVyIHRoZSBwcm92aWRlciB1bmxvYWRzLCBhIHByb3BlcnR5IHJlYWQgdGhyb3dzXG4gKiAgIGEge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0gbmFtaW5nIHRoZSBwcm92aWRlciBpbnN0ZWFkIG9mIGEgbnVsbCBkZXJlZiBkZWVwIGluIHNvbWVvbmUgZWxzZSdzIHN0YWNrLlxuICogLSAqKkZyZWUtc3RyaW5nIG5hbWVzLioqIFJlY29yZHMgYXJlIGtleWVkIGJ5IGBwbHVnaW4ubWFuaWZlc3QuaWRgLCB3aGljaCBPYnNpZGlhbiBhbHJlYWR5IGtlZXBzIHVuaXF1ZS5cbiAqIC0gKipMZWdpYmxlIGZhaWx1cmUuKioge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSByZWplY3RzIHdpdGggYVxuICogICB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gY2FycnlpbmcgYSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb259LCBzbyB0aGUgZml2ZSBkaXN0aW5jdFxuICogICBjYXVzZXMgYXJlIHRvbGQgYXBhcnQuXG4gKlxuICogUGF5bG9hZCB2YWxpZGF0aW9uIGlzIG9wdC1pbiBwZXIgbWV0aG9kIHRocm91Z2gge0BsaW5rIGh0dHBzOi8vc3RhbmRhcmRzY2hlbWEuZGV2IHwgU3RhbmRhcmQgU2NoZW1hfSwgc29cbiAqIHpvZCAvIHZhbGlib3QgLyBhcmt0eXBlIC8gYSBoYW5kLXdyaXR0ZW4gdmFsaWRhdG9yIGFsbCBwbHVnIGluIGFuZCBub25lIG9mIHRoZW0gaXMgYSBkZXBlbmRlbmN5IGhlcmUuIEl0XG4gKiBydW5zIG9ubHkgd2hpbGUgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHM6UGx1Z2luQXBpYCBkZWJ1Z2dlciBpcyBlbmFibGVkLCBzbyBwcm9kdWN0aW9uIHBheXMgbm90aGluZy5cbiAqXG4gKiBAcmVtYXJrc1xuICogRXZlcnkgcGx1Z2luIGJ1bmRsZXMgaXRzIE9XTiBjb3B5IG9mIGBvYnNpZGlhbi1kZXYtdXRpbHNgLCBzbyBhIHJlZ2lzdHJ5IHJlY29yZCBpcyBhIHdpcmUgZm9ybWF0IGJldHdlZW5cbiAqIGRpZmZlcmVudCBsaWJyYXJ5IHZlcnNpb25zIGFuZCBtdXN0IHN0YXkgYmFja3dhcmQtY29tcGF0aWJsZSBmb3JldmVyLiBOb3RoaW5nIGNyb3NzaW5nIGl0IG1heSBiZVxuICogYGluc3RhbmNlb2ZgLWNoZWNrZWQgXHUyMDE0IHJlYWRzIGFyZSBzdHJ1Y3R1cmFsLCBhbmQgb25seSBwbGFpbiBkYXRhIG9iamVjdHMgYW5kIHBsYWluIGZ1bmN0aW9ucyBhcmUgc3RvcmVkLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhbmRhcmRTY2hlbWFWMSB9IGZyb20gJ0BzdGFuZGFyZC1zY2hlbWEvc3BlYyc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ29tcG9uZW50LFxuICBQbHVnaW5cbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIHNhdGlzZmllcyBhcyBzYXRpc2ZpZXNWZXJzaW9uXG59IGZyb20gJ2NvbXBhcmUtdmVyc2lvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jRXZlbnRTb3VyY2UgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJy4uLy4uL2FycmF5LnRzJztcbmltcG9ydCB7IG1peGluQXN5bmNFdmVudHMgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHtcbiAgaW52b2tlQXN5bmNTYWZlbHksXG4gIHJ1bldpdGhUaW1lb3V0XG59IGZyb20gJy4uLy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgY2FzdFRvIH0gZnJvbSAnLi4vLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uLy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5cbmNvbnN0IFBMVUdJTl9BUElfREVCVUdHRVJfTkFNRVNQQUNFID0gJ1BsdWdpbkFwaSc7XG5jb25zdCBQTFVHSU5fQVBJX1JFR0lTVFJZX1NUQVRFX0tFWSA9ICdwbHVnaW5BcGlSZWdpc3RyeSc7XG5cbi8qKlxuICogSG93IGxvbmcge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSB3YWl0cyBiZWZvcmUgZ2l2aW5nIHVwIGFuZCBjbGFzc2lmeWluZyB0aGUgZmFpbHVyZS5cbiAqL1xuY29uc3QgREVGQVVMVF9XSEVOX0FWQUlMQUJMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcblxuLyoqXG4gKiBXaGljaCBoYWxmIG9mIGEgbWV0aG9kIGNhbGwgYSB2YWxpZGF0aW9uIGZhaWx1cmUgY2FtZSBmcm9tLlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BcGlQYXlsb2FkS2luZCB7XG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kJ3MgYXJndW1lbnRzLlxuICAgKi9cbiAgSW5wdXQgPSAnaW5wdXQnLFxuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgT3V0cHV0ID0gJ291dHB1dCdcbn1cblxuLyoqXG4gKiBUaGUgcmVhc29uIGEgcGx1Z2luIEFQSSBjb3VsZCBub3QgYmUgaGFuZGVkIG92ZXIuXG4gKlxuICogVGhlIHdob2xlIHBvaW50IG9mIHRoZSBlbnVtIGlzIHRoYXQgdGhlc2UgYXJlIHRvbGQgYXBhcnQuIGBAdmFuYWthdC9wbHVnaW4tYXBpYCBjYW5ub3QgdGVsbCBhbnkgb2YgdGhlbVxuICogYXBhcnQsIGFuZCBub3QgdW5pZm9ybWx5OiBgTm90SW5zdGFsbGVkYCAvIGBOb3RFbmFibGVkYCAvIGBOb3RQdWJsaXNoZWRgIGFsbCByZWR1Y2UgdG8gb25lIGBOb3RpY2VgIHBsdXNcbiAqIGB1bmRlZmluZWRgLCB3aGlsZSBgVmVyc2lvbk1pc21hdGNoYCAvIGBTaGFwZU1pc21hdGNoYCBwcm9kdWNlIE5PIHNpZ25hbCBhdCBhbGwgXHUyMDE0IGl0IG5ldmVyIGV4YW1pbmVzIHdoYXQgaXRcbiAqIGZvdW5kLCBzbyBpdCBoYW5kcyB0aGUgb2JqZWN0IG92ZXIgYW5kIHRoZSBtaXNtYXRjaCBzdXJmYWNlcyBsYXRlciwgc29tZXdoZXJlIGVsc2UsIGFzIHNvbWVib2R5IGVsc2Unc1xuICogYFR5cGVFcnJvcmAuXG4gKlxuICogQHJlbWFya3NcbiAqIHtAbGluayBQbHVnaW5BcGlSZWYud2hlbkF2YWlsYWJsZX0gY2FuIHJlcG9ydCB0aGUgZmlyc3QgZml2ZTsge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlJldm9rZWR9XG4gKiBpcyBub3Qgb25lIG9mIHRoZW0sIGJlY2F1c2UgaXQgZGVzY3JpYmVzIGEgaGFuZGxlIHRoYXQgV0FTIHZhbGlkIGFuZCBpcyBjYXJyaWVkIGJ5XG4gKiB7QGxpbmsgUGx1Z2luQXBpUmV2b2tlZEVycm9yfSBpbnN0ZWFkLlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIGluc3RhbGxlZCBidXQgbm90IGVuYWJsZWQuXG4gICAqL1xuICBOb3RFbmFibGVkID0gJ25vdEVuYWJsZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhpcyB2YXVsdC5cbiAgICovXG4gIE5vdEluc3RhbGxlZCA9ICdub3RJbnN0YWxsZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZCBidXQgaGFzIG5vdCBwdWJsaXNoZWQgYW55IEFQSS5cbiAgICovXG4gIE5vdFB1Ymxpc2hlZCA9ICdub3RQdWJsaXNoZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgaGFuZGxlIHdhcyB2YWxpZCBidXQgdGhlIHByb3ZpZGVyIGhhcyBzaW5jZSB1bmxvYWRlZCwgc28gaXQgaGFzIGJlZW4gcmV2b2tlZC5cbiAgICovXG4gIFJldm9rZWQgPSAncmV2b2tlZCcsXG5cbiAgLyoqXG4gICAqIEEgcmVjb3JkIHNhdGlzZmllcyB0aGUgcmVxdWVzdGVkIHZlcnNpb24gcmFuZ2UsIGJ1dCB0aGUgQVBJIG9iamVjdCBpcyBtaXNzaW5nIGEgbWV0aG9kIHRoZSBjb250cmFjdFxuICAgKiBkZWNsYXJlcyBcdTIwMTQgdGhlIHByb3ZpZGVyJ3Mgc2hpcHBlZCBzaGFwZSBhbmQgaXRzIGRlY2xhcmVkIHNoYXBlIGRpc2FncmVlLlxuICAgKi9cbiAgU2hhcGVNaXNtYXRjaCA9ICdzaGFwZU1pc21hdGNoJyxcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwdWJsaXNoZWQgYW4gQVBJLCBidXQgbm8gcHVibGlzaGVkIGNvbnRyYWN0IHZlcnNpb24gc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgcmFuZ2UuXG4gICAqL1xuICBWZXJzaW9uTWlzbWF0Y2ggPSAndmVyc2lvbk1pc21hdGNoJ1xufVxuXG4vKipcbiAqIFRoZSBjb250cmFjdCBhIHByb3ZpZGVyIGRlY2xhcmVzIGZvciBpdHMgQVBJOiBldmVyeSBrZXkgaXMgYSBtZXRob2QgdGhlIEFQSSBpcyBwcm9taXNpbmcgdG8gZXhwb3NlLCBhbmRcbiAqIGl0cyB2YWx1ZSBvcHRpb25hbGx5IGNhcnJpZXMgdGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgdGhhdCBtZXRob2QuXG4gKlxuICogVGhlIEtFWVMgYXJlIHRoZSBwYXJ0IHRoYXQgYWx3YXlzIG1hdHRlcnMgXHUyMDE0IHRoZXkgZHJpdmUgdGhlIHNoYXBlIGNoZWNrIHRoYXQgZGVjaWRlcyB3aGV0aGVyIGEgcHVibGlzaGVkXG4gKiByZWNvcmQgaXMgdXNhYmxlIGF0IGFsbC4gVGhlIHNjaGVtYXMgYXJlIG9wdGlvbmFsIGFuZCBvbmx5IGV2ZXIgY29uc3VsdGVkIHdoaWxlIGRlYnVnZ2luZy5cbiAqXG4gKiBAcmVtYXJrc1xuICogV2h5IHRoZSBzaGFwZSBjaGVjayBpcyBhIGB0eXBlb2ZgIHJhdGhlciB0aGFuIGEgc2NoZW1hIG92ZXIgdGhlIHdob2xlIEFQSSBvYmplY3QuIEluIHpvZCA0IGB6LmZ1bmN0aW9uKClgXG4gKiByZXR1cm5zIGEgZnVuY3Rpb24gRkFDVE9SWSwgbm90IGEgc2NoZW1hLCBzbyBpdCBjYW5ub3QgYmUgYSBgei5vYmplY3QoKWAgbWVtYmVyIGRpcmVjdGx5LiBUaGVyZSBpcyBhIGtub3duXG4gKiB3b3JrYXJvdW5kICh6b2QjNDE0MykgXHUyMDE0IGB6LmN1c3RvbSgoZm4pID0+IGZ1bmN0aW9uU2NoZW1hLmltcGxlbWVudChmbikpYCBcdTIwMTQgYW5kIGl0IGRvZXMgYnV5IGNvcnJlY3RcbiAqIGB6LmluZmVyYCB0eXBlcyBmb3IgYSBmdW5jdGlvbiBtZW1iZXIuIEl0IGRvZXMgbm90IGJ1eSBydW50aW1lIHZhbGlkYXRpb24gaGVyZSwgdGhvdWdoOiBgei5jdXN0b21gIGlzIGFcbiAqIGJvb2xlYW4gcHJlZGljYXRlIHRoYXQgcmV0dXJucyBpdHMgaW5wdXQgdW5jaGFuZ2VkLCBzbyB0aGUgdmFsaWRhdGluZyB3cmFwcGVyIGBpbXBsZW1lbnRgIGJ1aWxkcyBpc1xuICogZGlzY2FyZGVkIGFuZCB0aGUgY2hlY2sgY29sbGFwc2VzIGJhY2sgdG8gXCJpcyBpdCBjYWxsYWJsZVwiLiBLZWVwaW5nIHRoYXQgd3JhcHBlciB3b3VsZCBuZWVkIGEgZnVydGhlclxuICogYC50cmFuc2Zvcm0oKWAsIGFuZCB3b3VsZCB0aGVuIG1vdmUgdmFsaWRhdGlvbiBvbnRvIGV2ZXJ5IGNhbGwgaW5zdGVhZCBvZiBiZWhpbmQgdGhlIGRlYnVnIGdhdGUsIGFuZCBiaW5kXG4gKiB0aGUgY29udHJhY3QgdG8gem9kIHNwZWNpZmljYWxseSBcdTIwMTQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHJlYWNoaW5nIHRocm91Z2ggU3RhbmRhcmQgU2NoZW1hIGF2b2lkcy4gU28gdGhlXG4gKiBkZWNsYXJlZCBtZXRob2QgbmFtZXMgYXJlIGNoZWNrZWQgd2l0aCBgdHlwZW9mYCwgYW5kIHRoZSBwYXlsb2FkcyBhcmUgdmFsaWRhdGVkIHBlciBtZXRob2QgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luQXBpQ29udHJhY3QgPSBSZWNvcmQ8c3RyaW5nLCBQbHVnaW5BcGlNZXRob2RDb250cmFjdD47XG5cbi8qKlxuICogT25lIEFQSSBhIHBsdWdpbiBleHBvc2VzOiB0aGUgb2JqZWN0LCB0aGUgY29udHJhY3QgdmVyc2lvbiBpdCBzYXRpc2ZpZXMsIGFuZCBvcHRpb25hbGx5IHRoZSBjb250cmFjdFxuICogaXRzZWxmLiBUaGlzIGlzIHtAbGluayBQdWJsaXNoUGx1Z2luQXBpUGFyYW1zfSB3aXRob3V0IHRoZSBwdWJsaXNoaW5nIHBsdWdpbiwgc28gYSBwbHVnaW4gY2FuIERFQ0xBUkUgd2hhdFxuICogaXQgZXhwb3NlcyB3aXRob3V0IGFsc28gc3RhdGluZyB3aG8gaXMgcHVibGlzaGluZyBpdCBcdTIwMTQgd2hpY2ggaXMgd2hhdCBsZXRzIGBQbHVnaW5CYXNlLmdldFBsdWdpbkFwaXNgIGNvbGxlY3RcbiAqIHRoZSBkZWNsYXJhdGlvbnMgYW5kIGRvIHRoZSBwdWJsaXNoaW5nIGl0c2VsZi5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgYmVpbmcgZGVjbGFyZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpRGVjbGFyYXRpb248VEFwaSBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAvKipcbiAgICogVGhlIEFQSSBvYmplY3QgdG8gcHVibGlzaC4gSXRzIG1ldGhvZHMgYXJlIGhhbmRlZCB0byBjb25zdW1lcnMgdGhyb3VnaCBhIHJldm9jYWJsZSBoYW5kbGUsIGFuZCB0aGV5IGFyZVxuICAgKiBhbHdheXMgaW52b2tlZCB3aXRoIHRoaXMgb2JqZWN0IGFzIHRoZWlyIGB0aGlzYCwgc28gYW4gaW1wbGVtZW50YXRpb24gdXNpbmcgcHJpdmF0ZSBjbGFzcyBmaWVsZHMga2VlcHNcbiAgICogd29ya2luZy5cbiAgICovXG4gIHJlYWRvbmx5IGFwaTogVEFwaTtcblxuICAvKipcbiAgICogVGhlIENPTlRSQUNUIHZlcnNpb24sIGluIHNlbXZlciBmb3JtIFx1MjAxNCBpbmRlcGVuZGVudCBvZiB0aGUgcGx1Z2luJ3Mgb3duIHZlcnNpb24uIFBsdWdpbiBgMS40LjdgIG1heVxuICAgKiBwZXJmZWN0bHkgd2VsbCBleHBvc2UgQVBJIGAyLjAuMGAuXG4gICAqL1xuICByZWFkb25seSBhcGlWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250cmFjdCB0aGlzIHZlcnNpb24gb2YgdGhlIEFQSSBzYXRpc2ZpZXMuIE9wdGlvbmFsOiB3aGVuIG9taXR0ZWQsIG5vIHNoYXBlIGNoZWNrIGlzIHBlcmZvcm1lZCBvblxuICAgKiB0aGUgcHJvdmlkZXIncyBiZWhhbGYgYW5kIHRoZSBjb25zdW1lcidzIG93biBjb250cmFjdCAoaWYgYW55KSBpcyB1c2VkIGluc3RlYWQuXG4gICAqL1xuICByZWFkb25seSBjb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0O1xufVxuXG4vKipcbiAqIFRoZSBwYXlsb2FkIHNjaGVtYXMgZm9yIGEgc2luZ2xlIEFQSSBtZXRob2QuIEJvdGggaGFsdmVzIGFyZSBvcHRpb25hbDogYSBtZXRob2QgbWF5IGRlY2xhcmUgb25seSBpdHMgaW5wdXQsXG4gKiBvbmx5IGl0cyBvdXRwdXQsIG5laXRoZXIgKHRoZSBlbnRyeSB0aGVuIGp1c3QgZGVjbGFyZXMgdGhhdCB0aGUgbWV0aG9kIG11c3QgZXhpc3QpLCBvciBib3RoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaU1ldGhvZENvbnRyYWN0IHtcbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgbWV0aG9kJ3MgYXJndW1lbnRzLCBhcyBhbiBhcnJheS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0PzogU3RhbmRhcmRTY2hlbWFWMTtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUgXHUyMDE0IG9yLCB3aGVuIHRoZSBtZXRob2QgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgdmFsdWUgaXQgcmVzb2x2ZXMgdG8uXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ/OiBTdGFuZGFyZFNjaGVtYVYxO1xufVxuXG4vKipcbiAqIEEgbGl2ZSByZWZlcmVuY2UgdG8gYW5vdGhlciBwbHVnaW4ncyBBUEkuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0eXBlIHRoZSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgcmVmIGlzIHRoZSBXSE9MRSBjb25zdW1lciBzdXJmYWNlLCBkZWxpYmVyYXRlbHkuIEEgcGxhaW4ge0BsaW5rIFByb21pc2V9IGNhbm5vdCBtb2RlbCB0aGlzIGJlY2F1c2UgaXRcbiAqIHNldHRsZXMgb25jZSwgd2hlcmVhcyBhdmFpbGFiaWxpdHkgaXMgYSByZXBlYXRpbmcgc2lnbmFsIChhdmFpbGFibGUgXHUyMTkyIGdvbmUgXHUyMTkyIGF2YWlsYWJsZSBhZ2FpbiBhY3Jvc3MgYVxuICogZGlzYWJsZS9lbmFibGUgY3ljbGUpIFx1MjAxNCB3aGljaCBpcyB3aHkge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSBpcyBhIG1ldGhvZCBPTiB0aGUgcmVmIHJhdGhlciB0aGFuXG4gKiB0aGUgdGhpbmcgaGFuZGVkIGJhY2suIFRoZSBgY2hhbmdlYCBldmVudCBleGlzdHMgZm9yIGNvbnN1bWVycyB0aGF0IG11c3QgcmVhY3QgcmF0aGVyIHRoYW4gcmVhZCwgYW5kIGlzXG4gKiBzZWNvbmRhcnk6IGl0IGltcG9zZXMgbm8gY2VyZW1vbnkgb24gdGhlIGNvbW1vbiBjYXNlLCB3aGljaCBpcyByZWFkaW5nIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVJlZjxUQXBpIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIEFzeW5jRXZlbnRTb3VyY2U8UGx1Z2luQXBpUmVmRXZlbnRNYXA+IHtcbiAgLyoqXG4gICAqIFRoZSBBUEksIG9yIGBudWxsYCB3aGVuIGl0IGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBBbHdheXMgY3VycmVudCwgc3luY2hyb25vdXMsIGFuZCBmcmVlIFx1MjAxNCB0aGUgcmVmIG1haW50YWlucyBpdCwgc28gdGhlcmUgaXMgbm8gcmVnaXN0cnkgbG9va3VwIHBlciByZWFkLlxuICAgKiBgbnVsbGAgaGVyZSBtZWFucyBcIm5vdCBhdmFpbGFibGUgcmlnaHQgbm93XCIsIE5PVCBcIm5vdCBpbnN0YWxsZWRcIjogZHVyaW5nIGEgY29uc3VtZXIncyBgb25sb2FkYCB0aGVcbiAgICogcHJvdmlkZXIgbWF5IHNpbXBseSBub3QgaGF2ZSBsb2FkZWQgeWV0LCBhbmQgdGhlIHZhbHVlIGJlY29tZXMgbm9uLWBudWxsYCBvbiBpdHMgb3duLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IG51bGwgfCBUQXBpO1xuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIEFQSSB0byBiZWNvbWUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgd2FpdC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBBUEkuXG4gICAqIEB0aHJvd3MgQSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gd2hvc2Uge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3IucmVhc29ufSBzYXlzIHdoaWNoIG9mXG4gICAqIHRoZSBmaXZlIGZhaWx1cmVzIG9jY3VycmVkLCBpZiB0aGUgQVBJIGRvZXMgbm90IGJlY29tZSBhdmFpbGFibGUgYmVmb3JlIHRoZSB0aW1lb3V0IGVsYXBzZXMuXG4gICAqL1xuICB3aGVuQXZhaWxhYmxlKG9wdGlvbnM/OiBXaGVuQXZhaWxhYmxlUGx1Z2luQXBpT3B0aW9ucyk6IFByb21pc2U8VEFwaT47XG59XG5cbi8qKlxuICogVGhlIGV2ZW50cyBhIHtAbGluayBQbHVnaW5BcGlSZWZ9IGZpcmVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVJlZkV2ZW50TWFwIHtcbiAgLyoqXG4gICAqIEZpcmVkIHdoZW5ldmVyIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9IGNoYW5nZXMgXHUyMDE0IGluY2x1ZGluZyB3aGVuIGl0IGJlY29tZXMgYG51bGxgIGJlY2F1c2UgdGhlIHByb3ZpZGVyXG4gICAqIHVubG9hZGVkLlxuICAgKi9cbiAgY2hhbmdlOiBbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3J9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBleHBsaWNpdCBtZXNzYWdlLiBXaGVuIG9taXR0ZWQsIG9uZSBpcyBkZXJpdmVkIGZyb20gdGhlIHBsdWdpbiBpZCBhbmQgdGhlIHJlYXNvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4gd2hvc2UgQVBJIHdhcyByZXF1ZXN0ZWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBvY2N1cnJlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb247XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3J9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBpc3N1ZXMgdGhlIHNjaGVtYSByZXBvcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzc3VlczogcmVhZG9ubHkgU3RhbmRhcmRTY2hlbWFWMS5Jc3N1ZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHdob3NlIHBheWxvYWQgZmFpbGVkIHZhbGlkYXRpb24uXG4gICAqL1xuICByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGlucHV0IG9yIHRoZSBvdXRwdXQgZmFpbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZEtpbmQ6IFBsdWdpbkFwaVBheWxvYWRLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcHJvdmlkaW5nIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHB1Ymxpc2hQbHVnaW5BcGl9LlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdHlwZSBiZWluZyBwdWJsaXNoZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGlzaFBsdWdpbkFwaVBhcmFtczxUQXBpIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIFBsdWdpbkFwaURlY2xhcmF0aW9uPFRBcGk+IHtcbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgd2hvc2UgdW5sb2FkIHJldm9rZXMgdGhlIHJlY29yZC4gRGVmYXVsdHMgdG8ge0BsaW5rIFB1Ymxpc2hQbHVnaW5BcGlQYXJhbXMucGx1Z2lufSwgd2hpY2ggaXNcbiAgICogdGhlIHJpZ2h0IG93bmVyIGZvciBhbiBBUEkgcHVibGlzaGVkIGZvciBhcyBsb25nIGFzIHRoZSBwbHVnaW4gcnVucy5cbiAgICpcbiAgICogUGFzcyBhIG5hcnJvd2VyIG9uZSB3aGVuIHRoZSBBUEkgaXMgb25seSB2YWxpZCBmb3IgcGFydCBvZiB0aGUgcGx1Z2luJ3MgbGlmZSBcdTIwMTQgYSBwbHVnaW4gd2hvc2UgZmVhdHVyZVxuICAgKiBzdXJmYWNlIGlzIHRvcm4gZG93biBhbmQgcmVidWlsdCB3aGlsZSB0aGUgcGx1Z2luIGl0c2VsZiBzdGF5cyBsb2FkZWQgbXVzdCByZXZva2Ugd2l0aCB0aGUgc3VyZmFjZSwgb3IgaXRcbiAgICogbGVhdmVzIGNvbnN1bWVycyBob2xkaW5nIGhhbmRsZXMgaW50byBjb2RlIHRoYXQgaXMgbm8gbG9uZ2VyIHRoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50PzogQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgcHVibGlzaGluZyBwbHVnaW4uIFRoZSByZWNvcmQgaXMga2V5ZWQgYnkgaXRzIGBtYW5pZmVzdC5pZGAgYW5kIHJldm9rZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBwbHVnaW5cbiAgICogdW5sb2FkcywgdmlhIGBwbHVnaW4ucmVnaXN0ZXIoKWAuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgd2F0Y2hQbHVnaW5BcGl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNoUGx1Z2luQXBpUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBzZW12ZXIgcmFuZ2Ugb2YgY29udHJhY3QgdmVyc2lvbnMgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QsIGUuZy4gYCdeMidgLiBUaGUgaGlnaGVzdCBwdWJsaXNoZWRcbiAgICogdmVyc2lvbiBzYXRpc2Z5aW5nIGl0IHdpbnMuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoZSByYW5nZSBpcyBldmFsdWF0ZWQgYnkgYGNvbXBhcmUtdmVyc2lvbnNgLCB3aGljaCBhY2NlcHRzIGBeYCwgYH5gLCBjb21wYXJpc29uIG9wZXJhdG9ycywgYW5kIGB4YFxuICAgKiB3aWxkY2FyZHMgXHUyMDE0IGJ1dCBOT1QgYSBiYXJlIGAqYC4gU3BlbGwgXCJhbnkgdmVyc2lvblwiIGFzIGAnPj0wLjAuMCdgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UsIHVzZWQgdG8gY2xhc3NpZnkgYSBmYWlsdXJlIGFzIG5vdC1pbnN0YWxsZWQgdnMgbm90LWVuYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGNvbXBvbmVudCBvd25pbmcgdGhlIHN1YnNjcmlwdGlvbi4gVGhlIHdhdGNoIGlzIHRvcm4gZG93biB3aGVuIGl0IHVubG9hZHMuXG4gICAqL1xuICByZWFkb25seSBjb21wb25lbnQ6IENvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIGNvbnRyYWN0IHRoZSBDT05TVU1FUiBleHBlY3RzLiBPcHRpb25hbCwgYW5kIGl0IHdpbnMgb3ZlciB0aGUgcHJvdmlkZXIncyBwdWJsaXNoZWQgY29udHJhY3Qgd2hlblxuICAgKiBzdXBwbGllZCBcdTIwMTQgaXQgaXMgdGhlIGNvbnN1bWVyJ3Mgb3duIGNvbXBpbGVkLWFnYWluc3QgZXhwZWN0YXRpb24sIHNvIGl0IGlzIHRoZSBvbmUgd2hvc2UgdmlvbGF0aW9uIGlzXG4gICAqIHRoZSBjb25zdW1lcidzIHByb2JsZW0uXG4gICAqL1xuICByZWFkb25seSBjb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0O1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcHJvdmlkaW5nIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaGVuQXZhaWxhYmxlUGx1Z2luQXBpT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXAgYW5kIGNsYXNzaWZ5aW5nIHRoZSBmYWlsdXJlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMDAwMFxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjcmVhdGVNZXRob2RXcmFwcGVyfS5cbiAqL1xuaW50ZXJmYWNlIENyZWF0ZU1ldGhvZFdyYXBwZXJQYXJhbXMge1xuICByZWFkb25seSBtZXRob2RDb250cmFjdDogUGx1Z2luQXBpTWV0aG9kQ29udHJhY3QgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBodW1hbi1yZWFkYWJsZSBuYW1lIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMgYW5kIGRlYnVnIG91dHB1dC4gTk9UIGEga2V5IFx1MjAxNCBzZWUge0BsaW5rIHByb3BlcnR5S2V5fS5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZE5hbWU6IHN0cmluZztcblxuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUga2V5IHRoZSBtZXRob2QgaXMgYWN0dWFsbHkgcmVhZCBieSwgd2hpY2ggbWF5IGJlIGEgc3ltYm9sLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvcGVydHlLZXk6IFByb3BlcnR5S2V5O1xuXG4gIHJlYWRvbmx5IHRhcmdldDogb2JqZWN0O1xufVxuXG4vKipcbiAqIFRoZSByZWFsbS1nbG9iYWwgcmVnaXN0cnkgc2hhcmVkIGJ5IGV2ZXJ5IGBvYnNpZGlhbi1kZXYtdXRpbHNgIGNvcHkgaW4gdGhlIHJlbmRlcmVyLlxuICovXG5pbnRlcmZhY2UgUGx1Z2luQXBpUmVnaXN0cnkge1xuICByZWNvcmRzOiBSZWNvcmQ8c3RyaW5nLCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmRbXT47XG4gIHN1YnNjcmliZXJzOiAoKCkgPT4gdm9pZClbXTtcbn1cblxuLyoqXG4gKiBBIHJlY29yZCBhcyBpdCBzaXRzIGluIHRoZSBzaGFyZWQgcmVnaXN0cnkuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgaXMgdGhlIFdJUkUgRk9STUFUIGJldHdlZW4gZGlmZmVyZW50IGBvYnNpZGlhbi1kZXYtdXRpbHNgIGNvcGllcywgc28gaXQgaG9sZHMgbm90aGluZyBidXQgcGxhaW4gZGF0YVxuICogYW5kIHBsYWluIGZ1bmN0aW9ucywgYW5kIGV2ZXJ5IHJlYWQgb2YgaXQgZWxzZXdoZXJlIGluIHRoaXMgZmlsZSBpcyBzdHJ1Y3R1cmFsLlxuICovXG5pbnRlcmZhY2UgUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkIHtcbiAgYXBpOiBvYmplY3Q7XG4gIGFwaVZlcnNpb246IHN0cmluZztcbiAgY29udHJhY3Q6IFBsdWdpbkFwaUNvbnRyYWN0O1xuICBpc1Jldm9rZWQ6IGJvb2xlYW47XG4gIHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHZhbGlkYXRlUGF5bG9hZH0uXG4gKi9cbmludGVyZmFjZSBWYWxpZGF0ZVBheWxvYWRQYXJhbXMge1xuICByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBheWxvYWRLaW5kOiBQbHVnaW5BcGlQYXlsb2FkS2luZDtcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2NoZW1hOiBTdGFuZGFyZFNjaGVtYVYxO1xuICByZWFkb25seSB2YWx1ZTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBIb2xkcyB3aGF0IGEgd2F0Y2ggbmVlZHMgcmVnYXJkbGVzcyBvZiB0aGUgQVBJIHR5cGUgaXQgaXMgdHlwZWQgYWdhaW5zdCwgc28gdGhlIHtAbGluayBtaXhpbkFzeW5jRXZlbnRzfVxuICogbWl4aW4gaGFzIGEgcmVhbCBiYXNlIHRvIGV4dGVuZC5cbiAqL1xuYWJzdHJhY3QgY2xhc3MgUGx1Z2luQXBpV2F0Y2hCYXNlIHtcbiAgcHJvdGVjdGVkIGhhbmRsZTogbnVsbCB8IG9iamVjdCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIHJlY29yZDogbnVsbCB8IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCA9IG51bGw7XG5cbiAgLy8gQSBgcHJvdGVjdGVkYCBjb25zdHJ1Y3RvciBpcyBub3QgYXNzaWduYWJsZSB0byBgQWJzdHJhY3RDb25zdHJ1Y3RvcjxvYmplY3Q+YCwgd2hpY2ggaXMgd2hhdFxuICAvLyBgbWl4aW5Bc3luY0V2ZW50c2AgYWNjZXB0cywgc28gdGhpcyBzdGF5cyBwdWJsaWMgZXZlbiB0aG91Z2ggb25seSB0aGUgc3ViY2xhc3MgYmVsb3cgY2FsbHMgaXQuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcGFyYW1zOiBXYXRjaFBsdWdpbkFwaVBhcmFtcykge31cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBlcnJvciBkZXNjcmliaW5nIHdoeSB0aGUgQVBJIGlzIG5vdCBhdmFpbGFibGUgcmlnaHQgbm93LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY2xhc3NpZmllZCBlcnJvci5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVVbmF2YWlsYWJsZUVycm9yKCk6IFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3Ige1xuICAgIHJldHVybiBuZXcgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcih7XG4gICAgICBwbHVnaW5JZDogdGhpcy5wYXJhbXMucGx1Z2luSWQsXG4gICAgICByZWFzb246IHJlc29sdmVVbmF2YWlsYWJpbGl0eVJlYXNvbih0aGlzLnBhcmFtcylcbiAgICB9KTtcbiAgfVxufVxuXG5jbGFzcyBQbHVnaW5BcGlSZWZJbXBsPFRBcGkgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgbWl4aW5Bc3luY0V2ZW50czxQbHVnaW5BcGlSZWZFdmVudE1hcD4oKShQbHVnaW5BcGlXYXRjaEJhc2UpIGltcGxlbWVudHMgUGx1Z2luQXBpUmVmPFRBcGk+IHtcbiAgcHVibGljIGdldCB2YWx1ZSgpOiBudWxsIHwgVEFwaSB7XG4gICAgcmV0dXJuIGNhc3RUbzxudWxsIHwgVEFwaT4odGhpcy5oYW5kbGUpO1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29tcHV0ZXMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgcmVnaXN0cnksIGZpcmluZyBgY2hhbmdlYCBvbmx5IHdoZW4gaXQgYWN0dWFsbHkgY2hhbmdlZC5cbiAgICovXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlY29yZCA9IHNlbGVjdFJlY29yZCh0aGlzLnBhcmFtcyk7XG4gICAgaWYgKHJlY29yZCA9PT0gdGhpcy5yZWNvcmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlY29yZCA9IHJlY29yZDtcbiAgICB0aGlzLmhhbmRsZSA9IHJlY29yZCA9PT0gbnVsbCA/IG51bGwgOiBjcmVhdGVSZXZvY2FibGVIYW5kbGUocmVjb3JkLCB0aGlzLnBhcmFtcy5jb250cmFjdCk7XG4gICAgdGhpcy50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB3aGVuQXZhaWxhYmxlKG9wdGlvbnM/OiBXaGVuQXZhaWxhYmxlUGx1Z2luQXBpT3B0aW9ucyk6IFByb21pc2U8VEFwaT4ge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJ1bldpdGhUaW1lb3V0PFRBcGk+KHtcbiAgICAgICAgb3BlcmF0aW9uRnVuY3Rpb246IGFzeW5jIChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPFRBcGk+ID0+IGF3YWl0IHRoaXMud2FpdEZvclZhbHVlKGFib3J0U2lnbmFsKSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogYHdhdGNoUGx1Z2luQXBpKFwiJHt0aGlzLnBhcmFtcy5wbHVnaW5JZH1cIikud2hlbkF2YWlsYWJsZWAsXG4gICAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucz8udGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfV0hFTl9BVkFJTEFCTEVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgdGhpcy5jcmVhdGVVbmF2YWlsYWJsZUVycm9yKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yVmFsdWUoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTxUQXBpPiB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPFRBcGk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFRoZSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkIEZJUlNUIGFuZCBpbnZva2VkIHRocm91Z2ggYSB0aHVuaywgc28gYGV2ZW50UmVmYCBpcyBhbHJlYWR5IGJvdW5kIGJ5IHRoZVxuICAgICAgLy8gVGltZSBhbnl0aGluZyBjYW4gcmVhY2ggaXQgXHUyMDE0IHdoaWNoIGlzIHdoYXQgbGV0cyBgY2xlYW5VcGAgYmUgdW5jb25kaXRpb25hbCByYXRoZXIgdGhhbiBudWxsLWd1YXJkZWQuXG4gICAgICBjb25zdCBldmVudFJlZiA9IHRoaXMub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgaGFuZGxlQ2hhbmdlKCk7XG4gICAgICB9KTtcblxuICAgICAgZnVuY3Rpb24gY2xlYW5VcCgpOiB2b2lkIHtcbiAgICAgICAgZXZlbnRSZWYuYXN5bmNFdmVudFNvdXJjZS5vZmZyZWYoZXZlbnRSZWYpO1xuICAgICAgICBhYm9ydFNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGhhbmRsZUFib3J0KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaGFuZGxlQWJvcnQoKTogdm9pZCB7XG4gICAgICAgIGNsZWFuVXAoKTtcbiAgICAgICAgcmVqZWN0KGFib3J0U2lnbmFsLnJlYXNvbiBhcyBFcnJvcik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGFib3J0U2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgaGFuZGxlQWJvcnQpO1xuICAgICAgaGFuZGxlQ2hhbmdlKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHBsdWdpbiBBUEkgY2Fubm90IGJlIGhhbmRlZCBvdmVyLCBjYXJyeWluZyB0aGUge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29ufSB0aGF0IHNheXNcbiAqIHdoeS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luIHdob3NlIEFQSSB3YXMgcmVxdWVzdGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9mIHRoZSBmaXZlIGZhaWx1cmVzIG9jY3VycmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlYXNvbjogUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb247XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVycm9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zLm1lc3NhZ2UgPz8gYFRoZSBBUEkgb2YgdGhlIHBsdWdpbiBcIiR7cGFyYW1zLnBsdWdpbklkfVwiIGlzIHVuYXZhaWxhYmxlOiAke3BhcmFtcy5yZWFzb259LmApO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yJztcbiAgICB0aGlzLnBsdWdpbklkID0gcGFyYW1zLnBsdWdpbklkO1xuICAgIHRoaXMucmVhc29uID0gcGFyYW1zLnJlYXNvbjtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgcHJvcGVydHkgaXMgcmVhZCBmcm9tIGEgaGFuZGxlIHdob3NlIHByb3ZpZGVyIGhhcyBzaW5jZSB1bmxvYWRlZC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBwb2ludCBvZiBoYW5kaW5nIG91dCBhIHJldm9jYWJsZSBoYW5kbGUgcmF0aGVyIHRoYW4gdGhlIHJhdyBvYmplY3Q6IGEgY29uc3VtZXIgdGhhdCBjYWNoZWQgdGhlXG4gKiBBUEkgaW4gYSBmaWVsZCBhbmQga2VwdCB1c2luZyBpdCBhY3Jvc3MgYSBkaXNhYmxlIGdldHMgYW4gZXJyb3IgbmFtaW5nIHRoZSBwcm92aWRlciwgaW5zdGVhZCBvZlxuICogYENhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgdW5kZWZpbmVkYCBzb21ld2hlcmUgZGVlcCBpbnNpZGUgYSB0b3JuLWRvd24gcGx1Z2luLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luQXBpUmV2b2tlZEVycm9yIGV4dGVuZHMgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4gd2hvc2UgQVBJIHdhcyByZXZva2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBsdWdpbklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcih7XG4gICAgICBtZXNzYWdlOiBgVGhlIEFQSSBvZiB0aGUgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBoYXMgYmVlbiByZXZva2VkLCBiZWNhdXNlIHRoZSBwbHVnaW4gd2FzIHVubG9hZGVkLmAsXG4gICAgICBwbHVnaW5JZCxcbiAgICAgIHJlYXNvbjogUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uUmV2b2tlZFxuICAgIH0pO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5BcGlSZXZva2VkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBwdWJsaXNoZWQgQVBJJ3MgcGF5bG9hZCBmYWlscyB0aGUgc2NoZW1hIGl0cyBjb250cmFjdCBkZWNsYXJlcy5cbiAqXG4gKiBPbmx5IGV2ZXIgdGhyb3duIHdoaWxlIHRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzOlBsdWdpbkFwaWAgZGVidWdnZXIgaXMgZW5hYmxlZCBcdTIwMTQgaW4gcHJvZHVjdGlvbiB0aGUgbWV0aG9kc1xuICogYXJlIG5vdCB3cmFwcGVkIGF0IGFsbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFRoZSBpc3N1ZXMgdGhlIHNjaGVtYSByZXBvcnRlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc3N1ZXM6IHJlYWRvbmx5IFN0YW5kYXJkU2NoZW1hVjEuSXNzdWVbXTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB3aG9zZSBwYXlsb2FkIGZhaWxlZCB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1ldGhvZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoXG4gICAgICBgVGhlICR7cGFyYW1zLnBheWxvYWRLaW5kfSBvZiBcIiR7cGFyYW1zLnBsdWdpbklkfVwiIEFQSSBtZXRob2QgXCIke3BhcmFtcy5tZXRob2ROYW1lfVwiIGZhaWxlZCB2YWxpZGF0aW9uOiAke2Zvcm1hdElzc3VlcyhwYXJhbXMuaXNzdWVzKX1gXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yJztcbiAgICB0aGlzLmlzc3VlcyA9IHBhcmFtcy5pc3N1ZXM7XG4gICAgdGhpcy5tZXRob2ROYW1lID0gcGFyYW1zLm1ldGhvZE5hbWU7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgfVxufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBhIHBsdWdpbidzIEFQSSBzbyBvdGhlciBwbHVnaW5zIGNhbiBjb25zdW1lIGl0LCBrZXllZCBieSB0aGUgcGx1Z2luJ3MgYG1hbmlmZXN0LmlkYCBhbmQgcmV2b2tlZFxuICogYXV0b21hdGljYWxseSB3aGVuIHRoZSBwbHVnaW4gdW5sb2Fkcy5cbiAqXG4gKiBTZXZlcmFsIGNvbnRyYWN0IHZlcnNpb25zIG1heSBiZSBwdWJsaXNoZWQgc2lkZSBieSBzaWRlLCBzbyBhIHByb3ZpZGVyIGNhbiBtb3ZlIHRvIGAyLjAuMGAgd2l0aG91dCBicmVha2luZ1xuICogY29uc3VtZXJzIHN0aWxsIHBpbm5lZCB0byBgXjFgLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdHlwZSBiZWluZyBwdWJsaXNoZWQuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHB1Ymxpc2hpbmcuXG4gKiBAdGhyb3dzIEFuIHtAbGluayBFcnJvcn0gaWYgdGhpcyBwbHVnaW4gaGFzIGFscmVhZHkgcHVibGlzaGVkIHRoaXMgZXhhY3QgYGFwaVZlcnNpb25gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaFBsdWdpbkFwaTxUQXBpIGV4dGVuZHMgb2JqZWN0PihwYXJhbXM6IFB1Ymxpc2hQbHVnaW5BcGlQYXJhbXM8VEFwaT4pOiB2b2lkIHtcbiAgY29uc3QgcGx1Z2luSWQgPSBwYXJhbXMucGx1Z2luLm1hbmlmZXN0LmlkO1xuICBjb25zdCByZWdpc3RyeSA9IGdldFJlZ2lzdHJ5KCk7XG4gIGNvbnN0IHJlY29yZHMgPSByZWdpc3RyeS5yZWNvcmRzW3BsdWdpbklkXSA/PyBbXTtcbiAgcmVnaXN0cnkucmVjb3Jkc1twbHVnaW5JZF0gPSByZWNvcmRzO1xuXG4gIGlmIChyZWNvcmRzLnNvbWUoKHJlY29yZCkgPT4gcmVjb3JkLmFwaVZlcnNpb24gPT09IHBhcmFtcy5hcGlWZXJzaW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGFscmVhZHkgcHVibGlzaGVkIHRoZSBBUEkgdmVyc2lvbiBcIiR7cGFyYW1zLmFwaVZlcnNpb259XCIuYCk7XG4gIH1cblxuICBjb25zdCByZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCA9IHtcbiAgICBhcGk6IHBhcmFtcy5hcGksXG4gICAgYXBpVmVyc2lvbjogcGFyYW1zLmFwaVZlcnNpb24sXG4gICAgY29udHJhY3Q6IHBhcmFtcy5jb250cmFjdCA/PyB7fSxcbiAgICBpc1Jldm9rZWQ6IGZhbHNlLFxuICAgIHBsdWdpbklkXG4gIH07XG4gIHJlY29yZHMucHVzaChyZWNvcmQpO1xuICBub3RpZnlTdWJzY3JpYmVycygpO1xuXG4gIChwYXJhbXMuY29tcG9uZW50ID8/IHBhcmFtcy5wbHVnaW4pLnJlZ2lzdGVyKCgpID0+IHtcbiAgICByZXZva2VSZWNvcmQocmVjb3JkKTtcbiAgfSk7XG59XG5cbi8qKlxuICogV2F0Y2hlcyBhbm90aGVyIHBsdWdpbidzIEFQSSBhbmQgcmV0dXJucyBhIGxpdmUge0BsaW5rIFBsdWdpbkFwaVJlZn0gd2hvc2Uge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0gc3RheXNcbiAqIGNvcnJlY3QgYWNyb3NzIHRoZSBwcm92aWRlcidzIGxvYWQsIHVubG9hZCwgYW5kIHJlLWVuYWJsZS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBlbnRpcmUgY29uc3VtZXIgc3VyZmFjZS4gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIHN5bmNocm9ub3VzIFwiZ2V0IGl0IG9yIGBudWxsYFwiIHByb2JlOiBhIHByb2JlXG4gKiBvbmx5IGFuc3dlcnMgXCJub3dcIiBhbmQgbmV2ZXIgdGVsbHMgeW91IHdoZW4gXCJub3dcIiBjaGFuZ2VkLCBzbyBjYWxsaW5nIG9uZSBkdXJpbmcgYG9ubG9hZGAgcmVhZHMgYG51bGxgIGFuZFxuICogaW52aXRlcyB0aGUgY29uY2x1c2lvbiBcIm5vdCBpbnN0YWxsZWRcIi4gQSBjb25zdW1lciB0aGF0IG5lZWRzIGEgc3luY2hyb25vdXMgYW5zd2VyIGluc2lkZSBhIGNhbGxiYWNrIHdob3NlXG4gKiBzaWduYXR1cmUgZm9yYmlkcyBgYXdhaXRgIFx1MjAxNCBgY2hlY2tDYWxsYmFjayhpc0NoZWNraW5nKTogYm9vbGVhbmAsIGBjYW5FeGVjdXRlKClgLCBhIHNldHRpbmdzLXJvdyBgdmlzaWJsZWBcbiAqIHByZWRpY2F0ZSBcdTIwMTQgaG9sZHMgdGhlIHJlZiAob3IgdGhlIHZhbHVlIGl0IG1haW50YWlucykgaW4gYSBmaWVsZCBhbmQgcmVhZHMgdGhhdCwgd2hpY2ggaXMgYm90aCBjaGVhcGVyIGFuZFxuICogY29ycmVjdCBhY3Jvc3MgQk9USCBlZGdlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3YXRjaC5cbiAqIEByZXR1cm5zIFRoZSBsaXZlIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoUGx1Z2luQXBpPFRBcGkgZXh0ZW5kcyBvYmplY3Q+KHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpOiBQbHVnaW5BcGlSZWY8VEFwaT4ge1xuICBjb25zdCByZWYgPSBuZXcgUGx1Z2luQXBpUmVmSW1wbDxUQXBpPihwYXJhbXMpO1xuICBjb25zdCB1bnN1YnNjcmliZSA9IHN1YnNjcmliZSgoKSA9PiB7XG4gICAgcmVmLnJlZnJlc2goKTtcbiAgfSk7XG4gIHBhcmFtcy5jb21wb25lbnQucmVnaXN0ZXIodW5zdWJzY3JpYmUpO1xuICByZWYucmVmcmVzaCgpO1xuICByZXR1cm4gcmVmO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWxseSBkZXRlY3RzIGEgdGhlbmFibGUuIEEgY3Jvc3MtY29weSB2YWx1ZSBtYXkgY29tZSBmcm9tIGFub3RoZXIgcmVhbG0sIHNvIGBpbnN0YW5jZW9mIFByb21pc2VgIGlzXG4gKiBub3QgdXNhYmxlIGhlcmUgXHUyMDE0IHRoZSBzYW1lIGRpc2NpcGxpbmUgdGhlIHJlZ2lzdHJ5IHJlY29yZHMgZm9sbG93LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB2YWx1ZSB0aGUgdGhlbmFibGUgcmVzb2x2ZXMgdG8uXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSB2YWx1ZSBpcyB0aGVuYWJsZS5cbiAqL1xuZnVuY3Rpb24gY2hlY2tJc1Byb21pc2VMaWtlPFQ+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJvbWlzZUxpa2U8VD4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgICYmIHZhbHVlICE9PSBudWxsXG4gICAgJiYgJ3RoZW4nIGluIHZhbHVlXG4gICAgJiYgdHlwZW9mICh2YWx1ZSBhcyBQcm9taXNlTGlrZTxUPikudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBldmVyeSBtZXRob2QgdGhlIGVmZmVjdGl2ZSBjb250cmFjdCBkZWNsYXJlcyBpcyBhY3R1YWxseSBwcmVzZW50IG9uIHRoZSBwdWJsaXNoZWQgQVBJLlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIHdoZW4gc3VwcGxpZWQuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgc2hhcGUgbWF0Y2hlcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tNYXRjaGVzQ29udHJhY3RTaGFwZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRyYWN0ID0gY29uc3VtZXJDb250cmFjdCA/PyByZWNvcmQuY29udHJhY3Q7XG4gIHJldHVybiBPYmplY3Qua2V5cyhjb250cmFjdCkuZXZlcnkoKG1ldGhvZE5hbWUpID0+IHR5cGVvZiBnZXRNZW1iZXIocmVjb3JkLmFwaSwgbWV0aG9kTmFtZSkgPT09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZnVuY3Rpb24gYSBjb25zdW1lciBhY3R1YWxseSBjYWxsczogaXQgYWx3YXlzIGludm9rZXMgdGhlIG9yaWdpbmFsIHdpdGggdGhlIHJhdyBBUEkgb2JqZWN0IGFzXG4gKiBgdGhpc2AsIGFuZCBcdTIwMTQgb25seSB3aGlsZSB0aGUgbGlicmFyeSBkZWJ1Z2dlciBpcyBlbmFibGVkIFx1MjAxNCB2YWxpZGF0ZXMgdGhlIGRlY2xhcmVkIHBheWxvYWRzIGFyb3VuZCBpdC5cbiAqXG4gKiBUaGUgZGVidWdnZXIgaXMgY29uc3VsdGVkIHBlciBjYWxsIHJhdGhlciB0aGFuIHBlciB3cmFwLCBzbyB0b2dnbGluZyBgREVCVUdgIGF0IHJ1bnRpbWUgdGFrZXMgZWZmZWN0IHdpdGhvdXRcbiAqIHJlLWFjcXVpcmluZyB0aGUgaGFuZGxlLCB3aGlsZSB0aGUgd3JhcHBlcidzIGlkZW50aXR5IHN0YXlzIHN0YWJsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3cmFwcGVyLlxuICogQHJldHVybnMgVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1ldGhvZFdyYXBwZXIocGFyYW1zOiBDcmVhdGVNZXRob2RXcmFwcGVyUGFyYW1zKTogKC4uLiRhcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93biB7XG4gIHJldHVybiBmdW5jdGlvbiBwbHVnaW5BcGlNZXRob2QoLi4uJGFyZ3VtZW50czogdW5rbm93bltdKTogdW5rbm93biB7XG4gICAgLy8gUmVhZCBieSB0aGUgT1JJR0lOQUwga2V5LCBub3QgYnkgdGhlIGRpc3BsYXkgbmFtZTogYFN0cmluZyhzeW1ib2wpYCBpcyBgJ1N5bWJvbCh4KSdgLCB3aGljaCBpcyBub3QgYVxuICAgIC8vIEtleSB0aGUgQVBJIG9iamVjdCBoYXMuXG4gICAgY29uc3QgbWV0aG9kID0gY2FzdFRvPCguLi4kaW5uZXJBcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93bj4oZ2V0TWVtYmVyKHBhcmFtcy50YXJnZXQsIHBhcmFtcy5wcm9wZXJ0eUtleSkpO1xuICAgIGNvbnN0IG1ldGhvZENvbnRyYWN0ID0gcGFyYW1zLm1ldGhvZENvbnRyYWN0O1xuXG4gICAgaWYgKG1ldGhvZENvbnRyYWN0ID09PSB1bmRlZmluZWQgfHwgIWdldFBsdWdpbkFwaURlYnVnZ2VyKCkuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kQ29udHJhY3QuaW5wdXQpIHtcbiAgICAgIHZhbGlkYXRlUGF5bG9hZCh7XG4gICAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuSW5wdXQsXG4gICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgIHNjaGVtYTogbWV0aG9kQ29udHJhY3QuaW5wdXQsXG4gICAgICAgIHZhbHVlOiAkYXJndW1lbnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBtZXRob2RDb250cmFjdC5vdXRwdXQ7XG4gICAgaWYgKCFvdXRwdXRTY2hlbWEpIHtcbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKHJldHVyblZhbHVlKSkge1xuICAgICAgcmV0dXJuIHJldHVyblZhbHVlLnRoZW4oKHJlc29sdmVkVmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgICAgICBtZXRob2ROYW1lOiBwYXJhbXMubWV0aG9kTmFtZSxcbiAgICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuT3V0cHV0LFxuICAgICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgc2NoZW1hOiBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgdmFsdWU6IHJlc29sdmVkVmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlZFZhbHVlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgcGF5bG9hZEtpbmQ6IFBsdWdpbkFwaVBheWxvYWRLaW5kLk91dHB1dCxcbiAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICBzY2hlbWE6IG91dHB1dFNjaGVtYSxcbiAgICAgIHZhbHVlOiByZXR1cm5WYWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhIHB1Ymxpc2hlZCBBUEkgaW4gYSByZXZvY2FibGUgaGFuZGxlLlxuICpcbiAqIEEgZmxhZy1jaGVja2luZyBgZ2V0YCB0cmFwIGlzIHVzZWQgcmF0aGVyIHRoYW4gYFByb3h5LnJldm9jYWJsZWAsIGJlY2F1c2UgdGhlIGxhdHRlciB0aHJvd3MgYSBiYXJlXG4gKiBgVHlwZUVycm9yYCB3aG9zZSBtZXNzYWdlIHdlIGNhbm5vdCBwaHJhc2UgXHUyMDE0IGFuZCB0aGUgd2hvbGUgdmFsdWUgb2YgcmV2b2tpbmcgaXMgdGhhdCB0aGUgZXJyb3IgbmFtZXMgdGhlXG4gKiBwcm92aWRlci5cbiAqXG4gKiBNZXRob2RzIGFyZSBib3VuZCB0byB0aGUgUkFXIGFwaSBvYmplY3QgcmF0aGVyIHRoYW4gdG8gdGhlIHByb3h5OiBhbiBpbXBsZW1lbnRhdGlvbiB1c2luZyBwcml2YXRlIGNsYXNzXG4gKiBmaWVsZHMgKGAjZmllbGRgKSB0aHJvd3MgaWYgaXRzIGB0aGlzYCBpcyBhIHByb3h5LlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIG92ZXIgdGhlIHB1Ymxpc2hlZCBvbmUgd2hlbiBzdXBwbGllZC5cbiAqIEByZXR1cm5zIFRoZSBoYW5kbGUuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJldm9jYWJsZUhhbmRsZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0KTogb2JqZWN0IHtcbiAgY29uc3QgY29udHJhY3QgPSBjb25zdW1lckNvbnRyYWN0ID8/IHJlY29yZC5jb250cmFjdDtcbiAgY29uc3QgbWV0aG9kQ2FjaGUgPSBuZXcgTWFwPFByb3BlcnR5S2V5PigpO1xuXG4gIHJldHVybiBuZXcgUHJveHkocmVjb3JkLmFwaSwge1xuICAgIGdldCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk6IFByb3BlcnR5S2V5KTogdW5rbm93biB7XG4gICAgICBpZiAocmVjb3JkLmlzUmV2b2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGx1Z2luQXBpUmV2b2tlZEVycm9yKHJlY29yZC5wbHVnaW5JZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TWVtYmVyKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RDYWNoZS5nZXQocHJvcGVydHlLZXkpO1xuICAgICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGhvZCA9IGNyZWF0ZU1ldGhvZFdyYXBwZXIoe1xuICAgICAgICAgIG1ldGhvZENvbnRyYWN0OiB0eXBlb2YgcHJvcGVydHlLZXkgPT09ICdzdHJpbmcnID8gY29udHJhY3RbcHJvcGVydHlLZXldIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1ldGhvZE5hbWU6IFN0cmluZyhwcm9wZXJ0eUtleSksXG4gICAgICAgICAgcGx1Z2luSWQ6IHJlY29yZC5wbHVnaW5JZCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICB0YXJnZXRcbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGhvZENhY2hlLnNldChwcm9wZXJ0eUtleSwgbWV0aG9kKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHNjaGVtYSBpc3N1ZXMgaW50byBhIHNpbmdsZSByZWFkYWJsZSBsaW5lLlxuICpcbiAqIEBwYXJhbSBpc3N1ZXMgLSBUaGUgaXNzdWVzIHRvIHJlbmRlci5cbiAqIEByZXR1cm5zIFRoZSByZW5kZXJlZCBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBmb3JtYXRJc3N1ZXMoaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW10pOiBzdHJpbmcge1xuICByZXR1cm4gaXNzdWVzXG4gICAgLm1hcCgoaXNzdWUpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBpc3N1ZS5wYXRoPy5tYXAoKHNlZ21lbnQpID0+IFN0cmluZyh0eXBlb2Ygc2VnbWVudCA9PT0gJ29iamVjdCcgPyBzZWdtZW50LmtleSA6IHNlZ21lbnQpKS5qb2luKCcuJyk7XG4gICAgICByZXR1cm4gcGF0aCA/IGAke3BhdGh9OiAke2lzc3VlLm1lc3NhZ2V9YCA6IGlzc3VlLm1lc3NhZ2U7XG4gICAgfSlcbiAgICAuam9pbignOyAnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWNvcmRzIGEgcGx1Z2luIGN1cnJlbnRseSBoYXMgcHVibGlzaGVkLCBleGNsdWRpbmcgYW55IHRoYXQgaGF2ZSBiZWVuIHJldm9rZWQuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gKiBAcmV0dXJucyBUaGUgbGl2ZSByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBnZXRMaXZlUmVjb3JkcyhwbHVnaW5JZDogc3RyaW5nKTogUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkW10ge1xuICByZXR1cm4gKGdldFJlZ2lzdHJ5KCkucmVjb3Jkc1twbHVnaW5JZF0gPz8gW10pLmZpbHRlcigocmVjb3JkKSA9PiAhcmVjb3JkLmlzUmV2b2tlZCk7XG59XG5cbi8qKlxuICogUmVhZHMgYSBtZW1iZXIgb2ZmIGEgcHVibGlzaGVkIEFQSSBvYmplY3Qgd2l0aG91dCBuYXJyb3dpbmcgaXQgXHUyMDE0IHRoZSBBUEkgY3Jvc3NlcyBhIGxpYnJhcnktdmVyc2lvbiBib3VuZGFyeSxcbiAqIHNvIG5vdGhpbmcgYWJvdXQgaXRzIHNoYXBlIG1heSBiZSBhc3N1bWVkLlxuICpcbiAqIEBwYXJhbSBhcGkgLSBUaGUgcHVibGlzaGVkIEFQSSBvYmplY3QuXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBtZW1iZXIgdG8gcmVhZC5cbiAqIEByZXR1cm5zIFRoZSBtZW1iZXIncyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWVtYmVyKGFwaTogb2JqZWN0LCBtZXRob2ROYW1lOiBQcm9wZXJ0eUtleSk6IHVua25vd24ge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoYXBpLCBtZXRob2ROYW1lKTtcbn1cblxuLyoqXG4gKiBUaGUgZGVidWdnZXIgdGhhdCBnYXRlcyBwYXlsb2FkIHZhbGlkYXRpb24uXG4gKlxuICogQHJldHVybnMgVGhlIGRlYnVnZ2VyLlxuICovXG5mdW5jdGlvbiBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRMaWJEZWJ1Z2dlcj4ge1xuICByZXR1cm4gZ2V0TGliRGVidWdnZXIoUExVR0lOX0FQSV9ERUJVR0dFUl9OQU1FU1BBQ0UpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc2hhcmVkIHJlZ2lzdHJ5LCB0b2xlcmF0aW5nIGEgYmFnIHdyaXR0ZW4gYnkgYSBESUZGRVJFTlQgYG9ic2lkaWFuLWRldi11dGlsc2AgY29weSB0aGF0IG1heVxuICogcHJlZGF0ZSBvbmUgb2YgaXRzIGZpZWxkcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcmVnaXN0cnkuXG4gKi9cbmZ1bmN0aW9uIGdldFJlZ2lzdHJ5KCk6IFBsdWdpbkFwaVJlZ2lzdHJ5IHtcbiAgY29uc3Qgd3JhcHBlciA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxQYXJ0aWFsPFBsdWdpbkFwaVJlZ2lzdHJ5Pj4oUExVR0lOX0FQSV9SRUdJU1RSWV9TVEFURV9LRVksIHt9KTtcbiAgY29uc3QgcmVnaXN0cnkgPSB3cmFwcGVyLnZhbHVlO1xuICByZWdpc3RyeS5yZWNvcmRzID8/PSB7fTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMgPz89IFtdO1xuICByZXR1cm4gY2FzdFRvPFBsdWdpbkFwaVJlZ2lzdHJ5PihyZWdpc3RyeSk7XG59XG5cbi8qKlxuICogTm90aWZpZXMgZXZlcnkgc3Vic2NyaWJlciwgb3ZlciBhIFNOQVBTSE9UIG9mIHRoZSBsaXN0IFx1MjAxNCBhIGNhbGxiYWNrIGlzIGZyZWUgdG8gdW5zdWJzY3JpYmUgKG9yIHN1YnNjcmliZSlcbiAqIHdoaWxlIHRoZSBzd2VlcCBpcyBydW5uaW5nLlxuICovXG5mdW5jdGlvbiBub3RpZnlTdWJzY3JpYmVycygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBzdWJzY3JpYmVyIG9mIHNuYXBzaG90KGdldFJlZ2lzdHJ5KCkuc3Vic2NyaWJlcnMpKSB7XG4gICAgc3Vic2NyaWJlcigpO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBhcHBsaWVzLCBwcm9iaW5nIHRoZSBjYXVzZXMgZnJvbSB0aGUgb3V0ZXJtb3N0IGlud2FyZHMgc28gdGhlIG1vc3RcbiAqIGFjdGlvbmFibGUgb25lIHdpbnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB3YXRjaCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHJlYXNvbi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVVuYXZhaWxhYmlsaXR5UmVhc29uKHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpOiBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIGlmICghT2JqZWN0Lmhhc093bihwYXJhbXMuYXBwLnBsdWdpbnMubWFuaWZlc3RzLCBwYXJhbXMucGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdEluc3RhbGxlZDtcbiAgfVxuXG4gIGlmICghcGFyYW1zLmFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zLmhhcyhwYXJhbXMucGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdEVuYWJsZWQ7XG4gIH1cblxuICBjb25zdCByZWNvcmRzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKTtcbiAgaWYgKHJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdFB1Ymxpc2hlZDtcbiAgfVxuXG4gIGlmIChyZWNvcmRzLmV2ZXJ5KChyZWNvcmQpID0+ICFzYXRpc2ZpZXNWZXJzaW9uKHJlY29yZC5hcGlWZXJzaW9uLCBwYXJhbXMuYXBpVmVyc2lvblJhbmdlKSkpIHtcbiAgICByZXR1cm4gUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uVmVyc2lvbk1pc21hdGNoO1xuICB9XG5cbiAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlNoYXBlTWlzbWF0Y2g7XG59XG5cbi8qKlxuICogTWFya3MgYSByZWNvcmQgcmV2b2tlZCBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgcmVnaXN0cnksIHRoZW4gdGVsbHMgZXZlcnkgd2F0Y2hlciB0byByZWNvbXB1dGUuXG4gKlxuICogVGhlIHJlY29yZCBvYmplY3QgaXRzZWxmIGlzIGRlbGliZXJhdGVseSBrZXB0IGFsaXZlIGFuZCBmbGFnZ2VkIHJhdGhlciB0aGFuIGRpc2NhcmRlZCwgYmVjYXVzZSBoYW5kbGVzXG4gKiBhbHJlYWR5IGhhbmRlZCBvdXQgY2xvc2Ugb3ZlciBpdCBcdTIwMTQgdGhhdCBmbGFnIGlzIHdoYXQgdHVybnMgYSBsYXRlciBwcm9wZXJ0eSByZWFkIGludG8gYVxuICoge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0uXG4gKlxuICogQHBhcmFtIHJlY29yZCAtIFRoZSByZWNvcmQgdG8gcmV2b2tlLlxuICovXG5mdW5jdGlvbiByZXZva2VSZWNvcmQocmVjb3JkOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQpOiB2b2lkIHtcbiAgcmVjb3JkLmlzUmV2b2tlZCA9IHRydWU7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgY29uc3QgcmVjb3JkcyA9IHJlZ2lzdHJ5LnJlY29yZHNbcmVjb3JkLnBsdWdpbklkXTtcbiAgaWYgKHJlY29yZHMpIHtcbiAgICByZWdpc3RyeS5yZWNvcmRzW3JlY29yZC5wbHVnaW5JZF0gPSByZWNvcmRzLmZpbHRlcigoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IHJlY29yZCk7XG4gIH1cbiAgbm90aWZ5U3Vic2NyaWJlcnMoKTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgaGlnaGVzdCBwdWJsaXNoZWQgcmVjb3JkIHRoYXQgaXMgbGl2ZSwgc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiByYW5nZSwgYW5kIG1hdGNoZXMgdGhlXG4gKiBlZmZlY3RpdmUgY29udHJhY3QncyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHdhdGNoIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgd2lubmluZyByZWNvcmQsIG9yIGBudWxsYCB3aGVuIG5vbmUgcXVhbGlmaWVzLlxuICovXG5mdW5jdGlvbiBzZWxlY3RSZWNvcmQocGFyYW1zOiBXYXRjaFBsdWdpbkFwaVBhcmFtcyk6IG51bGwgfCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKVxuICAgIC5maWx0ZXIoKHJlY29yZCkgPT4gc2F0aXNmaWVzVmVyc2lvbihyZWNvcmQuYXBpVmVyc2lvbiwgcGFyYW1zLmFwaVZlcnNpb25SYW5nZSkpXG4gICAgLmZpbHRlcigocmVjb3JkKSA9PiBjaGVja01hdGNoZXNDb250cmFjdFNoYXBlKHJlY29yZCwgcGFyYW1zLmNvbnRyYWN0KSlcbiAgICAuc29ydCgoYSwgYikgPT4gY29tcGFyZVZlcnNpb25zKGIuYXBpVmVyc2lvbiwgYS5hcGlWZXJzaW9uKSk7XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF0gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmaXJlZCB3aGVuZXZlciB0aGUgcmVnaXN0cnkgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0gc3Vic2NyaWJlciAtIFRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB1bnJlZ2lzdGVycyB0aGUgY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZShzdWJzY3JpYmVyOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKTtcbiAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHJlZ2lzdHJ5LnN1YnNjcmliZXJzLmluZGV4T2Yoc3Vic2NyaWJlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmVnaXN0cnkuc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUnVucyBvbmUgU3RhbmRhcmQgU2NoZW1hIG92ZXIgb25lIHBheWxvYWQuXG4gKlxuICogQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIFNZTkNIUk9OT1VTTFkgdGhyb3dzIGF0IHRoZSBjYWxsIHNpdGUsIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBcdTIwMTQgYSB2ZXJzaW9uIHNrZXcgcmVhZHNcbiAqIGFzIGEgbGVnaWJsZSBlcnJvciB3aGVyZSB0aGUgY2FsbCB3YXMgbWFkZS4gQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIHdpdGggYSB7QGxpbmsgUHJvbWlzZX0gY2Fubm90IGRvIHRoYXQ6IHRoZVxuICogc3luY2hyb25vdXMgY2FsbCBpdCB3YXMgZ3VhcmRpbmcgaGFzIGFscmVhZHkgcmV0dXJuZWQgYnkgdGhlIHRpbWUgdGhlIGFuc3dlciBhcnJpdmVzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvXG4gKiB0aHJvdyBpbnRvIGFuZCB0aGUgZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSBsaWJyYXJ5IGRlYnVnZ2VyIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgdmFsaWRhdGlvbi5cbiAqIEB0aHJvd3MgQSB7QGxpbmsgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yfSBpZiBhIHN5bmNocm9ub3VzIHNjaGVtYSByZXBvcnRzIGlzc3Vlcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXlsb2FkKHBhcmFtczogVmFsaWRhdGVQYXlsb2FkUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcmFtcy5zY2hlbWFbJ35zdGFuZGFyZCddLnZhbGlkYXRlKHBhcmFtcy52YWx1ZSk7XG5cbiAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZTxTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDx1bmtub3duPj4ocmVzdWx0KSkge1xuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFzeW5jUmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xuICAgICAgaWYgKGFzeW5jUmVzdWx0Lmlzc3Vlcykge1xuICAgICAgICBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpKFxuICAgICAgICAgICdBc3luY2hyb25vdXMgdmFsaWRhdGlvbiBvZiB0aGUgJXMgb2YgXCIlc1wiIEFQSSBtZXRob2QgXCIlc1wiIGZhaWxlZDogJXMnLFxuICAgICAgICAgIHBhcmFtcy5wYXlsb2FkS2luZCxcbiAgICAgICAgICBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICAgICAgZm9ybWF0SXNzdWVzKGFzeW5jUmVzdWx0Lmlzc3VlcylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocmVzdWx0Lmlzc3Vlcykge1xuICAgIHRocm93IG5ldyBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3Ioe1xuICAgICAgaXNzdWVzOiByZXN1bHQuaXNzdWVzLFxuICAgICAgbWV0aG9kTmFtZTogcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICBwYXlsb2FkS2luZDogcGFyYW1zLnBheWxvYWRLaW5kLFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZFxuICAgIH0pO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdFQSw4QkFHTztBQUlQLG1CQUF5QjtBQUN6QiwwQkFBaUM7QUFDakMsbUJBR087QUFDUCxtQkFBK0I7QUFDL0IsMEJBQXVCO0FBQ3ZCLHNDQUF5QztBQUV6QyxNQUFNLGdDQUFnQztBQUN0QyxNQUFNLGdDQUFnQztBQUt0QyxNQUFNLGlEQUFpRDtBQUtoRCxJQUFLLHVCQUFMLGtCQUFLQSwwQkFBTDtBQUlMLEVBQUFBLHNCQUFBLFdBQVE7QUFLUixFQUFBQSxzQkFBQSxZQUFTO0FBVEMsU0FBQUE7QUFBQSxHQUFBO0FBMEJMLElBQUssZ0NBQUwsa0JBQUtDLG1DQUFMO0FBSUwsRUFBQUEsK0JBQUEsZ0JBQWE7QUFLYixFQUFBQSwrQkFBQSxrQkFBZTtBQUtmLEVBQUFBLCtCQUFBLGtCQUFlO0FBS2YsRUFBQUEsK0JBQUEsYUFBVTtBQU1WLEVBQUFBLCtCQUFBLG1CQUFnQjtBQUtoQixFQUFBQSwrQkFBQSxxQkFBa0I7QUE5QlIsU0FBQUE7QUFBQSxHQUFBO0FBOFRaLE1BQWUsbUJBQW1CO0FBQUE7QUFBQTtBQUFBLEVBT3pCLFlBQStCLFFB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QUFpQixPQUFPLFlBQVksT0FBTyxlQUFlLENBQUMsR0FBRztBQUMzRixXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU87QUFDVDtBQVdBLFNBQVMsYUFBYSxRQUF3QztBQUM1RCxTQUFPLFlBQVk7QUFDbkIsUUFBTSxXQUFXLFlBQVk7QUFDN0IsUUFBTSxVQUFVLFNBQVMsUUFBUSxPQUFPLFFBQVE7QUFDaEQsTUFBSSxTQUFTO0FBQ1gsYUFBUyxRQUFRLE9BQU8sUUFBUSxJQUFJLFFBQVEsT0FBTyxDQUFDLGNBQWMsY0FBYyxNQUFNO0FBQUEsRUFDeEY7QUFDQSxvQkFBa0I7QUFDcEI7QUFTQSxTQUFTLGFBQWEsUUFBK0Q7QUFDbkYsUUFBTSxhQUFhLGVBQWUsT0FBTyxRQUFRLEVBQzlDLE9BQU8sQ0FBQyxlQUFXLHdCQUFBQSxXQUFpQixPQUFPLFlBQVksT0FBTyxlQUFlLENBQUMsRUFDOUUsT0FBTyxDQUFDLFdBQVcsMEJBQTBCLFFBQVEsT0FBTyxRQUFRLENBQUMsRUFDckUsS0FBSyxDQUFDLEdBQUcsVUFBTSx5Q0FBZ0IsRUFBRSxZQUFZLEVBQUUsVUFBVSxDQUFDO0FBRTdELFNBQU8sV0FBVyxDQUFDLEtBQUs7QUFDMUI7QUFRQSxTQUFTLFVBQVUsWUFBb0M7QUFDckQsUUFBTSxXQUFXLFlBQVk7QUFDN0IsV0FBUyxZQUFZLEtBQUssVUFBVTtBQUNwQyxTQUFPLE1BQVk7QUFDakIsVUFBTSxRQUFRLFNBQVMsWUFBWSxRQUFRLFVBQVU7QUFDckQsUUFBSSxVQUFVLElBQUk7QUFDaEIsZUFBUyxZQUFZLE9BQU8sT0FBTyxDQUFDO0FBQUEsSUFDdEM7QUFBQSxFQUNGO0FBQ0Y7QUFhQSxTQUFTLGdCQUFnQixRQUFxQztBQUM1RCxRQUFNLFNBQVMsT0FBTyxPQUFPLFdBQVcsRUFBRSxTQUFTLE9BQU8sS0FBSztBQUUvRCxNQUFJLG1CQUFxRCxNQUFNLEdBQUc7QUFDaEUsd0NBQWtCLFlBQVk7QUFDNUIsWUFBTSxjQUFjLE1BQU07QUFDMUIsVUFBSSxZQUFZLFFBQVE7QUFDdEIsNkJBQXFCO0FBQUEsVUFDbkI7QUFBQSxVQUNBLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLGFBQWEsWUFBWSxNQUFNO0FBQUEsUUFDakM7QUFBQSxNQUNGO0FBQUEsSUFDRixDQUFDO0FBQ0Q7QUFBQSxFQUNGO0FBRUEsTUFBSSxPQUFPLFFBQVE7QUFDakIsVUFBTSxJQUFJLHlCQUF5QjtBQUFBLE1BQ2pDLFFBQVEsT0FBTztBQUFBLE1BQ2YsWUFBWSxPQUFPO0FBQUEsTUFDbkIsYUFBYSxPQUFPO0FBQUEsTUFDcEIsVUFBVSxPQUFPO0FBQUEsSUFDbkIsQ0FBQztBQUFBLEVBQ0g7QUFDRjsiLAogICJuYW1lcyI6IFsiUGx1Z2luQXBpUGF5bG9hZEtpbmQiLCAiUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24iLCAicmVjb3JkIiwgInNhdGlzZmllc1ZlcnNpb24iXQp9Cg==
@@ -131,6 +131,32 @@ export declare enum PluginApiUnavailabilityReason {
131
131
  * declared method names are checked with `typeof`, and the payloads are validated per method instead.
132
132
  */
133
133
  export type PluginApiContract = Record<string, PluginApiMethodContract>;
134
+ /**
135
+ * One API a plugin exposes: the object, the contract version it satisfies, and optionally the contract
136
+ * itself. This is {@link PublishPluginApiParams} without the publishing plugin, so a plugin can DECLARE what
137
+ * it exposes without also stating who is publishing it — which is what lets `PluginBase.getPluginApis` collect
138
+ * the declarations and do the publishing itself.
139
+ *
140
+ * @typeParam TApi - The API type being declared.
141
+ */
142
+ export interface PluginApiDeclaration<TApi extends object = object> {
143
+ /**
144
+ * The API object to publish. Its methods are handed to consumers through a revocable handle, and they are
145
+ * always invoked with this object as their `this`, so an implementation using private class fields keeps
146
+ * working.
147
+ */
148
+ readonly api: TApi;
149
+ /**
150
+ * The CONTRACT version, in semver form — independent of the plugin's own version. Plugin `1.4.7` may
151
+ * perfectly well expose API `2.0.0`.
152
+ */
153
+ readonly apiVersion: string;
154
+ /**
155
+ * The contract this version of the API satisfies. Optional: when omitted, no shape check is performed on
156
+ * the provider's behalf and the consumer's own contract (if any) is used instead.
157
+ */
158
+ readonly contract?: PluginApiContract;
159
+ }
134
160
  /**
135
161
  * The payload schemas for a single API method. Both halves are optional: a method may declare only its input,
136
162
  * only its output, neither (the entry then just declares that the method must exist), or both.
@@ -229,23 +255,16 @@ export interface PluginApiValidationErrorConstructorParams {
229
255
  *
230
256
  * @typeParam TApi - The API type being published.
231
257
  */
232
- export interface PublishPluginApiParams<TApi extends object> {
258
+ export interface PublishPluginApiParams<TApi extends object> extends PluginApiDeclaration<TApi> {
233
259
  /**
234
- * The API object to publish. Its methods are handed to consumers through a revocable handle, and they are
235
- * always invoked with this object as their `this`, so an implementation using private class fields keeps
236
- * working.
237
- */
238
- readonly api: TApi;
239
- /**
240
- * The CONTRACT version, in semver form — independent of the plugin's own version. Plugin `1.4.7` may
241
- * perfectly well expose API `2.0.0`.
242
- */
243
- readonly apiVersion: string;
244
- /**
245
- * The contract this version of the API satisfies. Optional: when omitted, no shape check is performed on
246
- * the provider's behalf and the consumer's own contract (if any) is used instead.
260
+ * The component whose unload revokes the record. Defaults to {@link PublishPluginApiParams.plugin}, which is
261
+ * the right owner for an API published for as long as the plugin runs.
262
+ *
263
+ * Pass a narrower one when the API is only valid for part of the plugin's life — a plugin whose feature
264
+ * surface is torn down and rebuilt while the plugin itself stays loaded must revoke with the surface, or it
265
+ * leaves consumers holding handles into code that is no longer there.
247
266
  */
248
- readonly contract?: PluginApiContract;
267
+ readonly component?: Component;
249
268
  /**
250
269
  * The publishing plugin. The record is keyed by its `manifest.id` and revoked automatically when the plugin
251
270
  * unloads, via `plugin.register()`.
@@ -0,0 +1,208 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureBrowserProcess() {
8
+ const browserProcess = {
9
+ browser: true,
10
+ cwd() {
11
+ return '/';
12
+ },
13
+ env: {},
14
+ platform: 'android'
15
+ };
16
+
17
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
18
+ const existingProcess = globalThis.process;
19
+
20
+ if (!existingProcess) {
21
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
22
+ globalThis.process = browserProcess;
23
+ return;
24
+ }
25
+
26
+ if (existingProcess.versions?.node) {
27
+ return;
28
+ }
29
+
30
+ const existingProcessRecord = existingProcess;
31
+
32
+ for (const [key, value] of Object.entries(browserProcess)) {
33
+ existingProcessRecord[key] ??= value;
34
+ }
35
+
36
+ existingProcessRecord['browser'] = true;
37
+ }
38
+
39
+ function keepName($unknown) {
40
+ return $unknown;
41
+ }
42
+
43
+ (function initCjs() {
44
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
45
+ const globalThisRecord = globalThis;
46
+ globalThisRecord['__name'] ??= keepName;
47
+ const originalRequire = require;
48
+ if (originalRequire && !originalRequire.__isPatched) {
49
+ // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
50
+ require = Object.assign(
51
+ (id) => requirePatched(id),
52
+ originalRequire,
53
+ {
54
+ __isPatched: true
55
+ }
56
+ );
57
+ }
58
+
59
+ globalThisRecord['__extractDefault'] ??= extractDefault;
60
+
61
+ ensureBrowserProcess();
62
+
63
+ function extractDefault(module) {
64
+ return module && module.__esModule && 'default' in module ? module.default : module;
65
+ }
66
+
67
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
68
+ '@codemirror/autocomplete',
69
+ '@codemirror/collab',
70
+ '@codemirror/commands',
71
+ '@codemirror/language',
72
+ '@codemirror/lint',
73
+ '@codemirror/search',
74
+ '@codemirror/state',
75
+ '@codemirror/text',
76
+ '@codemirror/view',
77
+ '@lezer/common',
78
+ '@lezer/highlight',
79
+ '@lezer/lr',
80
+ 'obsidian']
81
+ );
82
+
83
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
84
+ '@codemirror/closebrackets',
85
+ '@codemirror/comment',
86
+ '@codemirror/fold',
87
+ '@codemirror/gutter',
88
+ '@codemirror/highlight',
89
+ '@codemirror/history',
90
+ '@codemirror/matchbrackets',
91
+ '@codemirror/panel',
92
+ '@codemirror/rangeset',
93
+ '@codemirror/rectangular-selection',
94
+ '@codemirror/stream-parser',
95
+ '@codemirror/tooltip']
96
+ );
97
+
98
+ function requirePatched(id) {
99
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
100
+ return originalRequire?.(id);
101
+ }
102
+
103
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
104
+ if (globalThis.app.isMobile) {
105
+ if (id === 'process' || id === 'node:process') {
106
+ // eslint-disable-next-line no-console -- Valid usage.
107
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
108
+
109
+ return process;
110
+ }
111
+ } else {
112
+ const module = originalRequire?.(id);
113
+ if (module) {
114
+ return extractDefault(module);
115
+ }
116
+ }
117
+
118
+ // eslint-disable-next-line no-console -- Valid usage.
119
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
120
+ return {};
121
+ }
122
+ })();
123
+ })();
124
+
125
+ "use strict";
126
+ var __defProp = Object.defineProperty;
127
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
128
+ var __getOwnPropNames = Object.getOwnPropertyNames;
129
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
130
+ var __export = (target, all) => {
131
+ for (var name in all)
132
+ __defProp(target, name, { get: all[name], enumerable: true });
133
+ };
134
+ var __copyProps = (to, from, except, desc) => {
135
+ if (from && typeof from === "object" || typeof from === "function") {
136
+ for (let key of __getOwnPropNames(from))
137
+ if (!__hasOwnProp.call(to, key) && key !== except)
138
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
139
+ }
140
+ return to;
141
+ };
142
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
143
+ var plugin_install_state_exports = {};
144
+ __export(plugin_install_state_exports, {
145
+ InstalledPluginState: () => InstalledPluginState,
146
+ getInstalledPluginState: () => getInstalledPluginState,
147
+ getInstalledPluginVersion: () => getInstalledPluginVersion,
148
+ installAndEnablePlugin: () => installAndEnablePlugin
149
+ });
150
+ module.exports = __toCommonJS(plugin_install_state_exports);
151
+ var import_community_plugins = require('../community-plugins.cjs');
152
+ var import_html_element = require('../html-element.cjs');
153
+ var import_i18n = require('../i18n/i18n.cjs');
154
+ var InstalledPluginState = /* @__PURE__ */ ((InstalledPluginState2) => {
155
+ InstalledPluginState2["Enabled"] = "enabled";
156
+ InstalledPluginState2["InstalledButDisabled"] = "installedButDisabled";
157
+ InstalledPluginState2["NotInstalled"] = "notInstalled";
158
+ return InstalledPluginState2;
159
+ })(InstalledPluginState || {});
160
+ function getInstalledPluginState(params) {
161
+ const { app, pluginId } = params;
162
+ if (app.plugins.enabledPlugins.has(pluginId)) {
163
+ return "enabled" /* Enabled */;
164
+ }
165
+ return Object.hasOwn(app.plugins.manifests, pluginId) ? "installedButDisabled" /* InstalledButDisabled */ : "notInstalled" /* NotInstalled */;
166
+ }
167
+ function getInstalledPluginVersion(params) {
168
+ const { app, pluginId } = params;
169
+ if (!app.plugins.enabledPlugins.has(pluginId)) {
170
+ return null;
171
+ }
172
+ return app.plugins.manifests[pluginId]?.version ?? "";
173
+ }
174
+ async function installAndEnablePlugin(params) {
175
+ const {
176
+ app,
177
+ pluginId,
178
+ pluginName,
179
+ pluginNoticeComponent
180
+ } = params;
181
+ const state = getInstalledPluginState({ app, pluginId });
182
+ if (state === "enabled" /* Enabled */) {
183
+ return;
184
+ }
185
+ try {
186
+ if (state === "installedButDisabled" /* InstalledButDisabled */) {
187
+ await (0, import_community_plugins.enableCommunityPlugin)({ app, pluginId });
188
+ } else {
189
+ await (0, import_community_plugins.installConfigureEnableCommunityPlugin)({ app, pluginId });
190
+ }
191
+ } catch (error) {
192
+ pluginNoticeComponent.showNotice((0, import_html_element.createFragmentWithCodeBlocks)(
193
+ (0, import_i18n.t)(($) => $.obsidianDevUtils.pluginSuggestion.installFailed, { pluginName: (0, import_html_element.asCodeBlock)(pluginName) })
194
+ ));
195
+ throw error;
196
+ }
197
+ pluginNoticeComponent.showNotice((0, import_html_element.createFragmentWithCodeBlocks)(
198
+ (0, import_i18n.t)(($) => $.obsidianDevUtils.pluginSuggestion.installed, { pluginName: (0, import_html_element.asCodeBlock)(pluginName) })
199
+ ));
200
+ }
201
+ // Annotate the CommonJS export names for ESM import in node:
202
+ 0 && (module.exports = {
203
+ InstalledPluginState,
204
+ getInstalledPluginState,
205
+ getInstalledPluginVersion,
206
+ installAndEnablePlugin
207
+ });
208
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4taW5zdGFsbC1zdGF0ZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEhvdyBhbm90aGVyIHBsdWdpbiBpcyBwcmVzZW50IGluIHRoaXMgdmF1bHQsIGFuZCB0aGUgb25lLWNsaWNrIHBhdGggdG8gbWFraW5nIGl0IHByZXNlbnQuXG4gKlxuICogU2hhcmVkIGJ5IHRoZSB0d28gY29tcG9uZW50cyB0aGF0IGFzayBhIHVzZXIgdG8gYnJpbmcgYW5vdGhlciBwbHVnaW4gaW46IGBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50YCxcbiAqIHdoaWNoIE9GRkVSUyBvbmUgYW5kIGtlZXBzIHdvcmtpbmcgd2l0aG91dCBpdCwgYW5kIGBQbHVnaW5HYXRlQ29tcG9uZW50YCwgd2hpY2ggUkVRVUlSRVMgb25lIGFuZFxuICogZG9lcyBub3RoaW5nIHVudGlsIGl0IGlzIHRoZXJlLiBUaGUgb2ZmZXIgYW5kIHRoZSByZXF1aXJlbWVudCBkaWZmZXIgaW4gd2hhdCB0aGV5IGRvIGFib3V0IHRoZSBhbnN3ZXIsXG4gKiBub3QgaW4gaG93IHRoZXkgcmVhZCB0aGUgc3RhdGUgb3IgaG93IHRoZXkgaW5zdGFsbCBcdTIwMTQgc28gdGhhdCBwYXJ0IGxpdmVzIGhlcmUgcmF0aGVyIHRoYW4gaW4gYm90aC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHtcbiAgZW5hYmxlQ29tbXVuaXR5UGx1Z2luLFxuICBpbnN0YWxsQ29uZmlndXJlRW5hYmxlQ29tbXVuaXR5UGx1Z2luXG59IGZyb20gJy4uL2NvbW11bml0eS1wbHVnaW5zLnRzJztcbmltcG9ydCB7XG4gIGFzQ29kZUJsb2NrLFxuICBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzXG59IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcblxuLyoqXG4gKiBIb3cgYW5vdGhlciBwbHVnaW4gaXMgY3VycmVudGx5IHByZXNlbnQgaW4gdGhlIHZhdWx0LlxuICovXG5leHBvcnQgZW51bSBJbnN0YWxsZWRQbHVnaW5TdGF0ZSB7XG4gIC8qKlxuICAgKiBJbnN0YWxsZWQgYW5kIGVuYWJsZWQgXHUyMDE0IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uXG4gICAqL1xuICBFbmFibGVkID0gJ2VuYWJsZWQnLFxuXG4gIC8qKlxuICAgKiBJbnN0YWxsZWQgYnV0IGRpc2FibGVkLiBPbmx5IGFuIGVuYWJsZSBpcyBuZWVkZWQsIHNvIG5vIGRvd25sb2FkIGhhcHBlbnMuXG4gICAqL1xuICBJbnN0YWxsZWRCdXREaXNhYmxlZCA9ICdpbnN0YWxsZWRCdXREaXNhYmxlZCcsXG5cbiAgLyoqXG4gICAqIE5vdCBpbnN0YWxsZWQgYXQgYWxsLlxuICAgKi9cbiAgTm90SW5zdGFsbGVkID0gJ25vdEluc3RhbGxlZCdcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0SW5zdGFsbGVkUGx1Z2luU3RhdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEluc3RhbGxlZFBsdWdpblN0YXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbiB0byBsb29rIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEluc3RhbGxlZFBsdWdpblZlcnNpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEluc3RhbGxlZFBsdWdpblZlcnNpb25QYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luIHRvIGxvb2sgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaW5zdGFsbEFuZEVuYWJsZVBsdWdpbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGFsbEFuZEVuYWJsZVBsdWdpblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4gdG8gaW5zdGFsbCBhbmQgZW5hYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgcGx1Z2luLCBzaG93biB0byB0aGUgdXNlci5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgb2YgdGhlIHBsdWdpbiBkb2luZyB0aGUgYXNraW5nLCB1c2VkIHRvIHJlcG9ydCB0aGUgb3V0Y29tZS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGhvdyBhbm90aGVyIHBsdWdpbiBpcyBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgR2V0SW5zdGFsbGVkUGx1Z2luU3RhdGVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIHtAbGluayBJbnN0YWxsZWRQbHVnaW5TdGF0ZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZShwYXJhbXM6IEdldEluc3RhbGxlZFBsdWdpblN0YXRlUGFyYW1zKTogSW5zdGFsbGVkUGx1Z2luU3RhdGUge1xuICBjb25zdCB7IGFwcCwgcGx1Z2luSWQgfSA9IHBhcmFtcztcblxuICBpZiAoYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSkge1xuICAgIHJldHVybiBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5FbmFibGVkO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5oYXNPd24oYXBwLnBsdWdpbnMubWFuaWZlc3RzLCBwbHVnaW5JZClcbiAgICA/IEluc3RhbGxlZFBsdWdpblN0YXRlLkluc3RhbGxlZEJ1dERpc2FibGVkXG4gICAgOiBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5Ob3RJbnN0YWxsZWQ7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIHZlcnNpb24gb2YgYW5vdGhlciBwbHVnaW4gYXMgdGhpcyB2YXVsdCBoYXMgaXQgaW5zdGFsbGVkLCBvciBgbnVsbGAgd2hlbiBpdCBpcyBub3QgcnVubmluZy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBjb21lcyBvdXQgb2YgYGFwcC5wbHVnaW5zLm1hbmlmZXN0c2AsIHdoaWNoIGlzIHBvcHVsYXRlZCBmb3IgZXZlcnkgaW5zdGFsbGVkIHBsdWdpbiBhdFxuICogc3RhcnR1cCBcdTIwMTQgc28sIHVubGlrZSBhbnl0aGluZyBhIHBsdWdpbiBSRUdJU1RFUlMsIGl0IGFuc3dlcnMgdGhlIHNhbWUgd2F5IG5vIG1hdHRlciB3aGljaCBwbHVnaW4gbG9hZGVkXG4gKiBmaXJzdC4gVGhhdCBsb2FkLW9yZGVyIGluZGVwZW5kZW5jZSBpcyB0aGUgd2hvbGUgcmVhc29uIGEgY29uZmxpY3QgaXMgZGV0ZWN0ZWQgYnkgdmVyc2lvbiByYXRoZXIgdGhhbiBieVxuICogYXNraW5nIGEgcmVnaXN0cnkuXG4gKlxuICogYG51bGxgIGZvciBhIHBsdWdpbiB0aGF0IGlzIG5vdCBpbnN0YWxsZWQgT1IgaXMgaW5zdGFsbGVkIGJ1dCBkaXNhYmxlZDogYSBkaXNhYmxlZCBwbHVnaW4gcmVnaXN0ZXJzXG4gKiBub3RoaW5nLCBzbyBmb3IgZXZlcnkgcXVlc3Rpb24gdGhpcyBhbnN3ZXJzIHRoZSB0d28gY2FzZXMgYXJlIHRoZSBzYW1lLiBBbiBpbnN0YWxsZWQsIGVuYWJsZWQgcGx1Z2luXG4gKiB3aG9zZSBtYW5pZmVzdCBzb21laG93IGNhcnJpZXMgbm8gdmVyc2lvbiByZWFkcyBhcyBhbiBlbXB0eSBzdHJpbmcgcmF0aGVyIHRoYW4gYG51bGxgLCB3aGljaCBrZWVwc1xuICogXCJydW5uaW5nLCB2ZXJzaW9uIHVua25vd25cIiBkaXN0aW5ndWlzaGFibGUgZnJvbSBcIm5vdCBydW5uaW5nXCIgXHUyMDE0IGEgY2FsbGVyIGNvbXBhcmluZyB2ZXJzaW9ucyBzaG91bGQgZmFpbFxuICogY2xvc2VkIG9uIGl0IHJhdGhlciB0aGFuIHRyZWF0IGl0IGFzIGFic2VudC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBHZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBpbnN0YWxsZWQgdmVyc2lvbiwgb3IgYG51bGxgIHdoZW4gdGhlIHBsdWdpbiBpcyBub3QgZW5hYmxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluc3RhbGxlZFBsdWdpblZlcnNpb24ocGFyYW1zOiBHZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uUGFyYW1zKTogbnVsbCB8IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwLCBwbHVnaW5JZCB9ID0gcGFyYW1zO1xuXG4gIGlmICghYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGFwcC5wbHVnaW5zLm1hbmlmZXN0c1twbHVnaW5JZF0/LnZlcnNpb24gPz8gJyc7XG59XG5cbi8qKlxuICogSW5zdGFsbHMgKHdoZW4gbmVlZGVkKSBhbmQgZW5hYmxlcyBhbm90aGVyIHBsdWdpbiwgcmVwb3J0aW5nIHRoZSBvdXRjb21lIGFzIGEgbm90aWNlLlxuICpcbiAqIEEgbm8tb3Agd2hlbiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgZW5hYmxlZCwgc28gYSBjYWxsZXIgcmVhY3RpbmcgdG8gYSBjbGljayBuZWVkIG5vdCBjaGVjayBmaXJzdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBJbnN0YWxsQW5kRW5hYmxlUGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGx1Z2luIGlzIGVuYWJsZWQuXG4gKiBAdGhyb3dzIFdoYXRldmVyIHRoZSBpbnN0YWxsIG9yIGVuYWJsZSB0aHJldywgYWZ0ZXIgcmVwb3J0aW5nIGl0IGFzIGEgbm90aWNlIFx1MjAxNCB0aGUgY2FsbGVyIGRlY2lkZXNcbiAqIHdoZXRoZXIgYSBmYWlsdXJlIGlzIHdvcnRoIG1vcmUgdGhhbiB0aGUgbm90aWNlIHRoZSB1c2VyIGhhcyBhbHJlYWR5IHNlZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQW5kRW5hYmxlUGx1Z2luKHBhcmFtczogSW5zdGFsbEFuZEVuYWJsZVBsdWdpblBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHBsdWdpbklkLFxuICAgIHBsdWdpbk5hbWUsXG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50XG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHN0YXRlID0gZ2V0SW5zdGFsbGVkUGx1Z2luU3RhdGUoeyBhcHAsIHBsdWdpbklkIH0pO1xuXG4gIGlmIChzdGF0ZSA9PT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuRW5hYmxlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKHN0YXRlID09PSBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5JbnN0YWxsZWRCdXREaXNhYmxlZCkge1xuICAgICAgYXdhaXQgZW5hYmxlQ29tbXVuaXR5UGx1Z2luKHsgYXBwLCBwbHVnaW5JZCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgaW5zdGFsbENvbmZpZ3VyZUVuYWJsZUNvbW11bml0eVBsdWdpbih7IGFwcCwgcGx1Z2luSWQgfSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3MoXG4gICAgICB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luU3VnZ2VzdGlvbi5pbnN0YWxsRmFpbGVkLCB7IHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHBsdWdpbk5hbWUpIH0pXG4gICAgKSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKFxuICAgIHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5TdWdnZXN0aW9uLmluc3RhbGxlZCwgeyBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhwbHVnaW5OYW1lKSB9KVxuICApKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZUEsK0JBR087QUFDUCwwQkFHTztBQUNQLGtCQUFrQjtBQUtYLElBQUssdUJBQUwsa0JBQUtBLDBCQUFMO0FBSUwsRUFBQUEsc0JBQUEsYUFBVTtBQUtWLEVBQUFBLHNCQUFBLDBCQUF1QjtBQUt2QixFQUFBQSxzQkFBQSxrQkFBZTtBQWRMLFNBQUFBO0FBQUEsR0FBQTtBQThFTCxTQUFTLHdCQUF3QixRQUE2RDtBQUNuRyxRQUFNLEVBQUUsS0FBSyxTQUFTLElBQUk7QUFFMUIsTUFBSSxJQUFJLFFBQVEsZUFBZSxJQUFJLFFBQVEsR0FBRztBQUM1QyxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sT0FBTyxPQUFPLElBQUksUUFBUSxXQUFXLFFBQVEsSUFDaEQsb0RBQ0E7QUFDTjtBQW1CTyxTQUFTLDBCQUEwQixRQUF3RDtBQUNoRyxRQUFNLEVBQUUsS0FBSyxTQUFTLElBQUk7QUFFMUIsTUFBSSxDQUFDLElBQUksUUFBUSxlQUFlLElBQUksUUFBUSxHQUFHO0FBQzdDLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxJQUFJLFFBQVEsVUFBVSxRQUFRLEdBQUcsV0FBVztBQUNyRDtBQVlBLGVBQXNCLHVCQUF1QixRQUFxRDtBQUNoRyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLFFBQU0sUUFBUSx3QkFBd0IsRUFBRSxLQUFLLFNBQVMsQ0FBQztBQUV2RCxNQUFJLFVBQVUseUJBQThCO0FBQzFDO0FBQUEsRUFDRjtBQUVBLE1BQUk7QUFDRixRQUFJLFVBQVUsbURBQTJDO0FBQ3ZELGdCQUFNLGdEQUFzQixFQUFFLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDL0MsT0FBTztBQUNMLGdCQUFNLGdFQUFzQyxFQUFFLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDL0Q7QUFBQSxFQUNGLFNBQVMsT0FBTztBQUNkLDBCQUFzQixlQUFXO0FBQUEsVUFDL0IsZUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsaUJBQWlCLGVBQWUsRUFBRSxnQkFBWSxpQ0FBWSxVQUFVLEVBQUUsQ0FBQztBQUFBLElBQ3JHLENBQUM7QUFDRCxVQUFNO0FBQUEsRUFDUjtBQUVBLHdCQUFzQixlQUFXO0FBQUEsUUFDL0IsZUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsaUJBQWlCLFdBQVcsRUFBRSxnQkFBWSxpQ0FBWSxVQUFVLEVBQUUsQ0FBQztBQUFBLEVBQ2pHLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFsiSW5zdGFsbGVkUGx1Z2luU3RhdGUiXQp9Cg==