@mnaoumov/obsidian-lib 10.8.0 → 10.10.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/README.md +4 -0
- package/codemirror/editor-mode-extension/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +42 -1
- package/dist/lib/cjs/__merged.d.cts +7 -2
- package/dist/lib/cjs/code-block-render-handoff.cjs +2 -5
- package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +180 -0
- package/dist/lib/cjs/codemirror/editor-mode-extension.d.cts +50 -0
- package/dist/lib/cjs/codemirror/index.cjs +4 -1
- package/dist/lib/cjs/codemirror/index.d.cts +1 -0
- package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +4 -7
- package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +2 -2
- package/dist/lib/cjs/community-plugins.cjs +2 -2
- package/dist/lib/cjs/components/all-windows-event-component.cjs +86 -14
- package/dist/lib/cjs/components/all-windows-event-component.d.cts +54 -3
- package/dist/lib/cjs/components/monkey-around-component.cjs +1 -1
- package/dist/lib/cjs/components/plugin-notice-component.cjs +2 -6
- package/dist/lib/cjs/components/plugin-settings-component.cjs +4 -3
- package/dist/lib/cjs/components/plugin-settings-component.d.cts +2 -1
- package/dist/lib/cjs/components/style-sheet-component.cjs +1 -4
- package/dist/lib/cjs/css-class.cjs +7 -1
- package/dist/lib/cjs/css-class.d.cts +24 -0
- package/dist/lib/cjs/data-stores/shared-data-store.cjs +15 -4
- package/dist/lib/cjs/desktop-bulk-operation-git.cjs +5 -5
- package/dist/lib/cjs/folder-note.cjs +5 -5
- package/dist/lib/cjs/formula-function.cjs +152 -0
- package/dist/lib/cjs/formula-function.d.cts +98 -0
- package/dist/lib/cjs/frontmatter-formatting.cjs +2 -2
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/i18n/i18n.cjs +38 -10
- package/dist/lib/cjs/i18n/i18n.d.cts +29 -2
- package/dist/lib/cjs/i18n/locales/en.cjs +13 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +12 -0
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +12 -0
- package/dist/lib/cjs/index.cjs +7 -1
- package/dist/lib/cjs/index.d.cts +2 -0
- package/dist/lib/cjs/link.cjs +12 -12
- package/dist/lib/cjs/markdown.cjs +7 -7
- package/dist/lib/cjs/modals/code-block-builder.cjs +486 -0
- package/dist/lib/cjs/modals/code-block-builder.d.cts +321 -0
- package/dist/lib/cjs/modals/index.cjs +4 -1
- package/dist/lib/cjs/modals/index.d.cts +1 -0
- package/dist/lib/cjs/plugin/index.cjs +4 -1
- package/dist/lib/cjs/plugin/index.d.cts +1 -0
- package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +189 -0
- package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +111 -0
- package/dist/lib/cjs/plugin/plugin.cjs +47 -2
- package/dist/lib/cjs/plugin/plugin.d.cts +25 -1
- package/dist/lib/cjs/vault.cjs +2 -2
- package/dist/lib/cjs/virtual-file.cjs +340 -0
- package/dist/lib/cjs/virtual-file.d.cts +48 -0
- package/dist/lib/esm/__merged.d.mts +7 -2
- package/dist/lib/esm/__merged.mjs +48 -2
- package/dist/lib/esm/code-block-render-handoff.mjs +2 -5
- package/dist/lib/esm/codemirror/editor-mode-extension.d.mts +50 -0
- package/dist/lib/esm/codemirror/editor-mode-extension.mjs +93 -0
- package/dist/lib/esm/codemirror/index.d.mts +1 -0
- package/dist/lib/esm/codemirror/index.mjs +3 -1
- package/dist/lib/esm/codemirror/inline-token-widgets.mjs +3 -9
- package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +2 -2
- package/dist/lib/esm/community-plugins.mjs +2 -2
- package/dist/lib/esm/components/all-windows-event-component.d.mts +54 -3
- package/dist/lib/esm/components/all-windows-event-component.mjs +87 -14
- package/dist/lib/esm/components/monkey-around-component.mjs +1 -1
- package/dist/lib/esm/components/plugin-notice-component.mjs +2 -6
- package/dist/lib/esm/components/plugin-settings-component.d.mts +2 -1
- package/dist/lib/esm/components/plugin-settings-component.mjs +4 -3
- package/dist/lib/esm/components/style-sheet-component.mjs +1 -4
- package/dist/lib/esm/css-class.d.mts +24 -0
- package/dist/lib/esm/css-class.mjs +7 -1
- package/dist/lib/esm/data-stores/shared-data-store.mjs +15 -4
- package/dist/lib/esm/desktop-bulk-operation-git.mjs +5 -5
- package/dist/lib/esm/folder-note.mjs +5 -5
- package/dist/lib/esm/formula-function.d.mts +98 -0
- package/dist/lib/esm/formula-function.mjs +62 -0
- package/dist/lib/esm/frontmatter-formatting.mjs +2 -2
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/i18n/i18n.d.mts +29 -2
- package/dist/lib/esm/i18n/i18n.mjs +40 -10
- package/dist/lib/esm/i18n/locales/en.d.mts +12 -0
- package/dist/lib/esm/i18n/locales/en.mjs +13 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +12 -0
- package/dist/lib/esm/index.d.mts +2 -0
- package/dist/lib/esm/index.mjs +5 -1
- package/dist/lib/esm/link.mjs +12 -12
- package/dist/lib/esm/markdown.mjs +7 -7
- package/dist/lib/esm/modals/code-block-builder.d.mts +321 -0
- package/dist/lib/esm/modals/code-block-builder.mjs +408 -0
- package/dist/lib/esm/modals/index.d.mts +1 -0
- package/dist/lib/esm/modals/index.mjs +3 -1
- package/dist/lib/esm/plugin/index.d.mts +1 -0
- package/dist/lib/esm/plugin/index.mjs +3 -1
- package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +111 -0
- package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +96 -0
- package/dist/lib/esm/plugin/plugin.d.mts +25 -1
- package/dist/lib/esm/plugin/plugin.mjs +52 -2
- package/dist/lib/esm/vault.mjs +2 -2
- package/dist/lib/esm/virtual-file.d.mts +48 -0
- package/dist/lib/esm/virtual-file.mjs +264 -0
- package/dist/styles.css +31 -1
- package/modals/code-block-builder/package.json +6 -0
- package/package.json +5 -5
- package/plugin/plugin-async-cleanup/package.json +6 -0
|
@@ -94,16 +94,16 @@ function resolveFolderNoteConfig(params) {
|
|
|
94
94
|
const {
|
|
95
95
|
app,
|
|
96
96
|
extensions,
|
|
97
|
-
isHidden,
|
|
97
|
+
isHidden = false,
|
|
98
98
|
location,
|
|
99
99
|
resolveName
|
|
100
100
|
} = params;
|
|
101
|
-
return location
|
|
101
|
+
return location === void 0 || location === "Auto" /* Auto */ ? readFolderNotesPluginConfig(app) ?? FALLBACK_FOLDER_NOTE_CONFIG : {
|
|
102
102
|
extensions: normalizeExtensions(extensions ?? [MARKDOWN_FILE_EXTENSION]),
|
|
103
|
-
isHidden
|
|
103
|
+
isHidden,
|
|
104
104
|
location,
|
|
105
105
|
resolveName: resolveName ?? FALLBACK_FOLDER_NOTE_CONFIG.resolveName
|
|
106
|
-
}
|
|
106
|
+
};
|
|
107
107
|
}
|
|
108
108
|
function normalizeExtensions(extensions) {
|
|
109
109
|
const normalizedExtensions = extensions.map((extension) => extension.trim().toLowerCase().replace(/^\./, "")).map((extension) => extension === EXCALIDRAW_FILE_EXTENSION ? MARKDOWN_FILE_EXTENSION : extension).filter(Boolean);
|
|
@@ -168,4 +168,4 @@ export {
|
|
|
168
168
|
resolveFolderNote,
|
|
169
169
|
resolveFolderNoteConfig
|
|
170
170
|
};
|
|
171
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mb2xkZXItbm90ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGZvbGRlci1ub3RlIGNvbmNlcHQ6IHdoaWNoIG5vdGUsIGlmIGFueSwgaXMgdGhlIG9uZSB3aG9zZSBwcm9wZXJ0aWVzIGRlc2NyaWJlIGEgRk9MREVSIGl0c2VsZi5cbiAqXG4gKiBPYnNpZGlhbiBoYXMgbm8gc3VjaCBjb25jZXB0IOKAlCBpdCBpcyBhIGNvbnZlbnRpb24gdGhlIGNvbW11bml0eSBzZXR0bGVkIG9uLCBhbmQgdGhlIHBsdWdpbiB0aGF0IG93bnMgaXRcbiAqIGZvciBtb3N0IHZhdWx0cyBpcyBbYGZvbGRlci1ub3Rlc2BdKGh0dHBzOi8vY29tbXVuaXR5Lm9ic2lkaWFuLm1kL3BsdWdpbnMvZm9sZGVyLW5vdGVzKS4gU28gdGhlIGFuc3dlciB0b1xuICogXCJ3aGljaCBub3RlIGJlbG9uZ3MgdG8gdGhpcyBmb2xkZXJcIiBpcyB0aGF0IHBsdWdpbidzIHRvIGdpdmUgd2hlbmV2ZXIgaXQgaXMgaW5zdGFsbGVkLCBhbmQgdGhpcyBtb2R1bGVcbiAqIGFza3MgaXQgcmF0aGVyIHRoYW4gaW52ZW50aW5nIGEgc2Vjb25kIGFuc3dlcjoge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvfSDigJQgdGhlIGRlZmF1bHQg4oCUIHJlYWRzIGl0c1xuICogbGl2ZSBjb25maWd1cmF0aW9uIGF0IGV2ZXJ5IHVzZS5cbiAqXG4gKiBSZWFkaW5nIGl0IGxpdmUgcmF0aGVyIHRoYW4gY29weWluZyBpdHMgdmFsdWVzIGludG8gYSBjb25zdW1lcidzIG93biBzZXR0aW5ncyBpcyBkZWxpYmVyYXRlOiBhIGNvcHkgZ29lc1xuICogc3RhbGUgdGhlIG1vbWVudCB0aGF0IHBsdWdpbiBpcyByZWNvbmZpZ3VyZWQsIGFuZCBpdCB3b3VsZCBuZWVkIGEgc2V0dGluZ3MgbWlncmF0aW9uIHRvIHNlZWQuIEV2ZXJ5dGhpbmdcbiAqIGVsc2UgaXMgdGhlIGNhbGxlcidzIGV4cGxpY2l0IGNob2ljZSwgYW5kIHRoZW4gdGhlIG90aGVyIHBsdWdpbiBpcyBub3QgY29uc3VsdGVkIGF0IGFsbC5cbiAqXG4gKiBOb3RoaW5nIGhlcmUgZXZlciBDUkVBVEVTIGEgbm90ZS4gQSBmb2xkZXIgd2l0aCBubyBmb2xkZXIgbm90ZSBhbnN3ZXJzIGBudWxsYCwgd2hpY2ggaXMgd2hhdCBsZXRzIGFcbiAqIGNhbGxlciBsYXllciBmb2xkZXItbm90ZSBiZWhhdmlvciBvbnRvIGEgY2xpY2sgd2l0aG91dCByaXNraW5nIGEgZmlsZSBhcHBlYXJpbmcgb24gdGhlIHVzZXIncyBkaXNrLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBURmlsZSxcbiAgVEZvbGRlclxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGpvaW4gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyByZXBsYWNlQWxsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3N0cmluZyc7XG5pbXBvcnQgeyBub3JtYWxpemVQYXRoIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBpc0ZvbGRlcixcbiAgTUFSS0RPV05fRklMRV9FWFRFTlNJT05cbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5cbi8qKlxuICogV2hlcmUgYSBmb2xkZXIncyBmb2xkZXIgbm90ZSBsaXZlcy5cbiAqXG4gKiBUaGUgdGhyZWUgY29uY3JldGUgbWVtYmVycyBhcmUgdGhlIHNoYXBlcyB0aGUgZm9sZGVyLW5vdGUgZWNvc3lzdGVtIGFjdHVhbGx5IHVzZXM6XG4gKiBgY2hhcmxpZS9jaGFybGllLm1kYCBhbmQgYGNoYXJsaWUvaW5kZXgubWRgIGFyZSBib3RoIHtAbGluayBGb2xkZXJOb3RlTG9jYXRpb24uSW5zaWRlRm9sZGVyfSAodGhleVxuICogZGlmZmVyIG9ubHkgaW4gdGhlIE5BTUUsIHdoaWNoIGlzIHdoeSBuYW1pbmcgaXMgYSBjYWxsYmFjayBhbmQgbm90IGEgZm91cnRoIG1lbWJlciksIHdoaWxlXG4gKiBgY2hhcmxpZS5tZGAgYmVzaWRlIHRoZSBmb2xkZXIgaXMge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5QYXJlbnRGb2xkZXJ9IOKAlCB3aG9zZSB3aG9sZSBwb2ludCBpcyB0aGF0XG4gKiBgW1thbHBoYS9icmF2by9jaGFybGllXV1gIGxpbmtzIHRvIGEgZm9sZGVyIHdpdGggbm8gc3BlY2lhbCBzeW50YXguXG4gKi9cbmV4cG9ydCBlbnVtIEZvbGRlck5vdGVMb2NhdGlvbiB7XG4gIC8qKlxuICAgKiBUYWtlIHRoZSBhbnN3ZXIgZnJvbSB0aGUgaW5zdGFsbGVkIGBmb2xkZXItbm90ZXNgIHBsdWdpbiwgZmFsbGluZyBiYWNrIHRvIGEgbm90ZSBuYW1lZCBhZnRlciBpdHNcbiAgICogZm9sZGVyLCBpbnNpZGUgaXQuIFRoZSBkZWZhdWx0LCBhbmQgcmVzb2x2ZWQgTElWRSByYXRoZXIgdGhhbiBjb3BpZWQuXG4gICAqL1xuICBBdXRvID0gJ0F1dG8nLFxuXG4gIC8qKlxuICAgKiBgYWxwaGEvYnJhdm8vY2hhcmxpZS88bmFtZT4ubWRgLlxuICAgKi9cbiAgSW5zaWRlRm9sZGVyID0gJ0luc2lkZUZvbGRlcicsXG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCBoYXMgbm8gZm9sZGVyIG5vdGVzIGF0IGFsbCwgc28gZXZlcnkgZm9sZGVyIGFuc3dlcnMgYG51bGxgLiBUaGlzIGlzIGFsc28gaG93IGEgY2FsbGVyIG9wdHNcbiAgICogb3V0IG9mIGZvbGRlci1ub3RlIGJlaGF2aW9yIGVudGlyZWx5LlxuICAgKi9cbiAgTm9uZSA9ICdOb25lJyxcblxuICAvKipcbiAgICogYGFscGhhL2JyYXZvLzxuYW1lPi5tZGAsIGJlc2lkZSB0aGUgZm9sZGVyLlxuICAgKi9cbiAgUGFyZW50Rm9sZGVyID0gJ1BhcmVudEZvbGRlcidcbn1cblxuLyoqXG4gKiBBIGZvbGRlci1ub3RlIHNldHVwIHdpdGgge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvfSBhbHJlYWR5IHJlc29sdmVkIHRvIGEgY29uY3JldGUgYW5zd2VyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvbGRlck5vdGVDb25maWcge1xuICAvKipcbiAgICogVGhlIGV4dGVuc2lvbnMgYSBmb2xkZXIgbm90ZSBtYXkgY2FycnksIFdJVEhPVVQgdGhlIGxlYWRpbmcgZG90LCBpbiByZXNvbHV0aW9uIG9yZGVyIOKAlCB0aGUgZmlyc3Qgb25lXG4gICAqIHRoYXQgbmFtZXMgYW4gZXhpc3RpbmcgZmlsZSB3aW5zLlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9uczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZvbGRlciBub3RlIGlzIGhpZGRlbiBpbiB0aGUgZmlsZSBleHBsb3Jlci5cbiAgICpcbiAgICogUmVhZCByYXRoZXIgdGhhbiBhY3RlZCB1cG9uIGhlcmU6IGl0IGNoYW5nZXMgbm90aGluZyBhYm91dCBXSElDSCBmaWxlIGlzIHRoZSBmb2xkZXIgbm90ZSwgYnV0IGEgY2FsbGVyXG4gICAqIHRoYXQgcmV2ZWFscyB0aGUgbm90ZSBoYXMgdG8ga25vdyB0aGVyZSBpcyBub3RoaW5nIHRvIHJldmVhbCBhbmQgZmFsbCBiYWNrIHRvIHJldmVhbGluZyB0aGUgZm9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNIaWRkZW46IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBub3RlIHNpdHMgcmVsYXRpdmUgdG8gaXRzIGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uOiBGb2xkZXJOb3RlTG9jYXRpb24uSW5zaWRlRm9sZGVyIHwgRm9sZGVyTm90ZUxvY2F0aW9uLk5vbmUgfCBGb2xkZXJOb3RlTG9jYXRpb24uUGFyZW50Rm9sZGVyO1xuXG4gIC8qKlxuICAgKiBOYW1lcyB0aGUgZm9sZGVyIG5vdGUgb2YgYSBmb2xkZXIsIFdJVEhPVVQgaXRzIGV4dGVuc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgd2hvc2Ugbm90ZSBpcyBiZWluZyBuYW1lZC5cbiAgICogQHJldHVybnMgVGhlIG5vdGUncyBuYW1lOyBhbiBlbXB0eSAob3IgYmxhbmspIG5hbWUgbWVhbnMgdGhlIGZvbGRlciBoYXMgbm8gZm9sZGVyIG5vdGUuXG4gICAqL1xuICAvLyBBIGZ1bmN0aW9uIHByb3BlcnR5IHJhdGhlciB0aGFuIGEgbWV0aG9kLCBiZWNhdXNlIGl0IGlzIGEgc3RhbmRhbG9uZSBjYWxsYmFjaywgbmV2ZXIgYSBtZXRob2Qgb2YgdGhlXG4gIC8vIGNvbmZpZyDigJQgd2hpY2ggaXMgYWxzbyB3aGF0IGxldHMgaXQgYmUgZGVzdHJ1Y3R1cmVkIGFuZCBoYW5kZWQgb24gd2l0aG91dCB0cmlwcGluZyBgdW5ib3VuZC1tZXRob2RgLlxuICByZWFkb25seSByZXNvbHZlTmFtZTogKGZvbGRlcjogVEZvbGRlcikgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRGb2xkZXJOb3RlRm9sZGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRGb2xkZXJOb3RlRm9sZGVyUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGFscmVhZHktcmVzb2x2ZWQgc2V0dXAgdG8gdXNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgcmVzb2x2ZUZvbGRlck5vdGVDb25maWcoeyBhcHAgfSlgXG4gICAqL1xuICByZWFkb25seSBjb25maWc/OiBGb2xkZXJOb3RlQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0aGF0IG1heSBiZSBhIGZvbGRlciBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZTogVEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlRm9sZGVyTm90ZUNvbmZpZ1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBleHRlbnNpb25zIGEgZm9sZGVyIG5vdGUgbWF5IGNhcnJ5LCB3aXRoIG9yIHdpdGhvdXQgdGhlIGxlYWRpbmcgZG90LCBpbiByZXNvbHV0aW9uIG9yZGVyLiBJZ25vcmVkXG4gICAqIHVuZGVyIHtAbGluayBGb2xkZXJOb3RlTG9jYXRpb24uQXV0b30sIHdoaWNoIHRha2VzIHRoZSBpbnN0YWxsZWQgcGx1Z2luJ3MgYW5zd2VyIHdob2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgWydtZCddYFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBmb2xkZXIgbm90ZSBpcyBoaWRkZW4gaW4gdGhlIGZpbGUgZXhwbG9yZXIuIElnbm9yZWQgdW5kZXIge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNIaWRkZW4/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgbm90ZSBzaXRzIHJlbGF0aXZlIHRvIGl0cyBmb2xkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBGb2xkZXJOb3RlTG9jYXRpb24uQXV0b31cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogRm9sZGVyTm90ZUxvY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBOYW1lcyB0aGUgZm9sZGVyIG5vdGUgb2YgYSBmb2xkZXIsIFdJVEhPVVQgaXRzIGV4dGVuc2lvbi4gSWdub3JlZCB1bmRlclxuICAgKiB7QGxpbmsgRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG99LCB3aGljaCBuYW1lcyB0aGUgbm90ZSB0aGUgd2F5IHRoZSBpbnN0YWxsZWQgcGx1Z2luIGRvZXMuXG4gICAqXG4gICAqIEEgY2FsbGJhY2sgcmF0aGVyIHRoYW4gYSBuYW1lIHRlbXBsYXRlLCBiZWNhdXNlIGEgdGVtcGxhdGUgbmVlZHMgYSB0b2tlbiB2b2NhYnVsYXJ5IGFuZCB0aGlzIGxpYnJhcnlcbiAgICogaGFzIG5vbmUgdG8gaW1wb3NlIOKAlCBhIGNhbGxlciB0aGF0IGhhcyBvbmUgKGB7e2ZvbGRlck5hbWV9fWAsIGB7e2ZvbGRlclBhdGh9fWAsIOKApikgcmVuZGVycyBpdCBoZXJlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciB3aG9zZSBub3RlIGlzIGJlaW5nIG5hbWVkLlxuICAgKiBAcmV0dXJucyBUaGUgbm90ZSdzIG5hbWUuXG4gICAqIEBkZWZhdWx0IGAoZm9sZGVyKSA9PiBmb2xkZXIubmFtZWBcbiAgICovXG4gIC8vIFNlZSB7QGxpbmsgRm9sZGVyTm90ZUNvbmZpZy5yZXNvbHZlTmFtZX0gZm9yIHdoeSB0aGlzIGlzIGEgZnVuY3Rpb24gcHJvcGVydHkuXG4gIHJlYWRvbmx5IHJlc29sdmVOYW1lPzogKGZvbGRlcjogVEZvbGRlcikgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlRm9sZGVyTm90ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZUZvbGRlck5vdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgYWxyZWFkeS1yZXNvbHZlZCBzZXR1cCB0byB1c2UuXG4gICAqXG4gICAqIE9taXR0ZWQgbWVhbnMge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvfSDigJQgdGhlIHNldHVwIGlzIHJlc29sdmVkIG9uIHRoZSBzcG90LCB3aGljaCBpcyB3aGF0IG1ha2VzXG4gICAqIGByZXNvbHZlRm9sZGVyTm90ZSh7IGFwcCwgZm9sZGVyIH0pYCB0aGUgb25lLWxpbmVyIGV2ZXJ5IGNhbGxlciB3YW50cy4gUGFzcyBvbmUgd2hlbiB0aGUgc2FtZSBzZXR1cCBpc1xuICAgKiB1c2VkIG1vcmUgdGhhbiBvbmNlLCBvciB3aGVuIGl0cyB7QGxpbmsgRm9sZGVyTm90ZUNvbmZpZy5pc0hpZGRlbn0gaXMgbmVlZGVkIGFsb25nc2lkZSB0aGUgbm90ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnKHsgYXBwIH0pYFxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnPzogRm9sZGVyTm90ZUNvbmZpZztcblxuICAvKipcbiAgICogVGhlIGZvbGRlciB3aG9zZSBmb2xkZXIgbm90ZSBpcyB3YW50ZWQuIFJlYWQgQUZURVIgYW55IHJlbmFtZTogdGhlIG5vdGUgaXMgbmFtZWQgZnJvbSB0aGUgZm9sZGVyJ3NcbiAgICogQ1VSUkVOVCBuYW1lLCBhbmQgYSBgZm9sZGVyLW5vdGVzYCBpbnN0YWxsIHdpdGggYHN5bmNGb2xkZXJOYW1lYCBvbiB3aWxsIGhhdmUgcmVuYW1lZCBpdCBhbHJlYWR5LlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyOiBURm9sZGVyO1xufVxuXG4vKipcbiAqIFRoZSBgZm9sZGVyLW5vdGVzYCBwbHVnaW4ncyBpZCwgYXMgaXRzIG1hbmlmZXN0IGRlY2xhcmVzIGl0LlxuICovXG5leHBvcnQgY29uc3QgRk9MREVSX05PVEVTX1BMVUdJTl9JRCA9ICdmb2xkZXItbm90ZXMnO1xuXG4vKipcbiAqIFRoZSBvbmUgdG9rZW4gYGZvbGRlci1ub3Rlc2AnIG93biBuYW1lIHRlbXBsYXRlIHVuZGVyc3RhbmRzLiBFdmVyeSBvdGhlciBjaGFyYWN0ZXIgaW4gdGhhdCB0ZW1wbGF0ZSBpc1xuICogYSBsaXRlcmFsLCBzbyB0cmFuc2xhdGluZyB0aGlzIHRva2VuIGlzIHRoZSB3aG9sZSBvZiB0aGUgdHJhbnNsYXRpb24uXG4gKi9cbmNvbnN0IEZPTERFUl9OT1RFU19GT0xERVJfTkFNRV9UT0tFTl9SRUdfRVhQID0gL1xce1xce2ZvbGRlcl9uYW1lXFx9XFx9L2dpO1xuXG4vKipcbiAqIGBmb2xkZXItbm90ZXNgIG9mZmVycyBgRXhjYWxpZHJhd2AgZm9sZGVyIG5vdGVzLCB3aGljaCBhcmUgTWFya2Rvd24gZmlsZXMgd2l0aCBhbiBgRXhjYWxpZHJhd2AgcGF5bG9hZCDigJQgaXRzXG4gKiBvd24gcmVzb2x2ZXIgbm9ybWFsaXplcyB0aGUgdHlwZSB0aGUgc2FtZSB3YXkgYmVmb3JlIGxvb2tpbmcgdGhlIGZpbGUgdXAuXG4gKi9cbmNvbnN0IEVYQ0FMSURSQVdfRklMRV9FWFRFTlNJT04gPSAnZXhjYWxpZHJhdyc7XG5cbi8qKlxuICogV2hhdCB7QGxpbmsgRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG99IGZhbGxzIGJhY2sgdG86IHRoZSBsYXlvdXQgZXZlcnkgZm9sZGVyLW5vdGUgcGx1Z2luIHN1cHBvcnRzLCBhbmRcbiAqIHRoZSBvbmUgYGZvbGRlci1ub3Rlc2AgaXRzZWxmIHNoaXBzIGFzIGl0cyBkZWZhdWx0LiBOb3RoaW5nIGhpZGVzIGEgbm90ZSB3aGVuIG5vIHBsdWdpbiBpcyB0aGVyZSB0byBoaWRlXG4gKiBpdCwgc28ge0BsaW5rIEZvbGRlck5vdGVDb25maWcuaXNIaWRkZW59IGlzIGBmYWxzZWAuXG4gKi9cbmNvbnN0IEZBTExCQUNLX0ZPTERFUl9OT1RFX0NPTkZJRzogRm9sZGVyTm90ZUNvbmZpZyA9IHtcbiAgZXh0ZW5zaW9uczogW01BUktET1dOX0ZJTEVfRVhURU5TSU9OXSxcbiAgaXNIaWRkZW46IGZhbHNlLFxuICBsb2NhdGlvbjogRm9sZGVyTm90ZUxvY2F0aW9uLkluc2lkZUZvbGRlcixcbiAgcmVzb2x2ZU5hbWU6IChmb2xkZXI6IFRGb2xkZXIpOiBzdHJpbmcgPT4gZm9sZGVyLm5hbWVcbn07XG5cbi8qKlxuICogRmluZHMgdGhlIGZvbGRlciBhIGZpbGUgaXMgdGhlIGZvbGRlciBub3RlIG9mIOKAlCB0aGUgaW52ZXJzZSBvZiB7QGxpbmsgcmVzb2x2ZUZvbGRlck5vdGV9LlxuICpcbiAqIFRoZSBhbnN3ZXIgaXMgY2hlY2tlZCB0aHJvdWdoIHtAbGluayByZXNvbHZlRm9sZGVyTm90ZX0gaXRzZWxmLCBzbyB0aGUgdHdvIGNhbiBuZXZlciBkaXNhZ3JlZTogYSBmaWxlIGlzXG4gKiBhIGZvbGRlcidzIG5vdGUgZXhhY3RseSB3aGVuIHJlc29sdmluZyB0aGF0IGZvbGRlcidzIG5vdGUgeWllbGRzIHRoaXMgdmVyeSBmaWxlLiBBIGZpbGUgdGhhdCBkb2VzIG5vdFxuICogZXhpc3QgaW4gdGhlIHZhdWx0IChvbmUgYnVpbHQgZm9yIGEgcGF0aCB3aXRoIG5vdGhpbmcgYXQgaXQpIGlzIG5ldmVyIGEgZm9sZGVyIG5vdGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWxlLCBhbmQgb3B0aW9uYWxseSB0aGUgc2V0dXAgdG8gcmVzb2x2ZSBpdCB3aXRoLlxuICogQHJldHVybnMgVGhlIGZvbGRlciwgb3IgYG51bGxgIHdoZW4gdGhlIGZpbGUgaXMgbm90IGEgZm9sZGVyIG5vdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb2xkZXJOb3RlRm9sZGVyKHBhcmFtczogR2V0Rm9sZGVyTm90ZUZvbGRlclBhcmFtcyk6IG51bGwgfCBURm9sZGVyIHtcbiAgY29uc3QgeyBhcHAsIGZpbGUgfSA9IHBhcmFtcztcbiAgY29uc3QgY29uZmlnID0gcGFyYW1zLmNvbmZpZyA/PyByZXNvbHZlRm9sZGVyTm90ZUNvbmZpZyh7IGFwcCB9KTtcbiAgY29uc3QgcGFyZW50ID0gZmlsZS5wYXJlbnQ7XG4gIGlmICghcGFyZW50IHx8IGNvbmZpZy5sb2NhdGlvbiA9PT0gRm9sZGVyTm90ZUxvY2F0aW9uLk5vbmUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBjYW5kaWRhdGVGb2xkZXJzOiBURm9sZGVyW107XG4gIGlmIChjb25maWcubG9jYXRpb24gPT09IEZvbGRlck5vdGVMb2NhdGlvbi5JbnNpZGVGb2xkZXIpIHtcbiAgICAvLyBUaGUgdmF1bHQgcm9vdCBoYXMgbm8gZm9sZGVyIG5vdGUgdW5kZXIgdGhpcyBsYXlvdXQsIHNpbmNlIG5vdGhpbmcgbmFtZXMgaXQuXG4gICAgY2FuZGlkYXRlRm9sZGVycyA9IHBhcmVudC5pc1Jvb3QoKSA/IFtdIDogW3BhcmVudF07XG4gIH0gZWxzZSB7XG4gICAgY2FuZGlkYXRlRm9sZGVycyA9IHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoaXNGb2xkZXIpO1xuICB9XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZUZvbGRlcnMuZmluZCgoZm9sZGVyKSA9PiByZXNvbHZlRm9sZGVyTm90ZSh7IGFwcCwgY29uZmlnLCBmb2xkZXIgfSkgPT09IGZpbGUpID8/IG51bGw7XG59XG5cbi8qKlxuICogRmluZHMgYSBmb2xkZXIncyBmb2xkZXIgbm90ZSDigJQgdGhlIG9uZSBub3RlIHdob3NlIHByb3BlcnRpZXMgZGVzY3JpYmUgdGhlIGZvbGRlciBpdHNlbGYuXG4gKlxuICogKipOZXZlciBjcmVhdGVzLioqIEEgZm9sZGVyIHRoYXQgaGFzIG5vIGZvbGRlciBub3RlIGFuc3dlcnMgYG51bGxgLCBhbmQgc28gZG9lcyB0aGUgdmF1bHQgcm9vdCB1bmRlclxuICoge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5QYXJlbnRGb2xkZXJ9IChub3RoaW5nIGNhbiBzaXQgYmVzaWRlIGl0KS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZvbGRlciwgYW5kIG9wdGlvbmFsbHkgdGhlIHNldHVwIHRvIHJlc29sdmUgaXQgd2l0aC5cbiAqIEByZXR1cm5zIFRoZSBmb2xkZXIgbm90ZSwgb3IgYG51bGxgIHdoZW4gdGhlcmUgaXMgbm9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGb2xkZXJOb3RlKHBhcmFtczogUmVzb2x2ZUZvbGRlck5vdGVQYXJhbXMpOiBudWxsIHwgVEZpbGUge1xuICBjb25zdCB7IGFwcCwgZm9sZGVyIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNvbmZpZyA9IHBhcmFtcy5jb25maWcgPz8gcmVzb2x2ZUZvbGRlck5vdGVDb25maWcoeyBhcHAgfSk7XG4gIGlmIChjb25maWcubG9jYXRpb24gPT09IEZvbGRlck5vdGVMb2NhdGlvbi5Ob25lKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwYXJlbnRGb2xkZXJQYXRoID0gY29uZmlnLmxvY2F0aW9uID09PSBGb2xkZXJOb3RlTG9jYXRpb24uUGFyZW50Rm9sZGVyID8gZm9sZGVyLnBhcmVudD8ucGF0aCA6IGZvbGRlci5wYXRoO1xuICBpZiAocGFyZW50Rm9sZGVyUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBub3RlTmFtZSA9IGNvbmZpZy5yZXNvbHZlTmFtZShmb2xkZXIpLnRyaW0oKTtcbiAgaWYgKCFub3RlTmFtZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChjb25zdCBleHRlbnNpb24gb2YgY29uZmlnLmV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCBmaWxlID0gYXBwLnZhdWx0LmdldEZpbGVCeVBhdGgobm9ybWFsaXplUGF0aChqb2luKHBhcmVudEZvbGRlclBhdGgsIGAke25vdGVOYW1lfS4ke2V4dGVuc2lvbn1gKSkpO1xuICAgIGlmIChmaWxlKSB7XG4gICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB7QGxpbmsgRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG99IGludG8gYSBjb25jcmV0ZSBmb2xkZXItbm90ZSBzZXR1cC5cbiAqXG4gKiBgZm9sZGVyLW5vdGVzYCcgYHZhdWx0Rm9sZGVyYCBzdG9yYWdlIChldmVyeSBmb2xkZXIgbm90ZSBwb29sZWQgaW4gb25lIGNlbnRyYWwgZm9sZGVyKSBoYXMgbm9cbiAqIGNvdW50ZXJwYXJ0IGhlcmUgYW5kIGZhbGxzIGJhY2sgcmF0aGVyIHRoYW4gZ3Vlc3Npbmc6IHdpdGggdGhlIG5vdGVzIHBvb2xlZCwgdGhlIG5vdGUgYmVsb25naW5nIHRvIGFcbiAqIGZvbGRlciBpcyBubyBsb25nZXIgZGVyaXZhYmxlIGZyb20gdGhhdCBmb2xkZXIncyBwYXRoIGFsb25lLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc2V0dXAsIGFuZCB0aGUgYXBwIHRvIHJlYWQgdGhlIGluc3RhbGxlZCBwbHVnaW4gZnJvbS5cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBzZXR1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnKHBhcmFtczogUmVzb2x2ZUZvbGRlck5vdGVDb25maWdQYXJhbXMpOiBGb2xkZXJOb3RlQ29uZmlnIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBleHRlbnNpb25zLFxuICAgIGlzSGlkZGVuLFxuICAgIGxvY2F0aW9uLFxuICAgIHJlc29sdmVOYW1lXG4gIH0gPSBwYXJhbXM7XG5cbiAgcmV0dXJuIGxvY2F0aW9uICE9PSB1bmRlZmluZWQgJiYgbG9jYXRpb24gIT09IEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvXG4gICAgPyB7XG4gICAgICBleHRlbnNpb25zOiBub3JtYWxpemVFeHRlbnNpb25zKGV4dGVuc2lvbnMgPz8gW01BUktET1dOX0ZJTEVfRVhURU5TSU9OXSksXG4gICAgICBpc0hpZGRlbjogaXNIaWRkZW4gPz8gZmFsc2UsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHJlc29sdmVOYW1lOiByZXNvbHZlTmFtZSA/PyBGQUxMQkFDS19GT0xERVJfTk9URV9DT05GSUcucmVzb2x2ZU5hbWVcbiAgICB9XG4gICAgOiByZWFkRm9sZGVyTm90ZXNQbHVnaW5Db25maWcoYXBwKSA/PyBGQUxMQkFDS19GT0xERVJfTk9URV9DT05GSUc7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBleHRlbnNpb25zIHRoZSB3YXkgYGZvbGRlci1ub3Rlc2AgZG9lcyBiZWZvcmUgaXQgbG9va3MgYSBmaWxlIHVwOiBubyBsZWFkaW5nIGRvdCwgbG93ZXItY2FzZSxcbiAqIGBFeGNhbGlkcmF3YCB0cmVhdGVkIGFzIE1hcmtkb3duLCBibGFua3MgZHJvcHBlZCwgZHVwbGljYXRlcyBjb2xsYXBzZWQgd2hpbGUga2VlcGluZyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSdzXG4gKiBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0gZXh0ZW5zaW9ucyAtIFRoZSBleHRlbnNpb25zIGFzIGNvbmZpZ3VyZWQuXG4gKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBleHRlbnNpb25zLCBpbiByZXNvbHV0aW9uIG9yZGVyLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHJlYWRvbmx5IHN0cmluZ1tdKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICBjb25zdCBub3JtYWxpemVkRXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnNcbiAgICAubWFwKChleHRlbnNpb24pID0+IGV4dGVuc2lvbi50cmltKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9eXFwuLywgJycpKVxuICAgIC5tYXAoKGV4dGVuc2lvbikgPT4gZXh0ZW5zaW9uID09PSBFWENBTElEUkFXX0ZJTEVfRVhURU5TSU9OID8gTUFSS0RPV05fRklMRV9FWFRFTlNJT04gOiBleHRlbnNpb24pXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KG5vcm1hbGl6ZWRFeHRlbnNpb25zKV07XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGluc3RhbGxlZCBgZm9sZGVyLW5vdGVzYCBwbHVnaW4ncyBvd24gY29uZmlndXJhdGlvbiwgaWYgaXQgaXMgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkIHRoZSB3YXlcbiAqIGl0IGRvY3VtZW50cy5cbiAqXG4gKiBFdmVyeSB2YWx1ZSBpcyByZWFkIGFzIGB1bmtub3duYCBhbmQgY2hlY2tlZCwgcmF0aGVyIHRoYW4gYXNzZXJ0ZWQgaW50byBhIHNoYXBlOiB0aGlzIGlzIGFub3RoZXJcbiAqIHBsdWdpbidzIHByaXZhdGUgc2V0dGluZ3Mgb2JqZWN0LCBzbyBhIHZlcnNpb24gdGhhdCByZW5hbWVzIG9yIGRyb3BzIGEga2V5IG11c3QgZGVncmFkZSB0byB0aGUgZmFsbGJhY2tcbiAqIGluc3RlYWQgb2YgdGhyb3dpbmcgaW5zaWRlIGEgY2xpY2sgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHJldHVybnMgVGhlIGNvbmZpZ3VyYXRpb24sIG9yIGBudWxsYCB3aGVuIHRoZSBwbHVnaW4gaXMgYWJzZW50LCBub3QgY29uZmlndXJlZCwgb3Igc2V0IHRvIGEgc3RvcmFnZVxuICogbG9jYXRpb24gd2l0aCBubyBjb3VudGVycGFydCBoZXJlLlxuICovXG5mdW5jdGlvbiByZWFkRm9sZGVyTm90ZXNQbHVnaW5Db25maWcoYXBwOiBBcHApOiBGb2xkZXJOb3RlQ29uZmlnIHwgbnVsbCB7XG4gIGNvbnN0IGZvbGRlck5vdGVzUGx1Z2luID0gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKEZPTERFUl9OT1RFU19QTFVHSU5fSUQpO1xuICAvLyBOYXJyb3dlZCB3aXRoIGBpbmAgcmF0aGVyIHRoYW4gYXNzZXJ0ZWQgaW50byBhIHNoYXBlOiB0aGF0IGtlZXBzIGV2ZXJ5IHZhbHVlIGJlbG93IHR5cGVkIGB1bmtub3duYCxcbiAgLy8gd2hpY2ggaXMgZXhhY3RseSB3aGF0IGEgZm9yZWlnbiBwbHVnaW4ncyBwcml2YXRlIHNldHRpbmdzIGFyZS5cbiAgaWYgKCFmb2xkZXJOb3Rlc1BsdWdpbiB8fCAhKCdzZXR0aW5ncycgaW4gZm9sZGVyTm90ZXNQbHVnaW4pKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBmb2xkZXJOb3Rlc1NldHRpbmdzOiB1bmtub3duID0gZm9sZGVyTm90ZXNQbHVnaW4uc2V0dGluZ3M7XG4gIGlmICh0eXBlb2YgZm9sZGVyTm90ZXNTZXR0aW5ncyAhPT0gJ29iamVjdCcgfHwgZm9sZGVyTm90ZXNTZXR0aW5ncyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbG9jYXRpb24gPSB0b0ZvbGRlck5vdGVMb2NhdGlvbignc3RvcmFnZUxvY2F0aW9uJyBpbiBmb2xkZXJOb3Rlc1NldHRpbmdzID8gZm9sZGVyTm90ZXNTZXR0aW5ncy5zdG9yYWdlTG9jYXRpb24gOiBudWxsKTtcbiAgaWYgKCFsb2NhdGlvbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZm9sZGVyTm90ZU5hbWUgPSAnZm9sZGVyTm90ZU5hbWUnIGluIGZvbGRlck5vdGVzU2V0dGluZ3MgPyBmb2xkZXJOb3Rlc1NldHRpbmdzLmZvbGRlck5vdGVOYW1lIDogbnVsbDtcbiAgaWYgKHR5cGVvZiBmb2xkZXJOb3RlTmFtZSAhPT0gJ3N0cmluZycgfHwgIWZvbGRlck5vdGVOYW1lKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBmb2xkZXJOb3RlVHlwZSA9ICdmb2xkZXJOb3RlVHlwZScgaW4gZm9sZGVyTm90ZXNTZXR0aW5ncyA/IGZvbGRlck5vdGVzU2V0dGluZ3MuZm9sZGVyTm90ZVR5cGUgOiBudWxsO1xuICBjb25zdCBzdXBwb3J0ZWRGaWxlVHlwZXMgPSAnc3VwcG9ydGVkRmlsZVR5cGVzJyBpbiBmb2xkZXJOb3Rlc1NldHRpbmdzID8gZm9sZGVyTm90ZXNTZXR0aW5ncy5zdXBwb3J0ZWRGaWxlVHlwZXMgOiBudWxsO1xuICBjb25zdCBpc0hpZGRlbiA9ICdoaWRlRm9sZGVyTm90ZScgaW4gZm9sZGVyTm90ZXNTZXR0aW5ncyA/IGZvbGRlck5vdGVzU2V0dGluZ3MuaGlkZUZvbGRlck5vdGUgOiBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgLy8gSXRzIG93biByZXNvbHZlciB0cmllcyB0aGUgcHJpbWFyeSB0eXBlIGZpcnN0IGFuZCBldmVyeSBvdGhlciBzdXBwb3J0ZWQgdHlwZSBhZnRlciBpdCwgd2hpY2ggaXMgdGhlXG4gICAgLy8gb3JkZXIgcmVwcm9kdWNlZCBoZXJlLiBBbiB1bnVzYWJsZSBwYWlyIGxlYXZlcyBNYXJrZG93biwgdGhlIGV4dGVuc2lvbiBpdCBjYW5ub3QgYmUgY29uZmlndXJlZFxuICAgIC8vIHdpdGhvdXQuXG4gICAgZXh0ZW5zaW9uczogbm9ybWFsaXplRXh0ZW5zaW9ucyhbXG4gICAgICB0eXBlb2YgZm9sZGVyTm90ZVR5cGUgPT09ICdzdHJpbmcnID8gZm9sZGVyTm90ZVR5cGUgOiBNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTixcbiAgICAgIC4uLihBcnJheS5pc0FycmF5KHN1cHBvcnRlZEZpbGVUeXBlcykgPyBzdXBwb3J0ZWRGaWxlVHlwZXMuZmlsdGVyKCh0eXBlOiB1bmtub3duKSA9PiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIDogW10pLFxuICAgICAgTUFSS0RPV05fRklMRV9FWFRFTlNJT05cbiAgICBdKSxcbiAgICBpc0hpZGRlbjogaXNIaWRkZW4gPT09IHRydWUsXG4gICAgbG9jYXRpb24sXG4gICAgcmVzb2x2ZU5hbWU6IChmb2xkZXI6IFRGb2xkZXIpOiBzdHJpbmcgPT5cbiAgICAgIHJlcGxhY2VBbGwoe1xuICAgICAgICAkc3RyaW5nOiBmb2xkZXJOb3RlTmFtZSxcbiAgICAgICAgLy8gQSBmdW5jdGlvbiByZXBsYWNlciwgc28gYSBmb2xkZXIgbmFtZSBjb250YWluaW5nIGAkJmAgaXMgaW5zZXJ0ZWQgbGl0ZXJhbGx5LlxuICAgICAgICByZXBsYWNlcjogKCkgPT4gZm9sZGVyLm5hbWUsXG4gICAgICAgIHNlYXJjaFZhbHVlOiBGT0xERVJfTk9URVNfRk9MREVSX05BTUVfVE9LRU5fUkVHX0VYUFxuICAgICAgfSlcbiAgfTtcbn1cblxuLyoqXG4gKiBNYXBzIGBmb2xkZXItbm90ZXNgJyBgc3RvcmFnZUxvY2F0aW9uYCBvbnRvIHRoaXMgbGlicmFyeSdzIG93biBsb2NhdGlvbi5cbiAqXG4gKiBAcGFyYW0gc3RvcmFnZUxvY2F0aW9uIC0gVGhlIHZhbHVlIHJlYWQgb3V0IG9mIHRoYXQgcGx1Z2luJ3Mgc2V0dGluZ3MuXG4gKiBAcmV0dXJucyBUaGUgbG9jYXRpb24sIG9yIGBudWxsYCBmb3IgYHZhdWx0Rm9sZGVyYCBhbmQgZm9yIGFueXRoaW5nIHRoYXQgaXMgbm90IG9uZSBvZiBpdHMgdmFsdWVzLlxuICovXG5mdW5jdGlvbiB0b0ZvbGRlck5vdGVMb2NhdGlvbihzdG9yYWdlTG9jYXRpb246IHVua25vd24pOiBGb2xkZXJOb3RlQ29uZmlnWydsb2NhdGlvbiddIHwgbnVsbCB7XG4gIHN3aXRjaCAoc3RvcmFnZUxvY2F0aW9uKSB7XG4gICAgY2FzZSAnaW5zaWRlRm9sZGVyJzoge1xuICAgICAgcmV0dXJuIEZvbGRlck5vdGVMb2NhdGlvbi5JbnNpZGVGb2xkZXI7XG4gICAgfVxuICAgIGNhc2UgJ3BhcmVudEZvbGRlcic6IHtcbiAgICAgIHJldHVybiBGb2xkZXJOb3RlTG9jYXRpb24uUGFyZW50Rm9sZGVyO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkEsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMscUJBQXFCO0FBRTlCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBV0EsSUFBSyxxQkFBTCxrQkFBS0Esd0JBQUw7QUFLTCxFQUFBQSxvQkFBQSxVQUFPO0FBS1AsRUFBQUEsb0JBQUEsa0JBQWU7QUFNZixFQUFBQSxvQkFBQSxVQUFPO0FBS1AsRUFBQUEsb0JBQUEsa0JBQWU7QUFyQkwsU0FBQUE7QUFBQSxHQUFBO0FBNEpMLE1BQU0seUJBQXlCO0FBTXRDLE1BQU0seUNBQXlDO0FBTS9DLE1BQU0sNEJBQTRCO0FBT2xDLE1BQU0sOEJBQWdEO0FBQUEsRUFDcEQsWUFBWSxDQUFDLHVCQUF1QjtBQUFBLEVBQ3BDLFVBQVU7QUFBQSxFQUNWLFVBQVU7QUFBQSxFQUNWLGFBQWEsQ0FBQyxXQUE0QixPQUFP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
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mb2xkZXItbm90ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGZvbGRlci1ub3RlIGNvbmNlcHQ6IHdoaWNoIG5vdGUsIGlmIGFueSwgaXMgdGhlIG9uZSB3aG9zZSBwcm9wZXJ0aWVzIGRlc2NyaWJlIGEgRk9MREVSIGl0c2VsZi5cbiAqXG4gKiBPYnNpZGlhbiBoYXMgbm8gc3VjaCBjb25jZXB0IOKAlCBpdCBpcyBhIGNvbnZlbnRpb24gdGhlIGNvbW11bml0eSBzZXR0bGVkIG9uLCBhbmQgdGhlIHBsdWdpbiB0aGF0IG93bnMgaXRcbiAqIGZvciBtb3N0IHZhdWx0cyBpcyBbYGZvbGRlci1ub3Rlc2BdKGh0dHBzOi8vY29tbXVuaXR5Lm9ic2lkaWFuLm1kL3BsdWdpbnMvZm9sZGVyLW5vdGVzKS4gU28gdGhlIGFuc3dlciB0b1xuICogXCJ3aGljaCBub3RlIGJlbG9uZ3MgdG8gdGhpcyBmb2xkZXJcIiBpcyB0aGF0IHBsdWdpbidzIHRvIGdpdmUgd2hlbmV2ZXIgaXQgaXMgaW5zdGFsbGVkLCBhbmQgdGhpcyBtb2R1bGVcbiAqIGFza3MgaXQgcmF0aGVyIHRoYW4gaW52ZW50aW5nIGEgc2Vjb25kIGFuc3dlcjoge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvfSDigJQgdGhlIGRlZmF1bHQg4oCUIHJlYWRzIGl0c1xuICogbGl2ZSBjb25maWd1cmF0aW9uIGF0IGV2ZXJ5IHVzZS5cbiAqXG4gKiBSZWFkaW5nIGl0IGxpdmUgcmF0aGVyIHRoYW4gY29weWluZyBpdHMgdmFsdWVzIGludG8gYSBjb25zdW1lcidzIG93biBzZXR0aW5ncyBpcyBkZWxpYmVyYXRlOiBhIGNvcHkgZ29lc1xuICogc3RhbGUgdGhlIG1vbWVudCB0aGF0IHBsdWdpbiBpcyByZWNvbmZpZ3VyZWQsIGFuZCBpdCB3b3VsZCBuZWVkIGEgc2V0dGluZ3MgbWlncmF0aW9uIHRvIHNlZWQuIEV2ZXJ5dGhpbmdcbiAqIGVsc2UgaXMgdGhlIGNhbGxlcidzIGV4cGxpY2l0IGNob2ljZSwgYW5kIHRoZW4gdGhlIG90aGVyIHBsdWdpbiBpcyBub3QgY29uc3VsdGVkIGF0IGFsbC5cbiAqXG4gKiBOb3RoaW5nIGhlcmUgZXZlciBDUkVBVEVTIGEgbm90ZS4gQSBmb2xkZXIgd2l0aCBubyBmb2xkZXIgbm90ZSBhbnN3ZXJzIGBudWxsYCwgd2hpY2ggaXMgd2hhdCBsZXRzIGFcbiAqIGNhbGxlciBsYXllciBmb2xkZXItbm90ZSBiZWhhdmlvciBvbnRvIGEgY2xpY2sgd2l0aG91dCByaXNraW5nIGEgZmlsZSBhcHBlYXJpbmcgb24gdGhlIHVzZXIncyBkaXNrLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBURmlsZSxcbiAgVEZvbGRlclxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGpvaW4gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5pbXBvcnQgeyByZXBsYWNlQWxsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3N0cmluZyc7XG5pbXBvcnQgeyBub3JtYWxpemVQYXRoIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBpc0ZvbGRlcixcbiAgTUFSS0RPV05fRklMRV9FWFRFTlNJT05cbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5cbi8qKlxuICogV2hlcmUgYSBmb2xkZXIncyBmb2xkZXIgbm90ZSBsaXZlcy5cbiAqXG4gKiBUaGUgdGhyZWUgY29uY3JldGUgbWVtYmVycyBhcmUgdGhlIHNoYXBlcyB0aGUgZm9sZGVyLW5vdGUgZWNvc3lzdGVtIGFjdHVhbGx5IHVzZXM6XG4gKiBgY2hhcmxpZS9jaGFybGllLm1kYCBhbmQgYGNoYXJsaWUvaW5kZXgubWRgIGFyZSBib3RoIHtAbGluayBGb2xkZXJOb3RlTG9jYXRpb24uSW5zaWRlRm9sZGVyfSAodGhleVxuICogZGlmZmVyIG9ubHkgaW4gdGhlIE5BTUUsIHdoaWNoIGlzIHdoeSBuYW1pbmcgaXMgYSBjYWxsYmFjayBhbmQgbm90IGEgZm91cnRoIG1lbWJlciksIHdoaWxlXG4gKiBgY2hhcmxpZS5tZGAgYmVzaWRlIHRoZSBmb2xkZXIgaXMge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5QYXJlbnRGb2xkZXJ9IOKAlCB3aG9zZSB3aG9sZSBwb2ludCBpcyB0aGF0XG4gKiBgW1thbHBoYS9icmF2by9jaGFybGllXV1gIGxpbmtzIHRvIGEgZm9sZGVyIHdpdGggbm8gc3BlY2lhbCBzeW50YXguXG4gKi9cbmV4cG9ydCBlbnVtIEZvbGRlck5vdGVMb2NhdGlvbiB7XG4gIC8qKlxuICAgKiBUYWtlIHRoZSBhbnN3ZXIgZnJvbSB0aGUgaW5zdGFsbGVkIGBmb2xkZXItbm90ZXNgIHBsdWdpbiwgZmFsbGluZyBiYWNrIHRvIGEgbm90ZSBuYW1lZCBhZnRlciBpdHNcbiAgICogZm9sZGVyLCBpbnNpZGUgaXQuIFRoZSBkZWZhdWx0LCBhbmQgcmVzb2x2ZWQgTElWRSByYXRoZXIgdGhhbiBjb3BpZWQuXG4gICAqL1xuICBBdXRvID0gJ0F1dG8nLFxuXG4gIC8qKlxuICAgKiBgYWxwaGEvYnJhdm8vY2hhcmxpZS88bmFtZT4ubWRgLlxuICAgKi9cbiAgSW5zaWRlRm9sZGVyID0gJ0luc2lkZUZvbGRlcicsXG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCBoYXMgbm8gZm9sZGVyIG5vdGVzIGF0IGFsbCwgc28gZXZlcnkgZm9sZGVyIGFuc3dlcnMgYG51bGxgLiBUaGlzIGlzIGFsc28gaG93IGEgY2FsbGVyIG9wdHNcbiAgICogb3V0IG9mIGZvbGRlci1ub3RlIGJlaGF2aW9yIGVudGlyZWx5LlxuICAgKi9cbiAgTm9uZSA9ICdOb25lJyxcblxuICAvKipcbiAgICogYGFscGhhL2JyYXZvLzxuYW1lPi5tZGAsIGJlc2lkZSB0aGUgZm9sZGVyLlxuICAgKi9cbiAgUGFyZW50Rm9sZGVyID0gJ1BhcmVudEZvbGRlcidcbn1cblxuLyoqXG4gKiBBIGZvbGRlci1ub3RlIHNldHVwIHdpdGgge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvfSBhbHJlYWR5IHJlc29sdmVkIHRvIGEgY29uY3JldGUgYW5zd2VyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvbGRlck5vdGVDb25maWcge1xuICAvKipcbiAgICogVGhlIGV4dGVuc2lvbnMgYSBmb2xkZXIgbm90ZSBtYXkgY2FycnksIFdJVEhPVVQgdGhlIGxlYWRpbmcgZG90LCBpbiByZXNvbHV0aW9uIG9yZGVyIOKAlCB0aGUgZmlyc3Qgb25lXG4gICAqIHRoYXQgbmFtZXMgYW4gZXhpc3RpbmcgZmlsZSB3aW5zLlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9uczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZvbGRlciBub3RlIGlzIGhpZGRlbiBpbiB0aGUgZmlsZSBleHBsb3Jlci5cbiAgICpcbiAgICogUmVhZCByYXRoZXIgdGhhbiBhY3RlZCB1cG9uIGhlcmU6IGl0IGNoYW5nZXMgbm90aGluZyBhYm91dCBXSElDSCBmaWxlIGlzIHRoZSBmb2xkZXIgbm90ZSwgYnV0IGEgY2FsbGVyXG4gICAqIHRoYXQgcmV2ZWFscyB0aGUgbm90ZSBoYXMgdG8ga25vdyB0aGVyZSBpcyBub3RoaW5nIHRvIHJldmVhbCBhbmQgZmFsbCBiYWNrIHRvIHJldmVhbGluZyB0aGUgZm9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNIaWRkZW46IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBub3RlIHNpdHMgcmVsYXRpdmUgdG8gaXRzIGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uOiBGb2xkZXJOb3RlTG9jYXRpb24uSW5zaWRlRm9sZGVyIHwgRm9sZGVyTm90ZUxvY2F0aW9uLk5vbmUgfCBGb2xkZXJOb3RlTG9jYXRpb24uUGFyZW50Rm9sZGVyO1xuXG4gIC8qKlxuICAgKiBOYW1lcyB0aGUgZm9sZGVyIG5vdGUgb2YgYSBmb2xkZXIsIFdJVEhPVVQgaXRzIGV4dGVuc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgd2hvc2Ugbm90ZSBpcyBiZWluZyBuYW1lZC5cbiAgICogQHJldHVybnMgVGhlIG5vdGUncyBuYW1lOyBhbiBlbXB0eSAob3IgYmxhbmspIG5hbWUgbWVhbnMgdGhlIGZvbGRlciBoYXMgbm8gZm9sZGVyIG5vdGUuXG4gICAqL1xuICAvLyBBIGZ1bmN0aW9uIHByb3BlcnR5IHJhdGhlciB0aGFuIGEgbWV0aG9kLCBiZWNhdXNlIGl0IGlzIGEgc3RhbmRhbG9uZSBjYWxsYmFjaywgbmV2ZXIgYSBtZXRob2Qgb2YgdGhlXG4gIC8vIGNvbmZpZyDigJQgd2hpY2ggaXMgYWxzbyB3aGF0IGxldHMgaXQgYmUgZGVzdHJ1Y3R1cmVkIGFuZCBoYW5kZWQgb24gd2l0aG91dCB0cmlwcGluZyBgdW5ib3VuZC1tZXRob2RgLlxuICByZWFkb25seSByZXNvbHZlTmFtZTogKGZvbGRlcjogVEZvbGRlcikgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRGb2xkZXJOb3RlRm9sZGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRGb2xkZXJOb3RlRm9sZGVyUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGFscmVhZHktcmVzb2x2ZWQgc2V0dXAgdG8gdXNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgcmVzb2x2ZUZvbGRlck5vdGVDb25maWcoeyBhcHAgfSlgXG4gICAqL1xuICByZWFkb25seSBjb25maWc/OiBGb2xkZXJOb3RlQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0aGF0IG1heSBiZSBhIGZvbGRlciBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZTogVEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlRm9sZGVyTm90ZUNvbmZpZ1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBleHRlbnNpb25zIGEgZm9sZGVyIG5vdGUgbWF5IGNhcnJ5LCB3aXRoIG9yIHdpdGhvdXQgdGhlIGxlYWRpbmcgZG90LCBpbiByZXNvbHV0aW9uIG9yZGVyLiBJZ25vcmVkXG4gICAqIHVuZGVyIHtAbGluayBGb2xkZXJOb3RlTG9jYXRpb24uQXV0b30sIHdoaWNoIHRha2VzIHRoZSBpbnN0YWxsZWQgcGx1Z2luJ3MgYW5zd2VyIHdob2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgWydtZCddYFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBmb2xkZXIgbm90ZSBpcyBoaWRkZW4gaW4gdGhlIGZpbGUgZXhwbG9yZXIuIElnbm9yZWQgdW5kZXIge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNIaWRkZW4/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgbm90ZSBzaXRzIHJlbGF0aXZlIHRvIGl0cyBmb2xkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBGb2xkZXJOb3RlTG9jYXRpb24uQXV0b31cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogRm9sZGVyTm90ZUxvY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBOYW1lcyB0aGUgZm9sZGVyIG5vdGUgb2YgYSBmb2xkZXIsIFdJVEhPVVQgaXRzIGV4dGVuc2lvbi4gSWdub3JlZCB1bmRlclxuICAgKiB7QGxpbmsgRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG99LCB3aGljaCBuYW1lcyB0aGUgbm90ZSB0aGUgd2F5IHRoZSBpbnN0YWxsZWQgcGx1Z2luIGRvZXMuXG4gICAqXG4gICAqIEEgY2FsbGJhY2sgcmF0aGVyIHRoYW4gYSBuYW1lIHRlbXBsYXRlLCBiZWNhdXNlIGEgdGVtcGxhdGUgbmVlZHMgYSB0b2tlbiB2b2NhYnVsYXJ5IGFuZCB0aGlzIGxpYnJhcnlcbiAgICogaGFzIG5vbmUgdG8gaW1wb3NlIOKAlCBhIGNhbGxlciB0aGF0IGhhcyBvbmUgKGB7e2ZvbGRlck5hbWV9fWAsIGB7e2ZvbGRlclBhdGh9fWAsIOKApikgcmVuZGVycyBpdCBoZXJlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciB3aG9zZSBub3RlIGlzIGJlaW5nIG5hbWVkLlxuICAgKiBAcmV0dXJucyBUaGUgbm90ZSdzIG5hbWUuXG4gICAqIEBkZWZhdWx0IGAoZm9sZGVyKSA9PiBmb2xkZXIubmFtZWBcbiAgICovXG4gIC8vIFNlZSB7QGxpbmsgRm9sZGVyTm90ZUNvbmZpZy5yZXNvbHZlTmFtZX0gZm9yIHdoeSB0aGlzIGlzIGEgZnVuY3Rpb24gcHJvcGVydHkuXG4gIHJlYWRvbmx5IHJlc29sdmVOYW1lPzogKGZvbGRlcjogVEZvbGRlcikgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlRm9sZGVyTm90ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZUZvbGRlck5vdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgYWxyZWFkeS1yZXNvbHZlZCBzZXR1cCB0byB1c2UuXG4gICAqXG4gICAqIE9taXR0ZWQgbWVhbnMge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5BdXRvfSDigJQgdGhlIHNldHVwIGlzIHJlc29sdmVkIG9uIHRoZSBzcG90LCB3aGljaCBpcyB3aGF0IG1ha2VzXG4gICAqIGByZXNvbHZlRm9sZGVyTm90ZSh7IGFwcCwgZm9sZGVyIH0pYCB0aGUgb25lLWxpbmVyIGV2ZXJ5IGNhbGxlciB3YW50cy4gUGFzcyBvbmUgd2hlbiB0aGUgc2FtZSBzZXR1cCBpc1xuICAgKiB1c2VkIG1vcmUgdGhhbiBvbmNlLCBvciB3aGVuIGl0cyB7QGxpbmsgRm9sZGVyTm90ZUNvbmZpZy5pc0hpZGRlbn0gaXMgbmVlZGVkIGFsb25nc2lkZSB0aGUgbm90ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnKHsgYXBwIH0pYFxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnPzogRm9sZGVyTm90ZUNvbmZpZztcblxuICAvKipcbiAgICogVGhlIGZvbGRlciB3aG9zZSBmb2xkZXIgbm90ZSBpcyB3YW50ZWQuIFJlYWQgQUZURVIgYW55IHJlbmFtZTogdGhlIG5vdGUgaXMgbmFtZWQgZnJvbSB0aGUgZm9sZGVyJ3NcbiAgICogQ1VSUkVOVCBuYW1lLCBhbmQgYSBgZm9sZGVyLW5vdGVzYCBpbnN0YWxsIHdpdGggYHN5bmNGb2xkZXJOYW1lYCBvbiB3aWxsIGhhdmUgcmVuYW1lZCBpdCBhbHJlYWR5LlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyOiBURm9sZGVyO1xufVxuXG4vKipcbiAqIFRoZSBgZm9sZGVyLW5vdGVzYCBwbHVnaW4ncyBpZCwgYXMgaXRzIG1hbmlmZXN0IGRlY2xhcmVzIGl0LlxuICovXG5leHBvcnQgY29uc3QgRk9MREVSX05PVEVTX1BMVUdJTl9JRCA9ICdmb2xkZXItbm90ZXMnO1xuXG4vKipcbiAqIFRoZSBvbmUgdG9rZW4gYGZvbGRlci1ub3Rlc2AnIG93biBuYW1lIHRlbXBsYXRlIHVuZGVyc3RhbmRzLiBFdmVyeSBvdGhlciBjaGFyYWN0ZXIgaW4gdGhhdCB0ZW1wbGF0ZSBpc1xuICogYSBsaXRlcmFsLCBzbyB0cmFuc2xhdGluZyB0aGlzIHRva2VuIGlzIHRoZSB3aG9sZSBvZiB0aGUgdHJhbnNsYXRpb24uXG4gKi9cbmNvbnN0IEZPTERFUl9OT1RFU19GT0xERVJfTkFNRV9UT0tFTl9SRUdfRVhQID0gL1xce1xce2ZvbGRlcl9uYW1lXFx9XFx9L2dpO1xuXG4vKipcbiAqIGBmb2xkZXItbm90ZXNgIG9mZmVycyBgRXhjYWxpZHJhd2AgZm9sZGVyIG5vdGVzLCB3aGljaCBhcmUgTWFya2Rvd24gZmlsZXMgd2l0aCBhbiBgRXhjYWxpZHJhd2AgcGF5bG9hZCDigJQgaXRzXG4gKiBvd24gcmVzb2x2ZXIgbm9ybWFsaXplcyB0aGUgdHlwZSB0aGUgc2FtZSB3YXkgYmVmb3JlIGxvb2tpbmcgdGhlIGZpbGUgdXAuXG4gKi9cbmNvbnN0IEVYQ0FMSURSQVdfRklMRV9FWFRFTlNJT04gPSAnZXhjYWxpZHJhdyc7XG5cbi8qKlxuICogV2hhdCB7QGxpbmsgRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG99IGZhbGxzIGJhY2sgdG86IHRoZSBsYXlvdXQgZXZlcnkgZm9sZGVyLW5vdGUgcGx1Z2luIHN1cHBvcnRzLCBhbmRcbiAqIHRoZSBvbmUgYGZvbGRlci1ub3Rlc2AgaXRzZWxmIHNoaXBzIGFzIGl0cyBkZWZhdWx0LiBOb3RoaW5nIGhpZGVzIGEgbm90ZSB3aGVuIG5vIHBsdWdpbiBpcyB0aGVyZSB0byBoaWRlXG4gKiBpdCwgc28ge0BsaW5rIEZvbGRlck5vdGVDb25maWcuaXNIaWRkZW59IGlzIGBmYWxzZWAuXG4gKi9cbmNvbnN0IEZBTExCQUNLX0ZPTERFUl9OT1RFX0NPTkZJRzogRm9sZGVyTm90ZUNvbmZpZyA9IHtcbiAgZXh0ZW5zaW9uczogW01BUktET1dOX0ZJTEVfRVhURU5TSU9OXSxcbiAgaXNIaWRkZW46IGZhbHNlLFxuICBsb2NhdGlvbjogRm9sZGVyTm90ZUxvY2F0aW9uLkluc2lkZUZvbGRlcixcbiAgcmVzb2x2ZU5hbWU6IChmb2xkZXI6IFRGb2xkZXIpOiBzdHJpbmcgPT4gZm9sZGVyLm5hbWVcbn07XG5cbi8qKlxuICogRmluZHMgdGhlIGZvbGRlciBhIGZpbGUgaXMgdGhlIGZvbGRlciBub3RlIG9mIOKAlCB0aGUgaW52ZXJzZSBvZiB7QGxpbmsgcmVzb2x2ZUZvbGRlck5vdGV9LlxuICpcbiAqIFRoZSBhbnN3ZXIgaXMgY2hlY2tlZCB0aHJvdWdoIHtAbGluayByZXNvbHZlRm9sZGVyTm90ZX0gaXRzZWxmLCBzbyB0aGUgdHdvIGNhbiBuZXZlciBkaXNhZ3JlZTogYSBmaWxlIGlzXG4gKiBhIGZvbGRlcidzIG5vdGUgZXhhY3RseSB3aGVuIHJlc29sdmluZyB0aGF0IGZvbGRlcidzIG5vdGUgeWllbGRzIHRoaXMgdmVyeSBmaWxlLiBBIGZpbGUgdGhhdCBkb2VzIG5vdFxuICogZXhpc3QgaW4gdGhlIHZhdWx0IChvbmUgYnVpbHQgZm9yIGEgcGF0aCB3aXRoIG5vdGhpbmcgYXQgaXQpIGlzIG5ldmVyIGEgZm9sZGVyIG5vdGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWxlLCBhbmQgb3B0aW9uYWxseSB0aGUgc2V0dXAgdG8gcmVzb2x2ZSBpdCB3aXRoLlxuICogQHJldHVybnMgVGhlIGZvbGRlciwgb3IgYG51bGxgIHdoZW4gdGhlIGZpbGUgaXMgbm90IGEgZm9sZGVyIG5vdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb2xkZXJOb3RlRm9sZGVyKHBhcmFtczogR2V0Rm9sZGVyTm90ZUZvbGRlclBhcmFtcyk6IG51bGwgfCBURm9sZGVyIHtcbiAgY29uc3QgeyBhcHAsIGZpbGUgfSA9IHBhcmFtcztcbiAgY29uc3QgY29uZmlnID0gcGFyYW1zLmNvbmZpZyA/PyByZXNvbHZlRm9sZGVyTm90ZUNvbmZpZyh7IGFwcCB9KTtcbiAgY29uc3QgcGFyZW50ID0gZmlsZS5wYXJlbnQ7XG4gIGlmICghcGFyZW50IHx8IGNvbmZpZy5sb2NhdGlvbiA9PT0gRm9sZGVyTm90ZUxvY2F0aW9uLk5vbmUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBjYW5kaWRhdGVGb2xkZXJzOiBURm9sZGVyW107XG4gIGlmIChjb25maWcubG9jYXRpb24gPT09IEZvbGRlck5vdGVMb2NhdGlvbi5JbnNpZGVGb2xkZXIpIHtcbiAgICAvLyBUaGUgdmF1bHQgcm9vdCBoYXMgbm8gZm9sZGVyIG5vdGUgdW5kZXIgdGhpcyBsYXlvdXQsIHNpbmNlIG5vdGhpbmcgbmFtZXMgaXQuXG4gICAgY2FuZGlkYXRlRm9sZGVycyA9IHBhcmVudC5pc1Jvb3QoKSA/IFtdIDogW3BhcmVudF07XG4gIH0gZWxzZSB7XG4gICAgY2FuZGlkYXRlRm9sZGVycyA9IHBhcmVudC5jaGlsZHJlbi5maWx0ZXIoaXNGb2xkZXIpO1xuICB9XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZUZvbGRlcnMuZmluZCgoZm9sZGVyKSA9PiByZXNvbHZlRm9sZGVyTm90ZSh7IGFwcCwgY29uZmlnLCBmb2xkZXIgfSkgPT09IGZpbGUpID8/IG51bGw7XG59XG5cbi8qKlxuICogRmluZHMgYSBmb2xkZXIncyBmb2xkZXIgbm90ZSDigJQgdGhlIG9uZSBub3RlIHdob3NlIHByb3BlcnRpZXMgZGVzY3JpYmUgdGhlIGZvbGRlciBpdHNlbGYuXG4gKlxuICogKipOZXZlciBjcmVhdGVzLioqIEEgZm9sZGVyIHRoYXQgaGFzIG5vIGZvbGRlciBub3RlIGFuc3dlcnMgYG51bGxgLCBhbmQgc28gZG9lcyB0aGUgdmF1bHQgcm9vdCB1bmRlclxuICoge0BsaW5rIEZvbGRlck5vdGVMb2NhdGlvbi5QYXJlbnRGb2xkZXJ9IChub3RoaW5nIGNhbiBzaXQgYmVzaWRlIGl0KS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZvbGRlciwgYW5kIG9wdGlvbmFsbHkgdGhlIHNldHVwIHRvIHJlc29sdmUgaXQgd2l0aC5cbiAqIEByZXR1cm5zIFRoZSBmb2xkZXIgbm90ZSwgb3IgYG51bGxgIHdoZW4gdGhlcmUgaXMgbm9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGb2xkZXJOb3RlKHBhcmFtczogUmVzb2x2ZUZvbGRlck5vdGVQYXJhbXMpOiBudWxsIHwgVEZpbGUge1xuICBjb25zdCB7IGFwcCwgZm9sZGVyIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNvbmZpZyA9IHBhcmFtcy5jb25maWcgPz8gcmVzb2x2ZUZvbGRlck5vdGVDb25maWcoeyBhcHAgfSk7XG4gIGlmIChjb25maWcubG9jYXRpb24gPT09IEZvbGRlck5vdGVMb2NhdGlvbi5Ob25lKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwYXJlbnRGb2xkZXJQYXRoID0gY29uZmlnLmxvY2F0aW9uID09PSBGb2xkZXJOb3RlTG9jYXRpb24uUGFyZW50Rm9sZGVyID8gZm9sZGVyLnBhcmVudD8ucGF0aCA6IGZvbGRlci5wYXRoO1xuICBpZiAocGFyZW50Rm9sZGVyUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBub3RlTmFtZSA9IGNvbmZpZy5yZXNvbHZlTmFtZShmb2xkZXIpLnRyaW0oKTtcbiAgaWYgKCFub3RlTmFtZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChjb25zdCBleHRlbnNpb24gb2YgY29uZmlnLmV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCBmaWxlID0gYXBwLnZhdWx0LmdldEZpbGVCeVBhdGgobm9ybWFsaXplUGF0aChqb2luKHBhcmVudEZvbGRlclBhdGgsIGAke25vdGVOYW1lfS4ke2V4dGVuc2lvbn1gKSkpO1xuICAgIGlmIChmaWxlKSB7XG4gICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB7QGxpbmsgRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG99IGludG8gYSBjb25jcmV0ZSBmb2xkZXItbm90ZSBzZXR1cC5cbiAqXG4gKiBgZm9sZGVyLW5vdGVzYCcgYHZhdWx0Rm9sZGVyYCBzdG9yYWdlIChldmVyeSBmb2xkZXIgbm90ZSBwb29sZWQgaW4gb25lIGNlbnRyYWwgZm9sZGVyKSBoYXMgbm9cbiAqIGNvdW50ZXJwYXJ0IGhlcmUgYW5kIGZhbGxzIGJhY2sgcmF0aGVyIHRoYW4gZ3Vlc3Npbmc6IHdpdGggdGhlIG5vdGVzIHBvb2xlZCwgdGhlIG5vdGUgYmVsb25naW5nIHRvIGFcbiAqIGZvbGRlciBpcyBubyBsb25nZXIgZGVyaXZhYmxlIGZyb20gdGhhdCBmb2xkZXIncyBwYXRoIGFsb25lLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc2V0dXAsIGFuZCB0aGUgYXBwIHRvIHJlYWQgdGhlIGluc3RhbGxlZCBwbHVnaW4gZnJvbS5cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBzZXR1cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnKHBhcmFtczogUmVzb2x2ZUZvbGRlck5vdGVDb25maWdQYXJhbXMpOiBGb2xkZXJOb3RlQ29uZmlnIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBleHRlbnNpb25zLFxuICAgIGlzSGlkZGVuID0gZmFsc2UsXG4gICAgbG9jYXRpb24sXG4gICAgcmVzb2x2ZU5hbWVcbiAgfSA9IHBhcmFtcztcblxuICByZXR1cm4gbG9jYXRpb24gPT09IHVuZGVmaW5lZCB8fCBsb2NhdGlvbiA9PT0gRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG9cbiAgICA/IHJlYWRGb2xkZXJOb3Rlc1BsdWdpbkNvbmZpZyhhcHApID8/IEZBTExCQUNLX0ZPTERFUl9OT1RFX0NPTkZJR1xuICAgIDoge1xuICAgICAgZXh0ZW5zaW9uczogbm9ybWFsaXplRXh0ZW5zaW9ucyhleHRlbnNpb25zID8/IFtNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTl0pLFxuICAgICAgaXNIaWRkZW4sXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHJlc29sdmVOYW1lOiByZXNvbHZlTmFtZSA/PyBGQUxMQkFDS19GT0xERVJfTk9URV9DT05GSUcucmVzb2x2ZU5hbWVcbiAgICB9O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgZXh0ZW5zaW9ucyB0aGUgd2F5IGBmb2xkZXItbm90ZXNgIGRvZXMgYmVmb3JlIGl0IGxvb2tzIGEgZmlsZSB1cDogbm8gbGVhZGluZyBkb3QsIGxvd2VyLWNhc2UsXG4gKiBgRXhjYWxpZHJhd2AgdHJlYXRlZCBhcyBNYXJrZG93biwgYmxhbmtzIGRyb3BwZWQsIGR1cGxpY2F0ZXMgY29sbGFwc2VkIHdoaWxlIGtlZXBpbmcgdGhlIGZpcnN0IG9jY3VycmVuY2Unc1xuICogcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIGV4dGVuc2lvbnMgLSBUaGUgZXh0ZW5zaW9ucyBhcyBjb25maWd1cmVkLlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgZXh0ZW5zaW9ucywgaW4gcmVzb2x1dGlvbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5zaW9ucyhleHRlbnNpb25zOiByZWFkb25seSBzdHJpbmdbXSk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgY29uc3Qgbm9ybWFsaXplZEV4dGVuc2lvbnMgPSBleHRlbnNpb25zXG4gICAgLm1hcCgoZXh0ZW5zaW9uKSA9PiBleHRlbnNpb24udHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXlxcLi8sICcnKSlcbiAgICAubWFwKChleHRlbnNpb24pID0+IGV4dGVuc2lvbiA9PT0gRVhDQUxJRFJBV19GSUxFX0VYVEVOU0lPTiA/IE1BUktET1dOX0ZJTEVfRVhURU5TSU9OIDogZXh0ZW5zaW9uKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIHJldHVybiBbLi4ubmV3IFNldChub3JtYWxpemVkRXh0ZW5zaW9ucyldO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBpbnN0YWxsZWQgYGZvbGRlci1ub3Rlc2AgcGx1Z2luJ3Mgb3duIGNvbmZpZ3VyYXRpb24sIGlmIGl0IGlzIGluc3RhbGxlZCBhbmQgY29uZmlndXJlZCB0aGUgd2F5XG4gKiBpdCBkb2N1bWVudHMuXG4gKlxuICogRXZlcnkgdmFsdWUgaXMgcmVhZCBhcyBgdW5rbm93bmAgYW5kIGNoZWNrZWQsIHJhdGhlciB0aGFuIGFzc2VydGVkIGludG8gYSBzaGFwZTogdGhpcyBpcyBhbm90aGVyXG4gKiBwbHVnaW4ncyBwcml2YXRlIHNldHRpbmdzIG9iamVjdCwgc28gYSB2ZXJzaW9uIHRoYXQgcmVuYW1lcyBvciBkcm9wcyBhIGtleSBtdXN0IGRlZ3JhZGUgdG8gdGhlIGZhbGxiYWNrXG4gKiBpbnN0ZWFkIG9mIHRocm93aW5nIGluc2lkZSBhIGNsaWNrIGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIFRoZSBjb25maWd1cmF0aW9uLCBvciBgbnVsbGAgd2hlbiB0aGUgcGx1Z2luIGlzIGFic2VudCwgbm90IGNvbmZpZ3VyZWQsIG9yIHNldCB0byBhIHN0b3JhZ2VcbiAqIGxvY2F0aW9uIHdpdGggbm8gY291bnRlcnBhcnQgaGVyZS5cbiAqL1xuZnVuY3Rpb24gcmVhZEZvbGRlck5vdGVzUGx1Z2luQ29uZmlnKGFwcDogQXBwKTogRm9sZGVyTm90ZUNvbmZpZyB8IG51bGwge1xuICBjb25zdCBmb2xkZXJOb3Rlc1BsdWdpbiA9IGFwcC5wbHVnaW5zLmdldFBsdWdpbihGT0xERVJfTk9URVNfUExVR0lOX0lEKTtcbiAgLy8gTmFycm93ZWQgd2l0aCBgaW5gIHJhdGhlciB0aGFuIGFzc2VydGVkIGludG8gYSBzaGFwZTogdGhhdCBrZWVwcyBldmVyeSB2YWx1ZSBiZWxvdyB0eXBlZCBgdW5rbm93bmAsXG4gIC8vIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCBhIGZvcmVpZ24gcGx1Z2luJ3MgcHJpdmF0ZSBzZXR0aW5ncyBhcmUuXG4gIGlmICghZm9sZGVyTm90ZXNQbHVnaW4gfHwgISgnc2V0dGluZ3MnIGluIGZvbGRlck5vdGVzUGx1Z2luKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZm9sZGVyTm90ZXNTZXR0aW5nczogdW5rbm93biA9IGZvbGRlck5vdGVzUGx1Z2luLnNldHRpbmdzO1xuICBpZiAodHlwZW9mIGZvbGRlck5vdGVzU2V0dGluZ3MgIT09ICdvYmplY3QnIHx8IGZvbGRlck5vdGVzU2V0dGluZ3MgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGxvY2F0aW9uID0gdG9Gb2xkZXJOb3RlTG9jYXRpb24oJ3N0b3JhZ2VMb2NhdGlvbicgaW4gZm9sZGVyTm90ZXNTZXR0aW5ncyA/IGZvbGRlck5vdGVzU2V0dGluZ3Muc3RvcmFnZUxvY2F0aW9uIDogbnVsbCk7XG4gIGlmICghbG9jYXRpb24pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGZvbGRlck5vdGVOYW1lID0gJ2ZvbGRlck5vdGVOYW1lJyBpbiBmb2xkZXJOb3Rlc1NldHRpbmdzID8gZm9sZGVyTm90ZXNTZXR0aW5ncy5mb2xkZXJOb3RlTmFtZSA6IG51bGw7XG4gIGlmICh0eXBlb2YgZm9sZGVyTm90ZU5hbWUgIT09ICdzdHJpbmcnIHx8ICFmb2xkZXJOb3RlTmFtZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZm9sZGVyTm90ZVR5cGUgPSAnZm9sZGVyTm90ZVR5cGUnIGluIGZvbGRlck5vdGVzU2V0dGluZ3MgPyBmb2xkZXJOb3Rlc1NldHRpbmdzLmZvbGRlck5vdGVUeXBlIDogbnVsbDtcbiAgY29uc3Qgc3VwcG9ydGVkRmlsZVR5cGVzID0gJ3N1cHBvcnRlZEZpbGVUeXBlcycgaW4gZm9sZGVyTm90ZXNTZXR0aW5ncyA/IGZvbGRlck5vdGVzU2V0dGluZ3Muc3VwcG9ydGVkRmlsZVR5cGVzIDogbnVsbDtcbiAgY29uc3QgaXNIaWRkZW4gPSAnaGlkZUZvbGRlck5vdGUnIGluIGZvbGRlck5vdGVzU2V0dGluZ3MgPyBmb2xkZXJOb3Rlc1NldHRpbmdzLmhpZGVGb2xkZXJOb3RlIDogbnVsbDtcblxuICByZXR1cm4ge1xuICAgIC8vIEl0cyBvd24gcmVzb2x2ZXIgdHJpZXMgdGhlIHByaW1hcnkgdHlwZSBmaXJzdCBhbmQgZXZlcnkgb3RoZXIgc3VwcG9ydGVkIHR5cGUgYWZ0ZXIgaXQsIHdoaWNoIGlzIHRoZVxuICAgIC8vIG9yZGVyIHJlcHJvZHVjZWQgaGVyZS4gQW4gdW51c2FibGUgcGFpciBsZWF2ZXMgTWFya2Rvd24sIHRoZSBleHRlbnNpb24gaXQgY2Fubm90IGJlIGNvbmZpZ3VyZWRcbiAgICAvLyB3aXRob3V0LlxuICAgIGV4dGVuc2lvbnM6IG5vcm1hbGl6ZUV4dGVuc2lvbnMoW1xuICAgICAgdHlwZW9mIGZvbGRlck5vdGVUeXBlID09PSAnc3RyaW5nJyA/IGZvbGRlck5vdGVUeXBlIDogTUFSS0RPV05fRklMRV9FWFRFTlNJT04sXG4gICAgICAuLi4oQXJyYXkuaXNBcnJheShzdXBwb3J0ZWRGaWxlVHlwZXMpID8gc3VwcG9ydGVkRmlsZVR5cGVzLmZpbHRlcigodHlwZTogdW5rbm93bikgPT4gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSA6IFtdKSxcbiAgICAgIE1BUktET1dOX0ZJTEVfRVhURU5TSU9OXG4gICAgXSksXG4gICAgaXNIaWRkZW46IGlzSGlkZGVuID09PSB0cnVlLFxuICAgIGxvY2F0aW9uLFxuICAgIHJlc29sdmVOYW1lOiAoZm9sZGVyOiBURm9sZGVyKTogc3RyaW5nID0+XG4gICAgICByZXBsYWNlQWxsKHtcbiAgICAgICAgJHN0cmluZzogZm9sZGVyTm90ZU5hbWUsXG4gICAgICAgIC8vIEEgZnVuY3Rpb24gcmVwbGFjZXIsIHNvIGEgZm9sZGVyIG5hbWUgY29udGFpbmluZyBgJCZgIGlzIGluc2VydGVkIGxpdGVyYWxseS5cbiAgICAgICAgcmVwbGFjZXI6ICgpID0+IGZvbGRlci5uYW1lLFxuICAgICAgICBzZWFyY2hWYWx1ZTogRk9MREVSX05PVEVTX0ZPTERFUl9OQU1FX1RPS0VOX1JFR19FWFBcbiAgICAgIH0pXG4gIH07XG59XG5cbi8qKlxuICogTWFwcyBgZm9sZGVyLW5vdGVzYCcgYHN0b3JhZ2VMb2NhdGlvbmAgb250byB0aGlzIGxpYnJhcnkncyBvd24gbG9jYXRpb24uXG4gKlxuICogQHBhcmFtIHN0b3JhZ2VMb2NhdGlvbiAtIFRoZSB2YWx1ZSByZWFkIG91dCBvZiB0aGF0IHBsdWdpbidzIHNldHRpbmdzLlxuICogQHJldHVybnMgVGhlIGxvY2F0aW9uLCBvciBgbnVsbGAgZm9yIGB2YXVsdEZvbGRlcmAgYW5kIGZvciBhbnl0aGluZyB0aGF0IGlzIG5vdCBvbmUgb2YgaXRzIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gdG9Gb2xkZXJOb3RlTG9jYXRpb24oc3RvcmFnZUxvY2F0aW9uOiB1bmtub3duKTogRm9sZGVyTm90ZUNvbmZpZ1snbG9jYXRpb24nXSB8IG51bGwge1xuICBzd2l0Y2ggKHN0b3JhZ2VMb2NhdGlvbikge1xuICAgIGNhc2UgJ2luc2lkZUZvbGRlcic6IHtcbiAgICAgIHJldHVybiBGb2xkZXJOb3RlTG9jYXRpb24uSW5zaWRlRm9sZGVyO1xuICAgIH1cbiAgICBjYXNlICdwYXJlbnRGb2xkZXInOiB7XG4gICAgICByZXR1cm4gRm9sZGVyTm90ZUxvY2F0aW9uLlBhcmVudEZvbGRlcjtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBLFNBQVMsWUFBWTtBQUNyQixTQUFTLGtCQUFrQjtBQUMzQixTQUFTLHFCQUFxQjtBQUU5QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQVdBLElBQUsscUJBQUwsa0JBQUtBLHdCQUFMO0FBS0wsRUFBQUEsb0JBQUEsVUFBTztBQUtQLEVBQUFBLG9CQUFBLGtCQUFlO0FBTWYsRUFBQUEsb0JBQUEsVUFBTztBQUtQLEVBQUFBLG9CQUFBLGtCQUFlO0FBckJMLFNBQUFBO0FBQUEsR0FBQTtBQTRKTCxNQUFNLHlCQUF5QjtBQU10QyxNQUFNLHlDQUF5QztBQU0vQyxNQUFNLDRCQUE0QjtBQU9sQyxNQUFNLDhCQUFnRDtBQUFBLEVBQ3BELFlBQVksQ0FBQyx1QkFBdUI7QUFBQSxFQUNwQyxVQUFVO0FBQUEsRUFDVixVQUFVO0FBQUEsRUFDVixhQUFhLENBQUMsV0FBNEIsT0FBTztBQUNuRDtBQVlP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
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Construction and plugin-scoped registration of Bases formula functions.
|
|
6
|
+
*/
|
|
7
|
+
import type { FormulaFunction, FormulaFunctionParam } from '@obsidian-typings/obsidian-public-latest';
|
|
8
|
+
import type { Constructor, FormulaContext, Plugin, Value } from 'obsidian';
|
|
9
|
+
/**
|
|
10
|
+
* Parameters for {@link createFormulaFunctionParameter}.
|
|
11
|
+
*/
|
|
12
|
+
export interface CreateFormulaFunctionParameterParams {
|
|
13
|
+
/**
|
|
14
|
+
* Filter-editor widget, such as `file`, `folder`, `property`, `tags` or `text`.
|
|
15
|
+
*/
|
|
16
|
+
readonly customWidget?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Whether omitted arguments are accepted and passed as `null`.
|
|
19
|
+
*
|
|
20
|
+
* @default `false`
|
|
21
|
+
*/
|
|
22
|
+
readonly isOptional?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Whether this final parameter accepts all remaining arguments.
|
|
25
|
+
*
|
|
26
|
+
* @default `false`
|
|
27
|
+
*/
|
|
28
|
+
readonly isVariadic?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Name displayed in formula completion.
|
|
31
|
+
*/
|
|
32
|
+
readonly name: string;
|
|
33
|
+
/**
|
|
34
|
+
* Accepted value classes. The first names the expected type in errors.
|
|
35
|
+
*/
|
|
36
|
+
readonly type: Constructor<Value>[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Parameters for {@link createFormulaFunction}.
|
|
40
|
+
*/
|
|
41
|
+
export interface CreateFormulaFunctionParams {
|
|
42
|
+
/**
|
|
43
|
+
* Description shown in formula completion.
|
|
44
|
+
*/
|
|
45
|
+
readonly docString?: (() => string) | string;
|
|
46
|
+
/**
|
|
47
|
+
* Synchronous evaluator. Direct `apply` calls receive a `null` context.
|
|
48
|
+
*/
|
|
49
|
+
readonly evaluate: (context: FormulaContext | null, ...arguments_: (null | Value)[]) => Value;
|
|
50
|
+
/**
|
|
51
|
+
* The receiver class for an instance function; omit for a global function.
|
|
52
|
+
*
|
|
53
|
+
* @default `undefined`
|
|
54
|
+
*/
|
|
55
|
+
readonly instanceType?: Constructor<Value>;
|
|
56
|
+
/**
|
|
57
|
+
* Function name, matched case-insensitively by Obsidian.
|
|
58
|
+
*/
|
|
59
|
+
readonly name: string;
|
|
60
|
+
/**
|
|
61
|
+
* Parameters, including the receiver first for an instance function.
|
|
62
|
+
*/
|
|
63
|
+
readonly params: FormulaFunctionParam[];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parameters for {@link registerFormulaFunction}.
|
|
67
|
+
*/
|
|
68
|
+
export interface RegisterFormulaFunctionParams extends CreateFormulaFunctionParams {
|
|
69
|
+
/**
|
|
70
|
+
* Plugin whose unload removes the registration.
|
|
71
|
+
*/
|
|
72
|
+
readonly plugin: Plugin;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Creates a Bases function without accessing Obsidian's unexported base class.
|
|
76
|
+
* Context is restored even when evaluation throws or recursively evaluates the same function.
|
|
77
|
+
* Argument validation is performed by Obsidian's evaluator, not by direct `apply` calls.
|
|
78
|
+
*
|
|
79
|
+
* @param params - Function definition.
|
|
80
|
+
* @returns The function, ready for either of Obsidian's registration methods.
|
|
81
|
+
*/
|
|
82
|
+
export declare function createFormulaFunction(params: CreateFormulaFunctionParams): FormulaFunction;
|
|
83
|
+
/**
|
|
84
|
+
* Builds the parameter metadata consumed by Bases completion, validation and filter widgets.
|
|
85
|
+
* Only the last parameter of a function may be variadic.
|
|
86
|
+
*
|
|
87
|
+
* @param params - Parameter definition.
|
|
88
|
+
* @returns Obsidian's parameter metadata.
|
|
89
|
+
*/
|
|
90
|
+
export declare function createFormulaFunctionParameter(params: CreateFormulaFunctionParameterParams): FormulaFunctionParam;
|
|
91
|
+
/**
|
|
92
|
+
* Creates and registers a Bases function for a plugin's lifetime.
|
|
93
|
+
* Names share Obsidian's registry: use a distinctive name to avoid replacing another function.
|
|
94
|
+
*
|
|
95
|
+
* @param params - Function definition and owning plugin.
|
|
96
|
+
* @returns The registered function.
|
|
97
|
+
*/
|
|
98
|
+
export declare function registerFormulaFunction(params: RegisterFormulaFunctionParams): FormulaFunction;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
function createFormulaFunction(params) {
|
|
7
|
+
const { docString, evaluate, instanceType, name } = params;
|
|
8
|
+
return {
|
|
9
|
+
// eslint-disable-next-line unicorn/name-replacements -- Obsidian's FormulaFunction contract names this member ctx.
|
|
10
|
+
ctx: null,
|
|
11
|
+
...docString !== void 0 && { docString },
|
|
12
|
+
apply(...arguments_) {
|
|
13
|
+
return evaluate(this.ctx, ...arguments_);
|
|
14
|
+
},
|
|
15
|
+
applyWithContext(context, ...arguments_) {
|
|
16
|
+
const previousContext = this.ctx;
|
|
17
|
+
this.ctx = context;
|
|
18
|
+
try {
|
|
19
|
+
return this.apply(...arguments_);
|
|
20
|
+
} finally {
|
|
21
|
+
this.ctx = previousContext;
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
name,
|
|
25
|
+
params: params.params,
|
|
26
|
+
serialize(...arguments_) {
|
|
27
|
+
if (instanceType) {
|
|
28
|
+
const [receiver, ...rest] = arguments_;
|
|
29
|
+
if (receiver === void 0) {
|
|
30
|
+
throw new Error("An instance formula function requires a receiver");
|
|
31
|
+
}
|
|
32
|
+
return `${receiver}.${name}(${rest.join(", ")})`;
|
|
33
|
+
}
|
|
34
|
+
return `${name}(${arguments_.join(", ")})`;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function createFormulaFunctionParameter(params) {
|
|
39
|
+
const { customWidget, isOptional = false, isVariadic = false, name, type } = params;
|
|
40
|
+
return {
|
|
41
|
+
...customWidget !== void 0 && { customWidget },
|
|
42
|
+
name,
|
|
43
|
+
optional: isOptional,
|
|
44
|
+
type,
|
|
45
|
+
variadic: isVariadic
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function registerFormulaFunction(params) {
|
|
49
|
+
const function_ = createFormulaFunction(params);
|
|
50
|
+
if (params.instanceType) {
|
|
51
|
+
params.plugin.registerInstanceFunc(params.instanceType, function_);
|
|
52
|
+
} else {
|
|
53
|
+
params.plugin.registerGlobalFunc(function_);
|
|
54
|
+
}
|
|
55
|
+
return function_;
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
createFormulaFunction,
|
|
59
|
+
createFormulaFunctionParameter,
|
|
60
|
+
registerFormulaFunction
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Zvcm11bGEtZnVuY3Rpb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb25zdHJ1Y3Rpb24gYW5kIHBsdWdpbi1zY29wZWQgcmVnaXN0cmF0aW9uIG9mIEJhc2VzIGZvcm11bGEgZnVuY3Rpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybXVsYUZ1bmN0aW9uLFxuICBGb3JtdWxhRnVuY3Rpb25QYXJhbVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQ29uc3RydWN0b3IsXG4gIEZvcm11bGFDb250ZXh0LFxuICBQbHVnaW4sXG4gIFZhbHVlXG59IGZyb20gJ29ic2lkaWFuJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlRm9ybXVsYUZ1bmN0aW9uUGFyYW1ldGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVGb3JtdWxhRnVuY3Rpb25QYXJhbWV0ZXJQYXJhbXMge1xuICAvKipcbiAgICogRmlsdGVyLWVkaXRvciB3aWRnZXQsIHN1Y2ggYXMgYGZpbGVgLCBgZm9sZGVyYCwgYHByb3BlcnR5YCwgYHRhZ3NgIG9yIGB0ZXh0YC5cbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVdpZGdldD86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgb21pdHRlZCBhcmd1bWVudHMgYXJlIGFjY2VwdGVkIGFuZCBwYXNzZWQgYXMgYG51bGxgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc09wdGlvbmFsPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBmaW5hbCBwYXJhbWV0ZXIgYWNjZXB0cyBhbGwgcmVtYWluaW5nIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNWYXJpYWRpYz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBOYW1lIGRpc3BsYXllZCBpbiBmb3JtdWxhIGNvbXBsZXRpb24uXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBY2NlcHRlZCB2YWx1ZSBjbGFzc2VzLiBUaGUgZmlyc3QgbmFtZXMgdGhlIGV4cGVjdGVkIHR5cGUgaW4gZXJyb3JzLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogQ29uc3RydWN0b3I8VmFsdWU+W107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZUZvcm11bGFGdW5jdGlvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRm9ybXVsYUZ1bmN0aW9uUGFyYW1zIHtcbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIHNob3duIGluIGZvcm11bGEgY29tcGxldGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRvY1N0cmluZz86ICgoKSA9PiBzdHJpbmcpIHwgc3RyaW5nO1xuICAvKipcbiAgICogU3luY2hyb25vdXMgZXZhbHVhdG9yLiBEaXJlY3QgYGFwcGx5YCBjYWxscyByZWNlaXZlIGEgYG51bGxgIGNvbnRleHQuXG4gICAqL1xuICByZWFkb25seSBldmFsdWF0ZTogKGNvbnRleHQ6IEZvcm11bGFDb250ZXh0IHwgbnVsbCwgLi4uYXJndW1lbnRzXzogKG51bGwgfCBWYWx1ZSlbXSkgPT4gVmFsdWU7XG4gIC8qKlxuICAgKiBUaGUgcmVjZWl2ZXIgY2xhc3MgZm9yIGFuIGluc3RhbmNlIGZ1bmN0aW9uOyBvbWl0IGZvciBhIGdsb2JhbCBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlVHlwZT86IENvbnN0cnVjdG9yPFZhbHVlPjtcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIG5hbWUsIG1hdGNoZWQgY2FzZS1pbnNlbnNpdGl2ZWx5IGJ5IE9ic2lkaWFuLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogUGFyYW1ldGVycywgaW5jbHVkaW5nIHRoZSByZWNlaXZlciBmaXJzdCBmb3IgYW4gaW5zdGFuY2UgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBwYXJhbXM6IEZvcm11bGFGdW5jdGlvblBhcmFtW107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyRm9ybXVsYUZ1bmN0aW9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckZvcm11bGFGdW5jdGlvblBhcmFtcyBleHRlbmRzIENyZWF0ZUZvcm11bGFGdW5jdGlvblBhcmFtcyB7XG4gIC8qKlxuICAgKiBQbHVnaW4gd2hvc2UgdW5sb2FkIHJlbW92ZXMgdGhlIHJlZ2lzdHJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBCYXNlcyBmdW5jdGlvbiB3aXRob3V0IGFjY2Vzc2luZyBPYnNpZGlhbidzIHVuZXhwb3J0ZWQgYmFzZSBjbGFzcy5cbiAqIENvbnRleHQgaXMgcmVzdG9yZWQgZXZlbiB3aGVuIGV2YWx1YXRpb24gdGhyb3dzIG9yIHJlY3Vyc2l2ZWx5IGV2YWx1YXRlcyB0aGUgc2FtZSBmdW5jdGlvbi5cbiAqIEFyZ3VtZW50IHZhbGlkYXRpb24gaXMgcGVyZm9ybWVkIGJ5IE9ic2lkaWFuJ3MgZXZhbHVhdG9yLCBub3QgYnkgZGlyZWN0IGBhcHBseWAgY2FsbHMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIEZ1bmN0aW9uIGRlZmluaXRpb24uXG4gKiBAcmV0dXJucyBUaGUgZnVuY3Rpb24sIHJlYWR5IGZvciBlaXRoZXIgb2YgT2JzaWRpYW4ncyByZWdpc3RyYXRpb24gbWV0aG9kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZvcm11bGFGdW5jdGlvbihwYXJhbXM6IENyZWF0ZUZvcm11bGFGdW5jdGlvblBhcmFtcyk6IEZvcm11bGFGdW5jdGlvbiB7XG4gIGNvbnN0IHsgZG9jU3RyaW5nLCBldmFsdWF0ZSwgaW5zdGFuY2VUeXBlLCBuYW1lIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gT2JzaWRpYW4ncyBGb3JtdWxhRnVuY3Rpb24gY29udHJhY3QgbmFtZXMgdGhpcyBtZW1iZXIgY3R4LlxuICAgIGN0eDogbnVsbCxcbiAgICAuLi4oZG9jU3RyaW5nICE9PSB1bmRlZmluZWQgJiYgeyBkb2NTdHJpbmcgfSksXG4gICAgYXBwbHkoLi4uYXJndW1lbnRzXyk6IFZhbHVlIHtcbiAgICAgIHJldHVybiBldmFsdWF0ZSh0aGlzLmN0eCwgLi4uYXJndW1lbnRzXyk7XG4gICAgfSxcbiAgICBhcHBseVdpdGhDb250ZXh0KGNvbnRleHQsIC4uLmFyZ3VtZW50c18pOiBWYWx1ZSB7XG4gICAgICBjb25zdCBwcmV2aW91c0NvbnRleHQgPSB0aGlzLmN0eDtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIE9ic2lkaWFuJ3MgRm9ybXVsYUZ1bmN0aW9uIGNvbnRyYWN0IG5hbWVzIHRoaXMgbWVtYmVyIGN0eC5cbiAgICAgIHRoaXMuY3R4ID0gY29udGV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5KC4uLmFyZ3VtZW50c18pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gT2JzaWRpYW4ncyBGb3JtdWxhRnVuY3Rpb24gY29udHJhY3QgbmFtZXMgdGhpcyBtZW1iZXIgY3R4LlxuICAgICAgICB0aGlzLmN0eCA9IHByZXZpb3VzQ29udGV4dDtcbiAgICAgIH1cbiAgICB9LFxuICAgIG5hbWUsXG4gICAgcGFyYW1zOiBwYXJhbXMucGFyYW1zLFxuICAgIHNlcmlhbGl6ZSguLi5hcmd1bWVudHNfKTogc3RyaW5nIHtcbiAgICAgIGlmIChpbnN0YW5jZVR5cGUpIHtcbiAgICAgICAgY29uc3QgW3JlY2VpdmVyLCAuLi5yZXN0XSA9IGFyZ3VtZW50c187XG4gICAgICAgIGlmIChyZWNlaXZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBpbnN0YW5jZSBmb3JtdWxhIGZ1bmN0aW9uIHJlcXVpcmVzIGEgcmVjZWl2ZXInKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7cmVjZWl2ZXJ9LiR7bmFtZX0oJHtyZXN0LmpvaW4oJywgJyl9KWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7bmFtZX0oJHthcmd1bWVudHNfLmpvaW4oJywgJyl9KWA7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcGFyYW1ldGVyIG1ldGFkYXRhIGNvbnN1bWVkIGJ5IEJhc2VzIGNvbXBsZXRpb24sIHZhbGlkYXRpb24gYW5kIGZpbHRlciB3aWRnZXRzLlxuICogT25seSB0aGUgbGFzdCBwYXJhbWV0ZXIgb2YgYSBmdW5jdGlvbiBtYXkgYmUgdmFyaWFkaWMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlciBkZWZpbml0aW9uLlxuICogQHJldHVybnMgT2JzaWRpYW4ncyBwYXJhbWV0ZXIgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtdWxhRnVuY3Rpb25QYXJhbWV0ZXIocGFyYW1zOiBDcmVhdGVGb3JtdWxhRnVuY3Rpb25QYXJhbWV0ZXJQYXJhbXMpOiBGb3JtdWxhRnVuY3Rpb25QYXJhbSB7XG4gIGNvbnN0IHsgY3VzdG9tV2lkZ2V0LCBpc09wdGlvbmFsID0gZmFsc2UsIGlzVmFyaWFkaWMgPSBmYWxzZSwgbmFtZSwgdHlwZSB9ID0gcGFyYW1zO1xuICByZXR1cm4ge1xuICAgIC4uLihjdXN0b21XaWRnZXQgIT09IHVuZGVmaW5lZCAmJiB7IGN1c3RvbVdpZGdldCB9KSxcbiAgICBuYW1lLFxuICAgIG9wdGlvbmFsOiBpc09wdGlvbmFsLFxuICAgIHR5cGUsXG4gICAgdmFyaWFkaWM6IGlzVmFyaWFkaWNcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuZCByZWdpc3RlcnMgYSBCYXNlcyBmdW5jdGlvbiBmb3IgYSBwbHVnaW4ncyBsaWZldGltZS5cbiAqIE5hbWVzIHNoYXJlIE9ic2lkaWFuJ3MgcmVnaXN0cnk6IHVzZSBhIGRpc3RpbmN0aXZlIG5hbWUgdG8gYXZvaWQgcmVwbGFjaW5nIGFub3RoZXIgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIEZ1bmN0aW9uIGRlZmluaXRpb24gYW5kIG93bmluZyBwbHVnaW4uXG4gKiBAcmV0dXJucyBUaGUgcmVnaXN0ZXJlZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRm9ybXVsYUZ1bmN0aW9uKHBhcmFtczogUmVnaXN0ZXJGb3JtdWxhRnVuY3Rpb25QYXJhbXMpOiBGb3JtdWxhRnVuY3Rpb24ge1xuICBjb25zdCBmdW5jdGlvbl8gPSBjcmVhdGVGb3JtdWxhRnVuY3Rpb24ocGFyYW1zKTtcbiAgaWYgKHBhcmFtcy5pbnN0YW5jZVR5cGUpIHtcbiAgICBwYXJhbXMucGx1Z2luLnJlZ2lzdGVySW5zdGFuY2VGdW5jKHBhcmFtcy5pbnN0YW5jZVR5cGUsIGZ1bmN0aW9uXyk7XG4gIH0gZWxzZSB7XG4gICAgcGFyYW1zLnBsdWdpbi5yZWdpc3Rlckdsb2JhbEZ1bmMoZnVuY3Rpb25fKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb25fO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUE2Rk8sU0FBUyxzQkFBc0IsUUFBc0Q7QUFDMUYsUUFBTSxFQUFFLFdBQVcsVUFBVSxjQUFjLEtBQUssSUFBSTtBQUNwRCxTQUFPO0FBQUE7QUFBQSxJQUVMLEtBQUs7QUFBQSxJQUNMLEdBQUksY0FBYyxVQUFhLEVBQUUsVUFBVTtBQUFBLElBQzNDLFNBQVMsWUFBbUI7QUFDMUIsYUFBTyxTQUFTLEtBQUssS0FBSyxHQUFHLFVBQVU7QUFBQSxJQUN6QztBQUFBLElBQ0EsaUJBQWlCLFlBQVksWUFBbUI7QUFDOUMsWUFBTSxrQkFBa0IsS0FBSztBQUU3QixXQUFLLE1BQU07QUFDWCxVQUFJO0FBQ0YsZUFBTyxLQUFLLE1BQU0sR0FBRyxVQUFVO0FBQUEsTUFDakMsVUFBRTtBQUVBLGFBQUssTUFBTTtBQUFBLE1BQ2I7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLElBQ0EsUUFBUSxPQUFPO0FBQUEsSUFDZixhQUFhLFlBQW9CO0FBQy9CLFVBQUksY0FBYztBQUNoQixjQUFNLENBQUMsVUFBVSxHQUFHLElBQUksSUFBSTtBQUM1QixZQUFJLGFBQWEsUUFBVztBQUMxQixnQkFBTSxJQUFJLE1BQU0sa0RBQWtEO0FBQUEsUUFDcEU7QUFDQSxlQUFPLEdBQUcsUUFBUSxJQUFJLElBQUksSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDO0FBQUEsTUFDL0M7QUFDQSxhQUFPLEdBQUcsSUFBSSxJQUFJLFdBQVcsS0FBSyxJQUFJLENBQUM7QUFBQSxJQUN6QztBQUFBLEVBQ0Y7QUFDRjtBQVNPLFNBQVMsK0JBQStCLFFBQW9FO0FBQ2pILFFBQU0sRUFBRSxjQUFjLGFBQWEsT0FBTyxhQUFhLE9BQU8sTUFBTSxLQUFLLElBQUk7QUFDN0UsU0FBTztBQUFBLElBQ0wsR0FBSSxpQkFBaUIsVUFBYSxFQUFFLGFBQWE7QUFBQSxJQUNqRDtBQUFBLElBQ0EsVUFBVTtBQUFBLElBQ1Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxFQUNaO0FBQ0Y7QUFTTyxTQUFTLHdCQUF3QixRQUF3RDtBQUM5RixRQUFNLFlBQVksc0JBQXNCLE1BQU07QUFDOUMsTUFBSSxPQUFPLGNBQWM7QUFDdkIsV0FBTyxPQUFPLHFCQUFxQixPQUFPLGNBQWMsU0FBUztBQUFBLEVBQ25FLE9BQU87QUFDTCxXQUFPLE9BQU8sbUJBQW1CLFNBQVM7QUFBQSxFQUM1QztBQUNBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -306,7 +306,7 @@ function normalizeItemIndents(collection) {
|
|
|
306
306
|
}
|
|
307
307
|
}
|
|
308
308
|
function readItemKey(item) {
|
|
309
|
-
return
|
|
309
|
+
return item.key && CST.isScalar(item.key) ? castTo(CST.resolveAsScalar(item.key)).value : null;
|
|
310
310
|
}
|
|
311
311
|
function replaceItemValue(item, newValue, indent, shouldPreferFlow, isSeqItem) {
|
|
312
312
|
if (isSeqItem) {
|
|
@@ -356,4 +356,4 @@ export {
|
|
|
356
356
|
enableFrontmatterFormattingPreservation,
|
|
357
357
|
preserveFrontmatterFormatting
|
|
358
358
|
};
|
|
359
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mcm9udG1hdHRlci1mb3JtYXR0aW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSZXdyaXRlcyBhIG5vdGUncyBZQU1MIGZyb250IG1hdHRlciBieSBzcGxpY2luZyBpdHMgY29uY3JldGUgc3ludGF4IHRyZWUsIHNvIGV2ZXJ5IHJlZ2lvbiBhIGNoYW5nZSBkb2VzIG5vdCByZWFjaFxuICoga2VlcHMgdGhlIGV4YWN0IGJ5dGVzIGl0cyBhdXRob3Igd3JvdGUg4oCUIGNvbW1lbnRzIGFuZCB0aGUgd2hpdGVzcGFjZSBpbnNpZGUgdGhlbSwgcXVvdGluZyBzdHlsZSwgYmxhbmsgbGluZXMsXG4gKiBpbmRlbnRhdGlvbiB3aWR0aCwgZmxvdyB2ZXJzdXMgYmxvY2sgY29sbGVjdGlvbnMsIGFuZCBmb2xkZWQgYW5kIGxpdGVyYWwgc2NhbGFycy5cbiAqXG4gKiBPYnNpZGlhbidzIG93biBgcHJvY2Vzc0Zyb250TWF0dGVyKClgIHBhcnNlcyB0aGUgYmxvY2sgdG8gYSBwbGFpbiBvYmplY3QgYW5kIHJlLXN0cmluZ2lmaWVzIHRoZSB3aG9sZSBvZiBpdCwgc28gYVxuICogY2FsbGJhY2sgdGhhdCBjaGFuZ2VzIG9uZSBrZXkgcmV3cml0ZXMgZXZlcnkgb3RoZXIuIFJlLWVtaXR0aW5nIHRoZSBwYXJzZWQgZG9jdW1lbnQgaW5zdGVhZCBvZiB0aGUgcmF3IHRleHQgZG9lcyBub3RcbiAqIGZpeCB0aGF0OiBmaXZlIG9mIHRoZSBsb3NzZXMgc3Vydml2ZSBldmVyeSBlbWl0IG9wdGlvbiB0aGUgYHlhbWxgIHBhY2thZ2Ugb2ZmZXJzLiBTcGxpY2luZyB0aGUgQ1NUIGRvZXMgZml4IGl0LFxuICogYmVjYXVzZSBhbiB1bnRvdWNoZWQgdG9rZW4gaXMgbmV2ZXIgcmUtZW1pdHRlZCBhdCBhbGwg4oCUIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZWVtZWxpL3lhbWwgfCB0aGUgbGlicmFyeX0ga2VlcHNcbiAqIGVhY2ggdG9rZW4ncyBvcmlnaW5hbCBzb3VyY2UgdGV4dCBhbmQge0BsaW5rIGh0dHBzOi8vZWVtZWxpLm9yZy95YW1sLyNjc3QtcGFyc2VyIHwgYENTVC5zdHJpbmdpZnlgfSBjb25jYXRlbmF0ZXMgaXQuXG4gKlxuICogVGhpcyBtb2R1bGUgaXMgREVMSUJFUkFURUxZIG5vdCBvbiB0aGUgZGVmYXVsdCBwYXRoLiBJdCBuZWVkcyB0aGUgYHlhbWxgIHBhY2thZ2UncyBDU1QgQVBJLCB3aGljaCBPYnNpZGlhbiBkb2VzIG5vdFxuICogaGFuZCB0byBwbHVnaW5zIHRocm91Z2ggaXRzIG1vZHVsZSBtYXAg4oCUIHRoYXQgbWFwIGlzIGBvYnNpZGlhbmAsIGBAY29kZW1pcnJvci8qYCBhbmQgYEBsZXplci8qYCBhbmQgbm90aGluZyBlbHNlIOKAlFxuICogc28gdGhlIHBhY2thZ2UgY2Fubm90IGJlIG1hcmtlZCBleHRlcm5hbCBhbmQgbGFuZHMgaW4gdGhlIGNvbnN1bWluZyBwbHVnaW4ncyBgbWFpbi5qc2AsIGFib3V0IDEwMCBLQiBvZiBpdC4gQSBwbHVnaW5cbiAqIG9wdHMgaW4gYnkgY2FsbGluZyB7QGxpbmsgZW5hYmxlRnJvbnRtYXR0ZXJGb3JtYXR0aW5nUHJlc2VydmF0aW9ufSBvbmNlLCBhbmQgb25seSBpdCBwYXlzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE5vZGUsXG4gIFBhcnNlZE5vZGVcbn0gZnJvbSAneWFtbCc7XG5cbmltcG9ydCB7XG4gIGNhc3RUbyxcbiAgaXNEZWVwRXF1YWxcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQgeyBpbnNlcnRBdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHtcbiAgZ2V0RnJvbnRNYXR0ZXJJbmZvLFxuICBwYXJzZVlhbWwsXG4gIHN0cmluZ2lmeVlhbWxcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtcbiAgQ29tcG9zZXIsXG4gIENTVCxcbiAgaXNBbGlhcyxcbiAgcGFyc2VEb2N1bWVudCxcbiAgUGFyc2VyLFxuICBzdHJpbmdpZnksXG4gIHZpc2l0XG59IGZyb20gJ3lhbWwnO1xuXG5pbXBvcnQge1xuICBjaGVja0lzUGxhaW5PYmplY3QsXG4gIHJlZ2lzdGVyRnJvbnRtYXR0ZXJGb3JtYXR0aW5nUHJlc2VydmVyXG59IGZyb20gJy4vZnJvbnRtYXR0ZXIudHMnO1xuXG4vKipcbiAqIEEgYmxvY2sgb3IgZmxvdyBjb2xsZWN0aW9uIHRva2VuIHdob3NlIGl0ZW1zIHRoZSBzcGxpY2UgcmVhcnJhbmdlcy5cbiAqL1xudHlwZSBDb2xsZWN0aW9uVG9rZW4gPSBDU1QuQmxvY2tNYXAgfCBDU1QuQmxvY2tTZXF1ZW5jZTtcblxuLyoqXG4gKiBPbmUgc3RlcCBvZiB0aGUgZWRpdCBzY3JpcHQge0BsaW5rIGJ1aWxkRWRpdFNjcmlwdH0gZGVyaXZlcyBmb3IgYSBzZXF1ZW5jZS5cbiAqXG4gKiBga2VlcGAgcmV1c2VzIHRoZSBvbGQgaXRlbSdzIHRva2VuIHVudG91Y2hlZCwgYG1lcmdlYCByZXVzZXMgaXQgYW5kIHJld3JpdGVzIGl0cyB2YWx1ZSBpbiBwbGFjZSwgYW5kIGBpbnNlcnRgXG4gKiBlbWl0cyBhIGJyYW5kIG5ldyBpdGVtLiBBIHJlbW92YWwgcHJvZHVjZXMgbm8gc3RlcCBhdCBhbGwg4oCUIGl0IGlzIHNpbXBseSBhbiBvbGQgaW5kZXggbm8gc3RlcCBuYW1lcy5cbiAqL1xuaW50ZXJmYWNlIEVkaXRTdGVwIHtcbiAgcmVhZG9ubHkga2luZDogJ2luc2VydCcgfCAna2VlcCcgfCAnbWVyZ2UnO1xuICByZWFkb25seSBuZXdJbmRleDogbnVtYmVyO1xuICByZWFkb25seSBvbGRJbmRleDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBgc2VwYCBhbmQgYHZhbHVlYCB0b2tlbnMgb2YgYSBmcmVzaGx5IGVtaXR0ZWQgYmxvY2stbWFwIGl0ZW0sIHJlYWR5IHRvIGJlIHRyYW5zcGxhbnRlZCBvbnRvIGFuIGV4aXN0aW5nIG9uZS5cbiAqL1xuaW50ZXJmYWNlIE1hcEl0ZW1Ub2tlbnMge1xuICByZWFkb25seSBzZXBhcmF0b3JUb2tlbnM6IENTVC5Tb3VyY2VUb2tlbltdO1xuICByZWFkb25seSB2YWx1ZTogQ1NULlRva2VuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEEgc2VxdWVuY2UgbG9uZyBlbm91Z2ggdGhhdCB0aGUgcXVhZHJhdGljIGVkaXQgc2NyaXB0IHN0b3BzIGJlaW5nIHdvcnRoIGl0cyBjb3N0LlxuICpcbiAqIEEgZnJvbnQgbWF0dGVyIHNlcXVlbmNlIGlzIGEgdGFnIGxpc3Qgb3IgYW4gYWxpYXMgbGlzdCwgc28gdGhpcyBpcyBuZXZlciBhcHByb2FjaGVkIGluIHByYWN0aWNlOyBpdCBpcyBoZXJlIHNvIHRoYXQgYVxuICogcGF0aG9sb2dpY2FsIG9uZSBkZWdyYWRlcyB0byBhIHdob2xlLWNvbGxlY3Rpb24gcmUtZW1pdCBpbnN0ZWFkIG9mIHN0YWxsaW5nIHRoZSB3cml0ZSBxdWV1ZS5cbiAqL1xuY29uc3QgRURJVF9TQ1JJUFRfQ0VMTF9MSU1JVCA9IDEwXzAwMDtcblxuLyoqXG4gKiBXaGF0IGEgbWFwcGluZyBlbWl0cyBhcyB3aGVuIGV2ZXJ5IG9uZSBvZiBpdHMgdmFsdWVzIGlzIGB1bmRlZmluZWRgLCBpLmUuIHdoZW4gaXQgaGFzIG5vdGhpbmcgdG8gd3JpdGUgYXQgYWxsLlxuICovXG5jb25zdCBFTVBUWV9NQVBQSU5HX0ZSQUdNRU5UID0gJ3t9JztcblxuLyoqXG4gKiBUaGUgb3B0aW9ucyBPYnNpZGlhbiBpdHNlbGYgcGFzc2VzIHRvIGBzdHJpbmdpZnkoKWAsIHJlYWQgb3V0IG9mIGl0cyBidW5kbGUuXG4gKlxuICogRXZlcnkgZnJhZ21lbnQgdGhpcyBtb2R1bGUgZW1pdHMgZ29lcyB0aHJvdWdoIHRoZW0sIHNvIGEgZnJhZ21lbnQgaXQgd3JpdGVzIGlzIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBvbmUgdGhlXG4gKiBwYXJzZS1hbmQtc3RyaW5naWZ5IHBhdGggd291bGQgaGF2ZSB3cml0dGVuIGZvciB0aGUgc2FtZSB2YWx1ZS5cbiAqL1xuY29uc3QgT0JTSURJQU5fU1RSSU5HSUZZX09QVElPTlMgPSB7XG4gIGFsaWFzRHVwbGljYXRlT2JqZWN0czogZmFsc2UsXG4gIGxpbmVXaWR0aDogMCxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYG51bGxTdHJgIGlzIHRoZSBgeWFtbGAgcGFja2FnZSdzIG93biBvcHRpb24gbmFtZS5cbiAgbnVsbFN0cjogJydcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogVGhlIGtleSBhIGZyYWdtZW50IGlzIGVtaXR0ZWQgdW5kZXIgd2hlbiBvbmx5IGl0cyB2YWx1ZSBpcyB3YW50ZWQuIE5ldmVyIHJlYWNoZXMgdGhlIG91dHB1dC5cbiAqL1xuY29uc3QgUExBQ0VIT0xERVJfS0VZID0gJ2snO1xuXG4vKipcbiAqIFRoZSBgQXJyYXkuYXQoKWAgaW5kZXggb2YgdGhlIHRva2VuIGJlZm9yZSB0aGUgbGFzdCBvbmUsIHdoaWNoIGlzIHdoZXJlIGEgbmV3bGluZSBzaXRzIHdoZW4gYW4gaW5kZW50IGZvbGxvd3MgaXQuXG4gKi9cbmNvbnN0IFNFQ09ORF9UT19MQVNUX0lOREVYID0gLTI7XG5cbmNvbnN0IFRSQUlMSU5HX05FV0xJTkVfUkVHX0VYUCA9IC9cXG4kLztcblxuY29uc3QgVU5SRVNPTFZFRF9UQUdfV0FSTklOR19DT0RFID0gJ1RBR19SRVNPTFZFX0ZBSUxFRCc7XG5cbi8qKlxuICogT25lIHN0ZXAgb2YgdGhlIHJhdyBlZGl0IHNjcmlwdCwgYmVmb3JlIHJlbW92YWxzIGFyZSBmb2xkZWQgaW50byB0aGUgaW5zZXJ0aW9ucyB0aGF0IGZvbGxvdyB0aGVtLlxuICovXG5pbnRlcmZhY2UgUmF3RWRpdFN0ZXAge1xuICByZWFkb25seSBraW5kOiAnaW5zZXJ0JyB8ICdrZWVwJyB8ICdyZW1vdmUnO1xuICByZWFkb25seSBuZXdJbmRleDogbnVtYmVyO1xuICByZWFkb25seSBvbGRJbmRleDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoYXQgYENTVC5yZXNvbHZlQXNTY2FsYXJgIGhhbmRzIGJhY2sgZm9yIGEga2V5OiB0aGUgc2NhbGFyJ3Mgb3duIHRleHQsIG5ldmVyIGEgc2NoZW1hLXJlc29sdmVkIHZhbHVlLlxuICovXG5pbnRlcmZhY2UgUmVzb2x2ZWRTY2FsYXIge1xuICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGlzIG1vZHVsZSdzIGVuZ2luZSBhcyB0aGUgZnJvbnQgbWF0dGVyIGZvcm1hdHRpbmcgcHJlc2VydmVyIGZvciBldmVyeSB3cml0ZSB0aGlzIGxpYnJhcnkgcGVyZm9ybXMuXG4gKlxuICogQ2FsbCBpdCBvbmNlLCBmcm9tIGEgcGx1Z2luJ3MgYG9ubG9hZEltcGwoKWAuIEl0IHRha2VzIGVmZmVjdCBmb3IgYHByb2Nlc3NGcm9udG1hdHRlcigpYCwgYGFwcGx5RmlsZUNoYW5nZXMoKWAgYW5kXG4gKiBldmVyeSBvdGhlciBwYXRoIHRoYXQgcmVhY2hlcyBgc2V0RnJvbnRtYXR0ZXIoKWAsIGluY2x1ZGluZyB0aGUgb25lcyB0aGUgY2FsbGluZyBwbHVnaW4gZG9lcyBub3QgaW52b2tlIGl0c2VsZi5cbiAqXG4gKiBUaGVyZSBpcyBvbmUgcHJlc2VydmVyIHBlciByZWFsbSwgc28gdHdvIHBsdWdpbnMgdGhhdCBib3RoIGNhbGwgdGhpcyBzaW1wbHkgYWdyZWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVGcm9udG1hdHRlckZvcm1hdHRpbmdQcmVzZXJ2YXRpb24oKTogdm9pZCB7XG4gIHJlZ2lzdGVyRnJvbnRtYXR0ZXJGb3JtYXR0aW5nUHJlc2VydmVyKHByZXNlcnZlRnJvbnRtYXR0ZXJGb3JtYXR0aW5nKTtcbn1cblxuLyoqXG4gKiBSZXdyaXRlcyB0aGUgZnJvbnQgbWF0dGVyIG9mIGEgbm90ZSwga2VlcGluZyB0aGUgb3JpZ2luYWwgYnl0ZXMgb2YgZXZlcnl0aGluZyB0aGUgY2hhbmdlIGRvZXMgbm90IHJlYWNoLlxuICpcbiAqIEl0IGlzIHRoZSBlbmdpbmUge0BsaW5rIGVuYWJsZUZyb250bWF0dGVyRm9ybWF0dGluZ1ByZXNlcnZhdGlvbn0gcmVnaXN0ZXJzLCBhbmQgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBhcyB3ZWxsLlxuICpcbiAqIGBudWxsYCBtZWFucyBcInRoaXMgb25lIGlzIG5vdCBtaW5lXCI6IHRoZSBibG9jayBkb2VzIG5vdCBleGlzdCwgdGhlIG5ldyBmcm9udCBtYXR0ZXIgaXMgZW1wdHkgKGJvdGggYXJlIHRoZVxuICogcGFyc2UtYW5kLXN0cmluZ2lmeSBwYXRoJ3MgYnVzaW5lc3MsIHVuY2hhbmdlZCksIG9yIHRoZSBzcGxpY2UgY291bGQgbm90IGJlIHByb3ZlZCBmYWl0aGZ1bC4gVGhlIHByb29mIGlzIG5vdFxuICogaGFuZC13YXZlZCDigJQgdGhlIHNwbGljZWQgYmxvY2sgaXMgcmUtcGFyc2VkIGFuZCBjb21wYXJlZCBhZ2FpbnN0IHRoZSB2YWx1ZSB0aGUgcGFyc2UtYW5kLXN0cmluZ2lmeSBwYXRoIHdvdWxkIGhhdmVcbiAqIHByb2R1Y2VkIGZvciB0aGUgc2FtZSBpbnB1dCwgYW5kIGFueSBkaWZmZXJlbmNlIHJldHVybnMgYG51bGxgLiBUaGF0IGlzIHdoYXQgbWFrZXMgdGhpcyBzdHJpY3RseSBiZXR0ZXIgdGhhbiB0aGF0XG4gKiBwYXRoIG9yIGlkZW50aWNhbCB0byBpdCwgYW5kIG5ldmVyIHdvcnNlLlxuICpcbiAqIEBwYXJhbSBjb250ZW50IC0gVGhlIG5vdGUgdG8gcmV3cml0ZSB0aGUgZnJvbnQgbWF0dGVyIG9mLlxuICogQHBhcmFtIG5ld0Zyb250bWF0dGVyIC0gVGhlIGZyb250IG1hdHRlciB0byB3cml0ZS5cbiAqIEByZXR1cm5zIFRoZSBuZXcgbm90ZSwgb3IgYG51bGxgIHdoZW4gdGhlIGNhbGxlciBzaG91bGQgcGFyc2UgdGhlIGJsb2NrIGFuZCB3cml0ZSB0aGUgd2hvbGUgb2YgaXQgb3V0IGFnYWluIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVzZXJ2ZUZyb250bWF0dGVyRm9ybWF0dGluZyhjb250ZW50OiBzdHJpbmcsIG5ld0Zyb250bWF0dGVyOiBvYmplY3QpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXJJbmZvID0gZ2V0RnJvbnRNYXR0ZXJJbmZvKGNvbnRlbnQpO1xuICBpZiAoIWZyb250bWF0dGVySW5mby5leGlzdHMgfHwgT2JqZWN0LmtleXMobmV3RnJvbnRtYXR0ZXIpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc3BsaWNlZEJvZHkgPSBzcGxpY2VGcm9udG1hdHRlckJvZHkoZnJvbnRtYXR0ZXJJbmZvLmZyb250bWF0dGVyLCBuZXdGcm9udG1hdHRlcik7XG4gIHJldHVybiBzcGxpY2VkQm9keSA9PT0gbnVsbFxuICAgID8gbnVsbFxuICAgIDogaW5zZXJ0QXQoe1xuICAgICAgJHN0cmluZzogY29udGVudCxcbiAgICAgIGVuZEluZGV4OiBmcm9udG1hdHRlckluZm8udG8sXG4gICAgICBzdGFydEluZGV4OiBmcm9udG1hdHRlckluZm8uZnJvbSxcbiAgICAgIHN1YnN0cmluZzogc3BsaWNlZEJvZHlcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBEZXJpdmVzIHRoZSBlZGl0IHNjcmlwdCB0aGF0IHR1cm5zIGBvbGRBcnJheWAgaW50byBgbmV3QXJyYXlgLCByZXVzaW5nIGFzIG1hbnkgb2YgdGhlIG9sZCBpdGVtcyBhcyBpdCBjYW4uXG4gKlxuICogQSBsb25nZXN0LWNvbW1vbi1zdWJzZXF1ZW5jZSBkaWZmIG92ZXIgdmFsdWUgZXF1YWxpdHkgaXMgd2hhdCByZWNvdmVycyB0aGUgQVVUSE9SJ3Mgb3BlcmF0aW9uLiBSZXBsYXlpbmcgdGhlXG4gKiBtdXRhdGlvbiBhbiBhcnJheSBtZXRob2QgcGVyZm9ybWVkIGluc3RlYWQg4oCUIGBbYSwgYiwgY10uc3BsaWNlKDEsIDEpYCB3cml0ZXMgYFsxXSA9ICdjJ2AgdGhlbiB0cnVuY2F0ZXMg4oCUIHdvdWxkXG4gKiBvdmVyd3JpdGUgYGJgJ3Mgbm9kZSB3aXRoIGBjYCdzIHZhbHVlIGFuZCBkZWxldGUgYGNgJ3Mgbm9kZSwgc28gYGJgJ3MgY29tbWVudCB3b3VsZCBlbmQgdXAgYW5ub3RhdGluZyBgY2A6IGV4YWN0bHlcbiAqIHRoZSBtaXNhdHRyaWJ1dGlvbiB0aGlzIG1vZHVsZSBleGlzdHMgdG8gcHJldmVudC5cbiAqXG4gKiBBIHJlbW92YWwgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW4gaW5zZXJ0aW9uIG9mIHRoZSBzYW1lIHNoYXBlIGlzIGZvbGRlZCBpbnRvIGEgc2luZ2xlIGBtZXJnZWAsIHNvIGFuIGl0ZW0gZWRpdGVkXG4gKiBpbiBwbGFjZSAoYFt7IHF0eTogMSB9XWAgdG8gYFt7IHF0eTogMiB9XWApIGtlZXBzIGl0cyBvd24gbm9kZSBhbmQgaXRzIGNvbW1lbnRzIHJhdGhlciB0aGFuIGJlaW5nIHJlYnVpbHQuXG4gKlxuICogQHBhcmFtIG9sZEFycmF5IC0gVGhlIHNlcXVlbmNlIGFzIHRoZSBzb3VyY2UgaG9sZHMgaXQuXG4gKiBAcGFyYW0gbmV3QXJyYXkgLSBUaGUgc2VxdWVuY2UgYXMgaXQgaXMgdG8gYmUgd3JpdHRlbi5cbiAqIEByZXR1cm5zIFRoZSBzdGVwcyB0byBhcHBseSwgaW4gb3V0cHV0IG9yZGVyLlxuICovXG5mdW5jdGlvbiBidWlsZEVkaXRTY3JpcHQob2xkQXJyYXk6IHJlYWRvbmx5IHVua25vd25bXSwgbmV3QXJyYXk6IHJlYWRvbmx5IHVua25vd25bXSk6IEVkaXRTdGVwW10ge1xuICBjb25zdCByYXdTdGVwcyA9IGJ1aWxkUmF3RWRpdFNjcmlwdChvbGRBcnJheSwgbmV3QXJyYXkpO1xuICBjb25zdCBzdGVwczogRWRpdFN0ZXBbXSA9IFtdO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCByYXdTdGVwcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBzdGVwID0gY2FzdFRvPFJhd0VkaXRTdGVwPihyYXdTdGVwc1tpbmRleF0pO1xuICAgIGNvbnN0IG5leHRTdGVwID0gcmF3U3RlcHNbaW5kZXggKyAxXTtcbiAgICBpZiAoXG4gICAgICBzdGVwLmtpbmQgPT09ICdyZW1vdmUnICYmIG5leHRTdGVwPy5raW5kID09PSAnaW5zZXJ0J1xuICAgICAgJiYgY2hlY2tJc01lcmdlYWJsZShvbGRBcnJheVtzdGVwLm9sZEluZGV4XSwgbmV3QXJyYXlbbmV4dFN0ZXAubmV3SW5kZXhdKVxuICAgICkge1xuICAgICAgc3RlcHMucHVzaCh7IGtpbmQ6ICdtZXJnZScsIG5ld0luZGV4OiBuZXh0U3RlcC5uZXdJbmRleCwgb2xkSW5kZXg6IHN0ZXAub2xkSW5kZXggfSk7XG4gICAgICBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHN0ZXAua2luZCAhPT0gJ3JlbW92ZScpIHtcbiAgICAgIHN0ZXBzLnB1c2goeyBraW5kOiBzdGVwLmtpbmQsIG5ld0luZGV4OiBzdGVwLm5ld0luZGV4LCBvbGRJbmRleDogc3RlcC5vbGRJbmRleCB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RlcHM7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmF3RWRpdFNjcmlwdChvbGRBcnJheTogcmVhZG9ubHkgdW5rbm93bltdLCBuZXdBcnJheTogcmVhZG9ubHkgdW5rbm93bltdKTogUmF3RWRpdFN0ZXBbXSB7XG4gIGNvbnN0IG9sZExlbmd0aCA9IG9sZEFycmF5Lmxlbmd0aDtcbiAgY29uc3QgbmV3TGVuZ3RoID0gbmV3QXJyYXkubGVuZ3RoO1xuICBjb25zdCBjb21tb25MZW5ndGhzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogb2xkTGVuZ3RoICsgMSB9LCAoKSA9PiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuZXdMZW5ndGggKyAxIH0sICgpID0+IDApKTtcblxuICBmb3IgKGxldCBvbGRJbmRleCA9IG9sZExlbmd0aCAtIDE7IG9sZEluZGV4ID49IDA7IG9sZEluZGV4LS0pIHtcbiAgICBmb3IgKGxldCBuZXdJbmRleCA9IG5ld0xlbmd0aCAtIDE7IG5ld0luZGV4ID49IDA7IG5ld0luZGV4LS0pIHtcbiAgICAgIGNvbnN0IHJvdyA9IGNhc3RUbzxudW1iZXJbXT4oY29tbW9uTGVuZ3Roc1tvbGRJbmRleF0pO1xuICAgICAgY29uc3QgbmV4dFJvdyA9IGNhc3RUbzxudW1iZXJbXT4oY29tbW9uTGVuZ3Roc1tvbGRJbmRleCArIDFdKTtcbiAgICAgIHJvd1tuZXdJbmRleF0gPSBpc0RlZXBFcXVhbChvbGRBcnJheVtvbGRJbmRleF0sIG5ld0FycmF5W25ld0luZGV4XSlcbiAgICAgICAgPyBjYXN0VG88bnVtYmVyPihuZXh0Um93W25ld0luZGV4ICsgMV0pICsgMVxuICAgICAgICA6IE1hdGgubWF4KGNhc3RUbzxudW1iZXI+KG5leHRSb3dbbmV3SW5kZXhdKSwgY2FzdFRvPG51bWJlcj4ocm93W25ld0luZGV4ICsgMV0pKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdGVwczogUmF3RWRpdFN0ZXBbXSA9IFtdO1xuICBsZXQgb2xkSW5kZXggPSAwO1xuICBsZXQgbmV3SW5kZXggPSAwO1xuXG4gIHdoaWxlIChvbGRJbmRleCA8IG9sZExlbmd0aCAmJiBuZXdJbmRleCA8IG5ld0xlbmd0aCkge1xuICAgIGlmIChpc0RlZXBFcXVhbChvbGRBcnJheVtvbGRJbmRleF0sIG5ld0FycmF5W25ld0luZGV4XSkpIHtcbiAgICAgIHN0ZXBzLnB1c2goeyBraW5kOiAna2VlcCcsIG5ld0luZGV4LCBvbGRJbmRleCB9KTtcbiAgICAgIG9sZEluZGV4Kys7XG4gICAgICBuZXdJbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVtb3ZhbFJvdyA9IGNhc3RUbzxudW1iZXJbXT4oY29tbW9uTGVuZ3Roc1tvbGRJbmRleCArIDFdKTtcbiAgICBjb25zdCBpbnNlcnRpb25Sb3cgPSBjYXN0VG88bnVtYmVyW10+KGNvbW1vbkxlbmd0aHNbb2xkSW5kZXhdKTtcbiAgICBjb25zdCByZW1vdmFsQ29tbW9uTGVuZ3RoID0gY2FzdFRvPG51bWJlcj4ocmVtb3ZhbFJvd1tuZXdJbmRleF0pO1xuICAgIGNvbnN0IGluc2VydGlvbkNvbW1vbkxlbmd0aCA9IGNhc3RUbzxudW1iZXI+KGluc2VydGlvblJvd1tuZXdJbmRleCArIDFdKTtcbiAgICBpZiAocmVtb3ZhbENvbW1vbkxlbmd0aCA+PSBpbnNlcnRpb25Db21tb25MZW5ndGgpIHtcbiAgICAgIHN0ZXBzLnB1c2goeyBraW5kOiAncmVtb3ZlJywgbmV3SW5kZXg6IC0xLCBvbGRJbmRleCB9KTtcbiAgICAgIG9sZEluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ZXBzLnB1c2goeyBraW5kOiAnaW5zZXJ0JywgbmV3SW5kZXgsIG9sZEluZGV4OiAtMSB9KTtcbiAgICAgIG5ld0luZGV4Kys7XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG9sZEluZGV4IDwgb2xkTGVuZ3RoOyBvbGRJbmRleCsrKSB7XG4gICAgc3RlcHMucHVzaCh7IGtpbmQ6ICdyZW1vdmUnLCBuZXdJbmRleDogLTEsIG9sZEluZGV4IH0pO1xuICB9XG5cbiAgZm9yICg7IG5ld0luZGV4IDwgbmV3TGVuZ3RoOyBuZXdJbmRleCsrKSB7XG4gICAgc3RlcHMucHVzaCh7IGtpbmQ6ICdpbnNlcnQnLCBuZXdJbmRleCwgb2xkSW5kZXg6IC0xIH0pO1xuICB9XG5cbiAgcmV0dXJuIHN0ZXBzO1xufVxuXG5mdW5jdGlvbiBjaGVja0NhcnJpZXNJbmRlbnQoaXRlbTogQ1NULkNvbGxlY3Rpb25JdGVtLCBpbmRlbnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gQ1NULnN0cmluZ2lmeShpdGVtKS5yZXBsYWNlKC9eXFxuKy8sICcnKS5zdGFydHNXaXRoKCcgJy5yZXBlYXQoaW5kZW50KSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSGFzQW5jaG9yT3JBbGlhcyhjb250ZW50czogUGFyc2VkTm9kZSk6IGJvb2xlYW4ge1xuICBsZXQgaGFzQW5jaG9yT3JBbGlhcyA9IGZhbHNlO1xuXG4gIHZpc2l0KGNvbnRlbnRzLCB7XG4gICAgTm9kZShfa2V5OiB1bmtub3duLCBub2RlOiBOb2RlKTogc3ltYm9sIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICghaXNBbGlhcyhub2RlKSAmJiBub2RlLmFuY2hvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGhhc0FuY2hvck9yQWxpYXMgPSB0cnVlO1xuICAgICAgcmV0dXJuIHZpc2l0LkJSRUFLO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGhhc0FuY2hvck9yQWxpYXM7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSXNNZXJnZWFibGUob2xkVmFsdWU6IHVua25vd24sIG5ld1ZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoY2hlY2tJc1BsYWluT2JqZWN0KG9sZFZhbHVlKSAmJiBjaGVja0lzUGxhaW5PYmplY3QobmV3VmFsdWUpKSB8fCAoQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkgJiYgQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkpO1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgc3BsaWNlZCBibG9jayBhZ2FpbnN0IHRoZSBvbmUgdGhlIHBhcnNlLWFuZC1zdHJpbmdpZnkgcGF0aCB3b3VsZCBoYXZlIHdyaXR0ZW4gZm9yIHRoZSBzYW1lIHZhbHVlLlxuICpcbiAqIENvbXBhcmluZyB0aGUgdHdvIFBBUlNFRCB2YWx1ZXMgcmF0aGVyIHRoYW4gdGhlIHR3byB0ZXh0cyBpcyB0aGUgd2hvbGUgcG9pbnQ6IHRoZSB0ZXh0cyBhcmUgc3VwcG9zZWQgdG8gZGlmZmVyIOKAlCB0aGF0XG4gKiBpcyB0aGUgZm9ybWF0dGluZyB0aGlzIG1vZHVsZSBwcmVzZXJ2ZXMg4oCUIHdoaWxlIHRoZSB2YWx1ZXMgbXVzdCBub3QuIENvbXBhcmluZyBhZ2FpbnN0IHRoYXQgcGF0aCdzIG91dHB1dCByYXRoZXIgdGhhblxuICogYWdhaW5zdCBgbmV3RnJvbnRtYXR0ZXJgIGl0c2VsZiBpcyB3aGF0IG1ha2VzIHRoZSBndWFyYW50ZWUgZXhhY3QsIHNpbmNlIGJvdGggc2lkZXMgdGhlbiBjYXJyeSB0aGUgc2FtZSByb3VuZC10cmlwXG4gKiBsb3NzZXMsIGB1bmRlZmluZWRgIHZhbHVlcyBkcm9wcGVkIGFuZCB0aW1lc3RhbXBzIHJlYWQgYmFjayBhcyBkYXRlcyBhbW9uZyB0aGVtLlxuICpcbiAqIEBwYXJhbSBzcGxpY2VkQm9keSAtIFRoZSBzcGxpY2VkIGJsb2NrIHRleHQuXG4gKiBAcGFyYW0gbmV3RnJvbnRtYXR0ZXIgLSBUaGUgZnJvbnQgbWF0dGVyIHRoYXQgd2FzIHRvIGJlIHdyaXR0ZW4uXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBzcGxpY2VkIGJsb2NrIHJlYWRzIGJhY2sgYXMgdGhlIHZhbHVlIHRoZSBwYXJzZS1hbmQtc3RyaW5naWZ5IHBhdGggd291bGQgaGF2ZSB3cml0dGVuLlxuICovXG5mdW5jdGlvbiBjaGVja0lzU2VtYW50aWNNYXRjaChzcGxpY2VkQm9keTogc3RyaW5nLCBuZXdGcm9udG1hdHRlcjogb2JqZWN0KTogYm9vbGVhbiB7XG4gIGxldCBzcGxpY2VkVmFsdWU6IHVua25vd247XG5cbiAgdHJ5IHtcbiAgICBzcGxpY2VkVmFsdWUgPSBwYXJzZVlhbWwoc3BsaWNlZEJvZHkpO1xuICAgIC8qXG4gICAgICogdjggaWdub3JlIHN0YXJ0IC0tIEEgbmV0LCBub3QgYSBwYXRoOiBgcGFyc2VZYW1sYCBUSFJPV1Mgb24gYSBibG9jayBpdCBjYW5ub3QgcmVhZCByYXRoZXIgdGhhbiByZXBvcnRpbmcgaXQsIGFuZFxuICAgICAqIGEgc3BsaWNlIGNvdWxkIHByb2R1Y2Ugb25lLiBBIDM2IDAwMC1tdXRhdGlvbiBkaWZmZXJlbnRpYWwgZnV6eiBmb3VuZCA5MyB0aGF0IGRpZCwgZXZlcnkgb25lIG9mIHRoZW0gdGhlXG4gICAgICogdmFsdWVsZXNzLWl0ZW0gc2hhcGUgYG5vcm1hbGl6ZUl0ZW1JbmRlbnRzYCBub3cgcmVwYWlycywgYW5kIG5vbmUgYXQgYWxsIGFmdGVyd2FyZHMg4oCUIHNvIHRoZXJlIGlzIG5vIGlucHV0IGxlZnRcbiAgICAgKiB0byBwaW4gdGhpcyB3aXRoLCBhbmQgdGhlIGNvbnRyYWN0IHRoYXQgaXQgdXBob2xkcyAoZGVjbGluZSwgbmV2ZXIgdGhyb3cpIGlzIHRoZSBvbmUgdGhpcyBtb2R1bGUncyBjYWxsZXJzIHJlbHlcbiAgICAgKiBvbi4gRG8gbm90IGRlbGV0ZSBpdCBvbiB0aGUgc3RyZW5ndGggb2YgdGhhdDogaXQgaXMgdGhlIHJlYXNvbiBhIGZ1dHVyZSBzaGFwZSBpcyBhIGZhbGxiYWNrIHJhdGhlciB0aGFuIGEgY3Jhc2guXG4gICAgICovXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICB9XG5cbiAgcmV0dXJuIGlzRGVlcEVxdWFsKHNwbGljZWRWYWx1ZSwgcGFyc2VZYW1sKHN0cmluZ2lmeVlhbWwobmV3RnJvbnRtYXR0ZXIpKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1hcEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBpbmRlbnQ6IG51bWJlcik6IENTVC5Db2xsZWN0aW9uSXRlbSB8IG51bGwge1xuICBjb25zdCBmcmFnbWVudCA9IHN0cmluZ2lmeSh7IFtrZXldOiB2YWx1ZSB9LCBPQlNJRElBTl9TVFJJTkdJRllfT1BUSU9OUyk7XG4gIC8vIEFuIGVtcHR5IG1hcHBpbmcgbWVhbnMgdGhlIHZhbHVlIGlzIGB1bmRlZmluZWRgLCB3aGljaCB0aGUgcmV3cml0ZSBwYXRoIGRyb3BzIGFzIHdlbGwuIERyb3AgdGhlIGtleSB3aXRoIGl0LlxuICByZXR1cm4gZnJhZ21lbnQudHJpbUVuZCgpID09PSBFTVBUWV9NQVBQSU5HX0ZSQUdNRU5UID8gbnVsbCA6IGxpZnRGcmFnbWVudEl0ZW0oZnJhZ21lbnQsIGluZGVudCwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNlcUl0ZW0odmFsdWU6IHVua25vd24sIGluZGVudDogbnVtYmVyKTogQ1NULkNvbGxlY3Rpb25JdGVtIHtcbiAgcmV0dXJuIGxpZnRGcmFnbWVudEl0ZW0oc3RyaW5naWZ5KFt2YWx1ZV0sIE9CU0lESUFOX1NUUklOR0lGWV9PUFRJT05TKSwgaW5kZW50LCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3BhY2VUb2tlbihpbmRlbnQ6IG51bWJlcik6IENTVC5Tb3VyY2VUb2tlbiB7XG4gIHJldHVybiB7XG4gICAgaW5kZW50LFxuICAgIG9mZnNldDogLTEsXG4gICAgc291cmNlOiAnICcucmVwZWF0KGluZGVudCksXG4gICAgdHlwZTogJ3NwYWNlJ1xuICB9O1xufVxuXG4vKipcbiAqIFJlYnVpbGRzIGEgYmxvY2sgbWFwJ3MgaXRlbXMgc28gaXQgcmVwcmVzZW50cyBgbmV3T2JqZWN0YCwgcmV1c2luZyBlYWNoIHN1cnZpdmluZyBrZXkncyBvd24gaXRlbSB0b2tlbi5cbiAqXG4gKiBUaGUgaXRlbXMgYXJlIHJlYnVpbHQgaW4gdGhlIE5FVyBvYmplY3QncyBrZXkgb3JkZXIgcmF0aGVyIHRoYW4gdGhlIHNvdXJjZSdzLCBzbyBhIGNhbGxiYWNrIHRoYXQgc29ydHMgb3IgcmVvcmRlcnNcbiAqIGtleXMgc3RpbGwgc29ydHMgdGhlbSDigJQgdGhlIHJlb3JkZXJlZCBrZXkgc2ltcGx5IHRha2VzIGl0cyBjb21tZW50LCBpdHMgcXVvdGluZyBhbmQgaXRzIHZhbHVlIGZvcm1hdHRpbmcgd2l0aCBpdC5cbiAqXG4gKiBgZmFsc2VgIG1lYW5zIHRoZSBjYWxsZXIgc2hvdWxkIHJlLWVtaXQgdGhpcyB3aG9sZSBjb2xsZWN0aW9uIGluc3RlYWQ6IGEgZHVwbGljYXRlIGtleSwgYSBrZXkgbm8gc3RyaW5nIGNhbiBuYW1lLCBvclxuICogYSBuZXN0ZWQgbWVyZ2UgdGhhdCBnYXZlIHVwLlxuICpcbiAqIEBwYXJhbSB0b2tlbiAtIFRoZSBibG9jayBtYXAgdG8gcmVidWlsZC5cbiAqIEBwYXJhbSBvbGRPYmplY3QgLSBUaGUgbWFwcGluZyBhcyB0aGUgc291cmNlIGhvbGRzIGl0LlxuICogQHBhcmFtIG5ld09iamVjdCAtIFRoZSBtYXBwaW5nIHRvIHdyaXRlLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdG9rZW4gbm93IHJlcHJlc2VudHMgYG5ld09iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGRpZE1lcmdlTWFwKHRva2VuOiBDU1QuQmxvY2tNYXAsIG9sZE9iamVjdDogR2VuZXJpY09iamVjdCwgbmV3T2JqZWN0OiBHZW5lcmljT2JqZWN0KTogYm9vbGVhbiB7XG4gIG5vcm1hbGl6ZUl0ZW1JbmRlbnRzKHRva2VuKTtcbiAgY29uc3QgaXRlbXNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBDU1QuQ29sbGVjdGlvbkl0ZW0+KCk7XG5cbiAgZm9yIChjb25zdCBpdGVtIG9mIHRva2VuLml0ZW1zKSB7XG4gICAgY29uc3Qga2V5ID0gcmVhZEl0ZW1LZXkoaXRlbSk7XG4gICAgaWYgKGtleSA9PT0gbnVsbCB8fCBpdGVtc0J5S2V5LmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaXRlbXNCeUtleS5zZXQoa2V5LCBpdGVtKTtcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZEl0ZW1zOiBDU1QuQ29sbGVjdGlvbkl0ZW1bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2tleSwgbmV3VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG5ld09iamVjdCkpIHtcbiAgICBjb25zdCBpdGVtID0gaXRlbXNCeUtleS5nZXQoa2V5KTtcblxuICAgIGlmICghaXRlbSkge1xuICAgICAgY29uc3QgY3JlYXRlZEl0ZW0gPSBjcmVhdGVNYXBJdGVtKGtleSwgbmV3VmFsdWUsIHRva2VuLmluZGVudCk7XG4gICAgICBpZiAoY3JlYXRlZEl0ZW0gIT09IG51bGwpIHtcbiAgICAgICAgbWVyZ2VkSXRlbXMucHVzaChjcmVhdGVkSXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIG1lcmdlSXRlbVZhbHVlKGl0ZW0sIG9sZE9iamVjdFtrZXldLCBuZXdWYWx1ZSwgdG9rZW4uaW5kZW50LCBmYWxzZSk7XG4gICAgbWVyZ2VkSXRlbXMucHVzaChpdGVtKTtcbiAgfVxuXG4gIGlmIChtZXJnZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmaW5hbGl6ZUl0ZW1zKG1lcmdlZEl0ZW1zKTtcbiAgdG9rZW4uaXRlbXMgPSBjYXN0VG88Q1NULkJsb2NrTWFwWydpdGVtcyddPihtZXJnZWRJdGVtcyk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFJlYnVpbGRzIGEgYmxvY2sgc2VxdWVuY2UncyBpdGVtcyBzbyBpdCByZXByZXNlbnRzIGBuZXdBcnJheWAsIHJldXNpbmcgdGhlIHRva2VuIG9mIGV2ZXJ5IGl0ZW0gdGhhdCBzdXJ2aXZlcy5cbiAqXG4gKiBAcGFyYW0gdG9rZW4gLSBUaGUgYmxvY2sgc2VxdWVuY2UgdG8gcmVidWlsZC5cbiAqIEBwYXJhbSBvbGRBcnJheSAtIFRoZSBzZXF1ZW5jZSBhcyB0aGUgc291cmNlIGhvbGRzIGl0LlxuICogQHBhcmFtIG5ld0FycmF5IC0gVGhlIHNlcXVlbmNlIHRvIHdyaXRlLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdG9rZW4gbm93IHJlcHJlc2VudHMgYG5ld0FycmF5YC5cbiAqL1xuZnVuY3Rpb24gZGlkTWVyZ2VTZXEodG9rZW46IENTVC5CbG9ja1NlcXVlbmNlLCBvbGRBcnJheTogcmVhZG9ubHkgdW5rbm93bltdLCBuZXdBcnJheTogcmVhZG9ubHkgdW5rbm93bltdKTogYm9vbGVhbiB7XG4gIGlmIChvbGRBcnJheS5sZW5ndGggKiBuZXdBcnJheS5sZW5ndGggPiBFRElUX1NDUklQVF9DRUxMX0xJTUlUKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbm9ybWFsaXplSXRlbUluZGVudHModG9rZW4pO1xuICBjb25zdCBtZXJnZWRJdGVtczogQ1NULkNvbGxlY3Rpb25JdGVtW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHN0ZXAgb2YgYnVpbGRFZGl0U2NyaXB0KG9sZEFycmF5LCBuZXdBcnJheSkpIHtcbiAgICBpZiAoc3RlcC5raW5kID09PSAnaW5zZXJ0Jykge1xuICAgICAgbWVyZ2VkSXRlbXMucHVzaChjcmVhdGVTZXFJdGVtKG5ld0FycmF5W3N0ZXAubmV3SW5kZXhdLCB0b2tlbi5pbmRlbnQpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW0gPSBjYXN0VG88Q1NULkNvbGxlY3Rpb25JdGVtPih0b2tlbi5pdGVtc1tzdGVwLm9sZEluZGV4XSk7XG4gICAgaWYgKHN0ZXAua2luZCA9PT0gJ21lcmdlJykge1xuICAgICAgbWVyZ2VJdGVtVmFsdWUoaXRlbSwgb2xkQXJyYXlbc3RlcC5vbGRJbmRleF0sIG5ld0FycmF5W3N0ZXAubmV3SW5kZXhdLCB0b2tlbi5pbmRlbnQsIHRydWUpO1xuICAgIH1cblxuICAgIG1lcmdlZEl0ZW1zLnB1c2goaXRlbSk7XG4gIH1cblxuICBpZiAobWVyZ2VkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZmluYWxpemVJdGVtcyhtZXJnZWRJdGVtcyk7XG4gIHRva2VuLml0ZW1zID0gY2FzdFRvPENTVC5CbG9ja1NlcXVlbmNlWydpdGVtcyddPihtZXJnZWRJdGVtcyk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdpdmVzIGEgbmVzdGVkIGNvbGxlY3Rpb24ncyBmaXJzdCBpdGVtIHRoZSBsZWFkaW5nIGluZGVudCBvZiBpdHMgb3duLCBzbyB0aGUgaXRlbXMgYmVjb21lIGludGVyY2hhbmdlYWJsZS5cbiAqXG4gKiBBIG5lc3RlZCBjb2xsZWN0aW9uJ3MgZmlyc3QgaXRlbSBjYXJyaWVzIG5vIGluZGVudCBpbiB0aGUgc291cmNlOiB0aGUgaW5kZW50IHNpdHMgaW4gd2hhdGV2ZXIgcHJlY2VkZXMgdGhlXG4gKiBjb2xsZWN0aW9uIOKAlCB0aGUgc2VwYXJhdG9yJ3MgdHJhaWxpbmcgc3BhY2VzLCBvciB0aGUgZGFzaCBvZiB0aGUgc2VxdWVuY2UgaXRlbSBpdCBiZWxvbmdzIHRvLiBFdmVyeSBsYXRlciBpdGVtXG4gKiBjYXJyaWVzIGl0cyBvd24uIFJlbW92aW5nIG9yIHJlb3JkZXJpbmcgdGhlIGZpcnN0IGl0ZW0gd2l0aG91dCByZXBhaXJpbmcgdGhhdCBsZWF2ZXMgdGhlIHN1cnZpdm9yIGRvdWJseSBpbmRlbnRlZCxcbiAqIHNvIHRoZSBpbmRlbnQgaXMgbW92ZWQgb3V0IG9mIHRoZSBzZXBhcmF0b3IgYW5kIG9udG8gdGhlIGl0ZW0gYmVmb3JlIGFueXRoaW5nIGlzIHJlYXJyYW5nZWQuXG4gKlxuICogVGhlIG9uZSBzaGFwZSBpdCBjYW5ub3QgcmVwYWlyIGlzIGEgZmlyc3QgaXRlbSB3cml0dGVuIElOTElORSB3aXRoIHdoYXQgcHJlY2VkZXMgaXQgKGAtIG5hbWU6IGFgKSwgd2hlcmUgdGhlcmUgaXMgbm9cbiAqIGluZGVudCB0byBtb3ZlIGJlY2F1c2UgdGhlIGl0ZW0gaXMgbm90IGF0IHRoZSBzdGFydCBvZiBpdHMgbGluZS4gU3VjaCBhIGNvbGxlY3Rpb24gaXMgcmUtZW1pdHRlZCB3aG9sZSBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSBwcmVjZWRpbmdUb2tlbnMgLSBUaGUgc2VwYXJhdG9yIHRva2VucyB0aGF0IHNpdCBiZXR3ZWVuIHRoZSBwYXJlbnQgYW5kIHRoZSBjb2xsZWN0aW9uLlxuICogQHBhcmFtIGNvbGxlY3Rpb24gLSBUaGUgY29sbGVjdGlvbiB3aG9zZSBmaXJzdCBpdGVtIGlzIHRvIGNhcnJ5IGl0cyBvd24gaW5kZW50LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgY29sbGVjdGlvbidzIGl0ZW1zIGFyZSBub3cgaW50ZXJjaGFuZ2VhYmxlLlxuICovXG5mdW5jdGlvbiBkaWROb3JtYWxpemVGaXJzdEl0ZW1JbmRlbnQocHJlY2VkaW5nVG9rZW5zOiBDU1QuU291cmNlVG9rZW5bXSB8IHVuZGVmaW5lZCwgY29sbGVjdGlvbjogQ29sbGVjdGlvblRva2VuKTogYm9vbGVhbiB7XG4gIC8vIEEgcGFyc2VkIGJsb2NrIGNvbGxlY3Rpb24gYWx3YXlzIGhvbGRzIGF0IGxlYXN0IG9uZSBpdGVtLCBvciBpdCB3b3VsZCBub3QgaGF2ZSBwYXJzZWQgYXMgYSBjb2xsZWN0aW9uIGF0IGFsbC5cbiAgY29uc3QgZmlyc3RJdGVtID0gY2FzdFRvPENTVC5Db2xsZWN0aW9uSXRlbT4oY29sbGVjdGlvbi5pdGVtc1swXSk7XG5cbiAgaWYgKGNvbGxlY3Rpb24uaW5kZW50ID09PSAwIHx8IGNoZWNrQ2Fycmllc0luZGVudChmaXJzdEl0ZW0sIGNvbGxlY3Rpb24uaW5kZW50KSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgbGFzdFRva2VuID0gcHJlY2VkaW5nVG9rZW5zPy5hdCgtMSk7XG4gIGlmIChsYXN0VG9rZW4/LnR5cGUgIT09ICdzcGFjZScgfHwgcHJlY2VkaW5nVG9rZW5zPy5hdChTRUNPTkRfVE9fTEFTVF9JTkRFWCk/LnR5cGUgIT09ICduZXdsaW5lJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByZWNlZGluZ1Rva2Vucy5wb3AoKTtcbiAgZmlyc3RJdGVtLnN0YXJ0LnVuc2hpZnQobGFzdFRva2VuKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGVtaXRNYXBJdGVtVG9rZW5zKHZhbHVlOiB1bmtub3duLCBpbmRlbnQ6IG51bWJlciwgc2hvdWxkUHJlZmVyRmxvdzogYm9vbGVhbik6IE1hcEl0ZW1Ub2tlbnMge1xuICBjb25zdCBmcmFnbWVudCA9IHNob3VsZFByZWZlckZsb3dcbiAgICA/IGAke1BMQUNFSE9MREVSX0tFWX06ICR7c3RyaW5naWZ5Rmxvdyh2YWx1ZSl9YFxuICAgIDogc3RyaW5naWZ5KHsgW1BMQUNFSE9MREVSX0tFWV06IHZhbHVlIH0sIE9CU0lESUFOX1NUUklOR0lGWV9PUFRJT05TKTtcbiAgY29uc3QgaXRlbSA9IGxpZnRGcmFnbWVudEl0ZW0oZnJhZ21lbnQsIGluZGVudCwgZmFsc2UpO1xuICByZXR1cm4geyBzZXBhcmF0b3JUb2tlbnM6IGNhc3RUbzxDU1QuU291cmNlVG9rZW5bXT4oaXRlbS5zZXApLCB2YWx1ZTogaXRlbS52YWx1ZSB9O1xufVxuXG5mdW5jdGlvbiBlbWl0U2VxSXRlbSh2YWx1ZTogdW5rbm93biwgaW5kZW50OiBudW1iZXIsIHNob3VsZFByZWZlckZsb3c6IGJvb2xlYW4pOiBDU1QuQ29sbGVjdGlvbkl0ZW0ge1xuICBjb25zdCBmcmFnbWVudCA9IHNob3VsZFByZWZlckZsb3cgPyBgLSAke3N0cmluZ2lmeUZsb3codmFsdWUpfWAgOiBzdHJpbmdpZnkoW3ZhbHVlXSwgT0JTSURJQU5fU1RSSU5HSUZZX09QVElPTlMpO1xuICByZXR1cm4gbGlmdEZyYWdtZW50SXRlbShmcmFnbWVudCwgaW5kZW50LCBmYWxzZSk7XG59XG5cbi8qKlxuICogTWFrZXMgdGhlIG1lcmdlZCBpdGVtcyBvZiBhIGNvbGxlY3Rpb24gam9pbmFibGUgYWdhaW4sIHdoYXRldmVyIHRoZSBtZXJnZSBkaWQgdG8gdGhlaXIgb3JkZXIuXG4gKlxuICogQW4gaXRlbSB0aGF0IHdhcyBub3QgZmlyc3QgY2FuIGNhcnJ5IHRoZSBibGFuayBsaW5lIHRoYXQgc2VwYXJhdGVkIGl0IGZyb20gaXRzIHByZWRlY2Vzc29yLCB3aGljaCBiZWNvbWVzIGEgbGVhZGluZ1xuICogYmxhbmsgbGluZSBvbmNlIGl0IElTIGZpcnN0LCBhbmQgbm90aGluZyBpbiB0aGUgaXRlbSB0b2tlbnMgdGhlbXNlbHZlcyBzaG93cyBpdC4gRXZlcnkgaXRlbSBhbHJlYWR5IGVuZHMgaW4gaXRzIG93blxuICogbmV3bGluZSwgYmVjYXVzZSBPYnNpZGlhbidzIGZyb250IG1hdHRlciBibG9jayBhbHdheXMgZW5kcyBpbiBvbmUsIHNvIHJlb3JkZXJpbmcgbmV2ZXIgam9pbnMgdHdvIGl0ZW1zIG9uIG9uZSBsaW5lLlxuICpcbiAqIEBwYXJhbSBpdGVtcyAtIFRoZSBtZXJnZWQgaXRlbXMsIG11dGF0ZWQgaW4gcGxhY2UuXG4gKi9cbmZ1bmN0aW9uIGZpbmFsaXplSXRlbXMoaXRlbXM6IENTVC5Db2xsZWN0aW9uSXRlbVtdKTogdm9pZCB7XG4gIGNvbnN0IGZpcnN0SXRlbSA9IGNhc3RUbzxDU1QuQ29sbGVjdGlvbkl0ZW0+KGl0ZW1zWzBdKTtcbiAgd2hpbGUgKGZpcnN0SXRlbS5zdGFydFswXT8udHlwZSA9PT0gJ25ld2xpbmUnKSB7XG4gICAgZmlyc3RJdGVtLnN0YXJ0LnNoaWZ0KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZW50TGluZXModGV4dDogc3RyaW5nLCBpbmRlbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChpbmRlbnQgPT09IDApIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIGNvbnN0IHBhZGRpbmcgPSAnICcucmVwZWF0KGluZGVudCk7XG4gIHJldHVybiB0ZXh0LnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUpID0+IGxpbmUgPT09ICcnID8gbGluZSA6IHBhZGRpbmcgKyBsaW5lKS5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBmcmVzaGx5IGVtaXR0ZWQgZnJhZ21lbnQgYW5kIGhhbmRzIGJhY2sgaXRzIG9uZSBjb2xsZWN0aW9uIGl0ZW0sIGluZGVudGVkIHRvIHNpdCB3aGVyZSBpdCBpcyBnb2luZy5cbiAqXG4gKiBUaGUgZnJhZ21lbnQncyBvd24gbGluZXMgYXJlIGluZGVudGVkIGJlZm9yZSBwYXJzaW5nLCBzbyBldmVyeSB0b2tlbiBpbnNpZGUgaXQgY2FycmllcyB0aGUgYWJzb2x1dGUgaW5kZW50IHRoZVxuICogb3V0cHV0IG5lZWRzLiBUaGUgaXRlbSdzIE9XTiBsZWFkaW5nIGluZGVudCBpcyBub3QgcGFydCBvZiB0aGF0IOKAlCBhIGZpcnN0IGl0ZW0gbmV2ZXIgY2FycmllcyBvbmUsIHRoZSBpbmRlbnQgYmVpbmdcbiAqIHN1cHBsaWVkIGJ5IHdoYXRldmVyIHByZWNlZGVzIHRoZSBjb2xsZWN0aW9uIOKAlCBzbyBpdCBpcyBwcmVwZW5kZWQgYXMgYSB0b2tlbiwgd2hpY2ggaXMgd2hhdCBtYWtlcyB0aGUgaXRlbSB1bmlmb3JtXG4gKiB3aXRoIGl0cyBuZXcgc2libGluZ3MgYW5kIHRoZXJlZm9yZSBmcmVlIHRvIGJlIHJlb3JkZXJlZCBvciB0byBiZWNvbWUgdGhlIGZpcnN0LlxuICpcbiAqIFRoZSBmcmFnbWVudCB3YXMgcHJvZHVjZWQgYnkgYHN0cmluZ2lmeWAgYSBsaW5lIGFib3ZlIHRoZSBjYWxsLCBhcyBhIG9uZS1pdGVtIGJsb2NrIGNvbGxlY3Rpb24sIHNvIGl0IGFsd2F5cyBwYXJzZXNcbiAqIGJhY2sgYXMgb25lIOKAlCB3aGljaCBpcyB3aHkgdGhpcyByZWFkcyB0aGUgaXRlbSBvdXQgcmF0aGVyIHRoYW4gY2hlY2tpbmcgZm9yIGl0LiBXZXJlIHRoYXQgZXZlciB0byBzdG9wIGhvbGRpbmcsIHRoZVxuICogcmVzdWx0aW5nIHRocm93IGlzIGNhdWdodCBieSBgc2V0RnJvbnRtYXR0ZXJgJ3Mgc2VhbSwgd2hpY2ggcmVwb3J0cyBpdCBhbmQgd3JpdGVzIHRoZSBibG9jayB0aGUgb3JkaW5hcnkgd2F5LlxuICpcbiAqIEBwYXJhbSBmcmFnbWVudCAtIFRoZSBlbWl0dGVkIFlBTUwgZnJhZ21lbnQsIGF0IGluZGVudCB6ZXJvLlxuICogQHBhcmFtIGluZGVudCAtIFRoZSBpbmRlbnQgdGhlIGl0ZW0gd2lsbCBzaXQgYXQuXG4gKiBAcGFyYW0gc2hvdWxkQ2FycnlJbmRlbnQgLSBXaGV0aGVyIHRvIHByZXBlbmQgdGhlIGl0ZW0ncyBvd24gbGVhZGluZyBpbmRlbnQgdG9rZW4uXG4gKiBAcmV0dXJucyBUaGUgaXRlbS5cbiAqL1xuZnVuY3Rpb24gbGlmdEZyYWdtZW50SXRlbShmcmFnbWVudDogc3RyaW5nLCBpbmRlbnQ6IG51bWJlciwgc2hvdWxkQ2FycnlJbmRlbnQ6IGJvb2xlYW4pOiBDU1QuQ29sbGVjdGlvbkl0ZW0ge1xuICBjb25zdCByb290ID0gcGFyc2VEb2N1bWVudChpbmRlbnRMaW5lcyhmcmFnbWVudCwgaW5kZW50KSwgeyBrZWVwU291cmNlVG9rZW5zOiB0cnVlIH0pLmNvbnRlbnRzPy5zcmNUb2tlbjtcbiAgY29uc3QgaXRlbSA9IGNhc3RUbzxDU1QuQ29sbGVjdGlvbkl0ZW0+KGNhc3RUbzxDb2xsZWN0aW9uVG9rZW4+KHJvb3QpLml0ZW1zWzBdKTtcblxuICBpZiAoc2hvdWxkQ2FycnlJbmRlbnQgJiYgaW5kZW50ID4gMCkge1xuICAgIGl0ZW0uc3RhcnQudW5zaGlmdChjcmVhdGVTcGFjZVRva2VuKGluZGVudCkpO1xuICB9XG5cbiAgcmV0dXJuIGl0ZW07XG59XG5cbi8qKlxuICogUmV3cml0ZXMgYW4gaXRlbSdzIHZhbHVlIGluIHBsYWNlIHdoZXJlIGl0IGNhbiwgYW5kIHJlLWVtaXRzIHRoZSB3aG9sZSB2YWx1ZSB3aGVyZSBpdCBjYW5ub3QuXG4gKlxuICogQHBhcmFtIGl0ZW0gLSBUaGUgY29sbGVjdGlvbiBpdGVtIHRvIHJld3JpdGUgdGhlIHZhbHVlIG9mLlxuICogQHBhcmFtIG9sZFZhbHVlIC0gVGhlIHZhbHVlIHRoZSBzb3VyY2UgaG9sZHMuXG4gKiBAcGFyYW0gbmV3VmFsdWUgLSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gKiBAcGFyYW0gcGFyZW50SW5kZW50IC0gVGhlIGluZGVudCBvZiB0aGUgY29sbGVjdGlvbiB0aGUgaXRlbSBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGlzU2VxSXRlbSAtIFdoZXRoZXIgdGhlIGl0ZW0gaXMgYSBzZXF1ZW5jZSBpdGVtLCB3aGljaCBjYXJyaWVzIG5vIGBzZXBgIGFuZCBubyBrZXkuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlSXRlbVZhbHVlKGl0ZW06IENTVC5Db2xsZWN0aW9uSXRlbSwgb2xkVmFsdWU6IHVua25vd24sIG5ld1ZhbHVlOiB1bmtub3duLCBwYXJlbnRJbmRlbnQ6IG51bWJlciwgaXNTZXFJdGVtOiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChpc0RlZXBFcXVhbChvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgLy8gVW50b3VjaGVkOiBpdHMgYnl0ZXMgc3RheSBleGFjdGx5IGFzIGl0cyBhdXRob3Igd3JvdGUgdGhlbS4gVGhpcyBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhlIG1vZHVsZS5cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB2YWx1ZVRva2VuID0gaXRlbS52YWx1ZTtcbiAgY29uc3QgcHJlY2VkaW5nVG9rZW5zID0gaXNTZXFJdGVtID8gaXRlbS5zdGFydCA6IGl0ZW0uc2VwO1xuXG4gIGlmIChcbiAgICAodmFsdWVUb2tlbj8udHlwZSA9PT0gJ2Jsb2NrLW1hcCcgJiYgY2hlY2tJc1BsYWluT2JqZWN0KG9sZFZhbHVlKSAmJiBjaGVja0lzUGxhaW5PYmplY3QobmV3VmFsdWUpXG4gICAgICAmJiBkaWROb3JtYWxpemVGaXJzdEl0ZW1JbmRlbnQocHJlY2VkaW5nVG9rZW5zLCB2YWx1ZVRva2VuKSAmJiBkaWRNZXJnZU1hcCh2YWx1ZVRva2VuLCBvbGRWYWx1ZSwgbmV3VmFsdWUpKSB8fCAodmFsdWVUb2tlbj8udHlwZSA9PT0gJ2Jsb2NrLXNlcScgJiYgQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkgJiYgQXJyYXkuaXNBcnJheShuZXdWYWx1ZSlcbiAgICAgICAgJiYgZGlkTm9ybWFsaXplRmlyc3RJdGVtSW5kZW50KHByZWNlZGluZ1Rva2VucywgdmFsdWVUb2tlbikgJiYgZGlkTWVyZ2VTZXEodmFsdWVUb2tlbiwgb2xkVmFsdWUsIG5ld1ZhbHVlKSlcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVwbGFjZUl0ZW1WYWx1ZShpdGVtLCBuZXdWYWx1ZSwgcGFyZW50SW5kZW50LCB2YWx1ZVRva2VuPy50eXBlID09PSAnZmxvdy1jb2xsZWN0aW9uJywgaXNTZXFJdGVtKTtcbn1cblxuLyoqXG4gKiBHaXZlcyBldmVyeSBpdGVtIG9mIGEgY29sbGVjdGlvbiB0aGUgaW5kZW50IG9mIGl0cyBvd24gbGluZSwgc28gdGhhdCBhbnkgb2YgdGhlbSBjYW4gYmUgcmVtb3ZlZCBvciBtb3ZlZC5cbiAqXG4gKiBBbiBpdGVtIHdpdGggTk8gVkFMVUUg4oCUIGEgYmFyZSBgLWAsIG9yIGBrZXk6YCB3aXRoIG5vdGhpbmcgYWZ0ZXIgaXQg4oCUIGFic29yYnMgdGhlIG5ld2xpbmUgdGhhdCBlbmRzIGl0cyBsaW5lIEFORCB0aGVcbiAqIGluZGVudCBvZiB0aGUgbGluZSBhZnRlciBpdCwgYmVjYXVzZSB0aGUgcGFyc2VyIGhhcyBub3RoaW5nIGVsc2UgdG8gaGFuZyB0aGVtIG9uLiBSZW1vdmluZyBvciBtb3Zpbmcgc3VjaCBhbiBpdGVtXG4gKiB0aGVyZWZvcmUgdGFrZXMgaXRzIHN1Y2Nlc3NvcidzIGluZGVudCB3aXRoIGl0LCBhbmQgdGhlIGJsb2NrIHRoYXQgY29tZXMgYmFjayBkb2VzIG5vdCBwYXJzZSBhdCBhbGwuXG4gKlxuICogTWVhc3VyZWQ6IG92ZXIgYSAzNiAwMDAtbXV0YXRpb24gZGlmZmVyZW50aWFsIGZ1enogdGhpcyBPTkUgc2hhcGUgYWNjb3VudGVkIGZvciBldmVyeSBzcGxpY2UgdGhlIHNhZmV0eSBuZXQgaGFkIHRvXG4gKiByZWZ1c2Ugb24gdW5yZWFkYWJsZSBvdXRwdXQg4oCUIDkzIG9mIHRoZW0g4oCUIHNvIGl0IGlzIGEgZmlkZWxpdHkgZml4IHJhdGhlciB0aGFuIGEgY29ycmVjdG5lc3Mgb25lLCB0aGUgc2FmZXR5IG5ldFxuICogaGF2aW5nIGFscmVhZHkgbWFkZSBlYWNoIG9mIHRob3NlIGEgZmFsbGJhY2suXG4gKlxuICogQHBhcmFtIGNvbGxlY3Rpb24gLSBUaGUgY29sbGVjdGlvbiB3aG9zZSBpdGVtcyBhcmUgdG8gY2FycnkgdGhlaXIgb3duIGluZGVudC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplSXRlbUluZGVudHMoY29sbGVjdGlvbjogQ29sbGVjdGlvblRva2VuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBjb2xsZWN0aW9uLml0ZW1zLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IG5leHRJdGVtID0gY2FzdFRvPENTVC5Db2xsZWN0aW9uSXRlbSB8IHVuZGVmaW5lZD4oY29sbGVjdGlvbi5pdGVtc1tpbmRleCArIDFdKTtcbiAgICBpZiAoIW5leHRJdGVtIHx8IGl0ZW0udmFsdWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEEgbWFwIGl0ZW0gaGFuZ3MgdGhlbSBvbiBpdHMgYHNlcGAsIGEgc2VxdWVuY2UgaXRlbSBvbiBpdHMgYHN0YXJ0YCwgdGhhdCBiZWluZyBhbGwgaXQgaGFzLlxuICAgIGNvbnN0IHRyYWlsaW5nVG9rZW5zID0gaXRlbS5zZXA/Lmxlbmd0aCA/IGl0ZW0uc2VwIDogaXRlbS5zdGFydDtcbiAgICBjb25zdCBsYXN0VG9rZW4gPSB0cmFpbGluZ1Rva2Vucy5hdCgtMSk7XG4gICAgaWYgKGxhc3RUb2tlbj8udHlwZSAhPT0gJ3NwYWNlJyB8fCB0cmFpbGluZ1Rva2Vucy5hdChTRUNPTkRfVE9fTEFTVF9JTkRFWCk/LnR5cGUgIT09ICduZXdsaW5lJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdHJhaWxpbmdUb2tlbnMucG9wKCk7XG4gICAgbmV4dEl0ZW0uc3RhcnQudW5zaGlmdChsYXN0VG9rZW4pO1xuICB9XG59XG5cbi8qKlxuICogTmFtZXMgdGhlIGtleSBhbiBpdGVtIGlzIGFkZHJlc3NlZCBieSwgb3IgYG51bGxgIHdoZW4gbm8gc3RyaW5nIGNhbiBuYW1lIGl0LlxuICpcbiAqIGByZXNvbHZlQXNTY2FsYXJgIHlpZWxkcyB0aGUgc2NhbGFyJ3MgVEVYVCByYXRoZXIgdGhhbiBhIHNjaGVtYS1yZXNvbHZlZCB2YWx1ZSwgc28gdGhlIGFuc3dlciBpcyBhbHdheXMgYSBzdHJpbmcg4oCUXG4gKiBhbmQgaXQgaXMgdGhlIHNhbWUgc3RyaW5nIHRoZSBwbGFpbi1vYmplY3QgcHJvamVjdGlvbiBib3RoIHNpZGVzIG9mIHRoZSBtZXJnZSBhcmUgY29tcGFyZWQgdGhyb3VnaCwgd2hpY2ggaXMgd2hhdFxuICogbGV0cyBhIGA0MjpgIGtleSBtYXRjaCB0aGUgcHJvamVjdGlvbidzIGAnNDInYCB3aXRob3V0IHF1b3RpbmcgaXQgb24gdGhlIHdheSBvdXQuXG4gKlxuICogQHBhcmFtIGl0ZW0gLSBUaGUgaXRlbSB0byBuYW1lIHRoZSBrZXkgb2YuXG4gKiBAcmV0dXJucyBUaGUga2V5LCBvciBgbnVsbGAgd2hlbiB0aGUga2V5IGlzIGEgY29sbGVjdGlvbiByYXRoZXIgdGhhbiBhIHNjYWxhci5cbiAqL1xuZnVuY3Rpb24gcmVhZEl0ZW1LZXkoaXRlbTogQ1NULkNvbGxlY3Rpb25JdGVtKTogbnVsbCB8IHN0cmluZyB7XG4gIHJldHVybiAhaXRlbS5rZXkgfHwgIUNTVC5pc1NjYWxhcihpdGVtLmtleSkgPyBudWxsIDogY2FzdFRvPFJlc29sdmVkU2NhbGFyPihDU1QucmVzb2x2ZUFzU2NhbGFyKGl0ZW0ua2V5KSkudmFsdWU7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VJdGVtVmFsdWUoaXRlbTogQ1NULkNvbGxlY3Rpb25JdGVtLCBuZXdWYWx1ZTogdW5rbm93biwgaW5kZW50OiBudW1iZXIsIHNob3VsZFByZWZlckZsb3c6IGJvb2xlYW4sIGlzU2VxSXRlbTogYm9vbGVhbik6IHZvaWQge1xuICBpZiAoaXNTZXFJdGVtKSB7XG4gICAgc2V0SXRlbVZhbHVlKGl0ZW0sIGVtaXRTZXFJdGVtKG5ld1ZhbHVlLCBpbmRlbnQsIHNob3VsZFByZWZlckZsb3cpLnZhbHVlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBlbWl0dGVkVG9rZW5zID0gZW1pdE1hcEl0ZW1Ub2tlbnMobmV3VmFsdWUsIGluZGVudCwgc2hvdWxkUHJlZmVyRmxvdyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBzZXBgIGlzIHRoZSBgeWFtbGAgcGFja2FnZSdzIG93biBwcm9wZXJ0eSBuYW1lLlxuICBpdGVtLnNlcCA9IGVtaXR0ZWRUb2tlbnMuc2VwYXJhdG9yVG9rZW5zO1xuICBzZXRJdGVtVmFsdWUoaXRlbSwgZW1pdHRlZFRva2Vucy52YWx1ZSk7XG59XG5cbi8qKlxuICogQXNzaWducyBhbiBpdGVtJ3MgdmFsdWUgdG9rZW4sIHJlbW92aW5nIHRoZSBwcm9wZXJ0eSBvdXRyaWdodCB3aGVuIHRoZSBlbWl0dGVkIHZhbHVlIGhhcyBub25lLlxuICpcbiAqIEEga2V5IHdpdGggYSBgbnVsbGAgdmFsdWUgZW1pdHMgYXMgYGtleTpgIHdpdGggbm90aGluZyBhZnRlciB0aGUgc2VwYXJhdG9yLCBzbyB0aGUgaXRlbSBnZW51aW5lbHkgaGFzIG5vIHZhbHVlXG4gKiB0b2tlbiDigJQgYW5kIHVuZGVyIGBleGFjdE9wdGlvbmFsUHJvcGVydHlUeXBlc2AgdGhhdCBpcyBhIHByb3BlcnR5IHRvIGRlbGV0ZSwgbm90IG9uZSB0byBzZXQgdG8gYHVuZGVmaW5lZGAuXG4gKlxuICogQHBhcmFtIGl0ZW0gLSBUaGUgaXRlbSB0byBhc3NpZ24gdGhlIHZhbHVlIHRva2VuIG9mLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRva2VuLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBlbWl0dGVkIHZhbHVlIGhhcyBub25lLlxuICovXG5mdW5jdGlvbiBzZXRJdGVtVmFsdWUoaXRlbTogQ1NULkNvbGxlY3Rpb25JdGVtLCB2YWx1ZTogQ1NULlRva2VuIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZGVsZXRlIGl0ZW0udmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaXRlbS52YWx1ZSA9IHZhbHVlO1xufVxuXG4vKipcbiAqIFNwbGljZXMgdGhlIHRleHQgSU5TSURFIGEgZnJvbnQgbWF0dGVyIGJsb2NrJ3MgZGVsaW1pdGVycywgbGVhdmluZyBib3RoIGAtLS1gIGxpbmVzIHVudG91Y2hlZC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIGZyb250IG1hdHRlciBibG9jaydzIHRleHQuXG4gKiBAcGFyYW0gbmV3RnJvbnRtYXR0ZXIgLSBUaGUgZnJvbnQgbWF0dGVyIHRvIHdyaXRlLlxuICogQHJldHVybnMgVGhlIG5ldyBibG9jayB0ZXh0LCBvciBgbnVsbGAgd2hlbiB0aGUgc3BsaWNlIGNvdWxkIG5vdCBiZSBwcm92ZWQgZmFpdGhmdWwuXG4gKi9cbmZ1bmN0aW9uIHNwbGljZUZyb250bWF0dGVyQm9keShzb3VyY2U6IHN0cmluZywgbmV3RnJvbnRtYXR0ZXI6IG9iamVjdCk6IG51bGwgfCBzdHJpbmcge1xuICBjb25zdCB0b2tlbnMgPSBbLi4ubmV3IFBhcnNlcigpLnBhcnNlKHNvdXJjZSldO1xuICBjb25zdCBkb2N1bWVudHMgPSBbLi4ubmV3IENvbXBvc2VyKHsga2VlcFNvdXJjZVRva2VuczogdHJ1ZSB9KS5jb21wb3NlKHRva2VucywgdHJ1ZSldO1xuICAvLyBBIHNlY29uZCBkb2N1bWVudCBpcyByZWFjaGFibGUg4oCUIGEgYC4uLmAgZW5kIG1hcmtlciBzdGFydHMgb25lIOKAlCBhbmQgc3BsaWNpbmcgdGhlIGZpcnN0IHdvdWxkIGVtaXQgYm90aC5cbiAgY29uc3QgZG9jdW1lbnQgPSBkb2N1bWVudHMubGVuZ3RoID09PSAxID8gZG9jdW1lbnRzWzBdIDogdW5kZWZpbmVkO1xuXG4gIGlmICghZG9jdW1lbnQgfHwgZG9jdW1lbnQuZXJyb3JzLmxlbmd0aCA+IDAgfHwgZG9jdW1lbnQud2FybmluZ3Muc29tZSgod2FybmluZykgPT4gd2FybmluZy5jb2RlID09PSBVTlJFU09MVkVEX1RBR19XQVJOSU5HX0NPREUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBjb250ZW50cyA9IGRvY3VtZW50LmNvbnRlbnRzO1xuICBjb25zdCByb290VG9rZW4gPSBjb250ZW50cz8uc3JjVG9rZW47XG4gIC8vIEFuIGFuY2hvciBpcyBhIHNlY29uZCBuYW1lIGZvciBhIG5vZGUsIHNvIGEgc3BsaWNlIHRoYXQgbW92ZXMgb3IgZHJvcHMgb25lIG9mIHRoZSB0d28gc2lsZW50bHkgcmV3cml0ZXMgdGhlIG90aGVyLlxuICAvLyBOb3RoaW5nIGhlcmUgaXMgd29ydGggdGhhdCByaXNrIGZvciBhIGNvbnN0cnVjdCBPYnNpZGlhbidzIG93biBwcm9wZXJ0eSBlZGl0b3IgY2Fubm90IHByb2R1Y2UuXG4gIGlmICghY29udGVudHMgfHwgcm9vdFRva2VuPy50eXBlICE9PSAnYmxvY2stbWFwJyB8fCBjaGVja0hhc0FuY2hvck9yQWxpYXMoY29udGVudHMpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBIGJsb2NrLW1hcCByb290IGFsd2F5cyBwcm9qZWN0cyB0byBhIHBsYWluIG9iamVjdCwgc28gdGhpcyBpcyBhIGNhc3QgcmF0aGVyIHRoYW4gYSBjaGVjay4gQW55dGhpbmcgdGhhdCBtYWRlIGl0XG4gIC8vIHVudHJ1ZSB3b3VsZCBzdGlsbCBiZSBjYXVnaHQgZG93bnN0cmVhbTogdGhlIG1lcmdlIHdvdWxkIHdyaXRlIGEgbWFwcGluZyB0aGUgc2FmZXR5IG5ldCB0aGVuIHJlZnVzZXMuXG4gIGNvbnN0IG9sZEZyb250bWF0dGVyID0gY2FzdFRvPEdlbmVyaWNPYmplY3Q+KGRvY3VtZW50LnRvSlMoKSk7XG5cbiAgaWYgKCFkaWRNZXJnZU1hcChyb290VG9rZW4sIG9sZEZyb250bWF0dGVyLCBjYXN0VG88R2VuZXJpY09iamVjdD4obmV3RnJvbnRtYXR0ZXIpKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gRXZlcnkgdG9rZW4sIG5vdCBqdXN0IHRoZSByb290IGNvbGxlY3Rpb24nczogYSBjb21tZW50IGJlZm9yZSBvciBhZnRlciB0aGUgbWFwcGluZyBiZWxvbmdzIHRvIHRoZSBET0NVTUVOVCwgc29cbiAgLy8gYENTVC5zdHJpbmdpZnkoY29udGVudHMuc3JjVG9rZW4pYCBhbG9uZSBzaWxlbnRseSBkcm9wcyBib3RoLlxuICBjb25zdCBlbWl0dGVkQm9keSA9IHRva2Vucy5tYXAoKHRva2VuKSA9PiBDU1Quc3RyaW5naWZ5KHRva2VuKSkuam9pbignJyk7XG5cbiAgLy8gVGhlIHJlcGxhY2VkIHJlZ2lvbiBoYXMgdG8gZW5kIGluIGV4YWN0bHkgb25lIG5ld2xpbmUsIGFzIE9ic2lkaWFuJ3MgZnJvbnQgbWF0dGVyIGJsb2NrIGFsd2F5cyBkb2VzLCBvciB0aGUgY2xvc2luZ1xuICAvLyBgLS0tYCBtb3ZlcyBvZmYgaXRzIG93biBsaW5lLiBBIGJsb2NrIHdob3NlIGxhc3Qga2V5IHdhcyBkcm9wcGVkIGNhbiBlbWl0IG5vbmUsIHNvIGl0IGlzIG5vcm1hbGl6ZWQsIG5vdCB0cnVzdGVkLlxuICBjb25zdCBzcGxpY2VkQm9keSA9IGAke2VtaXR0ZWRCb2R5LnJlcGxhY2UoVFJBSUxJTkdfTkVXTElORV9SRUdfRVhQLCAnJyl9XFxuYDtcblxuICByZXR1cm4gY2hlY2tJc1NlbWFudGljTWF0Y2goc3BsaWNlZEJvZHksIG5ld0Zyb250bWF0dGVyKSA/IHNwbGljZWRCb2R5IDogbnVsbDtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5Rmxvdyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiBzdHJpbmdpZnkodmFsdWUsIHtcbiAgICAuLi5PQlNJRElBTl9TVFJJTkdJRllfT1BUSU9OUyxcbiAgICBjb2xsZWN0aW9uU3R5bGU6ICdmbG93JyxcbiAgICBmbG93Q29sbGVjdGlvblBhZGRpbmc6IGZhbHNlXG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsZ0JBQWdCO0FBQ3pCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQWlDUCxNQUFN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
|
|
359
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mcm9udG1hdHRlci1mb3JtYXR0aW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSZXdyaXRlcyBhIG5vdGUncyBZQU1MIGZyb250IG1hdHRlciBieSBzcGxpY2luZyBpdHMgY29uY3JldGUgc3ludGF4IHRyZWUsIHNvIGV2ZXJ5IHJlZ2lvbiBhIGNoYW5nZSBkb2VzIG5vdCByZWFjaFxuICoga2VlcHMgdGhlIGV4YWN0IGJ5dGVzIGl0cyBhdXRob3Igd3JvdGUg4oCUIGNvbW1lbnRzIGFuZCB0aGUgd2hpdGVzcGFjZSBpbnNpZGUgdGhlbSwgcXVvdGluZyBzdHlsZSwgYmxhbmsgbGluZXMsXG4gKiBpbmRlbnRhdGlvbiB3aWR0aCwgZmxvdyB2ZXJzdXMgYmxvY2sgY29sbGVjdGlvbnMsIGFuZCBmb2xkZWQgYW5kIGxpdGVyYWwgc2NhbGFycy5cbiAqXG4gKiBPYnNpZGlhbidzIG93biBgcHJvY2Vzc0Zyb250TWF0dGVyKClgIHBhcnNlcyB0aGUgYmxvY2sgdG8gYSBwbGFpbiBvYmplY3QgYW5kIHJlLXN0cmluZ2lmaWVzIHRoZSB3aG9sZSBvZiBpdCwgc28gYVxuICogY2FsbGJhY2sgdGhhdCBjaGFuZ2VzIG9uZSBrZXkgcmV3cml0ZXMgZXZlcnkgb3RoZXIuIFJlLWVtaXR0aW5nIHRoZSBwYXJzZWQgZG9jdW1lbnQgaW5zdGVhZCBvZiB0aGUgcmF3IHRleHQgZG9lcyBub3RcbiAqIGZpeCB0aGF0OiBmaXZlIG9mIHRoZSBsb3NzZXMgc3Vydml2ZSBldmVyeSBlbWl0IG9wdGlvbiB0aGUgYHlhbWxgIHBhY2thZ2Ugb2ZmZXJzLiBTcGxpY2luZyB0aGUgQ1NUIGRvZXMgZml4IGl0LFxuICogYmVjYXVzZSBhbiB1bnRvdWNoZWQgdG9rZW4gaXMgbmV2ZXIgcmUtZW1pdHRlZCBhdCBhbGwg4oCUIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZWVtZWxpL3lhbWwgfCB0aGUgbGlicmFyeX0ga2VlcHNcbiAqIGVhY2ggdG9rZW4ncyBvcmlnaW5hbCBzb3VyY2UgdGV4dCBhbmQge0BsaW5rIGh0dHBzOi8vZWVtZWxpLm9yZy95YW1sLyNjc3QtcGFyc2VyIHwgYENTVC5zdHJpbmdpZnlgfSBjb25jYXRlbmF0ZXMgaXQuXG4gKlxuICogVGhpcyBtb2R1bGUgaXMgREVMSUJFUkFURUxZIG5vdCBvbiB0aGUgZGVmYXVsdCBwYXRoLiBJdCBuZWVkcyB0aGUgYHlhbWxgIHBhY2thZ2UncyBDU1QgQVBJLCB3aGljaCBPYnNpZGlhbiBkb2VzIG5vdFxuICogaGFuZCB0byBwbHVnaW5zIHRocm91Z2ggaXRzIG1vZHVsZSBtYXAg4oCUIHRoYXQgbWFwIGlzIGBvYnNpZGlhbmAsIGBAY29kZW1pcnJvci8qYCBhbmQgYEBsZXplci8qYCBhbmQgbm90aGluZyBlbHNlIOKAlFxuICogc28gdGhlIHBhY2thZ2UgY2Fubm90IGJlIG1hcmtlZCBleHRlcm5hbCBhbmQgbGFuZHMgaW4gdGhlIGNvbnN1bWluZyBwbHVnaW4ncyBgbWFpbi5qc2AsIGFib3V0IDEwMCBLQiBvZiBpdC4gQSBwbHVnaW5cbiAqIG9wdHMgaW4gYnkgY2FsbGluZyB7QGxpbmsgZW5hYmxlRnJvbnRtYXR0ZXJGb3JtYXR0aW5nUHJlc2VydmF0aW9ufSBvbmNlLCBhbmQgb25seSBpdCBwYXlzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE5vZGUsXG4gIFBhcnNlZE5vZGVcbn0gZnJvbSAneWFtbCc7XG5cbmltcG9ydCB7XG4gIGNhc3RUbyxcbiAgaXNEZWVwRXF1YWxcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQgeyBpbnNlcnRBdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHtcbiAgZ2V0RnJvbnRNYXR0ZXJJbmZvLFxuICBwYXJzZVlhbWwsXG4gIHN0cmluZ2lmeVlhbWxcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHtcbiAgQ29tcG9zZXIsXG4gIENTVCxcbiAgaXNBbGlhcyxcbiAgcGFyc2VEb2N1bWVudCxcbiAgUGFyc2VyLFxuICBzdHJpbmdpZnksXG4gIHZpc2l0XG59IGZyb20gJ3lhbWwnO1xuXG5pbXBvcnQge1xuICBjaGVja0lzUGxhaW5PYmplY3QsXG4gIHJlZ2lzdGVyRnJvbnRtYXR0ZXJGb3JtYXR0aW5nUHJlc2VydmVyXG59IGZyb20gJy4vZnJvbnRtYXR0ZXIudHMnO1xuXG4vKipcbiAqIEEgYmxvY2sgb3IgZmxvdyBjb2xsZWN0aW9uIHRva2VuIHdob3NlIGl0ZW1zIHRoZSBzcGxpY2UgcmVhcnJhbmdlcy5cbiAqL1xudHlwZSBDb2xsZWN0aW9uVG9rZW4gPSBDU1QuQmxvY2tNYXAgfCBDU1QuQmxvY2tTZXF1ZW5jZTtcblxuLyoqXG4gKiBPbmUgc3RlcCBvZiB0aGUgZWRpdCBzY3JpcHQge0BsaW5rIGJ1aWxkRWRpdFNjcmlwdH0gZGVyaXZlcyBmb3IgYSBzZXF1ZW5jZS5cbiAqXG4gKiBga2VlcGAgcmV1c2VzIHRoZSBvbGQgaXRlbSdzIHRva2VuIHVudG91Y2hlZCwgYG1lcmdlYCByZXVzZXMgaXQgYW5kIHJld3JpdGVzIGl0cyB2YWx1ZSBpbiBwbGFjZSwgYW5kIGBpbnNlcnRgXG4gKiBlbWl0cyBhIGJyYW5kIG5ldyBpdGVtLiBBIHJlbW92YWwgcHJvZHVjZXMgbm8gc3RlcCBhdCBhbGwg4oCUIGl0IGlzIHNpbXBseSBhbiBvbGQgaW5kZXggbm8gc3RlcCBuYW1lcy5cbiAqL1xuaW50ZXJmYWNlIEVkaXRTdGVwIHtcbiAgcmVhZG9ubHkga2luZDogJ2luc2VydCcgfCAna2VlcCcgfCAnbWVyZ2UnO1xuICByZWFkb25seSBuZXdJbmRleDogbnVtYmVyO1xuICByZWFkb25seSBvbGRJbmRleDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBgc2VwYCBhbmQgYHZhbHVlYCB0b2tlbnMgb2YgYSBmcmVzaGx5IGVtaXR0ZWQgYmxvY2stbWFwIGl0ZW0sIHJlYWR5IHRvIGJlIHRyYW5zcGxhbnRlZCBvbnRvIGFuIGV4aXN0aW5nIG9uZS5cbiAqL1xuaW50ZXJmYWNlIE1hcEl0ZW1Ub2tlbnMge1xuICByZWFkb25seSBzZXBhcmF0b3JUb2tlbnM6IENTVC5Tb3VyY2VUb2tlbltdO1xuICByZWFkb25seSB2YWx1ZTogQ1NULlRva2VuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEEgc2VxdWVuY2UgbG9uZyBlbm91Z2ggdGhhdCB0aGUgcXVhZHJhdGljIGVkaXQgc2NyaXB0IHN0b3BzIGJlaW5nIHdvcnRoIGl0cyBjb3N0LlxuICpcbiAqIEEgZnJvbnQgbWF0dGVyIHNlcXVlbmNlIGlzIGEgdGFnIGxpc3Qgb3IgYW4gYWxpYXMgbGlzdCwgc28gdGhpcyBpcyBuZXZlciBhcHByb2FjaGVkIGluIHByYWN0aWNlOyBpdCBpcyBoZXJlIHNvIHRoYXQgYVxuICogcGF0aG9sb2dpY2FsIG9uZSBkZWdyYWRlcyB0byBhIHdob2xlLWNvbGxlY3Rpb24gcmUtZW1pdCBpbnN0ZWFkIG9mIHN0YWxsaW5nIHRoZSB3cml0ZSBxdWV1ZS5cbiAqL1xuY29uc3QgRURJVF9TQ1JJUFRfQ0VMTF9MSU1JVCA9IDEwXzAwMDtcblxuLyoqXG4gKiBXaGF0IGEgbWFwcGluZyBlbWl0cyBhcyB3aGVuIGV2ZXJ5IG9uZSBvZiBpdHMgdmFsdWVzIGlzIGB1bmRlZmluZWRgLCBpLmUuIHdoZW4gaXQgaGFzIG5vdGhpbmcgdG8gd3JpdGUgYXQgYWxsLlxuICovXG5jb25zdCBFTVBUWV9NQVBQSU5HX0ZSQUdNRU5UID0gJ3t9JztcblxuLyoqXG4gKiBUaGUgb3B0aW9ucyBPYnNpZGlhbiBpdHNlbGYgcGFzc2VzIHRvIGBzdHJpbmdpZnkoKWAsIHJlYWQgb3V0IG9mIGl0cyBidW5kbGUuXG4gKlxuICogRXZlcnkgZnJhZ21lbnQgdGhpcyBtb2R1bGUgZW1pdHMgZ29lcyB0aHJvdWdoIHRoZW0sIHNvIGEgZnJhZ21lbnQgaXQgd3JpdGVzIGlzIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBvbmUgdGhlXG4gKiBwYXJzZS1hbmQtc3RyaW5naWZ5IHBhdGggd291bGQgaGF2ZSB3cml0dGVuIGZvciB0aGUgc2FtZSB2YWx1ZS5cbiAqL1xuY29uc3QgT0JTSURJQU5fU1RSSU5HSUZZX09QVElPTlMgPSB7XG4gIGFsaWFzRHVwbGljYXRlT2JqZWN0czogZmFsc2UsXG4gIGxpbmVXaWR0aDogMCxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYG51bGxTdHJgIGlzIHRoZSBgeWFtbGAgcGFja2FnZSdzIG93biBvcHRpb24gbmFtZS5cbiAgbnVsbFN0cjogJydcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogVGhlIGtleSBhIGZyYWdtZW50IGlzIGVtaXR0ZWQgdW5kZXIgd2hlbiBvbmx5IGl0cyB2YWx1ZSBpcyB3YW50ZWQuIE5ldmVyIHJlYWNoZXMgdGhlIG91dHB1dC5cbiAqL1xuY29uc3QgUExBQ0VIT0xERVJfS0VZID0gJ2snO1xuXG4vKipcbiAqIFRoZSBgQXJyYXkuYXQoKWAgaW5kZXggb2YgdGhlIHRva2VuIGJlZm9yZSB0aGUgbGFzdCBvbmUsIHdoaWNoIGlzIHdoZXJlIGEgbmV3bGluZSBzaXRzIHdoZW4gYW4gaW5kZW50IGZvbGxvd3MgaXQuXG4gKi9cbmNvbnN0IFNFQ09ORF9UT19MQVNUX0lOREVYID0gLTI7XG5cbmNvbnN0IFRSQUlMSU5HX05FV0xJTkVfUkVHX0VYUCA9IC9cXG4kLztcblxuY29uc3QgVU5SRVNPTFZFRF9UQUdfV0FSTklOR19DT0RFID0gJ1RBR19SRVNPTFZFX0ZBSUxFRCc7XG5cbi8qKlxuICogT25lIHN0ZXAgb2YgdGhlIHJhdyBlZGl0IHNjcmlwdCwgYmVmb3JlIHJlbW92YWxzIGFyZSBmb2xkZWQgaW50byB0aGUgaW5zZXJ0aW9ucyB0aGF0IGZvbGxvdyB0aGVtLlxuICovXG5pbnRlcmZhY2UgUmF3RWRpdFN0ZXAge1xuICByZWFkb25seSBraW5kOiAnaW5zZXJ0JyB8ICdrZWVwJyB8ICdyZW1vdmUnO1xuICByZWFkb25seSBuZXdJbmRleDogbnVtYmVyO1xuICByZWFkb25seSBvbGRJbmRleDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoYXQgYENTVC5yZXNvbHZlQXNTY2FsYXJgIGhhbmRzIGJhY2sgZm9yIGEga2V5OiB0aGUgc2NhbGFyJ3Mgb3duIHRleHQsIG5ldmVyIGEgc2NoZW1hLXJlc29sdmVkIHZhbHVlLlxuICovXG5pbnRlcmZhY2UgUmVzb2x2ZWRTY2FsYXIge1xuICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGlzIG1vZHVsZSdzIGVuZ2luZSBhcyB0aGUgZnJvbnQgbWF0dGVyIGZvcm1hdHRpbmcgcHJlc2VydmVyIGZvciBldmVyeSB3cml0ZSB0aGlzIGxpYnJhcnkgcGVyZm9ybXMuXG4gKlxuICogQ2FsbCBpdCBvbmNlLCBmcm9tIGEgcGx1Z2luJ3MgYG9ubG9hZEltcGwoKWAuIEl0IHRha2VzIGVmZmVjdCBmb3IgYHByb2Nlc3NGcm9udG1hdHRlcigpYCwgYGFwcGx5RmlsZUNoYW5nZXMoKWAgYW5kXG4gKiBldmVyeSBvdGhlciBwYXRoIHRoYXQgcmVhY2hlcyBgc2V0RnJvbnRtYXR0ZXIoKWAsIGluY2x1ZGluZyB0aGUgb25lcyB0aGUgY2FsbGluZyBwbHVnaW4gZG9lcyBub3QgaW52b2tlIGl0c2VsZi5cbiAqXG4gKiBUaGVyZSBpcyBvbmUgcHJlc2VydmVyIHBlciByZWFsbSwgc28gdHdvIHBsdWdpbnMgdGhhdCBib3RoIGNhbGwgdGhpcyBzaW1wbHkgYWdyZWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVGcm9udG1hdHRlckZvcm1hdHRpbmdQcmVzZXJ2YXRpb24oKTogdm9pZCB7XG4gIHJlZ2lzdGVyRnJvbnRtYXR0ZXJGb3JtYXR0aW5nUHJlc2VydmVyKHByZXNlcnZlRnJvbnRtYXR0ZXJGb3JtYXR0aW5nKTtcbn1cblxuLyoqXG4gKiBSZXdyaXRlcyB0aGUgZnJvbnQgbWF0dGVyIG9mIGEgbm90ZSwga2VlcGluZyB0aGUgb3JpZ2luYWwgYnl0ZXMgb2YgZXZlcnl0aGluZyB0aGUgY2hhbmdlIGRvZXMgbm90IHJlYWNoLlxuICpcbiAqIEl0IGlzIHRoZSBlbmdpbmUge0BsaW5rIGVuYWJsZUZyb250bWF0dGVyRm9ybWF0dGluZ1ByZXNlcnZhdGlvbn0gcmVnaXN0ZXJzLCBhbmQgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBhcyB3ZWxsLlxuICpcbiAqIGBudWxsYCBtZWFucyBcInRoaXMgb25lIGlzIG5vdCBtaW5lXCI6IHRoZSBibG9jayBkb2VzIG5vdCBleGlzdCwgdGhlIG5ldyBmcm9udCBtYXR0ZXIgaXMgZW1wdHkgKGJvdGggYXJlIHRoZVxuICogcGFyc2UtYW5kLXN0cmluZ2lmeSBwYXRoJ3MgYnVzaW5lc3MsIHVuY2hhbmdlZCksIG9yIHRoZSBzcGxpY2UgY291bGQgbm90IGJlIHByb3ZlZCBmYWl0aGZ1bC4gVGhlIHByb29mIGlzIG5vdFxuICogaGFuZC13YXZlZCDigJQgdGhlIHNwbGljZWQgYmxvY2sgaXMgcmUtcGFyc2VkIGFuZCBjb21wYXJlZCBhZ2FpbnN0IHRoZSB2YWx1ZSB0aGUgcGFyc2UtYW5kLXN0cmluZ2lmeSBwYXRoIHdvdWxkIGhhdmVcbiAqIHByb2R1Y2VkIGZvciB0aGUgc2FtZSBpbnB1dCwgYW5kIGFueSBkaWZmZXJlbmNlIHJldHVybnMgYG51bGxgLiBUaGF0IGlzIHdoYXQgbWFrZXMgdGhpcyBzdHJpY3RseSBiZXR0ZXIgdGhhbiB0aGF0XG4gKiBwYXRoIG9yIGlkZW50aWNhbCB0byBpdCwgYW5kIG5ldmVyIHdvcnNlLlxuICpcbiAqIEBwYXJhbSBjb250ZW50IC0gVGhlIG5vdGUgdG8gcmV3cml0ZSB0aGUgZnJvbnQgbWF0dGVyIG9mLlxuICogQHBhcmFtIG5ld0Zyb250bWF0dGVyIC0gVGhlIGZyb250IG1hdHRlciB0byB3cml0ZS5cbiAqIEByZXR1cm5zIFRoZSBuZXcgbm90ZSwgb3IgYG51bGxgIHdoZW4gdGhlIGNhbGxlciBzaG91bGQgcGFyc2UgdGhlIGJsb2NrIGFuZCB3cml0ZSB0aGUgd2hvbGUgb2YgaXQgb3V0IGFnYWluIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVzZXJ2ZUZyb250bWF0dGVyRm9ybWF0dGluZyhjb250ZW50OiBzdHJpbmcsIG5ld0Zyb250bWF0dGVyOiBvYmplY3QpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXJJbmZvID0gZ2V0RnJvbnRNYXR0ZXJJbmZvKGNvbnRlbnQpO1xuICBpZiAoIWZyb250bWF0dGVySW5mby5leGlzdHMgfHwgT2JqZWN0LmtleXMobmV3RnJvbnRtYXR0ZXIpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc3BsaWNlZEJvZHkgPSBzcGxpY2VGcm9udG1hdHRlckJvZHkoZnJvbnRtYXR0ZXJJbmZvLmZyb250bWF0dGVyLCBuZXdGcm9udG1hdHRlcik7XG4gIHJldHVybiBzcGxpY2VkQm9keSA9PT0gbnVsbFxuICAgID8gbnVsbFxuICAgIDogaW5zZXJ0QXQoe1xuICAgICAgJHN0cmluZzogY29udGVudCxcbiAgICAgIGVuZEluZGV4OiBmcm9udG1hdHRlckluZm8udG8sXG4gICAgICBzdGFydEluZGV4OiBmcm9udG1hdHRlckluZm8uZnJvbSxcbiAgICAgIHN1YnN0cmluZzogc3BsaWNlZEJvZHlcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBEZXJpdmVzIHRoZSBlZGl0IHNjcmlwdCB0aGF0IHR1cm5zIGBvbGRBcnJheWAgaW50byBgbmV3QXJyYXlgLCByZXVzaW5nIGFzIG1hbnkgb2YgdGhlIG9sZCBpdGVtcyBhcyBpdCBjYW4uXG4gKlxuICogQSBsb25nZXN0LWNvbW1vbi1zdWJzZXF1ZW5jZSBkaWZmIG92ZXIgdmFsdWUgZXF1YWxpdHkgaXMgd2hhdCByZWNvdmVycyB0aGUgQVVUSE9SJ3Mgb3BlcmF0aW9uLiBSZXBsYXlpbmcgdGhlXG4gKiBtdXRhdGlvbiBhbiBhcnJheSBtZXRob2QgcGVyZm9ybWVkIGluc3RlYWQg4oCUIGBbYSwgYiwgY10uc3BsaWNlKDEsIDEpYCB3cml0ZXMgYFsxXSA9ICdjJ2AgdGhlbiB0cnVuY2F0ZXMg4oCUIHdvdWxkXG4gKiBvdmVyd3JpdGUgYGJgJ3Mgbm9kZSB3aXRoIGBjYCdzIHZhbHVlIGFuZCBkZWxldGUgYGNgJ3Mgbm9kZSwgc28gYGJgJ3MgY29tbWVudCB3b3VsZCBlbmQgdXAgYW5ub3RhdGluZyBgY2A6IGV4YWN0bHlcbiAqIHRoZSBtaXNhdHRyaWJ1dGlvbiB0aGlzIG1vZHVsZSBleGlzdHMgdG8gcHJldmVudC5cbiAqXG4gKiBBIHJlbW92YWwgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW4gaW5zZXJ0aW9uIG9mIHRoZSBzYW1lIHNoYXBlIGlzIGZvbGRlZCBpbnRvIGEgc2luZ2xlIGBtZXJnZWAsIHNvIGFuIGl0ZW0gZWRpdGVkXG4gKiBpbiBwbGFjZSAoYFt7IHF0eTogMSB9XWAgdG8gYFt7IHF0eTogMiB9XWApIGtlZXBzIGl0cyBvd24gbm9kZSBhbmQgaXRzIGNvbW1lbnRzIHJhdGhlciB0aGFuIGJlaW5nIHJlYnVpbHQuXG4gKlxuICogQHBhcmFtIG9sZEFycmF5IC0gVGhlIHNlcXVlbmNlIGFzIHRoZSBzb3VyY2UgaG9sZHMgaXQuXG4gKiBAcGFyYW0gbmV3QXJyYXkgLSBUaGUgc2VxdWVuY2UgYXMgaXQgaXMgdG8gYmUgd3JpdHRlbi5cbiAqIEByZXR1cm5zIFRoZSBzdGVwcyB0byBhcHBseSwgaW4gb3V0cHV0IG9yZGVyLlxuICovXG5mdW5jdGlvbiBidWlsZEVkaXRTY3JpcHQob2xkQXJyYXk6IHJlYWRvbmx5IHVua25vd25bXSwgbmV3QXJyYXk6IHJlYWRvbmx5IHVua25vd25bXSk6IEVkaXRTdGVwW10ge1xuICBjb25zdCByYXdTdGVwcyA9IGJ1aWxkUmF3RWRpdFNjcmlwdChvbGRBcnJheSwgbmV3QXJyYXkpO1xuICBjb25zdCBzdGVwczogRWRpdFN0ZXBbXSA9IFtdO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCByYXdTdGVwcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBzdGVwID0gY2FzdFRvPFJhd0VkaXRTdGVwPihyYXdTdGVwc1tpbmRleF0pO1xuICAgIGNvbnN0IG5leHRTdGVwID0gcmF3U3RlcHNbaW5kZXggKyAxXTtcbiAgICBpZiAoXG4gICAgICBzdGVwLmtpbmQgPT09ICdyZW1vdmUnICYmIG5leHRTdGVwPy5raW5kID09PSAnaW5zZXJ0J1xuICAgICAgJiYgY2hlY2tJc01lcmdlYWJsZShvbGRBcnJheVtzdGVwLm9sZEluZGV4XSwgbmV3QXJyYXlbbmV4dFN0ZXAubmV3SW5kZXhdKVxuICAgICkge1xuICAgICAgc3RlcHMucHVzaCh7IGtpbmQ6ICdtZXJnZScsIG5ld0luZGV4OiBuZXh0U3RlcC5uZXdJbmRleCwgb2xkSW5kZXg6IHN0ZXAub2xkSW5kZXggfSk7XG4gICAgICBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHN0ZXAua2luZCAhPT0gJ3JlbW92ZScpIHtcbiAgICAgIHN0ZXBzLnB1c2goeyBraW5kOiBzdGVwLmtpbmQsIG5ld0luZGV4OiBzdGVwLm5ld0luZGV4LCBvbGRJbmRleDogc3RlcC5vbGRJbmRleCB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RlcHM7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmF3RWRpdFNjcmlwdChvbGRBcnJheTogcmVhZG9ubHkgdW5rbm93bltdLCBuZXdBcnJheTogcmVhZG9ubHkgdW5rbm93bltdKTogUmF3RWRpdFN0ZXBbXSB7XG4gIGNvbnN0IG9sZExlbmd0aCA9IG9sZEFycmF5Lmxlbmd0aDtcbiAgY29uc3QgbmV3TGVuZ3RoID0gbmV3QXJyYXkubGVuZ3RoO1xuICBjb25zdCBjb21tb25MZW5ndGhzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogb2xkTGVuZ3RoICsgMSB9LCAoKSA9PiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuZXdMZW5ndGggKyAxIH0sICgpID0+IDApKTtcblxuICBmb3IgKGxldCBvbGRJbmRleCA9IG9sZExlbmd0aCAtIDE7IG9sZEluZGV4ID49IDA7IG9sZEluZGV4LS0pIHtcbiAgICBmb3IgKGxldCBuZXdJbmRleCA9IG5ld0xlbmd0aCAtIDE7IG5ld0luZGV4ID49IDA7IG5ld0luZGV4LS0pIHtcbiAgICAgIGNvbnN0IHJvdyA9IGNhc3RUbzxudW1iZXJbXT4oY29tbW9uTGVuZ3Roc1tvbGRJbmRleF0pO1xuICAgICAgY29uc3QgbmV4dFJvdyA9IGNhc3RUbzxudW1iZXJbXT4oY29tbW9uTGVuZ3Roc1tvbGRJbmRleCArIDFdKTtcbiAgICAgIHJvd1tuZXdJbmRleF0gPSBpc0RlZXBFcXVhbChvbGRBcnJheVtvbGRJbmRleF0sIG5ld0FycmF5W25ld0luZGV4XSlcbiAgICAgICAgPyBjYXN0VG88bnVtYmVyPihuZXh0Um93W25ld0luZGV4ICsgMV0pICsgMVxuICAgICAgICA6IE1hdGgubWF4KGNhc3RUbzxudW1iZXI+KG5leHRSb3dbbmV3SW5kZXhdKSwgY2FzdFRvPG51bWJlcj4ocm93W25ld0luZGV4ICsgMV0pKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdGVwczogUmF3RWRpdFN0ZXBbXSA9IFtdO1xuICBsZXQgb2xkSW5kZXggPSAwO1xuICBsZXQgbmV3SW5kZXggPSAwO1xuXG4gIHdoaWxlIChvbGRJbmRleCA8IG9sZExlbmd0aCAmJiBuZXdJbmRleCA8IG5ld0xlbmd0aCkge1xuICAgIGlmIChpc0RlZXBFcXVhbChvbGRBcnJheVtvbGRJbmRleF0sIG5ld0FycmF5W25ld0luZGV4XSkpIHtcbiAgICAgIHN0ZXBzLnB1c2goeyBraW5kOiAna2VlcCcsIG5ld0luZGV4LCBvbGRJbmRleCB9KTtcbiAgICAgIG9sZEluZGV4Kys7XG4gICAgICBuZXdJbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVtb3ZhbFJvdyA9IGNhc3RUbzxudW1iZXJbXT4oY29tbW9uTGVuZ3Roc1tvbGRJbmRleCArIDFdKTtcbiAgICBjb25zdCBpbnNlcnRpb25Sb3cgPSBjYXN0VG88bnVtYmVyW10+KGNvbW1vbkxlbmd0aHNbb2xkSW5kZXhdKTtcbiAgICBjb25zdCByZW1vdmFsQ29tbW9uTGVuZ3RoID0gY2FzdFRvPG51bWJlcj4ocmVtb3ZhbFJvd1tuZXdJbmRleF0pO1xuICAgIGNvbnN0IGluc2VydGlvbkNvbW1vbkxlbmd0aCA9IGNhc3RUbzxudW1iZXI+KGluc2VydGlvblJvd1tuZXdJbmRleCArIDFdKTtcbiAgICBpZiAocmVtb3ZhbENvbW1vbkxlbmd0aCA+PSBpbnNlcnRpb25Db21tb25MZW5ndGgpIHtcbiAgICAgIHN0ZXBzLnB1c2goeyBraW5kOiAncmVtb3ZlJywgbmV3SW5kZXg6IC0xLCBvbGRJbmRleCB9KTtcbiAgICAgIG9sZEluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ZXBzLnB1c2goeyBraW5kOiAnaW5zZXJ0JywgbmV3SW5kZXgsIG9sZEluZGV4OiAtMSB9KTtcbiAgICAgIG5ld0luZGV4Kys7XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG9sZEluZGV4IDwgb2xkTGVuZ3RoOyBvbGRJbmRleCsrKSB7XG4gICAgc3RlcHMucHVzaCh7IGtpbmQ6ICdyZW1vdmUnLCBuZXdJbmRleDogLTEsIG9sZEluZGV4IH0pO1xuICB9XG5cbiAgZm9yICg7IG5ld0luZGV4IDwgbmV3TGVuZ3RoOyBuZXdJbmRleCsrKSB7XG4gICAgc3RlcHMucHVzaCh7IGtpbmQ6ICdpbnNlcnQnLCBuZXdJbmRleCwgb2xkSW5kZXg6IC0xIH0pO1xuICB9XG5cbiAgcmV0dXJuIHN0ZXBzO1xufVxuXG5mdW5jdGlvbiBjaGVja0NhcnJpZXNJbmRlbnQoaXRlbTogQ1NULkNvbGxlY3Rpb25JdGVtLCBpbmRlbnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gQ1NULnN0cmluZ2lmeShpdGVtKS5yZXBsYWNlKC9eXFxuKy8sICcnKS5zdGFydHNXaXRoKCcgJy5yZXBlYXQoaW5kZW50KSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSGFzQW5jaG9yT3JBbGlhcyhjb250ZW50czogUGFyc2VkTm9kZSk6IGJvb2xlYW4ge1xuICBsZXQgaGFzQW5jaG9yT3JBbGlhcyA9IGZhbHNlO1xuXG4gIHZpc2l0KGNvbnRlbnRzLCB7XG4gICAgTm9kZShfa2V5OiB1bmtub3duLCBub2RlOiBOb2RlKTogc3ltYm9sIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICghaXNBbGlhcyhub2RlKSAmJiBub2RlLmFuY2hvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGhhc0FuY2hvck9yQWxpYXMgPSB0cnVlO1xuICAgICAgcmV0dXJuIHZpc2l0LkJSRUFLO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGhhc0FuY2hvck9yQWxpYXM7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSXNNZXJnZWFibGUob2xkVmFsdWU6IHVua25vd24sIG5ld1ZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoY2hlY2tJc1BsYWluT2JqZWN0KG9sZFZhbHVlKSAmJiBjaGVja0lzUGxhaW5PYmplY3QobmV3VmFsdWUpKSB8fCAoQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkgJiYgQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkpO1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgc3BsaWNlZCBibG9jayBhZ2FpbnN0IHRoZSBvbmUgdGhlIHBhcnNlLWFuZC1zdHJpbmdpZnkgcGF0aCB3b3VsZCBoYXZlIHdyaXR0ZW4gZm9yIHRoZSBzYW1lIHZhbHVlLlxuICpcbiAqIENvbXBhcmluZyB0aGUgdHdvIFBBUlNFRCB2YWx1ZXMgcmF0aGVyIHRoYW4gdGhlIHR3byB0ZXh0cyBpcyB0aGUgd2hvbGUgcG9pbnQ6IHRoZSB0ZXh0cyBhcmUgc3VwcG9zZWQgdG8gZGlmZmVyIOKAlCB0aGF0XG4gKiBpcyB0aGUgZm9ybWF0dGluZyB0aGlzIG1vZHVsZSBwcmVzZXJ2ZXMg4oCUIHdoaWxlIHRoZSB2YWx1ZXMgbXVzdCBub3QuIENvbXBhcmluZyBhZ2FpbnN0IHRoYXQgcGF0aCdzIG91dHB1dCByYXRoZXIgdGhhblxuICogYWdhaW5zdCBgbmV3RnJvbnRtYXR0ZXJgIGl0c2VsZiBpcyB3aGF0IG1ha2VzIHRoZSBndWFyYW50ZWUgZXhhY3QsIHNpbmNlIGJvdGggc2lkZXMgdGhlbiBjYXJyeSB0aGUgc2FtZSByb3VuZC10cmlwXG4gKiBsb3NzZXMsIGB1bmRlZmluZWRgIHZhbHVlcyBkcm9wcGVkIGFuZCB0aW1lc3RhbXBzIHJlYWQgYmFjayBhcyBkYXRlcyBhbW9uZyB0aGVtLlxuICpcbiAqIEBwYXJhbSBzcGxpY2VkQm9keSAtIFRoZSBzcGxpY2VkIGJsb2NrIHRleHQuXG4gKiBAcGFyYW0gbmV3RnJvbnRtYXR0ZXIgLSBUaGUgZnJvbnQgbWF0dGVyIHRoYXQgd2FzIHRvIGJlIHdyaXR0ZW4uXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBzcGxpY2VkIGJsb2NrIHJlYWRzIGJhY2sgYXMgdGhlIHZhbHVlIHRoZSBwYXJzZS1hbmQtc3RyaW5naWZ5IHBhdGggd291bGQgaGF2ZSB3cml0dGVuLlxuICovXG5mdW5jdGlvbiBjaGVja0lzU2VtYW50aWNNYXRjaChzcGxpY2VkQm9keTogc3RyaW5nLCBuZXdGcm9udG1hdHRlcjogb2JqZWN0KTogYm9vbGVhbiB7XG4gIGxldCBzcGxpY2VkVmFsdWU6IHVua25vd247XG5cbiAgdHJ5IHtcbiAgICBzcGxpY2VkVmFsdWUgPSBwYXJzZVlhbWwoc3BsaWNlZEJvZHkpO1xuICAgIC8qXG4gICAgICogdjggaWdub3JlIHN0YXJ0IC0tIEEgbmV0LCBub3QgYSBwYXRoOiBgcGFyc2VZYW1sYCBUSFJPV1Mgb24gYSBibG9jayBpdCBjYW5ub3QgcmVhZCByYXRoZXIgdGhhbiByZXBvcnRpbmcgaXQsIGFuZFxuICAgICAqIGEgc3BsaWNlIGNvdWxkIHByb2R1Y2Ugb25lLiBBIDM2IDAwMC1tdXRhdGlvbiBkaWZmZXJlbnRpYWwgZnV6eiBmb3VuZCA5MyB0aGF0IGRpZCwgZXZlcnkgb25lIG9mIHRoZW0gdGhlXG4gICAgICogdmFsdWVsZXNzLWl0ZW0gc2hhcGUgYG5vcm1hbGl6ZUl0ZW1JbmRlbnRzYCBub3cgcmVwYWlycywgYW5kIG5vbmUgYXQgYWxsIGFmdGVyd2FyZHMg4oCUIHNvIHRoZXJlIGlzIG5vIGlucHV0IGxlZnRcbiAgICAgKiB0byBwaW4gdGhpcyB3aXRoLCBhbmQgdGhlIGNvbnRyYWN0IHRoYXQgaXQgdXBob2xkcyAoZGVjbGluZSwgbmV2ZXIgdGhyb3cpIGlzIHRoZSBvbmUgdGhpcyBtb2R1bGUncyBjYWxsZXJzIHJlbHlcbiAgICAgKiBvbi4gRG8gbm90IGRlbGV0ZSBpdCBvbiB0aGUgc3RyZW5ndGggb2YgdGhhdDogaXQgaXMgdGhlIHJlYXNvbiBhIGZ1dHVyZSBzaGFwZSBpcyBhIGZhbGxiYWNrIHJhdGhlciB0aGFuIGEgY3Jhc2guXG4gICAgICovXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICB9XG5cbiAgcmV0dXJuIGlzRGVlcEVxdWFsKHNwbGljZWRWYWx1ZSwgcGFyc2VZYW1sKHN0cmluZ2lmeVlhbWwobmV3RnJvbnRtYXR0ZXIpKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1hcEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBpbmRlbnQ6IG51bWJlcik6IENTVC5Db2xsZWN0aW9uSXRlbSB8IG51bGwge1xuICBjb25zdCBmcmFnbWVudCA9IHN0cmluZ2lmeSh7IFtrZXldOiB2YWx1ZSB9LCBPQlNJRElBTl9TVFJJTkdJRllfT1BUSU9OUyk7XG4gIC8vIEFuIGVtcHR5IG1hcHBpbmcgbWVhbnMgdGhlIHZhbHVlIGlzIGB1bmRlZmluZWRgLCB3aGljaCB0aGUgcmV3cml0ZSBwYXRoIGRyb3BzIGFzIHdlbGwuIERyb3AgdGhlIGtleSB3aXRoIGl0LlxuICByZXR1cm4gZnJhZ21lbnQudHJpbUVuZCgpID09PSBFTVBUWV9NQVBQSU5HX0ZSQUdNRU5UID8gbnVsbCA6IGxpZnRGcmFnbWVudEl0ZW0oZnJhZ21lbnQsIGluZGVudCwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNlcUl0ZW0odmFsdWU6IHVua25vd24sIGluZGVudDogbnVtYmVyKTogQ1NULkNvbGxlY3Rpb25JdGVtIHtcbiAgcmV0dXJuIGxpZnRGcmFnbWVudEl0ZW0oc3RyaW5naWZ5KFt2YWx1ZV0sIE9CU0lESUFOX1NUUklOR0lGWV9PUFRJT05TKSwgaW5kZW50LCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU3BhY2VUb2tlbihpbmRlbnQ6IG51bWJlcik6IENTVC5Tb3VyY2VUb2tlbiB7XG4gIHJldHVybiB7XG4gICAgaW5kZW50LFxuICAgIG9mZnNldDogLTEsXG4gICAgc291cmNlOiAnICcucmVwZWF0KGluZGVudCksXG4gICAgdHlwZTogJ3NwYWNlJ1xuICB9O1xufVxuXG4vKipcbiAqIFJlYnVpbGRzIGEgYmxvY2sgbWFwJ3MgaXRlbXMgc28gaXQgcmVwcmVzZW50cyBgbmV3T2JqZWN0YCwgcmV1c2luZyBlYWNoIHN1cnZpdmluZyBrZXkncyBvd24gaXRlbSB0b2tlbi5cbiAqXG4gKiBUaGUgaXRlbXMgYXJlIHJlYnVpbHQgaW4gdGhlIE5FVyBvYmplY3QncyBrZXkgb3JkZXIgcmF0aGVyIHRoYW4gdGhlIHNvdXJjZSdzLCBzbyBhIGNhbGxiYWNrIHRoYXQgc29ydHMgb3IgcmVvcmRlcnNcbiAqIGtleXMgc3RpbGwgc29ydHMgdGhlbSDigJQgdGhlIHJlb3JkZXJlZCBrZXkgc2ltcGx5IHRha2VzIGl0cyBjb21tZW50LCBpdHMgcXVvdGluZyBhbmQgaXRzIHZhbHVlIGZvcm1hdHRpbmcgd2l0aCBpdC5cbiAqXG4gKiBgZmFsc2VgIG1lYW5zIHRoZSBjYWxsZXIgc2hvdWxkIHJlLWVtaXQgdGhpcyB3aG9sZSBjb2xsZWN0aW9uIGluc3RlYWQ6IGEgZHVwbGljYXRlIGtleSwgYSBrZXkgbm8gc3RyaW5nIGNhbiBuYW1lLCBvclxuICogYSBuZXN0ZWQgbWVyZ2UgdGhhdCBnYXZlIHVwLlxuICpcbiAqIEBwYXJhbSB0b2tlbiAtIFRoZSBibG9jayBtYXAgdG8gcmVidWlsZC5cbiAqIEBwYXJhbSBvbGRPYmplY3QgLSBUaGUgbWFwcGluZyBhcyB0aGUgc291cmNlIGhvbGRzIGl0LlxuICogQHBhcmFtIG5ld09iamVjdCAtIFRoZSBtYXBwaW5nIHRvIHdyaXRlLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdG9rZW4gbm93IHJlcHJlc2VudHMgYG5ld09iamVjdGAuXG4gKi9cbmZ1bmN0aW9uIGRpZE1lcmdlTWFwKHRva2VuOiBDU1QuQmxvY2tNYXAsIG9sZE9iamVjdDogR2VuZXJpY09iamVjdCwgbmV3T2JqZWN0OiBHZW5lcmljT2JqZWN0KTogYm9vbGVhbiB7XG4gIG5vcm1hbGl6ZUl0ZW1JbmRlbnRzKHRva2VuKTtcbiAgY29uc3QgaXRlbXNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBDU1QuQ29sbGVjdGlvbkl0ZW0+KCk7XG5cbiAgZm9yIChjb25zdCBpdGVtIG9mIHRva2VuLml0ZW1zKSB7XG4gICAgY29uc3Qga2V5ID0gcmVhZEl0ZW1LZXkoaXRlbSk7XG4gICAgaWYgKGtleSA9PT0gbnVsbCB8fCBpdGVtc0J5S2V5LmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaXRlbXNCeUtleS5zZXQoa2V5LCBpdGVtKTtcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZEl0ZW1zOiBDU1QuQ29sbGVjdGlvbkl0ZW1bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2tleSwgbmV3VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG5ld09iamVjdCkpIHtcbiAgICBjb25zdCBpdGVtID0gaXRlbXNCeUtleS5nZXQoa2V5KTtcblxuICAgIGlmICghaXRlbSkge1xuICAgICAgY29uc3QgY3JlYXRlZEl0ZW0gPSBjcmVhdGVNYXBJdGVtKGtleSwgbmV3VmFsdWUsIHRva2VuLmluZGVudCk7XG4gICAgICBpZiAoY3JlYXRlZEl0ZW0gIT09IG51bGwpIHtcbiAgICAgICAgbWVyZ2VkSXRlbXMucHVzaChjcmVhdGVkSXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIG1lcmdlSXRlbVZhbHVlKGl0ZW0sIG9sZE9iamVjdFtrZXldLCBuZXdWYWx1ZSwgdG9rZW4uaW5kZW50LCBmYWxzZSk7XG4gICAgbWVyZ2VkSXRlbXMucHVzaChpdGVtKTtcbiAgfVxuXG4gIGlmIChtZXJnZWRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmaW5hbGl6ZUl0ZW1zKG1lcmdlZEl0ZW1zKTtcbiAgdG9rZW4uaXRlbXMgPSBjYXN0VG88Q1NULkJsb2NrTWFwWydpdGVtcyddPihtZXJnZWRJdGVtcyk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFJlYnVpbGRzIGEgYmxvY2sgc2VxdWVuY2UncyBpdGVtcyBzbyBpdCByZXByZXNlbnRzIGBuZXdBcnJheWAsIHJldXNpbmcgdGhlIHRva2VuIG9mIGV2ZXJ5IGl0ZW0gdGhhdCBzdXJ2aXZlcy5cbiAqXG4gKiBAcGFyYW0gdG9rZW4gLSBUaGUgYmxvY2sgc2VxdWVuY2UgdG8gcmVidWlsZC5cbiAqIEBwYXJhbSBvbGRBcnJheSAtIFRoZSBzZXF1ZW5jZSBhcyB0aGUgc291cmNlIGhvbGRzIGl0LlxuICogQHBhcmFtIG5ld0FycmF5IC0gVGhlIHNlcXVlbmNlIHRvIHdyaXRlLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdG9rZW4gbm93IHJlcHJlc2VudHMgYG5ld0FycmF5YC5cbiAqL1xuZnVuY3Rpb24gZGlkTWVyZ2VTZXEodG9rZW46IENTVC5CbG9ja1NlcXVlbmNlLCBvbGRBcnJheTogcmVhZG9ubHkgdW5rbm93bltdLCBuZXdBcnJheTogcmVhZG9ubHkgdW5rbm93bltdKTogYm9vbGVhbiB7XG4gIGlmIChvbGRBcnJheS5sZW5ndGggKiBuZXdBcnJheS5sZW5ndGggPiBFRElUX1NDUklQVF9DRUxMX0xJTUlUKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbm9ybWFsaXplSXRlbUluZGVudHModG9rZW4pO1xuICBjb25zdCBtZXJnZWRJdGVtczogQ1NULkNvbGxlY3Rpb25JdGVtW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHN0ZXAgb2YgYnVpbGRFZGl0U2NyaXB0KG9sZEFycmF5LCBuZXdBcnJheSkpIHtcbiAgICBpZiAoc3RlcC5raW5kID09PSAnaW5zZXJ0Jykge1xuICAgICAgbWVyZ2VkSXRlbXMucHVzaChjcmVhdGVTZXFJdGVtKG5ld0FycmF5W3N0ZXAubmV3SW5kZXhdLCB0b2tlbi5pbmRlbnQpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGl0ZW0gPSBjYXN0VG88Q1NULkNvbGxlY3Rpb25JdGVtPih0b2tlbi5pdGVtc1tzdGVwLm9sZEluZGV4XSk7XG4gICAgaWYgKHN0ZXAua2luZCA9PT0gJ21lcmdlJykge1xuICAgICAgbWVyZ2VJdGVtVmFsdWUoaXRlbSwgb2xkQXJyYXlbc3RlcC5vbGRJbmRleF0sIG5ld0FycmF5W3N0ZXAubmV3SW5kZXhdLCB0b2tlbi5pbmRlbnQsIHRydWUpO1xuICAgIH1cblxuICAgIG1lcmdlZEl0ZW1zLnB1c2goaXRlbSk7XG4gIH1cblxuICBpZiAobWVyZ2VkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZmluYWxpemVJdGVtcyhtZXJnZWRJdGVtcyk7XG4gIHRva2VuLml0ZW1zID0gY2FzdFRvPENTVC5CbG9ja1NlcXVlbmNlWydpdGVtcyddPihtZXJnZWRJdGVtcyk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdpdmVzIGEgbmVzdGVkIGNvbGxlY3Rpb24ncyBmaXJzdCBpdGVtIHRoZSBsZWFkaW5nIGluZGVudCBvZiBpdHMgb3duLCBzbyB0aGUgaXRlbXMgYmVjb21lIGludGVyY2hhbmdlYWJsZS5cbiAqXG4gKiBBIG5lc3RlZCBjb2xsZWN0aW9uJ3MgZmlyc3QgaXRlbSBjYXJyaWVzIG5vIGluZGVudCBpbiB0aGUgc291cmNlOiB0aGUgaW5kZW50IHNpdHMgaW4gd2hhdGV2ZXIgcHJlY2VkZXMgdGhlXG4gKiBjb2xsZWN0aW9uIOKAlCB0aGUgc2VwYXJhdG9yJ3MgdHJhaWxpbmcgc3BhY2VzLCBvciB0aGUgZGFzaCBvZiB0aGUgc2VxdWVuY2UgaXRlbSBpdCBiZWxvbmdzIHRvLiBFdmVyeSBsYXRlciBpdGVtXG4gKiBjYXJyaWVzIGl0cyBvd24uIFJlbW92aW5nIG9yIHJlb3JkZXJpbmcgdGhlIGZpcnN0IGl0ZW0gd2l0aG91dCByZXBhaXJpbmcgdGhhdCBsZWF2ZXMgdGhlIHN1cnZpdm9yIGRvdWJseSBpbmRlbnRlZCxcbiAqIHNvIHRoZSBpbmRlbnQgaXMgbW92ZWQgb3V0IG9mIHRoZSBzZXBhcmF0b3IgYW5kIG9udG8gdGhlIGl0ZW0gYmVmb3JlIGFueXRoaW5nIGlzIHJlYXJyYW5nZWQuXG4gKlxuICogVGhlIG9uZSBzaGFwZSBpdCBjYW5ub3QgcmVwYWlyIGlzIGEgZmlyc3QgaXRlbSB3cml0dGVuIElOTElORSB3aXRoIHdoYXQgcHJlY2VkZXMgaXQgKGAtIG5hbWU6IGFgKSwgd2hlcmUgdGhlcmUgaXMgbm9cbiAqIGluZGVudCB0byBtb3ZlIGJlY2F1c2UgdGhlIGl0ZW0gaXMgbm90IGF0IHRoZSBzdGFydCBvZiBpdHMgbGluZS4gU3VjaCBhIGNvbGxlY3Rpb24gaXMgcmUtZW1pdHRlZCB3aG9sZSBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSBwcmVjZWRpbmdUb2tlbnMgLSBUaGUgc2VwYXJhdG9yIHRva2VucyB0aGF0IHNpdCBiZXR3ZWVuIHRoZSBwYXJlbnQgYW5kIHRoZSBjb2xsZWN0aW9uLlxuICogQHBhcmFtIGNvbGxlY3Rpb24gLSBUaGUgY29sbGVjdGlvbiB3aG9zZSBmaXJzdCBpdGVtIGlzIHRvIGNhcnJ5IGl0cyBvd24gaW5kZW50LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgY29sbGVjdGlvbidzIGl0ZW1zIGFyZSBub3cgaW50ZXJjaGFuZ2VhYmxlLlxuICovXG5mdW5jdGlvbiBkaWROb3JtYWxpemVGaXJzdEl0ZW1JbmRlbnQocHJlY2VkaW5nVG9rZW5zOiBDU1QuU291cmNlVG9rZW5bXSB8IHVuZGVmaW5lZCwgY29sbGVjdGlvbjogQ29sbGVjdGlvblRva2VuKTogYm9vbGVhbiB7XG4gIC8vIEEgcGFyc2VkIGJsb2NrIGNvbGxlY3Rpb24gYWx3YXlzIGhvbGRzIGF0IGxlYXN0IG9uZSBpdGVtLCBvciBpdCB3b3VsZCBub3QgaGF2ZSBwYXJzZWQgYXMgYSBjb2xsZWN0aW9uIGF0IGFsbC5cbiAgY29uc3QgZmlyc3RJdGVtID0gY2FzdFRvPENTVC5Db2xsZWN0aW9uSXRlbT4oY29sbGVjdGlvbi5pdGVtc1swXSk7XG5cbiAgaWYgKGNvbGxlY3Rpb24uaW5kZW50ID09PSAwIHx8IGNoZWNrQ2Fycmllc0luZGVudChmaXJzdEl0ZW0sIGNvbGxlY3Rpb24uaW5kZW50KSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgbGFzdFRva2VuID0gcHJlY2VkaW5nVG9rZW5zPy5hdCgtMSk7XG4gIGlmIChsYXN0VG9rZW4/LnR5cGUgIT09ICdzcGFjZScgfHwgcHJlY2VkaW5nVG9rZW5zPy5hdChTRUNPTkRfVE9fTEFTVF9JTkRFWCk/LnR5cGUgIT09ICduZXdsaW5lJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByZWNlZGluZ1Rva2Vucy5wb3AoKTtcbiAgZmlyc3RJdGVtLnN0YXJ0LnVuc2hpZnQobGFzdFRva2VuKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGVtaXRNYXBJdGVtVG9rZW5zKHZhbHVlOiB1bmtub3duLCBpbmRlbnQ6IG51bWJlciwgc2hvdWxkUHJlZmVyRmxvdzogYm9vbGVhbik6IE1hcEl0ZW1Ub2tlbnMge1xuICBjb25zdCBmcmFnbWVudCA9IHNob3VsZFByZWZlckZsb3dcbiAgICA/IGAke1BMQUNFSE9MREVSX0tFWX06ICR7c3RyaW5naWZ5Rmxvdyh2YWx1ZSl9YFxuICAgIDogc3RyaW5naWZ5KHsgW1BMQUNFSE9MREVSX0tFWV06IHZhbHVlIH0sIE9CU0lESUFOX1NUUklOR0lGWV9PUFRJT05TKTtcbiAgY29uc3QgaXRlbSA9IGxpZnRGcmFnbWVudEl0ZW0oZnJhZ21lbnQsIGluZGVudCwgZmFsc2UpO1xuICByZXR1cm4geyBzZXBhcmF0b3JUb2tlbnM6IGNhc3RUbzxDU1QuU291cmNlVG9rZW5bXT4oaXRlbS5zZXApLCB2YWx1ZTogaXRlbS52YWx1ZSB9O1xufVxuXG5mdW5jdGlvbiBlbWl0U2VxSXRlbSh2YWx1ZTogdW5rbm93biwgaW5kZW50OiBudW1iZXIsIHNob3VsZFByZWZlckZsb3c6IGJvb2xlYW4pOiBDU1QuQ29sbGVjdGlvbkl0ZW0ge1xuICBjb25zdCBmcmFnbWVudCA9IHNob3VsZFByZWZlckZsb3cgPyBgLSAke3N0cmluZ2lmeUZsb3codmFsdWUpfWAgOiBzdHJpbmdpZnkoW3ZhbHVlXSwgT0JTSURJQU5fU1RSSU5HSUZZX09QVElPTlMpO1xuICByZXR1cm4gbGlmdEZyYWdtZW50SXRlbShmcmFnbWVudCwgaW5kZW50LCBmYWxzZSk7XG59XG5cbi8qKlxuICogTWFrZXMgdGhlIG1lcmdlZCBpdGVtcyBvZiBhIGNvbGxlY3Rpb24gam9pbmFibGUgYWdhaW4sIHdoYXRldmVyIHRoZSBtZXJnZSBkaWQgdG8gdGhlaXIgb3JkZXIuXG4gKlxuICogQW4gaXRlbSB0aGF0IHdhcyBub3QgZmlyc3QgY2FuIGNhcnJ5IHRoZSBibGFuayBsaW5lIHRoYXQgc2VwYXJhdGVkIGl0IGZyb20gaXRzIHByZWRlY2Vzc29yLCB3aGljaCBiZWNvbWVzIGEgbGVhZGluZ1xuICogYmxhbmsgbGluZSBvbmNlIGl0IElTIGZpcnN0LCBhbmQgbm90aGluZyBpbiB0aGUgaXRlbSB0b2tlbnMgdGhlbXNlbHZlcyBzaG93cyBpdC4gRXZlcnkgaXRlbSBhbHJlYWR5IGVuZHMgaW4gaXRzIG93blxuICogbmV3bGluZSwgYmVjYXVzZSBPYnNpZGlhbidzIGZyb250IG1hdHRlciBibG9jayBhbHdheXMgZW5kcyBpbiBvbmUsIHNvIHJlb3JkZXJpbmcgbmV2ZXIgam9pbnMgdHdvIGl0ZW1zIG9uIG9uZSBsaW5lLlxuICpcbiAqIEBwYXJhbSBpdGVtcyAtIFRoZSBtZXJnZWQgaXRlbXMsIG11dGF0ZWQgaW4gcGxhY2UuXG4gKi9cbmZ1bmN0aW9uIGZpbmFsaXplSXRlbXMoaXRlbXM6IENTVC5Db2xsZWN0aW9uSXRlbVtdKTogdm9pZCB7XG4gIGNvbnN0IGZpcnN0SXRlbSA9IGNhc3RUbzxDU1QuQ29sbGVjdGlvbkl0ZW0+KGl0ZW1zWzBdKTtcbiAgd2hpbGUgKGZpcnN0SXRlbS5zdGFydFswXT8udHlwZSA9PT0gJ25ld2xpbmUnKSB7XG4gICAgZmlyc3RJdGVtLnN0YXJ0LnNoaWZ0KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZW50TGluZXModGV4dDogc3RyaW5nLCBpbmRlbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChpbmRlbnQgPT09IDApIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIGNvbnN0IHBhZGRpbmcgPSAnICcucmVwZWF0KGluZGVudCk7XG4gIHJldHVybiB0ZXh0LnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUpID0+IGxpbmUgPT09ICcnID8gbGluZSA6IHBhZGRpbmcgKyBsaW5lKS5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBmcmVzaGx5IGVtaXR0ZWQgZnJhZ21lbnQgYW5kIGhhbmRzIGJhY2sgaXRzIG9uZSBjb2xsZWN0aW9uIGl0ZW0sIGluZGVudGVkIHRvIHNpdCB3aGVyZSBpdCBpcyBnb2luZy5cbiAqXG4gKiBUaGUgZnJhZ21lbnQncyBvd24gbGluZXMgYXJlIGluZGVudGVkIGJlZm9yZSBwYXJzaW5nLCBzbyBldmVyeSB0b2tlbiBpbnNpZGUgaXQgY2FycmllcyB0aGUgYWJzb2x1dGUgaW5kZW50IHRoZVxuICogb3V0cHV0IG5lZWRzLiBUaGUgaXRlbSdzIE9XTiBsZWFkaW5nIGluZGVudCBpcyBub3QgcGFydCBvZiB0aGF0IOKAlCBhIGZpcnN0IGl0ZW0gbmV2ZXIgY2FycmllcyBvbmUsIHRoZSBpbmRlbnQgYmVpbmdcbiAqIHN1cHBsaWVkIGJ5IHdoYXRldmVyIHByZWNlZGVzIHRoZSBjb2xsZWN0aW9uIOKAlCBzbyBpdCBpcyBwcmVwZW5kZWQgYXMgYSB0b2tlbiwgd2hpY2ggaXMgd2hhdCBtYWtlcyB0aGUgaXRlbSB1bmlmb3JtXG4gKiB3aXRoIGl0cyBuZXcgc2libGluZ3MgYW5kIHRoZXJlZm9yZSBmcmVlIHRvIGJlIHJlb3JkZXJlZCBvciB0byBiZWNvbWUgdGhlIGZpcnN0LlxuICpcbiAqIFRoZSBmcmFnbWVudCB3YXMgcHJvZHVjZWQgYnkgYHN0cmluZ2lmeWAgYSBsaW5lIGFib3ZlIHRoZSBjYWxsLCBhcyBhIG9uZS1pdGVtIGJsb2NrIGNvbGxlY3Rpb24sIHNvIGl0IGFsd2F5cyBwYXJzZXNcbiAqIGJhY2sgYXMgb25lIOKAlCB3aGljaCBpcyB3aHkgdGhpcyByZWFkcyB0aGUgaXRlbSBvdXQgcmF0aGVyIHRoYW4gY2hlY2tpbmcgZm9yIGl0LiBXZXJlIHRoYXQgZXZlciB0byBzdG9wIGhvbGRpbmcsIHRoZVxuICogcmVzdWx0aW5nIHRocm93IGlzIGNhdWdodCBieSBgc2V0RnJvbnRtYXR0ZXJgJ3Mgc2VhbSwgd2hpY2ggcmVwb3J0cyBpdCBhbmQgd3JpdGVzIHRoZSBibG9jayB0aGUgb3JkaW5hcnkgd2F5LlxuICpcbiAqIEBwYXJhbSBmcmFnbWVudCAtIFRoZSBlbWl0dGVkIFlBTUwgZnJhZ21lbnQsIGF0IGluZGVudCB6ZXJvLlxuICogQHBhcmFtIGluZGVudCAtIFRoZSBpbmRlbnQgdGhlIGl0ZW0gd2lsbCBzaXQgYXQuXG4gKiBAcGFyYW0gc2hvdWxkQ2FycnlJbmRlbnQgLSBXaGV0aGVyIHRvIHByZXBlbmQgdGhlIGl0ZW0ncyBvd24gbGVhZGluZyBpbmRlbnQgdG9rZW4uXG4gKiBAcmV0dXJucyBUaGUgaXRlbS5cbiAqL1xuZnVuY3Rpb24gbGlmdEZyYWdtZW50SXRlbShmcmFnbWVudDogc3RyaW5nLCBpbmRlbnQ6IG51bWJlciwgc2hvdWxkQ2FycnlJbmRlbnQ6IGJvb2xlYW4pOiBDU1QuQ29sbGVjdGlvbkl0ZW0ge1xuICBjb25zdCByb290ID0gcGFyc2VEb2N1bWVudChpbmRlbnRMaW5lcyhmcmFnbWVudCwgaW5kZW50KSwgeyBrZWVwU291cmNlVG9rZW5zOiB0cnVlIH0pLmNvbnRlbnRzPy5zcmNUb2tlbjtcbiAgY29uc3QgaXRlbSA9IGNhc3RUbzxDU1QuQ29sbGVjdGlvbkl0ZW0+KGNhc3RUbzxDb2xsZWN0aW9uVG9rZW4+KHJvb3QpLml0ZW1zWzBdKTtcblxuICBpZiAoc2hvdWxkQ2FycnlJbmRlbnQgJiYgaW5kZW50ID4gMCkge1xuICAgIGl0ZW0uc3RhcnQudW5zaGlmdChjcmVhdGVTcGFjZVRva2VuKGluZGVudCkpO1xuICB9XG5cbiAgcmV0dXJuIGl0ZW07XG59XG5cbi8qKlxuICogUmV3cml0ZXMgYW4gaXRlbSdzIHZhbHVlIGluIHBsYWNlIHdoZXJlIGl0IGNhbiwgYW5kIHJlLWVtaXRzIHRoZSB3aG9sZSB2YWx1ZSB3aGVyZSBpdCBjYW5ub3QuXG4gKlxuICogQHBhcmFtIGl0ZW0gLSBUaGUgY29sbGVjdGlvbiBpdGVtIHRvIHJld3JpdGUgdGhlIHZhbHVlIG9mLlxuICogQHBhcmFtIG9sZFZhbHVlIC0gVGhlIHZhbHVlIHRoZSBzb3VyY2UgaG9sZHMuXG4gKiBAcGFyYW0gbmV3VmFsdWUgLSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gKiBAcGFyYW0gcGFyZW50SW5kZW50IC0gVGhlIGluZGVudCBvZiB0aGUgY29sbGVjdGlvbiB0aGUgaXRlbSBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGlzU2VxSXRlbSAtIFdoZXRoZXIgdGhlIGl0ZW0gaXMgYSBzZXF1ZW5jZSBpdGVtLCB3aGljaCBjYXJyaWVzIG5vIGBzZXBgIGFuZCBubyBrZXkuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlSXRlbVZhbHVlKGl0ZW06IENTVC5Db2xsZWN0aW9uSXRlbSwgb2xkVmFsdWU6IHVua25vd24sIG5ld1ZhbHVlOiB1bmtub3duLCBwYXJlbnRJbmRlbnQ6IG51bWJlciwgaXNTZXFJdGVtOiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChpc0RlZXBFcXVhbChvbGRWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgLy8gVW50b3VjaGVkOiBpdHMgYnl0ZXMgc3RheSBleGFjdGx5IGFzIGl0cyBhdXRob3Igd3JvdGUgdGhlbS4gVGhpcyBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhlIG1vZHVsZS5cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB2YWx1ZVRva2VuID0gaXRlbS52YWx1ZTtcbiAgY29uc3QgcHJlY2VkaW5nVG9rZW5zID0gaXNTZXFJdGVtID8gaXRlbS5zdGFydCA6IGl0ZW0uc2VwO1xuXG4gIGlmIChcbiAgICAodmFsdWVUb2tlbj8udHlwZSA9PT0gJ2Jsb2NrLW1hcCcgJiYgY2hlY2tJc1BsYWluT2JqZWN0KG9sZFZhbHVlKSAmJiBjaGVja0lzUGxhaW5PYmplY3QobmV3VmFsdWUpXG4gICAgICAmJiBkaWROb3JtYWxpemVGaXJzdEl0ZW1JbmRlbnQocHJlY2VkaW5nVG9rZW5zLCB2YWx1ZVRva2VuKSAmJiBkaWRNZXJnZU1hcCh2YWx1ZVRva2VuLCBvbGRWYWx1ZSwgbmV3VmFsdWUpKSB8fCAodmFsdWVUb2tlbj8udHlwZSA9PT0gJ2Jsb2NrLXNlcScgJiYgQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkgJiYgQXJyYXkuaXNBcnJheShuZXdWYWx1ZSlcbiAgICAgICAgJiYgZGlkTm9ybWFsaXplRmlyc3RJdGVtSW5kZW50KHByZWNlZGluZ1Rva2VucywgdmFsdWVUb2tlbikgJiYgZGlkTWVyZ2VTZXEodmFsdWVUb2tlbiwgb2xkVmFsdWUsIG5ld1ZhbHVlKSlcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVwbGFjZUl0ZW1WYWx1ZShpdGVtLCBuZXdWYWx1ZSwgcGFyZW50SW5kZW50LCB2YWx1ZVRva2VuPy50eXBlID09PSAnZmxvdy1jb2xsZWN0aW9uJywgaXNTZXFJdGVtKTtcbn1cblxuLyoqXG4gKiBHaXZlcyBldmVyeSBpdGVtIG9mIGEgY29sbGVjdGlvbiB0aGUgaW5kZW50IG9mIGl0cyBvd24gbGluZSwgc28gdGhhdCBhbnkgb2YgdGhlbSBjYW4gYmUgcmVtb3ZlZCBvciBtb3ZlZC5cbiAqXG4gKiBBbiBpdGVtIHdpdGggTk8gVkFMVUUg4oCUIGEgYmFyZSBgLWAsIG9yIGBrZXk6YCB3aXRoIG5vdGhpbmcgYWZ0ZXIgaXQg4oCUIGFic29yYnMgdGhlIG5ld2xpbmUgdGhhdCBlbmRzIGl0cyBsaW5lIEFORCB0aGVcbiAqIGluZGVudCBvZiB0aGUgbGluZSBhZnRlciBpdCwgYmVjYXVzZSB0aGUgcGFyc2VyIGhhcyBub3RoaW5nIGVsc2UgdG8gaGFuZyB0aGVtIG9uLiBSZW1vdmluZyBvciBtb3Zpbmcgc3VjaCBhbiBpdGVtXG4gKiB0aGVyZWZvcmUgdGFrZXMgaXRzIHN1Y2Nlc3NvcidzIGluZGVudCB3aXRoIGl0LCBhbmQgdGhlIGJsb2NrIHRoYXQgY29tZXMgYmFjayBkb2VzIG5vdCBwYXJzZSBhdCBhbGwuXG4gKlxuICogTWVhc3VyZWQ6IG92ZXIgYSAzNiAwMDAtbXV0YXRpb24gZGlmZmVyZW50aWFsIGZ1enogdGhpcyBPTkUgc2hhcGUgYWNjb3VudGVkIGZvciBldmVyeSBzcGxpY2UgdGhlIHNhZmV0eSBuZXQgaGFkIHRvXG4gKiByZWZ1c2Ugb24gdW5yZWFkYWJsZSBvdXRwdXQg4oCUIDkzIG9mIHRoZW0g4oCUIHNvIGl0IGlzIGEgZmlkZWxpdHkgZml4IHJhdGhlciB0aGFuIGEgY29ycmVjdG5lc3Mgb25lLCB0aGUgc2FmZXR5IG5ldFxuICogaGF2aW5nIGFscmVhZHkgbWFkZSBlYWNoIG9mIHRob3NlIGEgZmFsbGJhY2suXG4gKlxuICogQHBhcmFtIGNvbGxlY3Rpb24gLSBUaGUgY29sbGVjdGlvbiB3aG9zZSBpdGVtcyBhcmUgdG8gY2FycnkgdGhlaXIgb3duIGluZGVudC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplSXRlbUluZGVudHMoY29sbGVjdGlvbjogQ29sbGVjdGlvblRva2VuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBjb2xsZWN0aW9uLml0ZW1zLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IG5leHRJdGVtID0gY2FzdFRvPENTVC5Db2xsZWN0aW9uSXRlbSB8IHVuZGVmaW5lZD4oY29sbGVjdGlvbi5pdGVtc1tpbmRleCArIDFdKTtcbiAgICBpZiAoIW5leHRJdGVtIHx8IGl0ZW0udmFsdWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEEgbWFwIGl0ZW0gaGFuZ3MgdGhlbSBvbiBpdHMgYHNlcGAsIGEgc2VxdWVuY2UgaXRlbSBvbiBpdHMgYHN0YXJ0YCwgdGhhdCBiZWluZyBhbGwgaXQgaGFzLlxuICAgIGNvbnN0IHRyYWlsaW5nVG9rZW5zID0gaXRlbS5zZXA/Lmxlbmd0aCA/IGl0ZW0uc2VwIDogaXRlbS5zdGFydDtcbiAgICBjb25zdCBsYXN0VG9rZW4gPSB0cmFpbGluZ1Rva2Vucy5hdCgtMSk7XG4gICAgaWYgKGxhc3RUb2tlbj8udHlwZSAhPT0gJ3NwYWNlJyB8fCB0cmFpbGluZ1Rva2Vucy5hdChTRUNPTkRfVE9fTEFTVF9JTkRFWCk/LnR5cGUgIT09ICduZXdsaW5lJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdHJhaWxpbmdUb2tlbnMucG9wKCk7XG4gICAgbmV4dEl0ZW0uc3RhcnQudW5zaGlmdChsYXN0VG9rZW4pO1xuICB9XG59XG5cbi8qKlxuICogTmFtZXMgdGhlIGtleSBhbiBpdGVtIGlzIGFkZHJlc3NlZCBieSwgb3IgYG51bGxgIHdoZW4gbm8gc3RyaW5nIGNhbiBuYW1lIGl0LlxuICpcbiAqIGByZXNvbHZlQXNTY2FsYXJgIHlpZWxkcyB0aGUgc2NhbGFyJ3MgVEVYVCByYXRoZXIgdGhhbiBhIHNjaGVtYS1yZXNvbHZlZCB2YWx1ZSwgc28gdGhlIGFuc3dlciBpcyBhbHdheXMgYSBzdHJpbmcg4oCUXG4gKiBhbmQgaXQgaXMgdGhlIHNhbWUgc3RyaW5nIHRoZSBwbGFpbi1vYmplY3QgcHJvamVjdGlvbiBib3RoIHNpZGVzIG9mIHRoZSBtZXJnZSBhcmUgY29tcGFyZWQgdGhyb3VnaCwgd2hpY2ggaXMgd2hhdFxuICogbGV0cyBhIGA0MjpgIGtleSBtYXRjaCB0aGUgcHJvamVjdGlvbidzIGAnNDInYCB3aXRob3V0IHF1b3RpbmcgaXQgb24gdGhlIHdheSBvdXQuXG4gKlxuICogQHBhcmFtIGl0ZW0gLSBUaGUgaXRlbSB0byBuYW1lIHRoZSBrZXkgb2YuXG4gKiBAcmV0dXJucyBUaGUga2V5LCBvciBgbnVsbGAgd2hlbiB0aGUga2V5IGlzIGEgY29sbGVjdGlvbiByYXRoZXIgdGhhbiBhIHNjYWxhci5cbiAqL1xuZnVuY3Rpb24gcmVhZEl0ZW1LZXkoaXRlbTogQ1NULkNvbGxlY3Rpb25JdGVtKTogbnVsbCB8IHN0cmluZyB7XG4gIHJldHVybiBpdGVtLmtleSAmJiBDU1QuaXNTY2FsYXIoaXRlbS5rZXkpID8gY2FzdFRvPFJlc29sdmVkU2NhbGFyPihDU1QucmVzb2x2ZUFzU2NhbGFyKGl0ZW0ua2V5KSkudmFsdWUgOiBudWxsO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlSXRlbVZhbHVlKGl0ZW06IENTVC5Db2xsZWN0aW9uSXRlbSwgbmV3VmFsdWU6IHVua25vd24sIGluZGVudDogbnVtYmVyLCBzaG91bGRQcmVmZXJGbG93OiBib29sZWFuLCBpc1NlcUl0ZW06IGJvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKGlzU2VxSXRlbSkge1xuICAgIHNldEl0ZW1WYWx1ZShpdGVtLCBlbWl0U2VxSXRlbShuZXdWYWx1ZSwgaW5kZW50LCBzaG91bGRQcmVmZXJGbG93KS52YWx1ZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZW1pdHRlZFRva2VucyA9IGVtaXRNYXBJdGVtVG9rZW5zKG5ld1ZhbHVlLCBpbmRlbnQsIHNob3VsZFByZWZlckZsb3cpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgc2VwYCBpcyB0aGUgYHlhbWxgIHBhY2thZ2UncyBvd24gcHJvcGVydHkgbmFtZS5cbiAgaXRlbS5zZXAgPSBlbWl0dGVkVG9rZW5zLnNlcGFyYXRvclRva2VucztcbiAgc2V0SXRlbVZhbHVlKGl0ZW0sIGVtaXR0ZWRUb2tlbnMudmFsdWUpO1xufVxuXG4vKipcbiAqIEFzc2lnbnMgYW4gaXRlbSdzIHZhbHVlIHRva2VuLCByZW1vdmluZyB0aGUgcHJvcGVydHkgb3V0cmlnaHQgd2hlbiB0aGUgZW1pdHRlZCB2YWx1ZSBoYXMgbm9uZS5cbiAqXG4gKiBBIGtleSB3aXRoIGEgYG51bGxgIHZhbHVlIGVtaXRzIGFzIGBrZXk6YCB3aXRoIG5vdGhpbmcgYWZ0ZXIgdGhlIHNlcGFyYXRvciwgc28gdGhlIGl0ZW0gZ2VudWluZWx5IGhhcyBubyB2YWx1ZVxuICogdG9rZW4g4oCUIGFuZCB1bmRlciBgZXhhY3RPcHRpb25hbFByb3BlcnR5VHlwZXNgIHRoYXQgaXMgYSBwcm9wZXJ0eSB0byBkZWxldGUsIG5vdCBvbmUgdG8gc2V0IHRvIGB1bmRlZmluZWRgLlxuICpcbiAqIEBwYXJhbSBpdGVtIC0gVGhlIGl0ZW0gdG8gYXNzaWduIHRoZSB2YWx1ZSB0b2tlbiBvZi5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0b2tlbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgZW1pdHRlZCB2YWx1ZSBoYXMgbm9uZS5cbiAqL1xuZnVuY3Rpb24gc2V0SXRlbVZhbHVlKGl0ZW06IENTVC5Db2xsZWN0aW9uSXRlbSwgdmFsdWU6IENTVC5Ub2tlbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGRlbGV0ZSBpdGVtLnZhbHVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBTcGxpY2VzIHRoZSB0ZXh0IElOU0lERSBhIGZyb250IG1hdHRlciBibG9jaydzIGRlbGltaXRlcnMsIGxlYXZpbmcgYm90aCBgLS0tYCBsaW5lcyB1bnRvdWNoZWQuXG4gKlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBmcm9udCBtYXR0ZXIgYmxvY2sncyB0ZXh0LlxuICogQHBhcmFtIG5ld0Zyb250bWF0dGVyIC0gVGhlIGZyb250IG1hdHRlciB0byB3cml0ZS5cbiAqIEByZXR1cm5zIFRoZSBuZXcgYmxvY2sgdGV4dCwgb3IgYG51bGxgIHdoZW4gdGhlIHNwbGljZSBjb3VsZCBub3QgYmUgcHJvdmVkIGZhaXRoZnVsLlxuICovXG5mdW5jdGlvbiBzcGxpY2VGcm9udG1hdHRlckJvZHkoc291cmNlOiBzdHJpbmcsIG5ld0Zyb250bWF0dGVyOiBvYmplY3QpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3QgdG9rZW5zID0gWy4uLm5ldyBQYXJzZXIoKS5wYXJzZShzb3VyY2UpXTtcbiAgY29uc3QgZG9jdW1lbnRzID0gWy4uLm5ldyBDb21wb3Nlcih7IGtlZXBTb3VyY2VUb2tlbnM6IHRydWUgfSkuY29tcG9zZSh0b2tlbnMsIHRydWUpXTtcbiAgLy8gQSBzZWNvbmQgZG9jdW1lbnQgaXMgcmVhY2hhYmxlIOKAlCBhIGAuLi5gIGVuZCBtYXJrZXIgc3RhcnRzIG9uZSDigJQgYW5kIHNwbGljaW5nIHRoZSBmaXJzdCB3b3VsZCBlbWl0IGJvdGguXG4gIGNvbnN0IGRvY3VtZW50ID0gZG9jdW1lbnRzLmxlbmd0aCA9PT0gMSA/IGRvY3VtZW50c1swXSA6IHVuZGVmaW5lZDtcblxuICBpZiAoIWRvY3VtZW50IHx8IGRvY3VtZW50LmVycm9ycy5sZW5ndGggPiAwIHx8IGRvY3VtZW50Lndhcm5pbmdzLnNvbWUoKHdhcm5pbmcpID0+IHdhcm5pbmcuY29kZSA9PT0gVU5SRVNPTFZFRF9UQUdfV0FSTklOR19DT0RFKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgY29udGVudHMgPSBkb2N1bWVudC5jb250ZW50cztcbiAgY29uc3Qgcm9vdFRva2VuID0gY29udGVudHM/LnNyY1Rva2VuO1xuICAvLyBBbiBhbmNob3IgaXMgYSBzZWNvbmQgbmFtZSBmb3IgYSBub2RlLCBzbyBhIHNwbGljZSB0aGF0IG1vdmVzIG9yIGRyb3BzIG9uZSBvZiB0aGUgdHdvIHNpbGVudGx5IHJld3JpdGVzIHRoZSBvdGhlci5cbiAgLy8gTm90aGluZyBoZXJlIGlzIHdvcnRoIHRoYXQgcmlzayBmb3IgYSBjb25zdHJ1Y3QgT2JzaWRpYW4ncyBvd24gcHJvcGVydHkgZWRpdG9yIGNhbm5vdCBwcm9kdWNlLlxuICBpZiAoIWNvbnRlbnRzIHx8IHJvb3RUb2tlbj8udHlwZSAhPT0gJ2Jsb2NrLW1hcCcgfHwgY2hlY2tIYXNBbmNob3JPckFsaWFzKGNvbnRlbnRzKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQSBibG9jay1tYXAgcm9vdCBhbHdheXMgcHJvamVjdHMgdG8gYSBwbGFpbiBvYmplY3QsIHNvIHRoaXMgaXMgYSBjYXN0IHJhdGhlciB0aGFuIGEgY2hlY2suIEFueXRoaW5nIHRoYXQgbWFkZSBpdFxuICAvLyB1bnRydWUgd291bGQgc3RpbGwgYmUgY2F1Z2h0IGRvd25zdHJlYW06IHRoZSBtZXJnZSB3b3VsZCB3cml0ZSBhIG1hcHBpbmcgdGhlIHNhZmV0eSBuZXQgdGhlbiByZWZ1c2VzLlxuICBjb25zdCBvbGRGcm9udG1hdHRlciA9IGNhc3RUbzxHZW5lcmljT2JqZWN0Pihkb2N1bWVudC50b0pTKCkpO1xuXG4gIGlmICghZGlkTWVyZ2VNYXAocm9vdFRva2VuLCBvbGRGcm9udG1hdHRlciwgY2FzdFRvPEdlbmVyaWNPYmplY3Q+KG5ld0Zyb250bWF0dGVyKSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEV2ZXJ5IHRva2VuLCBub3QganVzdCB0aGUgcm9vdCBjb2xsZWN0aW9uJ3M6IGEgY29tbWVudCBiZWZvcmUgb3IgYWZ0ZXIgdGhlIG1hcHBpbmcgYmVsb25ncyB0byB0aGUgRE9DVU1FTlQsIHNvXG4gIC8vIGBDU1Quc3RyaW5naWZ5KGNvbnRlbnRzLnNyY1Rva2VuKWAgYWxvbmUgc2lsZW50bHkgZHJvcHMgYm90aC5cbiAgY29uc3QgZW1pdHRlZEJvZHkgPSB0b2tlbnMubWFwKCh0b2tlbikgPT4gQ1NULnN0cmluZ2lmeSh0b2tlbikpLmpvaW4oJycpO1xuXG4gIC8vIFRoZSByZXBsYWNlZCByZWdpb24gaGFzIHRvIGVuZCBpbiBleGFjdGx5IG9uZSBuZXdsaW5lLCBhcyBPYnNpZGlhbidzIGZyb250IG1hdHRlciBibG9jayBhbHdheXMgZG9lcywgb3IgdGhlIGNsb3NpbmdcbiAgLy8gYC0tLWAgbW92ZXMgb2ZmIGl0cyBvd24gbGluZS4gQSBibG9jayB3aG9zZSBsYXN0IGtleSB3YXMgZHJvcHBlZCBjYW4gZW1pdCBub25lLCBzbyBpdCBpcyBub3JtYWxpemVkLCBub3QgdHJ1c3RlZC5cbiAgY29uc3Qgc3BsaWNlZEJvZHkgPSBgJHtlbWl0dGVkQm9keS5yZXBsYWNlKFRSQUlMSU5HX05FV0xJTkVfUkVHX0VYUCwgJycpfVxcbmA7XG5cbiAgcmV0dXJuIGNoZWNrSXNTZW1hbnRpY01hdGNoKHNwbGljZWRCb2R5LCBuZXdGcm9udG1hdHRlcikgPyBzcGxpY2VkQm9keSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUZsb3codmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gc3RyaW5naWZ5KHZhbHVlLCB7XG4gICAgLi4uT0JTSURJQU5fU1RSSU5HSUZZX09QVElPTlMsXG4gICAgY29sbGVjdGlvblN0eWxlOiAnZmxvdycsXG4gICAgZmxvd0NvbGxlY3Rpb25QYWRkaW5nOiBmYWxzZVxuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGdCQUFnQjtBQUN6QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVA7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFpQ1AsTUFBTSx5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
|