@mnaoumov/obsidian-lib 6.0.3 → 6.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/cjs/components/plugin-gate-component.cjs +33 -1
- package/dist/lib/cjs/components/plugin-gate-component.d.cts +16 -0
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/i18n/locales/en.cjs +2 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +1 -0
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +1 -0
- package/dist/lib/esm/components/plugin-gate-component.d.mts +16 -0
- package/dist/lib/esm/components/plugin-gate-component.mjs +33 -1
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/i18n/locales/en.d.mts +1 -0
- package/dist/lib/esm/i18n/locales/en.mjs +2 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +1 -0
- package/package.json +6 -3
|
@@ -306,6 +306,9 @@ class PluginGateComponent extends import_component_ex.ComponentEx {
|
|
|
306
306
|
if (this.isTooOld(dependency)) {
|
|
307
307
|
return this.createVersionMismatchMessage(dependency);
|
|
308
308
|
}
|
|
309
|
+
if (this.isRunning(dependency)) {
|
|
310
|
+
return this.createNoReadableApiMessage(dependency);
|
|
311
|
+
}
|
|
309
312
|
return (0, import_html_element.createFragmentWithCodeBlocks)((0, import_i18n.t)(($) => $.obsidianLib.pluginDependency.blockedNotice, {
|
|
310
313
|
dependencyPluginName: (0, import_html_element.asCodeBlock)(dependency.pluginName),
|
|
311
314
|
pluginName: (0, import_html_element.asCodeBlock)(this.plugin.manifest.name)
|
|
@@ -333,11 +336,20 @@ class PluginGateComponent extends import_component_ex.ComponentEx {
|
|
|
333
336
|
if (this.isTooOld(dependency)) {
|
|
334
337
|
return this.createVersionMismatchMessage(dependency);
|
|
335
338
|
}
|
|
339
|
+
if (this.isRunning(dependency)) {
|
|
340
|
+
return this.createNoReadableApiMessage(dependency);
|
|
341
|
+
}
|
|
336
342
|
return (0, import_html_element.createFragmentWithCodeBlocks)((0, import_i18n.t)(($) => $.obsidianLib.pluginDependency.dependencyLostNotice, {
|
|
337
343
|
dependencyPluginName: (0, import_html_element.asCodeBlock)(dependency.pluginName),
|
|
338
344
|
pluginName: (0, import_html_element.asCodeBlock)(this.plugin.manifest.name)
|
|
339
345
|
}));
|
|
340
346
|
}
|
|
347
|
+
createNoReadableApiMessage(dependency) {
|
|
348
|
+
return (0, import_html_element.createFragmentWithCodeBlocks)((0, import_i18n.t)(($) => $.obsidianLib.pluginDependency.noReadableApiNotice, {
|
|
349
|
+
dependencyPluginName: (0, import_html_element.asCodeBlock)(dependency.pluginName),
|
|
350
|
+
pluginName: (0, import_html_element.asCodeBlock)(this.plugin.manifest.name)
|
|
351
|
+
}));
|
|
352
|
+
}
|
|
341
353
|
createVersionMismatchMessage(dependency) {
|
|
342
354
|
return (0, import_html_element.createFragmentWithCodeBlocks)((0, import_i18n.t)(($) => $.obsidianLib.pluginDependency.versionMismatchNotice, {
|
|
343
355
|
dependencyPluginName: (0, import_html_element.asCodeBlock)(dependency.pluginName),
|
|
@@ -414,6 +426,26 @@ class PluginGateComponent extends import_component_ex.ComponentEx {
|
|
|
414
426
|
return true;
|
|
415
427
|
}
|
|
416
428
|
}
|
|
429
|
+
/**
|
|
430
|
+
* Decides whether an unsatisfied dependency is nonetheless enabled and loaded.
|
|
431
|
+
*
|
|
432
|
+
* Such a dependency is running but publishes no API this plugin can read — none at all, or one whose shape
|
|
433
|
+
* fails the contract. The usual cause is a release built on a copy of this library that publishes
|
|
434
|
+
* somewhere this one does not look, so "install and enable it" would be false and "update it" is the fix.
|
|
435
|
+
*
|
|
436
|
+
* Being in `enabledPlugins` is not enough: Obsidian's plain `disablePlugin` unloads a plugin and leaves it
|
|
437
|
+
* there (only `disablePluginAndSave` removes it), so a provider that went away would otherwise read as
|
|
438
|
+
* running with an unreadable API.
|
|
439
|
+
*
|
|
440
|
+
* @param dependency - The declared dependency.
|
|
441
|
+
* @returns Whether the dependency is enabled and loaded.
|
|
442
|
+
*/
|
|
443
|
+
isRunning(dependency) {
|
|
444
|
+
return (0, import_plugin_install_state.getInstalledPluginState)({
|
|
445
|
+
app: this.app,
|
|
446
|
+
pluginId: dependency.pluginId
|
|
447
|
+
}) === import_plugin_install_state.InstalledPluginState.Enabled && this.app.plugins.getPlugin(dependency.pluginId) !== null;
|
|
448
|
+
}
|
|
417
449
|
/**
|
|
418
450
|
* Decides whether a dependency is running but too old for this plugin, so the advice is "update it".
|
|
419
451
|
*
|
|
@@ -587,4 +619,4 @@ class PluginGateComponent extends import_component_ex.ComponentEx {
|
|
|
587
619
|
PluginConflictSeverity,
|
|
588
620
|
PluginGateComponent
|
|
589
621
|
});
|
|
590
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGdhdGUgb24gYSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2U6IHdoYXQgbXVzdCBiZSBQUkVTRU5UIGZvciBpdCB0byBydW4sIGFuZCB3aGF0IG11c3QgTk9UIGJlLlxuICpcbiAqIEJvdGggaGFsdmVzIGFuc3dlciB0aGUgc2FtZSBxdWVzdGlvbiDigJQgbWF5IHRoaXMgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIHJ1biByaWdodCBub3c/IOKAlCBzbyB0aGV5IGFyZSBvbmVcbiAqIGNvbXBvbmVudCByYXRoZXIgdGhhbiB0d28uIEEgc2Vjb25kLCBpbmRlcGVuZGVudCBnYXRlIHdvdWxkIGRvdWJsZS1sb2FkIHRoZSBzdXJmYWNlIGFuZCBzdGFjayBhIHNlY29uZFxuICogXCJibG9ja2VkXCIgc2V0dGluZ3MgdGFiIG9udG8gdGhlIHNhbWUgcGx1Z2luLCBhbmQgbmVpdGhlciBjb3VsZCBzZWUgdGhlIG90aGVyJ3MgcmVhc29uIGZvciByZWZ1c2luZy5cbiAqXG4gKiAjIyBEZXBlbmRlbmNpZXM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IGNhbm5vdCB3b3JrIHdpdGhvdXRcbiAqXG4gKiBUaGlzIGlzIHRoZSBzdHJpY3Qgc2libGluZyBvZiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudGAsIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgd2hvbGUgcG9pbnQuIEFcbiAqIFNVR0dFU1RJT04gaXMgYW4gb2ZmZXIg4oCUIHRoZSBob3N0IGtlZXBzIHdvcmtpbmcgd2l0aG91dCBpdCBhbmQgc2ltcGx5IGNhbm5vdCBkbyBvbmUgdGhpbmcuIEEgREVQRU5ERU5DWVxuICogaXMgYSByZXF1aXJlbWVudDogYG9ubG9hZEltcGxgIG5ldmVyIHJ1bnMsIG5vIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCwgbm8gaGFuZGxlciBpcyBpbnN0YWxsZWQsIG5vdGhpbmcgaXNcbiAqIHBhdGNoZWQuIFJlYWNoIGZvciBhIHN1Z2dlc3Rpb24gd2hlbiB0aGUgb3RoZXIgcGx1Z2luIGFkZHMgc29tZXRoaW5nOyByZWFjaCBmb3IgYSBkZXBlbmRlbmN5IHdoZW4gdGhlXG4gKiBob3N0J3MgYWR2ZXJ0aXNlZCBiZWhhdmlvciBpcyBub3QgdGhlcmUgd2l0aG91dCBpdC5cbiAqXG4gKiBPYnNpZGlhbiBoYXMgbm8gZGVwZW5kZW5jeSBmaWVsZCBpbiBhIG1hbmlmZXN0LCB3aGljaCBpcyBleGFjdGx5IHRoZSBwcm9ibGVtIHRoaXMgY2xvc2VzLiBXaXRob3V0IG9uZSxcbiAqIGEgdXNlciBtZWV0aW5nIGFuIHVuZmFtaWxpYXIgcGx1Z2luIGluIHRoZWlyIGxpc3QgbW9udGhzIGxhdGVyIGhhcyBub3RoaW5nIHRlbGxpbmcgdGhlbSBpdCBpc1xuICogbG9hZC1iZWFyaW5nIOKAlCB0aGV5IHJlbW92ZSBpdCwgYW5kIHRoZSBicmVha2FnZSBzdXJmYWNlcyB3ZWVrcyBhZnRlciB0aGF0IGFzIGRhbWFnZSB0aGV5IGNhbm5vdCBjb25uZWN0XG4gKiB0byBhbnl0aGluZyB0aGV5IGRpZC4gU28gdGhlIHJlbGF0aW9uc2hpcCBpcyBtYWRlIHZpc2libGUgZnJvbSBib3RoIGVuZHMgYW5kIGVuZm9yY2VkIHdoaWxlIGl0IGhvbGRzOlxuICogdGhlIGRlcGVuZGVudCBleHBsYWlucyBpdHNlbGYgd2hlcmUgdGhlIHVzZXIgaXMgbG9va2luZywgcmVwYWlycyBpdHNlbGYgaW4gb25lIGNsaWNrLCBhbmQgcmVhY3RzIHRoZVxuICogSU5TVEFOVCB0aGUgZGVwZW5kZW5jeSBnb2VzIGF3YXkgcmF0aGVyIHRoYW4gZGVncmFkaW5nIHF1aWV0bHkuXG4gKlxuICogVGhyZWUgY2hvaWNlcyBhcmUgZGVsaWJlcmF0ZSBhbmQgd29ydGggc3RhdGluZywgYmVjYXVzZSBlYWNoIGhhcyBhbiBvYnZpb3VzLWxvb2tpbmcgYWx0ZXJuYXRpdmU6XG4gKlxuICogLSAqKkJsb2NrZWQgbWVhbnMgZW5hYmxlZC1idXQtaW5lcnQsIG5ldmVyIHNlbGYtZGlzYWJsZWQuKiogQ2FsbGluZyBgZGlzYWJsZVBsdWdpbkFuZFNhdmVgIG9uIGl0c2VsZlxuICogICB3b3VsZCBiZSB0aGUgbGl0ZXJhbCByZWFkaW5nIG9mIFwicmVmdXNlcyB0byBsb2FkXCIsIGFuZCBpdCByZXdyaXRlcyBhIGNvbmZpZyB0aGF0IGJlbG9uZ3MgdG8gdGhlIHVzZXIg4oCUXG4gKiAgIHdobyB3b3VsZCB0aGVuIGhhdmUgdG8gcmVtZW1iZXIgdG8gcmUtZW5hYmxlIGl0IGFmdGVyIGZpeGluZyB0aGUgZGVwZW5kZW5jeS4gU3RheWluZyBlbmFibGVkIGFuZCBpbmVydFxuICogICBzYXlzIHRoZSBzYW1lIHRoaW5nIHRvIHRoZSB1c2VyLCBjaGFuZ2VzIG5vdGhpbmcgdGhleSBvd24sIGFuZCBjYW4gdW5kbyBpdHNlbGYuXG4gKiAtICoqQmxvY2tlZCBpcyBub3QgYW4gZXJyb3IuKiogVGhyb3dpbmcgZnJvbSBgb25sb2FkYCBtYXJrcyB0aGUgcGx1Z2luIGZhaWxlZCBpbiBPYnNpZGlhbiBhbmQgaGFuZHMgdGhlXG4gKiAgIHVzZXIgYSBzdGFjayB0cmFjZSBpbnN0ZWFkIG9mIGEgc2VudGVuY2UgYW5kIGEgYnV0dG9uLlxuICogLSAqKkEgZGVwZW5kZW5jeSBtdXN0IHB1Ymxpc2ggYW4gQVBJLioqIFRoYXQgaXMgd2hhdCBtYWtlcyBwcmVzZW5jZSwgYWJzZW5jZSwgdmVyc2lvbiBhbmQgZGVwYXJ0dXJlIGFsbFxuICogICBvYnNlcnZhYmxlIHRocm91Z2ggb25lIG1lY2hhbmlzbSDigJQgYHdhdGNoUGx1Z2luQXBpYCdzIHJlZmVyZW5jZSBpcyBsaXZlLCBpcyByZXZva2VkIHdoZW4gdGhlIHByb3ZpZGVyXG4gKiAgIHVubG9hZHMsIGFuZCBhbHJlYWR5IGNsYXNzaWZpZXMgbm90LWluc3RhbGxlZCBhZ2FpbnN0IG5vdC1lbmFibGVkIGFnYWluc3QgdG9vLW9sZC4gQSBwcm92aWRlciB3aXRoXG4gKiAgIG5vdGhpbmcgdG8gZXhwb3NlIGNhbiBwdWJsaXNoIGFuIGVtcHR5IEFQSSBwdXJlbHkgc28gaXQgY2FuIGJlIGRlcGVuZGVkIHVwb247IHRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZVxuICogICBhIHNlY29uZCwgd2Vha2VyIGRldGVjdGlvbiBwYXRoIHRvIG1haW50YWluIGJlc2lkZSBpdC5cbiAqXG4gKiAjIyBDb25mbGljdHM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IHJlZnVzZXMgdG8gcnVuIGJlc2lkZVxuICpcbiAqIFRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCwgYW5kIGl0IG5lZWRzIGl0cyBvd24gZGV0ZWN0aW9uIHBhdGggYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBvbmUgZG9lcyBub3QgZml0LlxuICogQSBjb25mbGljdGluZyBwbHVnaW4gaXMgdHlwaWNhbGx5IGFuIE9MRCB2ZXJzaW9uIG9mIHNvbWUgb3RoZXIgcGx1Z2luIHRoYXQgc3RpbGwgb3ducyBiZWhhdmlvciB0aGlzIG9uZVxuICogaGFzIHRha2VuIG92ZXIg4oCUIGl0IHB1Ymxpc2hlcyBubyBBUEkgYXQgYWxsLCBzbyB0aGVyZSBpcyBubyBgYXBpVmVyc2lvblJhbmdlYCB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogVGhlIGFyZ3VtZW50IGZvciByZWZ1c2luZyByYXRoZXIgdGhhbiBjb21wZXRpbmcgY29tZXMgZnJvbSB0aGUgY2FzZSB0aGlzIGdlbmVyYWxpemVzOiB0d28gcmVuYW1lL2RlbGV0ZVxuICogaGFuZGxlcnMgYWN0aW5nIG9uIG9uZSByZW5hbWUgY29ycnVwdCBsaW5rcyBhbmQgbW92ZSBhdHRhY2htZW50cyB0d2ljZSwgYW5kIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0b1xuICogd2luIHRoYXQgcmFjZSDigJQgYSBoYW5kbGVyIGlzIGVsZWN0ZWQgYnkgcmVnaXN0cnkgb3JkZXIsIGJ1dCB0aGUgcGF0Y2hlcyB0aGF0IGRvIHRoZSB3b3JrIHNpdCBvdXRzaWRlXG4gKiB0aGF0IGVsZWN0aW9uLCBzbyB3aGljaGV2ZXIgcGx1Z2luIGxvYWRlZCBmaXJzdCBrZWVwcyBhIGhhbmQgb24gdGhlIHdoZWVsLiBFdmVyeSBzY2hlbWUgZm9yIHNlaXppbmdcbiAqIGNvbnRyb2wgZnJvbSBpbnNpZGUgaXMgbG9hZC1vcmRlciBkZXBlbmRlbnQuIFJlZnVzaW5nIGlzIGRldGVybWluaXN0aWMgd2hlcmUgY29tcGV0aW5nIGlzIG5vdCwgYW5kIGFcbiAqIHZhdWx0IHRoYXQgYnJpZWZseSBoYXMgbm8gaGFuZGxlciBpcyBhIGZhciBiZXR0ZXIgb3V0Y29tZSB0aGFuIG9uZSB3aXRoIHR3by5cbiAqXG4gKiBUd28gZGV0YWlscyBvZiB0aGF0IGRldGVjdGlvbiBjYXJyeSBvdmVyIHZlcmJhdGltLCBiZWNhdXNlIGJvdGggYXJlIGxvYWQtYmVhcmluZzpcbiAqXG4gKiAtICoqVmVyc2lvbnMgYXJlIHJlYWQsIG5ldmVyIHRoZSByZWdpc3RyeS4qKiBBIHBsdWdpbiB0aGF0IGhhcyBub3QgbG9hZGVkIHlldCBoYXMgcmVnaXN0ZXJlZCBub3RoaW5nLCBzb1xuICogICBhc2tpbmcgdGhlIHJlZ2lzdHJ5IGdpdmVzIGEgZGlmZmVyZW50IGFuc3dlciBkZXBlbmRpbmcgb24gd2hlbiBpdCBpcyBhc2tlZC4gYGFwcC5wbHVnaW5zLm1hbmlmZXN0c2AgaXNcbiAqICAgcG9wdWxhdGVkIGZvciBldmVyeSBpbnN0YWxsZWQgcGx1Z2luIGF0IHN0YXJ0dXAsIHdoYXRldmVyIHRoZSBsb2FkIG9yZGVyIHR1cm5zIG91dCB0byBiZS5cbiAqIC0gKipBbiB1bnBhcnNlYWJsZSB2ZXJzaW9uIGNvdW50cyBhcyBjb25mbGljdGluZy4qKiBGYWlsaW5nIGNsb3NlZCBpcyB0aGUgc2FmZSBkaXJlY3Rpb246IGEgZmFsc2UgYWxhcm1cbiAqICAgY29zdHMgYSBub3RpY2UsIGEgZmFsc2UgYWxsLWNsZWFyIGNvc3RzIGEgdmF1bHQuXG4gKlxuICogTm90IGV2ZXJ5IG92ZXJsYXAgaXMgdGhhdCBzZXZlcmUsIHdoaWNoIGlzIHdoeSBhIGNvbmZsaWN0IGRlY2xhcmVzIGEge0BsaW5rIFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHl9LlxuICogVHdvIHBsdWdpbnMgc2hpcHBpbmcgdGhlIHNhbWUgY29tbWFuZCBkdXBsaWNhdGUgYSBwYWxldHRlIGVudHJ5IGFuZCBkbyB0aGUgd29yayB0d2ljZSDigJQgYW5ub3lpbmcsIG5vdFxuICogY29ycnVwdGluZyDigJQgYW5kIHJlZnVzaW5nIHRvIGxvYWQgb3ZlciB0aGF0IHdvdWxkIGJlIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHRoZSBvdmVybGFwLiBUaG9zZSBkZWNsYXJlXG4gKiB7QGxpbmsgUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJufSBhbmQgYm90aCBrZWVwIHJ1bm5pbmcuXG4gKlxuICogIyMgV2hhdCB0aGlzIGNhbiBhbmQgY2Fubm90IHNlZVxuICpcbiAqIE9ic2lkaWFuIHJhaXNlcyBubyBldmVudCB3aGVuIEFOT1RIRVIgcGx1Z2luIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgKHNlZSBgcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHNgKSxcbiAqIHNvIGxpdmUgY29uZmxpY3QgZGV0ZWN0aW9uIGhhcyBhIHJlYWwgY2VpbGluZyBhbmQgaXQgaXMgc3RhdGVkIGhlcmUgcmF0aGVyIHRoYW4gaW1wbGllZCBhd2F5LiBBXG4gKiBjb25mbGljdGluZyBwbHVnaW4gYnVpbHQgb24gdGhpcyBsaWJyYXJ5IGFubm91bmNlcyBpdHNlbGYgdGhyb3VnaCB0aGUgbGlmZWN5Y2xlIGJyb2FkY2FzdCwgYW5kIGlzXG4gKiB0aGVyZWZvcmUgY2F1Z2h0IHRoZSBtb21lbnQgaXQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gT25lIHRoYXQgaXMgbm90IOKAlCBhbiBvbGQgcmVsZWFzZSBwcmVkYXRpbmcgdGhlXG4gKiBicm9hZGNhc3QsIG9yIGEgcGx1Z2luIGJ5IGFub3RoZXIgYXV0aG9yIGVudGlyZWx5IOKAlCBpcyBjYXVnaHQgYXQgdGhlIG5leHQgbG9hZCwgd2hpY2ggaXMgd2hlbiBpdHNcbiAqIG1hbmlmZXN0IGlzIHJlYWQuXG4gKlxuICogIyMgV2h5IGEgbG9zcyBpcyBhbm5vdW5jZWQgbGF0ZVxuICpcbiAqIE9ic2lkaWFuIHVwZGF0ZXMgYW4gZW5hYmxlZCBwbHVnaW4gYnkgcmVsb2FkaW5nIGl0OiB0aGUgb2xkIGNvcHkgdW5sb2FkcywgdGhlIG5ldyBvbmUgbG9hZHMuIEZvciB0aGVcbiAqIG1vbWVudCBpbiBiZXR3ZWVuIHRoZSBwcm92aWRlcidzIEFQSSBpcyByZXZva2VkLCBzbyBldmVyeSBkZXBlbmRlbnQgc2VlcyBpdHMgZGVwZW5kZW5jeSBnbyBhd2F5IGFuZFxuICogY29tZSBiYWNrLiBUaGUgZmVhdHVyZSBzdXJmYWNlIHN0aWxsIGNvbWVzIGRvd24gYXQgb25jZSDigJQgdGhlIGRlcGVuZGVuY3kgcmVhbGx5IGlzIGdvbmUgZm9yIHRoYXRcbiAqIG1vbWVudCDigJQgYnV0IHRoZSBub3RpY2Ugd2FpdHMge0BsaW5rIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFN9LCBhbmQgYSBsb3NzIHRoYXRcbiAqIGhlYWxlZCBpbiB0aGUgbWVhbnRpbWUgaXMgbmV2ZXIgYW5ub3VuY2VkLiBXaXRob3V0IHRoYXQsIHVwZGF0aW5nIG9uZSBwbHVnaW4gcHV0IGEgXCJubyBsb25nZXJcbiAqIGF2YWlsYWJsZVwiIG5vdGljZSBvbiBzY3JlZW4gaW4gZXZlcnkgcGx1Z2luIGRlcGVuZGluZyBvbiBpdCwgZGVzY3JpYmluZyBhIHN0YXRlIHRoYXQgbm8gbG9uZ2VyIGhlbGQgYnlcbiAqIHRoZSB0aW1lIHRoZSB1c2VyIHJlYWQgaXQuIEEgbG9zcyB0aGUgdXNlciBjYXVzZWQgb24gcHVycG9zZSDigJQgZGlzYWJsaW5nIG9yIHVuaW5zdGFsbGluZyB0aGVcbiAqIGRlcGVuZGVuY3kg4oCUIG91dGxhc3RzIHRoZSB3aW5kb3cgYW5kIGlzIGFubm91bmNlZCBhcyBiZWZvcmUsIG9ubHkgYSBmZXcgc2Vjb25kcyBsYXRlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgUGx1Z2luXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGNvbXBhcmUgYXMgY29tcGFyZVZlcnNpb25zLFxuICBzYXRpc2ZpZXMgYXMgc2F0aXNmaWVzVmVyc2lvblxufSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudCxcbiAgUGx1Z2luU2V0dGluZ1RhYlxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luQXBpUmVmIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1hcGkudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWUsXG4gIFBsdWdpbkxpZmVjeWNsZUV2ZW50UGF5bG9hZFxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgZGlzYWJsZUNvbW11bml0eVBsdWdpbiB9IGZyb20gJy4uL2NvbW11bml0eS1wbHVnaW5zLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7XG4gIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUsXG4gIGFzQ29kZUJsb2NrLFxuICBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzXG59IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7XG4gIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLFxuICB3YXRjaFBsdWdpbkFwaVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQge1xuICBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSxcbiAgZ2V0SW5zdGFsbGVkUGx1Z2luVmVyc2lvbixcbiAgaW5zdGFsbEFuZEVuYWJsZVBsdWdpbixcbiAgSW5zdGFsbGVkUGx1Z2luU3RhdGUsXG4gIHVwZGF0ZVBsdWdpblxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWluc3RhbGwtc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FLFxuICBQTFVHSU5fVU5MT0FERURfRVZFTlRfTkFNRVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJBc3luY0V2ZW50IH0gZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgQ2FsbGJhY2tMYXlvdXRSZWFkeUNvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LXJlYWR5LWNvbXBvbmVudC50cyc7XG5cbi8qKlxuICogSG93IGxvbmcgYSBnYXRlIHRoYXQgY2xvc2VkIHdoaWxlIHRoZSBwbHVnaW4gd2FzIHJ1bm5pbmcgd2FpdHMgYmVmb3JlIHNheWluZyBzby5cbiAqXG4gKiBMb25nIGVub3VnaCB0byBjb3ZlciBPYnNpZGlhbiByZWxvYWRpbmcgYSBwbHVnaW4gdG8gYXBwbHkgaXRzIHVwZGF0ZSwgc2hvcnQgZW5vdWdoIHRoYXQgYSB1c2VyIHdob1xuICogZGlzYWJsZWQgdGhlIGRlcGVuZGVuY3kgYnkgaGFuZCBzdGlsbCBjb25uZWN0cyB0aGUgbm90aWNlIHRvIHdoYXQgdGhleSBqdXN0IGRpZC5cbiAqL1xuY29uc3QgTE9TU19BTk5PVU5DRU1FTlRfR1JBQ0VfUEVSSU9EX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbi8qKlxuICogSG93IGJhZGx5IHR3byBwbHVnaW5zIHJ1bm5pbmcgc2lkZSBieSBzaWRlIGdvZXMgd3JvbmcsIGFuZCB0aGVyZWZvcmUgd2hhdCB0aGlzIG9uZSBkb2VzIGFib3V0IGl0LlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5Db25mbGljdFNldmVyaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBob3N0IHJlZnVzZXMgdG8gcnVuIGF0IGFsbCB3aGlsZSB0aGUgY29uZmxpY3QgaG9sZHM6IGBvbmxvYWRJbXBsYCBuZXZlciBydW5zLCBub3RoaW5nIGlzXG4gICAqIHJlZ2lzdGVyZWQsIGFuZCB0aGUgcGx1Z2luIGV4cGxhaW5zIGl0c2VsZiB0aGUgd2F5IGEgbWlzc2luZyBkZXBlbmRlbmN5IGRvZXMuXG4gICAqXG4gICAqIEZvciBhbiBvdmVybGFwIHdoZXJlIGJvdGggcGx1Z2lucyBhY3Rpbmcgb24gdGhlIHNhbWUgb3BlcmF0aW9uIGRhbWFnZXMgdGhlIHZhdWx0LlxuICAgKi9cbiAgQmxvY2sgPSAnYmxvY2snLFxuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBydW5zIGFueXdheSBhbmQgc2F5cyB0aGUgb3ZlcmxhcCBpcyB0aGVyZS5cbiAgICpcbiAgICogRm9yIGFuIG92ZXJsYXAgdGhhdCBpcyBhbm5veWluZyByYXRoZXIgdGhhbiBkZXN0cnVjdGl2ZSDigJQgZHVwbGljYXRlIGNvbW1hbmRzLCB3b3JrIGRvbmUgdHdpY2Ug4oCUIHdoZXJlXG4gICAqIHJlZnVzaW5nIHRvIGxvYWQgd291bGQgY29zdCB0aGUgdXNlciBtb3JlIHRoYW4gdGhlIG92ZXJsYXAgZG9lcy5cbiAgICovXG4gIFdhcm4gPSAnd2Fybidcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiByZWZ1c2VzIHRvIHJ1biBiZXNpZGUsIG9yIHdhcm5zIGFib3V0IHJ1bm5pbmcgYmVzaWRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkNvbmZsaWN0IHtcbiAgLyoqXG4gICAqIFRoZSBzZW12ZXIgcmFuZ2Ugb2YgdGhlIE9USEVSIHBsdWdpbidzIHZlcnNpb25zIHRoYXQgY29uZmxpY3QsIGUuZy4gYCc8MTIuMC4wJ2AgZm9yIFwiZXZlcnkgdmVyc2lvblxuICAgKiBiZWZvcmUgdGhlIG9uZSB0aGF0IGdhdmUgdGhpcyBiZWhhdmlvciB1cFwiLlxuICAgKlxuICAgKiBBIHJhbmdlIHJhdGhlciB0aGFuIGEgbWluaW11bSwgc28gYW4gb3ZlcmxhcCBjb25maW5lZCB0byBvbmUgbWFqb3IgKGAnPj0zIDw0J2ApIGlzIGV4cHJlc3NpYmxlLCBhbmQgc29cbiAgICogaXMgYSBwbHVnaW4gdGhhdCBjb25mbGljdHMgYXQgZXZlcnkgdmVyc2lvbiDigJQgc3BlbGwgdGhhdCBgJz49MC4wLjAnYCwgc2luY2UgYGNvbXBhcmUtdmVyc2lvbnNgIHJlamVjdHNcbiAgICogYSBiYXJlIGAqYC4gRXZhbHVhdGVkIGFnYWluc3QgYG1hbmlmZXN0LnZlcnNpb25gOyBhIHZlcnNpb24gdGhhdCBjYW5ub3QgYmUgcGFyc2VkIGNvdW50cyBhc1xuICAgKiBjb25mbGljdGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZsaWN0aW5nVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIGFzIGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIHNob3duIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxvY2FsaXplZCBzZW50ZW5jZSBzYXlpbmcgd2hhdCBnb2VzIHdyb25nIHdoZW4gYm90aCBydW4sIHNob3duIGluIHRoZSBiYW5uZXIuXG4gICAqXG4gICAqIFRoZSBkZWNsYXJpbmcgcGx1Z2luIG93bnMgdGhpcyBzdHJpbmcgYmVjYXVzZSBvbmx5IGl0IGtub3dzIHdoYXQgdGhlIHR3byBvZiB0aGVtIGNvbGxpZGUgb3ZlciwgYW5kIGFcbiAgICogdXNlciBiZWluZyBhc2tlZCB0byBkaXNhYmxlIHNvbWV0aGluZyBkZXNlcnZlcyB0byBiZSB0b2xkIHdoeS5cbiAgICpcbiAgICogUGFzcyBhIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSB0byBtYXJrIHVwIHBhcnQgb2YgdGhlIHNlbnRlbmNlLCBzdWNoIGFzIGEgcGx1Z2luIG5hbWUgcmVuZGVyZWQgYXNcbiAgICogY29kZS4gRWFjaCByZW5kZXIgYXBwZW5kcyBhIGZyZXNoIGNsb25lIG9mIGl0LCBzaW5jZSB0aGUgYmFubmVyIGlzIHJlbmRlcmVkIGFnYWluIG9uIGV2ZXJ5IHJlZnJlc2guXG4gICAqL1xuICByZWFkb25seSByZWFzb246IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhpcyBwbHVnaW4gZG9lcyBhYm91dCB0aGUgY29uZmxpY3QuXG4gICAqL1xuICByZWFkb25seSBzZXZlcml0eTogUGx1Z2luQ29uZmxpY3RTZXZlcml0eTtcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiBjYW5ub3Qgd29yayB3aXRob3V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkRlcGVuZGVuY3kge1xuICAvKipcbiAgICogVGhlIHNlbXZlciByYW5nZSBvZiBBUEkgY29udHJhY3QgdmVyc2lvbnMgdGhlIGRlcGVuZGVudCBjb21waWxlZCBhZ2FpbnN0LCBlLmcuIGAnXjInYC5cbiAgICpcbiAgICogQSBkZXBlbmRlbmN5IHdob3NlIHB1Ymxpc2hlZCBBUEkgZmFsbHMgb3V0c2lkZSB0aGUgcmFuZ2UgY291bnRzIGFzIFVOU0FUSVNGSUVELCB3aGljaCBpcyB3aGF0IHR1cm5zIGFcbiAgICogc2lsZW50IGJlaGF2aW9yYWwgbWlzbWF0Y2ggYmV0d2VlbiB0d28gaW5kZXBlbmRlbnRseSByZWxlYXNlZCBwbHVnaW5zIGludG8gYSB2aXNpYmxlIFwidXBkYXRlIHRoaXNcbiAgICogb25lXCIgbWVzc2FnZS4gU3BlbGwgXCJhbnkgdmVyc2lvblwiIGFzIGAnPj0wLjAuMCdgIOKAlCBgY29tcGFyZS12ZXJzaW9uc2AgcmVqZWN0cyBhIGJhcmUgYCpgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGRlc3QgcmVsZWFzZSBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luIHRoZSBkZXBlbmRlbnQgd29ya3Mgd2l0aCwgZS5nLiBgJzIuMi4wJ2AuXG4gICAqXG4gICAqIEZvciBhIHByb3ZpZGVyIHdob3NlIEJFSEFWSU9SIGNoYW5nZWQgd2hpbGUgaXRzIEFQSSBjb250cmFjdCBzdGF5ZWQgdGhlIHNhbWUsIHdoaWNoXG4gICAqIHtAbGluayBhcGlWZXJzaW9uUmFuZ2V9IGNhbm5vdCBzZWUuIEEgZGVwZW5kZW5jeSBlbmFibGVkIGJlbG93IGl0IGNvdW50cyBhcyBVTlNBVElTRklFRCBhbmQgYXNrcyB0aGVcbiAgICogdXNlciB0byB1cGRhdGUgaXQuIEV2YWx1YXRlZCBhZ2FpbnN0IGBtYW5pZmVzdC52ZXJzaW9uYDsgYSB2ZXJzaW9uIHRoYXQgY2Fubm90IGJlIHBhcnNlZCBjb3VudHMgYXMgdG9vXG4gICAqIG9sZC4gQSBtaW5pbXVtIHJhdGhlciB0aGFuIGEgcmFuZ2UsIGJlY2F1c2UgdGhlIG9ubHkgYWR2aWNlIHRoZSBnYXRlIGNhbiBnaXZlIGlzIFwidXBkYXRlIGl0XCIsIGFuZCBhblxuICAgKiB1cHBlciBib3VuZCBpcyBhIHZlcnNpb24gbm8gdXBkYXRlIHJlYWNoZXMuXG4gICAqL1xuICByZWFkb25seSBtaW5QbHVnaW5WZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luLCBhcyBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2luIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luLCBzaG93biB0byB0aGUgdXNlci5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQSBsb2NhbGl6ZWQgc2VudGVuY2Ugc2F5aW5nIHdoYXQgdGhlIGRlcGVuZGVudCBkb2VzIHdpdGggdGhpcyBwbHVnaW4sIHNob3duIGluIHRoZSBzZXR0aW5ncyBiYW5uZXIuXG4gICAqXG4gICAqIFRoZSBkZXBlbmRlbnQgb3ducyB0aGlzIHN0cmluZyBiZWNhdXNlIG9ubHkgaXQga25vd3Mgd2hhdCBpdCB1c2VzIHRoZSBvdGhlciBwbHVnaW4gZm9yLCBhbmQgYSB1c2VyXG4gICAqIGJlaW5nIGFza2VkIHRvIGluc3RhbGwgc29tZXRoaW5nIGRlc2VydmVzIHRvIGJlIHRvbGQgd2h5LlxuICAgKlxuICAgKiBQYXNzIGEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHRvIG1hcmsgdXAgcGFydCBvZiB0aGUgc2VudGVuY2UsIHN1Y2ggYXMgYSBwbHVnaW4gbmFtZSByZW5kZXJlZCBhc1xuICAgKiBjb2RlLiBFYWNoIHJlbmRlciBhcHBlbmRzIGEgZnJlc2ggY2xvbmUgb2YgaXQsIHNpbmNlIHRoZSBiYW5uZXIgaXMgcmVuZGVyZWQgYWdhaW4gb24gZXZlcnkgcmVmcmVzaC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkdhdGVDb21wb25lbnR9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkdhdGVDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29uZmxpY3RzIHRvIGVuZm9yY2UuIEFuIGVtcHR5IGxpc3QgbWVhbnMgdGhlIHBsdWdpbiByZWZ1c2VzIHRvIHJ1biBiZXNpZGUgbm90aGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXTtcblxuICAvKipcbiAgICogVGhlIGRlcGVuZGVuY2llcyB0byBlbmZvcmNlLiBBbiBlbXB0eSBsaXN0IG1lYW5zIHRoZSBwbHVnaW4gZGVwZW5kcyBvbiBub3RoaW5nLCBhbmQgaXRzIGZlYXR1cmVcbiAgICogc3VyZmFjZSBsb2FkcyBpbW1lZGlhdGVseS5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdO1xuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgaG9zdCBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UuIENhbGxlZCBvbmNlIGV2ZXJ5IGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIGFuZCBubyBibG9ja2luZ1xuICAgKiBjb25mbGljdCBob2xkcywgYW5kIGFnYWluIGFmdGVyIGEgZ2F0ZSB0aGF0IGhhZCBjbG9zZWQgb3BlbnMgYmFjayB1cC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBzdXJmYWNlIGlzIGxvYWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgcGx1Z2luIOKAlCB0aGUgb25lIGRlY2xhcmluZyB0aGUgZGVwZW5kZW5jaWVzIGFuZCBjb25mbGljdHMuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgcGx1Z2luJ3Mgbm90aWNlIGNvbXBvbmVudCwgdXNlZCB0byBzYXkgd2hhdCBpcyBtaXNzaW5nLCB3aGF0IGlzIGluIHRoZSB3YXksIGFuZCB3aGF0IGNoYW5nZWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogVW5sb2FkcyB0aGUgaG9zdCBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UuIENhbGxlZCB3aGVuIGEgZ2F0ZSB0aGF0IGhhZCBiZWVuIG9wZW4gY2xvc2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5sb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYn0gY29uc3RydWN0b3IuXG4gKi9cbmludGVyZmFjZSBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYkNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBibG9ja2VkIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBibG9ja2VkIGV4cGxhbmF0aW9uIGludG8gdGhlIHRhYidzIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIHRhYidzIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBzZXR0aW5ncyB0YWIgYSBibG9ja2VkIHBsdWdpbiBzaG93cyBpbiBwbGFjZSBvZiB0aGUgb25lIGl0IG5ldmVyIGdvdCB0byByZWdpc3Rlci5cbiAqXG4gKiBBIGJsb2NrZWQgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIG5ldmVyIHJhbiwgc28gaXRzIHJlYWwgc2V0dGluZ3MgdGFiIGRvZXMgbm90IGV4aXN0IOKAlCBhbmQgYSB1c2VyIHdobyBnb2VzXG4gKiBsb29raW5nIGZvciB0aGUgcGx1Z2luJ3Mgc2V0dGluZ3MgaXMgcHJlY2lzZWx5IHRoZSB1c2VyIGFza2luZyBcIndoeSBpc24ndCB0aGlzIGRvaW5nIGFueXRoaW5nP1wiLiBBblxuICogZW1wdHkgc3BhY2UgaXMgdGhlIHdvcnN0IHBvc3NpYmxlIGFuc3dlciB0byB0aGF0IHF1ZXN0aW9uLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9zZXR0aW5ncy10YWIvcHJlZmVyLXNldHRpbmctZGVmaW5pdGlvbnMgLS0gVGhpcyB0YWIgaGFzIG5vIHNldHRpbmdzIHRvIGRlY2xhcmUuIEl0IHN0YW5kcyBpbiBmb3IgYSBzZXR0aW5ncyB0YWIgdGhhdCBkb2VzIG5vdCBleGlzdCB5ZXQsIGNhcnJ5aW5nIGFuIGV4cGxhbmF0aW9uIGFuZCBhIHJlcGFpciBidXR0b24sIGFuZCB0aGUgcGx1Z2luJ3MgcmVhbCBzZXR0aW5ncyBhcHBlYXIgdGhlIG1vbWVudCB0aGUgZ2F0ZSBvcGVucy5cbmNsYXNzIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAbGluayBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMucGx1Z2luLmFwcCwgcGFyYW1zLnBsdWdpbik7XG4gICAgdGhpcy5yZW5kZXJCYW5uZXIgPSBwYXJhbXMucmVuZGVyQmFubmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHRhYi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNwbGF5KCk6IHZvaWQge1xuICAgIHRoaXMuY29udGFpbmVyRWwuZW1wdHkoKTtcbiAgICB0aGlzLnJlbmRlckJhbm5lcih0aGlzLmNvbnRhaW5lckVsKTtcbiAgfVxufVxuXG4vKipcbiAqIEVuZm9yY2VzIGEgcGx1Z2luJ3MgbWFuZGF0b3J5IGRlcGVuZGVuY2llcyBhbmQgZGVjbGFyZWQgY29uZmxpY3RzLCBnYXRpbmcgaXRzIGZlYXR1cmUgc3VyZmFjZSBvbiBib3RoLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luR2F0ZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbm5vdW5jZWRXYXJuaW5nUGx1Z2luSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpUmVmcyA9IG5ldyBNYXA8c3RyaW5nLCBQbHVnaW5BcGlSZWY8b2JqZWN0Pj4oKTtcbiAgcHJpdmF0ZSBibG9ja2VkU2V0dGluZ1RhYjogbnVsbCB8IFBsdWdpblNldHRpbmdUYWIgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXBlbmRlbmNpZXM6IHJlYWRvbmx5IFBsdWdpbkRlcGVuZGVuY3lbXTtcbiAgcHJpdmF0ZSBoYXNBbm5vdW5jZWRCbG9ja2VkID0gZmFsc2U7XG4gIHByaXZhdGUgaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGlzTGF5b3V0UmVhZHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgbG9zc0Fubm91bmNlbWVudFRpbWVySWQ6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHVubG9hZEZlYXR1cmVTdXJmYWNlOiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgZ2V0IGFwcCgpOiBBcHAge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5hcHA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGx1Z2luR2F0ZUNvbXBvbmVudH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkdhdGVDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25mbGljdHMgPSBwYXJhbXMuY29uZmxpY3RzO1xuICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gcGFyYW1zLmRlcGVuZGVuY2llcztcbiAgICB0aGlzLmxvYWRGZWF0dXJlU3VyZmFjZSA9IHBhcmFtcy5sb2FkRmVhdHVyZVN1cmZhY2U7XG4gICAgdGhpcy5wbHVnaW4gPSBwYXJhbXMucGx1Z2luO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnVubG9hZEZlYXR1cmVTdXJmYWNlID0gcGFyYW1zLnVubG9hZEZlYXR1cmVTdXJmYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgd2hldGhlciBhbnkgd2FybmluZyBjb25mbGljdCBpcyBpbiBmb3JjZSByaWdodCBub3cuXG4gICAqXG4gICAqIFRoZSBwcmVkaWNhdGUgYSBkZWNsYXJhdGl2ZSBzZXR0aW5ncyB0YWIgbmVlZHMsIGFuZCB0aGUgY291bnRlcnBhcnQgdG9cbiAgICogYFBsdWdpblN1Z2dlc3Rpb25Db21wb25lbnQuZ2V0U3VnZ2VzdGVkUGx1Z2luU3RhdGVgLiBTdWNoIGEgdGFiIGRlY2lkZXMgd2hldGhlciBhIHJvdyBleGlzdHNcbiAgICogQkVGT1JFIGl0IHJlbmRlcnMgYW55dGhpbmcgaW50byBpdCwgc28ge0BsaW5rIHJlbmRlckNvbmZsaWN0V2FybmluZ0Jhbm5lcn0gd3JpdGluZyBub3RoaW5nIGNhbm5vdFxuICAgKiBhbnN3ZXIgdGhlIHF1ZXN0aW9uIGZvciBpdCDigJQgYSByb3cgdGhhdCByZW5kZXJzIGVtcHR5IGlzIHN0aWxsIGEgcm93LCB3aXRoIHRoZSBkaXZpZGVyIGFuZCBwYWRkaW5nXG4gICAqIGV2ZXJ5IG90aGVyIHNldHRpbmcgaGFzLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIGF0IGxlYXN0IG9uZSBkZWNsYXJlZCB3YXJuaW5nIGNvbmZsaWN0IGhvbGRzLlxuICAgKi9cbiAgcHVibGljIGhhc0FjdGl2ZVdhcm5pbmdDb25mbGljdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuV2FybikubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgd2F0Y2hpbmcgZXZlcnkgZGVjbGFyZWQgZGVwZW5kZW5jeSBhbmQgY29uZmxpY3QuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuICAgICAgY29uc3QgYXBpUmVmID0gd2F0Y2hQbHVnaW5BcGk8b2JqZWN0Pih7XG4gICAgICAgIGFwaVZlcnNpb25SYW5nZTogZGVwZW5kZW5jeS5hcGlWZXJzaW9uUmFuZ2UsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWRcbiAgICAgIH0pO1xuICAgICAgcmVnaXN0ZXJBc3luY0V2ZW50KFxuICAgICAgICB0aGlzLFxuICAgICAgICBhcGlSZWYub24oJ2NoYW5nZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLmFwaVJlZnMuc2V0KGRlcGVuZGVuY3kucGx1Z2luSWQsIGFwaVJlZik7XG4gICAgfVxuXG4gICAgLy8gQSBjb25mbGljdCBoYXMgbm8gQVBJIHRvIHdhdGNoIOKAlCBpdCBpcyByZWFkIG91dCBvZiB0aGUgbWFuaWZlc3RzIOKAlCBzbyB0aGUgdHJpZ2dlciB0byByZS1yZWFkIGlzIHRoZVxuICAgIC8vIGxpYnJhcnkncyBvd24gbGlmZWN5Y2xlIGJyb2FkY2FzdC4gSXQgY292ZXJzIGV2ZXJ5IGNvbmZsaWN0aW5nIHBsdWdpbiBidWlsdCBvbiB0aGlzIGxpYnJhcnk7IG9uZVxuICAgIC8vIHRoYXQgaXMgbm90IGlzIGNhdWdodCBhdCB0aGUgbmV4dCBsb2FkLCBhcyB0aGUgZmlsZSBoZWFkZXIgc2F5cy5cbiAgICBjb25zdCBsaWZlY3ljbGVFdmVudE5hbWVzOiBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWVbXSA9IFtQTFVHSU5fTE9BREVEX0VWRU5UX05BTUUsIFBMVUdJTl9VTkxPQURFRF9FVkVOVF9OQU1FXTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBvZiBsaWZlY3ljbGVFdmVudE5hbWVzKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKFxuICAgICAgICBldmVudE5hbWUsXG4gICAgICAgIGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAocGF5bG9hZDogUGx1Z2luTGlmZWN5Y2xlRXZlbnRQYXlsb2FkKSA9PiB7XG4gICAgICAgICAgaWYgKHBheWxvYWQucGx1Z2luSWQgPT09IHRoaXMucGx1Z2luLm1hbmlmZXN0LmlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICB9XG5cbiAgICAvLyBOb3RoaW5nIGlzIFNBSUQgYWJvdXQgYSBtaXNzaW5nIGRlcGVuZGVuY3kgdW50aWwgdGhlIGxheW91dCBpcyByZWFkeS4gUGx1Z2lucyBsb2FkIGluIGFuIHVuc3BlY2lmaWVkXG4gICAgLy8gb3JkZXIsIHNvIGEgZGVwZW5kZW5jeSB0aGF0IHNpbXBseSBoYXMgbm90IGxvYWRlZCB5ZXQgaXMgaW5kaXN0aW5ndWlzaGFibGUgYXQgdGhpcyBwb2ludCBmcm9tIG9uZVxuICAgIC8vIHRoYXQgaXMgbm90IGluc3RhbGxlZCDigJQgYW5ub3VuY2luZyBoZXJlIHdvdWxkIHB1dCBhIFwibWlzc2luZyBwbHVnaW5cIiBub3RpY2Ugb24gc2NyZWVuIGF0IGV2ZXJ5XG4gICAgLy8gc3RhcnR1cCBhbmQgdGFrZSBpdCBhd2F5IGEgbW9tZW50IGxhdGVyLiBUaGUgZ2F0ZSBpdHNlbGYgZG9lcyBub3Qgd2FpdDogdGhlIHN1cmZhY2UgbG9hZHMgdGhlXG4gICAgLy8gaW5zdGFudCB0aGUgZGVwZW5kZW5jeSBpcyB0aGVyZSwgd2hlbmV2ZXIgdGhhdCBpcy5cbiAgICB0aGlzLmFkZENoaWxkKFxuICAgICAgbmV3IENhbGxiYWNrTGF5b3V0UmVhZHlDb21wb25lbnQodGhpcy5hcHAsICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0xheW91dFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcmVzZW50VW5zYXRpc2ZpZWQodGhpcy5nZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpLCB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5LkJsb2NrKSk7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VXYXJuaW5ncygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlcigoKSA9PiB7XG4gICAgICB0aGlzLmNhbmNlbExvc3NBbm5vdW5jZW1lbnQoKTtcbiAgICAgIHRoaXMuaGlkZUJsb2NrZWRTZXR0aW5nVGFiKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIHRoZSBnYXRlIG9uY2UgdGhlIHdhdGNoZXMgYXJlIGluIHBsYWNlLCBsb2FkaW5nIHRoZSBmZWF0dXJlIHN1cmZhY2UgaWYgaXQgaXMgYWxyZWFkeSBvcGVuLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGZpcnN0IGV2YWx1YXRpb24gaXMgY29tcGxldGUuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgb25sb2FkQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBhIGJhbm5lciBmb3IgZXZlcnkgY29uZmxpY3QgdGhlIGhvc3QgaXMgcnVubmluZyBhbG9uZ3NpZGUsIHNvIGEgcGx1Z2luIGNhbiBwdXQgdGhlIG92ZXJsYXAgaW5cbiAgICogaXRzIG93biBzZXR0aW5ncyB0YWIuXG4gICAqXG4gICAqIENvbnN1bWVyLWludm9rZWQsIGV4YWN0bHkgbGlrZSBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudC5yZW5kZXJCYW5uZXJgOiB0aGUgbGlicmFyeSByZWdpc3RlcnMgdGhlXG4gICAqIHNldHRpbmdzIHRhYiBhIEJMT0NLRUQgcGx1Z2luIG5lZWRzLCBiZWNhdXNlIHRoYXQgcGx1Z2luIG5ldmVyIGdvdCB0byByZWdpc3RlciBvbmUgb2YgaXRzIG93biwgYnV0IGl0XG4gICAqIGhhcyBubyBob29rIGludG8gdGhlIHRhYiBhIHJ1bm5pbmcgcGx1Z2luIGJ1aWxkcy4gUmVuZGVycyBub3RoaW5nIHdoZW4gbm8gd2FybmluZyBjb25mbGljdCBob2xkcy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyQ29uZmxpY3RXYXJuaW5nQmFubmVyKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY29uZmxpY3Qgb2YgdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKSkge1xuICAgICAgdGhpcy5yZW5kZXJDb25mbGljdEVudHJ5KGNvbnRhaW5lckVsLCBjb25mbGljdCwgdGhpcy5jcmVhdGVDb25mbGljdFdhcm5pbmdNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgd2hhdCB3ZW50IGF3YXkgd2hpbGUgdGhlIHBsdWdpbiB3YXMgcnVubmluZywgbm93IHRoYXQgdGhlIGdyYWNlIHBlcmlvZCBpcyBvdmVyLlxuICAgKlxuICAgKiBSZS1yZWFkcyB0aGUgZ2F0ZSByYXRoZXIgdGhhbiB0cnVzdGluZyB3aGF0IGNsb3NlZCBpdCwgc28gYSBkZXBlbmRlbmN5IHRoYXQgd2VudCBhd2F5IGR1cmluZyB0aGVcbiAgICogd2luZG93IGlzIGFubm91bmNlZCB3aXRoIHRoZSByZXN0LiBPbmUgdGhhdCBjYW1lIGJhY2sgaW4gdGltZSBuZXZlciBnZXRzIGhlcmU6IHRoZSBnYXRlIHJlb3BlbmluZ1xuICAgKiBjYW5jZWxzIHRoZSB0aW1lci5cbiAgICovXG4gIHByaXZhdGUgYW5ub3VuY2VMb3NzKCk6IHZvaWQge1xuICAgIHRoaXMubG9zc0Fubm91bmNlbWVudFRpbWVySWQgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHRoaXMuZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKSkge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZURlcGVuZGVuY3lMb3N0TWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5LkJsb2NrKSkge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUNvbmZsaWN0QXBwZWFyZWRNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhbm5vdW5jZVdhcm5pbmdzKCk6IHZvaWQge1xuICAgIC8vIEEgd2FybmluZyBkZXNjcmliZXMgdHdvIHBsdWdpbnMgdGhhdCBhcmUgYm90aCBSVU5OSU5HLCBzbyBpdCBpcyBwb2ludGxlc3Mgd2hpbGUgdGhpcyBvbmUgaXMgYmxvY2tlZFxuICAgIC8vIOKAlCBhbmQgaXQgd2FpdHMgZm9yIGxheW91dC1yZWFkeSBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBibG9ja2VkIG5vdGljZSBkb2VzLlxuICAgIGlmICghdGhpcy5pc0xheW91dFJlYWR5IHx8ICF0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuV2FybikpIHtcbiAgICAgIGlmICh0aGlzLmFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMuaGFzKGNvbmZsaWN0LnBsdWdpbklkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hbm5vdW5jZWRXYXJuaW5nUGx1Z2luSWRzLmFkZChjb25mbGljdC5wbHVnaW5JZCk7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlQ29uZmxpY3RXYXJuaW5nTWVzc2FnZShjb25mbGljdCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCk7XG4gICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBpZiAodGhpcy5pc1Rvb09sZChkZXBlbmRlbmN5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVmVyc2lvbk1pc21hdGNoTWVzc2FnZShkZXBlbmRlbmN5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkRlcGVuZGVuY3kuYmxvY2tlZE5vdGljZSwge1xuICAgICAgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGRlcGVuZGVuY3kucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29uZmxpY3RBcHBlYXJlZE1lc3NhZ2UoY29uZmxpY3Q6IFBsdWdpbkNvbmZsaWN0KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5Db25mbGljdC5jb25mbGljdEFwcGVhcmVkTm90aWNlLCB7XG4gICAgICBjb25mbGljdGluZ1BsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGNvbmZsaWN0LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3Q6IFBsdWdpbkNvbmZsaWN0KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5Db25mbGljdC5ibG9ja2VkTm90aWNlLCB7XG4gICAgICBjb25mbGljdGluZ1BsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGNvbmZsaWN0LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbmZsaWN0V2FybmluZ01lc3NhZ2UoY29uZmxpY3Q6IFBsdWdpbkNvbmZsaWN0KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5Db25mbGljdC53YXJuaW5nTm90aWNlLCB7XG4gICAgICBjb25mbGljdGluZ1BsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGNvbmZsaWN0LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlcGVuZGVuY3lMb3N0TWVzc2FnZShkZXBlbmRlbmN5OiBQbHVnaW5EZXBlbmRlbmN5KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgaWYgKHRoaXMuaXNUb29PbGQoZGVwZW5kZW5jeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVZlcnNpb25NaXNtYXRjaE1lc3NhZ2UoZGVwZW5kZW5jeSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5LmRlcGVuZGVuY3lMb3N0Tm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkRlcGVuZGVuY3kudmVyc2lvbk1pc21hdGNoTm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBkZWNsYXJlZCBjb25mbGljdHMgb2Ygb25lIHNldmVyaXR5IHRoYXQgYXJlIGN1cnJlbnRseSBpbiBmb3JjZS5cbiAgICpcbiAgICogQHBhcmFtIHNldmVyaXR5IC0gVGhlIHNldmVyaXR5IHRvIHNlbGVjdC5cbiAgICogQHJldHVybnMgVGhlIGNvbmZsaWN0cyBob2xkaW5nIHJpZ2h0IG5vdywgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWNsYXJlZC5cbiAgICovXG4gIHByaXZhdGUgZ2V0QWN0aXZlQ29uZmxpY3RzKHNldmVyaXR5OiBQbHVnaW5Db25mbGljdFNldmVyaXR5KTogUGx1Z2luQ29uZmxpY3RbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmxpY3RzLmZpbHRlcigoY29uZmxpY3QpID0+IGNvbmZsaWN0LnNldmVyaXR5ID09PSBzZXZlcml0eSAmJiB0aGlzLmlzQ29uZmxpY3RBY3RpdmUoY29uZmxpY3QpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKTogUGx1Z2luRGVwZW5kZW5jeVtdIHtcbiAgICByZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXBlbmRlbmN5KSA9PiAhdGhpcy5hcGlSZWZzLmdldChkZXBlbmRlbmN5LnBsdWdpbklkKT8udmFsdWUgfHwgdGhpcy5pc0JlbG93TWluUGx1Z2luVmVyc2lvbihkZXBlbmRlbmN5KSk7XG4gIH1cblxuICBwcml2YXRlIGhpZGVCbG9ja2VkU2V0dGluZ1RhYigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYmxvY2tlZFNldHRpbmdUYWIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFwcC5zZXR0aW5nLnJlbW92ZVNldHRpbmdUYWIodGhpcy5ibG9ja2VkU2V0dGluZ1RhYik7XG4gICAgdGhpcy5ibG9ja2VkU2V0dGluZ1RhYiA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGF0IGEgcmVsZWFzZSBvbGRlciB0aGFuIGl0IGRlY2xhcmVkIGl0IG5lZWRzLlxuICAgKlxuICAgKiBSZWFkIGZyb20gdGhlIG1hbmlmZXN0LCBsaWtlIGEgY29uZmxpY3QsIGFuZCByZS1yZWFkIG9uIGV2ZXJ5IGV2YWx1YXRpb246IE9ic2lkaWFuIGFwcGxpZXMgYW4gdXBkYXRlIGJ5XG4gICAqIHJlbG9hZGluZyB0aGUgcHJvdmlkZXIsIHdoaWNoIGZpcmVzIHRoZSBBUEkgd2F0Y2gncyBgY2hhbmdlYCwgc28gdGhlIGdhdGUgb3BlbnMgd2l0aG91dCBhIHJlc3RhcnQuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBlbmRlbmN5IC0gVGhlIGRlY2xhcmVkIGRlcGVuZGVuY3kuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGRlcGVuZGVuY3kgaXMgZW5hYmxlZCBiZWxvdyBpdHMge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3kubWluUGx1Z2luVmVyc2lvbn07IGBmYWxzZWBcbiAgICogd2hlbiBpdCBkZWNsYXJlcyBub25lIG9yIGlzIG5vdCBlbmFibGVkLCBzaW5jZSBpdHMgQVBJIGlzIHRoZW4gYWJzZW50IGFueXdheS5cbiAgICovXG4gIHByaXZhdGUgaXNCZWxvd01pblBsdWdpblZlcnNpb24oZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IGJvb2xlYW4ge1xuICAgIGlmIChkZXBlbmRlbmN5Lm1pblBsdWdpblZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSBnZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZFxuICAgIH0pO1xuXG4gICAgaWYgKGluc3RhbGxlZFZlcnNpb24gPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuICFjb21wYXJlVmVyc2lvbnMoaW5zdGFsbGVkVmVyc2lvbiwgZGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9uLCAnPj0nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgb25lIGRlY2xhcmVkIGNvbmZsaWN0IGlzIGluIGZvcmNlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogT25seSBhbiBFTkFCTEVEIHBsdWdpbiBjb3VudHMuIE9uZSB0aGF0IGlzIGluc3RhbGxlZCBidXQgc3dpdGNoZWQgb2ZmIHJlZ2lzdGVycyBub3RoaW5nLCBzbyBpdCBjYW5ub3RcbiAgICogY29sbGlkZSwgYW5kIGFjdGluZyBvbiBpdCB3b3VsZCBiZSBhbiBhbGFybSB0aGUgdXNlciBjYW4gb25seSBhbnN3ZXIgYnkgdW5pbnN0YWxsaW5nIHNvbWV0aGluZyB0aGV5XG4gICAqIGhhdmUgYWxyZWFkeSB0dXJuZWQgb2ZmLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmxpY3QgLSBUaGUgZGVjbGFyZWQgY29uZmxpY3QuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNvbmZsaWN0aW5nIHBsdWdpbiBpcyBlbmFibGVkIGF0IGEgY29uZmxpY3RpbmcgdmVyc2lvbi5cbiAgICovXG4gIHByaXZhdGUgaXNDb25mbGljdEFjdGl2ZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbnN0YWxsZWRWZXJzaW9uID0gZ2V0SW5zdGFsbGVkUGx1Z2luVmVyc2lvbih7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgcGx1Z2luSWQ6IGNvbmZsaWN0LnBsdWdpbklkXG4gICAgfSk7XG5cbiAgICBpZiAoaW5zdGFsbGVkVmVyc2lvbiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc2F0aXNmaWVzVmVyc2lvbihpbnN0YWxsZWRWZXJzaW9uLCBjb25mbGljdC5jb25mbGljdGluZ1ZlcnNpb25SYW5nZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGJ1dCB0b28gb2xkIGZvciB0aGlzIHBsdWdpbiwgc28gdGhlIGFkdmljZSBpcyBcInVwZGF0ZSBpdFwiLlxuICAgKlxuICAgKiBUd28gaW5kZXBlbmRlbnQgc2lnbmFscyBzYXkgc286IGEgcmVsZWFzZSBiZWxvdyB7QGxpbmsgUGx1Z2luRGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9ufSwgYW5kIGEgcHVibGlzaGVkXG4gICAqIEFQSSB3aG9zZSBjb250cmFjdCB2ZXJzaW9uIGlzIG91dHNpZGUge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3kuYXBpVmVyc2lvblJhbmdlfS5cbiAgICpcbiAgICogQHBhcmFtIGRlcGVuZGVuY3kgLSBUaGUgZGVjbGFyZWQgZGVwZW5kZW5jeS5cbiAgICogQHJldHVybnMgV2hldGhlciB1cGRhdGluZyB0aGUgZGVwZW5kZW5jeSBpcyB3aGF0IGl0IG5lZWRzLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1Rvb09sZChkZXBlbmRlbmN5OiBQbHVnaW5EZXBlbmRlbmN5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNCZWxvd01pblBsdWdpblZlcnNpb24oZGVwZW5kZW5jeSlcbiAgICAgIHx8IHRoaXMuYXBpUmVmcy5nZXQoZGVwZW5kZW5jeS5wbHVnaW5JZCk/LnVuYXZhaWxhYmlsaXR5UmVhc29uID09PSBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbi5WZXJzaW9uTWlzbWF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogU2F5cyB3aGF0IGlzIGluIHRoZSB3YXksIGFuZCBwdXRzIHRoZSBzYW1lIGV4cGxhbmF0aW9uIHdoZXJlIHRoZSB1c2VyIHdpbGwgbG9vayBmb3IgdGhlIHBsdWdpbidzXG4gICAqIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMgLSBUaGUgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgc2F0aXNmaWVkLlxuICAgKiBAcGFyYW0gYmxvY2tpbmdDb25mbGljdHMgLSBUaGUgY29uZmxpY3RzIGN1cnJlbnRseSByZWZ1c2luZyB0aGUgcGx1Z2luIHRoZSByaWdodCB0byBydW4uXG4gICAqL1xuICBwcml2YXRlIHByZXNlbnRVbnNhdGlzZmllZChcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0xheW91dFJlYWR5IHx8ICh1bnNhdGlzZmllZERlcGVuZGVuY2llcy5sZW5ndGggPT09IDAgJiYgYmxvY2tpbmdDb25mbGljdHMubGVuZ3RoID09PSAwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0Jsb2NrZWRTZXR0aW5nVGFiKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLCBibG9ja2luZ0NvbmZsaWN0cyk7XG5cbiAgICBpZiAodGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodGhpcy5jcmVhdGVCbG9ja2VkTWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiBibG9ja2luZ0NvbmZsaWN0cykge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmUtZXZhbHVhdGVzIHRoZSBnYXRlIGFuZCBtb3ZlcyB0aGUgZmVhdHVyZSBzdXJmYWNlIHRvIG1hdGNoLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHN1cmZhY2UgbWF0Y2hlcyB0aGUgZ2F0ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1bnNhdGlzZmllZERlcGVuZGVuY2llcyA9IHRoaXMuZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKTtcbiAgICBjb25zdCBibG9ja2luZ0NvbmZsaWN0cyA9IHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuQmxvY2spO1xuXG4gICAgaWYgKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCAmJiBibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpO1xuICAgICAgdGhpcy5oaWRlQmxvY2tlZFNldHRpbmdUYWIoKTtcbiAgICAgIHRoaXMuaGFzQW5ub3VuY2VkQmxvY2tlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoIXRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCkge1xuICAgICAgICB0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRGZWF0dXJlU3VyZmFjZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFubm91bmNlV2FybmluZ3MoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0ZlYXR1cmVTdXJmYWNlTG9hZGVkKSB7XG4gICAgICB0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMudW5sb2FkRmVhdHVyZVN1cmZhY2UoKTtcblxuICAgICAgLy8gQSBnYXRlIHRoYXQgY2xvc2VzIHdoaWxlIHRoZSBwbHVnaW4gaXMgUlVOTklORyBpcyB0aGUgY2FzZSB3b3J0aCBiZWluZyBsb3VkIGFib3V0OiB0aGUgdXNlciBqdXN0XG4gICAgICAvLyBkaWQgc29tZXRoaW5nLCBhbmQgdGhlIGNvbnNlcXVlbmNlIGlzIGltbWVkaWF0ZSBhbmQgaW52aXNpYmxlIHdpdGhvdXQgdGhpcy4gQW5ub3VuY2VkIHJlZ2FyZGxlc3NcbiAgICAgIC8vIG9mIGxheW91dCByZWFkaW5lc3MsIGJlY2F1c2UgYSBydW5uaW5nIHBsdWdpbiBtZWFucyB0aGUgbGF5b3V0IGlzIGxvbmcgc2luY2UgcmVhZHkg4oCUIGJ1dCBvbmx5XG4gICAgICAvLyBvbmNlIHRoZSBncmFjZSBwZXJpb2QgaGFzIHNob3duIHRoZSBsb3NzIGlzIG5vdCBhbiB1cGRhdGUgcmVsb2FkaW5nIHRoZSBwcm92aWRlciAoc2VlIHRoZSBmaWxlXG4gICAgICAvLyBoZWFkZXIpLlxuICAgICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hbm5vdW5jZUxvc3MoKTtcbiAgICAgIH0sIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgICB0aGlzLmhhc0Fubm91bmNlZEJsb2NrZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zaG93QmxvY2tlZFNldHRpbmdUYWIodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMsIGJsb2NraW5nQ29uZmxpY3RzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByZXNlbnRVbnNhdGlzZmllZCh1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGJsb2NrZWQgZXhwbGFuYXRpb24gaW50byBhIHNldHRpbmdzLXRhYiBjb250YWluZXI6IHdoYXQgaXMgbWlzc2luZyBvciBpbiB0aGUgd2F5LCB3aHkgaXRcbiAgICogbWF0dGVycywgYW5kIHRoZSBidXR0b24gdGhhdCBmaXhlcyBpdC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqIEBwYXJhbSB1bnNhdGlzZmllZERlcGVuZGVuY2llcyAtIFRoZSBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBzYXRpc2ZpZWQuXG4gICAqIEBwYXJhbSBibG9ja2luZ0NvbmZsaWN0cyAtIFRoZSBjb25mbGljdHMgY3VycmVudGx5IHJlZnVzaW5nIHRoZSBwbHVnaW4gdGhlIHJpZ2h0IHRvIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQmxvY2tlZEJhbm5lcihcbiAgICBjb250YWluZXJFbDogSFRNTEVsZW1lbnQsXG4gICAgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXM6IHJlYWRvbmx5IFBsdWdpbkRlcGVuZGVuY3lbXSxcbiAgICBibG9ja2luZ0NvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXVxuICApOiB2b2lkIHtcbiAgICBpZiAodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkRlcGVuZGVuY3kuc2V0dGluZ3NIZWFkaW5nKSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMpIHtcbiAgICAgIGNvbnN0IGJhbm5lckVsID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KHtcbiAgICAgICAgY2xzOiBbQ3NzQ2xhc3MuTGlicmFyeU5hbWUsIENzc0NsYXNzLlBsdWdpbkRlcGVuZGVuY3lCYW5uZXJdXG4gICAgICB9KTtcbiAgICAgIGJhbm5lckVsLmFwcGVuZCh0aGlzLmNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3kpKTtcbiAgICAgIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUoYmFubmVyRWwuY3JlYXRlRGl2KCksIGRlcGVuZGVuY3kucmVhc29uKTtcblxuICAgICAgY29uc3Qgc3RhdGUgPSBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkXG4gICAgICB9KTtcblxuICAgICAgLy8gQW4gZW5hYmxlZCBkZXBlbmRlbmN5IHRoYXQgaXMgc3RpbGwgdW5zYXRpc2ZpZWQgaXMgdG9vIG9sZCwgYW5kIGluc3RhbGxpbmcgb3IgZW5hYmxpbmcgaXQgYWdhaW4gZG9lc1xuICAgICAgLy8gbm90aGluZywgc28gaXQgaXMgb2ZmZXJlZCBhbiB1cGRhdGUgaW5zdGVhZC5cbiAgICAgIGlmIChzdGF0ZSAhPT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuRW5hYmxlZCkge1xuICAgICAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+XG4gICAgICAgICAgICBzdGF0ZSA9PT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuSW5zdGFsbGVkQnV0RGlzYWJsZWRcbiAgICAgICAgICAgICAgPyAkLm9ic2lkaWFuTGliLnBsdWdpblN1Z2dlc3Rpb24uZW5hYmxlXG4gICAgICAgICAgICAgIDogJC5vYnNpZGlhbkxpYi5wbHVnaW5TdWdnZXN0aW9uLmluc3RhbGxcbiAgICAgICAgICApKVxuICAgICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBpbnN0YWxsQW5kRW5hYmxlUGx1Z2luKHtcbiAgICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWQsXG4gICAgICAgICAgICAgIHBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSxcbiAgICAgICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gT2JzaWRpYW4gYXBwbGllcyB0aGUgdXBkYXRlIGJ5IHJlbG9hZGluZyB0aGUgZGVwZW5kZW5jeSwgd2hpY2ggcmVwdWJsaXNoZXMgaXRzIEFQSSwgc28gdGhlIHdhdGNoJ3NcbiAgICAgIC8vIGBjaGFuZ2VgIHJlb3BlbnMgdGhlIGdhdGUgd2l0aCBubyBmdXJ0aGVyIHN0ZXAgaGVyZS5cbiAgICAgIG5ldyBCdXR0b25Db21wb25lbnQoYmFubmVyRWwpXG4gICAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS51cGRhdGUsIHsgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSB9KSlcbiAgICAgICAgLnNldEN0YSgpXG4gICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdXBkYXRlUGx1Z2luKHtcbiAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZCxcbiAgICAgICAgICAgIHBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSxcbiAgICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgICByZXF1ZXN0aW5nUGx1Z2luTmFtZTogdGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG5cbiAgICAgIC8vIFRoZSBsaW5rIE9VVCB0byB0aGUgZGVwZW5kZW5jeSdzIG93biBzZXR0aW5ncywgc2hvd24gb25seSBvbmNlIGl0IGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZCDigJQgdGhlXG4gICAgICAvLyBvdGhlciBoYWxmIG9mIHRoZSByZWxhdGlvbnNoaXAgYmVpbmcgdmlzaWJsZSBmcm9tIGJvdGggZW5kcy4gSXQgaXMgd2hhdCBzdG9wcyBcImNvbmZpZ3VyZSBvbmVcbiAgICAgIC8vIG9wZXJhdGlvbiBhY3Jvc3MgdHdvIHBsdWdpbnNcIiBmcm9tIG1lYW5pbmcgXCJnbyBhbmQgZmluZCB0aGUgb3RoZXIgcGx1Z2luIHlvdXJzZWxmXCIuXG4gICAgICB0aGlzLnJlbmRlck9wZW5TZXR0aW5nc0J1dHRvbihiYW5uZXJFbCwgZGVwZW5kZW5jeS5wbHVnaW5JZCwgZGVwZW5kZW5jeS5wbHVnaW5OYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoYmxvY2tpbmdDb25mbGljdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0LnNldHRpbmdzSGVhZGluZykgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIGJsb2NraW5nQ29uZmxpY3RzKSB7XG4gICAgICB0aGlzLnJlbmRlckNvbmZsaWN0RW50cnkoY29udGFpbmVyRWwsIGNvbmZsaWN0LCB0aGlzLmNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBvbmUgY29uZmxpY3Q6IHdoYXQgaXQgaXMsIHdoeSBpdCBtYXR0ZXJzLCBhbmQgdGhlIHR3byB3YXlzIG91dCBvZiBpdC5cbiAgICpcbiAgICogVGhlIHJlcGFpciBpcyBvZmZlcmVkIG9uIHRoZSBPVEhFUiBwbHVnaW4g4oCUIGRpc2FibGluZyBpdCBpcyB0aGUgb25lIHRoaW5nIHRoaXMgcGx1Z2luIGNhbiBkbyBpbiBhXG4gICAqIGNsaWNrLCBzaW5jZSBpdCBjYW5ub3QgdXBkYXRlIHNvbWVvbmUgZWxzZSdzIHBsdWdpbiDigJQgYW5kIGl0IGlzIHRoZSBwZXJzaXN0ZWQgYGRpc2FibGVQbHVnaW5BbmRTYXZlYFxuICAgKiByYXRoZXIgdGhhbiB0aGUgdHJhbnNpZW50IGRpc2FibGUsIGJlY2F1c2UgdGhlIHVzZXIgYXNrZWQgZm9yIGl0IGJ5IGNsaWNraW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgZWxlbWVudCB0byByZW5kZXIgaW50by5cbiAgICogQHBhcmFtIGNvbmZsaWN0IC0gVGhlIGNvbmZsaWN0IHRvIHJlbmRlci5cbiAgICogQHBhcmFtIG1lc3NhZ2VGcmFnbWVudCAtIFRoZSBzZW50ZW5jZSBleHBsYWluaW5nIHRoZSBjb25mbGljdC5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQ29uZmxpY3RFbnRyeShjb250YWluZXJFbDogSFRNTEVsZW1lbnQsIGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCwgbWVzc2FnZUZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KTogdm9pZCB7XG4gICAgY29uc3QgYmFubmVyRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoe1xuICAgICAgY2xzOiBbQ3NzQ2xhc3MuTGlicmFyeU5hbWUsIENzc0NsYXNzLlBsdWdpbkNvbmZsaWN0QmFubmVyXVxuICAgIH0pO1xuICAgIGJhbm5lckVsLmFwcGVuZChtZXNzYWdlRnJhZ21lbnQpO1xuICAgIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUoYmFubmVyRWwuY3JlYXRlRGl2KCksIGNvbmZsaWN0LnJlYXNvbik7XG5cbiAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5Db25mbGljdC5kaXNhYmxlLCB7IGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogY29uZmxpY3QucGx1Z2luTmFtZSB9KSlcbiAgICAgIC5zZXRDdGEoKVxuICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZGlzYWJsZUNvbW11bml0eVBsdWdpbih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5JZDogY29uZmxpY3QucGx1Z2luSWRcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuICAgICAgfSkpO1xuXG4gICAgdGhpcy5yZW5kZXJPcGVuU2V0dGluZ3NCdXR0b24oYmFubmVyRWwsIGNvbmZsaWN0LnBsdWdpbklkLCBjb25mbGljdC5wbHVnaW5OYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyT3BlblNldHRpbmdzQnV0dG9uKGJhbm5lckVsOiBIVE1MRWxlbWVudCwgcGx1Z2luSWQ6IHN0cmluZywgcGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbmV3IEJ1dHRvbkNvbXBvbmVudChiYW5uZXJFbClcbiAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5vcGVuRGVwZW5kZW5jeVNldHRpbmdzLCB7XG4gICAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBwbHVnaW5OYW1lXG4gICAgICB9KSlcbiAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHAuc2V0dGluZy5vcGVuKCk7XG4gICAgICAgIHRoaXMuYXBwLnNldHRpbmcub3BlblRhYkJ5SWQocGx1Z2luSWQpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dCbG9ja2VkU2V0dGluZ1RhYihcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJsb2NrZWRTZXR0aW5nVGFiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWRkZWQgdGhyb3VnaCBgYXBwLnNldHRpbmdgIHJhdGhlciB0aGFuIGBwbHVnaW4uYWRkU2V0dGluZ1RhYmAsIGJlY2F1c2UgdGhpcyB0YWIgaGFzIHRvIGNvbWUgYmFja1xuICAgIC8vIE9GRiBhZ2FpbiB0aGUgbW9tZW50IHRoZSBnYXRlIG9wZW5zIOKAlCBvdGhlcndpc2UgdGhlIHBsdWdpbidzIG93biBzZXR0aW5ncyB0YWIsIHJlZ2lzdGVyZWQgYnlcbiAgICAvLyBgb25sb2FkSW1wbGAsIHdvdWxkIGFwcGVhciBiZXNpZGUgYSBzdGFsZSBcInJlcXVpcmVkIHBsdWdpbiBtaXNzaW5nXCIgb25lLiBgcGx1Z2luLmFkZFNldHRpbmdUYWJgXG4gICAgLy8gb25seSBldmVyIHJlbW92ZXMgYXQgcGx1Z2luIHVubG9hZC5cbiAgICBjb25zdCBibG9ja2VkU2V0dGluZ1RhYiA9IG5ldyBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYih7XG4gICAgICBwbHVnaW46IHRoaXMucGx1Z2luLFxuICAgICAgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWwpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJCbG9ja2VkQmFubmVyKGNvbnRhaW5lckVsLCB1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuYXBwLnNldHRpbmcuYWRkU2V0dGluZ1RhYihibG9ja2VkU2V0dGluZ1RhYik7XG4gICAgdGhpcy5ibG9ja2VkU2V0dGluZ1RhYiA9IGJsb2NrZWRTZXR0aW5nVGFiO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBGQSxtQkFBbUM7QUFDbkMsOEJBR087QUFDUCxzQkFHTztBQVNQLCtCQUF1QztBQUN2Qyx1QkFBeUI7QUFDekIsMEJBSU87QUFDUCxrQkFBa0I7QUFDbEIsd0JBR087QUFDUCxrQ0FNTztBQUNQLHFDQUdPO0FBQ1Asb0NBQW1DO0FBQ25DLDBCQUE0QjtBQUM1QixvQ0FBNkM7QUFRN0MsTUFBTSxpREFBaUQ7QUFLaEQsSUFBSyx5QkFBTCxrQkFBS0EsNEJBQUw7QUFPTCxFQUFBQSx3QkFBQSxXQUFRO0FBUVIsRUFBQUEsd0JBQUEsVUFBTztBQWZHLFNBQUFBO0FBQUEsR0FBQTtBQTBLWixNQUFN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TSxFQUFFLFVBQU0sZUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLGVBQWUsZUFBZSxFQUFFLENBQUM7QUFFM0YsZUFBVyxZQUFZLG1CQUFtQjtBQUN4QyxXQUFLLG9CQUFvQixhQUFhLFVBQVUsS0FBSyw2QkFBNkIsUUFBUSxDQUFDO0FBQUEsSUFDN0Y7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBYVEsb0JBQW9CLGFBQTBCLFVBQTBCLGlCQUF5QztBQUN2SCxVQUFNLFdBQVcsWUFBWSxVQUFVO0FBQUEsTUFDckMsS0FBSyxDQUFDLDBCQUFTLGFBQWEsMEJBQVMsb0JBQW9CO0FBQUEsSUFDM0QsQ0FBQztBQUNELGFBQVMsT0FBTyxlQUFlO0FBQy9CLHVEQUEwQixTQUFTLFVBQVUsR0FBRyxTQUFTLE1BQU07QUFFL0QsUUFBSSxnQ0FBZ0IsUUFBUSxFQUN6QixrQkFBYyxlQUFFLENBQUMsTUFBTSxFQUFFLFlBQVksZUFBZSxTQUFTLEVBQUUsdUJBQXVCLFNBQVMsV0FBVyxDQUFDLENBQUMsRUFDNUcsT0FBTyxFQUNQLFlBQVEsaUNBQW1CLFlBQVk7QUFDdEMsZ0JBQU0saURBQXVCO0FBQUEsUUFDM0IsS0FBSyxLQUFLO0FBQUEsUUFDVixVQUFVLFNBQVM7QUFBQSxNQUNyQixDQUFDO0FBQ0QsWUFBTSxLQUFLLFFBQVE7QUFBQSxJQUNyQixDQUFDLENBQUM7QUFFSixTQUFLLHlCQUF5QixVQUFVLFNBQVMsVUFBVSxTQUFTLFVBQVU7QUFBQSxFQUNoRjtBQUFBLEVBRVEseUJBQXlCLFVBQXVCLFVBQWtCLFlBQTBCO0FBQ2xHLFFBQUksZ0NBQWdCLFFBQVEsRUFDekIsa0JBQWMsZUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLGlCQUFpQix3QkFBd0I7QUFBQSxNQUM3RSxzQkFBc0I7QUFBQSxJQUN4QixDQUFDLENBQUMsRUFDRCxRQUFRLE1BQU07QUFDYixXQUFLLElBQUksUUFBUSxLQUFLO0FBQ3RCLFdBQUssSUFBSSxRQUFRLFlBQVksUUFBUTtBQUFBLElBQ3ZDLENBQUM7QUFBQSxFQUNMO0FBQUEsRUFFUSxzQkFDTix5QkFDQSxtQkFDTTtBQUNOLFFBQUksS0FBSyxtQkFBbUI7QUFDMUI7QUFBQSxJQUNGO0FBTUEsVUFBTSxvQkFBb0IsSUFBSSx3QkFBd0I7QUFBQSxNQUNwRCxRQUFRLEtBQUs7QUFBQSxNQUNiLGNBQWMsQ0FBQyxnQkFBc0I7QUFDbkMsYUFBSyxvQkFBb0IsYUFBYSx5QkFBeUIsaUJBQWlCO0FBQUEsTUFDbEY7QUFBQSxJQUNGLENBQUM7QUFDRCxTQUFLLElBQUksUUFBUSxjQUFjLGlCQUFpQjtBQUNoRCxTQUFLLG9CQUFvQjtBQUFBLEVBQzNCO0FBQ0Y7IiwibmFtZXMiOlsiUGx1Z2luQ29uZmxpY3RTZXZlcml0eSIsImNvbXBhcmVWZXJzaW9ucyIsInNhdGlzZmllc1ZlcnNpb24iXX0=
|
|
622
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGdhdGUgb24gYSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2U6IHdoYXQgbXVzdCBiZSBQUkVTRU5UIGZvciBpdCB0byBydW4sIGFuZCB3aGF0IG11c3QgTk9UIGJlLlxuICpcbiAqIEJvdGggaGFsdmVzIGFuc3dlciB0aGUgc2FtZSBxdWVzdGlvbiDigJQgbWF5IHRoaXMgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIHJ1biByaWdodCBub3c/IOKAlCBzbyB0aGV5IGFyZSBvbmVcbiAqIGNvbXBvbmVudCByYXRoZXIgdGhhbiB0d28uIEEgc2Vjb25kLCBpbmRlcGVuZGVudCBnYXRlIHdvdWxkIGRvdWJsZS1sb2FkIHRoZSBzdXJmYWNlIGFuZCBzdGFjayBhIHNlY29uZFxuICogXCJibG9ja2VkXCIgc2V0dGluZ3MgdGFiIG9udG8gdGhlIHNhbWUgcGx1Z2luLCBhbmQgbmVpdGhlciBjb3VsZCBzZWUgdGhlIG90aGVyJ3MgcmVhc29uIGZvciByZWZ1c2luZy5cbiAqXG4gKiAjIyBEZXBlbmRlbmNpZXM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IGNhbm5vdCB3b3JrIHdpdGhvdXRcbiAqXG4gKiBUaGlzIGlzIHRoZSBzdHJpY3Qgc2libGluZyBvZiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudGAsIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgd2hvbGUgcG9pbnQuIEFcbiAqIFNVR0dFU1RJT04gaXMgYW4gb2ZmZXIg4oCUIHRoZSBob3N0IGtlZXBzIHdvcmtpbmcgd2l0aG91dCBpdCBhbmQgc2ltcGx5IGNhbm5vdCBkbyBvbmUgdGhpbmcuIEEgREVQRU5ERU5DWVxuICogaXMgYSByZXF1aXJlbWVudDogYG9ubG9hZEltcGxgIG5ldmVyIHJ1bnMsIG5vIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCwgbm8gaGFuZGxlciBpcyBpbnN0YWxsZWQsIG5vdGhpbmcgaXNcbiAqIHBhdGNoZWQuIFJlYWNoIGZvciBhIHN1Z2dlc3Rpb24gd2hlbiB0aGUgb3RoZXIgcGx1Z2luIGFkZHMgc29tZXRoaW5nOyByZWFjaCBmb3IgYSBkZXBlbmRlbmN5IHdoZW4gdGhlXG4gKiBob3N0J3MgYWR2ZXJ0aXNlZCBiZWhhdmlvciBpcyBub3QgdGhlcmUgd2l0aG91dCBpdC5cbiAqXG4gKiBPYnNpZGlhbiBoYXMgbm8gZGVwZW5kZW5jeSBmaWVsZCBpbiBhIG1hbmlmZXN0LCB3aGljaCBpcyBleGFjdGx5IHRoZSBwcm9ibGVtIHRoaXMgY2xvc2VzLiBXaXRob3V0IG9uZSxcbiAqIGEgdXNlciBtZWV0aW5nIGFuIHVuZmFtaWxpYXIgcGx1Z2luIGluIHRoZWlyIGxpc3QgbW9udGhzIGxhdGVyIGhhcyBub3RoaW5nIHRlbGxpbmcgdGhlbSBpdCBpc1xuICogbG9hZC1iZWFyaW5nIOKAlCB0aGV5IHJlbW92ZSBpdCwgYW5kIHRoZSBicmVha2FnZSBzdXJmYWNlcyB3ZWVrcyBhZnRlciB0aGF0IGFzIGRhbWFnZSB0aGV5IGNhbm5vdCBjb25uZWN0XG4gKiB0byBhbnl0aGluZyB0aGV5IGRpZC4gU28gdGhlIHJlbGF0aW9uc2hpcCBpcyBtYWRlIHZpc2libGUgZnJvbSBib3RoIGVuZHMgYW5kIGVuZm9yY2VkIHdoaWxlIGl0IGhvbGRzOlxuICogdGhlIGRlcGVuZGVudCBleHBsYWlucyBpdHNlbGYgd2hlcmUgdGhlIHVzZXIgaXMgbG9va2luZywgcmVwYWlycyBpdHNlbGYgaW4gb25lIGNsaWNrLCBhbmQgcmVhY3RzIHRoZVxuICogSU5TVEFOVCB0aGUgZGVwZW5kZW5jeSBnb2VzIGF3YXkgcmF0aGVyIHRoYW4gZGVncmFkaW5nIHF1aWV0bHkuXG4gKlxuICogVGhyZWUgY2hvaWNlcyBhcmUgZGVsaWJlcmF0ZSBhbmQgd29ydGggc3RhdGluZywgYmVjYXVzZSBlYWNoIGhhcyBhbiBvYnZpb3VzLWxvb2tpbmcgYWx0ZXJuYXRpdmU6XG4gKlxuICogLSAqKkJsb2NrZWQgbWVhbnMgZW5hYmxlZC1idXQtaW5lcnQsIG5ldmVyIHNlbGYtZGlzYWJsZWQuKiogQ2FsbGluZyBgZGlzYWJsZVBsdWdpbkFuZFNhdmVgIG9uIGl0c2VsZlxuICogICB3b3VsZCBiZSB0aGUgbGl0ZXJhbCByZWFkaW5nIG9mIFwicmVmdXNlcyB0byBsb2FkXCIsIGFuZCBpdCByZXdyaXRlcyBhIGNvbmZpZyB0aGF0IGJlbG9uZ3MgdG8gdGhlIHVzZXIg4oCUXG4gKiAgIHdobyB3b3VsZCB0aGVuIGhhdmUgdG8gcmVtZW1iZXIgdG8gcmUtZW5hYmxlIGl0IGFmdGVyIGZpeGluZyB0aGUgZGVwZW5kZW5jeS4gU3RheWluZyBlbmFibGVkIGFuZCBpbmVydFxuICogICBzYXlzIHRoZSBzYW1lIHRoaW5nIHRvIHRoZSB1c2VyLCBjaGFuZ2VzIG5vdGhpbmcgdGhleSBvd24sIGFuZCBjYW4gdW5kbyBpdHNlbGYuXG4gKiAtICoqQmxvY2tlZCBpcyBub3QgYW4gZXJyb3IuKiogVGhyb3dpbmcgZnJvbSBgb25sb2FkYCBtYXJrcyB0aGUgcGx1Z2luIGZhaWxlZCBpbiBPYnNpZGlhbiBhbmQgaGFuZHMgdGhlXG4gKiAgIHVzZXIgYSBzdGFjayB0cmFjZSBpbnN0ZWFkIG9mIGEgc2VudGVuY2UgYW5kIGEgYnV0dG9uLlxuICogLSAqKkEgZGVwZW5kZW5jeSBtdXN0IHB1Ymxpc2ggYW4gQVBJLioqIFRoYXQgaXMgd2hhdCBtYWtlcyBwcmVzZW5jZSwgYWJzZW5jZSwgdmVyc2lvbiBhbmQgZGVwYXJ0dXJlIGFsbFxuICogICBvYnNlcnZhYmxlIHRocm91Z2ggb25lIG1lY2hhbmlzbSDigJQgYHdhdGNoUGx1Z2luQXBpYCdzIHJlZmVyZW5jZSBpcyBsaXZlLCBpcyByZXZva2VkIHdoZW4gdGhlIHByb3ZpZGVyXG4gKiAgIHVubG9hZHMsIGFuZCBhbHJlYWR5IGNsYXNzaWZpZXMgbm90LWluc3RhbGxlZCBhZ2FpbnN0IG5vdC1lbmFibGVkIGFnYWluc3QgdG9vLW9sZC4gQSBwcm92aWRlciB3aXRoXG4gKiAgIG5vdGhpbmcgdG8gZXhwb3NlIGNhbiBwdWJsaXNoIGFuIGVtcHR5IEFQSSBwdXJlbHkgc28gaXQgY2FuIGJlIGRlcGVuZGVkIHVwb247IHRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZVxuICogICBhIHNlY29uZCwgd2Vha2VyIGRldGVjdGlvbiBwYXRoIHRvIG1haW50YWluIGJlc2lkZSBpdC5cbiAqXG4gKiAjIyBDb25mbGljdHM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IHJlZnVzZXMgdG8gcnVuIGJlc2lkZVxuICpcbiAqIFRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCwgYW5kIGl0IG5lZWRzIGl0cyBvd24gZGV0ZWN0aW9uIHBhdGggYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBvbmUgZG9lcyBub3QgZml0LlxuICogQSBjb25mbGljdGluZyBwbHVnaW4gaXMgdHlwaWNhbGx5IGFuIE9MRCB2ZXJzaW9uIG9mIHNvbWUgb3RoZXIgcGx1Z2luIHRoYXQgc3RpbGwgb3ducyBiZWhhdmlvciB0aGlzIG9uZVxuICogaGFzIHRha2VuIG92ZXIg4oCUIGl0IHB1Ymxpc2hlcyBubyBBUEkgYXQgYWxsLCBzbyB0aGVyZSBpcyBubyBgYXBpVmVyc2lvblJhbmdlYCB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogVGhlIGFyZ3VtZW50IGZvciByZWZ1c2luZyByYXRoZXIgdGhhbiBjb21wZXRpbmcgY29tZXMgZnJvbSB0aGUgY2FzZSB0aGlzIGdlbmVyYWxpemVzOiB0d28gcmVuYW1lL2RlbGV0ZVxuICogaGFuZGxlcnMgYWN0aW5nIG9uIG9uZSByZW5hbWUgY29ycnVwdCBsaW5rcyBhbmQgbW92ZSBhdHRhY2htZW50cyB0d2ljZSwgYW5kIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0b1xuICogd2luIHRoYXQgcmFjZSDigJQgYSBoYW5kbGVyIGlzIGVsZWN0ZWQgYnkgcmVnaXN0cnkgb3JkZXIsIGJ1dCB0aGUgcGF0Y2hlcyB0aGF0IGRvIHRoZSB3b3JrIHNpdCBvdXRzaWRlXG4gKiB0aGF0IGVsZWN0aW9uLCBzbyB3aGljaGV2ZXIgcGx1Z2luIGxvYWRlZCBmaXJzdCBrZWVwcyBhIGhhbmQgb24gdGhlIHdoZWVsLiBFdmVyeSBzY2hlbWUgZm9yIHNlaXppbmdcbiAqIGNvbnRyb2wgZnJvbSBpbnNpZGUgaXMgbG9hZC1vcmRlciBkZXBlbmRlbnQuIFJlZnVzaW5nIGlzIGRldGVybWluaXN0aWMgd2hlcmUgY29tcGV0aW5nIGlzIG5vdCwgYW5kIGFcbiAqIHZhdWx0IHRoYXQgYnJpZWZseSBoYXMgbm8gaGFuZGxlciBpcyBhIGZhciBiZXR0ZXIgb3V0Y29tZSB0aGFuIG9uZSB3aXRoIHR3by5cbiAqXG4gKiBUd28gZGV0YWlscyBvZiB0aGF0IGRldGVjdGlvbiBjYXJyeSBvdmVyIHZlcmJhdGltLCBiZWNhdXNlIGJvdGggYXJlIGxvYWQtYmVhcmluZzpcbiAqXG4gKiAtICoqVmVyc2lvbnMgYXJlIHJlYWQsIG5ldmVyIHRoZSByZWdpc3RyeS4qKiBBIHBsdWdpbiB0aGF0IGhhcyBub3QgbG9hZGVkIHlldCBoYXMgcmVnaXN0ZXJlZCBub3RoaW5nLCBzb1xuICogICBhc2tpbmcgdGhlIHJlZ2lzdHJ5IGdpdmVzIGEgZGlmZmVyZW50IGFuc3dlciBkZXBlbmRpbmcgb24gd2hlbiBpdCBpcyBhc2tlZC4gYGFwcC5wbHVnaW5zLm1hbmlmZXN0c2AgaXNcbiAqICAgcG9wdWxhdGVkIGZvciBldmVyeSBpbnN0YWxsZWQgcGx1Z2luIGF0IHN0YXJ0dXAsIHdoYXRldmVyIHRoZSBsb2FkIG9yZGVyIHR1cm5zIG91dCB0byBiZS5cbiAqIC0gKipBbiB1bnBhcnNlYWJsZSB2ZXJzaW9uIGNvdW50cyBhcyBjb25mbGljdGluZy4qKiBGYWlsaW5nIGNsb3NlZCBpcyB0aGUgc2FmZSBkaXJlY3Rpb246IGEgZmFsc2UgYWxhcm1cbiAqICAgY29zdHMgYSBub3RpY2UsIGEgZmFsc2UgYWxsLWNsZWFyIGNvc3RzIGEgdmF1bHQuXG4gKlxuICogTm90IGV2ZXJ5IG92ZXJsYXAgaXMgdGhhdCBzZXZlcmUsIHdoaWNoIGlzIHdoeSBhIGNvbmZsaWN0IGRlY2xhcmVzIGEge0BsaW5rIFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHl9LlxuICogVHdvIHBsdWdpbnMgc2hpcHBpbmcgdGhlIHNhbWUgY29tbWFuZCBkdXBsaWNhdGUgYSBwYWxldHRlIGVudHJ5IGFuZCBkbyB0aGUgd29yayB0d2ljZSDigJQgYW5ub3lpbmcsIG5vdFxuICogY29ycnVwdGluZyDigJQgYW5kIHJlZnVzaW5nIHRvIGxvYWQgb3ZlciB0aGF0IHdvdWxkIGJlIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHRoZSBvdmVybGFwLiBUaG9zZSBkZWNsYXJlXG4gKiB7QGxpbmsgUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJufSBhbmQgYm90aCBrZWVwIHJ1bm5pbmcuXG4gKlxuICogIyMgV2hhdCB0aGlzIGNhbiBhbmQgY2Fubm90IHNlZVxuICpcbiAqIE9ic2lkaWFuIHJhaXNlcyBubyBldmVudCB3aGVuIEFOT1RIRVIgcGx1Z2luIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgKHNlZSBgcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHNgKSxcbiAqIHNvIGxpdmUgY29uZmxpY3QgZGV0ZWN0aW9uIGhhcyBhIHJlYWwgY2VpbGluZyBhbmQgaXQgaXMgc3RhdGVkIGhlcmUgcmF0aGVyIHRoYW4gaW1wbGllZCBhd2F5LiBBXG4gKiBjb25mbGljdGluZyBwbHVnaW4gYnVpbHQgb24gdGhpcyBsaWJyYXJ5IGFubm91bmNlcyBpdHNlbGYgdGhyb3VnaCB0aGUgbGlmZWN5Y2xlIGJyb2FkY2FzdCwgYW5kIGlzXG4gKiB0aGVyZWZvcmUgY2F1Z2h0IHRoZSBtb21lbnQgaXQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gT25lIHRoYXQgaXMgbm90IOKAlCBhbiBvbGQgcmVsZWFzZSBwcmVkYXRpbmcgdGhlXG4gKiBicm9hZGNhc3QsIG9yIGEgcGx1Z2luIGJ5IGFub3RoZXIgYXV0aG9yIGVudGlyZWx5IOKAlCBpcyBjYXVnaHQgYXQgdGhlIG5leHQgbG9hZCwgd2hpY2ggaXMgd2hlbiBpdHNcbiAqIG1hbmlmZXN0IGlzIHJlYWQuXG4gKlxuICogIyMgV2h5IGEgbG9zcyBpcyBhbm5vdW5jZWQgbGF0ZVxuICpcbiAqIE9ic2lkaWFuIHVwZGF0ZXMgYW4gZW5hYmxlZCBwbHVnaW4gYnkgcmVsb2FkaW5nIGl0OiB0aGUgb2xkIGNvcHkgdW5sb2FkcywgdGhlIG5ldyBvbmUgbG9hZHMuIEZvciB0aGVcbiAqIG1vbWVudCBpbiBiZXR3ZWVuIHRoZSBwcm92aWRlcidzIEFQSSBpcyByZXZva2VkLCBzbyBldmVyeSBkZXBlbmRlbnQgc2VlcyBpdHMgZGVwZW5kZW5jeSBnbyBhd2F5IGFuZFxuICogY29tZSBiYWNrLiBUaGUgZmVhdHVyZSBzdXJmYWNlIHN0aWxsIGNvbWVzIGRvd24gYXQgb25jZSDigJQgdGhlIGRlcGVuZGVuY3kgcmVhbGx5IGlzIGdvbmUgZm9yIHRoYXRcbiAqIG1vbWVudCDigJQgYnV0IHRoZSBub3RpY2Ugd2FpdHMge0BsaW5rIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFN9LCBhbmQgYSBsb3NzIHRoYXRcbiAqIGhlYWxlZCBpbiB0aGUgbWVhbnRpbWUgaXMgbmV2ZXIgYW5ub3VuY2VkLiBXaXRob3V0IHRoYXQsIHVwZGF0aW5nIG9uZSBwbHVnaW4gcHV0IGEgXCJubyBsb25nZXJcbiAqIGF2YWlsYWJsZVwiIG5vdGljZSBvbiBzY3JlZW4gaW4gZXZlcnkgcGx1Z2luIGRlcGVuZGluZyBvbiBpdCwgZGVzY3JpYmluZyBhIHN0YXRlIHRoYXQgbm8gbG9uZ2VyIGhlbGQgYnlcbiAqIHRoZSB0aW1lIHRoZSB1c2VyIHJlYWQgaXQuIEEgbG9zcyB0aGUgdXNlciBjYXVzZWQgb24gcHVycG9zZSDigJQgZGlzYWJsaW5nIG9yIHVuaW5zdGFsbGluZyB0aGVcbiAqIGRlcGVuZGVuY3kg4oCUIG91dGxhc3RzIHRoZSB3aW5kb3cgYW5kIGlzIGFubm91bmNlZCBhcyBiZWZvcmUsIG9ubHkgYSBmZXcgc2Vjb25kcyBsYXRlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgUGx1Z2luXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGNvbXBhcmUgYXMgY29tcGFyZVZlcnNpb25zLFxuICBzYXRpc2ZpZXMgYXMgc2F0aXNmaWVzVmVyc2lvblxufSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudCxcbiAgUGx1Z2luU2V0dGluZ1RhYlxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luQXBpUmVmIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1hcGkudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWUsXG4gIFBsdWdpbkxpZmVjeWNsZUV2ZW50UGF5bG9hZFxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgZGlzYWJsZUNvbW11bml0eVBsdWdpbiB9IGZyb20gJy4uL2NvbW11bml0eS1wbHVnaW5zLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7XG4gIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUsXG4gIGFzQ29kZUJsb2NrLFxuICBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzXG59IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7XG4gIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLFxuICB3YXRjaFBsdWdpbkFwaVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQge1xuICBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSxcbiAgZ2V0SW5zdGFsbGVkUGx1Z2luVmVyc2lvbixcbiAgaW5zdGFsbEFuZEVuYWJsZVBsdWdpbixcbiAgSW5zdGFsbGVkUGx1Z2luU3RhdGUsXG4gIHVwZGF0ZVBsdWdpblxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWluc3RhbGwtc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FLFxuICBQTFVHSU5fVU5MT0FERURfRVZFTlRfTkFNRVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJBc3luY0V2ZW50IH0gZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgQ2FsbGJhY2tMYXlvdXRSZWFkeUNvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LXJlYWR5LWNvbXBvbmVudC50cyc7XG5cbi8qKlxuICogSG93IGxvbmcgYSBnYXRlIHRoYXQgY2xvc2VkIHdoaWxlIHRoZSBwbHVnaW4gd2FzIHJ1bm5pbmcgd2FpdHMgYmVmb3JlIHNheWluZyBzby5cbiAqXG4gKiBMb25nIGVub3VnaCB0byBjb3ZlciBPYnNpZGlhbiByZWxvYWRpbmcgYSBwbHVnaW4gdG8gYXBwbHkgaXRzIHVwZGF0ZSwgc2hvcnQgZW5vdWdoIHRoYXQgYSB1c2VyIHdob1xuICogZGlzYWJsZWQgdGhlIGRlcGVuZGVuY3kgYnkgaGFuZCBzdGlsbCBjb25uZWN0cyB0aGUgbm90aWNlIHRvIHdoYXQgdGhleSBqdXN0IGRpZC5cbiAqL1xuY29uc3QgTE9TU19BTk5PVU5DRU1FTlRfR1JBQ0VfUEVSSU9EX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbi8qKlxuICogSG93IGJhZGx5IHR3byBwbHVnaW5zIHJ1bm5pbmcgc2lkZSBieSBzaWRlIGdvZXMgd3JvbmcsIGFuZCB0aGVyZWZvcmUgd2hhdCB0aGlzIG9uZSBkb2VzIGFib3V0IGl0LlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5Db25mbGljdFNldmVyaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBob3N0IHJlZnVzZXMgdG8gcnVuIGF0IGFsbCB3aGlsZSB0aGUgY29uZmxpY3QgaG9sZHM6IGBvbmxvYWRJbXBsYCBuZXZlciBydW5zLCBub3RoaW5nIGlzXG4gICAqIHJlZ2lzdGVyZWQsIGFuZCB0aGUgcGx1Z2luIGV4cGxhaW5zIGl0c2VsZiB0aGUgd2F5IGEgbWlzc2luZyBkZXBlbmRlbmN5IGRvZXMuXG4gICAqXG4gICAqIEZvciBhbiBvdmVybGFwIHdoZXJlIGJvdGggcGx1Z2lucyBhY3Rpbmcgb24gdGhlIHNhbWUgb3BlcmF0aW9uIGRhbWFnZXMgdGhlIHZhdWx0LlxuICAgKi9cbiAgQmxvY2sgPSAnYmxvY2snLFxuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBydW5zIGFueXdheSBhbmQgc2F5cyB0aGUgb3ZlcmxhcCBpcyB0aGVyZS5cbiAgICpcbiAgICogRm9yIGFuIG92ZXJsYXAgdGhhdCBpcyBhbm5veWluZyByYXRoZXIgdGhhbiBkZXN0cnVjdGl2ZSDigJQgZHVwbGljYXRlIGNvbW1hbmRzLCB3b3JrIGRvbmUgdHdpY2Ug4oCUIHdoZXJlXG4gICAqIHJlZnVzaW5nIHRvIGxvYWQgd291bGQgY29zdCB0aGUgdXNlciBtb3JlIHRoYW4gdGhlIG92ZXJsYXAgZG9lcy5cbiAgICovXG4gIFdhcm4gPSAnd2Fybidcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiByZWZ1c2VzIHRvIHJ1biBiZXNpZGUsIG9yIHdhcm5zIGFib3V0IHJ1bm5pbmcgYmVzaWRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkNvbmZsaWN0IHtcbiAgLyoqXG4gICAqIFRoZSBzZW12ZXIgcmFuZ2Ugb2YgdGhlIE9USEVSIHBsdWdpbidzIHZlcnNpb25zIHRoYXQgY29uZmxpY3QsIGUuZy4gYCc8MTIuMC4wJ2AgZm9yIFwiZXZlcnkgdmVyc2lvblxuICAgKiBiZWZvcmUgdGhlIG9uZSB0aGF0IGdhdmUgdGhpcyBiZWhhdmlvciB1cFwiLlxuICAgKlxuICAgKiBBIHJhbmdlIHJhdGhlciB0aGFuIGEgbWluaW11bSwgc28gYW4gb3ZlcmxhcCBjb25maW5lZCB0byBvbmUgbWFqb3IgKGAnPj0zIDw0J2ApIGlzIGV4cHJlc3NpYmxlLCBhbmQgc29cbiAgICogaXMgYSBwbHVnaW4gdGhhdCBjb25mbGljdHMgYXQgZXZlcnkgdmVyc2lvbiDigJQgc3BlbGwgdGhhdCBgJz49MC4wLjAnYCwgc2luY2UgYGNvbXBhcmUtdmVyc2lvbnNgIHJlamVjdHNcbiAgICogYSBiYXJlIGAqYC4gRXZhbHVhdGVkIGFnYWluc3QgYG1hbmlmZXN0LnZlcnNpb25gOyBhIHZlcnNpb24gdGhhdCBjYW5ub3QgYmUgcGFyc2VkIGNvdW50cyBhc1xuICAgKiBjb25mbGljdGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZsaWN0aW5nVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIGFzIGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIHNob3duIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxvY2FsaXplZCBzZW50ZW5jZSBzYXlpbmcgd2hhdCBnb2VzIHdyb25nIHdoZW4gYm90aCBydW4sIHNob3duIGluIHRoZSBiYW5uZXIuXG4gICAqXG4gICAqIFRoZSBkZWNsYXJpbmcgcGx1Z2luIG93bnMgdGhpcyBzdHJpbmcgYmVjYXVzZSBvbmx5IGl0IGtub3dzIHdoYXQgdGhlIHR3byBvZiB0aGVtIGNvbGxpZGUgb3ZlciwgYW5kIGFcbiAgICogdXNlciBiZWluZyBhc2tlZCB0byBkaXNhYmxlIHNvbWV0aGluZyBkZXNlcnZlcyB0byBiZSB0b2xkIHdoeS5cbiAgICpcbiAgICogUGFzcyBhIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSB0byBtYXJrIHVwIHBhcnQgb2YgdGhlIHNlbnRlbmNlLCBzdWNoIGFzIGEgcGx1Z2luIG5hbWUgcmVuZGVyZWQgYXNcbiAgICogY29kZS4gRWFjaCByZW5kZXIgYXBwZW5kcyBhIGZyZXNoIGNsb25lIG9mIGl0LCBzaW5jZSB0aGUgYmFubmVyIGlzIHJlbmRlcmVkIGFnYWluIG9uIGV2ZXJ5IHJlZnJlc2guXG4gICAqL1xuICByZWFkb25seSByZWFzb246IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhpcyBwbHVnaW4gZG9lcyBhYm91dCB0aGUgY29uZmxpY3QuXG4gICAqL1xuICByZWFkb25seSBzZXZlcml0eTogUGx1Z2luQ29uZmxpY3RTZXZlcml0eTtcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiBjYW5ub3Qgd29yayB3aXRob3V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkRlcGVuZGVuY3kge1xuICAvKipcbiAgICogVGhlIHNlbXZlciByYW5nZSBvZiBBUEkgY29udHJhY3QgdmVyc2lvbnMgdGhlIGRlcGVuZGVudCBjb21waWxlZCBhZ2FpbnN0LCBlLmcuIGAnXjInYC5cbiAgICpcbiAgICogQSBkZXBlbmRlbmN5IHdob3NlIHB1Ymxpc2hlZCBBUEkgZmFsbHMgb3V0c2lkZSB0aGUgcmFuZ2UgY291bnRzIGFzIFVOU0FUSVNGSUVELCB3aGljaCBpcyB3aGF0IHR1cm5zIGFcbiAgICogc2lsZW50IGJlaGF2aW9yYWwgbWlzbWF0Y2ggYmV0d2VlbiB0d28gaW5kZXBlbmRlbnRseSByZWxlYXNlZCBwbHVnaW5zIGludG8gYSB2aXNpYmxlIFwidXBkYXRlIHRoaXNcbiAgICogb25lXCIgbWVzc2FnZS4gU3BlbGwgXCJhbnkgdmVyc2lvblwiIGFzIGAnPj0wLjAuMCdgIOKAlCBgY29tcGFyZS12ZXJzaW9uc2AgcmVqZWN0cyBhIGJhcmUgYCpgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGRlc3QgcmVsZWFzZSBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luIHRoZSBkZXBlbmRlbnQgd29ya3Mgd2l0aCwgZS5nLiBgJzIuMi4wJ2AuXG4gICAqXG4gICAqIEZvciBhIHByb3ZpZGVyIHdob3NlIEJFSEFWSU9SIGNoYW5nZWQgd2hpbGUgaXRzIEFQSSBjb250cmFjdCBzdGF5ZWQgdGhlIHNhbWUsIHdoaWNoXG4gICAqIHtAbGluayBhcGlWZXJzaW9uUmFuZ2V9IGNhbm5vdCBzZWUuIEEgZGVwZW5kZW5jeSBlbmFibGVkIGJlbG93IGl0IGNvdW50cyBhcyBVTlNBVElTRklFRCBhbmQgYXNrcyB0aGVcbiAgICogdXNlciB0byB1cGRhdGUgaXQuIEV2YWx1YXRlZCBhZ2FpbnN0IGBtYW5pZmVzdC52ZXJzaW9uYDsgYSB2ZXJzaW9uIHRoYXQgY2Fubm90IGJlIHBhcnNlZCBjb3VudHMgYXMgdG9vXG4gICAqIG9sZC4gQSBtaW5pbXVtIHJhdGhlciB0aGFuIGEgcmFuZ2UsIGJlY2F1c2UgdGhlIG9ubHkgYWR2aWNlIHRoZSBnYXRlIGNhbiBnaXZlIGlzIFwidXBkYXRlIGl0XCIsIGFuZCBhblxuICAgKiB1cHBlciBib3VuZCBpcyBhIHZlcnNpb24gbm8gdXBkYXRlIHJlYWNoZXMuXG4gICAqL1xuICByZWFkb25seSBtaW5QbHVnaW5WZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luLCBhcyBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2luIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luLCBzaG93biB0byB0aGUgdXNlci5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQSBsb2NhbGl6ZWQgc2VudGVuY2Ugc2F5aW5nIHdoYXQgdGhlIGRlcGVuZGVudCBkb2VzIHdpdGggdGhpcyBwbHVnaW4sIHNob3duIGluIHRoZSBzZXR0aW5ncyBiYW5uZXIuXG4gICAqXG4gICAqIFRoZSBkZXBlbmRlbnQgb3ducyB0aGlzIHN0cmluZyBiZWNhdXNlIG9ubHkgaXQga25vd3Mgd2hhdCBpdCB1c2VzIHRoZSBvdGhlciBwbHVnaW4gZm9yLCBhbmQgYSB1c2VyXG4gICAqIGJlaW5nIGFza2VkIHRvIGluc3RhbGwgc29tZXRoaW5nIGRlc2VydmVzIHRvIGJlIHRvbGQgd2h5LlxuICAgKlxuICAgKiBQYXNzIGEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHRvIG1hcmsgdXAgcGFydCBvZiB0aGUgc2VudGVuY2UsIHN1Y2ggYXMgYSBwbHVnaW4gbmFtZSByZW5kZXJlZCBhc1xuICAgKiBjb2RlLiBFYWNoIHJlbmRlciBhcHBlbmRzIGEgZnJlc2ggY2xvbmUgb2YgaXQsIHNpbmNlIHRoZSBiYW5uZXIgaXMgcmVuZGVyZWQgYWdhaW4gb24gZXZlcnkgcmVmcmVzaC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkdhdGVDb21wb25lbnR9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkdhdGVDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29uZmxpY3RzIHRvIGVuZm9yY2UuIEFuIGVtcHR5IGxpc3QgbWVhbnMgdGhlIHBsdWdpbiByZWZ1c2VzIHRvIHJ1biBiZXNpZGUgbm90aGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXTtcblxuICAvKipcbiAgICogVGhlIGRlcGVuZGVuY2llcyB0byBlbmZvcmNlLiBBbiBlbXB0eSBsaXN0IG1lYW5zIHRoZSBwbHVnaW4gZGVwZW5kcyBvbiBub3RoaW5nLCBhbmQgaXRzIGZlYXR1cmVcbiAgICogc3VyZmFjZSBsb2FkcyBpbW1lZGlhdGVseS5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdO1xuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgaG9zdCBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UuIENhbGxlZCBvbmNlIGV2ZXJ5IGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIGFuZCBubyBibG9ja2luZ1xuICAgKiBjb25mbGljdCBob2xkcywgYW5kIGFnYWluIGFmdGVyIGEgZ2F0ZSB0aGF0IGhhZCBjbG9zZWQgb3BlbnMgYmFjayB1cC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBzdXJmYWNlIGlzIGxvYWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgcGx1Z2luIOKAlCB0aGUgb25lIGRlY2xhcmluZyB0aGUgZGVwZW5kZW5jaWVzIGFuZCBjb25mbGljdHMuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgcGx1Z2luJ3Mgbm90aWNlIGNvbXBvbmVudCwgdXNlZCB0byBzYXkgd2hhdCBpcyBtaXNzaW5nLCB3aGF0IGlzIGluIHRoZSB3YXksIGFuZCB3aGF0IGNoYW5nZWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogVW5sb2FkcyB0aGUgaG9zdCBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UuIENhbGxlZCB3aGVuIGEgZ2F0ZSB0aGF0IGhhZCBiZWVuIG9wZW4gY2xvc2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5sb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYn0gY29uc3RydWN0b3IuXG4gKi9cbmludGVyZmFjZSBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYkNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBibG9ja2VkIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBibG9ja2VkIGV4cGxhbmF0aW9uIGludG8gdGhlIHRhYidzIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIHRhYidzIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBzZXR0aW5ncyB0YWIgYSBibG9ja2VkIHBsdWdpbiBzaG93cyBpbiBwbGFjZSBvZiB0aGUgb25lIGl0IG5ldmVyIGdvdCB0byByZWdpc3Rlci5cbiAqXG4gKiBBIGJsb2NrZWQgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIG5ldmVyIHJhbiwgc28gaXRzIHJlYWwgc2V0dGluZ3MgdGFiIGRvZXMgbm90IGV4aXN0IOKAlCBhbmQgYSB1c2VyIHdobyBnb2VzXG4gKiBsb29raW5nIGZvciB0aGUgcGx1Z2luJ3Mgc2V0dGluZ3MgaXMgcHJlY2lzZWx5IHRoZSB1c2VyIGFza2luZyBcIndoeSBpc24ndCB0aGlzIGRvaW5nIGFueXRoaW5nP1wiLiBBblxuICogZW1wdHkgc3BhY2UgaXMgdGhlIHdvcnN0IHBvc3NpYmxlIGFuc3dlciB0byB0aGF0IHF1ZXN0aW9uLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9zZXR0aW5ncy10YWIvcHJlZmVyLXNldHRpbmctZGVmaW5pdGlvbnMgLS0gVGhpcyB0YWIgaGFzIG5vIHNldHRpbmdzIHRvIGRlY2xhcmUuIEl0IHN0YW5kcyBpbiBmb3IgYSBzZXR0aW5ncyB0YWIgdGhhdCBkb2VzIG5vdCBleGlzdCB5ZXQsIGNhcnJ5aW5nIGFuIGV4cGxhbmF0aW9uIGFuZCBhIHJlcGFpciBidXR0b24sIGFuZCB0aGUgcGx1Z2luJ3MgcmVhbCBzZXR0aW5ncyBhcHBlYXIgdGhlIG1vbWVudCB0aGUgZ2F0ZSBvcGVucy5cbmNsYXNzIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAbGluayBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMucGx1Z2luLmFwcCwgcGFyYW1zLnBsdWdpbik7XG4gICAgdGhpcy5yZW5kZXJCYW5uZXIgPSBwYXJhbXMucmVuZGVyQmFubmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHRhYi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNwbGF5KCk6IHZvaWQge1xuICAgIHRoaXMuY29udGFpbmVyRWwuZW1wdHkoKTtcbiAgICB0aGlzLnJlbmRlckJhbm5lcih0aGlzLmNvbnRhaW5lckVsKTtcbiAgfVxufVxuXG4vKipcbiAqIEVuZm9yY2VzIGEgcGx1Z2luJ3MgbWFuZGF0b3J5IGRlcGVuZGVuY2llcyBhbmQgZGVjbGFyZWQgY29uZmxpY3RzLCBnYXRpbmcgaXRzIGZlYXR1cmUgc3VyZmFjZSBvbiBib3RoLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luR2F0ZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbm5vdW5jZWRXYXJuaW5nUGx1Z2luSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpUmVmcyA9IG5ldyBNYXA8c3RyaW5nLCBQbHVnaW5BcGlSZWY8b2JqZWN0Pj4oKTtcbiAgcHJpdmF0ZSBibG9ja2VkU2V0dGluZ1RhYjogbnVsbCB8IFBsdWdpblNldHRpbmdUYWIgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXBlbmRlbmNpZXM6IHJlYWRvbmx5IFBsdWdpbkRlcGVuZGVuY3lbXTtcbiAgcHJpdmF0ZSBoYXNBbm5vdW5jZWRCbG9ja2VkID0gZmFsc2U7XG4gIHByaXZhdGUgaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGlzTGF5b3V0UmVhZHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgbG9zc0Fubm91bmNlbWVudFRpbWVySWQ6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHVubG9hZEZlYXR1cmVTdXJmYWNlOiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgZ2V0IGFwcCgpOiBBcHAge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5hcHA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGx1Z2luR2F0ZUNvbXBvbmVudH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkdhdGVDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25mbGljdHMgPSBwYXJhbXMuY29uZmxpY3RzO1xuICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gcGFyYW1zLmRlcGVuZGVuY2llcztcbiAgICB0aGlzLmxvYWRGZWF0dXJlU3VyZmFjZSA9IHBhcmFtcy5sb2FkRmVhdHVyZVN1cmZhY2U7XG4gICAgdGhpcy5wbHVnaW4gPSBwYXJhbXMucGx1Z2luO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnVubG9hZEZlYXR1cmVTdXJmYWNlID0gcGFyYW1zLnVubG9hZEZlYXR1cmVTdXJmYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgd2hldGhlciBhbnkgd2FybmluZyBjb25mbGljdCBpcyBpbiBmb3JjZSByaWdodCBub3cuXG4gICAqXG4gICAqIFRoZSBwcmVkaWNhdGUgYSBkZWNsYXJhdGl2ZSBzZXR0aW5ncyB0YWIgbmVlZHMsIGFuZCB0aGUgY291bnRlcnBhcnQgdG9cbiAgICogYFBsdWdpblN1Z2dlc3Rpb25Db21wb25lbnQuZ2V0U3VnZ2VzdGVkUGx1Z2luU3RhdGVgLiBTdWNoIGEgdGFiIGRlY2lkZXMgd2hldGhlciBhIHJvdyBleGlzdHNcbiAgICogQkVGT1JFIGl0IHJlbmRlcnMgYW55dGhpbmcgaW50byBpdCwgc28ge0BsaW5rIHJlbmRlckNvbmZsaWN0V2FybmluZ0Jhbm5lcn0gd3JpdGluZyBub3RoaW5nIGNhbm5vdFxuICAgKiBhbnN3ZXIgdGhlIHF1ZXN0aW9uIGZvciBpdCDigJQgYSByb3cgdGhhdCByZW5kZXJzIGVtcHR5IGlzIHN0aWxsIGEgcm93LCB3aXRoIHRoZSBkaXZpZGVyIGFuZCBwYWRkaW5nXG4gICAqIGV2ZXJ5IG90aGVyIHNldHRpbmcgaGFzLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIGF0IGxlYXN0IG9uZSBkZWNsYXJlZCB3YXJuaW5nIGNvbmZsaWN0IGhvbGRzLlxuICAgKi9cbiAgcHVibGljIGhhc0FjdGl2ZVdhcm5pbmdDb25mbGljdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuV2FybikubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgd2F0Y2hpbmcgZXZlcnkgZGVjbGFyZWQgZGVwZW5kZW5jeSBhbmQgY29uZmxpY3QuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuICAgICAgY29uc3QgYXBpUmVmID0gd2F0Y2hQbHVnaW5BcGk8b2JqZWN0Pih7XG4gICAgICAgIGFwaVZlcnNpb25SYW5nZTogZGVwZW5kZW5jeS5hcGlWZXJzaW9uUmFuZ2UsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWRcbiAgICAgIH0pO1xuICAgICAgcmVnaXN0ZXJBc3luY0V2ZW50KFxuICAgICAgICB0aGlzLFxuICAgICAgICBhcGlSZWYub24oJ2NoYW5nZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLmFwaVJlZnMuc2V0KGRlcGVuZGVuY3kucGx1Z2luSWQsIGFwaVJlZik7XG4gICAgfVxuXG4gICAgLy8gQSBjb25mbGljdCBoYXMgbm8gQVBJIHRvIHdhdGNoIOKAlCBpdCBpcyByZWFkIG91dCBvZiB0aGUgbWFuaWZlc3RzIOKAlCBzbyB0aGUgdHJpZ2dlciB0byByZS1yZWFkIGlzIHRoZVxuICAgIC8vIGxpYnJhcnkncyBvd24gbGlmZWN5Y2xlIGJyb2FkY2FzdC4gSXQgY292ZXJzIGV2ZXJ5IGNvbmZsaWN0aW5nIHBsdWdpbiBidWlsdCBvbiB0aGlzIGxpYnJhcnk7IG9uZVxuICAgIC8vIHRoYXQgaXMgbm90IGlzIGNhdWdodCBhdCB0aGUgbmV4dCBsb2FkLCBhcyB0aGUgZmlsZSBoZWFkZXIgc2F5cy5cbiAgICBjb25zdCBsaWZlY3ljbGVFdmVudE5hbWVzOiBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWVbXSA9IFtQTFVHSU5fTE9BREVEX0VWRU5UX05BTUUsIFBMVUdJTl9VTkxPQURFRF9FVkVOVF9OQU1FXTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBvZiBsaWZlY3ljbGVFdmVudE5hbWVzKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKFxuICAgICAgICBldmVudE5hbWUsXG4gICAgICAgIGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAocGF5bG9hZDogUGx1Z2luTGlmZWN5Y2xlRXZlbnRQYXlsb2FkKSA9PiB7XG4gICAgICAgICAgaWYgKHBheWxvYWQucGx1Z2luSWQgPT09IHRoaXMucGx1Z2luLm1hbmlmZXN0LmlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICB9XG5cbiAgICAvLyBOb3RoaW5nIGlzIFNBSUQgYWJvdXQgYSBtaXNzaW5nIGRlcGVuZGVuY3kgdW50aWwgdGhlIGxheW91dCBpcyByZWFkeS4gUGx1Z2lucyBsb2FkIGluIGFuIHVuc3BlY2lmaWVkXG4gICAgLy8gb3JkZXIsIHNvIGEgZGVwZW5kZW5jeSB0aGF0IHNpbXBseSBoYXMgbm90IGxvYWRlZCB5ZXQgaXMgaW5kaXN0aW5ndWlzaGFibGUgYXQgdGhpcyBwb2ludCBmcm9tIG9uZVxuICAgIC8vIHRoYXQgaXMgbm90IGluc3RhbGxlZCDigJQgYW5ub3VuY2luZyBoZXJlIHdvdWxkIHB1dCBhIFwibWlzc2luZyBwbHVnaW5cIiBub3RpY2Ugb24gc2NyZWVuIGF0IGV2ZXJ5XG4gICAgLy8gc3RhcnR1cCBhbmQgdGFrZSBpdCBhd2F5IGEgbW9tZW50IGxhdGVyLiBUaGUgZ2F0ZSBpdHNlbGYgZG9lcyBub3Qgd2FpdDogdGhlIHN1cmZhY2UgbG9hZHMgdGhlXG4gICAgLy8gaW5zdGFudCB0aGUgZGVwZW5kZW5jeSBpcyB0aGVyZSwgd2hlbmV2ZXIgdGhhdCBpcy5cbiAgICB0aGlzLmFkZENoaWxkKFxuICAgICAgbmV3IENhbGxiYWNrTGF5b3V0UmVhZHlDb21wb25lbnQodGhpcy5hcHAsICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0xheW91dFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcmVzZW50VW5zYXRpc2ZpZWQodGhpcy5nZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpLCB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5LkJsb2NrKSk7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VXYXJuaW5ncygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlcigoKSA9PiB7XG4gICAgICB0aGlzLmNhbmNlbExvc3NBbm5vdW5jZW1lbnQoKTtcbiAgICAgIHRoaXMuaGlkZUJsb2NrZWRTZXR0aW5nVGFiKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIHRoZSBnYXRlIG9uY2UgdGhlIHdhdGNoZXMgYXJlIGluIHBsYWNlLCBsb2FkaW5nIHRoZSBmZWF0dXJlIHN1cmZhY2UgaWYgaXQgaXMgYWxyZWFkeSBvcGVuLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGZpcnN0IGV2YWx1YXRpb24gaXMgY29tcGxldGUuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgb25sb2FkQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBhIGJhbm5lciBmb3IgZXZlcnkgY29uZmxpY3QgdGhlIGhvc3QgaXMgcnVubmluZyBhbG9uZ3NpZGUsIHNvIGEgcGx1Z2luIGNhbiBwdXQgdGhlIG92ZXJsYXAgaW5cbiAgICogaXRzIG93biBzZXR0aW5ncyB0YWIuXG4gICAqXG4gICAqIENvbnN1bWVyLWludm9rZWQsIGV4YWN0bHkgbGlrZSBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudC5yZW5kZXJCYW5uZXJgOiB0aGUgbGlicmFyeSByZWdpc3RlcnMgdGhlXG4gICAqIHNldHRpbmdzIHRhYiBhIEJMT0NLRUQgcGx1Z2luIG5lZWRzLCBiZWNhdXNlIHRoYXQgcGx1Z2luIG5ldmVyIGdvdCB0byByZWdpc3RlciBvbmUgb2YgaXRzIG93biwgYnV0IGl0XG4gICAqIGhhcyBubyBob29rIGludG8gdGhlIHRhYiBhIHJ1bm5pbmcgcGx1Z2luIGJ1aWxkcy4gUmVuZGVycyBub3RoaW5nIHdoZW4gbm8gd2FybmluZyBjb25mbGljdCBob2xkcy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyQ29uZmxpY3RXYXJuaW5nQmFubmVyKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY29uZmxpY3Qgb2YgdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKSkge1xuICAgICAgdGhpcy5yZW5kZXJDb25mbGljdEVudHJ5KGNvbnRhaW5lckVsLCBjb25mbGljdCwgdGhpcy5jcmVhdGVDb25mbGljdFdhcm5pbmdNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgd2hhdCB3ZW50IGF3YXkgd2hpbGUgdGhlIHBsdWdpbiB3YXMgcnVubmluZywgbm93IHRoYXQgdGhlIGdyYWNlIHBlcmlvZCBpcyBvdmVyLlxuICAgKlxuICAgKiBSZS1yZWFkcyB0aGUgZ2F0ZSByYXRoZXIgdGhhbiB0cnVzdGluZyB3aGF0IGNsb3NlZCBpdCwgc28gYSBkZXBlbmRlbmN5IHRoYXQgd2VudCBhd2F5IGR1cmluZyB0aGVcbiAgICogd2luZG93IGlzIGFubm91bmNlZCB3aXRoIHRoZSByZXN0LiBPbmUgdGhhdCBjYW1lIGJhY2sgaW4gdGltZSBuZXZlciBnZXRzIGhlcmU6IHRoZSBnYXRlIHJlb3BlbmluZ1xuICAgKiBjYW5jZWxzIHRoZSB0aW1lci5cbiAgICovXG4gIHByaXZhdGUgYW5ub3VuY2VMb3NzKCk6IHZvaWQge1xuICAgIHRoaXMubG9zc0Fubm91bmNlbWVudFRpbWVySWQgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHRoaXMuZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKSkge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZURlcGVuZGVuY3lMb3N0TWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5LkJsb2NrKSkge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUNvbmZsaWN0QXBwZWFyZWRNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhbm5vdW5jZVdhcm5pbmdzKCk6IHZvaWQge1xuICAgIC8vIEEgd2FybmluZyBkZXNjcmliZXMgdHdvIHBsdWdpbnMgdGhhdCBhcmUgYm90aCBSVU5OSU5HLCBzbyBpdCBpcyBwb2ludGxlc3Mgd2hpbGUgdGhpcyBvbmUgaXMgYmxvY2tlZFxuICAgIC8vIOKAlCBhbmQgaXQgd2FpdHMgZm9yIGxheW91dC1yZWFkeSBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBibG9ja2VkIG5vdGljZSBkb2VzLlxuICAgIGlmICghdGhpcy5pc0xheW91dFJlYWR5IHx8ICF0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuV2FybikpIHtcbiAgICAgIGlmICh0aGlzLmFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMuaGFzKGNvbmZsaWN0LnBsdWdpbklkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hbm5vdW5jZWRXYXJuaW5nUGx1Z2luSWRzLmFkZChjb25mbGljdC5wbHVnaW5JZCk7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlQ29uZmxpY3RXYXJuaW5nTWVzc2FnZShjb25mbGljdCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCk7XG4gICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBpZiAodGhpcy5pc1Rvb09sZChkZXBlbmRlbmN5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVmVyc2lvbk1pc21hdGNoTWVzc2FnZShkZXBlbmRlbmN5KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1J1bm5pbmcoZGVwZW5kZW5jeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU5vUmVhZGFibGVBcGlNZXNzYWdlKGRlcGVuZGVuY3kpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5ibG9ja2VkTm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb25mbGljdEFwcGVhcmVkTWVzc2FnZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0LmNvbmZsaWN0QXBwZWFyZWROb3RpY2UsIHtcbiAgICAgIGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogYXNDb2RlQmxvY2soY29uZmxpY3QucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29uZmxpY3RCbG9ja2VkTWVzc2FnZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0LmJsb2NrZWROb3RpY2UsIHtcbiAgICAgIGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogYXNDb2RlQmxvY2soY29uZmxpY3QucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29uZmxpY3RXYXJuaW5nTWVzc2FnZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0Lndhcm5pbmdOb3RpY2UsIHtcbiAgICAgIGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogYXNDb2RlQmxvY2soY29uZmxpY3QucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGVwZW5kZW5jeUxvc3RNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBpZiAodGhpcy5pc1Rvb09sZChkZXBlbmRlbmN5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVmVyc2lvbk1pc21hdGNoTWVzc2FnZShkZXBlbmRlbmN5KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1J1bm5pbmcoZGVwZW5kZW5jeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU5vUmVhZGFibGVBcGlNZXNzYWdlKGRlcGVuZGVuY3kpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5kZXBlbmRlbmN5TG9zdE5vdGljZSwge1xuICAgICAgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGRlcGVuZGVuY3kucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTm9SZWFkYWJsZUFwaU1lc3NhZ2UoZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5ub1JlYWRhYmxlQXBpTm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkRlcGVuZGVuY3kudmVyc2lvbk1pc21hdGNoTm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBkZWNsYXJlZCBjb25mbGljdHMgb2Ygb25lIHNldmVyaXR5IHRoYXQgYXJlIGN1cnJlbnRseSBpbiBmb3JjZS5cbiAgICpcbiAgICogQHBhcmFtIHNldmVyaXR5IC0gVGhlIHNldmVyaXR5IHRvIHNlbGVjdC5cbiAgICogQHJldHVybnMgVGhlIGNvbmZsaWN0cyBob2xkaW5nIHJpZ2h0IG5vdywgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWNsYXJlZC5cbiAgICovXG4gIHByaXZhdGUgZ2V0QWN0aXZlQ29uZmxpY3RzKHNldmVyaXR5OiBQbHVnaW5Db25mbGljdFNldmVyaXR5KTogUGx1Z2luQ29uZmxpY3RbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmxpY3RzLmZpbHRlcigoY29uZmxpY3QpID0+IGNvbmZsaWN0LnNldmVyaXR5ID09PSBzZXZlcml0eSAmJiB0aGlzLmlzQ29uZmxpY3RBY3RpdmUoY29uZmxpY3QpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKTogUGx1Z2luRGVwZW5kZW5jeVtdIHtcbiAgICByZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXBlbmRlbmN5KSA9PiAhdGhpcy5hcGlSZWZzLmdldChkZXBlbmRlbmN5LnBsdWdpbklkKT8udmFsdWUgfHwgdGhpcy5pc0JlbG93TWluUGx1Z2luVmVyc2lvbihkZXBlbmRlbmN5KSk7XG4gIH1cblxuICBwcml2YXRlIGhpZGVCbG9ja2VkU2V0dGluZ1RhYigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYmxvY2tlZFNldHRpbmdUYWIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFwcC5zZXR0aW5nLnJlbW92ZVNldHRpbmdUYWIodGhpcy5ibG9ja2VkU2V0dGluZ1RhYik7XG4gICAgdGhpcy5ibG9ja2VkU2V0dGluZ1RhYiA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGF0IGEgcmVsZWFzZSBvbGRlciB0aGFuIGl0IGRlY2xhcmVkIGl0IG5lZWRzLlxuICAgKlxuICAgKiBSZWFkIGZyb20gdGhlIG1hbmlmZXN0LCBsaWtlIGEgY29uZmxpY3QsIGFuZCByZS1yZWFkIG9uIGV2ZXJ5IGV2YWx1YXRpb246IE9ic2lkaWFuIGFwcGxpZXMgYW4gdXBkYXRlIGJ5XG4gICAqIHJlbG9hZGluZyB0aGUgcHJvdmlkZXIsIHdoaWNoIGZpcmVzIHRoZSBBUEkgd2F0Y2gncyBgY2hhbmdlYCwgc28gdGhlIGdhdGUgb3BlbnMgd2l0aG91dCBhIHJlc3RhcnQuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBlbmRlbmN5IC0gVGhlIGRlY2xhcmVkIGRlcGVuZGVuY3kuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGRlcGVuZGVuY3kgaXMgZW5hYmxlZCBiZWxvdyBpdHMge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3kubWluUGx1Z2luVmVyc2lvbn07IGBmYWxzZWBcbiAgICogd2hlbiBpdCBkZWNsYXJlcyBub25lIG9yIGlzIG5vdCBlbmFibGVkLCBzaW5jZSBpdHMgQVBJIGlzIHRoZW4gYWJzZW50IGFueXdheS5cbiAgICovXG4gIHByaXZhdGUgaXNCZWxvd01pblBsdWdpblZlcnNpb24oZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IGJvb2xlYW4ge1xuICAgIGlmIChkZXBlbmRlbmN5Lm1pblBsdWdpblZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSBnZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZFxuICAgIH0pO1xuXG4gICAgaWYgKGluc3RhbGxlZFZlcnNpb24gPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuICFjb21wYXJlVmVyc2lvbnMoaW5zdGFsbGVkVmVyc2lvbiwgZGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9uLCAnPj0nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgb25lIGRlY2xhcmVkIGNvbmZsaWN0IGlzIGluIGZvcmNlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogT25seSBhbiBFTkFCTEVEIHBsdWdpbiBjb3VudHMuIE9uZSB0aGF0IGlzIGluc3RhbGxlZCBidXQgc3dpdGNoZWQgb2ZmIHJlZ2lzdGVycyBub3RoaW5nLCBzbyBpdCBjYW5ub3RcbiAgICogY29sbGlkZSwgYW5kIGFjdGluZyBvbiBpdCB3b3VsZCBiZSBhbiBhbGFybSB0aGUgdXNlciBjYW4gb25seSBhbnN3ZXIgYnkgdW5pbnN0YWxsaW5nIHNvbWV0aGluZyB0aGV5XG4gICAqIGhhdmUgYWxyZWFkeSB0dXJuZWQgb2ZmLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmxpY3QgLSBUaGUgZGVjbGFyZWQgY29uZmxpY3QuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNvbmZsaWN0aW5nIHBsdWdpbiBpcyBlbmFibGVkIGF0IGEgY29uZmxpY3RpbmcgdmVyc2lvbi5cbiAgICovXG4gIHByaXZhdGUgaXNDb25mbGljdEFjdGl2ZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbnN0YWxsZWRWZXJzaW9uID0gZ2V0SW5zdGFsbGVkUGx1Z2luVmVyc2lvbih7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgcGx1Z2luSWQ6IGNvbmZsaWN0LnBsdWdpbklkXG4gICAgfSk7XG5cbiAgICBpZiAoaW5zdGFsbGVkVmVyc2lvbiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc2F0aXNmaWVzVmVyc2lvbihpbnN0YWxsZWRWZXJzaW9uLCBjb25mbGljdC5jb25mbGljdGluZ1ZlcnNpb25SYW5nZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGFuIHVuc2F0aXNmaWVkIGRlcGVuZGVuY3kgaXMgbm9uZXRoZWxlc3MgZW5hYmxlZCBhbmQgbG9hZGVkLlxuICAgKlxuICAgKiBTdWNoIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGJ1dCBwdWJsaXNoZXMgbm8gQVBJIHRoaXMgcGx1Z2luIGNhbiByZWFkIOKAlCBub25lIGF0IGFsbCwgb3Igb25lIHdob3NlIHNoYXBlXG4gICAqIGZhaWxzIHRoZSBjb250cmFjdC4gVGhlIHVzdWFsIGNhdXNlIGlzIGEgcmVsZWFzZSBidWlsdCBvbiBhIGNvcHkgb2YgdGhpcyBsaWJyYXJ5IHRoYXQgcHVibGlzaGVzXG4gICAqIHNvbWV3aGVyZSB0aGlzIG9uZSBkb2VzIG5vdCBsb29rLCBzbyBcImluc3RhbGwgYW5kIGVuYWJsZSBpdFwiIHdvdWxkIGJlIGZhbHNlIGFuZCBcInVwZGF0ZSBpdFwiIGlzIHRoZSBmaXguXG4gICAqXG4gICAqIEJlaW5nIGluIGBlbmFibGVkUGx1Z2luc2AgaXMgbm90IGVub3VnaDogT2JzaWRpYW4ncyBwbGFpbiBgZGlzYWJsZVBsdWdpbmAgdW5sb2FkcyBhIHBsdWdpbiBhbmQgbGVhdmVzIGl0XG4gICAqIHRoZXJlIChvbmx5IGBkaXNhYmxlUGx1Z2luQW5kU2F2ZWAgcmVtb3ZlcyBpdCksIHNvIGEgcHJvdmlkZXIgdGhhdCB3ZW50IGF3YXkgd291bGQgb3RoZXJ3aXNlIHJlYWQgYXNcbiAgICogcnVubmluZyB3aXRoIGFuIHVucmVhZGFibGUgQVBJLlxuICAgKlxuICAgKiBAcGFyYW0gZGVwZW5kZW5jeSAtIFRoZSBkZWNsYXJlZCBkZXBlbmRlbmN5LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBkZXBlbmRlbmN5IGlzIGVuYWJsZWQgYW5kIGxvYWRlZC5cbiAgICovXG4gIHByaXZhdGUgaXNSdW5uaW5nKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0SW5zdGFsbGVkUGx1Z2luU3RhdGUoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWRcbiAgICAgICAgfSkgPT09IEluc3RhbGxlZFBsdWdpblN0YXRlLkVuYWJsZWQgJiYgdGhpcy5hcHAucGx1Z2lucy5nZXRQbHVnaW4oZGVwZW5kZW5jeS5wbHVnaW5JZCkgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGJ1dCB0b28gb2xkIGZvciB0aGlzIHBsdWdpbiwgc28gdGhlIGFkdmljZSBpcyBcInVwZGF0ZSBpdFwiLlxuICAgKlxuICAgKiBUd28gaW5kZXBlbmRlbnQgc2lnbmFscyBzYXkgc286IGEgcmVsZWFzZSBiZWxvdyB7QGxpbmsgUGx1Z2luRGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9ufSwgYW5kIGEgcHVibGlzaGVkXG4gICAqIEFQSSB3aG9zZSBjb250cmFjdCB2ZXJzaW9uIGlzIG91dHNpZGUge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3kuYXBpVmVyc2lvblJhbmdlfS5cbiAgICpcbiAgICogQHBhcmFtIGRlcGVuZGVuY3kgLSBUaGUgZGVjbGFyZWQgZGVwZW5kZW5jeS5cbiAgICogQHJldHVybnMgV2hldGhlciB1cGRhdGluZyB0aGUgZGVwZW5kZW5jeSBpcyB3aGF0IGl0IG5lZWRzLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1Rvb09sZChkZXBlbmRlbmN5OiBQbHVnaW5EZXBlbmRlbmN5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNCZWxvd01pblBsdWdpblZlcnNpb24oZGVwZW5kZW5jeSlcbiAgICAgIHx8IHRoaXMuYXBpUmVmcy5nZXQoZGVwZW5kZW5jeS5wbHVnaW5JZCk/LnVuYXZhaWxhYmlsaXR5UmVhc29uID09PSBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbi5WZXJzaW9uTWlzbWF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogU2F5cyB3aGF0IGlzIGluIHRoZSB3YXksIGFuZCBwdXRzIHRoZSBzYW1lIGV4cGxhbmF0aW9uIHdoZXJlIHRoZSB1c2VyIHdpbGwgbG9vayBmb3IgdGhlIHBsdWdpbidzXG4gICAqIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMgLSBUaGUgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgc2F0aXNmaWVkLlxuICAgKiBAcGFyYW0gYmxvY2tpbmdDb25mbGljdHMgLSBUaGUgY29uZmxpY3RzIGN1cnJlbnRseSByZWZ1c2luZyB0aGUgcGx1Z2luIHRoZSByaWdodCB0byBydW4uXG4gICAqL1xuICBwcml2YXRlIHByZXNlbnRVbnNhdGlzZmllZChcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0xheW91dFJlYWR5IHx8ICh1bnNhdGlzZmllZERlcGVuZGVuY2llcy5sZW5ndGggPT09IDAgJiYgYmxvY2tpbmdDb25mbGljdHMubGVuZ3RoID09PSAwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0Jsb2NrZWRTZXR0aW5nVGFiKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLCBibG9ja2luZ0NvbmZsaWN0cyk7XG5cbiAgICBpZiAodGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodGhpcy5jcmVhdGVCbG9ja2VkTWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiBibG9ja2luZ0NvbmZsaWN0cykge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmUtZXZhbHVhdGVzIHRoZSBnYXRlIGFuZCBtb3ZlcyB0aGUgZmVhdHVyZSBzdXJmYWNlIHRvIG1hdGNoLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHN1cmZhY2UgbWF0Y2hlcyB0aGUgZ2F0ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1bnNhdGlzZmllZERlcGVuZGVuY2llcyA9IHRoaXMuZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKTtcbiAgICBjb25zdCBibG9ja2luZ0NvbmZsaWN0cyA9IHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuQmxvY2spO1xuXG4gICAgaWYgKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCAmJiBibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpO1xuICAgICAgdGhpcy5oaWRlQmxvY2tlZFNldHRpbmdUYWIoKTtcbiAgICAgIHRoaXMuaGFzQW5ub3VuY2VkQmxvY2tlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoIXRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCkge1xuICAgICAgICB0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRGZWF0dXJlU3VyZmFjZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFubm91bmNlV2FybmluZ3MoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0ZlYXR1cmVTdXJmYWNlTG9hZGVkKSB7XG4gICAgICB0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMudW5sb2FkRmVhdHVyZVN1cmZhY2UoKTtcblxuICAgICAgLy8gQSBnYXRlIHRoYXQgY2xvc2VzIHdoaWxlIHRoZSBwbHVnaW4gaXMgUlVOTklORyBpcyB0aGUgY2FzZSB3b3J0aCBiZWluZyBsb3VkIGFib3V0OiB0aGUgdXNlciBqdXN0XG4gICAgICAvLyBkaWQgc29tZXRoaW5nLCBhbmQgdGhlIGNvbnNlcXVlbmNlIGlzIGltbWVkaWF0ZSBhbmQgaW52aXNpYmxlIHdpdGhvdXQgdGhpcy4gQW5ub3VuY2VkIHJlZ2FyZGxlc3NcbiAgICAgIC8vIG9mIGxheW91dCByZWFkaW5lc3MsIGJlY2F1c2UgYSBydW5uaW5nIHBsdWdpbiBtZWFucyB0aGUgbGF5b3V0IGlzIGxvbmcgc2luY2UgcmVhZHkg4oCUIGJ1dCBvbmx5XG4gICAgICAvLyBvbmNlIHRoZSBncmFjZSBwZXJpb2QgaGFzIHNob3duIHRoZSBsb3NzIGlzIG5vdCBhbiB1cGRhdGUgcmVsb2FkaW5nIHRoZSBwcm92aWRlciAoc2VlIHRoZSBmaWxlXG4gICAgICAvLyBoZWFkZXIpLlxuICAgICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hbm5vdW5jZUxvc3MoKTtcbiAgICAgIH0sIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgICB0aGlzLmhhc0Fubm91bmNlZEJsb2NrZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zaG93QmxvY2tlZFNldHRpbmdUYWIodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMsIGJsb2NraW5nQ29uZmxpY3RzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByZXNlbnRVbnNhdGlzZmllZCh1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGJsb2NrZWQgZXhwbGFuYXRpb24gaW50byBhIHNldHRpbmdzLXRhYiBjb250YWluZXI6IHdoYXQgaXMgbWlzc2luZyBvciBpbiB0aGUgd2F5LCB3aHkgaXRcbiAgICogbWF0dGVycywgYW5kIHRoZSBidXR0b24gdGhhdCBmaXhlcyBpdC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqIEBwYXJhbSB1bnNhdGlzZmllZERlcGVuZGVuY2llcyAtIFRoZSBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBzYXRpc2ZpZWQuXG4gICAqIEBwYXJhbSBibG9ja2luZ0NvbmZsaWN0cyAtIFRoZSBjb25mbGljdHMgY3VycmVudGx5IHJlZnVzaW5nIHRoZSBwbHVnaW4gdGhlIHJpZ2h0IHRvIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQmxvY2tlZEJhbm5lcihcbiAgICBjb250YWluZXJFbDogSFRNTEVsZW1lbnQsXG4gICAgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXM6IHJlYWRvbmx5IFBsdWdpbkRlcGVuZGVuY3lbXSxcbiAgICBibG9ja2luZ0NvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXVxuICApOiB2b2lkIHtcbiAgICBpZiAodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkRlcGVuZGVuY3kuc2V0dGluZ3NIZWFkaW5nKSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMpIHtcbiAgICAgIGNvbnN0IGJhbm5lckVsID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KHtcbiAgICAgICAgY2xzOiBbQ3NzQ2xhc3MuTGlicmFyeU5hbWUsIENzc0NsYXNzLlBsdWdpbkRlcGVuZGVuY3lCYW5uZXJdXG4gICAgICB9KTtcbiAgICAgIGJhbm5lckVsLmFwcGVuZCh0aGlzLmNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3kpKTtcbiAgICAgIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUoYmFubmVyRWwuY3JlYXRlRGl2KCksIGRlcGVuZGVuY3kucmVhc29uKTtcblxuICAgICAgY29uc3Qgc3RhdGUgPSBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkXG4gICAgICB9KTtcblxuICAgICAgLy8gQW4gZW5hYmxlZCBkZXBlbmRlbmN5IHRoYXQgaXMgc3RpbGwgdW5zYXRpc2ZpZWQgaXMgdG9vIG9sZCwgYW5kIGluc3RhbGxpbmcgb3IgZW5hYmxpbmcgaXQgYWdhaW4gZG9lc1xuICAgICAgLy8gbm90aGluZywgc28gaXQgaXMgb2ZmZXJlZCBhbiB1cGRhdGUgaW5zdGVhZC5cbiAgICAgIGlmIChzdGF0ZSAhPT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuRW5hYmxlZCkge1xuICAgICAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+XG4gICAgICAgICAgICBzdGF0ZSA9PT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuSW5zdGFsbGVkQnV0RGlzYWJsZWRcbiAgICAgICAgICAgICAgPyAkLm9ic2lkaWFuTGliLnBsdWdpblN1Z2dlc3Rpb24uZW5hYmxlXG4gICAgICAgICAgICAgIDogJC5vYnNpZGlhbkxpYi5wbHVnaW5TdWdnZXN0aW9uLmluc3RhbGxcbiAgICAgICAgICApKVxuICAgICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBpbnN0YWxsQW5kRW5hYmxlUGx1Z2luKHtcbiAgICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWQsXG4gICAgICAgICAgICAgIHBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSxcbiAgICAgICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gT2JzaWRpYW4gYXBwbGllcyB0aGUgdXBkYXRlIGJ5IHJlbG9hZGluZyB0aGUgZGVwZW5kZW5jeSwgd2hpY2ggcmVwdWJsaXNoZXMgaXRzIEFQSSwgc28gdGhlIHdhdGNoJ3NcbiAgICAgIC8vIGBjaGFuZ2VgIHJlb3BlbnMgdGhlIGdhdGUgd2l0aCBubyBmdXJ0aGVyIHN0ZXAgaGVyZS5cbiAgICAgIG5ldyBCdXR0b25Db21wb25lbnQoYmFubmVyRWwpXG4gICAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS51cGRhdGUsIHsgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSB9KSlcbiAgICAgICAgLnNldEN0YSgpXG4gICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdXBkYXRlUGx1Z2luKHtcbiAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZCxcbiAgICAgICAgICAgIHBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSxcbiAgICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgICByZXF1ZXN0aW5nUGx1Z2luTmFtZTogdGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG5cbiAgICAgIC8vIFRoZSBsaW5rIE9VVCB0byB0aGUgZGVwZW5kZW5jeSdzIG93biBzZXR0aW5ncywgc2hvd24gb25seSBvbmNlIGl0IGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZCDigJQgdGhlXG4gICAgICAvLyBvdGhlciBoYWxmIG9mIHRoZSByZWxhdGlvbnNoaXAgYmVpbmcgdmlzaWJsZSBmcm9tIGJvdGggZW5kcy4gSXQgaXMgd2hhdCBzdG9wcyBcImNvbmZpZ3VyZSBvbmVcbiAgICAgIC8vIG9wZXJhdGlvbiBhY3Jvc3MgdHdvIHBsdWdpbnNcIiBmcm9tIG1lYW5pbmcgXCJnbyBhbmQgZmluZCB0aGUgb3RoZXIgcGx1Z2luIHlvdXJzZWxmXCIuXG4gICAgICB0aGlzLnJlbmRlck9wZW5TZXR0aW5nc0J1dHRvbihiYW5uZXJFbCwgZGVwZW5kZW5jeS5wbHVnaW5JZCwgZGVwZW5kZW5jeS5wbHVnaW5OYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoYmxvY2tpbmdDb25mbGljdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0LnNldHRpbmdzSGVhZGluZykgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIGJsb2NraW5nQ29uZmxpY3RzKSB7XG4gICAgICB0aGlzLnJlbmRlckNvbmZsaWN0RW50cnkoY29udGFpbmVyRWwsIGNvbmZsaWN0LCB0aGlzLmNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBvbmUgY29uZmxpY3Q6IHdoYXQgaXQgaXMsIHdoeSBpdCBtYXR0ZXJzLCBhbmQgdGhlIHR3byB3YXlzIG91dCBvZiBpdC5cbiAgICpcbiAgICogVGhlIHJlcGFpciBpcyBvZmZlcmVkIG9uIHRoZSBPVEhFUiBwbHVnaW4g4oCUIGRpc2FibGluZyBpdCBpcyB0aGUgb25lIHRoaW5nIHRoaXMgcGx1Z2luIGNhbiBkbyBpbiBhXG4gICAqIGNsaWNrLCBzaW5jZSBpdCBjYW5ub3QgdXBkYXRlIHNvbWVvbmUgZWxzZSdzIHBsdWdpbiDigJQgYW5kIGl0IGlzIHRoZSBwZXJzaXN0ZWQgYGRpc2FibGVQbHVnaW5BbmRTYXZlYFxuICAgKiByYXRoZXIgdGhhbiB0aGUgdHJhbnNpZW50IGRpc2FibGUsIGJlY2F1c2UgdGhlIHVzZXIgYXNrZWQgZm9yIGl0IGJ5IGNsaWNraW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgZWxlbWVudCB0byByZW5kZXIgaW50by5cbiAgICogQHBhcmFtIGNvbmZsaWN0IC0gVGhlIGNvbmZsaWN0IHRvIHJlbmRlci5cbiAgICogQHBhcmFtIG1lc3NhZ2VGcmFnbWVudCAtIFRoZSBzZW50ZW5jZSBleHBsYWluaW5nIHRoZSBjb25mbGljdC5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQ29uZmxpY3RFbnRyeShjb250YWluZXJFbDogSFRNTEVsZW1lbnQsIGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCwgbWVzc2FnZUZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KTogdm9pZCB7XG4gICAgY29uc3QgYmFubmVyRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoe1xuICAgICAgY2xzOiBbQ3NzQ2xhc3MuTGlicmFyeU5hbWUsIENzc0NsYXNzLlBsdWdpbkNvbmZsaWN0QmFubmVyXVxuICAgIH0pO1xuICAgIGJhbm5lckVsLmFwcGVuZChtZXNzYWdlRnJhZ21lbnQpO1xuICAgIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUoYmFubmVyRWwuY3JlYXRlRGl2KCksIGNvbmZsaWN0LnJlYXNvbik7XG5cbiAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5Db25mbGljdC5kaXNhYmxlLCB7IGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogY29uZmxpY3QucGx1Z2luTmFtZSB9KSlcbiAgICAgIC5zZXRDdGEoKVxuICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZGlzYWJsZUNvbW11bml0eVBsdWdpbih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5JZDogY29uZmxpY3QucGx1Z2luSWRcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuICAgICAgfSkpO1xuXG4gICAgdGhpcy5yZW5kZXJPcGVuU2V0dGluZ3NCdXR0b24oYmFubmVyRWwsIGNvbmZsaWN0LnBsdWdpbklkLCBjb25mbGljdC5wbHVnaW5OYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyT3BlblNldHRpbmdzQnV0dG9uKGJhbm5lckVsOiBIVE1MRWxlbWVudCwgcGx1Z2luSWQ6IHN0cmluZywgcGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbmV3IEJ1dHRvbkNvbXBvbmVudChiYW5uZXJFbClcbiAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5vcGVuRGVwZW5kZW5jeVNldHRpbmdzLCB7XG4gICAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBwbHVnaW5OYW1lXG4gICAgICB9KSlcbiAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHAuc2V0dGluZy5vcGVuKCk7XG4gICAgICAgIHRoaXMuYXBwLnNldHRpbmcub3BlblRhYkJ5SWQocGx1Z2luSWQpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dCbG9ja2VkU2V0dGluZ1RhYihcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJsb2NrZWRTZXR0aW5nVGFiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWRkZWQgdGhyb3VnaCBgYXBwLnNldHRpbmdgIHJhdGhlciB0aGFuIGBwbHVnaW4uYWRkU2V0dGluZ1RhYmAsIGJlY2F1c2UgdGhpcyB0YWIgaGFzIHRvIGNvbWUgYmFja1xuICAgIC8vIE9GRiBhZ2FpbiB0aGUgbW9tZW50IHRoZSBnYXRlIG9wZW5zIOKAlCBvdGhlcndpc2UgdGhlIHBsdWdpbidzIG93biBzZXR0aW5ncyB0YWIsIHJlZ2lzdGVyZWQgYnlcbiAgICAvLyBgb25sb2FkSW1wbGAsIHdvdWxkIGFwcGVhciBiZXNpZGUgYSBzdGFsZSBcInJlcXVpcmVkIHBsdWdpbiBtaXNzaW5nXCIgb25lLiBgcGx1Z2luLmFkZFNldHRpbmdUYWJgXG4gICAgLy8gb25seSBldmVyIHJlbW92ZXMgYXQgcGx1Z2luIHVubG9hZC5cbiAgICBjb25zdCBibG9ja2VkU2V0dGluZ1RhYiA9IG5ldyBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYih7XG4gICAgICBwbHVnaW46IHRoaXMucGx1Z2luLFxuICAgICAgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWwpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJCbG9ja2VkQmFubmVyKGNvbnRhaW5lckVsLCB1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuYXBwLnNldHRpbmcuYWRkU2V0dGluZ1RhYihibG9ja2VkU2V0dGluZ1RhYik7XG4gICAgdGhpcy5ibG9ja2VkU2V0dGluZ1RhYiA9IGJsb2NrZWRTZXR0aW5nVGFiO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBGQSxtQkFBbUM7QUFDbkMsOEJBR087QUFDUCxzQkFHTztBQVNQLCtCQUF1QztBQUN2Qyx1QkFBeUI7QUFDekIsMEJBSU87QUFDUCxrQkFBa0I7QUFDbEIsd0JBR087QUFDUCxrQ0FNTztBQUNQLHFDQUdPO0FBQ1Asb0NBQW1DO0FBQ25DLDBCQUE0QjtBQUM1QixvQ0FBNkM7QUFRN0MsTUFBTSxpREFBaUQ7QUFLaEQsSUFBSyx5QkFBTCxrQkFBS0EsNEJBQUw7QUFPTCxFQUFBQSx3QkFBQSxXQUFRO0FBUVIsRUFBQUEsd0JBQUEsVUFBTztBQWZHLFNBQUFBO0FBQUEsR0FBQTtBQTBLWixNQUFNLGdDQUFnQyxpQ0FBaUI7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9WLFlBQVksUUFBa0Q7QUFDbkUsVUFBTSxPQUFPLE9BQU8sS0FBSyxPQUFPLE1BQU07QUFDdEMsU0FBSyxlQUFlLE9BQU87QUFBQSxFQUM3QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVB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QUFRLGlDQUFtQixZQUFZO0FBQ3RDLGdCQUFNLGlEQUF1QjtBQUFBLFFBQzNCLEtBQUssS0FBSztBQUFBLFFBQ1YsVUFBVSxTQUFTO0FBQUEsTUFDckIsQ0FBQztBQUNELFlBQU0sS0FBSyxRQUFRO0FBQUEsSUFDckIsQ0FBQyxDQUFDO0FBRUosU0FBSyx5QkFBeUIsVUFBVSxTQUFTLFVBQVUsU0FBUyxVQUFVO0FBQUEsRUFDaEY7QUFBQSxFQUVRLHlCQUF5QixVQUF1QixVQUFrQixZQUEwQjtBQUNsRyxRQUFJLGdDQUFnQixRQUFRLEVBQ3pCLGtCQUFjLGVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxpQkFBaUIsd0JBQXdCO0FBQUEsTUFDN0Usc0JBQXNCO0FBQUEsSUFDeEIsQ0FBQyxDQUFDLEVBQ0QsUUFBUSxNQUFNO0FBQ2IsV0FBSyxJQUFJLFFBQVEsS0FBSztBQUN0QixXQUFLLElBQUksUUFBUSxZQUFZLFFBQVE7QUFBQSxJQUN2QyxDQUFDO0FBQUEsRUFDTDtBQUFBLEVBRVEsc0JBQ04seUJBQ0EsbUJBQ007QUFDTixRQUFJLEtBQUssbUJBQW1CO0FBQzFCO0FBQUEsSUFDRjtBQU1BLFVBQU0sb0JBQW9CLElBQUksd0JBQXdCO0FBQUEsTUFDcEQsUUFBUSxLQUFLO0FBQUEsTUFDYixjQUFjLENBQUMsZ0JBQXNCO0FBQ25DLGFBQUssb0JBQW9CLGFBQWEseUJBQXlCLGlCQUFpQjtBQUFBLE1BQ2xGO0FBQUEsSUFDRixDQUFDO0FBQ0QsU0FBSyxJQUFJLFFBQVEsY0FBYyxpQkFBaUI7QUFDaEQsU0FBSyxvQkFBb0I7QUFBQSxFQUMzQjtBQUNGOyIsIm5hbWVzIjpbIlBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkiLCJjb21wYXJlVmVyc2lvbnMiLCJzYXRpc2ZpZXNWZXJzaW9uIl19
|
|
@@ -289,6 +289,7 @@ export declare class PluginGateComponent extends ComponentEx {
|
|
|
289
289
|
private createConflictBlockedMessage;
|
|
290
290
|
private createConflictWarningMessage;
|
|
291
291
|
private createDependencyLostMessage;
|
|
292
|
+
private createNoReadableApiMessage;
|
|
292
293
|
private createVersionMismatchMessage;
|
|
293
294
|
/**
|
|
294
295
|
* Finds the declared conflicts of one severity that are currently in force.
|
|
@@ -321,6 +322,21 @@ export declare class PluginGateComponent extends ComponentEx {
|
|
|
321
322
|
* @returns Whether the conflicting plugin is enabled at a conflicting version.
|
|
322
323
|
*/
|
|
323
324
|
private isConflictActive;
|
|
325
|
+
/**
|
|
326
|
+
* Decides whether an unsatisfied dependency is nonetheless enabled and loaded.
|
|
327
|
+
*
|
|
328
|
+
* Such a dependency is running but publishes no API this plugin can read — none at all, or one whose shape
|
|
329
|
+
* fails the contract. The usual cause is a release built on a copy of this library that publishes
|
|
330
|
+
* somewhere this one does not look, so "install and enable it" would be false and "update it" is the fix.
|
|
331
|
+
*
|
|
332
|
+
* Being in `enabledPlugins` is not enough: Obsidian's plain `disablePlugin` unloads a plugin and leaves it
|
|
333
|
+
* there (only `disablePluginAndSave` removes it), so a provider that went away would otherwise read as
|
|
334
|
+
* running with an unreadable API.
|
|
335
|
+
*
|
|
336
|
+
* @param dependency - The declared dependency.
|
|
337
|
+
* @returns Whether the dependency is enabled and loaded.
|
|
338
|
+
*/
|
|
339
|
+
private isRunning;
|
|
324
340
|
/**
|
|
325
341
|
* Decides whether a dependency is running but too old for this plugin, so the advice is "update it".
|
|
326
342
|
*
|
|
@@ -91,7 +91,7 @@ __export(generated_during_build_exports, {
|
|
|
91
91
|
LIBRARY_VERSION: () => LIBRARY_VERSION
|
|
92
92
|
});
|
|
93
93
|
module.exports = __toCommonJS(generated_during_build_exports);
|
|
94
|
-
const LIBRARY_VERSION = "6.0.
|
|
94
|
+
const LIBRARY_VERSION = "6.0.4";
|
|
95
95
|
const LIBRARY_STYLES = ".obsidian-lib.code-highlighter-component textarea, .obsidian-lib.code-highlighter-component pre, .obsidian-lib.code-highlighter-component code {\n font-family: var(--font-monospace);\n line-height: var(--line-height-normal);\n margin: 0;\n}\n.obsidian-lib.code-highlighter-component textarea, .obsidian-lib.code-highlighter-component code {\n font-size: var(--code-size);\n}\n.obsidian-lib.code-highlighter-component textarea {\n background: transparent;\n color: transparent;\n z-index: 2;\n width: 20em;\n height: 10em;\n}\n.obsidian-lib.code-highlighter-component pre {\n position: absolute;\n pointer-events: none;\n border: var(--input-border-width) solid transparent;\n overflow: auto;\n inset: 0;\n padding: var(--size-4-1) var(--size-4-2);\n z-index: 1;\n}\n.obsidian-lib.code-highlighter-component pre::after {\n content: \"\";\n display: block;\n height: var(--bottom-gap, 0);\n}\n.obsidian-lib.code-highlighter-component pre.is-placeholder {\n opacity: 0.6;\n}\n.obsidian-lib.code-highlighter-component code {\n display: block;\n padding: 0;\n}\n\n.obsidian-lib-lock-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--text-muted);\n}\n.obsidian-lib-lock-indicator .svg-icon {\n width: var(--icon-s);\n height: var(--icon-s);\n}\n\n@keyframes obsidian-lib-lock-indicator-flash {\n 40% {\n color: var(--text-error);\n transform: scale(1.4);\n }\n}\n.obsidian-lib-lock-indicator-flash {\n animation: obsidian-lib-lock-indicator-flash 0.35s ease-in-out;\n}\n\n.obsidian-lib input[type=url] {\n height: var(--input-height);\n}\n.obsidian-lib input[type=month],\n.obsidian-lib input[type=tel],\n.obsidian-lib input[type=time],\n.obsidian-lib input[type=url],\n.obsidian-lib input[type=week] {\n -webkit-app-region: no-drag;\n background: var(--background-modifier-form-field);\n border: var(--input-border-width) solid var(--background-modifier-border);\n color: var(--text-normal);\n font-family: inherit;\n padding: var(--size-4-1) var(--size-4-2);\n font-size: var(--font-ui-small);\n border-radius: var(--input-radius);\n outline: none;\n}\n@media (hover: hover) {\n .obsidian-lib input[type=month]:hover,\n .obsidian-lib input[type=tel]:hover,\n .obsidian-lib input[type=time]:hover,\n .obsidian-lib input[type=url]:hover,\n .obsidian-lib input[type=week]:hover {\n border-color: var(--background-modifier-border-hover);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n }\n}\n.obsidian-lib input[type=month]:active, .obsidian-lib input[type=month]:focus,\n.obsidian-lib input[type=tel]:active,\n.obsidian-lib input[type=tel]:focus,\n.obsidian-lib input[type=time]:active,\n.obsidian-lib input[type=time]:focus,\n.obsidian-lib input[type=url]:active,\n.obsidian-lib input[type=url]:focus,\n.obsidian-lib input[type=week]:active,\n.obsidian-lib input[type=week]:focus {\n border-color: var(--background-modifier-border-focus);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n}\n.obsidian-lib input[type=month]:active, .obsidian-lib input[type=month]:focus, .obsidian-lib input[type=month]:focus-visible,\n.obsidian-lib input[type=tel]:active,\n.obsidian-lib input[type=tel]:focus,\n.obsidian-lib input[type=tel]:focus-visible,\n.obsidian-lib input[type=time]:active,\n.obsidian-lib input[type=time]:focus,\n.obsidian-lib input[type=time]:focus-visible,\n.obsidian-lib input[type=url]:active,\n.obsidian-lib input[type=url]:focus,\n.obsidian-lib input[type=url]:focus-visible,\n.obsidian-lib input[type=week]:active,\n.obsidian-lib input[type=week]:focus,\n.obsidian-lib input[type=week]:focus-visible {\n box-shadow: 0 0 0 2px var(--background-modifier-border-focus);\n}\n.obsidian-lib input[type=month]::placeholder,\n.obsidian-lib input[type=tel]::placeholder,\n.obsidian-lib input[type=time]::placeholder,\n.obsidian-lib input[type=url]::placeholder,\n.obsidian-lib input[type=week]::placeholder {\n color: var(--text-faint);\n}\n.mod-rtl input[type=month],\n.mod-rtl input[type=time],\n.mod-rtl input[type=week],\n.is-rtl input[type=month],\n.is-rtl input[type=time],\n.is-rtl input[type=week],\n.rtl input[type=month],\n.rtl input[type=time],\n.rtl input[type=week] {\n direction: rtl;\n}\n.mod-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.rtl input[type=month]::-webkit-calendar-picker-indicator,\n.rtl input[type=time]::-webkit-calendar-picker-indicator,\n.rtl input[type=week]::-webkit-calendar-picker-indicator {\n right: var(--size-4-1);\n left: auto;\n}\n\n.obsidian-lib input[type=month],\n.obsidian-lib input[type=time],\n.obsidian-lib input[type=week] {\n font-variant-numeric: tabular-nums;\n position: relative;\n}\n.obsidian-lib input[type=month]::-webkit-datetime-edit-text,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-text,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-text {\n color: var(--text-faint);\n padding-inline-end: 0;\n}\n.obsidian-lib input[type=month]::-webkit-calendar-picker-indicator,\n.obsidian-lib input[type=time]::-webkit-calendar-picker-indicator,\n.obsidian-lib input[type=week]::-webkit-calendar-picker-indicator {\n position: absolute;\n left: var(--size-4-1);\n right: auto;\n opacity: 0.5;\n}\n.obsidian-lib input[type=month]::-webkit-datetime-edit-month-field:active, .obsidian-lib input[type=month]::-webkit-datetime-edit-month-field:focus, .obsidian-lib input[type=month]::-webkit-datetime-edit-day-field:active, .obsidian-lib input[type=month]::-webkit-datetime-edit-day-field:focus, .obsidian-lib input[type=month]::-webkit-datetime-edit-year-field:active, .obsidian-lib input[type=month]::-webkit-datetime-edit-year-field:focus,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-month-field:active,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-month-field:focus,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-day-field:active,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-day-field:focus,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-year-field:active,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-year-field:focus,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-month-field:active,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-month-field:focus,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-day-field:active,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-day-field:focus,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-year-field:active,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-year-field:focus {\n background-color: var(--text-selection);\n color: var(--text-normal);\n cursor: text;\n}\n.mod-rtl .obsidian-lib input[type=month], .is-rtl .obsidian-lib input[type=month], .rtl .obsidian-lib input[type=month],\n.mod-rtl .obsidian-lib input[type=time],\n.is-rtl .obsidian-lib input[type=time],\n.rtl .obsidian-lib input[type=time],\n.mod-rtl .obsidian-lib input[type=week],\n.is-rtl .obsidian-lib input[type=week],\n.rtl .obsidian-lib input[type=week] {\n direction: rtl;\n}\n.mod-rtl .obsidian-lib input[type=month]::-webkit-calendar-picker-indicator, .is-rtl .obsidian-lib input[type=month]::-webkit-calendar-picker-indicator, .rtl .obsidian-lib input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-lib input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-lib input[type=time]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-lib input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-lib input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-lib input[type=week]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-lib input[type=week]::-webkit-calendar-picker-indicator {\n left: auto;\n right: var(--size-4-1);\n}\n\nbody:not(.is-ios):not(.is-android) .obsidian-lib input[type=month],\nbody:not(.is-ios):not(.is-android) .obsidian-lib input[type=time],\nbody:not(.is-ios):not(.is-android) .obsidian-lib input[type=week] {\n padding-inline-start: var(--size-4-6);\n}\n\n.obsidian-lib input[type=time]::-webkit-calendar-picker-indicator {\n margin-inline-start: 0;\n}\n\nprogress.obsidian-lib.loop {\n min-width: 200px;\n}\n\n@keyframes obsidian-lib-minimized-modal-bar-pulse {\n 0%, 100% {\n box-shadow: var(--shadow-s);\n }\n 50% {\n box-shadow: 0 0 0 2px var(--interactive-accent);\n }\n}\n@keyframes obsidian-lib-minimized-modal-bar-attention {\n 0% {\n box-shadow: 0 0 0 0 var(--interactive-accent);\n }\n 40% {\n box-shadow: 0 0 0 4px var(--interactive-accent);\n }\n 100% {\n box-shadow: var(--shadow-s);\n }\n}\n.obsidian-lib.minimizable-modal .minimize-button {\n position: absolute;\n top: var(--size-4-2);\n right: calc(var(--size-4-2) + var(--size-4-9));\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-lib.minimizable-modal .minimize-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n.obsidian-lib.minimized-modal-bar {\n position: fixed;\n right: var(--size-4-4);\n bottom: calc(var(--size-4-4) + var(--size-4-8));\n z-index: var(--layer-modal);\n display: flex;\n align-items: center;\n gap: var(--size-4-2);\n padding: var(--size-4-2) var(--size-4-3);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-m);\n background: var(--background-secondary);\n box-shadow: var(--shadow-s);\n cursor: pointer;\n animation: obsidian-lib-minimized-modal-bar-pulse 2s ease-in-out infinite;\n}\n.obsidian-lib.minimized-modal-bar:hover {\n background-image: linear-gradient(var(--background-modifier-hover), var(--background-modifier-hover));\n}\n.obsidian-lib.minimized-modal-bar.minimized-modal-bar-attention {\n animation: obsidian-lib-minimized-modal-bar-attention 0.35s ease-out;\n}\n.obsidian-lib.minimized-modal-bar .minimized-modal-bar-title {\n font-weight: var(--font-medium);\n}\n.obsidian-lib.minimized-modal-bar .restore-button,\n.obsidian-lib.minimized-modal-bar .cancel-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-lib.minimized-modal-bar .restore-button:hover,\n.obsidian-lib.minimized-modal-bar .cancel-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n\n.obsidian-lib.modal-commands {\n display: flex;\n flex-wrap: wrap;\n gap: var(--size-2-2);\n padding: var(--size-4-2) var(--size-4-3);\n border-top: 1px solid var(--background-modifier-border);\n}\n.obsidian-lib.modal-command-control {\n margin-inline-start: var(--size-2-2);\n vertical-align: middle;\n}\n.obsidian-lib.modal-command {\n display: inline-flex;\n align-items: baseline;\n gap: var(--size-2-2);\n min-height: var(--size-4-8);\n padding: var(--size-2-1) var(--size-4-2);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-s);\n background-color: var(--background-secondary);\n color: var(--text-muted);\n font-size: var(--font-ui-smaller);\n white-space: nowrap;\n cursor: pointer;\n}\n.obsidian-lib.modal-command:hover:not(:disabled) {\n background-color: var(--background-modifier-hover);\n color: var(--text-normal);\n}\n.obsidian-lib.modal-command.is-active {\n border-color: var(--interactive-accent);\n background-color: var(--interactive-accent);\n color: var(--text-on-accent);\n}\n.obsidian-lib.modal-command:disabled {\n opacity: 0.5;\n cursor: default;\n}\n.obsidian-lib.modal-command-hotkey {\n color: var(--text-faint);\n font-size: var(--font-smallest);\n}\n.modal-command.is-active .obsidian-lib.modal-command-hotkey {\n opacity: 0.7;\n color: var(--text-on-accent);\n}\n\n.obsidian-lib.modal-container .ok-button {\n margin-right: 10px;\n margin-top: 20px;\n}\n\n.obsidian-lib.multiple-dropdown-component select,\n.obsidian-lib.multiple-dropdown-component select:focus,\n.obsidian-lib.multiple-dropdown-component .dropdown {\n height: auto;\n padding-top: 3px;\n}\n.obsidian-lib.multiple-dropdown-component select option:checked,\n.obsidian-lib.multiple-dropdown-component select:focus option:checked,\n.obsidian-lib.multiple-dropdown-component .dropdown option:checked {\n background-color: var(--interactive-accent);\n color: var(--text-on-accent);\n}\n\n.obsidian-lib.plugin-notice-name {\n color: var(--text-accent);\n display: inline-block;\n font-weight: var(--font-bold);\n margin-bottom: var(--size-4-2);\n}\n.obsidian-lib.plugin-notice-name code {\n color: inherit;\n}\n.obsidian-lib.plugin-notice-content {\n padding-right: var(--size-4-5);\n position: relative;\n}\n.obsidian-lib.plugin-notice-content .obsidian-lib.cancel-button {\n display: block;\n margin-top: var(--size-4-2);\n width: fit-content;\n}\n.obsidian-lib.plugin-notice-content .obsidian-lib.plugin-notice-close-button {\n position: absolute;\n right: var(--size-4-3);\n top: var(--size-4-3);\n}\n.obsidian-lib.plugin-notice-requires-explicit-close.notice {\n padding: 0;\n}\n.obsidian-lib.plugin-notice-requires-explicit-close.notice .obsidian-lib.plugin-notice-content {\n padding: var(--size-4-3) var(--size-4-4);\n}\n\n.obsidian-lib.plugin-settings-tab a:focus {\n outline: 2px solid var(--link-color);\n}\n\n.obsidian-lib.plugin-suggestion-banner {\n background-color: var(--background-secondary);\n border-left: var(--size-2-1) solid var(--text-accent);\n border-radius: var(--radius-s);\n display: flex;\n flex-direction: column;\n gap: var(--size-4-2);\n margin-bottom: var(--size-4-4);\n padding: var(--size-4-3) var(--size-4-4);\n}\n.obsidian-lib.plugin-suggestion-banner button {\n width: fit-content;\n}\n.obsidian-lib.plugin-suggestion-notice-buttons {\n display: flex;\n flex-wrap: wrap;\n gap: var(--size-4-2);\n margin-top: var(--size-4-2);\n}\n\n.obsidian-lib.popover {\n max-width: min(420px, 90vw);\n min-width: 320px;\n padding: var(--size-4-2) var(--size-4-3);\n position: absolute;\n z-index: var(--layer-menu);\n}\n.obsidian-lib.popover .setting-item {\n align-items: center;\n border-top: none;\n gap: var(--size-4-2);\n padding: var(--size-2-1) 0;\n}\n.obsidian-lib.popover .setting-item-info {\n margin-right: 0;\n}\n.obsidian-lib.popover .setting-item-control {\n flex-grow: 1;\n justify-content: flex-end;\n}\n.obsidian-lib.popover input[type=text] {\n width: 100%;\n}\n\n.obsidian-lib.prompt-modal .text-box {\n width: 100%;\n}\n\n.obsidian-lib button:not(.clickable-icon) {\n color: var(--text-color);\n}\n\n.obsidian-lib.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-lib :invalid:not(.untouched) {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-lib input.metadata-input-text:active:invalid:not(.untouched), .obsidian-lib input.metadata-input-text:focus-visible:invalid:not(.untouched), .obsidian-lib input.metadata-input-text:focus:invalid:not(.untouched),\n.obsidian-lib input[type=date]:active:invalid:not(.untouched),\n.obsidian-lib input[type=date]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=date]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=datetime-local]:active:invalid:not(.untouched),\n.obsidian-lib input[type=datetime-local]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=datetime-local]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=email]:active:invalid:not(.untouched),\n.obsidian-lib input[type=email]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=email]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=number]:active:invalid:not(.untouched),\n.obsidian-lib input[type=number]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=number]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=password]:active:invalid:not(.untouched),\n.obsidian-lib input[type=password]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=password]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=search]:active:invalid:not(.untouched),\n.obsidian-lib input[type=search]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=search]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=text]:active:invalid:not(.untouched),\n.obsidian-lib input[type=text]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=text]:focus:invalid:not(.untouched),\n.obsidian-lib textarea:active:invalid:not(.untouched),\n.obsidian-lib textarea:focus-visible:invalid:not(.untouched),\n.obsidian-lib textarea:focus:invalid:not(.untouched) {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-lib.setting-component-wrapper {\n position: relative;\n display: inline-flex;\n}\n.obsidian-lib.overlay-validator {\n caret-color: transparent;\n cursor: default;\n position: absolute;\n background-color: transparent;\n border: none;\n outline: none;\n pointer-events: none;\n z-index: 9999;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n}\n.obsidian-lib.tooltip.tooltip-validator {\n position: absolute;\n top: calc(100% + 8px);\n width: max-content;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../src/styles/code-highlighter-component.scss%22,%22../src/styles/editor-lock.scss%22,%22../src/styles/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/loop.scss%22,%22../src/styles/minimizable-modal.scss%22,%22../src/styles/modal-commands.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/plugin-notice.scss%22,%22../src/styles/plugin-settings-tab.scss%22,%22../src/styles/plugin-suggestion.scss%22,%22../src/styles/popover.scss%22,%22../src/styles/prompt-modal.scss%22,%22../src/styles/tldraw-button-color-workaround.scss%22,%22../src/styles/tri-state-checkbox-component.scss%22,%22../src/styles/validation.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEI;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;ACvCN;EACE;EACA;EACA;;AAEA;EACE;EACA;;;AAMJ;EACE;IACE;IACA;;;AAIJ;EACE;;;ACvBA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;AAAA;AAAA;AAAA;AAAA;IACE;IACA,YACE;;;AAMR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA,YACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;EACE;;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AC7DV;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;AAGF;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAIK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGP;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AAKF;AAAA;AAAA;EACE;;;AAMJ;EACE;;;AC/CK;EACP;;;ACJJ;EACE;IAEE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AASN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAOA;EACE;;AAOF;EACE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACE;EACA;;;ACpGN;EACE;EACA;EACA;EACA;EACA;;AAOF;EACE;EACA;;AAMF;EACE;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAKF;EACE;EACA;EACA;;AAKF;EACE;EACA;;AAIJ;EACE;EACA;;AAGA;EACE;EACA;;;ACpEF;EACE;EACA;;;ACCF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACZN;EACE;EACA;EACA;EACA;;AAGA;EACE;;AAIJ;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAKF;EACE;EACA;EACA;;AAOJ;EACE;;AAEA;EACE;;;ACrCF;EACE;;;ACFJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAKJ;EACE;EACA;EACA;EACA;;;ACjBF;EAIE;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;;AC9BF;EACE;;;ACUN;EACE;;;ACZE;EACE;;;ACKJ;EAPA;;AAuBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAvBJ;;AA6BA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA%22,%22file%22:%22styles.css%22,%22sourcesContent%22:%5B%22.obsidian-lib%20%7B%5Cn%20%20&.code-highlighter-component%20%7B%5Cn%20%20%20%20textarea,%20pre,%20code%20%7B%5Cn%20%20%20%20%20%20font-family:%20var(--font-monospace);%5Cn%20%20%20%20%20%20line-height:%20var(--line-height-normal);%5Cn%20%20%20%20%20%20margin:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea,%20code%20%7B%5Cn%20%20%20%20%20%20font-size:%20var(--code-size);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea%20%7B%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20transparent;%5Cn%20%20%20%20%20%20z-index:%202;%5Cn%20%20%20%20%20%20width:%2020em;%5Cn%20%20%20%20%20%20height:%2010em;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20%20%20border:%20var(--input-border-width)%20solid%20transparent;%5Cn%20%20%20%20%20%20overflow:%20auto;%5Cn%20%20%20%20%20%20inset:%200;%5Cn%20%20%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20%20%20z-index:%201;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre::after%20%7B%5Cn%20%20%20%20%20%20content:%20%5C%22%5C%22;%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20height:%20var(--bottom-gap,%200);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre.is-placeholder%20%7B%5Cn%20%20%20%20%20%20opacity:%200.6;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20Lock%20indicators%20shown%20in%20the%20tab%20header%20and%20the%20status%20bar%20while%20a%20note%20is%20locked.%20These%20live%20in%5Cn//%20global%20Obsidian%20DOM%20(tab%20header%20/%20status%20bar),%20so%20they%20are%20styled%20with%20a%20global%20class%20rather%20than%5Cn//%20scoped%20under%20%60.obsidian-lib%60.%5Cn.obsidian-lib-lock-indicator%20%7B%5Cn%20%20display:%20inline-flex;%5Cn%20%20align-items:%20center;%5Cn%20%20color:%20var(--text-muted);%5Cn%5Cn%20%20.svg-icon%20%7B%5Cn%20%20%20%20width:%20var(--icon-s);%5Cn%20%20%20%20height:%20var(--icon-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn//%20Flashed%20on%20every%20lock%20indicator%20(tab%20header,%20view%20action,%20status%20bar)%20when%20the%20user%20attempts%20to%5Cn//%20type%20in%20a%20locked%20note,%20to%20make%20clear%20the%20note%20is%20read-only.%20Re-added%20per%20rejected%20keystroke.%5Cn@keyframes%20obsidian-lib-lock-indicator-flash%20%7B%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20color:%20var(--text-error);%5Cn%20%20%20%20transform:%20scale(1.4);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-lib-lock-indicator-flash%20%7B%5Cn%20%20animation:%20obsidian-lib-lock-indicator-flash%200.35s%20ease-in-out;%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20input%5Btype='url'%5D%20%7B%5Cn%20%20%20%20height:%20var(--input-height)%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='tel'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='url'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20-webkit-app-region:%20no-drag;%5Cn%20%20%20%20background:%20var(--background-modifier-form-field);%5Cn%20%20%20%20border:%20var(--input-border-width)%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20font-family:%20inherit;%5Cn%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20font-size:%20var(--font-ui-small);%5Cn%20%20%20%20border-radius:%20var(--input-radius);%5Cn%20%20%20%20outline:%20none;%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20@media%20(hover:%20hover)%20%7B%5Cn%20%20%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20border-color:%20var(--background-modifier-border-hover);%5Cn%20%20%20%20%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus,%5Cn%20%20%20%20&:focus-visible%20%7B%5Cn%20%20%20%20%20%20box-shadow:%200%200%200%202px%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::placeholder%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20@at-root%20%7B%5Cn%20%20%20%20.mod-rtl,%5Cn%20%20%20%20.is-rtl,%5Cn%20%20%20%20.rtl%20%7B%5Cn%20%20%20%20%20%20&%20%7B%5Cn%20%20%20%20%20%20%20%20input%5Btype='month'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='time'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20font-variant-numeric:%20tabular-nums;%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-text%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%20%20padding-inline-end:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20left:%20var(--size-4-1);%5Cn%20%20%20%20%20%20right:%20auto;%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-month-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-day-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-year-field%20%7B%5Cn%20%20%20%20%20%20&:active,%5Cn%20%20%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--text-selection);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%20%20cursor:%20text;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20.mod-rtl%20&,%5Cn%20%20%20%20%20%20.is-rtl%20&,%5Cn%20%20%20%20%20%20.rtl%20&%20%7B%5Cn%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20body:not(.is-ios):not(.is-android)%20&%20%7B%5Cn%20%20%20%20%20%20%20%20padding-inline-start:%20var(--size-4-6);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='time'%5D%20%7B%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20margin-inline-start:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20//%20Not%20%60&progress%60:%20that%20APPENDS%20the%20element%20name%20to%20the%20parent%20class,%20producing%20one%20long%20class%20that%20matches%5Cn%20%20//%20nothing.%20The%20element%20type%20has%20to%20lead%20the%20compound%20selector%20instead.%5Cn%20%20@at-root%20progress%23%7B&%7D.loop%20%7B%5Cn%20%20%20%20min-width:%20200px;%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@keyframes%20obsidian-lib-minimized-modal-bar-pulse%20%7B%5Cn%20%200%25,%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%5Cn%20%2050%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%202px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn@keyframes%20obsidian-lib-minimized-modal-bar-attention%20%7B%5Cn%20%200%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%200%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%204px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-lib%20%7B%5Cn%20%20//%20The%20minimize%20button%20lives%20inside%20the%20modal%20container,%20left%20of%20Obsidian's%20close%20button.%5Cn%20%20&.minimizable-modal%20%7B%5Cn%20%20%20%20.minimize-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20right:%20calc(var(--size-4-2)%20+%20var(--size-4-9));%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20The%20minimized%20bar%20is%20appended%20to%20document.body.%20It%20floats%20at%20the%20bottom-right%20while%20minimized,%5Cn%20%20//%20and%20gently%20pulses%20an%20accent%20ring%20so%20the%20user%20does%20not%20forget%20about%20the%20minimized%20operation.%5Cn%20%20//%20It%20floats%20a%20status-bar's%20height%20above%20the%20bottom%20edge%20so%20it%20never%20covers%20the%20bottom-right%5Cn%20%20//%20status-bar%20items%20(e.g.%20the%20editor-lock%20unlock%20indicator,%20which%20lives%20in%20the%20same%20corner).%5Cn%20%20&.minimized-modal-bar%20%7B%5Cn%20%20%20%20position:%20fixed;%5Cn%20%20%20%20right:%20var(--size-4-4);%5Cn%20%20%20%20bottom:%20calc(var(--size-4-4)%20+%20var(--size-4-8));%5Cn%20%20%20%20z-index:%20var(--layer-modal);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20align-items:%20center;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-m);%5Cn%20%20%20%20background:%20var(--background-secondary);%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20animation:%20obsidian-lib-minimized-modal-bar-pulse%202s%20ease-in-out%20infinite;%5Cn%5Cn%20%20%20%20//%20Layer%20the%20translucent%20hover%20tint%20over%20the%20opaque%20%60background%60%20(%60--background-secondary%60)%20via%5Cn%20%20%20%20//%20%60background-image%60%20instead%20of%20replacing%20the%20background-color.%20%60--background-modifier-hover%60%20is%5Cn%20%20%20%20//%20translucent,%20so%20setting%20it%20as%20%60background%60%20would%20let%20the%20editor%20content%20behind%20the%20floating%20bar%5Cn%20%20%20%20//%20bleed%20through%20and%20make%20the%20title%20unreadable.%20A%20gradient%20of%20the%20tint%20composited%20over%20the%20opaque%5Cn%20%20%20%20//%20base%20keeps%20the%20bar%20opaque%20while%20preserving%20the%20subtle%20hover%20highlight.%5Cn%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20background-image:%20linear-gradient(var(--background-modifier-hover),%20var(--background-modifier-hover));%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20one-shot,%20more%20pronounced%20flash%20played%20when%20the%20user%20attempts%20a%20blocked%20action%20(a%20keystroke,%5Cn%20%20%20%20//%20right-click,%20or%20opening%20another%20modal)%20while%20this%20modal%20is%20minimized,%20so%20the%20block%20is%20not%5Cn%20%20%20%20//%20silent.%20Its%20higher%20specificity%20overrides%20the%20gentle%20infinite%20idle%20pulse%20while%20it%20plays;%20the%5Cn%20%20%20%20//%20class%20is%20removed%20on%20%60animationend%60,%20restoring%20the%20idle%20pulse.%5Cn%20%20%20%20&.minimized-modal-bar-attention%20%7B%5Cn%20%20%20%20%20%20animation:%20obsidian-lib-minimized-modal-bar-attention%200.35s%20ease-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.minimized-modal-bar-title%20%7B%5Cn%20%20%20%20%20%20font-weight:%20var(--font-medium);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.restore-button,%5Cn%20%20%20%20.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20//%20The%20strip%20of%20commands%20along%20the%20bottom%20of%20a%20modal.%5Cn%20%20//%5Cn%20%20//%20In%20%60Instructions%60%20render%20mode%20it%20also%20carries%20Obsidian's%20own%20%60.prompt-instructions%60%20%E2%80%94%20whose%20rule%20is%5Cn%20%20//%20unscoped,%20so%20it%20applies%20to%20a%20plain%20%60Modal%60%20too%20%E2%80%94%20and%20this%20one%20only%20re-tunes%20that%20rule's%20%60gap%60%20and%5Cn%20%20//%20%60padding%60%20and%20adds%20the%20separator;%20in%20%60Buttons%60%20mode%20it%20is%20the%20whole%20strip.%5Cn%20%20&.modal-commands%20%7B%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20flex-wrap:%20wrap;%5Cn%20%20%20%20gap:%20var(--size-2-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border-top:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%7D%5Cn%5Cn%20%20//%20A%20control%20the%20%60Instructions%60%20renderer%20injects%20into%20an%20instruction's%20purpose%20text%20%E2%80%94%20a%20checkbox,%20a%5Cn%20%20//%20dropdown.%20Obsidian%20styles%20the%20instruction%20bar%20itself,%20but%20its%20own%20bar%20never%20contains%20a%20control,%20so%5Cn%20%20//%20nothing%20upstream%20separates%20one%20from%20the%20label%20it%20belongs%20to.%20Sits%20on%20the%20control%20rather%20than%20on%20the%5Cn%20%20//%20strip,%20so%20it%20reaches%20a%20%60SuggestModal%60's%20native%20bar%20as%20well%20as%20a%20self-created%20one.%5Cn%20%20&.modal-command-control%20%7B%5Cn%20%20%20%20margin-inline-start:%20var(--size-2-2);%5Cn%20%20%20%20vertical-align:%20middle;%5Cn%20%20%7D%5Cn%5Cn%20%20//%20One%20command%20button.%20Replaces%20the%20instruction%20bar%20rather%20than%20supplementing%20it:%20the%20bar%20can%20only%20ever%5Cn%20%20//%20say%20which%20key%20to%20press,%20and%20on%20a%20phone%20there%20is%20no%20modifier%20key%20to%20press,%20so%20every%20control%20it%20names%5Cn%20%20//%20is%20unreachable%20there.%5Cn%20%20&.modal-command%20%7B%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%20%20align-items:%20baseline;%5Cn%20%20%20%20gap:%20var(--size-2-2);%5Cn%5Cn%20%20%20%20//%20Comfortably%20tappable%20on%20a%20phone,%20where%20this%20strip%20is%20the%20only%20way%20in.%5Cn%20%20%20%20min-height:%20var(--size-4-8);%5Cn%20%20%20%20padding:%20var(--size-2-1)%20var(--size-4-2);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20background-color:%20var(--background-secondary);%5Cn%20%20%20%20color:%20var(--text-muted);%5Cn%20%20%20%20font-size:%20var(--font-ui-smaller);%5Cn%20%20%20%20white-space:%20nowrap;%5Cn%20%20%20%20cursor:%20pointer;%5Cn%5Cn%20%20%20%20&:hover:not(:disabled)%20%7B%5Cn%20%20%20%20%20%20background-color:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20toggle%20that%20is%20ON.%20An%20action%20never%20carries%20it%20%E2%80%94%20it%20does%20something%20and%20is%20done,%20so%20there%20is%20no%5Cn%20%20%20%20//%20state%20for%20it%20to%20show.%5Cn%20%20%20%20&.is-active%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--interactive-accent);%5Cn%20%20%20%20%20%20background-color:%20var(--interactive-accent);%5Cn%20%20%20%20%20%20color:%20var(--text-on-accent);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20Disabled%20rather%20than%20removed:%20a%20strip%20that%20lost%20buttons%20as%20modes%20change%20would%20reflow%20under%20the%5Cn%20%20%20%20//%20pointer,%20which%20on%20a%20phone%20means%20a%20mis-tap.%5Cn%20%20%20%20&:disabled%20%7B%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%20%20cursor:%20default;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.modal-command-hotkey%20%7B%5Cn%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20font-size:%20var(--font-smallest);%5Cn%5Cn%20%20%20%20//%20Faint%20against%20the%20surface%20is%20right;%20faint%20against%20the%20accent%20fill%20is%20invisible.%5Cn%20%20%20%20.modal-command.is-active%20&%20%7B%5Cn%20%20%20%20%20%20opacity:%200.7;%5Cn%20%20%20%20%20%20color:%20var(--text-on-accent);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.modal-container%20%7B%5Cn%20%20%20%20.ok-button%20%7B%5Cn%20%20%20%20%20%20margin-right:%2010px;%5Cn%20%20%20%20%20%20margin-top:%2020px;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20//%20Compound,%20not%20nested:%20%60addPluginCssClasses%60%20puts%20%60obsidian-lib%60%20and%20%60multiple-dropdown-component%60%20on%20the%5Cn%20%20//%20SAME%20element%20(the%20setting's%20control%20container),%20so%20a%20descendant%20selector%20matched%20nothing%20and%20every%20multiple%5Cn%20%20//%20dropdown%20rendered%20one%20row%20tall%20%E2%80%94%20Obsidian's%20%60.dropdown%60%20height,%20with%20no%20popup%20behind%20it%20to%20pick%20from.%5Cn%20%20&.multiple-dropdown-component%20%7B%5Cn%20%20%20%20select,%5Cn%20%20%20%20select:focus,%5Cn%20%20%20%20.dropdown%20%7B%5Cn%20%20%20%20%20%20height:%20auto;%5Cn%20%20%20%20%20%20padding-top:%203px;%5Cn%5Cn%20%20%20%20%20%20option:checked%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--interactive-accent);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-on-accent);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.plugin-notice-name%20%7B%5Cn%20%20%20%20color:%20var(--text-accent);%5Cn%20%20%20%20display:%20inline-block;%5Cn%20%20%20%20font-weight:%20var(--font-bold);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-2);%5Cn%5Cn%20%20%20%20//%20The%20name%20is%20inline%20code;%20it%20keeps%20the%20code%20background%20and%20font%20but%20takes%20the%20prefix's%20accent%20color.%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20color:%20inherit;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.plugin-notice-content%20%7B%5Cn%20%20%20%20padding-right:%20var(--size-4-5);%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20.obsidian-lib.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20The%20close%20button%20reuses%20Obsidian's%20%60modal-header-button%60%20+%20%60clickable-icon%60%20classes%20so%20it%20matches%5Cn%20%20%20%20//%20The%20native%20modal%20close%20button%20(box%20+%20hover);%20only%20its%20corner%20position%20is%20set%20here.%5Cn%20%20%20%20.obsidian-lib.plugin-notice-close-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20right:%20var(--size-4-3);%5Cn%20%20%20%20%20%20top:%20var(--size-4-3);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20Move%20the%20notice's%20own%20padding%20onto%20the%20content%20wrapper%20so%20the%20wrapper%20covers%20the%20whole%20clickable%5Cn%20%20//%20Area%20%E2%80%94%20otherwise%20a%20click%20landing%20on%20the%20notice's%20bare%20padding%20(outside%20the%20wrapper)%20would%20bypass%20the%5Cn%20%20//%20Stop-propagation%20guard%20and%20dismiss%20the%20hard-to-close%20notice.%5Cn%20%20&.plugin-notice-requires-explicit-close.notice%20%7B%5Cn%20%20%20%20padding:%200;%5Cn%5Cn%20%20%20%20.obsidian-lib.plugin-notice-content%20%7B%5Cn%20%20%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.plugin-settings-tab%20%7B%5Cn%20%20%20%20a:focus%20%7B%5Cn%20%20%20%20%20%20outline:%202px%20solid%20var(--link-color);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.plugin-suggestion-banner%20%7B%5Cn%20%20%20%20background-color:%20var(--background-secondary);%5Cn%20%20%20%20border-left:%20var(--size-2-1)%20solid%20var(--text-accent);%5Cn%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20flex-direction:%20column;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-4);%5Cn%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%5Cn%5Cn%20%20%20%20button%20%7B%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20A%20notice%20lays%20its%20buttons%20out%20inline%20with%20no%20spacing,%20so%20the%20action%20button%20would%20touch%20the%20decline%20button.%5Cn%20%20&.plugin-suggestion-notice-buttons%20%7B%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20flex-wrap:%20wrap;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20A%20popover%20is%20anchored%20at%20a%20point%20and%20appended%20to%20the%20document%20body,%20outside%20any%20plugin-scoped%5Cn//%20container,%20so%20it%20is%20positioned%20absolutely%20at%20the%20top%20level.%20It%20borrows%20Obsidian's%20%60.menu%60%20look,%5Cn//%20which%20already%20carries%20the%20popup%20background,%20border%20and%20shadow%20%E2%80%94%20only%20layout%20is%20set%20here.%5Cn.obsidian-lib%20%7B%5Cn%20%20&.popover%20%7B%5Cn%20%20%20%20//%20Deliberately%20not%20%60calc(100vw%20-%2016px)%60:%20the%20SCSS%20compiler%20strips%20the%20%60calc(%60%20wrapper%20inside%5Cn%20%20%20%20//%20%60min()%60,%20which%20yields%20invalid%20CSS.%20A%20viewport%20percentage%20keeps%20a%20narrow%20window's%20popover%20on%5Cn%20%20%20%20//%20screen.%5Cn%20%20%20%20max-width:%20min(420px,%2090vw);%5Cn%20%20%20%20min-width:%20320px;%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20z-index:%20var(--layer-menu);%5Cn%5Cn%20%20%20%20//%20Setting%20rows%20are%20built%20for%20a%20full-width%20settings%20tab;%20compact%20them%20for%20a%20popover.%5Cn%20%20%20%20.setting-item%20%7B%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20border-top:%20none;%5Cn%20%20%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20%20%20padding:%20var(--size-2-1)%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-info%20%7B%5Cn%20%20%20%20%20%20margin-right:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-control%20%7B%5Cn%20%20%20%20%20%20flex-grow:%201;%5Cn%20%20%20%20%20%20justify-content:%20flex-end;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20input%5Btype='text'%5D%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.prompt-modal%20%7B%5Cn%20%20%20%20.text-box%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20The%20tldraw%20Obsidian%20plugin%20(tldraw/obsidian-plugin)%20ships%20an%20unscoped%20global%20rule%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20currentColor%20%7D%60%20that%20overrides%20Obsidian's%20own%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20var(--text-color)%20%7D%60%20app-wide.%20Obsidian%20sets%5Cn//%20%60--text-color%60%20contextually%20per%20button%20variant%20(%60--text-normal%60%20by%20default,%5Cn//%20%60--text-on-accent%60%20for%20%60.mod-cta%60,%20%60--text-error%60%20for%20%60.mod-warning%60),%20so%20tldraw's%5Cn//%20%60currentColor%60%20discards%20that%20and%20breaks%20button%20contrast%20outside%20tldraw%20%E2%80%94%20e.g.%5Cn//%20White-on-white%20action%20buttons%20inside%20a%20Notice.%20Re-assert%20Obsidian's%20own%20value%20inside%20the%5Cn//%20Library's%20own%20UI%20(specificity%200,2,1),%20which%20wins%20over%20tldraw's%20(0,1,1)%20while%20staying%20correct%5Cn//%20For%20every%20button%20variant%20(it%20reuses%20the%20same%20contextual%20%60--text-color%60).%5Cn//%20It%20MUST%20stay%20scoped%20to%20%60.obsidian-lib%60:%20an%20unscoped%20re-assert%20(it%20was%20%60body%20button%E2%80%A6%60,%5Cn//%200,1,2)%20lands%20on%20every%20button%20in%20the%20app%20and%20beats%20any%20other%20plugin's%20own%20button%20color%5Cn//%20Written%20at%200,1,1,%20which%20Obsidian's%20own%20rule%20used%20to%20lose%20to%20(obsidian-custom-attachment-location%2395).%5Cn//%20Defensive%20workaround%20%E2%80%94%20remove%20once%20the%20upstream%20fix%20ships%20(tldraw/obsidian-plugin%23210).%5Cn.obsidian-lib%20button:not(.clickable-icon)%20%7B%5Cn%20%20color:%20var(--text-color);%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.tri-state-checkbox-component%20%7B%5Cn%20%20%20%20input%5Btype='checkbox'%5D:indeterminate%20%7B%5Cn%20%20%20%20%20%20appearance:%20checkbox;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@mixin%20invalid%20%7B%5Cn%20%20box-shadow:%200%200%200%202px%20var(--text-error);%5Cn%7D%5Cn%5Cn//%20An%20input%20the%20user%20has%20not%20interacted%20with%20yet%20carries%20%60.untouched%60%20(set%20by%20%60PromptModal%60),%20so%20a%20modal%20that%5Cn//%20opens%20invalid%20by%20design%20does%20not%20greet%20the%20user%20in%20red.%20Both%20blocks%20below%20must%20be%20gated:%20the%20input%20is%5Cn//%20focused%20on%20open,%20so%20the%20focus%20block%20alone%20would%20keep%20painting%20it.%5Cn.obsidian-lib%20%7B%5Cn%20%20:invalid:not(.untouched)%20%7B%5Cn%20%20%20%20@include%20invalid;%5Cn%20%20%7D%5Cn%5Cn%20%20input.metadata-input-text,%5Cn%20%20input%5Btype='date'%5D,%5Cn%20%20input%5Btype='datetime-local'%5D,%5Cn%20%20input%5Btype='email'%5D,%5Cn%20%20input%5Btype='number'%5D,%5Cn%20%20input%5Btype='password'%5D,%5Cn%20%20input%5Btype='search'%5D,%5Cn%20%20input%5Btype='text'%5D,%5Cn%20%20textarea%20%7B%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus-visible,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20&:invalid:not(.untouched)%20%7B%5Cn%20%20%20%20%20%20%20%20@include%20invalid;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.setting-component-wrapper%20%7B%5Cn%20%20%20%20position:%20relative;%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%7D%5Cn%5Cn%20%20&.overlay-validator%20%7B%5Cn%20%20%20%20caret-color:%20transparent;%5Cn%20%20%20%20cursor:%20default;%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20border:%20none;%5Cn%20%20%20%20outline:%20none;%5Cn%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20z-index:%209999;%5Cn%20%20%20%20left:%200;%5Cn%20%20%20%20top:%200;%5Cn%20%20%20%20width:%20100%25;%5Cn%20%20%20%20height:%20100%25;%5Cn%20%20%7D%5Cn%5Cn%20%20&.tooltip.tooltip-validator%20%7B%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20top:%20calc(100%25%20+%208px);%5Cn%20%20%20%20width:%20max-content;%5Cn%20%20%7D%5Cn%7D%5Cn%22%5D%7D */\n";
|
|
96
96
|
// Annotate the CommonJS export names for ESM import in node:
|
|
97
97
|
0 && (module.exports = {
|
|
@@ -141,6 +141,7 @@ const en = {
|
|
|
141
141
|
alreadyUpToDate: "{{dependencyPluginName}} is already at its latest release. {{pluginName}} needs a version that has not been released yet.",
|
|
142
142
|
blockedNotice: "{{pluginName}} does nothing until {{dependencyPluginName}} is installed and enabled.",
|
|
143
143
|
dependencyLostNotice: "{{dependencyPluginName}} is no longer available, so {{pluginName}} has stopped working. Bring it back to resume.",
|
|
144
|
+
noReadableApiNotice: "{{dependencyPluginName}} is enabled but publishes no API {{pluginName}} can read, so {{pluginName}} does nothing. Update {{dependencyPluginName}} to resume.",
|
|
144
145
|
openDependencySettings: "Open {{dependencyPluginName}} settings",
|
|
145
146
|
settingsHeading: "Required plugin missing",
|
|
146
147
|
update: "Update {{dependencyPluginName}}",
|
|
@@ -183,4 +184,4 @@ const en = {
|
|
|
183
184
|
0 && (module.exports = {
|
|
184
185
|
en
|
|
185
186
|
});
|
|
186
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9pMThuL2xvY2FsZXMvZW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBFbmdsaXNoIHRyYW5zbGF0aW9ucyBmb3IgdGhlIGBpMThuYCBtb2R1bGUuXG4gKi9cblxuLyoqXG4gKiBUaGUgRW5nbGlzaCB0cmFuc2xhdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBlbiA9IHtcbiAgb2JzaWRpYW5MaWI6IHtcbiAgICBhc3luY1dpdGhOb3RpY2U6IHtcbiAgICAgIG1pbGxpc2Vjb25kczogJ21pbGxpc2Vjb25kcy4uLicsXG4gICAgICBvcGVyYXRpb246ICdPcGVyYXRpb24nLFxuICAgICAgcnVubmluZ0ZvcjogJ1J1bm5pbmcgZm9yJyxcbiAgICAgIHRlcm1pbmF0ZU9wZXJhdGlvbjogJ1lvdSBjYW4gdGVybWluYXRlIHRoZSBvcGVyYXRpb24gYnkgY2xpY2tpbmcgdGhlIGJ1dHRvbiBiZWxvdywgYnV0IGJlIGF3YXJlIGl0IG1pZ2h0IGxlYXZlIHRoZSB2YXVsdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuJyxcbiAgICAgIHRpbWVkT3V0OiAnVGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgYWZ0ZXIge3tkdXJhdGlvbiwgbnVtYmVyfX0gbWlsbGlzZWNvbmRzLidcbiAgICB9LFxuICAgIGJ1dHRvbnM6IHtcbiAgICAgIGNhbmNlbDogJ0NhbmNlbCcsXG4gICAgICBvazogJ09LJ1xuICAgIH0sXG4gICAgY2FsbG91dDoge1xuICAgICAgbG9hZENvbnRlbnQ6ICdMb2FkIGNvbnRlbnQgZm9yIGNhbGxvdXQnXG4gICAgfSxcbiAgICBkYXRhdmlldzoge1xuICAgICAgaXRlbXNQZXJQYWdlOiAnSXRlbXMgcGVyIHBhZ2U6JyxcbiAgICAgIGp1bXBUb1BhZ2U6ICdKdW1wIHRvIHBhZ2U6JyxcbiAgICAgIHBhZ2VIZWFkZXI6ICdQYWdlIHt7cGFnZU51bWJlciwgbnVtYmVyfX0gb2Yge3t0b3RhbFBhZ2VzLCBudW1iZXJ9fSwgVG90YWwgaXRlbXM6IHt7dG90YWxJdGVtcywgbnVtYmVyfX0nXG4gICAgfSxcbiAgICBtZW51OiB7XG4gICAgICBjb3B5OiAnQ29weSdcbiAgICB9LFxuICAgIG1ldGFkYXRhQ2FjaGU6IHtcbiAgICAgIGdldEJhY2tsaW5rc0ZvckZpbGVQYXRoOiAnR2V0IGJhY2tsaW5rcyBmb3Ige3tmaWxlUGF0aH19J1xuICAgIH0sXG4gICAgbm90aWNlczoge1xuICAgICAgYXR0YWNobWVudElzU3RpbGxVc2VkOiAnQXR0YWNobWVudCB7e2F0dGFjaG1lbnRQYXRofX0gaXMgc3RpbGwgdXNlZCBieSBvdGhlciBub3Rlcy4gSXQgd2lsbCBub3QgYmUgZGVsZXRlZC4nLFxuICAgICAgYXR0YWNobWVudFJlc2N1ZWQ6ICdBdHRhY2htZW50IHt7YXR0YWNobWVudFBhdGh9fSBpcyBzdGlsbCB1c2VkIGJ5IG90aGVyIG5vdGVzLiBJdCB3YXMgbW92ZWQgdG8ge3tuZXdBdHRhY2htZW50UGF0aH19LicsXG4gICAgICBjbG9zZUFyaWFMYWJlbDogJ0Nsb3NlJyxcbiAgICAgIGZhaWxlZFRvT3BlblVybDogJ0ZhaWxlZCB0byBvcGVuIHt7dXJsfX0nLFxuICAgICAgdW5oYW5kbGVkRXJyb3I6ICdBbiB1bmhhbmRsZWQgZXJyb3Igb2NjdXJyZWQuIFBsZWFzZSBjaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nXG4gICAgfSxcbiAgICBwYXRoU2V0dGluZ3M6IHtcbiAgICAgIGludmFsaWRHbG9iOiAnSW52YWxpZCBnbG9iIHBhdHRlcm46IHt7Z2xvYn19ICh7e3JlYXNvbn19KScsXG4gICAgICBpbnZhbGlkUmVndWxhckV4cHJlc3Npb246ICdJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbjoge3tyZWdFeHB9fSAoe3tyZWFzb259fSknLFxuICAgICAgdHJhaWxpbmdFc2NhcGU6ICdpdCBlbmRzIHdpdGggYW4gdW5lc2NhcGVkIFxcXFwnLFxuICAgICAgdW5jbG9zZWRDaGFyYWN0ZXJDbGFzczogJ2EgWyBjaGFyYWN0ZXIgY2xhc3MgaXMgbmV2ZXIgY2xvc2VkIHdpdGggXSdcbiAgICB9LFxuICAgIHBsdWdpbkNvbmZsaWN0OiB7XG4gICAgICBibG9ja2VkTm90aWNlOiAne3twbHVnaW5OYW1lfX0gZG9lcyBub3RoaW5nIHdoaWxlIHt7Y29uZmxpY3RpbmdQbHVnaW5OYW1lfX0gaXMgZW5hYmxlZC4gVXBkYXRlIG9yIGRpc2FibGUgaXQgdG8gY29udGludWUuJyxcbiAgICAgIGNvbmZsaWN0QXBwZWFyZWROb3RpY2U6ICd7e2NvbmZsaWN0aW5nUGx1Z2luTmFtZX19IGlzIG5vdyBlbmFibGVkLCBzbyB7e3BsdWdpbk5hbWV9fSBoYXMgc3RvcHBlZCB3b3JraW5nLiBVcGRhdGUgb3IgZGlzYWJsZSBpdCB0byByZXN1bWUuJyxcbiAgICAgIGRpc2FibGU6ICdEaXNhYmxlIHt7Y29uZmxpY3RpbmdQbHVnaW5OYW1lfX0nLFxuICAgICAgc2V0dGluZ3NIZWFkaW5nOiAnQ29uZmxpY3RpbmcgcGx1Z2luJyxcbiAgICAgIHdhcm5pbmdOb3RpY2U6ICd7e3BsdWdpbk5hbWV9fSBhbmQge3tjb25mbGljdGluZ1BsdWdpbk5hbWV9fSBvdmVybGFwLCBhbmQgYm90aCBhcmUgcnVubmluZy4nXG4gICAgfSxcbiAgICBwbHVnaW5EZXBlbmRlbmN5OiB7XG4gICAgICBhbHJlYWR5VXBUb0RhdGU6ICd7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0gaXMgYWxyZWFkeSBhdCBpdHMgbGF0ZXN0IHJlbGVhc2UuIHt7cGx1Z2luTmFtZX19IG5lZWRzIGEgdmVyc2lvbiB0aGF0IGhhcyBub3QgYmVlbiByZWxlYXNlZCB5ZXQuJyxcbiAgICAgIGJsb2NrZWROb3RpY2U6ICd7e3BsdWdpbk5hbWV9fSBkb2VzIG5vdGhpbmcgdW50aWwge3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19IGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZC4nLFxuICAgICAgZGVwZW5kZW5jeUxvc3ROb3RpY2U6ICd7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0gaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSwgc28ge3twbHVnaW5OYW1lfX0gaGFzIHN0b3BwZWQgd29ya2luZy4gQnJpbmcgaXQgYmFjayB0byByZXN1bWUuJyxcbiAgICAgIG5vUmVhZGFibGVBcGlOb3RpY2U6ICd7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0gaXMgZW5hYmxlZCBidXQgcHVibGlzaGVzIG5vIEFQSSB7e3BsdWdpbk5hbWV9fSBjYW4gcmVhZCwgc28ge3twbHVnaW5OYW1lfX0gZG9lcyBub3RoaW5nLiBVcGRhdGUge3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19IHRvIHJlc3VtZS4nLFxuICAgICAgb3BlbkRlcGVuZGVuY3lTZXR0aW5nczogJ09wZW4ge3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19IHNldHRpbmdzJyxcbiAgICAgIHNldHRpbmdzSGVhZGluZzogJ1JlcXVpcmVkIHBsdWdpbiBtaXNzaW5nJyxcbiAgICAgIHVwZGF0ZTogJ1VwZGF0ZSB7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0nLFxuICAgICAgdXBkYXRlZDogJ3t7ZGVwZW5kZW5jeVBsdWdpbk5hbWV9fSBpcyB1cGRhdGVkLicsXG4gICAgICB1cGRhdGVGYWlsZWQ6ICdGYWlsZWQgdG8gdXBkYXRlIHt7ZGVwZW5kZW5jeVBsdWdpbk5hbWV9fS4gQ2hlY2sgdGhlIGNvbnNvbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyxcbiAgICAgIHZlcnNpb25NaXNtYXRjaE5vdGljZTogJ3t7cGx1Z2luTmFtZX19IG5lZWRzIGEgbmV3ZXIgdmVyc2lvbiBvZiB7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0uIFVwZGF0ZSBpdCB0byByZXN1bWUuJ1xuICAgIH0sXG4gICAgcGx1Z2luU3VnZ2VzdGlvbjoge1xuICAgICAgZW5hYmxlOiAnRW5hYmxlJyxcbiAgICAgIGluc3RhbGw6ICdJbnN0YWxsIGFuZCBlbmFibGUnLFxuICAgICAgaW5zdGFsbGVkOiAne3twbHVnaW5OYW1lfX0gaXMgaW5zdGFsbGVkIGFuZCBlbmFibGVkLicsXG4gICAgICBpbnN0YWxsRmFpbGVkOiAnRmFpbGVkIHRvIGluc3RhbGwge3twbHVnaW5OYW1lfX0uIENoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9uLicsXG4gICAgICBub3ROb3c6ICdOb3Qgbm93J1xuICAgIH0sXG4gICAgcXVldWU6IHtcbiAgICAgIGZsdXNoUXVldWU6ICdGbHVzaCBxdWV1ZSdcbiAgICB9LFxuICAgIHJlbGVhc2VOb3Rlczoge1xuICAgICAgdGl0bGU6ICd7e3BsdWdpbk5hbWV9fSByZWxlYXNlIG5vdGVzJ1xuICAgIH0sXG4gICAgcmVuYW1lRGVsZXRlSGFuZGxlcjoge1xuICAgICAgaGFuZGxlRGVsZXRlOiAnSGFuZGxlIGRlbGV0ZToge3tmaWxlUGF0aH19JyxcbiAgICAgIGhhbmRsZU9ycGhhbmVkUmVuYW1lczogJ0hhbmRsZSBvcnBoYW5lZCByZW5hbWVzJyxcbiAgICAgIGhhbmRsZVJlbmFtZTogJ0hhbmRsZSByZW5hbWU6IHt7b2xkUGF0aH19IC0+IHt7bmV3UGF0aH19JyxcbiAgICAgIHVwZGF0ZWRMaW5rczogJ1VwZGF0ZWQge3tsaW5rc0NvdW50LCBudW1iZXJ9fSBsaW5rcyBpbiB7e2ZpbGVzQ291bnQsIG51bWJlcn19IGZpbGVzLidcbiAgICB9LFxuICAgIHJlc291cmNlTG9jazoge1xuICAgICAgbG9ja2VkQnlUb29sdGlwOiAnTG9ja2VkIGJ5JyxcbiAgICAgIGxvY2tlZE5vdGVUb29sdGlwOiAnVGhpcyBub3RlIGlzIGxvY2tlZCB3aGlsZSBhbiBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuJyxcbiAgICAgIHVubG9ja0NvbmZpcm1NZXNzYWdlOiAnVGhpcyB3aWxsIGNhbmNlbCB0aGUgb3BlcmF0aW9uKHMpIGN1cnJlbnRseSBob2xkaW5nIGEgbG9jayBvbiB0aGlzIG5vdGUgYW5kIG1heSBsZWF2ZSB0aGUgdmF1bHQgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBUaGUgbm90ZSBpcyBsb2NrZWQgYnk6JyxcbiAgICAgIHVubG9ja0NvbmZpcm1UaXRsZTogJ1VubG9jayBub3RlPycsXG4gICAgICB1bmxvY2tNZW51SXRlbTogJ1VubG9jaydcbiAgICB9LFxuICAgIHZhdWx0OiB7XG4gICAgICBwcm9jZXNzRmlsZTogJ1Byb2Nlc3MgZmlsZSB7e2ZpbGVQYXRofX0nXG4gICAgfVxuICB9XG59IGFzIGNvbnN0O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU08sTUFBTSxLQUFLO0FBQUEsRUFDaEIsYUFBYTtBQUFBLElBQ1gsaUJBQWlCO0FBQUEsTUFDZixjQUFjO0FBQUEsTUFDZCxXQUFXO0FBQUEsTUFDWCxZQUFZO0FBQUEsTUFDWixvQkFBb0I7QUFBQSxNQUNwQixVQUFVO0FBQUEsSUFDWjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1IsSUFBSTtBQUFBLElBQ047QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLGFBQWE7QUFBQSxJQUNmO0FBQUEsSUFDQSxVQUFVO0FBQUEsTUFDUixjQUFjO0FBQUEsTUFDZCxZQUFZO0FBQUEsTUFDWixZQUFZO0FBQUEsSUFDZDtBQUFBLElBQ0EsTUFBTTtBQUFBLE1BQ0osTUFBTTtBQUFBLElBQ1I7QUFBQSxJQUNBLGVBQWU7QUFBQSxNQUNiLHlCQUF5QjtBQUFBLElBQzNCO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCx1QkFBdUI7QUFBQSxNQUN2QixtQkFBbUI7QUFBQSxNQUNuQixnQkFBZ0I7QUFBQSxNQUNoQixpQkFBaUI7QUFBQSxNQUNqQixnQkFBZ0I7QUFBQSxJQUNsQjtBQUFBLElBQ0EsY0FBYztBQUFBLE1BQ1osYUFBYTtBQUFBLE1BQ2IsMEJBQTBCO0FBQUEsTUFDMUIsZ0JBQWdCO0FBQUEsTUFDaEIsd0JBQXdCO0FBQUEsSUFDMUI7QUFBQSxJQUNBLGdCQUFnQjtBQUFBLE1BQ2QsZUFBZTtBQUFBLE1BQ2Ysd0JBQXdCO0FBQUEsTUFDeEIsU0FBUztBQUFBLE1BQ1QsaUJBQWlCO0FBQUEsTUFDakIsZUFBZTtBQUFBLElBQ2pCO0FBQUEsSUFDQSxrQkFBa0I7QUFBQSxNQUNoQixpQkFBaUI7QUFBQSxNQUNqQixlQUFlO0FBQUEsTUFDZixzQkFBc0I7QUFBQSxNQUN0QixxQkFBcUI7QUFBQSxNQUNyQix3QkFBd0I7QUFBQSxNQUN4QixpQkFBaUI7QUFBQSxNQUNqQixRQUFRO0FBQUEsTUFDUixTQUFTO0FBQUEsTUFDVCxjQUFjO0FBQUEsTUFDZCx1QkFBdUI7QUFBQSxJQUN6QjtBQUFBLElBQ0Esa0JBQWtCO0FBQUEsTUFDaEIsUUFBUTtBQUFBLE1BQ1IsU0FBUztBQUFBLE1BQ1QsV0FBVztBQUFBLE1BQ1gsZUFBZTtBQUFBLE1BQ2YsUUFBUTtBQUFBLElBQ1Y7QUFBQSxJQUNBLE9BQU87QUFBQSxNQUNMLFlBQVk7QUFBQSxJQUNkO0FBQUEsSUFDQSxjQUFjO0FBQUEsTUFDWixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EscUJBQXFCO0FBQUEsTUFDbkIsY0FBYztBQUFBLE1BQ2QsdUJBQXVCO0FBQUEsTUFDdkIsY0FBYztBQUFBLE1BQ2QsY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQSxjQUFjO0FBQUEsTUFDWixpQkFBaUI7QUFBQSxNQUNqQixtQkFBbUI7QUFBQSxNQUNuQixzQkFBc0I7QUFBQSxNQUN0QixvQkFBb0I7QUFBQSxNQUNwQixnQkFBZ0I7QUFBQSxJQUNsQjtBQUFBLElBQ0EsT0FBTztBQUFBLE1BQ0wsYUFBYTtBQUFBLElBQ2Y7QUFBQSxFQUNGO0FBQ0Y7IiwibmFtZXMiOltdfQ==
|
|
@@ -58,6 +58,7 @@ export declare const en: {
|
|
|
58
58
|
readonly alreadyUpToDate: "{{dependencyPluginName}} is already at its latest release. {{pluginName}} needs a version that has not been released yet.";
|
|
59
59
|
readonly blockedNotice: "{{pluginName}} does nothing until {{dependencyPluginName}} is installed and enabled.";
|
|
60
60
|
readonly dependencyLostNotice: "{{dependencyPluginName}} is no longer available, so {{pluginName}} has stopped working. Bring it back to resume.";
|
|
61
|
+
readonly noReadableApiNotice: "{{dependencyPluginName}} is enabled but publishes no API {{pluginName}} can read, so {{pluginName}} does nothing. Update {{dependencyPluginName}} to resume.";
|
|
61
62
|
readonly openDependencySettings: "Open {{dependencyPluginName}} settings";
|
|
62
63
|
readonly settingsHeading: "Required plugin missing";
|
|
63
64
|
readonly update: "Update {{dependencyPluginName}}";
|
|
@@ -61,6 +61,7 @@ declare const translationsMapImpl: {
|
|
|
61
61
|
readonly alreadyUpToDate: "{{dependencyPluginName}} is already at its latest release. {{pluginName}} needs a version that has not been released yet.";
|
|
62
62
|
readonly blockedNotice: "{{pluginName}} does nothing until {{dependencyPluginName}} is installed and enabled.";
|
|
63
63
|
readonly dependencyLostNotice: "{{dependencyPluginName}} is no longer available, so {{pluginName}} has stopped working. Bring it back to resume.";
|
|
64
|
+
readonly noReadableApiNotice: "{{dependencyPluginName}} is enabled but publishes no API {{pluginName}} can read, so {{pluginName}} does nothing. Update {{dependencyPluginName}} to resume.";
|
|
64
65
|
readonly openDependencySettings: "Open {{dependencyPluginName}} settings";
|
|
65
66
|
readonly settingsHeading: "Required plugin missing";
|
|
66
67
|
readonly update: "Update {{dependencyPluginName}}";
|
|
@@ -289,6 +289,7 @@ export declare class PluginGateComponent extends ComponentEx {
|
|
|
289
289
|
private createConflictBlockedMessage;
|
|
290
290
|
private createConflictWarningMessage;
|
|
291
291
|
private createDependencyLostMessage;
|
|
292
|
+
private createNoReadableApiMessage;
|
|
292
293
|
private createVersionMismatchMessage;
|
|
293
294
|
/**
|
|
294
295
|
* Finds the declared conflicts of one severity that are currently in force.
|
|
@@ -321,6 +322,21 @@ export declare class PluginGateComponent extends ComponentEx {
|
|
|
321
322
|
* @returns Whether the conflicting plugin is enabled at a conflicting version.
|
|
322
323
|
*/
|
|
323
324
|
private isConflictActive;
|
|
325
|
+
/**
|
|
326
|
+
* Decides whether an unsatisfied dependency is nonetheless enabled and loaded.
|
|
327
|
+
*
|
|
328
|
+
* Such a dependency is running but publishes no API this plugin can read — none at all, or one whose shape
|
|
329
|
+
* fails the contract. The usual cause is a release built on a copy of this library that publishes
|
|
330
|
+
* somewhere this one does not look, so "install and enable it" would be false and "update it" is the fix.
|
|
331
|
+
*
|
|
332
|
+
* Being in `enabledPlugins` is not enough: Obsidian's plain `disablePlugin` unloads a plugin and leaves it
|
|
333
|
+
* there (only `disablePluginAndSave` removes it), so a provider that went away would otherwise read as
|
|
334
|
+
* running with an unreadable API.
|
|
335
|
+
*
|
|
336
|
+
* @param dependency - The declared dependency.
|
|
337
|
+
* @returns Whether the dependency is enabled and loaded.
|
|
338
|
+
*/
|
|
339
|
+
private isRunning;
|
|
324
340
|
/**
|
|
325
341
|
* Decides whether a dependency is running but too old for this plugin, so the advice is "update it".
|
|
326
342
|
*
|
|
@@ -240,6 +240,9 @@ class PluginGateComponent extends ComponentEx {
|
|
|
240
240
|
if (this.isTooOld(dependency)) {
|
|
241
241
|
return this.createVersionMismatchMessage(dependency);
|
|
242
242
|
}
|
|
243
|
+
if (this.isRunning(dependency)) {
|
|
244
|
+
return this.createNoReadableApiMessage(dependency);
|
|
245
|
+
}
|
|
243
246
|
return createFragmentWithCodeBlocks(t(($) => $.obsidianLib.pluginDependency.blockedNotice, {
|
|
244
247
|
dependencyPluginName: asCodeBlock(dependency.pluginName),
|
|
245
248
|
pluginName: asCodeBlock(this.plugin.manifest.name)
|
|
@@ -267,11 +270,20 @@ class PluginGateComponent extends ComponentEx {
|
|
|
267
270
|
if (this.isTooOld(dependency)) {
|
|
268
271
|
return this.createVersionMismatchMessage(dependency);
|
|
269
272
|
}
|
|
273
|
+
if (this.isRunning(dependency)) {
|
|
274
|
+
return this.createNoReadableApiMessage(dependency);
|
|
275
|
+
}
|
|
270
276
|
return createFragmentWithCodeBlocks(t(($) => $.obsidianLib.pluginDependency.dependencyLostNotice, {
|
|
271
277
|
dependencyPluginName: asCodeBlock(dependency.pluginName),
|
|
272
278
|
pluginName: asCodeBlock(this.plugin.manifest.name)
|
|
273
279
|
}));
|
|
274
280
|
}
|
|
281
|
+
createNoReadableApiMessage(dependency) {
|
|
282
|
+
return createFragmentWithCodeBlocks(t(($) => $.obsidianLib.pluginDependency.noReadableApiNotice, {
|
|
283
|
+
dependencyPluginName: asCodeBlock(dependency.pluginName),
|
|
284
|
+
pluginName: asCodeBlock(this.plugin.manifest.name)
|
|
285
|
+
}));
|
|
286
|
+
}
|
|
275
287
|
createVersionMismatchMessage(dependency) {
|
|
276
288
|
return createFragmentWithCodeBlocks(t(($) => $.obsidianLib.pluginDependency.versionMismatchNotice, {
|
|
277
289
|
dependencyPluginName: asCodeBlock(dependency.pluginName),
|
|
@@ -348,6 +360,26 @@ class PluginGateComponent extends ComponentEx {
|
|
|
348
360
|
return true;
|
|
349
361
|
}
|
|
350
362
|
}
|
|
363
|
+
/**
|
|
364
|
+
* Decides whether an unsatisfied dependency is nonetheless enabled and loaded.
|
|
365
|
+
*
|
|
366
|
+
* Such a dependency is running but publishes no API this plugin can read — none at all, or one whose shape
|
|
367
|
+
* fails the contract. The usual cause is a release built on a copy of this library that publishes
|
|
368
|
+
* somewhere this one does not look, so "install and enable it" would be false and "update it" is the fix.
|
|
369
|
+
*
|
|
370
|
+
* Being in `enabledPlugins` is not enough: Obsidian's plain `disablePlugin` unloads a plugin and leaves it
|
|
371
|
+
* there (only `disablePluginAndSave` removes it), so a provider that went away would otherwise read as
|
|
372
|
+
* running with an unreadable API.
|
|
373
|
+
*
|
|
374
|
+
* @param dependency - The declared dependency.
|
|
375
|
+
* @returns Whether the dependency is enabled and loaded.
|
|
376
|
+
*/
|
|
377
|
+
isRunning(dependency) {
|
|
378
|
+
return getInstalledPluginState({
|
|
379
|
+
app: this.app,
|
|
380
|
+
pluginId: dependency.pluginId
|
|
381
|
+
}) === InstalledPluginState.Enabled && this.app.plugins.getPlugin(dependency.pluginId) !== null;
|
|
382
|
+
}
|
|
351
383
|
/**
|
|
352
384
|
* Decides whether a dependency is running but too old for this plugin, so the advice is "update it".
|
|
353
385
|
*
|
|
@@ -520,4 +552,4 @@ export {
|
|
|
520
552
|
PluginConflictSeverity,
|
|
521
553
|
PluginGateComponent
|
|
522
554
|
};
|
|
523
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGdhdGUgb24gYSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2U6IHdoYXQgbXVzdCBiZSBQUkVTRU5UIGZvciBpdCB0byBydW4sIGFuZCB3aGF0IG11c3QgTk9UIGJlLlxuICpcbiAqIEJvdGggaGFsdmVzIGFuc3dlciB0aGUgc2FtZSBxdWVzdGlvbiDigJQgbWF5IHRoaXMgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIHJ1biByaWdodCBub3c/IOKAlCBzbyB0aGV5IGFyZSBvbmVcbiAqIGNvbXBvbmVudCByYXRoZXIgdGhhbiB0d28uIEEgc2Vjb25kLCBpbmRlcGVuZGVudCBnYXRlIHdvdWxkIGRvdWJsZS1sb2FkIHRoZSBzdXJmYWNlIGFuZCBzdGFjayBhIHNlY29uZFxuICogXCJibG9ja2VkXCIgc2V0dGluZ3MgdGFiIG9udG8gdGhlIHNhbWUgcGx1Z2luLCBhbmQgbmVpdGhlciBjb3VsZCBzZWUgdGhlIG90aGVyJ3MgcmVhc29uIGZvciByZWZ1c2luZy5cbiAqXG4gKiAjIyBEZXBlbmRlbmNpZXM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IGNhbm5vdCB3b3JrIHdpdGhvdXRcbiAqXG4gKiBUaGlzIGlzIHRoZSBzdHJpY3Qgc2libGluZyBvZiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudGAsIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgd2hvbGUgcG9pbnQuIEFcbiAqIFNVR0dFU1RJT04gaXMgYW4gb2ZmZXIg4oCUIHRoZSBob3N0IGtlZXBzIHdvcmtpbmcgd2l0aG91dCBpdCBhbmQgc2ltcGx5IGNhbm5vdCBkbyBvbmUgdGhpbmcuIEEgREVQRU5ERU5DWVxuICogaXMgYSByZXF1aXJlbWVudDogYG9ubG9hZEltcGxgIG5ldmVyIHJ1bnMsIG5vIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCwgbm8gaGFuZGxlciBpcyBpbnN0YWxsZWQsIG5vdGhpbmcgaXNcbiAqIHBhdGNoZWQuIFJlYWNoIGZvciBhIHN1Z2dlc3Rpb24gd2hlbiB0aGUgb3RoZXIgcGx1Z2luIGFkZHMgc29tZXRoaW5nOyByZWFjaCBmb3IgYSBkZXBlbmRlbmN5IHdoZW4gdGhlXG4gKiBob3N0J3MgYWR2ZXJ0aXNlZCBiZWhhdmlvciBpcyBub3QgdGhlcmUgd2l0aG91dCBpdC5cbiAqXG4gKiBPYnNpZGlhbiBoYXMgbm8gZGVwZW5kZW5jeSBmaWVsZCBpbiBhIG1hbmlmZXN0LCB3aGljaCBpcyBleGFjdGx5IHRoZSBwcm9ibGVtIHRoaXMgY2xvc2VzLiBXaXRob3V0IG9uZSxcbiAqIGEgdXNlciBtZWV0aW5nIGFuIHVuZmFtaWxpYXIgcGx1Z2luIGluIHRoZWlyIGxpc3QgbW9udGhzIGxhdGVyIGhhcyBub3RoaW5nIHRlbGxpbmcgdGhlbSBpdCBpc1xuICogbG9hZC1iZWFyaW5nIOKAlCB0aGV5IHJlbW92ZSBpdCwgYW5kIHRoZSBicmVha2FnZSBzdXJmYWNlcyB3ZWVrcyBhZnRlciB0aGF0IGFzIGRhbWFnZSB0aGV5IGNhbm5vdCBjb25uZWN0XG4gKiB0byBhbnl0aGluZyB0aGV5IGRpZC4gU28gdGhlIHJlbGF0aW9uc2hpcCBpcyBtYWRlIHZpc2libGUgZnJvbSBib3RoIGVuZHMgYW5kIGVuZm9yY2VkIHdoaWxlIGl0IGhvbGRzOlxuICogdGhlIGRlcGVuZGVudCBleHBsYWlucyBpdHNlbGYgd2hlcmUgdGhlIHVzZXIgaXMgbG9va2luZywgcmVwYWlycyBpdHNlbGYgaW4gb25lIGNsaWNrLCBhbmQgcmVhY3RzIHRoZVxuICogSU5TVEFOVCB0aGUgZGVwZW5kZW5jeSBnb2VzIGF3YXkgcmF0aGVyIHRoYW4gZGVncmFkaW5nIHF1aWV0bHkuXG4gKlxuICogVGhyZWUgY2hvaWNlcyBhcmUgZGVsaWJlcmF0ZSBhbmQgd29ydGggc3RhdGluZywgYmVjYXVzZSBlYWNoIGhhcyBhbiBvYnZpb3VzLWxvb2tpbmcgYWx0ZXJuYXRpdmU6XG4gKlxuICogLSAqKkJsb2NrZWQgbWVhbnMgZW5hYmxlZC1idXQtaW5lcnQsIG5ldmVyIHNlbGYtZGlzYWJsZWQuKiogQ2FsbGluZyBgZGlzYWJsZVBsdWdpbkFuZFNhdmVgIG9uIGl0c2VsZlxuICogICB3b3VsZCBiZSB0aGUgbGl0ZXJhbCByZWFkaW5nIG9mIFwicmVmdXNlcyB0byBsb2FkXCIsIGFuZCBpdCByZXdyaXRlcyBhIGNvbmZpZyB0aGF0IGJlbG9uZ3MgdG8gdGhlIHVzZXIg4oCUXG4gKiAgIHdobyB3b3VsZCB0aGVuIGhhdmUgdG8gcmVtZW1iZXIgdG8gcmUtZW5hYmxlIGl0IGFmdGVyIGZpeGluZyB0aGUgZGVwZW5kZW5jeS4gU3RheWluZyBlbmFibGVkIGFuZCBpbmVydFxuICogICBzYXlzIHRoZSBzYW1lIHRoaW5nIHRvIHRoZSB1c2VyLCBjaGFuZ2VzIG5vdGhpbmcgdGhleSBvd24sIGFuZCBjYW4gdW5kbyBpdHNlbGYuXG4gKiAtICoqQmxvY2tlZCBpcyBub3QgYW4gZXJyb3IuKiogVGhyb3dpbmcgZnJvbSBgb25sb2FkYCBtYXJrcyB0aGUgcGx1Z2luIGZhaWxlZCBpbiBPYnNpZGlhbiBhbmQgaGFuZHMgdGhlXG4gKiAgIHVzZXIgYSBzdGFjayB0cmFjZSBpbnN0ZWFkIG9mIGEgc2VudGVuY2UgYW5kIGEgYnV0dG9uLlxuICogLSAqKkEgZGVwZW5kZW5jeSBtdXN0IHB1Ymxpc2ggYW4gQVBJLioqIFRoYXQgaXMgd2hhdCBtYWtlcyBwcmVzZW5jZSwgYWJzZW5jZSwgdmVyc2lvbiBhbmQgZGVwYXJ0dXJlIGFsbFxuICogICBvYnNlcnZhYmxlIHRocm91Z2ggb25lIG1lY2hhbmlzbSDigJQgYHdhdGNoUGx1Z2luQXBpYCdzIHJlZmVyZW5jZSBpcyBsaXZlLCBpcyByZXZva2VkIHdoZW4gdGhlIHByb3ZpZGVyXG4gKiAgIHVubG9hZHMsIGFuZCBhbHJlYWR5IGNsYXNzaWZpZXMgbm90LWluc3RhbGxlZCBhZ2FpbnN0IG5vdC1lbmFibGVkIGFnYWluc3QgdG9vLW9sZC4gQSBwcm92aWRlciB3aXRoXG4gKiAgIG5vdGhpbmcgdG8gZXhwb3NlIGNhbiBwdWJsaXNoIGFuIGVtcHR5IEFQSSBwdXJlbHkgc28gaXQgY2FuIGJlIGRlcGVuZGVkIHVwb247IHRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZVxuICogICBhIHNlY29uZCwgd2Vha2VyIGRldGVjdGlvbiBwYXRoIHRvIG1haW50YWluIGJlc2lkZSBpdC5cbiAqXG4gKiAjIyBDb25mbGljdHM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IHJlZnVzZXMgdG8gcnVuIGJlc2lkZVxuICpcbiAqIFRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCwgYW5kIGl0IG5lZWRzIGl0cyBvd24gZGV0ZWN0aW9uIHBhdGggYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBvbmUgZG9lcyBub3QgZml0LlxuICogQSBjb25mbGljdGluZyBwbHVnaW4gaXMgdHlwaWNhbGx5IGFuIE9MRCB2ZXJzaW9uIG9mIHNvbWUgb3RoZXIgcGx1Z2luIHRoYXQgc3RpbGwgb3ducyBiZWhhdmlvciB0aGlzIG9uZVxuICogaGFzIHRha2VuIG92ZXIg4oCUIGl0IHB1Ymxpc2hlcyBubyBBUEkgYXQgYWxsLCBzbyB0aGVyZSBpcyBubyBgYXBpVmVyc2lvblJhbmdlYCB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogVGhlIGFyZ3VtZW50IGZvciByZWZ1c2luZyByYXRoZXIgdGhhbiBjb21wZXRpbmcgY29tZXMgZnJvbSB0aGUgY2FzZSB0aGlzIGdlbmVyYWxpemVzOiB0d28gcmVuYW1lL2RlbGV0ZVxuICogaGFuZGxlcnMgYWN0aW5nIG9uIG9uZSByZW5hbWUgY29ycnVwdCBsaW5rcyBhbmQgbW92ZSBhdHRhY2htZW50cyB0d2ljZSwgYW5kIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0b1xuICogd2luIHRoYXQgcmFjZSDigJQgYSBoYW5kbGVyIGlzIGVsZWN0ZWQgYnkgcmVnaXN0cnkgb3JkZXIsIGJ1dCB0aGUgcGF0Y2hlcyB0aGF0IGRvIHRoZSB3b3JrIHNpdCBvdXRzaWRlXG4gKiB0aGF0IGVsZWN0aW9uLCBzbyB3aGljaGV2ZXIgcGx1Z2luIGxvYWRlZCBmaXJzdCBrZWVwcyBhIGhhbmQgb24gdGhlIHdoZWVsLiBFdmVyeSBzY2hlbWUgZm9yIHNlaXppbmdcbiAqIGNvbnRyb2wgZnJvbSBpbnNpZGUgaXMgbG9hZC1vcmRlciBkZXBlbmRlbnQuIFJlZnVzaW5nIGlzIGRldGVybWluaXN0aWMgd2hlcmUgY29tcGV0aW5nIGlzIG5vdCwgYW5kIGFcbiAqIHZhdWx0IHRoYXQgYnJpZWZseSBoYXMgbm8gaGFuZGxlciBpcyBhIGZhciBiZXR0ZXIgb3V0Y29tZSB0aGFuIG9uZSB3aXRoIHR3by5cbiAqXG4gKiBUd28gZGV0YWlscyBvZiB0aGF0IGRldGVjdGlvbiBjYXJyeSBvdmVyIHZlcmJhdGltLCBiZWNhdXNlIGJvdGggYXJlIGxvYWQtYmVhcmluZzpcbiAqXG4gKiAtICoqVmVyc2lvbnMgYXJlIHJlYWQsIG5ldmVyIHRoZSByZWdpc3RyeS4qKiBBIHBsdWdpbiB0aGF0IGhhcyBub3QgbG9hZGVkIHlldCBoYXMgcmVnaXN0ZXJlZCBub3RoaW5nLCBzb1xuICogICBhc2tpbmcgdGhlIHJlZ2lzdHJ5IGdpdmVzIGEgZGlmZmVyZW50IGFuc3dlciBkZXBlbmRpbmcgb24gd2hlbiBpdCBpcyBhc2tlZC4gYGFwcC5wbHVnaW5zLm1hbmlmZXN0c2AgaXNcbiAqICAgcG9wdWxhdGVkIGZvciBldmVyeSBpbnN0YWxsZWQgcGx1Z2luIGF0IHN0YXJ0dXAsIHdoYXRldmVyIHRoZSBsb2FkIG9yZGVyIHR1cm5zIG91dCB0byBiZS5cbiAqIC0gKipBbiB1bnBhcnNlYWJsZSB2ZXJzaW9uIGNvdW50cyBhcyBjb25mbGljdGluZy4qKiBGYWlsaW5nIGNsb3NlZCBpcyB0aGUgc2FmZSBkaXJlY3Rpb246IGEgZmFsc2UgYWxhcm1cbiAqICAgY29zdHMgYSBub3RpY2UsIGEgZmFsc2UgYWxsLWNsZWFyIGNvc3RzIGEgdmF1bHQuXG4gKlxuICogTm90IGV2ZXJ5IG92ZXJsYXAgaXMgdGhhdCBzZXZlcmUsIHdoaWNoIGlzIHdoeSBhIGNvbmZsaWN0IGRlY2xhcmVzIGEge0BsaW5rIFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHl9LlxuICogVHdvIHBsdWdpbnMgc2hpcHBpbmcgdGhlIHNhbWUgY29tbWFuZCBkdXBsaWNhdGUgYSBwYWxldHRlIGVudHJ5IGFuZCBkbyB0aGUgd29yayB0d2ljZSDigJQgYW5ub3lpbmcsIG5vdFxuICogY29ycnVwdGluZyDigJQgYW5kIHJlZnVzaW5nIHRvIGxvYWQgb3ZlciB0aGF0IHdvdWxkIGJlIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHRoZSBvdmVybGFwLiBUaG9zZSBkZWNsYXJlXG4gKiB7QGxpbmsgUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJufSBhbmQgYm90aCBrZWVwIHJ1bm5pbmcuXG4gKlxuICogIyMgV2hhdCB0aGlzIGNhbiBhbmQgY2Fubm90IHNlZVxuICpcbiAqIE9ic2lkaWFuIHJhaXNlcyBubyBldmVudCB3aGVuIEFOT1RIRVIgcGx1Z2luIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgKHNlZSBgcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHNgKSxcbiAqIHNvIGxpdmUgY29uZmxpY3QgZGV0ZWN0aW9uIGhhcyBhIHJlYWwgY2VpbGluZyBhbmQgaXQgaXMgc3RhdGVkIGhlcmUgcmF0aGVyIHRoYW4gaW1wbGllZCBhd2F5LiBBXG4gKiBjb25mbGljdGluZyBwbHVnaW4gYnVpbHQgb24gdGhpcyBsaWJyYXJ5IGFubm91bmNlcyBpdHNlbGYgdGhyb3VnaCB0aGUgbGlmZWN5Y2xlIGJyb2FkY2FzdCwgYW5kIGlzXG4gKiB0aGVyZWZvcmUgY2F1Z2h0IHRoZSBtb21lbnQgaXQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gT25lIHRoYXQgaXMgbm90IOKAlCBhbiBvbGQgcmVsZWFzZSBwcmVkYXRpbmcgdGhlXG4gKiBicm9hZGNhc3QsIG9yIGEgcGx1Z2luIGJ5IGFub3RoZXIgYXV0aG9yIGVudGlyZWx5IOKAlCBpcyBjYXVnaHQgYXQgdGhlIG5leHQgbG9hZCwgd2hpY2ggaXMgd2hlbiBpdHNcbiAqIG1hbmlmZXN0IGlzIHJlYWQuXG4gKlxuICogIyMgV2h5IGEgbG9zcyBpcyBhbm5vdW5jZWQgbGF0ZVxuICpcbiAqIE9ic2lkaWFuIHVwZGF0ZXMgYW4gZW5hYmxlZCBwbHVnaW4gYnkgcmVsb2FkaW5nIGl0OiB0aGUgb2xkIGNvcHkgdW5sb2FkcywgdGhlIG5ldyBvbmUgbG9hZHMuIEZvciB0aGVcbiAqIG1vbWVudCBpbiBiZXR3ZWVuIHRoZSBwcm92aWRlcidzIEFQSSBpcyByZXZva2VkLCBzbyBldmVyeSBkZXBlbmRlbnQgc2VlcyBpdHMgZGVwZW5kZW5jeSBnbyBhd2F5IGFuZFxuICogY29tZSBiYWNrLiBUaGUgZmVhdHVyZSBzdXJmYWNlIHN0aWxsIGNvbWVzIGRvd24gYXQgb25jZSDigJQgdGhlIGRlcGVuZGVuY3kgcmVhbGx5IGlzIGdvbmUgZm9yIHRoYXRcbiAqIG1vbWVudCDigJQgYnV0IHRoZSBub3RpY2Ugd2FpdHMge0BsaW5rIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFN9LCBhbmQgYSBsb3NzIHRoYXRcbiAqIGhlYWxlZCBpbiB0aGUgbWVhbnRpbWUgaXMgbmV2ZXIgYW5ub3VuY2VkLiBXaXRob3V0IHRoYXQsIHVwZGF0aW5nIG9uZSBwbHVnaW4gcHV0IGEgXCJubyBsb25nZXJcbiAqIGF2YWlsYWJsZVwiIG5vdGljZSBvbiBzY3JlZW4gaW4gZXZlcnkgcGx1Z2luIGRlcGVuZGluZyBvbiBpdCwgZGVzY3JpYmluZyBhIHN0YXRlIHRoYXQgbm8gbG9uZ2VyIGhlbGQgYnlcbiAqIHRoZSB0aW1lIHRoZSB1c2VyIHJlYWQgaXQuIEEgbG9zcyB0aGUgdXNlciBjYXVzZWQgb24gcHVycG9zZSDigJQgZGlzYWJsaW5nIG9yIHVuaW5zdGFsbGluZyB0aGVcbiAqIGRlcGVuZGVuY3kg4oCUIG91dGxhc3RzIHRoZSB3aW5kb3cgYW5kIGlzIGFubm91bmNlZCBhcyBiZWZvcmUsIG9ubHkgYSBmZXcgc2Vjb25kcyBsYXRlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgUGx1Z2luXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGNvbXBhcmUgYXMgY29tcGFyZVZlcnNpb25zLFxuICBzYXRpc2ZpZXMgYXMgc2F0aXNmaWVzVmVyc2lvblxufSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudCxcbiAgUGx1Z2luU2V0dGluZ1RhYlxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luQXBpUmVmIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1hcGkudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWUsXG4gIFBsdWdpbkxpZmVjeWNsZUV2ZW50UGF5bG9hZFxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgZGlzYWJsZUNvbW11bml0eVBsdWdpbiB9IGZyb20gJy4uL2NvbW11bml0eS1wbHVnaW5zLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7XG4gIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUsXG4gIGFzQ29kZUJsb2NrLFxuICBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzXG59IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7XG4gIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLFxuICB3YXRjaFBsdWdpbkFwaVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQge1xuICBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSxcbiAgZ2V0SW5zdGFsbGVkUGx1Z2luVmVyc2lvbixcbiAgaW5zdGFsbEFuZEVuYWJsZVBsdWdpbixcbiAgSW5zdGFsbGVkUGx1Z2luU3RhdGUsXG4gIHVwZGF0ZVBsdWdpblxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWluc3RhbGwtc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FLFxuICBQTFVHSU5fVU5MT0FERURfRVZFTlRfTkFNRVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJBc3luY0V2ZW50IH0gZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgQ2FsbGJhY2tMYXlvdXRSZWFkeUNvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LXJlYWR5LWNvbXBvbmVudC50cyc7XG5cbi8qKlxuICogSG93IGxvbmcgYSBnYXRlIHRoYXQgY2xvc2VkIHdoaWxlIHRoZSBwbHVnaW4gd2FzIHJ1bm5pbmcgd2FpdHMgYmVmb3JlIHNheWluZyBzby5cbiAqXG4gKiBMb25nIGVub3VnaCB0byBjb3ZlciBPYnNpZGlhbiByZWxvYWRpbmcgYSBwbHVnaW4gdG8gYXBwbHkgaXRzIHVwZGF0ZSwgc2hvcnQgZW5vdWdoIHRoYXQgYSB1c2VyIHdob1xuICogZGlzYWJsZWQgdGhlIGRlcGVuZGVuY3kgYnkgaGFuZCBzdGlsbCBjb25uZWN0cyB0aGUgbm90aWNlIHRvIHdoYXQgdGhleSBqdXN0IGRpZC5cbiAqL1xuY29uc3QgTE9TU19BTk5PVU5DRU1FTlRfR1JBQ0VfUEVSSU9EX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbi8qKlxuICogSG93IGJhZGx5IHR3byBwbHVnaW5zIHJ1bm5pbmcgc2lkZSBieSBzaWRlIGdvZXMgd3JvbmcsIGFuZCB0aGVyZWZvcmUgd2hhdCB0aGlzIG9uZSBkb2VzIGFib3V0IGl0LlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5Db25mbGljdFNldmVyaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBob3N0IHJlZnVzZXMgdG8gcnVuIGF0IGFsbCB3aGlsZSB0aGUgY29uZmxpY3QgaG9sZHM6IGBvbmxvYWRJbXBsYCBuZXZlciBydW5zLCBub3RoaW5nIGlzXG4gICAqIHJlZ2lzdGVyZWQsIGFuZCB0aGUgcGx1Z2luIGV4cGxhaW5zIGl0c2VsZiB0aGUgd2F5IGEgbWlzc2luZyBkZXBlbmRlbmN5IGRvZXMuXG4gICAqXG4gICAqIEZvciBhbiBvdmVybGFwIHdoZXJlIGJvdGggcGx1Z2lucyBhY3Rpbmcgb24gdGhlIHNhbWUgb3BlcmF0aW9uIGRhbWFnZXMgdGhlIHZhdWx0LlxuICAgKi9cbiAgQmxvY2sgPSAnYmxvY2snLFxuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBydW5zIGFueXdheSBhbmQgc2F5cyB0aGUgb3ZlcmxhcCBpcyB0aGVyZS5cbiAgICpcbiAgICogRm9yIGFuIG92ZXJsYXAgdGhhdCBpcyBhbm5veWluZyByYXRoZXIgdGhhbiBkZXN0cnVjdGl2ZSDigJQgZHVwbGljYXRlIGNvbW1hbmRzLCB3b3JrIGRvbmUgdHdpY2Ug4oCUIHdoZXJlXG4gICAqIHJlZnVzaW5nIHRvIGxvYWQgd291bGQgY29zdCB0aGUgdXNlciBtb3JlIHRoYW4gdGhlIG92ZXJsYXAgZG9lcy5cbiAgICovXG4gIFdhcm4gPSAnd2Fybidcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiByZWZ1c2VzIHRvIHJ1biBiZXNpZGUsIG9yIHdhcm5zIGFib3V0IHJ1bm5pbmcgYmVzaWRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkNvbmZsaWN0IHtcbiAgLyoqXG4gICAqIFRoZSBzZW12ZXIgcmFuZ2Ugb2YgdGhlIE9USEVSIHBsdWdpbidzIHZlcnNpb25zIHRoYXQgY29uZmxpY3QsIGUuZy4gYCc8MTIuMC4wJ2AgZm9yIFwiZXZlcnkgdmVyc2lvblxuICAgKiBiZWZvcmUgdGhlIG9uZSB0aGF0IGdhdmUgdGhpcyBiZWhhdmlvciB1cFwiLlxuICAgKlxuICAgKiBBIHJhbmdlIHJhdGhlciB0aGFuIGEgbWluaW11bSwgc28gYW4gb3ZlcmxhcCBjb25maW5lZCB0byBvbmUgbWFqb3IgKGAnPj0zIDw0J2ApIGlzIGV4cHJlc3NpYmxlLCBhbmQgc29cbiAgICogaXMgYSBwbHVnaW4gdGhhdCBjb25mbGljdHMgYXQgZXZlcnkgdmVyc2lvbiDigJQgc3BlbGwgdGhhdCBgJz49MC4wLjAnYCwgc2luY2UgYGNvbXBhcmUtdmVyc2lvbnNgIHJlamVjdHNcbiAgICogYSBiYXJlIGAqYC4gRXZhbHVhdGVkIGFnYWluc3QgYG1hbmlmZXN0LnZlcnNpb25gOyBhIHZlcnNpb24gdGhhdCBjYW5ub3QgYmUgcGFyc2VkIGNvdW50cyBhc1xuICAgKiBjb25mbGljdGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZsaWN0aW5nVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIGFzIGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIHNob3duIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxvY2FsaXplZCBzZW50ZW5jZSBzYXlpbmcgd2hhdCBnb2VzIHdyb25nIHdoZW4gYm90aCBydW4sIHNob3duIGluIHRoZSBiYW5uZXIuXG4gICAqXG4gICAqIFRoZSBkZWNsYXJpbmcgcGx1Z2luIG93bnMgdGhpcyBzdHJpbmcgYmVjYXVzZSBvbmx5IGl0IGtub3dzIHdoYXQgdGhlIHR3byBvZiB0aGVtIGNvbGxpZGUgb3ZlciwgYW5kIGFcbiAgICogdXNlciBiZWluZyBhc2tlZCB0byBkaXNhYmxlIHNvbWV0aGluZyBkZXNlcnZlcyB0byBiZSB0b2xkIHdoeS5cbiAgICpcbiAgICogUGFzcyBhIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSB0byBtYXJrIHVwIHBhcnQgb2YgdGhlIHNlbnRlbmNlLCBzdWNoIGFzIGEgcGx1Z2luIG5hbWUgcmVuZGVyZWQgYXNcbiAgICogY29kZS4gRWFjaCByZW5kZXIgYXBwZW5kcyBhIGZyZXNoIGNsb25lIG9mIGl0LCBzaW5jZSB0aGUgYmFubmVyIGlzIHJlbmRlcmVkIGFnYWluIG9uIGV2ZXJ5IHJlZnJlc2guXG4gICAqL1xuICByZWFkb25seSByZWFzb246IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhpcyBwbHVnaW4gZG9lcyBhYm91dCB0aGUgY29uZmxpY3QuXG4gICAqL1xuICByZWFkb25seSBzZXZlcml0eTogUGx1Z2luQ29uZmxpY3RTZXZlcml0eTtcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiBjYW5ub3Qgd29yayB3aXRob3V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkRlcGVuZGVuY3kge1xuICAvKipcbiAgICogVGhlIHNlbXZlciByYW5nZSBvZiBBUEkgY29udHJhY3QgdmVyc2lvbnMgdGhlIGRlcGVuZGVudCBjb21waWxlZCBhZ2FpbnN0LCBlLmcuIGAnXjInYC5cbiAgICpcbiAgICogQSBkZXBlbmRlbmN5IHdob3NlIHB1Ymxpc2hlZCBBUEkgZmFsbHMgb3V0c2lkZSB0aGUgcmFuZ2UgY291bnRzIGFzIFVOU0FUSVNGSUVELCB3aGljaCBpcyB3aGF0IHR1cm5zIGFcbiAgICogc2lsZW50IGJlaGF2aW9yYWwgbWlzbWF0Y2ggYmV0d2VlbiB0d28gaW5kZXBlbmRlbnRseSByZWxlYXNlZCBwbHVnaW5zIGludG8gYSB2aXNpYmxlIFwidXBkYXRlIHRoaXNcbiAgICogb25lXCIgbWVzc2FnZS4gU3BlbGwgXCJhbnkgdmVyc2lvblwiIGFzIGAnPj0wLjAuMCdgIOKAlCBgY29tcGFyZS12ZXJzaW9uc2AgcmVqZWN0cyBhIGJhcmUgYCpgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGRlc3QgcmVsZWFzZSBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luIHRoZSBkZXBlbmRlbnQgd29ya3Mgd2l0aCwgZS5nLiBgJzIuMi4wJ2AuXG4gICAqXG4gICAqIEZvciBhIHByb3ZpZGVyIHdob3NlIEJFSEFWSU9SIGNoYW5nZWQgd2hpbGUgaXRzIEFQSSBjb250cmFjdCBzdGF5ZWQgdGhlIHNhbWUsIHdoaWNoXG4gICAqIHtAbGluayBhcGlWZXJzaW9uUmFuZ2V9IGNhbm5vdCBzZWUuIEEgZGVwZW5kZW5jeSBlbmFibGVkIGJlbG93IGl0IGNvdW50cyBhcyBVTlNBVElTRklFRCBhbmQgYXNrcyB0aGVcbiAgICogdXNlciB0byB1cGRhdGUgaXQuIEV2YWx1YXRlZCBhZ2FpbnN0IGBtYW5pZmVzdC52ZXJzaW9uYDsgYSB2ZXJzaW9uIHRoYXQgY2Fubm90IGJlIHBhcnNlZCBjb3VudHMgYXMgdG9vXG4gICAqIG9sZC4gQSBtaW5pbXVtIHJhdGhlciB0aGFuIGEgcmFuZ2UsIGJlY2F1c2UgdGhlIG9ubHkgYWR2aWNlIHRoZSBnYXRlIGNhbiBnaXZlIGlzIFwidXBkYXRlIGl0XCIsIGFuZCBhblxuICAgKiB1cHBlciBib3VuZCBpcyBhIHZlcnNpb24gbm8gdXBkYXRlIHJlYWNoZXMuXG4gICAqL1xuICByZWFkb25seSBtaW5QbHVnaW5WZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luLCBhcyBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2luIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luLCBzaG93biB0byB0aGUgdXNlci5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQSBsb2NhbGl6ZWQgc2VudGVuY2Ugc2F5aW5nIHdoYXQgdGhlIGRlcGVuZGVudCBkb2VzIHdpdGggdGhpcyBwbHVnaW4sIHNob3duIGluIHRoZSBzZXR0aW5ncyBiYW5uZXIuXG4gICAqXG4gICAqIFRoZSBkZXBlbmRlbnQgb3ducyB0aGlzIHN0cmluZyBiZWNhdXNlIG9ubHkgaXQga25vd3Mgd2hhdCBpdCB1c2VzIHRoZSBvdGhlciBwbHVnaW4gZm9yLCBhbmQgYSB1c2VyXG4gICAqIGJlaW5nIGFza2VkIHRvIGluc3RhbGwgc29tZXRoaW5nIGRlc2VydmVzIHRvIGJlIHRvbGQgd2h5LlxuICAgKlxuICAgKiBQYXNzIGEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHRvIG1hcmsgdXAgcGFydCBvZiB0aGUgc2VudGVuY2UsIHN1Y2ggYXMgYSBwbHVnaW4gbmFtZSByZW5kZXJlZCBhc1xuICAgKiBjb2RlLiBFYWNoIHJlbmRlciBhcHBlbmRzIGEgZnJlc2ggY2xvbmUgb2YgaXQsIHNpbmNlIHRoZSBiYW5uZXIgaXMgcmVuZGVyZWQgYWdhaW4gb24gZXZlcnkgcmVmcmVzaC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkdhdGVDb21wb25lbnR9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkdhdGVDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29uZmxpY3RzIHRvIGVuZm9yY2UuIEFuIGVtcHR5IGxpc3QgbWVhbnMgdGhlIHBsdWdpbiByZWZ1c2VzIHRvIHJ1biBiZXNpZGUgbm90aGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXTtcblxuICAvKipcbiAgICogVGhlIGRlcGVuZGVuY2llcyB0byBlbmZvcmNlLiBBbiBlbXB0eSBsaXN0IG1lYW5zIHRoZSBwbHVnaW4gZGVwZW5kcyBvbiBub3RoaW5nLCBhbmQgaXRzIGZlYXR1cmVcbiAgICogc3VyZmFjZSBsb2FkcyBpbW1lZGlhdGVseS5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdO1xuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgaG9zdCBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UuIENhbGxlZCBvbmNlIGV2ZXJ5IGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIGFuZCBubyBibG9ja2luZ1xuICAgKiBjb25mbGljdCBob2xkcywgYW5kIGFnYWluIGFmdGVyIGEgZ2F0ZSB0aGF0IGhhZCBjbG9zZWQgb3BlbnMgYmFjayB1cC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBzdXJmYWNlIGlzIGxvYWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgcGx1Z2luIOKAlCB0aGUgb25lIGRlY2xhcmluZyB0aGUgZGVwZW5kZW5jaWVzIGFuZCBjb25mbGljdHMuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgcGx1Z2luJ3Mgbm90aWNlIGNvbXBvbmVudCwgdXNlZCB0byBzYXkgd2hhdCBpcyBtaXNzaW5nLCB3aGF0IGlzIGluIHRoZSB3YXksIGFuZCB3aGF0IGNoYW5nZWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogVW5sb2FkcyB0aGUgaG9zdCBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UuIENhbGxlZCB3aGVuIGEgZ2F0ZSB0aGF0IGhhZCBiZWVuIG9wZW4gY2xvc2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5sb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYn0gY29uc3RydWN0b3IuXG4gKi9cbmludGVyZmFjZSBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYkNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBibG9ja2VkIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBibG9ja2VkIGV4cGxhbmF0aW9uIGludG8gdGhlIHRhYidzIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIHRhYidzIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBzZXR0aW5ncyB0YWIgYSBibG9ja2VkIHBsdWdpbiBzaG93cyBpbiBwbGFjZSBvZiB0aGUgb25lIGl0IG5ldmVyIGdvdCB0byByZWdpc3Rlci5cbiAqXG4gKiBBIGJsb2NrZWQgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIG5ldmVyIHJhbiwgc28gaXRzIHJlYWwgc2V0dGluZ3MgdGFiIGRvZXMgbm90IGV4aXN0IOKAlCBhbmQgYSB1c2VyIHdobyBnb2VzXG4gKiBsb29raW5nIGZvciB0aGUgcGx1Z2luJ3Mgc2V0dGluZ3MgaXMgcHJlY2lzZWx5IHRoZSB1c2VyIGFza2luZyBcIndoeSBpc24ndCB0aGlzIGRvaW5nIGFueXRoaW5nP1wiLiBBblxuICogZW1wdHkgc3BhY2UgaXMgdGhlIHdvcnN0IHBvc3NpYmxlIGFuc3dlciB0byB0aGF0IHF1ZXN0aW9uLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9zZXR0aW5ncy10YWIvcHJlZmVyLXNldHRpbmctZGVmaW5pdGlvbnMgLS0gVGhpcyB0YWIgaGFzIG5vIHNldHRpbmdzIHRvIGRlY2xhcmUuIEl0IHN0YW5kcyBpbiBmb3IgYSBzZXR0aW5ncyB0YWIgdGhhdCBkb2VzIG5vdCBleGlzdCB5ZXQsIGNhcnJ5aW5nIGFuIGV4cGxhbmF0aW9uIGFuZCBhIHJlcGFpciBidXR0b24sIGFuZCB0aGUgcGx1Z2luJ3MgcmVhbCBzZXR0aW5ncyBhcHBlYXIgdGhlIG1vbWVudCB0aGUgZ2F0ZSBvcGVucy5cbmNsYXNzIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAbGluayBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMucGx1Z2luLmFwcCwgcGFyYW1zLnBsdWdpbik7XG4gICAgdGhpcy5yZW5kZXJCYW5uZXIgPSBwYXJhbXMucmVuZGVyQmFubmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHRhYi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNwbGF5KCk6IHZvaWQge1xuICAgIHRoaXMuY29udGFpbmVyRWwuZW1wdHkoKTtcbiAgICB0aGlzLnJlbmRlckJhbm5lcih0aGlzLmNvbnRhaW5lckVsKTtcbiAgfVxufVxuXG4vKipcbiAqIEVuZm9yY2VzIGEgcGx1Z2luJ3MgbWFuZGF0b3J5IGRlcGVuZGVuY2llcyBhbmQgZGVjbGFyZWQgY29uZmxpY3RzLCBnYXRpbmcgaXRzIGZlYXR1cmUgc3VyZmFjZSBvbiBib3RoLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luR2F0ZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbm5vdW5jZWRXYXJuaW5nUGx1Z2luSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpUmVmcyA9IG5ldyBNYXA8c3RyaW5nLCBQbHVnaW5BcGlSZWY8b2JqZWN0Pj4oKTtcbiAgcHJpdmF0ZSBibG9ja2VkU2V0dGluZ1RhYjogbnVsbCB8IFBsdWdpblNldHRpbmdUYWIgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXBlbmRlbmNpZXM6IHJlYWRvbmx5IFBsdWdpbkRlcGVuZGVuY3lbXTtcbiAgcHJpdmF0ZSBoYXNBbm5vdW5jZWRCbG9ja2VkID0gZmFsc2U7XG4gIHByaXZhdGUgaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGlzTGF5b3V0UmVhZHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgbG9zc0Fubm91bmNlbWVudFRpbWVySWQ6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHVubG9hZEZlYXR1cmVTdXJmYWNlOiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgZ2V0IGFwcCgpOiBBcHAge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5hcHA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGx1Z2luR2F0ZUNvbXBvbmVudH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkdhdGVDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25mbGljdHMgPSBwYXJhbXMuY29uZmxpY3RzO1xuICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gcGFyYW1zLmRlcGVuZGVuY2llcztcbiAgICB0aGlzLmxvYWRGZWF0dXJlU3VyZmFjZSA9IHBhcmFtcy5sb2FkRmVhdHVyZVN1cmZhY2U7XG4gICAgdGhpcy5wbHVnaW4gPSBwYXJhbXMucGx1Z2luO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnVubG9hZEZlYXR1cmVTdXJmYWNlID0gcGFyYW1zLnVubG9hZEZlYXR1cmVTdXJmYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgd2hldGhlciBhbnkgd2FybmluZyBjb25mbGljdCBpcyBpbiBmb3JjZSByaWdodCBub3cuXG4gICAqXG4gICAqIFRoZSBwcmVkaWNhdGUgYSBkZWNsYXJhdGl2ZSBzZXR0aW5ncyB0YWIgbmVlZHMsIGFuZCB0aGUgY291bnRlcnBhcnQgdG9cbiAgICogYFBsdWdpblN1Z2dlc3Rpb25Db21wb25lbnQuZ2V0U3VnZ2VzdGVkUGx1Z2luU3RhdGVgLiBTdWNoIGEgdGFiIGRlY2lkZXMgd2hldGhlciBhIHJvdyBleGlzdHNcbiAgICogQkVGT1JFIGl0IHJlbmRlcnMgYW55dGhpbmcgaW50byBpdCwgc28ge0BsaW5rIHJlbmRlckNvbmZsaWN0V2FybmluZ0Jhbm5lcn0gd3JpdGluZyBub3RoaW5nIGNhbm5vdFxuICAgKiBhbnN3ZXIgdGhlIHF1ZXN0aW9uIGZvciBpdCDigJQgYSByb3cgdGhhdCByZW5kZXJzIGVtcHR5IGlzIHN0aWxsIGEgcm93LCB3aXRoIHRoZSBkaXZpZGVyIGFuZCBwYWRkaW5nXG4gICAqIGV2ZXJ5IG90aGVyIHNldHRpbmcgaGFzLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIGF0IGxlYXN0IG9uZSBkZWNsYXJlZCB3YXJuaW5nIGNvbmZsaWN0IGhvbGRzLlxuICAgKi9cbiAgcHVibGljIGhhc0FjdGl2ZVdhcm5pbmdDb25mbGljdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuV2FybikubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgd2F0Y2hpbmcgZXZlcnkgZGVjbGFyZWQgZGVwZW5kZW5jeSBhbmQgY29uZmxpY3QuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuICAgICAgY29uc3QgYXBpUmVmID0gd2F0Y2hQbHVnaW5BcGk8b2JqZWN0Pih7XG4gICAgICAgIGFwaVZlcnNpb25SYW5nZTogZGVwZW5kZW5jeS5hcGlWZXJzaW9uUmFuZ2UsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWRcbiAgICAgIH0pO1xuICAgICAgcmVnaXN0ZXJBc3luY0V2ZW50KFxuICAgICAgICB0aGlzLFxuICAgICAgICBhcGlSZWYub24oJ2NoYW5nZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLmFwaVJlZnMuc2V0KGRlcGVuZGVuY3kucGx1Z2luSWQsIGFwaVJlZik7XG4gICAgfVxuXG4gICAgLy8gQSBjb25mbGljdCBoYXMgbm8gQVBJIHRvIHdhdGNoIOKAlCBpdCBpcyByZWFkIG91dCBvZiB0aGUgbWFuaWZlc3RzIOKAlCBzbyB0aGUgdHJpZ2dlciB0byByZS1yZWFkIGlzIHRoZVxuICAgIC8vIGxpYnJhcnkncyBvd24gbGlmZWN5Y2xlIGJyb2FkY2FzdC4gSXQgY292ZXJzIGV2ZXJ5IGNvbmZsaWN0aW5nIHBsdWdpbiBidWlsdCBvbiB0aGlzIGxpYnJhcnk7IG9uZVxuICAgIC8vIHRoYXQgaXMgbm90IGlzIGNhdWdodCBhdCB0aGUgbmV4dCBsb2FkLCBhcyB0aGUgZmlsZSBoZWFkZXIgc2F5cy5cbiAgICBjb25zdCBsaWZlY3ljbGVFdmVudE5hbWVzOiBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWVbXSA9IFtQTFVHSU5fTE9BREVEX0VWRU5UX05BTUUsIFBMVUdJTl9VTkxPQURFRF9FVkVOVF9OQU1FXTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBvZiBsaWZlY3ljbGVFdmVudE5hbWVzKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKFxuICAgICAgICBldmVudE5hbWUsXG4gICAgICAgIGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAocGF5bG9hZDogUGx1Z2luTGlmZWN5Y2xlRXZlbnRQYXlsb2FkKSA9PiB7XG4gICAgICAgICAgaWYgKHBheWxvYWQucGx1Z2luSWQgPT09IHRoaXMucGx1Z2luLm1hbmlmZXN0LmlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICB9XG5cbiAgICAvLyBOb3RoaW5nIGlzIFNBSUQgYWJvdXQgYSBtaXNzaW5nIGRlcGVuZGVuY3kgdW50aWwgdGhlIGxheW91dCBpcyByZWFkeS4gUGx1Z2lucyBsb2FkIGluIGFuIHVuc3BlY2lmaWVkXG4gICAgLy8gb3JkZXIsIHNvIGEgZGVwZW5kZW5jeSB0aGF0IHNpbXBseSBoYXMgbm90IGxvYWRlZCB5ZXQgaXMgaW5kaXN0aW5ndWlzaGFibGUgYXQgdGhpcyBwb2ludCBmcm9tIG9uZVxuICAgIC8vIHRoYXQgaXMgbm90IGluc3RhbGxlZCDigJQgYW5ub3VuY2luZyBoZXJlIHdvdWxkIHB1dCBhIFwibWlzc2luZyBwbHVnaW5cIiBub3RpY2Ugb24gc2NyZWVuIGF0IGV2ZXJ5XG4gICAgLy8gc3RhcnR1cCBhbmQgdGFrZSBpdCBhd2F5IGEgbW9tZW50IGxhdGVyLiBUaGUgZ2F0ZSBpdHNlbGYgZG9lcyBub3Qgd2FpdDogdGhlIHN1cmZhY2UgbG9hZHMgdGhlXG4gICAgLy8gaW5zdGFudCB0aGUgZGVwZW5kZW5jeSBpcyB0aGVyZSwgd2hlbmV2ZXIgdGhhdCBpcy5cbiAgICB0aGlzLmFkZENoaWxkKFxuICAgICAgbmV3IENhbGxiYWNrTGF5b3V0UmVhZHlDb21wb25lbnQodGhpcy5hcHAsICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0xheW91dFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcmVzZW50VW5zYXRpc2ZpZWQodGhpcy5nZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpLCB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5LkJsb2NrKSk7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VXYXJuaW5ncygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlcigoKSA9PiB7XG4gICAgICB0aGlzLmNhbmNlbExvc3NBbm5vdW5jZW1lbnQoKTtcbiAgICAgIHRoaXMuaGlkZUJsb2NrZWRTZXR0aW5nVGFiKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIHRoZSBnYXRlIG9uY2UgdGhlIHdhdGNoZXMgYXJlIGluIHBsYWNlLCBsb2FkaW5nIHRoZSBmZWF0dXJlIHN1cmZhY2UgaWYgaXQgaXMgYWxyZWFkeSBvcGVuLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGZpcnN0IGV2YWx1YXRpb24gaXMgY29tcGxldGUuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgb25sb2FkQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBhIGJhbm5lciBmb3IgZXZlcnkgY29uZmxpY3QgdGhlIGhvc3QgaXMgcnVubmluZyBhbG9uZ3NpZGUsIHNvIGEgcGx1Z2luIGNhbiBwdXQgdGhlIG92ZXJsYXAgaW5cbiAgICogaXRzIG93biBzZXR0aW5ncyB0YWIuXG4gICAqXG4gICAqIENvbnN1bWVyLWludm9rZWQsIGV4YWN0bHkgbGlrZSBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudC5yZW5kZXJCYW5uZXJgOiB0aGUgbGlicmFyeSByZWdpc3RlcnMgdGhlXG4gICAqIHNldHRpbmdzIHRhYiBhIEJMT0NLRUQgcGx1Z2luIG5lZWRzLCBiZWNhdXNlIHRoYXQgcGx1Z2luIG5ldmVyIGdvdCB0byByZWdpc3RlciBvbmUgb2YgaXRzIG93biwgYnV0IGl0XG4gICAqIGhhcyBubyBob29rIGludG8gdGhlIHRhYiBhIHJ1bm5pbmcgcGx1Z2luIGJ1aWxkcy4gUmVuZGVycyBub3RoaW5nIHdoZW4gbm8gd2FybmluZyBjb25mbGljdCBob2xkcy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyQ29uZmxpY3RXYXJuaW5nQmFubmVyKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY29uZmxpY3Qgb2YgdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKSkge1xuICAgICAgdGhpcy5yZW5kZXJDb25mbGljdEVudHJ5KGNvbnRhaW5lckVsLCBjb25mbGljdCwgdGhpcy5jcmVhdGVDb25mbGljdFdhcm5pbmdNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgd2hhdCB3ZW50IGF3YXkgd2hpbGUgdGhlIHBsdWdpbiB3YXMgcnVubmluZywgbm93IHRoYXQgdGhlIGdyYWNlIHBlcmlvZCBpcyBvdmVyLlxuICAgKlxuICAgKiBSZS1yZWFkcyB0aGUgZ2F0ZSByYXRoZXIgdGhhbiB0cnVzdGluZyB3aGF0IGNsb3NlZCBpdCwgc28gYSBkZXBlbmRlbmN5IHRoYXQgd2VudCBhd2F5IGR1cmluZyB0aGVcbiAgICogd2luZG93IGlzIGFubm91bmNlZCB3aXRoIHRoZSByZXN0LiBPbmUgdGhhdCBjYW1lIGJhY2sgaW4gdGltZSBuZXZlciBnZXRzIGhlcmU6IHRoZSBnYXRlIHJlb3BlbmluZ1xuICAgKiBjYW5jZWxzIHRoZSB0aW1lci5cbiAgICovXG4gIHByaXZhdGUgYW5ub3VuY2VMb3NzKCk6IHZvaWQge1xuICAgIHRoaXMubG9zc0Fubm91bmNlbWVudFRpbWVySWQgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHRoaXMuZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKSkge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZURlcGVuZGVuY3lMb3N0TWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5LkJsb2NrKSkge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUNvbmZsaWN0QXBwZWFyZWRNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhbm5vdW5jZVdhcm5pbmdzKCk6IHZvaWQge1xuICAgIC8vIEEgd2FybmluZyBkZXNjcmliZXMgdHdvIHBsdWdpbnMgdGhhdCBhcmUgYm90aCBSVU5OSU5HLCBzbyBpdCBpcyBwb2ludGxlc3Mgd2hpbGUgdGhpcyBvbmUgaXMgYmxvY2tlZFxuICAgIC8vIOKAlCBhbmQgaXQgd2FpdHMgZm9yIGxheW91dC1yZWFkeSBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBibG9ja2VkIG5vdGljZSBkb2VzLlxuICAgIGlmICghdGhpcy5pc0xheW91dFJlYWR5IHx8ICF0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuV2FybikpIHtcbiAgICAgIGlmICh0aGlzLmFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMuaGFzKGNvbmZsaWN0LnBsdWdpbklkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hbm5vdW5jZWRXYXJuaW5nUGx1Z2luSWRzLmFkZChjb25mbGljdC5wbHVnaW5JZCk7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlQ29uZmxpY3RXYXJuaW5nTWVzc2FnZShjb25mbGljdCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCk7XG4gICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBpZiAodGhpcy5pc1Rvb09sZChkZXBlbmRlbmN5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVmVyc2lvbk1pc21hdGNoTWVzc2FnZShkZXBlbmRlbmN5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkRlcGVuZGVuY3kuYmxvY2tlZE5vdGljZSwge1xuICAgICAgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGRlcGVuZGVuY3kucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29uZmxpY3RBcHBlYXJlZE1lc3NhZ2UoY29uZmxpY3Q6IFBsdWdpbkNvbmZsaWN0KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5Db25mbGljdC5jb25mbGljdEFwcGVhcmVkTm90aWNlLCB7XG4gICAgICBjb25mbGljdGluZ1BsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGNvbmZsaWN0LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3Q6IFBsdWdpbkNvbmZsaWN0KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5Db25mbGljdC5ibG9ja2VkTm90aWNlLCB7XG4gICAgICBjb25mbGljdGluZ1BsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGNvbmZsaWN0LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbmZsaWN0V2FybmluZ01lc3NhZ2UoY29uZmxpY3Q6IFBsdWdpbkNvbmZsaWN0KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5Db25mbGljdC53YXJuaW5nTm90aWNlLCB7XG4gICAgICBjb25mbGljdGluZ1BsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGNvbmZsaWN0LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlcGVuZGVuY3lMb3N0TWVzc2FnZShkZXBlbmRlbmN5OiBQbHVnaW5EZXBlbmRlbmN5KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgaWYgKHRoaXMuaXNUb29PbGQoZGVwZW5kZW5jeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVZlcnNpb25NaXNtYXRjaE1lc3NhZ2UoZGVwZW5kZW5jeSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5LmRlcGVuZGVuY3lMb3N0Tm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkRlcGVuZGVuY3kudmVyc2lvbk1pc21hdGNoTm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBkZWNsYXJlZCBjb25mbGljdHMgb2Ygb25lIHNldmVyaXR5IHRoYXQgYXJlIGN1cnJlbnRseSBpbiBmb3JjZS5cbiAgICpcbiAgICogQHBhcmFtIHNldmVyaXR5IC0gVGhlIHNldmVyaXR5IHRvIHNlbGVjdC5cbiAgICogQHJldHVybnMgVGhlIGNvbmZsaWN0cyBob2xkaW5nIHJpZ2h0IG5vdywgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWNsYXJlZC5cbiAgICovXG4gIHByaXZhdGUgZ2V0QWN0aXZlQ29uZmxpY3RzKHNldmVyaXR5OiBQbHVnaW5Db25mbGljdFNldmVyaXR5KTogUGx1Z2luQ29uZmxpY3RbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmxpY3RzLmZpbHRlcigoY29uZmxpY3QpID0+IGNvbmZsaWN0LnNldmVyaXR5ID09PSBzZXZlcml0eSAmJiB0aGlzLmlzQ29uZmxpY3RBY3RpdmUoY29uZmxpY3QpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKTogUGx1Z2luRGVwZW5kZW5jeVtdIHtcbiAgICByZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXBlbmRlbmN5KSA9PiAhdGhpcy5hcGlSZWZzLmdldChkZXBlbmRlbmN5LnBsdWdpbklkKT8udmFsdWUgfHwgdGhpcy5pc0JlbG93TWluUGx1Z2luVmVyc2lvbihkZXBlbmRlbmN5KSk7XG4gIH1cblxuICBwcml2YXRlIGhpZGVCbG9ja2VkU2V0dGluZ1RhYigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYmxvY2tlZFNldHRpbmdUYWIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFwcC5zZXR0aW5nLnJlbW92ZVNldHRpbmdUYWIodGhpcy5ibG9ja2VkU2V0dGluZ1RhYik7XG4gICAgdGhpcy5ibG9ja2VkU2V0dGluZ1RhYiA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGF0IGEgcmVsZWFzZSBvbGRlciB0aGFuIGl0IGRlY2xhcmVkIGl0IG5lZWRzLlxuICAgKlxuICAgKiBSZWFkIGZyb20gdGhlIG1hbmlmZXN0LCBsaWtlIGEgY29uZmxpY3QsIGFuZCByZS1yZWFkIG9uIGV2ZXJ5IGV2YWx1YXRpb246IE9ic2lkaWFuIGFwcGxpZXMgYW4gdXBkYXRlIGJ5XG4gICAqIHJlbG9hZGluZyB0aGUgcHJvdmlkZXIsIHdoaWNoIGZpcmVzIHRoZSBBUEkgd2F0Y2gncyBgY2hhbmdlYCwgc28gdGhlIGdhdGUgb3BlbnMgd2l0aG91dCBhIHJlc3RhcnQuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBlbmRlbmN5IC0gVGhlIGRlY2xhcmVkIGRlcGVuZGVuY3kuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGRlcGVuZGVuY3kgaXMgZW5hYmxlZCBiZWxvdyBpdHMge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3kubWluUGx1Z2luVmVyc2lvbn07IGBmYWxzZWBcbiAgICogd2hlbiBpdCBkZWNsYXJlcyBub25lIG9yIGlzIG5vdCBlbmFibGVkLCBzaW5jZSBpdHMgQVBJIGlzIHRoZW4gYWJzZW50IGFueXdheS5cbiAgICovXG4gIHByaXZhdGUgaXNCZWxvd01pblBsdWdpblZlcnNpb24oZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IGJvb2xlYW4ge1xuICAgIGlmIChkZXBlbmRlbmN5Lm1pblBsdWdpblZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSBnZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZFxuICAgIH0pO1xuXG4gICAgaWYgKGluc3RhbGxlZFZlcnNpb24gPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuICFjb21wYXJlVmVyc2lvbnMoaW5zdGFsbGVkVmVyc2lvbiwgZGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9uLCAnPj0nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgb25lIGRlY2xhcmVkIGNvbmZsaWN0IGlzIGluIGZvcmNlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogT25seSBhbiBFTkFCTEVEIHBsdWdpbiBjb3VudHMuIE9uZSB0aGF0IGlzIGluc3RhbGxlZCBidXQgc3dpdGNoZWQgb2ZmIHJlZ2lzdGVycyBub3RoaW5nLCBzbyBpdCBjYW5ub3RcbiAgICogY29sbGlkZSwgYW5kIGFjdGluZyBvbiBpdCB3b3VsZCBiZSBhbiBhbGFybSB0aGUgdXNlciBjYW4gb25seSBhbnN3ZXIgYnkgdW5pbnN0YWxsaW5nIHNvbWV0aGluZyB0aGV5XG4gICAqIGhhdmUgYWxyZWFkeSB0dXJuZWQgb2ZmLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmxpY3QgLSBUaGUgZGVjbGFyZWQgY29uZmxpY3QuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNvbmZsaWN0aW5nIHBsdWdpbiBpcyBlbmFibGVkIGF0IGEgY29uZmxpY3RpbmcgdmVyc2lvbi5cbiAgICovXG4gIHByaXZhdGUgaXNDb25mbGljdEFjdGl2ZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbnN0YWxsZWRWZXJzaW9uID0gZ2V0SW5zdGFsbGVkUGx1Z2luVmVyc2lvbih7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgcGx1Z2luSWQ6IGNvbmZsaWN0LnBsdWdpbklkXG4gICAgfSk7XG5cbiAgICBpZiAoaW5zdGFsbGVkVmVyc2lvbiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc2F0aXNmaWVzVmVyc2lvbihpbnN0YWxsZWRWZXJzaW9uLCBjb25mbGljdC5jb25mbGljdGluZ1ZlcnNpb25SYW5nZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGJ1dCB0b28gb2xkIGZvciB0aGlzIHBsdWdpbiwgc28gdGhlIGFkdmljZSBpcyBcInVwZGF0ZSBpdFwiLlxuICAgKlxuICAgKiBUd28gaW5kZXBlbmRlbnQgc2lnbmFscyBzYXkgc286IGEgcmVsZWFzZSBiZWxvdyB7QGxpbmsgUGx1Z2luRGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9ufSwgYW5kIGEgcHVibGlzaGVkXG4gICAqIEFQSSB3aG9zZSBjb250cmFjdCB2ZXJzaW9uIGlzIG91dHNpZGUge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3kuYXBpVmVyc2lvblJhbmdlfS5cbiAgICpcbiAgICogQHBhcmFtIGRlcGVuZGVuY3kgLSBUaGUgZGVjbGFyZWQgZGVwZW5kZW5jeS5cbiAgICogQHJldHVybnMgV2hldGhlciB1cGRhdGluZyB0aGUgZGVwZW5kZW5jeSBpcyB3aGF0IGl0IG5lZWRzLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1Rvb09sZChkZXBlbmRlbmN5OiBQbHVnaW5EZXBlbmRlbmN5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNCZWxvd01pblBsdWdpblZlcnNpb24oZGVwZW5kZW5jeSlcbiAgICAgIHx8IHRoaXMuYXBpUmVmcy5nZXQoZGVwZW5kZW5jeS5wbHVnaW5JZCk/LnVuYXZhaWxhYmlsaXR5UmVhc29uID09PSBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbi5WZXJzaW9uTWlzbWF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogU2F5cyB3aGF0IGlzIGluIHRoZSB3YXksIGFuZCBwdXRzIHRoZSBzYW1lIGV4cGxhbmF0aW9uIHdoZXJlIHRoZSB1c2VyIHdpbGwgbG9vayBmb3IgdGhlIHBsdWdpbidzXG4gICAqIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMgLSBUaGUgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgc2F0aXNmaWVkLlxuICAgKiBAcGFyYW0gYmxvY2tpbmdDb25mbGljdHMgLSBUaGUgY29uZmxpY3RzIGN1cnJlbnRseSByZWZ1c2luZyB0aGUgcGx1Z2luIHRoZSByaWdodCB0byBydW4uXG4gICAqL1xuICBwcml2YXRlIHByZXNlbnRVbnNhdGlzZmllZChcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0xheW91dFJlYWR5IHx8ICh1bnNhdGlzZmllZERlcGVuZGVuY2llcy5sZW5ndGggPT09IDAgJiYgYmxvY2tpbmdDb25mbGljdHMubGVuZ3RoID09PSAwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0Jsb2NrZWRTZXR0aW5nVGFiKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLCBibG9ja2luZ0NvbmZsaWN0cyk7XG5cbiAgICBpZiAodGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodGhpcy5jcmVhdGVCbG9ja2VkTWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiBibG9ja2luZ0NvbmZsaWN0cykge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmUtZXZhbHVhdGVzIHRoZSBnYXRlIGFuZCBtb3ZlcyB0aGUgZmVhdHVyZSBzdXJmYWNlIHRvIG1hdGNoLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHN1cmZhY2UgbWF0Y2hlcyB0aGUgZ2F0ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1bnNhdGlzZmllZERlcGVuZGVuY2llcyA9IHRoaXMuZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKTtcbiAgICBjb25zdCBibG9ja2luZ0NvbmZsaWN0cyA9IHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuQmxvY2spO1xuXG4gICAgaWYgKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCAmJiBibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpO1xuICAgICAgdGhpcy5oaWRlQmxvY2tlZFNldHRpbmdUYWIoKTtcbiAgICAgIHRoaXMuaGFzQW5ub3VuY2VkQmxvY2tlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoIXRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCkge1xuICAgICAgICB0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRGZWF0dXJlU3VyZmFjZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFubm91bmNlV2FybmluZ3MoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0ZlYXR1cmVTdXJmYWNlTG9hZGVkKSB7XG4gICAgICB0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMudW5sb2FkRmVhdHVyZVN1cmZhY2UoKTtcblxuICAgICAgLy8gQSBnYXRlIHRoYXQgY2xvc2VzIHdoaWxlIHRoZSBwbHVnaW4gaXMgUlVOTklORyBpcyB0aGUgY2FzZSB3b3J0aCBiZWluZyBsb3VkIGFib3V0OiB0aGUgdXNlciBqdXN0XG4gICAgICAvLyBkaWQgc29tZXRoaW5nLCBhbmQgdGhlIGNvbnNlcXVlbmNlIGlzIGltbWVkaWF0ZSBhbmQgaW52aXNpYmxlIHdpdGhvdXQgdGhpcy4gQW5ub3VuY2VkIHJlZ2FyZGxlc3NcbiAgICAgIC8vIG9mIGxheW91dCByZWFkaW5lc3MsIGJlY2F1c2UgYSBydW5uaW5nIHBsdWdpbiBtZWFucyB0aGUgbGF5b3V0IGlzIGxvbmcgc2luY2UgcmVhZHkg4oCUIGJ1dCBvbmx5XG4gICAgICAvLyBvbmNlIHRoZSBncmFjZSBwZXJpb2QgaGFzIHNob3duIHRoZSBsb3NzIGlzIG5vdCBhbiB1cGRhdGUgcmVsb2FkaW5nIHRoZSBwcm92aWRlciAoc2VlIHRoZSBmaWxlXG4gICAgICAvLyBoZWFkZXIpLlxuICAgICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hbm5vdW5jZUxvc3MoKTtcbiAgICAgIH0sIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgICB0aGlzLmhhc0Fubm91bmNlZEJsb2NrZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zaG93QmxvY2tlZFNldHRpbmdUYWIodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMsIGJsb2NraW5nQ29uZmxpY3RzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByZXNlbnRVbnNhdGlzZmllZCh1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGJsb2NrZWQgZXhwbGFuYXRpb24gaW50byBhIHNldHRpbmdzLXRhYiBjb250YWluZXI6IHdoYXQgaXMgbWlzc2luZyBvciBpbiB0aGUgd2F5LCB3aHkgaXRcbiAgICogbWF0dGVycywgYW5kIHRoZSBidXR0b24gdGhhdCBmaXhlcyBpdC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqIEBwYXJhbSB1bnNhdGlzZmllZERlcGVuZGVuY2llcyAtIFRoZSBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBzYXRpc2ZpZWQuXG4gICAqIEBwYXJhbSBibG9ja2luZ0NvbmZsaWN0cyAtIFRoZSBjb25mbGljdHMgY3VycmVudGx5IHJlZnVzaW5nIHRoZSBwbHVnaW4gdGhlIHJpZ2h0IHRvIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQmxvY2tlZEJhbm5lcihcbiAgICBjb250YWluZXJFbDogSFRNTEVsZW1lbnQsXG4gICAgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXM6IHJlYWRvbmx5IFBsdWdpbkRlcGVuZGVuY3lbXSxcbiAgICBibG9ja2luZ0NvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXVxuICApOiB2b2lkIHtcbiAgICBpZiAodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkRlcGVuZGVuY3kuc2V0dGluZ3NIZWFkaW5nKSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMpIHtcbiAgICAgIGNvbnN0IGJhbm5lckVsID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KHtcbiAgICAgICAgY2xzOiBbQ3NzQ2xhc3MuTGlicmFyeU5hbWUsIENzc0NsYXNzLlBsdWdpbkRlcGVuZGVuY3lCYW5uZXJdXG4gICAgICB9KTtcbiAgICAgIGJhbm5lckVsLmFwcGVuZCh0aGlzLmNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3kpKTtcbiAgICAgIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUoYmFubmVyRWwuY3JlYXRlRGl2KCksIGRlcGVuZGVuY3kucmVhc29uKTtcblxuICAgICAgY29uc3Qgc3RhdGUgPSBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkXG4gICAgICB9KTtcblxuICAgICAgLy8gQW4gZW5hYmxlZCBkZXBlbmRlbmN5IHRoYXQgaXMgc3RpbGwgdW5zYXRpc2ZpZWQgaXMgdG9vIG9sZCwgYW5kIGluc3RhbGxpbmcgb3IgZW5hYmxpbmcgaXQgYWdhaW4gZG9lc1xuICAgICAgLy8gbm90aGluZywgc28gaXQgaXMgb2ZmZXJlZCBhbiB1cGRhdGUgaW5zdGVhZC5cbiAgICAgIGlmIChzdGF0ZSAhPT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuRW5hYmxlZCkge1xuICAgICAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+XG4gICAgICAgICAgICBzdGF0ZSA9PT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuSW5zdGFsbGVkQnV0RGlzYWJsZWRcbiAgICAgICAgICAgICAgPyAkLm9ic2lkaWFuTGliLnBsdWdpblN1Z2dlc3Rpb24uZW5hYmxlXG4gICAgICAgICAgICAgIDogJC5vYnNpZGlhbkxpYi5wbHVnaW5TdWdnZXN0aW9uLmluc3RhbGxcbiAgICAgICAgICApKVxuICAgICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBpbnN0YWxsQW5kRW5hYmxlUGx1Z2luKHtcbiAgICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWQsXG4gICAgICAgICAgICAgIHBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSxcbiAgICAgICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gT2JzaWRpYW4gYXBwbGllcyB0aGUgdXBkYXRlIGJ5IHJlbG9hZGluZyB0aGUgZGVwZW5kZW5jeSwgd2hpY2ggcmVwdWJsaXNoZXMgaXRzIEFQSSwgc28gdGhlIHdhdGNoJ3NcbiAgICAgIC8vIGBjaGFuZ2VgIHJlb3BlbnMgdGhlIGdhdGUgd2l0aCBubyBmdXJ0aGVyIHN0ZXAgaGVyZS5cbiAgICAgIG5ldyBCdXR0b25Db21wb25lbnQoYmFubmVyRWwpXG4gICAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS51cGRhdGUsIHsgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSB9KSlcbiAgICAgICAgLnNldEN0YSgpXG4gICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdXBkYXRlUGx1Z2luKHtcbiAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZCxcbiAgICAgICAgICAgIHBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSxcbiAgICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgICByZXF1ZXN0aW5nUGx1Z2luTmFtZTogdGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG5cbiAgICAgIC8vIFRoZSBsaW5rIE9VVCB0byB0aGUgZGVwZW5kZW5jeSdzIG93biBzZXR0aW5ncywgc2hvd24gb25seSBvbmNlIGl0IGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZCDigJQgdGhlXG4gICAgICAvLyBvdGhlciBoYWxmIG9mIHRoZSByZWxhdGlvbnNoaXAgYmVpbmcgdmlzaWJsZSBmcm9tIGJvdGggZW5kcy4gSXQgaXMgd2hhdCBzdG9wcyBcImNvbmZpZ3VyZSBvbmVcbiAgICAgIC8vIG9wZXJhdGlvbiBhY3Jvc3MgdHdvIHBsdWdpbnNcIiBmcm9tIG1lYW5pbmcgXCJnbyBhbmQgZmluZCB0aGUgb3RoZXIgcGx1Z2luIHlvdXJzZWxmXCIuXG4gICAgICB0aGlzLnJlbmRlck9wZW5TZXR0aW5nc0J1dHRvbihiYW5uZXJFbCwgZGVwZW5kZW5jeS5wbHVnaW5JZCwgZGVwZW5kZW5jeS5wbHVnaW5OYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoYmxvY2tpbmdDb25mbGljdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0LnNldHRpbmdzSGVhZGluZykgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIGJsb2NraW5nQ29uZmxpY3RzKSB7XG4gICAgICB0aGlzLnJlbmRlckNvbmZsaWN0RW50cnkoY29udGFpbmVyRWwsIGNvbmZsaWN0LCB0aGlzLmNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBvbmUgY29uZmxpY3Q6IHdoYXQgaXQgaXMsIHdoeSBpdCBtYXR0ZXJzLCBhbmQgdGhlIHR3byB3YXlzIG91dCBvZiBpdC5cbiAgICpcbiAgICogVGhlIHJlcGFpciBpcyBvZmZlcmVkIG9uIHRoZSBPVEhFUiBwbHVnaW4g4oCUIGRpc2FibGluZyBpdCBpcyB0aGUgb25lIHRoaW5nIHRoaXMgcGx1Z2luIGNhbiBkbyBpbiBhXG4gICAqIGNsaWNrLCBzaW5jZSBpdCBjYW5ub3QgdXBkYXRlIHNvbWVvbmUgZWxzZSdzIHBsdWdpbiDigJQgYW5kIGl0IGlzIHRoZSBwZXJzaXN0ZWQgYGRpc2FibGVQbHVnaW5BbmRTYXZlYFxuICAgKiByYXRoZXIgdGhhbiB0aGUgdHJhbnNpZW50IGRpc2FibGUsIGJlY2F1c2UgdGhlIHVzZXIgYXNrZWQgZm9yIGl0IGJ5IGNsaWNraW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgZWxlbWVudCB0byByZW5kZXIgaW50by5cbiAgICogQHBhcmFtIGNvbmZsaWN0IC0gVGhlIGNvbmZsaWN0IHRvIHJlbmRlci5cbiAgICogQHBhcmFtIG1lc3NhZ2VGcmFnbWVudCAtIFRoZSBzZW50ZW5jZSBleHBsYWluaW5nIHRoZSBjb25mbGljdC5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQ29uZmxpY3RFbnRyeShjb250YWluZXJFbDogSFRNTEVsZW1lbnQsIGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCwgbWVzc2FnZUZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KTogdm9pZCB7XG4gICAgY29uc3QgYmFubmVyRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoe1xuICAgICAgY2xzOiBbQ3NzQ2xhc3MuTGlicmFyeU5hbWUsIENzc0NsYXNzLlBsdWdpbkNvbmZsaWN0QmFubmVyXVxuICAgIH0pO1xuICAgIGJhbm5lckVsLmFwcGVuZChtZXNzYWdlRnJhZ21lbnQpO1xuICAgIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUoYmFubmVyRWwuY3JlYXRlRGl2KCksIGNvbmZsaWN0LnJlYXNvbik7XG5cbiAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5Db25mbGljdC5kaXNhYmxlLCB7IGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogY29uZmxpY3QucGx1Z2luTmFtZSB9KSlcbiAgICAgIC5zZXRDdGEoKVxuICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZGlzYWJsZUNvbW11bml0eVBsdWdpbih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5JZDogY29uZmxpY3QucGx1Z2luSWRcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuICAgICAgfSkpO1xuXG4gICAgdGhpcy5yZW5kZXJPcGVuU2V0dGluZ3NCdXR0b24oYmFubmVyRWwsIGNvbmZsaWN0LnBsdWdpbklkLCBjb25mbGljdC5wbHVnaW5OYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyT3BlblNldHRpbmdzQnV0dG9uKGJhbm5lckVsOiBIVE1MRWxlbWVudCwgcGx1Z2luSWQ6IHN0cmluZywgcGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbmV3IEJ1dHRvbkNvbXBvbmVudChiYW5uZXJFbClcbiAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5vcGVuRGVwZW5kZW5jeVNldHRpbmdzLCB7XG4gICAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBwbHVnaW5OYW1lXG4gICAgICB9KSlcbiAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHAuc2V0dGluZy5vcGVuKCk7XG4gICAgICAgIHRoaXMuYXBwLnNldHRpbmcub3BlblRhYkJ5SWQocGx1Z2luSWQpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dCbG9ja2VkU2V0dGluZ1RhYihcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJsb2NrZWRTZXR0aW5nVGFiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWRkZWQgdGhyb3VnaCBgYXBwLnNldHRpbmdgIHJhdGhlciB0aGFuIGBwbHVnaW4uYWRkU2V0dGluZ1RhYmAsIGJlY2F1c2UgdGhpcyB0YWIgaGFzIHRvIGNvbWUgYmFja1xuICAgIC8vIE9GRiBhZ2FpbiB0aGUgbW9tZW50IHRoZSBnYXRlIG9wZW5zIOKAlCBvdGhlcndpc2UgdGhlIHBsdWdpbidzIG93biBzZXR0aW5ncyB0YWIsIHJlZ2lzdGVyZWQgYnlcbiAgICAvLyBgb25sb2FkSW1wbGAsIHdvdWxkIGFwcGVhciBiZXNpZGUgYSBzdGFsZSBcInJlcXVpcmVkIHBsdWdpbiBtaXNzaW5nXCIgb25lLiBgcGx1Z2luLmFkZFNldHRpbmdUYWJgXG4gICAgLy8gb25seSBldmVyIHJlbW92ZXMgYXQgcGx1Z2luIHVubG9hZC5cbiAgICBjb25zdCBibG9ja2VkU2V0dGluZ1RhYiA9IG5ldyBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYih7XG4gICAgICBwbHVnaW46IHRoaXMucGx1Z2luLFxuICAgICAgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWwpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJCbG9ja2VkQmFubmVyKGNvbnRhaW5lckVsLCB1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuYXBwLnNldHRpbmcuYWRkU2V0dGluZ1RhYihibG9ja2VkU2V0dGluZ1RhYik7XG4gICAgdGhpcy5ibG9ja2VkU2V0dGluZ1RhYiA9IGJsb2NrZWRTZXR0aW5nVGFiO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEZBLFNBQVMsMEJBQTBCO0FBQ25DO0FBQUEsRUFDRSxXQUFXO0FBQUEsRUFDWCxhQUFhO0FBQUEsT0FDUjtBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBU1AsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyxnQkFBZ0I7QUFDekI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxTQUFTO0FBQ2xCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsb0NBQW9DO0FBUTdDLE1BQU0saURBQWlEO0FBS2hELElBQUsseUJBQUwsa0JBQUtBLDRCQUFMO0FBT0wsRUFBQUEsd0JBQUEsV0FBUTtBQVFSLEVBQUFBLHdCQUFBLFVBQU87QUFmRyxTQUFBQTtBQUFBLEdBQUE7QUEwS1osTUFBTSxnQ0FBZ0MsaUJBQWlCO0FBQUEsRUFDcEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVixZQUFZLFFBQWtEO0FBQ25FLFVBQU0sT0FBTyxPQUFPLEtBQUssT0FBTyxNQUFNO0FBQ3RDLFNBQUssZUFBZSxPQUFPO0FBQUEsRUFDN0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtnQixVQUFnQjtBQUM5QixTQUFLLFlBQVksTUFBTTtBQUN2QixTQUFLLGFBQWEsS0FBSyxXQUFXO0FBQUEsRUFDcEM7QUFDRjtBQUtPLE1BQU0sNEJBQTRCLFlBQVk7QUFBQSxFQUNsQyw0QkFBNEIsb0JBQUksSUFBWTtBQUFBLEVBQzVDLFVBQVUsb0JBQUksSUFBa0M7QUFBQSxFQUN6RCxvQkFBNkM7QUFBQSxFQUNwQztBQUFBLEVBQ0E7QUFBQSxFQUNULHNCQUFzQjtBQUFBLEVBQ3RCLHlCQUF5QjtBQUFBLEVBQ3pCLGdCQUFnQjtBQUFBLEVBQ1A7QUFBQSxFQUNULDBCQUF5QztBQUFBLEVBQ2hDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUVqQixJQUFZLE1BQVc7QUFDckIsV0FBTyxLQUFLLE9BQU87QUFBQSxFQUNyQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFlBQVksUUFBOEM7QUFDL0QsVUFBTTtBQUNOLFNBQUssWUFBWSxPQUFPO0FBQ3hCLFNBQUssZUFBZSxPQUFPO0FBQzNCLFNBQUsscUJBQXFCLE9BQU87QUFDakMsU0FBSyxTQUFTLE9BQU87QUFDckIsU0FBSyx3QkFBd0IsT0FBTztBQUNwQyxTQUFLLHVCQUF1QixPQUFPO0FBQUEsRUFDckM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFhTyw0QkFBcUM7QUFDMUMsV0FBTyxLQUFLLG1CQUFtQixpQkFBMkIsRUFBRSxTQUFTO0FBQUEsRUFDdkU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtnQixTQUFlO0FBQzdCLGVBQVcsY0FBYyxLQUFLLGNBQWM7QUFDMUMsWUFBTSxTQUFTLGVBQXVCO0FBQUEsUUFDcEMsaUJBQWlCLFdBQVc7QUFBQSxRQUM1QixLQUFLLEtBQUs7QUFBQSxRQUNWLFdBQVc7QUFBQSxRQUNYLFVBQVUsV0FBVztBQUFBLE1BQ3ZCLENBQUM7QUFDRDtBQUFBLFFBQ0U7QUFBQSxRQUNBLE9BQU8sR0FBRyxVQUFVLFlBQVk7QUFDOUIsZ0JBQU0sS0FBSyxRQUFRO0FBQUEsUUFDckIsQ0FBQztBQUFBLE1BQ0g7QUFDQSxXQUFLLFFBQVEsSUFBSSxXQUFXLFVBQVUsTUFBTTtBQUFBLElBQzlDO0FBS0EsVUFBTSxzQkFBa0QsQ0FBQywwQkFBMEIsMEJBQTBCO0FBQzdHLGVBQVcsYUFBYSxxQkFBcUI7QUFDM0MsV0FBSyxjQUFjLEtBQUssSUFBSSxVQUFVO0FBQUEsUUFDcEM7QUFBQSxRQUNBLG1CQUFtQixPQUFPLFlBQXlDO0FBQ2pFLGNBQUksUUFBUSxhQUFhLEtBQUssT0FBTyxTQUFTLElBQUk7QUFDaEQ7QUFBQSxVQUNGO0FBRUEsZ0JBQU0sS0FBSyxRQUFRO0FBQUEsUUFDckIsQ0FBQztBQUFBLE1BQ0gsQ0FBQztBQUFBLElBQ0g7QUFPQSxTQUFLO0FBQUEsTUFDSCxJQUFJLDZCQUE2QixLQUFLLEtBQUssTUFBTTtBQUMvQyxhQUFLLGdCQUFnQjtBQUNyQixhQUFLLG1CQUFtQixLQUFLLDJCQUEyQixHQUFHLEtBQUssbUJBQW1CLG1CQUE0QixDQUFDO0FBQ2hILGFBQUssaUJBQWlCO0FBQUEsTUFDeEIsQ0FBQztBQUFBLElBQ0g7QUFFQSxTQUFLLFNBQVMsTUFBTTtBQUNsQixXQUFLLHVCQUF1QjtBQUM1QixXQUFLLHNCQUFzQjtBQUFBLElBQzdCLENBQUM7QUFBQSxFQUNIO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsTUFBc0IsY0FBNkI7QUFDakQsVUFBTSxLQUFLLFFBQVE7QUFBQSxFQUNyQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFZTyw0QkFBNEIsYUFBZ0M7QUFDakUsZUFBVyxZQUFZLEtBQUssbUJBQW1CLGlCQUEyQixHQUFHO0FBQzNFLFdBQUssb0JBQW9CLGFBQWEsVUFBVSxLQUFLLDZCQUE2QixRQUFRLENBQUM7QUFBQSxJQUM3RjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU1EsZUFBcUI7QUFDM0IsU0FBSywwQkFBMEI7QUFFL0IsZUFBVyxjQUFjLEtBQUssMkJBQTJCLEdBQUc7QUFDMUQsV0FBSyxzQkFBc0IsV0FBVyxLQUFLLDRCQUE0QixVQUFVLENBQUM7QUFBQSxJQUNwRjtBQUVBLGVBQVcsWUFBWSxLQUFLLG1CQUFtQixtQkFBNEIsR0FBRztBQUM1RSxXQUFLLHNCQUFzQixXQUFXLEtBQUssOEJBQThCLFFBQVEsQ0FBQztBQUFBLElBQ3BGO0FBQUEsRUFDRjtBQUFBLEVBRVEsbUJBQXlCO0FBRy9CLFFBQUksQ0FBQyxLQUFLLGlCQUFpQixDQUFDLEtBQUssd0JBQXdCO0FBQ3ZEO0FBQUEsSUFDRjtBQUVBLGVBQVcsWUFBWSxLQUFLLG1CQUFtQixpQkFBMkIsR0FBRztBQUMzRSxVQUFJLEtBQUssMEJBQTBCLElBQUksU0FBUyxRQUFRLEdBQUc7QUFDekQ7QUFBQSxNQUNGO0FBRUEsV0FBSywwQkFBMEIsSUFBSSxTQUFTLFFBQVE7QUFDcEQsV0FBSyxzQkFBc0IsV0FBVyxLQUFLLDZCQUE2QixRQUFRLENBQUM7QUFBQSxJQUNuRjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLHlCQUErQjtBQUNyQyxRQUFJLEtBQUssNEJBQTRCLE1BQU07QUFDekM7QUFBQSxJQUNGO0FBRUEsV0FBTyxhQUFhLEtBQUssdUJBQXVCO0FBQ2hELFNBQUssMEJBQTBCO0FBQUEsRUFDakM7QUFBQSxFQUVRLHFCQUFxQixZQUFnRDtBQUMzRSxRQUFJLEtBQUssU0FBUyxVQUFVLEdBQUc7QUFDN0IsYUFBTyxLQUFLLDZCQUE2QixVQUFVO0FBQUEsSUFDckQ7QUFFQSxXQUFPLDZCQUE2QixFQUFFLENBQUMsTUFBTSxFQUFFLFlBQVksaUJBQWlCLGVBQWU7QUFBQSxNQUN6RixzQkFBc0IsWUFBWSxXQUFXLFVBQVU7QUFBQSxNQUN2RCxZQUFZLFlBQVksS0FBSyxPQUFPLFNBQVMsSUFBSTtBQUFBLElBQ25ELENBQUMsQ0FBQztBQUFBLEVBQ0o7QUFBQSxFQUVRLDhCQUE4QixVQUE0QztBQUNoRixXQUFPLDZCQUE2QixFQUFFLENBQUMsTUFBTSxFQUFFLFlBQVksZUFBZSx3QkFBd0I7QUFBQSxNQUNoRyx1QkFBdUIsWUFBWSxTQUFTLFVBQVU7QUFBQSxNQUN0RCxZQUFZLFlBQVksS0FBSyxPQUFPLFNBQVMsSUFBSTtBQUFBLElBQ25ELENBQUMsQ0FBQztBQUFBLEVBQ0o7QUFBQSxFQUVRLDZCQUE2QixVQUE0QztBQUMvRSxXQUFPLDZCQUE2QixFQUFFLENBQUMsTUFBTSxFQUFFLFlBQVksZUFBZSxlQUFlO0FBQUEsTUFDdkYsdUJBQXVCLFlBQVksU0FBUyxVQUFVO0FBQUEsTUFDdEQsWUFBWSxZQUFZLEtBQUssT0FBTyxTQUFTLElBQUk7QUFBQSxJQUNuRCxDQUFDLENBQUM7QUFBQSxFQUNKO0FBQUEsRUFFUSw2QkFBNkIsVUFBNEM7QUFDL0UsV0FBTyw2QkFBNkIsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLGVBQWUsZUFBZTtBQUFBLE1BQ3ZGLHVCQUF1QixZQUFZLFNBQVMsVUFBVTtBQUFBLE1BQ3RELFlBQVksWUFBWSxLQUFLLE9BQU8sU0FBUyxJQUFJO0FBQUEsSUFDbkQsQ0FBQyxDQUFDO0FBQUEsRUFDSjtBQUFBLEVBRVEsNEJBQTRCLFlBQWdEO0FBQ2xGLFFBQUksS0FBSyxTQUFTLFVBQVUsR0FBRztBQUM3QixhQUFPLEtBQUssNkJBQTZCLFVBQVU7QUFBQSxJQUNyRDtBQUVBLFdBQU8sNkJBQTZCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxpQkFBaUIsc0JBQXNCO0FBQUEsTUFDaEcsc0JBQXNCLFlBQVksV0FBVyxVQUFVO0FBQUEsTUFDdkQsWUFBWSxZQUFZLEtBQUssT0FBTyxTQUFTLElBQUk7QUFBQSxJQUNuRCxDQUFDLENBQUM7QUFBQSxFQUNKO0FBQUEsRUFFUSw2QkFBNkIsWUFBZ0Q7QUFDbkYsV0FBTyw2QkFBNkIsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLGlCQUFpQix1QkFBdUI7QUFBQSxNQUNqRyxzQkFBc0IsWUFBWSxXQUFXLFVBQVU7QUFBQSxNQUN2RCxZQUFZLFlBQVksS0FBSyxPQUFPLFNBQVMsSUFBSTtBQUFBLElBQ25ELENBQUMsQ0FBQztBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFRLG1CQUFtQixVQUFvRDtBQUM3RSxXQUFPLEtBQUssVUFBVSxPQUFPLENBQUMsYUFBYSxTQUFTLGFBQWEsWUFBWSxLQUFLLGlCQUFpQixRQUFRLENBQUM7QUFBQSxFQUM5RztBQUFBLEVBRVEsNkJBQWlEO0FBQ3ZELFdBQU8sS0FBSyxhQUFhLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxRQUFRLElBQUksV0FBVyxRQUFRLEdBQUcsU0FBUyxLQUFLLHdCQUF3QixVQUFVLENBQUM7QUFBQSxFQUMzSTtBQUFBLEVBRVEsd0JBQThCO0FBQ3BDLFFBQUksQ0FBQyxLQUFLLG1CQUFtQjtBQUMzQjtBQUFBLElBQ0Y7QUFFQSxTQUFLLElBQUksUUFBUSxpQkFBaUIsS0FBSyxpQkFBaUI7QUFDeEQsU0FBSyxvQkFBb0I7QUFBQSxFQUMzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFZUSx3QkFBd0IsWUFBdUM7QUFDckUsUUFBSSxXQUFXLHFCQUFxQixRQUFXO0FBQzdDLGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTSxtQkFBbUIsMEJBQTBCO0FBQUEsTUFDakQsS0FBSyxLQUFLO0FBQUEsTUFDVixVQUFVLFdBQVc7QUFBQSxJQUN2QixDQUFDO0FBRUQsUUFBSSxxQkFBcUIsTUFBTTtBQUM3QixhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQUk7QUFDRixhQUFPLENBQUMsZ0JBQWdCLGtCQUFrQixXQUFXLGtCQUFrQixJQUFJO0FBQUEsSUFDN0UsUUFBUTtBQUNOLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFZUSxpQkFBaUIsVUFBbUM7QUFDMUQsVUFBTSxtQkFBbUIsMEJBQTBCO0FBQUEsTUFDakQsS0FBSyxLQUFLO0FBQUEsTUFDVixVQUFVLFNBQVM7QUFBQSxJQUNyQixDQUFDO0FBRUQsUUFBSSxxQkFBcUIsTUFBTTtBQUM3QixhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQUk7QUFDRixhQUFPLGlCQUFpQixrQkFBa0IsU0FBUyx1QkFBdUI7QUFBQSxJQUM1RSxRQUFRO0FBQ04sYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXUSxTQUFTLFlBQXVDO0FBQ3RELFdBQU8sS0FBSyx3QkFBd0IsVUFBVSxLQUN6QyxLQUFLLFFBQVEsSUFBSSxXQUFXLFFBQVEsR0FBRyx5QkFBeUIsOEJBQThCO0FBQUEsRUFDckc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU1EsbUJBQ04seUJBQ0EsbUJBQ007QUFDTixRQUFJLENBQUMsS0FBSyxpQkFBa0Isd0JBQXdCLFdBQVcsS0FBSyxrQkFBa0IsV0FBVyxHQUFJO0FBQ25HO0FBQUEsSUFDRjtBQUVBLFNBQUssc0JBQXNCLHlCQUF5QixpQkFBaUI7QUFFckUsUUFBSSxLQUFLLHFCQUFxQjtBQUM1QjtBQUFBLElBQ0Y7QUFFQSxTQUFLLHNCQUFzQjtBQUMzQixlQUFXLGNBQWMseUJBQXlCO0FBQ2hELFdBQUssc0JBQXNCLFdBQVcsS0FBSyxxQkFBcUIsVUFBVSxDQUFDO0FBQUEsSUFDN0U7QUFFQSxlQUFXLFlBQVksbUJBQW1CO0FBQ3hDLFdBQUssc0JBQXNCLFdBQVcsS0FBSyw2QkFBNkIsUUFBUSxDQUFDO0FBQUEsSUFDbkY7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsTUFBYyxVQUF5QjtBQUNyQyxVQUFNLDBCQUEwQixLQUFLLDJCQUEyQjtBQUNoRSxVQUFNLG9CQUFvQixLQUFLLG1CQUFtQixtQkFBNEI7QUFFOUUsUUFBSSx3QkFBd0IsV0FBVyxLQUFLLGtCQUFrQixXQUFXLEdBQUc7QUFDMUUsV0FBSyx1QkFBdUI7QUFDNUIsV0FBSyxzQkFBc0I7QUFDM0IsV0FBSyxzQkFBc0I7QUFFM0IsVUFBSSxDQUFDLEtBQUssd0JBQXdCO0FBQ2hDLGFBQUsseUJBQXlCO0FBQzlCLGNBQU0sS0FBSyxtQkFBbUI7QUFBQSxNQUNoQztBQUVBLFdBQUssaUJBQWlCO0FBQ3RCO0FBQUEsSUFDRjtBQUVBLFFBQUksS0FBSyx3QkFBd0I7QUFDL0IsV0FBSyx5QkFBeUI7QUFDOUIsV0FBSyxxQkFBcUI7QUFPMUIsV0FBSywwQkFBMEIsT0FBTyxXQUFXLE1BQU07QUFDckQsYUFBSyxhQUFhO0FBQUEsTUFDcEIsR0FBRyw4Q0FBOEM7QUFFakQsV0FBSyxzQkFBc0I7QUFDM0IsV0FBSyxzQkFBc0IseUJBQXlCLGlCQUFpQjtBQUNyRTtBQUFBLElBQ0Y7QUFFQSxTQUFLLG1CQUFtQix5QkFBeUIsaUJBQWlCO0FBQUEsRUFDcEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVUSxvQkFDTixhQUNBLHlCQUNBLG1CQUNNO0FBQ04sUUFBSSx3QkFBd0IsU0FBUyxHQUFHO0FBQ3RDLGtCQUFZLFNBQVMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLGlCQUFpQixlQUFlLEVBQUUsQ0FBQztBQUFBLElBQy9GO0FBRUEsZUFBVyxjQUFjLHlCQUF5QjtBQUNoRCxZQUFNLFdBQVcsWUFBWSxVQUFVO0FBQUEsUUFDckMsS0FBSyxDQUFDLFNBQVMsYUFBYSxTQUFTLHNCQUFzQjtBQUFBLE1BQzdELENBQUM7QUFDRCxlQUFTLE9BQU8sS0FBSyxxQkFBcUIsVUFBVSxDQUFDO0FBQ3JELGdDQUEwQixTQUFTLFVBQVUsR0FBRyxXQUFXLE1BQU07QUFFakUsWUFBTSxRQUFRLHdCQUF3QjtBQUFBLFFBQ3BDLEtBQUssS0FBSztBQUFBLFFBQ1YsVUFBVSxXQUFXO0FBQUEsTUFDdkIsQ0FBQztBQUlELFVBQUksVUFBVSxxQkFBcUIsU0FBUztBQUMxQyxZQUFJLGdCQUFnQixRQUFRLEVBQ3pCLGNBQWM7QUFBQSxVQUFFLENBQUMsTUFDaEIsVUFBVSxxQkFBcUIsdUJBQzNCLEVBQUUsWUFBWSxpQkFBaUIsU0FDL0IsRUFBRSxZQUFZLGlCQUFpQjtBQUFBLFFBQ3JDLENBQUMsRUFDQSxPQUFPLEVBQ1AsUUFBUSxtQkFBbUIsWUFBWTtBQUN0QyxnQkFBTSx1QkFBdUI7QUFBQSxZQUMzQixLQUFLLEtBQUs7QUFBQSxZQUNWLFVBQVUsV0FBVztBQUFBLFlBQ3JCLFlBQVksV0FBVztBQUFBLFlBQ3ZCLHVCQUF1QixLQUFLO0FBQUEsVUFDOUIsQ0FBQztBQUFBLFFBQ0gsQ0FBQyxDQUFDO0FBQ0o7QUFBQSxNQUNGO0FBSUEsVUFBSSxnQkFBZ0IsUUFBUSxFQUN6QixjQUFjLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxpQkFBaUIsUUFBUSxFQUFFLHNCQUFzQixXQUFXLFdBQVcsQ0FBQyxDQUFDLEVBQzlHLE9BQU8sRUFDUCxRQUFRLG1CQUFtQixZQUFZO0FBQ3RDLGNBQU0sYUFBYTtBQUFBLFVBQ2pCLEtBQUssS0FBSztBQUFBLFVBQ1YsVUFBVSxXQUFXO0FBQUEsVUFDckIsWUFBWSxXQUFXO0FBQUEsVUFDdkIsdUJBQXVCLEtBQUs7QUFBQSxVQUM1QixzQkFBc0IsS0FBSyxPQUFPLFNBQVM7QUFBQSxRQUM3QyxDQUFDO0FBQUEsTUFDSCxDQUFDLENBQUM7QUFLSixXQUFLLHlCQUF5QixVQUFVLFdBQVcsVUFBVSxXQUFXLFVBQVU7QUFBQSxJQUNwRjtBQUVBLFFBQUksa0JBQWtCLFdBQVcsR0FBRztBQUNsQztBQUFBLElBQ0Y7QUFFQSxnQkFBWSxTQUFTLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxlQUFlLGVBQWUsRUFBRSxDQUFDO0FBRTNGLGVBQVcsWUFBWSxtQkFBbUI7QUFDeEMsV0FBSyxvQkFBb0IsYUFBYSxVQUFVLEtBQUssNkJBQTZCLFFBQVEsQ0FBQztBQUFBLElBQzdGO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWFRLG9CQUFvQixhQUEwQixVQUEwQixpQkFBeUM7QUFDdkgsVUFBTSxXQUFXLFlBQVksVUFBVTtBQUFBLE1BQ3JDLEtBQUssQ0FBQyxTQUFTLGFBQWEsU0FBUyxvQkFBb0I7QUFBQSxJQUMzRCxDQUFDO0FBQ0QsYUFBUyxPQUFPLGVBQWU7QUFDL0IsOEJBQTBCLFNBQVMsVUFBVSxHQUFHLFNBQVMsTUFBTTtBQUUvRCxRQUFJLGdCQUFnQixRQUFRLEVBQ3pCLGNBQWMsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLGVBQWUsU0FBUyxFQUFFLHVCQUF1QixTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQzVHLE9BQU8sRUFDUCxRQUFRLG1CQUFtQixZQUFZO0FBQ3RDLFlBQU0sdUJBQXVCO0FBQUEsUUFDM0IsS0FBSyxLQUFLO0FBQUEsUUFDVixVQUFVLFNBQVM7QUFBQSxNQUNyQixDQUFDO0FBQ0QsWUFBTSxLQUFLLFFBQVE7QUFBQSxJQUNyQixDQUFDLENBQUM7QUFFSixTQUFLLHlCQUF5QixVQUFVLFNBQVMsVUFBVSxTQUFTLFVBQVU7QUFBQSxFQUNoRjtBQUFBLEVBRVEseUJBQXlCLFVBQXVCLFVBQWtCLFlBQTBCO0FBQ2xHLFFBQUksZ0JBQWdCLFFBQVEsRUFDekIsY0FBYyxFQUFFLENBQUMsTUFBTSxFQUFFLFlBQVksaUJBQWlCLHdCQUF3QjtBQUFBLE1BQzdFLHNCQUFzQjtBQUFBLElBQ3hCLENBQUMsQ0FBQyxFQUNELFFBQVEsTUFBTTtBQUNiLFdBQUssSUFBSSxRQUFRLEtBQUs7QUFDdEIsV0FBSyxJQUFJLFFBQVEsWUFBWSxRQUFRO0FBQUEsSUFDdkMsQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUVRLHNCQUNOLHlCQUNBLG1CQUNNO0FBQ04sUUFBSSxLQUFLLG1CQUFtQjtBQUMxQjtBQUFBLElBQ0Y7QUFNQSxVQUFNLG9CQUFvQixJQUFJLHdCQUF3QjtBQUFBLE1BQ3BELFFBQVEsS0FBSztBQUFBLE1BQ2IsY0FBYyxDQUFDLGdCQUFzQjtBQUNuQyxhQUFLLG9CQUFvQixhQUFhLHlCQUF5QixpQkFBaUI7QUFBQSxNQUNsRjtBQUFBLElBQ0YsQ0FBQztBQUNELFNBQUssSUFBSSxRQUFRLGNBQWMsaUJBQWlCO0FBQ2hELFNBQUssb0JBQW9CO0FBQUEsRUFDM0I7QUFDRjsiLCJuYW1lcyI6WyJQbHVnaW5Db25mbGljdFNldmVyaXR5Il19
|
|
555
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGdhdGUgb24gYSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2U6IHdoYXQgbXVzdCBiZSBQUkVTRU5UIGZvciBpdCB0byBydW4sIGFuZCB3aGF0IG11c3QgTk9UIGJlLlxuICpcbiAqIEJvdGggaGFsdmVzIGFuc3dlciB0aGUgc2FtZSBxdWVzdGlvbiDigJQgbWF5IHRoaXMgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIHJ1biByaWdodCBub3c/IOKAlCBzbyB0aGV5IGFyZSBvbmVcbiAqIGNvbXBvbmVudCByYXRoZXIgdGhhbiB0d28uIEEgc2Vjb25kLCBpbmRlcGVuZGVudCBnYXRlIHdvdWxkIGRvdWJsZS1sb2FkIHRoZSBzdXJmYWNlIGFuZCBzdGFjayBhIHNlY29uZFxuICogXCJibG9ja2VkXCIgc2V0dGluZ3MgdGFiIG9udG8gdGhlIHNhbWUgcGx1Z2luLCBhbmQgbmVpdGhlciBjb3VsZCBzZWUgdGhlIG90aGVyJ3MgcmVhc29uIGZvciByZWZ1c2luZy5cbiAqXG4gKiAjIyBEZXBlbmRlbmNpZXM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IGNhbm5vdCB3b3JrIHdpdGhvdXRcbiAqXG4gKiBUaGlzIGlzIHRoZSBzdHJpY3Qgc2libGluZyBvZiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudGAsIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgd2hvbGUgcG9pbnQuIEFcbiAqIFNVR0dFU1RJT04gaXMgYW4gb2ZmZXIg4oCUIHRoZSBob3N0IGtlZXBzIHdvcmtpbmcgd2l0aG91dCBpdCBhbmQgc2ltcGx5IGNhbm5vdCBkbyBvbmUgdGhpbmcuIEEgREVQRU5ERU5DWVxuICogaXMgYSByZXF1aXJlbWVudDogYG9ubG9hZEltcGxgIG5ldmVyIHJ1bnMsIG5vIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCwgbm8gaGFuZGxlciBpcyBpbnN0YWxsZWQsIG5vdGhpbmcgaXNcbiAqIHBhdGNoZWQuIFJlYWNoIGZvciBhIHN1Z2dlc3Rpb24gd2hlbiB0aGUgb3RoZXIgcGx1Z2luIGFkZHMgc29tZXRoaW5nOyByZWFjaCBmb3IgYSBkZXBlbmRlbmN5IHdoZW4gdGhlXG4gKiBob3N0J3MgYWR2ZXJ0aXNlZCBiZWhhdmlvciBpcyBub3QgdGhlcmUgd2l0aG91dCBpdC5cbiAqXG4gKiBPYnNpZGlhbiBoYXMgbm8gZGVwZW5kZW5jeSBmaWVsZCBpbiBhIG1hbmlmZXN0LCB3aGljaCBpcyBleGFjdGx5IHRoZSBwcm9ibGVtIHRoaXMgY2xvc2VzLiBXaXRob3V0IG9uZSxcbiAqIGEgdXNlciBtZWV0aW5nIGFuIHVuZmFtaWxpYXIgcGx1Z2luIGluIHRoZWlyIGxpc3QgbW9udGhzIGxhdGVyIGhhcyBub3RoaW5nIHRlbGxpbmcgdGhlbSBpdCBpc1xuICogbG9hZC1iZWFyaW5nIOKAlCB0aGV5IHJlbW92ZSBpdCwgYW5kIHRoZSBicmVha2FnZSBzdXJmYWNlcyB3ZWVrcyBhZnRlciB0aGF0IGFzIGRhbWFnZSB0aGV5IGNhbm5vdCBjb25uZWN0XG4gKiB0byBhbnl0aGluZyB0aGV5IGRpZC4gU28gdGhlIHJlbGF0aW9uc2hpcCBpcyBtYWRlIHZpc2libGUgZnJvbSBib3RoIGVuZHMgYW5kIGVuZm9yY2VkIHdoaWxlIGl0IGhvbGRzOlxuICogdGhlIGRlcGVuZGVudCBleHBsYWlucyBpdHNlbGYgd2hlcmUgdGhlIHVzZXIgaXMgbG9va2luZywgcmVwYWlycyBpdHNlbGYgaW4gb25lIGNsaWNrLCBhbmQgcmVhY3RzIHRoZVxuICogSU5TVEFOVCB0aGUgZGVwZW5kZW5jeSBnb2VzIGF3YXkgcmF0aGVyIHRoYW4gZGVncmFkaW5nIHF1aWV0bHkuXG4gKlxuICogVGhyZWUgY2hvaWNlcyBhcmUgZGVsaWJlcmF0ZSBhbmQgd29ydGggc3RhdGluZywgYmVjYXVzZSBlYWNoIGhhcyBhbiBvYnZpb3VzLWxvb2tpbmcgYWx0ZXJuYXRpdmU6XG4gKlxuICogLSAqKkJsb2NrZWQgbWVhbnMgZW5hYmxlZC1idXQtaW5lcnQsIG5ldmVyIHNlbGYtZGlzYWJsZWQuKiogQ2FsbGluZyBgZGlzYWJsZVBsdWdpbkFuZFNhdmVgIG9uIGl0c2VsZlxuICogICB3b3VsZCBiZSB0aGUgbGl0ZXJhbCByZWFkaW5nIG9mIFwicmVmdXNlcyB0byBsb2FkXCIsIGFuZCBpdCByZXdyaXRlcyBhIGNvbmZpZyB0aGF0IGJlbG9uZ3MgdG8gdGhlIHVzZXIg4oCUXG4gKiAgIHdobyB3b3VsZCB0aGVuIGhhdmUgdG8gcmVtZW1iZXIgdG8gcmUtZW5hYmxlIGl0IGFmdGVyIGZpeGluZyB0aGUgZGVwZW5kZW5jeS4gU3RheWluZyBlbmFibGVkIGFuZCBpbmVydFxuICogICBzYXlzIHRoZSBzYW1lIHRoaW5nIHRvIHRoZSB1c2VyLCBjaGFuZ2VzIG5vdGhpbmcgdGhleSBvd24sIGFuZCBjYW4gdW5kbyBpdHNlbGYuXG4gKiAtICoqQmxvY2tlZCBpcyBub3QgYW4gZXJyb3IuKiogVGhyb3dpbmcgZnJvbSBgb25sb2FkYCBtYXJrcyB0aGUgcGx1Z2luIGZhaWxlZCBpbiBPYnNpZGlhbiBhbmQgaGFuZHMgdGhlXG4gKiAgIHVzZXIgYSBzdGFjayB0cmFjZSBpbnN0ZWFkIG9mIGEgc2VudGVuY2UgYW5kIGEgYnV0dG9uLlxuICogLSAqKkEgZGVwZW5kZW5jeSBtdXN0IHB1Ymxpc2ggYW4gQVBJLioqIFRoYXQgaXMgd2hhdCBtYWtlcyBwcmVzZW5jZSwgYWJzZW5jZSwgdmVyc2lvbiBhbmQgZGVwYXJ0dXJlIGFsbFxuICogICBvYnNlcnZhYmxlIHRocm91Z2ggb25lIG1lY2hhbmlzbSDigJQgYHdhdGNoUGx1Z2luQXBpYCdzIHJlZmVyZW5jZSBpcyBsaXZlLCBpcyByZXZva2VkIHdoZW4gdGhlIHByb3ZpZGVyXG4gKiAgIHVubG9hZHMsIGFuZCBhbHJlYWR5IGNsYXNzaWZpZXMgbm90LWluc3RhbGxlZCBhZ2FpbnN0IG5vdC1lbmFibGVkIGFnYWluc3QgdG9vLW9sZC4gQSBwcm92aWRlciB3aXRoXG4gKiAgIG5vdGhpbmcgdG8gZXhwb3NlIGNhbiBwdWJsaXNoIGFuIGVtcHR5IEFQSSBwdXJlbHkgc28gaXQgY2FuIGJlIGRlcGVuZGVkIHVwb247IHRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZVxuICogICBhIHNlY29uZCwgd2Vha2VyIGRldGVjdGlvbiBwYXRoIHRvIG1haW50YWluIGJlc2lkZSBpdC5cbiAqXG4gKiAjIyBDb25mbGljdHM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IHJlZnVzZXMgdG8gcnVuIGJlc2lkZVxuICpcbiAqIFRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCwgYW5kIGl0IG5lZWRzIGl0cyBvd24gZGV0ZWN0aW9uIHBhdGggYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBvbmUgZG9lcyBub3QgZml0LlxuICogQSBjb25mbGljdGluZyBwbHVnaW4gaXMgdHlwaWNhbGx5IGFuIE9MRCB2ZXJzaW9uIG9mIHNvbWUgb3RoZXIgcGx1Z2luIHRoYXQgc3RpbGwgb3ducyBiZWhhdmlvciB0aGlzIG9uZVxuICogaGFzIHRha2VuIG92ZXIg4oCUIGl0IHB1Ymxpc2hlcyBubyBBUEkgYXQgYWxsLCBzbyB0aGVyZSBpcyBubyBgYXBpVmVyc2lvblJhbmdlYCB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogVGhlIGFyZ3VtZW50IGZvciByZWZ1c2luZyByYXRoZXIgdGhhbiBjb21wZXRpbmcgY29tZXMgZnJvbSB0aGUgY2FzZSB0aGlzIGdlbmVyYWxpemVzOiB0d28gcmVuYW1lL2RlbGV0ZVxuICogaGFuZGxlcnMgYWN0aW5nIG9uIG9uZSByZW5hbWUgY29ycnVwdCBsaW5rcyBhbmQgbW92ZSBhdHRhY2htZW50cyB0d2ljZSwgYW5kIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0b1xuICogd2luIHRoYXQgcmFjZSDigJQgYSBoYW5kbGVyIGlzIGVsZWN0ZWQgYnkgcmVnaXN0cnkgb3JkZXIsIGJ1dCB0aGUgcGF0Y2hlcyB0aGF0IGRvIHRoZSB3b3JrIHNpdCBvdXRzaWRlXG4gKiB0aGF0IGVsZWN0aW9uLCBzbyB3aGljaGV2ZXIgcGx1Z2luIGxvYWRlZCBmaXJzdCBrZWVwcyBhIGhhbmQgb24gdGhlIHdoZWVsLiBFdmVyeSBzY2hlbWUgZm9yIHNlaXppbmdcbiAqIGNvbnRyb2wgZnJvbSBpbnNpZGUgaXMgbG9hZC1vcmRlciBkZXBlbmRlbnQuIFJlZnVzaW5nIGlzIGRldGVybWluaXN0aWMgd2hlcmUgY29tcGV0aW5nIGlzIG5vdCwgYW5kIGFcbiAqIHZhdWx0IHRoYXQgYnJpZWZseSBoYXMgbm8gaGFuZGxlciBpcyBhIGZhciBiZXR0ZXIgb3V0Y29tZSB0aGFuIG9uZSB3aXRoIHR3by5cbiAqXG4gKiBUd28gZGV0YWlscyBvZiB0aGF0IGRldGVjdGlvbiBjYXJyeSBvdmVyIHZlcmJhdGltLCBiZWNhdXNlIGJvdGggYXJlIGxvYWQtYmVhcmluZzpcbiAqXG4gKiAtICoqVmVyc2lvbnMgYXJlIHJlYWQsIG5ldmVyIHRoZSByZWdpc3RyeS4qKiBBIHBsdWdpbiB0aGF0IGhhcyBub3QgbG9hZGVkIHlldCBoYXMgcmVnaXN0ZXJlZCBub3RoaW5nLCBzb1xuICogICBhc2tpbmcgdGhlIHJlZ2lzdHJ5IGdpdmVzIGEgZGlmZmVyZW50IGFuc3dlciBkZXBlbmRpbmcgb24gd2hlbiBpdCBpcyBhc2tlZC4gYGFwcC5wbHVnaW5zLm1hbmlmZXN0c2AgaXNcbiAqICAgcG9wdWxhdGVkIGZvciBldmVyeSBpbnN0YWxsZWQgcGx1Z2luIGF0IHN0YXJ0dXAsIHdoYXRldmVyIHRoZSBsb2FkIG9yZGVyIHR1cm5zIG91dCB0byBiZS5cbiAqIC0gKipBbiB1bnBhcnNlYWJsZSB2ZXJzaW9uIGNvdW50cyBhcyBjb25mbGljdGluZy4qKiBGYWlsaW5nIGNsb3NlZCBpcyB0aGUgc2FmZSBkaXJlY3Rpb246IGEgZmFsc2UgYWxhcm1cbiAqICAgY29zdHMgYSBub3RpY2UsIGEgZmFsc2UgYWxsLWNsZWFyIGNvc3RzIGEgdmF1bHQuXG4gKlxuICogTm90IGV2ZXJ5IG92ZXJsYXAgaXMgdGhhdCBzZXZlcmUsIHdoaWNoIGlzIHdoeSBhIGNvbmZsaWN0IGRlY2xhcmVzIGEge0BsaW5rIFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHl9LlxuICogVHdvIHBsdWdpbnMgc2hpcHBpbmcgdGhlIHNhbWUgY29tbWFuZCBkdXBsaWNhdGUgYSBwYWxldHRlIGVudHJ5IGFuZCBkbyB0aGUgd29yayB0d2ljZSDigJQgYW5ub3lpbmcsIG5vdFxuICogY29ycnVwdGluZyDigJQgYW5kIHJlZnVzaW5nIHRvIGxvYWQgb3ZlciB0aGF0IHdvdWxkIGJlIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHRoZSBvdmVybGFwLiBUaG9zZSBkZWNsYXJlXG4gKiB7QGxpbmsgUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJufSBhbmQgYm90aCBrZWVwIHJ1bm5pbmcuXG4gKlxuICogIyMgV2hhdCB0aGlzIGNhbiBhbmQgY2Fubm90IHNlZVxuICpcbiAqIE9ic2lkaWFuIHJhaXNlcyBubyBldmVudCB3aGVuIEFOT1RIRVIgcGx1Z2luIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgKHNlZSBgcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHNgKSxcbiAqIHNvIGxpdmUgY29uZmxpY3QgZGV0ZWN0aW9uIGhhcyBhIHJlYWwgY2VpbGluZyBhbmQgaXQgaXMgc3RhdGVkIGhlcmUgcmF0aGVyIHRoYW4gaW1wbGllZCBhd2F5LiBBXG4gKiBjb25mbGljdGluZyBwbHVnaW4gYnVpbHQgb24gdGhpcyBsaWJyYXJ5IGFubm91bmNlcyBpdHNlbGYgdGhyb3VnaCB0aGUgbGlmZWN5Y2xlIGJyb2FkY2FzdCwgYW5kIGlzXG4gKiB0aGVyZWZvcmUgY2F1Z2h0IHRoZSBtb21lbnQgaXQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gT25lIHRoYXQgaXMgbm90IOKAlCBhbiBvbGQgcmVsZWFzZSBwcmVkYXRpbmcgdGhlXG4gKiBicm9hZGNhc3QsIG9yIGEgcGx1Z2luIGJ5IGFub3RoZXIgYXV0aG9yIGVudGlyZWx5IOKAlCBpcyBjYXVnaHQgYXQgdGhlIG5leHQgbG9hZCwgd2hpY2ggaXMgd2hlbiBpdHNcbiAqIG1hbmlmZXN0IGlzIHJlYWQuXG4gKlxuICogIyMgV2h5IGEgbG9zcyBpcyBhbm5vdW5jZWQgbGF0ZVxuICpcbiAqIE9ic2lkaWFuIHVwZGF0ZXMgYW4gZW5hYmxlZCBwbHVnaW4gYnkgcmVsb2FkaW5nIGl0OiB0aGUgb2xkIGNvcHkgdW5sb2FkcywgdGhlIG5ldyBvbmUgbG9hZHMuIEZvciB0aGVcbiAqIG1vbWVudCBpbiBiZXR3ZWVuIHRoZSBwcm92aWRlcidzIEFQSSBpcyByZXZva2VkLCBzbyBldmVyeSBkZXBlbmRlbnQgc2VlcyBpdHMgZGVwZW5kZW5jeSBnbyBhd2F5IGFuZFxuICogY29tZSBiYWNrLiBUaGUgZmVhdHVyZSBzdXJmYWNlIHN0aWxsIGNvbWVzIGRvd24gYXQgb25jZSDigJQgdGhlIGRlcGVuZGVuY3kgcmVhbGx5IGlzIGdvbmUgZm9yIHRoYXRcbiAqIG1vbWVudCDigJQgYnV0IHRoZSBub3RpY2Ugd2FpdHMge0BsaW5rIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFN9LCBhbmQgYSBsb3NzIHRoYXRcbiAqIGhlYWxlZCBpbiB0aGUgbWVhbnRpbWUgaXMgbmV2ZXIgYW5ub3VuY2VkLiBXaXRob3V0IHRoYXQsIHVwZGF0aW5nIG9uZSBwbHVnaW4gcHV0IGEgXCJubyBsb25nZXJcbiAqIGF2YWlsYWJsZVwiIG5vdGljZSBvbiBzY3JlZW4gaW4gZXZlcnkgcGx1Z2luIGRlcGVuZGluZyBvbiBpdCwgZGVzY3JpYmluZyBhIHN0YXRlIHRoYXQgbm8gbG9uZ2VyIGhlbGQgYnlcbiAqIHRoZSB0aW1lIHRoZSB1c2VyIHJlYWQgaXQuIEEgbG9zcyB0aGUgdXNlciBjYXVzZWQgb24gcHVycG9zZSDigJQgZGlzYWJsaW5nIG9yIHVuaW5zdGFsbGluZyB0aGVcbiAqIGRlcGVuZGVuY3kg4oCUIG91dGxhc3RzIHRoZSB3aW5kb3cgYW5kIGlzIGFubm91bmNlZCBhcyBiZWZvcmUsIG9ubHkgYSBmZXcgc2Vjb25kcyBsYXRlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgUGx1Z2luXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGNvbXBhcmUgYXMgY29tcGFyZVZlcnNpb25zLFxuICBzYXRpc2ZpZXMgYXMgc2F0aXNmaWVzVmVyc2lvblxufSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudCxcbiAgUGx1Z2luU2V0dGluZ1RhYlxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luQXBpUmVmIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1hcGkudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWUsXG4gIFBsdWdpbkxpZmVjeWNsZUV2ZW50UGF5bG9hZFxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgZGlzYWJsZUNvbW11bml0eVBsdWdpbiB9IGZyb20gJy4uL2NvbW11bml0eS1wbHVnaW5zLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7XG4gIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUsXG4gIGFzQ29kZUJsb2NrLFxuICBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzXG59IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7XG4gIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLFxuICB3YXRjaFBsdWdpbkFwaVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQge1xuICBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSxcbiAgZ2V0SW5zdGFsbGVkUGx1Z2luVmVyc2lvbixcbiAgaW5zdGFsbEFuZEVuYWJsZVBsdWdpbixcbiAgSW5zdGFsbGVkUGx1Z2luU3RhdGUsXG4gIHVwZGF0ZVBsdWdpblxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWluc3RhbGwtc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FLFxuICBQTFVHSU5fVU5MT0FERURfRVZFTlRfTkFNRVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJBc3luY0V2ZW50IH0gZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgQ2FsbGJhY2tMYXlvdXRSZWFkeUNvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LXJlYWR5LWNvbXBvbmVudC50cyc7XG5cbi8qKlxuICogSG93IGxvbmcgYSBnYXRlIHRoYXQgY2xvc2VkIHdoaWxlIHRoZSBwbHVnaW4gd2FzIHJ1bm5pbmcgd2FpdHMgYmVmb3JlIHNheWluZyBzby5cbiAqXG4gKiBMb25nIGVub3VnaCB0byBjb3ZlciBPYnNpZGlhbiByZWxvYWRpbmcgYSBwbHVnaW4gdG8gYXBwbHkgaXRzIHVwZGF0ZSwgc2hvcnQgZW5vdWdoIHRoYXQgYSB1c2VyIHdob1xuICogZGlzYWJsZWQgdGhlIGRlcGVuZGVuY3kgYnkgaGFuZCBzdGlsbCBjb25uZWN0cyB0aGUgbm90aWNlIHRvIHdoYXQgdGhleSBqdXN0IGRpZC5cbiAqL1xuY29uc3QgTE9TU19BTk5PVU5DRU1FTlRfR1JBQ0VfUEVSSU9EX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbi8qKlxuICogSG93IGJhZGx5IHR3byBwbHVnaW5zIHJ1bm5pbmcgc2lkZSBieSBzaWRlIGdvZXMgd3JvbmcsIGFuZCB0aGVyZWZvcmUgd2hhdCB0aGlzIG9uZSBkb2VzIGFib3V0IGl0LlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5Db25mbGljdFNldmVyaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBob3N0IHJlZnVzZXMgdG8gcnVuIGF0IGFsbCB3aGlsZSB0aGUgY29uZmxpY3QgaG9sZHM6IGBvbmxvYWRJbXBsYCBuZXZlciBydW5zLCBub3RoaW5nIGlzXG4gICAqIHJlZ2lzdGVyZWQsIGFuZCB0aGUgcGx1Z2luIGV4cGxhaW5zIGl0c2VsZiB0aGUgd2F5IGEgbWlzc2luZyBkZXBlbmRlbmN5IGRvZXMuXG4gICAqXG4gICAqIEZvciBhbiBvdmVybGFwIHdoZXJlIGJvdGggcGx1Z2lucyBhY3Rpbmcgb24gdGhlIHNhbWUgb3BlcmF0aW9uIGRhbWFnZXMgdGhlIHZhdWx0LlxuICAgKi9cbiAgQmxvY2sgPSAnYmxvY2snLFxuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBydW5zIGFueXdheSBhbmQgc2F5cyB0aGUgb3ZlcmxhcCBpcyB0aGVyZS5cbiAgICpcbiAgICogRm9yIGFuIG92ZXJsYXAgdGhhdCBpcyBhbm5veWluZyByYXRoZXIgdGhhbiBkZXN0cnVjdGl2ZSDigJQgZHVwbGljYXRlIGNvbW1hbmRzLCB3b3JrIGRvbmUgdHdpY2Ug4oCUIHdoZXJlXG4gICAqIHJlZnVzaW5nIHRvIGxvYWQgd291bGQgY29zdCB0aGUgdXNlciBtb3JlIHRoYW4gdGhlIG92ZXJsYXAgZG9lcy5cbiAgICovXG4gIFdhcm4gPSAnd2Fybidcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiByZWZ1c2VzIHRvIHJ1biBiZXNpZGUsIG9yIHdhcm5zIGFib3V0IHJ1bm5pbmcgYmVzaWRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkNvbmZsaWN0IHtcbiAgLyoqXG4gICAqIFRoZSBzZW12ZXIgcmFuZ2Ugb2YgdGhlIE9USEVSIHBsdWdpbidzIHZlcnNpb25zIHRoYXQgY29uZmxpY3QsIGUuZy4gYCc8MTIuMC4wJ2AgZm9yIFwiZXZlcnkgdmVyc2lvblxuICAgKiBiZWZvcmUgdGhlIG9uZSB0aGF0IGdhdmUgdGhpcyBiZWhhdmlvciB1cFwiLlxuICAgKlxuICAgKiBBIHJhbmdlIHJhdGhlciB0aGFuIGEgbWluaW11bSwgc28gYW4gb3ZlcmxhcCBjb25maW5lZCB0byBvbmUgbWFqb3IgKGAnPj0zIDw0J2ApIGlzIGV4cHJlc3NpYmxlLCBhbmQgc29cbiAgICogaXMgYSBwbHVnaW4gdGhhdCBjb25mbGljdHMgYXQgZXZlcnkgdmVyc2lvbiDigJQgc3BlbGwgdGhhdCBgJz49MC4wLjAnYCwgc2luY2UgYGNvbXBhcmUtdmVyc2lvbnNgIHJlamVjdHNcbiAgICogYSBiYXJlIGAqYC4gRXZhbHVhdGVkIGFnYWluc3QgYG1hbmlmZXN0LnZlcnNpb25gOyBhIHZlcnNpb24gdGhhdCBjYW5ub3QgYmUgcGFyc2VkIGNvdW50cyBhc1xuICAgKiBjb25mbGljdGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZsaWN0aW5nVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIGFzIGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIHNob3duIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxvY2FsaXplZCBzZW50ZW5jZSBzYXlpbmcgd2hhdCBnb2VzIHdyb25nIHdoZW4gYm90aCBydW4sIHNob3duIGluIHRoZSBiYW5uZXIuXG4gICAqXG4gICAqIFRoZSBkZWNsYXJpbmcgcGx1Z2luIG93bnMgdGhpcyBzdHJpbmcgYmVjYXVzZSBvbmx5IGl0IGtub3dzIHdoYXQgdGhlIHR3byBvZiB0aGVtIGNvbGxpZGUgb3ZlciwgYW5kIGFcbiAgICogdXNlciBiZWluZyBhc2tlZCB0byBkaXNhYmxlIHNvbWV0aGluZyBkZXNlcnZlcyB0byBiZSB0b2xkIHdoeS5cbiAgICpcbiAgICogUGFzcyBhIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSB0byBtYXJrIHVwIHBhcnQgb2YgdGhlIHNlbnRlbmNlLCBzdWNoIGFzIGEgcGx1Z2luIG5hbWUgcmVuZGVyZWQgYXNcbiAgICogY29kZS4gRWFjaCByZW5kZXIgYXBwZW5kcyBhIGZyZXNoIGNsb25lIG9mIGl0LCBzaW5jZSB0aGUgYmFubmVyIGlzIHJlbmRlcmVkIGFnYWluIG9uIGV2ZXJ5IHJlZnJlc2guXG4gICAqL1xuICByZWFkb25seSByZWFzb246IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhpcyBwbHVnaW4gZG9lcyBhYm91dCB0aGUgY29uZmxpY3QuXG4gICAqL1xuICByZWFkb25seSBzZXZlcml0eTogUGx1Z2luQ29uZmxpY3RTZXZlcml0eTtcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiBjYW5ub3Qgd29yayB3aXRob3V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkRlcGVuZGVuY3kge1xuICAvKipcbiAgICogVGhlIHNlbXZlciByYW5nZSBvZiBBUEkgY29udHJhY3QgdmVyc2lvbnMgdGhlIGRlcGVuZGVudCBjb21waWxlZCBhZ2FpbnN0LCBlLmcuIGAnXjInYC5cbiAgICpcbiAgICogQSBkZXBlbmRlbmN5IHdob3NlIHB1Ymxpc2hlZCBBUEkgZmFsbHMgb3V0c2lkZSB0aGUgcmFuZ2UgY291bnRzIGFzIFVOU0FUSVNGSUVELCB3aGljaCBpcyB3aGF0IHR1cm5zIGFcbiAgICogc2lsZW50IGJlaGF2aW9yYWwgbWlzbWF0Y2ggYmV0d2VlbiB0d28gaW5kZXBlbmRlbnRseSByZWxlYXNlZCBwbHVnaW5zIGludG8gYSB2aXNpYmxlIFwidXBkYXRlIHRoaXNcbiAgICogb25lXCIgbWVzc2FnZS4gU3BlbGwgXCJhbnkgdmVyc2lvblwiIGFzIGAnPj0wLjAuMCdgIOKAlCBgY29tcGFyZS12ZXJzaW9uc2AgcmVqZWN0cyBhIGJhcmUgYCpgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGRlc3QgcmVsZWFzZSBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luIHRoZSBkZXBlbmRlbnQgd29ya3Mgd2l0aCwgZS5nLiBgJzIuMi4wJ2AuXG4gICAqXG4gICAqIEZvciBhIHByb3ZpZGVyIHdob3NlIEJFSEFWSU9SIGNoYW5nZWQgd2hpbGUgaXRzIEFQSSBjb250cmFjdCBzdGF5ZWQgdGhlIHNhbWUsIHdoaWNoXG4gICAqIHtAbGluayBhcGlWZXJzaW9uUmFuZ2V9IGNhbm5vdCBzZWUuIEEgZGVwZW5kZW5jeSBlbmFibGVkIGJlbG93IGl0IGNvdW50cyBhcyBVTlNBVElTRklFRCBhbmQgYXNrcyB0aGVcbiAgICogdXNlciB0byB1cGRhdGUgaXQuIEV2YWx1YXRlZCBhZ2FpbnN0IGBtYW5pZmVzdC52ZXJzaW9uYDsgYSB2ZXJzaW9uIHRoYXQgY2Fubm90IGJlIHBhcnNlZCBjb3VudHMgYXMgdG9vXG4gICAqIG9sZC4gQSBtaW5pbXVtIHJhdGhlciB0aGFuIGEgcmFuZ2UsIGJlY2F1c2UgdGhlIG9ubHkgYWR2aWNlIHRoZSBnYXRlIGNhbiBnaXZlIGlzIFwidXBkYXRlIGl0XCIsIGFuZCBhblxuICAgKiB1cHBlciBib3VuZCBpcyBhIHZlcnNpb24gbm8gdXBkYXRlIHJlYWNoZXMuXG4gICAqL1xuICByZWFkb25seSBtaW5QbHVnaW5WZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luLCBhcyBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2luIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luLCBzaG93biB0byB0aGUgdXNlci5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQSBsb2NhbGl6ZWQgc2VudGVuY2Ugc2F5aW5nIHdoYXQgdGhlIGRlcGVuZGVudCBkb2VzIHdpdGggdGhpcyBwbHVnaW4sIHNob3duIGluIHRoZSBzZXR0aW5ncyBiYW5uZXIuXG4gICAqXG4gICAqIFRoZSBkZXBlbmRlbnQgb3ducyB0aGlzIHN0cmluZyBiZWNhdXNlIG9ubHkgaXQga25vd3Mgd2hhdCBpdCB1c2VzIHRoZSBvdGhlciBwbHVnaW4gZm9yLCBhbmQgYSB1c2VyXG4gICAqIGJlaW5nIGFza2VkIHRvIGluc3RhbGwgc29tZXRoaW5nIGRlc2VydmVzIHRvIGJlIHRvbGQgd2h5LlxuICAgKlxuICAgKiBQYXNzIGEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHRvIG1hcmsgdXAgcGFydCBvZiB0aGUgc2VudGVuY2UsIHN1Y2ggYXMgYSBwbHVnaW4gbmFtZSByZW5kZXJlZCBhc1xuICAgKiBjb2RlLiBFYWNoIHJlbmRlciBhcHBlbmRzIGEgZnJlc2ggY2xvbmUgb2YgaXQsIHNpbmNlIHRoZSBiYW5uZXIgaXMgcmVuZGVyZWQgYWdhaW4gb24gZXZlcnkgcmVmcmVzaC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkdhdGVDb21wb25lbnR9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkdhdGVDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29uZmxpY3RzIHRvIGVuZm9yY2UuIEFuIGVtcHR5IGxpc3QgbWVhbnMgdGhlIHBsdWdpbiByZWZ1c2VzIHRvIHJ1biBiZXNpZGUgbm90aGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXTtcblxuICAvKipcbiAgICogVGhlIGRlcGVuZGVuY2llcyB0byBlbmZvcmNlLiBBbiBlbXB0eSBsaXN0IG1lYW5zIHRoZSBwbHVnaW4gZGVwZW5kcyBvbiBub3RoaW5nLCBhbmQgaXRzIGZlYXR1cmVcbiAgICogc3VyZmFjZSBsb2FkcyBpbW1lZGlhdGVseS5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdO1xuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgaG9zdCBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UuIENhbGxlZCBvbmNlIGV2ZXJ5IGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIGFuZCBubyBibG9ja2luZ1xuICAgKiBjb25mbGljdCBob2xkcywgYW5kIGFnYWluIGFmdGVyIGEgZ2F0ZSB0aGF0IGhhZCBjbG9zZWQgb3BlbnMgYmFjayB1cC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBzdXJmYWNlIGlzIGxvYWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgcGx1Z2luIOKAlCB0aGUgb25lIGRlY2xhcmluZyB0aGUgZGVwZW5kZW5jaWVzIGFuZCBjb25mbGljdHMuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgcGx1Z2luJ3Mgbm90aWNlIGNvbXBvbmVudCwgdXNlZCB0byBzYXkgd2hhdCBpcyBtaXNzaW5nLCB3aGF0IGlzIGluIHRoZSB3YXksIGFuZCB3aGF0IGNoYW5nZWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogVW5sb2FkcyB0aGUgaG9zdCBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UuIENhbGxlZCB3aGVuIGEgZ2F0ZSB0aGF0IGhhZCBiZWVuIG9wZW4gY2xvc2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5sb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYn0gY29uc3RydWN0b3IuXG4gKi9cbmludGVyZmFjZSBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYkNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBibG9ja2VkIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBibG9ja2VkIGV4cGxhbmF0aW9uIGludG8gdGhlIHRhYidzIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIHRhYidzIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBzZXR0aW5ncyB0YWIgYSBibG9ja2VkIHBsdWdpbiBzaG93cyBpbiBwbGFjZSBvZiB0aGUgb25lIGl0IG5ldmVyIGdvdCB0byByZWdpc3Rlci5cbiAqXG4gKiBBIGJsb2NrZWQgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIG5ldmVyIHJhbiwgc28gaXRzIHJlYWwgc2V0dGluZ3MgdGFiIGRvZXMgbm90IGV4aXN0IOKAlCBhbmQgYSB1c2VyIHdobyBnb2VzXG4gKiBsb29raW5nIGZvciB0aGUgcGx1Z2luJ3Mgc2V0dGluZ3MgaXMgcHJlY2lzZWx5IHRoZSB1c2VyIGFza2luZyBcIndoeSBpc24ndCB0aGlzIGRvaW5nIGFueXRoaW5nP1wiLiBBblxuICogZW1wdHkgc3BhY2UgaXMgdGhlIHdvcnN0IHBvc3NpYmxlIGFuc3dlciB0byB0aGF0IHF1ZXN0aW9uLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9zZXR0aW5ncy10YWIvcHJlZmVyLXNldHRpbmctZGVmaW5pdGlvbnMgLS0gVGhpcyB0YWIgaGFzIG5vIHNldHRpbmdzIHRvIGRlY2xhcmUuIEl0IHN0YW5kcyBpbiBmb3IgYSBzZXR0aW5ncyB0YWIgdGhhdCBkb2VzIG5vdCBleGlzdCB5ZXQsIGNhcnJ5aW5nIGFuIGV4cGxhbmF0aW9uIGFuZCBhIHJlcGFpciBidXR0b24sIGFuZCB0aGUgcGx1Z2luJ3MgcmVhbCBzZXR0aW5ncyBhcHBlYXIgdGhlIG1vbWVudCB0aGUgZ2F0ZSBvcGVucy5cbmNsYXNzIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAbGluayBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMucGx1Z2luLmFwcCwgcGFyYW1zLnBsdWdpbik7XG4gICAgdGhpcy5yZW5kZXJCYW5uZXIgPSBwYXJhbXMucmVuZGVyQmFubmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHRhYi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNwbGF5KCk6IHZvaWQge1xuICAgIHRoaXMuY29udGFpbmVyRWwuZW1wdHkoKTtcbiAgICB0aGlzLnJlbmRlckJhbm5lcih0aGlzLmNvbnRhaW5lckVsKTtcbiAgfVxufVxuXG4vKipcbiAqIEVuZm9yY2VzIGEgcGx1Z2luJ3MgbWFuZGF0b3J5IGRlcGVuZGVuY2llcyBhbmQgZGVjbGFyZWQgY29uZmxpY3RzLCBnYXRpbmcgaXRzIGZlYXR1cmUgc3VyZmFjZSBvbiBib3RoLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luR2F0ZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbm5vdW5jZWRXYXJuaW5nUGx1Z2luSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpUmVmcyA9IG5ldyBNYXA8c3RyaW5nLCBQbHVnaW5BcGlSZWY8b2JqZWN0Pj4oKTtcbiAgcHJpdmF0ZSBibG9ja2VkU2V0dGluZ1RhYjogbnVsbCB8IFBsdWdpblNldHRpbmdUYWIgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXBlbmRlbmNpZXM6IHJlYWRvbmx5IFBsdWdpbkRlcGVuZGVuY3lbXTtcbiAgcHJpdmF0ZSBoYXNBbm5vdW5jZWRCbG9ja2VkID0gZmFsc2U7XG4gIHByaXZhdGUgaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGlzTGF5b3V0UmVhZHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgbG9zc0Fubm91bmNlbWVudFRpbWVySWQ6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHVubG9hZEZlYXR1cmVTdXJmYWNlOiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgZ2V0IGFwcCgpOiBBcHAge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5hcHA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGx1Z2luR2F0ZUNvbXBvbmVudH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkdhdGVDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25mbGljdHMgPSBwYXJhbXMuY29uZmxpY3RzO1xuICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gcGFyYW1zLmRlcGVuZGVuY2llcztcbiAgICB0aGlzLmxvYWRGZWF0dXJlU3VyZmFjZSA9IHBhcmFtcy5sb2FkRmVhdHVyZVN1cmZhY2U7XG4gICAgdGhpcy5wbHVnaW4gPSBwYXJhbXMucGx1Z2luO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnVubG9hZEZlYXR1cmVTdXJmYWNlID0gcGFyYW1zLnVubG9hZEZlYXR1cmVTdXJmYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgd2hldGhlciBhbnkgd2FybmluZyBjb25mbGljdCBpcyBpbiBmb3JjZSByaWdodCBub3cuXG4gICAqXG4gICAqIFRoZSBwcmVkaWNhdGUgYSBkZWNsYXJhdGl2ZSBzZXR0aW5ncyB0YWIgbmVlZHMsIGFuZCB0aGUgY291bnRlcnBhcnQgdG9cbiAgICogYFBsdWdpblN1Z2dlc3Rpb25Db21wb25lbnQuZ2V0U3VnZ2VzdGVkUGx1Z2luU3RhdGVgLiBTdWNoIGEgdGFiIGRlY2lkZXMgd2hldGhlciBhIHJvdyBleGlzdHNcbiAgICogQkVGT1JFIGl0IHJlbmRlcnMgYW55dGhpbmcgaW50byBpdCwgc28ge0BsaW5rIHJlbmRlckNvbmZsaWN0V2FybmluZ0Jhbm5lcn0gd3JpdGluZyBub3RoaW5nIGNhbm5vdFxuICAgKiBhbnN3ZXIgdGhlIHF1ZXN0aW9uIGZvciBpdCDigJQgYSByb3cgdGhhdCByZW5kZXJzIGVtcHR5IGlzIHN0aWxsIGEgcm93LCB3aXRoIHRoZSBkaXZpZGVyIGFuZCBwYWRkaW5nXG4gICAqIGV2ZXJ5IG90aGVyIHNldHRpbmcgaGFzLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIGF0IGxlYXN0IG9uZSBkZWNsYXJlZCB3YXJuaW5nIGNvbmZsaWN0IGhvbGRzLlxuICAgKi9cbiAgcHVibGljIGhhc0FjdGl2ZVdhcm5pbmdDb25mbGljdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuV2FybikubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgd2F0Y2hpbmcgZXZlcnkgZGVjbGFyZWQgZGVwZW5kZW5jeSBhbmQgY29uZmxpY3QuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuICAgICAgY29uc3QgYXBpUmVmID0gd2F0Y2hQbHVnaW5BcGk8b2JqZWN0Pih7XG4gICAgICAgIGFwaVZlcnNpb25SYW5nZTogZGVwZW5kZW5jeS5hcGlWZXJzaW9uUmFuZ2UsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWRcbiAgICAgIH0pO1xuICAgICAgcmVnaXN0ZXJBc3luY0V2ZW50KFxuICAgICAgICB0aGlzLFxuICAgICAgICBhcGlSZWYub24oJ2NoYW5nZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLmFwaVJlZnMuc2V0KGRlcGVuZGVuY3kucGx1Z2luSWQsIGFwaVJlZik7XG4gICAgfVxuXG4gICAgLy8gQSBjb25mbGljdCBoYXMgbm8gQVBJIHRvIHdhdGNoIOKAlCBpdCBpcyByZWFkIG91dCBvZiB0aGUgbWFuaWZlc3RzIOKAlCBzbyB0aGUgdHJpZ2dlciB0byByZS1yZWFkIGlzIHRoZVxuICAgIC8vIGxpYnJhcnkncyBvd24gbGlmZWN5Y2xlIGJyb2FkY2FzdC4gSXQgY292ZXJzIGV2ZXJ5IGNvbmZsaWN0aW5nIHBsdWdpbiBidWlsdCBvbiB0aGlzIGxpYnJhcnk7IG9uZVxuICAgIC8vIHRoYXQgaXMgbm90IGlzIGNhdWdodCBhdCB0aGUgbmV4dCBsb2FkLCBhcyB0aGUgZmlsZSBoZWFkZXIgc2F5cy5cbiAgICBjb25zdCBsaWZlY3ljbGVFdmVudE5hbWVzOiBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWVbXSA9IFtQTFVHSU5fTE9BREVEX0VWRU5UX05BTUUsIFBMVUdJTl9VTkxPQURFRF9FVkVOVF9OQU1FXTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBvZiBsaWZlY3ljbGVFdmVudE5hbWVzKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKFxuICAgICAgICBldmVudE5hbWUsXG4gICAgICAgIGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAocGF5bG9hZDogUGx1Z2luTGlmZWN5Y2xlRXZlbnRQYXlsb2FkKSA9PiB7XG4gICAgICAgICAgaWYgKHBheWxvYWQucGx1Z2luSWQgPT09IHRoaXMucGx1Z2luLm1hbmlmZXN0LmlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICB9XG5cbiAgICAvLyBOb3RoaW5nIGlzIFNBSUQgYWJvdXQgYSBtaXNzaW5nIGRlcGVuZGVuY3kgdW50aWwgdGhlIGxheW91dCBpcyByZWFkeS4gUGx1Z2lucyBsb2FkIGluIGFuIHVuc3BlY2lmaWVkXG4gICAgLy8gb3JkZXIsIHNvIGEgZGVwZW5kZW5jeSB0aGF0IHNpbXBseSBoYXMgbm90IGxvYWRlZCB5ZXQgaXMgaW5kaXN0aW5ndWlzaGFibGUgYXQgdGhpcyBwb2ludCBmcm9tIG9uZVxuICAgIC8vIHRoYXQgaXMgbm90IGluc3RhbGxlZCDigJQgYW5ub3VuY2luZyBoZXJlIHdvdWxkIHB1dCBhIFwibWlzc2luZyBwbHVnaW5cIiBub3RpY2Ugb24gc2NyZWVuIGF0IGV2ZXJ5XG4gICAgLy8gc3RhcnR1cCBhbmQgdGFrZSBpdCBhd2F5IGEgbW9tZW50IGxhdGVyLiBUaGUgZ2F0ZSBpdHNlbGYgZG9lcyBub3Qgd2FpdDogdGhlIHN1cmZhY2UgbG9hZHMgdGhlXG4gICAgLy8gaW5zdGFudCB0aGUgZGVwZW5kZW5jeSBpcyB0aGVyZSwgd2hlbmV2ZXIgdGhhdCBpcy5cbiAgICB0aGlzLmFkZENoaWxkKFxuICAgICAgbmV3IENhbGxiYWNrTGF5b3V0UmVhZHlDb21wb25lbnQodGhpcy5hcHAsICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0xheW91dFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcmVzZW50VW5zYXRpc2ZpZWQodGhpcy5nZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpLCB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5LkJsb2NrKSk7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VXYXJuaW5ncygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlcigoKSA9PiB7XG4gICAgICB0aGlzLmNhbmNlbExvc3NBbm5vdW5jZW1lbnQoKTtcbiAgICAgIHRoaXMuaGlkZUJsb2NrZWRTZXR0aW5nVGFiKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIHRoZSBnYXRlIG9uY2UgdGhlIHdhdGNoZXMgYXJlIGluIHBsYWNlLCBsb2FkaW5nIHRoZSBmZWF0dXJlIHN1cmZhY2UgaWYgaXQgaXMgYWxyZWFkeSBvcGVuLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGZpcnN0IGV2YWx1YXRpb24gaXMgY29tcGxldGUuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgb25sb2FkQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBhIGJhbm5lciBmb3IgZXZlcnkgY29uZmxpY3QgdGhlIGhvc3QgaXMgcnVubmluZyBhbG9uZ3NpZGUsIHNvIGEgcGx1Z2luIGNhbiBwdXQgdGhlIG92ZXJsYXAgaW5cbiAgICogaXRzIG93biBzZXR0aW5ncyB0YWIuXG4gICAqXG4gICAqIENvbnN1bWVyLWludm9rZWQsIGV4YWN0bHkgbGlrZSBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudC5yZW5kZXJCYW5uZXJgOiB0aGUgbGlicmFyeSByZWdpc3RlcnMgdGhlXG4gICAqIHNldHRpbmdzIHRhYiBhIEJMT0NLRUQgcGx1Z2luIG5lZWRzLCBiZWNhdXNlIHRoYXQgcGx1Z2luIG5ldmVyIGdvdCB0byByZWdpc3RlciBvbmUgb2YgaXRzIG93biwgYnV0IGl0XG4gICAqIGhhcyBubyBob29rIGludG8gdGhlIHRhYiBhIHJ1bm5pbmcgcGx1Z2luIGJ1aWxkcy4gUmVuZGVycyBub3RoaW5nIHdoZW4gbm8gd2FybmluZyBjb25mbGljdCBob2xkcy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyQ29uZmxpY3RXYXJuaW5nQmFubmVyKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY29uZmxpY3Qgb2YgdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKSkge1xuICAgICAgdGhpcy5yZW5kZXJDb25mbGljdEVudHJ5KGNvbnRhaW5lckVsLCBjb25mbGljdCwgdGhpcy5jcmVhdGVDb25mbGljdFdhcm5pbmdNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgd2hhdCB3ZW50IGF3YXkgd2hpbGUgdGhlIHBsdWdpbiB3YXMgcnVubmluZywgbm93IHRoYXQgdGhlIGdyYWNlIHBlcmlvZCBpcyBvdmVyLlxuICAgKlxuICAgKiBSZS1yZWFkcyB0aGUgZ2F0ZSByYXRoZXIgdGhhbiB0cnVzdGluZyB3aGF0IGNsb3NlZCBpdCwgc28gYSBkZXBlbmRlbmN5IHRoYXQgd2VudCBhd2F5IGR1cmluZyB0aGVcbiAgICogd2luZG93IGlzIGFubm91bmNlZCB3aXRoIHRoZSByZXN0LiBPbmUgdGhhdCBjYW1lIGJhY2sgaW4gdGltZSBuZXZlciBnZXRzIGhlcmU6IHRoZSBnYXRlIHJlb3BlbmluZ1xuICAgKiBjYW5jZWxzIHRoZSB0aW1lci5cbiAgICovXG4gIHByaXZhdGUgYW5ub3VuY2VMb3NzKCk6IHZvaWQge1xuICAgIHRoaXMubG9zc0Fubm91bmNlbWVudFRpbWVySWQgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHRoaXMuZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKSkge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZURlcGVuZGVuY3lMb3N0TWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5LkJsb2NrKSkge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUNvbmZsaWN0QXBwZWFyZWRNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhbm5vdW5jZVdhcm5pbmdzKCk6IHZvaWQge1xuICAgIC8vIEEgd2FybmluZyBkZXNjcmliZXMgdHdvIHBsdWdpbnMgdGhhdCBhcmUgYm90aCBSVU5OSU5HLCBzbyBpdCBpcyBwb2ludGxlc3Mgd2hpbGUgdGhpcyBvbmUgaXMgYmxvY2tlZFxuICAgIC8vIOKAlCBhbmQgaXQgd2FpdHMgZm9yIGxheW91dC1yZWFkeSBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBibG9ja2VkIG5vdGljZSBkb2VzLlxuICAgIGlmICghdGhpcy5pc0xheW91dFJlYWR5IHx8ICF0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuV2FybikpIHtcbiAgICAgIGlmICh0aGlzLmFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMuaGFzKGNvbmZsaWN0LnBsdWdpbklkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hbm5vdW5jZWRXYXJuaW5nUGx1Z2luSWRzLmFkZChjb25mbGljdC5wbHVnaW5JZCk7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlQ29uZmxpY3RXYXJuaW5nTWVzc2FnZShjb25mbGljdCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCk7XG4gICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBpZiAodGhpcy5pc1Rvb09sZChkZXBlbmRlbmN5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVmVyc2lvbk1pc21hdGNoTWVzc2FnZShkZXBlbmRlbmN5KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1J1bm5pbmcoZGVwZW5kZW5jeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU5vUmVhZGFibGVBcGlNZXNzYWdlKGRlcGVuZGVuY3kpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5ibG9ja2VkTm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb25mbGljdEFwcGVhcmVkTWVzc2FnZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0LmNvbmZsaWN0QXBwZWFyZWROb3RpY2UsIHtcbiAgICAgIGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogYXNDb2RlQmxvY2soY29uZmxpY3QucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29uZmxpY3RCbG9ja2VkTWVzc2FnZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0LmJsb2NrZWROb3RpY2UsIHtcbiAgICAgIGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogYXNDb2RlQmxvY2soY29uZmxpY3QucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29uZmxpY3RXYXJuaW5nTWVzc2FnZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0Lndhcm5pbmdOb3RpY2UsIHtcbiAgICAgIGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogYXNDb2RlQmxvY2soY29uZmxpY3QucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGVwZW5kZW5jeUxvc3RNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBpZiAodGhpcy5pc1Rvb09sZChkZXBlbmRlbmN5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVmVyc2lvbk1pc21hdGNoTWVzc2FnZShkZXBlbmRlbmN5KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1J1bm5pbmcoZGVwZW5kZW5jeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU5vUmVhZGFibGVBcGlNZXNzYWdlKGRlcGVuZGVuY3kpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5kZXBlbmRlbmN5TG9zdE5vdGljZSwge1xuICAgICAgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGRlcGVuZGVuY3kucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTm9SZWFkYWJsZUFwaU1lc3NhZ2UoZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5ub1JlYWRhYmxlQXBpTm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkRlcGVuZGVuY3kudmVyc2lvbk1pc21hdGNoTm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBkZWNsYXJlZCBjb25mbGljdHMgb2Ygb25lIHNldmVyaXR5IHRoYXQgYXJlIGN1cnJlbnRseSBpbiBmb3JjZS5cbiAgICpcbiAgICogQHBhcmFtIHNldmVyaXR5IC0gVGhlIHNldmVyaXR5IHRvIHNlbGVjdC5cbiAgICogQHJldHVybnMgVGhlIGNvbmZsaWN0cyBob2xkaW5nIHJpZ2h0IG5vdywgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWNsYXJlZC5cbiAgICovXG4gIHByaXZhdGUgZ2V0QWN0aXZlQ29uZmxpY3RzKHNldmVyaXR5OiBQbHVnaW5Db25mbGljdFNldmVyaXR5KTogUGx1Z2luQ29uZmxpY3RbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmxpY3RzLmZpbHRlcigoY29uZmxpY3QpID0+IGNvbmZsaWN0LnNldmVyaXR5ID09PSBzZXZlcml0eSAmJiB0aGlzLmlzQ29uZmxpY3RBY3RpdmUoY29uZmxpY3QpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKTogUGx1Z2luRGVwZW5kZW5jeVtdIHtcbiAgICByZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXBlbmRlbmN5KSA9PiAhdGhpcy5hcGlSZWZzLmdldChkZXBlbmRlbmN5LnBsdWdpbklkKT8udmFsdWUgfHwgdGhpcy5pc0JlbG93TWluUGx1Z2luVmVyc2lvbihkZXBlbmRlbmN5KSk7XG4gIH1cblxuICBwcml2YXRlIGhpZGVCbG9ja2VkU2V0dGluZ1RhYigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYmxvY2tlZFNldHRpbmdUYWIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFwcC5zZXR0aW5nLnJlbW92ZVNldHRpbmdUYWIodGhpcy5ibG9ja2VkU2V0dGluZ1RhYik7XG4gICAgdGhpcy5ibG9ja2VkU2V0dGluZ1RhYiA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGF0IGEgcmVsZWFzZSBvbGRlciB0aGFuIGl0IGRlY2xhcmVkIGl0IG5lZWRzLlxuICAgKlxuICAgKiBSZWFkIGZyb20gdGhlIG1hbmlmZXN0LCBsaWtlIGEgY29uZmxpY3QsIGFuZCByZS1yZWFkIG9uIGV2ZXJ5IGV2YWx1YXRpb246IE9ic2lkaWFuIGFwcGxpZXMgYW4gdXBkYXRlIGJ5XG4gICAqIHJlbG9hZGluZyB0aGUgcHJvdmlkZXIsIHdoaWNoIGZpcmVzIHRoZSBBUEkgd2F0Y2gncyBgY2hhbmdlYCwgc28gdGhlIGdhdGUgb3BlbnMgd2l0aG91dCBhIHJlc3RhcnQuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBlbmRlbmN5IC0gVGhlIGRlY2xhcmVkIGRlcGVuZGVuY3kuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGRlcGVuZGVuY3kgaXMgZW5hYmxlZCBiZWxvdyBpdHMge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3kubWluUGx1Z2luVmVyc2lvbn07IGBmYWxzZWBcbiAgICogd2hlbiBpdCBkZWNsYXJlcyBub25lIG9yIGlzIG5vdCBlbmFibGVkLCBzaW5jZSBpdHMgQVBJIGlzIHRoZW4gYWJzZW50IGFueXdheS5cbiAgICovXG4gIHByaXZhdGUgaXNCZWxvd01pblBsdWdpblZlcnNpb24oZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IGJvb2xlYW4ge1xuICAgIGlmIChkZXBlbmRlbmN5Lm1pblBsdWdpblZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSBnZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZFxuICAgIH0pO1xuXG4gICAgaWYgKGluc3RhbGxlZFZlcnNpb24gPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuICFjb21wYXJlVmVyc2lvbnMoaW5zdGFsbGVkVmVyc2lvbiwgZGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9uLCAnPj0nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgb25lIGRlY2xhcmVkIGNvbmZsaWN0IGlzIGluIGZvcmNlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogT25seSBhbiBFTkFCTEVEIHBsdWdpbiBjb3VudHMuIE9uZSB0aGF0IGlzIGluc3RhbGxlZCBidXQgc3dpdGNoZWQgb2ZmIHJlZ2lzdGVycyBub3RoaW5nLCBzbyBpdCBjYW5ub3RcbiAgICogY29sbGlkZSwgYW5kIGFjdGluZyBvbiBpdCB3b3VsZCBiZSBhbiBhbGFybSB0aGUgdXNlciBjYW4gb25seSBhbnN3ZXIgYnkgdW5pbnN0YWxsaW5nIHNvbWV0aGluZyB0aGV5XG4gICAqIGhhdmUgYWxyZWFkeSB0dXJuZWQgb2ZmLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmxpY3QgLSBUaGUgZGVjbGFyZWQgY29uZmxpY3QuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNvbmZsaWN0aW5nIHBsdWdpbiBpcyBlbmFibGVkIGF0IGEgY29uZmxpY3RpbmcgdmVyc2lvbi5cbiAgICovXG4gIHByaXZhdGUgaXNDb25mbGljdEFjdGl2ZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbnN0YWxsZWRWZXJzaW9uID0gZ2V0SW5zdGFsbGVkUGx1Z2luVmVyc2lvbih7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgcGx1Z2luSWQ6IGNvbmZsaWN0LnBsdWdpbklkXG4gICAgfSk7XG5cbiAgICBpZiAoaW5zdGFsbGVkVmVyc2lvbiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc2F0aXNmaWVzVmVyc2lvbihpbnN0YWxsZWRWZXJzaW9uLCBjb25mbGljdC5jb25mbGljdGluZ1ZlcnNpb25SYW5nZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGFuIHVuc2F0aXNmaWVkIGRlcGVuZGVuY3kgaXMgbm9uZXRoZWxlc3MgZW5hYmxlZCBhbmQgbG9hZGVkLlxuICAgKlxuICAgKiBTdWNoIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGJ1dCBwdWJsaXNoZXMgbm8gQVBJIHRoaXMgcGx1Z2luIGNhbiByZWFkIOKAlCBub25lIGF0IGFsbCwgb3Igb25lIHdob3NlIHNoYXBlXG4gICAqIGZhaWxzIHRoZSBjb250cmFjdC4gVGhlIHVzdWFsIGNhdXNlIGlzIGEgcmVsZWFzZSBidWlsdCBvbiBhIGNvcHkgb2YgdGhpcyBsaWJyYXJ5IHRoYXQgcHVibGlzaGVzXG4gICAqIHNvbWV3aGVyZSB0aGlzIG9uZSBkb2VzIG5vdCBsb29rLCBzbyBcImluc3RhbGwgYW5kIGVuYWJsZSBpdFwiIHdvdWxkIGJlIGZhbHNlIGFuZCBcInVwZGF0ZSBpdFwiIGlzIHRoZSBmaXguXG4gICAqXG4gICAqIEJlaW5nIGluIGBlbmFibGVkUGx1Z2luc2AgaXMgbm90IGVub3VnaDogT2JzaWRpYW4ncyBwbGFpbiBgZGlzYWJsZVBsdWdpbmAgdW5sb2FkcyBhIHBsdWdpbiBhbmQgbGVhdmVzIGl0XG4gICAqIHRoZXJlIChvbmx5IGBkaXNhYmxlUGx1Z2luQW5kU2F2ZWAgcmVtb3ZlcyBpdCksIHNvIGEgcHJvdmlkZXIgdGhhdCB3ZW50IGF3YXkgd291bGQgb3RoZXJ3aXNlIHJlYWQgYXNcbiAgICogcnVubmluZyB3aXRoIGFuIHVucmVhZGFibGUgQVBJLlxuICAgKlxuICAgKiBAcGFyYW0gZGVwZW5kZW5jeSAtIFRoZSBkZWNsYXJlZCBkZXBlbmRlbmN5LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBkZXBlbmRlbmN5IGlzIGVuYWJsZWQgYW5kIGxvYWRlZC5cbiAgICovXG4gIHByaXZhdGUgaXNSdW5uaW5nKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0SW5zdGFsbGVkUGx1Z2luU3RhdGUoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWRcbiAgICAgICAgfSkgPT09IEluc3RhbGxlZFBsdWdpblN0YXRlLkVuYWJsZWQgJiYgdGhpcy5hcHAucGx1Z2lucy5nZXRQbHVnaW4oZGVwZW5kZW5jeS5wbHVnaW5JZCkgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGJ1dCB0b28gb2xkIGZvciB0aGlzIHBsdWdpbiwgc28gdGhlIGFkdmljZSBpcyBcInVwZGF0ZSBpdFwiLlxuICAgKlxuICAgKiBUd28gaW5kZXBlbmRlbnQgc2lnbmFscyBzYXkgc286IGEgcmVsZWFzZSBiZWxvdyB7QGxpbmsgUGx1Z2luRGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9ufSwgYW5kIGEgcHVibGlzaGVkXG4gICAqIEFQSSB3aG9zZSBjb250cmFjdCB2ZXJzaW9uIGlzIG91dHNpZGUge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3kuYXBpVmVyc2lvblJhbmdlfS5cbiAgICpcbiAgICogQHBhcmFtIGRlcGVuZGVuY3kgLSBUaGUgZGVjbGFyZWQgZGVwZW5kZW5jeS5cbiAgICogQHJldHVybnMgV2hldGhlciB1cGRhdGluZyB0aGUgZGVwZW5kZW5jeSBpcyB3aGF0IGl0IG5lZWRzLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1Rvb09sZChkZXBlbmRlbmN5OiBQbHVnaW5EZXBlbmRlbmN5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNCZWxvd01pblBsdWdpblZlcnNpb24oZGVwZW5kZW5jeSlcbiAgICAgIHx8IHRoaXMuYXBpUmVmcy5nZXQoZGVwZW5kZW5jeS5wbHVnaW5JZCk/LnVuYXZhaWxhYmlsaXR5UmVhc29uID09PSBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbi5WZXJzaW9uTWlzbWF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogU2F5cyB3aGF0IGlzIGluIHRoZSB3YXksIGFuZCBwdXRzIHRoZSBzYW1lIGV4cGxhbmF0aW9uIHdoZXJlIHRoZSB1c2VyIHdpbGwgbG9vayBmb3IgdGhlIHBsdWdpbidzXG4gICAqIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMgLSBUaGUgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgc2F0aXNmaWVkLlxuICAgKiBAcGFyYW0gYmxvY2tpbmdDb25mbGljdHMgLSBUaGUgY29uZmxpY3RzIGN1cnJlbnRseSByZWZ1c2luZyB0aGUgcGx1Z2luIHRoZSByaWdodCB0byBydW4uXG4gICAqL1xuICBwcml2YXRlIHByZXNlbnRVbnNhdGlzZmllZChcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0xheW91dFJlYWR5IHx8ICh1bnNhdGlzZmllZERlcGVuZGVuY2llcy5sZW5ndGggPT09IDAgJiYgYmxvY2tpbmdDb25mbGljdHMubGVuZ3RoID09PSAwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0Jsb2NrZWRTZXR0aW5nVGFiKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLCBibG9ja2luZ0NvbmZsaWN0cyk7XG5cbiAgICBpZiAodGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodGhpcy5jcmVhdGVCbG9ja2VkTWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiBibG9ja2luZ0NvbmZsaWN0cykge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmUtZXZhbHVhdGVzIHRoZSBnYXRlIGFuZCBtb3ZlcyB0aGUgZmVhdHVyZSBzdXJmYWNlIHRvIG1hdGNoLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHN1cmZhY2UgbWF0Y2hlcyB0aGUgZ2F0ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1bnNhdGlzZmllZERlcGVuZGVuY2llcyA9IHRoaXMuZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKTtcbiAgICBjb25zdCBibG9ja2luZ0NvbmZsaWN0cyA9IHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuQmxvY2spO1xuXG4gICAgaWYgKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCAmJiBibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpO1xuICAgICAgdGhpcy5oaWRlQmxvY2tlZFNldHRpbmdUYWIoKTtcbiAgICAgIHRoaXMuaGFzQW5ub3VuY2VkQmxvY2tlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoIXRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCkge1xuICAgICAgICB0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRGZWF0dXJlU3VyZmFjZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFubm91bmNlV2FybmluZ3MoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0ZlYXR1cmVTdXJmYWNlTG9hZGVkKSB7XG4gICAgICB0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMudW5sb2FkRmVhdHVyZVN1cmZhY2UoKTtcblxuICAgICAgLy8gQSBnYXRlIHRoYXQgY2xvc2VzIHdoaWxlIHRoZSBwbHVnaW4gaXMgUlVOTklORyBpcyB0aGUgY2FzZSB3b3J0aCBiZWluZyBsb3VkIGFib3V0OiB0aGUgdXNlciBqdXN0XG4gICAgICAvLyBkaWQgc29tZXRoaW5nLCBhbmQgdGhlIGNvbnNlcXVlbmNlIGlzIGltbWVkaWF0ZSBhbmQgaW52aXNpYmxlIHdpdGhvdXQgdGhpcy4gQW5ub3VuY2VkIHJlZ2FyZGxlc3NcbiAgICAgIC8vIG9mIGxheW91dCByZWFkaW5lc3MsIGJlY2F1c2UgYSBydW5uaW5nIHBsdWdpbiBtZWFucyB0aGUgbGF5b3V0IGlzIGxvbmcgc2luY2UgcmVhZHkg4oCUIGJ1dCBvbmx5XG4gICAgICAvLyBvbmNlIHRoZSBncmFjZSBwZXJpb2QgaGFzIHNob3duIHRoZSBsb3NzIGlzIG5vdCBhbiB1cGRhdGUgcmVsb2FkaW5nIHRoZSBwcm92aWRlciAoc2VlIHRoZSBmaWxlXG4gICAgICAvLyBoZWFkZXIpLlxuICAgICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hbm5vdW5jZUxvc3MoKTtcbiAgICAgIH0sIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgICB0aGlzLmhhc0Fubm91bmNlZEJsb2NrZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zaG93QmxvY2tlZFNldHRpbmdUYWIodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMsIGJsb2NraW5nQ29uZmxpY3RzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByZXNlbnRVbnNhdGlzZmllZCh1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGJsb2NrZWQgZXhwbGFuYXRpb24gaW50byBhIHNldHRpbmdzLXRhYiBjb250YWluZXI6IHdoYXQgaXMgbWlzc2luZyBvciBpbiB0aGUgd2F5LCB3aHkgaXRcbiAgICogbWF0dGVycywgYW5kIHRoZSBidXR0b24gdGhhdCBmaXhlcyBpdC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqIEBwYXJhbSB1bnNhdGlzZmllZERlcGVuZGVuY2llcyAtIFRoZSBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBzYXRpc2ZpZWQuXG4gICAqIEBwYXJhbSBibG9ja2luZ0NvbmZsaWN0cyAtIFRoZSBjb25mbGljdHMgY3VycmVudGx5IHJlZnVzaW5nIHRoZSBwbHVnaW4gdGhlIHJpZ2h0IHRvIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQmxvY2tlZEJhbm5lcihcbiAgICBjb250YWluZXJFbDogSFRNTEVsZW1lbnQsXG4gICAgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXM6IHJlYWRvbmx5IFBsdWdpbkRlcGVuZGVuY3lbXSxcbiAgICBibG9ja2luZ0NvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXVxuICApOiB2b2lkIHtcbiAgICBpZiAodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkRlcGVuZGVuY3kuc2V0dGluZ3NIZWFkaW5nKSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMpIHtcbiAgICAgIGNvbnN0IGJhbm5lckVsID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KHtcbiAgICAgICAgY2xzOiBbQ3NzQ2xhc3MuTGlicmFyeU5hbWUsIENzc0NsYXNzLlBsdWdpbkRlcGVuZGVuY3lCYW5uZXJdXG4gICAgICB9KTtcbiAgICAgIGJhbm5lckVsLmFwcGVuZCh0aGlzLmNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3kpKTtcbiAgICAgIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUoYmFubmVyRWwuY3JlYXRlRGl2KCksIGRlcGVuZGVuY3kucmVhc29uKTtcblxuICAgICAgY29uc3Qgc3RhdGUgPSBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkXG4gICAgICB9KTtcblxuICAgICAgLy8gQW4gZW5hYmxlZCBkZXBlbmRlbmN5IHRoYXQgaXMgc3RpbGwgdW5zYXRpc2ZpZWQgaXMgdG9vIG9sZCwgYW5kIGluc3RhbGxpbmcgb3IgZW5hYmxpbmcgaXQgYWdhaW4gZG9lc1xuICAgICAgLy8gbm90aGluZywgc28gaXQgaXMgb2ZmZXJlZCBhbiB1cGRhdGUgaW5zdGVhZC5cbiAgICAgIGlmIChzdGF0ZSAhPT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuRW5hYmxlZCkge1xuICAgICAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+XG4gICAgICAgICAgICBzdGF0ZSA9PT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuSW5zdGFsbGVkQnV0RGlzYWJsZWRcbiAgICAgICAgICAgICAgPyAkLm9ic2lkaWFuTGliLnBsdWdpblN1Z2dlc3Rpb24uZW5hYmxlXG4gICAgICAgICAgICAgIDogJC5vYnNpZGlhbkxpYi5wbHVnaW5TdWdnZXN0aW9uLmluc3RhbGxcbiAgICAgICAgICApKVxuICAgICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBpbnN0YWxsQW5kRW5hYmxlUGx1Z2luKHtcbiAgICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWQsXG4gICAgICAgICAgICAgIHBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSxcbiAgICAgICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gT2JzaWRpYW4gYXBwbGllcyB0aGUgdXBkYXRlIGJ5IHJlbG9hZGluZyB0aGUgZGVwZW5kZW5jeSwgd2hpY2ggcmVwdWJsaXNoZXMgaXRzIEFQSSwgc28gdGhlIHdhdGNoJ3NcbiAgICAgIC8vIGBjaGFuZ2VgIHJlb3BlbnMgdGhlIGdhdGUgd2l0aCBubyBmdXJ0aGVyIHN0ZXAgaGVyZS5cbiAgICAgIG5ldyBCdXR0b25Db21wb25lbnQoYmFubmVyRWwpXG4gICAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS51cGRhdGUsIHsgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSB9KSlcbiAgICAgICAgLnNldEN0YSgpXG4gICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdXBkYXRlUGx1Z2luKHtcbiAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZCxcbiAgICAgICAgICAgIHBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSxcbiAgICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgICByZXF1ZXN0aW5nUGx1Z2luTmFtZTogdGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG5cbiAgICAgIC8vIFRoZSBsaW5rIE9VVCB0byB0aGUgZGVwZW5kZW5jeSdzIG93biBzZXR0aW5ncywgc2hvd24gb25seSBvbmNlIGl0IGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZCDigJQgdGhlXG4gICAgICAvLyBvdGhlciBoYWxmIG9mIHRoZSByZWxhdGlvbnNoaXAgYmVpbmcgdmlzaWJsZSBmcm9tIGJvdGggZW5kcy4gSXQgaXMgd2hhdCBzdG9wcyBcImNvbmZpZ3VyZSBvbmVcbiAgICAgIC8vIG9wZXJhdGlvbiBhY3Jvc3MgdHdvIHBsdWdpbnNcIiBmcm9tIG1lYW5pbmcgXCJnbyBhbmQgZmluZCB0aGUgb3RoZXIgcGx1Z2luIHlvdXJzZWxmXCIuXG4gICAgICB0aGlzLnJlbmRlck9wZW5TZXR0aW5nc0J1dHRvbihiYW5uZXJFbCwgZGVwZW5kZW5jeS5wbHVnaW5JZCwgZGVwZW5kZW5jeS5wbHVnaW5OYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoYmxvY2tpbmdDb25mbGljdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0LnNldHRpbmdzSGVhZGluZykgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIGJsb2NraW5nQ29uZmxpY3RzKSB7XG4gICAgICB0aGlzLnJlbmRlckNvbmZsaWN0RW50cnkoY29udGFpbmVyRWwsIGNvbmZsaWN0LCB0aGlzLmNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBvbmUgY29uZmxpY3Q6IHdoYXQgaXQgaXMsIHdoeSBpdCBtYXR0ZXJzLCBhbmQgdGhlIHR3byB3YXlzIG91dCBvZiBpdC5cbiAgICpcbiAgICogVGhlIHJlcGFpciBpcyBvZmZlcmVkIG9uIHRoZSBPVEhFUiBwbHVnaW4g4oCUIGRpc2FibGluZyBpdCBpcyB0aGUgb25lIHRoaW5nIHRoaXMgcGx1Z2luIGNhbiBkbyBpbiBhXG4gICAqIGNsaWNrLCBzaW5jZSBpdCBjYW5ub3QgdXBkYXRlIHNvbWVvbmUgZWxzZSdzIHBsdWdpbiDigJQgYW5kIGl0IGlzIHRoZSBwZXJzaXN0ZWQgYGRpc2FibGVQbHVnaW5BbmRTYXZlYFxuICAgKiByYXRoZXIgdGhhbiB0aGUgdHJhbnNpZW50IGRpc2FibGUsIGJlY2F1c2UgdGhlIHVzZXIgYXNrZWQgZm9yIGl0IGJ5IGNsaWNraW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgZWxlbWVudCB0byByZW5kZXIgaW50by5cbiAgICogQHBhcmFtIGNvbmZsaWN0IC0gVGhlIGNvbmZsaWN0IHRvIHJlbmRlci5cbiAgICogQHBhcmFtIG1lc3NhZ2VGcmFnbWVudCAtIFRoZSBzZW50ZW5jZSBleHBsYWluaW5nIHRoZSBjb25mbGljdC5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQ29uZmxpY3RFbnRyeShjb250YWluZXJFbDogSFRNTEVsZW1lbnQsIGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCwgbWVzc2FnZUZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KTogdm9pZCB7XG4gICAgY29uc3QgYmFubmVyRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoe1xuICAgICAgY2xzOiBbQ3NzQ2xhc3MuTGlicmFyeU5hbWUsIENzc0NsYXNzLlBsdWdpbkNvbmZsaWN0QmFubmVyXVxuICAgIH0pO1xuICAgIGJhbm5lckVsLmFwcGVuZChtZXNzYWdlRnJhZ21lbnQpO1xuICAgIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUoYmFubmVyRWwuY3JlYXRlRGl2KCksIGNvbmZsaWN0LnJlYXNvbik7XG5cbiAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5Db25mbGljdC5kaXNhYmxlLCB7IGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogY29uZmxpY3QucGx1Z2luTmFtZSB9KSlcbiAgICAgIC5zZXRDdGEoKVxuICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZGlzYWJsZUNvbW11bml0eVBsdWdpbih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5JZDogY29uZmxpY3QucGx1Z2luSWRcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuICAgICAgfSkpO1xuXG4gICAgdGhpcy5yZW5kZXJPcGVuU2V0dGluZ3NCdXR0b24oYmFubmVyRWwsIGNvbmZsaWN0LnBsdWdpbklkLCBjb25mbGljdC5wbHVnaW5OYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyT3BlblNldHRpbmdzQnV0dG9uKGJhbm5lckVsOiBIVE1MRWxlbWVudCwgcGx1Z2luSWQ6IHN0cmluZywgcGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbmV3IEJ1dHRvbkNvbXBvbmVudChiYW5uZXJFbClcbiAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5vcGVuRGVwZW5kZW5jeVNldHRpbmdzLCB7XG4gICAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBwbHVnaW5OYW1lXG4gICAgICB9KSlcbiAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHAuc2V0dGluZy5vcGVuKCk7XG4gICAgICAgIHRoaXMuYXBwLnNldHRpbmcub3BlblRhYkJ5SWQocGx1Z2luSWQpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dCbG9ja2VkU2V0dGluZ1RhYihcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJsb2NrZWRTZXR0aW5nVGFiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWRkZWQgdGhyb3VnaCBgYXBwLnNldHRpbmdgIHJhdGhlciB0aGFuIGBwbHVnaW4uYWRkU2V0dGluZ1RhYmAsIGJlY2F1c2UgdGhpcyB0YWIgaGFzIHRvIGNvbWUgYmFja1xuICAgIC8vIE9GRiBhZ2FpbiB0aGUgbW9tZW50IHRoZSBnYXRlIG9wZW5zIOKAlCBvdGhlcndpc2UgdGhlIHBsdWdpbidzIG93biBzZXR0aW5ncyB0YWIsIHJlZ2lzdGVyZWQgYnlcbiAgICAvLyBgb25sb2FkSW1wbGAsIHdvdWxkIGFwcGVhciBiZXNpZGUgYSBzdGFsZSBcInJlcXVpcmVkIHBsdWdpbiBtaXNzaW5nXCIgb25lLiBgcGx1Z2luLmFkZFNldHRpbmdUYWJgXG4gICAgLy8gb25seSBldmVyIHJlbW92ZXMgYXQgcGx1Z2luIHVubG9hZC5cbiAgICBjb25zdCBibG9ja2VkU2V0dGluZ1RhYiA9IG5ldyBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYih7XG4gICAgICBwbHVnaW46IHRoaXMucGx1Z2luLFxuICAgICAgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWwpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJCbG9ja2VkQmFubmVyKGNvbnRhaW5lckVsLCB1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuYXBwLnNldHRpbmcuYWRkU2V0dGluZ1RhYihibG9ja2VkU2V0dGluZ1RhYik7XG4gICAgdGhpcy5ibG9ja2VkU2V0dGluZ1RhYiA9IGJsb2NrZWRTZXR0aW5nVGFiO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEZBLFNBQVMsMEJBQTBCO0FBQ25DO0FBQUEsRUFDRSxXQUFXO0FBQUEsRUFDWCxhQUFhO0FBQUEsT0FDUjtBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBU1AsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyxnQkFBZ0I7QUFDekI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxTQUFTO0FBQ2xCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsb0NBQW9DO0FBUTdDLE1BQU0saURBQWlEO0FBS2hELElBQUsseUJBQUwsa0JBQUtBLDRCQUFMO0FBT0wsRUFBQUEsd0JBQUEsV0FBUTtBQVFSLEVBQUFBLHdCQUFBLFVBQU87QUFmRyxTQUFBQTtBQUFBLEdBQUE7QUEwS1osTUFBTSxnQ0FBZ0MsaUJBQWlCO0FBQUEsRUFDcEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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
|
|
@@ -3,7 +3,7 @@ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
|
3
3
|
if you want to view the source, please visit the github repository of this plugin
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
const LIBRARY_VERSION = "6.0.
|
|
6
|
+
const LIBRARY_VERSION = "6.0.4";
|
|
7
7
|
const LIBRARY_STYLES = ".obsidian-lib.code-highlighter-component textarea, .obsidian-lib.code-highlighter-component pre, .obsidian-lib.code-highlighter-component code {\n font-family: var(--font-monospace);\n line-height: var(--line-height-normal);\n margin: 0;\n}\n.obsidian-lib.code-highlighter-component textarea, .obsidian-lib.code-highlighter-component code {\n font-size: var(--code-size);\n}\n.obsidian-lib.code-highlighter-component textarea {\n background: transparent;\n color: transparent;\n z-index: 2;\n width: 20em;\n height: 10em;\n}\n.obsidian-lib.code-highlighter-component pre {\n position: absolute;\n pointer-events: none;\n border: var(--input-border-width) solid transparent;\n overflow: auto;\n inset: 0;\n padding: var(--size-4-1) var(--size-4-2);\n z-index: 1;\n}\n.obsidian-lib.code-highlighter-component pre::after {\n content: \"\";\n display: block;\n height: var(--bottom-gap, 0);\n}\n.obsidian-lib.code-highlighter-component pre.is-placeholder {\n opacity: 0.6;\n}\n.obsidian-lib.code-highlighter-component code {\n display: block;\n padding: 0;\n}\n\n.obsidian-lib-lock-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--text-muted);\n}\n.obsidian-lib-lock-indicator .svg-icon {\n width: var(--icon-s);\n height: var(--icon-s);\n}\n\n@keyframes obsidian-lib-lock-indicator-flash {\n 40% {\n color: var(--text-error);\n transform: scale(1.4);\n }\n}\n.obsidian-lib-lock-indicator-flash {\n animation: obsidian-lib-lock-indicator-flash 0.35s ease-in-out;\n}\n\n.obsidian-lib input[type=url] {\n height: var(--input-height);\n}\n.obsidian-lib input[type=month],\n.obsidian-lib input[type=tel],\n.obsidian-lib input[type=time],\n.obsidian-lib input[type=url],\n.obsidian-lib input[type=week] {\n -webkit-app-region: no-drag;\n background: var(--background-modifier-form-field);\n border: var(--input-border-width) solid var(--background-modifier-border);\n color: var(--text-normal);\n font-family: inherit;\n padding: var(--size-4-1) var(--size-4-2);\n font-size: var(--font-ui-small);\n border-radius: var(--input-radius);\n outline: none;\n}\n@media (hover: hover) {\n .obsidian-lib input[type=month]:hover,\n .obsidian-lib input[type=tel]:hover,\n .obsidian-lib input[type=time]:hover,\n .obsidian-lib input[type=url]:hover,\n .obsidian-lib input[type=week]:hover {\n border-color: var(--background-modifier-border-hover);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n }\n}\n.obsidian-lib input[type=month]:active, .obsidian-lib input[type=month]:focus,\n.obsidian-lib input[type=tel]:active,\n.obsidian-lib input[type=tel]:focus,\n.obsidian-lib input[type=time]:active,\n.obsidian-lib input[type=time]:focus,\n.obsidian-lib input[type=url]:active,\n.obsidian-lib input[type=url]:focus,\n.obsidian-lib input[type=week]:active,\n.obsidian-lib input[type=week]:focus {\n border-color: var(--background-modifier-border-focus);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n}\n.obsidian-lib input[type=month]:active, .obsidian-lib input[type=month]:focus, .obsidian-lib input[type=month]:focus-visible,\n.obsidian-lib input[type=tel]:active,\n.obsidian-lib input[type=tel]:focus,\n.obsidian-lib input[type=tel]:focus-visible,\n.obsidian-lib input[type=time]:active,\n.obsidian-lib input[type=time]:focus,\n.obsidian-lib input[type=time]:focus-visible,\n.obsidian-lib input[type=url]:active,\n.obsidian-lib input[type=url]:focus,\n.obsidian-lib input[type=url]:focus-visible,\n.obsidian-lib input[type=week]:active,\n.obsidian-lib input[type=week]:focus,\n.obsidian-lib input[type=week]:focus-visible {\n box-shadow: 0 0 0 2px var(--background-modifier-border-focus);\n}\n.obsidian-lib input[type=month]::placeholder,\n.obsidian-lib input[type=tel]::placeholder,\n.obsidian-lib input[type=time]::placeholder,\n.obsidian-lib input[type=url]::placeholder,\n.obsidian-lib input[type=week]::placeholder {\n color: var(--text-faint);\n}\n.mod-rtl input[type=month],\n.mod-rtl input[type=time],\n.mod-rtl input[type=week],\n.is-rtl input[type=month],\n.is-rtl input[type=time],\n.is-rtl input[type=week],\n.rtl input[type=month],\n.rtl input[type=time],\n.rtl input[type=week] {\n direction: rtl;\n}\n.mod-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.rtl input[type=month]::-webkit-calendar-picker-indicator,\n.rtl input[type=time]::-webkit-calendar-picker-indicator,\n.rtl input[type=week]::-webkit-calendar-picker-indicator {\n right: var(--size-4-1);\n left: auto;\n}\n\n.obsidian-lib input[type=month],\n.obsidian-lib input[type=time],\n.obsidian-lib input[type=week] {\n font-variant-numeric: tabular-nums;\n position: relative;\n}\n.obsidian-lib input[type=month]::-webkit-datetime-edit-text,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-text,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-text {\n color: var(--text-faint);\n padding-inline-end: 0;\n}\n.obsidian-lib input[type=month]::-webkit-calendar-picker-indicator,\n.obsidian-lib input[type=time]::-webkit-calendar-picker-indicator,\n.obsidian-lib input[type=week]::-webkit-calendar-picker-indicator {\n position: absolute;\n left: var(--size-4-1);\n right: auto;\n opacity: 0.5;\n}\n.obsidian-lib input[type=month]::-webkit-datetime-edit-month-field:active, .obsidian-lib input[type=month]::-webkit-datetime-edit-month-field:focus, .obsidian-lib input[type=month]::-webkit-datetime-edit-day-field:active, .obsidian-lib input[type=month]::-webkit-datetime-edit-day-field:focus, .obsidian-lib input[type=month]::-webkit-datetime-edit-year-field:active, .obsidian-lib input[type=month]::-webkit-datetime-edit-year-field:focus,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-month-field:active,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-month-field:focus,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-day-field:active,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-day-field:focus,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-year-field:active,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-year-field:focus,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-month-field:active,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-month-field:focus,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-day-field:active,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-day-field:focus,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-year-field:active,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-year-field:focus {\n background-color: var(--text-selection);\n color: var(--text-normal);\n cursor: text;\n}\n.mod-rtl .obsidian-lib input[type=month], .is-rtl .obsidian-lib input[type=month], .rtl .obsidian-lib input[type=month],\n.mod-rtl .obsidian-lib input[type=time],\n.is-rtl .obsidian-lib input[type=time],\n.rtl .obsidian-lib input[type=time],\n.mod-rtl .obsidian-lib input[type=week],\n.is-rtl .obsidian-lib input[type=week],\n.rtl .obsidian-lib input[type=week] {\n direction: rtl;\n}\n.mod-rtl .obsidian-lib input[type=month]::-webkit-calendar-picker-indicator, .is-rtl .obsidian-lib input[type=month]::-webkit-calendar-picker-indicator, .rtl .obsidian-lib input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-lib input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-lib input[type=time]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-lib input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-lib input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-lib input[type=week]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-lib input[type=week]::-webkit-calendar-picker-indicator {\n left: auto;\n right: var(--size-4-1);\n}\n\nbody:not(.is-ios):not(.is-android) .obsidian-lib input[type=month],\nbody:not(.is-ios):not(.is-android) .obsidian-lib input[type=time],\nbody:not(.is-ios):not(.is-android) .obsidian-lib input[type=week] {\n padding-inline-start: var(--size-4-6);\n}\n\n.obsidian-lib input[type=time]::-webkit-calendar-picker-indicator {\n margin-inline-start: 0;\n}\n\nprogress.obsidian-lib.loop {\n min-width: 200px;\n}\n\n@keyframes obsidian-lib-minimized-modal-bar-pulse {\n 0%, 100% {\n box-shadow: var(--shadow-s);\n }\n 50% {\n box-shadow: 0 0 0 2px var(--interactive-accent);\n }\n}\n@keyframes obsidian-lib-minimized-modal-bar-attention {\n 0% {\n box-shadow: 0 0 0 0 var(--interactive-accent);\n }\n 40% {\n box-shadow: 0 0 0 4px var(--interactive-accent);\n }\n 100% {\n box-shadow: var(--shadow-s);\n }\n}\n.obsidian-lib.minimizable-modal .minimize-button {\n position: absolute;\n top: var(--size-4-2);\n right: calc(var(--size-4-2) + var(--size-4-9));\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-lib.minimizable-modal .minimize-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n.obsidian-lib.minimized-modal-bar {\n position: fixed;\n right: var(--size-4-4);\n bottom: calc(var(--size-4-4) + var(--size-4-8));\n z-index: var(--layer-modal);\n display: flex;\n align-items: center;\n gap: var(--size-4-2);\n padding: var(--size-4-2) var(--size-4-3);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-m);\n background: var(--background-secondary);\n box-shadow: var(--shadow-s);\n cursor: pointer;\n animation: obsidian-lib-minimized-modal-bar-pulse 2s ease-in-out infinite;\n}\n.obsidian-lib.minimized-modal-bar:hover {\n background-image: linear-gradient(var(--background-modifier-hover), var(--background-modifier-hover));\n}\n.obsidian-lib.minimized-modal-bar.minimized-modal-bar-attention {\n animation: obsidian-lib-minimized-modal-bar-attention 0.35s ease-out;\n}\n.obsidian-lib.minimized-modal-bar .minimized-modal-bar-title {\n font-weight: var(--font-medium);\n}\n.obsidian-lib.minimized-modal-bar .restore-button,\n.obsidian-lib.minimized-modal-bar .cancel-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-lib.minimized-modal-bar .restore-button:hover,\n.obsidian-lib.minimized-modal-bar .cancel-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n\n.obsidian-lib.modal-commands {\n display: flex;\n flex-wrap: wrap;\n gap: var(--size-2-2);\n padding: var(--size-4-2) var(--size-4-3);\n border-top: 1px solid var(--background-modifier-border);\n}\n.obsidian-lib.modal-command-control {\n margin-inline-start: var(--size-2-2);\n vertical-align: middle;\n}\n.obsidian-lib.modal-command {\n display: inline-flex;\n align-items: baseline;\n gap: var(--size-2-2);\n min-height: var(--size-4-8);\n padding: var(--size-2-1) var(--size-4-2);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-s);\n background-color: var(--background-secondary);\n color: var(--text-muted);\n font-size: var(--font-ui-smaller);\n white-space: nowrap;\n cursor: pointer;\n}\n.obsidian-lib.modal-command:hover:not(:disabled) {\n background-color: var(--background-modifier-hover);\n color: var(--text-normal);\n}\n.obsidian-lib.modal-command.is-active {\n border-color: var(--interactive-accent);\n background-color: var(--interactive-accent);\n color: var(--text-on-accent);\n}\n.obsidian-lib.modal-command:disabled {\n opacity: 0.5;\n cursor: default;\n}\n.obsidian-lib.modal-command-hotkey {\n color: var(--text-faint);\n font-size: var(--font-smallest);\n}\n.modal-command.is-active .obsidian-lib.modal-command-hotkey {\n opacity: 0.7;\n color: var(--text-on-accent);\n}\n\n.obsidian-lib.modal-container .ok-button {\n margin-right: 10px;\n margin-top: 20px;\n}\n\n.obsidian-lib.multiple-dropdown-component select,\n.obsidian-lib.multiple-dropdown-component select:focus,\n.obsidian-lib.multiple-dropdown-component .dropdown {\n height: auto;\n padding-top: 3px;\n}\n.obsidian-lib.multiple-dropdown-component select option:checked,\n.obsidian-lib.multiple-dropdown-component select:focus option:checked,\n.obsidian-lib.multiple-dropdown-component .dropdown option:checked {\n background-color: var(--interactive-accent);\n color: var(--text-on-accent);\n}\n\n.obsidian-lib.plugin-notice-name {\n color: var(--text-accent);\n display: inline-block;\n font-weight: var(--font-bold);\n margin-bottom: var(--size-4-2);\n}\n.obsidian-lib.plugin-notice-name code {\n color: inherit;\n}\n.obsidian-lib.plugin-notice-content {\n padding-right: var(--size-4-5);\n position: relative;\n}\n.obsidian-lib.plugin-notice-content .obsidian-lib.cancel-button {\n display: block;\n margin-top: var(--size-4-2);\n width: fit-content;\n}\n.obsidian-lib.plugin-notice-content .obsidian-lib.plugin-notice-close-button {\n position: absolute;\n right: var(--size-4-3);\n top: var(--size-4-3);\n}\n.obsidian-lib.plugin-notice-requires-explicit-close.notice {\n padding: 0;\n}\n.obsidian-lib.plugin-notice-requires-explicit-close.notice .obsidian-lib.plugin-notice-content {\n padding: var(--size-4-3) var(--size-4-4);\n}\n\n.obsidian-lib.plugin-settings-tab a:focus {\n outline: 2px solid var(--link-color);\n}\n\n.obsidian-lib.plugin-suggestion-banner {\n background-color: var(--background-secondary);\n border-left: var(--size-2-1) solid var(--text-accent);\n border-radius: var(--radius-s);\n display: flex;\n flex-direction: column;\n gap: var(--size-4-2);\n margin-bottom: var(--size-4-4);\n padding: var(--size-4-3) var(--size-4-4);\n}\n.obsidian-lib.plugin-suggestion-banner button {\n width: fit-content;\n}\n.obsidian-lib.plugin-suggestion-notice-buttons {\n display: flex;\n flex-wrap: wrap;\n gap: var(--size-4-2);\n margin-top: var(--size-4-2);\n}\n\n.obsidian-lib.popover {\n max-width: min(420px, 90vw);\n min-width: 320px;\n padding: var(--size-4-2) var(--size-4-3);\n position: absolute;\n z-index: var(--layer-menu);\n}\n.obsidian-lib.popover .setting-item {\n align-items: center;\n border-top: none;\n gap: var(--size-4-2);\n padding: var(--size-2-1) 0;\n}\n.obsidian-lib.popover .setting-item-info {\n margin-right: 0;\n}\n.obsidian-lib.popover .setting-item-control {\n flex-grow: 1;\n justify-content: flex-end;\n}\n.obsidian-lib.popover input[type=text] {\n width: 100%;\n}\n\n.obsidian-lib.prompt-modal .text-box {\n width: 100%;\n}\n\n.obsidian-lib button:not(.clickable-icon) {\n color: var(--text-color);\n}\n\n.obsidian-lib.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-lib :invalid:not(.untouched) {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-lib input.metadata-input-text:active:invalid:not(.untouched), .obsidian-lib input.metadata-input-text:focus-visible:invalid:not(.untouched), .obsidian-lib input.metadata-input-text:focus:invalid:not(.untouched),\n.obsidian-lib input[type=date]:active:invalid:not(.untouched),\n.obsidian-lib input[type=date]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=date]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=datetime-local]:active:invalid:not(.untouched),\n.obsidian-lib input[type=datetime-local]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=datetime-local]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=email]:active:invalid:not(.untouched),\n.obsidian-lib input[type=email]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=email]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=number]:active:invalid:not(.untouched),\n.obsidian-lib input[type=number]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=number]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=password]:active:invalid:not(.untouched),\n.obsidian-lib input[type=password]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=password]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=search]:active:invalid:not(.untouched),\n.obsidian-lib input[type=search]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=search]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=text]:active:invalid:not(.untouched),\n.obsidian-lib input[type=text]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=text]:focus:invalid:not(.untouched),\n.obsidian-lib textarea:active:invalid:not(.untouched),\n.obsidian-lib textarea:focus-visible:invalid:not(.untouched),\n.obsidian-lib textarea:focus:invalid:not(.untouched) {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-lib.setting-component-wrapper {\n position: relative;\n display: inline-flex;\n}\n.obsidian-lib.overlay-validator {\n caret-color: transparent;\n cursor: default;\n position: absolute;\n background-color: transparent;\n border: none;\n outline: none;\n pointer-events: none;\n z-index: 9999;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n}\n.obsidian-lib.tooltip.tooltip-validator {\n position: absolute;\n top: calc(100% + 8px);\n width: max-content;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../src/styles/code-highlighter-component.scss%22,%22../src/styles/editor-lock.scss%22,%22../src/styles/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/loop.scss%22,%22../src/styles/minimizable-modal.scss%22,%22../src/styles/modal-commands.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/plugin-notice.scss%22,%22../src/styles/plugin-settings-tab.scss%22,%22../src/styles/plugin-suggestion.scss%22,%22../src/styles/popover.scss%22,%22../src/styles/prompt-modal.scss%22,%22../src/styles/tldraw-button-color-workaround.scss%22,%22../src/styles/tri-state-checkbox-component.scss%22,%22../src/styles/validation.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEI;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;ACvCN;EACE;EACA;EACA;;AAEA;EACE;EACA;;;AAMJ;EACE;IACE;IACA;;;AAIJ;EACE;;;ACvBA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;AAAA;AAAA;AAAA;AAAA;IACE;IACA,YACE;;;AAMR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA,YACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;EACE;;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AC7DV;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;AAGF;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAIK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGP;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AAKF;AAAA;AAAA;EACE;;;AAMJ;EACE;;;AC/CK;EACP;;;ACJJ;EACE;IAEE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AASN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAOA;EACE;;AAOF;EACE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACE;EACA;;;ACpGN;EACE;EACA;EACA;EACA;EACA;;AAOF;EACE;EACA;;AAMF;EACE;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAKF;EACE;EACA;EACA;;AAKF;EACE;EACA;;AAIJ;EACE;EACA;;AAGA;EACE;EACA;;;ACpEF;EACE;EACA;;;ACCF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACZN;EACE;EACA;EACA;EACA;;AAGA;EACE;;AAIJ;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAKF;EACE;EACA;EACA;;AAOJ;EACE;;AAEA;EACE;;;ACrCF;EACE;;;ACFJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAKJ;EACE;EACA;EACA;EACA;;;ACjBF;EAIE;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;;AC9BF;EACE;;;ACUN;EACE;;;ACZE;EACE;;;ACKJ;EAPA;;AAuBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAvBJ;;AA6BA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA%22,%22file%22:%22styles.css%22,%22sourcesContent%22:%5B%22.obsidian-lib%20%7B%5Cn%20%20&.code-highlighter-component%20%7B%5Cn%20%20%20%20textarea,%20pre,%20code%20%7B%5Cn%20%20%20%20%20%20font-family:%20var(--font-monospace);%5Cn%20%20%20%20%20%20line-height:%20var(--line-height-normal);%5Cn%20%20%20%20%20%20margin:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea,%20code%20%7B%5Cn%20%20%20%20%20%20font-size:%20var(--code-size);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea%20%7B%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20transparent;%5Cn%20%20%20%20%20%20z-index:%202;%5Cn%20%20%20%20%20%20width:%2020em;%5Cn%20%20%20%20%20%20height:%2010em;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20%20%20border:%20var(--input-border-width)%20solid%20transparent;%5Cn%20%20%20%20%20%20overflow:%20auto;%5Cn%20%20%20%20%20%20inset:%200;%5Cn%20%20%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20%20%20z-index:%201;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre::after%20%7B%5Cn%20%20%20%20%20%20content:%20%5C%22%5C%22;%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20height:%20var(--bottom-gap,%200);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre.is-placeholder%20%7B%5Cn%20%20%20%20%20%20opacity:%200.6;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20Lock%20indicators%20shown%20in%20the%20tab%20header%20and%20the%20status%20bar%20while%20a%20note%20is%20locked.%20These%20live%20in%5Cn//%20global%20Obsidian%20DOM%20(tab%20header%20/%20status%20bar),%20so%20they%20are%20styled%20with%20a%20global%20class%20rather%20than%5Cn//%20scoped%20under%20%60.obsidian-lib%60.%5Cn.obsidian-lib-lock-indicator%20%7B%5Cn%20%20display:%20inline-flex;%5Cn%20%20align-items:%20center;%5Cn%20%20color:%20var(--text-muted);%5Cn%5Cn%20%20.svg-icon%20%7B%5Cn%20%20%20%20width:%20var(--icon-s);%5Cn%20%20%20%20height:%20var(--icon-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn//%20Flashed%20on%20every%20lock%20indicator%20(tab%20header,%20view%20action,%20status%20bar)%20when%20the%20user%20attempts%20to%5Cn//%20type%20in%20a%20locked%20note,%20to%20make%20clear%20the%20note%20is%20read-only.%20Re-added%20per%20rejected%20keystroke.%5Cn@keyframes%20obsidian-lib-lock-indicator-flash%20%7B%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20color:%20var(--text-error);%5Cn%20%20%20%20transform:%20scale(1.4);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-lib-lock-indicator-flash%20%7B%5Cn%20%20animation:%20obsidian-lib-lock-indicator-flash%200.35s%20ease-in-out;%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20input%5Btype='url'%5D%20%7B%5Cn%20%20%20%20height:%20var(--input-height)%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='tel'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='url'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20-webkit-app-region:%20no-drag;%5Cn%20%20%20%20background:%20var(--background-modifier-form-field);%5Cn%20%20%20%20border:%20var(--input-border-width)%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20font-family:%20inherit;%5Cn%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20font-size:%20var(--font-ui-small);%5Cn%20%20%20%20border-radius:%20var(--input-radius);%5Cn%20%20%20%20outline:%20none;%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20@media%20(hover:%20hover)%20%7B%5Cn%20%20%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20border-color:%20var(--background-modifier-border-hover);%5Cn%20%20%20%20%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus,%5Cn%20%20%20%20&:focus-visible%20%7B%5Cn%20%20%20%20%20%20box-shadow:%200%200%200%202px%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::placeholder%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20@at-root%20%7B%5Cn%20%20%20%20.mod-rtl,%5Cn%20%20%20%20.is-rtl,%5Cn%20%20%20%20.rtl%20%7B%5Cn%20%20%20%20%20%20&%20%7B%5Cn%20%20%20%20%20%20%20%20input%5Btype='month'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='time'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20font-variant-numeric:%20tabular-nums;%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-text%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%20%20padding-inline-end:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20left:%20var(--size-4-1);%5Cn%20%20%20%20%20%20right:%20auto;%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-month-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-day-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-year-field%20%7B%5Cn%20%20%20%20%20%20&:active,%5Cn%20%20%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--text-selection);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%20%20cursor:%20text;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20.mod-rtl%20&,%5Cn%20%20%20%20%20%20.is-rtl%20&,%5Cn%20%20%20%20%20%20.rtl%20&%20%7B%5Cn%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20body:not(.is-ios):not(.is-android)%20&%20%7B%5Cn%20%20%20%20%20%20%20%20padding-inline-start:%20var(--size-4-6);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='time'%5D%20%7B%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20margin-inline-start:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20//%20Not%20%60&progress%60:%20that%20APPENDS%20the%20element%20name%20to%20the%20parent%20class,%20producing%20one%20long%20class%20that%20matches%5Cn%20%20//%20nothing.%20The%20element%20type%20has%20to%20lead%20the%20compound%20selector%20instead.%5Cn%20%20@at-root%20progress%23%7B&%7D.loop%20%7B%5Cn%20%20%20%20min-width:%20200px;%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@keyframes%20obsidian-lib-minimized-modal-bar-pulse%20%7B%5Cn%20%200%25,%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%5Cn%20%2050%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%202px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn@keyframes%20obsidian-lib-minimized-modal-bar-attention%20%7B%5Cn%20%200%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%200%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%204px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-lib%20%7B%5Cn%20%20//%20The%20minimize%20button%20lives%20inside%20the%20modal%20container,%20left%20of%20Obsidian's%20close%20button.%5Cn%20%20&.minimizable-modal%20%7B%5Cn%20%20%20%20.minimize-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20right:%20calc(var(--size-4-2)%20+%20var(--size-4-9));%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20The%20minimized%20bar%20is%20appended%20to%20document.body.%20It%20floats%20at%20the%20bottom-right%20while%20minimized,%5Cn%20%20//%20and%20gently%20pulses%20an%20accent%20ring%20so%20the%20user%20does%20not%20forget%20about%20the%20minimized%20operation.%5Cn%20%20//%20It%20floats%20a%20status-bar's%20height%20above%20the%20bottom%20edge%20so%20it%20never%20covers%20the%20bottom-right%5Cn%20%20//%20status-bar%20items%20(e.g.%20the%20editor-lock%20unlock%20indicator,%20which%20lives%20in%20the%20same%20corner).%5Cn%20%20&.minimized-modal-bar%20%7B%5Cn%20%20%20%20position:%20fixed;%5Cn%20%20%20%20right:%20var(--size-4-4);%5Cn%20%20%20%20bottom:%20calc(var(--size-4-4)%20+%20var(--size-4-8));%5Cn%20%20%20%20z-index:%20var(--layer-modal);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20align-items:%20center;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-m);%5Cn%20%20%20%20background:%20var(--background-secondary);%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20animation:%20obsidian-lib-minimized-modal-bar-pulse%202s%20ease-in-out%20infinite;%5Cn%5Cn%20%20%20%20//%20Layer%20the%20translucent%20hover%20tint%20over%20the%20opaque%20%60background%60%20(%60--background-secondary%60)%20via%5Cn%20%20%20%20//%20%60background-image%60%20instead%20of%20replacing%20the%20background-color.%20%60--background-modifier-hover%60%20is%5Cn%20%20%20%20//%20translucent,%20so%20setting%20it%20as%20%60background%60%20would%20let%20the%20editor%20content%20behind%20the%20floating%20bar%5Cn%20%20%20%20//%20bleed%20through%20and%20make%20the%20title%20unreadable.%20A%20gradient%20of%20the%20tint%20composited%20over%20the%20opaque%5Cn%20%20%20%20//%20base%20keeps%20the%20bar%20opaque%20while%20preserving%20the%20subtle%20hover%20highlight.%5Cn%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20background-image:%20linear-gradient(var(--background-modifier-hover),%20var(--background-modifier-hover));%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20one-shot,%20more%20pronounced%20flash%20played%20when%20the%20user%20attempts%20a%20blocked%20action%20(a%20keystroke,%5Cn%20%20%20%20//%20right-click,%20or%20opening%20another%20modal)%20while%20this%20modal%20is%20minimized,%20so%20the%20block%20is%20not%5Cn%20%20%20%20//%20silent.%20Its%20higher%20specificity%20overrides%20the%20gentle%20infinite%20idle%20pulse%20while%20it%20plays;%20the%5Cn%20%20%20%20//%20class%20is%20removed%20on%20%60animationend%60,%20restoring%20the%20idle%20pulse.%5Cn%20%20%20%20&.minimized-modal-bar-attention%20%7B%5Cn%20%20%20%20%20%20animation:%20obsidian-lib-minimized-modal-bar-attention%200.35s%20ease-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.minimized-modal-bar-title%20%7B%5Cn%20%20%20%20%20%20font-weight:%20var(--font-medium);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.restore-button,%5Cn%20%20%20%20.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20//%20The%20strip%20of%20commands%20along%20the%20bottom%20of%20a%20modal.%5Cn%20%20//%5Cn%20%20//%20In%20%60Instructions%60%20render%20mode%20it%20also%20carries%20Obsidian's%20own%20%60.prompt-instructions%60%20%E2%80%94%20whose%20rule%20is%5Cn%20%20//%20unscoped,%20so%20it%20applies%20to%20a%20plain%20%60Modal%60%20too%20%E2%80%94%20and%20this%20one%20only%20re-tunes%20that%20rule's%20%60gap%60%20and%5Cn%20%20//%20%60padding%60%20and%20adds%20the%20separator;%20in%20%60Buttons%60%20mode%20it%20is%20the%20whole%20strip.%5Cn%20%20&.modal-commands%20%7B%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20flex-wrap:%20wrap;%5Cn%20%20%20%20gap:%20var(--size-2-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border-top:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%7D%5Cn%5Cn%20%20//%20A%20control%20the%20%60Instructions%60%20renderer%20injects%20into%20an%20instruction's%20purpose%20text%20%E2%80%94%20a%20checkbox,%20a%5Cn%20%20//%20dropdown.%20Obsidian%20styles%20the%20instruction%20bar%20itself,%20but%20its%20own%20bar%20never%20contains%20a%20control,%20so%5Cn%20%20//%20nothing%20upstream%20separates%20one%20from%20the%20label%20it%20belongs%20to.%20Sits%20on%20the%20control%20rather%20than%20on%20the%5Cn%20%20//%20strip,%20so%20it%20reaches%20a%20%60SuggestModal%60's%20native%20bar%20as%20well%20as%20a%20self-created%20one.%5Cn%20%20&.modal-command-control%20%7B%5Cn%20%20%20%20margin-inline-start:%20var(--size-2-2);%5Cn%20%20%20%20vertical-align:%20middle;%5Cn%20%20%7D%5Cn%5Cn%20%20//%20One%20command%20button.%20Replaces%20the%20instruction%20bar%20rather%20than%20supplementing%20it:%20the%20bar%20can%20only%20ever%5Cn%20%20//%20say%20which%20key%20to%20press,%20and%20on%20a%20phone%20there%20is%20no%20modifier%20key%20to%20press,%20so%20every%20control%20it%20names%5Cn%20%20//%20is%20unreachable%20there.%5Cn%20%20&.modal-command%20%7B%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%20%20align-items:%20baseline;%5Cn%20%20%20%20gap:%20var(--size-2-2);%5Cn%5Cn%20%20%20%20//%20Comfortably%20tappable%20on%20a%20phone,%20where%20this%20strip%20is%20the%20only%20way%20in.%5Cn%20%20%20%20min-height:%20var(--size-4-8);%5Cn%20%20%20%20padding:%20var(--size-2-1)%20var(--size-4-2);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20background-color:%20var(--background-secondary);%5Cn%20%20%20%20color:%20var(--text-muted);%5Cn%20%20%20%20font-size:%20var(--font-ui-smaller);%5Cn%20%20%20%20white-space:%20nowrap;%5Cn%20%20%20%20cursor:%20pointer;%5Cn%5Cn%20%20%20%20&:hover:not(:disabled)%20%7B%5Cn%20%20%20%20%20%20background-color:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20toggle%20that%20is%20ON.%20An%20action%20never%20carries%20it%20%E2%80%94%20it%20does%20something%20and%20is%20done,%20so%20there%20is%20no%5Cn%20%20%20%20//%20state%20for%20it%20to%20show.%5Cn%20%20%20%20&.is-active%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--interactive-accent);%5Cn%20%20%20%20%20%20background-color:%20var(--interactive-accent);%5Cn%20%20%20%20%20%20color:%20var(--text-on-accent);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20Disabled%20rather%20than%20removed:%20a%20strip%20that%20lost%20buttons%20as%20modes%20change%20would%20reflow%20under%20the%5Cn%20%20%20%20//%20pointer,%20which%20on%20a%20phone%20means%20a%20mis-tap.%5Cn%20%20%20%20&:disabled%20%7B%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%20%20cursor:%20default;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.modal-command-hotkey%20%7B%5Cn%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20font-size:%20var(--font-smallest);%5Cn%5Cn%20%20%20%20//%20Faint%20against%20the%20surface%20is%20right;%20faint%20against%20the%20accent%20fill%20is%20invisible.%5Cn%20%20%20%20.modal-command.is-active%20&%20%7B%5Cn%20%20%20%20%20%20opacity:%200.7;%5Cn%20%20%20%20%20%20color:%20var(--text-on-accent);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.modal-container%20%7B%5Cn%20%20%20%20.ok-button%20%7B%5Cn%20%20%20%20%20%20margin-right:%2010px;%5Cn%20%20%20%20%20%20margin-top:%2020px;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20//%20Compound,%20not%20nested:%20%60addPluginCssClasses%60%20puts%20%60obsidian-lib%60%20and%20%60multiple-dropdown-component%60%20on%20the%5Cn%20%20//%20SAME%20element%20(the%20setting's%20control%20container),%20so%20a%20descendant%20selector%20matched%20nothing%20and%20every%20multiple%5Cn%20%20//%20dropdown%20rendered%20one%20row%20tall%20%E2%80%94%20Obsidian's%20%60.dropdown%60%20height,%20with%20no%20popup%20behind%20it%20to%20pick%20from.%5Cn%20%20&.multiple-dropdown-component%20%7B%5Cn%20%20%20%20select,%5Cn%20%20%20%20select:focus,%5Cn%20%20%20%20.dropdown%20%7B%5Cn%20%20%20%20%20%20height:%20auto;%5Cn%20%20%20%20%20%20padding-top:%203px;%5Cn%5Cn%20%20%20%20%20%20option:checked%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--interactive-accent);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-on-accent);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.plugin-notice-name%20%7B%5Cn%20%20%20%20color:%20var(--text-accent);%5Cn%20%20%20%20display:%20inline-block;%5Cn%20%20%20%20font-weight:%20var(--font-bold);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-2);%5Cn%5Cn%20%20%20%20//%20The%20name%20is%20inline%20code;%20it%20keeps%20the%20code%20background%20and%20font%20but%20takes%20the%20prefix's%20accent%20color.%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20color:%20inherit;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.plugin-notice-content%20%7B%5Cn%20%20%20%20padding-right:%20var(--size-4-5);%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20.obsidian-lib.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20The%20close%20button%20reuses%20Obsidian's%20%60modal-header-button%60%20+%20%60clickable-icon%60%20classes%20so%20it%20matches%5Cn%20%20%20%20//%20The%20native%20modal%20close%20button%20(box%20+%20hover);%20only%20its%20corner%20position%20is%20set%20here.%5Cn%20%20%20%20.obsidian-lib.plugin-notice-close-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20right:%20var(--size-4-3);%5Cn%20%20%20%20%20%20top:%20var(--size-4-3);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20Move%20the%20notice's%20own%20padding%20onto%20the%20content%20wrapper%20so%20the%20wrapper%20covers%20the%20whole%20clickable%5Cn%20%20//%20Area%20%E2%80%94%20otherwise%20a%20click%20landing%20on%20the%20notice's%20bare%20padding%20(outside%20the%20wrapper)%20would%20bypass%20the%5Cn%20%20//%20Stop-propagation%20guard%20and%20dismiss%20the%20hard-to-close%20notice.%5Cn%20%20&.plugin-notice-requires-explicit-close.notice%20%7B%5Cn%20%20%20%20padding:%200;%5Cn%5Cn%20%20%20%20.obsidian-lib.plugin-notice-content%20%7B%5Cn%20%20%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.plugin-settings-tab%20%7B%5Cn%20%20%20%20a:focus%20%7B%5Cn%20%20%20%20%20%20outline:%202px%20solid%20var(--link-color);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.plugin-suggestion-banner%20%7B%5Cn%20%20%20%20background-color:%20var(--background-secondary);%5Cn%20%20%20%20border-left:%20var(--size-2-1)%20solid%20var(--text-accent);%5Cn%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20flex-direction:%20column;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-4);%5Cn%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%5Cn%5Cn%20%20%20%20button%20%7B%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20A%20notice%20lays%20its%20buttons%20out%20inline%20with%20no%20spacing,%20so%20the%20action%20button%20would%20touch%20the%20decline%20button.%5Cn%20%20&.plugin-suggestion-notice-buttons%20%7B%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20flex-wrap:%20wrap;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20A%20popover%20is%20anchored%20at%20a%20point%20and%20appended%20to%20the%20document%20body,%20outside%20any%20plugin-scoped%5Cn//%20container,%20so%20it%20is%20positioned%20absolutely%20at%20the%20top%20level.%20It%20borrows%20Obsidian's%20%60.menu%60%20look,%5Cn//%20which%20already%20carries%20the%20popup%20background,%20border%20and%20shadow%20%E2%80%94%20only%20layout%20is%20set%20here.%5Cn.obsidian-lib%20%7B%5Cn%20%20&.popover%20%7B%5Cn%20%20%20%20//%20Deliberately%20not%20%60calc(100vw%20-%2016px)%60:%20the%20SCSS%20compiler%20strips%20the%20%60calc(%60%20wrapper%20inside%5Cn%20%20%20%20//%20%60min()%60,%20which%20yields%20invalid%20CSS.%20A%20viewport%20percentage%20keeps%20a%20narrow%20window's%20popover%20on%5Cn%20%20%20%20//%20screen.%5Cn%20%20%20%20max-width:%20min(420px,%2090vw);%5Cn%20%20%20%20min-width:%20320px;%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20z-index:%20var(--layer-menu);%5Cn%5Cn%20%20%20%20//%20Setting%20rows%20are%20built%20for%20a%20full-width%20settings%20tab;%20compact%20them%20for%20a%20popover.%5Cn%20%20%20%20.setting-item%20%7B%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20border-top:%20none;%5Cn%20%20%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20%20%20padding:%20var(--size-2-1)%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-info%20%7B%5Cn%20%20%20%20%20%20margin-right:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-control%20%7B%5Cn%20%20%20%20%20%20flex-grow:%201;%5Cn%20%20%20%20%20%20justify-content:%20flex-end;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20input%5Btype='text'%5D%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.prompt-modal%20%7B%5Cn%20%20%20%20.text-box%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20The%20tldraw%20Obsidian%20plugin%20(tldraw/obsidian-plugin)%20ships%20an%20unscoped%20global%20rule%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20currentColor%20%7D%60%20that%20overrides%20Obsidian's%20own%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20var(--text-color)%20%7D%60%20app-wide.%20Obsidian%20sets%5Cn//%20%60--text-color%60%20contextually%20per%20button%20variant%20(%60--text-normal%60%20by%20default,%5Cn//%20%60--text-on-accent%60%20for%20%60.mod-cta%60,%20%60--text-error%60%20for%20%60.mod-warning%60),%20so%20tldraw's%5Cn//%20%60currentColor%60%20discards%20that%20and%20breaks%20button%20contrast%20outside%20tldraw%20%E2%80%94%20e.g.%5Cn//%20White-on-white%20action%20buttons%20inside%20a%20Notice.%20Re-assert%20Obsidian's%20own%20value%20inside%20the%5Cn//%20Library's%20own%20UI%20(specificity%200,2,1),%20which%20wins%20over%20tldraw's%20(0,1,1)%20while%20staying%20correct%5Cn//%20For%20every%20button%20variant%20(it%20reuses%20the%20same%20contextual%20%60--text-color%60).%5Cn//%20It%20MUST%20stay%20scoped%20to%20%60.obsidian-lib%60:%20an%20unscoped%20re-assert%20(it%20was%20%60body%20button%E2%80%A6%60,%5Cn//%200,1,2)%20lands%20on%20every%20button%20in%20the%20app%20and%20beats%20any%20other%20plugin's%20own%20button%20color%5Cn//%20Written%20at%200,1,1,%20which%20Obsidian's%20own%20rule%20used%20to%20lose%20to%20(obsidian-custom-attachment-location%2395).%5Cn//%20Defensive%20workaround%20%E2%80%94%20remove%20once%20the%20upstream%20fix%20ships%20(tldraw/obsidian-plugin%23210).%5Cn.obsidian-lib%20button:not(.clickable-icon)%20%7B%5Cn%20%20color:%20var(--text-color);%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.tri-state-checkbox-component%20%7B%5Cn%20%20%20%20input%5Btype='checkbox'%5D:indeterminate%20%7B%5Cn%20%20%20%20%20%20appearance:%20checkbox;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@mixin%20invalid%20%7B%5Cn%20%20box-shadow:%200%200%200%202px%20var(--text-error);%5Cn%7D%5Cn%5Cn//%20An%20input%20the%20user%20has%20not%20interacted%20with%20yet%20carries%20%60.untouched%60%20(set%20by%20%60PromptModal%60),%20so%20a%20modal%20that%5Cn//%20opens%20invalid%20by%20design%20does%20not%20greet%20the%20user%20in%20red.%20Both%20blocks%20below%20must%20be%20gated:%20the%20input%20is%5Cn//%20focused%20on%20open,%20so%20the%20focus%20block%20alone%20would%20keep%20painting%20it.%5Cn.obsidian-lib%20%7B%5Cn%20%20:invalid:not(.untouched)%20%7B%5Cn%20%20%20%20@include%20invalid;%5Cn%20%20%7D%5Cn%5Cn%20%20input.metadata-input-text,%5Cn%20%20input%5Btype='date'%5D,%5Cn%20%20input%5Btype='datetime-local'%5D,%5Cn%20%20input%5Btype='email'%5D,%5Cn%20%20input%5Btype='number'%5D,%5Cn%20%20input%5Btype='password'%5D,%5Cn%20%20input%5Btype='search'%5D,%5Cn%20%20input%5Btype='text'%5D,%5Cn%20%20textarea%20%7B%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus-visible,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20&:invalid:not(.untouched)%20%7B%5Cn%20%20%20%20%20%20%20%20@include%20invalid;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.setting-component-wrapper%20%7B%5Cn%20%20%20%20position:%20relative;%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%7D%5Cn%5Cn%20%20&.overlay-validator%20%7B%5Cn%20%20%20%20caret-color:%20transparent;%5Cn%20%20%20%20cursor:%20default;%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20border:%20none;%5Cn%20%20%20%20outline:%20none;%5Cn%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20z-index:%209999;%5Cn%20%20%20%20left:%200;%5Cn%20%20%20%20top:%200;%5Cn%20%20%20%20width:%20100%25;%5Cn%20%20%20%20height:%20100%25;%5Cn%20%20%7D%5Cn%5Cn%20%20&.tooltip.tooltip-validator%20%7B%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20top:%20calc(100%25%20+%208px);%5Cn%20%20%20%20width:%20max-content;%5Cn%20%20%7D%5Cn%7D%5Cn%22%5D%7D */\n";
|
|
8
8
|
export {
|
|
9
9
|
LIBRARY_STYLES,
|
|
@@ -58,6 +58,7 @@ export declare const en: {
|
|
|
58
58
|
readonly alreadyUpToDate: "{{dependencyPluginName}} is already at its latest release. {{pluginName}} needs a version that has not been released yet.";
|
|
59
59
|
readonly blockedNotice: "{{pluginName}} does nothing until {{dependencyPluginName}} is installed and enabled.";
|
|
60
60
|
readonly dependencyLostNotice: "{{dependencyPluginName}} is no longer available, so {{pluginName}} has stopped working. Bring it back to resume.";
|
|
61
|
+
readonly noReadableApiNotice: "{{dependencyPluginName}} is enabled but publishes no API {{pluginName}} can read, so {{pluginName}} does nothing. Update {{dependencyPluginName}} to resume.";
|
|
61
62
|
readonly openDependencySettings: "Open {{dependencyPluginName}} settings";
|
|
62
63
|
readonly settingsHeading: "Required plugin missing";
|
|
63
64
|
readonly update: "Update {{dependencyPluginName}}";
|
|
@@ -54,6 +54,7 @@ const en = {
|
|
|
54
54
|
alreadyUpToDate: "{{dependencyPluginName}} is already at its latest release. {{pluginName}} needs a version that has not been released yet.",
|
|
55
55
|
blockedNotice: "{{pluginName}} does nothing until {{dependencyPluginName}} is installed and enabled.",
|
|
56
56
|
dependencyLostNotice: "{{dependencyPluginName}} is no longer available, so {{pluginName}} has stopped working. Bring it back to resume.",
|
|
57
|
+
noReadableApiNotice: "{{dependencyPluginName}} is enabled but publishes no API {{pluginName}} can read, so {{pluginName}} does nothing. Update {{dependencyPluginName}} to resume.",
|
|
57
58
|
openDependencySettings: "Open {{dependencyPluginName}} settings",
|
|
58
59
|
settingsHeading: "Required plugin missing",
|
|
59
60
|
update: "Update {{dependencyPluginName}}",
|
|
@@ -95,4 +96,4 @@ const en = {
|
|
|
95
96
|
export {
|
|
96
97
|
en
|
|
97
98
|
};
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL2kxOG4vbG9jYWxlcy9lbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBFbmdsaXNoIHRyYW5zbGF0aW9ucyBmb3IgdGhlIGBpMThuYCBtb2R1bGUuXG4gKi9cblxuLyoqXG4gKiBUaGUgRW5nbGlzaCB0cmFuc2xhdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBlbiA9IHtcbiAgb2JzaWRpYW5MaWI6IHtcbiAgICBhc3luY1dpdGhOb3RpY2U6IHtcbiAgICAgIG1pbGxpc2Vjb25kczogJ21pbGxpc2Vjb25kcy4uLicsXG4gICAgICBvcGVyYXRpb246ICdPcGVyYXRpb24nLFxuICAgICAgcnVubmluZ0ZvcjogJ1J1bm5pbmcgZm9yJyxcbiAgICAgIHRlcm1pbmF0ZU9wZXJhdGlvbjogJ1lvdSBjYW4gdGVybWluYXRlIHRoZSBvcGVyYXRpb24gYnkgY2xpY2tpbmcgdGhlIGJ1dHRvbiBiZWxvdywgYnV0IGJlIGF3YXJlIGl0IG1pZ2h0IGxlYXZlIHRoZSB2YXVsdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuJyxcbiAgICAgIHRpbWVkT3V0OiAnVGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgYWZ0ZXIge3tkdXJhdGlvbiwgbnVtYmVyfX0gbWlsbGlzZWNvbmRzLidcbiAgICB9LFxuICAgIGJ1dHRvbnM6IHtcbiAgICAgIGNhbmNlbDogJ0NhbmNlbCcsXG4gICAgICBvazogJ09LJ1xuICAgIH0sXG4gICAgY2FsbG91dDoge1xuICAgICAgbG9hZENvbnRlbnQ6ICdMb2FkIGNvbnRlbnQgZm9yIGNhbGxvdXQnXG4gICAgfSxcbiAgICBkYXRhdmlldzoge1xuICAgICAgaXRlbXNQZXJQYWdlOiAnSXRlbXMgcGVyIHBhZ2U6JyxcbiAgICAgIGp1bXBUb1BhZ2U6ICdKdW1wIHRvIHBhZ2U6JyxcbiAgICAgIHBhZ2VIZWFkZXI6ICdQYWdlIHt7cGFnZU51bWJlciwgbnVtYmVyfX0gb2Yge3t0b3RhbFBhZ2VzLCBudW1iZXJ9fSwgVG90YWwgaXRlbXM6IHt7dG90YWxJdGVtcywgbnVtYmVyfX0nXG4gICAgfSxcbiAgICBtZW51OiB7XG4gICAgICBjb3B5OiAnQ29weSdcbiAgICB9LFxuICAgIG1ldGFkYXRhQ2FjaGU6IHtcbiAgICAgIGdldEJhY2tsaW5rc0ZvckZpbGVQYXRoOiAnR2V0IGJhY2tsaW5rcyBmb3Ige3tmaWxlUGF0aH19J1xuICAgIH0sXG4gICAgbm90aWNlczoge1xuICAgICAgYXR0YWNobWVudElzU3RpbGxVc2VkOiAnQXR0YWNobWVudCB7e2F0dGFjaG1lbnRQYXRofX0gaXMgc3RpbGwgdXNlZCBieSBvdGhlciBub3Rlcy4gSXQgd2lsbCBub3QgYmUgZGVsZXRlZC4nLFxuICAgICAgYXR0YWNobWVudFJlc2N1ZWQ6ICdBdHRhY2htZW50IHt7YXR0YWNobWVudFBhdGh9fSBpcyBzdGlsbCB1c2VkIGJ5IG90aGVyIG5vdGVzLiBJdCB3YXMgbW92ZWQgdG8ge3tuZXdBdHRhY2htZW50UGF0aH19LicsXG4gICAgICBjbG9zZUFyaWFMYWJlbDogJ0Nsb3NlJyxcbiAgICAgIGZhaWxlZFRvT3BlblVybDogJ0ZhaWxlZCB0byBvcGVuIHt7dXJsfX0nLFxuICAgICAgdW5oYW5kbGVkRXJyb3I6ICdBbiB1bmhhbmRsZWQgZXJyb3Igb2NjdXJyZWQuIFBsZWFzZSBjaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nXG4gICAgfSxcbiAgICBwYXRoU2V0dGluZ3M6IHtcbiAgICAgIGludmFsaWRHbG9iOiAnSW52YWxpZCBnbG9iIHBhdHRlcm46IHt7Z2xvYn19ICh7e3JlYXNvbn19KScsXG4gICAgICBpbnZhbGlkUmVndWxhckV4cHJlc3Npb246ICdJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbjoge3tyZWdFeHB9fSAoe3tyZWFzb259fSknLFxuICAgICAgdHJhaWxpbmdFc2NhcGU6ICdpdCBlbmRzIHdpdGggYW4gdW5lc2NhcGVkIFxcXFwnLFxuICAgICAgdW5jbG9zZWRDaGFyYWN0ZXJDbGFzczogJ2EgWyBjaGFyYWN0ZXIgY2xhc3MgaXMgbmV2ZXIgY2xvc2VkIHdpdGggXSdcbiAgICB9LFxuICAgIHBsdWdpbkNvbmZsaWN0OiB7XG4gICAgICBibG9ja2VkTm90aWNlOiAne3twbHVnaW5OYW1lfX0gZG9lcyBub3RoaW5nIHdoaWxlIHt7Y29uZmxpY3RpbmdQbHVnaW5OYW1lfX0gaXMgZW5hYmxlZC4gVXBkYXRlIG9yIGRpc2FibGUgaXQgdG8gY29udGludWUuJyxcbiAgICAgIGNvbmZsaWN0QXBwZWFyZWROb3RpY2U6ICd7e2NvbmZsaWN0aW5nUGx1Z2luTmFtZX19IGlzIG5vdyBlbmFibGVkLCBzbyB7e3BsdWdpbk5hbWV9fSBoYXMgc3RvcHBlZCB3b3JraW5nLiBVcGRhdGUgb3IgZGlzYWJsZSBpdCB0byByZXN1bWUuJyxcbiAgICAgIGRpc2FibGU6ICdEaXNhYmxlIHt7Y29uZmxpY3RpbmdQbHVnaW5OYW1lfX0nLFxuICAgICAgc2V0dGluZ3NIZWFkaW5nOiAnQ29uZmxpY3RpbmcgcGx1Z2luJyxcbiAgICAgIHdhcm5pbmdOb3RpY2U6ICd7e3BsdWdpbk5hbWV9fSBhbmQge3tjb25mbGljdGluZ1BsdWdpbk5hbWV9fSBvdmVybGFwLCBhbmQgYm90aCBhcmUgcnVubmluZy4nXG4gICAgfSxcbiAgICBwbHVnaW5EZXBlbmRlbmN5OiB7XG4gICAgICBhbHJlYWR5VXBUb0RhdGU6ICd7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0gaXMgYWxyZWFkeSBhdCBpdHMgbGF0ZXN0IHJlbGVhc2UuIHt7cGx1Z2luTmFtZX19IG5lZWRzIGEgdmVyc2lvbiB0aGF0IGhhcyBub3QgYmVlbiByZWxlYXNlZCB5ZXQuJyxcbiAgICAgIGJsb2NrZWROb3RpY2U6ICd7e3BsdWdpbk5hbWV9fSBkb2VzIG5vdGhpbmcgdW50aWwge3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19IGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZC4nLFxuICAgICAgZGVwZW5kZW5jeUxvc3ROb3RpY2U6ICd7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0gaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSwgc28ge3twbHVnaW5OYW1lfX0gaGFzIHN0b3BwZWQgd29ya2luZy4gQnJpbmcgaXQgYmFjayB0byByZXN1bWUuJyxcbiAgICAgIG5vUmVhZGFibGVBcGlOb3RpY2U6ICd7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0gaXMgZW5hYmxlZCBidXQgcHVibGlzaGVzIG5vIEFQSSB7e3BsdWdpbk5hbWV9fSBjYW4gcmVhZCwgc28ge3twbHVnaW5OYW1lfX0gZG9lcyBub3RoaW5nLiBVcGRhdGUge3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19IHRvIHJlc3VtZS4nLFxuICAgICAgb3BlbkRlcGVuZGVuY3lTZXR0aW5nczogJ09wZW4ge3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19IHNldHRpbmdzJyxcbiAgICAgIHNldHRpbmdzSGVhZGluZzogJ1JlcXVpcmVkIHBsdWdpbiBtaXNzaW5nJyxcbiAgICAgIHVwZGF0ZTogJ1VwZGF0ZSB7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0nLFxuICAgICAgdXBkYXRlZDogJ3t7ZGVwZW5kZW5jeVBsdWdpbk5hbWV9fSBpcyB1cGRhdGVkLicsXG4gICAgICB1cGRhdGVGYWlsZWQ6ICdGYWlsZWQgdG8gdXBkYXRlIHt7ZGVwZW5kZW5jeVBsdWdpbk5hbWV9fS4gQ2hlY2sgdGhlIGNvbnNvbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyxcbiAgICAgIHZlcnNpb25NaXNtYXRjaE5vdGljZTogJ3t7cGx1Z2luTmFtZX19IG5lZWRzIGEgbmV3ZXIgdmVyc2lvbiBvZiB7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0uIFVwZGF0ZSBpdCB0byByZXN1bWUuJ1xuICAgIH0sXG4gICAgcGx1Z2luU3VnZ2VzdGlvbjoge1xuICAgICAgZW5hYmxlOiAnRW5hYmxlJyxcbiAgICAgIGluc3RhbGw6ICdJbnN0YWxsIGFuZCBlbmFibGUnLFxuICAgICAgaW5zdGFsbGVkOiAne3twbHVnaW5OYW1lfX0gaXMgaW5zdGFsbGVkIGFuZCBlbmFibGVkLicsXG4gICAgICBpbnN0YWxsRmFpbGVkOiAnRmFpbGVkIHRvIGluc3RhbGwge3twbHVnaW5OYW1lfX0uIENoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9uLicsXG4gICAgICBub3ROb3c6ICdOb3Qgbm93J1xuICAgIH0sXG4gICAgcXVldWU6IHtcbiAgICAgIGZsdXNoUXVldWU6ICdGbHVzaCBxdWV1ZSdcbiAgICB9LFxuICAgIHJlbGVhc2VOb3Rlczoge1xuICAgICAgdGl0bGU6ICd7e3BsdWdpbk5hbWV9fSByZWxlYXNlIG5vdGVzJ1xuICAgIH0sXG4gICAgcmVuYW1lRGVsZXRlSGFuZGxlcjoge1xuICAgICAgaGFuZGxlRGVsZXRlOiAnSGFuZGxlIGRlbGV0ZToge3tmaWxlUGF0aH19JyxcbiAgICAgIGhhbmRsZU9ycGhhbmVkUmVuYW1lczogJ0hhbmRsZSBvcnBoYW5lZCByZW5hbWVzJyxcbiAgICAgIGhhbmRsZVJlbmFtZTogJ0hhbmRsZSByZW5hbWU6IHt7b2xkUGF0aH19IC0+IHt7bmV3UGF0aH19JyxcbiAgICAgIHVwZGF0ZWRMaW5rczogJ1VwZGF0ZWQge3tsaW5rc0NvdW50LCBudW1iZXJ9fSBsaW5rcyBpbiB7e2ZpbGVzQ291bnQsIG51bWJlcn19IGZpbGVzLidcbiAgICB9LFxuICAgIHJlc291cmNlTG9jazoge1xuICAgICAgbG9ja2VkQnlUb29sdGlwOiAnTG9ja2VkIGJ5JyxcbiAgICAgIGxvY2tlZE5vdGVUb29sdGlwOiAnVGhpcyBub3RlIGlzIGxvY2tlZCB3aGlsZSBhbiBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuJyxcbiAgICAgIHVubG9ja0NvbmZpcm1NZXNzYWdlOiAnVGhpcyB3aWxsIGNhbmNlbCB0aGUgb3BlcmF0aW9uKHMpIGN1cnJlbnRseSBob2xkaW5nIGEgbG9jayBvbiB0aGlzIG5vdGUgYW5kIG1heSBsZWF2ZSB0aGUgdmF1bHQgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBUaGUgbm90ZSBpcyBsb2NrZWQgYnk6JyxcbiAgICAgIHVubG9ja0NvbmZpcm1UaXRsZTogJ1VubG9jayBub3RlPycsXG4gICAgICB1bmxvY2tNZW51SXRlbTogJ1VubG9jaydcbiAgICB9LFxuICAgIHZhdWx0OiB7XG4gICAgICBwcm9jZXNzRmlsZTogJ1Byb2Nlc3MgZmlsZSB7e2ZpbGVQYXRofX0nXG4gICAgfVxuICB9XG59IGFzIGNvbnN0O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFTTyxNQUFNLEtBQUs7QUFBQSxFQUNoQixhQUFhO0FBQUEsSUFDWCxpQkFBaUI7QUFBQSxNQUNmLGNBQWM7QUFBQSxNQUNkLFdBQVc7QUFBQSxNQUNYLFlBQVk7QUFBQSxNQUNaLG9CQUFvQjtBQUFBLE1BQ3BCLFVBQVU7QUFBQSxJQUNaO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCxRQUFRO0FBQUEsTUFDUixJQUFJO0FBQUEsSUFDTjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLGNBQWM7QUFBQSxNQUNkLFlBQVk7QUFBQSxNQUNaLFlBQVk7QUFBQSxJQUNkO0FBQUEsSUFDQSxNQUFNO0FBQUEsTUFDSixNQUFNO0FBQUEsSUFDUjtBQUFBLElBQ0EsZUFBZTtBQUFBLE1BQ2IseUJBQXlCO0FBQUEsSUFDM0I7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLHVCQUF1QjtBQUFBLE1BQ3ZCLG1CQUFtQjtBQUFBLE1BQ25CLGdCQUFnQjtBQUFBLE1BQ2hCLGlCQUFpQjtBQUFBLE1BQ2pCLGdCQUFnQjtBQUFBLElBQ2xCO0FBQUEsSUFDQSxjQUFjO0FBQUEsTUFDWixhQUFhO0FBQUEsTUFDYiwwQkFBMEI7QUFBQSxNQUMxQixnQkFBZ0I7QUFBQSxNQUNoQix3QkFBd0I7QUFBQSxJQUMxQjtBQUFBLElBQ0EsZ0JBQWdCO0FBQUEsTUFDZCxlQUFlO0FBQUEsTUFDZix3QkFBd0I7QUFBQSxNQUN4QixTQUFTO0FBQUEsTUFDVCxpQkFBaUI7QUFBQSxNQUNqQixlQUFlO0FBQUEsSUFDakI7QUFBQSxJQUNBLGtCQUFrQjtBQUFBLE1BQ2hCLGlCQUFpQjtBQUFBLE1BQ2pCLGVBQWU7QUFBQSxNQUNmLHNCQUFzQjtBQUFBLE1BQ3RCLHFCQUFxQjtBQUFBLE1BQ3JCLHdCQUF3QjtBQUFBLE1BQ3hCLGlCQUFpQjtBQUFBLE1BQ2pCLFFBQVE7QUFBQSxNQUNSLFNBQVM7QUFBQSxNQUNULGNBQWM7QUFBQSxNQUNkLHVCQUF1QjtBQUFBLElBQ3pCO0FBQUEsSUFDQSxrQkFBa0I7QUFBQSxNQUNoQixRQUFRO0FBQUEsTUFDUixTQUFTO0FBQUEsTUFDVCxXQUFXO0FBQUEsTUFDWCxlQUFlO0FBQUEsTUFDZixRQUFRO0FBQUEsSUFDVjtBQUFBLElBQ0EsT0FBTztBQUFBLE1BQ0wsWUFBWTtBQUFBLElBQ2Q7QUFBQSxJQUNBLGNBQWM7QUFBQSxNQUNaLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxxQkFBcUI7QUFBQSxNQUNuQixjQUFjO0FBQUEsTUFDZCx1QkFBdUI7QUFBQSxNQUN2QixjQUFjO0FBQUEsTUFDZCxjQUFjO0FBQUEsSUFDaEI7QUFBQSxJQUNBLGNBQWM7QUFBQSxNQUNaLGlCQUFpQjtBQUFBLE1BQ2pCLG1CQUFtQjtBQUFBLE1BQ25CLHNCQUFzQjtBQUFBLE1BQ3RCLG9CQUFvQjtBQUFBLE1BQ3BCLGdCQUFnQjtBQUFBLElBQ2xCO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTCxhQUFhO0FBQUEsSUFDZjtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -61,6 +61,7 @@ declare const translationsMapImpl: {
|
|
|
61
61
|
readonly alreadyUpToDate: "{{dependencyPluginName}} is already at its latest release. {{pluginName}} needs a version that has not been released yet.";
|
|
62
62
|
readonly blockedNotice: "{{pluginName}} does nothing until {{dependencyPluginName}} is installed and enabled.";
|
|
63
63
|
readonly dependencyLostNotice: "{{dependencyPluginName}} is no longer available, so {{pluginName}} has stopped working. Bring it back to resume.";
|
|
64
|
+
readonly noReadableApiNotice: "{{dependencyPluginName}} is enabled but publishes no API {{pluginName}} can read, so {{pluginName}} does nothing. Update {{dependencyPluginName}} to resume.";
|
|
64
65
|
readonly openDependencySettings: "Open {{dependencyPluginName}} settings";
|
|
65
66
|
readonly settingsHeading: "Required plugin missing";
|
|
66
67
|
readonly update: "Update {{dependencyPluginName}}";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mnaoumov/obsidian-lib",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.4",
|
|
4
4
|
"description": "Runtime library for Obsidian plugin development: plugin base classes, components, settings, modals, vault and metadata helpers.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"obsidian",
|
|
@@ -327,13 +327,14 @@
|
|
|
327
327
|
"test": "jiti scripts/test.ts",
|
|
328
328
|
"test:coverage": "jiti scripts/test-coverage.ts",
|
|
329
329
|
"test:integration": "jiti scripts/test-integration.ts integration-tests obsidian-integration-tests",
|
|
330
|
+
"test:mutation": "jiti scripts/test-mutation.ts",
|
|
330
331
|
"test:watch": "jiti scripts/test-watch.ts",
|
|
331
332
|
"version": "jiti scripts/version.ts"
|
|
332
333
|
},
|
|
333
334
|
"dependencies": {
|
|
334
335
|
"@lezer/common": "1.5.2",
|
|
335
336
|
"@mnaoumov/obsidian-dataview": "^1.0.0",
|
|
336
|
-
"@mnaoumov/typescript-lib": "^1.6.
|
|
337
|
+
"@mnaoumov/typescript-lib": "^1.6.2",
|
|
337
338
|
"@standard-schema/spec": "^1.1.0",
|
|
338
339
|
"@types/react": "^19.3.0",
|
|
339
340
|
"compare-versions": "^6.1.1",
|
|
@@ -355,10 +356,12 @@
|
|
|
355
356
|
"@commitlint/cli": "^21.2.2",
|
|
356
357
|
"@commitlint/config-conventional": "^21.2.2",
|
|
357
358
|
"@mnaoumov/obsidian-dev-toolkit": "^5.2.0",
|
|
358
|
-
"@mnaoumov/typescript-dev-toolkit": "^3.
|
|
359
|
+
"@mnaoumov/typescript-dev-toolkit": "^3.11.0",
|
|
359
360
|
"@mnaoumov/typescript-test-toolkit": "^1.0.0",
|
|
360
361
|
"@obsidian-typings/obsidian-public-latest": "^6.37.0",
|
|
361
362
|
"@resvg/resvg-js": "^2.6.2",
|
|
363
|
+
"@stryker-mutator/core": "^10.1.1",
|
|
364
|
+
"@stryker-mutator/vitest-runner": "^10.1.1",
|
|
362
365
|
"@total-typescript/ts-reset": "^0.6.1",
|
|
363
366
|
"@tsconfig/strictest": "^2.0.8",
|
|
364
367
|
"@types/node": "^26.6.2",
|