@mnaoumov/obsidian-lib 4.2.1 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/cjs/__merged.cjs +54 -1
- package/dist/lib/cjs/__merged.d.cts +5 -4
- package/dist/lib/cjs/attachment-path.cjs +1 -1
- package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +1 -1
- package/dist/lib/cjs/components/case-insensitive-file-index-component.d.cts +1 -1
- package/dist/lib/cjs/components/plugin-suggestion-component.cjs +1 -1
- package/dist/lib/cjs/components/plugin-suggestion-component.d.cts +1 -1
- package/dist/lib/cjs/components/settings-migration-component.cjs +1 -1
- package/dist/lib/cjs/components/settings-migration-component.d.cts +1 -1
- package/dist/lib/cjs/css-class.cjs +1 -1
- package/dist/lib/cjs/css-class.d.cts +4 -2
- package/dist/lib/cjs/demo-vault-helper-settings.cjs +1 -1
- package/dist/lib/cjs/demo-vault-helper-settings.d.cts +1 -1
- package/dist/lib/cjs/frontmatter.cjs +1 -1
- package/dist/lib/cjs/frontmatter.d.cts +1 -1
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/generated-during-build.d.cts +2 -2
- package/dist/lib/cjs/i18n/i18n.cjs +2 -2
- package/dist/lib/cjs/i18n/i18n.d.cts +1 -1
- package/dist/lib/cjs/i18n/locales/en.cjs +5 -2
- package/dist/lib/cjs/i18n/locales/en.d.cts +4 -1
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +4 -1
- package/dist/lib/cjs/link.cjs +5 -3
- package/dist/lib/cjs/link.d.cts +22 -0
- package/dist/lib/cjs/metadata-cache.cjs +1 -1
- package/dist/lib/cjs/modals/minimizable-modal.cjs +1 -1
- package/dist/lib/cjs/modals/minimizable-modal.d.cts +1 -1
- package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -1
- package/dist/lib/cjs/modals/suggest-modal-command-builder.d.cts +3 -3
- package/dist/lib/cjs/obsidian-dev-utils-state.cjs +1 -1
- package/dist/lib/cjs/obsidian-dev-utils-state.d.cts +5 -2
- package/dist/lib/cjs/path-settings.cjs +214 -35
- package/dist/lib/cjs/path-settings.d.cts +21 -5
- package/dist/lib/cjs/plugin/plugin-api.cjs +17 -2
- package/dist/lib/cjs/plugin/plugin-api.d.cts +24 -7
- package/dist/lib/cjs/plugin/plugin-context.cjs +1 -1
- package/dist/lib/cjs/plugin/plugin.cjs +2 -2
- package/dist/lib/cjs/plugin/plugin.d.cts +1 -1
- package/dist/lib/cjs/resource-lock.cjs +1 -1
- package/dist/lib/cjs/setting-components/checkbox-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/checkbox-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/code-highlighter-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/date-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/date-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/date-time-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/date-time-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/email-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/email-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/file-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/file-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/month-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/month-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/multiple-dropdown-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/multiple-email-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/multiple-email-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/multiple-file-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/multiple-file-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/multiple-text-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/number-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/number-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/password-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/password-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/telephone-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/telephone-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/time-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/time-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/tri-state-checkbox-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/typed-dropdown-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/url-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/url-component.d.cts +1 -1
- package/dist/lib/cjs/setting-components/week-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/week-component.d.cts +1 -1
- package/dist/lib/cjs/vault.cjs +2 -2
- package/dist/lib/cjs/vault.d.cts +2 -2
- package/dist/lib/esm/__merged.d.mts +5 -4
- package/dist/lib/esm/__merged.mjs +57 -3
- package/dist/lib/esm/attachment-path.mjs +1 -1
- package/dist/lib/esm/components/case-insensitive-file-index-component.d.mts +1 -1
- package/dist/lib/esm/components/case-insensitive-file-index-component.mjs +1 -1
- package/dist/lib/esm/components/plugin-suggestion-component.d.mts +1 -1
- package/dist/lib/esm/components/plugin-suggestion-component.mjs +1 -1
- package/dist/lib/esm/components/settings-migration-component.d.mts +1 -1
- package/dist/lib/esm/components/settings-migration-component.mjs +1 -1
- package/dist/lib/esm/css-class.d.mts +4 -2
- package/dist/lib/esm/css-class.mjs +1 -1
- package/dist/lib/esm/demo-vault-helper-settings.d.mts +1 -1
- package/dist/lib/esm/frontmatter.d.mts +1 -1
- package/dist/lib/esm/frontmatter.mjs +1 -1
- package/dist/lib/esm/generated-during-build.d.mts +2 -2
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/i18n/i18n.d.mts +1 -1
- package/dist/lib/esm/i18n/i18n.mjs +2 -2
- package/dist/lib/esm/i18n/locales/en.d.mts +4 -1
- package/dist/lib/esm/i18n/locales/en.mjs +5 -2
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +4 -1
- package/dist/lib/esm/link.d.mts +22 -0
- package/dist/lib/esm/link.mjs +5 -3
- package/dist/lib/esm/metadata-cache.mjs +1 -1
- package/dist/lib/esm/modals/minimizable-modal.d.mts +1 -1
- package/dist/lib/esm/modals/minimizable-modal.mjs +1 -1
- package/dist/lib/esm/modals/suggest-modal-command-builder.d.mts +3 -3
- package/dist/lib/esm/modals/suggest-modal-command-builder.mjs +1 -1
- package/dist/lib/esm/obsidian-dev-utils-state.d.mts +5 -2
- package/dist/lib/esm/obsidian-dev-utils-state.mjs +1 -1
- package/dist/lib/esm/path-settings.d.mts +21 -5
- package/dist/lib/esm/path-settings.mjs +215 -41
- package/dist/lib/esm/plugin/plugin-api.d.mts +24 -7
- package/dist/lib/esm/plugin/plugin-api.mjs +16 -2
- package/dist/lib/esm/plugin/plugin-context.mjs +1 -1
- package/dist/lib/esm/plugin/plugin.d.mts +1 -1
- package/dist/lib/esm/plugin/plugin.mjs +2 -2
- package/dist/lib/esm/resource-lock.mjs +1 -1
- package/dist/lib/esm/setting-components/checkbox-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/checkbox-component.mjs +1 -1
- package/dist/lib/esm/setting-components/code-highlighter-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/code-highlighter-component.mjs +1 -1
- package/dist/lib/esm/setting-components/date-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/date-component.mjs +1 -1
- package/dist/lib/esm/setting-components/date-time-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/date-time-component.mjs +1 -1
- package/dist/lib/esm/setting-components/email-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/email-component.mjs +1 -1
- package/dist/lib/esm/setting-components/file-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/file-component.mjs +1 -1
- package/dist/lib/esm/setting-components/month-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/month-component.mjs +1 -1
- package/dist/lib/esm/setting-components/multiple-dropdown-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/multiple-dropdown-component.mjs +1 -1
- package/dist/lib/esm/setting-components/multiple-email-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/multiple-email-component.mjs +1 -1
- package/dist/lib/esm/setting-components/multiple-file-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/multiple-file-component.mjs +1 -1
- package/dist/lib/esm/setting-components/multiple-text-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/multiple-text-component.mjs +1 -1
- package/dist/lib/esm/setting-components/number-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/number-component.mjs +1 -1
- package/dist/lib/esm/setting-components/password-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/password-component.mjs +1 -1
- package/dist/lib/esm/setting-components/telephone-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/telephone-component.mjs +1 -1
- package/dist/lib/esm/setting-components/time-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/time-component.mjs +1 -1
- package/dist/lib/esm/setting-components/tri-state-checkbox-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/tri-state-checkbox-component.mjs +1 -1
- package/dist/lib/esm/setting-components/typed-dropdown-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/typed-dropdown-component.mjs +1 -1
- package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.mjs +1 -1
- package/dist/lib/esm/setting-components/url-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/url-component.mjs +1 -1
- package/dist/lib/esm/setting-components/week-component.d.mts +1 -1
- package/dist/lib/esm/setting-components/week-component.mjs +1 -1
- package/dist/lib/esm/vault.d.mts +2 -2
- package/dist/lib/esm/vault.mjs +2 -2
- package/package.json +5 -4
|
@@ -384,7 +384,7 @@ class PluginBase extends mixinAsyncEvents()(Plugin) {
|
|
|
384
384
|
* Provides the translations map used to initialize i18n during {@link onload}.
|
|
385
385
|
*
|
|
386
386
|
* Override in subclass to supply plugin-specific translations. The default returns the built-in
|
|
387
|
-
*
|
|
387
|
+
* `@mnaoumov/obsidian-lib` translations.
|
|
388
388
|
*
|
|
389
389
|
* @returns The translations map.
|
|
390
390
|
*/
|
|
@@ -599,4 +599,4 @@ export {
|
|
|
599
599
|
reloadPlugin,
|
|
600
600
|
showErrorAndDisablePlugin
|
|
601
601
|
};
|
|
602
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW4vcGx1Z2luLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCYXNlIGNsYXNzIGZvciBPYnNpZGlhbiBwbHVnaW5zIHVzaW5nIGEgY29tcG9uZW50LWJhc2VkIGFyY2hpdGVjdHVyZS5cbiAqXG4gKiBQbHVnaW5CYXNlIHJlZ2lzdGVycyB1bml2ZXJzYWwgY29tcG9uZW50cyAoY29udGV4dCwgaTE4biwgZXJyb3IgaGFuZGxpbmcsIGFib3J0IHNpZ25hbCwgbGlmZWN5Y2xlIGV2ZW50cywgZGVidWcpLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29tcG9uZW50LFxuICBJY29uTmFtZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBtaXhpbkFzeW5jRXZlbnRzIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jLWV2ZW50cyc7XG5pbXBvcnQgeyBwcmludEVycm9yIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Vycm9yJztcbmltcG9ydCB7IG5vb3BBc3luYyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luQ29uZmxpY3QsXG4gIFBsdWdpbkRlcGVuZGVuY3lcbn0gZnJvbSAnLi4vY29tcG9uZW50cy9wbHVnaW4tZ2F0ZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2xhdGlvbnNNYXAgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5BcGlEZWNsYXJhdGlvbiB9IGZyb20gJy4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIFBsdWdpbkV2ZW50TWFwLFxuICBQbHVnaW5FdmVudFNvdXJjZVxufSBmcm9tICcuL3BsdWdpbi1ldmVudC1zb3VyY2UudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5MaWZlY3ljbGVFdmVudFBheWxvYWQgfSBmcm9tICcuL3BsdWdpbi1saWZlY3ljbGUtZXZlbnRzLnRzJztcblxuaW1wb3J0IHsgQXBwQWN0aXZlRmlsZVByb3ZpZGVyIH0gZnJvbSAnLi4vYWN0aXZlLWZpbGUtcHJvdmlkZXIudHMnO1xuaW1wb3J0IHsgQ29tbWFuZEhhbmRsZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21tYW5kLWhhbmRsZXJzL2NvbW1hbmQtaGFuZGxlci1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgVW5sb2NrQWN0aXZlTm90ZUNvbW1hbmRIYW5kbGVyIH0gZnJvbSAnLi4vY29tbWFuZC1oYW5kbGVycy91bmxvY2stYWN0aXZlLW5vdGUtY29tbWFuZC1oYW5kbGVyLnRzJztcbmltcG9ydCB7IFBsdWdpbkNvbW1hbmRSZWdpc3RyYXIgfSBmcm9tICcuLi9jb21tYW5kLXJlZ2lzdHJhci50cyc7XG5pbXBvcnQgeyBBYm9ydFNpZ25hbENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYWJvcnQtc2lnbmFsLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBBc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYXN5bmMtZXJyb3ItaGFuZGxlci1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbXBvbmVudC1leC50cyc7XG5pbXBvcnQgeyBDb25zb2xlRGVidWdDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbnNvbGUtZGVidWctY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE1lbnVFdmVudFJlZ2lzdHJhckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE5vdGVib29rTmF2aWdhdG9yTWVudUV2ZW50UmVnaXN0cmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9ub3RlYm9vay1uYXZpZ2F0b3ItbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFBsdWdpbkNvbnRleHRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3BsdWdpbi1jb250ZXh0LWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBQbHVnaW5HYXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9wbHVnaW4tZ2F0ZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2UgfSBmcm9tICcuLi9jb21wb25lbnRzL3BsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgUGx1Z2luRGF0YUhhbmRsZXIgfSBmcm9tICcuLi9kYXRhLWhhbmRsZXIudHMnO1xuaW1wb3J0IHsgaW5pdEkxOE4gfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgZGVmYXVsdFRyYW5zbGF0aW9uc01hcCB9IGZyb20gJy4uL2kxOG4vbG9jYWxlcy90cmFuc2xhdGlvbnMtbWFwLnRzJztcbmltcG9ydCB7IFJlc291cmNlTG9ja0NvbXBvbmVudCB9IGZyb20gJy4uL3Jlc291cmNlLWxvY2sudHMnO1xuaW1wb3J0IHsgcHVibGlzaFBsdWdpbkFwaSB9IGZyb20gJy4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQgeyBQbHVnaW5FdmVudFNvdXJjZUltcGwgfSBmcm9tICcuL3BsdWdpbi1ldmVudC1zb3VyY2UudHMnO1xuaW1wb3J0IHtcbiAgUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FLFxuICBQTFVHSU5fVU5MT0FERURfRVZFTlRfTkFNRSxcbiAgdHJpZ2dlclBsdWdpbkxpZmVjeWNsZUV2ZW50XG59IGZyb20gJy4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuXG4vKipcbiAqIFRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyBvd25lZCBieSB7QGxpbmsgUGx1Z2luQmFzZX0sIGtleWVkIGJ5IHRoZSBuYW1lIG9mIHRoZSBhY2Nlc3NvciBleHBvc2luZ1xuICogZWFjaCBvbmUuIEV2ZXJ5IG1lbWJlciBpcyBvcHRpb25hbCBiZWNhdXNlIGEgY29tcG9uZW50IG9ubHkgZXhpc3RzIG9uY2Uge0BsaW5rIFBsdWdpbkJhc2Uub25sb2FkfVxuICogaGFzIGNyZWF0ZWQgaXQuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5CYXNlQ29tcG9uZW50cyB7XG4gIGFib3J0U2lnbmFsQ29tcG9uZW50PzogQWJvcnRTaWduYWxDb21wb25lbnQ7XG4gIGFzeW5jRXJyb3JIYW5kbGVyQ29tcG9uZW50PzogQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQ7XG4gIGNvbW1hbmRIYW5kbGVyQ29tcG9uZW50PzogQ29tbWFuZEhhbmRsZXJDb21wb25lbnQ7XG4gIGNvbnNvbGVEZWJ1Z0NvbXBvbmVudD86IENvbnNvbGVEZWJ1Z0NvbXBvbmVudDtcbiAgcGx1Z2luQ29udGV4dENvbXBvbmVudD86IFBsdWdpbkNvbnRleHRDb21wb25lbnQ7XG4gIHBsdWdpbkdhdGVDb21wb25lbnQ/OiBQbHVnaW5HYXRlQ29tcG9uZW50O1xuICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ/OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHBsdWdpblNldHRpbmdzQ29tcG9uZW50PzogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD47XG4gIHJlc291cmNlTG9ja0NvbXBvbmVudD86IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBjcmVhdGluZyBPYnNpZGlhbiBwbHVnaW5zIHdpdGggYSBjb21wb25lbnQtYmFzZWQgYXJjaGl0ZWN0dXJlLlxuICpcbiAqIFJlZ2lzdGVycyB1bml2ZXJzYWwgY29tcG9uZW50cyBhdXRvbWF0aWNhbGx5LiBTdWJjbGFzc2VzIGFkZCBvciByZXBsYWNlIGNvbXBvbmVudHNcbiAqIHZpYSB7QGxpbmsgcmVtb3ZlQ2hpbGR9IC8ge0BsaW5rIGFkZENoaWxkfS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpbkJhc2UgZXh0ZW5kcyBtaXhpbkFzeW5jRXZlbnRzPFBsdWdpbkV2ZW50TWFwPigpKFBsdWdpbikgaW1wbGVtZW50cyBQbHVnaW5FdmVudFNvdXJjZSB7XG4gIC8qKlxuICAgKiBHZXRzIGFib3J0IHNpZ25hbCBjb21wb25lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIGFib3J0IHNpZ25hbCBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGFib3J0U2lnbmFsQ29tcG9uZW50KCk6IEFib3J0U2lnbmFsQ29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLmFib3J0U2lnbmFsQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGFib3J0IHNpZ25hbCBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEFib3J0IHNpZ25hbCBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IGFib3J0U2lnbmFsQ29tcG9uZW50KHZhbHVlOiBBYm9ydFNpZ25hbENvbXBvbmVudCkge1xuICAgIHRoaXMuc2V0Q29tcG9uZW50KCdhYm9ydFNpZ25hbENvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFzeW5jIGVycm9yIGhhbmRsZXIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBhc3luYyBlcnJvciBoYW5kbGVyIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgYXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQoKTogQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMuYXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYXN5bmMgZXJyb3IgaGFuZGxlciBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEFzeW5jIGVycm9yIGhhbmRsZXIgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBhc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCh2YWx1ZTogQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgnYXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2hhcmVkIGNvbW1hbmQgaGFuZGxlciBjb21wb25lbnQuIFJlZ2lzdGVyIGEgcGx1Z2luJ3MgY29tbWFuZHMgb24gaXQgdmlhXG4gICAqIHtAbGluayBDb21tYW5kSGFuZGxlckNvbXBvbmVudC5yZWdpc3RlckNvbW1hbmRIYW5kbGVyc30gcmF0aGVyIHRoYW4gY29uc3RydWN0aW5nIHlvdXIgb3duXG4gICAqIHtAbGluayBDb21tYW5kSGFuZGxlckNvbXBvbmVudH0g4oCUIHRoZSBhcHAtYmFja2VkIGFjdGl2ZS1maWxlIHByb3ZpZGVyLCBjb21tYW5kIHJlZ2lzdHJhciwgbWVudVxuICAgKiBldmVudCByZWdpc3RyYXIsIGFuZCBwbHVnaW4gbmFtZSBhcmUgYWxyZWFkeSB3aXJlZC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNvbW1hbmQgaGFuZGxlciBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGNvbW1hbmRIYW5kbGVyQ29tcG9uZW50KCk6IENvbW1hbmRIYW5kbGVyQ29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLmNvbW1hbmRIYW5kbGVyQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjb21tYW5kIGhhbmRsZXIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgY29tbWFuZCBoYW5kbGVyIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgY29tbWFuZEhhbmRsZXJDb21wb25lbnQodmFsdWU6IENvbW1hbmRIYW5kbGVyQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ2NvbW1hbmRIYW5kbGVyQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgY29uc29sZSBkZWJ1ZyBjb21wb25lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIGNvbnNvbGUgZGVidWcgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBjb25zb2xlRGVidWdDb21wb25lbnQoKTogQ29uc29sZURlYnVnQ29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLmNvbnNvbGVEZWJ1Z0NvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBjb25zb2xlIGRlYnVnIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gQ29uc29sZSBkZWJ1ZyBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IGNvbnNvbGVEZWJ1Z0NvbXBvbmVudCh2YWx1ZTogQ29uc29sZURlYnVnQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ2NvbnNvbGVEZWJ1Z0NvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHBsdWdpbiBjb250ZXh0IGNvbXBvbmVudCAocGx1Z2luIElELCBkZWJ1ZyBjb250cm9sbGVyLCBsaWJyYXJ5IHN0eWxlcykuXG4gICAqXG4gICAqIEByZXR1cm5zIHBsdWdpbiBjb250ZXh0IGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgcGx1Z2luQ29udGV4dENvbXBvbmVudCgpOiBQbHVnaW5Db250ZXh0Q29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLnBsdWdpbkNvbnRleHRDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcGx1Z2luIGNvbnRleHQgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBQbHVnaW4gY29udGV4dCBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IHBsdWdpbkNvbnRleHRDb21wb25lbnQodmFsdWU6IFBsdWdpbkNvbnRleHRDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgncGx1Z2luQ29udGV4dENvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBnYXRlIGhvbGRpbmcgdGhlIHBsdWdpbidzIGZlYXR1cmUgc3VyZmFjZSB1cCBvciBkb3duLlxuICAgKlxuICAgKiBSZWFjaCBmb3IgaXQgZnJvbSBhIHNldHRpbmdzIHRhYiB0byByZW5kZXIgdGhlIG92ZXJsYXAgYmFubmVyIGZvciBhXG4gICAqIHtAbGluayBjb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudCFQbHVnaW5Db25mbGljdFNldmVyaXR5Lldhcm59IGNvbmZsaWN0IOKAlCB0aGUgb25lXG4gICAqIGJhbm5lciB0aGUgbGlicmFyeSBjYW5ub3QgcGxhY2UgaXRzZWxmLCBiZWNhdXNlIGEgcnVubmluZyBwbHVnaW4gYnVpbGRzIGl0cyBvd24gc2V0dGluZ3MgdGFiLlxuICAgKlxuICAgKiBSZWFkYWJsZSB0aHJvdWdob3V0IHtAbGluayBvbmxvYWRJbXBsfSwgaW5jbHVkaW5nIGl0cyBzeW5jaHJvbm91cyBwcmVmaXgsIHdoaWNoIGlzIHdoZXJlIGEgc2V0dGluZ3NcbiAgICogdGFiIGlzIGJ1aWx0LiBUaGF0IGlzIGRlbGliZXJhdGUgcmF0aGVyIHRoYW4gaW5jaWRlbnRhbDogYWRkaW5nIHRoZSBnYXRlIGlzIHdoYXQgcnVuc1xuICAgKiB7QGxpbmsgb25sb2FkSW1wbH0sIHNvIHtAbGluayBvbmxvYWR9IGFzc2lnbnMgdGhpcyBmaWVsZCBiZWZvcmUgYWRkaW5nIGl0LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGdhdGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBwbHVnaW5HYXRlQ29tcG9uZW50KCk6IFBsdWdpbkdhdGVDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMucGx1Z2luR2F0ZUNvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcGx1Z2luIGdhdGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgcGx1Z2luIGdhdGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBwbHVnaW5HYXRlQ29tcG9uZW50KHZhbHVlOiBQbHVnaW5HYXRlQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ3BsdWdpbkdhdGVDb21wb25lbnQnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBwbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgcGx1Z2luIG5vdGljZSBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHBsdWdpbk5vdGljZUNvbXBvbmVudCgpOiBQbHVnaW5Ob3RpY2VDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMucGx1Z2luTm90aWNlQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHBsdWdpbiBub3RpY2UgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBQbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgcGx1Z2luTm90aWNlQ29tcG9uZW50KHZhbHVlOiBQbHVnaW5Ob3RpY2VDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgncGx1Z2luTm90aWNlQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQoKTogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD4ge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gUGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQodmFsdWU6IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxvYmplY3Q+KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ3BsdWdpblNldHRpbmdzQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVkaXRvciBsb2NrIGNvbXBvbmVudCwgdXNlZCB0byBsb2NrIG5vdGVzIHJlYWQtb25seSBkdXJpbmcgbG9uZyBvcGVyYXRpb25zLiBPd25lZCBieVxuICAgKiB0aGUgcGx1Z2luLCBzbyBpdHMgbG9ja3MgYXJlIHJlbGVhc2VkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMuXG4gICAqXG4gICAqIEByZXR1cm5zIEVkaXRvciBsb2NrIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgcmVzb3VyY2VMb2NrQ29tcG9uZW50KCk6IFJlc291cmNlTG9ja0NvbXBvbmVudCB7XG4gICAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKHRoaXMuY29tcG9uZW50cy5yZXNvdXJjZUxvY2tDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGVkaXRvciBsb2NrIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gRWRpdG9yIGxvY2sgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCByZXNvdXJjZUxvY2tDb21wb25lbnQodmFsdWU6IFJlc291cmNlTG9ja0NvbXBvbmVudCkge1xuICAgIHRoaXMuc2V0Q29tcG9uZW50KCdyZXNvdXJjZUxvY2tDb21wb25lbnQnLCB2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBvbmVudHM6IFBsdWdpbkJhc2VDb21wb25lbnRzID0ge307XG5cbiAgLy8gRXZlcnl0aGluZyB0aGUgU1VCQ0xBU1Mgb3duczogd2hhdCBgb25sb2FkSW1wbGAgYWRkcywgYW5kIHdoYXQgaXQgYWRkcyBsYXRlci5cbiAgLy9cbiAgLy8gQSBzZWNvbmQgd3JhcHBlciByYXRoZXIgdGhhbiBvbmUsIGJlY2F1c2UgdGhlIHR3byB0aWVycyBoYXZlIG9wcG9zaXRlIGxpZmV0aW1lcy4gVGhlIHVuaXZlcnNhbFxuICAvLyBjb21wb25lbnRzIGhhdmUgdG8gT1VUTElWRSBhIGxvc3QgZGVwZW5kZW5jeSDigJQgdGhleSBhcmUgd2hhdCBzaG93cyB0aGUgbm90aWNlIG5hbWluZyB0aGUgcGx1Z2luIHRoYXRcbiAgLy8gd2VudCBhd2F5IGFuZCByZW5kZXJzIHRoZSBidXR0b24gdGhhdCBicmluZ3MgaXQgYmFjayDigJQgd2hpbGUgdGhlIHN1YmNsYXNzJ3Mgc3VyZmFjZSBpcyBleGFjdGx5IHdoYXRcbiAgLy8gbXVzdCBzdG9wIHJ1bm5pbmcuIFVubG9hZGluZyBvbmUgd3JhcHBlciBob2xkaW5nIGJvdGggd291bGQgc2lsZW5jZSB0aGUgcGx1Z2luIGF0IHRoZSBtb21lbnQgaXQgbW9zdFxuICAvLyBuZWVkcyB0byBzcGVhay5cbiAgLy9cbiAgLy8gQWx3YXlzIHByZXNlbnQsIG5ldmVyIG51bGwsIGFuZCBSRVBMQUNFRCByYXRoZXIgdGhhbiBlbXB0aWVkIHdoZW4gdGhlIHN1cmZhY2UgaXMgdG9ybiBkb3duLiBUaGF0IGtlZXBzXG4gIC8vIGBhZGRDaGlsZGAgY2FsbGFibGUgYXQgZXZlcnkgcG9pbnQgaW4gdGhlIHBsdWdpbidzIGxpZmUsIGV4YWN0bHkgYXMgaXQgd2FzIGJlZm9yZSB0aGUgdGllcnMgZXhpc3RlZDpcbiAgLy8gQSBjaGlsZCBhZGRlZCBiZWZvcmUgdGhlIGdhdGUgb3BlbnMgaXMgcXVldWVkIGFuZCBsb2FkZWQgd2hlbiBpdCBkb2VzLCB3aGljaCBpcyB3aGF0IGBDb21wb25lbnRFeGBcbiAgLy8gYWxyZWFkeSBkb2VzIGZvciBhbnkgY2hpbGQgYWRkZWQgdG8gYSBub3QteWV0LWxvYWRlZCBjb21wb25lbnQuXG4gIHByaXZhdGUgZ2F0ZWRXcmFwcGVyQ29tcG9uZW50ID0gbmV3IENvbXBvbmVudEV4KCk7XG5cbiAgLy8gVGhlIHBheWxvYWQgYnJvYWRjYXN0IHdoZW4gdGhpcyBwbHVnaW4gZmluaXNoZWQgbG9hZGluZywga2VwdCBzbyB0aGUgbWF0Y2hpbmcgdW5sb2FkZWQgYnJvYWRjYXN0XG4gIC8vIGRlc2NyaWJlcyB0aGUgc2FtZSBwbHVnaW4gd2l0aG91dCByZS1kZXJpdmluZyBpdCBmcm9tIGEgc3VyZmFjZSB0aGF0IGhhcyBzaW5jZSBiZWVuIHRvcm4gZG93bi4gTnVsbFxuICAvLyB3aGVuZXZlciBubyBsb2FkZWQgYnJvYWRjYXN0IGlzIG91dHN0YW5kaW5nLCB3aGljaCBpcyB3aGF0IGtlZXBzIHRoZSB0d28gZXZlbnRzIHBhaXJlZC5cbiAgcHJpdmF0ZSBsaWZlY3ljbGVFdmVudFBheWxvYWQ6IG51bGwgfCBQbHVnaW5MaWZlY3ljbGVFdmVudFBheWxvYWQgPSBudWxsO1xuXG4gIC8vIFRoZSBsaWJyYXJ5J3Mgb3duIGNvbXBvbmVudHMsIHdoaWNoIG91dGxpdmUgYW55IGRlcGVuZGVuY3kuXG4gIHByaXZhdGUgcmVhZG9ubHkgdW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudCA9IG5ldyBDb21wb25lbnRFeCgpO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2hpbGQgY29tcG9uZW50LlxuICAgKlxuICAgKiBUaGUgY2hpbGQgaXMgYWRkZWQgdG8gdGhlIGludGVybmFsIHdyYXBwZXIgaG9sZGluZyB0aGUgc3ViY2xhc3MncyBvd24gc3VyZmFjZSwgd2hpY2gge0BsaW5rIG9ubG9hZH1cbiAgICogY3JlYXRlcyBhbmQgbG9hZHMgYmVmb3JlIGNhbGxpbmcge0BsaW5rIG9ubG9hZEltcGx9LiBTbyBhIGNoaWxkIGFkZGVkIGR1cmluZyB7QGxpbmsgb25sb2FkSW1wbH0gaXNcbiAgICogbG9hZGVkIGltbWVkaWF0ZWx5LCBjaGlsZHJlbi1maXJzdCwgYW5kIGlzIHVzYWJsZSBieSB0aGUgdGltZSB0aGlzIG1ldGhvZCByZXR1cm5zLlxuICAgKlxuICAgKiBUaGF0IHdyYXBwZXIgaXMgdG9ybiBkb3duIGFuZCByZWJ1aWx0IHdoZW5ldmVyIHRoZSBnYXRlIGNsb3NlcyBhbmQgb3BlbnMgYWdhaW4g4oCUIGEgZGVwZW5kZW5jeSBkZWNsYXJlZFxuICAgKiBieSB7QGxpbmsgZ2V0UGx1Z2luRGVwZW5kZW5jaWVzfSBnb2luZyBhd2F5IGFuZCBjb21pbmcgYmFjaywgb3IgYSBjb25mbGljdCBkZWNsYXJlZCBieVxuICAgKiB7QGxpbmsgZ2V0UGx1Z2luQ29uZmxpY3RzfSBhcHBlYXJpbmcgYW5kIGJlaW5nIHJlc29sdmVkIOKAlCBzbyBhIGNoaWxkIGFkZGVkIGhlcmUgbGl2ZXMgZXhhY3RseSBhcyBsb25nXG4gICAqIGFzIHRoZSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UgZG9lcy4gQWRkaW5nIG9uZSB3aGlsZSB0aGUgc3VyZmFjZSBpcyBkb3duIGlzIHN0aWxsIGxlZ2l0aW1hdGUg4oCUIGl0IGlzXG4gICAqIHF1ZXVlZCBhbmQgbG9hZGVkIHdoZW4gdGhlIHN1cmZhY2UgbmV4dCBjb21lcyB1cCwgdGhlIHdheSB7QGxpbmsgQ29tcG9uZW50RXguYWRkQ2hpbGR9IGFscmVhZHkgcXVldWVzXG4gICAqIGEgY2hpbGQgYWRkZWQgdG8gYSBub3QteWV0LWxvYWRlZCBjb21wb25lbnQuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIFNVQkNMQVNTJ3MgZG9vciwgYW5kIHRoZSBvbmx5IG9uZSBpdCBoYXM6IHRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyB7QGxpbmsgb25sb2FkfSByZWdpc3RlcnNcbiAgICogdGFrZSBhIHByaXZhdGUgcm91dGUgb250byBhIGRpZmZlcmVudCB3cmFwcGVyLiBTbyBhbnl0aGluZyBvYnNlcnZpbmcgdGhpcyBtZXRob2Qg4oCUIGEgdGVzdCBjb3VudGluZyBpdHNcbiAgICogY2FsbHMsIGEgcGF0Y2ggd3JhcHBpbmcgaXQg4oCUIHNlZXMgZXhhY3RseSB0aGUgY2hpbGRyZW4gdGhlIHN1YmNsYXNzIGFkZGVkLCBhbmQgbm9uZSBvZiB0aGUgbGlicmFyeSdzLlxuICAgKiBCZWZvcmUgdGhlIHR3byB0aWVycyBleGlzdGVkIG9uZSBkb29yIGNhcnJpZWQgYm90aCwgYW5kIGEgY29uc3VtZXIgY291bnRpbmcgdGhlIHRvdGFsIGlzIHRoZSBvbmUgdGhpbmdcbiAgICogdGhlIHNwbGl0IGNvdWxkIG5vdCBrZWVwIHdvcmtpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVENvbXBvbmVudCAtIFRoZSB0eXBlIG9mIGNvbXBvbmVudCB0byBhZGQuXG4gICAqIEBwYXJhbSBjb21wb25lbnQgLSBUaGUgY29tcG9uZW50IGluc3RhbmNlIHRvIGFkZC5cbiAgICogQHJldHVybnMgVGhlIGFkZGVkIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhZGRDaGlsZDxUQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50Pihjb21wb25lbnQ6IFRDb21wb25lbnQpOiBUQ29tcG9uZW50IHtcbiAgICByZXR1cm4gdGhpcy5nYXRlZFdyYXBwZXJDb21wb25lbnQuYWRkQ2hpbGQoY29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZXh0ZXJuYWwgc2V0dGluZ3MgY2hhbmdlLlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyBpZiBuZWVkZWQuIE1ha2Ugc3VyZSB0byBjYWxsIGBhd2FpdCBzdXBlci5vbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UoKWAgZmlyc3QuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgb25FeHRlcm5hbFNldHRpbmdzQ2hhbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLm9uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZT8uKCk7XG4gICAgYXdhaXQgdGhpcy50cmlnZ2VyQXN5bmMoJ2V4dGVybmFsU2V0dGluZ3NDaGFuZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGxvYWRlZC5cbiAgICpcbiAgICogT3JjaGVzdHJhdGVzIGxvYWRpbmc6IHJlZ2lzdGVycyB0aGUgdW5pdmVyc2FsIGNvbXBvbmVudHMsIGxldHMgdGhlIHN1YmNsYXNzIHdpcmUgaXRzIG93blxuICAgKiBjb21wb25lbnRzIHZpYSB7QGxpbmsgb25sb2FkSW1wbH0sIHRoZW4gYXdhaXRzIHRoZSBhc3luYyB0YWlsIG9mIGV2ZXJ5IGxvYWQuXG4gICAqIEVhY2ggY29tcG9uZW50IGxvYWRzIGFzIGl0IGlzIGFkZGVkLCBjaGlsZHJlbi1maXJzdC5cbiAgICpcbiAgICogRG8gTk9UIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBPdmVycmlkZSB7QGxpbmsgb25sb2FkSW1wbH0gaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBvbmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRoZSB3cmFwcGVyIGlzIGF0dGFjaGVkIGFuZCBsb2FkZWQgYmVmb3JlIGFueXRoaW5nIGlzIHdpcmVkIHVwLCBzbyBldmVyeSBgYWRkQ2hpbGRgIGJlbG93XG4gICAgICAvLyBsb2FkcyBpdHMgY2hpbGQgc3RyYWlnaHQgYXdheSByYXRoZXIgdGhhbiBxdWV1aW5nIGl0LlxuICAgICAgLy8gVGhhdCBpcyB3aGF0IGxldHMgYSBjb21tYW5kIGhhbmRsZXIgcmVnaXN0ZXIgaXRzIG1lbnUgZXZlbnRzIGZyb20gYG9uUmVnaXN0ZXJlZGAsIHdoaWNoXG4gICAgICAvLyBgcmVnaXN0ZXJDb21tYW5kSGFuZGxlcnNgIGF3YWl0cyBhbmQgd2hpY2ggYSByZWdpc3RyYXIgcmVmdXNlcyB3aGlsZSB1bmxvYWRlZC5cbiAgICAgIC8vIEF0dGFjaGluZyBpdCB1cCBmcm9udCBhbHNvIHJlZ2lzdGVycyB0aGUgd3JhcHBlciBmb3IgdGVhcmRvd24gYmVmb3JlIGFueXRoaW5nIGNhbiB0aHJvdy5cbiAgICAgIC8vIFRoZSBsb2FkIGlzIGV4cGxpY2l0IHJhdGhlciB0aGFuIGxlZnQgdG8gYGFkZENoaWxkYCwgd2hpY2ggbG9hZHMgdGhlIGNoaWxkIG9ubHkgd2hlbiB0aGVcbiAgICAgIC8vIHBsdWdpbiBpdHNlbGYgaXMgbG9hZGVkIOKAlCB0cnVlIHdoZW4gT2JzaWRpYW4gY2FsbHMgYGxvYWQoKWAsIGJ1dCBub3Qgd2hlbiBhIGNhbGxlciBpbnZva2VzXG4gICAgICAvLyBgb25sb2FkKClgIGRpcmVjdGx5LlxuICAgICAgc3VwZXIuYWRkQ2hpbGQodGhpcy51bml2ZXJzYWxXcmFwcGVyQ29tcG9uZW50KTtcbiAgICAgIHRoaXMudW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudC5sb2FkKCk7XG5cbiAgICAgIGF3YWl0IGluaXRJMThOKHRoaXMuY3JlYXRlVHJhbnNsYXRpb25zTWFwKCkpO1xuICAgICAgdGhpcy5wbHVnaW5Db250ZXh0Q29tcG9uZW50ID0gdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChcbiAgICAgICAgbmV3IFBsdWdpbkNvbnRleHRDb21wb25lbnQoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgcGx1Z2luSWQ6IHRoaXMubWFuaWZlc3QuaWRcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQoXG4gICAgICAgIG5ldyBQbHVnaW5Ob3RpY2VDb21wb25lbnQoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgcGx1Z2luTmFtZTogdGhpcy5tYW5pZmVzdC5uYW1lXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5hc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCA9IHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQobmV3IEFzeW5jRXJyb3JIYW5kbGVyQ29tcG9uZW50KHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50KSk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsQ29tcG9uZW50ID0gdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChuZXcgQWJvcnRTaWduYWxDb21wb25lbnQodGhpcy5tYW5pZmVzdC5pZCkpO1xuICAgICAgdGhpcy5jb25zb2xlRGVidWdDb21wb25lbnQgPSB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKG5ldyBDb25zb2xlRGVidWdDb21wb25lbnQodGhpcy5tYW5pZmVzdC5pZCkpO1xuICAgICAgdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQgPSB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKG5ldyBSZXNvdXJjZUxvY2tDb21wb25lbnQodGhpcy5hcHAsIHRoaXMubWFuaWZlc3QuaWQpKTtcbiAgICAgIC8vIGBOb3RlYm9vayBOYXZpZ2F0b3JgIGRyYXdzIGl0cyBvd24gZmlsZSB0cmVlIGFuZCBuZXZlciByYWlzZXMgT2JzaWRpYW4ncyBgZmlsZS1tZW51YCAvXG4gICAgICAvLyBgZmlsZXMtbWVudWAgZXZlbnRzLCBzbyBldmVyeSBwbHVnaW4ncyBjb250ZXh0LW1lbnUgaXRlbXMgd291bGQgdmFuaXNoIGZvciBhbnlvbmUgYnJvd3NpbmdcbiAgICAgIC8vIHRocm91Z2ggaXQuIFdpcmVkIGhlcmUgcmF0aGVyIHRoYW4gcGVyLXBsdWdpbjogdGhlIGJyaWRnZSBzdGF5cyBkb3JtYW50IHdoZW4gTm90ZWJvb2tcbiAgICAgIC8vIE5hdmlnYXRvciBpcyBub3QgaW5zdGFsbGVkLCBhbmQgYSBwbHVnaW4gd2l0aCBubyBmaWxlL2ZvbGRlciBoYW5kbGVycyBjb250cmlidXRlcyBub3RoaW5nLlxuICAgICAgY29uc3Qgbm90ZWJvb2tOYXZpZ2F0b3JNZW51RXZlbnRSZWdpc3RyYXJDb21wb25lbnQgPSB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKFxuICAgICAgICBuZXcgTm90ZWJvb2tOYXZpZ2F0b3JNZW51RXZlbnRSZWdpc3RyYXJDb21wb25lbnQoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgcGx1Z2luTmFtZTogdGhpcy5tYW5pZmVzdC5uYW1lLFxuICAgICAgICAgIHN1Ym1lbnVJY29uOiB0aGlzLmdldE5vdGVib29rTmF2aWdhdG9yTWVudVN1Ym1lbnVJY29uKClcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbW1hbmRIYW5kbGVyQ29tcG9uZW50ID0gdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChcbiAgICAgICAgbmV3IENvbW1hbmRIYW5kbGVyQ29tcG9uZW50KHtcbiAgICAgICAgICBhY3RpdmVGaWxlUHJvdmlkZXI6IG5ldyBBcHBBY3RpdmVGaWxlUHJvdmlkZXIodGhpcy5hcHApLFxuICAgICAgICAgIGFkZGl0aW9uYWxNZW51RXZlbnRSZWdpc3RyYXJzOiBbbm90ZWJvb2tOYXZpZ2F0b3JNZW51RXZlbnRSZWdpc3RyYXJDb21wb25lbnRdLFxuICAgICAgICAgIC8vIFRoZSBjb21wb25lbnQgaXMgdW5pdmVyc2FsOyB0aGUgY29tbWFuZHMgcmVnaXN0ZXJlZCBUSFJPVUdIIGl0IGFyZSBub3QuIEEgc3ViY2xhc3MgcmVnaXN0ZXJzXG4gICAgICAgICAgLy8gaXRzIG93biBmcm9tIGBvbmxvYWRJbXBsYCwgY2xvc2luZyBvdmVyIGNvbGxhYm9yYXRvcnMgdGhhdCBiZWxvbmcgdG8gdGhlIGZlYXR1cmUgc3VyZmFjZSDigJQgc29cbiAgICAgICAgICAvLyB0aG9zZSBjb21tYW5kcyBtdXN0IGdvIGRvd24gd2l0aCB0aGUgc3VyZmFjZSB3aGVuIHRoZSBnYXRlIGNsb3Nlcywgb3IgdGhleSBzaXQgaW4gdGhlIHBhbGV0dGVcbiAgICAgICAgICAvLyBjYWxsaW5nIGludG8gdG9ybi1kb3duIG9iamVjdHMsIGFuZCBhcmUgcmVnaXN0ZXJlZCBhIHNlY29uZCB0aW1lIHdoZW4gdGhlIGdhdGUgcmVvcGVucyBhbmRcbiAgICAgICAgICAvLyBgb25sb2FkSW1wbGAgcnVucyBhZ2Fpbi5cbiAgICAgICAgICAvLyBSZXNvbHZlZCBvbiBldmVyeSBjYWxsIHJhdGhlciB0aGFuIGNhcHR1cmVkIGhlcmUsIGJlY2F1c2UgYHVubG9hZEZlYXR1cmVTdXJmYWNlYCBSRVBMQUNFUyB0aGVcbiAgICAgICAgICAvLyB3cmFwcGVyIGluc3RlYWQgb2YgZW1wdHlpbmcgaXQ6IGVhY2ggY3ljbGUncyBjb21tYW5kcyBiZWxvbmcgdG8gdGhhdCBjeWNsZSdzIHdyYXBwZXIuXG4gICAgICAgICAgY29tbWFuZExpZmV0aW1lT3duZXJQcm92aWRlcjogKCk6IENvbXBvbmVudEV4ID0+IHRoaXMuZ2F0ZWRXcmFwcGVyQ29tcG9uZW50LFxuICAgICAgICAgIGNvbW1hbmRSZWdpc3RyYXI6IG5ldyBQbHVnaW5Db21tYW5kUmVnaXN0cmFyKHRoaXMpLFxuICAgICAgICAgIG1lbnVFdmVudFJlZ2lzdHJhcjogdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChuZXcgTWVudUV2ZW50UmVnaXN0cmFyQ29tcG9uZW50KHRoaXMuYXBwKSksXG4gICAgICAgICAgcGx1Z2luTmFtZTogdGhpcy5tYW5pZmVzdC5uYW1lXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgLy8gQWx3YXlzIGF2YWlsYWJsZTsgdGhlIGNvbW1hbmQncyBvd24gYGNhbkV4ZWN1dGVgIGhpZGVzIGl0IHVubGVzcyB0aGUgYWN0aXZlIG5vdGUgaXMgbG9ja2VkLlxuICAgICAgLy8gVGhlIG9uZSBjb21tYW5kIHRoYXQgbmFtZXMgaXRzIG93bmVyIGV4cGxpY2l0bHksIG9wdGluZyBPVVQgb2YgdGhlIHN1cmZhY2Utc2NvcGVkIGRlZmF1bHQgYWJvdmU6XG4gICAgICAvLyBJdCBpcyB0aGUgcmVzY3VlIGZvciBhIG5vdGUgbGVmdCBsb2NrZWQsIGl0IGNsb3NlcyBvdmVyIG5vdGhpbmcgYnV0IHRoZSB1bml2ZXJzYWwgcmVzb3VyY2UtbG9ja1xuICAgICAgLy8gY29tcG9uZW50LCBhbmQgYSBibG9ja2VkIHBsdWdpbiBpcyBleGFjdGx5IHdoZW4gYSB1c2VyIG1heSBuZWVkIGl0LlxuICAgICAgYXdhaXQgdGhpcy5jb21tYW5kSGFuZGxlckNvbXBvbmVudC5yZWdpc3RlckNvbW1hbmRIYW5kbGVycygoKSA9PiBbXG4gICAgICAgIG5ldyBVbmxvY2tBY3RpdmVOb3RlQ29tbWFuZEhhbmRsZXIoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudFxuICAgICAgICB9KVxuICAgICAgXSwgeyBsaWZldGltZU93bmVyOiB0aGlzLmNvbW1hbmRIYW5kbGVyQ29tcG9uZW50IH0pO1xuXG4gICAgICB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50ID0gdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChcbiAgICAgICAgbmV3IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxvYmplY3Q+KHtcbiAgICAgICAgICBkYXRhSGFuZGxlcjogbmV3IFBsdWdpbkRhdGFIYW5kbGVyKHRoaXMpLFxuICAgICAgICAgIHBsdWdpbkV2ZW50U291cmNlOiBuZXcgUGx1Z2luRXZlbnRTb3VyY2VJbXBsKHRoaXMpLFxuICAgICAgICAgIHBsdWdpblNldHRpbmdzQ2xhc3M6IE9iamVjdFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgLy8gVGhlIGdhdGUuIEl0IGxvYWRzIHRoZSBmZWF0dXJlIHN1cmZhY2UgaXRzZWxmIG9uY2UgZXZlcnkgZGVjbGFyZWQgZGVwZW5kZW5jeSBpcyBzYXRpc2ZpZWQgYW5kIG5vXG4gICAgICAvLyBkZWNsYXJlZCBjb25mbGljdCBob2xkcyDigJQgd2hpY2ggZm9yIGEgcGx1Z2luIGRlY2xhcmluZyBuZWl0aGVyIGlzIGltbWVkaWF0ZWx5LCBzeW5jaHJvbm91c2x5LFxuICAgICAgLy8gYmVmb3JlIHRoaXMgbGluZSByZXR1cm5zIOKAlCBhbmQgdW5sb2FkcyBpdCBhZ2FpbiBpZiBhIGRlcGVuZGVuY3kgaXMgbGF0ZXIgZGlzYWJsZWQgb3IgdW5pbnN0YWxsZWQsXG4gICAgICAvLyBvciBhIGNvbmZsaWN0aW5nIHBsdWdpbiBpcyBlbmFibGVkLiBBIHBsdWdpbiB0aGF0IGlzIGJsb2NrZWQgdGhlcmVmb3JlIHJlYWNoZXMgYGxvYWRXaXRoUHJvbWlzZXNgXG4gICAgICAvLyBiZWxvdyBoYXZpbmcgcmVnaXN0ZXJlZCBub3RoaW5nIG9mIGl0cyBvd24sIHdpdGggb25seSB0aGUgdW5pdmVyc2FsIGNvbXBvbmVudHMgYWJvdmUgcnVubmluZyB0b1xuICAgICAgLy8gZXhwbGFpbiB3aHkgYW5kIHRvIG9mZmVyIHRoZSByZXBhaXIuXG4gICAgICAvLyBBc3NpZ25lZCBCRUZPUkUgdGhlIGFkZCwgdW5saWtlIGV2ZXJ5IHVuaXZlcnNhbCBjb21wb25lbnQgYWJvdmUsIGFuZCB0aGF0IG9yZGVyIGlzIHRoZSB3aG9sZVxuICAgICAgLy8gcG9pbnQuIEFkZGluZyB0aGlzIG9uZSBpcyB3aGF0IHJ1bnMgYG9ubG9hZEltcGxgLCBwZXIgdGhlIHBhcmFncmFwaCBhYm92ZSwgc28gdGhlIGFzc2lnbm1lbnRcbiAgICAgIC8vIHN0YXRlbWVudCBoYXMgbm90IHJldHVybmVkIHlldCB3aGlsZSB0aGUgc3ViY2xhc3MgaXMgcnVubmluZyDigJQgYW5kIGEgc2V0dGluZ3MgdGFiIGJ1aWx0IHRoZXJlXG4gICAgICAvLyByZWFkcyBgdGhpcy5wbHVnaW5HYXRlQ29tcG9uZW50YCB0byByZW5kZXIgdGhlIGBXYXJuYCBiYW5uZXIuIEFzc2lnbmluZyBhZnRlciB0aGUgYWRkIHdvdWxkXG4gICAgICAvLyBtYWtlIHRoYXQgcmVhZCB0aHJvdyBgVmFsdWUgaXMgdW5kZWZpbmVkYCBvdXQgb2YgdGhlIGdldHRlciwgd2hpY2ggaXMgYW4gb3BhcXVlIHdheSB0byBzYXlcbiAgICAgIC8vIFwidG9vIGVhcmx5XCIuIE5vdGhpbmcgYWJvdXQgY2hpbGQtYWRkIG9yZGVyIG1vdmVzOiB0aGUgc2VxdWVuY2Ugb2YgYGFkZFVuaXZlcnNhbENoaWxkYCBjYWxscyBpc1xuICAgICAgLy8gdW5jaGFuZ2VkLCBhbmQgYHNldENvbXBvbmVudGAgaXMgYSBwbGFpbiBzdG9yZS5cbiAgICAgIGNvbnN0IHBsdWdpbkdhdGVDb21wb25lbnQgPSBuZXcgUGx1Z2luR2F0ZUNvbXBvbmVudCh7XG4gICAgICAgIGNvbmZsaWN0czogdGhpcy5nZXRQbHVnaW5Db25mbGljdHMoKSxcbiAgICAgICAgZGVwZW5kZW5jaWVzOiB0aGlzLmdldFBsdWdpbkRlcGVuZGVuY2llcygpLFxuICAgICAgICBsb2FkRmVhdHVyZVN1cmZhY2U6ICgpOiBQcm9taXNlPHZvaWQ+ID0+IHRoaXMubG9hZEZlYXR1cmVTdXJmYWNlKCksXG4gICAgICAgIHBsdWdpbjogdGhpcyxcbiAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgdW5sb2FkRmVhdHVyZVN1cmZhY2U6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICB0aGlzLnVubG9hZEZlYXR1cmVTdXJmYWNlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5wbHVnaW5HYXRlQ29tcG9uZW50ID0gcGx1Z2luR2F0ZUNvbXBvbmVudDtcbiAgICAgIHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQocGx1Z2luR2F0ZUNvbXBvbmVudCk7XG5cbiAgICAgIC8vIEV2ZXJ5IGNoaWxkIGhhcyBhbHJlYWR5IGxvYWRlZCBhcyBpdCB3YXMgYWRkZWQ7IHRoaXMgYXdhaXRzIHRoZWlyIGFjY3VtdWxhdGVkIGFzeW5jIHRhaWxzIGFuZFxuICAgICAgLy8gcmVwb3J0cyBhbnkgZmFpbHVyZSBhcyBhIHNpbmdsZSBgQWdncmVnYXRlRXJyb3JgLlxuICAgICAgYXdhaXQgdGhpcy51bml2ZXJzYWxXcmFwcGVyQ29tcG9uZW50LmxvYWRXaXRoUHJvbWlzZXMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcHJpbnRFcnJvcihuZXcgRXJyb3IoYEVycm9yIGxvYWRpbmcgcGx1Z2luICR7dGhpcy5tYW5pZmVzdC5uYW1lfSAoJHt0aGlzLm1hbmlmZXN0LmlkfSlgLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyB1bmxvYWRlZC5cbiAgICpcbiAgICogQW5ub3VuY2VzIHRoZSBkZXBhcnR1cmUgb24gYGFwcC53b3Jrc3BhY2VgIHNvIGFueXRoaW5nIGRlcGVuZGluZyBvbiB0aGlzIHBsdWdpbiBsZWFybnMgb2YgaXQgYXQgdGhlXG4gICAqIG1vbWVudCBpdCBoYXBwZW5zLCByYXRoZXIgdGhhbiBkaXNjb3ZlcmluZyBpdCBsYXRlciB0aHJvdWdoIGJlaGF2aW9yIHRoYXQgcXVpZXRseSBzdG9wcGVkLlxuICAgKlxuICAgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2Q7IHB1dCB0ZWFyZG93biBvbiBhIGNvbXBvbmVudCBpbnN0ZWFkLCB3aGljaCB1bmxvYWRzIHdpdGggdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbnVubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLmJyb2FkY2FzdFVubG9hZGVkKCk7XG4gICAgc3VwZXIub251bmxvYWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2hpbGQgY29tcG9uZW50LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRDb21wb25lbnQgLSBUaGUgdHlwZSBvZiBjb21wb25lbnQgdG8gcmVtb3ZlLlxuICAgKiBAcGFyYW0gY29tcG9uZW50IC0gVGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIFRoZSByZW1vdmVkIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSByZW1vdmVDaGlsZDxUQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50Pihjb21wb25lbnQ6IFRDb21wb25lbnQpOiBUQ29tcG9uZW50IHtcbiAgICAvLyBSb3V0ZWQgYnkgb3duZXJzaGlwIHJhdGhlciB0aGFuIGJ5IHdoaWNoIHRpZXIgYGFkZENoaWxkYCB3b3VsZCBoYXZlIGNob3NlbiwgYmVjYXVzZSB0aGUgdHdvIGRvIG5vdFxuICAgIC8vIGFsd2F5cyBhZ3JlZTogYSB1bml2ZXJzYWwgY29tcG9uZW50IGlzIHBhcmVudGVkIGRpcmVjdGx5IG9uIHRoZSB1bml2ZXJzYWwgd3JhcHBlciwgeWV0IGEgc3ViY2xhc3NcbiAgICAvLyByZXBsYWNpbmcgb25lIGdvZXMgdGhyb3VnaCB0aGUgc2FtZSBwdWJsaWMgYHJlbW92ZUNoaWxkYCBhcyBpdCB3b3VsZCBmb3IgaXRzIG93biBjaGlsZHJlbi5cbiAgICByZXR1cm4gdGhpcy5nYXRlZFdyYXBwZXJDb21wb25lbnQuaGFzQ2hpbGQoY29tcG9uZW50KSA/IHRoaXMuZ2F0ZWRXcmFwcGVyQ29tcG9uZW50LnJlbW92ZUNoaWxkKGNvbXBvbmVudCkgOiB0aGlzLnVuaXZlcnNhbFdyYXBwZXJDb21wb25lbnQucmVtb3ZlQ2hpbGQoY29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyB0aGUgdHJhbnNsYXRpb25zIG1hcCB1c2VkIHRvIGluaXRpYWxpemUgaTE4biBkdXJpbmcge0BsaW5rIG9ubG9hZH0uXG4gICAqXG4gICAqIE92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIHN1cHBseSBwbHVnaW4tc3BlY2lmaWMgdHJhbnNsYXRpb25zLiBUaGUgZGVmYXVsdCByZXR1cm5zIHRoZSBidWlsdC1pblxuICAgKiBgb2JzaWRpYW4tZGV2LXV0aWxzYCB0cmFuc2xhdGlvbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc2xhdGlvbnMgbWFwLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZVRyYW5zbGF0aW9uc01hcCgpOiBUcmFuc2xhdGlvbnNNYXAge1xuICAgIHJldHVybiBkZWZhdWx0VHJhbnNsYXRpb25zTWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIHRoZSBpY29uIHNob3duIG9uIHRoZSBwbHVnaW4ncyBwYXJlbnQgZW50cnkgaW4gYE5vdGVib29rIE5hdmlnYXRvcmAncyBjb250ZXh0IG1lbnVzLlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBicmFuZCB0aGF0IGVudHJ5OyB0aGUgZGVmYXVsdCBsZWF2ZXMgaXQgd2l0aG91dCBhbiBpY29uLiBUaGUgZW50cnkgaXNcbiAgICogdGl0bGVkIHdpdGggdGhlIHBsdWdpbiBuYW1lIGFuZCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IOKAlCBzZWVcbiAgICoge0BsaW5rIE5vdGVib29rTmF2aWdhdG9yTWVudUV2ZW50UmVnaXN0cmFyQ29tcG9uZW50fS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGljb24sIG9yIGAnJ2AgZm9yIG5vIGljb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Tm90ZWJvb2tOYXZpZ2F0b3JNZW51U3VibWVudUljb24oKTogSWNvbk5hbWUge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyB0aGUgQVBJcyB0aGlzIHBsdWdpbiBleHBvc2VzIHRvIG90aGVyIHBsdWdpbnMuXG4gICAqXG4gICAqIE92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIHB1Ymxpc2ggb25lLiBUaGUgZGVmYXVsdCBwdWJsaXNoZXMgbm9uZS4gQ2FsbGVkIGFmdGVyIHtAbGluayBvbmxvYWRJbXBsfSwgc28gYVxuICAgKiBkZWNsYXJhdGlvbiBtYXkgcmVmZXJlbmNlIGFueXRoaW5nIGl0IGNyZWF0ZWQ7IHRoZSByZXR1cm5lZCBkZWNsYXJhdGlvbnMgYXJlIHB1Ymxpc2hlZCB0aHJvdWdoXG4gICAqIGBwdWJsaXNoUGx1Z2luQXBpYCBhbmQgcmV2b2tlZCB3aGVuIHRoZSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UgdW5sb2Fkcy5cbiAgICpcbiAgICogUmV0dXJuaW5nIGEgTElTVCByYXRoZXIgdGhhbiBhIHNpbmdsZSBBUEkgaXMgZGVsaWJlcmF0ZTogdGhlIHJlZ2lzdHJ5IHN1cHBvcnRzIHNldmVyYWwgY29udHJhY3RcbiAgICogdmVyc2lvbnMgcHVibGlzaGVkIHNpZGUgYnkgc2lkZSwgd2hpY2ggaXMgaG93IGEgcHJvdmlkZXIgc2hpcHMgYSBicmVha2luZyBgMi4wLjBgIHdpdGhvdXQgc3RyYW5kaW5nXG4gICAqIGNvbnN1bWVycyBzdGlsbCBwaW5uZWQgdG8gYF4xYC5cbiAgICpcbiAgICogRXZlcnkgZGVjbGFyYXRpb24gaGVyZSBpcyBwdWJsaXNoZWQgQkVGT1JFIHRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzOnBsdWdpbi1sb2FkZWRgIGJyb2FkY2FzdCwgd2hpY2ggaXNcbiAgICogd2hhdCBsZXRzIGEgbGlzdGVuZXIgY2FsbCB0aGVzZSBBUElzIHRoZSBtb21lbnQgaXQgaGVhcnMgdGhhdCBldmVudC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIEFQSSBkZWNsYXJhdGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0UGx1Z2luQXBpcygpOiBQbHVnaW5BcGlEZWNsYXJhdGlvbltdIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgdGhlIHBsdWdpbnMgdGhpcyBvbmUgcmVmdXNlcywgb3Igd2FybnMgYWJvdXQsIHJ1bm5pbmcgYmVzaWRlLlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBkZWNsYXJlIGFuIG92ZXJsYXAuIFRoZSBkZWZhdWx0IGRlY2xhcmVzIG5vbmUuXG4gICAqXG4gICAqIEEgYEJsb2NrYCBjb25mbGljdCBpcyB0aGUgbWlycm9yIGltYWdlIG9mIGEgZGVwZW5kZW5jeTogd2hpbGUgYSBjb25mbGljdGluZyBwbHVnaW4gaXMgZW5hYmxlZCBhdCBhXG4gICAqIGNvbmZsaWN0aW5nIHZlcnNpb24sIHtAbGluayBvbmxvYWRJbXBsfSBkb2VzIG5vdCBydW4gYXQgYWxsIGFuZCB0aGUgcGx1Z2luIHJlZ2lzdGVycyBub3RoaW5nLiBEZWNsYXJlXG4gICAqIGl0IHdoZW4gYm90aCBwbHVnaW5zIGFjdGluZyBvbiB0aGUgc2FtZSBvcGVyYXRpb24gZGFtYWdlcyB0aGUgdmF1bHQg4oCUIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byB3aW5cbiAgICogdGhhdCByYWNlLCBiZWNhdXNlIHdoaWNoZXZlciBwbHVnaW4gbG9hZGVkIGZpcnN0IGtlZXBzIGEgaGFuZCBvbiB0aGUgd2hlZWwsIHNvIHJlZnVzaW5nIGRldGVybWluaXN0aWNhbGx5XG4gICAqIGJlYXRzIGNvbXBldGluZyB1bnByZWRpY3RhYmx5LiBBIGBXYXJuYCBjb25mbGljdCBkZWNsYXJlcyBhbiBvdmVybGFwIHRoYXQgaXMgbWVyZWx5IGFubm95aW5nLCBzdWNoIGFzIGFcbiAgICogZHVwbGljYXRlZCBjb21tYW5kOiBib3RoIHBsdWdpbnMga2VlcCBydW5uaW5nIGFuZCB0aGUgdXNlciBpcyB0b2xkLlxuICAgKlxuICAgKiBVbmxpa2UgYSBkZXBlbmRlbmN5LCBhIGNvbmZsaWN0aW5nIHBsdWdpbiBuZWVkIG5vdCBwdWJsaXNoIGFueXRoaW5nIOKAlCBpdCBpcyBkZXRlY3RlZCBieSByZWFkaW5nIGl0c1xuICAgKiBpbnN0YWxsZWQgdmVyc2lvbiwgd2hpY2ggaXMgdGhlIG9ubHkgdGhpbmcgYWJvdXQgYW5vdGhlciBwbHVnaW4gdGhhdCByZWFkcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIGxvYWRcbiAgICogb3JkZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBkZWNsYXJlZCBjb25mbGljdHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0UGx1Z2luQ29uZmxpY3RzKCk6IFBsdWdpbkNvbmZsaWN0W10ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyB0aGUgcGx1Z2lucyB0aGlzIG9uZSBjYW5ub3Qgd29yayB3aXRob3V0LlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBkZWNsYXJlIGEgbWFuZGF0b3J5IGRlcGVuZGVuY3kuIFRoZSBkZWZhdWx0IGRlY2xhcmVzIG5vbmUsIGFuZCBzdWNoIGEgcGx1Z2luXG4gICAqIGxvYWRzIGV4YWN0bHkgYXMgaXQgYWx3YXlzIGhhcy5cbiAgICpcbiAgICogQSBkZWNsYXJlZCBkZXBlbmRlbmN5IGlzIE1BTkRBVE9SWSwgdW5saWtlIHRoZSBvZmZlciBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudGAgbWFrZXM6IHdoaWxlIG9uZSBpc1xuICAgKiBtaXNzaW5nLCBkaXNhYmxlZCwgb3IgdG9vIG9sZCwge0BsaW5rIG9ubG9hZEltcGx9IGRvZXMgbm90IHJ1biBhdCBhbGwgYW5kIHRoZSBwbHVnaW4gcmVnaXN0ZXJzIG5vdGhpbmdcbiAgICog4oCUIG5vIGNvbW1hbmRzLCBubyBoYW5kbGVycywgbm8gcGF0Y2hlcy4gSXQgc3RheXMgZW5hYmxlZCBpbiBPYnNpZGlhbidzIGxpc3QgcmF0aGVyIHRoYW4gZGlzYWJsaW5nXG4gICAqIGl0c2VsZiwgYmVjYXVzZSB0aGUgZW5hYmxlZCBzZXQgaXMgdGhlIHVzZXIncyB0byBjaGFuZ2UsIGFuZCBpdCBleHBsYWlucyBpdHNlbGYgdGhyb3VnaCBhIG5vdGljZSBhbmQgYVxuICAgKiBzZXR0aW5ncyBiYW5uZXIgdGhhdCBpbnN0YWxscyB0aGUgbWlzc2luZyBwbHVnaW4gaW4gb25lIGNsaWNrLiBUaGUgbG9hZCBjb21wbGV0ZXMgdGhlIG1vbWVudCB0aGVcbiAgICogZGVwZW5kZW5jeSBhcnJpdmVzLCB3aXRoIG5vIHJlc3RhcnQuXG4gICAqXG4gICAqIEEgZGVwZW5kZW5jeSBtdXN0IHB1Ymxpc2ggYW4gQVBJIHRocm91Z2ggYHB1Ymxpc2hQbHVnaW5BcGlgLCB3aGljaCBpcyB3aGF0IG1ha2VzIGl0cyBwcmVzZW5jZSxcbiAgICogYWJzZW5jZSwgdmVyc2lvbiBhbmQgZGVwYXJ0dXJlIGFsbCBvYnNlcnZhYmxlIHRocm91Z2ggb25lIG1lY2hhbmlzbS4gQSBwbHVnaW4gd2l0aCBub3RoaW5nIHRvIGV4cG9zZVxuICAgKiBjYW4gcHVibGlzaCBhbiBlbXB0eSBBUEkgcHVyZWx5IHNvIGl0IGNhbiBiZSBkZXBlbmRlZCB1cG9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZGVjbGFyZWQgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFBsdWdpbkRlcGVuZGVuY2llcygpOiBQbHVnaW5EZXBlbmRlbmN5W10ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgZHVyaW5nIHtAbGluayBvbmxvYWR9IHRvIHdpcmUgcGx1Z2luLXNwZWNpZmljIGNoaWxkIGNvbXBvbmVudHMuXG4gICAqXG4gICAqIE92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIGFkZCBjaGlsZCBjb21wb25lbnRzIHZpYSB7QGxpbmsgYWRkQ2hpbGR9LiBUaGUgdW5pdmVyc2FsIGNvbXBvbmVudHMgYXJlXG4gICAqIGF2YWlsYWJsZSBoZXJlLiBDaGlsZHJlbiBhcmUgbG9hZGVkIHNlcXVlbnRpYWxseSBpbiB0aGUgb3JkZXIgdGhleSBhcmUgYWRkZWQgKGNoaWxkcmVuLWZpcnN0KS5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzdWJjbGFzcyBsb2FkIGxvZ2ljIGlzIGNvbXBsZXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9ubG9hZEltcGwoKTogUHJvbWlzYWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlcyBhIHVuaXZlcnNhbCBjb21wb25lbnQsIHVubG9hZGluZyB3aGljaGV2ZXIgY29tcG9uZW50IHRoZSBrZXkgaGVsZCBiZWZvcmUuXG4gICAqXG4gICAqIEtleWVkIGJ5IG5hbWUgcmF0aGVyIHRoYW4gaGFuZGVkIHRoZSBwcmV2aW91cyB2YWx1ZSBiZWNhdXNlIGBrZXlvZiB0aGlzYCBleGNsdWRlcyBwcml2YXRlXG4gICAqIG1lbWJlcnMsIHNvIHRoZSBjb21wb25lbnRzIGxpdmUgaW4gYSBzaW5nbGUge0BsaW5rIFBsdWdpbkJhc2VDb21wb25lbnRzfSBiYWcgd2hvc2Uga2V5cyBBUkVcbiAgICogaW5kZXhhYmxlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRLZXkgLSBUaGUga2V5IG9mIHRoZSBjb21wb25lbnQgdG8gc3RvcmUuXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IG9mIHRoZSBjb21wb25lbnQgdG8gc3RvcmUuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBjb21wb25lbnQgdG8gc3RvcmUuXG4gICAqL1xuICAvKipcbiAgICogQWRkcyBhIGNvbXBvbmVudCB0byB0aGUgdW5pdmVyc2FsIHRpZXIsIHdoaWNoIG91dGxpdmVzIGFueSBkZXBlbmRlbmN5LlxuICAgKlxuICAgKiBQcml2YXRlIG9uIHB1cnBvc2U6IG9ubHkgdGhpcyBjbGFzcyBkZWNpZGVzIHdoYXQgaXMgdW5pdmVyc2FsLiBBIHN1YmNsYXNzIGFkZGluZyBvbmUgb2YgaXRzIG93biBnb2VzXG4gICAqIHRocm91Z2gge0BsaW5rIGFkZENoaWxkfSBhbmQgbGFuZHMgaW4gdGhlIGdhdGVkIHRpZXIsIHdoZXJlIGl0IGJlbG9uZ3MuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVENvbXBvbmVudCAtIFRoZSB0eXBlIG9mIGNvbXBvbmVudCB0byBhZGQuXG4gICAqIEBwYXJhbSBjb21wb25lbnQgLSBUaGUgY29tcG9uZW50IGluc3RhbmNlIHRvIGFkZC5cbiAgICogQHJldHVybnMgVGhlIGFkZGVkIGNvbXBvbmVudC5cbiAgICovXG4gIHByaXZhdGUgYWRkVW5pdmVyc2FsQ2hpbGQ8VENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudD4oY29tcG9uZW50OiBUQ29tcG9uZW50KTogVENvbXBvbmVudCB7XG4gICAgcmV0dXJuIHRoaXMudW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudC5hZGRDaGlsZChjb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFubm91bmNlcyBvbiBgYXBwLndvcmtzcGFjZWAgdGhhdCB0aGlzIHBsdWdpbiBpcyBsb2FkZWQgYW5kIGl0cyBBUElzIGFyZSBjYWxsYWJsZS5cbiAgICovXG4gIHByaXZhdGUgYnJvYWRjYXN0TG9hZGVkKCk6IHZvaWQge1xuICAgIHRoaXMubGlmZWN5Y2xlRXZlbnRQYXlsb2FkID0ge1xuICAgICAgYXBpVmVyc2lvbnM6IHRoaXMuZ2V0UGx1Z2luQXBpcygpLm1hcCgoZGVjbGFyYXRpb24pID0+IGRlY2xhcmF0aW9uLmFwaVZlcnNpb24pLFxuICAgICAgZGVwZW5kZW5jeVBsdWdpbklkczogdGhpcy5nZXRQbHVnaW5EZXBlbmRlbmNpZXMoKS5tYXAoKGRlcGVuZGVuY3kpID0+IGRlcGVuZGVuY3kucGx1Z2luSWQpLFxuICAgICAgcGx1Z2luSWQ6IHRoaXMubWFuaWZlc3QuaWQsXG4gICAgICBwbHVnaW5OYW1lOiB0aGlzLm1hbmlmZXN0Lm5hbWUsXG4gICAgICBwbHVnaW5WZXJzaW9uOiB0aGlzLm1hbmlmZXN0LnZlcnNpb25cbiAgICB9O1xuXG4gICAgdHJpZ2dlclBsdWdpbkxpZmVjeWNsZUV2ZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBuYW1lOiBQTFVHSU5fTE9BREVEX0VWRU5UX05BTUUsXG4gICAgICBwYXlsb2FkOiB0aGlzLmxpZmVjeWNsZUV2ZW50UGF5bG9hZFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFubm91bmNlcyBvbiBgYXBwLndvcmtzcGFjZWAgdGhhdCB0aGlzIHBsdWdpbidzIHN1cmZhY2UgaGFzIGdvbmUgYXdheS5cbiAgICpcbiAgICogU2lsZW50IHVubGVzcyBhIGxvYWRlZCBicm9hZGNhc3QgaXMgb3V0c3RhbmRpbmcsIHNvIHRoZSB0d28gZXZlbnRzIHN0YXkgcGFpcmVkOiBhIHBsdWdpbiB0aGF0IG5ldmVyXG4gICAqIGdvdCBwYXN0IGl0cyBkZXBlbmRlbmN5IGdhdGUgbmV2ZXIgYW5ub3VuY2VkIGl0c2VsZiwgYW5kIG11c3Qgbm90IGFubm91bmNlIGEgZGVwYXJ0dXJlIGVpdGhlci5cbiAgICovXG4gIHByaXZhdGUgYnJvYWRjYXN0VW5sb2FkZWQoKTogdm9pZCB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMubGlmZWN5Y2xlRXZlbnRQYXlsb2FkO1xuICAgIGlmICghcGF5bG9hZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubGlmZWN5Y2xlRXZlbnRQYXlsb2FkID0gbnVsbDtcbiAgICB0cmlnZ2VyUGx1Z2luTGlmZWN5Y2xlRXZlbnQoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIG5hbWU6IFBMVUdJTl9VTkxPQURFRF9FVkVOVF9OQU1FLFxuICAgICAgcGF5bG9hZFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbmQgbG9hZHMgdGhlIHN1YmNsYXNzJ3MgZmVhdHVyZSBzdXJmYWNlLCB0aGVuIHB1Ymxpc2hlcyBpdHMgQVBJcyBhbmQgYW5ub3VuY2VzIGl0c2VsZi5cbiAgICpcbiAgICogTk9UIGlkZW1wb3RlbnQsIGRlbGliZXJhdGVseS4gYFBsdWdpbkdhdGVDb21wb25lbnRgIG93bnMgdGhlIHVwL2Rvd24gc3RhdGUgbWFjaGluZSBhbmQgY2FsbHNcbiAgICogdGhpcyBvbmx5IG9uIGEgcmVhbCB0cmFuc2l0aW9uOyBhIHNlY29uZCBndWFyZCBoZXJlIHdvdWxkIGJlIGEgc2Vjb25kIGNvcHkgb2YgdGhhdCBzdGF0ZSwgd2hpY2ggaXMgdGhlXG4gICAqIGtpbmQgb2YgZHVwbGljYXRlIHRoYXQgZHJpZnRzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHN1cmZhY2UgaXMgbG9hZGVkIGFuZCB0aGUgYnJvYWRjYXN0IGhhcyBiZWVuIG1hZGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRGZWF0dXJlU3VyZmFjZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBMb2FkZWQgZXhwbGljaXRseSBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSB1bml2ZXJzYWwgd3JhcHBlciBpczogYGFkZENoaWxkYCBsb2FkcyBhIGNoaWxkIG9ubHkgb25jZVxuICAgIC8vIGl0cyBwYXJlbnQgaXMgbG9hZGVkLCBhbmQgdGhlIHN1cmZhY2UgaGFzIHRvIGJlIGxpdmUgYmVmb3JlIGBvbmxvYWRJbXBsYCBzdGFydHMgYWRkaW5nIHRvIGl0LlxuICAgIGNvbnN0IGdhdGVkV3JhcHBlckNvbXBvbmVudCA9IHRoaXMuZ2F0ZWRXcmFwcGVyQ29tcG9uZW50O1xuICAgIHRoaXMudW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudC5hZGRDaGlsZChnYXRlZFdyYXBwZXJDb21wb25lbnQpO1xuICAgIGdhdGVkV3JhcHBlckNvbXBvbmVudC5sb2FkKCk7XG5cbiAgICBhd2FpdCB0aGlzLm9ubG9hZEltcGwoKTtcbiAgICBhd2FpdCBnYXRlZFdyYXBwZXJDb21wb25lbnQubG9hZFdpdGhQcm9taXNlcygpO1xuXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiB0aGlzLmdldFBsdWdpbkFwaXMoKSkge1xuICAgICAgcHVibGlzaFBsdWdpbkFwaSh7XG4gICAgICAgIC4uLmRlY2xhcmF0aW9uLFxuICAgICAgICAvLyBSZXZva2VkIHdpdGggdGhlIFNVUkZBQ0UsIG5vdCB3aXRoIHRoZSBwbHVnaW46IGEgcGx1Z2luIHdob3NlIGRlcGVuZGVuY3kgZ29lcyBhd2F5IGtlZXBzIHJ1bm5pbmdcbiAgICAgICAgLy8gaXRzIHVuaXZlcnNhbCBjb21wb25lbnRzLCBhbmQgYSBjb25zdW1lciBtdXN0IG5vdCBiZSBsZWZ0IGhvbGRpbmcgYSBoYW5kbGUgaW50byB0aGUgaGFsZiBvZiBpdFxuICAgICAgICAvLyB0aGF0IHdhcyBqdXN0IHRvcm4gZG93bi5cbiAgICAgICAgY29tcG9uZW50OiBnYXRlZFdyYXBwZXJDb21wb25lbnQsXG4gICAgICAgIHBsdWdpbjogdGhpc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5icm9hZGNhc3RMb2FkZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29tcG9uZW50PFRLZXkgZXh0ZW5kcyBrZXlvZiBQbHVnaW5CYXNlQ29tcG9uZW50cz4oa2V5OiBUS2V5LCB2YWx1ZTogTm9uTnVsbGFibGU8UGx1Z2luQmFzZUNvbXBvbmVudHNbVEtleV0+KTogdm9pZCB7XG4gICAgY29uc3Qgb2xkQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzW2tleV07XG4gICAgaWYgKG9sZENvbXBvbmVudCkge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZChvbGRDb21wb25lbnQpO1xuICAgIH1cbiAgICB0aGlzLmNvbXBvbmVudHNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlYXJzIHRoZSBzdWJjbGFzcydzIGZlYXR1cmUgc3VyZmFjZSBkb3duLCBsZWF2aW5nIHRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyBydW5uaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSB1bmxvYWRGZWF0dXJlU3VyZmFjZSgpOiB2b2lkIHtcbiAgICBjb25zdCBnYXRlZFdyYXBwZXJDb21wb25lbnQgPSB0aGlzLmdhdGVkV3JhcHBlckNvbXBvbmVudDtcblxuICAgIC8vIFJlcGxhY2VkIEJFRk9SRSB0aGUgb2xkIG9uZSBpcyB1bmxvYWRlZCwgc28gYW55dGhpbmcgdGhhdCByZXN1bWVzIG1pZC10ZWFyZG93biBhbmQgY2FsbHMgYGFkZENoaWxkYFxuICAgIC8vIHBhcmtzIGl0cyBjaGlsZCBvbiB0aGUgZnJlc2ggc3VyZmFjZSByYXRoZXIgdGhhbiBvbiB0aGUgb25lIGJlaW5nIHRvcm4gZG93biDigJQgd2hlcmUgYENvbXBvbmVudEV4YFxuICAgIC8vIHdvdWxkIHJlZnVzZSBpdCBvdXRyaWdodCwgc2luY2UgaXQgcmVmdXNlcyBjaGlsZHJlbiBhZGRlZCB0byBhbiBhbHJlYWR5LXVubG9hZGVkIGNvbXBvbmVudC5cbiAgICB0aGlzLmdhdGVkV3JhcHBlckNvbXBvbmVudCA9IG5ldyBDb21wb25lbnRFeCgpO1xuICAgIHRoaXMudW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudC5yZW1vdmVDaGlsZChnYXRlZFdyYXBwZXJDb21wb25lbnQpO1xuXG4gICAgdGhpcy5icm9hZGNhc3RVbmxvYWRlZCgpO1xuICB9XG59XG5cbi8qKlxuICogUmVsb2FkcyB0aGUgc3BlY2lmaWVkIHBsdWdpbiBieSBkaXNhYmxpbmcgYW5kIHRoZW4gcmUtZW5hYmxpbmcgaXQuXG4gKlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gcmVsb2FkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwbHVnaW4gaXMgcmVsb2FkZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxvYWRQbHVnaW4ocGx1Z2luOiBQbHVnaW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGx1Z2lucyA9IHBsdWdpbi5hcHAucGx1Z2lucztcbiAgY29uc3QgcGx1Z2luSWQgPSBwbHVnaW4ubWFuaWZlc3QuaWQ7XG4gIGF3YWl0IHBsdWdpbnMuZGlzYWJsZVBsdWdpbihwbHVnaW5JZCk7XG4gIGF3YWl0IHBsdWdpbnMuZW5hYmxlUGx1Z2luKHBsdWdpbklkKTtcbn1cblxuLyoqXG4gKiBEaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlIGFzIGEgbm90aWNlLCBsb2dzIGl0IHRvIHRoZSBjb25zb2xlLCBhbmQgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gZGlzYWJsZS5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSBhbmQgbG9nLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwbHVnaW4gaXMgZGlzYWJsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaG93RXJyb3JBbmREaXNhYmxlUGx1Z2luKHBsdWdpbjogUGx1Z2luLCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGx1Z2luTm90aWNlQ29tcG9uZW50ID0gbmV3IFBsdWdpbk5vdGljZUNvbXBvbmVudCh7XG4gICAgYXBwOiBwbHVnaW4uYXBwLFxuICAgIHBsdWdpbk5hbWU6IHBsdWdpbi5tYW5pZmVzdC5uYW1lXG4gIH0pO1xuICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShtZXNzYWdlKTtcbiAgcHJpbnRFcnJvcihuZXcgRXJyb3IobWVzc2FnZSkpO1xuICBhd2FpdCBwbHVnaW4uYXBwLnBsdWdpbnMuZGlzYWJsZVBsdWdpbihwbHVnaW4ubWFuaWZlc3QuaWQpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNBLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsY0FBYztBQWN2QixTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLCtCQUErQjtBQUN4QyxTQUFTLHNDQUFzQztBQUMvQyxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLDRCQUE0QjtBQUNyQyxTQUFTLGtDQUFrQztBQUMzQyxTQUFTLG1C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
|
|
602
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW4vcGx1Z2luLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCYXNlIGNsYXNzIGZvciBPYnNpZGlhbiBwbHVnaW5zIHVzaW5nIGEgY29tcG9uZW50LWJhc2VkIGFyY2hpdGVjdHVyZS5cbiAqXG4gKiBQbHVnaW5CYXNlIHJlZ2lzdGVycyB1bml2ZXJzYWwgY29tcG9uZW50cyAoY29udGV4dCwgaTE4biwgZXJyb3IgaGFuZGxpbmcsIGFib3J0IHNpZ25hbCwgbGlmZWN5Y2xlIGV2ZW50cywgZGVidWcpLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29tcG9uZW50LFxuICBJY29uTmFtZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBtaXhpbkFzeW5jRXZlbnRzIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jLWV2ZW50cyc7XG5pbXBvcnQgeyBwcmludEVycm9yIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Vycm9yJztcbmltcG9ydCB7IG5vb3BBc3luYyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luQ29uZmxpY3QsXG4gIFBsdWdpbkRlcGVuZGVuY3lcbn0gZnJvbSAnLi4vY29tcG9uZW50cy9wbHVnaW4tZ2F0ZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2xhdGlvbnNNYXAgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5BcGlEZWNsYXJhdGlvbiB9IGZyb20gJy4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIFBsdWdpbkV2ZW50TWFwLFxuICBQbHVnaW5FdmVudFNvdXJjZVxufSBmcm9tICcuL3BsdWdpbi1ldmVudC1zb3VyY2UudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5MaWZlY3ljbGVFdmVudFBheWxvYWQgfSBmcm9tICcuL3BsdWdpbi1saWZlY3ljbGUtZXZlbnRzLnRzJztcblxuaW1wb3J0IHsgQXBwQWN0aXZlRmlsZVByb3ZpZGVyIH0gZnJvbSAnLi4vYWN0aXZlLWZpbGUtcHJvdmlkZXIudHMnO1xuaW1wb3J0IHsgQ29tbWFuZEhhbmRsZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21tYW5kLWhhbmRsZXJzL2NvbW1hbmQtaGFuZGxlci1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgVW5sb2NrQWN0aXZlTm90ZUNvbW1hbmRIYW5kbGVyIH0gZnJvbSAnLi4vY29tbWFuZC1oYW5kbGVycy91bmxvY2stYWN0aXZlLW5vdGUtY29tbWFuZC1oYW5kbGVyLnRzJztcbmltcG9ydCB7IFBsdWdpbkNvbW1hbmRSZWdpc3RyYXIgfSBmcm9tICcuLi9jb21tYW5kLXJlZ2lzdHJhci50cyc7XG5pbXBvcnQgeyBBYm9ydFNpZ25hbENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYWJvcnQtc2lnbmFsLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBBc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYXN5bmMtZXJyb3ItaGFuZGxlci1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbXBvbmVudC1leC50cyc7XG5pbXBvcnQgeyBDb25zb2xlRGVidWdDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbnNvbGUtZGVidWctY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE1lbnVFdmVudFJlZ2lzdHJhckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE5vdGVib29rTmF2aWdhdG9yTWVudUV2ZW50UmVnaXN0cmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9ub3RlYm9vay1uYXZpZ2F0b3ItbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFBsdWdpbkNvbnRleHRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3BsdWdpbi1jb250ZXh0LWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBQbHVnaW5HYXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9wbHVnaW4tZ2F0ZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2UgfSBmcm9tICcuLi9jb21wb25lbnRzL3BsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgUGx1Z2luRGF0YUhhbmRsZXIgfSBmcm9tICcuLi9kYXRhLWhhbmRsZXIudHMnO1xuaW1wb3J0IHsgaW5pdEkxOE4gfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgZGVmYXVsdFRyYW5zbGF0aW9uc01hcCB9IGZyb20gJy4uL2kxOG4vbG9jYWxlcy90cmFuc2xhdGlvbnMtbWFwLnRzJztcbmltcG9ydCB7IFJlc291cmNlTG9ja0NvbXBvbmVudCB9IGZyb20gJy4uL3Jlc291cmNlLWxvY2sudHMnO1xuaW1wb3J0IHsgcHVibGlzaFBsdWdpbkFwaSB9IGZyb20gJy4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQgeyBQbHVnaW5FdmVudFNvdXJjZUltcGwgfSBmcm9tICcuL3BsdWdpbi1ldmVudC1zb3VyY2UudHMnO1xuaW1wb3J0IHtcbiAgUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FLFxuICBQTFVHSU5fVU5MT0FERURfRVZFTlRfTkFNRSxcbiAgdHJpZ2dlclBsdWdpbkxpZmVjeWNsZUV2ZW50XG59IGZyb20gJy4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuXG4vKipcbiAqIFRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyBvd25lZCBieSB7QGxpbmsgUGx1Z2luQmFzZX0sIGtleWVkIGJ5IHRoZSBuYW1lIG9mIHRoZSBhY2Nlc3NvciBleHBvc2luZ1xuICogZWFjaCBvbmUuIEV2ZXJ5IG1lbWJlciBpcyBvcHRpb25hbCBiZWNhdXNlIGEgY29tcG9uZW50IG9ubHkgZXhpc3RzIG9uY2Uge0BsaW5rIFBsdWdpbkJhc2Uub25sb2FkfVxuICogaGFzIGNyZWF0ZWQgaXQuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5CYXNlQ29tcG9uZW50cyB7XG4gIGFib3J0U2lnbmFsQ29tcG9uZW50PzogQWJvcnRTaWduYWxDb21wb25lbnQ7XG4gIGFzeW5jRXJyb3JIYW5kbGVyQ29tcG9uZW50PzogQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQ7XG4gIGNvbW1hbmRIYW5kbGVyQ29tcG9uZW50PzogQ29tbWFuZEhhbmRsZXJDb21wb25lbnQ7XG4gIGNvbnNvbGVEZWJ1Z0NvbXBvbmVudD86IENvbnNvbGVEZWJ1Z0NvbXBvbmVudDtcbiAgcGx1Z2luQ29udGV4dENvbXBvbmVudD86IFBsdWdpbkNvbnRleHRDb21wb25lbnQ7XG4gIHBsdWdpbkdhdGVDb21wb25lbnQ/OiBQbHVnaW5HYXRlQ29tcG9uZW50O1xuICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ/OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHBsdWdpblNldHRpbmdzQ29tcG9uZW50PzogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD47XG4gIHJlc291cmNlTG9ja0NvbXBvbmVudD86IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBjcmVhdGluZyBPYnNpZGlhbiBwbHVnaW5zIHdpdGggYSBjb21wb25lbnQtYmFzZWQgYXJjaGl0ZWN0dXJlLlxuICpcbiAqIFJlZ2lzdGVycyB1bml2ZXJzYWwgY29tcG9uZW50cyBhdXRvbWF0aWNhbGx5LiBTdWJjbGFzc2VzIGFkZCBvciByZXBsYWNlIGNvbXBvbmVudHNcbiAqIHZpYSB7QGxpbmsgcmVtb3ZlQ2hpbGR9IC8ge0BsaW5rIGFkZENoaWxkfS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpbkJhc2UgZXh0ZW5kcyBtaXhpbkFzeW5jRXZlbnRzPFBsdWdpbkV2ZW50TWFwPigpKFBsdWdpbikgaW1wbGVtZW50cyBQbHVnaW5FdmVudFNvdXJjZSB7XG4gIC8qKlxuICAgKiBHZXRzIGFib3J0IHNpZ25hbCBjb21wb25lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIGFib3J0IHNpZ25hbCBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGFib3J0U2lnbmFsQ29tcG9uZW50KCk6IEFib3J0U2lnbmFsQ29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLmFib3J0U2lnbmFsQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGFib3J0IHNpZ25hbCBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEFib3J0IHNpZ25hbCBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IGFib3J0U2lnbmFsQ29tcG9uZW50KHZhbHVlOiBBYm9ydFNpZ25hbENvbXBvbmVudCkge1xuICAgIHRoaXMuc2V0Q29tcG9uZW50KCdhYm9ydFNpZ25hbENvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFzeW5jIGVycm9yIGhhbmRsZXIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBhc3luYyBlcnJvciBoYW5kbGVyIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgYXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQoKTogQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMuYXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYXN5bmMgZXJyb3IgaGFuZGxlciBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEFzeW5jIGVycm9yIGhhbmRsZXIgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBhc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCh2YWx1ZTogQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgnYXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2hhcmVkIGNvbW1hbmQgaGFuZGxlciBjb21wb25lbnQuIFJlZ2lzdGVyIGEgcGx1Z2luJ3MgY29tbWFuZHMgb24gaXQgdmlhXG4gICAqIHtAbGluayBDb21tYW5kSGFuZGxlckNvbXBvbmVudC5yZWdpc3RlckNvbW1hbmRIYW5kbGVyc30gcmF0aGVyIHRoYW4gY29uc3RydWN0aW5nIHlvdXIgb3duXG4gICAqIHtAbGluayBDb21tYW5kSGFuZGxlckNvbXBvbmVudH0g4oCUIHRoZSBhcHAtYmFja2VkIGFjdGl2ZS1maWxlIHByb3ZpZGVyLCBjb21tYW5kIHJlZ2lzdHJhciwgbWVudVxuICAgKiBldmVudCByZWdpc3RyYXIsIGFuZCBwbHVnaW4gbmFtZSBhcmUgYWxyZWFkeSB3aXJlZC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNvbW1hbmQgaGFuZGxlciBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGNvbW1hbmRIYW5kbGVyQ29tcG9uZW50KCk6IENvbW1hbmRIYW5kbGVyQ29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLmNvbW1hbmRIYW5kbGVyQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjb21tYW5kIGhhbmRsZXIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgY29tbWFuZCBoYW5kbGVyIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgY29tbWFuZEhhbmRsZXJDb21wb25lbnQodmFsdWU6IENvbW1hbmRIYW5kbGVyQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ2NvbW1hbmRIYW5kbGVyQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgY29uc29sZSBkZWJ1ZyBjb21wb25lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIGNvbnNvbGUgZGVidWcgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBjb25zb2xlRGVidWdDb21wb25lbnQoKTogQ29uc29sZURlYnVnQ29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLmNvbnNvbGVEZWJ1Z0NvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBjb25zb2xlIGRlYnVnIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gQ29uc29sZSBkZWJ1ZyBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IGNvbnNvbGVEZWJ1Z0NvbXBvbmVudCh2YWx1ZTogQ29uc29sZURlYnVnQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ2NvbnNvbGVEZWJ1Z0NvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHBsdWdpbiBjb250ZXh0IGNvbXBvbmVudCAocGx1Z2luIElELCBkZWJ1ZyBjb250cm9sbGVyLCBsaWJyYXJ5IHN0eWxlcykuXG4gICAqXG4gICAqIEByZXR1cm5zIHBsdWdpbiBjb250ZXh0IGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgcGx1Z2luQ29udGV4dENvbXBvbmVudCgpOiBQbHVnaW5Db250ZXh0Q29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLnBsdWdpbkNvbnRleHRDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcGx1Z2luIGNvbnRleHQgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBQbHVnaW4gY29udGV4dCBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IHBsdWdpbkNvbnRleHRDb21wb25lbnQodmFsdWU6IFBsdWdpbkNvbnRleHRDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgncGx1Z2luQ29udGV4dENvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBnYXRlIGhvbGRpbmcgdGhlIHBsdWdpbidzIGZlYXR1cmUgc3VyZmFjZSB1cCBvciBkb3duLlxuICAgKlxuICAgKiBSZWFjaCBmb3IgaXQgZnJvbSBhIHNldHRpbmdzIHRhYiB0byByZW5kZXIgdGhlIG92ZXJsYXAgYmFubmVyIGZvciBhXG4gICAqIHtAbGluayBjb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudCFQbHVnaW5Db25mbGljdFNldmVyaXR5Lldhcm59IGNvbmZsaWN0IOKAlCB0aGUgb25lXG4gICAqIGJhbm5lciB0aGUgbGlicmFyeSBjYW5ub3QgcGxhY2UgaXRzZWxmLCBiZWNhdXNlIGEgcnVubmluZyBwbHVnaW4gYnVpbGRzIGl0cyBvd24gc2V0dGluZ3MgdGFiLlxuICAgKlxuICAgKiBSZWFkYWJsZSB0aHJvdWdob3V0IHtAbGluayBvbmxvYWRJbXBsfSwgaW5jbHVkaW5nIGl0cyBzeW5jaHJvbm91cyBwcmVmaXgsIHdoaWNoIGlzIHdoZXJlIGEgc2V0dGluZ3NcbiAgICogdGFiIGlzIGJ1aWx0LiBUaGF0IGlzIGRlbGliZXJhdGUgcmF0aGVyIHRoYW4gaW5jaWRlbnRhbDogYWRkaW5nIHRoZSBnYXRlIGlzIHdoYXQgcnVuc1xuICAgKiB7QGxpbmsgb25sb2FkSW1wbH0sIHNvIHtAbGluayBvbmxvYWR9IGFzc2lnbnMgdGhpcyBmaWVsZCBiZWZvcmUgYWRkaW5nIGl0LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGdhdGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBwbHVnaW5HYXRlQ29tcG9uZW50KCk6IFBsdWdpbkdhdGVDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMucGx1Z2luR2F0ZUNvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcGx1Z2luIGdhdGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgcGx1Z2luIGdhdGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBwbHVnaW5HYXRlQ29tcG9uZW50KHZhbHVlOiBQbHVnaW5HYXRlQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ3BsdWdpbkdhdGVDb21wb25lbnQnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBwbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgcGx1Z2luIG5vdGljZSBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHBsdWdpbk5vdGljZUNvbXBvbmVudCgpOiBQbHVnaW5Ob3RpY2VDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMucGx1Z2luTm90aWNlQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHBsdWdpbiBub3RpY2UgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBQbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgcGx1Z2luTm90aWNlQ29tcG9uZW50KHZhbHVlOiBQbHVnaW5Ob3RpY2VDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgncGx1Z2luTm90aWNlQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQoKTogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD4ge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gUGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQodmFsdWU6IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxvYmplY3Q+KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ3BsdWdpblNldHRpbmdzQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVkaXRvciBsb2NrIGNvbXBvbmVudCwgdXNlZCB0byBsb2NrIG5vdGVzIHJlYWQtb25seSBkdXJpbmcgbG9uZyBvcGVyYXRpb25zLiBPd25lZCBieVxuICAgKiB0aGUgcGx1Z2luLCBzbyBpdHMgbG9ja3MgYXJlIHJlbGVhc2VkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMuXG4gICAqXG4gICAqIEByZXR1cm5zIEVkaXRvciBsb2NrIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgcmVzb3VyY2VMb2NrQ29tcG9uZW50KCk6IFJlc291cmNlTG9ja0NvbXBvbmVudCB7XG4gICAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKHRoaXMuY29tcG9uZW50cy5yZXNvdXJjZUxvY2tDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGVkaXRvciBsb2NrIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gRWRpdG9yIGxvY2sgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCByZXNvdXJjZUxvY2tDb21wb25lbnQodmFsdWU6IFJlc291cmNlTG9ja0NvbXBvbmVudCkge1xuICAgIHRoaXMuc2V0Q29tcG9uZW50KCdyZXNvdXJjZUxvY2tDb21wb25lbnQnLCB2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBvbmVudHM6IFBsdWdpbkJhc2VDb21wb25lbnRzID0ge307XG5cbiAgLy8gRXZlcnl0aGluZyB0aGUgU1VCQ0xBU1Mgb3duczogd2hhdCBgb25sb2FkSW1wbGAgYWRkcywgYW5kIHdoYXQgaXQgYWRkcyBsYXRlci5cbiAgLy9cbiAgLy8gQSBzZWNvbmQgd3JhcHBlciByYXRoZXIgdGhhbiBvbmUsIGJlY2F1c2UgdGhlIHR3byB0aWVycyBoYXZlIG9wcG9zaXRlIGxpZmV0aW1lcy4gVGhlIHVuaXZlcnNhbFxuICAvLyBjb21wb25lbnRzIGhhdmUgdG8gT1VUTElWRSBhIGxvc3QgZGVwZW5kZW5jeSDigJQgdGhleSBhcmUgd2hhdCBzaG93cyB0aGUgbm90aWNlIG5hbWluZyB0aGUgcGx1Z2luIHRoYXRcbiAgLy8gd2VudCBhd2F5IGFuZCByZW5kZXJzIHRoZSBidXR0b24gdGhhdCBicmluZ3MgaXQgYmFjayDigJQgd2hpbGUgdGhlIHN1YmNsYXNzJ3Mgc3VyZmFjZSBpcyBleGFjdGx5IHdoYXRcbiAgLy8gbXVzdCBzdG9wIHJ1bm5pbmcuIFVubG9hZGluZyBvbmUgd3JhcHBlciBob2xkaW5nIGJvdGggd291bGQgc2lsZW5jZSB0aGUgcGx1Z2luIGF0IHRoZSBtb21lbnQgaXQgbW9zdFxuICAvLyBuZWVkcyB0byBzcGVhay5cbiAgLy9cbiAgLy8gQWx3YXlzIHByZXNlbnQsIG5ldmVyIG51bGwsIGFuZCBSRVBMQUNFRCByYXRoZXIgdGhhbiBlbXB0aWVkIHdoZW4gdGhlIHN1cmZhY2UgaXMgdG9ybiBkb3duLiBUaGF0IGtlZXBzXG4gIC8vIGBhZGRDaGlsZGAgY2FsbGFibGUgYXQgZXZlcnkgcG9pbnQgaW4gdGhlIHBsdWdpbidzIGxpZmUsIGV4YWN0bHkgYXMgaXQgd2FzIGJlZm9yZSB0aGUgdGllcnMgZXhpc3RlZDpcbiAgLy8gQSBjaGlsZCBhZGRlZCBiZWZvcmUgdGhlIGdhdGUgb3BlbnMgaXMgcXVldWVkIGFuZCBsb2FkZWQgd2hlbiBpdCBkb2VzLCB3aGljaCBpcyB3aGF0IGBDb21wb25lbnRFeGBcbiAgLy8gYWxyZWFkeSBkb2VzIGZvciBhbnkgY2hpbGQgYWRkZWQgdG8gYSBub3QteWV0LWxvYWRlZCBjb21wb25lbnQuXG4gIHByaXZhdGUgZ2F0ZWRXcmFwcGVyQ29tcG9uZW50ID0gbmV3IENvbXBvbmVudEV4KCk7XG5cbiAgLy8gVGhlIHBheWxvYWQgYnJvYWRjYXN0IHdoZW4gdGhpcyBwbHVnaW4gZmluaXNoZWQgbG9hZGluZywga2VwdCBzbyB0aGUgbWF0Y2hpbmcgdW5sb2FkZWQgYnJvYWRjYXN0XG4gIC8vIGRlc2NyaWJlcyB0aGUgc2FtZSBwbHVnaW4gd2l0aG91dCByZS1kZXJpdmluZyBpdCBmcm9tIGEgc3VyZmFjZSB0aGF0IGhhcyBzaW5jZSBiZWVuIHRvcm4gZG93bi4gTnVsbFxuICAvLyB3aGVuZXZlciBubyBsb2FkZWQgYnJvYWRjYXN0IGlzIG91dHN0YW5kaW5nLCB3aGljaCBpcyB3aGF0IGtlZXBzIHRoZSB0d28gZXZlbnRzIHBhaXJlZC5cbiAgcHJpdmF0ZSBsaWZlY3ljbGVFdmVudFBheWxvYWQ6IG51bGwgfCBQbHVnaW5MaWZlY3ljbGVFdmVudFBheWxvYWQgPSBudWxsO1xuXG4gIC8vIFRoZSBsaWJyYXJ5J3Mgb3duIGNvbXBvbmVudHMsIHdoaWNoIG91dGxpdmUgYW55IGRlcGVuZGVuY3kuXG4gIHByaXZhdGUgcmVhZG9ubHkgdW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudCA9IG5ldyBDb21wb25lbnRFeCgpO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2hpbGQgY29tcG9uZW50LlxuICAgKlxuICAgKiBUaGUgY2hpbGQgaXMgYWRkZWQgdG8gdGhlIGludGVybmFsIHdyYXBwZXIgaG9sZGluZyB0aGUgc3ViY2xhc3MncyBvd24gc3VyZmFjZSwgd2hpY2gge0BsaW5rIG9ubG9hZH1cbiAgICogY3JlYXRlcyBhbmQgbG9hZHMgYmVmb3JlIGNhbGxpbmcge0BsaW5rIG9ubG9hZEltcGx9LiBTbyBhIGNoaWxkIGFkZGVkIGR1cmluZyB7QGxpbmsgb25sb2FkSW1wbH0gaXNcbiAgICogbG9hZGVkIGltbWVkaWF0ZWx5LCBjaGlsZHJlbi1maXJzdCwgYW5kIGlzIHVzYWJsZSBieSB0aGUgdGltZSB0aGlzIG1ldGhvZCByZXR1cm5zLlxuICAgKlxuICAgKiBUaGF0IHdyYXBwZXIgaXMgdG9ybiBkb3duIGFuZCByZWJ1aWx0IHdoZW5ldmVyIHRoZSBnYXRlIGNsb3NlcyBhbmQgb3BlbnMgYWdhaW4g4oCUIGEgZGVwZW5kZW5jeSBkZWNsYXJlZFxuICAgKiBieSB7QGxpbmsgZ2V0UGx1Z2luRGVwZW5kZW5jaWVzfSBnb2luZyBhd2F5IGFuZCBjb21pbmcgYmFjaywgb3IgYSBjb25mbGljdCBkZWNsYXJlZCBieVxuICAgKiB7QGxpbmsgZ2V0UGx1Z2luQ29uZmxpY3RzfSBhcHBlYXJpbmcgYW5kIGJlaW5nIHJlc29sdmVkIOKAlCBzbyBhIGNoaWxkIGFkZGVkIGhlcmUgbGl2ZXMgZXhhY3RseSBhcyBsb25nXG4gICAqIGFzIHRoZSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UgZG9lcy4gQWRkaW5nIG9uZSB3aGlsZSB0aGUgc3VyZmFjZSBpcyBkb3duIGlzIHN0aWxsIGxlZ2l0aW1hdGUg4oCUIGl0IGlzXG4gICAqIHF1ZXVlZCBhbmQgbG9hZGVkIHdoZW4gdGhlIHN1cmZhY2UgbmV4dCBjb21lcyB1cCwgdGhlIHdheSB7QGxpbmsgQ29tcG9uZW50RXguYWRkQ2hpbGR9IGFscmVhZHkgcXVldWVzXG4gICAqIGEgY2hpbGQgYWRkZWQgdG8gYSBub3QteWV0LWxvYWRlZCBjb21wb25lbnQuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIFNVQkNMQVNTJ3MgZG9vciwgYW5kIHRoZSBvbmx5IG9uZSBpdCBoYXM6IHRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyB7QGxpbmsgb25sb2FkfSByZWdpc3RlcnNcbiAgICogdGFrZSBhIHByaXZhdGUgcm91dGUgb250byBhIGRpZmZlcmVudCB3cmFwcGVyLiBTbyBhbnl0aGluZyBvYnNlcnZpbmcgdGhpcyBtZXRob2Qg4oCUIGEgdGVzdCBjb3VudGluZyBpdHNcbiAgICogY2FsbHMsIGEgcGF0Y2ggd3JhcHBpbmcgaXQg4oCUIHNlZXMgZXhhY3RseSB0aGUgY2hpbGRyZW4gdGhlIHN1YmNsYXNzIGFkZGVkLCBhbmQgbm9uZSBvZiB0aGUgbGlicmFyeSdzLlxuICAgKiBCZWZvcmUgdGhlIHR3byB0aWVycyBleGlzdGVkIG9uZSBkb29yIGNhcnJpZWQgYm90aCwgYW5kIGEgY29uc3VtZXIgY291bnRpbmcgdGhlIHRvdGFsIGlzIHRoZSBvbmUgdGhpbmdcbiAgICogdGhlIHNwbGl0IGNvdWxkIG5vdCBrZWVwIHdvcmtpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVENvbXBvbmVudCAtIFRoZSB0eXBlIG9mIGNvbXBvbmVudCB0byBhZGQuXG4gICAqIEBwYXJhbSBjb21wb25lbnQgLSBUaGUgY29tcG9uZW50IGluc3RhbmNlIHRvIGFkZC5cbiAgICogQHJldHVybnMgVGhlIGFkZGVkIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhZGRDaGlsZDxUQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50Pihjb21wb25lbnQ6IFRDb21wb25lbnQpOiBUQ29tcG9uZW50IHtcbiAgICByZXR1cm4gdGhpcy5nYXRlZFdyYXBwZXJDb21wb25lbnQuYWRkQ2hpbGQoY29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZXh0ZXJuYWwgc2V0dGluZ3MgY2hhbmdlLlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyBpZiBuZWVkZWQuIE1ha2Ugc3VyZSB0byBjYWxsIGBhd2FpdCBzdXBlci5vbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UoKWAgZmlyc3QuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgb25FeHRlcm5hbFNldHRpbmdzQ2hhbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLm9uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZT8uKCk7XG4gICAgYXdhaXQgdGhpcy50cmlnZ2VyQXN5bmMoJ2V4dGVybmFsU2V0dGluZ3NDaGFuZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGxvYWRlZC5cbiAgICpcbiAgICogT3JjaGVzdHJhdGVzIGxvYWRpbmc6IHJlZ2lzdGVycyB0aGUgdW5pdmVyc2FsIGNvbXBvbmVudHMsIGxldHMgdGhlIHN1YmNsYXNzIHdpcmUgaXRzIG93blxuICAgKiBjb21wb25lbnRzIHZpYSB7QGxpbmsgb25sb2FkSW1wbH0sIHRoZW4gYXdhaXRzIHRoZSBhc3luYyB0YWlsIG9mIGV2ZXJ5IGxvYWQuXG4gICAqIEVhY2ggY29tcG9uZW50IGxvYWRzIGFzIGl0IGlzIGFkZGVkLCBjaGlsZHJlbi1maXJzdC5cbiAgICpcbiAgICogRG8gTk9UIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBPdmVycmlkZSB7QGxpbmsgb25sb2FkSW1wbH0gaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBvbmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRoZSB3cmFwcGVyIGlzIGF0dGFjaGVkIGFuZCBsb2FkZWQgYmVmb3JlIGFueXRoaW5nIGlzIHdpcmVkIHVwLCBzbyBldmVyeSBgYWRkQ2hpbGRgIGJlbG93XG4gICAgICAvLyBsb2FkcyBpdHMgY2hpbGQgc3RyYWlnaHQgYXdheSByYXRoZXIgdGhhbiBxdWV1aW5nIGl0LlxuICAgICAgLy8gVGhhdCBpcyB3aGF0IGxldHMgYSBjb21tYW5kIGhhbmRsZXIgcmVnaXN0ZXIgaXRzIG1lbnUgZXZlbnRzIGZyb20gYG9uUmVnaXN0ZXJlZGAsIHdoaWNoXG4gICAgICAvLyBgcmVnaXN0ZXJDb21tYW5kSGFuZGxlcnNgIGF3YWl0cyBhbmQgd2hpY2ggYSByZWdpc3RyYXIgcmVmdXNlcyB3aGlsZSB1bmxvYWRlZC5cbiAgICAgIC8vIEF0dGFjaGluZyBpdCB1cCBmcm9udCBhbHNvIHJlZ2lzdGVycyB0aGUgd3JhcHBlciBmb3IgdGVhcmRvd24gYmVmb3JlIGFueXRoaW5nIGNhbiB0aHJvdy5cbiAgICAgIC8vIFRoZSBsb2FkIGlzIGV4cGxpY2l0IHJhdGhlciB0aGFuIGxlZnQgdG8gYGFkZENoaWxkYCwgd2hpY2ggbG9hZHMgdGhlIGNoaWxkIG9ubHkgd2hlbiB0aGVcbiAgICAgIC8vIHBsdWdpbiBpdHNlbGYgaXMgbG9hZGVkIOKAlCB0cnVlIHdoZW4gT2JzaWRpYW4gY2FsbHMgYGxvYWQoKWAsIGJ1dCBub3Qgd2hlbiBhIGNhbGxlciBpbnZva2VzXG4gICAgICAvLyBgb25sb2FkKClgIGRpcmVjdGx5LlxuICAgICAgc3VwZXIuYWRkQ2hpbGQodGhpcy51bml2ZXJzYWxXcmFwcGVyQ29tcG9uZW50KTtcbiAgICAgIHRoaXMudW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudC5sb2FkKCk7XG5cbiAgICAgIGF3YWl0IGluaXRJMThOKHRoaXMuY3JlYXRlVHJhbnNsYXRpb25zTWFwKCkpO1xuICAgICAgdGhpcy5wbHVnaW5Db250ZXh0Q29tcG9uZW50ID0gdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChcbiAgICAgICAgbmV3IFBsdWdpbkNvbnRleHRDb21wb25lbnQoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgcGx1Z2luSWQ6IHRoaXMubWFuaWZlc3QuaWRcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQoXG4gICAgICAgIG5ldyBQbHVnaW5Ob3RpY2VDb21wb25lbnQoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgcGx1Z2luTmFtZTogdGhpcy5tYW5pZmVzdC5uYW1lXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5hc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCA9IHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQobmV3IEFzeW5jRXJyb3JIYW5kbGVyQ29tcG9uZW50KHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50KSk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsQ29tcG9uZW50ID0gdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChuZXcgQWJvcnRTaWduYWxDb21wb25lbnQodGhpcy5tYW5pZmVzdC5pZCkpO1xuICAgICAgdGhpcy5jb25zb2xlRGVidWdDb21wb25lbnQgPSB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKG5ldyBDb25zb2xlRGVidWdDb21wb25lbnQodGhpcy5tYW5pZmVzdC5pZCkpO1xuICAgICAgdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnQgPSB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKG5ldyBSZXNvdXJjZUxvY2tDb21wb25lbnQodGhpcy5hcHAsIHRoaXMubWFuaWZlc3QuaWQpKTtcbiAgICAgIC8vIGBOb3RlYm9vayBOYXZpZ2F0b3JgIGRyYXdzIGl0cyBvd24gZmlsZSB0cmVlIGFuZCBuZXZlciByYWlzZXMgT2JzaWRpYW4ncyBgZmlsZS1tZW51YCAvXG4gICAgICAvLyBgZmlsZXMtbWVudWAgZXZlbnRzLCBzbyBldmVyeSBwbHVnaW4ncyBjb250ZXh0LW1lbnUgaXRlbXMgd291bGQgdmFuaXNoIGZvciBhbnlvbmUgYnJvd3NpbmdcbiAgICAgIC8vIHRocm91Z2ggaXQuIFdpcmVkIGhlcmUgcmF0aGVyIHRoYW4gcGVyLXBsdWdpbjogdGhlIGJyaWRnZSBzdGF5cyBkb3JtYW50IHdoZW4gTm90ZWJvb2tcbiAgICAgIC8vIE5hdmlnYXRvciBpcyBub3QgaW5zdGFsbGVkLCBhbmQgYSBwbHVnaW4gd2l0aCBubyBmaWxlL2ZvbGRlciBoYW5kbGVycyBjb250cmlidXRlcyBub3RoaW5nLlxuICAgICAgY29uc3Qgbm90ZWJvb2tOYXZpZ2F0b3JNZW51RXZlbnRSZWdpc3RyYXJDb21wb25lbnQgPSB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKFxuICAgICAgICBuZXcgTm90ZWJvb2tOYXZpZ2F0b3JNZW51RXZlbnRSZWdpc3RyYXJDb21wb25lbnQoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgcGx1Z2luTmFtZTogdGhpcy5tYW5pZmVzdC5uYW1lLFxuICAgICAgICAgIHN1Ym1lbnVJY29uOiB0aGlzLmdldE5vdGVib29rTmF2aWdhdG9yTWVudVN1Ym1lbnVJY29uKClcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLmNvbW1hbmRIYW5kbGVyQ29tcG9uZW50ID0gdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChcbiAgICAgICAgbmV3IENvbW1hbmRIYW5kbGVyQ29tcG9uZW50KHtcbiAgICAgICAgICBhY3RpdmVGaWxlUHJvdmlkZXI6IG5ldyBBcHBBY3RpdmVGaWxlUHJvdmlkZXIodGhpcy5hcHApLFxuICAgICAgICAgIGFkZGl0aW9uYWxNZW51RXZlbnRSZWdpc3RyYXJzOiBbbm90ZWJvb2tOYXZpZ2F0b3JNZW51RXZlbnRSZWdpc3RyYXJDb21wb25lbnRdLFxuICAgICAgICAgIC8vIFRoZSBjb21wb25lbnQgaXMgdW5pdmVyc2FsOyB0aGUgY29tbWFuZHMgcmVnaXN0ZXJlZCBUSFJPVUdIIGl0IGFyZSBub3QuIEEgc3ViY2xhc3MgcmVnaXN0ZXJzXG4gICAgICAgICAgLy8gaXRzIG93biBmcm9tIGBvbmxvYWRJbXBsYCwgY2xvc2luZyBvdmVyIGNvbGxhYm9yYXRvcnMgdGhhdCBiZWxvbmcgdG8gdGhlIGZlYXR1cmUgc3VyZmFjZSDigJQgc29cbiAgICAgICAgICAvLyB0aG9zZSBjb21tYW5kcyBtdXN0IGdvIGRvd24gd2l0aCB0aGUgc3VyZmFjZSB3aGVuIHRoZSBnYXRlIGNsb3Nlcywgb3IgdGhleSBzaXQgaW4gdGhlIHBhbGV0dGVcbiAgICAgICAgICAvLyBjYWxsaW5nIGludG8gdG9ybi1kb3duIG9iamVjdHMsIGFuZCBhcmUgcmVnaXN0ZXJlZCBhIHNlY29uZCB0aW1lIHdoZW4gdGhlIGdhdGUgcmVvcGVucyBhbmRcbiAgICAgICAgICAvLyBgb25sb2FkSW1wbGAgcnVucyBhZ2Fpbi5cbiAgICAgICAgICAvLyBSZXNvbHZlZCBvbiBldmVyeSBjYWxsIHJhdGhlciB0aGFuIGNhcHR1cmVkIGhlcmUsIGJlY2F1c2UgYHVubG9hZEZlYXR1cmVTdXJmYWNlYCBSRVBMQUNFUyB0aGVcbiAgICAgICAgICAvLyB3cmFwcGVyIGluc3RlYWQgb2YgZW1wdHlpbmcgaXQ6IGVhY2ggY3ljbGUncyBjb21tYW5kcyBiZWxvbmcgdG8gdGhhdCBjeWNsZSdzIHdyYXBwZXIuXG4gICAgICAgICAgY29tbWFuZExpZmV0aW1lT3duZXJQcm92aWRlcjogKCk6IENvbXBvbmVudEV4ID0+IHRoaXMuZ2F0ZWRXcmFwcGVyQ29tcG9uZW50LFxuICAgICAgICAgIGNvbW1hbmRSZWdpc3RyYXI6IG5ldyBQbHVnaW5Db21tYW5kUmVnaXN0cmFyKHRoaXMpLFxuICAgICAgICAgIG1lbnVFdmVudFJlZ2lzdHJhcjogdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChuZXcgTWVudUV2ZW50UmVnaXN0cmFyQ29tcG9uZW50KHRoaXMuYXBwKSksXG4gICAgICAgICAgcGx1Z2luTmFtZTogdGhpcy5tYW5pZmVzdC5uYW1lXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgLy8gQWx3YXlzIGF2YWlsYWJsZTsgdGhlIGNvbW1hbmQncyBvd24gYGNhbkV4ZWN1dGVgIGhpZGVzIGl0IHVubGVzcyB0aGUgYWN0aXZlIG5vdGUgaXMgbG9ja2VkLlxuICAgICAgLy8gVGhlIG9uZSBjb21tYW5kIHRoYXQgbmFtZXMgaXRzIG93bmVyIGV4cGxpY2l0bHksIG9wdGluZyBPVVQgb2YgdGhlIHN1cmZhY2Utc2NvcGVkIGRlZmF1bHQgYWJvdmU6XG4gICAgICAvLyBJdCBpcyB0aGUgcmVzY3VlIGZvciBhIG5vdGUgbGVmdCBsb2NrZWQsIGl0IGNsb3NlcyBvdmVyIG5vdGhpbmcgYnV0IHRoZSB1bml2ZXJzYWwgcmVzb3VyY2UtbG9ja1xuICAgICAgLy8gY29tcG9uZW50LCBhbmQgYSBibG9ja2VkIHBsdWdpbiBpcyBleGFjdGx5IHdoZW4gYSB1c2VyIG1heSBuZWVkIGl0LlxuICAgICAgYXdhaXQgdGhpcy5jb21tYW5kSGFuZGxlckNvbXBvbmVudC5yZWdpc3RlckNvbW1hbmRIYW5kbGVycygoKSA9PiBbXG4gICAgICAgIG5ldyBVbmxvY2tBY3RpdmVOb3RlQ29tbWFuZEhhbmRsZXIoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudFxuICAgICAgICB9KVxuICAgICAgXSwgeyBsaWZldGltZU93bmVyOiB0aGlzLmNvbW1hbmRIYW5kbGVyQ29tcG9uZW50IH0pO1xuXG4gICAgICB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50ID0gdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChcbiAgICAgICAgbmV3IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxvYmplY3Q+KHtcbiAgICAgICAgICBkYXRhSGFuZGxlcjogbmV3IFBsdWdpbkRhdGFIYW5kbGVyKHRoaXMpLFxuICAgICAgICAgIHBsdWdpbkV2ZW50U291cmNlOiBuZXcgUGx1Z2luRXZlbnRTb3VyY2VJbXBsKHRoaXMpLFxuICAgICAgICAgIHBsdWdpblNldHRpbmdzQ2xhc3M6IE9iamVjdFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgLy8gVGhlIGdhdGUuIEl0IGxvYWRzIHRoZSBmZWF0dXJlIHN1cmZhY2UgaXRzZWxmIG9uY2UgZXZlcnkgZGVjbGFyZWQgZGVwZW5kZW5jeSBpcyBzYXRpc2ZpZWQgYW5kIG5vXG4gICAgICAvLyBkZWNsYXJlZCBjb25mbGljdCBob2xkcyDigJQgd2hpY2ggZm9yIGEgcGx1Z2luIGRlY2xhcmluZyBuZWl0aGVyIGlzIGltbWVkaWF0ZWx5LCBzeW5jaHJvbm91c2x5LFxuICAgICAgLy8gYmVmb3JlIHRoaXMgbGluZSByZXR1cm5zIOKAlCBhbmQgdW5sb2FkcyBpdCBhZ2FpbiBpZiBhIGRlcGVuZGVuY3kgaXMgbGF0ZXIgZGlzYWJsZWQgb3IgdW5pbnN0YWxsZWQsXG4gICAgICAvLyBvciBhIGNvbmZsaWN0aW5nIHBsdWdpbiBpcyBlbmFibGVkLiBBIHBsdWdpbiB0aGF0IGlzIGJsb2NrZWQgdGhlcmVmb3JlIHJlYWNoZXMgYGxvYWRXaXRoUHJvbWlzZXNgXG4gICAgICAvLyBiZWxvdyBoYXZpbmcgcmVnaXN0ZXJlZCBub3RoaW5nIG9mIGl0cyBvd24sIHdpdGggb25seSB0aGUgdW5pdmVyc2FsIGNvbXBvbmVudHMgYWJvdmUgcnVubmluZyB0b1xuICAgICAgLy8gZXhwbGFpbiB3aHkgYW5kIHRvIG9mZmVyIHRoZSByZXBhaXIuXG4gICAgICAvLyBBc3NpZ25lZCBCRUZPUkUgdGhlIGFkZCwgdW5saWtlIGV2ZXJ5IHVuaXZlcnNhbCBjb21wb25lbnQgYWJvdmUsIGFuZCB0aGF0IG9yZGVyIGlzIHRoZSB3aG9sZVxuICAgICAgLy8gcG9pbnQuIEFkZGluZyB0aGlzIG9uZSBpcyB3aGF0IHJ1bnMgYG9ubG9hZEltcGxgLCBwZXIgdGhlIHBhcmFncmFwaCBhYm92ZSwgc28gdGhlIGFzc2lnbm1lbnRcbiAgICAgIC8vIHN0YXRlbWVudCBoYXMgbm90IHJldHVybmVkIHlldCB3aGlsZSB0aGUgc3ViY2xhc3MgaXMgcnVubmluZyDigJQgYW5kIGEgc2V0dGluZ3MgdGFiIGJ1aWx0IHRoZXJlXG4gICAgICAvLyByZWFkcyBgdGhpcy5wbHVnaW5HYXRlQ29tcG9uZW50YCB0byByZW5kZXIgdGhlIGBXYXJuYCBiYW5uZXIuIEFzc2lnbmluZyBhZnRlciB0aGUgYWRkIHdvdWxkXG4gICAgICAvLyBtYWtlIHRoYXQgcmVhZCB0aHJvdyBgVmFsdWUgaXMgdW5kZWZpbmVkYCBvdXQgb2YgdGhlIGdldHRlciwgd2hpY2ggaXMgYW4gb3BhcXVlIHdheSB0byBzYXlcbiAgICAgIC8vIFwidG9vIGVhcmx5XCIuIE5vdGhpbmcgYWJvdXQgY2hpbGQtYWRkIG9yZGVyIG1vdmVzOiB0aGUgc2VxdWVuY2Ugb2YgYGFkZFVuaXZlcnNhbENoaWxkYCBjYWxscyBpc1xuICAgICAgLy8gdW5jaGFuZ2VkLCBhbmQgYHNldENvbXBvbmVudGAgaXMgYSBwbGFpbiBzdG9yZS5cbiAgICAgIGNvbnN0IHBsdWdpbkdhdGVDb21wb25lbnQgPSBuZXcgUGx1Z2luR2F0ZUNvbXBvbmVudCh7XG4gICAgICAgIGNvbmZsaWN0czogdGhpcy5nZXRQbHVnaW5Db25mbGljdHMoKSxcbiAgICAgICAgZGVwZW5kZW5jaWVzOiB0aGlzLmdldFBsdWdpbkRlcGVuZGVuY2llcygpLFxuICAgICAgICBsb2FkRmVhdHVyZVN1cmZhY2U6ICgpOiBQcm9taXNlPHZvaWQ+ID0+IHRoaXMubG9hZEZlYXR1cmVTdXJmYWNlKCksXG4gICAgICAgIHBsdWdpbjogdGhpcyxcbiAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgdW5sb2FkRmVhdHVyZVN1cmZhY2U6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICB0aGlzLnVubG9hZEZlYXR1cmVTdXJmYWNlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5wbHVnaW5HYXRlQ29tcG9uZW50ID0gcGx1Z2luR2F0ZUNvbXBvbmVudDtcbiAgICAgIHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQocGx1Z2luR2F0ZUNvbXBvbmVudCk7XG5cbiAgICAgIC8vIEV2ZXJ5IGNoaWxkIGhhcyBhbHJlYWR5IGxvYWRlZCBhcyBpdCB3YXMgYWRkZWQ7IHRoaXMgYXdhaXRzIHRoZWlyIGFjY3VtdWxhdGVkIGFzeW5jIHRhaWxzIGFuZFxuICAgICAgLy8gcmVwb3J0cyBhbnkgZmFpbHVyZSBhcyBhIHNpbmdsZSBgQWdncmVnYXRlRXJyb3JgLlxuICAgICAgYXdhaXQgdGhpcy51bml2ZXJzYWxXcmFwcGVyQ29tcG9uZW50LmxvYWRXaXRoUHJvbWlzZXMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcHJpbnRFcnJvcihuZXcgRXJyb3IoYEVycm9yIGxvYWRpbmcgcGx1Z2luICR7dGhpcy5tYW5pZmVzdC5uYW1lfSAoJHt0aGlzLm1hbmlmZXN0LmlkfSlgLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyB1bmxvYWRlZC5cbiAgICpcbiAgICogQW5ub3VuY2VzIHRoZSBkZXBhcnR1cmUgb24gYGFwcC53b3Jrc3BhY2VgIHNvIGFueXRoaW5nIGRlcGVuZGluZyBvbiB0aGlzIHBsdWdpbiBsZWFybnMgb2YgaXQgYXQgdGhlXG4gICAqIG1vbWVudCBpdCBoYXBwZW5zLCByYXRoZXIgdGhhbiBkaXNjb3ZlcmluZyBpdCBsYXRlciB0aHJvdWdoIGJlaGF2aW9yIHRoYXQgcXVpZXRseSBzdG9wcGVkLlxuICAgKlxuICAgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2Q7IHB1dCB0ZWFyZG93biBvbiBhIGNvbXBvbmVudCBpbnN0ZWFkLCB3aGljaCB1bmxvYWRzIHdpdGggdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbnVubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLmJyb2FkY2FzdFVubG9hZGVkKCk7XG4gICAgc3VwZXIub251bmxvYWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2hpbGQgY29tcG9uZW50LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRDb21wb25lbnQgLSBUaGUgdHlwZSBvZiBjb21wb25lbnQgdG8gcmVtb3ZlLlxuICAgKiBAcGFyYW0gY29tcG9uZW50IC0gVGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIFRoZSByZW1vdmVkIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSByZW1vdmVDaGlsZDxUQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50Pihjb21wb25lbnQ6IFRDb21wb25lbnQpOiBUQ29tcG9uZW50IHtcbiAgICAvLyBSb3V0ZWQgYnkgb3duZXJzaGlwIHJhdGhlciB0aGFuIGJ5IHdoaWNoIHRpZXIgYGFkZENoaWxkYCB3b3VsZCBoYXZlIGNob3NlbiwgYmVjYXVzZSB0aGUgdHdvIGRvIG5vdFxuICAgIC8vIGFsd2F5cyBhZ3JlZTogYSB1bml2ZXJzYWwgY29tcG9uZW50IGlzIHBhcmVudGVkIGRpcmVjdGx5IG9uIHRoZSB1bml2ZXJzYWwgd3JhcHBlciwgeWV0IGEgc3ViY2xhc3NcbiAgICAvLyByZXBsYWNpbmcgb25lIGdvZXMgdGhyb3VnaCB0aGUgc2FtZSBwdWJsaWMgYHJlbW92ZUNoaWxkYCBhcyBpdCB3b3VsZCBmb3IgaXRzIG93biBjaGlsZHJlbi5cbiAgICByZXR1cm4gdGhpcy5nYXRlZFdyYXBwZXJDb21wb25lbnQuaGFzQ2hpbGQoY29tcG9uZW50KSA/IHRoaXMuZ2F0ZWRXcmFwcGVyQ29tcG9uZW50LnJlbW92ZUNoaWxkKGNvbXBvbmVudCkgOiB0aGlzLnVuaXZlcnNhbFdyYXBwZXJDb21wb25lbnQucmVtb3ZlQ2hpbGQoY29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyB0aGUgdHJhbnNsYXRpb25zIG1hcCB1c2VkIHRvIGluaXRpYWxpemUgaTE4biBkdXJpbmcge0BsaW5rIG9ubG9hZH0uXG4gICAqXG4gICAqIE92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIHN1cHBseSBwbHVnaW4tc3BlY2lmaWMgdHJhbnNsYXRpb25zLiBUaGUgZGVmYXVsdCByZXR1cm5zIHRoZSBidWlsdC1pblxuICAgKiBgQG1uYW91bW92L29ic2lkaWFuLWxpYmAgdHJhbnNsYXRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdHJhbnNsYXRpb25zIG1hcC5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVUcmFuc2xhdGlvbnNNYXAoKTogVHJhbnNsYXRpb25zTWFwIHtcbiAgICByZXR1cm4gZGVmYXVsdFRyYW5zbGF0aW9uc01hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyB0aGUgaWNvbiBzaG93biBvbiB0aGUgcGx1Z2luJ3MgcGFyZW50IGVudHJ5IGluIGBOb3RlYm9vayBOYXZpZ2F0b3JgJ3MgY29udGV4dCBtZW51cy5cbiAgICpcbiAgICogT3ZlcnJpZGUgaW4gc3ViY2xhc3MgdG8gYnJhbmQgdGhhdCBlbnRyeTsgdGhlIGRlZmF1bHQgbGVhdmVzIGl0IHdpdGhvdXQgYW4gaWNvbi4gVGhlIGVudHJ5IGlzXG4gICAqIHRpdGxlZCB3aXRoIHRoZSBwbHVnaW4gbmFtZSBhbmQgaXMgYWRkZWQgYXV0b21hdGljYWxseSDigJQgc2VlXG4gICAqIHtAbGluayBOb3RlYm9va05hdmlnYXRvck1lbnVFdmVudFJlZ2lzdHJhckNvbXBvbmVudH0uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBpY29uLCBvciBgJydgIGZvciBubyBpY29uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldE5vdGVib29rTmF2aWdhdG9yTWVudVN1Ym1lbnVJY29uKCk6IEljb25OYW1lIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgdGhlIEFQSXMgdGhpcyBwbHVnaW4gZXhwb3NlcyB0byBvdGhlciBwbHVnaW5zLlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBwdWJsaXNoIG9uZS4gVGhlIGRlZmF1bHQgcHVibGlzaGVzIG5vbmUuIENhbGxlZCBhZnRlciB7QGxpbmsgb25sb2FkSW1wbH0sIHNvIGFcbiAgICogZGVjbGFyYXRpb24gbWF5IHJlZmVyZW5jZSBhbnl0aGluZyBpdCBjcmVhdGVkOyB0aGUgcmV0dXJuZWQgZGVjbGFyYXRpb25zIGFyZSBwdWJsaXNoZWQgdGhyb3VnaFxuICAgKiBgcHVibGlzaFBsdWdpbkFwaWAgYW5kIHJldm9rZWQgd2hlbiB0aGUgcGx1Z2luJ3MgZmVhdHVyZSBzdXJmYWNlIHVubG9hZHMuXG4gICAqXG4gICAqIFJldHVybmluZyBhIExJU1QgcmF0aGVyIHRoYW4gYSBzaW5nbGUgQVBJIGlzIGRlbGliZXJhdGU6IHRoZSByZWdpc3RyeSBzdXBwb3J0cyBzZXZlcmFsIGNvbnRyYWN0XG4gICAqIHZlcnNpb25zIHB1Ymxpc2hlZCBzaWRlIGJ5IHNpZGUsIHdoaWNoIGlzIGhvdyBhIHByb3ZpZGVyIHNoaXBzIGEgYnJlYWtpbmcgYDIuMC4wYCB3aXRob3V0IHN0cmFuZGluZ1xuICAgKiBjb25zdW1lcnMgc3RpbGwgcGlubmVkIHRvIGBeMWAuXG4gICAqXG4gICAqIEV2ZXJ5IGRlY2xhcmF0aW9uIGhlcmUgaXMgcHVibGlzaGVkIEJFRk9SRSB0aGUgYG9ic2lkaWFuLWRldi11dGlsczpwbHVnaW4tbG9hZGVkYCBicm9hZGNhc3QsIHdoaWNoIGlzXG4gICAqIHdoYXQgbGV0cyBhIGxpc3RlbmVyIGNhbGwgdGhlc2UgQVBJcyB0aGUgbW9tZW50IGl0IGhlYXJzIHRoYXQgZXZlbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBBUEkgZGVjbGFyYXRpb25zLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFBsdWdpbkFwaXMoKTogUGx1Z2luQXBpRGVjbGFyYXRpb25bXSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIHRoZSBwbHVnaW5zIHRoaXMgb25lIHJlZnVzZXMsIG9yIHdhcm5zIGFib3V0LCBydW5uaW5nIGJlc2lkZS5cbiAgICpcbiAgICogT3ZlcnJpZGUgaW4gc3ViY2xhc3MgdG8gZGVjbGFyZSBhbiBvdmVybGFwLiBUaGUgZGVmYXVsdCBkZWNsYXJlcyBub25lLlxuICAgKlxuICAgKiBBIGBCbG9ja2AgY29uZmxpY3QgaXMgdGhlIG1pcnJvciBpbWFnZSBvZiBhIGRlcGVuZGVuY3k6IHdoaWxlIGEgY29uZmxpY3RpbmcgcGx1Z2luIGlzIGVuYWJsZWQgYXQgYVxuICAgKiBjb25mbGljdGluZyB2ZXJzaW9uLCB7QGxpbmsgb25sb2FkSW1wbH0gZG9lcyBub3QgcnVuIGF0IGFsbCBhbmQgdGhlIHBsdWdpbiByZWdpc3RlcnMgbm90aGluZy4gRGVjbGFyZVxuICAgKiBpdCB3aGVuIGJvdGggcGx1Z2lucyBhY3Rpbmcgb24gdGhlIHNhbWUgb3BlcmF0aW9uIGRhbWFnZXMgdGhlIHZhdWx0IOKAlCB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gd2luXG4gICAqIHRoYXQgcmFjZSwgYmVjYXVzZSB3aGljaGV2ZXIgcGx1Z2luIGxvYWRlZCBmaXJzdCBrZWVwcyBhIGhhbmQgb24gdGhlIHdoZWVsLCBzbyByZWZ1c2luZyBkZXRlcm1pbmlzdGljYWxseVxuICAgKiBiZWF0cyBjb21wZXRpbmcgdW5wcmVkaWN0YWJseS4gQSBgV2FybmAgY29uZmxpY3QgZGVjbGFyZXMgYW4gb3ZlcmxhcCB0aGF0IGlzIG1lcmVseSBhbm5veWluZywgc3VjaCBhcyBhXG4gICAqIGR1cGxpY2F0ZWQgY29tbWFuZDogYm90aCBwbHVnaW5zIGtlZXAgcnVubmluZyBhbmQgdGhlIHVzZXIgaXMgdG9sZC5cbiAgICpcbiAgICogVW5saWtlIGEgZGVwZW5kZW5jeSwgYSBjb25mbGljdGluZyBwbHVnaW4gbmVlZCBub3QgcHVibGlzaCBhbnl0aGluZyDigJQgaXQgaXMgZGV0ZWN0ZWQgYnkgcmVhZGluZyBpdHNcbiAgICogaW5zdGFsbGVkIHZlcnNpb24sIHdoaWNoIGlzIHRoZSBvbmx5IHRoaW5nIGFib3V0IGFub3RoZXIgcGx1Z2luIHRoYXQgcmVhZHMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiBsb2FkXG4gICAqIG9yZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZGVjbGFyZWQgY29uZmxpY3RzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFBsdWdpbkNvbmZsaWN0cygpOiBQbHVnaW5Db25mbGljdFtdIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgdGhlIHBsdWdpbnMgdGhpcyBvbmUgY2Fubm90IHdvcmsgd2l0aG91dC5cbiAgICpcbiAgICogT3ZlcnJpZGUgaW4gc3ViY2xhc3MgdG8gZGVjbGFyZSBhIG1hbmRhdG9yeSBkZXBlbmRlbmN5LiBUaGUgZGVmYXVsdCBkZWNsYXJlcyBub25lLCBhbmQgc3VjaCBhIHBsdWdpblxuICAgKiBsb2FkcyBleGFjdGx5IGFzIGl0IGFsd2F5cyBoYXMuXG4gICAqXG4gICAqIEEgZGVjbGFyZWQgZGVwZW5kZW5jeSBpcyBNQU5EQVRPUlksIHVubGlrZSB0aGUgb2ZmZXIgYFBsdWdpblN1Z2dlc3Rpb25Db21wb25lbnRgIG1ha2VzOiB3aGlsZSBvbmUgaXNcbiAgICogbWlzc2luZywgZGlzYWJsZWQsIG9yIHRvbyBvbGQsIHtAbGluayBvbmxvYWRJbXBsfSBkb2VzIG5vdCBydW4gYXQgYWxsIGFuZCB0aGUgcGx1Z2luIHJlZ2lzdGVycyBub3RoaW5nXG4gICAqIOKAlCBubyBjb21tYW5kcywgbm8gaGFuZGxlcnMsIG5vIHBhdGNoZXMuIEl0IHN0YXlzIGVuYWJsZWQgaW4gT2JzaWRpYW4ncyBsaXN0IHJhdGhlciB0aGFuIGRpc2FibGluZ1xuICAgKiBpdHNlbGYsIGJlY2F1c2UgdGhlIGVuYWJsZWQgc2V0IGlzIHRoZSB1c2VyJ3MgdG8gY2hhbmdlLCBhbmQgaXQgZXhwbGFpbnMgaXRzZWxmIHRocm91Z2ggYSBub3RpY2UgYW5kIGFcbiAgICogc2V0dGluZ3MgYmFubmVyIHRoYXQgaW5zdGFsbHMgdGhlIG1pc3NpbmcgcGx1Z2luIGluIG9uZSBjbGljay4gVGhlIGxvYWQgY29tcGxldGVzIHRoZSBtb21lbnQgdGhlXG4gICAqIGRlcGVuZGVuY3kgYXJyaXZlcywgd2l0aCBubyByZXN0YXJ0LlxuICAgKlxuICAgKiBBIGRlcGVuZGVuY3kgbXVzdCBwdWJsaXNoIGFuIEFQSSB0aHJvdWdoIGBwdWJsaXNoUGx1Z2luQXBpYCwgd2hpY2ggaXMgd2hhdCBtYWtlcyBpdHMgcHJlc2VuY2UsXG4gICAqIGFic2VuY2UsIHZlcnNpb24gYW5kIGRlcGFydHVyZSBhbGwgb2JzZXJ2YWJsZSB0aHJvdWdoIG9uZSBtZWNoYW5pc20uIEEgcGx1Z2luIHdpdGggbm90aGluZyB0byBleHBvc2VcbiAgICogY2FuIHB1Ymxpc2ggYW4gZW1wdHkgQVBJIHB1cmVseSBzbyBpdCBjYW4gYmUgZGVwZW5kZWQgdXBvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGRlY2xhcmVkIGRlcGVuZGVuY2llcy5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRQbHVnaW5EZXBlbmRlbmNpZXMoKTogUGx1Z2luRGVwZW5kZW5jeVtdIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGR1cmluZyB7QGxpbmsgb25sb2FkfSB0byB3aXJlIHBsdWdpbi1zcGVjaWZpYyBjaGlsZCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBhZGQgY2hpbGQgY29tcG9uZW50cyB2aWEge0BsaW5rIGFkZENoaWxkfS4gVGhlIHVuaXZlcnNhbCBjb21wb25lbnRzIGFyZVxuICAgKiBhdmFpbGFibGUgaGVyZS4gQ2hpbGRyZW4gYXJlIGxvYWRlZCBzZXF1ZW50aWFsbHkgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGFkZGVkIChjaGlsZHJlbi1maXJzdCkuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc3ViY2xhc3MgbG9hZCBsb2dpYyBpcyBjb21wbGV0ZS5cbiAgICovXG4gIHByb3RlY3RlZCBvbmxvYWRJbXBsKCk6IFByb21pc2FibGU8dm9pZD4ge1xuICAgIHJldHVybiBub29wQXN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZXMgYSB1bml2ZXJzYWwgY29tcG9uZW50LCB1bmxvYWRpbmcgd2hpY2hldmVyIGNvbXBvbmVudCB0aGUga2V5IGhlbGQgYmVmb3JlLlxuICAgKlxuICAgKiBLZXllZCBieSBuYW1lIHJhdGhlciB0aGFuIGhhbmRlZCB0aGUgcHJldmlvdXMgdmFsdWUgYmVjYXVzZSBga2V5b2YgdGhpc2AgZXhjbHVkZXMgcHJpdmF0ZVxuICAgKiBtZW1iZXJzLCBzbyB0aGUgY29tcG9uZW50cyBsaXZlIGluIGEgc2luZ2xlIHtAbGluayBQbHVnaW5CYXNlQ29tcG9uZW50c30gYmFnIHdob3NlIGtleXMgQVJFXG4gICAqIGluZGV4YWJsZS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUS2V5IC0gVGhlIGtleSBvZiB0aGUgY29tcG9uZW50IHRvIHN0b3JlLlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIGtleSBvZiB0aGUgY29tcG9uZW50IHRvIHN0b3JlLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgY29tcG9uZW50IHRvIHN0b3JlLlxuICAgKi9cbiAgLyoqXG4gICAqIEFkZHMgYSBjb21wb25lbnQgdG8gdGhlIHVuaXZlcnNhbCB0aWVyLCB3aGljaCBvdXRsaXZlcyBhbnkgZGVwZW5kZW5jeS5cbiAgICpcbiAgICogUHJpdmF0ZSBvbiBwdXJwb3NlOiBvbmx5IHRoaXMgY2xhc3MgZGVjaWRlcyB3aGF0IGlzIHVuaXZlcnNhbC4gQSBzdWJjbGFzcyBhZGRpbmcgb25lIG9mIGl0cyBvd24gZ29lc1xuICAgKiB0aHJvdWdoIHtAbGluayBhZGRDaGlsZH0gYW5kIGxhbmRzIGluIHRoZSBnYXRlZCB0aWVyLCB3aGVyZSBpdCBiZWxvbmdzLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRDb21wb25lbnQgLSBUaGUgdHlwZSBvZiBjb21wb25lbnQgdG8gYWRkLlxuICAgKiBAcGFyYW0gY29tcG9uZW50IC0gVGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0byBhZGQuXG4gICAqIEByZXR1cm5zIFRoZSBhZGRlZCBjb21wb25lbnQuXG4gICAqL1xuICBwcml2YXRlIGFkZFVuaXZlcnNhbENoaWxkPFRDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQ+KGNvbXBvbmVudDogVENvbXBvbmVudCk6IFRDb21wb25lbnQge1xuICAgIHJldHVybiB0aGlzLnVuaXZlcnNhbFdyYXBwZXJDb21wb25lbnQuYWRkQ2hpbGQoY29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbm5vdW5jZXMgb24gYGFwcC53b3Jrc3BhY2VgIHRoYXQgdGhpcyBwbHVnaW4gaXMgbG9hZGVkIGFuZCBpdHMgQVBJcyBhcmUgY2FsbGFibGUuXG4gICAqL1xuICBwcml2YXRlIGJyb2FkY2FzdExvYWRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmxpZmVjeWNsZUV2ZW50UGF5bG9hZCA9IHtcbiAgICAgIGFwaVZlcnNpb25zOiB0aGlzLmdldFBsdWdpbkFwaXMoKS5tYXAoKGRlY2xhcmF0aW9uKSA9PiBkZWNsYXJhdGlvbi5hcGlWZXJzaW9uKSxcbiAgICAgIGRlcGVuZGVuY3lQbHVnaW5JZHM6IHRoaXMuZ2V0UGx1Z2luRGVwZW5kZW5jaWVzKCkubWFwKChkZXBlbmRlbmN5KSA9PiBkZXBlbmRlbmN5LnBsdWdpbklkKSxcbiAgICAgIHBsdWdpbklkOiB0aGlzLm1hbmlmZXN0LmlkLFxuICAgICAgcGx1Z2luTmFtZTogdGhpcy5tYW5pZmVzdC5uYW1lLFxuICAgICAgcGx1Z2luVmVyc2lvbjogdGhpcy5tYW5pZmVzdC52ZXJzaW9uXG4gICAgfTtcblxuICAgIHRyaWdnZXJQbHVnaW5MaWZlY3ljbGVFdmVudCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgbmFtZTogUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FLFxuICAgICAgcGF5bG9hZDogdGhpcy5saWZlY3ljbGVFdmVudFBheWxvYWRcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbm5vdW5jZXMgb24gYGFwcC53b3Jrc3BhY2VgIHRoYXQgdGhpcyBwbHVnaW4ncyBzdXJmYWNlIGhhcyBnb25lIGF3YXkuXG4gICAqXG4gICAqIFNpbGVudCB1bmxlc3MgYSBsb2FkZWQgYnJvYWRjYXN0IGlzIG91dHN0YW5kaW5nLCBzbyB0aGUgdHdvIGV2ZW50cyBzdGF5IHBhaXJlZDogYSBwbHVnaW4gdGhhdCBuZXZlclxuICAgKiBnb3QgcGFzdCBpdHMgZGVwZW5kZW5jeSBnYXRlIG5ldmVyIGFubm91bmNlZCBpdHNlbGYsIGFuZCBtdXN0IG5vdCBhbm5vdW5jZSBhIGRlcGFydHVyZSBlaXRoZXIuXG4gICAqL1xuICBwcml2YXRlIGJyb2FkY2FzdFVubG9hZGVkKCk6IHZvaWQge1xuICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmxpZmVjeWNsZUV2ZW50UGF5bG9hZDtcbiAgICBpZiAoIXBheWxvYWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxpZmVjeWNsZUV2ZW50UGF5bG9hZCA9IG51bGw7XG4gICAgdHJpZ2dlclBsdWdpbkxpZmVjeWNsZUV2ZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBuYW1lOiBQTFVHSU5fVU5MT0FERURfRVZFTlRfTkFNRSxcbiAgICAgIHBheWxvYWRcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIGxvYWRzIHRoZSBzdWJjbGFzcydzIGZlYXR1cmUgc3VyZmFjZSwgdGhlbiBwdWJsaXNoZXMgaXRzIEFQSXMgYW5kIGFubm91bmNlcyBpdHNlbGYuXG4gICAqXG4gICAqIE5PVCBpZGVtcG90ZW50LCBkZWxpYmVyYXRlbHkuIGBQbHVnaW5HYXRlQ29tcG9uZW50YCBvd25zIHRoZSB1cC9kb3duIHN0YXRlIG1hY2hpbmUgYW5kIGNhbGxzXG4gICAqIHRoaXMgb25seSBvbiBhIHJlYWwgdHJhbnNpdGlvbjsgYSBzZWNvbmQgZ3VhcmQgaGVyZSB3b3VsZCBiZSBhIHNlY29uZCBjb3B5IG9mIHRoYXQgc3RhdGUsIHdoaWNoIGlzIHRoZVxuICAgKiBraW5kIG9mIGR1cGxpY2F0ZSB0aGF0IGRyaWZ0cy5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBzdXJmYWNlIGlzIGxvYWRlZCBhbmQgdGhlIGJyb2FkY2FzdCBoYXMgYmVlbiBtYWRlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkRmVhdHVyZVN1cmZhY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTG9hZGVkIGV4cGxpY2l0bHkgZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGUgdW5pdmVyc2FsIHdyYXBwZXIgaXM6IGBhZGRDaGlsZGAgbG9hZHMgYSBjaGlsZCBvbmx5IG9uY2VcbiAgICAvLyBpdHMgcGFyZW50IGlzIGxvYWRlZCwgYW5kIHRoZSBzdXJmYWNlIGhhcyB0byBiZSBsaXZlIGJlZm9yZSBgb25sb2FkSW1wbGAgc3RhcnRzIGFkZGluZyB0byBpdC5cbiAgICBjb25zdCBnYXRlZFdyYXBwZXJDb21wb25lbnQgPSB0aGlzLmdhdGVkV3JhcHBlckNvbXBvbmVudDtcbiAgICB0aGlzLnVuaXZlcnNhbFdyYXBwZXJDb21wb25lbnQuYWRkQ2hpbGQoZ2F0ZWRXcmFwcGVyQ29tcG9uZW50KTtcbiAgICBnYXRlZFdyYXBwZXJDb21wb25lbnQubG9hZCgpO1xuXG4gICAgYXdhaXQgdGhpcy5vbmxvYWRJbXBsKCk7XG4gICAgYXdhaXQgZ2F0ZWRXcmFwcGVyQ29tcG9uZW50LmxvYWRXaXRoUHJvbWlzZXMoKTtcblxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgdGhpcy5nZXRQbHVnaW5BcGlzKCkpIHtcbiAgICAgIHB1Ymxpc2hQbHVnaW5BcGkoe1xuICAgICAgICAuLi5kZWNsYXJhdGlvbixcbiAgICAgICAgLy8gUmV2b2tlZCB3aXRoIHRoZSBTVVJGQUNFLCBub3Qgd2l0aCB0aGUgcGx1Z2luOiBhIHBsdWdpbiB3aG9zZSBkZXBlbmRlbmN5IGdvZXMgYXdheSBrZWVwcyBydW5uaW5nXG4gICAgICAgIC8vIGl0cyB1bml2ZXJzYWwgY29tcG9uZW50cywgYW5kIGEgY29uc3VtZXIgbXVzdCBub3QgYmUgbGVmdCBob2xkaW5nIGEgaGFuZGxlIGludG8gdGhlIGhhbGYgb2YgaXRcbiAgICAgICAgLy8gdGhhdCB3YXMganVzdCB0b3JuIGRvd24uXG4gICAgICAgIGNvbXBvbmVudDogZ2F0ZWRXcmFwcGVyQ29tcG9uZW50LFxuICAgICAgICBwbHVnaW46IHRoaXNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuYnJvYWRjYXN0TG9hZGVkKCk7XG4gIH1cblxuICBwcml2YXRlIHNldENvbXBvbmVudDxUS2V5IGV4dGVuZHMga2V5b2YgUGx1Z2luQmFzZUNvbXBvbmVudHM+KGtleTogVEtleSwgdmFsdWU6IE5vbk51bGxhYmxlPFBsdWdpbkJhc2VDb21wb25lbnRzW1RLZXldPik6IHZvaWQge1xuICAgIGNvbnN0IG9sZENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1trZXldO1xuICAgIGlmIChvbGRDb21wb25lbnQpIHtcbiAgICAgIHRoaXMucmVtb3ZlQ2hpbGQob2xkQ29tcG9uZW50KTtcbiAgICB9XG4gICAgdGhpcy5jb21wb25lbnRzW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZWFycyB0aGUgc3ViY2xhc3MncyBmZWF0dXJlIHN1cmZhY2UgZG93biwgbGVhdmluZyB0aGUgdW5pdmVyc2FsIGNvbXBvbmVudHMgcnVubmluZy5cbiAgICovXG4gIHByaXZhdGUgdW5sb2FkRmVhdHVyZVN1cmZhY2UoKTogdm9pZCB7XG4gICAgY29uc3QgZ2F0ZWRXcmFwcGVyQ29tcG9uZW50ID0gdGhpcy5nYXRlZFdyYXBwZXJDb21wb25lbnQ7XG5cbiAgICAvLyBSZXBsYWNlZCBCRUZPUkUgdGhlIG9sZCBvbmUgaXMgdW5sb2FkZWQsIHNvIGFueXRoaW5nIHRoYXQgcmVzdW1lcyBtaWQtdGVhcmRvd24gYW5kIGNhbGxzIGBhZGRDaGlsZGBcbiAgICAvLyBwYXJrcyBpdHMgY2hpbGQgb24gdGhlIGZyZXNoIHN1cmZhY2UgcmF0aGVyIHRoYW4gb24gdGhlIG9uZSBiZWluZyB0b3JuIGRvd24g4oCUIHdoZXJlIGBDb21wb25lbnRFeGBcbiAgICAvLyB3b3VsZCByZWZ1c2UgaXQgb3V0cmlnaHQsIHNpbmNlIGl0IHJlZnVzZXMgY2hpbGRyZW4gYWRkZWQgdG8gYW4gYWxyZWFkeS11bmxvYWRlZCBjb21wb25lbnQuXG4gICAgdGhpcy5nYXRlZFdyYXBwZXJDb21wb25lbnQgPSBuZXcgQ29tcG9uZW50RXgoKTtcbiAgICB0aGlzLnVuaXZlcnNhbFdyYXBwZXJDb21wb25lbnQucmVtb3ZlQ2hpbGQoZ2F0ZWRXcmFwcGVyQ29tcG9uZW50KTtcblxuICAgIHRoaXMuYnJvYWRjYXN0VW5sb2FkZWQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbG9hZHMgdGhlIHNwZWNpZmllZCBwbHVnaW4gYnkgZGlzYWJsaW5nIGFuZCB0aGVuIHJlLWVuYWJsaW5nIGl0LlxuICpcbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHRvIHJlbG9hZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcGx1Z2luIGlzIHJlbG9hZGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVsb2FkUGx1Z2luKHBsdWdpbjogUGx1Z2luKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBsdWdpbnMgPSBwbHVnaW4uYXBwLnBsdWdpbnM7XG4gIGNvbnN0IHBsdWdpbklkID0gcGx1Z2luLm1hbmlmZXN0LmlkO1xuICBhd2FpdCBwbHVnaW5zLmRpc2FibGVQbHVnaW4ocGx1Z2luSWQpO1xuICBhd2FpdCBwbHVnaW5zLmVuYWJsZVBsdWdpbihwbHVnaW5JZCk7XG59XG5cbi8qKlxuICogRGlzcGxheXMgYW4gZXJyb3IgbWVzc2FnZSBhcyBhIG5vdGljZSwgbG9ncyBpdCB0byB0aGUgY29uc29sZSwgYW5kIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgcGx1Z2luLlxuICpcbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHRvIGRpc2FibGUuXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgYW5kIGxvZy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcGx1Z2luIGlzIGRpc2FibGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2hvd0Vycm9yQW5kRGlzYWJsZVBsdWdpbihwbHVnaW46IFBsdWdpbiwgbWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBsdWdpbk5vdGljZUNvbXBvbmVudCA9IG5ldyBQbHVnaW5Ob3RpY2VDb21wb25lbnQoe1xuICAgIGFwcDogcGx1Z2luLmFwcCxcbiAgICBwbHVnaW5OYW1lOiBwbHVnaW4ubWFuaWZlc3QubmFtZVxuICB9KTtcbiAgcGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UobWVzc2FnZSk7XG4gIHByaW50RXJyb3IobmV3IEVycm9yKG1lc3NhZ2UpKTtcbiAgYXdhaXQgcGx1Z2luLmFwcC5wbHVnaW5zLmRpc2FibGVQbHVnaW4ocGx1Z2luLm1hbmlmZXN0LmlkKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjQSxTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLGtCQUFrQjtBQUMzQixTQUFTLGlCQUFpQjtBQUMxQixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGNBQWM7QUFjdkIsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUywrQkFBK0I7QUFDeEMsU0FBUyxzQ0FBc0M7QUFDL0MsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyw0QkFBNEI7QUFDckMsU0FBUyxrQ0FBa0M7QUFDM0MsU0FB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
|