obsidian-dev-utils 101.2.0 → 101.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -63,6 +63,7 @@ var CssClass = /* @__PURE__ */ ((CssClass2) => {
63
63
  CssClass2["MinimizedModalBarAttention"] = "minimized-modal-bar-attention";
64
64
  CssClass2["MinimizedModalBarTitle"] = "minimized-modal-bar-title";
65
65
  CssClass2["ModalCommand"] = "modal-command";
66
+ CssClass2["ModalCommandControl"] = "modal-command-control";
66
67
  CssClass2["ModalCommandHotkey"] = "modal-command-hotkey";
67
68
  CssClass2["ModalCommands"] = "modal-commands";
68
69
  CssClass2["ModalHeaderButton"] = "modal-header-button";
@@ -83,6 +84,7 @@ var CssClass = /* @__PURE__ */ ((CssClass2) => {
83
84
  CssClass2["PluginSuggestionBanner"] = "plugin-suggestion-banner";
84
85
  CssClass2["Popover"] = "popover";
85
86
  CssClass2["PromptInstruction"] = "prompt-instruction";
87
+ CssClass2["PromptInstructionCommand"] = "prompt-instruction-command";
86
88
  CssClass2["PromptInstructions"] = "prompt-instructions";
87
89
  CssClass2["PromptModal"] = "prompt-modal";
88
90
  CssClass2["RestoreButton"] = "restore-button";
@@ -106,4 +108,4 @@ var CssClass = /* @__PURE__ */ ((CssClass2) => {
106
108
  export {
107
109
  CssClass
108
110
  };
109
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2Nzcy1jbGFzcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENTUyBjbGFzc2VzIHVzZWQgYnkgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGxpYnJhcnkuXG4gKi9cblxuLyoqXG4gKiBDU1MgY2xhc3NlcyB1c2VkIGJ5IHRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzYCBsaWJyYXJ5LlxuICovXG5leHBvcnQgZW51bSBDc3NDbGFzcyB7XG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGFsZXJ0IG1vZGFsLlxuICAgKi9cbiAgQWxlcnRNb2RhbCA9ICdhbGVydC1tb2RhbCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgY2FuY2VsIGJ1dHRvbi5cbiAgICovXG4gIENhbmNlbEJ1dHRvbiA9ICdjYW5jZWwtYnV0dG9uJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBjaGVja2JveCBjb21wb25lbnQuXG4gICAqL1xuICBDaGVja2JveENvbXBvbmVudCA9ICdjaGVja2JveC1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIGNsYXNzIGZvciBhIGNsaWNrYWJsZSBpY29uIGJ1dHRvbiwgZ2l2aW5nIGl0IHRoZSBob3ZlciBiYWNrZ3JvdW5kIGFuZCBpY29uLWNvbG9yIHRyZWF0bWVudC5cbiAgICovXG4gIENsaWNrYWJsZUljb24gPSAnY2xpY2thYmxlLWljb24nLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIGNsYXNzIGZvciBhbiBpbmxpbmUgY29kZSBlbGVtZW50ICh1c2VkIGJ5IGBhcHBlbmRDb2RlQmxvY2tgKS5cbiAgICovXG4gIENvZGUgPSAnY29kZScsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgY29kZSBoaWdobGlnaHRlciBjb21wb25lbnQuXG4gICAqL1xuICBDb2RlSGlnaGxpZ2h0ZXJDb21wb25lbnQgPSAnY29kZS1oaWdobGlnaHRlci1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGNvbmZpcm0gbW9kYWwuXG4gICAqL1xuICBDb25maXJtTW9kYWwgPSAnY29uZmlybS1tb2RhbCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgZGF0ZSBjb21wb25lbnQuXG4gICAqL1xuICBEYXRlQ29tcG9uZW50ID0gJ2RhdGUtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBkYXRlIGFuZCB0aW1lIGNvbXBvbmVudC5cbiAgICovXG4gIERhdGVUaW1lQ29tcG9uZW50ID0gJ2RhdGV0aW1lLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgZW1haWwgY29tcG9uZW50LlxuICAgKi9cbiAgRW1haWxDb21wb25lbnQgPSAnZW1haWwtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBmaWxlIGNvbXBvbmVudC5cbiAgICovXG4gIEZpbGVDb21wb25lbnQgPSAnZmlsZS1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIGNsYXNzIGZvciBhIGNvbnRyb2wgdGhhdCBpcyBjdXJyZW50bHkgT04sIHJldXNlZCBzbyBhIHByZXNzZWQgY29tbWFuZCBidXR0b24gbWF0Y2hlcyB0aGVcbiAgICogYXBwJ3Mgb3duIHRvZ2dsZWQgY29udHJvbHMuXG4gICAqL1xuICBJc0FjdGl2ZSA9ICdpcy1hY3RpdmUnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHBsYWNlaG9sZGVyLlxuICAgKi9cbiAgSXNQbGFjZWhvbGRlciA9ICdpcy1wbGFjZWhvbGRlcicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbGlicmFyeSBuYW1lLlxuICAgKi9cbiAgTGlicmFyeU5hbWUgPSAnb2JzaWRpYW4tZGV2LXV0aWxzJyxcblxuICAvKipcbiAgICogT2JzaWRpYW4ncyBjbGFzcyBtYXJraW5nIHJlbmRlcmVkLW1hcmtkb3duIGNvbnRlbnQgKHVzZWQgYnkgYGFwcGVuZENvZGVCbG9ja2ApLlxuICAgKi9cbiAgTWFya2Rvd25SZW5kZXJlZCA9ICdtYXJrZG93bi1yZW5kZXJlZCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbWluaW1pemFibGUgbW9kYWwuXG4gICAqL1xuICBNaW5pbWl6YWJsZU1vZGFsID0gJ21pbmltaXphYmxlLW1vZGFsJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBtaW5pbWl6ZSBidXR0b24gb2YgdGhlIG1pbmltaXphYmxlIG1vZGFsLlxuICAgKi9cbiAgTWluaW1pemVCdXR0b24gPSAnbWluaW1pemUtYnV0dG9uJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBtaW5pbWl6ZWQgYmFyIG9mIHRoZSBtaW5pbWl6YWJsZSBtb2RhbC5cbiAgICovXG4gIE1pbmltaXplZE1vZGFsQmFyID0gJ21pbmltaXplZC1tb2RhbC1iYXInLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG9uZS1zaG90IGF0dGVudGlvbiBmbGFzaCBvZiB0aGUgbWluaW1pemVkIGJhciwgcGxheWVkIHdoZW4gdGhlIHVzZXIgYXR0ZW1wdHMgYVxuICAgKiBibG9ja2VkIGFjdGlvbiAoYSBrZXlzdHJva2UsIHJpZ2h0LWNsaWNrLCBvciBvcGVuaW5nIGFub3RoZXIgbW9kYWwpIHdoaWxlIHRoZSBtb2RhbCBpcyBtaW5pbWl6ZWQuXG4gICAqL1xuICBNaW5pbWl6ZWRNb2RhbEJhckF0dGVudGlvbiA9ICdtaW5pbWl6ZWQtbW9kYWwtYmFyLWF0dGVudGlvbicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdGl0bGUgb2YgdGhlIG1pbmltaXplZCBiYXIgb2YgdGhlIG1pbmltaXphYmxlIG1vZGFsLlxuICAgKi9cbiAgTWluaW1pemVkTW9kYWxCYXJUaXRsZSA9ICdtaW5pbWl6ZWQtbW9kYWwtYmFyLXRpdGxlJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIG9uZSBidXR0b24gaW4gYSBtb2RhbCdzIGNvbW1hbmQgc3RyaXAuXG4gICAqL1xuICBNb2RhbENvbW1hbmQgPSAnbW9kYWwtY29tbWFuZCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgaG90a2V5IGhpbnQgaW5zaWRlIGEgbW9kYWwgY29tbWFuZCBidXR0b24uXG4gICAqL1xuICBNb2RhbENvbW1hbmRIb3RrZXkgPSAnbW9kYWwtY29tbWFuZC1ob3RrZXknLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHN0cmlwIG9mIGNvbW1hbmRzIGEgbW9kYWwgcmVuZGVycyBhbG9uZyBpdHMgYm90dG9tIGVkZ2UuXG4gICAqL1xuICBNb2RhbENvbW1hbmRzID0gJ21vZGFsLWNvbW1hbmRzJyxcblxuICAvKipcbiAgICogT2JzaWRpYW4ncyBjbGFzcyBmb3IgYSBtb2RhbCBoZWFkZXIgYnV0dG9uIChlLmcuIHRoZSBtb2RhbCBjbG9zZSBidXR0b24pLCByZXVzZWQgdG8gbWF0Y2ggdGhlXG4gICAqIG5hdGl2ZSBtb2RhbCBjbG9zZSBidXR0b24ncyBib3ggYW5kIGhvdmVyLlxuICAgKi9cbiAgTW9kYWxIZWFkZXJCdXR0b24gPSAnbW9kYWwtaGVhZGVyLWJ1dHRvbicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbW9udGggY29tcG9uZW50LlxuICAgKi9cbiAgTW9udGhDb21wb25lbnQgPSAnbW9udGgtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBtdWx0aXBsZSBkcm9wZG93biBjb21wb25lbnQuXG4gICAqL1xuICBNdWx0aXBsZURyb3Bkb3duQ29tcG9uZW50ID0gJ211bHRpcGxlLWRyb3Bkb3duLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbXVsdGlwbGUgZW1haWwgY29tcG9uZW50LlxuICAgKi9cbiAgTXVsdGlwbGVFbWFpbENvbXBvbmVudCA9ICdtdWx0aXBsZS1lbWFpbC1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG11bHRpcGxlIGZpbGUgY29tcG9uZW50LlxuICAgKi9cbiAgTXVsdGlwbGVGaWxlQ29tcG9uZW50ID0gJ211bHRpcGxlLWZpbGUtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBtdWx0aXBsZSB0ZXh0IGNvbXBvbmVudC5cbiAgICovXG4gIE11bHRpcGxlVGV4dENvbXBvbmVudCA9ICdtdWx0aXBsZS10ZXh0LWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbnVtYmVyIGNvbXBvbmVudC5cbiAgICovXG4gIE51bWJlckNvbXBvbmVudCA9ICdudW1iZXItY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBvayBidXR0b24uXG4gICAqL1xuICBPa0J1dHRvbiA9ICdvay1idXR0b24nLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG92ZXJsYXkgdmFsaWRhdG9yLlxuICAgKi9cbiAgT3ZlcmxheVZhbGlkYXRvciA9ICdvdmVybGF5LXZhbGlkYXRvcicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgcGFzc3dvcmQgY29tcG9uZW50LlxuICAgKi9cbiAgUGFzc3dvcmRDb21wb25lbnQgPSAncGFzc3dvcmQtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBjbG9zZSBidXR0b24gb2YgYSBub3RpY2UgdGhhdCByZXF1aXJlcyBjbG9zZSBjb25maXJtYXRpb24uXG4gICAqL1xuICBQbHVnaW5Ob3RpY2VDbG9zZUJ1dHRvbiA9ICdwbHVnaW4tbm90aWNlLWNsb3NlLWJ1dHRvbicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgY29udGFpbmVyIHdyYXBwaW5nIGEgbm90aWNlJ3MgY29udGVudCwgdXNlZCB0byBrZWVwIHRoZSBub3RpY2Ugb3BlbiB3aGVuIGFuXG4gICAqIGludGVyYWN0aXZlIGVsZW1lbnQgaW5zaWRlIGl0IGlzIGNsaWNrZWQuXG4gICAqL1xuICBQbHVnaW5Ob3RpY2VDb250ZW50ID0gJ3BsdWdpbi1ub3RpY2UtY29udGVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgcGx1Z2luIG5hbWUgc2hvd24gYXMgdGhlIHByZWZpeCBvZiBhIG5vdGljZS5cbiAgICovXG4gIFBsdWdpbk5vdGljZU5hbWUgPSAncGx1Z2luLW5vdGljZS1uYW1lJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgYXBwbGllZCB0byB0aGUgbm90aWNlIGVsZW1lbnQgb2YgYSBub3RpY2UgdGhhdCByZXF1aXJlcyBhbiBleHBsaWNpdCBjbG9zZSwgdXNlZCB0byBtYWtlXG4gICAqIGl0cyB3aG9sZSBhcmVhIG5vbi1kaXNtaXNzaWJsZS5cbiAgICovXG4gIFBsdWdpbk5vdGljZVJlcXVpcmVzRXhwbGljaXRDbG9zZSA9ICdwbHVnaW4tbm90aWNlLXJlcXVpcmVzLWV4cGxpY2l0LWNsb3NlJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiLlxuICAgKi9cbiAgUGx1Z2luU2V0dGluZ3NUYWIgPSAncGx1Z2luLXNldHRpbmdzLXRhYicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgYmFubmVyIGEgcGx1Z2luLXN1Z2dlc3Rpb24gcmVuZGVycyBpbnRvIGEgc2V0dGluZ3MgdGFiLlxuICAgKi9cbiAgUGx1Z2luU3VnZ2VzdGlvbkJhbm5lciA9ICdwbHVnaW4tc3VnZ2VzdGlvbi1iYW5uZXInLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHBvcG92ZXIuXG4gICAqL1xuICBQb3BvdmVyID0gJ3BvcG92ZXInLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIGNsYXNzIGZvciBvbmUgcm93IG9mIGl0cyBtb2RhbCBpbnN0cnVjdGlvbiBiYXIsIHJldXNlZCBzbyBhIHNlbGYtY3JlYXRlZCBiYXIgaW5oZXJpdHMgdGhlXG4gICAqIGFwcCdzIG93biBpbnN0cnVjdGlvbiBzdHlsaW5nLlxuICAgKi9cbiAgUHJvbXB0SW5zdHJ1Y3Rpb24gPSAncHJvbXB0LWluc3RydWN0aW9uJyxcblxuICAvKipcbiAgICogT2JzaWRpYW4ncyBjbGFzcyBmb3IgaXRzIG1vZGFsIGluc3RydWN0aW9uIGJhciwgcmV1c2VkIHNvIGEgc2VsZi1jcmVhdGVkIGJhciBpbmhlcml0cyB0aGUgYXBwJ3Mgb3duXG4gICAqIGluc3RydWN0aW9uIHN0eWxpbmcuXG4gICAqL1xuICBQcm9tcHRJbnN0cnVjdGlvbnMgPSAncHJvbXB0LWluc3RydWN0aW9ucycsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgcHJvbXB0IG1vZGFsLlxuICAgKi9cbiAgUHJvbXB0TW9kYWwgPSAncHJvbXB0LW1vZGFsJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSByZXN0b3JlIGJ1dHRvbiBvZiB0aGUgbWluaW1pemVkIG1vZGFsIGJhci5cbiAgICovXG4gIFJlc3RvcmVCdXR0b24gPSAncmVzdG9yZS1idXR0b24nLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHNlbGVjdCBpdGVtIG1vZGFsLlxuICAgKi9cbiAgU2VsZWN0SXRlbU1vZGFsID0gJ3NlbGVjdC1pdGVtLW1vZGFsJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBzZWxlY3Qgb3B0aW9uIG1vZGFsLlxuICAgKi9cbiAgU2VsZWN0T3B0aW9uTW9kYWwgPSAnc2VsZWN0LW9wdGlvbi1tb2RhbCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgc2V0dGluZyBjb21wb25lbnQgd3JhcHBlci5cbiAgICovXG4gIFNldHRpbmdDb21wb25lbnRXcmFwcGVyID0gJ3NldHRpbmctY29tcG9uZW50LXdyYXBwZXInLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHRlbGVwaG9uZSBjb21wb25lbnQuXG4gICAqL1xuICBUZWxlcGhvbmVDb21wb25lbnQgPSAndGVsZXBob25lLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdGV4dCBib3guXG4gICAqL1xuICBUZXh0Qm94ID0gJ3RleHQtYm94JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0aW1lIGNvbXBvbmVudC5cbiAgICovXG4gIFRpbWVDb21wb25lbnQgPSAndGltZS1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHRvb2x0aXAuXG4gICAqL1xuICBUb29sdGlwID0gJ3Rvb2x0aXAnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHRvb2x0aXAgYXJyb3cuXG4gICAqL1xuICBUb29sdGlwQXJyb3cgPSAndG9vbHRpcC1hcnJvdycsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdG9vbHRpcCB2YWxpZGF0b3IuXG4gICAqL1xuICBUb29sdGlwVmFsaWRhdG9yID0gJ3Rvb2x0aXAtdmFsaWRhdG9yJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0cmktc3RhdGUgY2hlY2tib3ggY29tcG9uZW50LlxuICAgKi9cbiAgVHJpU3RhdGVDaGVja2JveENvbXBvbmVudCA9ICd0cmktc3RhdGUtY2hlY2tib3gtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0eXBlZCBkcm9wZG93biBjb21wb25lbnQuXG4gICAqL1xuICBUeXBlZERyb3Bkb3duQ29tcG9uZW50ID0gJ3R5cGVkLWRyb3Bkb3duLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdHlwZWQgbXVsdGlwbGUgZHJvcGRvd24gY29tcG9uZW50LlxuICAgKi9cbiAgVHlwZWRNdWx0aXBsZURyb3Bkb3duQ29tcG9uZW50ID0gJ3R5cGVkLW11bHRpcGxlLWRyb3Bkb3duLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciBhbiBpbnB1dCB0aGUgdXNlciBoYXMgbm90IGludGVyYWN0ZWQgd2l0aCB5ZXQsIHVzZWQgdG8gZGVmZXIgdGhlIGludmFsaWQgc3R5bGluZyB1bnRpbFxuICAgKiB0aGUgaW5wdXQgaXMgdG91Y2hlZC5cbiAgICovXG4gIFVudG91Y2hlZCA9ICd1bnRvdWNoZWQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHVybCBjb21wb25lbnQuXG4gICAqL1xuICBVcmxDb21wb25lbnQgPSAndXJsLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgd2VlayBjb21wb25lbnQuXG4gICAqL1xuICBXZWVrQ29tcG9uZW50ID0gJ3dlZWstY29tcG9uZW50J1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNPLElBQUssV0FBTCxrQkFBS0EsY0FBTDtBQUlMLEVBQUFBLFVBQUEsZ0JBQWE7QUFLYixFQUFBQSxVQUFBLGtCQUFlO0FBS2YsRUFBQUEsVUFBQSx1QkFBb0I7QUFLcEIsRUFBQUEsVUFBQSxtQkFBZ0I7QUFLaEIsRUFBQUEsVUFBQSxVQUFPO0FBS1AsRUFBQUEsVUFBQSw4QkFBMkI7QUFLM0IsRUFBQUEsVUFBQSxrQkFBZTtBQUtmLEVBQUFBLFVBQUEsbUJBQWdCO0FBS2hCLEVBQUFBLFVBQUEsdUJBQW9CO0FBS3BCLEVBQUFBLFVBQUEsb0JBQWlCO0FBS2pCLEVBQUFBLFVBQUEsbUJBQWdCO0FBTWhCLEVBQUFBLFVBQUEsY0FBVztBQUtYLEVBQUFBLFVBQUEsbUJBQWdCO0FBS2hCLEVBQUFBLFVBQUEsaUJBQWM7QUFLZCxFQUFBQSxVQUFBLHNCQUFtQjtBQUtuQixFQUFBQSxVQUFBLHNCQUFtQjtBQUtuQixFQUFBQSxVQUFBLG9CQUFpQjtBQUtqQixFQUFBQSxVQUFBLHVCQUFvQjtBQU1wQixFQUFBQSxVQUFBLGdDQUE2QjtBQUs3QixFQUFBQSxVQUFBLDRCQUF5QjtBQUt6QixFQUFBQSxVQUFBLGtCQUFlO0FBS2YsRUFBQUEsVUFBQSx3QkFBcUI7QUFLckIsRUFBQUEsVUFBQSxtQkFBZ0I7QUFNaEIsRUFBQUEsVUFBQSx1QkFBb0I7QUFLcEIsRUFBQUEsVUFBQSxvQkFBaUI7QUFLakIsRUFBQUEsVUFBQSwrQkFBNEI7QUFLNUIsRUFBQUEsVUFBQSw0QkFBeUI7QUFLekIsRUFBQUEsVUFBQSwyQkFBd0I7QUFLeEIsRUFBQUEsVUFBQSwyQkFBd0I7QUFLeEIsRUFBQUEsVUFBQSxxQkFBa0I7QUFLbEIsRUFBQUEsVUFBQSxjQUFXO0FBS1gsRUFBQUEsVUFBQSxzQkFBbUI7QUFLbkIsRUFBQUEsVUFBQSx1QkFBb0I7QUFLcEIsRUFBQUEsVUFBQSw2QkFBMEI7QUFNMUIsRUFBQUEsVUFBQSx5QkFBc0I7QUFLdEIsRUFBQUEsVUFBQSxzQkFBbUI7QUFNbkIsRUFBQUEsVUFBQSx1Q0FBb0M7QUFLcEMsRUFBQUEsVUFBQSx1QkFBb0I7QUFLcEIsRUFBQUEsVUFBQSw0QkFBeUI7QUFLekIsRUFBQUEsVUFBQSxhQUFVO0FBTVYsRUFBQUEsVUFBQSx1QkFBb0I7QUFNcEIsRUFBQUEsVUFBQSx3QkFBcUI7QUFLckIsRUFBQUEsVUFBQSxpQkFBYztBQUtkLEVBQUFBLFVBQUEsbUJBQWdCO0FBS2hCLEVBQUFBLFVBQUEscUJBQWtCO0FBS2xCLEVBQUFBLFVBQUEsdUJBQW9CO0FBS3BCLEVBQUFBLFVBQUEsNkJBQTBCO0FBSzFCLEVBQUFBLFVBQUEsd0JBQXFCO0FBS3JCLEVBQUFBLFVBQUEsYUFBVTtBQUtWLEVBQUFBLFVBQUEsbUJBQWdCO0FBS2hCLEVBQUFBLFVBQUEsYUFBVTtBQUtWLEVBQUFBLFVBQUEsa0JBQWU7QUFLZixFQUFBQSxVQUFBLHNCQUFtQjtBQUtuQixFQUFBQSxVQUFBLCtCQUE0QjtBQUs1QixFQUFBQSxVQUFBLDRCQUF5QjtBQUt6QixFQUFBQSxVQUFBLG9DQUFpQztBQU1qQyxFQUFBQSxVQUFBLGVBQVk7QUFLWixFQUFBQSxVQUFBLGtCQUFlO0FBS2YsRUFBQUEsVUFBQSxtQkFBZ0I7QUE5U04sU0FBQUE7QUFBQSxHQUFBOyIsCiAgIm5hbWVzIjogWyJDc3NDbGFzcyJdCn0K
111
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2Nzcy1jbGFzcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENTUyBjbGFzc2VzIHVzZWQgYnkgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGxpYnJhcnkuXG4gKi9cblxuLyoqXG4gKiBDU1MgY2xhc3NlcyB1c2VkIGJ5IHRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzYCBsaWJyYXJ5LlxuICovXG5leHBvcnQgZW51bSBDc3NDbGFzcyB7XG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGFsZXJ0IG1vZGFsLlxuICAgKi9cbiAgQWxlcnRNb2RhbCA9ICdhbGVydC1tb2RhbCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgY2FuY2VsIGJ1dHRvbi5cbiAgICovXG4gIENhbmNlbEJ1dHRvbiA9ICdjYW5jZWwtYnV0dG9uJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBjaGVja2JveCBjb21wb25lbnQuXG4gICAqL1xuICBDaGVja2JveENvbXBvbmVudCA9ICdjaGVja2JveC1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIGNsYXNzIGZvciBhIGNsaWNrYWJsZSBpY29uIGJ1dHRvbiwgZ2l2aW5nIGl0IHRoZSBob3ZlciBiYWNrZ3JvdW5kIGFuZCBpY29uLWNvbG9yIHRyZWF0bWVudC5cbiAgICovXG4gIENsaWNrYWJsZUljb24gPSAnY2xpY2thYmxlLWljb24nLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIGNsYXNzIGZvciBhbiBpbmxpbmUgY29kZSBlbGVtZW50ICh1c2VkIGJ5IGBhcHBlbmRDb2RlQmxvY2tgKS5cbiAgICovXG4gIENvZGUgPSAnY29kZScsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgY29kZSBoaWdobGlnaHRlciBjb21wb25lbnQuXG4gICAqL1xuICBDb2RlSGlnaGxpZ2h0ZXJDb21wb25lbnQgPSAnY29kZS1oaWdobGlnaHRlci1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGNvbmZpcm0gbW9kYWwuXG4gICAqL1xuICBDb25maXJtTW9kYWwgPSAnY29uZmlybS1tb2RhbCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgZGF0ZSBjb21wb25lbnQuXG4gICAqL1xuICBEYXRlQ29tcG9uZW50ID0gJ2RhdGUtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBkYXRlIGFuZCB0aW1lIGNvbXBvbmVudC5cbiAgICovXG4gIERhdGVUaW1lQ29tcG9uZW50ID0gJ2RhdGV0aW1lLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgZW1haWwgY29tcG9uZW50LlxuICAgKi9cbiAgRW1haWxDb21wb25lbnQgPSAnZW1haWwtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBmaWxlIGNvbXBvbmVudC5cbiAgICovXG4gIEZpbGVDb21wb25lbnQgPSAnZmlsZS1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIGNsYXNzIGZvciBhIGNvbnRyb2wgdGhhdCBpcyBjdXJyZW50bHkgT04sIHJldXNlZCBzbyBhIHByZXNzZWQgY29tbWFuZCBidXR0b24gbWF0Y2hlcyB0aGVcbiAgICogYXBwJ3Mgb3duIHRvZ2dsZWQgY29udHJvbHMuXG4gICAqL1xuICBJc0FjdGl2ZSA9ICdpcy1hY3RpdmUnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHBsYWNlaG9sZGVyLlxuICAgKi9cbiAgSXNQbGFjZWhvbGRlciA9ICdpcy1wbGFjZWhvbGRlcicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbGlicmFyeSBuYW1lLlxuICAgKi9cbiAgTGlicmFyeU5hbWUgPSAnb2JzaWRpYW4tZGV2LXV0aWxzJyxcblxuICAvKipcbiAgICogT2JzaWRpYW4ncyBjbGFzcyBtYXJraW5nIHJlbmRlcmVkLW1hcmtkb3duIGNvbnRlbnQgKHVzZWQgYnkgYGFwcGVuZENvZGVCbG9ja2ApLlxuICAgKi9cbiAgTWFya2Rvd25SZW5kZXJlZCA9ICdtYXJrZG93bi1yZW5kZXJlZCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbWluaW1pemFibGUgbW9kYWwuXG4gICAqL1xuICBNaW5pbWl6YWJsZU1vZGFsID0gJ21pbmltaXphYmxlLW1vZGFsJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBtaW5pbWl6ZSBidXR0b24gb2YgdGhlIG1pbmltaXphYmxlIG1vZGFsLlxuICAgKi9cbiAgTWluaW1pemVCdXR0b24gPSAnbWluaW1pemUtYnV0dG9uJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBtaW5pbWl6ZWQgYmFyIG9mIHRoZSBtaW5pbWl6YWJsZSBtb2RhbC5cbiAgICovXG4gIE1pbmltaXplZE1vZGFsQmFyID0gJ21pbmltaXplZC1tb2RhbC1iYXInLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG9uZS1zaG90IGF0dGVudGlvbiBmbGFzaCBvZiB0aGUgbWluaW1pemVkIGJhciwgcGxheWVkIHdoZW4gdGhlIHVzZXIgYXR0ZW1wdHMgYVxuICAgKiBibG9ja2VkIGFjdGlvbiAoYSBrZXlzdHJva2UsIHJpZ2h0LWNsaWNrLCBvciBvcGVuaW5nIGFub3RoZXIgbW9kYWwpIHdoaWxlIHRoZSBtb2RhbCBpcyBtaW5pbWl6ZWQuXG4gICAqL1xuICBNaW5pbWl6ZWRNb2RhbEJhckF0dGVudGlvbiA9ICdtaW5pbWl6ZWQtbW9kYWwtYmFyLWF0dGVudGlvbicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdGl0bGUgb2YgdGhlIG1pbmltaXplZCBiYXIgb2YgdGhlIG1pbmltaXphYmxlIG1vZGFsLlxuICAgKi9cbiAgTWluaW1pemVkTW9kYWxCYXJUaXRsZSA9ICdtaW5pbWl6ZWQtbW9kYWwtYmFyLXRpdGxlJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIG9uZSBidXR0b24gaW4gYSBtb2RhbCdzIGNvbW1hbmQgc3RyaXAuXG4gICAqL1xuICBNb2RhbENvbW1hbmQgPSAnbW9kYWwtY29tbWFuZCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciBhIGNvbnRyb2wgaW5qZWN0ZWQgaW50byBhbiBpbnN0cnVjdGlvbidzIHB1cnBvc2UgdGV4dCBcdTIwMTQgYSBjaGVja2JveCwgYSBkcm9wZG93bi5cbiAgICogT2JzaWRpYW4ncyBvd24gaW5zdHJ1Y3Rpb24gYmFyIG5ldmVyIGNvbnRhaW5zIG9uZSwgc28gbm90aGluZyB1cHN0cmVhbSBzZXBhcmF0ZXMgaXQgZnJvbSB0aGUgbGFiZWxcbiAgICogaXQgYmVsb25ncyB0by5cbiAgICovXG4gIE1vZGFsQ29tbWFuZENvbnRyb2wgPSAnbW9kYWwtY29tbWFuZC1jb250cm9sJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBob3RrZXkgaGludCBpbnNpZGUgYSBtb2RhbCBjb21tYW5kIGJ1dHRvbi5cbiAgICovXG4gIE1vZGFsQ29tbWFuZEhvdGtleSA9ICdtb2RhbC1jb21tYW5kLWhvdGtleScsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgc3RyaXAgb2YgY29tbWFuZHMgYSBtb2RhbCByZW5kZXJzIGFsb25nIGl0cyBib3R0b20gZWRnZS5cbiAgICovXG4gIE1vZGFsQ29tbWFuZHMgPSAnbW9kYWwtY29tbWFuZHMnLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIGNsYXNzIGZvciBhIG1vZGFsIGhlYWRlciBidXR0b24gKGUuZy4gdGhlIG1vZGFsIGNsb3NlIGJ1dHRvbiksIHJldXNlZCB0byBtYXRjaCB0aGVcbiAgICogbmF0aXZlIG1vZGFsIGNsb3NlIGJ1dHRvbidzIGJveCBhbmQgaG92ZXIuXG4gICAqL1xuICBNb2RhbEhlYWRlckJ1dHRvbiA9ICdtb2RhbC1oZWFkZXItYnV0dG9uJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBtb250aCBjb21wb25lbnQuXG4gICAqL1xuICBNb250aENvbXBvbmVudCA9ICdtb250aC1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG11bHRpcGxlIGRyb3Bkb3duIGNvbXBvbmVudC5cbiAgICovXG4gIE11bHRpcGxlRHJvcGRvd25Db21wb25lbnQgPSAnbXVsdGlwbGUtZHJvcGRvd24tY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBtdWx0aXBsZSBlbWFpbCBjb21wb25lbnQuXG4gICAqL1xuICBNdWx0aXBsZUVtYWlsQ29tcG9uZW50ID0gJ211bHRpcGxlLWVtYWlsLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbXVsdGlwbGUgZmlsZSBjb21wb25lbnQuXG4gICAqL1xuICBNdWx0aXBsZUZpbGVDb21wb25lbnQgPSAnbXVsdGlwbGUtZmlsZS1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG11bHRpcGxlIHRleHQgY29tcG9uZW50LlxuICAgKi9cbiAgTXVsdGlwbGVUZXh0Q29tcG9uZW50ID0gJ211bHRpcGxlLXRleHQtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBudW1iZXIgY29tcG9uZW50LlxuICAgKi9cbiAgTnVtYmVyQ29tcG9uZW50ID0gJ251bWJlci1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG9rIGJ1dHRvbi5cbiAgICovXG4gIE9rQnV0dG9uID0gJ29rLWJ1dHRvbicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgb3ZlcmxheSB2YWxpZGF0b3IuXG4gICAqL1xuICBPdmVybGF5VmFsaWRhdG9yID0gJ292ZXJsYXktdmFsaWRhdG9yJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBwYXNzd29yZCBjb21wb25lbnQuXG4gICAqL1xuICBQYXNzd29yZENvbXBvbmVudCA9ICdwYXNzd29yZC1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGNsb3NlIGJ1dHRvbiBvZiBhIG5vdGljZSB0aGF0IHJlcXVpcmVzIGNsb3NlIGNvbmZpcm1hdGlvbi5cbiAgICovXG4gIFBsdWdpbk5vdGljZUNsb3NlQnV0dG9uID0gJ3BsdWdpbi1ub3RpY2UtY2xvc2UtYnV0dG9uJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBjb250YWluZXIgd3JhcHBpbmcgYSBub3RpY2UncyBjb250ZW50LCB1c2VkIHRvIGtlZXAgdGhlIG5vdGljZSBvcGVuIHdoZW4gYW5cbiAgICogaW50ZXJhY3RpdmUgZWxlbWVudCBpbnNpZGUgaXQgaXMgY2xpY2tlZC5cbiAgICovXG4gIFBsdWdpbk5vdGljZUNvbnRlbnQgPSAncGx1Z2luLW5vdGljZS1jb250ZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBwbHVnaW4gbmFtZSBzaG93biBhcyB0aGUgcHJlZml4IG9mIGEgbm90aWNlLlxuICAgKi9cbiAgUGx1Z2luTm90aWNlTmFtZSA9ICdwbHVnaW4tbm90aWNlLW5hbWUnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBhcHBsaWVkIHRvIHRoZSBub3RpY2UgZWxlbWVudCBvZiBhIG5vdGljZSB0aGF0IHJlcXVpcmVzIGFuIGV4cGxpY2l0IGNsb3NlLCB1c2VkIHRvIG1ha2VcbiAgICogaXRzIHdob2xlIGFyZWEgbm9uLWRpc21pc3NpYmxlLlxuICAgKi9cbiAgUGx1Z2luTm90aWNlUmVxdWlyZXNFeHBsaWNpdENsb3NlID0gJ3BsdWdpbi1ub3RpY2UtcmVxdWlyZXMtZXhwbGljaXQtY2xvc2UnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHBsdWdpbiBzZXR0aW5ncyB0YWIuXG4gICAqL1xuICBQbHVnaW5TZXR0aW5nc1RhYiA9ICdwbHVnaW4tc2V0dGluZ3MtdGFiJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBiYW5uZXIgYSBwbHVnaW4tc3VnZ2VzdGlvbiByZW5kZXJzIGludG8gYSBzZXR0aW5ncyB0YWIuXG4gICAqL1xuICBQbHVnaW5TdWdnZXN0aW9uQmFubmVyID0gJ3BsdWdpbi1zdWdnZXN0aW9uLWJhbm5lcicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgcG9wb3Zlci5cbiAgICovXG4gIFBvcG92ZXIgPSAncG9wb3ZlcicsXG5cbiAgLyoqXG4gICAqIE9ic2lkaWFuJ3MgY2xhc3MgZm9yIG9uZSByb3cgb2YgaXRzIG1vZGFsIGluc3RydWN0aW9uIGJhciwgcmV1c2VkIHNvIGEgc2VsZi1jcmVhdGVkIGJhciBpbmhlcml0cyB0aGVcbiAgICogYXBwJ3Mgb3duIGluc3RydWN0aW9uIHN0eWxpbmcuXG4gICAqL1xuICBQcm9tcHRJbnN0cnVjdGlvbiA9ICdwcm9tcHQtaW5zdHJ1Y3Rpb24nLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIGNsYXNzIGZvciB0aGUga2V5LWhpbnQgaGFsZiBvZiBvbmUgaW5zdHJ1Y3Rpb24gcm93LiBJdCBpcyB0aGUgb25seSB0aGluZyBjYXJyeWluZyB0aGF0XG4gICAqIGhpbnQncyBib2xkIHdlaWdodCBhbmQgdGhlIGBtYXJnaW4taW5saW5lLWVuZGAgdGhhdCBzZXBhcmF0ZXMgaXQgZnJvbSB0aGUgcHVycG9zZSB0ZXh0LCBzbyBhXG4gICAqIHNlbGYtY3JlYXRlZCBiYXIgdGhhdCBvbWl0cyBpdCByZW5kZXJzIGBhbHQgMUtlZXAgdGhlIG9sZCB0aXRsZWAgd2VsZGVkIHRvZ2V0aGVyLiBSZXVzZWQgcmF0aGVyXG4gICAqIHRoYW4gcmUtaW1wbGVtZW50ZWQ6IHRoZSBhcHAncyBydWxlIGZvciBpdCBpcyB1bnNjb3BlZCwgc28gaXQgcmVhY2hlcyBhIHBsYWluIGBNb2RhbGAgdG9vLCBhbmRcbiAgICogc2hhcmluZyB0aGUgY2xhc3Mga2VlcHMgdGhlIHNlbGYtY3JlYXRlZCBiYXIgYW5kIGBzZXRJbnN0cnVjdGlvbnNgIGZyb20gZXZlciBkcmlmdGluZyBhcGFydC5cbiAgICovXG4gIFByb21wdEluc3RydWN0aW9uQ29tbWFuZCA9ICdwcm9tcHQtaW5zdHJ1Y3Rpb24tY29tbWFuZCcsXG5cbiAgLyoqXG4gICAqIE9ic2lkaWFuJ3MgY2xhc3MgZm9yIGl0cyBtb2RhbCBpbnN0cnVjdGlvbiBiYXIsIHJldXNlZCBzbyBhIHNlbGYtY3JlYXRlZCBiYXIgaW5oZXJpdHMgdGhlIGFwcCdzIG93blxuICAgKiBpbnN0cnVjdGlvbiBzdHlsaW5nLlxuICAgKi9cbiAgUHJvbXB0SW5zdHJ1Y3Rpb25zID0gJ3Byb21wdC1pbnN0cnVjdGlvbnMnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHByb21wdCBtb2RhbC5cbiAgICovXG4gIFByb21wdE1vZGFsID0gJ3Byb21wdC1tb2RhbCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgcmVzdG9yZSBidXR0b24gb2YgdGhlIG1pbmltaXplZCBtb2RhbCBiYXIuXG4gICAqL1xuICBSZXN0b3JlQnV0dG9uID0gJ3Jlc3RvcmUtYnV0dG9uJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBzZWxlY3QgaXRlbSBtb2RhbC5cbiAgICovXG4gIFNlbGVjdEl0ZW1Nb2RhbCA9ICdzZWxlY3QtaXRlbS1tb2RhbCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgc2VsZWN0IG9wdGlvbiBtb2RhbC5cbiAgICovXG4gIFNlbGVjdE9wdGlvbk1vZGFsID0gJ3NlbGVjdC1vcHRpb24tbW9kYWwnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHNldHRpbmcgY29tcG9uZW50IHdyYXBwZXIuXG4gICAqL1xuICBTZXR0aW5nQ29tcG9uZW50V3JhcHBlciA9ICdzZXR0aW5nLWNvbXBvbmVudC13cmFwcGVyJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0ZWxlcGhvbmUgY29tcG9uZW50LlxuICAgKi9cbiAgVGVsZXBob25lQ29tcG9uZW50ID0gJ3RlbGVwaG9uZS1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHRleHQgYm94LlxuICAgKi9cbiAgVGV4dEJveCA9ICd0ZXh0LWJveCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdGltZSBjb21wb25lbnQuXG4gICAqL1xuICBUaW1lQ29tcG9uZW50ID0gJ3RpbWUtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0b29sdGlwLlxuICAgKi9cbiAgVG9vbHRpcCA9ICd0b29sdGlwJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0b29sdGlwIGFycm93LlxuICAgKi9cbiAgVG9vbHRpcEFycm93ID0gJ3Rvb2x0aXAtYXJyb3cnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHRvb2x0aXAgdmFsaWRhdG9yLlxuICAgKi9cbiAgVG9vbHRpcFZhbGlkYXRvciA9ICd0b29sdGlwLXZhbGlkYXRvcicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdHJpLXN0YXRlIGNoZWNrYm94IGNvbXBvbmVudC5cbiAgICovXG4gIFRyaVN0YXRlQ2hlY2tib3hDb21wb25lbnQgPSAndHJpLXN0YXRlLWNoZWNrYm94LWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdHlwZWQgZHJvcGRvd24gY29tcG9uZW50LlxuICAgKi9cbiAgVHlwZWREcm9wZG93bkNvbXBvbmVudCA9ICd0eXBlZC1kcm9wZG93bi1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHR5cGVkIG11bHRpcGxlIGRyb3Bkb3duIGNvbXBvbmVudC5cbiAgICovXG4gIFR5cGVkTXVsdGlwbGVEcm9wZG93bkNvbXBvbmVudCA9ICd0eXBlZC1tdWx0aXBsZS1kcm9wZG93bi1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgYW4gaW5wdXQgdGhlIHVzZXIgaGFzIG5vdCBpbnRlcmFjdGVkIHdpdGggeWV0LCB1c2VkIHRvIGRlZmVyIHRoZSBpbnZhbGlkIHN0eWxpbmcgdW50aWxcbiAgICogdGhlIGlucHV0IGlzIHRvdWNoZWQuXG4gICAqL1xuICBVbnRvdWNoZWQgPSAndW50b3VjaGVkJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB1cmwgY29tcG9uZW50LlxuICAgKi9cbiAgVXJsQ29tcG9uZW50ID0gJ3VybC1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHdlZWsgY29tcG9uZW50LlxuICAgKi9cbiAgV2Vla0NvbXBvbmVudCA9ICd3ZWVrLWNvbXBvbmVudCdcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTTyxJQUFLLFdBQUwsa0JBQUtBLGNBQUw7QUFJTCxFQUFBQSxVQUFBLGdCQUFhO0FBS2IsRUFBQUEsVUFBQSxrQkFBZTtBQUtmLEVBQUFBLFVBQUEsdUJBQW9CO0FBS3BCLEVBQUFBLFVBQUEsbUJBQWdCO0FBS2hCLEVBQUFBLFVBQUEsVUFBTztBQUtQLEVBQUFBLFVBQUEsOEJBQTJCO0FBSzNCLEVBQUFBLFVBQUEsa0JBQWU7QUFLZixFQUFBQSxVQUFBLG1CQUFnQjtBQUtoQixFQUFBQSxVQUFBLHVCQUFvQjtBQUtwQixFQUFBQSxVQUFBLG9CQUFpQjtBQUtqQixFQUFBQSxVQUFBLG1CQUFnQjtBQU1oQixFQUFBQSxVQUFBLGNBQVc7QUFLWCxFQUFBQSxVQUFBLG1CQUFnQjtBQUtoQixFQUFBQSxVQUFBLGlCQUFjO0FBS2QsRUFBQUEsVUFBQSxzQkFBbUI7QUFLbkIsRUFBQUEsVUFBQSxzQkFBbUI7QUFLbkIsRUFBQUEsVUFBQSxvQkFBaUI7QUFLakIsRUFBQUEsVUFBQSx1QkFBb0I7QUFNcEIsRUFBQUEsVUFBQSxnQ0FBNkI7QUFLN0IsRUFBQUEsVUFBQSw0QkFBeUI7QUFLekIsRUFBQUEsVUFBQSxrQkFBZTtBQU9mLEVBQUFBLFVBQUEseUJBQXNCO0FBS3RCLEVBQUFBLFVBQUEsd0JBQXFCO0FBS3JCLEVBQUFBLFVBQUEsbUJBQWdCO0FBTWhCLEVBQUFBLFVBQUEsdUJBQW9CO0FBS3BCLEVBQUFBLFVBQUEsb0JBQWlCO0FBS2pCLEVBQUFBLFVBQUEsK0JBQTRCO0FBSzVCLEVBQUFBLFVBQUEsNEJBQXlCO0FBS3pCLEVBQUFBLFVBQUEsMkJBQXdCO0FBS3hCLEVBQUFBLFVBQUEsMkJBQXdCO0FBS3hCLEVBQUFBLFVBQUEscUJBQWtCO0FBS2xCLEVBQUFBLFVBQUEsY0FBVztBQUtYLEVBQUFBLFVBQUEsc0JBQW1CO0FBS25CLEVBQUFBLFVBQUEsdUJBQW9CO0FBS3BCLEVBQUFBLFVBQUEsNkJBQTBCO0FBTTFCLEVBQUFBLFVBQUEseUJBQXNCO0FBS3RCLEVBQUFBLFVBQUEsc0JBQW1CO0FBTW5CLEVBQUFBLFVBQUEsdUNBQW9DO0FBS3BDLEVBQUFBLFVBQUEsdUJBQW9CO0FBS3BCLEVBQUFBLFVBQUEsNEJBQXlCO0FBS3pCLEVBQUFBLFVBQUEsYUFBVTtBQU1WLEVBQUFBLFVBQUEsdUJBQW9CO0FBU3BCLEVBQUFBLFVBQUEsOEJBQTJCO0FBTTNCLEVBQUFBLFVBQUEsd0JBQXFCO0FBS3JCLEVBQUFBLFVBQUEsaUJBQWM7QUFLZCxFQUFBQSxVQUFBLG1CQUFnQjtBQUtoQixFQUFBQSxVQUFBLHFCQUFrQjtBQUtsQixFQUFBQSxVQUFBLHVCQUFvQjtBQUtwQixFQUFBQSxVQUFBLDZCQUEwQjtBQUsxQixFQUFBQSxVQUFBLHdCQUFxQjtBQUtyQixFQUFBQSxVQUFBLGFBQVU7QUFLVixFQUFBQSxVQUFBLG1CQUFnQjtBQUtoQixFQUFBQSxVQUFBLGFBQVU7QUFLVixFQUFBQSxVQUFBLGtCQUFlO0FBS2YsRUFBQUEsVUFBQSxzQkFBbUI7QUFLbkIsRUFBQUEsVUFBQSwrQkFBNEI7QUFLNUIsRUFBQUEsVUFBQSw0QkFBeUI7QUFLekIsRUFBQUEsVUFBQSxvQ0FBaUM7QUFNakMsRUFBQUEsVUFBQSxlQUFZO0FBS1osRUFBQUEsVUFBQSxrQkFBZTtBQUtmLEVBQUFBLFVBQUEsbUJBQWdCO0FBOVROLFNBQUFBO0FBQUEsR0FBQTsiLAogICJuYW1lcyI6IFsiQ3NzQ2xhc3MiXQp9Cg==
@@ -271,7 +271,11 @@ export declare class ModalCommandBuilder {
271
271
  /**
272
272
  * Renders an instruction bar of the builder's own, for a host that has none.
273
273
  *
274
- * The markup mirrors what `setInstructions` produces, so Obsidian's own styling applies unchanged.
274
+ * The markup mirrors what `setInstructions` produces including
275
+ * {@link CssClass.PromptInstructionCommand} on the key hint, which is not decoration: Obsidian's rule
276
+ * for that class is what supplies the hint's bold weight and the `margin-inline-end` separating it
277
+ * from the purpose text. Every class here is unscoped in the app's stylesheet, so all of it reaches a
278
+ * plain {@link Modal} as readily as it reaches the quick switcher.
275
279
  *
276
280
  * @param containerEl - The element to append the bar to.
277
281
  * @param instructions - The instructions to render.
@@ -86,7 +86,11 @@ class ModalCommandBuilder {
86
86
  }
87
87
  };
88
88
  },
89
- initInstruction: (purposeEl, scope) => initCheckbox(purposeEl.createEl("input", { type: "checkbox" }), scope),
89
+ initInstruction: (purposeEl, scope) => {
90
+ const checkboxEl = purposeEl.createEl("input", { type: "checkbox" });
91
+ addPluginCssClasses(checkboxEl, CssClass.ModalCommandControl);
92
+ return initCheckbox(checkboxEl, scope);
93
+ },
90
94
  isDropDown: false,
91
95
  purpose: command.purpose,
92
96
  registerScope: null
@@ -120,8 +124,8 @@ class ModalCommandBuilder {
120
124
  commandText: this.buildCommandText(command),
121
125
  initButton: null,
122
126
  initInstruction: (purposeEl, scope) => {
123
- purposeEl.appendText(" ");
124
127
  const dropdownComponent = new DropdownComponent(purposeEl);
128
+ addPluginCssClasses(dropdownComponent.selectEl, CssClass.ModalCommandControl);
125
129
  command.onInit(dropdownComponent);
126
130
  dropdownComponent.onChange((value) => {
127
131
  command.onChange(value);
@@ -327,7 +331,11 @@ class ModalCommandBuilder {
327
331
  /**
328
332
  * Renders an instruction bar of the builder's own, for a host that has none.
329
333
  *
330
- * The markup mirrors what `setInstructions` produces, so Obsidian's own styling applies unchanged.
334
+ * The markup mirrors what `setInstructions` produces including
335
+ * {@link CssClass.PromptInstructionCommand} on the key hint, which is not decoration: Obsidian's rule
336
+ * for that class is what supplies the hint's bold weight and the `margin-inline-end` separating it
337
+ * from the purpose text. Every class here is unscoped in the app's stylesheet, so all of it reaches a
338
+ * plain {@link Modal} as readily as it reaches the quick switcher.
331
339
  *
332
340
  * @param containerEl - The element to append the bar to.
333
341
  * @param instructions - The instructions to render.
@@ -338,7 +346,7 @@ class ModalCommandBuilder {
338
346
  addPluginCssClasses(instructionsEl, CssClass.ModalCommands);
339
347
  return instructions.map((instruction) => {
340
348
  const instructionEl = instructionsEl.createDiv(CssClass.PromptInstruction);
341
- instructionEl.createSpan({ text: instruction.command });
349
+ instructionEl.createSpan({ cls: CssClass.PromptInstructionCommand, text: instruction.command });
342
350
  return instructionEl.createSpan({ text: instruction.purpose });
343
351
  });
344
352
  }
@@ -354,4 +362,4 @@ export {
354
362
  ModalCommandBuilder,
355
363
  ModalCommandsRenderMode
356
364
  };
357
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9tb2RhbC1jb21tYW5kLWJ1aWxkZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBIGJ1aWxkZXIgZm9yIGEgbW9kYWwncyBjb250cm9sIHN0cmlwLlxuICpcbiAqIHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyfSBhc3NlbWJsZXMgdGhlIHN0cmlwIG9mIGNvbnRyb2xzIHNob3duIGF0IHRoZSBib3R0b20gb2YgYSBtb2RhbDpcbiAqIGtleWJvYXJkLWNvbW1hbmQgaGludHMgKHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmFkZEtleWJvYXJkQ29tbWFuZH0pLCBpbnRlcmFjdGl2ZSBjaGVja2JveGVzIGJvdW5kIHRvXG4gKiBhIG1vZGlmaWVyK2tleSBzaG9ydGN1dCAoe0BsaW5rIE1vZGFsQ29tbWFuZEJ1aWxkZXIuYWRkQ2hlY2tib3h9KSwgYW5kIGRyb3Bkb3ducyBib3VuZCB0byBhIG1vZGlmaWVyK2tleVxuICogc2hvcnRjdXQgKHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmFkZERyb3BEb3dufSkuIENoYWluIHRoZSBgYWRkKmAgY2FsbHMsIHRoZW4gYXBwbHkgZXZlcnl0aGluZyB0byBhXG4gKiBtb2RhbCB3aXRoIHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmJ1aWxkfTpcbiAqXG4gKiBgYGB0c1xuICogbmV3IE1vZGFsQ29tbWFuZEJ1aWxkZXIoKVxuICogICAuYWRkS2V5Ym9hcmRDb21tYW5kKHsga2V5OiAnRW50ZXInLCBtb2RpZmllcnM6IFsnTW9kJ10sIG9uS2V5LCBwdXJwb3NlOiAndG8gY3JlYXRlJyB9KVxuICogICAuYWRkQ2hlY2tib3goeyBrZXk6ICcxJywgbW9kaWZpZXJzOiBbJ0FsdCddLCBvbkNoYW5nZSwgb25Jbml0LCBwdXJwb3NlOiAnRml4IGZvb3Rub3RlcycgfSlcbiAqICAgLmJ1aWxkKG1vZGFsKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBzdHJpcCBpcyBkZXNjcmliZWQgYnkgdHdvIGluZGVwZW5kZW50IGF4ZXM6XG4gKlxuICogLSAqKldoZXJlIGl0IGlzIGhvc3RlZC4qKiBBIHtAbGluayBTdWdnZXN0TW9kYWx9IGluIHtAbGluayBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5JbnN0cnVjdGlvbnN9IG1vZGVcbiAqICAga2VlcHMgT2JzaWRpYW4ncyBvd24gaW5zdHJ1Y3Rpb24gYmFyIChgc2V0SW5zdHJ1Y3Rpb25zYCArIGBpbnN0cnVjdGlvbnNFbGApLiBFdmVyeSBvdGhlciB0YXJnZXQgXHUyMDE0IGFcbiAqICAgcGxhaW4ge0BsaW5rIE1vZGFsfSwgb3IgYSBiYXJlIHtAbGluayBNb2RhbENvbW1hbmRzSG9zdH0gb2YgYW4gZWxlbWVudCBwbHVzIGEgYFNjb3BlYCBcdTIwMTQgZ2V0cyBhIHN0cmlwXG4gKiAgIGVsZW1lbnQgdGhlIGJ1aWxkZXIgY3JlYXRlcyBpdHNlbGYuXG4gKiAtICoqSG93IGVhY2ggY29udHJvbCBsb29rcy4qKiB7QGxpbmsgTW9kYWxDb21tYW5kc1JlbmRlck1vZGUuSW5zdHJ1Y3Rpb25zfSByZW5kZXJzIHRoZSBwdXJwb3NlIHRleHQgd2l0aFxuICogICBhbiBpbmxpbmUgY2hlY2tib3ggb3IgZHJvcGRvd247IHtAbGluayBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5CdXR0b25zfSByZW5kZXJzIG9uZSBjbGlja2FibGUgYnV0dG9uXG4gKiAgIHBlciBjb250cm9sLCBjYXJyeWluZyBpdHMgcHJlc3NlZCBhbmQgZGlzYWJsZWQgc3RhdGUuXG4gKlxuICogVGhlIGF4ZXMgYXJlIGluZGVwZW5kZW50IGJlY2F1c2UgYSBidXR0b24gc3RyaXAgaW5zaWRlIGEge0BsaW5rIFN1Z2dlc3RNb2RhbH0gaXMgYSByZWFsIGNvbWJpbmF0aW9uLlxuICpcbiAqIHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmJ1aWxkfSBhbHdheXMgcmVnaXN0ZXJzIHRoZSBlc3NlbnRpYWwgbmF2aWdhdGlvbi9hY3Rpb24ga2V5IGhhbmRsZXJzLCBidXRcbiAqIG9ubHkgcmVuZGVycyB0aGUgY29udHJvbCBVSSBhbmQgcmVnaXN0ZXJzIHRoZSBvcHRpb24tdG9nZ2xlIHNob3J0Y3V0cyB3aGVuXG4gKiB7QGxpbmsgTW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucy5zaG91bGRTaG93SW5zdHJ1Y3Rpb25zfSBpcyBgdHJ1ZWAgKHRoZSBkZWZhdWx0KS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEluc3RydWN0aW9uLFxuICBLZXltYXBDb250ZXh0LFxuICBNb2RhbCxcbiAgTW9kaWZpZXIsXG4gIFNjb3BlLFxuICBTdWdnZXN0TW9kYWxcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBEcm9wZG93bkNvbXBvbmVudCxcbiAgUGxhdGZvcm1cbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyBhZGRQbHVnaW5Dc3NDbGFzc2VzIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcblxuY29uc3QgS0VZU19NQVAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihbXG4gIFsnRW50ZXInLCAnXHUyMUI1J10sXG4gIFsnVXBEb3duJywgJ1x1MjE5MVx1MjE5MyddXG5dKTtcblxuLyoqXG4gKiBUaGUgd2F5IHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmJ1aWxkfSByZW5kZXJzIGVhY2ggY29udHJvbC5cbiAqL1xuZXhwb3J0IGVudW0gTW9kYWxDb21tYW5kc1JlbmRlck1vZGUge1xuICAvKipcbiAgICogT25lIGNsaWNrYWJsZSBidXR0b24gcGVyIGNvbnRyb2wsIGNhcnJ5aW5nIGl0cyBwcmVzc2VkIChgYXJpYS1wcmVzc2VkYCkgYW5kIGRpc2FibGVkIHN0YXRlLlxuICAgKlxuICAgKiBPbmx5IGNvbnRyb2xzIHJlYWNoYWJsZSBieSBwb2ludGVyIGFyZSByZW5kZXJlZCBcdTIwMTQgY2hlY2tib3hlcywgYW5kIGtleWJvYXJkIGNvbW1hbmRzIHRoYXQgc3VwcGx5XG4gICAqIHtAbGluayBLZXlib2FyZENvbW1hbmQub25BY3RpdmF0ZX0uIEEgaGludC1vbmx5IG9yIGtleWJvYXJkLW9ubHkgY29tbWFuZCBzdGlsbCByZWdpc3RlcnMgaXRzIGhhbmRsZXJcbiAgICogYnV0IHJlbmRlcnMgbm8gYnV0dG9uLCBiZWNhdXNlIGEgYnV0dG9uIG5vYm9keSBjYW4gcHJlc3MgaXMgd29yc2UgdGhhbiBubyBidXR0b24uIEEgZHJvcGRvd24gdGhyb3dzOlxuICAgKiBhIGNvbnRyb2wgdGhhdCBDWUNMRVMgaGFzIG5vIGJ1dHRvbiBmb3JtLlxuICAgKi9cbiAgQnV0dG9ucyA9ICdidXR0b25zJyxcblxuICAvKipcbiAgICogT2JzaWRpYW4ncyBpbnN0cnVjdGlvbi1iYXIgbG9vazogdGhlIHNob3J0Y3V0LCB0aGVuIHRoZSBwdXJwb3NlIHRleHQgd2l0aCBhbiBpbmxpbmUgY2hlY2tib3ggb3JcbiAgICogZHJvcGRvd24uXG4gICAqL1xuICBJbnN0cnVjdGlvbnMgPSAnaW5zdHJ1Y3Rpb25zJ1xufVxuXG4vKipcbiAqIEEgY2hlY2tib3ggY29tbWFuZCBzaG93biBpbiBhIG1vZGFsJ3MgY29udHJvbCBzdHJpcCBhbmQgYm91bmQgdG8gYSBtb2RpZmllcitrZXkgc2hvcnRjdXQgdGhhdCB0b2dnbGVzXG4gKiBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja2JveENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kQmFzZSB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgY2hlY2tib3ggdmFsdWUgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIGlzQ2hlY2tlZCAtIFRoZSBuZXcgY2hlY2tlZCBzdGF0ZS5cbiAgICovXG4gIG9uQ2hhbmdlKGlzQ2hlY2tlZDogYm9vbGVhbik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbmNlIHdpdGggdGhlIGNyZWF0ZWQgY2hlY2tib3ggZWxlbWVudCwgdG8gaW5pdGlhbGl6ZSBpdHMgc3RhdGUuXG4gICAqXG4gICAqIEluIHtAbGluayBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5CdXR0b25zfSBtb2RlIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQgYnV0IG5ldmVyIGFwcGVuZGVkIFx1MjAxNCB0aGVcbiAgICogYnV0dG9uIGlzIGEgdmlldyBvZiBpdCBcdTIwMTQgc28gdGhlIHNhbWUgaW5pdGlhbGl6YXRpb24gY29kZSBzZXJ2ZXMgYm90aCByZW5kZXIgbW9kZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjaGVja2JveEVsIC0gVGhlIGNyZWF0ZWQgY2hlY2tib3ggZWxlbWVudC5cbiAgICovXG4gIG9uSW5pdChjaGVja2JveEVsOiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgbWVtYmVycyBldmVyeSBjb21tYW5kIHNoYXJlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kQmFzZSB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb250cm9sIGNhbiBiZSB1c2VkIHJpZ2h0IG5vdy4gV2hlbiBpdCByZXR1cm5zIGBmYWxzZWAgdGhlIGNvbnRyb2wgaXMgcmVuZGVyZWRcbiAgICogKipkaXNhYmxlZCByYXRoZXIgdGhhbiByZW1vdmVkKiosIHNvIHRoZSBzdHJpcCBkb2VzIG5vdCByZWZsb3cgdW5kZXIgdGhlIHBvaW50ZXIgYXMgbW9kZXMgY2hhbmdlIFx1MjAxNFxuICAgKiB3aGljaCBvbiBhIHBob25lIG1lYW5zIGEgbWlzLXRhcC5cbiAgICpcbiAgICogUmUtcmVhZCBieSB7QGxpbmsgTW9kYWxDb21tYW5kcy5yZWZyZXNofS4gV2hlbiBvbWl0dGVkLCB0aGUgYnVpbGRlciBuZXZlciB0b3VjaGVzIHRoZSBjb250cm9sJ3NcbiAgICogZGlzYWJsZWQgc3RhdGUsIGxlYXZpbmcgd2hhdGV2ZXIge0BsaW5rIENoZWNrYm94Q29tbWFuZC5vbkluaXR9IC8ge0BsaW5rIERyb3BEb3duQ29tbWFuZC5vbkluaXR9IHNldC5cbiAgICpcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY29udHJvbCBjYW4gYmUgdXNlZCByaWdodCBub3cuXG4gICAqL1xuICBjaGVja0lzQXZhaWxhYmxlPyh0aGlzOiB2b2lkKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGtleSB0aGF0IGFjdGl2YXRlcyB0aGUgY29tbWFuZC5cbiAgICovXG4gIGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kaWZpZXJzIGNvbWJpbmVkIHdpdGgge0BsaW5rIENvbW1hbmRCYXNlLmtleX0uIFdoZW4gb21pdHRlZCwgbm8gbW9kaWZpZXJzIGFyZSByZXF1aXJlZC5cbiAgICovXG4gIG1vZGlmaWVycz86IE1vZGlmaWVyW107XG5cbiAgLyoqXG4gICAqIFRoZSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzaG93biBuZXh0IHRvIHRoZSBjb250cm9sLlxuICAgKi9cbiAgcHVycG9zZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgZHJvcGRvd24gY29tbWFuZCBzaG93biBpbiBhIG1vZGFsJ3MgY29udHJvbCBzdHJpcCBhbmQgYm91bmQgdG8gYSBtb2RpZmllcitrZXkgc2hvcnRjdXQgdGhhdCBjeWNsZXNcbiAqIHRocm91Z2ggaXRzIG9wdGlvbnMuXG4gKlxuICogU3VwcG9ydGVkIGluIHtAbGluayBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5JbnN0cnVjdGlvbnN9IG1vZGUgb25seS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEcm9wRG93bkNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kQmFzZSB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZHJvcGRvd24gdmFsdWUgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG5ld2x5IHNlbGVjdGVkIHZhbHVlLlxuICAgKi9cbiAgb25DaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbmNlIHdpdGggdGhlIGNyZWF0ZWQgZHJvcGRvd24gY29tcG9uZW50LCB0byBpbml0aWFsaXplIGl0cyBvcHRpb25zIGFuZCBzdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIGRyb3Bkb3duQ29tcG9uZW50IC0gVGhlIGNyZWF0ZWQgZHJvcGRvd24gY29tcG9uZW50LlxuICAgKi9cbiAgb25Jbml0KGRyb3Bkb3duQ29tcG9uZW50OiBEcm9wZG93bkNvbXBvbmVudCk6IHZvaWQ7XG59XG5cbi8qKlxuICogQSBrZXlib2FyZCBjb21tYW5kIHNob3duIGluIGEgbW9kYWwncyBjb250cm9sIHN0cmlwIGFuZCBvcHRpb25hbGx5IGJvdW5kIHRvIGEgbW9kaWZpZXIra2V5IGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5Ym9hcmRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZEJhc2Uge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY29tbWFuZCByZWFkcyBhcyBPTi4gU3VwcGx5IGl0IGZvciBhIHRvZ2dsZSB3aG9zZSBzdGF0ZSBsaXZlcyBvdXRzaWRlIHRoZSBzdHJpcDsgb21pdCBpdFxuICAgKiBmb3IgYW4gYWN0aW9uLCB3aGljaCBkb2VzIHNvbWV0aGluZyBhbmQgaXMgZG9uZS4gQSB7QGxpbmsgQ2hlY2tib3hDb21tYW5kfSBuZWVkcyBubyBlcXVpdmFsZW50IFx1MjAxNCBpdHNcbiAgICogY2hlY2tib3ggZWxlbWVudCBpcyB0aGUgc3RhdGUuXG4gICAqXG4gICAqIFJlLXJlYWQgYnkge0BsaW5rIE1vZGFsQ29tbWFuZHMucmVmcmVzaH0uXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNvbW1hbmQgcmVhZHMgYXMgT04uXG4gICAqL1xuICBjaGVja0lzT24/KHRoaXM6IHZvaWQpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcG9pbnRlciByb3V0ZSBpbnRvIHRoZSBzYW1lIGhhbmRsZXIgdGhlIHNob3J0Y3V0IHJ1bnMuIFJlcXVpcmVkIGZvciB0aGUgY29tbWFuZCB0byByZW5kZXIgYVxuICAgKiBidXR0b24gaW4ge0BsaW5rIE1vZGFsQ29tbWFuZHNSZW5kZXJNb2RlLkJ1dHRvbnN9IG1vZGUgXHUyMDE0IG9uIGEgcGhvbmUgdGhlcmUgaXMgbm8gbW9kaWZpZXIga2V5IHRvXG4gICAqIHByZXNzLCBzbyB0aGlzIGlzIHRoZSBvbmx5IHdheSBpbi5cbiAgICpcbiAgICogQHBhcmFtICRldmVudCAtIFRoZSBjbGljayBldmVudCwgc28gYSBjb21tYW5kIHRoYXQgcGlja3Mgc29tZXRoaW5nIGhhcyBvbmUgdG8gaGFuZCBvbi5cbiAgICovXG4gIG9uQWN0aXZhdGU/KHRoaXM6IHZvaWQsICRldmVudDogTW91c2VFdmVudCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBoYW5kbGVyIGludm9rZWQgd2hlbiB0aGUgc2hvcnRjdXQgaXMgcHJlc3NlZC4gV2hlbiBvbWl0dGVkLCB0aGUgY29tbWFuZCBpcyBhIGhpbnQgb25seSBhbmQgbm9cbiAgICogc2NvcGUgaGFuZGxlciBpcyByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gJGV2ZW50IC0gVGhlIGtleWJvYXJkIGV2ZW50LlxuICAgKiBAcGFyYW0gY29udGV4dCAtIFRoZSBrZXltYXAgY29udGV4dC5cbiAgICogQHJldHVybnMgYGZhbHNlYCB0byBwcmV2ZW50IE9ic2lkaWFuJ3MgZGVmYXVsdCBoYW5kbGluZywgb3IgYHZvaWRgL2B0cnVlYCBvdGhlcndpc2UuXG4gICAqL1xuICBvbktleT8oJGV2ZW50OiBLZXlib2FyZEV2ZW50LCBjb250ZXh0OiBLZXltYXBDb250ZXh0KTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgTW9kYWxDb21tYW5kQnVpbGRlci5idWlsZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgd2F5IGVhY2ggY29udHJvbCBpcyByZW5kZXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIE1vZGFsQ29tbWFuZHNSZW5kZXJNb2RlLkluc3RydWN0aW9uc31cbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlck1vZGU/OiBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5kZXIgdGhlIGNvbnRyb2wgc3RyaXAgKGNoZWNrYm94ZXMsIGRyb3Bkb3ducywga2V5Ym9hcmQgaGludHMpIGFuZCByZWdpc3RlciB0aGVcbiAgICogb3B0aW9uLXRvZ2dsZSBrZXlib2FyZCBzaG9ydGN1dHMuIFdoZW4gYGZhbHNlYCwgbm8gY29udHJvbCBVSSBpcyBzaG93biBhbmQgdGhlIG9wdGlvbi10b2dnbGVcbiAgICogc2hvcnRjdXRzIGFyZSBub3QgcmVnaXN0ZXJlZDsgb25seSB0aGUgZXNzZW50aWFsIG5hdmlnYXRpb24ga2V5IGhhbmRsZXJzIHJlbWFpbiBhY3RpdmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0luc3RydWN0aW9ucz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIGhhbmRsZSByZXR1cm5lZCBieSB7QGxpbmsgTW9kYWxDb21tYW5kQnVpbGRlci5idWlsZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kYWxDb21tYW5kcyB7XG4gIC8qKlxuICAgKiBCcmluZ3MgZXZlcnkgcmVuZGVyZWQgY29udHJvbCdzIGRpc2FibGVkIGFuZCBwcmVzc2VkIHN0YXRlIHVwIHRvIGRhdGUsIGJ5IHJlLXJlYWRpbmdcbiAgICoge0BsaW5rIENvbW1hbmRCYXNlLmNoZWNrSXNBdmFpbGFibGV9IGFuZCB7QGxpbmsgS2V5Ym9hcmRDb21tYW5kLmNoZWNrSXNPbn0uXG4gICAqXG4gICAqIFRoZSBzdHJpcCBpcyBidWlsdCBvbmNlIGFuZCBvbmx5IHJlLXN0YXRlZCBhZnRlcndhcmRzLCBiZWNhdXNlIHJlYnVpbGRpbmcgaXQgd291bGQgcmVwbGFjZSBhbiBlbGVtZW50XG4gICAqIHRoZSBwb2ludGVyIG1heSBiZSBhYm91dCB0byBjbGljay5cbiAgICovXG4gIHJlZnJlc2goKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBIGJhcmUgaG9zdCBmb3IgYSBjb250cm9sIHN0cmlwOiB0aGUgZWxlbWVudCB0byByZW5kZXIgaW50bywgcGx1cyB0aGUgc2NvcGUgdG8gcmVnaXN0ZXIgc2hvcnRjdXRzIHdpdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kYWxDb21tYW5kc0hvc3Qge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdGhlIGNvbnRyb2wgc3RyaXAgaXMgYXBwZW5kZWQgdG8uXG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzY29wZSB0aGUgc2hvcnRjdXRzIGFyZSByZWdpc3RlcmVkIHdpdGguXG4gICAqL1xuICByZWFkb25seSBzY29wZTogU2NvcGU7XG59XG5cbi8qKlxuICogRXZlcnkgdGFyZ2V0IHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmJ1aWxkfSBhY2NlcHRzLlxuICovXG5leHBvcnQgdHlwZSBNb2RhbENvbW1hbmRzVGFyZ2V0ID0gTW9kYWwgfCBNb2RhbENvbW1hbmRzSG9zdCB8IFN1Z2dlc3RNb2RhbDx1bmtub3duPjtcblxuLyoqXG4gKiBPbmUgYWNjdW11bGF0ZWQgY29tbWFuZCwgcmVkdWNlZCB0byB0aGUgaGFuZGZ1bCBvZiB0aGluZ3MgYm90aCByZW5kZXJlcnMgbmVlZC5cbiAqXG4gKiBPcHRpb25hbCBjb2xsYWJvcmF0b3JzIGFyZSBgbnVsbCB8IFhgIHJlcXVpcmVkIGZpZWxkcyByYXRoZXIgdGhhbiBgP2AsIHNvIGV2ZXJ5IGNvbnN0cnVjdGlvbiBzaXRlIGhhcyB0b1xuICogc2F5IHdoaWNoIG9uZXMgaXQgaGFzLlxuICovXG4vKipcbiAqIE9uZSBjb250cm9sIHJlbmRlcmVkIGFzIGEgQlVUVE9OLlxuICpcbiAqIEl0IHJlcG9ydHMgaXRzIG93biBwcmVzc2VkIHN0YXRlLCBiZWNhdXNlIG9ubHkgdGhlIGJ1dHRvbiByZW5kZXJlciBoYXMgYW55d2hlcmUgdG8gc2hvdyBvbmUuXG4gKi9cbmludGVyZmFjZSBCdXR0b25Db250cm9sIHtcbiAgY2hlY2tJc09uKHRoaXM6IHZvaWQpOiBib29sZWFuO1xuICBzZXREaXNhYmxlZCh0aGlzOiB2b2lkLCBpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIENvbW1hbmRFbnRyeSB7XG4gIHJlYWRvbmx5IGNoZWNrSXNBdmFpbGFibGU6ICgodGhpczogdm9pZCkgPT4gYm9vbGVhbikgfCBudWxsO1xuICByZWFkb25seSBjb21tYW5kVGV4dDogc3RyaW5nO1xuICByZWFkb25seSBpbml0QnV0dG9uOiAoKGJ1dHRvbkVsOiBIVE1MQnV0dG9uRWxlbWVudCwgc2NvcGU6IFNjb3BlKSA9PiBCdXR0b25Db250cm9sKSB8IG51bGw7XG4gIHJlYWRvbmx5IGluaXRJbnN0cnVjdGlvbjogKChwdXJwb3NlRWw6IEhUTUxTcGFuRWxlbWVudCwgc2NvcGU6IFNjb3BlKSA9PiBJbnN0cnVjdGlvbkNvbnRyb2wpIHwgbnVsbDtcbiAgcmVhZG9ubHkgaXNEcm9wRG93bjogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcHVycG9zZTogc3RyaW5nO1xuICByZWFkb25seSByZWdpc3RlclNjb3BlOiAoKHNjb3BlOiBTY29wZSkgPT4gdm9pZCkgfCBudWxsO1xufVxuXG4vKipcbiAqIE9uZSBjb250cm9sIHJlbmRlcmVkIGludG8gYW4gSU5TVFJVQ1RJT04gYmFyLlxuICpcbiAqIFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBwcmVzc2VkIHN0YXRlIGhlcmU6IHRoZSBjb250cm9sIFx1MjAxNCBhIGNoZWNrYm94LCBhIGRyb3Bkb3duIFx1MjAxNCBzaG93cyBpdHMgb3duLFxuICogc28gYSBzZWNvbmQgY29weSB3b3VsZCBvbmx5IGJlIGEgc2Vjb25kIHRoaW5nIHRvIGtlZXAgaW4gc3luYy5cbiAqL1xuaW50ZXJmYWNlIEluc3RydWN0aW9uQ29udHJvbCB7XG4gIHNldERpc2FibGVkKHRoaXM6IHZvaWQsIGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSW5zdHJ1Y3Rpb25FeCBleHRlbmRzIEluc3RydWN0aW9uIHtcbiAgcmVhZG9ubHkgZW50cnk6IENvbW1hbmRFbnRyeTtcbn1cblxuLyoqXG4gKiBSZS1zdGF0ZXMgb25lIHJlbmRlcmVkIGNvbnRyb2wsIGFscmVhZHkgYm91bmQgdG8gaXRzIG93biBlbGVtZW50cy5cbiAqL1xudHlwZSBSZWZyZXNoQ29udHJvbCA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xuXG5jb25zdCBOT09QX01PREFMX0NPTU1BTkRTOiBNb2RhbENvbW1hbmRzID0ge1xuICByZWZyZXNoOiAoKTogdm9pZCA9PiB7XG4gICAgLy8gTm90aGluZyB3YXMgcmVuZGVyZWQsIHNvIHRoZXJlIGlzIG5vIHN0YXRlIHRvIHJlLXN0YXRlLlxuICB9XG59O1xuXG4vKipcbiAqIEJ1aWxkcyBhIG1vZGFsJ3MgY29udHJvbCBzdHJpcCBmcm9tIGtleWJvYXJkIGNvbW1hbmRzLCBpbnRlcmFjdGl2ZSBjaGVja2JveGVzLCBhbmQgZHJvcGRvd25zLCB0aGVuXG4gKiBhcHBsaWVzIHRoZW0gdG8gYSBtb2RhbCB2aWEge0BsaW5rIE1vZGFsQ29tbWFuZEJ1aWxkZXIuYnVpbGR9LlxuICovXG5leHBvcnQgY2xhc3MgTW9kYWxDb21tYW5kQnVpbGRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW50cmllczogQ29tbWFuZEVudHJ5W10gPSBbXTtcblxuICAvKipcbiAgICogQWRkcyBhbiBpbnRlcmFjdGl2ZSBjaGVja2JveCB0byB0aGUgY29udHJvbCBzdHJpcCwgYm91bmQgdG8gYSBtb2RpZmllcitrZXkgc2hvcnRjdXQgdGhhdCB0b2dnbGVzIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjaGVja2JveCBjb21tYW5kIHRvIGFkZC5cbiAgICogQHJldHVybnMgVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgcHVibGljIGFkZENoZWNrYm94KGNvbW1hbmQ6IENoZWNrYm94Q29tbWFuZCk6IHRoaXMge1xuICAgIHRoaXMuZW50cmllcy5wdXNoKHtcbiAgICAgIGNoZWNrSXNBdmFpbGFibGU6IGNvbW1hbmQuY2hlY2tJc0F2YWlsYWJsZSA/PyBudWxsLFxuICAgICAgY29tbWFuZFRleHQ6IHRoaXMuYnVpbGRDb21tYW5kVGV4dChjb21tYW5kKSxcbiAgICAgIGluaXRCdXR0b246IChidXR0b25FbDogSFRNTEJ1dHRvbkVsZW1lbnQsIHNjb3BlOiBTY29wZSk6IEJ1dHRvbkNvbnRyb2wgPT4ge1xuICAgICAgICAvLyBDcmVhdGVkIGJ1dCBuZXZlciBhcHBlbmRlZDogdGhlIGNoZWNrYm94IGhvbGRzIHRoZSBzdGF0ZSBhbmQgdGhlIGJ1dHRvbiBpcyBhIHZpZXcgb2YgaXQsIHNvXG4gICAgICAgIC8vIGBvbkluaXRgIC8gYG9uQ2hhbmdlYCBtZWFuIGV4YWN0bHkgdGhlIHNhbWUgdGhpbmcgaW4gYm90aCByZW5kZXIgbW9kZXMuXG4gICAgICAgIGNvbnN0IGNoZWNrYm94RWwgPSBjcmVhdGVFbCgnaW5wdXQnLCB7IHR5cGU6ICdjaGVja2JveCcgfSk7XG4gICAgICAgIGluaXRDaGVja2JveChjaGVja2JveEVsLCBzY29wZSk7XG4gICAgICAgIGJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgIHRvZ2dsZUNoZWNrYm94KGNoZWNrYm94RWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjaGVja0lzT246ICgpOiBib29sZWFuID0+IGNoZWNrYm94RWwuY2hlY2tlZCxcbiAgICAgICAgICBzZXREaXNhYmxlZDogKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGNoZWNrYm94RWwuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgICAgICAgICAgYnV0dG9uRWwuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBpbml0SW5zdHJ1Y3Rpb246IChwdXJwb3NlRWw6IEhUTUxTcGFuRWxlbWVudCwgc2NvcGU6IFNjb3BlKTogSW5zdHJ1Y3Rpb25Db250cm9sID0+IGluaXRDaGVja2JveChwdXJwb3NlRWwuY3JlYXRlRWwoJ2lucHV0JywgeyB0eXBlOiAnY2hlY2tib3gnIH0pLCBzY29wZSksXG4gICAgICBpc0Ryb3BEb3duOiBmYWxzZSxcbiAgICAgIHB1cnBvc2U6IGNvbW1hbmQucHVycG9zZSxcbiAgICAgIHJlZ2lzdGVyU2NvcGU6IG51bGxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcblxuICAgIGZ1bmN0aW9uIGluaXRDaGVja2JveChjaGVja2JveEVsOiBIVE1MSW5wdXRFbGVtZW50LCBzY29wZTogU2NvcGUpOiBJbnN0cnVjdGlvbkNvbnRyb2wge1xuICAgICAgY29tbWFuZC5vbkluaXQoY2hlY2tib3hFbCk7XG4gICAgICBjaGVja2JveEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgY29tbWFuZC5vbkNoYW5nZShjaGVja2JveEVsLmNoZWNrZWQpO1xuICAgICAgfSk7XG5cbiAgICAgIHNjb3BlLnJlZ2lzdGVyKGNvbW1hbmQubW9kaWZpZXJzID8/IFtdLCBjb21tYW5kLmtleSwgKCkgPT4ge1xuICAgICAgICB0b2dnbGVDaGVja2JveChjaGVja2JveEVsKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXREaXNhYmxlZDogKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgICAgICBjaGVja2JveEVsLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGRyb3Bkb3duIHRvIHRoZSBjb250cm9sIHN0cmlwLCBib3VuZCB0byBhIG1vZGlmaWVyK2tleSBzaG9ydGN1dCB0aGF0IGN5Y2xlcyB0aHJvdWdoIGl0c1xuICAgKiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBkcm9wZG93biBjb21tYW5kIHRvIGFkZC5cbiAgICogQHJldHVybnMgVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgcHVibGljIGFkZERyb3BEb3duKGNvbW1hbmQ6IERyb3BEb3duQ29tbWFuZCk6IHRoaXMge1xuICAgIHRoaXMuZW50cmllcy5wdXNoKHtcbiAgICAgIGNoZWNrSXNBdmFpbGFibGU6IGNvbW1hbmQuY2hlY2tJc0F2YWlsYWJsZSA/PyBudWxsLFxuICAgICAgY29tbWFuZFRleHQ6IHRoaXMuYnVpbGRDb21tYW5kVGV4dChjb21tYW5kKSxcbiAgICAgIGluaXRCdXR0b246IG51bGwsXG4gICAgICBpbml0SW5zdHJ1Y3Rpb246IChwdXJwb3NlRWw6IEhUTUxTcGFuRWxlbWVudCwgc2NvcGU6IFNjb3BlKTogSW5zdHJ1Y3Rpb25Db250cm9sID0+IHtcbiAgICAgICAgcHVycG9zZUVsLmFwcGVuZFRleHQoJyAnKTtcbiAgICAgICAgY29uc3QgZHJvcGRvd25Db21wb25lbnQgPSBuZXcgRHJvcGRvd25Db21wb25lbnQocHVycG9zZUVsKTtcbiAgICAgICAgY29tbWFuZC5vbkluaXQoZHJvcGRvd25Db21wb25lbnQpO1xuICAgICAgICBkcm9wZG93bkNvbXBvbmVudC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICBjb21tYW5kLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIGRlZmVuc2l2ZSA/PyBvbiBvcHRpb25hbCBtb2RpZmllcnMuICovXG4gICAgICAgIHNjb3BlLnJlZ2lzdGVyKGNvbW1hbmQubW9kaWZpZXJzID8/IFtdLCBjb21tYW5kLmtleSwgKCkgPT4ge1xuICAgICAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgaWYgKGRyb3Bkb3duQ29tcG9uZW50LmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNlbGVjdEVsID0gZHJvcGRvd25Db21wb25lbnQuc2VsZWN0RWw7XG4gICAgICAgICAgc2VsZWN0RWwuc2VsZWN0ZWRJbmRleCA9IChzZWxlY3RFbC5zZWxlY3RlZEluZGV4ICsgMSkgJSBzZWxlY3RFbC5vcHRpb25zLmxlbmd0aDtcbiAgICAgICAgICBzZWxlY3RFbC50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzZXREaXNhYmxlZDogKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGRyb3Bkb3duQ29tcG9uZW50LnNldERpc2FibGVkKGlzRGlzYWJsZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBpc0Ryb3BEb3duOiB0cnVlLFxuICAgICAgcHVycG9zZTogY29tbWFuZC5wdXJwb3NlLFxuICAgICAgcmVnaXN0ZXJTY29wZTogbnVsbFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBrZXlib2FyZCBjb21tYW5kIHRvIHRoZSBjb250cm9sIHN0cmlwLiBXaGVuIHtAbGluayBLZXlib2FyZENvbW1hbmQub25LZXl9IGlzIHByb3ZpZGVkLCBpdHNcbiAgICogaGFuZGxlciBpcyByZWdpc3RlcmVkIHdpdGggdGhlIG1vZGFsIHNjb3BlOyBvdGhlcndpc2UgdGhlIGNvbW1hbmQgaXMgYSBoaW50IG9ubHkuXG4gICAqXG4gICAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGtleWJvYXJkIGNvbW1hbmQgdG8gYWRkLlxuICAgKiBAcmV0dXJucyBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBwdWJsaWMgYWRkS2V5Ym9hcmRDb21tYW5kKGNvbW1hbmQ6IEtleWJvYXJkQ29tbWFuZCk6IHRoaXMge1xuICAgIGNvbnN0IGNoZWNrSXNPbiA9IGNvbW1hbmQuY2hlY2tJc09uID8/ICgoKTogYm9vbGVhbiA9PiBmYWxzZSk7XG4gICAgY29uc3Qgb25BY3RpdmF0ZSA9IGNvbW1hbmQub25BY3RpdmF0ZSA/PyBudWxsO1xuICAgIGNvbnN0IG9uS2V5ID0gY29tbWFuZC5vbktleT8uYmluZChjb21tYW5kKSA/PyBudWxsO1xuXG4gICAgdGhpcy5lbnRyaWVzLnB1c2goe1xuICAgICAgY2hlY2tJc0F2YWlsYWJsZTogY29tbWFuZC5jaGVja0lzQXZhaWxhYmxlID8/IG51bGwsXG4gICAgICBjb21tYW5kVGV4dDogdGhpcy5idWlsZENvbW1hbmRUZXh0KGNvbW1hbmQpLFxuICAgICAgaW5pdEJ1dHRvbjogb25BY3RpdmF0ZVxuICAgICAgICAvLyBObyBkaXNhYmxlZCBndWFyZCBvbiB0aGUgbGlzdGVuZXI6IGEgZGlzYWJsZWQgYnV0dG9uIGZpcmVzIG5vIGNsaWNrIGF0IGFsbCwgc28gYHNldERpc2FibGVkYFxuICAgICAgICAvLyBCZWxvdyBpcyB0aGUgd2hvbGUgZ2F0ZS5cbiAgICAgICAgPyAoYnV0dG9uRWw6IEhUTUxCdXR0b25FbGVtZW50KTogQnV0dG9uQ29udHJvbCA9PiB7XG4gICAgICAgICAgYnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBvbkFjdGl2YXRlKCRldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNoZWNrSXNPbixcbiAgICAgICAgICAgIHNldERpc2FibGVkOiAoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICBidXR0b25FbC5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICA6IG51bGwsXG4gICAgICBpbml0SW5zdHJ1Y3Rpb246IG51bGwsXG4gICAgICBpc0Ryb3BEb3duOiBmYWxzZSxcbiAgICAgIHB1cnBvc2U6IGNvbW1hbmQucHVycG9zZSxcbiAgICAgIHJlZ2lzdGVyU2NvcGU6IG9uS2V5XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBkZWZlbnNpdmUgPz8gb24gb3B0aW9uYWwgbW9kaWZpZXJzLiAqL1xuICAgICAgICA/IChzY29wZTogU2NvcGUpOiB2b2lkID0+IHtcbiAgICAgICAgICBzY29wZS5yZWdpc3Rlcihjb21tYW5kLm1vZGlmaWVycyA/PyBbXSwgY29tbWFuZC5rZXksIG9uS2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICA6IG51bGxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBhY2N1bXVsYXRlZCBjb21tYW5kcyB0byBhIG1vZGFsLiBBbHdheXMgcmVnaXN0ZXJzIHRoZSBlc3NlbnRpYWwgbmF2aWdhdGlvbi9hY3Rpb24ga2V5XG4gICAqIGhhbmRsZXJzOyBvbmx5IHJlbmRlcnMgdGhlIGNvbnRyb2wgc3RyaXAgYW5kIHJlZ2lzdGVycyB0aGUgb3B0aW9uLXRvZ2dsZSBzaG9ydGN1dHMgd2hlblxuICAgKiB7QGxpbmsgTW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucy5zaG91bGRTaG93SW5zdHJ1Y3Rpb25zfSBpcyBgdHJ1ZWAuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgbW9kYWwsIG9yIHRoZSBiYXJlIGVsZW1lbnQgKyBzY29wZSwgdG8gYXBwbHkgdGhlIGNvbW1hbmRzIHRvLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBidWlsZCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBBIGhhbmRsZSB3aG9zZSB7QGxpbmsgTW9kYWxDb21tYW5kcy5yZWZyZXNofSByZS1zdGF0ZXMgZXZlcnkgcmVuZGVyZWQgY29udHJvbC5cbiAgICovXG4gIHB1YmxpYyBidWlsZCh0YXJnZXQ6IE1vZGFsQ29tbWFuZHNUYXJnZXQsIG9wdGlvbnM6IE1vZGFsQ29tbWFuZEJ1aWxkZXJCdWlsZE9wdGlvbnMgPSB7fSk6IE1vZGFsQ29tbWFuZHMge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlbmRlck1vZGUgPSBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5JbnN0cnVjdGlvbnMsXG4gICAgICBzaG91bGRTaG93SW5zdHJ1Y3Rpb25zID0gdHJ1ZVxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3Qgc2NvcGUgPSB0YXJnZXQuc2NvcGU7XG5cbiAgICAvLyBFc3NlbnRpYWwgbmF2aWdhdGlvbi9hY3Rpb24ga2V5IGhhbmRsZXJzIG11c3Qgc3RheSBhY3RpdmUgZXZlbiB3aGVuIHRoZSBjb250cm9sIHN0cmlwIGlzIGhpZGRlbi5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcykge1xuICAgICAgZW50cnkucmVnaXN0ZXJTY29wZT8uKHNjb3BlKTtcbiAgICB9XG5cbiAgICBpZiAoIXNob3VsZFNob3dJbnN0cnVjdGlvbnMpIHtcbiAgICAgIHJldHVybiBOT09QX01PREFMX0NPTU1BTkRTO1xuICAgIH1cblxuICAgIC8vIEVhY2ggcmVuZGVyZXIgaGFuZHMgYmFjayBvbmUgY2xvc3VyZSBwZXIgY29udHJvbCBpdCBhY3R1YWxseSBkcmV3LCBhbHJlYWR5IGJvdW5kIHRvIHRoYXQgY29udHJvbCdzXG4gICAgLy8gRWxlbWVudHMgXHUyMDE0IHNvIGByZWZyZXNoYCBuZXZlciBoYXMgdG8ga25vdyB3aGljaCBvZiB0aGUgdHdvIHNoYXBlcyBpdCBpcyByZS1zdGF0aW5nLlxuICAgIGNvbnN0IHJlZnJlc2hlcnMgPSByZW5kZXJNb2RlID09PSBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5CdXR0b25zXG4gICAgICA/IHRoaXMucmVuZGVyQnV0dG9ucyh0YXJnZXQsIHNjb3BlKVxuICAgICAgOiB0aGlzLnJlbmRlckluc3RydWN0aW9ucyh0YXJnZXQsIHNjb3BlKTtcblxuICAgIGNvbnN0IG1vZGFsQ29tbWFuZHM6IE1vZGFsQ29tbWFuZHMgPSB7XG4gICAgICByZWZyZXNoOiAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgcmVmcmVzaENvbnRyb2wgb2YgcmVmcmVzaGVycykge1xuICAgICAgICAgIHJlZnJlc2hDb250cm9sKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIG1vZGFsQ29tbWFuZHMucmVmcmVzaCgpO1xuICAgIHJldHVybiBtb2RhbENvbW1hbmRzO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENvbW1hbmRUZXh0KGNvbW1hbmQ6IENvbW1hbmRCYXNlKTogc3RyaW5nIHtcbiAgICBsZXQgY29tbWFuZFRleHQgPSBLRVlTX01BUC5nZXQoY29tbWFuZC5rZXkpID8/IGNvbW1hbmQua2V5O1xuXG4gICAgZm9yIChjb25zdCBtb2RpZmllciBvZiBjb21tYW5kLm1vZGlmaWVycyA/PyBbXSkge1xuICAgICAgY29tbWFuZFRleHQgPSBgJHt0aGlzLmdldE1vZGlmaWVyU3RyaW5nKG1vZGlmaWVyKX0gJHtjb21tYW5kVGV4dH1gO1xuICAgIH1cblxuICAgIHJldHVybiBjb21tYW5kVGV4dDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TW9kaWZpZXJTdHJpbmcobW9kaWZpZXI6IE1vZGlmaWVyKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKG1vZGlmaWVyKSB7XG4gICAgICBjYXNlICdBbHQnOiB7XG4gICAgICAgIHJldHVybiAnYWx0JztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0N0cmwnOiB7XG4gICAgICAgIHJldHVybiAnY3RybCc7XG4gICAgICB9XG4gICAgICBjYXNlICdNZXRhJzoge1xuICAgICAgICByZXR1cm4gUGxhdGZvcm0uaXNNYWNPUyA/ICdjbWQnIDogJ3dpbic7XG4gICAgICB9XG4gICAgICBjYXNlICdNb2QnOiB7XG4gICAgICAgIHJldHVybiBQbGF0Zm9ybS5pc01hY09TID8gJ2NtZCcgOiAnY3RybCc7XG4gICAgICB9XG4gICAgICBjYXNlICdTaGlmdCc6IHtcbiAgICAgICAgcmV0dXJuICdzaGlmdCc7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBtb2RpZmllcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGVsZW1lbnQgYSBzZWxmLWNyZWF0ZWQgc3RyaXAgaXMgYXBwZW5kZWQgdG8uXG4gICAqXG4gICAqIEEge0BsaW5rIE1vZGFsfSBjYXJyaWVzIGJvdGggYG1vZGFsRWxgIGFuZCBhIGBjb250YWluZXJFbGAgdGhhdCBpcyB0aGUgT1VURVIgYC5tb2RhbC1jb250YWluZXJgLCBzb1xuICAgKiBgbW9kYWxFbGAgaGFzIHRvIHdpbiBcdTIwMTQgb3RoZXJ3aXNlIHRoZSBzdHJpcCBsYW5kcyBvdXRzaWRlIHRoZSBtb2RhbCBmcmFtZS4gRGlzY3JpbWluYXRlZCB3aXRoIGBpbmBcbiAgICogcmF0aGVyIHRoYW4gYSBwcm9wZXJ0eSByZWFkLCBiZWNhdXNlIHRlc3RzIGhhbmQgYGJ1aWxkYCBhIGBzdHJpY3RQcm94eWAgbW9jayB3aG9zZSBgZ2V0YCB0cmFwIHRocm93c1xuICAgKiBvbiB1bm1vY2tlZCBtZW1iZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIGJ1aWxkIHRhcmdldC5cbiAgICogQHJldHVybnMgVGhlIGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBzdHJpcCB0by5cbiAgICovXG4gIHByaXZhdGUgZ2V0U3RyaXBDb250YWluZXJFbCh0YXJnZXQ6IE1vZGFsQ29tbWFuZHNUYXJnZXQpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuICdtb2RhbEVsJyBpbiB0YXJnZXQgPyB0YXJnZXQubW9kYWxFbCA6IHRhcmdldC5jb250YWluZXJFbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQnV0dG9ucyh0YXJnZXQ6IE1vZGFsQ29tbWFuZHNUYXJnZXQsIHNjb3BlOiBTY29wZSk6IFJlZnJlc2hDb250cm9sW10ge1xuICAgIGNvbnN0IHN0cmlwRWwgPSB0aGlzLmdldFN0cmlwQ29udGFpbmVyRWwodGFyZ2V0KS5jcmVhdGVEaXYoKTtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKHN0cmlwRWwsIENzc0NsYXNzLk1vZGFsQ29tbWFuZHMpO1xuXG4gICAgY29uc3QgcmVmcmVzaGVyczogUmVmcmVzaENvbnRyb2xbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyeS5pc0Ryb3BEb3duKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlbmRlciBkcm9wZG93biBjb21tYW5kIFwiJHtlbnRyeS5wdXJwb3NlfVwiIGFzIGEgYnV0dG9uOiBhIGNvbnRyb2wgdGhhdCBjeWNsZXMgaGFzIG5vIGJ1dHRvbiBmb3JtLmApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVudHJ5LmluaXRCdXR0b24pIHtcbiAgICAgICAgLy8gSGludC1vbmx5IGFuZCBrZXlib2FyZC1vbmx5IGNvbW1hbmRzIGhhdmUgbm8gcG9pbnRlciByb3V0ZSwgYW5kIGEgYnV0dG9uIG5vYm9keSBjYW4gcHJlc3MgaXNcbiAgICAgICAgLy8gV29yc2UgdGhhbiBubyBidXR0b24uIFRoZWlyIHNjb3BlIGhhbmRsZXJzIGFyZSBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25FbCA9IHN0cmlwRWwuY3JlYXRlRWwoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicgfSk7XG4gICAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGJ1dHRvbkVsLCBDc3NDbGFzcy5Nb2RhbENvbW1hbmQpO1xuICAgICAgYnV0dG9uRWwuY3JlYXRlU3Bhbih7IHRleHQ6IGVudHJ5LnB1cnBvc2UgfSk7XG5cbiAgICAgIC8vIFRoZSBob3RrZXkgaXMgc2hvd24gb25seSB3aGVyZSBvbmUgY2FuIGJlIHByZXNzZWQuIE9uIGEgcGhvbmUgdGhlcmUgaXMgbm8gbW9kaWZpZXIga2V5IHRvIG9mZmVyLFxuICAgICAgLy8gQW5kIHRoZSBidXR0b24gSVMgdGhlIG9ubHkgd2F5IGluIFx1MjAxNCB3aGljaCBpcyB3aHkgdGhlIHN0cmlwIGV4aXN0cy5cbiAgICAgIGlmICghUGxhdGZvcm0uaXNNb2JpbGUpIHtcbiAgICAgICAgY29uc3QgaG90a2V5RWwgPSBidXR0b25FbC5jcmVhdGVTcGFuKHsgdGV4dDogZW50cnkuY29tbWFuZFRleHQgfSk7XG4gICAgICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoaG90a2V5RWwsIENzc0NsYXNzLk1vZGFsQ29tbWFuZEhvdGtleSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBpbnB1dCBrZWVwcyBmb2N1czogYSBtb2RhbCB0aGF0IGZpbHRlcnMgYXMgeW91IHR5cGUgd291bGQgZW5kIGl0cyBzZWFyY2ggbWlkLXdvcmQgaWYgYSBjbGlja1xuICAgICAgLy8gU3RvbGUgZm9jdXMuXG4gICAgICBidXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoJGV2ZW50KSA9PiB7XG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGJ1dHRvbkNvbnRyb2wgPSBlbnRyeS5pbml0QnV0dG9uKGJ1dHRvbkVsLCBzY29wZSk7XG4gICAgICBjb25zdCBjaGVja0lzQXZhaWxhYmxlID0gZW50cnkuY2hlY2tJc0F2YWlsYWJsZTtcbiAgICAgIHJlZnJlc2hlcnMucHVzaCgoKSA9PiB7XG4gICAgICAgIGlmIChjaGVja0lzQXZhaWxhYmxlKSB7XG4gICAgICAgICAgYnV0dG9uQ29udHJvbC5zZXREaXNhYmxlZCghY2hlY2tJc0F2YWlsYWJsZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc09uID0gYnV0dG9uQ29udHJvbC5jaGVja0lzT24oKTtcbiAgICAgICAgYnV0dG9uRWwudG9nZ2xlQ2xhc3MoQ3NzQ2xhc3MuSXNBY3RpdmUsIGlzT24pO1xuICAgICAgICBidXR0b25FbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIFN0cmluZyhpc09uKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmcmVzaGVycztcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVySW5zdHJ1Y3Rpb25zKHRhcmdldDogTW9kYWxDb21tYW5kc1RhcmdldCwgc2NvcGU6IFNjb3BlKTogUmVmcmVzaENvbnRyb2xbXSB7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zOiBJbnN0cnVjdGlvbkV4W10gPSB0aGlzLmVudHJpZXMubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIGNvbW1hbmQ6IGVudHJ5LmNvbW1hbmRUZXh0LFxuICAgICAgZW50cnksXG4gICAgICBwdXJwb3NlOiBlbnRyeS5wdXJwb3NlXG4gICAgfSkpO1xuXG4gICAgY29uc3QgcHVycG9zZUVscyA9ICdzZXRJbnN0cnVjdGlvbnMnIGluIHRhcmdldFxuICAgICAgPyB0aGlzLnJlbmRlck5hdGl2ZUluc3RydWN0aW9ucyh0YXJnZXQsIGluc3RydWN0aW9ucylcbiAgICAgIDogdGhpcy5yZW5kZXJPd25JbnN0cnVjdGlvbnModGhpcy5nZXRTdHJpcENvbnRhaW5lckVsKHRhcmdldCksIGluc3RydWN0aW9ucyk7XG5cbiAgICBjb25zdCByZWZyZXNoZXJzOiBSZWZyZXNoQ29udHJvbFtdID0gW107XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGluc3RydWN0aW9uXSBvZiBpbnN0cnVjdGlvbnMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBwdXJwb3NlRWwgPSBwdXJwb3NlRWxzW2luZGV4XTtcbiAgICAgIC8vIEEgaG9zdCBtYXkgcmVuZGVyIGZld2VyIHB1cnBvc2UgZWxlbWVudHMgdGhhbiB0aGVyZSBhcmUgaW5zdHJ1Y3Rpb25zOyBza2lwIHJhdGhlciB0aGFuIHRocm93LlxuICAgICAgaWYgKCFwdXJwb3NlRWwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluc3RydWN0aW9uQ29udHJvbCA9IGluc3RydWN0aW9uLmVudHJ5LmluaXRJbnN0cnVjdGlvbj8uKHB1cnBvc2VFbCwgc2NvcGUpO1xuICAgICAgY29uc3QgY2hlY2tJc0F2YWlsYWJsZSA9IGluc3RydWN0aW9uLmVudHJ5LmNoZWNrSXNBdmFpbGFibGU7XG4gICAgICAvLyBBIGNvbnRyb2wgc2hvd3MgaXRzIG93biBwcmVzc2VkIHN0YXRlIGhlcmUsIHNvIGF2YWlsYWJpbGl0eSBpcyB0aGUgb25seSB0aGluZyBsZWZ0IHRvIHJlLXN0YXRlIFx1MjAxNFxuICAgICAgLy8gQW5kIGEgY29tbWFuZCB0aGF0IGRlY2xhcmVzIG5vbmUgbmVlZHMgbm8gcmVmcmVzaGVyIGF0IGFsbC5cbiAgICAgIGlmIChpbnN0cnVjdGlvbkNvbnRyb2wgJiYgY2hlY2tJc0F2YWlsYWJsZSkge1xuICAgICAgICByZWZyZXNoZXJzLnB1c2goKCkgPT4ge1xuICAgICAgICAgIGluc3RydWN0aW9uQ29udHJvbC5zZXREaXNhYmxlZCghY2hlY2tJc0F2YWlsYWJsZSgpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZnJlc2hlcnM7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aHJvdWdoIE9ic2lkaWFuJ3Mgb3duIGluc3RydWN0aW9uIGJhciwgdGhlIHdheSBldmVyeSB7QGxpbmsgU3VnZ2VzdE1vZGFsfSBjb25zdW1lciBoYXMgYWx3YXlzXG4gICAqIGhhZCBpdC5cbiAgICpcbiAgICogQHBhcmFtIG1vZGFsIC0gVGhlIHN1Z2dlc3QgbW9kYWwuXG4gICAqIEBwYXJhbSBpbnN0cnVjdGlvbnMgLSBUaGUgaW5zdHJ1Y3Rpb25zIHRvIHJlbmRlci5cbiAgICogQHJldHVybnMgVGhlIHB1cnBvc2UgZWxlbWVudCBvZiBlYWNoIHJlbmRlcmVkIGluc3RydWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJOYXRpdmVJbnN0cnVjdGlvbnMobW9kYWw6IFN1Z2dlc3RNb2RhbDx1bmtub3duPiwgaW5zdHJ1Y3Rpb25zOiBJbnN0cnVjdGlvbkV4W10pOiBIVE1MU3BhbkVsZW1lbnRbXSB7XG4gICAgbW9kYWwuc2V0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgcmV0dXJuIFsuLi5tb2RhbC5pbnN0cnVjdGlvbnNFbC5maW5kQWxsKCcucHJvbXB0LWluc3RydWN0aW9uID4gc3BhbjpudGgtY2hpbGQoMiknKV0gYXMgSFRNTFNwYW5FbGVtZW50W107XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBhbiBpbnN0cnVjdGlvbiBiYXIgb2YgdGhlIGJ1aWxkZXIncyBvd24sIGZvciBhIGhvc3QgdGhhdCBoYXMgbm9uZS5cbiAgICpcbiAgICogVGhlIG1hcmt1cCBtaXJyb3JzIHdoYXQgYHNldEluc3RydWN0aW9uc2AgcHJvZHVjZXMsIHNvIE9ic2lkaWFuJ3Mgb3duIHN0eWxpbmcgYXBwbGllcyB1bmNoYW5nZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJFbCAtIFRoZSBlbGVtZW50IHRvIGFwcGVuZCB0aGUgYmFyIHRvLlxuICAgKiBAcGFyYW0gaW5zdHJ1Y3Rpb25zIC0gVGhlIGluc3RydWN0aW9ucyB0byByZW5kZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwdXJwb3NlIGVsZW1lbnQgb2YgZWFjaCByZW5kZXJlZCBpbnN0cnVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyT3duSW5zdHJ1Y3Rpb25zKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCwgaW5zdHJ1Y3Rpb25zOiBJbnN0cnVjdGlvbkV4W10pOiBIVE1MU3BhbkVsZW1lbnRbXSB7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoQ3NzQ2xhc3MuUHJvbXB0SW5zdHJ1Y3Rpb25zKTtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGluc3RydWN0aW9uc0VsLCBDc3NDbGFzcy5Nb2RhbENvbW1hbmRzKTtcblxuICAgIHJldHVybiBpbnN0cnVjdGlvbnMubWFwKChpbnN0cnVjdGlvbikgPT4ge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25FbCA9IGluc3RydWN0aW9uc0VsLmNyZWF0ZURpdihDc3NDbGFzcy5Qcm9tcHRJbnN0cnVjdGlvbik7XG4gICAgICBpbnN0cnVjdGlvbkVsLmNyZWF0ZVNwYW4oeyB0ZXh0OiBpbnN0cnVjdGlvbi5jb21tYW5kIH0pO1xuICAgICAgcmV0dXJuIGluc3RydWN0aW9uRWwuY3JlYXRlU3Bhbih7IHRleHQ6IGluc3RydWN0aW9uLnB1cnBvc2UgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBGbGlwcyBhIGNoZWNrYm94IGFuZCBhbm5vdW5jZXMgaXQsIHVubGVzcyBpdCBpcyBkaXNhYmxlZC5cbiAqXG4gKiBTaGFyZWQgYnkgdGhlIHNob3J0Y3V0IGFuZCB0aGUgYnV0dG9uIHNvIHRoZSB0d28gcm91dGVzIGNhbm5vdCBkcmlmdCBcdTIwMTQgaW5jbHVkaW5nIHRoZSBkaXNhYmxlZCBndWFyZCxcbiAqIHdoaWNoIGlzIHRoZSBoYWxmIG1vc3QgZWFzaWx5IGZvcmdvdHRlbiBvbiBvbmUgb2YgdGhlbS5cbiAqXG4gKiBAcGFyYW0gY2hlY2tib3hFbCAtIFRoZSBjaGVja2JveCB0byB0b2dnbGUuXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZUNoZWNrYm94KGNoZWNrYm94RWw6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgaWYgKGNoZWNrYm94RWwuZGlzYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY2hlY2tib3hFbC5jaGVja2VkID0gIWNoZWNrYm94RWwuY2hlY2tlZDtcbiAgY2hlY2tib3hFbC50cmlnZ2VyKCdjaGFuZ2UnKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0Q0E7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFT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RUFFUSxtQkFBbUIsUUFBNkIsT0FBZ0M7QUFDdEYsVUFBTSxlQUFnQyxLQUFLLFFBQVEsSUFBSSxDQUFDLFdBQVc7QUFBQSxNQUNqRSxTQUFTLE1BQU07QUFBQSxNQUNmO0FBQUEsTUFDQSxTQUFTLE1BQU07QUFBQSxJQUNqQixFQUFFO0FBRUYsVUFBTSxhQUFhLHFCQUFxQixTQUNwQyxLQUFLLHlCQUF5QixRQUFRLFlBQVksSUFDbEQsS0FBSyxzQkFBc0IsS0FBSyxvQkFBb0IsTUFBTSxHQUFHLFlBQVk7QUFFN0UsVUFBTSxhQUErQixDQUFDO0FBQ3RDLGVBQVcsQ0FBQyxPQUFPLFdBQVcsS0FBSyxhQUFhLFFBQVEsR0FBRztBQUN6RCxZQUFNLFlBQVksV0FBVyxLQUFLO0FBRWxDLFVBQUksQ0FBQyxXQUFXO0FBQ2Q7QUFBQSxNQUNGO0FBRUEsWUFBTSxxQkFBcUIsWUFBWSxNQUFNLGtCQUFrQixXQUFXLEtBQUs7QUFDL0UsWUFBTSxtQkFBbUIsWUFBWSxNQUFNO0FBRzNDLFVBQUksc0JBQXNCLGtCQUFrQjtBQUMxQyxtQkFBVyxLQUFLLE1BQU07QUFDcEIsNkJBQW1CLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQztBQUFBLFFBQ3BELENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRjtBQUVBLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVVEseUJBQXlCLE9BQThCLGNBQWtEO0FBQy9HLFVBQU0sZ0JBQWdCLFlBQVk7QUFDbEMsV0FBTyxDQUFDLEdBQUcsTUFBTSxlQUFlLFFBQVEseUNBQXlDLENBQUM7QUFBQSxFQUNwRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV1Esc0JBQXNCLGFBQTBCLGNBQWtEO0FBQ3hHLFVBQU0saUJBQWlCLFlBQVksVUFBVSxTQUFTLGtCQUFrQjtBQUN4RSx3QkFBb0IsZ0JBQWdCLFNBQVMsYUFBYTtBQUUxRCxXQUFPLGFBQWEsSUFBSSxDQUFDLGdCQUFnQjtBQUN2QyxZQUFNLGdCQUFnQixlQUFlLFVBQVUsU0FBUyxpQkFBaUI7QUFDekUsb0JBQWMsV0FBVyxFQUFFLE1BQU0sWUFBWSxRQUFRLENBQUM7QUFDdEQsYUFBTyxjQUFjLFdBQVcsRUFBRSxNQUFNLFlBQVksUUFBUSxDQUFDO0FBQUEsSUFDL0QsQ0FBQztBQUFBLEVBQ0g7QUFDRjtBQVVBLFNBQVMsZUFBZSxZQUFvQztBQUMxRCxNQUFJLFdBQVcsVUFBVTtBQUN2QjtBQUFBLEVBQ0Y7QUFDQSxhQUFXLFVBQVUsQ0FBQyxXQUFXO0FBQ2pDLGFBQVcsUUFBUSxRQUFRO0FBQzdCOyIsCiAgIm5hbWVzIjogWyJNb2RhbENvbW1hbmRzUmVuZGVyTW9kZSJdCn0K
365
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9tb2RhbC1jb21tYW5kLWJ1aWxkZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBIGJ1aWxkZXIgZm9yIGEgbW9kYWwncyBjb250cm9sIHN0cmlwLlxuICpcbiAqIHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyfSBhc3NlbWJsZXMgdGhlIHN0cmlwIG9mIGNvbnRyb2xzIHNob3duIGF0IHRoZSBib3R0b20gb2YgYSBtb2RhbDpcbiAqIGtleWJvYXJkLWNvbW1hbmQgaGludHMgKHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmFkZEtleWJvYXJkQ29tbWFuZH0pLCBpbnRlcmFjdGl2ZSBjaGVja2JveGVzIGJvdW5kIHRvXG4gKiBhIG1vZGlmaWVyK2tleSBzaG9ydGN1dCAoe0BsaW5rIE1vZGFsQ29tbWFuZEJ1aWxkZXIuYWRkQ2hlY2tib3h9KSwgYW5kIGRyb3Bkb3ducyBib3VuZCB0byBhIG1vZGlmaWVyK2tleVxuICogc2hvcnRjdXQgKHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmFkZERyb3BEb3dufSkuIENoYWluIHRoZSBgYWRkKmAgY2FsbHMsIHRoZW4gYXBwbHkgZXZlcnl0aGluZyB0byBhXG4gKiBtb2RhbCB3aXRoIHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmJ1aWxkfTpcbiAqXG4gKiBgYGB0c1xuICogbmV3IE1vZGFsQ29tbWFuZEJ1aWxkZXIoKVxuICogICAuYWRkS2V5Ym9hcmRDb21tYW5kKHsga2V5OiAnRW50ZXInLCBtb2RpZmllcnM6IFsnTW9kJ10sIG9uS2V5LCBwdXJwb3NlOiAndG8gY3JlYXRlJyB9KVxuICogICAuYWRkQ2hlY2tib3goeyBrZXk6ICcxJywgbW9kaWZpZXJzOiBbJ0FsdCddLCBvbkNoYW5nZSwgb25Jbml0LCBwdXJwb3NlOiAnRml4IGZvb3Rub3RlcycgfSlcbiAqICAgLmJ1aWxkKG1vZGFsKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBzdHJpcCBpcyBkZXNjcmliZWQgYnkgdHdvIGluZGVwZW5kZW50IGF4ZXM6XG4gKlxuICogLSAqKldoZXJlIGl0IGlzIGhvc3RlZC4qKiBBIHtAbGluayBTdWdnZXN0TW9kYWx9IGluIHtAbGluayBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5JbnN0cnVjdGlvbnN9IG1vZGVcbiAqICAga2VlcHMgT2JzaWRpYW4ncyBvd24gaW5zdHJ1Y3Rpb24gYmFyIChgc2V0SW5zdHJ1Y3Rpb25zYCArIGBpbnN0cnVjdGlvbnNFbGApLiBFdmVyeSBvdGhlciB0YXJnZXQgXHUyMDE0IGFcbiAqICAgcGxhaW4ge0BsaW5rIE1vZGFsfSwgb3IgYSBiYXJlIHtAbGluayBNb2RhbENvbW1hbmRzSG9zdH0gb2YgYW4gZWxlbWVudCBwbHVzIGEgYFNjb3BlYCBcdTIwMTQgZ2V0cyBhIHN0cmlwXG4gKiAgIGVsZW1lbnQgdGhlIGJ1aWxkZXIgY3JlYXRlcyBpdHNlbGYuXG4gKiAtICoqSG93IGVhY2ggY29udHJvbCBsb29rcy4qKiB7QGxpbmsgTW9kYWxDb21tYW5kc1JlbmRlck1vZGUuSW5zdHJ1Y3Rpb25zfSByZW5kZXJzIHRoZSBwdXJwb3NlIHRleHQgd2l0aFxuICogICBhbiBpbmxpbmUgY2hlY2tib3ggb3IgZHJvcGRvd247IHtAbGluayBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5CdXR0b25zfSByZW5kZXJzIG9uZSBjbGlja2FibGUgYnV0dG9uXG4gKiAgIHBlciBjb250cm9sLCBjYXJyeWluZyBpdHMgcHJlc3NlZCBhbmQgZGlzYWJsZWQgc3RhdGUuXG4gKlxuICogVGhlIGF4ZXMgYXJlIGluZGVwZW5kZW50IGJlY2F1c2UgYSBidXR0b24gc3RyaXAgaW5zaWRlIGEge0BsaW5rIFN1Z2dlc3RNb2RhbH0gaXMgYSByZWFsIGNvbWJpbmF0aW9uLlxuICpcbiAqIHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmJ1aWxkfSBhbHdheXMgcmVnaXN0ZXJzIHRoZSBlc3NlbnRpYWwgbmF2aWdhdGlvbi9hY3Rpb24ga2V5IGhhbmRsZXJzLCBidXRcbiAqIG9ubHkgcmVuZGVycyB0aGUgY29udHJvbCBVSSBhbmQgcmVnaXN0ZXJzIHRoZSBvcHRpb24tdG9nZ2xlIHNob3J0Y3V0cyB3aGVuXG4gKiB7QGxpbmsgTW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucy5zaG91bGRTaG93SW5zdHJ1Y3Rpb25zfSBpcyBgdHJ1ZWAgKHRoZSBkZWZhdWx0KS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEluc3RydWN0aW9uLFxuICBLZXltYXBDb250ZXh0LFxuICBNb2RhbCxcbiAgTW9kaWZpZXIsXG4gIFNjb3BlLFxuICBTdWdnZXN0TW9kYWxcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBEcm9wZG93bkNvbXBvbmVudCxcbiAgUGxhdGZvcm1cbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyBhZGRQbHVnaW5Dc3NDbGFzc2VzIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcblxuY29uc3QgS0VZU19NQVAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihbXG4gIFsnRW50ZXInLCAnXHUyMUI1J10sXG4gIFsnVXBEb3duJywgJ1x1MjE5MVx1MjE5MyddXG5dKTtcblxuLyoqXG4gKiBUaGUgd2F5IHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmJ1aWxkfSByZW5kZXJzIGVhY2ggY29udHJvbC5cbiAqL1xuZXhwb3J0IGVudW0gTW9kYWxDb21tYW5kc1JlbmRlck1vZGUge1xuICAvKipcbiAgICogT25lIGNsaWNrYWJsZSBidXR0b24gcGVyIGNvbnRyb2wsIGNhcnJ5aW5nIGl0cyBwcmVzc2VkIChgYXJpYS1wcmVzc2VkYCkgYW5kIGRpc2FibGVkIHN0YXRlLlxuICAgKlxuICAgKiBPbmx5IGNvbnRyb2xzIHJlYWNoYWJsZSBieSBwb2ludGVyIGFyZSByZW5kZXJlZCBcdTIwMTQgY2hlY2tib3hlcywgYW5kIGtleWJvYXJkIGNvbW1hbmRzIHRoYXQgc3VwcGx5XG4gICAqIHtAbGluayBLZXlib2FyZENvbW1hbmQub25BY3RpdmF0ZX0uIEEgaGludC1vbmx5IG9yIGtleWJvYXJkLW9ubHkgY29tbWFuZCBzdGlsbCByZWdpc3RlcnMgaXRzIGhhbmRsZXJcbiAgICogYnV0IHJlbmRlcnMgbm8gYnV0dG9uLCBiZWNhdXNlIGEgYnV0dG9uIG5vYm9keSBjYW4gcHJlc3MgaXMgd29yc2UgdGhhbiBubyBidXR0b24uIEEgZHJvcGRvd24gdGhyb3dzOlxuICAgKiBhIGNvbnRyb2wgdGhhdCBDWUNMRVMgaGFzIG5vIGJ1dHRvbiBmb3JtLlxuICAgKi9cbiAgQnV0dG9ucyA9ICdidXR0b25zJyxcblxuICAvKipcbiAgICogT2JzaWRpYW4ncyBpbnN0cnVjdGlvbi1iYXIgbG9vazogdGhlIHNob3J0Y3V0LCB0aGVuIHRoZSBwdXJwb3NlIHRleHQgd2l0aCBhbiBpbmxpbmUgY2hlY2tib3ggb3JcbiAgICogZHJvcGRvd24uXG4gICAqL1xuICBJbnN0cnVjdGlvbnMgPSAnaW5zdHJ1Y3Rpb25zJ1xufVxuXG4vKipcbiAqIEEgY2hlY2tib3ggY29tbWFuZCBzaG93biBpbiBhIG1vZGFsJ3MgY29udHJvbCBzdHJpcCBhbmQgYm91bmQgdG8gYSBtb2RpZmllcitrZXkgc2hvcnRjdXQgdGhhdCB0b2dnbGVzXG4gKiBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja2JveENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kQmFzZSB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgY2hlY2tib3ggdmFsdWUgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIGlzQ2hlY2tlZCAtIFRoZSBuZXcgY2hlY2tlZCBzdGF0ZS5cbiAgICovXG4gIG9uQ2hhbmdlKGlzQ2hlY2tlZDogYm9vbGVhbik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbmNlIHdpdGggdGhlIGNyZWF0ZWQgY2hlY2tib3ggZWxlbWVudCwgdG8gaW5pdGlhbGl6ZSBpdHMgc3RhdGUuXG4gICAqXG4gICAqIEluIHtAbGluayBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5CdXR0b25zfSBtb2RlIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQgYnV0IG5ldmVyIGFwcGVuZGVkIFx1MjAxNCB0aGVcbiAgICogYnV0dG9uIGlzIGEgdmlldyBvZiBpdCBcdTIwMTQgc28gdGhlIHNhbWUgaW5pdGlhbGl6YXRpb24gY29kZSBzZXJ2ZXMgYm90aCByZW5kZXIgbW9kZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjaGVja2JveEVsIC0gVGhlIGNyZWF0ZWQgY2hlY2tib3ggZWxlbWVudC5cbiAgICovXG4gIG9uSW5pdChjaGVja2JveEVsOiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgbWVtYmVycyBldmVyeSBjb21tYW5kIHNoYXJlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kQmFzZSB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb250cm9sIGNhbiBiZSB1c2VkIHJpZ2h0IG5vdy4gV2hlbiBpdCByZXR1cm5zIGBmYWxzZWAgdGhlIGNvbnRyb2wgaXMgcmVuZGVyZWRcbiAgICogKipkaXNhYmxlZCByYXRoZXIgdGhhbiByZW1vdmVkKiosIHNvIHRoZSBzdHJpcCBkb2VzIG5vdCByZWZsb3cgdW5kZXIgdGhlIHBvaW50ZXIgYXMgbW9kZXMgY2hhbmdlIFx1MjAxNFxuICAgKiB3aGljaCBvbiBhIHBob25lIG1lYW5zIGEgbWlzLXRhcC5cbiAgICpcbiAgICogUmUtcmVhZCBieSB7QGxpbmsgTW9kYWxDb21tYW5kcy5yZWZyZXNofS4gV2hlbiBvbWl0dGVkLCB0aGUgYnVpbGRlciBuZXZlciB0b3VjaGVzIHRoZSBjb250cm9sJ3NcbiAgICogZGlzYWJsZWQgc3RhdGUsIGxlYXZpbmcgd2hhdGV2ZXIge0BsaW5rIENoZWNrYm94Q29tbWFuZC5vbkluaXR9IC8ge0BsaW5rIERyb3BEb3duQ29tbWFuZC5vbkluaXR9IHNldC5cbiAgICpcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY29udHJvbCBjYW4gYmUgdXNlZCByaWdodCBub3cuXG4gICAqL1xuICBjaGVja0lzQXZhaWxhYmxlPyh0aGlzOiB2b2lkKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGtleSB0aGF0IGFjdGl2YXRlcyB0aGUgY29tbWFuZC5cbiAgICovXG4gIGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kaWZpZXJzIGNvbWJpbmVkIHdpdGgge0BsaW5rIENvbW1hbmRCYXNlLmtleX0uIFdoZW4gb21pdHRlZCwgbm8gbW9kaWZpZXJzIGFyZSByZXF1aXJlZC5cbiAgICovXG4gIG1vZGlmaWVycz86IE1vZGlmaWVyW107XG5cbiAgLyoqXG4gICAqIFRoZSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzaG93biBuZXh0IHRvIHRoZSBjb250cm9sLlxuICAgKi9cbiAgcHVycG9zZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgZHJvcGRvd24gY29tbWFuZCBzaG93biBpbiBhIG1vZGFsJ3MgY29udHJvbCBzdHJpcCBhbmQgYm91bmQgdG8gYSBtb2RpZmllcitrZXkgc2hvcnRjdXQgdGhhdCBjeWNsZXNcbiAqIHRocm91Z2ggaXRzIG9wdGlvbnMuXG4gKlxuICogU3VwcG9ydGVkIGluIHtAbGluayBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5JbnN0cnVjdGlvbnN9IG1vZGUgb25seS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEcm9wRG93bkNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kQmFzZSB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZHJvcGRvd24gdmFsdWUgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG5ld2x5IHNlbGVjdGVkIHZhbHVlLlxuICAgKi9cbiAgb25DaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbmNlIHdpdGggdGhlIGNyZWF0ZWQgZHJvcGRvd24gY29tcG9uZW50LCB0byBpbml0aWFsaXplIGl0cyBvcHRpb25zIGFuZCBzdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIGRyb3Bkb3duQ29tcG9uZW50IC0gVGhlIGNyZWF0ZWQgZHJvcGRvd24gY29tcG9uZW50LlxuICAgKi9cbiAgb25Jbml0KGRyb3Bkb3duQ29tcG9uZW50OiBEcm9wZG93bkNvbXBvbmVudCk6IHZvaWQ7XG59XG5cbi8qKlxuICogQSBrZXlib2FyZCBjb21tYW5kIHNob3duIGluIGEgbW9kYWwncyBjb250cm9sIHN0cmlwIGFuZCBvcHRpb25hbGx5IGJvdW5kIHRvIGEgbW9kaWZpZXIra2V5IGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5Ym9hcmRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZEJhc2Uge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY29tbWFuZCByZWFkcyBhcyBPTi4gU3VwcGx5IGl0IGZvciBhIHRvZ2dsZSB3aG9zZSBzdGF0ZSBsaXZlcyBvdXRzaWRlIHRoZSBzdHJpcDsgb21pdCBpdFxuICAgKiBmb3IgYW4gYWN0aW9uLCB3aGljaCBkb2VzIHNvbWV0aGluZyBhbmQgaXMgZG9uZS4gQSB7QGxpbmsgQ2hlY2tib3hDb21tYW5kfSBuZWVkcyBubyBlcXVpdmFsZW50IFx1MjAxNCBpdHNcbiAgICogY2hlY2tib3ggZWxlbWVudCBpcyB0aGUgc3RhdGUuXG4gICAqXG4gICAqIFJlLXJlYWQgYnkge0BsaW5rIE1vZGFsQ29tbWFuZHMucmVmcmVzaH0uXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNvbW1hbmQgcmVhZHMgYXMgT04uXG4gICAqL1xuICBjaGVja0lzT24/KHRoaXM6IHZvaWQpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcG9pbnRlciByb3V0ZSBpbnRvIHRoZSBzYW1lIGhhbmRsZXIgdGhlIHNob3J0Y3V0IHJ1bnMuIFJlcXVpcmVkIGZvciB0aGUgY29tbWFuZCB0byByZW5kZXIgYVxuICAgKiBidXR0b24gaW4ge0BsaW5rIE1vZGFsQ29tbWFuZHNSZW5kZXJNb2RlLkJ1dHRvbnN9IG1vZGUgXHUyMDE0IG9uIGEgcGhvbmUgdGhlcmUgaXMgbm8gbW9kaWZpZXIga2V5IHRvXG4gICAqIHByZXNzLCBzbyB0aGlzIGlzIHRoZSBvbmx5IHdheSBpbi5cbiAgICpcbiAgICogQHBhcmFtICRldmVudCAtIFRoZSBjbGljayBldmVudCwgc28gYSBjb21tYW5kIHRoYXQgcGlja3Mgc29tZXRoaW5nIGhhcyBvbmUgdG8gaGFuZCBvbi5cbiAgICovXG4gIG9uQWN0aXZhdGU/KHRoaXM6IHZvaWQsICRldmVudDogTW91c2VFdmVudCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBoYW5kbGVyIGludm9rZWQgd2hlbiB0aGUgc2hvcnRjdXQgaXMgcHJlc3NlZC4gV2hlbiBvbWl0dGVkLCB0aGUgY29tbWFuZCBpcyBhIGhpbnQgb25seSBhbmQgbm9cbiAgICogc2NvcGUgaGFuZGxlciBpcyByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gJGV2ZW50IC0gVGhlIGtleWJvYXJkIGV2ZW50LlxuICAgKiBAcGFyYW0gY29udGV4dCAtIFRoZSBrZXltYXAgY29udGV4dC5cbiAgICogQHJldHVybnMgYGZhbHNlYCB0byBwcmV2ZW50IE9ic2lkaWFuJ3MgZGVmYXVsdCBoYW5kbGluZywgb3IgYHZvaWRgL2B0cnVlYCBvdGhlcndpc2UuXG4gICAqL1xuICBvbktleT8oJGV2ZW50OiBLZXlib2FyZEV2ZW50LCBjb250ZXh0OiBLZXltYXBDb250ZXh0KTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgTW9kYWxDb21tYW5kQnVpbGRlci5idWlsZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgd2F5IGVhY2ggY29udHJvbCBpcyByZW5kZXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIE1vZGFsQ29tbWFuZHNSZW5kZXJNb2RlLkluc3RydWN0aW9uc31cbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlck1vZGU/OiBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5kZXIgdGhlIGNvbnRyb2wgc3RyaXAgKGNoZWNrYm94ZXMsIGRyb3Bkb3ducywga2V5Ym9hcmQgaGludHMpIGFuZCByZWdpc3RlciB0aGVcbiAgICogb3B0aW9uLXRvZ2dsZSBrZXlib2FyZCBzaG9ydGN1dHMuIFdoZW4gYGZhbHNlYCwgbm8gY29udHJvbCBVSSBpcyBzaG93biBhbmQgdGhlIG9wdGlvbi10b2dnbGVcbiAgICogc2hvcnRjdXRzIGFyZSBub3QgcmVnaXN0ZXJlZDsgb25seSB0aGUgZXNzZW50aWFsIG5hdmlnYXRpb24ga2V5IGhhbmRsZXJzIHJlbWFpbiBhY3RpdmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0luc3RydWN0aW9ucz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIGhhbmRsZSByZXR1cm5lZCBieSB7QGxpbmsgTW9kYWxDb21tYW5kQnVpbGRlci5idWlsZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kYWxDb21tYW5kcyB7XG4gIC8qKlxuICAgKiBCcmluZ3MgZXZlcnkgcmVuZGVyZWQgY29udHJvbCdzIGRpc2FibGVkIGFuZCBwcmVzc2VkIHN0YXRlIHVwIHRvIGRhdGUsIGJ5IHJlLXJlYWRpbmdcbiAgICoge0BsaW5rIENvbW1hbmRCYXNlLmNoZWNrSXNBdmFpbGFibGV9IGFuZCB7QGxpbmsgS2V5Ym9hcmRDb21tYW5kLmNoZWNrSXNPbn0uXG4gICAqXG4gICAqIFRoZSBzdHJpcCBpcyBidWlsdCBvbmNlIGFuZCBvbmx5IHJlLXN0YXRlZCBhZnRlcndhcmRzLCBiZWNhdXNlIHJlYnVpbGRpbmcgaXQgd291bGQgcmVwbGFjZSBhbiBlbGVtZW50XG4gICAqIHRoZSBwb2ludGVyIG1heSBiZSBhYm91dCB0byBjbGljay5cbiAgICovXG4gIHJlZnJlc2goKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBIGJhcmUgaG9zdCBmb3IgYSBjb250cm9sIHN0cmlwOiB0aGUgZWxlbWVudCB0byByZW5kZXIgaW50bywgcGx1cyB0aGUgc2NvcGUgdG8gcmVnaXN0ZXIgc2hvcnRjdXRzIHdpdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kYWxDb21tYW5kc0hvc3Qge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdGhlIGNvbnRyb2wgc3RyaXAgaXMgYXBwZW5kZWQgdG8uXG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzY29wZSB0aGUgc2hvcnRjdXRzIGFyZSByZWdpc3RlcmVkIHdpdGguXG4gICAqL1xuICByZWFkb25seSBzY29wZTogU2NvcGU7XG59XG5cbi8qKlxuICogRXZlcnkgdGFyZ2V0IHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmJ1aWxkfSBhY2NlcHRzLlxuICovXG5leHBvcnQgdHlwZSBNb2RhbENvbW1hbmRzVGFyZ2V0ID0gTW9kYWwgfCBNb2RhbENvbW1hbmRzSG9zdCB8IFN1Z2dlc3RNb2RhbDx1bmtub3duPjtcblxuLyoqXG4gKiBPbmUgYWNjdW11bGF0ZWQgY29tbWFuZCwgcmVkdWNlZCB0byB0aGUgaGFuZGZ1bCBvZiB0aGluZ3MgYm90aCByZW5kZXJlcnMgbmVlZC5cbiAqXG4gKiBPcHRpb25hbCBjb2xsYWJvcmF0b3JzIGFyZSBgbnVsbCB8IFhgIHJlcXVpcmVkIGZpZWxkcyByYXRoZXIgdGhhbiBgP2AsIHNvIGV2ZXJ5IGNvbnN0cnVjdGlvbiBzaXRlIGhhcyB0b1xuICogc2F5IHdoaWNoIG9uZXMgaXQgaGFzLlxuICovXG4vKipcbiAqIE9uZSBjb250cm9sIHJlbmRlcmVkIGFzIGEgQlVUVE9OLlxuICpcbiAqIEl0IHJlcG9ydHMgaXRzIG93biBwcmVzc2VkIHN0YXRlLCBiZWNhdXNlIG9ubHkgdGhlIGJ1dHRvbiByZW5kZXJlciBoYXMgYW55d2hlcmUgdG8gc2hvdyBvbmUuXG4gKi9cbmludGVyZmFjZSBCdXR0b25Db250cm9sIHtcbiAgY2hlY2tJc09uKHRoaXM6IHZvaWQpOiBib29sZWFuO1xuICBzZXREaXNhYmxlZCh0aGlzOiB2b2lkLCBpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIENvbW1hbmRFbnRyeSB7XG4gIHJlYWRvbmx5IGNoZWNrSXNBdmFpbGFibGU6ICgodGhpczogdm9pZCkgPT4gYm9vbGVhbikgfCBudWxsO1xuICByZWFkb25seSBjb21tYW5kVGV4dDogc3RyaW5nO1xuICByZWFkb25seSBpbml0QnV0dG9uOiAoKGJ1dHRvbkVsOiBIVE1MQnV0dG9uRWxlbWVudCwgc2NvcGU6IFNjb3BlKSA9PiBCdXR0b25Db250cm9sKSB8IG51bGw7XG4gIHJlYWRvbmx5IGluaXRJbnN0cnVjdGlvbjogKChwdXJwb3NlRWw6IEhUTUxTcGFuRWxlbWVudCwgc2NvcGU6IFNjb3BlKSA9PiBJbnN0cnVjdGlvbkNvbnRyb2wpIHwgbnVsbDtcbiAgcmVhZG9ubHkgaXNEcm9wRG93bjogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcHVycG9zZTogc3RyaW5nO1xuICByZWFkb25seSByZWdpc3RlclNjb3BlOiAoKHNjb3BlOiBTY29wZSkgPT4gdm9pZCkgfCBudWxsO1xufVxuXG4vKipcbiAqIE9uZSBjb250cm9sIHJlbmRlcmVkIGludG8gYW4gSU5TVFJVQ1RJT04gYmFyLlxuICpcbiAqIFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBwcmVzc2VkIHN0YXRlIGhlcmU6IHRoZSBjb250cm9sIFx1MjAxNCBhIGNoZWNrYm94LCBhIGRyb3Bkb3duIFx1MjAxNCBzaG93cyBpdHMgb3duLFxuICogc28gYSBzZWNvbmQgY29weSB3b3VsZCBvbmx5IGJlIGEgc2Vjb25kIHRoaW5nIHRvIGtlZXAgaW4gc3luYy5cbiAqL1xuaW50ZXJmYWNlIEluc3RydWN0aW9uQ29udHJvbCB7XG4gIHNldERpc2FibGVkKHRoaXM6IHZvaWQsIGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSW5zdHJ1Y3Rpb25FeCBleHRlbmRzIEluc3RydWN0aW9uIHtcbiAgcmVhZG9ubHkgZW50cnk6IENvbW1hbmRFbnRyeTtcbn1cblxuLyoqXG4gKiBSZS1zdGF0ZXMgb25lIHJlbmRlcmVkIGNvbnRyb2wsIGFscmVhZHkgYm91bmQgdG8gaXRzIG93biBlbGVtZW50cy5cbiAqL1xudHlwZSBSZWZyZXNoQ29udHJvbCA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xuXG5jb25zdCBOT09QX01PREFMX0NPTU1BTkRTOiBNb2RhbENvbW1hbmRzID0ge1xuICByZWZyZXNoOiAoKTogdm9pZCA9PiB7XG4gICAgLy8gTm90aGluZyB3YXMgcmVuZGVyZWQsIHNvIHRoZXJlIGlzIG5vIHN0YXRlIHRvIHJlLXN0YXRlLlxuICB9XG59O1xuXG4vKipcbiAqIEJ1aWxkcyBhIG1vZGFsJ3MgY29udHJvbCBzdHJpcCBmcm9tIGtleWJvYXJkIGNvbW1hbmRzLCBpbnRlcmFjdGl2ZSBjaGVja2JveGVzLCBhbmQgZHJvcGRvd25zLCB0aGVuXG4gKiBhcHBsaWVzIHRoZW0gdG8gYSBtb2RhbCB2aWEge0BsaW5rIE1vZGFsQ29tbWFuZEJ1aWxkZXIuYnVpbGR9LlxuICovXG5leHBvcnQgY2xhc3MgTW9kYWxDb21tYW5kQnVpbGRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW50cmllczogQ29tbWFuZEVudHJ5W10gPSBbXTtcblxuICAvKipcbiAgICogQWRkcyBhbiBpbnRlcmFjdGl2ZSBjaGVja2JveCB0byB0aGUgY29udHJvbCBzdHJpcCwgYm91bmQgdG8gYSBtb2RpZmllcitrZXkgc2hvcnRjdXQgdGhhdCB0b2dnbGVzIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjaGVja2JveCBjb21tYW5kIHRvIGFkZC5cbiAgICogQHJldHVybnMgVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgcHVibGljIGFkZENoZWNrYm94KGNvbW1hbmQ6IENoZWNrYm94Q29tbWFuZCk6IHRoaXMge1xuICAgIHRoaXMuZW50cmllcy5wdXNoKHtcbiAgICAgIGNoZWNrSXNBdmFpbGFibGU6IGNvbW1hbmQuY2hlY2tJc0F2YWlsYWJsZSA/PyBudWxsLFxuICAgICAgY29tbWFuZFRleHQ6IHRoaXMuYnVpbGRDb21tYW5kVGV4dChjb21tYW5kKSxcbiAgICAgIGluaXRCdXR0b246IChidXR0b25FbDogSFRNTEJ1dHRvbkVsZW1lbnQsIHNjb3BlOiBTY29wZSk6IEJ1dHRvbkNvbnRyb2wgPT4ge1xuICAgICAgICAvLyBDcmVhdGVkIGJ1dCBuZXZlciBhcHBlbmRlZDogdGhlIGNoZWNrYm94IGhvbGRzIHRoZSBzdGF0ZSBhbmQgdGhlIGJ1dHRvbiBpcyBhIHZpZXcgb2YgaXQsIHNvXG4gICAgICAgIC8vIGBvbkluaXRgIC8gYG9uQ2hhbmdlYCBtZWFuIGV4YWN0bHkgdGhlIHNhbWUgdGhpbmcgaW4gYm90aCByZW5kZXIgbW9kZXMuXG4gICAgICAgIGNvbnN0IGNoZWNrYm94RWwgPSBjcmVhdGVFbCgnaW5wdXQnLCB7IHR5cGU6ICdjaGVja2JveCcgfSk7XG4gICAgICAgIGluaXRDaGVja2JveChjaGVja2JveEVsLCBzY29wZSk7XG4gICAgICAgIGJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgIHRvZ2dsZUNoZWNrYm94KGNoZWNrYm94RWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjaGVja0lzT246ICgpOiBib29sZWFuID0+IGNoZWNrYm94RWwuY2hlY2tlZCxcbiAgICAgICAgICBzZXREaXNhYmxlZDogKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGNoZWNrYm94RWwuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgICAgICAgICAgYnV0dG9uRWwuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBpbml0SW5zdHJ1Y3Rpb246IChwdXJwb3NlRWw6IEhUTUxTcGFuRWxlbWVudCwgc2NvcGU6IFNjb3BlKTogSW5zdHJ1Y3Rpb25Db250cm9sID0+IHtcbiAgICAgICAgY29uc3QgY2hlY2tib3hFbCA9IHB1cnBvc2VFbC5jcmVhdGVFbCgnaW5wdXQnLCB7IHR5cGU6ICdjaGVja2JveCcgfSk7XG4gICAgICAgIC8vIFRoZSBnYXAgZ29lcyBvbiB0aGUgY29udHJvbCwgbm90IG9uIHRoZSBzdHJpcCwgc28gaXQgbGFuZHMgb24gQk9USCByZW5kZXIgcGF0aHM6IGFcbiAgICAgICAgLy8gYFN1Z2dlc3RNb2RhbGAncyBuYXRpdmUgYmFyIGhvc3RzIHRoZSBzYW1lIGNoZWNrYm94LCBhbmQgT0RVIG5ldmVyIHRvdWNoZXMgdGhhdCBiYXIncyBlbGVtZW50LlxuICAgICAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGNoZWNrYm94RWwsIENzc0NsYXNzLk1vZGFsQ29tbWFuZENvbnRyb2wpO1xuICAgICAgICByZXR1cm4gaW5pdENoZWNrYm94KGNoZWNrYm94RWwsIHNjb3BlKTtcbiAgICAgIH0sXG4gICAgICBpc0Ryb3BEb3duOiBmYWxzZSxcbiAgICAgIHB1cnBvc2U6IGNvbW1hbmQucHVycG9zZSxcbiAgICAgIHJlZ2lzdGVyU2NvcGU6IG51bGxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcblxuICAgIGZ1bmN0aW9uIGluaXRDaGVja2JveChjaGVja2JveEVsOiBIVE1MSW5wdXRFbGVtZW50LCBzY29wZTogU2NvcGUpOiBJbnN0cnVjdGlvbkNvbnRyb2wge1xuICAgICAgY29tbWFuZC5vbkluaXQoY2hlY2tib3hFbCk7XG4gICAgICBjaGVja2JveEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgY29tbWFuZC5vbkNoYW5nZShjaGVja2JveEVsLmNoZWNrZWQpO1xuICAgICAgfSk7XG5cbiAgICAgIHNjb3BlLnJlZ2lzdGVyKGNvbW1hbmQubW9kaWZpZXJzID8/IFtdLCBjb21tYW5kLmtleSwgKCkgPT4ge1xuICAgICAgICB0b2dnbGVDaGVja2JveChjaGVja2JveEVsKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXREaXNhYmxlZDogKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgICAgICBjaGVja2JveEVsLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGRyb3Bkb3duIHRvIHRoZSBjb250cm9sIHN0cmlwLCBib3VuZCB0byBhIG1vZGlmaWVyK2tleSBzaG9ydGN1dCB0aGF0IGN5Y2xlcyB0aHJvdWdoIGl0c1xuICAgKiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBkcm9wZG93biBjb21tYW5kIHRvIGFkZC5cbiAgICogQHJldHVybnMgVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgcHVibGljIGFkZERyb3BEb3duKGNvbW1hbmQ6IERyb3BEb3duQ29tbWFuZCk6IHRoaXMge1xuICAgIHRoaXMuZW50cmllcy5wdXNoKHtcbiAgICAgIGNoZWNrSXNBdmFpbGFibGU6IGNvbW1hbmQuY2hlY2tJc0F2YWlsYWJsZSA/PyBudWxsLFxuICAgICAgY29tbWFuZFRleHQ6IHRoaXMuYnVpbGRDb21tYW5kVGV4dChjb21tYW5kKSxcbiAgICAgIGluaXRCdXR0b246IG51bGwsXG4gICAgICBpbml0SW5zdHJ1Y3Rpb246IChwdXJwb3NlRWw6IEhUTUxTcGFuRWxlbWVudCwgc2NvcGU6IFNjb3BlKTogSW5zdHJ1Y3Rpb25Db250cm9sID0+IHtcbiAgICAgICAgY29uc3QgZHJvcGRvd25Db21wb25lbnQgPSBuZXcgRHJvcGRvd25Db21wb25lbnQocHVycG9zZUVsKTtcbiAgICAgICAgLy8gVGhlIHNhbWUgZ2FwIHRoZSBjaGVja2JveCBnZXRzLCBzbyB0aGUgdHdvIGNvbnRyb2xzIGFyZSBzZXBhcmF0ZWQgZnJvbSB0aGVpciBsYWJlbCB0aGUgc2FtZVxuICAgICAgICAvLyBXYXkgXHUyMDE0IGEgcmVhbCBydWxlIHJhdGhlciB0aGFuIHRoZSBsaXRlcmFsIHNwYWNlIHRoaXMgdXNlZCB0byBhcHBlbmQuXG4gICAgICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoZHJvcGRvd25Db21wb25lbnQuc2VsZWN0RWwsIENzc0NsYXNzLk1vZGFsQ29tbWFuZENvbnRyb2wpO1xuICAgICAgICBjb21tYW5kLm9uSW5pdChkcm9wZG93bkNvbXBvbmVudCk7XG4gICAgICAgIGRyb3Bkb3duQ29tcG9uZW50Lm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGNvbW1hbmQub25DaGFuZ2UodmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gZGVmZW5zaXZlID8/IG9uIG9wdGlvbmFsIG1vZGlmaWVycy4gKi9cbiAgICAgICAgc2NvcGUucmVnaXN0ZXIoY29tbWFuZC5tb2RpZmllcnMgPz8gW10sIGNvbW1hbmQua2V5LCAoKSA9PiB7XG4gICAgICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICBpZiAoZHJvcGRvd25Db21wb25lbnQuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc2VsZWN0RWwgPSBkcm9wZG93bkNvbXBvbmVudC5zZWxlY3RFbDtcbiAgICAgICAgICBzZWxlY3RFbC5zZWxlY3RlZEluZGV4ID0gKHNlbGVjdEVsLnNlbGVjdGVkSW5kZXggKyAxKSAlIHNlbGVjdEVsLm9wdGlvbnMubGVuZ3RoO1xuICAgICAgICAgIHNlbGVjdEVsLnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNldERpc2FibGVkOiAoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICAgICAgZHJvcGRvd25Db21wb25lbnQuc2V0RGlzYWJsZWQoaXNEaXNhYmxlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGlzRHJvcERvd246IHRydWUsXG4gICAgICBwdXJwb3NlOiBjb21tYW5kLnB1cnBvc2UsXG4gICAgICByZWdpc3RlclNjb3BlOiBudWxsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGtleWJvYXJkIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2wgc3RyaXAuIFdoZW4ge0BsaW5rIEtleWJvYXJkQ29tbWFuZC5vbktleX0gaXMgcHJvdmlkZWQsIGl0c1xuICAgKiBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbW9kYWwgc2NvcGU7IG90aGVyd2lzZSB0aGUgY29tbWFuZCBpcyBhIGhpbnQgb25seS5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmQgLSBUaGUga2V5Ym9hcmQgY29tbWFuZCB0byBhZGQuXG4gICAqIEByZXR1cm5zIFRoZSBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHB1YmxpYyBhZGRLZXlib2FyZENvbW1hbmQoY29tbWFuZDogS2V5Ym9hcmRDb21tYW5kKTogdGhpcyB7XG4gICAgY29uc3QgY2hlY2tJc09uID0gY29tbWFuZC5jaGVja0lzT24gPz8gKCgpOiBib29sZWFuID0+IGZhbHNlKTtcbiAgICBjb25zdCBvbkFjdGl2YXRlID0gY29tbWFuZC5vbkFjdGl2YXRlID8/IG51bGw7XG4gICAgY29uc3Qgb25LZXkgPSBjb21tYW5kLm9uS2V5Py5iaW5kKGNvbW1hbmQpID8/IG51bGw7XG5cbiAgICB0aGlzLmVudHJpZXMucHVzaCh7XG4gICAgICBjaGVja0lzQXZhaWxhYmxlOiBjb21tYW5kLmNoZWNrSXNBdmFpbGFibGUgPz8gbnVsbCxcbiAgICAgIGNvbW1hbmRUZXh0OiB0aGlzLmJ1aWxkQ29tbWFuZFRleHQoY29tbWFuZCksXG4gICAgICBpbml0QnV0dG9uOiBvbkFjdGl2YXRlXG4gICAgICAgIC8vIE5vIGRpc2FibGVkIGd1YXJkIG9uIHRoZSBsaXN0ZW5lcjogYSBkaXNhYmxlZCBidXR0b24gZmlyZXMgbm8gY2xpY2sgYXQgYWxsLCBzbyBgc2V0RGlzYWJsZWRgXG4gICAgICAgIC8vIEJlbG93IGlzIHRoZSB3aG9sZSBnYXRlLlxuICAgICAgICA/IChidXR0b25FbDogSFRNTEJ1dHRvbkVsZW1lbnQpOiBCdXR0b25Db250cm9sID0+IHtcbiAgICAgICAgICBidXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgkZXZlbnQpID0+IHtcbiAgICAgICAgICAgIG9uQWN0aXZhdGUoJGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2hlY2tJc09uLFxuICAgICAgICAgICAgc2V0RGlzYWJsZWQ6IChpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgIGJ1dHRvbkVsLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIDogbnVsbCxcbiAgICAgIGluaXRJbnN0cnVjdGlvbjogbnVsbCxcbiAgICAgIGlzRHJvcERvd246IGZhbHNlLFxuICAgICAgcHVycG9zZTogY29tbWFuZC5wdXJwb3NlLFxuICAgICAgcmVnaXN0ZXJTY29wZTogb25LZXlcbiAgICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIGRlZmVuc2l2ZSA/PyBvbiBvcHRpb25hbCBtb2RpZmllcnMuICovXG4gICAgICAgID8gKHNjb3BlOiBTY29wZSk6IHZvaWQgPT4ge1xuICAgICAgICAgIHNjb3BlLnJlZ2lzdGVyKGNvbW1hbmQubW9kaWZpZXJzID8/IFtdLCBjb21tYW5kLmtleSwgb25LZXkpO1xuICAgICAgICB9XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIDogbnVsbFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGFjY3VtdWxhdGVkIGNvbW1hbmRzIHRvIGEgbW9kYWwuIEFsd2F5cyByZWdpc3RlcnMgdGhlIGVzc2VudGlhbCBuYXZpZ2F0aW9uL2FjdGlvbiBrZXlcbiAgICogaGFuZGxlcnM7IG9ubHkgcmVuZGVycyB0aGUgY29udHJvbCBzdHJpcCBhbmQgcmVnaXN0ZXJzIHRoZSBvcHRpb24tdG9nZ2xlIHNob3J0Y3V0cyB3aGVuXG4gICAqIHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyQnVpbGRPcHRpb25zLnNob3VsZFNob3dJbnN0cnVjdGlvbnN9IGlzIGB0cnVlYC5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldCAtIFRoZSBtb2RhbCwgb3IgdGhlIGJhcmUgZWxlbWVudCArIHNjb3BlLCB0byBhcHBseSB0aGUgY29tbWFuZHMgdG8uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGJ1aWxkIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgaGFuZGxlIHdob3NlIHtAbGluayBNb2RhbENvbW1hbmRzLnJlZnJlc2h9IHJlLXN0YXRlcyBldmVyeSByZW5kZXJlZCBjb250cm9sLlxuICAgKi9cbiAgcHVibGljIGJ1aWxkKHRhcmdldDogTW9kYWxDb21tYW5kc1RhcmdldCwgb3B0aW9uczogTW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucyA9IHt9KTogTW9kYWxDb21tYW5kcyB7XG4gICAgY29uc3Qge1xuICAgICAgcmVuZGVyTW9kZSA9IE1vZGFsQ29tbWFuZHNSZW5kZXJNb2RlLkluc3RydWN0aW9ucyxcbiAgICAgIHNob3VsZFNob3dJbnN0cnVjdGlvbnMgPSB0cnVlXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBzY29wZSA9IHRhcmdldC5zY29wZTtcblxuICAgIC8vIEVzc2VudGlhbCBuYXZpZ2F0aW9uL2FjdGlvbiBrZXkgaGFuZGxlcnMgbXVzdCBzdGF5IGFjdGl2ZSBldmVuIHdoZW4gdGhlIGNvbnRyb2wgc3RyaXAgaXMgaGlkZGVuLlxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5lbnRyaWVzKSB7XG4gICAgICBlbnRyeS5yZWdpc3RlclNjb3BlPy4oc2NvcGUpO1xuICAgIH1cblxuICAgIGlmICghc2hvdWxkU2hvd0luc3RydWN0aW9ucykge1xuICAgICAgcmV0dXJuIE5PT1BfTU9EQUxfQ09NTUFORFM7XG4gICAgfVxuXG4gICAgLy8gRWFjaCByZW5kZXJlciBoYW5kcyBiYWNrIG9uZSBjbG9zdXJlIHBlciBjb250cm9sIGl0IGFjdHVhbGx5IGRyZXcsIGFscmVhZHkgYm91bmQgdG8gdGhhdCBjb250cm9sJ3NcbiAgICAvLyBFbGVtZW50cyBcdTIwMTQgc28gYHJlZnJlc2hgIG5ldmVyIGhhcyB0byBrbm93IHdoaWNoIG9mIHRoZSB0d28gc2hhcGVzIGl0IGlzIHJlLXN0YXRpbmcuXG4gICAgY29uc3QgcmVmcmVzaGVycyA9IHJlbmRlck1vZGUgPT09IE1vZGFsQ29tbWFuZHNSZW5kZXJNb2RlLkJ1dHRvbnNcbiAgICAgID8gdGhpcy5yZW5kZXJCdXR0b25zKHRhcmdldCwgc2NvcGUpXG4gICAgICA6IHRoaXMucmVuZGVySW5zdHJ1Y3Rpb25zKHRhcmdldCwgc2NvcGUpO1xuXG4gICAgY29uc3QgbW9kYWxDb21tYW5kczogTW9kYWxDb21tYW5kcyA9IHtcbiAgICAgIHJlZnJlc2g6ICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCByZWZyZXNoQ29udHJvbCBvZiByZWZyZXNoZXJzKSB7XG4gICAgICAgICAgcmVmcmVzaENvbnRyb2woKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgbW9kYWxDb21tYW5kcy5yZWZyZXNoKCk7XG4gICAgcmV0dXJuIG1vZGFsQ29tbWFuZHM7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQ29tbWFuZFRleHQoY29tbWFuZDogQ29tbWFuZEJhc2UpOiBzdHJpbmcge1xuICAgIGxldCBjb21tYW5kVGV4dCA9IEtFWVNfTUFQLmdldChjb21tYW5kLmtleSkgPz8gY29tbWFuZC5rZXk7XG5cbiAgICBmb3IgKGNvbnN0IG1vZGlmaWVyIG9mIGNvbW1hbmQubW9kaWZpZXJzID8/IFtdKSB7XG4gICAgICBjb21tYW5kVGV4dCA9IGAke3RoaXMuZ2V0TW9kaWZpZXJTdHJpbmcobW9kaWZpZXIpfSAke2NvbW1hbmRUZXh0fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbW1hbmRUZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNb2RpZmllclN0cmluZyhtb2RpZmllcjogTW9kaWZpZXIpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAobW9kaWZpZXIpIHtcbiAgICAgIGNhc2UgJ0FsdCc6IHtcbiAgICAgICAgcmV0dXJuICdhbHQnO1xuICAgICAgfVxuICAgICAgY2FzZSAnQ3RybCc6IHtcbiAgICAgICAgcmV0dXJuICdjdHJsJztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ01ldGEnOiB7XG4gICAgICAgIHJldHVybiBQbGF0Zm9ybS5pc01hY09TID8gJ2NtZCcgOiAnd2luJztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ01vZCc6IHtcbiAgICAgICAgcmV0dXJuIFBsYXRmb3JtLmlzTWFjT1MgPyAnY21kJyA6ICdjdHJsJztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1NoaWZ0Jzoge1xuICAgICAgICByZXR1cm4gJ3NoaWZ0JztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIG1vZGlmaWVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgZWxlbWVudCBhIHNlbGYtY3JlYXRlZCBzdHJpcCBpcyBhcHBlbmRlZCB0by5cbiAgICpcbiAgICogQSB7QGxpbmsgTW9kYWx9IGNhcnJpZXMgYm90aCBgbW9kYWxFbGAgYW5kIGEgYGNvbnRhaW5lckVsYCB0aGF0IGlzIHRoZSBPVVRFUiBgLm1vZGFsLWNvbnRhaW5lcmAsIHNvXG4gICAqIGBtb2RhbEVsYCBoYXMgdG8gd2luIFx1MjAxNCBvdGhlcndpc2UgdGhlIHN0cmlwIGxhbmRzIG91dHNpZGUgdGhlIG1vZGFsIGZyYW1lLiBEaXNjcmltaW5hdGVkIHdpdGggYGluYFxuICAgKiByYXRoZXIgdGhhbiBhIHByb3BlcnR5IHJlYWQsIGJlY2F1c2UgdGVzdHMgaGFuZCBgYnVpbGRgIGEgYHN0cmljdFByb3h5YCBtb2NrIHdob3NlIGBnZXRgIHRyYXAgdGhyb3dzXG4gICAqIG9uIHVubW9ja2VkIG1lbWJlcnMuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgYnVpbGQgdGFyZ2V0LlxuICAgKiBAcmV0dXJucyBUaGUgZWxlbWVudCB0byBhcHBlbmQgdGhlIHN0cmlwIHRvLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTdHJpcENvbnRhaW5lckVsKHRhcmdldDogTW9kYWxDb21tYW5kc1RhcmdldCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gJ21vZGFsRWwnIGluIHRhcmdldCA/IHRhcmdldC5tb2RhbEVsIDogdGFyZ2V0LmNvbnRhaW5lckVsO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJCdXR0b25zKHRhcmdldDogTW9kYWxDb21tYW5kc1RhcmdldCwgc2NvcGU6IFNjb3BlKTogUmVmcmVzaENvbnRyb2xbXSB7XG4gICAgY29uc3Qgc3RyaXBFbCA9IHRoaXMuZ2V0U3RyaXBDb250YWluZXJFbCh0YXJnZXQpLmNyZWF0ZURpdigpO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoc3RyaXBFbCwgQ3NzQ2xhc3MuTW9kYWxDb21tYW5kcyk7XG5cbiAgICBjb25zdCByZWZyZXNoZXJzOiBSZWZyZXNoQ29udHJvbFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcykge1xuICAgICAgaWYgKGVudHJ5LmlzRHJvcERvd24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVuZGVyIGRyb3Bkb3duIGNvbW1hbmQgXCIke2VudHJ5LnB1cnBvc2V9XCIgYXMgYSBidXR0b246IGEgY29udHJvbCB0aGF0IGN5Y2xlcyBoYXMgbm8gYnV0dG9uIGZvcm0uYCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZW50cnkuaW5pdEJ1dHRvbikge1xuICAgICAgICAvLyBIaW50LW9ubHkgYW5kIGtleWJvYXJkLW9ubHkgY29tbWFuZHMgaGF2ZSBubyBwb2ludGVyIHJvdXRlLCBhbmQgYSBidXR0b24gbm9ib2R5IGNhbiBwcmVzcyBpc1xuICAgICAgICAvLyBXb3JzZSB0aGFuIG5vIGJ1dHRvbi4gVGhlaXIgc2NvcGUgaGFuZGxlcnMgYXJlIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvbkVsID0gc3RyaXBFbC5jcmVhdGVFbCgnYnV0dG9uJywgeyB0eXBlOiAnYnV0dG9uJyB9KTtcbiAgICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoYnV0dG9uRWwsIENzc0NsYXNzLk1vZGFsQ29tbWFuZCk7XG4gICAgICBidXR0b25FbC5jcmVhdGVTcGFuKHsgdGV4dDogZW50cnkucHVycG9zZSB9KTtcblxuICAgICAgLy8gVGhlIGhvdGtleSBpcyBzaG93biBvbmx5IHdoZXJlIG9uZSBjYW4gYmUgcHJlc3NlZC4gT24gYSBwaG9uZSB0aGVyZSBpcyBubyBtb2RpZmllciBrZXkgdG8gb2ZmZXIsXG4gICAgICAvLyBBbmQgdGhlIGJ1dHRvbiBJUyB0aGUgb25seSB3YXkgaW4gXHUyMDE0IHdoaWNoIGlzIHdoeSB0aGUgc3RyaXAgZXhpc3RzLlxuICAgICAgaWYgKCFQbGF0Zm9ybS5pc01vYmlsZSkge1xuICAgICAgICBjb25zdCBob3RrZXlFbCA9IGJ1dHRvbkVsLmNyZWF0ZVNwYW4oeyB0ZXh0OiBlbnRyeS5jb21tYW5kVGV4dCB9KTtcbiAgICAgICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhob3RrZXlFbCwgQ3NzQ2xhc3MuTW9kYWxDb21tYW5kSG90a2V5KTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGlucHV0IGtlZXBzIGZvY3VzOiBhIG1vZGFsIHRoYXQgZmlsdGVycyBhcyB5b3UgdHlwZSB3b3VsZCBlbmQgaXRzIHNlYXJjaCBtaWQtd29yZCBpZiBhIGNsaWNrXG4gICAgICAvLyBTdG9sZSBmb2N1cy5cbiAgICAgIGJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsICgkZXZlbnQpID0+IHtcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYnV0dG9uQ29udHJvbCA9IGVudHJ5LmluaXRCdXR0b24oYnV0dG9uRWwsIHNjb3BlKTtcbiAgICAgIGNvbnN0IGNoZWNrSXNBdmFpbGFibGUgPSBlbnRyeS5jaGVja0lzQXZhaWxhYmxlO1xuICAgICAgcmVmcmVzaGVycy5wdXNoKCgpID0+IHtcbiAgICAgICAgaWYgKGNoZWNrSXNBdmFpbGFibGUpIHtcbiAgICAgICAgICBidXR0b25Db250cm9sLnNldERpc2FibGVkKCFjaGVja0lzQXZhaWxhYmxlKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzT24gPSBidXR0b25Db250cm9sLmNoZWNrSXNPbigpO1xuICAgICAgICBidXR0b25FbC50b2dnbGVDbGFzcyhDc3NDbGFzcy5Jc0FjdGl2ZSwgaXNPbik7XG4gICAgICAgIGJ1dHRvbkVsLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgU3RyaW5nKGlzT24pKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZWZyZXNoZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJJbnN0cnVjdGlvbnModGFyZ2V0OiBNb2RhbENvbW1hbmRzVGFyZ2V0LCBzY29wZTogU2NvcGUpOiBSZWZyZXNoQ29udHJvbFtdIHtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnM6IEluc3RydWN0aW9uRXhbXSA9IHRoaXMuZW50cmllcy5tYXAoKGVudHJ5KSA9PiAoe1xuICAgICAgY29tbWFuZDogZW50cnkuY29tbWFuZFRleHQsXG4gICAgICBlbnRyeSxcbiAgICAgIHB1cnBvc2U6IGVudHJ5LnB1cnBvc2VcbiAgICB9KSk7XG5cbiAgICBjb25zdCBwdXJwb3NlRWxzID0gJ3NldEluc3RydWN0aW9ucycgaW4gdGFyZ2V0XG4gICAgICA/IHRoaXMucmVuZGVyTmF0aXZlSW5zdHJ1Y3Rpb25zKHRhcmdldCwgaW5zdHJ1Y3Rpb25zKVxuICAgICAgOiB0aGlzLnJlbmRlck93bkluc3RydWN0aW9ucyh0aGlzLmdldFN0cmlwQ29udGFpbmVyRWwodGFyZ2V0KSwgaW5zdHJ1Y3Rpb25zKTtcblxuICAgIGNvbnN0IHJlZnJlc2hlcnM6IFJlZnJlc2hDb250cm9sW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgaW5zdHJ1Y3Rpb25dIG9mIGluc3RydWN0aW9ucy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHB1cnBvc2VFbCA9IHB1cnBvc2VFbHNbaW5kZXhdO1xuICAgICAgLy8gQSBob3N0IG1heSByZW5kZXIgZmV3ZXIgcHVycG9zZSBlbGVtZW50cyB0aGFuIHRoZXJlIGFyZSBpbnN0cnVjdGlvbnM7IHNraXAgcmF0aGVyIHRoYW4gdGhyb3cuXG4gICAgICBpZiAoIXB1cnBvc2VFbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25Db250cm9sID0gaW5zdHJ1Y3Rpb24uZW50cnkuaW5pdEluc3RydWN0aW9uPy4ocHVycG9zZUVsLCBzY29wZSk7XG4gICAgICBjb25zdCBjaGVja0lzQXZhaWxhYmxlID0gaW5zdHJ1Y3Rpb24uZW50cnkuY2hlY2tJc0F2YWlsYWJsZTtcbiAgICAgIC8vIEEgY29udHJvbCBzaG93cyBpdHMgb3duIHByZXNzZWQgc3RhdGUgaGVyZSwgc28gYXZhaWxhYmlsaXR5IGlzIHRoZSBvbmx5IHRoaW5nIGxlZnQgdG8gcmUtc3RhdGUgXHUyMDE0XG4gICAgICAvLyBBbmQgYSBjb21tYW5kIHRoYXQgZGVjbGFyZXMgbm9uZSBuZWVkcyBubyByZWZyZXNoZXIgYXQgYWxsLlxuICAgICAgaWYgKGluc3RydWN0aW9uQ29udHJvbCAmJiBjaGVja0lzQXZhaWxhYmxlKSB7XG4gICAgICAgIHJlZnJlc2hlcnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgaW5zdHJ1Y3Rpb25Db250cm9sLnNldERpc2FibGVkKCFjaGVja0lzQXZhaWxhYmxlKCkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVmcmVzaGVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRocm91Z2ggT2JzaWRpYW4ncyBvd24gaW5zdHJ1Y3Rpb24gYmFyLCB0aGUgd2F5IGV2ZXJ5IHtAbGluayBTdWdnZXN0TW9kYWx9IGNvbnN1bWVyIGhhcyBhbHdheXNcbiAgICogaGFkIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gbW9kYWwgLSBUaGUgc3VnZ2VzdCBtb2RhbC5cbiAgICogQHBhcmFtIGluc3RydWN0aW9ucyAtIFRoZSBpbnN0cnVjdGlvbnMgdG8gcmVuZGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcHVycG9zZSBlbGVtZW50IG9mIGVhY2ggcmVuZGVyZWQgaW5zdHJ1Y3Rpb24uXG4gICAqL1xuICBwcml2YXRlIHJlbmRlck5hdGl2ZUluc3RydWN0aW9ucyhtb2RhbDogU3VnZ2VzdE1vZGFsPHVua25vd24+LCBpbnN0cnVjdGlvbnM6IEluc3RydWN0aW9uRXhbXSk6IEhUTUxTcGFuRWxlbWVudFtdIHtcbiAgICBtb2RhbC5zZXRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICByZXR1cm4gWy4uLm1vZGFsLmluc3RydWN0aW9uc0VsLmZpbmRBbGwoJy5wcm9tcHQtaW5zdHJ1Y3Rpb24gPiBzcGFuOm50aC1jaGlsZCgyKScpXSBhcyBIVE1MU3BhbkVsZW1lbnRbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGFuIGluc3RydWN0aW9uIGJhciBvZiB0aGUgYnVpbGRlcidzIG93biwgZm9yIGEgaG9zdCB0aGF0IGhhcyBub25lLlxuICAgKlxuICAgKiBUaGUgbWFya3VwIG1pcnJvcnMgd2hhdCBgc2V0SW5zdHJ1Y3Rpb25zYCBwcm9kdWNlcyBcdTIwMTQgaW5jbHVkaW5nXG4gICAqIHtAbGluayBDc3NDbGFzcy5Qcm9tcHRJbnN0cnVjdGlvbkNvbW1hbmR9IG9uIHRoZSBrZXkgaGludCwgd2hpY2ggaXMgbm90IGRlY29yYXRpb246IE9ic2lkaWFuJ3MgcnVsZVxuICAgKiBmb3IgdGhhdCBjbGFzcyBpcyB3aGF0IHN1cHBsaWVzIHRoZSBoaW50J3MgYm9sZCB3ZWlnaHQgYW5kIHRoZSBgbWFyZ2luLWlubGluZS1lbmRgIHNlcGFyYXRpbmcgaXRcbiAgICogZnJvbSB0aGUgcHVycG9zZSB0ZXh0LiBFdmVyeSBjbGFzcyBoZXJlIGlzIHVuc2NvcGVkIGluIHRoZSBhcHAncyBzdHlsZXNoZWV0LCBzbyBhbGwgb2YgaXQgcmVhY2hlcyBhXG4gICAqIHBsYWluIHtAbGluayBNb2RhbH0gYXMgcmVhZGlseSBhcyBpdCByZWFjaGVzIHRoZSBxdWljayBzd2l0Y2hlci5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBiYXIgdG8uXG4gICAqIEBwYXJhbSBpbnN0cnVjdGlvbnMgLSBUaGUgaW5zdHJ1Y3Rpb25zIHRvIHJlbmRlci5cbiAgICogQHJldHVybnMgVGhlIHB1cnBvc2UgZWxlbWVudCBvZiBlYWNoIHJlbmRlcmVkIGluc3RydWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJPd25JbnN0cnVjdGlvbnMoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50LCBpbnN0cnVjdGlvbnM6IEluc3RydWN0aW9uRXhbXSk6IEhUTUxTcGFuRWxlbWVudFtdIHtcbiAgICBjb25zdCBpbnN0cnVjdGlvbnNFbCA9IGNvbnRhaW5lckVsLmNyZWF0ZURpdihDc3NDbGFzcy5Qcm9tcHRJbnN0cnVjdGlvbnMpO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoaW5zdHJ1Y3Rpb25zRWwsIENzc0NsYXNzLk1vZGFsQ29tbWFuZHMpO1xuXG4gICAgcmV0dXJuIGluc3RydWN0aW9ucy5tYXAoKGluc3RydWN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbkVsID0gaW5zdHJ1Y3Rpb25zRWwuY3JlYXRlRGl2KENzc0NsYXNzLlByb21wdEluc3RydWN0aW9uKTtcbiAgICAgIGluc3RydWN0aW9uRWwuY3JlYXRlU3Bhbih7IGNsczogQ3NzQ2xhc3MuUHJvbXB0SW5zdHJ1Y3Rpb25Db21tYW5kLCB0ZXh0OiBpbnN0cnVjdGlvbi5jb21tYW5kIH0pO1xuICAgICAgcmV0dXJuIGluc3RydWN0aW9uRWwuY3JlYXRlU3Bhbih7IHRleHQ6IGluc3RydWN0aW9uLnB1cnBvc2UgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBGbGlwcyBhIGNoZWNrYm94IGFuZCBhbm5vdW5jZXMgaXQsIHVubGVzcyBpdCBpcyBkaXNhYmxlZC5cbiAqXG4gKiBTaGFyZWQgYnkgdGhlIHNob3J0Y3V0IGFuZCB0aGUgYnV0dG9uIHNvIHRoZSB0d28gcm91dGVzIGNhbm5vdCBkcmlmdCBcdTIwMTQgaW5jbHVkaW5nIHRoZSBkaXNhYmxlZCBndWFyZCxcbiAqIHdoaWNoIGlzIHRoZSBoYWxmIG1vc3QgZWFzaWx5IGZvcmdvdHRlbiBvbiBvbmUgb2YgdGhlbS5cbiAqXG4gKiBAcGFyYW0gY2hlY2tib3hFbCAtIFRoZSBjaGVja2JveCB0byB0b2dnbGUuXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZUNoZWNrYm94KGNoZWNrYm94RWw6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgaWYgKGNoZWNrYm94RWwuZGlzYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY2hlY2tib3hFbC5jaGVja2VkID0gIWNoZWNrYm94RWwuY2hlY2tlZDtcbiAgY2hlY2tib3hFbC50cmlnZ2VyKCdjaGFuZ2UnKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7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
@@ -78,6 +78,20 @@ export declare class VaultTransaction {
78
78
  * @returns A {@link Promise} that resolves when the commit completes.
79
79
  */
80
80
  commit(): Promise<void>;
81
+ /**
82
+ * Copies a file or folder, recording the removal of the copy as the inverse. A folder is copied with
83
+ * its whole subtree, so the single recorded removal undoes the whole tree. Unlike
84
+ * {@link VaultTransaction.create}, the content is copied byte for byte, so a binary resource
85
+ * round-trips faithfully.
86
+ *
87
+ * Parent folders that had to be created for the destination are NOT undone individually, matching
88
+ * {@link VaultTransaction.create} and {@link VaultTransaction.rename}.
89
+ *
90
+ * @param oldPathOrFile - The path, file or folder to copy.
91
+ * @param newPath - The desired new path (an available path is chosen if it is taken).
92
+ * @returns A {@link Promise} resolving to the actual path of the copy.
93
+ */
94
+ copy(oldPathOrFile: PathOrAbstractFile, newPath: string): Promise<string>;
81
95
  /**
82
96
  * Creates a file with the given content, recording its removal as the inverse.
83
97
  *
@@ -49,6 +49,7 @@ import {
49
49
  getPath
50
50
  } from "./file-system.mjs";
51
51
  import {
52
+ copySafe,
52
53
  createFolderSafe,
53
54
  CreateFolderSafeResult,
54
55
  process,
@@ -96,6 +97,30 @@ class VaultTransaction {
96
97
  await this.removeStagingFolder();
97
98
  this.disposeMutationBypass();
98
99
  }
100
+ /**
101
+ * Copies a file or folder, recording the removal of the copy as the inverse. A folder is copied with
102
+ * its whole subtree, so the single recorded removal undoes the whole tree. Unlike
103
+ * {@link VaultTransaction.create}, the content is copied byte for byte, so a binary resource
104
+ * round-trips faithfully.
105
+ *
106
+ * Parent folders that had to be created for the destination are NOT undone individually, matching
107
+ * {@link VaultTransaction.create} and {@link VaultTransaction.rename}.
108
+ *
109
+ * @param oldPathOrFile - The path, file or folder to copy.
110
+ * @param newPath - The desired new path (an available path is chosen if it is taken).
111
+ * @returns A {@link Promise} resolving to the actual path of the copy.
112
+ */
113
+ async copy(oldPathOrFile, newPath) {
114
+ this.assertOpen();
115
+ const oldPath = getPath(this.app, oldPathOrFile);
116
+ const actualNewPath = await copySafe({ app: this.app, newPath, oldPathOrFile });
117
+ if (actualNewPath !== oldPath) {
118
+ this.pushUndo(async () => {
119
+ await this.hardDelete(actualNewPath);
120
+ });
121
+ }
122
+ return actualNewPath;
123
+ }
99
124
  /**
100
125
  * Creates a file with the given content, recording its removal as the inverse.
101
126
  *
@@ -299,4 +324,4 @@ class VaultTransaction {
299
324
  export {
300
325
  VaultTransaction
301
326
  };
302
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3ZhdWx0LXRyYW5zYWN0aW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSByZXZlcnNpYmxlLCB0cmFuc2FjdGlvbmFsIGxvZyBvZiB2YXVsdCBtdXRhdGlvbnMuIEVhY2ggbXV0YXRpb24gcmVjb3JkcyBob3cgdG8gdW5kbyBpdHNlbGY7XG4gKiB7QGxpbmsgVmF1bHRUcmFuc2FjdGlvbi5yb2xsYmFja30gcmV2ZXJzZXMgdGhlIGNvbXBsZXRlZCBzdGVwcyBpbiByZXZlcnNlIG9yZGVyIGFuZFxuICoge0BsaW5rIFZhdWx0VHJhbnNhY3Rpb24uY29tbWl0fSBmaW5hbGl6ZXMgdGhlbS4gSXQgaXMgYnVpbHQgb24gdGhlIGAqU2FmZWAgdmF1bHQgd3JhcHBlcnMgc28gaXRcbiAqIGluaGVyaXRzIHRoZWlyIGNhc2UtaW5zZW5zaXRpdmUgLyByZXRyeSAvIG1pc3NpbmctZmlsZSBoYW5kbGluZy5cbiAqXG4gKiBBIGRlbGV0aW9uIGlzIHBlcmZvcm1lZCBhcyBhICoqc29mdC1kZWxldGUqKjogdGhlIHJlc291cmNlIGlzIG1vdmVkIGFzaWRlIGludG8gYSBkb3QtcHJlZml4ZWRcbiAqIHN0YWdpbmcgZm9sZGVyIChhIGZvbGRlciBtb3ZlcyBpdHMgd2hvbGUgc3VidHJlZSBpbiBhIHNpbmdsZSByZW5hbWUsIHNvIHN1YnRyZWUgcm9sbGJhY2sgaXMgY2hlYXBcbiAqIGFuZCBmYWl0aGZ1bCkuIEJlY2F1c2UgT2JzaWRpYW4ncyB2YXVsdCBmaWxlLXRyZWUgYW5kIGZpbGUgd2F0Y2hlciBpZ25vcmUgYW55IGAuYC1wcmVmaXhlZCBwYXRoLFxuICogc3RhZ2VkIHJlc291cmNlcyBhcmUgKip1bnRyYWNrZWQqKiBcdTIwMTQgdGhleSBkbyBub3QgY2h1cm4gdGhlIG1ldGFkYXRhIGNhY2hlLCBmbGFzaCBpbiB0aGUgZmlsZVxuICogZXhwbG9yZXIsIG9yIGdldCBwcm9wYWdhdGVkIGJ5IHN5bmMgd2hpbGUgdGhlIHRyYW5zYWN0aW9uIGlzIGluIGZsaWdodC4gVGhlIGZsaXAgc2lkZSBpcyB0aGF0XG4gKiBgdmF1bHQuKmAgbWV0aG9kcyBjYW5ub3Qgc2VlIHRoZSBzdGFnaW5nIGFyZWEsIHNvIEFMTCBzdGFnaW5nIEkvTyBnb2VzIHRocm91Z2hcbiAqIHtAbGluayBBcHAudmF1bHQuYWRhcHRlcn0gKGBta2RpcmAvYHJlbmFtZWAvYGV4aXN0c2AvYHRyYXNoU3lzdGVtYC9gcm1kaXJgKS5cbiAqIHtAbGluayBWYXVsdFRyYW5zYWN0aW9uLmNvbW1pdH0gdGhlbiB0cmFzaGVzIHRoZSBzdGFnZWQgcmVzb3VyY2VzIGZvciByZWFsOyB7QGxpbmsgVmF1bHRUcmFuc2FjdGlvbi5yb2xsYmFja31cbiAqIG1vdmVzIHRoZW0gYmFjay5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckFic3RyYWN0RmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuXG5pbXBvcnQgeyBkaXNwb3NlIH0gZnJvbSAnLi4vZGlzcG9zYWJsZS50cyc7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IHN5bmNPcGVuRWRpdG9yQnVmZmVyc0ZvclBhdGggfSBmcm9tICcuL2VkaXRvci50cyc7XG5pbXBvcnQge1xuICBnZXRBYnN0cmFjdEZpbGVPck51bGwsXG4gIGdldFBhdGhcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBjcmVhdGVGb2xkZXJTYWZlLFxuICBDcmVhdGVGb2xkZXJTYWZlUmVzdWx0LFxuICBwcm9jZXNzLFxuICByZWFkU2FmZSxcbiAgcmVuYW1lU2FmZVxufSBmcm9tICcuL3ZhdWx0LnRzJztcblxuY29uc3QgREVGQVVMVF9TVEFHSU5HX0ZPTERFUl9QQVRIID0gJy5vYnNpZGlhbi1kZXYtdXRpbHMtdGVtcCc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBWYXVsdFRyYW5zYWN0aW9ufSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYXVsdFRyYW5zYWN0aW9uQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIE9wZW5zIGFuIGFtYmllbnQgbXV0YXRpb24tYnlwYXNzIHNjb3BlIGNvdmVyaW5nIHRoZSBwYXRocyB0aGlzIHRyYW5zYWN0aW9uIHRvdWNoZXMsIHNvIHRoZVxuICAgKiB0cmFuc2FjdGlvbidzIG93biB3cml0ZXMgcGFzcyBhIGBzaG91bGRCbG9ja011dGF0aW9uc2AgbG9jayB0aGF0IHRoZSBvd25pbmcgb3BlcmF0aW9uIGhvbGRzLiBJdCBpc1xuICAgKiBjYWxsZWQgb25jZSB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBjb25zdHJ1Y3RlZCwgYW5kIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gaXMgZGlzcG9zZWRcbiAgICogd2hlbiB0aGUgdHJhbnNhY3Rpb24gc2V0dGxlcyAob24gYGNvbW1pdGAsIGByb2xsYmFja2AsIG9yIGBhd2FpdCB1c2luZ2AgZGlzcG9zYWwpIFx1MjAxNCBzbyB0aGUgYnlwYXNzXG4gICAqIHN0YXlzIGFjdGl2ZSB0aHJvdWdoIHJvbGxiYWNrLCBpbmNsdWRpbmcgYXV0by1yb2xsYmFjaywgd2hpY2ggYSBjYWxsZXIgbWFuYWdpbmcgdGhlIHNjb3BlIGl0c2VsZlxuICAgKiBjb3VsZCBlYXNpbHkgZ2V0IHdyb25nLiBUeXBpY2FsbHlcbiAgICogYCgpID0+IHJlc291cmNlTG9ja0NvbXBvbmVudC5ieXBhc3NCbG9ja2VkTXV0YXRpb25zKGxvY2tlZFBhdGhzT3JGaWxlcylgLiBPbWl0IGl0IGZvciB0aGUgY29tbW9uXG4gICAqIHN0YW5kYWxvbmUgY2FzZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb3BlcmF0ZXMgb24gdW5sb2NrZWQgcGF0aHMuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgZW5kcyB0aGUgYnlwYXNzIHNjb3BlLlxuICAgKi9cbiAgb3Blbk11dGF0aW9uQnlwYXNzPyh0aGlzOiB2b2lkKTogRGlzcG9zYWJsZTtcblxuICAvKipcbiAgICogVGhlIGRvdC1wcmVmaXhlZCBmb2xkZXIgdGhhdCBzb2Z0LWRlbGV0ZWQgcmVzb3VyY2VzIGFyZSBtb3ZlZCBpbnRvIHVudGlsIHRoZSB0cmFuc2FjdGlvbiBpc1xuICAgKiBjb21taXR0ZWQgb3Igcm9sbGVkIGJhY2suIEl0IG11c3Qgc3RheSBgLmAtcHJlZml4ZWQgc28gT2JzaWRpYW4gbGVhdmVzIHRoZSBzdGFnZWQgcmVzb3VyY2VzXG4gICAqIHVudHJhY2tlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcub2JzaWRpYW4tZGV2LXV0aWxzLXRlbXAnYFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhZ2luZ0ZvbGRlclBhdGg/OiBzdHJpbmc7XG59XG5cbnR5cGUgVHJhbnNhY3Rpb25TdGF0ZSA9ICdjb21taXR0ZWQnIHwgJ29wZW4nIHwgJ3JvbGxlZEJhY2snO1xuXG5pbnRlcmZhY2UgVW5kb1N0ZXAge1xuICB1bmRvKHRoaXM6IHZvaWQpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIEEgcmV2ZXJzaWJsZSBsb2cgb2YgdmF1bHQgbXV0YXRpb25zLiBQZXJmb3JtIG11dGF0aW9ucyB0aHJvdWdoIGl0cyBtZXRob2RzLCB0aGVuIGNhbGxcbiAqIHtAbGluayBWYXVsdFRyYW5zYWN0aW9uLmNvbW1pdH0gb24gc3VjY2VzcyBvciB7QGxpbmsgVmF1bHRUcmFuc2FjdGlvbi5yb2xsYmFja30gb24gZmFpbHVyZS4gSXQgaXNcbiAqIGBhd2FpdCB1c2luZ2AtZnJpZW5kbHk6IGlmIG5laXRoZXIgaXMgY2FsbGVkLCBkaXNwb3NhbCByb2xscyBiYWNrLlxuICovXG5leHBvcnQgY2xhc3MgVmF1bHRUcmFuc2FjdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UgdGhlIHRyYW5zYWN0aW9uIG11dGF0ZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgaGFzU3RhZ2luZ0ZvbGRlciA9IGZhbHNlO1xuICBwcml2YXRlIG11dGF0aW9uQnlwYXNzOiBEaXNwb3NhYmxlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhZ2VkVHJhc2hQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnaW5nRm9sZGVyUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHN0YXRlOiBUcmFuc2FjdGlvblN0YXRlID0gJ29wZW4nO1xuICBwcml2YXRlIHJlYWRvbmx5IHVuZG9TdGVwczogVW5kb1N0ZXBbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHZhdWx0IHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBWYXVsdFRyYW5zYWN0aW9uQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5zdGFnaW5nRm9sZGVyUGF0aCA9IHBhcmFtcy5zdGFnaW5nRm9sZGVyUGF0aCA/PyBERUZBVUxUX1NUQUdJTkdfRk9MREVSX1BBVEg7XG4gICAgdGhpcy5tdXRhdGlvbkJ5cGFzcyA9IHBhcmFtcy5vcGVuTXV0YXRpb25CeXBhc3M/LigpID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0cyB0aGUgdHJhbnNhY3Rpb246IGZpbmFsaXplcyBzb2Z0LWRlbGV0ZXMgYnkgdHJhc2hpbmcgdGhlIHN0YWdlZCByZXNvdXJjZXMgZm9yIHJlYWwgYW5kXG4gICAqIHJlbW92ZXMgdGhlIHN0YWdpbmcgZm9sZGVyLiBBZnRlciB0aGlzIHRoZSB0cmFuc2FjdGlvbiBjYW4gbm8gbG9uZ2VyIGJlIG11dGF0ZWQgb3Igcm9sbGVkIGJhY2suXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29tbWl0IGNvbXBsZXRlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb21taXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hc3NlcnRPcGVuKCk7XG4gICAgdGhpcy5zdGF0ZSA9ICdjb21taXR0ZWQnO1xuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFwcC52YXVsdC5hZGFwdGVyO1xuICAgIGZvciAoY29uc3Qgc3RhZ2VkUGF0aCBvZiB0aGlzLnN0YWdlZFRyYXNoUGF0aHMpIHtcbiAgICAgIGNvbnN0IHdhc1RyYXNoZWRUb1N5c3RlbSA9IGF3YWl0IGFkYXB0ZXIudHJhc2hTeXN0ZW0oc3RhZ2VkUGF0aCk7XG4gICAgICBpZiAoIXdhc1RyYXNoZWRUb1N5c3RlbSkge1xuICAgICAgICBhd2FpdCBhZGFwdGVyLnRyYXNoTG9jYWwoc3RhZ2VkUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucmVtb3ZlU3RhZ2luZ0ZvbGRlcigpO1xuICAgIHRoaXMuZGlzcG9zZU11dGF0aW9uQnlwYXNzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gY29udGVudCwgcmVjb3JkaW5nIGl0cyByZW1vdmFsIGFzIHRoZSBpbnZlcnNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgY29udGVudCBvZiB0aGUgZmlsZS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHtAbGluayBURmlsZX0uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlKHBhdGg6IHN0cmluZywgZGF0YTogc3RyaW5nKTogUHJvbWlzZTxURmlsZT4ge1xuICAgIHRoaXMuYXNzZXJ0T3BlbigpO1xuICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5jcmVhdGUocGF0aCwgZGF0YSk7XG4gICAgY29uc3QgY3JlYXRlZFBhdGggPSBmaWxlLnBhdGg7XG4gICAgdGhpcy5wdXNoVW5kbyhhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmhhcmREZWxldGUoY3JlYXRlZFBhdGgpO1xuICAgIH0pO1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmb2xkZXIgKGluY2x1ZGluZyBtaXNzaW5nIGFuY2VzdG9ycyksIHJlY29yZGluZyBpdHMgcmVtb3ZhbCBhcyB0aGUgaW52ZXJzZS4gQSBuby1vcCBpZlxuICAgKiB0aGUgZm9sZGVyIGFscmVhZHkgZXhpc3RzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmb2xkZXIgdG8gY3JlYXRlLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZvbGRlciBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlRm9sZGVyKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYXNzZXJ0T3BlbigpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZUZvbGRlclNhZmUodGhpcy5hcHAsIHBhdGgpO1xuICAgIGlmIChyZXN1bHQgPT09IENyZWF0ZUZvbGRlclNhZmVSZXN1bHQuQ3JlYXRlZCkge1xuICAgICAgdGhpcy5wdXNoVW5kbyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFyZERlbGV0ZShwYXRoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgY29udGVudCBvZiBhIGZpbGUsIGNhcHR1cmluZyB0aGUgb2xkIGNvbnRlbnQgc28gaXQgY2FuIGJlIHJlc3RvcmVkIG9uIHJvbGxiYWNrLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0gbmV3Q29udGVudCAtIFRoZSBuZXcgY29udGVudC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlIGlzIG1vZGlmaWVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIG1vZGlmeShwYXRoT3JGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGUsIG5ld0NvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucHJvY2VzcyhwYXRoT3JGaWxlLCAoKSA9PiBuZXdDb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIHRoZSBjb250ZW50IG9mIGEgZmlsZSwgY2FwdHVyaW5nIHRoZSBvbGQgY29udGVudCBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgb24gcm9sbGJhY2suXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBwcm9jZXNzLlxuICAgKiBAcGFyYW0gbmV3Q29udGVudFByb3ZpZGVyIC0gTWFwcyB0aGUgY3VycmVudCBjb250ZW50IHRvIHRoZSBuZXcgY29udGVudC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlIGlzIHByb2Nlc3NlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwcm9jZXNzKHBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZSwgbmV3Q29udGVudFByb3ZpZGVyOiAoY29udGVudDogc3RyaW5nKSA9PiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFzc2VydE9wZW4oKTtcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aCh0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IHJlYWRTYWZlKHRoaXMuYXBwLCBwYXRoKTtcbiAgICBhd2FpdCBwcm9jZXNzKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBuZXdDb250ZW50UHJvdmlkZXI6ICh7IGNvbnRlbnQgfSkgPT4gbmV3Q29udGVudFByb3ZpZGVyKGNvbnRlbnQpLFxuICAgICAgcGF0aE9yRmlsZTogcGF0aCxcbiAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogbnVsbCxcbiAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbFxuICAgIH0pO1xuICAgIC8vIFJlYWNoaW5nIHRoaXMgbGluZSBtZWFucyBgcHJvY2Vzc2Agc3VjY2VlZGVkLiBBIG1pc3NpbmcgZmlsZSB3b3VsZCBoYXZlIHRocm93biBhYm92ZSAoaXRzXG4gICAgLy8gYHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlYCBkZWZhdWx0KSwgc28gdGhlIHByZS1pbWFnZSB3YXMgY2FwdHVyZWQgYW5kIGNhbiBiZSByZXN0b3JlZCBvbiByb2xsYmFjay5cbiAgICBhc3NlcnROb25OdWxsYWJsZShvbGRDb250ZW50KTtcbiAgICB0aGlzLnB1c2hVbmRvKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHByb2Nlc3Moe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBuZXdDb250ZW50UHJvdmlkZXI6IG9sZENvbnRlbnQsXG4gICAgICAgIHBhdGhPckZpbGU6IHBhdGgsXG4gICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogbnVsbCxcbiAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsXG4gICAgICB9KTtcbiAgICAgIC8vIEEgY29uc3VtZXIgbWF5IGhhdmUgZWRpdGVkIHRoaXMgbm90ZSB0aHJvdWdoIHRoZSBlZGl0b3IsIGxlYXZpbmcgYSBkaXJ0eSBidWZmZXIuXG4gICAgICAvLyBJdHMgcGVuZGluZyBhdXRvc2F2ZSBjb3VsZCByZS13cml0ZSB0aGF0IHN0YWxlIGJ1ZmZlciBvdmVyIHRoZSBkaXNrIHJlc3RvcmUgYWJvdmUgYW5kIGNsb2JiZXIgaXQuXG4gICAgICAvLyBSZXNldHRpbmcgdGhlIG9wZW4gZWRpdG9yJ3MgYnVmZmVyIHRvIHRoZSByZXN0b3JlZCBjb250ZW50IGtlZXBzIGl0cyBuZXh0IHNhdmUgYSBuby1vcC5cbiAgICAgIC8vIE9ubHkgdGhlIHZpZXcgc3RpbGwgc2hvd2luZyB0aGlzIHBhdGggaXMgdG91Y2hlZC5cbiAgICAgIC8vIFZhdWx0VHJhbnNhY3Rpb24gYWxyZWFkeSBmbHVzaGVzIHZpYSBgc2F2ZU5vdGVgLCBzbyB0aGlzIHJlc2V0IGlzIGJlbHQtYW5kLXN1c3BlbmRlcnMuXG4gICAgICBzeW5jT3BlbkVkaXRvckJ1ZmZlcnNGb3JQYXRoKHRoaXMuYXBwLCBwYXRoLCBvbGRDb250ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5hbWVzIG9yIG1vdmVzIGEgcmVzb3VyY2UsIHJlY29yZGluZyB0aGUgcmV2ZXJzZSByZW5hbWUgYXMgdGhlIGludmVyc2UuXG4gICAqXG4gICAqIEBwYXJhbSBvbGRQYXRoT3JGaWxlIC0gVGhlIHJlc291cmNlIHRvIHJlbmFtZS5cbiAgICogQHBhcmFtIG5ld1BhdGggLSBUaGUgZGVzaXJlZCBuZXcgcGF0aCAoYW4gYXZhaWxhYmxlIHBhdGggaXMgY2hvc2VuIGlmIGl0IGlzIHRha2VuKS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBhY3R1YWwgbmV3IHBhdGguXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVuYW1lKG9sZFBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZSwgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmFzc2VydE9wZW4oKTtcbiAgICBjb25zdCBvbGRQYXRoID0gZ2V0UGF0aCh0aGlzLmFwcCwgb2xkUGF0aE9yRmlsZSk7XG4gICAgY29uc3QgYWN0dWFsTmV3UGF0aCA9IGF3YWl0IHJlbmFtZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBuZXdQYXRoLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IG9sZFBhdGhPckZpbGUgfSk7XG4gICAgdGhpcy5wdXNoVW5kbyhhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCByZW5hbWVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgbmV3UGF0aDogb2xkUGF0aCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBhY3R1YWxOZXdQYXRoIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBhY3R1YWxOZXdQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvbGxzIGJhY2sgdGhlIHRyYW5zYWN0aW9uOiB1bmRvZXMgdGhlIGNvbXBsZXRlZCBzdGVwcyBpbiByZXZlcnNlIG9yZGVyIGFuZCByZW1vdmVzIHRoZSBzdGFnaW5nXG4gICAqIGZvbGRlci4gSWRlbXBvdGVudC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByb2xsYmFjayBjb21wbGV0ZXMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcm9sbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdyb2xsZWRCYWNrJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFzc2VydE5vdENvbW1pdHRlZCgpO1xuICAgIHRoaXMuc3RhdGUgPSAncm9sbGVkQmFjayc7XG4gICAgZm9yIChjb25zdCBzdGVwIG9mIFsuLi50aGlzLnVuZG9TdGVwc10ucmV2ZXJzZSgpKSB7XG4gICAgICBhd2FpdCBzdGVwLnVuZG8oKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5yZW1vdmVTdGFnaW5nRm9sZGVyKCk7XG4gICAgdGhpcy5kaXNwb3NlTXV0YXRpb25CeXBhc3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xscyBiYWNrIHRoZSB0cmFuc2FjdGlvbiBvbiBkaXNwb3NhbCB1bmxlc3MgaXQgd2FzIGFscmVhZHkgY29tbWl0dGVkIG9yIHJvbGxlZCBiYWNrLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ29wZW4nKSB7XG4gICAgICBhd2FpdCB0aGlzLnJvbGxiYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNvZnQtZGVsZXRlcyBhIHJlc291cmNlIGJ5IG1vdmluZyBpdCBpbnRvIHRoZSBzdGFnaW5nIGZvbGRlciwgcmVjb3JkaW5nIHRoZSBtb3ZlLWJhY2sgYXMgdGhlXG4gICAqIGludmVyc2UuIFRoZSByZWFsIHRyYXNoIGhhcHBlbnMgb24ge0BsaW5rIFZhdWx0VHJhbnNhY3Rpb24uY29tbWl0fS4gQSBuby1vcCBpZiB0aGUgcmVzb3VyY2UgZG9lc1xuICAgKiBub3QgZXhpc3QuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgcmVzb3VyY2UgdG8gdHJhc2guXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gc3RhZ2VkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyYXNoKHBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYXNzZXJ0T3BlbigpO1xuICAgIGNvbnN0IGZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlIH0pO1xuICAgIGlmICghZmlsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbFBhdGggPSBmaWxlLnBhdGg7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTdGFnaW5nRm9sZGVyKCk7XG4gICAgY29uc3Qgc3RhZ2VkUGF0aCA9IGF3YWl0IHRoaXMuZ2V0QXZhaWxhYmxlU3RhZ2VkUGF0aChmaWxlLm5hbWUpO1xuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFwcC52YXVsdC5hZGFwdGVyO1xuICAgIC8vIE1vdmUgdGhyb3VnaCB0aGUgYWRhcHRlciwgbm90IGB2YXVsdC5yZW5hbWVgOiB0aGUgc3RhZ2luZyBmb2xkZXIgaXMgZG90LXByZWZpeGVkIGFuZCB0aGVyZWZvcmVcbiAgICAvLyBVbnRyYWNrZWQsIHNvIGEgYHZhdWx0LipgIG1vdmUgY2Fubm90IHRhcmdldCBpdCAobm9yIHNob3VsZCBpdCByZXdyaXRlIGxpbmtzIHRvIGEgc29mdC1kZWxldGUpLlxuICAgIGF3YWl0IGFkYXB0ZXIucmVuYW1lKG9yaWdpbmFsUGF0aCwgc3RhZ2VkUGF0aCk7XG4gICAgdGhpcy5zdGFnZWRUcmFzaFBhdGhzLnB1c2goc3RhZ2VkUGF0aCk7XG4gICAgdGhpcy5wdXNoVW5kbyhhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoYXdhaXQgYWRhcHRlci5leGlzdHMoc3RhZ2VkUGF0aCkpIHtcbiAgICAgICAgYXdhaXQgYWRhcHRlci5yZW5hbWUoc3RhZ2VkUGF0aCwgb3JpZ2luYWxQYXRoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXNzZXJ0Tm90Q29tbWl0dGVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSAnY29tbWl0dGVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgcm9sbCBiYWNrIGEgY29tbWl0dGVkIHRyYW5zYWN0aW9uLicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXNzZXJ0T3BlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29wZW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtdXRhdGUgYSAke3RoaXMuc3RhdGV9IHRyYW5zYWN0aW9uLmApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGlzcG9zZU11dGF0aW9uQnlwYXNzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11dGF0aW9uQnlwYXNzKSB7XG4gICAgICBkaXNwb3NlKHRoaXMubXV0YXRpb25CeXBhc3MpO1xuICAgIH1cbiAgICB0aGlzLm11dGF0aW9uQnlwYXNzID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlU3RhZ2luZ0ZvbGRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5oYXNTdGFnaW5nRm9sZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFwcC52YXVsdC5hZGFwdGVyO1xuICAgIGlmICghYXdhaXQgYWRhcHRlci5leGlzdHModGhpcy5zdGFnaW5nRm9sZGVyUGF0aCkpIHtcbiAgICAgIGF3YWl0IGFkYXB0ZXIubWtkaXIodGhpcy5zdGFnaW5nRm9sZGVyUGF0aCk7XG4gICAgfVxuICAgIHRoaXMuaGFzU3RhZ2luZ0ZvbGRlciA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEF2YWlsYWJsZVN0YWdlZFBhdGgobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlcjtcbiAgICBjb25zdCBkb3RJbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTtcbiAgICBjb25zdCBoYXNFeHRlbnNpb24gPSBkb3RJbmRleCA+IDA7XG4gICAgY29uc3QgYmFzZU5hbWUgPSBoYXNFeHRlbnNpb24gPyBuYW1lLnNsaWNlKDAsIGRvdEluZGV4KSA6IG5hbWU7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gaGFzRXh0ZW5zaW9uID8gbmFtZS5zbGljZShkb3RJbmRleCkgOiAnJztcbiAgICBsZXQgY2FuZGlkYXRlID0gYCR7dGhpcy5zdGFnaW5nRm9sZGVyUGF0aH0vJHtuYW1lfWA7XG4gICAgbGV0IGNvdW50ZXIgPSAxO1xuICAgIHdoaWxlIChhd2FpdCBhZGFwdGVyLmV4aXN0cyhjYW5kaWRhdGUpKSB7XG4gICAgICBjYW5kaWRhdGUgPSBgJHt0aGlzLnN0YWdpbmdGb2xkZXJQYXRofS8ke2Jhc2VOYW1lfSAke2NvdW50ZXIudG9TdHJpbmcoKX0ke2V4dGVuc2lvbn1gO1xuICAgICAgY291bnRlcisrO1xuICAgIH1cbiAgICByZXR1cm4gY2FuZGlkYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYXJkRGVsZXRlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBwYXRoIH0pO1xuICAgIGlmIChmaWxlKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9wcmVmZXItZmlsZS1tYW5hZ2VyLXRyYXNoLWZpbGUgLS0gVW5kb2luZyBhIHRyYW5zYWN0aW9uLWxvY2FsIGNyZWF0ZSBtdXN0IHZhbmlzaCBpdCBlbnRpcmVseSwgbm90IGxhbmQgaXQgaW4gdGhlIHVzZXIncyB0cmFzaC5cbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmRlbGV0ZShmaWxlLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHB1c2hVbmRvKHVuZG86ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgICB0aGlzLnVuZG9TdGVwcy5wdXNoKHsgdW5kbyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlU3RhZ2luZ0ZvbGRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaGFzU3RhZ2luZ0ZvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhhc1N0YWdpbmdGb2xkZXIgPSBmYWxzZTtcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlcjtcbiAgICBpZiAoYXdhaXQgYWRhcHRlci5leGlzdHModGhpcy5zdGFnaW5nRm9sZGVyUGF0aCkpIHtcbiAgICAgIGF3YWl0IGFkYXB0ZXIucm1kaXIodGhpcy5zdGFnaW5nRm9sZGVyUGF0aCwgdHJ1ZSk7XG4gICAgfVxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEJBLFNBQVMsZUFBZTtBQUN4QixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG9DQUFvQztBQUM3QztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsTUFBTSw4QkFBOEI7QUE4QzdCLE1BQU0saUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJVDtBQUFBLEVBQ1gsbUJBQW1CO0FBQUEsRUFDbkIsaUJBQW9DO0FBQUEsRUFDM0IsbUJBQTZCLENBQUM7QUFBQSxFQUM5QjtBQUFBLEVBQ1QsUUFBMEI7QUFBQSxFQUNqQixZQUF3QixDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT25DLFlBQVksUUFBMkM7QUFDNUQsU0FBSyxNQUFNLE9BQU87QUFDbEIsU0FBSyxvQkFBb0IsT0FBTyxxQkFBcUI7QUFDckQsU0FBSyxpQkFBaUIsT0FBTyxxQkFBcUIsS0FBSztBQUFBLEVBQ3pEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFhLFNBQXdCO0FBQ25DLFNBQUssV0FBVztBQUNoQixTQUFLLFFBQVE7QUFDYixVQUFNLFVBQVUsS0FBSyxJQUFJLE1BQU07QUFDL0IsZUFBVyxjQUFjLEtBQUssa0JBQWtCO0FBQzlDLFlBQU0scUJBQXFCLE1BQU0sUUFBUSxZQUFZLFVBQVU7QUFDL0QsVUFBSSxDQUFDLG9CQUFvQjtBQUN2QixjQUFNLFFBQVEsV0FBVyxVQUFVO0FBQUEsTUFDckM7QUFBQSxJQUNGO0FBQ0EsVUFBTSxLQUFLLG9CQUFvQjtBQUMvQixTQUFLLHNCQUFzQjtB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
327
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3ZhdWx0LXRyYW5zYWN0aW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSByZXZlcnNpYmxlLCB0cmFuc2FjdGlvbmFsIGxvZyBvZiB2YXVsdCBtdXRhdGlvbnMuIEVhY2ggbXV0YXRpb24gcmVjb3JkcyBob3cgdG8gdW5kbyBpdHNlbGY7XG4gKiB7QGxpbmsgVmF1bHRUcmFuc2FjdGlvbi5yb2xsYmFja30gcmV2ZXJzZXMgdGhlIGNvbXBsZXRlZCBzdGVwcyBpbiByZXZlcnNlIG9yZGVyIGFuZFxuICoge0BsaW5rIFZhdWx0VHJhbnNhY3Rpb24uY29tbWl0fSBmaW5hbGl6ZXMgdGhlbS4gSXQgaXMgYnVpbHQgb24gdGhlIGAqU2FmZWAgdmF1bHQgd3JhcHBlcnMgc28gaXRcbiAqIGluaGVyaXRzIHRoZWlyIGNhc2UtaW5zZW5zaXRpdmUgLyByZXRyeSAvIG1pc3NpbmctZmlsZSBoYW5kbGluZy5cbiAqXG4gKiBBIGRlbGV0aW9uIGlzIHBlcmZvcm1lZCBhcyBhICoqc29mdC1kZWxldGUqKjogdGhlIHJlc291cmNlIGlzIG1vdmVkIGFzaWRlIGludG8gYSBkb3QtcHJlZml4ZWRcbiAqIHN0YWdpbmcgZm9sZGVyIChhIGZvbGRlciBtb3ZlcyBpdHMgd2hvbGUgc3VidHJlZSBpbiBhIHNpbmdsZSByZW5hbWUsIHNvIHN1YnRyZWUgcm9sbGJhY2sgaXMgY2hlYXBcbiAqIGFuZCBmYWl0aGZ1bCkuIEJlY2F1c2UgT2JzaWRpYW4ncyB2YXVsdCBmaWxlLXRyZWUgYW5kIGZpbGUgd2F0Y2hlciBpZ25vcmUgYW55IGAuYC1wcmVmaXhlZCBwYXRoLFxuICogc3RhZ2VkIHJlc291cmNlcyBhcmUgKip1bnRyYWNrZWQqKiBcdTIwMTQgdGhleSBkbyBub3QgY2h1cm4gdGhlIG1ldGFkYXRhIGNhY2hlLCBmbGFzaCBpbiB0aGUgZmlsZVxuICogZXhwbG9yZXIsIG9yIGdldCBwcm9wYWdhdGVkIGJ5IHN5bmMgd2hpbGUgdGhlIHRyYW5zYWN0aW9uIGlzIGluIGZsaWdodC4gVGhlIGZsaXAgc2lkZSBpcyB0aGF0XG4gKiBgdmF1bHQuKmAgbWV0aG9kcyBjYW5ub3Qgc2VlIHRoZSBzdGFnaW5nIGFyZWEsIHNvIEFMTCBzdGFnaW5nIEkvTyBnb2VzIHRocm91Z2hcbiAqIHtAbGluayBBcHAudmF1bHQuYWRhcHRlcn0gKGBta2RpcmAvYHJlbmFtZWAvYGV4aXN0c2AvYHRyYXNoU3lzdGVtYC9gcm1kaXJgKS5cbiAqIHtAbGluayBWYXVsdFRyYW5zYWN0aW9uLmNvbW1pdH0gdGhlbiB0cmFzaGVzIHRoZSBzdGFnZWQgcmVzb3VyY2VzIGZvciByZWFsOyB7QGxpbmsgVmF1bHRUcmFuc2FjdGlvbi5yb2xsYmFja31cbiAqIG1vdmVzIHRoZW0gYmFjay5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckFic3RyYWN0RmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuXG5pbXBvcnQgeyBkaXNwb3NlIH0gZnJvbSAnLi4vZGlzcG9zYWJsZS50cyc7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IHN5bmNPcGVuRWRpdG9yQnVmZmVyc0ZvclBhdGggfSBmcm9tICcuL2VkaXRvci50cyc7XG5pbXBvcnQge1xuICBnZXRBYnN0cmFjdEZpbGVPck51bGwsXG4gIGdldFBhdGhcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBjb3B5U2FmZSxcbiAgY3JlYXRlRm9sZGVyU2FmZSxcbiAgQ3JlYXRlRm9sZGVyU2FmZVJlc3VsdCxcbiAgcHJvY2VzcyxcbiAgcmVhZFNhZmUsXG4gIHJlbmFtZVNhZmVcbn0gZnJvbSAnLi92YXVsdC50cyc7XG5cbmNvbnN0IERFRkFVTFRfU1RBR0lOR19GT0xERVJfUEFUSCA9ICcub2JzaWRpYW4tZGV2LXV0aWxzLXRlbXAnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgVmF1bHRUcmFuc2FjdGlvbn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmF1bHRUcmFuc2FjdGlvbkNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBPcGVucyBhbiBhbWJpZW50IG11dGF0aW9uLWJ5cGFzcyBzY29wZSBjb3ZlcmluZyB0aGUgcGF0aHMgdGhpcyB0cmFuc2FjdGlvbiB0b3VjaGVzLCBzbyB0aGVcbiAgICogdHJhbnNhY3Rpb24ncyBvd24gd3JpdGVzIHBhc3MgYSBgc2hvdWxkQmxvY2tNdXRhdGlvbnNgIGxvY2sgdGhhdCB0aGUgb3duaW5nIG9wZXJhdGlvbiBob2xkcy4gSXQgaXNcbiAgICogY2FsbGVkIG9uY2Ugd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgY29uc3RydWN0ZWQsIGFuZCB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IGlzIGRpc3Bvc2VkXG4gICAqIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHNldHRsZXMgKG9uIGBjb21taXRgLCBgcm9sbGJhY2tgLCBvciBgYXdhaXQgdXNpbmdgIGRpc3Bvc2FsKSBcdTIwMTQgc28gdGhlIGJ5cGFzc1xuICAgKiBzdGF5cyBhY3RpdmUgdGhyb3VnaCByb2xsYmFjaywgaW5jbHVkaW5nIGF1dG8tcm9sbGJhY2ssIHdoaWNoIGEgY2FsbGVyIG1hbmFnaW5nIHRoZSBzY29wZSBpdHNlbGZcbiAgICogY291bGQgZWFzaWx5IGdldCB3cm9uZy4gVHlwaWNhbGx5XG4gICAqIGAoKSA9PiByZXNvdXJjZUxvY2tDb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9ucyhsb2NrZWRQYXRoc09yRmlsZXMpYC4gT21pdCBpdCBmb3IgdGhlIGNvbW1vblxuICAgKiBzdGFuZGFsb25lIGNhc2Ugd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9wZXJhdGVzIG9uIHVubG9ja2VkIHBhdGhzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IGVuZHMgdGhlIGJ5cGFzcyBzY29wZS5cbiAgICovXG4gIG9wZW5NdXRhdGlvbkJ5cGFzcz8odGhpczogdm9pZCk6IERpc3Bvc2FibGU7XG5cbiAgLyoqXG4gICAqIFRoZSBkb3QtcHJlZml4ZWQgZm9sZGVyIHRoYXQgc29mdC1kZWxldGVkIHJlc291cmNlcyBhcmUgbW92ZWQgaW50byB1bnRpbCB0aGUgdHJhbnNhY3Rpb24gaXNcbiAgICogY29tbWl0dGVkIG9yIHJvbGxlZCBiYWNrLiBJdCBtdXN0IHN0YXkgYC5gLXByZWZpeGVkIHNvIE9ic2lkaWFuIGxlYXZlcyB0aGUgc3RhZ2VkIHJlc291cmNlc1xuICAgKiB1bnRyYWNrZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnLm9ic2lkaWFuLWRldi11dGlscy10ZW1wJ2BcbiAgICovXG4gIHJlYWRvbmx5IHN0YWdpbmdGb2xkZXJQYXRoPzogc3RyaW5nO1xufVxuXG50eXBlIFRyYW5zYWN0aW9uU3RhdGUgPSAnY29tbWl0dGVkJyB8ICdvcGVuJyB8ICdyb2xsZWRCYWNrJztcblxuaW50ZXJmYWNlIFVuZG9TdGVwIHtcbiAgdW5kbyh0aGlzOiB2b2lkKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBIHJldmVyc2libGUgbG9nIG9mIHZhdWx0IG11dGF0aW9ucy4gUGVyZm9ybSBtdXRhdGlvbnMgdGhyb3VnaCBpdHMgbWV0aG9kcywgdGhlbiBjYWxsXG4gKiB7QGxpbmsgVmF1bHRUcmFuc2FjdGlvbi5jb21taXR9IG9uIHN1Y2Nlc3Mgb3Ige0BsaW5rIFZhdWx0VHJhbnNhY3Rpb24ucm9sbGJhY2t9IG9uIGZhaWx1cmUuIEl0IGlzXG4gKiBgYXdhaXQgdXNpbmdgLWZyaWVuZGx5OiBpZiBuZWl0aGVyIGlzIGNhbGxlZCwgZGlzcG9zYWwgcm9sbHMgYmFjay5cbiAqL1xuZXhwb3J0IGNsYXNzIFZhdWx0VHJhbnNhY3Rpb24ge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlIHRoZSB0cmFuc2FjdGlvbiBtdXRhdGVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIGhhc1N0YWdpbmdGb2xkZXIgPSBmYWxzZTtcbiAgcHJpdmF0ZSBtdXRhdGlvbkJ5cGFzczogRGlzcG9zYWJsZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWdlZFRyYXNoUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhZ2luZ0ZvbGRlclBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSBzdGF0ZTogVHJhbnNhY3Rpb25TdGF0ZSA9ICdvcGVuJztcbiAgcHJpdmF0ZSByZWFkb25seSB1bmRvU3RlcHM6IFVuZG9TdGVwW10gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyB2YXVsdCB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogVmF1bHRUcmFuc2FjdGlvbkNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuc3RhZ2luZ0ZvbGRlclBhdGggPSBwYXJhbXMuc3RhZ2luZ0ZvbGRlclBhdGggPz8gREVGQVVMVF9TVEFHSU5HX0ZPTERFUl9QQVRIO1xuICAgIHRoaXMubXV0YXRpb25CeXBhc3MgPSBwYXJhbXMub3Blbk11dGF0aW9uQnlwYXNzPy4oKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbW1pdHMgdGhlIHRyYW5zYWN0aW9uOiBmaW5hbGl6ZXMgc29mdC1kZWxldGVzIGJ5IHRyYXNoaW5nIHRoZSBzdGFnZWQgcmVzb3VyY2VzIGZvciByZWFsIGFuZFxuICAgKiByZW1vdmVzIHRoZSBzdGFnaW5nIGZvbGRlci4gQWZ0ZXIgdGhpcyB0aGUgdHJhbnNhY3Rpb24gY2FuIG5vIGxvbmdlciBiZSBtdXRhdGVkIG9yIHJvbGxlZCBiYWNrLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbW1pdCBjb21wbGV0ZXMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29tbWl0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYXNzZXJ0T3BlbigpO1xuICAgIHRoaXMuc3RhdGUgPSAnY29tbWl0dGVkJztcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlcjtcbiAgICBmb3IgKGNvbnN0IHN0YWdlZFBhdGggb2YgdGhpcy5zdGFnZWRUcmFzaFBhdGhzKSB7XG4gICAgICBjb25zdCB3YXNUcmFzaGVkVG9TeXN0ZW0gPSBhd2FpdCBhZGFwdGVyLnRyYXNoU3lzdGVtKHN0YWdlZFBhdGgpO1xuICAgICAgaWYgKCF3YXNUcmFzaGVkVG9TeXN0ZW0pIHtcbiAgICAgICAgYXdhaXQgYWRhcHRlci50cmFzaExvY2FsKHN0YWdlZFBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLnJlbW92ZVN0YWdpbmdGb2xkZXIoKTtcbiAgICB0aGlzLmRpc3Bvc2VNdXRhdGlvbkJ5cGFzcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcGllcyBhIGZpbGUgb3IgZm9sZGVyLCByZWNvcmRpbmcgdGhlIHJlbW92YWwgb2YgdGhlIGNvcHkgYXMgdGhlIGludmVyc2UuIEEgZm9sZGVyIGlzIGNvcGllZCB3aXRoXG4gICAqIGl0cyB3aG9sZSBzdWJ0cmVlLCBzbyB0aGUgc2luZ2xlIHJlY29yZGVkIHJlbW92YWwgdW5kb2VzIHRoZSB3aG9sZSB0cmVlLiBVbmxpa2VcbiAgICoge0BsaW5rIFZhdWx0VHJhbnNhY3Rpb24uY3JlYXRlfSwgdGhlIGNvbnRlbnQgaXMgY29waWVkIGJ5dGUgZm9yIGJ5dGUsIHNvIGEgYmluYXJ5IHJlc291cmNlXG4gICAqIHJvdW5kLXRyaXBzIGZhaXRoZnVsbHkuXG4gICAqXG4gICAqIFBhcmVudCBmb2xkZXJzIHRoYXQgaGFkIHRvIGJlIGNyZWF0ZWQgZm9yIHRoZSBkZXN0aW5hdGlvbiBhcmUgTk9UIHVuZG9uZSBpbmRpdmlkdWFsbHksIG1hdGNoaW5nXG4gICAqIHtAbGluayBWYXVsdFRyYW5zYWN0aW9uLmNyZWF0ZX0gYW5kIHtAbGluayBWYXVsdFRyYW5zYWN0aW9uLnJlbmFtZX0uXG4gICAqXG4gICAqIEBwYXJhbSBvbGRQYXRoT3JGaWxlIC0gVGhlIHBhdGgsIGZpbGUgb3IgZm9sZGVyIHRvIGNvcHkuXG4gICAqIEBwYXJhbSBuZXdQYXRoIC0gVGhlIGRlc2lyZWQgbmV3IHBhdGggKGFuIGF2YWlsYWJsZSBwYXRoIGlzIGNob3NlbiBpZiBpdCBpcyB0YWtlbikuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgYWN0dWFsIHBhdGggb2YgdGhlIGNvcHkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29weShvbGRQYXRoT3JGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGUsIG5ld1BhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy5hc3NlcnRPcGVuKCk7XG4gICAgY29uc3Qgb2xkUGF0aCA9IGdldFBhdGgodGhpcy5hcHAsIG9sZFBhdGhPckZpbGUpO1xuICAgIGNvbnN0IGFjdHVhbE5ld1BhdGggPSBhd2FpdCBjb3B5U2FmZSh7IGFwcDogdGhpcy5hcHAsIG5ld1BhdGgsIG9sZFBhdGhPckZpbGUgfSk7XG4gICAgLy8gV2hlbiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBpZGVudGljYWwsIGBjb3B5U2FmZWAgcmV0dXJucyB0aGUgc291cmNlIHBhdGggYW5kIGNvcGllcyBub3RoaW5nLlxuICAgIC8vIFJlY29yZGluZyBhbiB1bmRvIGhlcmUgd291bGQgbWFrZSBgcm9sbGJhY2tgIGRlbGV0ZSB0aGUgY2FsbGVyJ3MgT1JJR0lOQUwgcmVzb3VyY2UuXG4gICAgaWYgKGFjdHVhbE5ld1BhdGggIT09IG9sZFBhdGgpIHtcbiAgICAgIHRoaXMucHVzaFVuZG8oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmhhcmREZWxldGUoYWN0dWFsTmV3UGF0aCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjdHVhbE5ld1BhdGg7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gY29udGVudCwgcmVjb3JkaW5nIGl0cyByZW1vdmFsIGFzIHRoZSBpbnZlcnNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgY29udGVudCBvZiB0aGUgZmlsZS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIHtAbGluayBURmlsZX0uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlKHBhdGg6IHN0cmluZywgZGF0YTogc3RyaW5nKTogUHJvbWlzZTxURmlsZT4ge1xuICAgIHRoaXMuYXNzZXJ0T3BlbigpO1xuICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5jcmVhdGUocGF0aCwgZGF0YSk7XG4gICAgY29uc3QgY3JlYXRlZFBhdGggPSBmaWxlLnBhdGg7XG4gICAgdGhpcy5wdXNoVW5kbyhhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmhhcmREZWxldGUoY3JlYXRlZFBhdGgpO1xuICAgIH0pO1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmb2xkZXIgKGluY2x1ZGluZyBtaXNzaW5nIGFuY2VzdG9ycyksIHJlY29yZGluZyBpdHMgcmVtb3ZhbCBhcyB0aGUgaW52ZXJzZS4gQSBuby1vcCBpZlxuICAgKiB0aGUgZm9sZGVyIGFscmVhZHkgZXhpc3RzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIG9mIHRoZSBmb2xkZXIgdG8gY3JlYXRlLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZvbGRlciBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlRm9sZGVyKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYXNzZXJ0T3BlbigpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZUZvbGRlclNhZmUodGhpcy5hcHAsIHBhdGgpO1xuICAgIGlmIChyZXN1bHQgPT09IENyZWF0ZUZvbGRlclNhZmVSZXN1bHQuQ3JlYXRlZCkge1xuICAgICAgdGhpcy5wdXNoVW5kbyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFyZERlbGV0ZShwYXRoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgY29udGVudCBvZiBhIGZpbGUsIGNhcHR1cmluZyB0aGUgb2xkIGNvbnRlbnQgc28gaXQgY2FuIGJlIHJlc3RvcmVkIG9uIHJvbGxiYWNrLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0gbmV3Q29udGVudCAtIFRoZSBuZXcgY29udGVudC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlIGlzIG1vZGlmaWVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIG1vZGlmeShwYXRoT3JGaWxlOiBQYXRoT3JBYnN0cmFjdEZpbGUsIG5ld0NvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucHJvY2VzcyhwYXRoT3JGaWxlLCAoKSA9PiBuZXdDb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIHRoZSBjb250ZW50IG9mIGEgZmlsZSwgY2FwdHVyaW5nIHRoZSBvbGQgY29udGVudCBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgb24gcm9sbGJhY2suXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBwcm9jZXNzLlxuICAgKiBAcGFyYW0gbmV3Q29udGVudFByb3ZpZGVyIC0gTWFwcyB0aGUgY3VycmVudCBjb250ZW50IHRvIHRoZSBuZXcgY29udGVudC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmaWxlIGlzIHByb2Nlc3NlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwcm9jZXNzKHBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZSwgbmV3Q29udGVudFByb3ZpZGVyOiAoY29udGVudDogc3RyaW5nKSA9PiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFzc2VydE9wZW4oKTtcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aCh0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IHJlYWRTYWZlKHRoaXMuYXBwLCBwYXRoKTtcbiAgICBhd2FpdCBwcm9jZXNzKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBuZXdDb250ZW50UHJvdmlkZXI6ICh7IGNvbnRlbnQgfSkgPT4gbmV3Q29udGVudFByb3ZpZGVyKGNvbnRlbnQpLFxuICAgICAgcGF0aE9yRmlsZTogcGF0aCxcbiAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogbnVsbCxcbiAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbFxuICAgIH0pO1xuICAgIC8vIFJlYWNoaW5nIHRoaXMgbGluZSBtZWFucyBgcHJvY2Vzc2Agc3VjY2VlZGVkLiBBIG1pc3NpbmcgZmlsZSB3b3VsZCBoYXZlIHRocm93biBhYm92ZSAoaXRzXG4gICAgLy8gYHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlYCBkZWZhdWx0KSwgc28gdGhlIHByZS1pbWFnZSB3YXMgY2FwdHVyZWQgYW5kIGNhbiBiZSByZXN0b3JlZCBvbiByb2xsYmFjay5cbiAgICBhc3NlcnROb25OdWxsYWJsZShvbGRDb250ZW50KTtcbiAgICB0aGlzLnB1c2hVbmRvKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHByb2Nlc3Moe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBuZXdDb250ZW50UHJvdmlkZXI6IG9sZENvbnRlbnQsXG4gICAgICAgIHBhdGhPckZpbGU6IHBhdGgsXG4gICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogbnVsbCxcbiAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsXG4gICAgICB9KTtcbiAgICAgIC8vIEEgY29uc3VtZXIgbWF5IGhhdmUgZWRpdGVkIHRoaXMgbm90ZSB0aHJvdWdoIHRoZSBlZGl0b3IsIGxlYXZpbmcgYSBkaXJ0eSBidWZmZXIuXG4gICAgICAvLyBJdHMgcGVuZGluZyBhdXRvc2F2ZSBjb3VsZCByZS13cml0ZSB0aGF0IHN0YWxlIGJ1ZmZlciBvdmVyIHRoZSBkaXNrIHJlc3RvcmUgYWJvdmUgYW5kIGNsb2JiZXIgaXQuXG4gICAgICAvLyBSZXNldHRpbmcgdGhlIG9wZW4gZWRpdG9yJ3MgYnVmZmVyIHRvIHRoZSByZXN0b3JlZCBjb250ZW50IGtlZXBzIGl0cyBuZXh0IHNhdmUgYSBuby1vcC5cbiAgICAgIC8vIE9ubHkgdGhlIHZpZXcgc3RpbGwgc2hvd2luZyB0aGlzIHBhdGggaXMgdG91Y2hlZC5cbiAgICAgIC8vIFZhdWx0VHJhbnNhY3Rpb24gYWxyZWFkeSBmbHVzaGVzIHZpYSBgc2F2ZU5vdGVgLCBzbyB0aGlzIHJlc2V0IGlzIGJlbHQtYW5kLXN1c3BlbmRlcnMuXG4gICAgICBzeW5jT3BlbkVkaXRvckJ1ZmZlcnNGb3JQYXRoKHRoaXMuYXBwLCBwYXRoLCBvbGRDb250ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5hbWVzIG9yIG1vdmVzIGEgcmVzb3VyY2UsIHJlY29yZGluZyB0aGUgcmV2ZXJzZSByZW5hbWUgYXMgdGhlIGludmVyc2UuXG4gICAqXG4gICAqIEBwYXJhbSBvbGRQYXRoT3JGaWxlIC0gVGhlIHJlc291cmNlIHRvIHJlbmFtZS5cbiAgICogQHBhcmFtIG5ld1BhdGggLSBUaGUgZGVzaXJlZCBuZXcgcGF0aCAoYW4gYXZhaWxhYmxlIHBhdGggaXMgY2hvc2VuIGlmIGl0IGlzIHRha2VuKS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBhY3R1YWwgbmV3IHBhdGguXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVuYW1lKG9sZFBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZSwgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmFzc2VydE9wZW4oKTtcbiAgICBjb25zdCBvbGRQYXRoID0gZ2V0UGF0aCh0aGlzLmFwcCwgb2xkUGF0aE9yRmlsZSk7XG4gICAgY29uc3QgYWN0dWFsTmV3UGF0aCA9IGF3YWl0IHJlbmFtZVNhZmUoeyBhcHA6IHRoaXMuYXBwLCBuZXdQYXRoLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IG9sZFBhdGhPckZpbGUgfSk7XG4gICAgdGhpcy5wdXNoVW5kbyhhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCByZW5hbWVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgbmV3UGF0aDogb2xkUGF0aCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBhY3R1YWxOZXdQYXRoIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBhY3R1YWxOZXdQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvbGxzIGJhY2sgdGhlIHRyYW5zYWN0aW9uOiB1bmRvZXMgdGhlIGNvbXBsZXRlZCBzdGVwcyBpbiByZXZlcnNlIG9yZGVyIGFuZCByZW1vdmVzIHRoZSBzdGFnaW5nXG4gICAqIGZvbGRlci4gSWRlbXBvdGVudC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByb2xsYmFjayBjb21wbGV0ZXMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcm9sbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09ICdyb2xsZWRCYWNrJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFzc2VydE5vdENvbW1pdHRlZCgpO1xuICAgIHRoaXMuc3RhdGUgPSAncm9sbGVkQmFjayc7XG4gICAgZm9yIChjb25zdCBzdGVwIG9mIFsuLi50aGlzLnVuZG9TdGVwc10ucmV2ZXJzZSgpKSB7XG4gICAgICBhd2FpdCBzdGVwLnVuZG8oKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5yZW1vdmVTdGFnaW5nRm9sZGVyKCk7XG4gICAgdGhpcy5kaXNwb3NlTXV0YXRpb25CeXBhc3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xscyBiYWNrIHRoZSB0cmFuc2FjdGlvbiBvbiBkaXNwb3NhbCB1bmxlc3MgaXQgd2FzIGFscmVhZHkgY29tbWl0dGVkIG9yIHJvbGxlZCBiYWNrLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ29wZW4nKSB7XG4gICAgICBhd2FpdCB0aGlzLnJvbGxiYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNvZnQtZGVsZXRlcyBhIHJlc291cmNlIGJ5IG1vdmluZyBpdCBpbnRvIHRoZSBzdGFnaW5nIGZvbGRlciwgcmVjb3JkaW5nIHRoZSBtb3ZlLWJhY2sgYXMgdGhlXG4gICAqIGludmVyc2UuIFRoZSByZWFsIHRyYXNoIGhhcHBlbnMgb24ge0BsaW5rIFZhdWx0VHJhbnNhY3Rpb24uY29tbWl0fS4gQSBuby1vcCBpZiB0aGUgcmVzb3VyY2UgZG9lc1xuICAgKiBub3QgZXhpc3QuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgcmVzb3VyY2UgdG8gdHJhc2guXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gc3RhZ2VkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyYXNoKHBhdGhPckZpbGU6IFBhdGhPckFic3RyYWN0RmlsZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYXNzZXJ0T3BlbigpO1xuICAgIGNvbnN0IGZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlIH0pO1xuICAgIGlmICghZmlsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbFBhdGggPSBmaWxlLnBhdGg7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTdGFnaW5nRm9sZGVyKCk7XG4gICAgY29uc3Qgc3RhZ2VkUGF0aCA9IGF3YWl0IHRoaXMuZ2V0QXZhaWxhYmxlU3RhZ2VkUGF0aChmaWxlLm5hbWUpO1xuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFwcC52YXVsdC5hZGFwdGVyO1xuICAgIC8vIE1vdmUgdGhyb3VnaCB0aGUgYWRhcHRlciwgbm90IGB2YXVsdC5yZW5hbWVgOiB0aGUgc3RhZ2luZyBmb2xkZXIgaXMgZG90LXByZWZpeGVkIGFuZCB0aGVyZWZvcmVcbiAgICAvLyBVbnRyYWNrZWQsIHNvIGEgYHZhdWx0LipgIG1vdmUgY2Fubm90IHRhcmdldCBpdCAobm9yIHNob3VsZCBpdCByZXdyaXRlIGxpbmtzIHRvIGEgc29mdC1kZWxldGUpLlxuICAgIGF3YWl0IGFkYXB0ZXIucmVuYW1lKG9yaWdpbmFsUGF0aCwgc3RhZ2VkUGF0aCk7XG4gICAgdGhpcy5zdGFnZWRUcmFzaFBhdGhzLnB1c2goc3RhZ2VkUGF0aCk7XG4gICAgdGhpcy5wdXNoVW5kbyhhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoYXdhaXQgYWRhcHRlci5leGlzdHMoc3RhZ2VkUGF0aCkpIHtcbiAgICAgICAgYXdhaXQgYWRhcHRlci5yZW5hbWUoc3RhZ2VkUGF0aCwgb3JpZ2luYWxQYXRoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXNzZXJ0Tm90Q29tbWl0dGVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSAnY29tbWl0dGVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgcm9sbCBiYWNrIGEgY29tbWl0dGVkIHRyYW5zYWN0aW9uLicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXNzZXJ0T3BlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29wZW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBtdXRhdGUgYSAke3RoaXMuc3RhdGV9IHRyYW5zYWN0aW9uLmApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGlzcG9zZU11dGF0aW9uQnlwYXNzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11dGF0aW9uQnlwYXNzKSB7XG4gICAgICBkaXNwb3NlKHRoaXMubXV0YXRpb25CeXBhc3MpO1xuICAgIH1cbiAgICB0aGlzLm11dGF0aW9uQnlwYXNzID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlU3RhZ2luZ0ZvbGRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5oYXNTdGFnaW5nRm9sZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFwcC52YXVsdC5hZGFwdGVyO1xuICAgIGlmICghYXdhaXQgYWRhcHRlci5leGlzdHModGhpcy5zdGFnaW5nRm9sZGVyUGF0aCkpIHtcbiAgICAgIGF3YWl0IGFkYXB0ZXIubWtkaXIodGhpcy5zdGFnaW5nRm9sZGVyUGF0aCk7XG4gICAgfVxuICAgIHRoaXMuaGFzU3RhZ2luZ0ZvbGRlciA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldEF2YWlsYWJsZVN0YWdlZFBhdGgobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlcjtcbiAgICBjb25zdCBkb3RJbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTtcbiAgICBjb25zdCBoYXNFeHRlbnNpb24gPSBkb3RJbmRleCA+IDA7XG4gICAgY29uc3QgYmFzZU5hbWUgPSBoYXNFeHRlbnNpb24gPyBuYW1lLnNsaWNlKDAsIGRvdEluZGV4KSA6IG5hbWU7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gaGFzRXh0ZW5zaW9uID8gbmFtZS5zbGljZShkb3RJbmRleCkgOiAnJztcbiAgICBsZXQgY2FuZGlkYXRlID0gYCR7dGhpcy5zdGFnaW5nRm9sZGVyUGF0aH0vJHtuYW1lfWA7XG4gICAgbGV0IGNvdW50ZXIgPSAxO1xuICAgIHdoaWxlIChhd2FpdCBhZGFwdGVyLmV4aXN0cyhjYW5kaWRhdGUpKSB7XG4gICAgICBjYW5kaWRhdGUgPSBgJHt0aGlzLnN0YWdpbmdGb2xkZXJQYXRofS8ke2Jhc2VOYW1lfSAke2NvdW50ZXIudG9TdHJpbmcoKX0ke2V4dGVuc2lvbn1gO1xuICAgICAgY291bnRlcisrO1xuICAgIH1cbiAgICByZXR1cm4gY2FuZGlkYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYXJkRGVsZXRlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpbGUgPSBnZXRBYnN0cmFjdEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBwYXRoIH0pO1xuICAgIGlmIChmaWxlKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9wcmVmZXItZmlsZS1tYW5hZ2VyLXRyYXNoLWZpbGUgLS0gVW5kb2luZyBhIHRyYW5zYWN0aW9uLWxvY2FsIGNyZWF0ZSBtdXN0IHZhbmlzaCBpdCBlbnRpcmVseSwgbm90IGxhbmQgaXQgaW4gdGhlIHVzZXIncyB0cmFzaC5cbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmRlbGV0ZShmaWxlLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHB1c2hVbmRvKHVuZG86ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgICB0aGlzLnVuZG9TdGVwcy5wdXNoKHsgdW5kbyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVtb3ZlU3RhZ2luZ0ZvbGRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaGFzU3RhZ2luZ0ZvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhhc1N0YWdpbmdGb2xkZXIgPSBmYWxzZTtcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlcjtcbiAgICBpZiAoYXdhaXQgYWRhcHRlci5leGlzdHModGhpcy5zdGFnaW5nRm9sZGVyUGF0aCkpIHtcbiAgICAgIGF3YWl0IGFkYXB0ZXIucm1kaXIodGhpcy5zdGFnaW5nRm9sZGVyUGF0aCwgdHJ1ZSk7XG4gICAgfVxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEJBLFNBQVMsZUFBZTtBQUN4QixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG9DQUFvQztBQUM3QztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLE1BQU0sOEJBQThCO0FBOEM3QixNQUFNLGlCQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVQ7QUFBQSxFQUNYLG1CQUFtQjtBQUFBLEVBQ25CLGlCQUFvQztBQUFBLEVB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
@@ -84,13 +84,13 @@ export interface CopySafeParams {
84
84
  */
85
85
  readonly app: App;
86
86
  /**
87
- * The new path to copy the file to.
87
+ * The new path to copy the file or folder to.
88
88
  */
89
89
  readonly newPath: string;
90
90
  /**
91
- * The old path or file to copy.
91
+ * The old path, file or folder to copy. A folder is copied with its whole subtree.
92
92
  */
93
- readonly oldPathOrFile: PathOrFile;
93
+ readonly oldPathOrFile: PathOrAbstractFile;
94
94
  }
95
95
  /**
96
96
  * Parameters for {@link getAbstractFilePathSafe}.
@@ -275,10 +275,12 @@ export interface RenameSafeParams {
275
275
  */
276
276
  export declare function cleanupEmptyFolders(params: CleanupEmptyFoldersParams): Promise<void>;
277
277
  /**
278
- * Copies a file safely in the vault.
278
+ * Copies a file or folder safely in the vault. A folder is copied with its whole subtree, empty
279
+ * subfolders included.
279
280
  *
280
- * @param params - The parameters for copying the file.
281
- * @returns A {@link Promise} that resolves to the new path of the copied file.
281
+ * @param params - The parameters for copying the file or folder.
282
+ * @returns A {@link Promise} that resolves to the new path of the copy.
283
+ * @throws Error if the destination resolves inside the source folder.
282
284
  */
283
285
  export declare function copySafe(params: CopySafeParams): Promise<string>;
284
286
  /**